LyoKICogQ29weXJpZ2h0IDIwMDYgQW5kcmFzIEtvdmFjcwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUCgpJRE1fTUFJTk1FTlUgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgogICAgUE9QVVAgIiZG4WpsIgogICAgQkVHSU4KICAgICAgICBNRU5VSVRFTSAiJtpqLi4uXHRDdHJsK04iLCAgICAgICAgICAgSURfRklMRV9ORVcKICAgICAgICBNRU5VSVRFTSAiJk1lZ255aXThcy4uLlx0Q3RybCtPIiwgSURfRklMRV9PUEVOCiAgICAgICAgTUVOVUlURU0gIk0mZW506XNcdEN0cmwrUyIsICAgICAgIElEX0ZJTEVfU0FWRQogICAgICAgIE1FTlVJVEVNICJNZW506XMgbeEmc2vpbnQuLi4iLCAgICAgICAgSURfRklMRV9TQVZFQVMKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiJlByaW50Li4uXHRDdHJsK1AiLCAgSURfUFJJTlQKICAgICAgICBNRU5VSVRFTSAiUHJpbnQgcHJldmllJncuLi4iLCAgSURfUFJFVklFVwogICAgICAgIE1FTlVJVEVNICJQYWdlIHNldHVwLi4uIiwgICAgICBJRF9QUklOVFNFVFVQCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIiZLaWzpcOlzIiwgICAgICBJRF9GSUxFX0VYSVQKICAgIEVORAogICAgUE9QVVAgIlN6JmVya2VzenTpcyIKICAgIEJFR0lOCiAgICAgICAgTUVOVUlURU0gIiZWaXNzemF2b27hc1x0Q3RybCtaIiwgICAgICAgIElEX0VESVRfVU5ETwogICAgICAgIE1FTlVJVEVNICImRWz1cmVcdEN0cmwrWSIsICAgICAgICAgICAgICBJRF9FRElUX1JFRE8KICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiS2l2JuFn4XNcdEN0cmwrWCIsICAgICAgICAgICAgSURfRURJVF9DVVQKICAgICAgICBNRU5VSVRFTSAiTeEmc29s4XNcdEN0cmwrQyIsICAgICAgICAgICAgSURfRURJVF9DT1BZCiAgICAgICAgTUVOVUlURU0gIiZCZWlsbGVzenTpc1x0Q3RybCtWIiwgICAgICAgIElEX0VESVRfUEFTVEUKICAgICAgICBNRU5VSVRFTSAiVPZyJmzpc1x0RGVsIiwgICAgICAgICAgICAgICAgSURfRURJVF9DTEVBUgogICAgICAgIE1FTlVJVEVNICJNJmluZGV0IGtpamVs9mxpXHRDdHJsK0EiLCAgICBJRF9FRElUX1NFTEVDVEFMTAogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImRmluZC4uLlx0Q3J0bCtGIiwgICAgICAgICBJRF9GSU5ECiAgICAgICAgTUVOVUlURU0gIkZpbmQgJm5leHRcdEYzIiwgICAgICAgICAgICAgIElEX0ZJTkRfTkVYVAogICAgICAgIE1FTlVJVEVNICImUmVwbGFjZS4uLlx0Q3RybCtIIiwgICAgICBJRF9SRVBMQUNFCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIkNzYWsgJm9sdmFzaGF08yIsICAgICAgICAgICAgIElEX0VESVRfUkVBRE9OTFkKICAgICAgICBNRU5VSVRFTSAiTfMmZG9z7XR2YSIsICAgICAgICAgICAgICAgICAgSURfRURJVF9NT0RJRklFRAogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIFBPUFVQICImRXh0cuFrIgogICAgICAgIEJFR0lOCiAgICAgICAgICAgIE1FTlVJVEVNICJLaWplbPZs6XMgJmluZm9ybeFjafMiLCAgICAgICBJRF9FRElUX1NFTEVDVElPTklORk8KICAgICAgICAgICAgTUVOVUlURU0gIkthcmFrdGVyJmZvcm3hdHVtIiwgICAgICAgICAgIElEX0VESVRfQ0hBUkZPUk1BVAogICAgICAgICAgICBNRU5VSVRFTSAiQSZsYXBydGVsbWV6ZXR0IGthcmFrdGVyIGZvcm3hdHVtIiwgICAgICAgICAgIElEX0VESVRfREVGQ0hBUkZPUk1BVAogICAgICAgICAgICBNRU5VSVRFTSAiJkJla2V6ZOlzIGZvcm3hdHVtIiwgICAgICAgICAgSURfRURJVF9QQVJBRk9STUFUCiAgICAgICAgICAgIE1FTlVJVEVNICJTeib2dmVnc3plcnrpcyIsICAgICAgICAgICAgICBJRF9FRElUX0dFVFRFWFQKICAgICAgICBFTkQKICAgIEVORAogICAgUE9QVVAgIiZWaWV3IgogICAgQkVHSU4KICAgICAgICBNRU5VSVRFTSAiJlRvb2xiYXIiLCAgICAgICAgSURfVE9HR0xFX1RPT0xCQVIKICAgICAgICBNRU5VSVRFTSAiJkZvcm1hdGJhciIsICAgICAgSURfVE9HR0xFX0ZPUk1BVEJBUgogICAgICAgIE1FTlVJVEVNICImUnVsZXIiLCAgICAgICAgICBJRF9UT0dHTEVfUlVMRVIKICAgICAgICBNRU5VSVRFTSAiJlN0YXR1c2JhciIsICAgICAgSURfVE9HR0xFX1NUQVRVU0JBUgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImT3B0aW9ucy4uLiIsICBJRF9WSUVXUFJPUEVSVElFUwogICAgRU5ECiAgICBQT1BVUCAiJkluc2VydCIKICAgIEJFR0lOCiAgICAgICAgTUVOVUlURU0gIiZEYXRlIGFuZCB0aW1lLi4uIiwgIElEX0RBVEVUSU1FCiAgICBFTkQKICAgIFBPUFVQICJGJm9ybeF0dW0iCiAgICBCRUdJTgogICAgICAgIE1FTlVJVEVNICImRm9udC4uLiIsICAgICAgICAgICAgICAgICAgSURfRk9OVFNFVFRJTkdTCiAgICAgICAgTUVOVUlURU0gIiZCdWxsZXQgcG9pbnRzIiAgICAgICAgICAgICAgICBJRF9CVUxMRVQKICAgICAgICBNRU5VSVRFTSAiJlBhcmFncmFwaC4uLiIgICAgICAgICAgICAgIElEX1BBUkFGT1JNQVQKICAgICAgICBNRU5VSVRFTSAiJlRhYnMuLi4iICAgICAgICAgICAgICAgICAgIElEX1RBQlNUT1BTCiAgICAgICAgUE9QVVAgIiZI4XR06XIiCiAgICAgICAgQkVHSU4KICAgICAgICAgICAgTUVOVUlURU0gIiZSZW5kc3plclx0Q3RybCsxIiwgICAgICAgICBJRF9CQUNLXzEKICAgICAgICAgICAgTUVOVUlURU0gIiZT4XJn4WJhbiBr6XJlbVx0Q3RybCsyIiwgIElEX0JBQ0tfMgogICAgICAgIEVORAogICAgRU5ECiAgICBQT1BVUCAiJkhlbHAiCiAgICBCRUdJTgogICAgICAgIE1FTlVJVEVNICImQWJvdXQgV2luZSBXb3JkcGFkIiAgICAgICBJRF9BQk9VVAogICAgRU5ECkVORAoKSURNX1BPUFVQIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KICAgIFBPUFVQICIiCiAgICBCRUdJTgogICAgICAgIE1FTlVJVEVNICJLaXYm4Wfhc1x0Q3RybCtYIiwgICAgIElEX0VESVRfQ1VUCiAgICAgICAgTUVOVUlURU0gIk3hJnNvbOFzXHRDdHJsK0MiLCAgICAgSURfRURJVF9DT1BZCiAgICAgICAgTUVOVUlURU0gIiZCZWlsbGVzenTpc1x0Q3RybCtWIiwgSURfRURJVF9QQVNURQogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImQnVsbGV0IHBvaW50cyIgICAgICAgIElEX0JVTExFVAogICAgICAgIE1FTlVJVEVNICImUGFyYWdyYXBoLi4uIiAgICAgIElEX1BBUkFGT1JNQVQKICAgIEVORApFTkQKCklERF9EQVRFVElNRSBESUFMT0cgRElTQ0FSREFCTEUgMzAsIDIwLCAxMzAsIDgwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJEYXRlIGFuZCB0aW1lIgpGT05UIDEwLCAiTVMgU2FucyBTZXJpZiIKQkVHSU4KICAgIExURVhUICAgICAgICAiQXZhaWxhYmxlIGZvcm1hdHMiLDAsMywyLDEwMCwxNQogICAgTElTVEJPWCAgICAgIElEQ19EQVRFVElNRSwzLDEyLDgwLDY1LExCU19OT0lOVEVHUkFMSEVJR0hUCiAgICBQVVNIQlVUVE9OICAgIiZPSyIsSURPSyw4NywxMiw0MCwxMgogICAgUFVTSEJVVFRPTiAgICImQ2FuY2VsIixJRENBTkNFTCw4NywyNiw0MCwxMgpFTkQKCklERF9ORVdGSUxFIERJQUxPRyBESVNDQVJEQUJMRSAzMCwgMjAsIDE0MCwgODAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIk5ldyIKRk9OVCAxMCwgIk1TIFNhbnMgU2VyaWYiCkJFR0lOCiAgICBMVEVYVCAgICAgICAgIk5ldyBkb2N1bWVudCB0eXBlIiwwLDMsMiwxMDAsMTUKICAgIExJU1RCT1ggICAgICBJRENfTkVXRklMRSwzLDEyLDkwLDY1LExCU19OT0lOVEVHUkFMSEVJR0hUCiAgICBQVVNIQlVUVE9OICAgIiZPSyIsSURPSyw5NywxMiw0MCwxMgogICAgUFVTSEJVVFRPTiAgICImQ2FuY2VsIixJRENBTkNFTCw5NywyNiw0MCwxMgpFTkQKCklERF9QQVJBRk9STUFUIERJQUxPRyBESVNDQVJEQUJMRSAzMCwgMjAsIDIwMCwgMTEwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDYXB0aW9uICJQYXJhZ3JhcGggZm9ybWF0IgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBHUk9VUEJPWCAiSW5kZW50YXRpb24iLCAwLCAxMCwgMTAsIDEyMCwgNjgKICAgIExURVhUICJMZWZ0IiwgMCwgMTUsIDIyLCA0MCwgMTMKICAgIEVESVRURVhUIElEQ19QQVJBX0xFRlQsIDU1LCAyMCwgNjAsIDEzCiAgICBMVEVYVCAiUmlnaHQiLCAwLCAxNSwgNDAsIDQwLCAxMwogICAgRURJVFRFWFQgSURDX1BBUkFfUklHSFQsIDU1LCAzOCwgNjAsIDEzCiAgICBMVEVYVCAiRmlyc3QgbGluZSIsIDAsIDE1LCA1OCwgNDAsIDEzCiAgICBFRElUVEVYVCBJRENfUEFSQV9GSVJTVCwgNTUsIDU2LCA2MCwgMTMKICAgIExURVhUICJBbGlnbm1lbnQiLCAwLCAxNSwgODcsIDQwLCAxMwogICAgQ09NQk9CT1ggSURDX1BBUkFfQUxJR04sIDU1LCA4NSwgNjAsIDYwLCBDQlNfRFJPUERPV05MSVNUCiAgICBQVVNIQlVUVE9OICImT0siLCBJRE9LLCAxMzcsIDE1LCA1MCwgMTUKICAgIFBVU0hCVVRUT04gIiZDYW5jZWwiLCBJRENBTkNFTCwgMTM3LCAzMywgNTAsIDE1CkVORAoKSUREX1RBQlNUT1BTIERJQUxPRyBESVNDQVJEQUJMRSAzMCwgMjAsIDIwMCwgMTEwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDYXB0aW9uICJUYWJzIgpGT05UIDgsICJNUyBTSGVsbCBETGciCkJFR0lOCiAgICBHUk9VUEJPWCAiVGFiIHN0b3BzIiwgMCwgMTAsIDEwLCAxMjAsIDkwCiAgICBDT01CT0JPWCBJRENfVEFCU1RPUFMsIDIwLCAyMCwgMTAwLCA2MCwgQ0JTX1NJTVBMRSB8IENCU19TT1JUCiAgICBERUZQVVNIQlVUVE9OICImQWRkIiwgSURfVEFCX0FERCwgMjAsIDgwLCA0NSwgMTUKICAgIFBVU0hCVVRUT04gIiZSZW1vdmUiLCBJRF9UQUJfREVMLCA3MiwgODAsIDQ1LCAxNQogICAgUFVTSEJVVFRPTiAiJk9LIiwgSURPSywgMTM3LCAxNSwgNTAsIDE1CiAgICBQVVNIQlVUVE9OICImQ2FuY2VsIiwgSURDQU5DRUwsIDEzNywgMzMsIDUwLCAxNQogICAgUFVTSEJVVFRPTiAiUmVtb3ZlIGFsJmwiLCBJRF9UQUJfRU1QVFksIDEzNywgNTEsIDUwLCAxNQpFTkQKCklERF9GT1JNQVRPUFRTIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyODAsIDExMApTVFlMRSBEU19TWVNNT0RBTApDYXB0aW9uICIiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIEdST1VQQk9YICJMaW5lIHdyYXBwaW5nIiwgMCwgMTAsIDEwLCAxMzAsIDg1CiAgICBSQURJT0JVVFRPTiAiTm8gbGluZSB3cmFwcGluZyIsIElEQ19QQUdFRk1UX1dOLCAxOCwgMjUsIDExNywgMTUKICAgIFJBRElPQlVUVE9OICJXcmFwIHRleHQgYnkgdGhlICZ3aW5kb3cgYm9yZGVyIiwgSURDX1BBR0VGTVRfV1csIDE4LCA0NSwgMTE3LCAxNQogICAgUkFESU9CVVRUT04gIldyYXAgdGV4dCBieSB0aGUgJm1hcmdpbiIsIElEQ19QQUdFRk1UX1dNLCAxOCwgNjUsIDExNywgMTUKICAgIEdST1VQQk9YICJUb29sYmFycyIsIDAsIDE1MCwgMTAsIDEyMCwgODUKICAgIENIRUNLQk9YICImVG9vbGJhciIsIElEQ19QQUdFRk1UX1RCLCAxNjAsIDIwLCA4MCwgMTUKICAgIENIRUNLQk9YICImRm9ybWF0YmFyIiwgSURDX1BBR0VGTVRfRkIsIDE2MCwgMzgsIDgwLCAxNQogICAgQ0hFQ0tCT1ggIiZSdWxlciIsIElEQ19QQUdFRk1UX1JVLCAxNjAsIDU2LCA4MCwgMTUKICAgIENIRUNLQk9YICImU3RhdHVzYmFyIiwgSURDX1BBR0VGTVRfU0IsIDE2MCwgNzQsIDgwLCAxNQogICAgTFRFWFQgIiIsIElEQ19QQUdFRk1UX0lELCAwLDAsMCwwCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKQkVHSU4KICAgIFNUUklOR19SSUNIVEVYVF9GSUxFU19SVEYsICAgICAiUmljaCB0ZXh0IGZvcm1hdCAoKi5ydGYpIgogICAgU1RSSU5HX1RFWFRfRklMRVNfVFhULCAgICAgICAgICJUZXh0IGRvY3VtZW50cyAoKi50eHQpIgogICAgU1RSSU5HX1RFWFRfRklMRVNfVU5JQ09ERV9UWFQsICJVbmljb2RlIHRleHQgZG9jdW1lbnQgKCoudHh0KSIKICAgIFNUUklOR19BTExfRklMRVMsICAgICAgICAgICAgICAiQWxsIGRvY3VtZW50cyAoKi4qKSIKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQpCRUdJTgogICAgU1RSSU5HX0FMSUdOX0xFRlQsICAgICAgICAgICAgIkxlZnQiCiAgICBTVFJJTkdfQUxJR05fUklHSFQsICAgICAgICAgICAiUmlnaHQiCiAgICBTVFJJTkdfQUxJR05fQ0VOVEVSLCAgICAgICAgICAiQ2VudGVyIgpFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCkJFR0lOCiAgICBTVFJJTkdfTkVXRklMRV9SSUNIVEVYVCwgICAgICJSaWNoIHRleHQgZG9jdW1lbnQiCiAgICBTVFJJTkdfTkVXRklMRV9UWFQsICAgICAgICAgICJUZXh0IGRvY3VtZW50IgogICAgU1RSSU5HX05FV0ZJTEVfVFhUX1VOSUNPREUsICAiVW5pY29kZSB0ZXh0IGRvY3VtZW50IgpFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCkJFR0lOCiAgICBTVFJJTkdfUFJJTlRFUl9GSUxFU19QUk4sICAgICAgICAiUHJpbnRlciBmaWxlcyAoKi5QUk4pIgpFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCkJFR0lOCiAgICBTVFJJTkdfVklFV1BST1BTX1RJVExFLCAgICAgICAgICAiT3B0aW9ucyIKICAgIFNUUklOR19WSUVXUFJPUFNfVEVYVCwgICAgICAgICAgICJUZXh0IgogICAgU1RSSU5HX1ZJRVdQUk9QU19SSUNIVEVYVCwgICAgICAgIlJpY2ggdGV4dCIKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQpCRUdJTgogICAgU1RSSU5HX1BSRVZJRVdfUFJJTlQsICAgICAgICAgICAgIlByaW50IgogICAgU1RSSU5HX1BSRVZJRVdfTkVYVFBBR0UsICAgICAgICAgIk5leHQgcGFnZSIKICAgIFNUUklOR19QUkVWSUVXX1BSRVZQQUdFLCAgICAgICAgICJQcmV2aW91cyBwYWdlIgogICAgU1RSSU5HX1BSRVZJRVdfVFdPUEFHRVMsICAgICAgICAgIlR3byBwYWdlcyIKICAgIFNUUklOR19QUkVWSUVXX09ORVBBR0UsICAgICAgICAgICJPbmUgcGFnZSIKICAgIFNUUklOR19QUkVWSUVXX0NMT1NFLCAgICAgICAgICAgICJDbG9zZSIKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQpCRUdJTgogICAgU1RSSU5HX1VOSVRTX0NNLCAgICAgICAgICAgICAiY20iCkVORAo=