LyoKICogVW5pbnN0YWxsZXIgKEJ1bGdhcmlhbiBSZXNvdXJjZXMpCiAqCiAqIENvcHlyaWdodCAyMDA1IE1pbGtvIEtyYWNob3Vub3YKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19CVUxHQVJJQU4sIFNVQkxBTkdfREVGQVVMVAoKSUREX1VOSU5TVEFMTEVSIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMzMwLCAxNjAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIsTl6O3x8uDr4PLu8CDt4CDv8Ojr7ubl7ej/IO3gIFdpbmUiCkZPTlQgMTAsICJNUyBTYW5zIFNlcmlmIgpCRUdJTgogICAgTFRFWFQgICAgICAgICAgICLI5+Hl8OXy5Swg6u7lIO/w6Ovu5uXt6OUg5uXr4OXy5SDk4CDk4CDk5ejt8fLg6+jw4PLlOiIsSURDX1BMRUFTRVNFTEVDVCwxMCwxMCwyNTAsMTQKICAgIEVESVRURVhUICAgICAgICBJRENfRklMVEVSLDEwLDI1LDI1MCwxNCxFU19BVVRPSFNDUk9MTAogICAgTElTVEJPWCAgICAgICAgIElEQ19MSVNULDEwLDQzLDI1MCwxMDYsTEJTX05PSU5URUdSQUxIRUlHSFQgfCAKICAgICAgICAgICAgICAgICAgICBMQlNfRVhURU5ERURTRUwgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAogICAgUFVTSEJVVFRPTiAgICAgICImxOXo7fHy4Ovo8ODpIixJRENfVU5JTlNUQUxMLDI3MCw0OCw1MCwxNAogICAgUFVTSEJVVFRPTiAgICAgICImzvLt7vHt7iIsSURDX0FCT1VULDI3MCw2NSw1MCwxNAogICAgUFVTSEJVVFRPTiAgICAgICImyOf17uQiLElEQ19FWElULDI3MCw4MSw1MCwxNApFTkQKCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSB7CiAgICAgSURTX0FQUE5BTUUsICJXaW5lIEFwcGxpY2F0aW9uIFVuaW5zdGFsbGVyIgogICAgIElEU19BQk9VVCwgIldpbmUgQXBwbGljYXRpb24gVW5pbnN0YWxsZXIgKEMpIDIwMDUgYnkgQW5kcmVhcyBNb2hyLCBIYW5udSBWYWx0b25lbiBhbmQgSm9uYXRoYW4gRXJuc3QuIgogICAgIElEU19BQk9VVFRJVExFLCAizvLt7vHt7iDk5ejt8fLg6+Dy7vDgIgogICAgIElEU19SRUdJU1RSWUtFWU5PVEFWQUlMQUJMRSwgIsrr/vfu4uXy5SDn4CDk5ejt8fLg6+jw4O3lIOvo7/Hi4PIgKOLx5SDu+eUpIOIg8ejx8uXs7ej/IPDl4+jx8vrwLCDt/+zgIOrg6uLuIOTgIO/w4OL/ISIKICAgICBJRFNfVU5JTlNUQUxMRkFJTEVELCAiyOfv+uvt5e3o5fLuIO3gIOru7ODt5ODy4CDn4CDk5ejt8fLg6+jw4O3lICclcycg7eXz8e/l+O3uLCDs7ublIOHoIOfg8ODk6CDr6O/x4uD5IOjn7/rr7ejsIPTg6esuXHJcbsjx6uDy5SDr6CDk4CDv8OXs4PXt5fLlIOfg7+jx4CDn4CDk5ejt8fLg6+jw4O3lIO7yIPHo8fLl7O3o/yDw5ePo8fL68D8iCn0K