LyoKICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAqCiAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwogKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCiAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgogKgogKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAogKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogKgogKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQogKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAqIHF1ZXN0aW9ucy4KICovCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBEaWFsb2cKLy8KCklERF9ET1dOTE9BRF9ESUFMT0cgRElBTE9HRVggMCwgMCwgMzQwLCAxMjAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTXzNETE9PSyB8IERTX0NFTlRFUiB8IFdTX1BPUFVQIHwgCiAgICBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiy/nQ6LXExuTL+9fpvP4iCkVYU1RZTEUgV1NfRVhfQVBQV0lORE9XCkZPTlQgOCwgIk1TIFNhbnMgU2VyaWYiCkJFR0lOCiAgICBMVEVYVCAgICAgICAgICAgIiIsIElEQ19ET1dOTE9BRF9NQVNUSEVBRCwgMCwgMCwgMzQwLCAzOQogICAgTFRFWFQgICAgICAgICAgICIiLCBJRENfTUFTVEhFQURfVEVYVCwgNjAsIDE0LCAyMDAsIDEyCiAgICBDT05UUk9MICAgICAgICAgIiIsIElEQ19TVEFUSUMsIlN0YXRpYyIsIFNTX0JMQUNLRlJBTUUgfCBTU19TVU5LRU4sCiAgICAgICAgICAgICAgICAgICAgMCwgMzksIDM0MCwgMQogICAgTFRFWFQgICAgICAgICAgICIiLCBJRENfRE9XTkxPQURfVEVYVCwgMTIsIDYwLCAzMTYsIDIwCiAgICBMVEVYVCAgICAgICAgICAgIiIsIElEQ19USU1FX1JFTUFJTklORywgMTIsIDkwLCAzMTYsIDEwCiAgICBDT05UUk9MICAgICAgICAgIlByb2dyZXNzMSIsMTAwNiwibXNjdGxzX3Byb2dyZXNzMzIiLFBCU19TTU9PVEgsCiAgICAgICAgICAgICAgICAgICAgMTIsIDEwMCwgMjY1LCAxNAogICAgUFVTSEJVVFRPTgkgICAgIsihz/siLCAgMiwgMjg1LCAxMDAsIDQ2LCAxNApFTkQKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gREVTSUdOSU5GTwovLwoKI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKR1VJREVMSU5FUyBERVNJR05JTkZPIERJU0NBUkRBQkxFIApCRUdJTgogICAgMTA1LCBESUFMT0cKICAgIEJFR0lOCiAgICAgICAgTEVGVE1BUkdJTiwgNwogICAgICAgIFJJR0hUTUFSR0lOLCAyMzYKICAgICAgICBUT1BNQVJHSU4sIDcKICAgICAgICBCT1RUT01NQVJHSU4sIDYzCiAgICBFTkQKRU5ECiNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gU3RyaW5nIFRhYmxlCi8vCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSAKQkVHSU4KICAgIElEU19ET1dOTE9BRF9DQU5DRUxfTUVTU0FHRSAgICLIoc/7sLLXsNOm08OzzNDyy/nQ6LXEtu7N4tfpvP6/ycTcu+G1vNbCuMPTptPDs8zQ8s3Ls/aho1xuXG7Kx7fxyLe2qNKqyKHP+7Cy17C27s3i1+m8/qO/IgogICAgSURTX0RPV05MT0FEX0NBTkNFTF9DQVBUSU9OICAgIsihz/sgLSC27s3i1+m8/iIKICAgIElEU19ET1dOTE9BRF9DQU5DRUxfSU5TVFJVQ1RJT04gICAiIgogICAgSURTX0hUVFBfSU5TVFJVQ1RJT05fUkVRVUVTVF9USU1FT1VUICAgICAgIsGsvdPS0bOsyrEiCiAgICBJRFNfSFRUUF9JTlNUUlVDVElPTl9TRVJWRVJfTk9UX1JFQUNIQUJMRSAizt63qMGsvdO1vSBJbnRlcm5ldCIKICAgIElEU19IVFRQX0lOU1RSVUNUSU9OX1VOS05PV05fRVJST1IgICAgICAgICK3/s7xxve07c7zo6i07c7zICVzo6kiCiAgICBJRFNfSFRUUF9JTlNUUlVDVElPTl9TRVJWSUNFX1VOQVZBSUwgICAgICAit/7O8bK7v8nTw6OotO3O8yAlc6OpIgogICAgSURTX0hUVFBfSU5TVFJVQ1RJT05fRk9SQklEREVOICAgICAgICAgICAgIr7cvvi3w87Ku/K9+9a5t8POyqOotO3O8yAlc6OpIgogICAgSURTX0hUVFBfU1RBVFVTX09USEVSICAgICAgICAgICAgICAgICAgICAgItTatMvH68fzxtq85LP2z9a07c7zoaPE+srHt/HSqtbYytTH68fzo78iCgovLyBIVFRQIHN0YXR1cyBjb2RlCiAgICBJRFNfSFRUUF9TVEFUVVNfUkVRVUVTVF9USU1FT1VUICK3/s7xxve1yLT9x+vH88qxs6zKsaGjIgogICAgSURTX0hUVFBfU1RBVFVTX0ZPUkJJRERFTgkJIrf+zvHG99LRvdPK3Mfrx/OjrLWrvty++Na00NChoyIKICAgIElEU19IVFRQX1NUQVRVU19TRVJWRVJfRVJST1IJIrf+zvHG99P2tb3S4s3ix+m/9qOszt63qM3qs8nH68fzoaMiCiAgICBJRFNfSFRUUF9TVEFUVVNfU0VSVklDRV9VTkFWQUlMCSK3/s7x1N3Ksbn91NihoyIKCgogICAgSURTX0RPV05MT0FEX1NUQVRVU19SRVRSWQkJIrf+zvHG99X9w6ajrMfr1NogJWxkIMPruvPW2MrULi4uIgoKICAgIElEU19FUlJPUl9DQVBUSU9OICAgICAgICAgICAgICAgIrTtzvMgLSBKYXZhIEtlcm5lbCIKICAgIElEU19IT1VSU01JTlVURVNFQ09ORAkgICAgIrnAvMbKo9PgyrG85DolZCDQocqxICVkILfW1tMgJS4wZiDD6yIKICAgIElEU19IT1VSTUlOVVRFU0VDT05ECSAgICAiucC8xsqj0+DKsbzkOiVkINChyrEgICVkILfW1tMgJS4wZiDD6yIKICAgIElEU19NSU5VVEVTRUNPTkQgCQkgICAgIrnAvMbKo9PgyrG85DolZCC31tbTICUuMGYgw+siCiAgICBJRFNfU0VDT05EICAgICAgICAgICAgICAgICAgICAgICK5wLzGyqPT4MqxvOQ6JS4wZiDD6yIKICAgIElEU19ESVNLX0ZVTExfRVJST1JfQ0FQVElPTiAgICAgIrTFxczS0cL6IgogICAgSURTX0RJU0tfRlVMTF9FUlJPUiAgICAgICAgICAgICAi08nT2rTFxczS0cL6o6xKYXZhIEtlcm5lbCDO3reoz8LU2Mv50Oi1xNfpvP6ho8rHt/HW2MrUo78iCiAgICBJRFNfRElTS19XUklURV9FUlJPUl9DQVBUSU9OICAgICK0xcXM0LTI67TtzvMiCiAgICBJRFNfRElTS19XUklURV9FUlJPUiAgICAgICAgICAgICLU2s/ytMXFzNa00NDQtMjrstnX98qxIEphdmEgS2VybmVsINP2tb207c7zoaPKx7fx1tjK1KO/IgogICAgSURTX0hUVFBfU1RBVFVTX1NFUlZFUl9OT1RfUkVBQ0hBQkxFICLU2sq508PPtc2ztbHHsLXEIEludGVybmV0IMGsvdPJ6NbDtcTH6b/2z8KjrEphdmEgS2VybmVsIM7et6i8zND41rTQ0KGj1NogV2luZG93cyIiv9jWxsPmsOUiItbQo6zH67zssukiIkludGVybmV0INGhz+4iIi0+IiLBrL3TIiLS1Mi3saPJ6NbDus20+sDt0MXPotX9yLehoyIKCiAgICBJRFNfRE9XTkxPQURfUkVUUlkgICAgICAgICAgICAgIs/C1Ni07c7zIgogICAgSURTX0RPV05MT0FEX1JFVFJZX1RFWFQgICAgICAgICLU2s/C1NjEs9Cpx+vH87XE1+m8/sbavOS3osn6tO3O86Gjyse38dKq1NnK1NK7tM7PwtTY1eLQqdfpvP6jvyIKCiAgICBJRFNfRE9XTkxPQUQgICAgICAgICAgICAgICAgICAgIrCy17DG5Mv71+m8/iIKCUlEU19ET1dOTE9BRF9VTlBBQ0tJTkcgICAgICAgICAi1f3U2r3i0bnL9bD8IgogICAgSURTX0RPV05MT0FEX1RFWFQgICAgICAgICAgICAgICLPwtTYsqKwstewIEphdmEg06bTw7PM0PLL+dDotcTG5Mv71+m8/rrzo6y4w9Om08OzzNDyvavG9LavoaMiCiAgICAKICAgIElEU19GSUxFX1VQREFURV9FUlJPUiAgICAgICAgICAiuPzQwiAlcyVzIMqxt6LJ+rTtzvOhoyIKICAgIElEU19GSUxFX0RFTEVURV9FUlJPUiAgICAgICAgICAiyb6z/SAlcyDKsbeiyfq07c7zoaMiCiAgICBJRFNfSkFWQV9IT01FX0VSUk9SICAgICAgICAgICAgIs7et6jIt7aoIEphdmEg1vfEv8K8oaMiCiAgICBJRFNfS0VSTkVMX0hPTUVfRVJST1IgICAgICAgICAgIs7et6jIt7aoIGprZXJuZWwuZGxsILXEwre+tqGjIgogICAgSURTX0pCUk9LRVJfRVJST1IgICAgICAgICAgICAgICLO3reoxvS2ryBqYnJva2VyLmV4ZaGjIgogICAgSURTX0ZBVEFMX0VSUk9SICAgICAgICAgICAgICAgICJKYXZhIM7et6jPwtTYy/nQ6LXE1+m8/qGjz9bU2rPM0PK9q83Ls/ahoyIKICAgIElEU19FUlJPUl9ET1dOTE9BRElOR19CVU5ETEVfUFJPUEVSVElFUyAiSmF2YSDO3reo0+vPwtTYt/7O8cb3vfjQ0M2o0MWho8/W1NqzzNDyvavNy7P2oaMiCiAgICBJRFNfRVJST1JfTUFMRk9STUVEX0JVTkRMRV9QUk9QRVJUSUVTICJKYXZhINTa0+vPwtTYt/7O8cb3vfjQ0M2o0MXKsdP2tb207c7zoaPP1tTas8zQ8r2rzcuz9qGjIgogICAgSURTX0VSUk9SX01BTEZPUk1FRF9VUkwgIkphdmEgzt63qLTTIFVSTCAnJXMnINa00NDPwtTYoaPP1tTas8zQ8r2rzcuz9qGjIgpFTkQK