LyoKICogIE5vdGVwYWQgKEphcGFuZXNlIHJlc291cmNlcykKICoKICogIENvcHlyaWdodCAxOTk3LDk4IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KICogIFByb29mcmVhZCAxOTk4IGJ5IERhdmlkIExlZSBMYW1iZXJ0IDxsYW1iZXI0NUBlZ3IubXN1LmVkdT4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0pBUEFORVNFLCBTVUJMQU5HX0RFRkFVTFQKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICKDdINAg0ODiygmRikiIHsKICBNRU5VSVRFTSAikFaLS43skKwoJk4pXHRDdHJsK04iLCAgICAgICAgICAgQ01EX05FVwogIE1FTlVJVEVNICKKSoKtKCZPKS4uLlx0Q3RybCtPIiwgICAgIENNRF9PUEVOCiAgTUVOVUlURU0gIpXbkbYoJlMpXHRDdHJsK1MiLCAgICAgQ01EX1NBVkUKICBNRU5VSVRFTSAilryRT4LwlXSCr4LElduRtigmYSkuLi4iLCAgICAgICBDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICKI8438KCZQKS4uLlx0Q3RybCtQIiwgICAgICAgICAgICBDTURfUFJJTlQKICBNRU5VSVRFTSAig3mBW4NXkN2S6CgmdCkuLi4iLCAgICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICKDdoOKg5ODXoLMkN2S6CgmcikuLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICKPSZe5KCZ4KSIsICAgICAgICAgICAgIENNRF9FWElUCiB9ClBPUFVQICKV0o9XKCZFKSIgewogIE1FTlVJVEVNICKDQYOTg2iDRCgmVSlcdEN0cmwrWiIsICAgICBDTURfVU5ETwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICKQ2ILojuaC6CgmdClcdEN0cmwrWCIsICAgICAgQ01EX0NVVAogIE1FTlVJVEVNICKDUoNzgVsoJkMpXHRDdHJsK0MiLCAgICAgQ01EX0NPUFkKICBNRU5VSVRFTSAig3mBW4NYg2coJlApXHRDdHJsK1YiLCAgICBDTURfUEFTVEUKICBNRU5VSVRFTSAije2PnCgmRClcdERlbCIsICAgICAgQ01EX0RFTEVURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICKRU4LEkUmR8CgmYSlcdEN0cmwrQSIsICAgICAgIENNRF9TRUxFQ1RfQUxMCiAgTUVOVUlURU0gIpP6lXSCxo6ejY8oJlQpXHRGNSIsICAgIENNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAikreCoo1zgvCQ3ILoldSCtygmVykiLCAgQ01EX1dSQVAKICBNRU5VSVRFTSAig3SDSIOTg2coJkYpLi4uIiwgICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIoyfjfUoJlMpIiB7CiAgTUVOVUlURU0gIoyfjfUoJlMpLi4uXHRDdHJsK0YiLCAgIENNRF9TRUFSQ0gKICBNRU5VSVRFTSAijp+CzIzzleKC8IyfjfUoJlMpXHRGMyIsICBDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIoN3g4uDdigmSCkiIHsKICBNRU5VSVRFTSAiltqOnygmQykiLCAgICAgICAgIENNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIoyfjfUoJlMpLi4uIiwgICAgICAgIENNRF9IRUxQX1NFQVJDSAogIE1FTlVJVEVNICKDd4OLg3aCzI5ngqKV+ygmSCkiLCAgICAgQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQWJvdXQgTm90ZXBhZCIsIENNRF9IRUxQX0FCT1VUX05PVEVQQUQKIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA5LCAiTVMgVUkgR290aGljIgpDQVBUSU9OICKDeYFbg1eQ3ZLoIgp7CkxURVhUICAgICKDd4Nig18oJkgpOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICKDdINig14oJkYpOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAig32BW4NXg5MoJk0pOiIsICAgICAgMHgxNDQsICAgICAxMCwgNDMsMTYwLCA0NQpMVEVYVCAgICAijbYoJkwpOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICKP4ygmVCk6IiwgICAgICAgICAweDE0OCwgICAgMjAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfVE9QVkFMVUUsICAgICAgNTAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiiUUoJlIpOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiibooJkIpOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAig0yDg4OTg1qDiyIsICAgICBJRENBTkNFTCwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAig3eDi4N2KCZIKSIsICAgICAgIElESEVMUCwgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwgICAiJmYiClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgIiZwIIN5gVuDVyIKClNUUklOR19OT1RFUEFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICKDgYOCkqAiClNUUklOR19FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICKDR4OJgVsiClNUUklOR19XQVJOSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICKMeI2QIgpTVFJJTkdfSU5GTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAij+6V8SIKClNUUklOR19VTlRJVExFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIolrOR6CkiCgpTVFJJTkdfQUxMX0ZJTEVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAikVOCxILMg3SDQINDg4sgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwgICAgICAgICAgICAgICAgICAig2WDTINYg2eDdINAg0ODiyAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIoN0g0CDQ4OLICclcycggsyDVINDg1mCzZHlgquCt4KsgumCvYLfgUGDgYOCkqCCxYLNldKPV4LFgquC3IK5gvGBQlxuIFwKlcqCzINHg2aDQoNegvCOZ5dwgrWCxIm6grOCooFCIgpTVFJJTkdfTk9URVhULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiib2C4JP8l82Cs4LqgsSCooLcgrmC8YFCXApcbom9gqmT/JfNgrWCxIKpgueOwI1zgrWCxIm6grOCooFCIgpTVFJJTkdfRE9FU05PVEVYSVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAig3SDQINDg4sgJyVzJ1xugs2Rto3dgrWC3IK5gvFcblxuIFwKkFaCtYKig3SDQINDg4uC8I3skKyCtYLcgreCqSA/IgpTVFJJTkdfTk9UU0FWRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAig3SDQINDg4sgJyVzJ1xugs2Vz41YgrOC6oLEgqKC3IK3XG5cbiBcCpXPjViC8JXbkbaCtYLcgreCqSA/IgpTVFJJTkdfTk9URk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIILNjKmCwoKpguiC3IK5gvGCxYK1gr0iClNUUklOR19PVVRfT0ZfTUVNT1JZLCAgICAgICAgICAgICAgICAgICAigrGCzJGAjeyC8I7AjXOCt4Lpgr2C34LMg4GDgoOKgqpcCpGrguiC3IK5gvGBQlxug4GDgoOKgsyL84KrgvCRnYLigreCvYLfgsmCooKtgsKCqYLMg0GDdoOKg1CBW4NWg4eDk4LwXG6PSZe5grWCxFwKibqCs4KigUIiCgp9Cg==