LyoKICogTm90ZXBhZAogKiBQb3J0dWd1ZXNlIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDE5OTkgTWFyY2VsIEJhdXIgPGFsdmVzQGNvcnJlaW9uZXQuY29tLmJyPgogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDMgTWFyY2VsbyBEdWFydGUKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX0RFRkFVTFQKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImQXJxdWl2byIgewogIE1FTlVJVEVNICImTm92by4uLiIsCQlDTURfTkVXCiAgTUVOVUlURU0gIkEmYnJpciIsCQlDTURfT1BFTgogIE1FTlVJVEVNICImU2FsdmFyIiwJCUNNRF9TQVZFCiAgTUVOVUlURU0gIlNhbHZhciAmY29tby4uLiIsCUNNRF9TQVZFX0FTCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZJbXByaW1pciIsCQlDTURfUFJJTlQKICBNRU5VSVRFTSAiQyZvbmZpZ3VyYXIgcOFnaW5hLi4uIiwJQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiQ29uZmlndXJhciBpJm1wcmVzc29yYS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNhaSZyIiwJCUNNRF9FWElUCiB9ClBPUFVQICImRWRpdGFyIiB7CiAgTUVOVUlURU0gIiZEZXNmYXplclx0Q3RybCtaIiwgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlJlY29ydGFyXHRDdHJsK1giLAlDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpYXJcdEN0cmwrQyIsCUNNRF9DT1BZCiAgTUVOVUlURU0gIkMmb2xhclx0Q3RybCtWIiwJQ01EX1BBU1RFCiAgTUVOVUlURU0gIkUmeGNsdWlyXHREZWwiLAlDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNlbGVjaW9uYXIgJnR1ZG8iLAlDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImRGF0YS9Ib3JhXHRGNSIsCUNNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlF1ZWJyYXIgYXV0b23hdGljYSBkZSBsaW5oYSIsCUNNRF9XUkFQCiAgTUVOVUlURU0gIiZGb250ZS4uLiIsICAgICAgICAgIENNRF9GT05UCiB9ClBPUFVQICImUGVzcXVpc2EiIHsKICBNRU5VSVRFTSAiJkxvY2FsaXphci4uLiIsCUNNRF9TRUFSQ0gKICBNRU5VSVRFTSAiTG9jYWxpemFyICZwcvN4aW1hXHRGMyIsCUNNRF9TRUFSQ0hfTkVYVAogfQpQT1BVUCAiJkFqdWRhIiB7CiAgTUVOVUlURU0gIiZDb250ZfpkbyIsCQlDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImUHJvY3VyYXIuLi4iLAlDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiJkFqdWRhIG5hIGFqdWRhIiwJQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICImSW5mb3JtYef1ZXMuLi4iIHsKICAgTUVOVUlURU0gIiZMaWNlbudhIiwJCUNNRF9MSUNFTlNFCiAgIE1FTlVJVEVNICImU0VNIEdBUkFOVElBIiwJQ01EX05PX1dBUlJBTlRZCiAgIE1FTlVJVEVNICImU29icmUgbyBXaW5lIiwJQ01EX0FCT1VUX1dJTkUKICB9CiB9Cn0KCi8qIERpYWxvZyBgUGFnZSBzZXR1cCcgKi8KCkRJQUxPR19QQUdFU0VUVVAgRElBTE9HIDAsIDAsIDIyNSwgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIkhlbHYiCkNBUFRJT04gIkNvbmZpZ3VyYXIgcOFnaW5hIgp7CkxURVhUICAgICImQ2FiZedhbGhvOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MSwgICAgICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZSb2RhcOk6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQzLCAgICAgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIiZNYXJnZW5zOiIsICAgICAgMHgxNDQsICAgICAxMCwgNDMsMTYwLCA0NQpMVEVYVCAgICAiJkVzcXVlcmRhOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwqLyAgIDB4MTQ3LCAgICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImU3VwZXJpb3I6IiwgICAgICAgICAweDE0OCwgICAgMjAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9UT1BWQUxVRSwqLyAgICAweDE0QSwgICAgICAgIDUwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZEaXJlaXRhOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCovICAweDE0RCwgICAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImSW5mZXJpb3I6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwqLyAweDE1MCwgICAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICAweDE1MSwgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkNhbmNlbGFyIiwgICAgIDB4MTUyLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImQWp1ZGEiLCAgICAgICAweDE1MywgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwJIiZuIiAgICAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwJIlDhZ2luYSAmcyIgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwJCSIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwJIjIwIG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9UT1BWQUxVRSwJCSIyNSBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsCSIyNSBtbSIgICAgIC8qIEZJWE1FICovCgpTVFJJTkdfTk9URVBBRCwJCQkJCSJOb3RlcGFkIgpTVFJJTkdfRVJST1IsCQkJCQkiRVJSTyIKU1RSSU5HX1dBUk5JTkcsCQkJCQkiQVZJU08iClNUUklOR19JTkZPLAkJCQkJIkluZm9ybWHn428iCgpTVFJJTkdfVU5USVRMRUQsCQkJCSIoc2VtIG5vbWUpIgoKU1RSSU5HX0FMTF9GSUxFUywJCQkJIlRvZG9zIG9zIGFycXVpdm9zICgqLiopIgpTVFJJTkdfVEVYVF9GSUxFU19UWFQsCQkJIkFycXVpdm9zIHRleHRvICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsCQkJCSJBcnF1aXZvICclcycg6SBtdWl0byBsb25nbyBwYXJhIG8gbm90ZXBhZC5cbiBcClBvciBmYXZvciB1c2UgdW0gZWRpdG9yIGRpZmVyZW50ZS4iClNUUklOR19OT1RFWFQsCQkJCQkiVm9j6iBu428gZGlnaXRvdSBuZW5odW0gdGV4dG8uIFwKXG5Qb3IgZmF2b3IgZGlnaXRlIGFsZ3VtYSBjb2lzYSBlIHRlbnRlIG5vdmFtZW50ZSIKU1RSSU5HX0RPRVNOT1RFWElTVCwJCQkJIkFycXVpdm8gJyVzJ1xubuNvIGV4aXN0ZVxuXG4gXApWb2PqIGRlc2VqYSBjcmlhciB1bSBub3ZvIGFycXVpdm8/IgpTVFJJTkdfTk9UU0FWRUQsCQkJCSJBcnF1aXZvICclcydcbmZvaSBtb2RpZmljYWRvXG5cbiBcCkdvc3RhcmlhIGRlIHNhbHZhciBhcyBhbHRlcmHn1WVzPyIKU1RSSU5HX05PVEZPVU5ELAkJCQkJIiclcycgbuNvIHBvZGUgc2VyIGVuY29udHJhZG8uIgpTVFJJTkdfT1VUX09GX01FTU9SWSwJCQkiTuNvIGjhIG1lbfNyaWEgc3VmaWNpZW50ZSBwYXJhIGNvbXBsZXRhciBlc3NhIFwKdGFyZWZhLiBcbkZlY2hlIHVtYSBvdSBtYWlzIGFwbGljYef1ZXMgcGFyYSBhdW1lbnRhciBhIHF1YW50aWRhZGUgZGUgbWVt83JpYSBsaXZyZS4iCgp9Cg==