LyoKICogV2luZSBjb21tYW5kIHByb21wdAogKiBKYXBhbmVzZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAoQykgMjAwNCBIYWppbWUgU2VnYXdhCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfSkFQQU5FU0UsIFNVQkxBTkdfREVGQVVMVAoKU1RSSU5HVEFCTEUKewogIFdDTURfQVRUUklCLCAiQVRUUklCgsyDd4OLg3ZcbiIKICBXQ01EX0NBTEwsCiJDQUxMIDyDb4Nig2CDdINAg0ODi5a8PiCCzZG8gsyDb4Nig2CDdINAg0ODi4KpgueDUoN9g5ODaILwjsCNc4K3gumP6o2HXG5cCoLJg2+DYoNgg3SDQINDg4uShoLFjmeXcIK1gtyCt4FCg2+DYoNgg3SDQINDg4uPSZe5jp6CyYNSg5ODZ4ONgVuDi4LNjMRcblwKgtGPb4K1gr2DdINAg0ODi4LJlt+C6ILcgreBQiBDQUxMIINSg32Dk4Nogs2MxILRj2+Cs4LqgumO6JGxgquCyYNwg4mDgVxuXAqBW4NegvCTboK3grGCxoKqicKUXILFgreBQlxuXApcblwKjMSC0Y9vgrOC6oK9juiRsYKrgqqNc4LBgr2DSoOMg5ODZ4Nmg0KDjINOg2eDioLiisKLq5XPkJSCzJXPjViCzYzEgtGPb1xuXAqCtYyzgsmI+IKrjHCCqoLqgtyCt4FCXG4iCgogIFdDTURfQ0QsICAgICAiQ0SCzIN3g4uDdlxuIgogIFdDTURfQ0hESVIsICAiQ0hESVKCzIN3g4uDdlxuIgoKICBXQ01EX0NMUywgICAgIkNMU4LNg1KDk4NcgVuDi4nmlsqC8INOg4qDQYK1gtyCt1xuIgoKICBXQ01EX0NPUFksICAgIkNPUFmCzIN3g4uDdlxuIgogIFdDTURfQ1RUWSwgICAiQ1RUWYLMg3eDi4N2XG4iCiAgV0NNRF9EQVRFLCAgICJEQVRFgsyDd4OLg3ZcbiIKICBXQ01EX0RFTCwgICAgIkRFTILMg3eDi4N2XG4iCiAgV0NNRF9ESVIsICAgICJESVKCzIN3g4uDdlxuIgoKICBXQ01EX0VDSE8sCiJFQ0hPIDyVto6al/E+IILNPJW2jpqX8T6C8Iy7jd2CzINegVuDfoNpg4uCyZVcjqaCtYLcgreBQlxuXApcblwKRUNITyBPTiCCzYjIjX6CyYNvg2KDYIN0g0CDQ4OLgsWOwI1zgreC6YNSg32Dk4NogvCOwI1zkU+CyVxuXAqDXoFbg36DaYOLgsmVXI6mgreC6YLmgqSCyYK1gtyCt4FCXG5cClxuXApFQ0hPIE9GRiCCzUVDSE8gT06CzIt0gsyM+InKgvCOnYK/gtyCt4FCIChFQ0hPgs2DZoN0g0iDi4NnXG5cCoLFgs1PRkaCxYK3KYFCRUNITyBPRkYgg1KDfYOTg2iCzUCDfYFbg06CyZGxgq+CxI7AjXOCt4Lqgs5cblwKlVyOpoKzguqC3IK5gvGBQlxuIgoKICBXQ01EX0VSQVNFLCAgIkVSQVNFgsyDd4OLg3ZcbiIKCiAgV0NNRF9GT1IsCiJGT1Igg1KDfYOTg2iCzYK7guqCvILqgsyDdINAg0ODi4LJkc6CtYLEg1KDfYOTg2iC8I7AjXOCt4LpXG5cCo/qjYeCyY5nl3CCtYLcgreBQlxuXApcblwKlbaWQDogRk9SICWVz5CUIElOICiDWoNig2cpIERPIINSg32Dk4NoXG5cClxuXAp3Y21kk+CCyZG2jd2CtYLIgqKDb4Nig2CDdINAg0ODi5KGgsVGT1KC8I5nl3CCt4Lpj+qNh4LNJYtMjYZcblwKgvCT8Y9kgsmCt4LplUuXdoKqgqCC6ILcgreBQlxuIgoKICBXQ01EX0dPVE8sCiJHT1RPIINSg32Dk4Nogs2Db4Nig2CDdINAg0ODi5KGgsWOwI1zjXOC8JG8gsyDWINlgVuDZ4OBg5ODZ4LJXG5cCojagrWC3IK3gUJcblwKXG5cCkdPVE8glbaCzINegVuDUYNig2eCxoLIgumDiYN4g4uCzZS8inAyNTWVto6aiMiT4ILFgreCqoFBi/OUklxuXAqC8IrcgvGCxYLNgqKCr4LcgrmC8YFCKIKxguqCzZG8gsyDSYN5g4yBW4Nlg0KDk4NPg1aDWINlg4CCxYLNXG5cCojZgsiC6ILcgrcpgUKT8YLCiMiP45OviOqCzIOJg3iDi4KqkbaN3YK3gumP6o2Hgs2P7YLJjcWPiYLMlahcblwKgqqOwI1zgrOC6oLcgreBQkdPVE+VtoLJkbaN3YK1gsiCooOJg3iDi4LwjneS6IK1gr2P6o2Hgs2Db4NiXG5cCoNgg3SDQINDg4uCzI7AjXOC8JKGkmaCtYLcgreBQlxuXApcblwKR09UTyCCzZHOmGKDgoFbg2iCxY5nl3CCs4Lqgr2P6o2Hgs2I05ahgvCOnYK/gtyCuYLxgUJcbiIKCiAgV0NNRF9IRUxQLCAgICJIRUxQgsyDd4OLg3ZcbiIKCiAgV0NNRF9JRiwKIklGIILNj/CMj4LJiu6Cw4KigsSDUoN9g5ODaILwjsCNc4K3gumP6o2HgsmOZ5dwgrWC3IK3gUJcblwKXG5cCpW2lkA6CUlGIFtOT1RdIEVYSVNUIIN0g0CDQ4OLlrwgg1KDfYOTg2hcblwKCUlGIFtOT1RdIJW2jpqX8TE9PZW2jpqX8TIgg1KDfYOTg2hcblwKCUlGIFtOT1RdIEVSUk9STEVWRUwglNSNhiCDUoN9g5ODaFxuXApcblwKk/GU1JbagsyMYI6ugsmCqIKigsSBQZW2jpqX8TGCxpW2jpqX8TKCzYNfg3WDi4NOg0mBW4NngsWIzYLtgupcblwKgsSCooLIgq+C6oLOgsiC6ILcgrmC8YFCkeWVto6agsaPrJW2jpqCzYvmlcqCs4LqgtyCuYLxgUJcbiIKCiAgV0NNRF9MQUJFTCwgICJMQUJFTCCCzYNmg0KDWINOgsyDe4OKg4WBW4OAg4mDeIOLgvCQ3ZLogreC6Y/qjYeCyY5nl3CCtYLcgreBQlxuXApcblwKlbaWQDogTEFCRUwgW4Nog4mDQ4N1Ol1cblwKg1KDfYOTg2iC8I7AjXOCt4LpgsaOd5LogrWCvYNog4mDQ4N1gsyQVoK1gqKDe4OKg4WBW4OAlryC8Jd2i4GCtYLcgreBQlxuXAqDZoNCg1iDToLMg3uDioOFgVuDgIOJg3iDi4LNVk9Mg1KDfYOTg2iCxZVcjqaCxYKrgtyCt4FCXG4iCgogIFdDTURfTUQsICAgICAiTUSCzIN3g4uDdlxuIgogIFdDTURfTUtESVIsICAiTUtESVKCzIN3g4uDdlxuIgogIFdDTURfTU9WRSwKIk1PVkUggs2DdINAg0ODi4Lcgr2CzYNmg0KDjINOg2eDioLwg3SDQINDg4uDVoNYg2WDgJKGgsWQVoK1gqKP6o+KgsmI2pOugrWC3IK3gUJcblwKXG5cCojak66Ct4Lpkc6P24Kqg2aDQoOMg06DZ4OKgsyP6o2Hgs2BQYNmg0KDjINOg2eDipPggsyRU4LEgsyDdINAXG5cCoNDg4uCxoNUg3WDZoNCg4yDToNng4qC4Ijak66CtYLcgreBQlxuXApcblwKTU9WRSCCxYLNiNqTroyzgsaI2pOukOaCzINog4mDQ4N1g4yDXoFbgqqI2YLIgumP6o2HgUGI2pOugs2OuJRzgrWC3IK3gUJcbiIKCiAgV0NNRF9QQVRILAoiUEFUSCCCzXdjbWSCzIyfjfWDcINYgvCVXI6mgtyCvYLNlc+NWIK1gtyCt4FCXG5cClxuXApQQVRIIILGk/yXzYK3gumCxoy7jd2CzINwg1iQ3ZLogvCVXI6mgrWC3IK3KI+JivqP85HUgsWCzVxuXAp3aW5lLmNvbmaDdINAg0ODi5KGgsWOd5LogrOC6oK9laiCyYLIgsGCxIKigtyCtymBQpDdkuiC8FxuXAqVz41YgreC6YLJgs2BQVBBVEiDUoN9g5ODaILJkbGCr4LEkFaCtYKikN2S6JJsgvCT/JfNgrWCxFxuXAqJuoKzgqKBQlxuXApcblwKg3CDWILwlc+NWIK3gumCxoKrgslQQVRIisKLq5XPkJSC8I5nl3CCt4LpgrGCxoLgicKUXILFgreBQlxuXAqX4YKmgs6BRlxuXAoJCVBBVEggJVBBVEglO2M6XFx0ZW1wIFxuIgoKICBXQ01EX1BBVVNFLAoiUEFVU0Uggs2J5pbKgsmBdZGxgq+C6YLJgs2DioNegVuDk4NMgVuC8ImfgrWCxIm6grOCooF2gsZcblwKlVyOpoK1gUGDhoFbg1WCqoOKg16BW4OTg0yBW4LwiZ+Ct4LMgvCR0otAgrWC3IK3gUKCsYLqgs1cblwKjuWCyYNvg2KDYIN0g0CDQ4OLkoaCxY7AjXOCs4Lqgr2DUoN9g5ODaILMjIuJyoKqg1iDToONgVtcblwKg4uCt4LpkU+CyYOGgVuDVYKqk8eC34LpguaCpILJgrWCvYKij+qNh4LJl0yXcILFgreBQlxuIgoKICBXQ01EX1BST01QVCwKIlBST01QVCCCzYNSg32Dk4Nog3aDjYOTg3aDZ4LwkN2S6IK1gtyCt4FCXG5cClxuXApQUk9NUFQgg1KDfYOTg2gogsaSvIzjgsyDWIN5gVuDWCmCyZGxgq2Vto6al/GCzXdjbWSCqpP8l82R0oK/gsyOnoFBXG5cCo1zgsyQ5pOqgsmVXI6mgrOC6oLcgreBQlxuXApcblwKiMiJuoLMg0yDg4OJg06DXpW2jpqX8YLNk8GVyoLIiNOWoYLwjp2Cv4LcgreBRlxuXApcblwKJCQgICAgg2iDi4tMjYYgICAgICAgICAgICAkXyAgICCJ/I1zICAgICAgICAgICAgICAgICRiICAgIINwg0ODdotMjYYgKHwpXG5cCiRkICAgIIy7jd2CzJP6lXQgICAgICAgICAgJGUgICAgg0eDWINQgVuDdiAgICAgICAgICAkZyAgICA+IItMjYZcblwKJGwgICAgPCCLTI2GICAgICAgICAgICAgICAkbiAgICCMu43dgsyDaIOJg0ODdSAgICAgICRwICAgIIy7jd2CzINwg1hcblwKJHEgICAgk5mNhiAgICAgICAgICAgICAgICAkdCAgICCMu43dgsyOno2PICAgICAgICAgICR2ICAgIHdjbWSCzINvgVuDV4OHg5NcblwKXG5cCpKNiNOBRlBST01QVINSg32Dk4NogvCDdoONg5ODdoNnlbaOmpfxgsiCtYLFjsCNc4K3gumCxoFBg2aDdINIg4uDZ5JsgsmDilxuXAqDWoNig2eCs4LqgtyCt4FCIINmg3SDSIOLg2eSbILNg0qDjIOTg2eDZoNCg4yDToNng4oog2iDiYNDg3WWvILwityC3YLcgrcpXG5cCoLJkbGCooLEkeWCyILoKD4pi0yNhoLFgreBQlxuXAooUFJPTVBUICRwJGcggvCOwI1zgrWCvY6egsaTr5dsgsWCtylcblwKXG5cCoN2g42Dk4N2g2eCzVBST01QVIrCi6uVz5CUgvCV0o9XgreC6YKxgsaCxYLglc+NWILFgquC3IK3gUJcblwKgrWCvYKqgsGCxIFBJ1NFVCBQUk9NUFQ9lbaOmpfxJ4LGJ1BST01QVCCVto6al/EngsyM+InKgs2Tr4K2gsWCt4FCXG4iCgogIFdDTURfUkVNLAoiUkVNKILGkryM44LMg1iDeYFbg1gpgsWOboLcgumDUoN9g5ODaILNjsCNc4KzguqC3IK5gvGBQlxuXAqCtYK9gqqCwYLEgUGDb4Nig2CDdINAg0ODi5KGgsyDUoOBg5ODZ4LGgrWCxI5nl3CCxYKrgtyCt4FCXG4iCgogIFdDTURfUkVOLCAgICAiUkVOgsyDd4OLg3ZcbiIKICBXQ01EX1JFTkFNRSwgIlJFTkFNRYLMg3eDi4N2XG4iCiAgV0NNRF9SRCwgICAgICJSRILMg3eDi4N2XG4iCiAgV0NNRF9STURJUiwgICJSTURJUoLMg3eDi4N2XG4iCgogIFdDTURfU0VULAoiU0VUIILNd2NtZILMisKLq5XPkJSC8JVcjqaC3IK9gs2Vz41YgrWC3IK3gUJcblwKXG5cCoNwg4mDgYFbg16CyIK1gsVTRVSC8I7AjXOCt4LpgsaBQYy7jd2CzJFTgsSCzIrCi6uVz5CUgvCVXI6mgrWC3IK3gUJcblwKXG5cCorCi6uVz5CUgsyN7JCsgtyCvYLNlc+NWILwjXOCpI/qjYeCzY6fgsyC5oKkgsmLTI9xgrWCxIm6grOCooFGXG5cClxuXAogICAgICBTRVQgPIrCi6uVz5CUlrw+PTySbD5cblwKXG5cCjyKwourlc+QlJa8PiCCxiA8kmw+IILNlbaOmpfxgsWCt4FCk5mNhoLMjuiRT4LJg1iDeYFbg1iC8FxuXAqT/ILqgsiCooLFibqCs4KigUKO6JFPgsmDWIN5gVuDWILwk/yC6oLpgsaKwourlc+QlJa8gsmXXZWqXG5cCoLIg1iDeYFbg1iCqorcgtyC6oLEgrWC3IKkj+qNh4KqgqCC6ILcgreBQlxuXApcblwKV2luZYrCi6uCxYLNgUFXaW5lgqqTro3sgrWCxIKigulPU4LMisKLq5XPkJSCqldpbjMyisKLq5XPkJSCyYrcXG5cCoLcguqC3IK3gUKCtYK9gqqCwYLEgUGDbINDg2WDQoN1V2luMzKKwourguaC6JG9gq2CzJJsgqqDWoNig2eCs1xuXAqC6oLEgqKC3IK3gUJ3Y21kk+CCqYLnT1OCzIrCi6uVz5CUgvCVz41YgreC6YKxgsaCqoLFgquCyIKigrGCxlxuXAqCyZKNiNOCtYLEibqCs4KigUJcbiIKCiAgV0NNRF9TSElGVCwKIlNISUZUIILNg2+DYoNgg3SDQINDg4uShoLFg4qDWINngsyQ5pOqgqmC54jqgsKCzINwg4mDgYFbg16C8I7mguiPnIKtjp5cblwKgsmOZ5dwgrWC3IK3gUKCwoLcguiBQYNwg4mDgYFbg14ygqqDcIOJg4GBW4NeMYLJgsiC6ILcgreBQoNSg32Dk4Nog4mDQ4OTXG5cCoKpgueMxILOguqCvYLGgquCyYLNib2C4ItOgrGC6ILcgrmC8YFCXG4iCgogIFdDTURfVElNRSwgICAiVElNRYLMg3eDi4N2XG4iCgogIFdDTURfVElUTEUsICAid2NtZINFg0KDk4Nog0WCzINFg0KDk4Nog0WDXoNDg2eDi4LwkN2S6IK1gtyCt4FClbaWQCBUSVRMRSBblbaOmpfxXVxuIgoKICBXQ01EX1RZUEUsCiJUWVBFIDyDdINAg0ODi5a8PiCCzSA8g3SDQINDg4uWvD4ggvCDUoOTg1yBW4OLg2aDb4NDg1golpSCzYOKg1+DQ4OMg06DZ1xuXAqCs4Lqgr2PiimCyYNSg3OBW4K1gtyCt4FCg3SDQINDg4uCqonCk8eCyINlg0yDWINng3SDQINDg4uCqYLHgqSCqYNgg0aDYoNOXG5cCoKzguqC3IK5gvGBQlxuIgoKICBXQ01EX1ZFUklGWSwKIlZFUklGWSCCzXZlcmlmeYN0g4mDT4Lwg1qDYoNngUGDToOKg0GBQZaUgs2DZYNYg2eCt4Lpjp6CyY5nl3CCtYLcgreBQpdMjPiCyIN0g0iBW4OAgs06XG5cClxuXApWRVJJRlkgT04Jg3SDiYNPgvCDWoNig2dcblwKVkVSSUZZIE9GRgmDdIOJg0+C8INOg4qDQVxuXApWRVJJRlkJCU9OgqlPRkaCqZVcjqZcblwKXG5cCldpbmWKwourgsWCzXZlcmlmeYN0g4mDT4LNiNOWoYLwjp2Cv4LcgrmC8YFCXG4iCgogIFdDTURfVkVSLAoiVkVSIILNk66N7IK1gsSCooLpd2NtZILMg2+BW4NXg4eDk4LwlVyOpoK1gtyCt1xuIgoKICBXQ01EX1ZPTCwgICAgIlZPTILMg3eDi4N2XG4iCgogIFdDTURfRVhJVCwKIkVYSVQggs2Mu43dgsyDUoN9g5ODaINag2KDVoOHg5OC8I9Jl7mCtYLEd2NtZILwjMSC0Y9vgrWCvU9TgtyCvYLNg1aDRoOLgsmW34K1gtyCt4FCXG4iCgogIDEwMDAsICJXQ01EIJPgkaCCzINSg32Dk4NoOlxuXApBVFRSSUJcdFx0RE9Tg3SDQINDg4uCzJGukKuC8JVcjqaWlILNlc+NWFxuXApDQUxMXHRcdIpPlZSCzINvg2KDYIN0g0CDQ4OLgvCMxILRj2+CtVxuXApDRCAoQ0hESVIpXHSDSoOMg5ODZ4Nmg0KDjINOg2eDioLwlc+NWFxuXApDTFNcdFx0g1KDk4NcgVuDi4nmlsqC8INOg4qDQVxuXApDT1BZXHRcdIN0g0CDQ4OLgvCDUoNzgVtcblwKQ1RUWVx0XHST/JfNL49vl82DZoNvg0ODWILwlc+NWFxuXApEQVRFXHRcdINWg1iDZYOAgsyT+pV0gvCVXI6mlpSCzZXPjVhcblwKREVMIChFUkFTRSlcdIN0g0CDQ4OLgvCN7Y+cXG5cCkRJUlx0XHSDZoNCg4yDToNng4qCzJPgl2WC8JVcjqZcblwKRUNIT1x0XHSVto6al/GC8JK8kNqDUoOTg1yBW4OLj2+XzYLJg1KDc4FbXG5cCkhFTFBcdFx0g2eDc4Nig06CzI/ajdeCyIN3g4uDdoLwlVyOplxuXApNRCAoTUtESVIpXHSDVIN1g2aDQoOMg06DZ4OKgvCN7JCsXG5cCk1PVkVcdFx0g3SDQINDg4uC3IK9gs2DZoNCg4yDToNng4qDY4OKgVuC8Ijak65cblwKUEFUSFx0XHSDcINYgvCVXI6mlpSCzZDdkuhcblwKUFJPTVBUXHRcdINSg32Dk4Nog3aDjYOTg3aDZ4Lwlc+NWFxuXApSRU4gKFJFTkFNRSlcdIN0g0CDQ4OLgvCDioNsgVuDgFxuXApSRCAoUk1ESVIpXHSDVIN1g2aDQoOMg06DZ4OKgvCN7Y+cXG5cClNFVFx0XHSKwourlc+QlILwkN2S6JaUgs2VXI6mXG5cClRJTUVcdFx0g1aDWINlg4CCzI6ejY+C8JDdkuiWlILNlVyOplxuXApUSVRMRVx0XHRXQ01Eg1qDYoNWg4eDk4LMg0WDQoOTg2iDRYNeg0ODZ4OLgvCQ3ZLoXG5cClRZUEVcdFx0g2WDTINYg2eDdINAg0ODi4LMk+CXZYLwj2+XzVxuXApWRVJcdFx0V0NNRILMg2+BW4NXg4eDk4LwlVyOplxuXApWT0xcdFx0g2aDQoNYg06DZoNvg0ODWILMg3uDioOFgVuDgIOJg3iDi4LwlVyOplxuXApFWElUXHRcdFdDTUSC8I9Jl7lcblxuXAqP44tMgsyDUoN9g5ODaILJitaCt4Lpj9qN14LwlVyOpoK3gumCyYLNIEhFTFAgPINSg32Dk4Nolrw+IILGk/yXzYK1gsSJuoKzgqKBQlxuIgp9Cg==