LyoKICogd2luZWNvbnNvbGUgKER1dGNoIHJlc291cmNlcykKICogCiAqIENvcHlyaWdodCAyMDAzIEhhbnMgTGVpZGVra2VyCiAqIENvcHlyaWdodCAyMDA4IEZyYW5zIEtvb2wKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgIndpbmVjb25zb2xlX3Jlcy5oIgoKTEFOR1VBR0UgTEFOR19EVVRDSCwgU1VCTEFOR19ORVVUUkFMCgpTVFJJTkdUQUJMRQpCRUdJTgpJRFNfRURJVCwJCSImQmV3ZXJrZW4iCklEU19ERUZBVUxULAkJIiZTdGFuZGFhcmRpbnN0ZWxsaW5nZW4iCklEU19QUk9QRVJUSUVTLAkJIiZFaWdlbnNjaGFwcGVuIgpJRFNfTUFSSywJCSImTWFya2VyZW4iCklEU19DT1BZLAkJIiZLb3Bp63JlbiIKSURTX1BBU1RFLAkJIiZQbGFra2VuIgpJRFNfU0VMRUNUQUxMLAkJIiZBbGxlcyBzZWxlY3RlcmVuIgpJRFNfU0NST0xMLAkJIlNjJnJvbGxlbiIKSURTX1NFQVJDSCwJCSImWm9la2VuIgpJRFNfRk5UX0RJU1BMQVksCSJFbGsga2FyYWt0ZXIgaXMgJWxkIHBpeGVscyBicmVlZCBlbiAlbGQgcGl4ZWxzIGhvb2ciCklEU19GTlRfUFJFVklFVywJIkRpdCBpcyBlZW4gdGVzdCIKSURTX0RMR19USVRfREVGQVVMVCwgICAgIkNvbmZpZ3VyYXRpZSAtIHN0YW5kYWFyZCBpbnN0ZWxsbGluZ2VuIgpJRFNfRExHX1RJVF9DVVJSRU5ULCAgICAiQ29uZmlndXJhdGllIC0gaHVpZGlnZSBpbnN0ZWxsaW5nZW4iCklEU19ETEdfVElUX0VSUk9SLAkiQ29uZmlndXJhdGllZm91dCIKSURTX0RMR19FUlJfU0JXSU5TSVpFLAkiRGUgc2NoZXJtYnVmZmVyIG1vZXQgZ3JvdGVyIGRhbiBvZiBnZWxpamsgemlqbiBhYW4gZGUgdmVuc3RlcmJ1ZmZlciIKCklEU19DTURfSU5WQUxJRF9FVkVOVF9JRCAgICJ3aW5lY29uc29sZTogRm91dCBpbiB2ZXJ3ZXJrZW4gZ2ViZXVydGVuaXMgaWRcbiIKSURTX0NNRF9JTlZBTElEX0JBQ0tFTkQgICAgIndpbmVjb25zb2xlOiBPbmp1aXN0ZSBiYWNrZW5kXG4iCklEU19DTURfSU5WQUxJRF9PUFRJT04gICAgICJ3aW5lY29uc29sZTogTmlldCBoZXJrZW5kZSBvcGRyYWNodHJlZ2VsIG9wdGllXG4iCklEU19DTURfQUJPVVQgICAgICAgICAgICAgICJEaXQgc3RhcnQgZWVuIHByb2dyYW1tYSBpbiBlZW4gV2luZSBjb25zb2xlLW9tZ2V2aW5nXG4iCklEU19DTURfTEFVTkNIX0ZBSUxFRCAgICAgICJ3aW5lY29uc29sZTogU3RhcnRlbiB2YW4gcHJvZ3JhbW1hICVzIG1pc2x1a3QuXG4iXAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV0IGNvbW1hbmRvIGlzIG9uanVpc3QuXG4iCgpJRFNfVVNBR0VfSEVBREVSICAgICAgICAgICAiXG5HZWJydWlrOlxuICB3aW5lY29uc29sZSBbb3B0aWVzXSA8Y29tbWFuZG8+XG5cbk9wdGllczpcbiIKSURTX1VTQUdFX0JBQ0tFTkQgICAgICAgICAgIiAgLS1iYWNrZW5kPXt1c2VyfGN1cnNlc30gIEtpZXplbiB2b29yIHVzZXIgemFsIGVlbiBuaWV1dyB3aW5kb3cgZG9lbiB2ZXJzY2hpam5lbixcbiJcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzIHphbCBwcm9iZXJlbiBkZSBodWlkaWdlIHRlcm1pbmFsIG9tIHRlIHpldHRlblxuIlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBlZW4gV2luZSBjb25zb2xlXG4iCklEU19VU0FHRV9DT01NQU5EICAgICAgICAgICIgIDxjb21tYW5kbz4gICAgICAgICAgICAgICAgSGV0IFdpbmUgcHJvZ3JhbW1hIGRhdCB6YWwgc3RhcnRlbiBpbiBkZSBXaW5lIGNvbnNvbGVcbiIKSURTX1VTQUdFX0ZPT1RFUiAgICAgICAgICAgIlxuVm9vcmJlZWxkOlxuICB3aW5lY29uc29sZSBjbWRcblN0YXJ0IGRlIFdpbmUgY29tbWFuZCBwcm9tcHQgaW4gZWVuIFdpbmUgY29uc29sZVxuXG4iCgpFTkQKCklERF9PUFRJT04gRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAxNDAsIDEwNQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIgT3B0aWVzICIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CglHUk9VUEJPWCAiQ3Vyc29yZ3Jvb3R0ZSIsIC0xLCAxMCwgMTEsIDYwLCA0NCwgQlNfR1JPVVBCT1gKCUFVVE9SQURJT0JVVFRPTiAiJktsZWluIiwgSURDX09QVF9DVVJTT1JfU01BTEwsIDE0LCAyMywgNDQsIDEwLCBXU19UQUJTVE9QCglBVVRPUkFESU9CVVRUT04gIiZNaWRkZWwiLCBJRENfT1BUX0NVUlNPUl9NRURJVU0sIDE0LCAzMywgNDQsIDEwLCBXU19UQUJTVE9QCglBVVRPUkFESU9CVVRUT04gIiZHcm9vdCIsIElEQ19PUFRfQ1VSU09SX0xBUkdFLCAxNCwgNDMsIDQ0LCAxMCwgV1NfVEFCU1RPUAoKCUdST1VQQk9YICJDb250cm9sZSIsIC0xLCA3NSwgMTEsIDEyNSwgNDQsIEJTX0dST1VQQk9YCglMVEVYVCAiUG9wdXAgbWVudSIsIC0xLCA3OSwgMjMsIDQwLCAxMAoJQVVUT0NIRUNLQk9YICImQ29udHJvbCIsIElEQ19PUFRfQ09ORl9DVFJMLCAxMjksIDIzLCA2MCwgMTAsIFdTX1RBQlNUT1AKCUFVVE9DSEVDS0JPWCAiUyZoaWZ0IiwgSURDX09QVF9DT05GX1NISUZULCAxMjksIDMzLCA2MCwgMTAsIFdTX1RBQlNUT1AKCUxURVhUICJTbmVsIGJld2Vya2VuIiwgLTEsIDc5LCA0MywgNTAsIDEwCglBVVRPQ0hFQ0tCT1ggIiZhYW4iLCBJRENfT1BUX1FVSUNLX0VESVQsIDEyOSwgNDMsIDYwLCAxMCwgV1NfVEFCU1RPUAoKCUdST1VQQk9YICJHZXNjaGllZGVuaXMiLCAtMSwgMTAsIDU3LCAxOTAsIDM1LCBCU19HUk9VUEJPWAoJTFRFWFQgIiZBYW50YWwgdGUgYmV3YXJlbiBvcGRyYWNodGVuIDoiLCAtMSwgMTQsIDY3LCA3OCwgMTgKCUVESVRURVhUIElEQ19PUFRfSElTVF9TSVpFLCA5MiwgNjksIDMxLCAxMiwgV1NfVEFCU1RPUHxXU19CT1JERVJ8RVNfTlVNQkVSCglDT05UUk9MICIiLCBJRENfT1BUX0hJU1RfU0laRV9VRCwgIm1zY3Rsc191cGRvd24zMiIsIFVEU19TRVRCVUREWUlOVHxVRFNfQUxJR05SSUdIVHxVRFNfQVVUT0JVRERZfFVEU19BUlJPV0tFWVN8VURTX05PVEhPVVNBTkRTLCAwLCAwLCAwLCAwCglBVVRPQ0hFQ0tCT1ggIiZWZXJ3aWpkZXIgZHViYmVsZW4iLCBJRENfT1BUX0hJU1RfTk9ET1VCTEUsIDEzMCwgNjcsIDUwLCAxOCwgV1NfVEFCU1RPUHxCU19NVUxUSUxJTkUKfQoKSUREX0ZPTlQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAxNDAsIDEwNQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIgTGV0dGVydHlwZSAiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJTFRFWFQgIiZMZXR0ZXJ0eXBlIiwgLTEsIDUsIDUsIDI0LCA4CglMSVNUQk9YIElEQ19GTlRfTElTVF9GT05ULCA1LCAxOCwgOTAsIDQyLCBMQlNfU09SVHxXU19WU0NST0xMCglMVEVYVCAiJktsZXVyIiwgLTEsIDEwMCwgNSwgNTAsIDgKCUNPTlRST0wgIiIsIElEQ19GTlRfQ09MT1JfRkcsICJXaW5lQ29uQ29sb3JQcmV2aWV3IiwgMEwsIDEwMCwgMTgsIDQ4LCAxNgoJQ09OVFJPTCAiIiwgSURDX0ZOVF9DT0xPUl9CSywgIldpbmVDb25Db2xvclByZXZpZXciLCAwTCwgMTAwLCA0MCwgNDgsIDE2CglMVEVYVCAiJkdyb290dGUiLCAtMSwgMTU4LCA1LCA0MCwgOAoJTElTVEJPWCBJRENfRk5UX0xJU1RfU0laRSwgMTU4LCAxOCwgNDAsIDYwLCBXU19WU0NST0xMCglDT05UUk9MICIiLCBJRENfRk5UX1BSRVZJRVcsICJXaW5lQ29uRm9udFByZXZpZXciLCAwTCwgNSwgNjAsIDEwOSwgNDAKCUxURVhUICIiLCBJRENfRk5UX0ZPTlRfSU5GTywgMTI4LCA3NiwgODAsIDE4Cn0KCklERF9DT05GSUcgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAxNDAsIDEwNQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIgQ29uZmlndXJhdGllICIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CglHUk9VUEJPWCAiQnVmZmVyem9uZSIsIC0xLCAxMCwgMTEsIDEwMCwgNDIsIEJTX0dST1VQQk9YCglMVEVYVCAiJkJyZWVkdGUgOiIsIC0xLCAxNCwgMjUsIDU0LCA5CglFRElUVEVYVCBJRENfQ05GX1NCX1dJRFRILCA2OCwgMjMsIDM2LCAxMiwgV1NfVEFCU1RPUHxXU19CT1JERVJ8RVNfTlVNQkVSCglDT05UUk9MICIiLCBJRENfQ05GX1NCX1dJRFRIX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKCUxURVhUICImSG9vZ3RlIDoiLCAtMSwgMTQsIDM5LCA1NCwgOQoJRURJVFRFWFQgSURDX0NORl9TQl9IRUlHSFQsIDY4LCAzNywgMzYsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKCUNPTlRST0wgIiIsIElEQ19DTkZfU0JfSEVJR0hUX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKCglHUk9VUEJPWCAiVmVuc3Rlcmdyb290dGUiLCAtMSwgMTAsIDU1LCAxMDAsIDQyCglMVEVYVCAiQiZyZWVkdGUgOiIsIC0xLCAxNCwgNjksIDU0LCA5CglFRElUVEVYVCBJRENfQ05GX1dJTl9XSURUSCwgNjgsIDY3LCAzNiwgMTIsIFdTX1RBQlNUT1B8V1NfQk9SREVSfEVTX05VTUJFUgoJQ09OVFJPTCAiIiwgSURDX0NORl9XSU5fV0lEVEhfVUQsICJtc2N0bHNfdXBkb3duMzIiLCBVRFNfU0VUQlVERFlJTlR8VURTX0FMSUdOUklHSFR8VURTX0FVVE9CVUREWXxVRFNfQVJST1dLRVlTfFVEU19OT1RIT1VTQU5EUywgMCwgMCwgMCwgMAoJTFRFWFQgIkgmb29ndGUgOiIsIC0xLCAxNCwgODMsIDU0LCA5CglFRElUVEVYVCBJRENfQ05GX1dJTl9IRUlHSFQsIDY4LCA4MSwgMzYsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKCUNPTlRST0wgIiIsIElEQ19DTkZfV0lOX0hFSUdIVF9VRCwgIm1zY3Rsc191cGRvd24zMiIsIFVEU19TRVRCVUREWUlOVHxVRFNfQUxJR05SSUdIVHxVRFNfQVVUT0JVRERZfFVEU19BUlJPV0tFWVN8VURTX05PVEhPVVNBTkRTLCAwLCAwLCAwLCAwCgoJR1JPVVBCT1ggIlByb2dyYW1tYSBpcyBiZetpbmRpZ2QiLCAtMSwgMTE1LCAxMSwgODAsIDQyLCBCU19HUk9VUEJPWAoJQVVUT0NIRUNLQk9YICImQ29uc29sZSBhZnNsdWl0ZW4iLCBJRENfQ05GX0NMT1NFX0VYSVQsIDExOSwgMjUsIDc1LCAyMCwgV1NfVEFCU1RPUAoKCUdST1VQQk9YICJWZXJzaWUiLCAtMSwgMTE1LCA1NSwgODAsIDQyCglDT01CT0JPWCBJRENfQ05GX0VESVRJT05fTU9ERSwgMTE5LCA2OSwgNzUsIDIwLCBDQlNfRFJPUERPV05MSVNUfFdTX1ZTQ1JPTEx8V1NfVEFCU1RPUAp9CgpJRERfU0FWRV9TRVRUSU5HUyBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAyMCwgMjAsIDE0MCwgNjAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTgpDQVBUSU9OICJDb25zb2xlIHBhcmFtZXRlcnMiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJR1JPVVBCT1ggIiIsIC0xLCAxMCwgMTAsIDEyMCwgMzEsIEJTX0dST1VQQk9YCglBVVRPUkFESU9CVVRUT04gIkJld2FhciBkZXplIGluc3RlbGxpbmdlbiB2b29yIGxhdGVyZSBzZXNzaWVzIiwgSURDX1NBVl9TQVZFLCAxNCwgMTUsIDExMCwgMTAsIFdTX1RBQlNUT1AKCUFVVE9SQURJT0JVVFRPTiAiV2lqemlnIGFsbGVlbiBkZSBodWlkaWdlIHNlc3NpZSIsIElEQ19TQVZfU0VTU0lPTiwgMTQsIDI3LCAxMTAsIDEwLCBXU19UQUJTVE9QCgoJUFVTSEJVVFRPTiAiT0siLCBJRE9LLCAyMCwgNDUsIDM1LCAxMgoJUFVTSEJVVFRPTiAiQW5udWxlcmVuIiwgSURDQU5DRUwsIDY1LCA0NSwgMzUsIDEyCn0K