LyoKICogIE5vdGVwYWQgKFNpbXBsaWZpZWQgQ2hpbmVzZSByZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMjAwMiBsaXVzcGlkZXIgPGxpdXNwaWRlckB5YWhvby5jb20+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCk1BSU5fTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfQ0hJTkVTRSwgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQKewogUE9QVVAgIs7EvP6jqCZGo6kiIHsKICBNRU5VSVRFTSAi0MK9qKOoJk6jqVx0Q3RybCtOIiwgICAgICAgICAgIENNRF9ORVcKICBNRU5VSVRFTSAitPK/qqOoJk+jqS4uLlx0Q3RybCtPIiwgICAgICAgICAgICAgQ01EX09QRU4KICBNRU5VSVRFTSAisaO05qOoJlOjqVx0Q3RybCtTIiwgICAgICAgICAgICAgQ01EX1NBVkUKICBNRU5VSVRFTSAiwe205s6qKCZBKS4uLiIsICAgICAgIENNRF9TQVZFX0FTCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIrTy06GjqCZQo6kuLi5cdEN0cmwrUCIsICAgICAgICAgICAgQ01EX1BSSU5UCiAgTUVOVUlURU0gItKzw+bJ6NbDo6gmVKOpLi4uIiwgICAgQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAitPLTocno1sOjqCZSo6kuLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLNy7P2o6gmRaOpIiwgICAgICAgICAgICAgQ01EX0VYSVQKIH0KUE9QVVAgIrHgvK2jqCZFo6kiIHsKICBNRU5VSVRFTSAis7fP+6OoJlWjqVx0Q3RybCtaIiwgICAgIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIrz0x9CjqCZUo6lcdEN0cmwrWCIsICAgICAgQ01EX0NVVAogIE1FTlVJVEVNICK4tNbGo6gmQ6OpXHRDdHJsK0MiLCAgICAgQ01EX0NPUFkKICBNRU5VSVRFTSAi1bPM+aOoJlCjqVx0Q3RybCtWIiwgICAgQ01EX1BBU1RFCiAgTUVOVUlURU0gIsm+s/2jqCZEo6lcdERlbCIsICAgICAgQ01EX0RFTEVURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLIq9Gho6gmQaOpIiwgICAgICAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAisuXI68jVxtqhosqxvOSjqCZUo6lcdEY1IiwgICAgQ01EX1RJTUVfREFURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLX1Lavu7vQ0KOoJlejqSIsICBDTURfV1JBUAogIE1FTlVJVEVNICImRm9udC4uLiIsICAgICAgICAgIENNRF9GT05UIC8qIEZJWE1FICovCiB9ClBPUFVQICLL0cv3o6gmU6OpIiB7CiAgTUVOVUlURU0gIsvRy/ejqCZTo6kuLi4iLCAgICAgICAgICAgQ01EX1NFQVJDSAogIE1FTlVJVEVNICLL0cv3z8LSu7j2o6gmU6OpXHRGMyIsICBDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIrDv1vqjqCZIo6kiIHsKICBNRU5VSVRFTSAixNrI3aOoJkOjqSIsICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiy9HL96OoJlOjqS4uLiIsICAgICAgICBDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiyOe6zsq508Ow79b6o6gmSKOpIiwgICAgIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkFib3V0IE5vdGVwYWQiLCBDTURfSEVMUF9BQk9VVF9OT1RFUEFECiB9Cn0KCi8qIERpYWxvZyBgUGFnZSBzZXR1cCcgKi8KCkRJQUxPR19QQUdFU0VUVVAgRElBTE9HIDAsIDAsIDIyNSwgOTUKTEFOR1VBR0UgTEFOR19DSElORVNFLCBTVUJMQU5HX0NISU5FU0VfU0lNUExJRklFRApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCAxMCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAi0rPD5sno1sMiCnsKTFRFWFQgICAgItKzw7yjqCZIo6k6IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIr3F16KjqCZGo6k6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICKx39S1v9Ww16OoJk2jqaO6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICLX86OoJkyjqaO6IiwgICAgICAgIDB4MTQ1LCAgIDIwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0xFRlRWQUxVRSwgICAgIDUwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIsnPo6gmVKOpo7oiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICLT0qOoJlKjqaO6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICLPwqOoJkKjqaO6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAiyLe2qCIsICAgICAgICAgSURPSywgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIsihz/siLCAgICAgSURDQU5DRUwsICAgICAgICAgICAgICAgMTgwLCAyMSwgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIrDv1vqjqCajqSIsICAgICAgIElESEVMUCwgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfQ0hJTkVTRSwgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgICImZiIKU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwgICAiUGFnZSAmcCIKClNUUklOR19OT1RFUEFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICK8x8rCsb4iClNUUklOR19FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICK07c7zIgpTVFJJTkdfV0FSTklORywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAivq+45iIKU1RSSU5HX0lORk8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgItDFz6IiCgpTVFJJTkdfVU5USVRMRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAio6jOtMP8w/ujqSIKClNUUklOR19BTExfRklMRVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLL+dPQzsS8/iAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULCAgICAgICAgICAgICAgICAgICLOxLG+zsS8/iAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIrzHysKxvrK7xNy08r+qICclcycg1eLDtLTztcTOxLz+oaNcbiBcCsfryrnTw7HwtcSx4LytxvehoyIKU1RSSU5HX05PVEVYVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIsT6w7vT0MrkyOvIzrrOzsSxvqGjIFwKXG7H68rkyOvSu9Cp1NnK1CIKU1RSSU5HX0RPRVNOT1RFWElTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIs7EvP4gJyVzJ1xusru05tTaXG5cbiBcCsT6z+vQwr2o0ru49s7EvP7C8KO/IgpTVFJJTkdfTk9UU0FWRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAizsS8/iAnJXMnXG7V/c7E0tG4/LjEXG5cbiBcCsrHt/Gxo7TmuPy4xKO/IgpTVFJJTkdfTk9URk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLV0rK7tb3OxLz+ICclcyciClNUUklOR19PVVRfT0ZfTUVNT1JZLCAgICAgICAgICAgICAgICAgICAiw7vT0Nfjubu1xMTatOa/ydLU08PAtM3qs8m0y8/uyM7O8aGjIFwKXG7H67nYsdXSu9Cps8zQ8sqpt8XE2rTmuvPU2crUoaMiCgp9Cg==