LyoKICogIE5vdGVwYWQgKFN3ZWRpc2ggcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTcsOTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogKiAgUHJvb2ZyZWFkIDE5OTggYnkgRGF2aWQgTGVlIExhbWJlcnQgPGxhbWJlcjQ1QGVnci5tc3UuZWR1PgogKiAgQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCk1BSU5fTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ORVVUUkFMCnsKIFBPUFVQICImQXJraXYiIHsKICBNRU5VSVRFTSAiJk55Li4uIiwgMHgxMDAKICBNRU5VSVRFTSAi1iZwcG5hIiwgMHgxMDEKICBNRU5VSVRFTSAiJlNwYXJhIiwgMHgxMDIKICBNRU5VSVRFTSAiU3BhcmEgJnNvbS4uLiIsIDB4MTAzCiAgTUVOVUlURU0gIiZTa3JpdiB1dCIsIDB4MTA0CiAgTUVOVUlURU0gIlNpZCBMYSZ5b3V0Li4uIiwgMHgxMDUKICBNRU5VSVRFTSAiU2tyaXZhciAmaW5zdORsbG5pbmdhci4uLiIsIDB4MTA2CiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBdnNsdXRhIiwgMHgxMDgKIH0KUE9QVVAgIiZSZWRpZ2VyYSIgewogIE1FTlVJVEVNICImVW5kb1x0Q3RybCtaIiwgMHgxMTAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiS2xpcHBhXHRDdHJsK1giLCAweDExMQogIE1FTlVJVEVNICImS29waWVyYVx0Q3RybCtDIiwgMHgxMTIKICBNRU5VSVRFTSAiJktsaXN0cmEgaW5cdEN0cmwrViIsIDB4MTEzCiAgTUVOVUlURU0gIiZUYSBib3J0XHREZWwiLCAweDExNAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJNYXJrZXJhICZhbGx0IiwgMHgxMTYKICBNRU5VSVRFTSAiJlRpZC9EYXR1bVx0RjUiLCAweDExNwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImRGVsYSBs5W5nYSBtZW5pbmdhciIsIDB4MTE5CiB9ClBPUFVQICImU/ZrIiB7CiAgTUVOVUlURU0gIlP2ay4uLiIsIDB4MTIwCiAgTUVOVUlURU0gIiZT9msgbuRzdGFcdEYzIiwgMHgxMjEKIH0KUE9QVVAgIiZIauRscCIgewogIE1FTlVJVEVNICImSW5uZWjlbGwiLCAweDEzMAogIE1FTlVJVEVNICImU/ZrLi4uIiwgMHgxMzEKICBNRU5VSVRFTSAiQW525G5kbmluZ2VuICZhdiBoauRscCIsIDB4MTMyCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgUE9QVVAgIkluZiZvcm1hdGlvbi4uLiIgewogICBNRU5VSVRFTSAiJkxpY2VucyIsIDB4MTM1CiAgIE1FTlVJVEVNICImSU5HRU4gR0FSQU5USSIsIDB4MTM2CiAgIE1FTlVJVEVNICImT20gV2luZSIsIDB4MTM3CiAgfQogfQp9CgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpESUFMT0dfUEFHRVNFVFVQXyBESUFMT0cgMCwgMCwgMjI1LCA5NQpMQU5HVUFHRSBMQU5HX1NXRURJU0gsIFNVQkxBTkdfTkVVVFJBTApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiSGVsdiIKQ0FQVElPTiAiU2lkIExheW91dCIKewpMVEVYVCAgICAiJkh1dnVkbm90OiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MSwgICAgICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZGb3Rub3Q6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQzLCAgICAgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIkthbnRlcjoiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZW5G5zdGVyOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwqLyAgIDB4MTQ3LCAgICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICIm1nZlcjoiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLCovICAgIDB4MTRBLCAgICAgICAgNTAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkj2Z2VyOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCovICAweDE0RCwgICAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImVW5kZXI6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwqLyAweDE1MCwgICAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICAweDE1MSwgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkF2YnJ5dCIsICAgICAweDE1MiwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiJkhq5GxwIiwgICAgICAgMHgxNTMsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX1NXRURJU0gsIFNVQkxBTkdfTkVVVFJBTAp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsCSImbiIgICAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsCSJQYWdlICZzIiAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLAkJIjIwIG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLAkiMjAgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLAkJIjI1IG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwJIjI1IG1tIiAgICAgLyogRklYTUUgKi8KClNUUklOR19OT1RFUEFELAkJCQkJIkFudGVja25pbmdhciIKU1RSSU5HX0VSUk9SLAkJCQkJIkZFTCIKU1RSSU5HX1dBUk5JTkcsCQkJCQkiV0FSTklORyIKU1RSSU5HX0lORk8sCQkJCQkiSW5mb3JtYXRpb24iCgpTVFJJTkdfVU5USVRMRUQsCQkJCSIodW50aXRsZWQpIgoKU1RSSU5HX0FMTF9GSUxFUywJCQkJIkFsbGEgZmlsZXIgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwJCQkiVGV4dCBmaWxlciAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLAkJCQkiRmlsZW4gJyVzJyDkciBm9nIgc3RvciBm9nIgbm90ZXBhZC5cbiBcCkFuduRuZCBlbiBhbm5hbiBlZGl0b3IuIgpTVFJJTkdfTk9URVhULAkJCQkJIkR1IHNrcmV2IGludGUgaW4gbuVnb24gdGV4dC4gXApcblNrcml2IG7lZ290IG9jaCBm9nJz9msgc2VkYW4gaWdlbiIKU1RSSU5HX0RPRVNOT1RFWElTVCwJCQkJIkZpbGUgJyVzJ1xuZG9lcyBub3QgZXhpc3RcblxuIFwKRG8geW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGZpbGUgPyIKU1RSSU5HX05PVFNBVkVELAkJCQkiRmlsZSAnJXMnXG5oYXMgYmVlbiBtb2RpZmllZFxuXG4gXApXb3VsZCB5b3UgbGlrZSB0byBzYXZlIHRoZSBjaGFuZ2VzID8iClNUUklOR19OT1RGT1VORCwJCQkJCSInJXMnIGhpdHRhZGVzIGludGUuIgpTVFJJTkdfT1VUX09GX01FTU9SWSwJCQkiSW50ZSB0aWxscuRrbGlndCBtZWQgbWlubmUgZvZyIGF0dCBzbHV0ZvZyYSBcCmRlbiBo5HIgdXBwZ2lmdGVuLiBcbkF2c2x1dGEgZXR0IGVsbGVyIGZsZXJhIHByb2dyYW0gZvZyIGF0dCD2a2EgbeRuZ2RlbiBcbmZyaXR0IFwKbWlubmUuIgoKfQo=