LyoKICogQ29weXJpZ2h0IDE5OTggSnVlcmdlbiBTY2htaWVkCiAqIENvcHlyaWdodCAyMDA2LCAyMDA3IFl1blNvbmcgSHdhbmcKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19LT1JFQU4sIFNVQkxBTkdfTkVVVFJBTAoKTUVOVV8wMDEgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgpNRU5VSVRFTSAixasgvsbAzMTcKCZHKSIsCUZDSURNX1NIVklFV19CSUdJQ09OCk1FTlVJVEVNICLA28C6IL7GwMzE3CgmTSkiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCk1FTlVJVEVNICK48bfPKCZMKSIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKTUVOVUlURU0gIsDavLzI9ygmRCkiLAkJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKRU5ECgovKgpzaGVsbHZpZXcgYmFja2dyb3VuZCBtZW51CiovCk1FTlVfMDAyIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KUE9QVVAgIiIKQkVHSU4KUE9QVVAgIrq4seIoJlYpIgpCRUdJTgpNRU5VSVRFTSAixasgvsbAzMTcKCZHKSIsCUZDSURNX1NIVklFV19CSUdJQ09OCk1FTlVJVEVNICLA28C6IL7GwMzE3CgmTSkiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCk1FTlVJVEVNICK48bfPKCZMKSIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKTUVOVUlURU0gIsDavLzI9ygmRCkiLAlGQ0lETV9TSFZJRVdfUkVQT1JUVklFVwpFTkQKTUVOVUlURU0gU0VQQVJBVE9SClBPUFVQICK+xsDMxNwgwaS3xCgmSSkiCkJFR0lOCk1FTlVJVEVNICLAzLinwLi3zigmTikiLAkweDMwCS8qIGNvbHVtbiAwICovCk1FTlVJVEVNICLH/L3EwLi3zigmVCkiLAkweDMyCS8qIGNvbHVtbiAyICovCk1FTlVJVEVNICLFqbHit84oJlMpIiwJMHgzMQkvKiAuLi4gKi8KTUVOVUlURU0gIrOvwqW3zigmRCkiLAkweDMzCk1FTlVJVEVNIFNFUEFSQVRPUgpNRU5VSVRFTSAiwNq1vyDBpLfEKCZBKSIsCUZDSURNX1NIVklFV19BVVRPQVJSQU5HRQpFTkQKTUVOVUlURU0gIr7GwMzE3CDBpLfEIiwJRkNJRE1fU0hWSUVXX1NOQVBUT0dSSUQKTUVOVUlURU0gU0VQQVJBVE9SCk1FTlVJVEVNICK79bfOILDtxKciLAkJRkNJRE1fU0hWSUVXX1JFRlJFU0gKTUVOVUlURU0gU0VQQVJBVE9SCk1FTlVJVEVNICK62b+ps9ax4iIsCQlGQ0lETV9TSFZJRVdfSU5TRVJUCk1FTlVJVEVNICK4tcWpt84gutm/qbPWseIiLAlGQ0lETV9TSFZJRVdfSU5TRVJUTElOSwpNRU5VSVRFTSBTRVBBUkFUT1IKUE9QVVAgIrv1IMDbvvciCkJFR0lOCk1FTlVJVEVNICK79SDG+rT1KCZGKSIsCUZDSURNX1NIVklFV19ORVdGT0xERVIKTUVOVUlURU0gIrv1ILi1xakoJkwpIiwJRkNJRE1fU0hWSUVXX05FV0xJTksKTUVOVUlURU0gU0VQQVJBVE9SCkVORApNRU5VSVRFTSBTRVBBUkFUT1IKTUVOVUlURU0gIrzTvLoiLAlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwpFTkQKRU5ECgovKgpzaGVsbHZpZXcgaXRlbSBtZW51CiovCk1FTlVfU0hWX0ZJTEUgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgpQT1BVUCAiIgpCRUdJTgpNRU5VSVRFTSAixb279igmWCkiLAkJRkNJRE1fU0hWSUVXX0VYUExPUkUKTUVOVUlURU0gIr+tseIoJk8pIiwJCUZDSURNX1NIVklFV19PUEVOCk1FTlVJVEVNIFNFUEFSQVRPUgpNRU5VSVRFTSAiwN+287O7seIoJlUpIiwJCUZDSURNX1NIVklFV19DVVQKTUVOVUlURU0gIrq5u+coJkMpIiwJCUZDSURNX1NIVklFV19DT1BZCk1FTlVJVEVNIFNFUEFSQVRPUgpNRU5VSVRFTSAiuLXFqSC4uLXpseIoJkwpIiwJRkNJRE1fU0hWSUVXX0NSRUFURUxJTksKTUVOVUlURU0gIsH2v+yx4igmRCkiLAkJRkNJRE1fU0hWSUVXX0RFTEVURQpNRU5VSVRFTSAiwMy4pyC52bLZseIoJlIpIiwJCUZDSURNX1NIVklFV19SRU5BTUUKTUVOVUlURU0gU0VQQVJBVE9SCk1FTlVJVEVNICK807y6KCZQKSIsCUZDSURNX1NIVklFV19QUk9QRVJUSUVTCkVORApFTkQKClNIQlJTRk9SRk9MREVSX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDE4OCwgMTkyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVSB8IERTX01PREFMRlJBTUUgfCBEU19TRVRGT05UIHwgRFNfM0RMT09LCkNBUFRJT04gIsb6tPUgxb279iIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CkRFRlBVU0hCVVRUT04gIsiuwM4iLCAxLCA4MCwgMTc2LCA1MCwgMTIsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAiw+u80iIsIDIsIDEzNCwgMTc2LCA1MCwgMTIsIFdTX0dST1VQIHwgV1NfVEFCU1RPUApMVEVYVCAiIiwgSUREX1RJVExFLCA0LCA0LCAxODAsIDEyCkxURVhUICIiLCBJRERfU1RBVFVTLCA0LCAyNSwgMTgwLCAxMgpDT05UUk9MICIiLCBJRERfVFJFRVZJRVcsICJTeXNUcmVlVmlldzMyIiwKVFZTX0hBU0JVVFRPTlMgfCBUVlNfSEFTTElORVMgfCBUVlNfTElORVNBVFJPT1QgfApXU19CT1JERVIgfCBXU19UQUJTVE9QLAo0LCA0MCwgMTgwLCAxMjAKfQoKU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIiVzIMGkurgiCkZPTlQgMTAsICJNUyBTaGVsbCBEbGciCnsKREVGUFVTSEJVVFRPTiAiyK7AziIsIElET0ssIDE1MywgMTMzLCA1MCwgMTIsIFdTX1RBQlNUT1AKTElTVEJPWCA5OSwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCklDT04gIiIsIDEwODgsIDEwLCAxMCwgMTQsIDE2CkxURVhUICIiLCAxMDAsIDMwLCAxMCwgMTM3LCAxMApMVEVYVCAiIiwgMTAxLCAzMCwgMjIsIDEzNywgMTAKTFRFWFQgIldpbmXAuiC0573FwLsgwKfH2CDBprD4tce++r3AtM+02S46IiwgOTgsIDgsIDU1LCAxMzcsIDEwCn0KClNIRUxMX1JVTl9ETEcgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMCwgMCwgMjI3LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKSUNPTiAiIiwgMTIyOTcsIDcsIDExLCAxOCwgMjAsIFdTX1ZJU0lCTEUKTFRFWFQgIseusde4sizG+rT1LLmuvK2zqiDAzsXNs90gwNq/+Cwgsde4rrDtIFdpbmXAzCC/rSDAzLinwLsgwPu+7sHWvLy/5C4iLCAxMjI4OSwgMzYsIDExLCAxODIsIDE4CkxURVhUICK/rbHiKCZPKToiLCAxMjMwNSwgNywgMzksIDI0LCAxMApDT05UUk9MICIiLCAxMjI5OCwgIkNPTUJPQk9YIiwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVlNDUk9MTCB8IFdTX1ZJU0lCTEUgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX0RST1BET1dOLCAzNiwgMzcsIDE4MywgMTAwCkRFRlBVU0hCVVRUT04gIsiuwM4iLCBJRE9LLCA2MiwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICLD67zSIiwgSURDQU5DRUwsIDExNiwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICLDo7HiKCZCKS4uLiIsIDEyMjg4LCAxNzAsIDYzLCA1MCwgMTQsIFdTX1RBQlNUT1AKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewovKiBjb2x1bW5zIGluIHRoZSBzaGVsbHZpZXcgKi8KSURTX1NIVl9DT0xVTU4xCQkixsTAzyIKSURTX1NIVl9DT0xVTU4yCQkixamx4iIKSURTX1NIVl9DT0xVTU4zCQkix/y9xCIKSURTX1NIVl9DT0xVTU40CQkivPbBpLOvwqUiCklEU19TSFZfQ09MVU1ONQkJIrzTvLoiCklEU19TSFZfQ09MVU1ONgkJIsWpseIiCklEU19TSFZfQ09MVU1ONwkJIrChtMnH0SDFqbHiIgpJRFNfU0hWX0NPTFVNTjgJCSLAzLinIgpJRFNfU0hWX0NPTFVNTjkJCSLB1ryuIgpJRFNfU0hWX0NPTFVNTjEwCSK80sCvwNoiCklEU19TSFZfQ09MVU1OMTEJIrHXt+wiCklEU19TSFZfQ09MVU1OX0RFTEZST00JIr/4t6EgwKfEoSIKSURTX1NIVl9DT0xVTU5fREVMREFURQkiwfa/9sH4ILOvwqUiCgovKiBzcGVjaWFsIGZvbGRlcnMgKi8KSURTX0RFU0tUT1AJCSK1pb26xanFviIKSURTX01ZQ09NUFVURVIJCSKzuyDExMe7xc0iCklEU19SRUNZQ0xFQklOX0ZPTERFUl9OQU1FICAgICAgIsjewfbF6yIKCi8qIGNvbnRleHQgbWVudXMgKi8KSURTX1ZJRVdfTEFSR0UJCSLFqyC+xsDMxNwoJkcpIgpJRFNfVklFV19TTUFMTAkJIsDbwLogvsbAzMTcKCZNKSIKSURTX1ZJRVdfTElTVAkJIrjxt88oJkwpIgpJRFNfVklFV19ERVRBSUxTCSLA2ry8yPcoJkQpIgpJRFNfU0VMRUNUCQkivLHFwyIKSURTX09QRU4JCSK/rbHiIgoKSURTX0NSRUFURUZPTERFUl9ERU5JRUQgIrv1IMb6tPW4piC4uLXpILz2IL74vcC0z7TZOiC4uLXpILHHx9HAzCC++L3AtM+02S4iCklEU19DUkVBVEVGT0xERVJfQ0FQVElPTiAiu/Ugxvq09bimILi4teW0wiCw+sGkv6G8rSC/obevud+7/SIKSURTX0RFTEVURUlURU1fQ0FQVElPTiAixsTAzyDB9r/sseIgyK7AziIKSURTX0RFTEVURUZPTERFUl9DQVBUSU9OICLG+rT1IMH2v+yx4iDIrsDOIgpJRFNfREVMRVRFSVRFTV9URVhUICK0573FwLogICclMSfAuyDB9r/sseK4piC52bb4tM+x7j8iCklEU19ERUxFVEVNVUxUSVBMRV9URVhUICK0573FwLogJTEgvsbAzMXbKLXpKcC7IMH2v+yx4rimILnZtvi0z7HuPyIKSURTX0RFTEVURVNFTEVDVEVEX1RFWFQgIrTnvcXAuiC8scXDtcggvsbAzMXbKLXpKcC7IMH2v+yx4rimILnZtvi0z7HuPyIKSURTX1RSQVNISVRFTV9URVhUICK0573FwLogJyUxJyDAuyi4pikgyN7B9sXrwLi3ziC6uLO7seK4piC52bb4tM+x7j8iCklEU19UUkFTSEZPTERFUl9URVhUICK0573FwLogJyUxJyCw+iCx1yC+yMDHILO7v+vAuyDI3sH2xevAuLfOILq4s7ux4rimILnZtvi0z7HuPyIKSURTX1RSQVNITVVMVElQTEVfVEVYVCAitOe9xcC6ICclMScgtenAuyi4pikgyN7B9sXrwLi3ziC6uLO7seK4piC52bb4tM+x7j8iCklEU19DQU5UVFJBU0hfVEVYVCAiVGhlIGl0ZW0gJyUxJyBjYW4ndCBiZSBzZW50IHRvIFRyYXNoLiBEbyB5b3Ugd2FudCB0byBkZWxldGUgaXQgaW5zdGVhZD8iCklEU19PVkVSV1JJVEVGSUxFX1RFWFQgIlRoaXMgZm9sZGVyIGFscmVhZHkgY29udGFpbnMgYSBmaWxlIGNhbGxlZCAnJTEnLlxuXG5EbyB5b3Ugd2FudCB0byByZXBsYWNlIGl0PyIKSURTX09WRVJXUklURUZJTEVfQ0FQVElPTiAixsTAzyC1pL7uvrKx4iDIrsDOIgpJRFNfT1ZFUldSSVRFRk9MREVSX1RFWFQgIiAgwMwgxvq09bTCIMDMucwgJyUxJ8DMtvUgwMy4p8C7ILChwfggxvq09bimIMb3x9THz7DtIMDWvcC0z7TZLlxuXG4iXAogICAgICK4uL7gILTnvcXAzCCwsMC6IMDMuKfAuLfOILTru/Mgxvq09bimIMH2waTH0bTZuOkgvLHFw7XIIMb6tPW0wiC068O8tckgsM3A1LTPtNlcbiJcCiAgICAgIiC068O8tckgsM3A1LTPtNkuILTnvcXAuiDAzCDG+rT1uKYgwMy1v73DxbCwxbOqILq5u+fHz7DavcC0z7HuPyIKCgovKiBtZXNzYWdlIGJveCBzdHJpbmdzICovCklEU19SRVNUQVJUX1RJVExFICAgICAgICK02b3DIL3DwNsiIApJRFNfUkVTVEFSVF9QUk9NUFQgICAgICAitOe9xcC6IMCptbW/7MHuIMDnus7Gw8C7ICDA58f2x8+w2r3AtM+x7j8iCklEU19TSFVURE9XTl9USVRMRSAgICAgICKy9LHiIgpJRFNfU0hVVERPV05fUFJPTVBUICAgICAitOe9xcC6ICBXaW5lILy8vMfAuyCy9LDavcC0z7HuPyIKCi8qIHNoZWxsIGZvbGRlciBwYXRoIGRlZmF1bHQgdmFsdWVzICovCklEU19QUk9HUkFNUyAgICAgICAgICAgICAgICAiU3RhcnQgTWVudVxcUHJvZ3JhbXMiCklEU19QRVJTT05BTCAgICAgICAgICAgICAgICAiTXkgRG9jdW1lbnRzIgpJRFNfRkFWT1JJVEVTICAgICAgICAgICAgICAgIkZhdm9yaXRlcyIKSURTX1NUQVJUVVAgICAgICAgICAgICAgICAgICJTdGFydCBNZW51XFxQcm9ncmFtc1xcU3RhcnRVcCIKSURTX1JFQ0VOVCAgICAgICAgICAgICAgICAgICJSZWNlbnQiCklEU19TRU5EVE8gICAgICAgICAgICAgICAgICAiU2VuZFRvIgpJRFNfU1RBUlRNRU5VICAgICAgICAgICAgICAgIlN0YXJ0IE1lbnUiCklEU19NWU1VU0lDICAgICAgICAgICAgICAgICAiTXkgTXVzaWMiCklEU19NWVZJREVPICAgICAgICAgICAgICAgICAiTXkgVmlkZW8iCklEU19ERVNLVE9QRElSRUNUT1JZICAgICAgICAiRGVza3RvcCIKSURTX05FVEhPT0QgICAgICAgICAgICAgICAgICJOZXRIb29kIgpJRFNfVEVNUExBVEVTICAgICAgICAgICAgICAgIlRlbXBsYXRlcyIKSURTX0FQUERBVEEgICAgICAgICAgICAgICAgICJBcHBsaWNhdGlvbiBEYXRhIgpJRFNfUFJJTlRIT09EICAgICAgICAgICAgICAgIlByaW50SG9vZCIKSURTX0xPQ0FMX0FQUERBVEEgICAgICAgICAgICJMb2NhbCBTZXR0aW5nc1xcQXBwbGljYXRpb24gRGF0YSIKSURTX0lOVEVSTkVUX0NBQ0hFICAgICAgICAgICJMb2NhbCBTZXR0aW5nc1xcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzIgpJRFNfQ09PS0lFUyAgICAgICAgICAgICAgICAgIkNvb2tpZXMiCklEU19ISVNUT1JZICAgICAgICAgICAgICAgICAiTG9jYWwgU2V0dGluZ3NcXEhpc3RvcnkiCklEU19QUk9HUkFNX0ZJTEVTICAgICAgICAgICAiUHJvZ3JhbSBGaWxlcyIKSURTX01ZUElDVFVSRVMgICAgICAgICAgICAgICJNeSBQaWN0dXJlcyIKSURTX1BST0dSQU1fRklMRVNfQ09NTU9OICAgICJQcm9ncmFtIEZpbGVzXFxDb21tb24gRmlsZXMiCklEU19DT01NT05fRE9DVU1FTlRTICAgICAgICAiRG9jdW1lbnRzIgpJRFNfQURNSU5UT09MUyAgICAgICAgICAgICAgIlN0YXJ0IE1lbnVcXFByb2dyYW1zXFxBZG1pbmlzdHJhdGl2ZSBUb29scyIKSURTX0NPTU1PTl9NVVNJQyAgICAgICAgICAgICJEb2N1bWVudHNcXE15IE11c2ljIgpJRFNfQ09NTU9OX1BJQ1RVUkVTICAgICAgICAgIkRvY3VtZW50c1xcTXkgUGljdHVyZXMiCklEU19DT01NT05fVklERU8gICAgICAgICAgICAiRG9jdW1lbnRzXFxNeSBWaWRlbyIKSURTX0NEQlVSTl9BUkVBICAgICAgICAgICAgICJMb2NhbCBTZXR0aW5nc1xcQXBwbGljYXRpb24gRGF0YVxcTWljcm9zb2Z0XFxDRCBCdXJuaW5nIgp9Cg==