LyoKICogTm90ZXBhZAogKiBQb3J0dWd1ZXNlIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDE5OTkgTWFyY2VsIEJhdXIgPGFsdmVzQGNvcnJlaW9uZXQuY29tLmJyPgogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDMgTWFyY2VsbyBEdWFydGUKICogQ29weXJpZ2h0IDIwMDQgQW3pcmljbyBKb3PpIE1lbG8KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgIm5vdGVwYWRfcmVzLmgiCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4KCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImQXJxdWl2byIgewogIE1FTlVJVEVNICImTm92b1x0Q3RybCtOIiwJCUNNRF9ORVcKICBNRU5VSVRFTSAiQSZicmlyLi4uXHRDdHJsK08iLAkJQ01EX09QRU4KICBNRU5VSVRFTSAiJlNhbHZhclx0Q3RybCtTIiwJCUNNRF9TQVZFCiAgTUVOVUlURU0gIlNhbHZhciAmY29tby4uLiIsCUNNRF9TQVZFX0FTCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZJbXByaW1pci4uLlx0Q3RybCtQIiwJCUNNRF9QUklOVAogIE1FTlVJVEVNICJDJm9uZmlndXJhciBw4WdpbmEuLi4iLAlDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICJDb25maWd1cmFyIGkmbXByZXNzb3JhLi4uIiwgQ01EX1BSSU5URVJfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2FpJnIiLAkJQ01EX0VYSVQKIH0KUE9QVVAgIiZFZGl0YXIiIHsKICBNRU5VSVRFTSAiJkRlc2ZhemVyXHRDdHJsK1oiLCBDTURfVU5ETwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUmVjb3J0YXJcdEN0cmwrWCIsCUNNRF9DVVQKICBNRU5VSVRFTSAiJkNvcGlhclx0Q3RybCtDIiwJQ01EX0NPUFkKICBNRU5VSVRFTSAiQyZvbGFyXHRDdHJsK1YiLAlDTURfUEFTVEUKICBNRU5VSVRFTSAiRSZ4Y2x1aXJcdERlbCIsCUNNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2VsZWNpb25hciAmdHVkbyIsCUNNRF9TRUxFQ1RfQUxMCiAgTUVOVUlURU0gIiZEYXRhL0hvcmFcdEY1IiwJQ01EX1RJTUVfREFURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUXVlYnJhciBhdXRvbeF0aWNhIGRlIGxpbmhhIiwJQ01EX1dSQVAKICBNRU5VSVRFTSAiJkZvbnRlLi4uIiwgICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZQZXNxdWlzYSIgewogIE1FTlVJVEVNICImTG9jYWxpemFyLi4uIiwJQ01EX1NFQVJDSAogIE1FTlVJVEVNICJMb2NhbGl6YXIgJnBy83hpbWFcdEYzIiwJQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICImQWp1ZGEiIHsKICBNRU5VSVRFTSAiJkNvbnRl+mRvIiwJCUNNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIiZQcm9jdXJhci4uLiIsCUNNRF9IRUxQX1NFQVJDSAogIE1FTlVJVEVNICImQWp1ZGEgbmEgYWp1ZGEiLAlDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBYm91dCBOb3RlcGFkIiwgQ01EX0hFTFBfQUJPVVRfTk9URVBBRAogfQp9CgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRQoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZGaWNoZWlybyIgewogIE1FTlVJVEVNICImTm92by4uLiIsCQlDTURfTkVXCiAgTUVOVUlURU0gIkEmYnJpciIsCQlDTURfT1BFTgogIE1FTlVJVEVNICImR3JhdmFyIiwJCUNNRF9TQVZFCiAgTUVOVUlURU0gIkdyYXZhciAmY29tby4uLiIsCUNNRF9TQVZFX0FTCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZJbXByaW1pciIsCQlDTURfUFJJTlQKICBNRU5VSVRFTSAiQyZvbmZpZ3VyYXIgcOFnaW5hLi4uIiwJQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiQ29uZmlndXJhciBpJm1wcmVzc29yYS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNhaSZyIiwJCUNNRF9FWElUCiB9ClBPUFVQICImRWRpdGFyIiB7CiAgTUVOVUlURU0gIiZEZXNmYXplclx0Q3RybCtaIiwgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkNvcnRhclx0Q3RybCtYIiwJQ01EX0NVVAogIE1FTlVJVEVNICImQ29waWFyXHRDdHJsK0MiLAlDTURfQ09QWQogIE1FTlVJVEVNICJDJm9sYXJcdEN0cmwrViIsCUNNRF9QQVNURQogIE1FTlVJVEVNICJFJnhjbHVpclx0RGVsIiwJQ01EX0RFTEVURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJTZWxlY2Npb25hciAmdHVkbyIsCUNNRF9TRUxFQ1RfQUxMCiAgTUVOVUlURU0gIiZEYXRhL0hvcmFcdEY1IiwJQ01EX1RJTUVfREFURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUXVlYnJhciBhdXRvbeF0aWNhIGRlIGxpbmhhIiwJQ01EX1dSQVAKICBNRU5VSVRFTSAiJlRpcG8gZGUgTGV0cmEuLi4iLCAgICAgICAgICBDTURfRk9OVAogfQpQT1BVUCAiJlBlc3F1aXNhIiB7CiAgTUVOVUlURU0gIiZMb2NhbGl6YXIuLi4iLAlDTURfU0VBUkNICiAgTUVOVUlURU0gIkxvY2FsaXphciAmcHLzeGltYVx0RjMiLAlDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIiZBanVkYSIgewogIE1FTlVJVEVNICImQ29udGX6ZG8iLAkJQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiJlByb2N1cmFyLi4uIiwJQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIiZBanVkYSBuYSBhanVkYSIsCUNNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkFib3V0IE5vdGVwYWQuLi4iLCBDTURfSEVMUF9BQk9VVF9OT1RFUEFECiB9Cn0KCgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfTkVVVFJBTAoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJDb25maWd1cmFyIHDhZ2luYSIKewpMVEVYVCAgICAiJkNhYmXnYWxobyAobW0pOiIsICAweDE0MCwgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZSb2RhcOk6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICImTWFyZ2VuczoiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZFc3F1ZXJkYToiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfTEVGVFZBTFVFLCAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlN1cGVyaW9yOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1RPUFZBTFVFLCAgICAgIDUwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZEaXJlaXRhOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkluZmVyaW9yOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiQ2FuY2VsYXIiLCAgICAgSURDQU5DRUwsICAgICAgICAgICAgICAgMTgwLCAyMSwgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIiZBanVkYSIsICAgICAgIElESEVMUCwgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwJIiZmIgpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLAkiUOFnaW5hICZwIgoKU1RSSU5HX05PVEVQQUQsCQkJCQkiTm90ZXBhZCIKU1RSSU5HX0VSUk9SLAkJCQkJIkVSUk8iClNUUklOR19XQVJOSU5HLAkJCQkJIkFWSVNPIgpTVFJJTkdfSU5GTywJCQkJCSJJbmZvcm1h5+NvIgoKU1RSSU5HX1VOVElUTEVELAkJCQkiKHNlbSBub21lKSIKClNUUklOR19BTExfRklMRVMsCQkJCSJUb2RvcyBvcyBhcnF1aXZvcyAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULAkJCSJBcnF1aXZvcyB0ZXh0byAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLAkJCQkiQXJxdWl2byAnJXMnIOkgbXVpdG8gbG9uZ28gcGFyYSBvIG5vdGVwYWQuXG4gXApQb3IgZmF2b3IgdXNlIHVtIGVkaXRvciBkaWZlcmVudGUuIgpTVFJJTkdfTk9URVhULAkJCQkJIlZvY+ogbuNvIGRpZ2l0b3UgbmVuaHVtIHRleHRvLiBcClxuUG9yIGZhdm9yIGRpZ2l0ZSBhbGd1bWEgY29pc2EgZSB0ZW50ZSBub3ZhbWVudGUiClNUUklOR19ET0VTTk9URVhJU1QsCQkJCSJBcnF1aXZvICclcydcbm7jbyBleGlzdGVcblxuIFwKVm9j6iBkZXNlamEgY3JpYXIgdW0gbm92byBhcnF1aXZvPyIKU1RSSU5HX05PVFNBVkVELAkJCQkiQXJxdWl2byAnJXMnXG5mb2kgbW9kaWZpY2Fkb1xuXG4gXApHb3N0YXJpYSBkZSBzYWx2YXIgYXMgYWx0ZXJh59Vlcz8iClNUUklOR19OT1RGT1VORCwJCQkJCSInJXMnIG7jbyBwb2RlIHNlciBlbmNvbnRyYWRvLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksCQkJIk7jbyBo4SBtZW3zcmlhIHN1ZmljaWVudGUgcGFyYSBjb21wbGV0YXIgZXNzYSBcCnRhcmVmYS5cbkZlY2hlIHVtYSBvdSBtYWlzIGFwbGljYef1ZXMgcGFyYSBhdW1lbnRhciBhIHF1YW50aWRhZGUgZGUgbWVt83JpYSBsaXZyZS4iCn0KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiBTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLAkiJmYiCiBTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLAkiUOFnaW5hICZwIgoKIFNUUklOR19OT1RFUEFELAkJIk5vdGVwYWQiCiBTVFJJTkdfRVJST1IsCQkJIkVSUk8iCiBTVFJJTkdfV0FSTklORywJCSJBVklTTyIKIFNUUklOR19JTkZPLAkJCSJJbmZvcm1h5+NvIgoKIFNUUklOR19VTlRJVExFRCwJCSIoc2VtIG5vbWUpIgoKIFNUUklOR19BTExfRklMRVMsCQkiVG9kb3Mgb3MgYXJxdWl2b3MgKCouKikiCiBTVFJJTkdfVEVYVF9GSUxFU19UWFQsCQkiRmljaGVpcm9zIGRlIHRleHRvICgqLnR4dCkiCgogU1RSSU5HX1RPT0xBUkdFLAkJIkZpY2hlaXJvcyAnJXMnIOkgbXVpdG8gbG9uZ28gcGFyYSBvIG5vdGVwYWQuXG4gXAogUG9yIGZhdm9yIHVzZSB1bSBlZGl0b3IgZGlmZXJlbnRlLiIKIFNUUklOR19OT1RFWFQsCQkJIk7jbyBkaWdpdG91IG5lbmh1bSB0ZXh0by4gXApcblBvciBmYXZvciBkaWdpdGUgYWxndW1hIGNvaXNhIGUgdGVudGUgbm92YW1lbnRlIgogU1RSSU5HX0RPRVNOT1RFWElTVCwJCSJGaWNoZWlybyAnJXMnXG5u428gZXhpc3RlXG5cbiBcCkRlc2VqYSBjcmlhciB1bSBub3ZvIGZpY2hlaXJvPyIKIFNUUklOR19OT1RTQVZFRCwJCSJGaWNoZWlybyAnJXMnXG5mb2kgbW9kaWZpY2Fkb1xuXG4gXApHb3N0YXJpYSBkZSBncmF2YXIgYXMgYWx0ZXJh59Vlcz8iCiBTVFJJTkdfTk9URk9VTkQsCQkiJyVzJyBu428gcG9kZSBzZXIgZW5jb250cmFkby4iCiBTVFJJTkdfT1VUX09GX01FTU9SWSwJCSJO428gaOEgbWVt83JpYSBzdWZpY2llbnRlIHBhcmEgY29tcGxldGFyIGVzdGEgXAp0YXJlZmEuXG5GZWNoZSB1bWEgb3UgbWFpcyBhcGxpY2Hn9WVzIHBhcmEgYXVtZW50YXIgYSBxdWFudGlkYWRlIGRlIG1lbfNyaWEgbGl2cmUuIgp9Cg==