LyoKICogIE5vdGVwYWQgKFNpbXBsaWZpZWQgQ2hpbmVzZSByZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMjAwMiBsaXVzcGlkZXIgPGxpdXNwaWRlckB5YWhvby5jb20+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCk1BSU5fTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfQ0hJTkVTRSwgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQKewogUE9QVVAgIs7EvP6jqCZGo6kiIHsKICBNRU5VSVRFTSAi0MK9qKOoJk6jqVx0Q3RybCtOIiwgICAgICAgICAgIENNRF9ORVcKICBNRU5VSVRFTSAitPK/qqOoJk+jqS4uLlx0Q3RybCtPIiwgICAgICAgICAgICAgQ01EX09QRU4KICBNRU5VSVRFTSAisaO05qOoJlOjqVx0Q3RybCtTIiwgICAgICAgICAgICAgQ01EX1NBVkUKICBNRU5VSVRFTSAiwe205s6qKCZBKS4uLiIsICAgICAgIENNRF9TQVZFX0FTCiAgTUVOVUlURU0gIrTy06GjqCZQo6kuLi5cdEN0cmwrUCIsICAgICAgICAgICAgQ01EX1BSSU5UCiAgTUVOVUlURU0gItKzw+bJ6NbDo6gmVKOpLi4uIiwgICAgQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAitPLTocno1sOjqCZSo6kuLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLNy7P2o6gmRaOpIiwgICAgICAgICAgICAgQ01EX0VYSVQKIH0KUE9QVVAgIrHgvK2jqCZFo6kiIHsKICBNRU5VSVRFTSAis7fP+6OoJlWjqVx0Q3RybCtaIiwgICAgIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIrz0x9CjqCZUo6lcdEN0cmwrWCIsICAgICAgQ01EX0NVVAogIE1FTlVJVEVNICK4tNbGo6gmQ6OpXHRDdHJsK0MiLCAgICAgQ01EX0NPUFkKICBNRU5VSVRFTSAi1bPM+aOoJlCjqVx0Q3RybCtWIiwgICAgQ01EX1BBU1RFCiAgTUVOVUlURU0gIsm+s/2jqCZEo6lcdERlbCIsICAgICAgQ01EX0RFTEVURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLIq9Gho6gmQaOpIiwgICAgICAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAisuXI68jVxtqhosqxvOSjqCZUo6lcdEY1IiwgICAgQ01EX1RJTUVfREFURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLX1Lavu7vQ0KOoJlejqSIsICBDTURfV1JBUAogIE1FTlVJVEVNICImRm9udC4uLiIsICAgICAgICAgIENNRF9GT05UIC8qIEZJWE1FICovCiB9ClBPUFVQICLL0cv3o6gmU6OpIiB7CiAgTUVOVUlURU0gIsvRy/ejqCZTo6kuLi4iLCAgICAgICAgICAgQ01EX1NFQVJDSAogIE1FTlVJVEVNICLL0cv3z8LSu7j2o6gmU6OpXHRGMyIsICBDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIrDv1vqjqCZIo6kiIHsKICBNRU5VSVRFTSAixNrI3aOoJkOjqSIsICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiy9HL96OoJlOjqS4uLiIsICAgICAgICBDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiyOe6zsq508Ow79b6o6gmSKOpIiwgICAgIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBQT1BVUCAi18rBz9DFz6KjqCZPo6kiIHsKICAgTUVOVUlURU0gItPDu6fQ7b/J0K3S6aOoJkyjqS4uLiIsICAgICAgICAgQ01EX0xJQ0VOU0UKICAgTUVOVUlURU0gItTwyM7O3rnYo6gmTqOpLi4uIiwgICAgIENNRF9OT19XQVJSQU5UWQogICBNRU5VSVRFTSAiudjT2iBXaW5lo6gmQaOpLi4uIiwgICAgICBDTURfQUJPVVRfV0lORQogIH0KIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpMQU5HVUFHRSBMQU5HX0NISU5FU0UsIFNVQkxBTkdfQ0hJTkVTRV9TSU1QTElGSUVEClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDEwLCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICLSs8PmyejWwyIKewpMVEVYVCAgICAi0rPDvKOoJkijqToiLCAgMHgxNDAsICAgMTAsIDA3LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDEsICAgICAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICK9xdeio6gmRqOpOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MywgICAgICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICKx39S1v9Ww16OoJk2jqaO6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICLX86OoJkyjqaO6IiwgICAgICAgIDB4MTQ1LCAgIDIwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLCovICAgMHgxNDcsICAgICAgIDUwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIsnPo6gmVKOpo7oiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLCovICAgIDB4MTRBLCAgICAgICAgNTAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAi09KjqCZSo6mjuiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCovICAweDE0RCwgICAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICLPwqOoJkKjqaO6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwqLyAweDE1MCwgICAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIsi3tqgiLCAgICAgICAgIElET0ssICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICLIoc/7IiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICKw79b6o6gmo6kiLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX0NISU5FU0UsIFNVQkxBTkdfQ0hJTkVTRV9TSU1QTElGSUVECnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwgICAiJm4iICAgICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgICJQYWdlICZzIiAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLCAgICAgICAgICAgICAiMjAgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsICAgICIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsICAgICAgICAgICAgICAiMjUgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAgICIyNSBtbSIgICAgIC8qIEZJWE1FICovCgpTVFJJTkdfTk9URVBBRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAivMfKwrG+IgpTVFJJTkdfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAitO3O8yIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIr6vuOYiClNUUklOR19JTkZPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLQxc+iIgoKU1RSSU5HX1VOVElUTEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIqOozrTD/MP7o6kiCgpTVFJJTkdfQUxMX0ZJTEVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiy/nT0M7EvP4gKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwgICAgICAgICAgICAgICAgICAizsSxvs7EvP4gKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICK8x8rCsb6yu8TctPK/qiAnJXMnINXiw7S087XEzsS8/qGjXG4gXArH68q508Ox8LXEseC8rcb3oaMiClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLE+sO709DK5MjryM66zs7Esb6hoyBcClxux+vK5Mjr0rvQqdTZytQiClNUUklOR19ET0VTTk9URVhJU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICLOxLz+ICclcydcbrK7tObU2lxuXG4gXArE+s/r0MK9qNK7uPbOxLz+wvCjvyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIs7EvP4gJyVzJ1xu1f3OxNLRuPy4xFxuXG4gXArKx7fxsaO05rj8uMSjvyIKU1RSSU5HX05PVEZPVU5ELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi1dKyu7W9zsS8/iAnJXMnIgpTVFJJTkdfT1VUX09GX01FTU9SWSwgICAgICAgICAgICAgICAgICAgIsO709DX47m7tcTE2rTmv8nS1NPDwLTN6rPJtMvP7sjOzvGhoyBcClxux+u52LHV0rvQqbPM0PLKqbfFxNq05rrz1NnK1KGjIgoKfQo=