LyoKICogSGVscCBWaWV3ZXIKICogUG9ydHVndWVzZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAxOTk2IFVscmljaCBTY2htaWQKICogUG9ydHVndWVzZSB0cmFuc2xhdGlvbiBieSBHdXN0YXZvIEp1bmlvciBBbHZlcyA8YWx2ZXNAY29ycmVpb25ldC5jb20uYnI+CiAqIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKiBDb3B5cmlnaHQgMjAwMyBNYXJjZWxvIER1YXJ0ZQogKiBDb3B5cmlnaHQgMjAwNCwyMDA3IEFt6XJpY28gSm9z6SBNZWxvCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCi8qIE1lbnUgKi8KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTgoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZBcnF1aXZvIiB7CiAgTUVOVUlURU0gIiZBYnJpci4uLiIsIE1OSURfRklMRV9PUEVOCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZJbXByaW1pciIsIE1OSURfRklMRV9QUklOVAogIE1FTlVJVEVNICImQ29uZmlndXJhciBJbXByZXNzb3JhLi4uIiwgTU5JRF9GSUxFX1NFVFVQCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJTYWkmciIsIE1OSURfRklMRV9FWElUCiB9CiBQT1BVUCAiJkVkaXRhciIgewogICBNRU5VSVRFTSAiJkNvcGlhci4uLiIsIE1OSURfRURJVF9DT1BZRExHCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkFub3Rhci4uLiIsIE1OSURfRURJVF9BTk5PVEFURQogfQogUE9QVVAgIkluJmRpY2Fkb3IiIHsKICAgTUVOVUlURU0gIiZEZWZpbmlyLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIiZPcHRpb25zIiB7CiAgIFBPUFVQCSJIZWxwIGFsd2F5cyB2aXNpYmxlIgogICBCRUdJTgogICAgIE1FTlVJVEVNICJEZWZhdWx0IiwJTU5JRF9PUFRTX0hFTFBfREVGQVVMVAogICAgIE1FTlVJVEVNICJWaXNpYmxlIiwJTU5JRF9PUFRTX0hFTFBfVklTSUJMRQogICAgIE1FTlVJVEVNICJOb24gdmlzaWJsZSIsCU1OSURfT1BUU19IRUxQX05PTlZJU0lCTEUKICBFTkQKICBNRU5VSVRFTSAiSGlzdG9yeSIsCQlNTklEX09QVFNfSElTVE9SWQogIFBPUFVQICAgICJGb250cyIKICBCRUdJTgogICAgTUVOVUlURU0gIlNtYWxsIiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbCIsICAgIAlNTklEX09QVFNfRk9OVFNfTk9STUFMCiAgICBNRU5VSVRFTSAiTGFyZ2UiLCAgICAgCU1OSURfT1BUU19GT05UU19MQVJHRQogIEVORAogIE1FTlVJVEVNICJVc2Ugc3lzdGVtIGNvbG9ycyIsCU1OSURfT1BUU19TWVNURU1fQ09MT1JTCiB9CiBQT1BVUCAiQWomdWRhIiB7CiAgIE1FTlVJVEVNICJBanVkYSAmbmEgYWp1ZGEiLCBNTklEX0hFTFBfSEVMUE9OCiAgIE1FTlVJVEVNICJTZW1wcmUgJnZpc+12ZWwiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZJbmZvcm1h5/Vlcy4uLiIsIE1OSURfSEVMUF9BQk9VVAojaWZkZWYgV0lORUxJQgogICBNRU5VSVRFTSAiJlNvYnJlIFdJTkUiLCBNTklEX0hFTFBfV0lORQojZW5kaWYKIH0KfQoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0UKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImRmljaGVpcm8iIHsKICBNRU5VSVRFTSAiJkFicmlyLi4uIiwgTU5JRF9GSUxFX09QRU4KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkltcHJpbWlyIiwgTU5JRF9GSUxFX1BSSU5UCiAgTUVOVUlURU0gIiZDb25maWd1cmFyIEltcHJlc3NvcmEuLi4iLCBNTklEX0ZJTEVfU0VUVVAKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNhaSZyIiwgTU5JRF9GSUxFX0VYSVQKIH0KIFBPUFVQICImRWRpdGFyIiB7CiAgIE1FTlVJVEVNICImQ29waWFyLi4uIiwgTU5JRF9FRElUX0NPUFlETEcKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICImQW5vdGFyLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiSW4mZGljYWRvciIgewogICBNRU5VSVRFTSAiJkRlZmluaXIuLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiJk9wdGlvbnMiIHsKICAgUE9QVVAJIkhlbHAgYWx3YXlzIHZpc2libGUiCiAgIEJFR0lOCiAgICAgTUVOVUlURU0gIkRlZmF1bHQiLAlNTklEX09QVFNfSEVMUF9ERUZBVUxUCiAgICAgTUVOVUlURU0gIlZpc2libGUiLAlNTklEX09QVFNfSEVMUF9WSVNJQkxFCiAgICAgTUVOVUlURU0gIk5vbiB2aXNpYmxlIiwJTU5JRF9PUFRTX0hFTFBfTk9OVklTSUJMRQogIEVORAogIE1FTlVJVEVNICJIaXN0b3J5IiwJCU1OSURfT1BUU19ISVNUT1JZCiAgUE9QVVAgICAgIkZvbnRzIgogIEJFR0lOCiAgICBNRU5VSVRFTSAiU21hbGwiLAkJTU5JRF9PUFRTX0ZPTlRTX1NNQUxMCiAgICBNRU5VSVRFTSAiTm9ybWFsIiwgICAgCU1OSURfT1BUU19GT05UU19OT1JNQUwKICAgIE1FTlVJVEVNICJMYXJnZSIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIlVzZSBzeXN0ZW0gY29sb3JzIiwJTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKIH0KIFBPUFVQICJBaiZ1ZGEiIHsKICAgTUVOVUlURU0gIkFqdWRhICZuYSBhanVkYSIsIE1OSURfSEVMUF9IRUxQT04KICAgTUVOVUlURU0gIlNlbXByZSAmdmlz7XZlbCIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm9ybWHn9WVzLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICImQWNlcmNhIGRvIFdJTkUiLCBNTklEX0hFTFBfV0lORQojZW5kaWYKIH0KfQoKLyogU3RyaW5ncyAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUSURfV0lORV9IRUxQLCAJIkFqdWRhIFdJTkUiClNUSURfV0hFUlJPUiwgCQkiRVJSTyIKU1RJRF9XQVJOSU5HLCAgCQkiQVZJU08iClNUSURfSU5GTywgIAkJIkluZm9ybWHn428iClNUSURfTk9UX0lNUExFTUVOVEVELCAJIk7jbyBpbXBsZW1lbnRhZG8iClNUSURfSExQRklMRV9FUlJPUl9zLCAJIkVycm8gZW5jb250cmFkbyBuYSBsZWl0dXJhIGRvIGFycXVpdm8gZGUgYWp1ZGEgJyVzJyIKU1RJRF9JTkRFWCwgCQkiJkNvbnRl+mRvIgpTVElEX0NPTlRFTlRTLAkJIlN1bW1hcnkiClNUSURfQkFDSywgCQkiJlZvbHRhciIKU1RJRF9BTExfRklMRVMsIAkiVG9kb3Mgb3MgYXJxdWl2b3MgKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkiQXJxdWl2b3MgZGUgYWp1ZGEgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zICAgIkNhbm5vdCBmaW5kICclcycuIERvIHlvdSB3YW50IHRvIGZpbmQgdGhpcyBmaWxlIHlvdXJzZWxmPyIKU1RJRF9OT19SSUNIRURJVAkiQ2Fubm90IGZpbmQgYSByaWNoZWRpdCBpbXBsZW1lbnRhdGlvbi4uLiBBYm9ydGluZyIKU1RJRF9QU0hfSU5ERVgsCQkiSGVscCB0b3BpY3M6ICIKfQoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0UKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RJRF9XSU5FX0hFTFAsIAkiQWp1ZGEgV0lORSIKU1RJRF9XSEVSUk9SLCAJCSJFUlJPIgpTVElEX1dBUk5JTkcsICAJCSJBVklTTyIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYefjbyIKU1RJRF9OT1RfSU1QTEVNRU5URUQsIAkiTuNvIGltcGxlbWVudGFkbyIKU1RJRF9ITFBGSUxFX0VSUk9SX3MsIAkiRXJybyBlbmNvbnRyYWRvIG5hIGxlaXR1cmEgZG8gZmljaGVpcm8gZGUgYWp1ZGEgJyVzJyIKU1RJRF9JTkRFWCwgCQkiJkNvbnRl+mRvIgpTVElEX0NPTlRFTlRTLAkJIlN1bW1hcnkiClNUSURfQkFDSywgCQkiJlZvbHRhciIKU1RJRF9BTExfRklMRVMsIAkiVG9kb3Mgb3MgZmljaGVpcm9zICgqLiopIgpTVElEX0hFTFBfRklMRVNfSExQLCAJIkZpY2hlaXJvcyBkZSBhanVkYSAoKi5obHApIgpTVElEX0ZJTEVfTk9UX0ZPVU5EX3MJIk7jbyDpIHBvc3PtdmVsIGVuY29udHJhciAnJXMnLiBEZXNlamEgcHJvY3VyYXIgZXN0ZSBmaWNoZWlybyB2b2PqIG1lc21vPyIKU1RJRF9OT19SSUNIRURJVAkiQ2Fubm90IGZpbmQgYSByaWNoZWRpdCBpbXBsZW1lbnRhdGlvbi4uLiBBYm9ydGluZyIKU1RJRF9QU0hfSU5ERVgsCQkiSGVscCB0b3BpY3M6ICIKfQo=