LyoKICogV2luZUZpbGUKICogU2ltcGxpZmllZCBDaGluZXNlIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDIgbGl1c3BpZGVyIDxsaXVzcGlkZXJAeWFob28uY29tPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0NISU5FU0UsIFNVQkxBTkdfQ0hJTkVTRV9TSU1QTElGSUVECgovKiBNZW51ICovCgpJRE1fV0lORUZJTEUgTUVOVSBGSVhFRCBJTVBVUkUKewoJUE9QVVAgIs7EvP6jqCZGo6kiICB7CgkJTUVOVUlURU0gIrTyv6qjqCZPo6lcdEVudGVyIiAsCQkJMTAxCgkJTUVOVUlURU0gItLGtq+jqCZNo6kuLi5cdEY3IiAsIAkJCTEwNgoJCU1FTlVJVEVNICK4tNbGo6gmQ6OpLi4uXHRGOCIgLAkJCTEwNwoJCU1FTlVJVEVNICLOu9PavPTM+bDlo6gmSaOpLi4uXHRGOSIgLAkJMTE4CgkJTUVOVUlURU0gIsm+s/2jqCZEo6lcdERlbCIgLAkJCTEwOAoJCU1FTlVJVEVNICK4xMP7o6gmTqOpLi4uIiAsCQkJMTA5CgkJTUVOVUlURU0gIsr00NSjqCZJo6kuLi5cdEFsdCtFbnRlciIgLCBJRF9FRElUX1BST1BFUlRJRVMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAi0bnL9aOoJk+jqS4uLiIgLAkJMTE5CgkJTUVOVUlURU0gIr3i0bnL9aOoJk+jqS4uLiIgLAkJMTIwCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gItTL0NCjqCZSo6kuLi4iICwJCQlJRF9FWEVDVVRFCgkJTUVOVUlURU0gIrTy06GjqCZQo6kuLi4iICwgCQkJMTAyCgkJTUVOVUlURU0gIsXk1sPOxLz+z+C52C4uLiIgLAkJMTAzCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIr2owaLEv8K8o6gmRaOpLi4uIiAsCQkJMTExCgkJTUVOVUlURU0gIrLp1dKjqCZIo6kuLi4iICwJCQkxMDQKCQlNRU5VSVRFTSAi0aHU8c7EvP6jqCZTo6kuLi4iICwJCQkxMTYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwoJCU1FTlVJVEVNICLNy7P2o6gmWKOpXHRBbHQrWCIgLCAJCQlJRF9GSUxFX0VYSVQKI2Vsc2UKCQlNRU5VSVRFTSAizcuz9qOoJlijqSIsIAkJCQlJRF9GSUxFX0VYSVQKI2VuZGlmCgl9CgoJUE9QVVAgIrTFxcyjqCZEo6kiICB7CgkJTUVOVUlURU0gIri01sajqCZDo6kuLi4iICwJCQkyMDEKCQlNRU5VSVRFTSAiw/zD+6OoJkyjqS4uLiIgLAkJCTIwMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICK48cq9u6+jqCajqS4uLiIgLAkJCTIwMwojaWZkZWYgX1dJTjk1CgkJTUVOVUlURU0gIr2owaLPtc2zxcyjqCZNo6kuLi4iLCAtMQkvKkBAICovCiNlbmRpZgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICLBrL3TzfjC58f9tq/G96OoJk6jqSIgLAkJCTI1MgoJCU1FTlVJVEVNICK2z7+qzfjC58f9tq/G98GsvdOjqCZEo6kiICwJCTI1MwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICK5ss/tzqouLi4iICwJCQkyNTQKCQlNRU5VSVRFTSAiyb6z/bmyz+2jqCZSo6kuLi4iICwJCQkyNTUKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAi0aHU8cf9tq/G96OoJlOjqS4uLiIgLAkJCTI1MQoJfQoKCVBPUFVQICLEv8K8o6gmRKOpIiAgewoJCU1FTlVJVEVNICLPwtK7suOjqCZOo6lcdCsiICwJCQkzMDEKCQlNRU5VSVRFTSAi1bm/qqOoJlSjqVx0KiIgLAkJMzAyCgkJTUVOVUlURU0gIsirsr/Vub+qo6gmQaOpXHRTdHJnKyoiICwJCTMwMwoJCU1FTlVJVEVNICLV27X+o6gmUqOpXHQtIiAsCQkJMzA0CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIrHqvMfX08S/wryjqCZNo6kiICwJCQkJNTA1Cgl9CgoJUE9QVVAgIsrTzbyjqCZWo6kiICB7CgkJTUVOVUlURU0gIsS/wrzK97v6xvfE2sjdo6gmUqOpIiAsCQkJNDEzCgkJTUVOVUlURU0gIr32z9TKvsS/wrzK96OoJkWjqSIgLAkJCTQxMQoJCU1FTlVJVEVNICK99s/Uyr7Ev8K8xNrI3aOoJk+jqSIgLAkJCTQxMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICK31rjuo6gmTKOpIiAsCQkJNDE0CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIs7EvP7D+8P7o6gmTqOpIiAsCQkJSURfVklFV19OQU1FCgkJTUVOVUlURU0gIs7EvP7P6s+kwdCx7aOoJkGjqSIgLAkJCQlJRF9WSUVXX0FMTF9BVFRSSUJVVEVTLCBDSEVDS0VECgkJTUVOVUlURU0gIrK/t9bK9NDUo6gmUKOpLi4uIiAsCQkJSURfVklFV19TRUxFQ1RFRF9BVFRSSUJVVEVTCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIrC0zsS8/sP7xcXQ8qOoJlOjqSIgLAkJNDA0CgkJTUVOVUlURU0gIrC0wODQzcXF0PKjqCZCo6kiICwJCTQwNQoJCU1FTlVJVEVNICKwtLTz0KHFxdDyo6gmWqOpIiAsIAkJNDA2CgkJTUVOVUlURU0gIrC0yNXG2sXF0PKjqCZEo6kiICwgCQk0MDcKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAitqjWxsXF0PIuLi4iICwJCQk0MDkKCX0KCglQT1BVUCAi0aHP7qOoJk+jqSIgIHsKCQlNRU5VSVRFTSAiyLe2qLe9yr2jqCZDo6kuLi4iICwJCS0xCgkJTUVOVUlURU0gItfWzOWjqCZGo6kuLi4iICwJCQktMQoJCU1FTlVJVEVNICK2qNbGuaS+38z1o6gmQqOpLi4uIiAsIC0xCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIrmkvt/M9aOoJlSjqSIgLAkJSURfVklFV19UT09MX0JBUiwgQ0hFQ0tFRAoJCU1FTlVJVEVNICLH/bavxvfB0LHto6gmRKOpIiAsCQlJRF9WSUVXX0RSSVZFX0JBUiwgQ0hFQ0tFRAoJCU1FTlVJVEVNICLXtMyswLijqCZTo6kiICwJSURfVklFV19TVEFUVVNCQVIsIENIRUNLRUQKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwoJCU1FTlVJVEVNICLIq8bBo6gmVaOpXHRDdHJsK1NoaWZ0K1MiICwgCUlEX1ZJRVdfRlVMTFNDUkVFTgojZW5kaWYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJlN5bWJvbCBuYWNoIFByb2dyYW1tc3RhcnQiICwJCS0xICAvKkZJWE1FIHdoYXQncyB0aGlzPyAqLwoJCU1FTlVJVEVNICImRWluc3RlbGx1bmdlbiBiZWltIEJlZW5kZW4gc3BlaWNoZXJuIiAsCQkJNTExCgl9CgoKCVBPUFVQICKwssiro6gmU6OpIiAgewoJCU1FTlVJVEVNICK3w87Ko6gmQaOpLi4uIiAsCQk2MDUKCQlNRU5VSVRFTSAitcfCvKOoJkyjqS4uLiIgLAkJCTYwNgoJCU1FTlVJVEVNICLL+dPQ1d+jqCZPo6kuLi4iICwJCTYwNwoJfQoKCVBPUFVQICK0sL/ao6gmV6OpIiAgewoJCU1FTlVJVEVNICLQwr2oo6gmVykiICwJCQlJRF9XSU5ET1dfTkVXCgkJTUVOVUlURU0gIrLjtf5cdEN0cmwrRjUiICwJCUlEX1dJTkRPV19DQVNDQURFCgkJTUVOVUlURU0gIsuuxr3GvcbMo6gmSKOpIiAsCQlJRF9XSU5ET1dfVElMRV9IT1JaCgkJTUVOVUlURU0gIrS51rHGvcbMo6gmo6lcdEN0cmwrRjQiICwJCUlEX1dJTkRPV19USUxFX1ZFUlQKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwoJCU1FTlVJVEVNICLX1LavxcXB0CIgLAkJSURfV0lORE9XX0FVVE9TT1JUCiNlbmRpZgoJCU1FTlVJVEVNICLX1LavxcXB0M28seqjqCZTo6kiICwJCUlEX1dJTkRPV19BUlJBTkdFCgkJTUVOVUlURU0gIsui0MKjqCZSo6lcdEY1IiAsCQlJRF9SRUZSRVNICgl9CgoJUE9QVVAgIiY/IiAgewoJCU1FTlVJVEVNICKw79b61vfM4qOoJkijqVx0RjEiICwJCQlJRF9IRUxQCgkJTUVOVUlURU0gIsvRy/ew79b6o6gmU6OpLi4uXHRGMSIgLAkJCUlEX0hFTFAKCQlNRU5VSVRFTSAiyrnTw7Dv1vqjqCZVo6lcdEYxIiAsCQkJSURfSEVMUF9VU0lORwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCVBPUFVQICLXysHP0MXPoi4uLiIgIHsKCQkgIE1FTlVJVEVNICK52NPaICZXaW5lLi4uIiAsCQkJSURfQUJPVVRfV0lORQovKgogKgkJICBNRU5VSVRFTSAi08O7p9Dtv8nQrdLpo6gmTKOpLi4uIgkJSURfTElDRU5TRQogKgkJICBNRU5VSVRFTSAi1PDIzs7eudijqCZOo6kiCQlJRF9OT19XQVJSQU5UWQogKi8KCQl9Cgl9Cn0KCgpJRERfRVhFQ1VURSBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICLUy9DQIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUNPTlRST0wgCQkiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCglDT05UUk9MIAkJIsP8we6jqCZDo6mjuiIgLCAtMSwgIlN0YXRpYyIsIFNTX0xFRlROT1dPUkRXUkFQfFdTX0dST1VQLCAzLCAxOCwgNjAsIDEwCglFRElUVEVYVAkJMjAxLCAzLCAyOSwgMTM0LCAxMiwgRVNfQVVUT0hTQ1JPTEwKCUNPTlRST0wgCQki1/fOqsGsvdOjqCZTo6kiICwgMjE0LCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YfFdTX1RBQlNUT1AsMywgNDUsIDcxLCAxMgoJREVGUFVTSEJVVFRPTgkiyLe2qCIgLCAxLCAxNTgsIDYsIDQ3LCAxNAoJUFVTSEJVVFRPTgkJIsihz/siICwgMiwgMTU4LCAyMywgNDcsIDE0CglQVVNIQlVUVE9OCQkisO/W+qOoJkijqSIgLCAyNTQsIDE1OCwgNDMsIDQ3LCAxNAp9Cg==