LyoKICogIE5vdGVwYWQgKEl0YWxpYW4gcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTcsOTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogKiAgUHJvb2ZyZWFkIDE5OTggYnkgRGF2aWQgTGVlIExhbWJlcnQgPGxhbWJlcjQ1QGVnci5tc3UuZWR1PgogKiAgQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqICBDb3B5cmlnaHQgMjAwMyBNYXJjZWxvIER1YXJ0ZQogKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBJdmFuIExlbyBQdW90aQogKiAgQ29weXJpZ2h0IDIwMDYgQW50b25pbyBDb2RhenppCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJub3RlcGFkX3Jlcy5oIgoKTEFOR1VBR0UgTEFOR19JVEFMSUFOLCBTVUJMQU5HX05FVVRSQUwKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImRmlsZSIgewogIE1FTlVJVEVNICImTnVvdm9cdEN0cmwrTiIsICAgICAgICAgICBDTURfTkVXCiAgTUVOVUlURU0gIiZBcHJpLi4uXHRDdHJsK08iLCAgICAgQ01EX09QRU4KICBNRU5VSVRFTSAiJlNhbHZhXHRDdHJsK1MiLCAgICAgQ01EX1NBVkUKICBNRU5VSVRFTSAiU2FsdmEgJmNvbiBub21lLi4uIiwgICAgICAgQ01EX1NBVkVfQVMKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlN0YW1wYS4uLlx0Q3RybCtQIiwgICAgICAgICAgICBDTURfUFJJTlQKICBNRU5VSVRFTSAiJkltcG9zdGEgcGFnaW5hLi4uIiwgICAgQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiJkNvbmZpZ3VyYXppb25lIHN0YW1wYW50ZS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIkUmc2NpIiwgICAgICAgICAgICAgQ01EX0VYSVQKIH0KUE9QVVAgIiZNb2RpZmljYSIgewogIE1FTlVJVEVNICImQW51bGxhXHRDdHJsK1oiLCAgICAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlRhZ2xpYVx0Q3RybCtYIiwgICAgICBDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpYVx0Q3RybCtDIiwgICAgIENNRF9DT1BZCiAgTUVOVUlURU0gIiZJbmNvbGxhXHRDdHJsK1YiLCAgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiJkVsaW1pbmFcdERlbCIsICAgICAgQ01EX0RFTEVURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJTZWxlemlvbmEgJnR1dHRvXHRDdHJsK0EiLCAgICAgICBDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImT3JhL0RhdGFcdEY1IiwgICAgQ01EX1RJTUVfREFURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQSBjYXBvIGF1dG9tYXRpY28iLCAgQ01EX1dSQVAKICBNRU5VSVRFTSAiJkltcG9zdGEgY2FyYXR0ZXJlLi4uIiwgICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZUcm92YSIgewogIE1FTlVJVEVNICImVHJvdmEuLi5cdEN0cmwrRiIsICAgQ01EX1NFQVJDSAogIE1FTlVJVEVNICImVHJvdmEgc3VjY2Vzc2l2b1x0RjMiLCAgQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICImQWl1dG8iIHsKICBNRU5VSVRFTSAiJkNvbnRlbnV0aSIsICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiJlRyb3ZhLi4uIiwgICAgICAgIENNRF9IRUxQX1NFQVJDSAogIE1FTlVJVEVNICImQWl1dG8gc3VsbGEgR3VpZGEiLCAgICAgQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW5mb3JtYXppb25pIHN1bCBCbG9jY28gTm90ZSIsIENNRF9IRUxQX0FCT1VUX05PVEVQQUQKIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJJbXBvc3RhIHBhZ2luYSIKewpMVEVYVCAgICAiJk5vdGUgYSBpbml6aW8gcGFnaW5hOiIsICAweDE0MCwgICAxMCwgMDQsIDQwLCAxOApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImTm90ZSBhIHBp6CBkaSBwYWdpbmE6IiwgIDB4MTQyLCAgIDEwLCAyMywgNDAsIDE4CkVESVRURVhUIElEQ19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICImTWFyZ2luaToiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZTaW5pc3RybzoiLCAgICAgICAgMHgxNDUsICAgMTQsIDU1LCAzNiwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfTEVGVFZBTFVFLCAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlN1cGVyaW9yZToiLCAgICAgICAgIDB4MTQ4LCAgICAxNCwgNzMsIDM2LCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRGVzdHJvOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkluZmVyaW9yZToiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJPSyIsICAgICAgICAgSURPSywgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkNhbmNlbGxhIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImQWl1dG8iLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgIiZmIgpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgICJQYWdlICZwIgoKU1RSSU5HX05PVEVQQUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NjbyBub3RlIgpTVFJJTkdfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJST1JFIgpTVFJJTkdfV0FSTklORywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRURU5aSU9ORSIKU1RSSU5HX0lORk8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZm8iCgpTVFJJTkdfVU5USVRMRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNlbnphIG5vbWUpIgoKU1RSSU5HX0FMTF9GSUxFUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1dHRpIGkgZmlsZSAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULCAgICAgICAgICAgICAgICAgICJGaWxlIGRpIHRlc3RvICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWwgZmlsZSAnJXMnIOggdHJvcHBvIGdyYW5kZSBwZXIgaWwgYmxvY2NvIG5vdGUuXG4gXApQZXIgZmF2b3JlIHVzYXJlIHVuIGFsdHJvIGVkaXRvci4iClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb24g6CBzdGF0byBpbnNlcml0byBhbGN1biB0ZXN0by4gXApcblBlciBmYXZvcmUgZGlnaXRhcmUgcXVhbGNvc2EgZSByaXByb3ZhcmUiClNUUklOR19ET0VTTk9URVhJU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbCBmaWxlICclcydcbm5vbiBlc2lzdGVcblxuIFwKQ3JlYXJlIHVuIG51b3ZvIGZpbGUgPyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsIGZpbGUgJyVzJ1xuZScgc3RhdG8gbW9kaWZpY2F0b1xuXG4gXApTYWx2YXJlIGxlIG1vZGlmaWNoZSA/IgpTVFJJTkdfTk9URk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIG5vbiDoIHN0YXRvIHRyb3ZhdG8uIgpTVFJJTkdfT1VUX09GX01FTU9SWSwgICAgICAgICAgICAgICAgICAgIk1lbW9yaWEgaW5zdWZmaWNpZW50ZSBwZXIgY29tcGxldGFyZSBxdWVzdGEgb3BlcmF6aW9uZSBcClxuQ2hpdWRlcmUgdW5hIG8gcGn5IGFwcGxpY2F6aW9uaSBwZXIgYXVtZW50YXJlIGxhIHF1YW50aXRhJ1xuIGRpIG1lbW9yaWEgbGliZXJhLiIKCn0K