U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCgpWZXJzaW9uIDIuMC4xMCAoMjcgTWF5IDIwMTMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTMtMDUtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24gMyBpbmNvbnNpc3RlbmN5IHdoZW4gbmVnYXRpdmUgbnVtYmVycyBhcmUgcGFzc2VkCiAgICAgICAgICAgIHdoZXJlIGEgcGFyYW1ldGVyIGV4cGVjdHMgYW4gdW5zaWduZWQgQyB0eXBlLiBBbiBPdmVyRmxvdyBlcnJvciBpcwogICAgICAgICAgICBub3cgY29uc2lzdGVudGx5IHRocm93biBpbnN0ZWFkIG9mIGEgVHlwZUVycm9yLgoKMjAxMy0wNS0yNTogQXJ0ZW0gU2VyZWJyaXlza2l5CiAgICAgICAgICAgIFNWTiBQYXRjaCB0aWNrZXQgIzMzOCAtIGZpeGVzIHRvICVhdHRyaWJ1dGUgbWFjcm9zIGZvciB0ZW1wbGF0ZSB1c2FnZQogICAgICAgICAgICB3aXRoICVhcmcuCgoyMDEzLTA1LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY2NhY2hlLXN3aWcgaW50ZXJuYWwgZXJyb3IgYnVnIGR1ZSB0byBwcmVtYXR1cmUgZmlsZSBjbGVhbnVwLgoKICAgICAgICAgICAgRml4ZXMgU0YgYnVnIDEzMTkgd2hpY2ggc2hvd3MgdXAgYXMgYSBmYWlsdXJlIGluIHRoZSBjY2FjaGUgdGVzdHMgb24KICAgICAgICAgICAgRGViaWFuIDY0IGJpdCBXaGVlenksIHBvc3NpYmx5IGJlY2F1c2UgRU5BQkxFX1pMSUIgaXMgZGVmaW5lZC4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb3JuZXIgY2FzZSB3aGljaCB3aWxsIGJlIGhpdCB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcwogICAgICAgICAgICBpbiB0aGUgY2FjaGUgaXMgc2V0IHRvIGJlIHF1aXRlIGxvdyAoLUYgb3B0aW9uKSwgcmVzdWx0aW5nIGluIGEgY2FjaGUgbWlzcy4KCjIwMTMtMDUtMDk6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGJ1Z3MgaW4gT2N0YXZlIG1vZHVsZSBsb2FkaW5nOgogICAgICAgICAgICAtIGZpeCBhIG1lbW9yeSBsZWFrIGluIHNldHRpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICAtIGluc3RhbGwgZnVuY3Rpb25zIG9ubHkgb25jZSwgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRzCgoyMDEzLTA0LTI4OiBnamFuc3NlbnMKICAgICAgICAgICAgW0d1aWxlXSBVcGRhdGVzIGluIGd1aWxlIG1vZHVsZToKICAgICAgICAgICAgLSBBZGQgc3VwcG9ydCBmb3IgZ3VpbGUgMi4wCiAgICAgICAgICAgIC0gRHJvcCBzdXBwb3J0IGZvciBndWlsZSAxLjYKICAgICAgICAgICAgLSBEcm9wIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgd3JhcHBlcnMgdXNpbmcgZ3VpbGUncyBnaCBpbnRlcmZhY2UuCiAgICAgICAgICAgICAgQWxsIGdlbmVyYXRlZCB3cmFwcGVycyB3aWxsIHVzZSB0aGUgc2NtIGludGVyZmFjZSBmcm9tIG5vdyBvbi4KICAgICAgICAgICAgLSBEZXByZWNhdGUgLWdoIGFuZCAtc2NtIG9wdGlvbnMuIFRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgICAgICAgICAgQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIHdoZW4gdGhlc2Ugb3B0aW9ucyBhcmUgc3RpbGwgdXNlZC4KICAgICAgICAgICAgLSBGaXggYWxsIHRlc3RzIGFuZCBleGFtcGxlcyB0byBoYXZlIGEgc3VjY2Vzc2Z1bCB0cmF2aXMgdGVzdAoKMjAxMy0wNC0xODogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgUGF0Y2ggIzM2IGZyb20gSmVzdXMgTG9wZXogdG8gYWRkIHN1cHBvcnQgZm9yICRkZXNjcmlwdG9yKCkgc3BlY2lhbCB2YXJpYWJsZSBtYWNybyBleHBhbnNpb24gCiAgICAgICAgICAgIGluIGZyYWdtZW50cy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZURlc2NyaXB0b3IiLCAiaGVhZGVyIikKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVEZXNjcmlwdG9yID0gIiRkZXNjcmlwdG9yKE5hbWUpIjsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgd2hpY2ggd2lsbCBnZW5lcmF0ZSBpbnRvIHRoZSB3cmFwcGVyIGlmIHRoZSBmcmFnbWVudCBpcyB1c2VkOgoKICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZURlc2NyaXB0b3IgPSAiU1dJR1RZUEVfTmFtZSI7CgoyMDEzLTA0LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgQnVnICM0MjggLSBTeW50YXggZXJyb3Igd2hlbiBwcmVwcm9jZXNzb3IgbWFjcm9zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiBlbnVtIGxpc3RzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0gewogICAgICAgICAgICAgICAgZVplcm8gPSAwCiAgICAgICAgICAgICAgI2RlZmluZSBPTkUgMQogICAgICAgICAgICAgIH0gRUZvbzsKCiAgICAgICAgICAgIFRoZSBtYWNyb3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuCgoyMDEzLTA0LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFB1bGwgcGF0Y2ggIzM0IGZyb20gQnJhbnRLeXNlciB0byBmaXggc21hcnQgcG9pbnRlcnMgaW4gY29uanVjdGlvbiB3aXRoIGRpcmVjdG9ycy4KCjIwMTMtMDQtMTU6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGJ1Z3MgaW4gb3V0cHV0IG9mIGNsZWFudXAgY29kZS4KICAgICAgICAgICAgLSBDbGVhbnVwIGNvZGUgaXMgbm93IHdyaXR0ZW4gYWxzbyBhZnRlciB0aGUgImZhaWw6IiBsYWJlbCwgc28gaXQgd2lsbCBiZSBjYWxsZWQgaWYKICAgICAgICAgICAgICBhIFNXSUdfZXhjZXB0aW9uIGlzIHJhaXNlZCBieSB0aGUgd3JhcHBpbmcgZnVuY3Rpb24sIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBtb2R1bGVzLgogICAgICAgICAgICAtIE9jdGF2ZSBtb2R1bGUgbm93IGFsc28gcmVjb2duaXNlcyB0aGUgIiRjbGVhbnVwIiBzcGVjaWFsIHZhcmlhYmxlLCBpZiBuZWVkZWQuCgoyMDEzLTA0LTA4OiBrd3dldHRlCiAgICAgICAgICAgIEFkZCAtTVAgb3B0aW9uIHRvIFNXSUcgZm9yIGdlbmVyYXRpbmcgcGhvbnkgdGFyZ2V0cyBmb3IgYWxsIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgLSBQcmV2ZW50cyBtYWtlIGZyb20gY29tcGxhaW5pbmcgaWYgaGVhZGVyIGZpbGVzIGhhdmUgYmVlbiBkZWxldGVkIGJlZm9yZQogICAgICAgICAgICAgIHRoZSBkZXBlbmRlbmN5IGZpbGUgaGFzIGJlZW4gdXBkYXRlZC4KICAgICAgICAgICAgLSBNb2RlbGxlZCBvbiBzaW1pbGFyIG9wdGlvbiBpbiBHQ0MuCgoyMDEzLTA0LTA5OiBvbGx5CgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgZGlyZWN0b3JpbiB0eXBlbWFwIGZvciBjaGFyKiBhbmQgY2hhcltdIHdoaWNoCgkgICAgZml4ZXMgZGlyZWN0b3Jfc3RyaW5nIHRlc3RjYXNlIGZhaWx1cmUuCgoyMDEzLTA0LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gU0YgQnVnICMxMjkyIC0gUnVudGltZSBmaXhlcyBmb3IgUHJvYyBjaGFuZ2VzIGluIHJ1YnktMS45IHdoZW4gdXNpbmcgU1RMCiAgICAgICAgICAgIHdyYXBwZXJzIHRoYXQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcHJlZGljYXRlLCBzdWNoIGFzOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoTWFwKSBzdGQ6Om1hcDxzd2lnOjpMQU5HVUFHRV9PQkosIHN3aWc6OkxBTkdVQUdFX09CSiwgc3dpZzo6QmluYXJ5UHJlZGljYXRlPD4gPjsKCjIwMTMtMDQtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBTRiBCdWcgIzExNTkgLSBDb3JyZWN0bHkgY2hlY2sgcmJfcmVzcG9uZF90byBjYWxsIHJldHVybiB2YWx1ZXMgdG8gZml4IHNvbWUKICAgICAgICAgICAgZnVydGhlciAxLjkgcHJvYmxlbXMgd2l0aCBmdW5jdG9ycyBhbmQgdXNlIG9mIENvbXBsZXggd3JhcHBlcnMuCgoyMDEzLTA0LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gUnVudGltZSBmaXhlcyBmb3Igc3RkOjpjb21wbGV4IHdyYXBwZXJzIGZvciBydWJ5LTEuOSAtIG5ldyBuYXRpdmUgUnVieSBjb21wbGV4IG51bWJlcnMgYXJlIHVzZWQuCgoyMDEzLTAzLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IHNlZyBmYXVsdCB3aGVuIHVzaW5nIFNUTCBjb250YWluZXJzIG9mIGdlbmVyaWMgUnVieSB0eXBlcywgR0NfVkFMVUUgb3IgTEFOR1VBR0VfT0JKRUNULAogICAgICAgICAgICBvbiBleGl0IG9mIHRoZSBSdWJ5IGludGVycHJldGVyLiBNb3JlIGZyZXF1ZW50bHkgb2JzZXJ2ZWQgaW4gcnVieS0xLjkuCgoyMDEzLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGRlbGV0ZV9pZiAocmVqZWN0ISkgZm9yIHRoZSBTVEwgY29udGFpbmVyIHdyYXBwZXJzIHdoaWNoIHByZXZpb3VzbHkgd291bGQKICAgICAgICAgICAgc29tZXRpbWVzIHNlZyBmYXVsdCBvciBub3Qgd29yay4KCjIwMTMtMDMtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzb21lIHVuZGVmaW5lZCBiZWhhdmlvdXIgZGVsZXRpbmcgc2xpY2VzIGluIHRoZSBTVEwgY29udGFpbmVycy4KCjIwMTMtMDMtMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YSwgRF0gRml4IHNlZyBmYXVsdCBpbiBTV0lHIHVzaW5nIGRpcmVjdG9ycyB3aGVuIGNsYXNzIGFuZCB2aXJ0dWFsIG1ldGhvZCBuYW1lcyBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgZXhjZXB0IGJlaW5nIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzIHdoZW4gdGhlICVuc3BhY2UgZmVhdHVyZSBpcyBub3QgYmVpbmcgdXNlZC4KCjIwMTMtMDItMTk6IGt3d2V0dGUKICAgICAgICAgICAgRml4IGJ1ZyBpbiBTV0lHJ3MgaGFuZGxpbmcgb2YgcXVhbGlmaWVkIChlLmcuIGNvbnN0KSB2YXJpYWJsZXMgb2YgYXJyYXkgdHlwZS4gR2l2ZW4gdGhlIHR5cGVkZWYKICAgICAgICAgICAgICBhKDcpLnEodm9sYXRpbGUpLmRvdWJsZSBteWFycmF5ICAgICAvLyB0eXBlZGVmIHZvbGF0aWxlIGRvdWJsZVs3XSBteWFycmF5OwogICAgICAgICAgICB0aGUgdHlwZQogICAgICAgICAgICAgIHEoY29uc3QpLm15YXJyYXkgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IG15YXJyYXkKICAgICAgICAgICAgYmVjb21lcwogICAgICAgICAgICAgIGEoNykucShjb25zdCB2b2xhdGlsZSkuZG91YmxlICAgICAgIC8vIGNvbnN0IHZvbGF0aWxlIGRvdWJsZVs3XQogICAgICAgICAgICBQcmV2aW91c2x5LCBTd2lnVHlwZV90eXBlZGVmX3Jlc29sdmUoKSBwcm9kdWNlcyB0aGUgdHlwZQogICAgICAgICAgICAgIHEoY29uc3QpLmEoNykucSh2b2xhdGlsZSkuZG91YmxlICAgIC8vIG5vbi1zZW5zaWNhbCB0eXBlCiAgICAgICAgICAgIHdoaWNoIHdvdWxkIG5ldmVyIG1hdGNoICV0eXBlbWFwIGRlY2xhcmF0aW9ucywgd2hvc2UgdHlwZXMgd2VyZSBwYXJzZWQgY29ycmVjdGx5LgogICAgICAgICAgICBBZGQgdHlwZW1hcF9hcnJheV9xdWFsaWZpZXJzLmkgdG8gdGhlIHRlc3Qgc3VpdGUgd2hpY2ggY2hlY2tzIGZvciB0aGUgY29ycmVjdCBiZWhhdmlvdXIuCgoyMDEzLTAyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBEZXByZWNhdGUgdHlwZWRlZiBuYW1lcyB1c2VkIGFzIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG5hbWVzIGluICVleHRlbmQuIFRoZSByZWFsCiAgICAgICAgICAgIGNsYXNzL3N0cnVjdCBuYW1lIHNob3VsZCBiZSB1c2VkLgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB0YWdFU3RydWN0IHsKICAgICAgICAgICAgICAgIGludCBpdmFyOwogICAgICAgICAgICAgIH0gRVN0cnVjdDsKCiAgICAgICAgICAgICAgJWV4dGVuZCB0YWdFU3RydWN0IHsKICAgICAgICAgICAgICAgIEVTdHJ1Y3QoKSAvLyBpbGxlZ2FsIG5hbWUsIHNob3VsZCBiZSB0YWdFU3RydWN0KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgRVN0cnVjdCAqcyA9IG5ldyBFU3RydWN0KCk7CiAgICAgICAgICAgICAgICAgIHMtPml2YXIgPSBpdmFyMDsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB+RVN0cnVjdCgpIC8vIGlsbGVnYWwgbmFtZSwgc2hvdWxkIGJlIH50YWdFU3RydWN0KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVsZXRlICRzZWxmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZvciBub3cgdGhlc2UgdHJpZ2dlciBhIHdhcm5pbmc6CgogICAgICAgICAgICAgIGV4dGVuZF9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yLmk6MTA3OiBXYXJuaW5nIDUyMjogVXNlIG9mIGFuIGlsbGVnYWwgY29uc3RydWN0b3IgbmFtZSAnRVN0cnVjdCcgaW4KICAgICAgICAgICAgICAlZXh0ZW5kIGlzIGRlcHJlY2F0ZWQsIHRoZSBjb25zdHJ1Y3RvciBuYW1lIHNob3VsZCBiZSAndGFnRVN0cnVjdCcuCiAgICAgICAgICAgICAgZXh0ZW5kX2NvbnN0cnVjdG9yX2Rlc3RydWN0b3IuaToxMTE6IFdhcm5pbmcgNTIzOiBVc2Ugb2YgYW4gaWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgJ0VTdHJ1Y3QnIGluCiAgICAgICAgICAgICAgJWV4dGVuZCBpcyBkZXByZWNhdGVkLCB0aGUgZGVzdHJ1Y3RvciBuYW1lIHNob3VsZCBiZSAndGFnRVN0cnVjdCcuCgogICAgICAgICAgICBUaGVzZSAlZXh0ZW5kIGRlc3RydWN0b3IgYW5kIGNvbnN0cnVjdG9yIG5hbWVzIHdlcmUgdmFsaWQgdXAgdG8gc3dpZy0yLjAuNCwgaG93ZXZlciBzd2lnLTIuMC41IGlnbm9yZWQKICAgICAgICAgICAgdGhlbSBhbHRvZ2V0aGVyIGZvciBDIGNvZGUgYXMgcmVwb3J0ZWQgaW4gU0YgYnVnICMxMzA2LiBUaGUgb2xkIGJlaGF2aW91ciBvZiB1c2luZyB0aGVtIGhhcyBiZWVuCiAgICAgICAgICAgIHJlc3RvcmVkIGZvciBub3csIGJ1dCBpcyBvZmZpY2lhbGx5IGRlcHJlY2F0ZWQuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gYW5vbnltb3VzbHkgZGVmaW5lZCB0eXBlZGVmCiAgICAgICAgICAgIGNsYXNzZXMvc3RydWN0cyBzdWNoIGFzOgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7Li4ufSBYOwoKMjAxMy0wMi0xNzoga3d3ZXR0ZQogICAgICAgICAgICBXaGVuIGdlbmVyYXRpbmcgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5ICVleHRlbmQsIHVzZSAiKHZvaWQpIiBmb3Igbm8tYXJndW1lbnQgZnVuY3Rpb25zCiAgICAgICAgICAgIGluc3RlYWQgb2YgIigpIi4gVGhpcyBwcmV2ZW50cyB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoICJnY2MgLVdzdHJpY3QtcHJvdG90eXBlcyIuCgoyMDEzLTAyLTE3OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIE1pbm9yIGZpeCB0byBhdXRvZG9jIGdlbmVyYXRpb246IGdldCB0aGUgcmlnaHQgdHlwZSBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBzdHJ1Y3RzLgoKMjAxMy0wMi0xNTogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlIHR5cGVkZWYgbmFtZXMgdXNlZCBpbiAlZXh0ZW5kIHRoYXQgYXJlIG5vdCB0aGUgcmVhbCBjbGFzcy9zdHJ1Y3QgbmFtZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IFN0cnVjdEJOYW1lIHsKICAgICAgICAgICAgICAgIGludCBteWludDsKICAgICAgICAgICAgICB9IFN0cnVjdEI7CgogICAgICAgICAgICAgICVleHRlbmQgU3RydWN0QiB7CiAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZCgpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2lsbCBub3cgdHJpZ2dlciBhIHdhcm5pbmc6CgogICAgICAgICAgICAgIHN3aWdfZXh0ZW5kLmk6MTk6IFdhcm5pbmcgMzI2OiBEZXByZWNhdGVkICVleHRlbmQgbmFtZSB1c2VkIC0gdGhlIHN0cnVjdCBuYW1lIFN0cnVjdEJOYW1lCiAgICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgdHlwZWRlZiBuYW1lIFN0cnVjdEIuCgogICAgICAgICAgICBUaGlzIGlzIG9ubHkgcGFydGlhbGx5IHdvcmtpbmcgYW55d2F5ICh0aGUgJWV4dGVuZCBvbmx5IHdvcmtlZCBpZiBwbGFjZWQgYWZ0ZXIgdGhlIGNsYXNzCiAgICAgICAgICAgIGRlZmluaXRpb24pLiAKCjIwMTMtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBBcHBseSBwYXRjaCAjMjIgLSBGaXggbWlzc2luZyBwYWNrYWdlIGJlZm9yZSAmYm9keQoKMjAxMy0wMS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEVuc3VyZSAnamF2YXBhY2thZ2UnIHR5cGVtYXAgaXMgdXNlZCBhcyBpdCBzdG9wcGVkIHdvcmtpbmcgZnJvbSB2ZXJzaW9uIDIuMC41LgoKMjAxMy0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggU0YgIzMzNCAtIEZpeCBkZWZhdWx0IHZhbHVlIGNvbnZlcnNpb25zICJUUlVFIi0+VHJ1ZSwgIkZBTFNFIi0+RmFsc2UuCgoyMDEzLTAxLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggU0YgIzMzNSAtIFRydWx5IGlnbm9yZSBjb25zdHJ1Y3RvcnMgaW4gZGlyZWN0b3JzIHdpdGggJWlnbm9yZS4KCjIwMTMtMDEtMTg6IEJyYW50IEt5c2VyCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTUgLSBBbGxvdyB0aGUgdXNlIG9mIHRoZSBuc3BhY2UgZmVhdHVyZSB3aXRob3V0IHRoZSAtcGFja2FnZSBjb21tYW5kbGluZSBvcHRpb24uCiAgICAgICAgICAgIFRoaXMgd29ya3MgYXMgbG9uZyBhbmQgdGhlIG5ldyBqbmljbGFzc3BhY2thZ2UgcHJhZ21hIGlzIHVzZWQgdG8gcGxhY2UgdGhlIEpOSSBpbnRlcm1lZGlhdGUgY2xhc3MKICAgICAgICAgICAgaW50byBhIHBhY2thZ2UgYW5kIHRoZSBuc3BhY2UgZmVhdHVyZSBpcyB1c2VkIHRvIHBsYWNlIGFsbCBleHBvc2VkIHR5cGVzIGludG8gYSBwYWNrYWdlLgoKMjAxMy0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IFZpc3VhbCBTdHVkaW8gZXhhbXBsZXMgdG8gd29yayB3aGVuIFNXSUcgaXMgdW56aXBwZWQgaW50byBhIGRpcmVjdG9yeSBjb250YWluaW5nIHNwYWNlcy4KCjIwMTMtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGNzdHlwZSB0eXBlbWFwIGxvb2t1cCBmb3IgbWVtYmVyIHZhcmlhYmxlcyBzbyB0aGF0IGEgZnVsbHkgcXVhbGlmaWVkIHZhcmlhYmxlIG5hbWUKICAgICAgICAgICAgbWF0Y2hlcy4gRm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBib29sIE1WYXI6Om12YXIgIk15Qm9vbCIKICAgICAgICAgICAgICBzdHJ1Y3QgTVZhciB7CiAgICAgICAgICAgICAgICBib29sIG12YXI7CiAgICAgICAgICAgICAgfTsKCjIwMTMtMDEtMTE6IEJyYW50IEt5c2VyCgkgICAgW0phdmEsIEMjLCBEXSBTRiBCdWcgIzEyOTkgLSBGaXggZ2VuZXJhdGVkIG5hbWVzIGZvciB3aGVuICVuc3BhY2UgaXMgdXNlZCBvbgogICAgICAgICAgICBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0d28gZGlmZmVyZW50IG5hbWVzcGFjZXMuCgoyMDEzLTAxLTExOiBWbGFkaW1pciBLYWxpbmluCgkgICAgW0MjXSBBZGQgc3VwcG9ydCBmb3IgY3NkaXJlY3RvcmluICdwcmUnLCAncG9zdCcgYW5kICd0ZXJtaW5hdG9yJyBhdHRyaWJ1dGVzLgoKMjAxMy0wMS0wODogb2xseQoJICAgIFtQSFBdIEZpeCB0byB3b3JrIHdpdGggYSBaVFMgYnVpbGQgb2YgUEhQIChicm9rZW4gaW4gMi4wLjcpLgoKMjAxMy0wMS0wNzogb2xseQoJICAgIEZpeCBiYXNoaXNtIGluIGNvbmZpZ3VyZSwgaW50cm9kdWNlZCBpbiAyLjAuOS4KCjIwMTMtMDEtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFB1bGwgcGF0Y2ggIzQgZnJvbSBwdG9tdWxpayB0byBmaXggU0YgQnVnICMxMjk2IC0gRml4IGluY29ycmVjdCB3YXJuaW5nIGZvciB2aXJ0dWFsIGRlc3RydWN0b3JzCiAgICAgICAgICAgIGluIHRlbXBsYXRlcywgc3VjaCBhczoKICAgICAgICAgICAgIFdhcm5pbmcgNTIxOiBJbGxlZ2FsIGRlc3RydWN0b3IgbmFtZSBCPCBBID46On5CKCkuIElnbm9yZWQuCgoyMDEzLTAxLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQdWxsIHBhdGNoICMzIGZyb20gcHRvbXVsaWsgdG8gZml4IFNGIEJ1ZyAjMTI5NSAtIHN0YW5kYXJkIGV4Y2VwdGlvbnMgYXMKICAgICAgICAgICAgY2xhc3NlcyB1c2luZyB0aGUgU1dJR19TVERfRVhDRVBUSU9OU19BU19DTEFTU0VTIG1hY3JvLgoKMjAxMy0wMS0wNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFB1bGwgcGF0Y2ggIzIgZnJvbSBCcmFudEt5c2VyIHRvIGZpeCBTRiBCdWcgIzEyODMgLSBmaXggc21hcnQgcG9pbnRlcnMgaW4gY29uanVjdGlvbgogICAgICAgICAgICB3aXRoIGRpcmVjdG9ycy4KCjIwMTMtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQdWxsIHBhdGNoICMxIGZyb20gQnJhbnRLeXNlciB0byBmaXggU0YgQnVnICMxMjc4IC0gZml4IGRpcmVjdG9ycyBhbmQgbnNwYWNlIGZlYXR1cmUgd2hlbgogICAgICAgICAgICBtdWx0aWxldmVsIG5hbWVzcGFjZXMgYXJlIHVzZWQuCgpWZXJzaW9uIDIuMC45ICgxNiBEZWNlbWJlciAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0xMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdhcmJhZ2UgbGluZSBudW1iZXIgLyBlbXB0eSBmaWxlIG5hbWUgcmVwb3J0aW5nIGZvciBzb21lIG1pc3NpbmcKICAgICAgICAgICAgJ30nIG9yICcpJyBlcnJvciBtZXNzYWdlcy4KCjIwMTItMTItMTU6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoIDM1MzA0NDQsIENsYXNzI21ldGhvZHMgYW5kIENsYXNzI2NvbnN0YW50cyByZXR1cm5zIGFycmF5IG9mCiAgICAgICAgICAgIHN5bWJvbHMgaW4gUnVieSAxLjkrCgoyMDEyLTEyLTE0OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAzNTMwNDM5IGFuZCBmaW5hbGx5IHJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBTVFIyQ1NUUigpIG1hY3JvCiAgICAgICAgICAgIHdpdGggU3RyaW5nVmFsdWVQdHIoKS4gU1RSMkNTVFIgd2FzIGRlcHJlY2F0ZWQgc2luY2UgeWVhcnMgYW5kIGdvdCByZW1vdmVkIGluIFJ1YnkgMS45CgoyMDEyLTEyLTE0OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBsaWVkIHBhdGNoZXMgIzM1MzA0NDIgYW5kIDM1MzA0NDMgdG8gYWRhcHQgY29tcGlsZSBhbmQgcnVudGltZSBpbmNsdWRlCiAgICAgICAgICAgIHBhdGhzIHRvIG1hdGNoIFJ1YnkgMS45KwoKMjAxMi0xMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEZpeCAjMzE2MTYxNCAtIFNvbWUgc3RyaW5nIGNvbnN0YW50cyBhcmUgaW5jb3JyZWN0CgoyMDEyLTEyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gRml4ICMzNTI5NjkwIC0gRml4IGluY29ycmVjdCBjb25zdGFudCBuYW1lcy4KCjIwMTItMTItMTI6IGRyam9lCgkgICAgW1JdIGFkZCBmaXggdG8gZmluYWxpemVyIHRoYXQgd2FzIG1pc3NlZCBlYXJsaWVyCgoyMDEyLTEyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMzU5MDUyMiAtIGZ1bGx5IHF1YWxpZmllZCBwYWNrYWdlIHBhdGhzIGZvciBQeXRob24gMyBldmVuIGlmIGEgbW9kdWxlIGlzIGluIHRoZQogICAgICAgICAgICBzYW1lIHBhY2thZ2UuCgoyMDEyLTEyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBCdWcgIzM1NjM2NDcgLSBQeUludF9Gcm9tU2l6ZV90IHVuYXZhaWxhYmxlIHByaW9yIHRvIFB5dGhvbiAyLjUgZm9yIHVuc2lnbmVkIGludCB0eXBlcy4KCjIwMTItMTItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggYnVnICMzNTcxMzYxIC0gQysrIGNvbW1lbnQgaW4gQyB3cmFwcGVycy4KCjIwMTItMTItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggIzM1NzEwMjkgd2hpY2ggYWRkcyBtaXNzaW5nIGRpcmVjdG9yIHN1cHBvcnQgZm9yIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmLgoKMjAxMi0xMS0yODoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBTaW1wbGlmaWVkIG1vZHVsZSBsb2FkaW5nOiBub3cganVzdCB0aGUgc3ludGF4CiAgICAgICAgICAgICQgZXhhbXBsZTsKICAgICAgICAgICAgaXMgYWNjZXB0ZWQsIHdoaWNoIGxvYWRzIGZ1bmN0aW9ucyBnbG9iYWxseSBidXQgY29uc3RhbnRzIGFuZCB2YXJpYWJsZXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2NvcGUuCiAgICAgICAgICAgIFRoaXMgbWFrZSBtb2R1bGUgbG9hZGluZyBiZWhhdmlvdXIgcmVsaWFibHkgY29uc2lzdGVudCwgYW5kIHJlZHVjZXMgcHJvYmxlbXMgd2hlbiBsb2FkaW5nIG1vZHVsZXMgd2hpY2gKICAgICAgICAgICAgZGVwZW5kIG9uIG90aGVyIG1vZHVsZXMgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gcHJldmlvdXNseSBsb2FkZWQuCgoyMDEyLTExLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2ZmaV0gRml4IGp1bmsgb3V0cHV0IHdoZW4gd3JhcHBpbmcgc2luZ2xlIGNoYXJhY3RlciBsaXRlcmFsIGNvbnN0YW50cy4KCjIwMTItMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2wsIE1vZHVsYTNdIEFkZCBtaXNzaW5nIHN1cHBvcnQgZm9yIC1vdXRkaXIuCgoyMDEyLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnZmF1bHRzIHdoZW4gdXNpbmcgZmlsZW5hbWUgcGF0aHMgZ3JlYXRlciB0aGFuIDEwMjQgY2hhcmFjdGVycyBpbiBsZW5ndGguCgoyMDEyLTExLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2NhY2hlLXN3aWddIEFwcGx5IHBhdGNoICMzNTg2MzkyIGZyb20gRnJlZGVyaWsgRGV3ZWVyZHQgdG8gZml4IHNvbWUgZXJyb3IgY2FzZXMgLSBpbmNvcnJlY3RseSB1c2luZwogICAgICAgICAgICBtZW1vcnkgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVsZXRlZC4KCjIwMTItMTEtMDk6IHZ6ZWl0bGluCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBvdmVyZmxvdyB3aGVuIHBhc3NpbmcgdmFsdWVzIGdyZWF0ZXIgdGhhbiBMT05HX01BWCBmcm9tIFB5dGhvbiAzIGZvciBwYXJhbWV0ZXJzIHdpdGggdW5zaWduZWQgbG9uZyBDIHR5cGUuCgoyMDEyLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSBmZWF0dXJlIG1hdGNoaW5nIGlzc3VlcyBmb3IgaW1wbGljaXQgZGVzdHJ1Y3RvcnMgYW5kIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhbmQgaW1wbGljaXQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcnMgYWRkZWQgd2l0aCAlY29weWN0b3IuIFByZXZpb3VzbHkgYSBmZWF0dXJlIGZvciB0aGVzZSBoYWQgdG8gYmUgZnVsbHkgcXVhbGlmaWVkCiAgICAgICAgICAgIGluIG9yZGVyIHRvIG1hdGNoLiBOb3cgdGhlIGZvbGxvd2luZyB3aWxsIGFsc28gbWF0Y2g6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJ4eXoiKSB+WFhYKCk7CiAgICAgICAgICAgICAgc3RydWN0IFhYWCB7fTsKCjIwMTItMTEtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZ1cnRoZXIgY29uc2lzdGVuY3kgaW4gbmFtZWQgb3V0cHV0IHR5cGVtYXAgbG9va3VwcyBmb3IgaW1wbGljaXQgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQKICAgICAgICAgICAgaW1wbGljaXQgY29weSBjb25zdHJ1Y3RvcnMgYWRkZWQgd2l0aCAlY29weWN0b3IuIFByZXZpb3VzbHkgb25seSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgd2FzIGJlaW5nCiAgICAgICAgICAgIHVzZWQsIG5vdyB0aGUgdW5xdWFsaWZpZWQgbmFtZSB3aWxsIGFsc28gYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHByZXZpb3VzbHk6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozODogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZAoKICAgICAgICAgICAgTm93IHRoZSB1bnF1YWxpZmllZCBuYW1lIGlzIGFsc28gdXNlZDoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM4OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkIH5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZAoKMjAxMi0xMS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgc3VidGxlIG5hbWVkIG91dHB1dCB0eXBlbWFwIGxvb2t1cCBtaXNzZXMsIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSB3YXMgbm90IGFsd2F5cyBiZWluZwogICAgICAgICAgICB1c2VkIGZvciB2YXJpYWJsZXMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgR2xvYiB7CiAgICAgICAgICAgICAgICBpbnQgTXlWYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlIHNlYXJjaCBydWxlcyAoYXMgc2hvd24gYnkgLWRlYnVnLXRtc2VhcmNoKSBmb3IgdGhlIGdldHRlciB3cmFwcGVyIHdlcmU6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTo0NDogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiBpbnQgTXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQgTXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQKCiAgICAgICAgICAgIE5vdyB0aGUgc2NvcGUgaXMgbmFtZWQgY29ycmVjdGx5OgoKICAgICAgICAgICAgICBleGFtcGxlLmk6NDQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogaW50IEdsb2I6Ok15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IEdsb2I6Ok15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50CgoyMDEyLTEwLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlyZWN0b3IgdHlwZW1hcCBzZWFyY2hpbmcgc28gdGhhdCBhIHR5cGVtYXAgc3BlY2lmaWVkIHdpdGggYSBuYW1lIHdpbGwgYmUgY29ycmVjdGx5IG1hdGNoZWQuIFByZXZpb3VzbHkKICAgICAgICAgICAgdGhlIG5hbWUgd2FzIGlnbm9yZWQgZHVyaW5nIHRoZSB0eXBlbWFwIHNlYXJjaC4gQXBwbGllcyB0byB0aGUgZm9sbG93aW5nIGxpc3Qgb2YgdHlwZW1hcHM6IAogICAgICAgICAgICBkaXJlY3Rvcm91dCwgY3NkaXJlY3Rvcm91dCwgY3N0eXBlLCBpbXR5cGUsIGN0eXBlLCBkZGlyZWN0b3JvdXQsIGR0eXBlLCBnb3R5cGUsIGp0eXBlLCBqbmksIGphdmFkaXJlY3Rvcm91dC4KCjIwMTItMTAtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vc3Qgb2YgdGhlIHNwZWNpYWwgdmFyaWFibGVzIGF2YWlsYWJsZSBmb3IgdXNlIGluICVleGNlcHRpb24gYXJlIG5vdyBhbHNvIGF2YWlsYWJsZSBmb3IgZXhwYW5zaW9uIGluCiAgICAgICAgICAgICVleHRlbmQgYmxvY2tzLiBUaGVzZSBhcmU6ICRuYW1lICRzeW1uYW1lICRvdmVybmFtZSAkZGVjbCAkZnVsbGRlY2wgJHBhcmVudG5hbWUgJHBhcmVudHN5bW5hbWUsIHNlZSBkb2NzCiAgICAgICAgICAgIG9uICJDbGFzcyBleHRlbnNpb24iIGluIFNXSUdQbHVzLmh0bWwuIFBhdGNoIGJhc2VkIG9uIHN1Ym1pc3Npb24gZnJvbSBLcmlzIFRoaWVsZW1hbnMuCgoyMDEyLTEwLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRpdGlvbmFsIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBpbiAlZXhjZXB0aW9uIGFyZSBleHBhbmRlZCBhcyBmb2xsb3dzOgogICAgICAgICAgICAgICRwYXJlbnRuYW1lIC0gVGhlIHBhcmVudCBjbGFzcyBuYW1lIChpZiBhbnkpIGZvciBhIG1ldGhvZC4KICAgICAgICAgICAgICAkcGFyZW50c3ltbmFtZSAtIFRoZSB0YXJnZXQgbGFuZ3VhZ2UgcGFyZW50IGNsYXNzIG5hbWUgKGlmIGFueSkgZm9yIGEgbWV0aG9kLgoKMjAxMi0xMC0wODogaWFudAoJICAgIFtHb10gR2VuZXJhdGluZyBHbyBjb2RlIG5vdyByZXF1aXJlcyB1c2luZyB0aGUgLWludGdvc2l6ZSBvcHRpb24gdG8KCSAgICBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgJ2ludCcgdHlwZSBpbiBHby4gIFRoaXMgaXMgYmVjYXVzZSB0aGUKCSAgICBzaXplIG9mIHRoZSB0eXBlIGlzIGNoYW5naW5nIGZyb20gR28gMS4wIHRvIEdvIDEuMSBmb3IgeDg2XzY0LiAKCjIwMTItMDktMTQ6IHdzZnVsdG9uCgkgICAgQWRkIG5ldyB3YXJuaW5nIGlmIHRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGlzIHVzZWQgYXMgYSBiYXNlIGNsYXNzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEJhc2Uge307CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgQmFzZTxpbnQ+OwogICAgICAgICAgICAgIGNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZTxpbnQ+IHt9OwoKICAgICAgICAgICAgZ2l2ZXMgdGhlIGZvbGxvd2luZyB3YXJuaW5nIGluc3RlYWQgb2Ygc2lsZW50bHkgaWdub3JpbmcgdGhlIGJhc2U6CgogICAgICAgICAgICBjcHBfaW5oZXJpdC5pOjUyOiBXYXJuaW5nIDQwMTogQmFzZSBjbGFzcyAnQmFzZTwgaW50ID4nIGhhcyBubyBuYW1lIGFzIGl0IGlzIGFuIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRlZCB3aXRoICcldGVtcGxhdGUoKScuIElnbm9yZWQuCiAgICAgICAgICAgIGNwcF9pbmhlcml0Lmk6NTE6IFdhcm5pbmcgNDAxOiBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBtdXN0IGJlIHdyaXR0ZW4gYmVmb3JlICdCYXNlPCBpbnQgPicgaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MgYW5kIGJlIGRlY2xhcmVkIHdpdGggYSBuYW1lLgoKCjIwMTItMDktMTE6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMzUzNTMwNCAtIERpcmVjdCB1c2Ugb2YgYSB3ZWFrIGdsb2JhbCByZWZlcmVuY2UgaW4gZGlyZWN0b3JzCiAgICAgICAgICAgIHNvbWV0aW1lcyBjYXVzaW5nIHNlZyBmYXVsdHMgZXNwZWNpYWxseSBvbiBBbmRyb2lkLgoKMjAxMi0wOS0wNjogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzIHRvIGFjY2VwdCBOVUxMIHN0cmluZy4KCjIwMTItMDgtMjY6IGRyam9lCgkgICAgW1JdIG1ha2UgRXh0ZXJuYWxSZWZlcmVuY2Ugc2xvdCByZWYgdG8gY29udGFpbiByZWZlcmVuY2UKCjIwMTItMDgtMjY6IGRyam9lCgkgICAgW1JdIGZpeCBFeGFtcGxlcy9NYWtlZmlsZSB0byB1c2UgQyBpbiAkKENDKSByYXRoZXIgdGhhbiAkKENYWCkKClZlcnNpb24gMi4wLjggKDIwIEF1Z3VzdCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBZGQgc2l6ZV90eXBlLCB2YWx1ZV90eXBlLCBjb25zdF9yZWZlcmVuY2UgdG8gdGhlIFNUTCBjb250YWluZXJzLgoKMjAxMi0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIGRpc2NhcmQgYW5kIGFkZCBtZXRob2RzIHRvIHN0ZDo6c2V0IHdyYXBwZXJzIHNvIHRoYXQgcHlhYmMuaSBjYW4gYmUgdXNlZCBlbnN1cmluZwogICAgICAgICAgICBNdXRhYmxlU2V0IGlzIGEgdmFsaWQgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RkOjpzZXQuIEFzIHJlcG9ydGVkIGJ5IEFsZXhleSBTb2tvbG92LgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0ZDo6bXVsdGlzZXQuCgoyMDEyLTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzM1NDE3NDQgLSBNaXNzaW5nIFB5SW50X0Zyb21TaXplX3QgY2FsbHMgZm9yIFB5dGhvbiAzLgoKMjAxMi0wOC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gRGF2aWQgQmF1bSB0byBhZGQgdGhlIGFzc3VtZW92ZXJyaWRlIGZlYXR1cmUgZm9yIEphdmEgZGlyZWN0b3JzIHRvCiAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBhbGwgb3ZlcnJpZGRlbiBtZXRob2RzIGNhbiBiZSBhc3N1bWVkIHRvIGJlIG92ZXJyaWRkZW4uCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMzUzMDAyMSBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcuCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAjMzUzNjM2MCAtIEludmFsaWQgY29kZSBzb21ldGltZXMgYmVpbmcgZ2VuZXJhdGVkIGZvciBkaXJlY3RvciBtZXRob2RzCiAgICAgICAgICAgIHdpdGggbWFueSBhcmd1bWVudHMuCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gIzM1NDU4NzcgLSBEb24ndCB1bmRlZmluZSBib29sIGlmIGRlZmluZWQgYnkgQzk5IHN0ZGJvb2wuaCAtIHByb2JsZW0gdXNpbmcgCiAgICAgICAgICAgIFBlcmwgNS4xNiBhbmQgbGF0ZXIuCgoyMDEyLTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgaW5jb3JyZWN0IHdhcm5pbmcgKDMxNCkgYWJvdXQgdGFyZ2V0IGxhbmd1YWdlIGtleXdvcmRzIHdoaWNoIHdlcmUgdHJpZ2dlcmVkCiAgICAgICAgICAgIGJ5IHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgdXNpbmcgZGlyZWN0aXZlcy4gRm9yIGV4YW1wbGUgJ3N0cmluZycgaXMgYSBrZXl3b3JkIGluIEMjOgogICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgeyBjbGFzcyBzdHJpbmc7IH0KICAgICAgICAgICAgICB1c2luZyBzdGQ6OnN0cmluZzsKCjIwMTItMDctMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXNwbGF5IG9mIHBvaW50ZXJzIGluIHZhcmlvdXMgcGxhY2VzIG9uIDY0IGJpdCBzeXN0ZW1zIC0gb25seSAzMiBiaXRzIHdlcmUgYmVpbmcgc2hvd24uCgoyMDEyLTA3LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2RiIGRlYnVnZ2VyIGZ1bmN0aW9ucyAnc3dpZ3ByaW50JyBhbmQgJ2xvY3N3aWdwcmludCcgdG8gZGlzcGxheSB0byB0aGUgZ2RiIG91dHB1dCB3aW5kb3cKICAgICAgICAgICAgcmF0aGVyIHRoYW4gc3Rkb3V0LiBUaGlzIGZpeGVzIGRpc3BsYXkgcHJvYmxlbXMgaW4gZ2RidHVpIGFuZCB0aGUgZW5zdXJlcyB0aGUgb3V0cHV0CiAgICAgICAgICAgIGFwcGVhcnMgd2hlcmUgZXhwZWN0ZWQgaW4gb3RoZXIgZ2RiIGJhc2VkIGRlYnVnZ2VycyBzdWNoIGFzIEVjbGlwc2UgQ0RULgoKMjAxMi0wNy0yMDoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBzZWdmYXVsdC1vbi1leGl0IHByZXZlbnRpb24gaGFjayBub3cgcHJlc2VydmVzIGV4aXQgc3RhdHVzLCBhbmQgdXNlcyBDOTkgX0V4aXQoKS4KCjIwMTItMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBEZWJpYW4gYnVnIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvNjcyMDM1LCB0eXBlbWFwIGNvcHkgZmFpbHVyZSAtIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCAKICAgICAgICAgICAgaW4gc3dpZy0yLjAuNToKICAgICAgICAgICAgICAlaW5jbHVkZTxzdGwuaT4KICAgICAgICAgICAgICB1c2luZyBzdGQ6OnBhaXI7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFN0clBhaXIpIHBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjsKCjIwMTItMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgc28gdGhhdAogICAgICAgICAgICB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlIGZvciB0ZW1wbGF0ZXMuIEV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRoaW5nMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUaGluZzIge307CiAgICAgICAgICAgICAgLy8gU1RJTEwgQlJPS0VOIHZvaWQgdXNlaXQyKFRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJhKE91dGVyMjo6U3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYig6Ok91dGVyMjo6U3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYyhTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICB2b2lkIHVzZWl0MmQoU3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFRoaW5nMkludCkgVGhpbmcyPGludD47CgoKMjAxMi0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHRlbXBsYXRlIG5hbWVzcGFjZSBwcm9ibGVtcyBmb3Igc3ltYm9scyBkZWNsYXJlZCB3aXRoIGEgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTEgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBZWVk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgU3BhY2UyOjpZWVkgewogICAgICAgICAgICAgICAgICBUIHl5eShUIGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgfSAgICAKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkxKFNwYWNlMTo6U3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTIoU3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTMoOjpTcGFjZTE6OlNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldGVtcGxhdGUoWVlZSW50KSBTcGFjZTE6OlNwYWNlMjo6WVlZPGludD47CgoyMDEyLTA2LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbmFtZXNwYWNlIHByb2JsZW1zIGZvciBzeW1ib2xzIGRlY2xhcmVkIHdpdGggYSBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucywgc3VjaCBhczoKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMSB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IFhYWDsKICAgICAgICAgICAgICAgICAgc3RydWN0IFlZWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzdHJ1Y3QgU3BhY2UyOjpZWVkge307CiAgICAgICAgICAgICAgICBzdHJ1Y3QgU3BhY2UxOjpTcGFjZTI6OlhYWCB7fTsKCiAgICAgICAgICAgICAgICB2b2lkIHRlc3RYWFgyKFNwYWNlMjo6WFhYIHh4KSB7fQogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMihTcGFjZTI6OllZWSB5eSkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aGVyZSB4eCBhbmQgeXkgd2VyZSBub3QgcmVjb2duaXNlZCBhcyB0aGUgcHJveHkgY2xhc3NlcyBYWFggYW5kIFlZWS4KCjIwMTItMDYtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgc28gdGhhdAogICAgICAgICAgICB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlLiAKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOwogICAgICAgICAgICAgIHVzaW5nIFNwYWNlMjo6VGhpbmcyOwogICAgICAgICAgICAgIGNsYXNzIFRoaW5nMiB7fTsKICAgICAgICAgICAgICAvLyBOb25lIG9mIHRoZSBtZXRob2RzIGJlbG93IGNvcnJlY3RseSB1c2VkIHRoZSBUaGluZzIgcHJveHkgY2xhc3MKICAgICAgICAgICAgICB2b2lkIHVzZWl0MihUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmEoT3V0ZXIyOjpTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYig6Ok91dGVyMjo6U3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmMoU3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIHZvaWQgdXNlaXQyZChTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIH0KCjIwMTItMDYtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHNvIHRoYXQgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZS4KICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyIHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOyAvLyB1c2luZyBkaXJlY3RpdmUKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsgLy8gdXNpbmcgZGVjbGFyYXRpb24KICAgICAgICAgICAgICB2b2lkIHVzZWl0MihUaGluZzIgdCkge30KCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgdGVtcGxhdGVkIGNsYXNzZXMuCgoyMDEyLTA1LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM1Mjk2MDEgLSBzZWcgZmF1bHQgd2hlbiBhIHByb3RlY3RlZCBtZXRob2QgaGFzIHRoZSAiZGlyZWN0b3IiCiAgICAgICAgICAgIGZlYXR1cmUgYnV0IHRoZSBwYXJlbnQgY2xhc3MgZG9lcyBub3QuIEFsc28gZml4IHNpbWlsYXIgcHJvYmxlbXMgd2l0aAogICAgICAgICAgICB0aGUgYWxscHJvdGVjdGVkIGZlYXR1cmUuCgoyMDEyLTA1LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IHdoZW4gYXR0ZW1wdGluZyB0byB3YXJuIGFib3V0IGFuIGlsbGVnYWwgZGVzdHJ1Y3RvciAtICMzNTMwMDU1LCAzNTMwMDc4IGFuZCAjMzUzMDExOC4KClZlcnNpb24gMi4wLjcgKDI2IE1heSAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KMjAxMi0wNS0yNjogd3NmdWx0b24KICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZW1hcCBtb2RpZmljYXRpb25zIHNvIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHkgZm9yIG90aGVyIHN0cmluZwogICAgICAgICAgICBjbGFzc2VzLgoKMjAxMi0wNS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4ZXMgZm9yIC1leHRlcm5hbC1ydW50aW1lIHRvIHdvcmsgYWdhaW4uCgoyMDEyLTA1LTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBEaXNhbWJpZ3VhdGUgU1dJR19Gcm9tX3Vuc2lnbmVkX1NTX2ludCBhbmQgU1dJR19Gcm9tX3Vuc2lnbmVkX1NTX2xvbmcuCgoyMDEyLTA1LTE4OiBvbGx5CgkgICAgW1BIUF0gRml4IGdldHRlcnMgZm9yIHRlbXBsYXRlIG1lbWJlcnMuIChTRiMzNDI4ODMzLCBTRiMzNTI4MDM1KQoKMjAxMi0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgbGFuZ3VhZ2UncyBzdGQ6Om1hcCB3cmFwcGVycyB0byByZWNvZ25pc2UgZGlmZmVyZW5jZV90eXBlLCBzaXplX3R5cGUsIGtleV90eXBlCiAgICAgICAgICAgIGFuZCBtYXBwZWRfdHlwZS4KCjIwMTItMDUtMTQ6IGt3d2V0dGUgKHNpZ25lZCBvZmYgYnkgeGF2aWVyOTgpCiAgICAgICAgICAgIFtPY3RhdmVdIFByZXZlbnQgT2N0YXZlIGZyb20gc2VnLWZhdWx0aW5nIGF0IGV4aXQgd2hlbiBTV0lHCiAgICAgICAgICAgIG1vZHVsZXMgYXJlIGxvYWRlZCwgZHVlIHRvIGJ1Z3MgaW4gT2N0YXZlJ3MgY2xlYW51cCBjb2RlOgogICAgICAgICAgICAqIFdyYXBwaW5nIGZ1bmN0aW9ucyBub3cgZGVjbGFyZWQgd2l0aCBPY3RhdmUgREVGVU5fRExEIG1hY3JvLAogICAgICAgICAgICAgIGFuZCBsb2FkZWQgdGhyb3VnaCBPY3RhdmUncyBkeW5hbWljIG1vZHVsZSBsb2FkZXIKICAgICAgICAgICAgKiBHbG9iYWwgdmFyaWFibGVzIG9mIHN3aWdyZWYgdHlwZSBhcmUgbm93IGFzc2lnbmVkIGEgbmV3KCkKICAgICAgICAgICAgICBjb3B5IG9mIHRoZSBzd2lncmVmIGNsYXNzLCB0byBwcmV2ZW50IGRvdWJsZS1mcmVlIGVycm9ycwogICAgICAgICAgICAqIFNXSUcgbW9kdWxlIGF0LWV4aXQgY2xlYW51cCBmdW5jdGlvbiBub3cgY3JlYXRlZCBpbiBPY3RhdmUKICAgICAgICAgICAgICB0aHJvdWdoIGV2YWwoKSwgc28gbm90IGRlcGVuZGVudCBvbiBsb2FkZWQgLm9jdCBsaWJyYXJ5CiAgICAgICAgICAgICogRm9yIE9jdGF2ZSB2ZXJzaW9ucyAzLjEuKiB0byAzLjMuKiwgcmVnaXN0ZXIgQy1sZXZlbCBhdC1leGl0CiAgICAgICAgICAgICAgZnVuY3Rpb24gd2hpY2ggdGVybWluYXRlcyBPY3RhdmUgaW1tZWRpYXRlbHkgKHdpdGggY29ycmVjdAogICAgICAgICAgICAgIHN0YXR1cyBjb2RlKSB3aXRob3V0IHBlcmZvcm1pbmcgbWVtb3J5IGNsZWFudXAuIFRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICBjYW4gYmUgY29udHJvbGxlZCB3aXRoIG1hY3JvcyBpbiBMaWIvb2N0YXZlL29jdHJ1bnRpbWUuc3dnCgogICAgICAgICAgICBbT2N0YXZlXSBOZXcgc3ludGF4IGZvciBkZXRlcm1pbmcgd2hldGhlciBTV0lHIG1vZHVsZSBzaG91bGQgYmUKICAgICAgICAgICAgbG9hZGVkIGdsb2JhbGx5IG9yIG5vbi1nbG9iYWxseS4gVG8gbG9hZCBtb2R1bGUgImV4YW1wbGUiIGdsb2JhbGx5LAogICAgICAgICAgICB0eXBlIHRoZSBtb2R1bGUgbmFtZQogICAgICAgICAgICAkIGV4YW1wbGU7CiAgICAgICAgICAgIGFzIGJlZm9yZTsgdG8gbG9hZCBtb2R1bGUgbm9uLWdsb2JhbGx5LCBhc3NpZ24gaXQgdG8gYSB2YXJpYWJsZToKICAgICAgICAgICAgJCBleGFtcGxlID0gZXhhbXBsZTsKICAgICAgICAgICAgb3IKICAgICAgICAgICAgJCBleCA9IGV4YW1wbGU7CiAgICAgICAgICAgIGZvciBhIHNob3J0ZXIgKGxvY2FsKSBtb2R1bGUgbmFtZS4gLWdsb2JhbC8tbm9nbG9iYWwgY29tbWFuZC1saW5lCiAgICAgICAgICAgIG9wdGlvbnMgYW5kIG1vZHVsZSBjb21tYW5kIGxpbmUgYXJlIGRlcHJlY2F0ZWQuIEFkZGVkIHVzYWdlIGluZm8KICAgICAgICAgICAgdG8gbW9kdWxlLCBzbyB0eXBpbmcKICAgICAgICAgICAgJCBoZWxwIGV4YW1wbGUKICAgICAgICAgICAgb3IgaW5jb3JyZWN0IHVzYWdlIHNob3VsZCBkaXNwbGF5IHByb3BlciB1c2FnZSwgd2l0aCBleGFtcGxlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTItMDUtMTI6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gY29kZSBnZW5lcmF0ZWQgZm9yIGEgY2FsbGJhY2suICBQYXRjaCBmcm9tCgkgICAgU0YgYnVnICMzNTEwODA2LgoKMjAxMi0wNS0xMjogb2xseQoJICAgIFtQSFBdIEF2b2lkIHVzaW5nIHplbmRfZXJyb3Jfbm9yZXR1cm4oKSBhcyBpdCBkb2Vzbid0IHdvcmsgd2l0aCBhbGwKCSAgICBidWlsZHMgb2YgUEhQIChTRiBidWcgIzMxNjY0MjMpLiAgSW5zdGVhZCB3ZSBub3cgd3JhcCBpdCBpbiBhCgkgICAgU1dJR19GQUlMKCkgZnVuY3Rpb24gd2hpY2ggd2UgYW5ub3RhdGUgYXMgIm5vcmV0dXJuIiBmb3IgR0NDIHRvCgkgICAgYXZvaWRzIHdhcm5pbmdzLiAgVGhpcyBhbHNvIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvbXBpbGVkCgkgICAgd3JhcHBlciAoZS5nLiB0aGUgc3RyaXBwZWQgc2l6ZSBpcyByZWR1Y2VkIGJ5IDYlIGZvciBYYXBpYW4ncyBQSFAKCSAgICBiaW5kaW5ncykuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI4NTUgRml4IHVuaW50ZW5kZWQgdW5pbml0aWFsaXNlZCBtZW1vcnkgYWNjZXNzIGluIE9VVFBVVCB0eXBlbWFwcy4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiBwYXRjaCAjMzUyMjY3NCBGaXggcG9zc2libGUgdW5pbml0aWFsaXNlZCBtZW1vcnkgYWNjZXNzIGluIGNoYXIgKipTVFJJTkdfT1VUCiAgICAgICAgICAgIHR5cGVtYXAuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI2MTEgRml4IHVuaW5pdGlhbGlzZWQgc2l6ZSByZWdyZXNzaW9uIGluIGNoYXIgKipTVFJJTkdfQVJSQVkKICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTIuMC42LgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgU0YgYnVnICMzNTI1MDUwIC0gRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTIuMC41IHdoZXJlYnkgZGVmaW5pbmcgb25lIHR5cGVtYXAKICAgICAgICAgICAgbWV0aG9kIHN1Y2ggYXMgYW4gJ291dCcgdHlwZW1hcCBtYXkgaGlkZSBhbm90aGVyIHR5cGVtYXAgbWV0aG9kIHN1Y2ggYXMgYW4gJ2luJyB0eXBlbWFwIC0KICAgICAgICAgICAgb25seSBvY2N1cnMgd2hlbiB0aGUgdHlwZSBpcyBhIHRlbXBsYXRlIHR5cGUgd2hlcmUgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lCiAgICAgICAgICAgIHZpYSBhIHR5cGVkZWYuCgoyMDEyLTA1LTEwOiBvbGx5CgkgICAgW1BIUF0gRml4IHRoZSBjb25zdGFudCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUsIGV0YyAtIHByZXZpb3VzbHkKCSAgICB0aGVzZSB1c2VkIHRoZSB3cm9uZyBuYW1lIGZvciByZW5hbWVkIGNvbnN0YW50cy4gIEFkZAoJICAgIGF1dG9kb2NfcnVubWUucGhwIHRvIHRoZSB0ZXN0c3VpdGUgYXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoaXMuCgoyMDEyLTA1LTAyOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gUmVtb3ZlIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBmb3IgZ2NjZ28gNC42LiAgVXNpbmcKCSAgICBTV0lHIHdpdGggZ2NjZ28gd2lsbCBub3cgcmVxdWlyZSBnY2NnbyA0LjcuICBVc2luZyBTV0lHCgkgICAgd2l0aCB0aGUgbW9yZSBjb21tb25seSB1c2VkIGdjIGNvbXBpbGVyIGlzIHVuYWZmZWN0ZWQuCgoyMDEyLTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIEMgZm9yd2FyZCBlbnVtIGRlY2xhcmF0aW9ucyBpbiBzb21lIGxhbmd1YWdlcy4KClZlcnNpb24gMi4wLjYgKDMwIEFwcmlsIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA0LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSBpbiBTV0lHVFlQRSAqKk9VVFBVVCB0eXBlbWFwcyBhcyByZXBvcnRlZCBieSBKaW0gQW5kZXJzb24uCgoyMDEyLTA0LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggY29tcGlsYXRpb24gZXJyb3JzIHdoZW4gd3JhcHBpbmcgU1RMIGNvbnRhaW5lcnMgb24gTWFjIE9TWCBhbmQgcG9zc2libHkgb3RoZXIgc3lzdGVtcy4KCjIwMTItMDQtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAzNTIxODExIGZyb20gTGVvIERhdmlzIC0gY2hhciAqKlNUUklOR19BUlJBWSB0eXBlbWFwcyBmaXhlZCB0byBoYW5kbGUKICAgICAgICAgICAgbnVsbCBwb2ludGVycy4KClZlcnNpb24gMi4wLjUgKDE5IEFwcmlsIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSBwYXRjaCAjMzUxNzQzNSBmcm9tIE1pbGVzIEJhZGVyIC0gcHJlZmVyIHRvIHVzZSBMdWFfcHVzaGdsb2JhbHRhYmxlCgoyMDEyLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzM1MTc3NjkgZnJvbSBSb2JpbiBTdG9ja2VyIHRvIGZpeCBjb21waWxlIGVycm9yIG9uIE1hY1J1YnkgdXNpbmcgUlNUUklOR19QVFIuCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzUxMTAwOSBmcm9tIExlaWYgTWlkZGVsc2NodWx0ZSBmb3Igc2xpZ2h0bHkgb3B0aW1pc2VkIGNoYXIgKiB2YXJpYWJsZSB3cmFwcGVycy4KCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFwcGx5ICMzMjE5Njc2IGZyb20gU2hhbmUgTGllc2VnYW5nIHdoaWNoIGFkZHM6CiAgICAgICAgICAgIC0gc3VwcG9ydCBmb3IgJWZhY3RvcnkKICAgICAgICAgICAgLSBhIF9fdG9zdHJpbmcgbWV0aG9kCiAgICAgICAgICAgIC0gYSBfX2Rpc293biBtZXRob2QKCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEFwcGx5ICMzNTEzNTY5IHdoaWNoIGFkZHMgYSBjYXRjaGxpc3QgdG8gdGhlIHhtbCBvdXRwdXQuCgoyMDEyLTA0LTA1OiBvbGx5CgkgICAgW0x1YV0gQWRkIHN1cHBvcnQgZm9yIEx1YSA1LjIgKHBhdGNoIFNGIzM1MTQ1OTMgZnJvbSBNaWxlcyBCYWRlcikKCjIwMTItMDMtMjY6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gQXBwbHkgcGF0Y2ggIzM0MjU5OTMgZnJvbSBqZ2lsbGlzOiBhZGQgZXh0cmEgbG9naWMgdG8gdGhlIG9jdGF2ZV9zd2lnX3R5cGU6OmRpbXModm9pZCkgbWV0aG9kOiBpdCBjaGVja3MgaWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBfX2RpbXNfXyBtZXRob2QgYW5kIHVzZXMgdGhpcyBpbiBzdGVhZCBvZiByZXR1cm5pbmcgKDEsMSkKCSAgICBbb2N0YXZlXSBBcHBseSBwYXRjaCAjMzQyNDgzMyBmcm9tIGpnaWxsaXM6IG1ha2UgaXNfb2JqZWN0IHJldHVybiB0cnVlIGZvciBzd2lnIHR5cGVzCgoyMDEyLTAzLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbRF0gQXBwbHkgIzM1MDI0MzEgdG8gZml4IGR1cGxpY2F0ZSBzeW1ib2xzIGluIG11bHRpcGxlIG1vZHVsZXMuCgoyMDEyLTAzLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0OTQ3OTEgLSAlJGlzZ2xvYmFsIGZvciAlcmVuYW1lIG1hdGNoaW5nLgoKMjAxMi0wMy0yMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDg3NzA2IGFuZCAjMzM5MTkwNiAtIG1pc3Npbmcgc3RkZGVmLmggaW5jbHVkZSBmb3IgcHRyZGlmZl90IHdoZW4gdXNpbmcgJWltcG9ydAogICAgICAgICAgICBmb3IgU1RMIGNvbnRhaW5lcnMgYW5kIGNvbXBpbGluZyB3aXRoIGcrKy00LjYuIEFuIGluY2x1ZGUgb2Ygc3RkZGVmLmggaXMgbm93IG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gU1dJRyBnZW5lcmF0ZXMgU1RMIGhlbHBlciB0ZW1wbGF0ZXMgd2hpY2ggcmVxdWlyZSBwdHJkaWZmX3QuIElmIHlvdSAKICAgICAgICAgICAgd2VyZSBwcmV2aW91c2x5IHJlbHlpbmcgb24gIiNpbmNsdWRlIDxzdGRkZWYuaD4iIGFsd2F5cyBiZWluZyBnZW5lcmF0ZWQgd2hlbiB1c2luZyBhCiAgICAgICAgICAgICVpbmNsdWRlIG9mIGFuIFNUTCBoZWFkZXIsIHlvdSBtYXkgbm93IG5lZWQgdG8gYWRkIHRoaXMgaW4gbWFudWFsbHkuCgoyMDEyLTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzM5MjI2NCBmcm9tIFNlYmFzdGllbiBCaW5lIHRvIHBhcnNlICh1bnNpZ25lZCkgbG9uZyBsb25nIHR5cGVzIGluIGVudW0gdmFsdWUgYXNzaWdubWVudC4KCjIwMTItMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNTA1NTMwIGZyb20gS2FybCBXZXR0ZSB0byBhbGxvdyBjdXN0b20gYWxsb2NhdG9ycyBpbiBTVEwgc3RyaW5nIGNsYXNzZXMgZm9yIHRoZSBVVEwgbGFuZ3VhZ2VzLgoKMjAxMi0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM0NjgzNjIgZnJvbSBLYXJsIFdldHRlIHRvIGZpeCAlaW5jbHVkZSBpbnNpZGUgJWRlZmluZS4KCjIwMTItMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jdGF2ZSwgUl0gRml4ICMzNDc1NDkyIC0gaXRlcmF0aW5nIHRocm91Z2ggc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb2YgZW51bWVyYXRpb25zLgoKMjAxMi0wMi0yNzogeGF2aWVyOTggKHBhdGNoZXMgZnJvbSBLYXJsIFdldHRlKQoJICAgIFtPY3RhdmVdIFVzZSAtZ2xvYmFscyAuIHRvIGxvYWQgZ2xvYmFsIHZhcmlhYmxlcyBpbiBtb2R1bGUgbmFtZXNwYWNlCgkgICAgW09jdGF2ZV0gQ29tbWVudCBkZWNsYXJhdGlvbiBvZiB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIHN3aWdfcmVnaXN0ZXJfZGlyZWN0b3IKCSAgICBbT2N0YXZlXSBGaXggT0NUQVZFX1BBVEggaW4gb2N0YXZlIE1ha2VmaWxlcwoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBzdGQ6Omxpc3QgLSBmaXggbGlfc3RkX2NvbnRhaW5lcnNfaW50IHRlc3QKCSAgICBbT2N0YXZlXSBGaXggaW1wb3J0cyB0ZXN0CgoyMDEyLTAyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTWFrZSBnZW5lcmF0ZWQgc3VwcG9ydCBmdW5jdGlvbnMgaW4gYXJyYXlzX2phdmEuaSBzdGF0aWMgc28gdGhhdCBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICBmcm9tIG11bHRpcGxlIGluc3RhbmNlcyBvZiBTV0lHIGNhbiBiZSBjb21waWxlZCBhbmQgbGlua2VkIHRvZ2V0aGVyIC0gcHJvYmxlbSByZXBvcnRlZCBieQogICAgICAgICAgICBFdmFuIEtyYXVzZS4KCjIwMTItMDEtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjcmFzaCB3aXRoIGJhZCByZWdleCAtIGJ1ZyAjMzQ3NDI1MC4KCjIwMTItMDEtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBQeXRob24gc3RlcHBlZCBzbGljaW5nIHN1cHBvcnQgdG8gdGhlIFNUTCB3cmFwcGVycyAoc3RkOjp2ZWN0b3IsIHN0ZDo6bGlzdCkuCiAgICAgICAgICAgIEFzc2lnbmluZyB0byBhIHNsaWNlLCByZWFkaW5nIGEgc2xpY2UgYW5kIGRlbGV0aW5nIGEgc2xpY2Ugd2l0aCBzdGVwcyBub3cgd29yay4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD4KCiAgICAgICAgICAgICAgdmkgPSB2ZWN0b3JfaShyYW5nZSgxMCkpCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICB2aVsxOjQ6Ml0gPSBbMTExLCAzMzNdCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICBkZWwgdmlbMzoxMDozXQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aVs6Oi0xXSkKCiAgICAgICAgICAgIGdpdmVzIChzYW1lIGJlaGF2aW91ciBhcyBuYXRpdmUgUHl0aG9uIHNlcXVlbmNlcyBzdWNoIGFzIGxpc3QpOgoKICAgICAgICAgICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KICAgICAgICAgICAgICBbMCwgMTExLCAyLCAzMzMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgICAgICAgICAgWzAsIDExMSwgMiwgNCwgNSwgNywgOF0KICAgICAgICAgICAgICBbOCwgNywgNSwgNCwgMiwgMTExLCAwXQoKMjAxMi0wMS0yMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIENvcnJlY3RseSBhbm5vdGF0ZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIEMgbGlua2FnZS4KICAgICAgICAgICAgW0RdIEV4Y2VwdGlvbiBhbmQgRXJyb3IgaGF2ZSBiZWNvbWUgYmxlc3NlZCBuYW1lczsgcmVtb3ZlZCBkX2V4Y2VwdGlvbl9uYW1lIHRlc3QgY2FzZS4KCjIwMTItMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzb21lIGluZGV4aW5nIGJ1Z3MgaW4gUHl0aG9uIFNUTCB3cmFwcGVycyB3aGVuIHRoZSBpbmRleCBpcyBuZWdhdGl2ZSwgZWc6CgogICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD4KCiAgICAgICAgICAgICAgaXY9dmVjdG9yX2koWzAsMSwyLDMsNCw1XSkKICAgICAgICAgICAgICBpdlstNzpdCgogICAgICAgICAgICBub3cgcmV0dXJucyBbMCwgMSwgMiwgMywgNCwgNV0gaW5zdGVhZCBvZiBbNV0uCgogICAgICAgICAgICAgIHZ2Wzc6OV0gPSBbMjIsMzNdCgogICAgICAgICAgICBub3cgcmV0dXJucyBbMCwgMSwgMiwgMywgNCwgNSwgMjIsIDMzXSBpbnN0ZWFkIG9mICJpbmRleCBvdXQgcmFuZ2UiIGVycm9yLgoKICAgICAgICAgICAgQWxzbyBmaXggc29tZSBzZWdmYXVsdHMgd2hlbiByZXBsYWNpbmcgcmFuZ2VzLCBlZyB3aGVuIGlsIGlzIGEgc3RkOjpsaXN0IHdyYXBwZXI6CgogICAgICAgICAgICAgIGlsWzA6Ml0gPSBbMTFdCgoyMDEyLTAxLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9uIHdpdGhpbiBhIGNsYXNzIHdoZW4gdXNlZCBhcyBhIGJhc2UuCgoyMDEyLTAxLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBzdXBwb3J0IGZvciAlbnNwYWNlIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMjAxMi0wMS0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMzNDUyNTYwIGZyb20gQnJhbnQgS3lzZXIgLSBhZGQgc3VwcG9ydCBmb3IgJW5zcGFjZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTEtMTItMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSAnZGlyZWN0b3JpbicgdHlwZW1hcCBub3cgYWNjZXB0cyAkMSwgJDIgZXRjIGV4cGFuc2lvbnMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gdXNlIHdvcmthcm91bmRzIC0KICAgICAgICAgICAgJDFfbmFtZSwgJDJfbmFtZSBldGMuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIGRpcmVjdG9yIHR5cGVtYXBzLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBHbywgSmF2YSwgRF0gQWRkIHN1cHBvcnQgZm9yIHRoZSAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXAuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2NhbWwsIE9jdGF2ZSwgUEhQLCBQeXRob24sIFJ1YnldIENvcnJlY3Qgc3BlY2lhbCB2YXJpYWJsZXMgaW4gJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwLgogICAgICAgICAgICBUaGlzIGNoYW5nZSB3aWxsIGJyZWFrIGFueSAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXBzIHlvdSBtYXkgaGF2ZSB3cml0dGVuLiBQbGVhc2UgY2hhbmdlOgogICAgICAgICAgICAgICRyZXN1bHQgdG8gJDEKICAgICAgICAgICAgICAkaW5wdXQgdG8gJHJlc3VsdAoKICAgICAgICAgICAgQWxzbyBmaXggdGhlIG5hbWVkICdkaXJlY3RvcmFyZ291dCcgRElSRUNUT1JPVVQgdHlwZW1hcHMgZm9yIHRoZXNlIGxhbmd1YWdlcyB3aGljaCBkaWRuJ3QKICAgICAgICAgICAgcHJldmlvdXNseSBjb21waWxlIGFuZCBhZGQgaW4gJDEsICQyIGV0YyBleHBhbnNpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDExLTEyLTEwOiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNXSUdfZXJyb3IoKSBub3cgZ2V0cyBkZWNvcmF0ZWQgd2l0aCBwZXJsIHNvdXJjZSBmaWxlL2xpbmUgbnVtYmVyLgogICAgICAgICAgICBbcGVybDVdIGVycm9yIGhhbmRsaW5nIG5vdyBjb25mb3JtcyB0byBwdWJsaWMgWFMgYXBpIChmaXhlcyBwZXJsIHY1LjE0IGlzc3VlKS4KCjIwMTEtMTItMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtBbmRyb2lkL0phdmFdIEZpeCBkaXJlY3RvcnMgdG8gY29tcGlsZSBvbiBBbmRyb2lkLgoKICAgICAgICAgICAgQWRkZWQgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMgZm9yIEFuZHJvaWQuCgoyMDExLTEyLTA4OiB2YWR6CgkgICAgQnVnIGZpeDogSGFuZGxlIG1ldGhvZHMgcmVuYW1lZCBvciBpZ25vcmVkIGluIHRoZSBiYXNlIGNsYXNzIGNvcnJlY3RseSBpbiB0aGUgZGVyaXZlZCBjbGFzc2VzCgkgICAgKHRoZXkgY291bGQgYmUgc29tZXRpbWVzIG15c3RlcmlvdXNseSBub3QgcmVuYW1lZCBvciBpZ25vcmVkIHRoZXJlIGJlZm9yZSkuCgoyMDExLTEyLTAzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gRml4IGV4Y2VwdGlvbiBnbHVlIGNvZGUgZm9yIG5ld2VyIERNRCAyIHZlcnNpb25zLgogICAgICAgICAgICBbRF0gRG8gbm90IGRlZmF1bHQgdG8gMzIgYml0IGdsdWUgY29kZSBmb3IgRE1EIGFueW1vcmUuCiAgICAgICAgICAgIFtEXSBVc2Ugc3RkYy5jb25maWcuY19sb25nL2NfdWxvbmcgdG8gcmVwcmVzZW50IEMgbG9uZyB0eXBlcy4KCjIwMTEtMTItMDE6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIGJ1ZyAzNDQ3NDI2OiBtZW1vcnkgbGVhayBpbiB2ZWN0b3IuX19nZXRpdGVtX18uCgoyMDExLTExLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUmVtb3ZlIEMrKyBjb21tZW50cyBmcm9tIGdlbmVyYXRlZCBDIGNvZGUuCgoyMDExLTExLTI3OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHNvbWUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpdGgKCSAgICBjZXJ0YWluIEdDQyB3YXJuaW5nIG9wdGlvbnMgKERlYmlhbiBidWcgIzY1MDI0NikuCgoyMDExLTExLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0MzM1NDEgJXR5cGVtYXAoaW4sIG51bWlucHV0cz0wKSB3aXRoIDEwKyBhcmd1bWVudHMuCgoyMDExLTExLTI4OiBvbGx5CgkgICAgW1BlcmxdIEZpeCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlcnMgd2l0aCBjZXJ0YWluCgkgICAgR0NDIHdhcm5pbmcgb3B0aW9ucyAoRGViaWFuIGJ1ZyAjNDM2NzExKS4KCjIwMTEtMTEtMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUga2V5d29yZCBsaXN0IHRvIGluY2x1ZGUga2V5d29yZHMgYWRkZWQgaW4gUEhQIHJlbGVhc2VzIHVwIHRvIDUuMy4KCjIwMTEtMTEtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHJvdmlkZSBhbiBlYXN5IHdheSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2aXNpYmlsaXR5IGZvciB0aGUgcHJveHkgY2xhc3MgcG9pbnRlcgogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGdldENQdHIoKSBtZXRob2QuIFRoZSB2aXNpYmlsaXR5IGlzICdpbnRlcm5hbCcgYnkgZGVmYXVsdCBhbmQgaWYgbXVsdGlwbGUKICAgICAgICAgICAgU1dJRyBtb2R1bGVzIGFyZSBiZWluZyB1c2VkIGFuZCBjb21waWxlZCBpbnRvIGRpZmZlcmVudCBhc3NlbWJsaWVzLCB0aGVuIHRoZXkgbmVlZCB0byBiZSAKICAgICAgICAgICAgJ3B1YmxpYycgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb25zdHJ1Y3RvciBvciBnZXRDUHRyKCkgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgYXNzZW1ibHkuCiAgICAgICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBjaGFuZ2UgdGhlIHZpc2liaWxpdGllcyBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzczoKCiAgICAgICAgICAgICAgU1dJR19DU0JPRFlfUFJPWFkocHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQogICAgICAgICAgICAgIFNXSUdfQ1NCT0RZX1RZUEVXUkFQUEVSKHB1YmxpYywgcHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQoKICAgICAgICAgICAgW0phdmFdIFByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmb3IgdGhlIHByb3h5IGNsYXNzIHBvaW50ZXIKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBnZXRDUHRyKCkgbWV0aG9kLiBUaGUgdmlzaWJpbGl0eSBpcyAncHJvdGVjdGVkJyBieSBkZWZhdWx0IGFuZCBpZiBtdWx0aXBsZQogICAgICAgICAgICBTV0lHIG1vZHVsZXMgYXJlIGJlaW5nIHVzZWQgYW5kIGNvbXBpbGVkIGludG8gZGlmZmVyZW50IHBhY2thZ2VzLCB0aGVuIHRoZXkgbmVlZCB0byBiZSAKICAgICAgICAgICAgJ3B1YmxpYycgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb25zdHJ1Y3RvciBvciBnZXRDUHRyKCkgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgcGFja2FnZS4KICAgICAgICAgICAgVXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIGNoYW5nZSB0aGUgdmlzaWJpbGl0aWVzIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzOgoKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1BST1hZKHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1RZUEVXUkFQUEVSKHB1YmxpYywgcHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgZm9yIEphdmEgaGFzIGNoYW5nZWQgZnJvbSBwdWJsaWMgdG8gcHJvdGVjdGVkIGZvciB0aGUgcHJveHkgY2xhc3Nlcy4gVXNlIHRoZQogICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1BST1hZIG1hY3JvIGFib3ZlIHRvIHJlc3RvcmUgdG8gdGhlIHByZXZpb3VzIHZpc2liaWxpdGllcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTEtMTEtMjI6IHN6YWdlcgoJICAgIFtweXRob25dIEJ1ZyAzNDQwMDQ0OiAjaWZkZWYgb3V0IFNXSUdfUHl0aG9uX05vbkR5bmFtaWNTZXRBdHRyIGlmIC1idWlsdGluCgkgICAgaXNuJ3QgYmVpbmcgdXNlZCwgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYmluYXJ5IGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4KCSAgICBweXRob24gaW5zdGFsbGF0aW9ucy4KCjIwMTEtMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1ZyBmaXg6IFJlbW92ZSByb290IGRpcmVjdG9yeSBmcm9tIGRpcmVjdG9yeSBzZWFyY2ggbGlzdCBpbiBXaW5kb3dzLgoKMjAxMS0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzNDIxODc2IGZyb20gUm9iaW4gU3RvY2tlciB0byBmaXggIzM0MTY4MTggLSBzYW1lIGNsYXNzIG5hbWUgaW4gCiAgICAgICAgICAgIGRpZmZlcmVudCBuYW1lc3BhY2VzIGNvbmZ1c2lvbiB3aGVuIHVzaW5nIG11bHRpcGxlIG1vZHVsZXMuCgoyMDExLTExLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGNyZS1idWlsZC5zaCB0byB3b3JrIHdpdGggbm9uLWNvbXByZXNzZWQgdGFyYmFsbHMgLSBwcm9ibGVtIHJlcG9ydGVkIGJ5IEFkcmlhbiBCbGFrZWx5LgoKMjAxMS0xMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRXhwYW5kIHNwZWNpYWwgdmFyaWFibGVzIGluIHR5cGVtYXAgd2FybmluZ3MsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbiwgd2FybmluZz0iMTAwMDpUZXN0IHdhcm5pbmcgZm9yICdpbicgdHlwZW1hcCBmb3IgJDFfdHlwZSAkMV9uYW1lIikgaW50ICIuLi4iCgoyMDExLTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbmFtZWQgb3V0cHV0IHR5cGVtYXBzIG5vdCBiZWluZyB1c2VkIHdoZW4gdGhlIHN5bWJvbCB1c2VzIGEgcXVhbGlmaWVyIGFuZCBjb250YWlucwogICAgICAgICAgICBhIG51bWJlciwgZWc6CgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgZG91YmxlIEFCQzo6bTEgIi4uLiIKCjIwMTEtMTAtMjQ6IHRhbGJ5CiAgICAgICAgICAgIFtwZXJsNV0gU0YgYnVnICMzNDIzMTE5IC0gb3ZlcmxvYWQgZGlzcGF0Y2ggc3RhY2sgY29ycnVwdGlvbiBmaXguICBCZXR0ZXIsIGJ1dCBtb3JlIHJlc2VhcmNoCiAgICAgICAgICAgIGlzIG5lZWRlZCBvbiBhIHN0YWJsZSBwYXRoIGZvciB0YWlsIGNhbGxzIGluIFhTLgoKICAgICAgICAgICAgQWxzbywgZml4IGZvciBsYXJnZSBsb25nIGxvbmdzIGluIDMyIGJpdCBwZXJsLgoKMjAxMS0xMC0xMzogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBBbGxvdyBPY3RhdmUgbW9kdWxlcyB0byBiZSByZS1sb2FkZWQgYWZ0ZXIgYSAiY2xlYXIgYWxsIi4KCjIwMTEtMDktMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuMSByZXBvcnRlZCBieSBUZWVtdSBJa29ub25lIGxlYWRpbmcgdG8gdW5jb21waWxhYmxlIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyB0eXBlZGVmIGFuZCBmdW5jdGlvbiBwb2ludGVyIHJlZmVyZW5jZXMsIGZvciBleGFtcGxlOiAKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgRk4oY29uc3QgaW50ICZhLCBpbnQgYik7CiAgICAgICAgICAgICAgdm9pZCAqdHlwZWRlZl9jYWxsMShGTiAqJiBwcmVjYWxsYmFjaywgRk4gKiBwb3N0Y2FsbGJhY2spOwoKMjAxMS0wOS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUGF0Y2ggIzM0MDgwMTIgZnJvbSBSYW1hbiBHb3BhbGFuIC0gYWRkIHN1cHBvcnQgZm9yIGVtYmVkZGVkIEx1YSAoZUx1YSkKICAgICAgICAgICAgaW5jbHVkaW5nIG9wdGlvbnMgZm9yIHRhcmdldGluZyBMdWEgVGlueSBSQU0gKExUUikuCgoyMDExLTA5LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBib29zdF9pbnRydXNpdmVfcHRyLmkgbGlicmFyeSBjb250cmlidXRpb24gZnJvbSBwYXRjaCAjMzQwMTU3MS4KCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB3YXJuaW5ncyBmb3IgYmFkbHkgbmFtZWQgZGVzdHJ1Y3RvcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgS1N0cnVjdCB7CiAgICAgICAgICAgICAgICB+Tk9UX0tTdHJ1Y3QoKSB7fQogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBjcHBfZXh0ZW5kX2Rlc3RydWN0b3JzLmk6OTI6IFdhcm5pbmcgNTIxOiBJbGxlZ2FsIGRlc3RydWN0b3IgbmFtZSB+Tk9UX0tTdHJ1Y3QuIElnbm9yZWQuCgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWV4dGVuZCBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlcy4gVGhlIGRlc3RydWN0b3IgaW4gJWV4dGVuZCB3YXMgbm90IGFsd2F5cyB3cmFwcGVkLAogICAgICAgICAgICBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4dGVuZCBGb29UIHsKICAgICAgICAgICAgICAgIH5Gb29UKCkgeyBkZWxldGUgJHNlbGY7IH0gLy8gd2FzIG5vdCB3cmFwcGVkIGFzIGV4cGVjdGVkCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb29UIHt9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29UaSkgRm9vVDxpbnQ+OwoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNwZWNpYWwgdmFyaWFibGVzIHN1Y2ggYXMgIiRkZWNsIiBhbmQgIiRmdWxsZGVjbCIgaW4gZGVzdHJ1Y3RvcnMgdG8gaW5jbHVkZSB0aGUgfiBjaGFyYWN0ZXIuCgoyMDExLTA5LTEwOiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNGIGJ1ZyAjMTQ4MTk1OCAtIEltcHJvdmUgcmFuZ2UgY2hlY2tpbmcgZm9yIGludGVnZXIgdHlwZXMuCiAgICAgICAgICAgIEVuaGFuY2UgbGlfdHlwZW1hcHNfcnVubWUucGwKCjIwMTEtMDktMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlZXh0ZW5kIG9uIHR5cGVkZWYgY2xhc3NlcyBpbiBhIG5hbWVzcGFjZSB1c2luZyB0aGUgdHlwZWRlZiBuYW1lLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAlZXh0ZW5kIENTdHJ1Y3QgewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHRhZ0NTdHJ1Y3QgeyAuLi4gfSBDU3RydWN0OwogICAgICAgICAgICB9CgoyMDExLTA4LTMxOiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIHBhdGNoZXMgZnJvbSBLYXJsIFdldHRlOiBpbXByb3ZlbWVudHMgdG8gbW9kdWxlIGxvYWRpbmcgYmVoYXZpb3I7CgkgICAgYWRkZWQgZXhhbXBsZSBvZiBmcmllbmQgb3BlcmF0b3IgdG8gb3BlcmF0b3IgZXhhbXBsZTsgZml4ZWQgb2N0YXZlIHBhbmljL2NyYXNoIGluIDMuMC41OwoJICAgIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCgoyMDExLTA4LTMwOiBzemFnZXIKCSAgICBbcHl0aG9uXSBCdWcgMzQwMDQ4NiwgZml4IGVycm9yIHNpZ25hbGxpbmcgZm9yIGJ1aWx0LWluIGNvbnN0cnVjdG9ycy4KCjIwMTEtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHb10gRml4IGZpbGUvbGluZSBudW1iZXIgZGlzcGxheSBmb3IgImdvdHlwZSIgd2hlbiB1c2luZyB0eXBlbWFwIGRlYnVnZ2luZyBvcHRpb25zCiAgICAgICAgICAgIC10bXNlYXJjaCBhbmQgLXRtdXNlZC4KCjIwMTEtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgRF0gRml4ICVjYWxsYmFjayB3aGljaCB3YXMgZ2VuZXJhdGluZyB1bmNvbXBpbGVhYmxlIGNvZGUuCgoyMDExLTA4LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY29uc3RydWN0b3JzIGluIG5hbWVkIHR5cGVkZWYgY2xhc3MgZGVjbGFyYXRpb25zIGFzIHJlcG9ydGVkIGJ5IEdyZWdvcnkgQnJvbm5lcjoKCiAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IEEgewogICAgICAgICAgICAgIEEoKXt9IC8vIENvbnN0cnVjdG9yIHdoaWNoIHdhcyBub3QgYWNjZXB0ZWQgYnkgU1dJRwogICAgICAgICAgICAgIEIoKXt9IC8vIE5PVCBhIGNvbnN0cnVjdG9yIC0taWxsZWdhbCwgYnV0IHdhcyBhY2NlcHRlZCBieSBTV0lHCiAgICAgICAgICAgIH0gQjsKCiAgICAgICAgICAgIEZvciBDIGNvZGUsIHRoZSBmaXggbm93IHJlc3VsdHMgaW4gdGhlIHVzZSBvZiAnc3RydWN0IEEgKicgaW5zdGVhZCBvZiBqdXN0ICdCIConIGluCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgY29kZSB3aGVuIHdyYXBwaW5nIG1lbWJlcnMgaW4gQSwgYnV0IHVsdGltYXRlbHkgdGhpcyBkb2VzIG5vdCBtYXR0ZXIsIGFzCiAgICAgICAgICAgIHRoZXkgYXJlIHRoZSBzYW1lIHRoaW5nLgoKMjAxMS0wOC0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVuZXdvYmplY3Qgd2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggJWZlYXR1cmUoInJlZiIpIGFzIHJlcG9ydGVkIGJ5IEphbiBCZWNrZXIuIFRoZQogICAgICAgICAgICBjb2RlIGZyb20gdGhlICJyZWYiIGZlYXR1cmUgd2FzIG5vdCBhbHdheXMgYmVpbmcgZ2VuZXJhdGVkIGZvciB0aGUgZnVuY3Rpb24gc3BlY2lmaWVkIGJ5ICVuZXdvYmplY3QuCiAgICAgICAgICAgIERvY3VtZW50YXRpb24gZm9yICJyZWYiIGFuZCAidW5yZWYiIG1vdmVkIGZyb20gUHl0aG9uIHRvIHRoZSBDKysgY2hhcHRlci4KCjIwMTEtMDgtMjI6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIG1lbW9yeSBsZWFrIHdpdGggLS1idWlsdGluIG9wdGlvbiAoYnVnIDMzODUwODkpLgoKMjAxMS0wOC0yMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gU0YgcGF0Y2ggIzMzOTQzMzkgZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYgLSBuZXcgb3B0aW9uIC1ub21vZHVsZWdsb2JhbCB0byBkaXNhYmxlIGluc3RhbGxpbmcgCiAgICAgICAgICAgIHRoZSBtb2R1bGUgdGFibGUgaW50byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gUmVxdWlyZSBjYWxsIGFsc28gcmV0dXJucyB0aGUgbW9kdWxlIHRhYmxlIGluc3RlYWQgCiAgICAgICAgICAgIG9mIGEgc3RyaW5nLgoKMjAxMS0wOC0wOTogeGF2aWVyOTgKICAgICAgICAgICAgRml4IGJ1ZyAzMzg3Mzk0OyBPY3RhdmUgcGF0Y2hlcyBmb3IgMy40LjAgY29tcGF0aWJpbGl0eSwgZXRjLiAoZnJvbSBLYXJsIFdldHRlKQoKMjAxMS0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluICRzeW1uYW1lIGV4cGFuc2lvbiBmb3IgZGlyZWN0b3IgbWV0aG9kcy4KCjIwMTEtMDctMjk6IG9sbHkKCSAgICBbUEhQXSBEb24ndCBnZW5lcmF0ZSAicmV0dXJuICRyOyIgaW4gY2FzZXMgd2hlcmUgJHIgaGFzbid0IGJlZW4gc2V0LgoJICAgIFRoaXMgd2FzIGJhc2ljYWxseSBoYXJtbGVzcywgZXhjZXB0IGl0IGdlbmVyYXRlZCBhIFBIUCBFX05PVElDRSBpZgoJICAgIHRoZSBjYWxsaW5nIGNvZGUgaGFkIGVuYWJsZWQgdGhlbS4KCjIwMTEtMDctMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzY29waW5nIG9mIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIG5lc3RlZCB3aXRoaW4gYSBjbGFzcyAoZm9yIEMrKykuIFByZXZpb3VzbHkgdGhlIHN5bWJvbAogICAgICAgICAgICB3YXMgaW5jb3JyZWN0bHkgcHV0IGludG8gdGhlIG91dGVyIG5hbWVzcGFjZSwgZWcKCiAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVD4gc3RydWN0IG1hcCB7CiAgICAgICAgICAgICAgICBjbGFzcyBpdGVyYXRvcjsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpdGVyYXRvciB3YXMgc2NvcGVkIGFzIHN0ZDo6aXRlcmF0b3IsIGJ1dCBub3cgaXQgaXMgY29ycmVjdGx5IHN0ZDo6bWFwPEtleSwgVD46Oml0ZXJhdG9yOwoKICAgICAgICAgICAgQWxzbyBmaXhlZCBpcyAldGVtcGxhdGUgYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhdCBhcmUgYSB0eXBlZGVmIHdoZW4gdGhlIHRlbXBsYXRlIGNvbnRhaW5zCiAgICAgICAgICAgIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVycywgZWc6CgogICAgICAgICAgICBuYW1lc3BhY2UgU3RkIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIEMgPSBpbnQ+IHN0cnVjdCBNYXAgewogICAgICAgICAgICAgICAgdHlwZWRlZiBLZXkga2V5X3R5cGU7CiAgICAgICAgICAgICAgICB0eXBlZGVmIFQgbWFwcGVkX3R5cGU7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBET1VCTEU7CiAgICAgICAgICAgICV0ZW1wbGF0ZShNTSkgU3RkOjpNYXA8aW50LCBET1VCTEU+OwoKICAgICAgICAgICAgQWxsIHN5bWJvbHMgd2l0aGluIE1hcCB3aWxsIGJlIHJlc29sdmVkIGNvcnJlY3RseSwgZWcga2V5X3R5cGUgYW5kIG1hcHBlZF90eXBlIG5vIG1hdHRlciBpZiB0aGUKICAgICAgICAgICAgd3JhcHBlZCBjb2RlIHVzZXMgU3RkOjpNYXA8aW50LCBkb3VibGU+IG9yIHN0ZDo6TWFwPGludCwgRE9VQkxFPiBvciBTdGQ6Ok1hcDxpbnQsIGRvdWJsZSwgaW50PgoKICAgICAgICAgICAgQWxzbyBmaXhlcyBidWcgIzMzNzgxNDUgLSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMi4wLjQgLSAldGVtcGxhdGUgdXNpbmcgdHJhaXRzLgoKMjAxMS0wNy0yMCAgc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4IGNsb3N1cmUgZm9yIHRwX2NhbGwgc2xvdC4KCjIwMTEtMDctMTY6IHdzZnVsdG9uCgkgICAgW3B5dGhvbl0gRml4IGRpcmVjdG9yIHR5cGVtYXAgdXNpbmcgUHlPYmplY3QgKi4KCjIwMTEtMDctMTM6IHN6YWdlcgoJICAgIFtweXRob25dIFNGIHBhdGNoICMzMzY1OTA4IC0gQWRkIGFsbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRvIG1hcCBzdXBwb3J0IGNvZGUgaW4gc3RkX21hcC5pCgoyMDExLTA3LTEzOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXggZm9yIGJ1ZyAzMzI0NzUzOiAlcmVuYW1lIG1lbWJlciB2YXJpYWJsZXMgd2l0aCAtYnVpbHRpbi4KCjIwMTEtMDctMDE6IHdzZnVsdG9uCgkgICAgRml4IHNvbWUgc2NvcGUgYW5kIHN5bWJvbCBsb29rdXAgcHJvYmxlbXMgd2hlbiB0ZW1wbGF0ZSBkZWZhdWx0IHBhcmFtZXRlcnMgYXJlIGJlaW5nCiAgICAgICAgICAgIHVzZWQgd2l0aCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFhYLCB0eXBlbmFtZSBUVCA9IFNvbWVUeXBlPiBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICB0eXBlZGVmIFhYIFg7CiAgICAgICAgICAgICAgdHlwZWRlZiBUVCBUOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUVD4gc3RydWN0IFVzZXNGb28gewogICAgICAgICAgICAgIHZvaWQgeCh0eXBlbmFtZSBGb288VFQ+OjpULCB0eXBlbmFtZSBGb288VFQ+OjpYKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFsc28gZml4ZXMgdXNlIG9mIHN0ZDo6dmVjdG9yPGludD46OnNpemVfdHlwZSBmb3IgUHl0aG9uIGFzIHJlcG9ydGVkIGJ5IEF1YnJleSBCYXJuYXJkLgoKMjAxMS0wNi0yMzogb2xseQoJICAgIFtQSFBdIEZpeCBkaXJlY3RvciBjb2RlIHRvIHdvcmsgd2hlbiBQSFAgaXMgYnVpbHQgd2l0aCBaVFMgZW5hYmxlZCwKCSAgICB3aGljaCBpcyB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBvbiBNaWNyb3NvZnQgV2luZG93cy4KCjIwMTEtMDYtMjE6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICAtIHZhcmlvdXMgc21hbGwgdHdlYWtzIGFuZCBidWcgZml4ZXMuCgkgICAgLSBBdm9pZCBuYW1lIGNvbmZsaWN0cyBiZXR3ZWVuIHNtYXJ0IHBvaW50ZXIgd3JhcHBlcnMgYW5kIHRoZSB3cmFwcGVycyBmb3IKCSAgICB0aGUgYWN0dWFsIGNsYXNzLgoJICAgIC0gRml4IGRlZmF1bHQgdHlwZW1hcHMgZm9yIEMgYmluZGluZ3MsIHdoaWNoIHdlcmUgaW5jb3JyZWN0bHkgYXR0ZW1wdGluZyB0bwoJICAgIGNhbGwgbm9uLWV4aXN0ZW50IGRlc3RydWN0b3JzIG9uIHVzZXItZGVmaW5lZCB0eXBlcy4KCSAgICAtIE5ldyBmZWF0dXJlLCBmZWF0dXJlOmFjbG1peGlucywgZm9yIGFkZGluZyBzdXBlcmNsYXNzIHRvIHRoZSBmb3JlaWduIGNsYXNzCgkgICAgd3JhcHBlcnMuCgkgICAgLSBJbXByb3ZlIGxvbmdsb25nIHR5cGVtYXBzLgoKMjAxMS0wNi0xOTogd3NmdWx0b24KCSAgICBGaXggaW5jb3JyZWN0IHR5cGVtYXBzIGJlaW5nIHVzZWQgZm9yIGEgc3ltYm9sIHdpdGhpbiBhIHRlbXBsYXRlZCB0eXBlLCBlZzoKICAgICAgICAgICAgQTxpbnQ+Ojp2YWx1ZV90eXBlIHdvdWxkIGluY29ycmVjdGx5IHVzZSBhIHR5cGVtYXAgZm9yIHR5cGUgQS4KCjIwMTEtMDYtMTg6IG9sbHkKCSAgICBbVGNsXSBGaXggdmFyaWFibGUgZGVjbGFyYXRpb25zIGluIG1pZGRsZSBvZiBibG9ja3Mgd2hpY2ggaXNuJ3QKCSAgICBwZXJtaXR0ZWQgaW4gQzkwIChpc3N1ZSBwcm9iYWJseSBpbnRyb2R1Y2VkIGluIDIuMC4zIGJ5IHBhdGNoICMzMjI0NjYzKS4KCSAgICBSZXBvcnRlZCBieSBQYXVsIE9iZXJtZWllciBpbiBTRiMzMjg4NTg2LgoKMjAxMS0wNi0xNzogd3NmdWx0b24KCSAgICBbSmF2YV0gU0YgIzMzMTI1MDUgLSBzbGlnaHRseSBlYXNpZXIgdG8gd3JhcCBjaGFyW10gb3IgY2hhcltBTlldIHdpdGggYSBKYXZhIGJ5dGVbXQogICAgICAgICAgICB1c2luZyBhcnJheXNfamF2YS5pLgoKMjAxMS0wNi0xMzogd3NmdWx0b24KCSAgICBbUnVieSwgT2N0YXZlXSBTRiAjMzMxMDUyOCBBdXRvZG9jIGZpeGVzIHNpbWlsYXIgdG8gdGhvc2UgZGVzY3JpYmVkIGJlbG93IGZvciBQeXRob24uCgoyMDExLTA2LTEwOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZldyBzdWJ0bGUgYnVnZml4ZXMgaW4gYXV0b2RvYyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24sCiAgICAgICAgICAgIC0gVW5uYW1lZCBhcmd1bWVudCBuYW1lcyBmaXggZm9yIGF1dG9kb2MgbGV2ZWxzID4gMC4KICAgICAgICAgICAgLSBEaXNwbGF5IG9mIHRlbXBsYXRlIHR5cGVzIGZpeGVkIGZvciBhdXRvZG9jIGxldmVscyA+IDEuCiAgICAgICAgICAgIC0gRml4IFNGICMzMzEwNTI4IC0gZGlzcGxheSBvZiB0eXBlZGVmIHN0cnVjdHMgZm9yIGF1dG9kb2MgbGV2ZWxzID4gMS4KICAgICAgICAgICAgLSBBZGQgbWlzc2luZyB0eXBlIGZvciBzZWxmIGZvciBhdXRvZG9jIGxldmVscyAxIGFuZCAzLgogICAgICAgICAgICAtIGF1dG9kb2MgbGV2ZWxzIDIgYW5kIDMgZG9jdW1lbnRlZC4KICAgICAgICAgICAgLSBNaW5vciB0d2Vha3MgdG8gYXV0b2RvYyBzdHlsZSB0byBjb25mb3JtIHdpdGggUEVQOC4KCjIwMTEtMDUtMzA6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgZGlyZWN0b3JzIHdoZW4gLXByZWZpeCBpcyB1c2VkLgoKMjAxMS0wNS0yNDogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBtZXRob2RzIG9mIGNsYXNzZXMgd2l0aCBhIHZpcnR1YWwgYmFzZSBjbGFzcyAoU0YjMzEyNDY2NSkuCgpWZXJzaW9uIDIuMC40ICgyMSBNYXkgMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDExLTA1LTE5OiB3c2Z1bHRvbgoJICAgIFtHdWlsZV0gUGF0Y2ggIzMxOTE2MjUgZml4aW5nIG92ZXJsb2FkaW5nIG9mIGludGVnZXIgdHlwZXMuCgoyMDExLTA1LTE5OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBQYXRjaCAjMzI2MDI2NSBmaXhpbmcgb3ZlcmxvYWRpbmcgb2Ygbm9uLXByaW1pdGl2ZSB0eXBlcyBhbmQgaW50ZWdlcnMgaW4gCiAgICAgICAgICAgIFBlcmwgNS4xMiBhbmQgbGF0ZXIuCgoyMDExLTA1LTE5OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBGaXggJWltcG9ydCB3aGVyZSBvbmUgb2YgdGhlIGltcG9ydGVkIGZpbGVzICVpbmNsdWRlIG9uZSBvZiB0aGUgU1RMIGluY2x1ZGUKICAgICAgICAgICAgZmlsZXMgc3VjaCBhcyBzdGRfdmVjdG9yLmkuCgoyMDExLTA1LTE3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBBcHBseSAjMzI4OTg1MSBmcm9tIEFsYW4gSGFyZGVyIHRvIGZpeCBtZW1vcnkgbGVhayBpbiBkaXJlY3RvcnMgd2hlbiBjaGVja2luZwogICAgICAgICAgICBmb3IgcGVuZGluZyBleGNlcHRpb25zLgoKMjAxMS0wNS0xNzogd3NmdWx0b24KCSAgICBbVGNsXSBBcHBseSAjMzMwMDA3MiBmcm9tIENocmlzdGlhbiBEZWxiYWVyZSB0byBmaXggbXVsdGlwbGUgbW9kdWxlIGxvYWRpbmcgbm90CiAgICAgICAgICAgIGFsd2F5cyBzaGFyaW5nIHZhcmlhYmxlcyBhY3Jvc3MgbW9kdWxlcy4KCjIwMTEtMDUtMTY6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gRml4IGFuIGluY29tcGF0aWJpbGl0eSB3aXRoIG5ldmVyIHZlcnNpb25zIG9mIE9jdGF2ZS4gQ2FzZSBvbiBPY3RhdmUKCSAgICBBUEkgPj0gNDAgdG8gaGFuZGxlIHJlbmFtZSBvZiBPY3RhdmVfbWFwIHRvIG9jdGF2ZV9tYXAuCgkgICAgW29jdGF2ZV0gQWRkIHN1cHBvcnQgZm9yIHkuX19yb3BfXyh4KSBvcGVyYXRvcnMgd2hlbiB4Ll9fb3BfXyh5KSBkb2Vzbid0IGV4aXN0LgoJICAgIFtvY3RhdmVdIEFsbG93IGdsb2JhbCBvcGVyYXRvcnMgdG8gYmUgZGVmaW5lZCBieSBTV0lHLXdyYXBwZWQgZnVuY3Rpb25zLgoJICAgIFtvY3RhdmVdIEZpeCBzZXZlcmFsIGJ1Z3MgYXJvdW5kIG1vZHVsZSBuYW1lc3BhY2VzOyBhZGQgLWdsb2JhbCwgLW5vZ2xvYmFsLAoJICAgIC1nbG9iYWxzIDxuYW1lPiBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byB0aGUgbW9kdWxlLgoKMjAxMS0wNS0xNDogd3NmdWx0b24KCSAgICAldmFyYXJncyB3aGVuIHVzZWQgd2l0aCBhIG51bWVyaWMgYXJndW1lbnQgdXNlZCB0byBjcmVhdGUgYW4gYWRkaXRpb25hbCBhcmd1bWVudCAKICAgICAgICAgICAgd2hpY2ggd2FzIGludGVuZGVkIHRvIHByb3ZpZGUgYSBndWFyYW50ZWVkIHNlbnRpbmVsIHZhbHVlLiBUaGlzIG5ldmVyIHdvcmtlZCBhbmQgbm93CiAgICAgICAgICAgIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50IGlzIG5vdCBnZW5lcmF0ZWQuCgoyMDExLTA1LTEzOiB3c2Z1bHRvbgoJICAgIFtweXRob25dIEFkZGl0aW9uYWwgZml4ZXMgZm9yIHB5dGhvbjMuMiBzdXBwb3J0LgoKMjAxMS0wNS0wNzogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4ZWQgUHlHZXRTZXREZXNjciBmb3IgcHl0aG9uMy4yLgoKMjAxMS0wNS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YSwgUHl0aG9uLCBUY2xdIEMvQysrIHByb3RvdHlwZXMgc2hvd24gaW4gZXJyb3IgbWVzc2FnZSB3aGVuIGNhbGxpbmcgYW4gb3ZlcmxvYWRlZAogICAgICAgICAgICBtZXRob2Qgd2l0aCBpbmNvcnJlY3QgYXJndW1lbnRzIGltcHJvdmVkIHRvIHNob3cgYWx3YXlzIHNob3cgZnVsbHkgcXVhbGlmaWVkIG5hbWUKICAgICAgICAgICAgYW5kIGlmIGEgY29uc3QgbWV0aG9kLiAKCiAgICAgICAgICAgIEFsc28gZml4ZWQgb3RoZXIgTHVhIGVycm9yIG1lc3NhZ2VzIGluIGdlbmVyYXRlZCBjb2RlIHdoaWNoIHdlcmVuJ3QgY29uc2lzdGVudGx5CiAgICAgICAgICAgIHVzaW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgQysrIG5hbWUgLSByZXF1ZXN0ZWQgYnkgR2VkYWxpYSBQYXN0ZXJuYWsuCgoyMDExLTA0LTI5OiBzemFnZXIKCSAgICBCdWcgMjYzNTkxOTogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvbnZlcnQgc3RkOjptYXAgdG8gYSBweXRob24gZGljdC4KCjIwMTEtMDQtMjk6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIGJ1ZyAyODExNTQ5OiByZXR1cm4gbm9uLWNvbnN0IGl0ZXJhdG9ycyBmcm9tIFNUTAoJICAgIG1ldGhvZHMgYmVnaW4oKSwgZW5kKCksIHJiZWdpbigpLCByZW5kKCkuCgoyMDExLTA0LTI1OiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBidWcgMTQ5ODkyOTogQWNjZXNzIHRvIG1lbWJlciBmaWVsZHMgaW4gbWFwIGVsZW1lbnRzCgoyMDExLTA0LTIzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gbnNwYWNlOiBDb3JyZWN0bHkgZ2VuZXJhdGUgaWRlbnRpZmllcnMgZm9yIGJhc2UgY2xhc3NlcyB3aGVuCiAgICAgICAgICAgIG5vdCBpbiBzcGxpdCBwcm94eSBtb2RlLgoKMjAxMS0wNC0xMzogc3phZ2VyCgkgICAgRml4ZWQgYnVnIDMyODYzMzM6IGluZmluaXRlIHJlY3Vyc2lvbiB3aXRoIG11dHVhbCAndXNpbmcgbmFtZXNwYWNlJyBjbGF1c2VzLgoKMjAxMS0wNC0xMjogc3phZ2VyCgkgICAgRml4ZWQgYnVnIDExNjM0NDA6IHZhcmFyZyB0eXBlbWFwcy4KCjIwMTEtMDQtMTI6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAjMzI4NTM4NjogcGFyc2UgZXJyb3IgZnJvbSAnb3BlcmF0b3IgVComKCknLiAgQWRkZWQgb3BlcmF0b3JfcG9pbnRlcl9yZWYKCSAgICB0ZXN0IGNhc2UgdG8gZGVtb25zdHJhdGUuCgoyMDExLTA0LTExOiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBQeVZhck9iamVjdF9IRUFEX0lOSVQgdG8gZWxpbWluYXRlIFZDKysgY29tcGlsZXIgZXJyb3JzIGFib3V0CgkgICAgc3RhdGljIGluaXRpYWxpemF0aW9uIG9mIHN0cnVjdCBtZW1iZXJzIHdpdGggcG9pbnRlcnMuCgoyMDExLTA0LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzI4NDMyNiBmcm9tIENvbGluIE1jRG9uYWxkIHRvIGZpeCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLgoKMjAxMS0wNC0xMTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgUHlWYXJPYmplY3RfSEVBRF9JTklUIHRvIGVsaW1pbmF0ZSBWQysrIGNvbXBpbGVyIGVycm9ycyBhYm91dAoJICAgIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3QgbWVtYmVycyB3aXRoIHBvaW50ZXJzLgoKMjAxMS0wNC0xMDoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEZpeGVkIHdyYXBwaW5nIG9mIGVudW1zIHRoYXQgYXJlIHR5cGUgY2hhciwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIGVudW0geyBYID0gJ1gnOyB9ICh0aGlzIHdhcyBhbHJlYWR5IGluIDIuMC4zIGZvciBDIyBhbmQgSmF2YSkKCjIwMTEtMDQtMTA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBuc3BhY2U6IEZpeGVkIHJlZmVyZW5jaW5nIHR5cGVzIGluIHRoZSByb290IG5hbWVzcGFjZSB3aGVuCiAgICAgICAgICAgIG5vdCBpbiBzcGxpdCBwcm94eSBtb2RlLgoKMjAxMS0wNC0wOTogc3phZ2VyCgkgICAgW1B5dGhvbl0gQXBwbGllZCBwYXRjaCAjMTkzMjQ4NDogbWlncmF0ZSBQeUNPYmplY3QgdG8gUHlDYXBzdWxlLgoKMjAxMS0wNC0wOTogc3phZ2VyCgkgICAgW1B5dGhvbl0gQWRkZWQgcHJlcHJvY2Vzc29yIGd1YXJkcyBmb3IgcHl0aG9uIGZ1bmN0aW9ucyBQeVVuaWNvZGVfQXNXaWRlQ2hhciBhbmQKCSAgICBQeVNsaWNlX0dldEluZGljZXMsIHdoaWNoIGNoYW5nZWQgc2lnbmF0dXJlcyBpbiBweXRob24zLjIuCgoyMDExLTA0LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgY29uc3QgYXJyYXkgdHlwZWRlZnMgd2hpY2ggd2VyZSBnZW5lcmF0aW5nIHVuY29tcGlsZWFibGUgY29kZSBhcwogICAgICAgICAgICByZXBvcnRlZCBieSBLYXJsIFdldHRlLgoKMjAxMS0wNC0wMzogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgdGhlIGJlaGF2aW9yIG9mICVweXRob25ub25keW5hbWljIHRvIGNvbmZvcm0gdG8gdGhlIHNwZWMgaW4gTGliL3B5dXNlcmRpci5zd2cuCgoyMDExLTA0LTAzOiBzemFnZXIKCSAgICBbUHl0aG9uXSBNZXJnZWQgaW4gdGhlIHN6YWdlci1weXRob24tYnVpbHRpbiBicmFuY2gsIGFkZGluZyB0aGUgLWJ1aWx0aW4gZmVhdHVyZQoJICAgIGZvciBweXRob24uICBUaGUgLWJ1aWx0aW4gb3B0aW9uIG1heSBwcm92aWRlIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgZ2FpbgoJICAgIGluIHB5dGhvbiB3cmFwcGVycy4gIEZvciBmdWxsIGRldGFpbHMgYW5kIGxpbWl0YXRpb25zLCByZWZlciB0byBEb2MvTWFudWFsL1B5dGhvbi5odG1sLgoJICAgIEEgc21hbGwgdGVzdCBzdWl0ZSBkZXNpZ25lZCB0byBkZW1vbnN0cmF0ZSB0aGUgcGVyZm9ybWFuY2UgZ2FpbiBpcyBpbgoJICAgIEV4YW1wbGVzL3B5dGhvbi9wZXJmb3JtYW5jZS4KCjIwMTEtMDQtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiBtaXNzaW5nIHdyYXBwZXJzIGZvciBmcmllbmQgZnVuY3Rpb25zIGZvciBzb21lIHRhcmdldCBsYW5ndWFnZXMsIG1vc3RseQogICAgICAgICAgICB0aGUgbm9uLXNjcmlwdGluZyBsYW5ndWFnZXMgbGlrZSBKYXZhIGFuZCBDIy4KClZlcnNpb24gMi4wLjMgKDI5IE1hcmNoIDIwMTEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQXBwbHkgcGF0Y2ggIzMyMzkwNzYgZnJvbSBNYXJpZSBXaGl0ZSBmaXhpbmcgc3RyaW5ncyBmb3IgUiA+PSAyLjcuMAoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgcGF0Y2ggIzMyNDgyODAgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUgd2hpY2ggYWRkcyBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgd2hlbgogICAgICAgICAgICB0aGUgaW5jb3JyZWN0IG51bWJlciBvciB0eXBlIG9mIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIG92ZXJsb2FkZWQgbWV0aG9kcy4KCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjI0NjYzIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlLgogICAgICAgICAgICAxLiBGaXggd2hlbiBmdW5jdGlvbiByZXR1cm5zIGEgTlVMTCB2YWx1ZSwgYSAiTlVMTCIgY29tbWFuZCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIFRjbCBpbnRlcnByZXRlcgogICAgICAgICAgICBhbmQgY2FsbGluZyB0aGlzIGNvbW1hbmQgd2lsbCBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdC4gCgogICAgICAgICAgICAyLiBQcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgY2xhc3MgbWV0aG9kcyB1c2luZyBhIGxpbmVhciBzZWFyY2ggY2F1c2luZyBwZXJmb3JtYW5jZSBpc3N1ZXMKICAgICAgICAgICAgaW4gd3JhcHBlcnMgZm9yIGNsYXNzZXMgd2l0aCBtYW55IG1lbWJlciBmdW5jdGlvbnMuIFRoZSBwYXRjaCBhZGRzIGEgbWV0aG9kIGhhc2ggdGFibGUgdG8gY2xhc3NlcyBhbmQKICAgICAgICAgICAgY2hhbmdlcyBtZXRob2QgbmFtZSBsb29rdXAgdG8gdXNlIHRoZSBoYXNoIHRhYmxlIGluc3RlYWQgb2YgZG9pbmcgYSBsaW5lYXIgc2VhcmNoLgoKMjAxMS0wMy0yNjogd3NmdWx0b24KCSAgICBbQyMsIEphdmFdIFNGIGJ1ZyAjMzE5NTExMiAtIGZpeCB3cmFwcGluZyBvZiBlbnVtcyB0aGF0IGFyZSB0eXBlIGNoYXIsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIGVudW0geyBYID0gJ1gnOyB9CgoyMDExLTAzLTIxOiB2YWR6CgkgICAgQWxsb3cgc2V0dGluZyBQQ1JFX0NGTEFHUyBhbmQgUENSRV9MSUJTIGR1cmluZyBjb25maWd1cmF0aW9uIHRvIG92ZXJyaWRlIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKCSAgICBwY3JlLWNvbmZpZywgZS5nLiB0byBhbGxvdyB1c2luZyBhIHN0YXRpYyB2ZXJzaW9uIG9mIFBDUkUgbGlicmFyeS4KCjIwMTEtMDMtMTc6IHdzZnVsdG9uCgkgICAgW1VUTF0gQWRkIG1pc3NpbmcgaGVhZGVycyBpbiBnZW5lcmF0ZWQgU1RMIHdyYXBwZXJzIHRvIGZpeCBjb21waWxhdGlvbiB3aXRoIGdjYy00LjYuCgoyMDExLTAzLTE3OiB3c2Z1bHRvbgoJICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuMiB3aGVyZSBmaWxlbmFtZXMgd2l0aCBzcGFjZXMgd2VyZSBub3QgZm91bmQKCSAgICB3aGVuIHVzZWQgd2l0aCAlaW5jbHVkZSBhbmQgJWltcG9ydC4gUmVwb3J0ZWQgYnkgU2hhbmUgTGllc2VnYW5nLgoKMjAxMS0wMy0xNTogd3NmdWx0b24KCSAgICBbVVRMXSBGaXggb3ZlcmxvYWRpbmcgd2hlbiB1c2luZyBjb25zdCBjaGFyW10sIHByb2JsZW0gcmVwb3J0ZWQgYnkgRGF2aWQgTWF4d2VsbC4KICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBjaGFyW0FOWV0gYW5kIGNvbnN0IGNoYXJbQU5ZXS4KCjIwMTEtMDMtMTU6IHdzZnVsdG9uCgkgICAgW0MjXSBBcHBseSBwYXRjaCAjMzIxMjYyNCBmaXhpbmcgc3RkOjptYXAgS2V5cyBwcm9wZXJ0eS4KCjIwMTEtMDMtMTQ6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzL2Z1bmN0aW9ucyB3aGVyZSBzb21lCgkgICAgcmV0dXJuIHZvaWQgYW5kIG90aGVycyBkb24ndCAtIHdoZXRoZXIgdGhpcyB3b3JrZWQgb3Igbm90IGRlcGVuZGVkCgkgICAgb24gdGhlIG9yZGVyIHRoZXkgd2VyZSBlbmNvdW50ZXJlZCBpbiAoU0YjMzIwODI5OSkuCgkKMjAxMS0wMy0xMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEV4dGVuZGVkIHN1cHBvcnQgZm9yIEMrKyBuYW1lc3BhY2VzIChuc3BhY2UgZmVhdHVyZSkuCgoyMDExLTAzLTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IHNoYXJpbmcgb2YgdHlwZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIG11bHRpcGxlIFNXSUctd3JhcHBlZAoJICAgIG1vZHVsZXMgKFNGIzMyMDI0NjMpLgoKMjAxMS0wMy0wOTogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGaXggU0YgIzMxOTQyOTQgLSBjb3JuZXIgY2FzZSBidWcgd2hlbiAnTlVMTCcgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBmb3IgYSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXIgaW4gYSBtZXRob2QgZGVjbGFyYXRpb24uCgoyMDExLTAzLTA3OiBvbGx5CgkgICAgW1BIUF0gRG9uJ3QgdXNlIHplbmRfZXJyb3Jfbm9yZXR1cm4oKSBmb3IgY2FzZXMgd2hlcmUgdGhlIGZ1bmN0aW9uCgkgICAgcmV0dXJucyB2b2lkIC0gbm93IHRoaXMgaXNzdWUgY2FuIG9ubHkgbWF0dGVyIGlmIHlvdSBoYXZlIGEgZnVuY3Rpb24KCSAgICBvciBtZXRob2Qgd2hpY2ggaXMgZGlyZWN0ZWQgYW5kIHJldHVybnMgbm9uLXZvaWQuCgoyMDExLTAzLTA2OiBvbGx5CgkgICAgW1BIUF0gQWRkIGNhc3RzIHRvIHRoZSB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nCgkgICAgbG9uZyB0byBhdm9pZCBpc3N1ZXMgd2hlbiB0aGV5IGFyZSB1c2VkIHdpdGggc2hvcnRlciB0eXBlcyB2aWEKCSAgICAlYXBwbHkuCgoyMDExLTAzLTAyOiB3c2Z1bHRvbgoJICAgIFRlbXBsYXRlZCBzbWFydCBwb2ludGVycyBvdmVybG9hZGVkIHdpdGggYm90aCBjb25zdCBhbmQgbm9uIGNvbnN0IG9wZXJhdG9yLT4gZ2VuZXJhdGVkIHVuY29tcGlsYWJsZQoJICAgIGNvZGUgd2hlbiB0aGUgcG9pbnRlZSB3YXMgYSBjbGFzcyB3aXRoIGVpdGhlciBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBvciBzdGF0aWMgbWV0aG9kcy4KCSAgICBSZWdyZXNzaW9uIGluIDIuMC54IHJlcG9ydGVkIGFzIHdvcmtpbmcgaW4gMS4zLjQwIGJ5IHhhbnRhcmVzIG9uIHN3aWctdXNlciBtYWlsaW5nIGxpc3QuCgpWZXJzaW9uIDIuMC4yICgyMCBGZWJydWFyeSAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wMi0xOTogd3NmdWx0b24KCSAgICBbUEhQXSBBZGQgbWlzc2luZyBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0aGUgdHlwZW1hcHMuaSBsaWJyYXJ5CiAgICAgICAgICAgIGZvciBwcmltaXRpdmUgcmVmZXJlbmNlIHR5cGVzIGFzIHdlbGwgYXMgc2lnbmVkIGNoYXIgKiBhbmQgYm9vbCAqLgoKMjAxMS0wMi0xOTogb2xseQoJICAgIFtQSFBdIEFkZHJlc3MgYnVnIGluIFBIUCBvbiBzb21lIHBsYXRmb3Jtcy9hcmNoaXRlY3R1cmVzIHdoaWNoCgkgICAgcmVzdWx0cyBpbiB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgbm90IGJlaW5nIGF2YWlsYWJsZSB1c2luZwoJICAgIFNXSUdfWkVORF9FUlJPUl9OT1JFVFVSTiB3aGljaCBkZWZhdWx0cyB0byB6ZW5kX2Vycm9yX25vcmV0dXJuIGJ1dAoJICAgIGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gYnVpbGRpbmcgdGhlIG1vZHVsZSBieSBwYXNzaW5nCgkgICAgLURTV0lHX1pFTkRfRVJST1JfTk9SRVRVUk49emVuZF9lcnJvciB0byB0aGUgY29tcGlsZXIuICBUaGlzIG1heQoJICAgIHJlc3VsdCBpbiBjb21waWxlciB3YXJuaW5ncywgYnV0IHNob3VsZCBhdCBsZWFzdCBhbGxvdyBhIG1vZHVsZQoJICAgIHRvIGJlIGJ1aWx0IG9uIHRob3NlIHBsYXRmb3Jtcy9hcmNoaXRlY3R1cmVzIChTRiMzMTY2NDIzKS4KCjIwMTEtMDItMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzE4NDU0OSAtIHZhcmFyZyBmdW5jdGlvbnMgYW5kIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHdoZW4gdXNpbmcgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uLgoKMjAxMS0wMi0xODogb2xseQoJICAgIFtQSFBdIEFuIG92ZXJsb2FkZWQgbWV0aG9kIHdoaWNoIGNhbiByZXR1cm4gYW4gb2JqZWN0IG9yIGEKCSAgICBwcmltaXRpdmUgdHlwZSBubyBsb25nZXIgY2F1c2VzIFNXSUcgdG8gc2VnZmF1bHQuICBSZXBvcnRlZCBieSBQYXVsCgkgICAgQ29sYnkgaW4gU0YjMzE2ODUzMS4KCjIwMTEtMDItMTg6IG9sbHkKCSAgICBbUEhQXSBGaXggaW52YWxpZCBlcmFzZSBkdXJpbmcgaXRlcmF0aW9uIG9mIHN0ZDo6bWFwIGluIGdlbmVyYXRlZAoJICAgIGRpcmVjdG9yIGNvZGUuICBSZXBvcnRlZCBieSBDb3J5IEJlbm5ldHQgaW4gU0YjMzE3NTgyMC4KCjIwMTEtMDItMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFByZXByb2Nlc3Npbmcgbm93IHdhcm5zIGlmIGV4dHJhIHRva2VucyBhcHBlYXIgYWZ0ZXIgI2Vsc2UgYW5kICNlbmQuCgoyMDExLTAyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE2NTMwOTIgUHJlcHJvY2Vzc29yIGRvZXMgbm90IGVycm9yIG91dCB3aGVuICNlbGlmIGlzIG1pc3NpbmcgYW4gZXhwcmVzc2lvbi4KICAgICAgICAgICAgVGhpcyBhbmQgb3RoZXIgY2FzZXMgb2YgbWlzc2luZyBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMgbm93IHJlc3VsdCBpbiBhbiBlcnJvci4KCjIwMTEtMDItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY2FtbF0gQXBwbHkgcGF0Y2ggIzMxNTE3ODggZnJvbSBKb2VsIFJleW1vbnQuIEJyaW5ncyBPY2FtbCBzdXBwb3J0IHVwIHRvIGRhdGUgCiAgICAgICAgICAgICh2ZXIgMy4xMSBhbmQgMy4xMiksIGluY2x1ZGluZyBzdGQ6OnN0cmluZy4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAjMzE3NjI3NCBmcm9tIEphbWVzIE1hc3RlcnMgLSB0eXBlY2hlY2sgdHlwZW1hcCBmb3IgdGltZV90LgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMxNzE3OTMgZnJvbSBzemFnZXIgLSBwcm90ZWN0ZWQgZGlyZWN0b3IgbWV0aG9kcyBmYWlsaW5nIHdoZW4gLWZ2aXJ0dWFsIGlzIHVzZWQuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE5Mjc4NTIgLSAjaW5jbHVkZSBkaXJlY3RpdmVzIGRvbid0IHByZXByb2Nlc3MgdGhlIGZpbGUgcGFzc2VkIHRvIGl0LiBUaGUgZml4IGlzIGZvcgogICAgICAgICAgICAjaW5jbHVkZSB3aXRoIC1pbXBvcnRhbGwgb3IgLWluY2x1ZGVhbGwsICVpbmNsdWRlIGFuZCAlaW1wb3J0LCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICAjZGVmaW5lIEZJTEVOQU1FICJhYmMuaCIKICAgICAgICAgICAgICAlaW5jbHVkZSBGSUxFTkFNRQoKMjAxMS0wMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTQwNTM2LCBvdmVyYWN0aXZlIHByZXByb2Nlc3NvciB3aGljaCB3YXMgZXhwYW5kaW5nIGRlZmluZWQoLi4uKSBvdXRzaWRlIG9mICNpZiBhbmQgI2VsaWYKICAgICAgICAgICAgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWVdIFNGICMyOTQyODk5IEFkZCB1c2VyIHN1cHBsaWVkIGRvY3VtZW50YXRpb24gdG8gaGVscCBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCBNelNjaGVtZS4KICAgICAgICAgICAgVXBkYXRlIGNoYXB0ZXIgbmFtZSB0byBNelNjaGVtZS9SYWNrZXQgYWNjb3VudGluZyBmb3IgdGhlIHJlbmFtZSBvZiBNelNjaGVtZSB0byBSYWNrZXQuCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFNGICMzMDg1OTA2IC0gUG9zc2libGUgZml4IHJ1bm5pbmcgdGVzdC1zdWl0ZSBvbiBNYWMgT1NYLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzMxNzMzNjcgQmV0dGVyIGluZm9ybWF0aW9uIGR1cmluZyBjb25maWd1cmUgYWJvdXQgQm9vc3QgcHJlcmVxdWlzaXRlIGZvciBydW5uaW5nCiAgICAgICAgICAgIHRoZSB0ZXN0LXN1aXRlLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzMxMjc2MzMgRml4IGluZmluaXRlIGxvb3AgaW4gcmVjdXJzaXZlIHR5cGVkZWYgcmVzb2x1dGlvbi4KCjIwMTEtMDItMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBTRiAjMzE2ODY3NiBGaXggJXJlbmFtZSBub3Qgd29ya2luZyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBhbmQgbWV0aG9kcy4KCjIwMTEtMDItMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtjbGlzcF0gU0YgIzMxNDgyMDAgRml4IHNlZ2ZhdWx0IHBhcnNpbmcgbmVzdGVkIHVuaW9ucy4KCjIwMTEtMDItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRGlyZWN0b3JzIC0gYSBjYWxsIHRvIGEgbWV0aG9kIGJlaW5nIGRlZmluZWQgaW4gdGhlIGJhc2UgY2xhc3MsIG5vdAogICAgICAgICAgICBvdmVycmlkZGVuIGluIGEgc3ViY2xhc3MsIGJ1dCBhZ2FpbiBvdmVycmlkZGVuIGluIGEgY2xhc3MgZGVyaXZlZCBmcm9tCiAgICAgICAgICAgIHRoZSBmaXJzdCBzdWJjbGFzcyB3YXMgbm90IGJlaW5nIGRpc3BhdGNoZWQgY29ycmVjdGx5IHRvIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MuCiAgICAgICAgICAgIFNlZSBkaXJlY3Rvcl9hbHRlcm5hdGluZy5pIGZvciBhbiBleGFtcGxlLgoKMjAxMS0wMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBbnkgJ3VzaW5nJyBzdGF0ZW1lbnRzIGluIHRoZSBwcm90ZWN0ZWQgc2VjdGlvbiBvZiBhIGNsYXNzIHdlcmUgcHJldmlvdXNseQogICAgICAgICAgICBpZ25vcmVkIHdpdGggZGlyZWN0b3IgcHJvdGVjdGVkIChkaXJwcm90KSBtb2RlLgoKMjAxMS0wMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IG92ZXJsb2FkaW5nIHdpdGggY29uc3QgcG9pbnRlciByZWZlcmVuY2UgKFNXSUdUWVBFICpjb25zdCYpIHBhcmFtZXRlcnMgZm9yIGEKICAgICAgICAgICAgbnVtYmVyIG9mIHNjcmlwdGluZyBsYW5ndWFnZXMuCgoyMDExLTAxLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgd2FybmluZyBmb3Igc21hcnQgcG9pbnRlcnMgaWYgb25seSBzb21lIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBpbmhlcml0YW5jZQogICAgICAgICAgICBjaGFpbiBhcmUgbWFya2VkIGFzIHNtYXJ0IHBvaW50ZXIsIGVnLCAlc2hhcmVkX3B0ciBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIGNsYXNzZXMKICAgICAgICAgICAgaW4gYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5LCBzbyB0aGlzIG5ldyB3YXJuaW5nIGhpZ2hsaWdodHMgY29kZSB3aGVyZSB0aGlzIGlzCiAgICAgICAgICAgIG5vdCB0aGUgY2FzZS4KCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjEyOiBXYXJuaW5nIDUyMDogQmFzZSBjbGFzcyAnQScgb2YgJ0InIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlci4KICAgICAgICAgICAgICBleGFtcGxlLmk6MTY6IFdhcm5pbmcgNTIwOiBEZXJpdmVkIGNsYXNzICdDJyBvZiAnQicgaXMgbm90IHNpbWlsYXJseSBtYXJrZWQgYXMgYSBzbWFydCBwb2ludGVyLgoKMjAxMS0wMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgc29tZSBtaXNzaW5nIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzOiAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSBhbmQgCiAgICAgICAgICAgIChjaGFyICpTVFJJTkcsIGludCBMRU5HVEgpLiBEb2N1bWVudGF0aW9uIGZvciB0aGlzIHVwZGF0ZWQuIEphdmEgcGF0Y2ggZnJvbQogICAgICAgICAgICBWb2xrZXIgR3JhYnNjaC4KCjIwMTEtMDEtMTE6IGlhbnQKCSAgICBSZXF1aXJlIEdvIHZlcnNpb24gNzA3NyBvciBsYXRlci4KCjIwMTAtMTItMzA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtDIywgRCwgSmF2YV0gQ2hlY2sgZm9yIGNvbGxpc2lvbiBvZiBwYXJhbWV0ZXIgbmFtZXMgd2l0aCB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2Uga2V5d29yZHMgd2hlbiBnZW5lcmF0aW5nIHRoZSBkaXJlY3RvciBnbHVlIGNvZGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgc2l0dWF0aW9uIGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgY291bGQgd291bGQgcHJldmlvdXNseSBiZQogICAgICAgICAgICBpbnZhbGlkIGlzIGlsbHVzdHJhdGVkIGluIHRoZSBuZXcgJ2RpcmVjdG9yX2tleXdvcmRzJyB0ZXN0IGNhc2UuCgoyMDEwLTEyLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAkY3NpbnB1dCBzcGVjaWFsIHZhcmlhYmxlIG5vdCBiZWluZyBleHBhbmRlZCBmb3IgY3N2YXJpbiB0eXBlbWFwcwogICAgICAgICAgICB3aGVuIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXMuIFJlcG9ydGVkIGJ5IFZhZGltIFplaXRsaW4uCgoyMDEwLTEyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJGJhc2VtYW5nbGUgZXhwYW5zaW9uIGluIGFycmF5IHR5cGVtYXBzLiBGb3IgZXhhbXBsZSBpZiB0eXBlIGlzIGludCAqWzNdLAogICAgICAgICAgICAkYmFzZW1hbmdsZSBleHBhbmRzIHRvIF9wX2ludC4KCjIwMTAtMTItMDc6IGlhbnQKCSAgICBDaGVjayB0aGF0IHdlIGFyZSB1c2luZyBhIHN1ZmZpY2llbnRseSBuZXcgdmVyc2lvbiBvZiB0aGUKCSAgICA2ZyBvciA4ZyBHbyBjb21waWxlciBkdXJpbmcgY29uZmlndXJlIHRpbWUuIElmIG5vdCwgZGlzYWJsZSBHby4KICAgICAgICAgICAgTWluaW11bSB2ZXJzaW9uIGlzIG5vdyA2NzA3LgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMTItMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzEyNzM5NCAtIHVzZSBvZiBuZXR3b3JrIHBhdGhzIG9uIFdpbmRvd3MvTVN5cy4KCjIwMTAtMTEtMTg6IGtsaWNrdmVyYm90CgkgICAgW0RdIEFkZGVkIHRoZSBEIGxhbmd1YWdlIG1vZHVsZS4KCjIwMTAtMTEtMTI6IHZhZHoKCSAgICBGaXggaGFuZGxpbmcgb2YgbXVsdGlwbGUgcmVnZXgtdXNpbmcgJXJlbmFtZXMgYXR0YWNoZWQgdG8gdGhlIHNhbWUKCSAgICBkZWNsYXJhdGlvbi4gRm9yIGV4YW1wbGUsIG5vdwoKCSAgICAgICVyZW5hbWUoIiUocmVnZXgvXlNldCguKikvcHV0XFwxLylzIikgIiI7CgkgICAgICAlcmVuYW1lKCIlKHJlZ2V4L15HZXQoLiopL2dldFxcMS8pcyIpICIiOwoKCSAgICB3b3JrcyBhcyBleHBlY3RlZCB3aGVyZWFzIGJlZm9yZSBvbmx5IHRoZSBsYXN0IGFub255bW91cyByZW5hbWUgd2FzCgkgICAgdGFrZW4gaW50byBhY2NvdW50LgoKMjAxMC0xMC0xNzogZHJqb2UKCSAgICBbUl0gRml4IGZhaWx1cmUgaW4gb3ZlcmxvYWRlZCBmdW5jdGlvbnMgd2hpY2ggd2FzIGJyZWFraW5nCgkgICAgUXVhbnRMaWItU1dJRwoKMjAxMC0xMC0xNDogb2xseQoJICAgIFtQSFBdIEFsbG93IGNvbXBpbGF0aW9uIG9uIG5vbi1jb25mb3JtaW5nIE1pY3Jvc29mdCBDKysgY29tcGlsZXJzCgkgICAgd2hpY2ggZG9uJ3QgYWNjZXB0OiByZXR1cm4gZnVuY3Rpb25fcmV0dXJuaW5nX3ZvaWQoKTsKCSAgICBSZXBvcnRlZCBieSBGcmFuayBWYW5kZW4gQmVyZ2hlbiBvbiB0aGUgU1dJRyBtYWlsaW5nIGxpc3QuCgoyMDEwLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSAoZ2xvYmFsIHNjb3BlKSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMi4wLjAsIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJlbiBXYWxrZXIuIFRoZSBtYW5nbGVkIHN5bWJvbCBuYW1lcyB3ZXJlIGluY29ycmVjdCwgc29tZXRpbWVzIHJlc3VsdGluZyBpbiB0eXBlcyBiZWluZwogICAgICAgICAgICBpbmNvcnJlY3RseSB0cmVhdGVkIGFzIG9wYXF1ZSB0eXBlcy4KCiAgICAgICAgICAgIEFsc28gZml4ZXMgIzI5NTg3ODEgYW5kIHNvbWUgb3RoZXIgdHlwZSBwcm9ibGVtcyBkdWUgdG8gYmV0dGVyIHR5cGVkZWYgcmVzb2x1dGlvbiwgZWcgCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQgKj46OnZhbHVlX3R5cGUgZGlkbid0IHJlc29sdmUgdG8gVCAqIHdoZW4gaXQgc2hvdWxkIGhhdmUuIFRoZSBtYW5nbGVkIHR5cGUKICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IFNXSUdUWVBFX3N0ZF9fdmVjdG9yVF9UZXN0X3Bfc3RkX19hbGxvY2F0b3JUX1Rlc3RfcF90X3RfX3ZhbHVlX3R5cGUgYW5kIG5vdwogICAgICAgICAgICBpdCBpcyBjb3JyZWN0bHkgU1dJR1RZUEVfcF9UZXN0LgoKVmVyc2lvbiAyLjAuMSAoNCBPY3RvYmVyIDIwMTApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMC0xMC0wMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMwNjY5NTggZnJvbSBNaWthZWwgSm9oYW5zc29uIHRvIGZpeCBkZWZhdWx0IHNtYXJ0IHBvaW50ZXIKICAgICAgICAgICAgaGFuZGxpbmcgd2hlbiB0aGUgc21hcnQgcG9pbnRlciBjb250YWlucyBib3RoIGEgY29uc3QgYW5kIG5vbi1jb25zdCBvcGVyYXRvci0+LgoKMjAxMC0xMC0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIC1wY3JldmVyc2lvbiBvcHRpb24gdG8gZGlzcGxheSBQQ1JFIHZlcnNpb24gaW5mb3JtYXRpb24uCgoyMDEwLTEwLTAxOiBvbGx5CgkgICAgW1J1YnldIEF2b2lkIHNlZ2ZhdWx0IHdoZW4gYSBtZXRob2Qgbm9kZSBoYXMgbm8gcGFyZW50Tm9kZQoJICAgIChTRiMzMDM0MDU0KS4KCjIwMTAtMTAtMDE6IG9sbHkKCSAgICBbUHl0aG9uXSBBbGxvdyByZWluaXRpYWxpc2F0aW9uIHRvIHdvcmsgd2l0aCBhbiBlbWJlZGRlZCBQeXRob24KCSAgICBpbnRlcnByZXRlciAocGF0Y2ggZnJvbSBKaW0gQ2Fycm9sbCBpbiBTRiMzMDc1MTc4KS4KCjIwMTAtMDktMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggZnJvbSBUb21hcyBEaXJ2YW5hdXNrYXMgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIHRvIGF2b2lkCiAgICAgICAgICAgIHRocm93aW5nIGV4Y2VwdGlvbnMgd2l0aCBub3JtYWwgdXNhZ2Ugb2YgaXRlcmF0b3JzLgoKMjAxMC0wOS0yNzogb2xseQoJICAgIFtQeXRob25dIEltcHJvdmUgZXJyb3IgbWVzc2FnZSBnaXZlbiB3aGVuIGEgcGFyYW1ldGVyIG9mIHRoZSB3cm9uZwoJICAgIHR5cGUgaXMgcGFzc2VkIHRvIGFuIG92ZXJsb2FkZWQgbWV0aG9kIChTRiMzMDI3MzU1KS4KCjIwMTAtMDktMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IFNGIHBhdGNoICMzMDc1MTUwIC0gSmF2YSBkaXJlY3RvcnMgdXNpbmcgc3RhdGljIHZhcmlhYmxlcyBpbgogICAgICAgICAgICBuYW1lZCBuYW1lc3BhY2UuCgoyMDEwLTA5LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGZpbGUgYW5kIGxpbmUgZXJyb3Ivd2FybmluZyByZXBvcnRpbmcgZml4ZXMgd2hlcmUgU1dJRyBtYWNyb3MKICAgICAgICAgICAgYXJlIHVzZWQgd2l0aGluIHt9IGJyYWNlcyAod2hlcmUgdGhlIHByZXByb2Nlc3NvciBleHBhbmRzIG1hY3JvcyksCiAgICAgICAgICAgIGZvciBleGFtcGxlIG1hY3JvcyB3aXRoaW4gJWlubGluZSB7Li4ufSBhbmQgJWZyYWdtZW50KC4uLikgey4uLn0KICAgICAgICAgICAgYW5kIG5lc3RlZCBzdHJ1Y3RzLgoKMjAxMC0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBmaWxlIGFuZCBsaW5lIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGZpeGVzIGZvciB2YXJpb3VzIGluaGVyaXRlZAogICAgICAgICAgICBjbGFzcyBwcm9ibGVtcy4KCjIwMTAtMDktMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEEgbXVjaCBpbXByb3ZlZCBkZWJ1Z2dpbmcgb2YgU1dJRyBzb3VyY2UgZXhwZXJpZW5jZSBpcyBub3cgYXZhaWxhYmxlIGFuZAogICAgICAgICAgICBkb2N1bWVudGVkIGluIHRoZSAiRGVidWdnaW5nIFNXSUciIHNlY3Rpb24gaW4gdGhlIERvYy9EZXZlbC9pbnRlcm5hbHMuaHRtbAogICAgICAgICAgICBmaWxlLCBpbmNsdWRpbmcgYSBzd2lnLmRiZyBzdXBwb3J0IGZpbGUgZm9yIHRoZSBnZGIgZGVidWdnZXIuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3Mgd2hlbiBhIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb24gZW5kcyB3aXRoICcvJyBhbmQgaXQgaXMgbm90IHRoZSBlbmQgb2YgYSBDIGNvbW1lbnQuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3MgYWZ0ZXIgcGFyc2luZwogICAgICAgICAgICBtYWNybyBpbnZvY2F0aW9ucyB3aXRoIHBhcmFtZXRlcnMgZ2l2ZW4gb3ZlciBtb3JlIHRoYW4gb25lIGxpbmUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgZXh0cmFuZW91cyBleHRyYSBsaW5lIGluIHByZXByb2Nlc3NlZCBvdXRwdXQgYWZ0ZXIgaW5jbHVkaW5nIGZpbGVzCiAgICAgICAgICAgIHdoaWNoIHdvdWxkIHNvbWV0aW1lcyBsZWFkIHRvIGVycm9yL3dhcm5pbmcgbWVzc2FnZXMgdHdvIGxpbmVzIGFmdGVyIHRoZQogICAgICAgICAgICBlbmQgb2YgdGhlIGZpbGUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzIxNDk1MjMgLSBJbmNvcnJlY3QgbGluZSBudW1iZXIgcmVwb3J0aW5nIGluIGVycm9ycyBhZnRlciBwYXJzaW5nIG1hY3JvcwogICAgICAgICAgICBjb250YWluaW5nIEMrKyBjb21tZW50cy4KCjIwMTAtMDktMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgT1VUUFVUIHR5cGVtYXBzIChQYXRjaCBmcm9tIFJ5YW4gaW4gU0YjMzA1ODM5NCkuCgoyMDEwLTA5LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZXJyb25lb3VzIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBmb3IgbWFjcm8gZXhwYW5zaW9ucywgZm9yIGV4YW1wbGUsCiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlIG5vdyBwb2ludHMgdG8gaW5zdGFudGlhdGlvbiBvZiB0aGUgbWFjcm8sIGllIHRoZSBsYXN0IGxpbmUgaGVyZToKCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNSTzIoYSwgYikgCgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8xKE5BTUUpIE1BQ1JPMihOQU1FLDIsMykgCgogICAgICAgICAgICAgIE1BQ1JPMShhYmMpCgoyMDEwLTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGZvciBwcmVwcm9jZXNzb3IgbWVzc2FnZXMgd2l0aGluCiAgICAgICAgICAgICVpbmxpbmUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgI2RlZmluZSBGT09CQVIgMQogICAgICAgICAgICAgICNkZWZpbmUgRk9PQkFSICJoaSIKICAgICAgICAgICAgICAlfQoKMjAxMC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyB3aGljaCB3ZXJlIGN1bXVsYXRpdmVseSBvbmUKICAgICAgICAgICAgbGVzcyB0aGFuIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiBhZnRlciBwYXJzaW5nIGVhY2ggJWluY2x1ZGUvJWltcG9ydCAtIGJ1ZwogICAgICAgICAgICBpbnRyb2R1Y2VkIGluIHN3aWctMS4zLjMyLiBBbHNvIGZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICAgd2hlbiBuZXcgbGluZSBjaGFyYWN0ZXJzIGFwcGVhciBiZXR3ZWVuIHRoZSAlaW5jbHVkZSAvICVpbXBvcnQgc3RhdGVtZW50IGFuZAogICAgICAgICAgICB0aGUgZmlsZW5hbWUuCgoyMDEwLTA4LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXIgYW5kIGZpbGUgbmFtZSByZXBvcnRpbmcgZm9yIHNvbWUgbWFjcm8gcHJlcHJvY2Vzc29yIHdhcm5pbmdzLgogICAgICAgICAgICBUaGUgbGluZSBudW1iZXIgb2YgdGhlIG1hY3JvIGFyZ3VtZW50IGhhcyBiZWVuIGNvcnJlY3RlZCBhbmQgdGhlIGxpbmUgbnVtYmVyCiAgICAgICAgICAgIG9mIHRoZSBzdGFydCBvZiB0aGUgbWFjcm8gaW5zdGVhZCBvZiBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBtYWNybyBpcyB1c2VkLgogICAgICAgICAgICBTb21lIGV4YW1wbGVzOgogICAgICAgICAgICAgIGZpbGUuaDoxMTogRXJyb3I6IElsbGVnYWwgbWFjcm8gYXJndW1lbnQgbmFtZSAnLi4nCiAgICAgICAgICAgICAgZmlsZS5oOjE5OiBFcnJvcjogTWFjcm8gJ0RVUExJQ0FURScgcmVkZWZpbmVkLAogICAgICAgICAgICAgIGZpbGUuaDoxNTogRXJyb3I6IHByZXZpb3VzIGRlZmluaXRpb24gb2YgJ0RVUExJQ0FURScuCiAgICAgICAgICAgICAgZmlsZS5oOjI1OiBFcnJvcjogVmFyaWFibGUtbGVuZ3RoIG1hY3JvIGFyZ3VtZW50IG11c3QgYmUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgICBmaWxlLmg6MzI6IEVycm9yOiBJbGxlZ2FsIGNoYXJhY3RlciBpbiBtYWNybyBhcmd1bWVudCBuYW1lCiAgICAgICAgICAgICAgZmlsZS5pOjM3OiBFcnJvcjogTWFjcm8gJ1NJVCcgZXhwZWN0cyAyIGFyZ3VtZW50cwoKMjAxMC0wOC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IF9fTElORV9fIGFuZCBfX0ZJTEVfXyBleHBhbnNpb24gcmVwb3J0ZWQgYnkgQ2FtaWxsZSBHaWxsb3QuIE1vc3RseSB0aGlzCiAgICAgICAgICAgIGRpZCBub3Qgd29yayBhdCBhbGwuIEFsc28gZml4ZXMgU0YgIzI4MjI4MjIuCgoyMDEwLTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGNvcm5lciBjYXNlIG1hcnNoYWxsaW5nIG9mIGRvdWJsZXMgLSBlcnJubyB3YXMgbm90IGJlaW5nIGNvcnJlY3RseQogICAgICAgICAgICBzZXQgYmVmb3JlIGNhbGxpbmcgc3RydG9kIC0gcGF0Y2ggZnJvbSBKdXN0aW4gVmFsbG9uIC0gU0YgQnVnICMzMDM4OTM2LgoKMjAxMC0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IG1ha2UgZGlzdGNsZWFuIHdoZW4gc29tZSBvZiB0aGUgbW9yZSBvYnNjdXJlIGxhbmd1YWdlcyBhcmUgZGV0ZWN0ZWQgYnkKICAgICAgICAgICAgY29uZmlndXJlIC0gZml4ZXMgZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDEwLTA3LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlIGNvbmZpZ3VyaW5nIG91dCBvZiBzb3VyY2UgZm9yIHRoZSB0ZXN0LXN1aXRlIHNpbmNlIGl0IGJyb2tlIGluIDEuMy4zNy4KICAgICAgICAgICAgQXMgcHJldmlvdXNseSwgaWYgcnVubmluZyAnbWFrZSBjaGVjay10ZXN0LXN1aXRlJyBvdXQgb2Ygc291cmNlLCBpdCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGJ5IGludm9raW5nIGNvbmZpZ3VyZSB3aXRoIGEgcmVsYXRpdmUgcGF0aC4gSW52b2tpbmcgY29uZmlndXJlIHdpdGggYW4KICAgICAgICAgICAgYWJzb2x1dGUgcGF0aCB3aWxsIG5vdCB3b3JrLiBSdW5uaW5nIHRoZSBmdWxsICdtYWtlIGNoZWNrJyBzdGlsbCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGluIHRoZSBzb3VyY2UgdHJlZS4KCjIwMTAtMDctMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbiBwb2ludGVycyBhbmQgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIHJldHVybnMgYnkgcmVmZXJlbmNlLgoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIHRoZSBvbGQgZXhwZXJpbWVudGFsICJyeHNwZW5jZXIiIGVuY29kZXIgYW5kCiAgICAgICAgICAgICJbbm90XXJ4c21hdGNoIiBpbiAlcmVuYW1lIChzZWUgdGhlIDAxLzE2LzIwMDYgZW50cnkpLiBUaGUgbmV3IGFuZAogICAgICAgICAgICBvZmZpY2lhbGx5IHN1cHBvcnRlZCAicmVnZXgiIGVuY29kZXIgYW5kICJbbm90XXJlZ2V4bWF0Y2giIGNoZWNrcwogICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIChzZWUgdGhlIHR3byBwcmV2aW91cyBlbnRyaWVzKS4gUGxlYXNlCiAgICAgICAgICAgIHJlcGxhY2UgIiUocnhzcGVuY2VyOltwYXRdW3N1YnN0XSlzIiB3aXRoICIlKHJlZ2V4Oi9wYXQvc3Vic3QvKXMiCiAgICAgICAgICAgIHdoZW4gdXBncmFkaW5nLiBOb3RpY2UgdGhhdCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcmVwbGFjZSB0aGUgYmFjay0KICAgICAgICAgICAgcmVmZXJlbmNlcyBvZiBmb3JtICJAMSIgd2l0aCB0aGUgbW9yZSBzdGFuZGFyZCAiXFwxIiBhbmQgbWF5IG5lZWQgdG8KICAgICAgICAgICAgYWRqdXN0IHlvdXIgcmVndWxhciBleHByZXNzaW9ucyBzeW50YXggYXMgdGhlIG5ldyByZWdleCBlbmNvZGVyIHVzZXMKICAgICAgICAgICAgUGVybC1jb21wYXRpYmxlIHN5bnRheCBhbmQgbm90IChleHRlbmRlZCkgUE9TSVggc3ludGF4IGFzIHRoZSBvbGQgb25lLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCAicmVnZXhtYXRjaCIsICJyZWdleHRhcmdldCIgYW5kICJub3RyZWdleG1hdGNoIiB3aGljaCBjYW4gYmUKICAgICAgICAgICAgdXNlZCB0byBhcHBseSAlcmVuYW1lIGRpcmVjdGl2ZXMgdG8gdGhlIGRlY2xhcmF0aW9ucyBtYXRjaGluZyB0aGUKICAgICAgICAgICAgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbmx5LiBUaGUgZmlyc3QgdHdvIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGludGVyY2hhbmdlYWJseSwgYm90aCBvZiB0aGUgJXJlbmFtZXMgYmVsb3cgZG8gdGhlIHNhbWUgdGhpbmc6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4bWF0Y2gkbmFtZT0iT2xkJCIpICIiOwogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4dGFyZ2V0PTEpICJPbGQkIjsKCiAgICAgICAgICAgIChuYW1lbHkgaWdub3JlIHRoZSBkZWNsYXJhdGlvbnMgaGF2aW5nICJPbGQiIHN1ZmZpeCkuCgogICAgICAgICAgICAibm90cmVnZXhtYXRjaCIgcmVzdHJpY3RzIHRoZSBtYXRjaCB0byBvbmx5IHRoZSBkZWNsYXJhdGlvbnMgd2hpY2gKICAgICAgICAgICAgZG8gbm90IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGUuZy4gaGVyZSBpcyBob3cgdG8gcmVuYW1lIHRvCiAgICAgICAgICAgIGxvd2VyIGNhc2UgdmVyc2lvbnMgYWxsIGRlY2xhcmF0aW9ucyBleGNlcHQgdGhvc2UgY29uc2lzdGluZyBmcm9tCiAgICAgICAgICAgIGNhcGl0YWwgbGV0dGVycyBvbmx5OgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiQobG93ZXJjYXNlKXMiLCBub3RyZWdleG1hdGNoJG5hbWU9Il5bQS1aXSskIikgIiI7CgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCB0aGUgbmV3ICJyZWdleCIgZW5jb2RlciB0aGF0IGNhbiBiZSB1c2VkIGluICVyZW5hbWUsIGUuZy4KCiAgICAgICAgICAgICAgICAlcmVuYW1lKCJyZWdleDovKFxcdyspXyguKikvXFwyLyIpICIiOwoKICAgICAgICAgICAgdG8gcmVtb3ZlIGFueSBhbHBoYWJldGljYWwgcHJlZml4IGZyb20gYWxsIGlkZW50aWZpZXJzLiBUaGUgc3ludGF4CiAgICAgICAgICAgIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGlzIFBlcmwtbGlrZSBhbmQgUENSRSBsaWJyYXJ5CiAgICAgICAgICAgIChodHRwOi8vd3d3LnBjcmUub3JnLykgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlIGJ1dCBub3RpY2UKICAgICAgICAgICAgdGhhdCBiYWNrc2xhc2hlcyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgdXN1YWwgaW5zaWRlIEMgc3RyaW5ncy4KCiAgICAgICAgICAgIE9yaWdpbmFsIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAxMC0wNy0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzMDI0ODc1IC0gc2hhcmVkX3B0ciBvZiBjbGFzc2VzIHdpdGggbm9uLXB1YmxpYyBkZXN0cnVjdG9ycy4gVGhpcyBhbHNvIGZpeGVzCiAgICAgICAgICAgIHRoZSAidW5yZWYiIGZlYXR1cmUgd2hlbiB1c2VkIG9uIGNsYXNzZXMgd2l0aCBub24tcHVibGljIGRlc3RydWN0b3JzLgoKMjAxMC0wNi0xNzogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBBZGQgdGhlIEdvIGxhbmd1YWdlIG1vZHVsZS4KCjIwMTAtMDYtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCBTV0lHX2x1YV9pc25pbHN0cmluZyBtdWx0aXBseSBkZWZpbmVkIHdoZW4gdXNpbmcgbXVsdGlwbGUKICAgICAgICAgICAgbW9kdWxlcyBhbmQgd3JhcHBpbmcgc3RyaW5ncy4gUGF0Y2ggZnJvbSAnTnVtYmVyIENydW5jaGVyJy4KCjIwMTAtMDYtMTA6IG9sbHkKCSAgICBbUEhQXSBGaXggZGlyZWN0b3JzIHRvIGNvcnJlY3RseSBjYWxsIGEgbWV0aG9kIHdpdGggaGFzIGEKCSAgICBkaWZmZXJlbnQgbmFtZSBpbiBQSFAgdG8gQysrICh3ZSB3ZXJlIGFsd2F5cyB1c2luZyB0aGUgQysrIG5hbWUKCSAgICBpbiB0aGlzIGNhc2UpLgoKMjAxMC0wNi0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVuY29tcGlsZWFibGUgY29kZSB3aGVuICVyZW5hbWUgcmVzdWx0cyBpbiB0d28gZW51bSBpdGVtcwogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG5hbWUuIFJlcG9ydGVkIGJ5IFZhZGltIFplaXRsaW4uCgpWZXJzaW9uIDIuMC4wICgyIEp1bmUgMjAxMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEwLTA2LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBTV0lHX1NURF9WRUNUT1JfRU5IQU5DRUQgbWFjcm8gdXNlZCBpbiBzdGQ6OnZlY3RvciB0byB3b3JrIHdpdGgKICAgICAgICAgICAgdHlwZXMgY29udGFpbmluZyBjb21tYXMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfRU5IQU5DRUQoc3RkOjpwYWlyPCBkb3VibGUsIHN0ZDo6c3RyaW5nID4pCgoyMDEwLTA2LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gc3RkX3NoYXJlZF9wdHIuaSBmb3Igd3JhcHBpbmcgc3RkOjpzaGFyZWRfcHRyLiBSZXF1aXJlcyB0aGUgJXNoYXJlZF9wdHIKICAgICAgICAgICAgbWFjcm8gbGlrZSBpbiB0aGUgYm9vc3Rfc2hhcmVkX3B0ci5pIGxpYnJhcnkuIHN0ZDo6dHIxOjpzaGFyZWRfcHRyIGNhbiBhbHNvIGJlCiAgICAgICAgICAgIHdyYXBwZWQgaWYgdGhlIGZvbGxvd2luZyBtYWNybyBpcyBkZWZpbmVkOgoKICAgICAgICAgICAgICAjZGVmaW5lIFNXSUdfU0hBUkVEX1BUUl9TVUJOQU1FU1BBQ0UgdHIxCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9zaGFyZWRfcHRyLmk+CgogICAgICAgICAgICBzaGFyZWRfcHRyIGlzIGFsc28gZG9jdW1lbnRlZCBpbiBMaWJyYXJ5Lmh0bWwgbm93LgoKMjAxMC0wNS0yNzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBhYmlsaXR5IGZvciAkdHlwZW1hcCBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcyB0byBjYWxsIG90aGVyICR0eXBlbWFwCiAgICAgICAgICAgIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBDQyAiQ0MiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBCQiAiJHR5cGVtYXAoY3N0eXBlLCBDQykiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBBQSAiJHR5cGVtYXAoY3N0eXBlLCBCQikiCiAgICAgICAgICAgICAgdm9pZCBoYWgoQUEgYWEpOwoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIEMjIHN0ZDo6dmVjdG9yIGNvbnRhaW5lcnMgb2Ygc2hhcmVkX3B0ciBhbmQgJXNoYXJlZF9wdHIuCgogICAgICAgICAgICBBbHNvIGFkZGVkIGRpYWdub3N0aWNzIGZvciAkdHlwZW1hcCB3aXRoIC1kZWJ1Zy10bXNlYXJjaCwgZm9yIGV4YW1wbGUsIHRoZQogICAgICAgICAgICBhYm92ZSBkaXNwbGF5cyBhZGRpdGlvbmFsIGRpYWdub3N0aWMgbGluZXMgc3RhcnRpbmcgIkNvbnRhaW5pbmc6ICI6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozNDogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBBQSBhYQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEFBIGFhCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQUEKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIEFBCiAgICAgICAgICAgICAgICBDb250YWluaW5nOiAkdHlwZW1hcChjc3R5cGUsIEJCKQogICAgICAgICAgICAgIGV4YW1wbGUuaTozMTogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBCQgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEJCCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBCQgogICAgICAgICAgICAgICAgQ29udGFpbmluZzogJHR5cGVtYXAoY3N0eXBlLCBDQykKICAgICAgICAgICAgICBleGFtcGxlLmk6Mjk6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQ0MKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBDQwogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQ0MKCjIwMTAtMDUtMjY6IG9sbHkKCSAgICBGaXggJWF0dHJpYnV0ZTJyZWYgbm90IHRvIHByb2R1Y2UgYSBzeW50YXggZXJyb3IgaWYgdGhlIGxhc3QKCSAgICBhcmd1bWVudCAoQWNjZXNzb3JNZXRob2QpIGlzIG9taXR0ZWQuICBQYXRjaCBmcm9tIERhdmlkIFBpZXBncmFzCgkgICAgaW4gU0YjMjIzNTc1Ni4KCjIwMTAtMDUtMjY6IG9sbHkKCSAgICBbUEhQXSBXaGVuIHVzaW5nICV0aHJvd3Mgb3IgJWNhdGNoZXMsIFNXSUctZ2VuZXJhdGVkIFBIUDUgd3JhcHBlcnMKCSAgICBub3cgdGhyb3cgUEhQIEV4Y2VwdGlvbiBvYmplY3RzIGluc3RlYWQgb2YgZ2l2aW5nIGEgUEhQIGVycm9yIG9mCgkgICAgdHlwZSBFX0VSUk9SLgoKCSAgICBUaGlzIGNoYW5nZSBzaG91bGRuJ3QgY2F1c2UgaW5jb21wYXRpYmlsaXR5IGlzc3Vlcywgc2luY2UgeW91IGNhbid0CgkgICAgc2V0IGFuIGVycm9yIGhhbmRsZXIgZm9yIEVfRVJST1IsIHNvIHByZXZpb3VzbHkgUEhQIHdvdWxkIGp1c3QgZXhpdAoJICAgIHdoaWNoIGFsc28gaGFwcGVucyBmb3IgdW5oYW5kbGVkIGV4Y2VwdGlvbnMuICBUaGUgYmVuZWZpdCBpcyB5b3UgY2FuCgkgICAgbm93IGNhdGNoIHRoZW0gaWYgeW91IHdhbnQgdG8uCgoJICAgIEZpeGVzIFNGIzI1NDU1NzggYW5kIFNGIzI5NTU1MjIuCgoyMDEwLTA1LTI1OiBvbGx5CgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgZGlyZWN0b3JpbiB0eXBlbWFwIGZvciBjb25zdCBzdGQ6OnN0cmluZyAmLgoJICAgIEZpeGVzIFNGIzMwMDY0MDQgcmVwb3J0ZWQgYnkgdC1MZWdpYXcuCgoyMDEwLTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAjMjk1NzM3NSAtIFNXSUdTdHJpbmdIZWxwZXIgYW5kIFNXSUdFeGNlcHRpb25IZWxwZXIgbm90IGFsd2F5cyBiZWluZwogICAgICAgICAgICBpbml0aWFsaXplZCBiZWZvcmUgdXNlIGluIC5ORVQgNCBhcyB0aGUgY2xhc3NlcyB3ZXJlIG5vdCBtYXJrZWQgYmVmb3JlZmllbGRpbml0LgogICAgICAgICAgICBBIHN0YXRpYyBjb25zdHJ1Y3RvciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXByYWdtYShjc2hhcnApIGltY2xhc3Njb2RlPSV7CiAgICAgICAgICAgICAgICBzdGF0aWMgJGltY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBJZiB5b3UgaGFkIGFkZGVkIHlvdXIgb3duIGN1c3RvbSBzdGF0aWMgY29uc3RydWN0b3IgdG8gdGhlIGludGVybWVkaWFyeSBjbGFzcyBpbgogICAgICAgICAgICB0aGUgc2FtZSB3YXkgYXMgYWJvdmUsIHlvdSB3aWxsIGhhdmUgdG8gbW9kaWZ5IHlvdXIgYXBwcm9hY2ggdG8gdXNlIHN0YXRpYyB2YXJpYWJsZQogICAgICAgICAgICBpbml0aWFsaXphdGlvbiBvciBkZWZpbmUgU1dJR19DU0hBUlBfTk9fSU1DTEFTU19TVEFUSUNfQ09OU1RSVUNUT1IgLSBTZWUgY3NoYXJwaGVhZC5zd2cuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNDA4MjMyLiBJbXByb3ZlIHNoYXJlZF9wdHIgYW5kIGludHJ1c2l2ZV9wdHIgd3JhcHBlcnMgZm9yIGNsYXNzZXMgaW4gYW4KICAgICAgICAgICAgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBObyBzcGVjaWFsIHRyZWF0bWVudCBpcyBuZWVkZWQgZm9yIGRlcml2ZWQgY2xhc3Nlcy4KICAgICAgICAgICAgVGhlIHByb3h5IGNsYXNzIGFsc28gbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIHNwZWNpZmllZCwgaXQgaXMgYXV0b21hdGljYWxseQogICAgICAgICAgICBkZWR1Y2VkLiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVwcmVjYXRlZDoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQogICAgICAgICAgICBhbmQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgICAgJXNoYXJlZF9wdHIoVFlQRSkKICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBpbnRydXNpdmVfcHRyIHdyYXBwZXJzLCB0aGUgZm9sbG93aW5nIG1hY3JvIGlzIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgICAgU1dJR19JTlRSVVNJVkVfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgICAgU1dJR19JTlRSVVNJVkVfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKICAgICAgICAgICAgYW5kIGhhdmUgYmVlbiByZXBsYWNlZCBieQogICAgICAgICAgICAgICVpbnRydXNpdmVfcHRyKFRZUEUpCgoyMDEwLTA1LTIxOiBvbGx5CgkgICAgW1BIUF0gU3RvcCBnZW5lcmF0aW5nIGEgYm9ndXMgbGluZSBvZiBjb2RlIGluIGNlcnRhaW4gY29uc3RydWN0b3JzLgoJICAgIFRoaXMgd2FzIG1vc3RseSBoYXJtbGVzcywgYnV0IGNhdXNlZCBhIFBIUCBub3RpY2UgdG8gYmUgaXNzdWVkLCBpZgoJICAgIGVuYWJsZWQgKFNGIzI5ODU2ODQpLgoKMjAxMC0wNS0xODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBtZW1iZXIgcG9pbnRlcnMgb24gNjQgYml0IHBsYXRmb3Jtcy4KCjIwMTAtMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBDKysgZW51bSBib29sZWFuIHZhbHVlcyByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmY6CiAgICAgICAgICAgICAgdHlwZWRlZiBlbnVtIHsgUExBWSA9IHRydWUsIFNUT1AgPSBmYWxzZSB9IHBsYXlfc3RhdGU7CgoyMDEwLTA1LTE0OiBvbGx5CgkgICAgW1BIUF0gRml4IHdyYXBwaW5nIG9mIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggd2FzIHByb2R1Y2luZwoJICAgIHVuY29tcGlsYWJsZSBjb2RlIGluIHNvbWUgY2FzZXMuCgoyMDEwLTA1LTEyOiBkcmpvZQoJICAgIFtSXSBBZGQgdHdvIG1vcmUgY2hhbmdlcyBmcm9tIFdpbCBOb2xhbi4gIEdldCBnYXJiYWdlCgkgICAgY29sbGVjdGlvbiB0byB3b3JrLiAgSW1wbGVtZW50IG5ld2ZyZWUKCjIwMTAtMDUtMDk6IGRyam9lCiAgICAgICAgICAgIEZpeCBidWcgcmVwb3J0ZWQgYnkgV2lsIE5vbGFuIGNoYW5nZSBjcmVhdGlvbiBvZiBzdHJpbmcgc28KICAgICAgICAgICAgdGhhdCBSIDIuNy4wKyBjYW4gdXNlIGNoYXIgaGFzaGVzCgoyMDEwLTA1LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMjk1NTE0NiBmcm9tIFNlcmdleSBTYXRza2l5IHRvIGZpeCBleHByZXNzaW9ucyBjb250YWluaW5nIGRpdmlkZSBieQogICAgICAgICAgICBvcGVyYXRvciBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0cy4KCjIwMTAtMDUtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBNZW1vcnkgbGVhayBmaXggaGFuZGxpbmcgY29uc3Qgc3RkOjpzdHJpbmcgJiBpbnB1dHMsIHJlcG9ydGVkIGJ5IFdpbGwgTm9sYW4uCgoyMDEwLTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBUeXBlbWFwIG1hdGNoaW5nIGVuaGFuY2VtZW50IGZvciBub24tZGVmYXVsdCB0eXBlbWFwcy4gUHJldmlvdXNseSBhbGwKICAgICAgICAgICAgcXVhbGlmaWVycyB3ZXJlIHN0cmlwcGVkIGluIG9uZSBzdGVwLCBub3cgdGhleSBhcmUgc3RyaXBwZWQgb25lIGF0IGEgdGltZQogICAgICAgICAgICBzdGFydGluZyB3aXRoIHRoZSBsZWZ0IG1vc3QgcXVhbGlmaWVyLiBGb3IgZXhhbXBsZSwgaW50IGNvbnN0KmNvbnN0IAogICAgICAgICAgICBpcyBmaXJzdCBzdHJpcHBlZCB0byBpbnQgKmNvbnN0IHRoZW4gaW50ICouCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNC0yNTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjk4NTY1NSAtIGJyb2tlbiBjb25zdHJ1Y3RvciByZW5hbWluZy4KCjIwMTAtMDQtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFR5cGVtYXAgZnJhZ21lbnRzIGFyZSBub3cgb2ZmaWNpYWwgYW5kIGRvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggIzIwNDgwNjQgYW5kICMyNDA4MDIwLgogICAgICAgICAgICBBcHBseSBVYnVudHUgcGF0Y2ggdG8gZml4IFJ1YnkgYW5kIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIHdpdGggLW1pbmhlcml0LgogICAgICAgICAgICBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9zd2lnMS4zLytidWcvNTIyODc0CgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpzY2hlbWVdIEFwcGx5IFVidW50dSBwYXRjaCB0byBmaXggc3RkOjptYXAgd3JhcHBlcnM6CiAgICAgICAgICAgIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3N3aWcxLjMvK2J1Zy8yMDM4NzYKCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMyOTUyMzc0IC0gZml4IGRpcmVjdG9ycyBhbmQgdGhlIC1ub3J0dGkgb3B0aW9uLgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4ICMyODg3MjU0IGFuZCAjMjk0NjAzMiAtIFNXSUdfTHVhX3R5cGVuYW1lIHVzaW5nIHdyb25nIHN0YWNrIGluZGV4LgoKMjAxMC0wNC0wMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duIHdpdGggdGhlIC10aHJlYWRzIG9wdGlvbiBiYXNlZCBvbiBwYXRjaCBmcm9tIEFydG8gVnVvcmkuCiAgICAgICAgICAgIEZpeGVzIGJ1ZyAjMjgxODQ5OS4KCjIwMTAtMDQtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBNYWtlZmlsZSB0YXJnZXRzOiBkaXN0Y2xlYW4gYW5kIG1haW50YWluZXItY2xlYW4KCjIwMTAtMDQtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCBjaGFyIHBvaW50ZXJzLCB3Y2hhcl90IHBvaW50ZXJzIGFuZCBjaGFyIGFycmF5cyBzbyB0aGF0IG5pbCBjYW4gYmUgcGFzc2VkIGFzIGEKICAgICAgICAgICAgdmFsaWQgdmFsdWUuIEJ1ZyByZXBvcnRlZCBieSBHZWRhbGlhIFBhc3Rlcm5hay4KCjIwMTAtMDQtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIE51bWVyb3VzIHN1YnRsZSB0eXBlbWFwIG1hdGNoaW5nIHJ1bGUgZml4ZXMgd2hlbiB1c2luZyB0aGUgZGVmYXVsdCB0eXBlLiBUaGUgdHlwZW1hcAogICAgICAgICAgICBtYXRjaGluZyBydWxlcyBhcmUgdG8gdGFrZSBhIHR5cGUgYW5kIGZpbmQgdGhlIGJlc3QgZGVmYXVsdCB0eXBlbWFwIChTV0lHVFlQRSwgU1dJR1RZUEUqIGV0YyksCiAgICAgICAgICAgIHRoZW4gbG9vayBmb3IgdGhlIG5leHQgYmVzdCBtYXRjaCBieSByZWR1Y2luZyB0aGUgY2hvc2VuIGRlZmF1bHQgdHlwZS4gVGhlIHR5cGUgZGVkdWN0aW9uCiAgICAgICAgICAgIG5vdyBmb2xsb3dzIEMrKyBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG1hdGNoaW5nIHJ1bGVzLgoKICAgICAgICAgICAgQmVsb3cgYXJlIHRoZSBzZXQgb2YgY2hhbmdlcyBtYWRlIHNob3dpbmcgdGhlIGRlZmF1bHQgdHlwZSBkZWR1Y3Rpb24KICAgICAgICAgICAgYWxvbmcgd2l0aCB0aGUgb2xkIHJlZHVjZWQgdHlwZSBhbmQgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSByZWR1Y2VkIHR5cGU6CgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgJltBTlldCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAmW10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICgmKVtBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKltBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIGNvbnN0ICpbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICpjb25zdCAmCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QgJgogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgY29uc3QgKiYKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgKgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgKgogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKioKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgJgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgJgogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKiYKCiAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgYSBjb25zdCBTV0lHVFlQRSBsb29rdXAgaXMgdXNlZCBub3cgZm9yIGFueSBjb25zdGFudCB0eXBlLiBTb21lIGV4YW1wbGVzLCB3aGVyZQogICAgICAgICAgICBUIGlzIHNvbWUgcmVkdWNlZCB0eXBlLCBlZyBpbnQsIHN0cnVjdCBGb286CgogICAgICAgICAgICAgICAgICAgVCBjb25zdAogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFCgogICAgICAgICAgICAgICAgICAgVCAqY29uc3QKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdAogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKgoKICAgICAgICAgICAgICAgICAgIFQgY29uc3RbXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3RbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEVbXQoKICAgICAgICAgICAgICAgICAgIGVudW0gVCBjb25zdAogICAgICAgICAgICAgIG5ldzogZW51bSBTV0lHVFlQRSBjb25zdAogICAgICAgICAgICAgIG9sZDogZW51bSBTV0lHVFlQRQoKICAgICAgICAgICAgICAgICAgIFQgKCpjb25zdCApW10KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICgqY29uc3QgKVtdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAoKilbXQoKICAgICAgICAgICAgUmVtaW5kZXI6IHRoZSB0eXBlbWFwIG1hdGNoaW5nIHJ1bGVzIGNhbiBub3cgYmUgc2VlbiBmb3IgYW55IHR5cGVzIGJlaW5nIHdyYXBwZWQgYnkgdXNpbmcKICAgICAgICAgICAgZWl0aGVyIHRoZSAtZGVidWctdG1zZWFyY2ggb3IgLWRlYnVnLXRtdXNlZCBvcHRpb25zLgoKICAgICAgICAgICAgSW4gcHJhY3RpY2UgdGhpcyBsZWFkcyB0byBzb21lIHN1YnRsZSBtYXRjaGluZyBydWxlIGNoYW5nZXMgYW5kIHRoZSBtYWpvcml0eSBvZiB1c2VycwogICAgICAgICAgICB3b24ndCBub3RpY2UgYW55IGNoYW5nZXMsIGV4Y2VwdCBpbiB0aGUgcHJpbWUgYXJlYSBvZiBtb3RpdmF0aW9uIGZvciB0aGlzIGNoYW5nZTogSW1wcm92ZQogICAgICAgICAgICBTVEwgY29udGFpbmVycyBvZiBjb25zdCBwb2ludGVycyBhbmQgcGFzc2luZyBjb25zdCBwb2ludGVycyBieSByZWZlcmVuY2UuIFRoaXMgaXMgZml4ZWQKICAgICAgICAgICAgYmVjYXVzZSBtYW55IG9mIHRoZSBTVEwgY29udGFpbmVycyB1c2UgYSB0eXBlICdUIGNvbnN0JicgYXMgcGFyYW1ldGVycyBhbmQgd2hlbiBUIGlzIAogICAgICAgICAgICBhIGNvbnN0IHBvaW50ZXIsIGZvciBleGFtcGxlLCAnSyBjb25zdConLCB0aGVuIHRoZSBmdWxsIHR5cGUgaXMgJ0sgY29uc3QqY29uc3QmJy4gVGhpcwogICAgICAgICAgICBtZWFucyB0aGF0IHRoZSAnU1dJR1RZUEUgKmNvbnN0JicgdHlwZW1hcHMgbm93IG1hdGNoIHdoZW4gVCBpcyBlaXRoZXIgYSBub24tY29uc3Qgb3IKICAgICAgICAgICAgY29uc3QgcG9pbnRlci4gRnVydGhlcm1vcmUsIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcyBpbmNvcnJlY3RseSBoYWQgJ1NXSUdUWVBFIComJyB0eXBlbWFwcwogICAgICAgICAgICB3aGVuIHRoZXNlIHNob3VsZCBoYXZlIGJlZW4gJ1NXSUdUWVBFICpjb25zdCYnLiBUaGVzZSBoYXZlIGJlZW4gY29ycmVjdGVkIChKYXZhLCBDIywgTHVhLCBQSFApLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTb21lIHZlcnkgb2xkIGRlcHJlY2F0ZWQgcHJhZ21hIHdhcm5pbmdzIGFyZSBub3cgZXJyb3JzLgoKMjAxMC0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgSW1wcm92ZSBoYW5kbGluZyBvZiBmaWxlIG5hbWVzIGFuZCBkaXJlY3RvcmllcyBjb250YWluaW5nIGRvdWJsZS9tdWx0aXBsZSBwYXRoIHNlcGFyYXRvcnMuCgoyMDEwLTAzLTEwOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gVXNlIGZ1bGx5IHF1YWxpZmllZCBzeW1ib2wgbmFtZSBvZiBjbDo6aWRlbnRpdHkgaW4gZW1pdF9kZWZ1bigpLgoKMjAxMC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFRoZSBpbnRlcm1lZGlhcnkgSk5JIGNsYXNzIG1vZGlmaWVycyBhcmUgbm93IHB1YmxpYyBieSBkZWZhdWx0IG1lYW5pbmcgdGhlc2UKICAgICAgICAgICAgaW50ZXJtZWRpYXJ5IGxvdyBsZXZlbCBmdW5jdGlvbnMgYXJlIG5vdyBhY2Nlc3NpYmxlIGJ5IGRlZmF1bHQgZnJvbSBvdXRzaWRlIGFueSBwYWNrYWdlCiAgICAgICAgICAgIHVzZWQuIFRoZSBwcm94eSBjbGFzcyBwb2ludGVyIGNvbnN0cnVjdG9yIGFuZCBnZXRDUHRyKCkgbWV0aG9kcyBhcmUgYWxzbyBub3cgcHVibGljLgogICAgICAgICAgICBUaGVzZSBhcmUgbmVlZGVkIGluIG9yZGVyIGZvciB0aGUgbnNwYWNlIG9wdGlvbiB0byB3b3JrIHdpdGhvdXQgYW55IG90aGVyIG1vZHMuCiAgICAgICAgICAgIFRoZSBwcmV2aW91cyBkZWZhdWx0IG9mIHByb3RlY3RlZCBhY2Nlc3MgY2FuIGJlIHJlc3RvcmVkIHVzaW5nOgoKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX01FVEhPRFMocHJvdGVjdGVkLCBwcm90ZWN0ZWQsIFNXSUdUWVBFKQogICAgICAgICAgICAgICVwcmFnbWEoamF2YSkgam5pY2xhc3NjbGFzc21vZGlmaWVycyA9ICJjbGFzcyIKCjIwMTAtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgdGhlIG5zcGFjZSBmZWF0dXJlIGZvciBDIy4gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIG5zcGFjZSBmZWF0dXJlIGlzIG5vdyBhdmFpbGFibGUuCgoyMDEwLTAzLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbnNwYWNlIGZlYXR1cmUuIFRoaXMgYWRkcyBzb21lIGltcHJvdmVkIG5hbWVzcGFjZSBzdXBwb3J0LiBDdXJyZW50bHkgb25seSBKYXZhCiAgICAgICAgICAgIGlzIHN1cHBvcnRlZCBmb3IgdGFyZ2V0IGxhbmd1YWdlcywgd2hlcmUgQysrIG5hbWVzcGFjZXMgYXJlIGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCBpbnRvCiAgICAgICAgICAgIEphdmEgcGFja2FnZXMuIFRoZSBmZWF0dXJlIG9ubHkgYXBwbGllcyB0byBjbGFzc2VzLHN0cnVjdCx1bmlvbnMgYW5kIGVudW1zIGRlY2xhcmVkIHdpdGhpbgogICAgICAgICAgICBhIG5hbWVzcGFjZS4gTWV0aG9kcyBhbmQgdmFyaWFibGVzIGRlY2xhcmVkIGluIG5hbWVzcGFjZXMgc3RpbGwgZWZmZWN0aXZlbHkgaGF2ZSB0aGVpcgogICAgICAgICAgICBuYW1lc3BhY2VzIGZsYXR0ZW5lZC4gRXhhbXBsZSB1c2FnZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUobnNwYWNlKSBPdXRlcjo6SW5uZXIxOjpDb2xvcjsKICAgICAgICAgICAgICAlZmVhdHVyZShuc3BhY2UpIE91dGVyOjpJbm5lcjI6OkNvbG9yOwoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIElubmVyMSB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb2xvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgSW5uZXIyIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IENvbG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGb3IgSmF2YSwgdGhlIC1wYWNrYWdlIG9wdGlvbiBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlIG5zcGFjZSBmZWF0dXJlLiBTYXkKICAgICAgICAgICAgd2UgdXNlIC1wYWNrYWdlIGNvbS5teWNvLCB0aGUgdHdvIGNsYXNzZXMgY2FuIHRoZW4gYmUgYWNjZXNzZWQgYXMgZm9sbG93cyBmcm9tIEphdmE6CgogICAgICAgICAgICAgIGNvbS5teWNvLk91dGVyLklubmVyMS5Db2xvciBhbmQgY29tLm15Y28uT3V0ZXIuSW5uZXIyLkNvbG9yLgoKMjAxMC0wMi0yNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUmVtb3ZlIC1kaXJ2dGFibGUgZnJvbSB0aGUgb3B0aW1pemF0aW9ucyBpbmNsdWRlZCBieSAtTyBhcyBpdCB0aGlzIG9wdGlvbgogICAgICAgICAgICBjdXJyZW50bHkgbGVhZHMgdG8gbWVtb3J5IGxlYWtzIGFzIHJlcG9ydGVkIGJ5IEpvaGFuIEJsYWtlLgoKMjAxMC0wMi0yNzogd3NmdWx0b24KICAgICAgICAgICAgTGljZW5zZSBjb2RlIGNoYW5nZXM6IFNXSUcgU291cmNlIGlzIEdQTC12MyBhbmQgbGlicmFyeSBjb2RlIGxpY2Vuc2UgaXMgbm93IGNsZWFyZXIKICAgICAgICAgICAgYW5kIGlzIHByb3ZpZGVkIHVuZGVyIGEgdmVyeSBwZXJtaXNzaXZlIGxpY2Vuc2UuIFNlZSBodHRwOi8vd3d3LnN3aWcub3JnL2xlZ2FsLmh0bWwuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQSBmZXcgZml4ZXMgZm9yIGNvbXBpbGluZyB1bmRlciBydWJ5LTEuOS54IGluY2x1ZGluZyBwYXRjaCBmcm9tICdOaWJibGUnLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoIGZyb20gUGF0cmljayBCZW5uZXR0IHRvIGZpeCBSQVJSQVlfTEVOIGFuZCBSQVJSQVlfUFRSIHVzYWdlIGZvciBSdWJ5IDEuOS54CiAgICAgICAgICAgIHVzZWQgaW4gdmFyaW91cyBTVEwgd3JhcHBlcnMuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCBpbmNvcnJlY3QgbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2wgbmFtZSBlcnJvciB3aGVuIGFuIGVudW0gaXRlbQogICAgICAgICAgICBhbmQgY2xhc3MgbmFtZSBoYXZlIHRoZSBzYW1lIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IE5hdGhhbiBLcmllZ2VyLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBWZWN0b3Ige307CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFRleHQgewogICAgICAgICAgICAgICAgZW51bSBQcmVmZXJlbmNlIHsgVmVjdG9yIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIG90aGVyIGluY29ycmVjdCBjb3JuZXIgY2FzZSB0YXJnZXQgbGFuZ3VhZ2Ugc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMTAtMDItMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgLWRlYnVnLWxzeW1ib2xzIG9wdGlvbiBmb3IgZGlzcGxheWluZyB0aGUgdGFyZ2V0IGxhbmd1YWdlIGxheWVyIHN5bWJvbHMuCgoyMDEwLTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggLU1NIGFuZCAtTU1EIG9wdGlvbnMgb24gV2luZG93cy4gVGhleSB3ZXJlIG5vdCBvbWl0dGluZyBmaWxlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5IGFzCiAgICAgICAgICAgIHRoZXkgc2hvdWxkIGJlLgoKMjAxMC0wMi0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxODA3MzI5IC0gV2hlbiBNYWtlZmlsZSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGdlbmVyYXRlZCB1c2luZyB0aGUgLU0gZmFtaWx5IG9mIG9wdGlvbnMKICAgICAgICAgICAgb24gV2luZG93cywgdGhlIGZpbGUgcGF0aHMgaGF2ZSBiZWVuIGNvcnJlY3RlZCB0byB1c2Ugc2luZ2xlIGJhY2tzbGFzaGVzIHJhdGhlciB0aGFuIGRvdWJsZQogICAgICAgICAgICBiYWNrc2xhc2hlcyBhcyBwYXRoIHNlcGFyYXRvcnMuCgoyMDEwLTAyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI5MTg5MDIgLSBsYW5ndWFnZSBzcGVjaWZpYyBmaWxlcyBub3QgYmVpbmcgZ2VuZXJhdGVkIGluIGNvcnJlY3QgZGlyZWN0b3J5IG9uCiAgICAgICAgICAgIFdpbmRvd3Mgd2hlbiB1c2luZyBmb3J3YXJkIHNsYXNoZXMgZm9yIC1vLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzd2lnIC1weXRob24gLWMrKyAtbyBzdWJkaXJlY3RvcnkvdGhlaW50ZXJmYWNlX3dyYXAuY3BwIHN1YmRpcmVjdG9yeS90aGVpbnRlcmZhY2UuaQoKMjAxMC0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyODk0NDA1IC0gYXNzZXJ0aW9uIHdoZW4gdXNpbmcgLXhtbG91dC4KCjIwMTAtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlbWFwIG1hdGNoaW5nIGJ1ZyB3aGVuIGEgdGVtcGxhdGVkIHR5cGUgaGFzIGEgdHlwZW1hcCBib3RoIHNwZWNpYWxpemVkIGFuZCBub3QKICAgICAgICAgICAgc3BlY2lhbGl6ZWQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWFggeyAuLi4gfTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWFggJiAiLi4uIgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYWDwgaW50ID4gJiAiLi4uIgoKICAgICAgICAgICAgcmVzdWx0ZWQgaW4gdGhlIDJuZCB0eXBlbWFwIGJlaW5nIGFwcGxpZWQgZm9yIGFsbCBUIGluIFhYPCBUID4uCgoyMDEwLTAxLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI5MzMxMjkgLSB0eXBlbWFwcyBub3QgYmVpbmcgZm91bmQgd2hlbiB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBpcyB1c2VkIHRvIGRlbm90ZQogICAgICAgICAgICBnbG9iYWwgc2NvcGUsIHRoZSB0eXBlbWFwIGlzIG5vdyB1c2VkIGluIHNpdHVhdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7fTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWCAmICIuLi4iCiAgICAgICAgICAgICAgdm9pZCBtKGNvbnN0IDo6WCAmKTsKCiAgICAgICAgICAgIGFuZCB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7fTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgOjpYICYgIi4uLiIKICAgICAgICAgICAgICB2b2lkIG0oY29uc3QgWCAmKTsKCjIwMTAtMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgZGVub3RpbmcgZ2xvYmFsIHNjb3BlIHByb2JsZW1zIGluIHRoZSB0eXBlcyBnZW5lcmF0ZWQKICAgICAgICAgICAgaW50byB0aGUgQysrIGxheWVyLiBQcmV2aW91c2x5IHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciB3YXMgZHJvcHBlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgaWYgdGhlIHR5cGUgaGFkIGFueSBzb3J0IG9mIHF1YWxpZmllciwgZm9yIGV4YW1wbGUgd2hlbiB1c2luZyBwb2ludGVycywgcmVmZXJlbmNlcywgbGlrZQogICAgICAgICAgICA6OmZvbyosIDo6Zm9vJiwgYmFyPCA6OmZvbyogPi4KCjIwMTAtMDEtMTM6IG9sbHkKCSAgICBbUEhQXSBBZGQgZGF0ZXRpbWUgdG8gdGhlIGxpc3Qgb2YgUEhQIHByZWRlZmluZWQgY2xhc3NlcyAocGF0Y2gKCSAgICBmcm9tIERhdmlkIEZsZXRjaGVyIGluIFNGIzI5MzEwNDIpLgoKMjAxMC0wMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgU2xpZ2h0IGNoYW5nZSB0byB3YXJuaW5nLCBlcnJvciBhbmQgZGlhZ25vc3RpYyByZXBvcnRpbmcuIFRoZSB3YXJuaW5nIG51bWJlciBpcyBubyAKICAgICAgICAgICAgbG9uZ2VyIHNob3duIHdpdGhpbiBicmFja2V0cy4gVGhpcyBpcyB0byBoZWxwIGRlZmF1bHQgcGFyc2luZyBvZiB3YXJuaW5nIG1lc3NhZ2VzIGJ5CiAgICAgICAgICAgIG90aGVyIHRvb2xzLCB2aW0gb24gVW5peCBpbiBwYXJ0aWN1bGFyLgoKICAgICAgICAgICAgRXhhbXBsZSBvcmlnaW5hbCBkaXNwbGF5IHVzaW5nIC1Gc3RhbmRhcmQ6CiAgICAgICAgICAgICAgZXhhbXBsZS5pOjIwOiBXYXJuaW5nKDQwMSk6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQicuIElnbm9yZWQuCiAgICAgICAgICAgIE5ldyBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaToyMDogV2FybmluZyA0MDE6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQicuIElnbm9yZWQuCgogICAgICAgICAgICBBbHNvIHN1YnRsZSBmaXggdG8gLUZtaWNyb3NvZnQgZm9ybWF0IGFkZGluZyBpbiBtaXNzaW5nIHNwYWNlLiBFeGFtcGxlIG9yaWdpbmFsIGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pKDIwKTogV2FybmluZyg0MDEpOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0Jhc2UnLiBJZ25vcmVkLgogICAgICAgICAgICBOZXcgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmkoMjApIDogV2FybmluZyA0MDE6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQmFzZScuIElnbm9yZWQuCgoyMDEwLTAxLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYSBmZXcgaW5jb25zaXN0ZW5jaWVzIGluIHJlcG9ydGluZyBvZiBmaWxlL2xpbmUgbnVtYmVyaW5ncyBpbmNsdWRpbmcgbW9kaWZ5aW5nCiAgICAgICAgICAgIHRoZSBvdmVybG9hZCB3YXJuaW5ncyA1MDksIDUxMiwgNTE2LCA0NzQsIDQ3NSB0byBub3cgYmUgdHdvIGxpbmUgd2FybmluZ3MuCgoyMDEwLTAxLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZnkgLWRlYnVnLXRhZ3Mgb3V0cHV0IHRvIHVzZSBzdGFuZGFyZCBmaWxlIG5hbWUvbGluZSByZXBvcnRpbmcgc28gdGhhdCBlZGl0b3JzCiAgICAgICAgICAgIGNhbiBlYXNpbHkgbmF2aWdhdGUgdG8gdGhlIGFwcHJvcHJpYXRlIGxpbmVzLgogICAgICAgICAgICBXYXMgdHlwaWNhbGx5OgogICAgICAgICAgICAgIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgKC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnLnN3ZzozMTIpCiAgICAgICAgICAgICAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAuIGluY2x1ZGUgKC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnd2FybmluZ3Muc3dnOjM5KQogICAgICAgICAgICBub3c6CiAgICAgICAgICAgICAgL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWcuc3dnOjMxMjogIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUKICAgICAgICAgICAgICAvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZ3dhcm5pbmdzLnN3ZzozOTogIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgLiBpbmNsdWRlCgoyMDEwLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbWlzc2luZyBmaWxlL2xpbmUgbnVtYmVycyBmb3IgdHlwZW1hcCB3YXJuaW5ncyBhbmQgaW4gb3V0cHV0IGZyb20gdGhlCiAgICAgICAgICAgLWRlYnVnLXRtc2VhcmNoLy1kZWJ1Zy10bXVzZWQgb3B0aW9ucy4KCjIwMTAtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0eXBlbWFwcyB1c2VkIGRlYnVnZ2luZyBvcHRpb24gKC1kZWJ1Zy10bXVzZWQpLiBXaGVuIHVzZWQgZWFjaCBsaW5lIGRpc3BsYXlzCiAgICAgICAgICAgIHRoZSB0eXBlbWFwIHVzZWQgZm9yIGVhY2ggdHlwZSBmb3Igd2hpY2ggY29kZSBpcyBiZWluZyBnZW5lcmF0ZWQgaW5jbHVkaW5nIHRoZSBmaWxlCiAgICAgICAgICAgIGFuZCBsaW5lIG51bWJlciByZWxhdGVkIHRvIHRoZSB0eXBlLiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgY29uZGVuc2VkIGZvcm0gb2YgdGhlCiAgICAgICAgICAgIC1kZWJ1Zy10bXNlYXJjaCBvcHRpb24uIERvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWphdmFleGNlcHRpb24gYW5kIGRpcmVjdG9ycyBzbyB0aGF0IGFsbCB0aGUgYXBwcm9wcmlhdGUgdGhyb3dzIGNsYXVzZXMgCiAgICAgICAgICAgIGFyZSBnZW5lcmF0ZWQuIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGV0ZXIgR3JlZW53b29kLgoKMjAwOS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIC1kZWJ1Zy10bXNlYXJjaCBvcHRpb24gZm9yIGRlYnVnZ2luZyB0aGUgdHlwZW1hcCBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGVzLgogICAgICAgICAgICBEb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTEyLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBSZW1vdmUgdGhlIC1hcGkgb3B0aW9uIGFuZCB1c2UgdGhlIG5ldyBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSCiAgICAgICAgICAgIG1hY3JvIHByb3ZpZGVkIGluIHRoZSBvY3RhdmUgaGVhZGVycyBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwaSB2ZXJzaW9uIGluc3RlYWQuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgW1J1YnldIEltcHJvdmUgc3VwcG9ydCBmb3IgUnVieSAxLjkgdW5kZXIgR0NDLiAgQWRkcmVzc2VzIHBhcnQgb2YKCSAgICBTRiMyODU5NjE0LgoKMjAwOS0xMi0wNDogb2xseQoJICAgIEZpeCBoYW5kbGluZyBvZiBtb2R1bG8gb3BlcmF0b3IgKCUpIGluIGNvbnN0YW50IGV4cHJlc3Npb25zCgkgICAgKFNGIzI4MTg1NjIpLgoKMjAwOS0xMi0wNDogb2xseQoJICAgIFtQSFBdICJlbXB0eSIgaXMgYSByZXNlcnZlZCB3b3JkIGluIFBIUCwgc28gcmVuYW1lIGVtcHR5KCkgbWV0aG9kCgkgICAgb24gU1RMIGNsYXNzZXMgdG8gImlzX2VtcHR5KCkiIChwcmV2aW91c2x5IHRoaXMgd2FzIGF1dG9tYXRpY2FsbHkKCSAgICByZW5hbWVkIHRvICJjX2VtcHR5KCkiKS4KCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMTItMDM6IG9sbHkKCSAgICBbUEhQXSBBZGQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLCBhbmQgZm9yCgkgICAgcG9pbnRlciB0byBtZXRob2QuCgoyMDA5LTEyLTAyOiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmcgYW5kIHJlbmFtZSBvZiByZXNlcnZlZCBjbGFzcyBuYW1lIHRvIGJlIGNhc2UKCSAgICBpbnNlbnNpdGl2ZS4KCjIwMDktMTItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFJldmVydCBzdXBwb3J0IGZvciAlZXh0ZW5kIGFuZCBtZW1iZXJpbiB0eXBlbWFwcyBhZGRlZCBpbiBzd2lnLTEuMy4zOS4gVGhlCgkgICAgbWVtYmVyaW4gdHlwZW1hcHMgYXJlIGlnbm9yZWQgYWdhaW4gZm9yIG1lbWJlciB2YXJpYWJsZXMgd2l0aGluIGEgJWV4dGVuZCBibG9jay4KICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBpbmNvbnNpc3RlbmN5IHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMDktMTEtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGdlbmVyYXRlZCBxdW90aW5nIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKSBmb3IgCiAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1lbWJlciB2YXJpYWJsZXMuCgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQTsKICAgICAgICAgICAgICAlY3Njb25zdCgxKSBBOwogICAgICAgICAgICAgIHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIEEgPSAnQSc7IAogICAgICAgICAgICAgIH07CgoyMDA5LTExLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpIGZvciBzdGF0aWMgY29uc3QgbWVtYmVyIHZhcmlhYmxlcyB0bwogICAgICAgICAgICB1c2UgdGhlIGFjdHVhbCBjb25zdGFudCB2YWx1ZSBpZiBpdCBpcyBzcGVjaWZpZWQsIHJhdGhlciB0aGFuIHRoZSBDKysgY29kZSB0bwogICAgICAgICAgICBhY2Nlc3MgdGhlIG1lbWJlci4KCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBFTjsKICAgICAgICAgICAgICAlY3Njb25zdCgxKSBFTjsKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IEVOID0gMjsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0yMzogd3NmdWx0b24KICAgICAgICAgICAgQysrIG5lc3RlZCB0eXBlZGVmIGNsYXNzZXMgY2FuIG5vdyBiZSBoYW5kbGVkIHRvbywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIHsgfSBGb29UeXBlZGVmMSwgRm9vVHlwZWRlZjI7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSB3cmFwcGVycyBmb3IgQyBuZXN0ZWQgc3RydWN0cyBhcmUgbm93IGdlbmVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBkZWNsYXJlZCAKICAgICAgICAgICAgaW4gdGhlIHBhcnNlZCBjb2RlLgoKMjAwOS0xMS0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM0OTE0NzYgLSBtdWx0aXBsZSBkZWNsYXJhdGlvbnMgb2YgbmVzdGVkIHN0cnVjdHMsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICBpbnQgdmFsOwogICAgICAgICAgICAgICAgfSBpbm5lcjEsIGlubmVyMiwgKmlubmVyMywgaW5uZXI0WzFdOwogICAgICAgICAgICAgIH0gb3V0ZXI7CgoyMDA5LTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2luZyBvZiBlbnVtIGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGVudW0gQUJDIHsKICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICBiLAogICAgICAgICAgICAgICAgYwogICAgICAgICAgICAgIH0gQSA9IGEsICpwQyA9ICZDLCBhcnJheVszXSA9IHthLCBiLCBjfTsKCjIwMDktMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzaW5nIG9mIHN0cnVjdCBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUyB7CiAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgfSBpbnN0YW5jZSA9IHsgMTAgfTsKCjIwMDktMTEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTk2MDk3NyAtIFN5bnRheCBlcnJvciBwYXJzaW5nIGRlcml2ZWQgbmVzdGVkIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBtZW1iZXIKICAgICAgICAgICAgdmFyaWFibGUgaW5zdGFuY2UuCgoyMDA5LTExLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzIzMTA0ODMgLSBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWYgd2l0aGluIGV4dGVybiAiQyIgYmxvY2suCgoyMDA5LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNhZ2Ugb2YgbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgd2l0aGluIHRlbXBsYXRlZCBjbGFzc2VzIHNvIHRoYXQgY29tcGlsZWFibGUgY29kZSAKICAgICAgICAgICAgaXMgZ2VuZXJhdGVkLgoKMjAwOS0xMS0xMzogb2xseQoJICAgIFtwaHBdIEZpeCBwbGFjZSB3aGVyZSBjbGFzcyBwcmVmaXggKGFzIHNwZWNpZmllZCB3aXRoIC1wcmVmaXgpCgkgICAgd2Fzbid0IGJlaW5nIHVzZWQuICBQYXRjaCBmcm9tIGd2ZXJicnVnZ2VuIGluIFNGIzI4OTI2NDcuCgoyMDA5LTExLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNhZ2Ugb2YgbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgc28gdGhhdCBjb21waWxlYWJsZSBjb2RlIGlzIGdlbmVyYXRlZCAtIHRoZSBuZXN0ZWQKICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgaXMgbm93IHRyZWF0ZWQgbGlrZSBhIG5vcm1hbCBuZXN0ZWQgY2xhc3NlcywgdGhhdCBpcywgYXMgYW4gb3BhcXVlIHR5cGUKICAgICAgICAgICAgdW5sZXNzIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgaXMgdXNlZC4KCjIwMDktMTEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlcGxhY2UgU1dJR1dBUk5fUEFSU0VfTkVTVEVEX0NMQVNTIHdpdGggU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTIGFuZAogICAgICAgICAgICBTV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUyBmb3IgbmFtZWQgYW5kIHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgcmVzcGVjdGl2ZWx5LgoKICAgICAgICAgICAgTmFtZWQgbmVzdGVkIGNsYXNzIGlnbm9yZWQgd2FybmluZ3MgY2FuIG5vdyBiZSBzdXBwcmVzc2VkIGJ5IG5hbWUgdXNpbmcgJXdhcm5maWx0ZXIsIGVnOgoKICAgICAgICAgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9QQVJTRV9OQU1FRF9ORVNURURfQ0xBU1MpIE91dGVyOjpJbm5lcjsKCiAgICAgICAgICAgIGJ1dCBjbGVhcmx5IHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgY2Fubm90IGFuZCB0aGUgZ2xvYmFsIHN1cHByZXNzaW9uIGlzIHN0aWxsIHJlcXVpcmVkLCBlZzoKCiAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj1TV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUwoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5lc3RlZHdvcmthcm91bmQgZmVhdHVyZSBhcyBhIHdheSB0byB1c2UgdGhlIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZiBhIG5lc3RlZCBjbGFzcyAKICAgICAgICAgICAgKEMrKyBtb2RlIG9ubHkpLiBJdCByZW1vdmVzIHRoZSBuZXN0ZWQgY2xhc3MgZnJvbSBTV0lHJ3MgdHlwZSBpbmZvcm1hdGlvbiBzbyBpdCBpcyBhcyBpZiBTV0lHCiAgICAgICAgICAgIGhhZCBuZXZlciBwYXJzZWQgdGhlIG5lc3RlZCBjbGFzcy4gVGhlIGRvY3VtZW50ZWQgbmVzdGVkIGNsYXNzIHdvcmthcm91bmRzIHVzaW5nIGEgZ2xvYmFsCiAgICAgICAgICAgIGZha2UgY2xhc3Mgc3RvcHBlZCB3b3JraW5nIHdoZW4gU1dJRyB0cmVhdGVkIHRoZSBuZXN0ZWQgY2xhc3MgYXMgYW4gb3BhcXVlIHBvaW50ZXIsIGFuZAogICAgICAgICAgICB0aGlzIGZlYXR1cmUgcmV2ZXJ0cyB0aGlzIGJlaGF2aW91ci4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB3aXRoIGRldGFpbHMgb2YgaG93CiAgICAgICAgICAgIHRvIHVzZSBhbmQgaW1wbGVtZW50IGl0LCBzZWUgdGhlICJOZXN0ZWQgY2xhc3NlcyIgc2VjdGlvbiBpbiBTV0lHUGx1cy5odG1sLgoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgVGhlcmUgd2VyZSBhIG51bWJlciBvZiBDKysgY2FzZXMgd2hlcmUgbmVzdGVkIGNsYXNzZXMvc3RydWN0cy91bmlvbnMgd2VyZSBiZWluZyBoYW5kbGVkCiAgICAgICAgICAgIGFzIGlmIEMgY29kZSB3YXMgYmVpbmcgcGFyc2VkIHdoaWNoIHdvdWxkIG9mdGVudGltZXMgbGVhZCB0byB1bmNvbXBpbGVhYmxlIGNvZGUgYXMgYW4KICAgICAgICAgICAgYXR0ZW1wdCB3YXMgbWFkZSB0byB3cmFwIHRoZSBuZXN0ZWQgc3RydWN0cyBsaWtlIGl0IGlzIGRvY3VtZW50ZWQgZm9yIEMgY29kZS4gTm93IGFsbAogICAgICAgICAgICBuZXN0ZWQgc3RydWN0cy9jbGFzc2VzL3VuaW9ucyBhcmUgaWdub3JlZCBpbiBDKysgbW9kZSwgYXMgd2FzIGFsd2F5cyBkb2N1bWVudGVkLiBIb3dldmVyLAogICAgICAgICAgICB0aGVyZSBpcyBhbiBpbXByb3ZlbWVudCBhcyB1c2FnZSBvZiBuZXN0ZWQgc3RydWN0cy9jbGFzc2VzL3VuaW9ucyBpcyBub3cgYWx3YXlzIHRyZWF0ZWQKICAgICAgICAgICAgYXMgYW4gb3BhcXVlIHR5cGUgYnkgZGVmYXVsdCwgcmVzdWx0aW5nIGluIGdlbmVyYXRlZCBjb2RlIHRoYXQgc2hvdWxkIGFsd2F5cyBjb21waWxlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTExLTA5OiBkcmpvZQoJICAgIEZpeCBSIGZvciAtZmNvbXBhY3QgYW5kIGFkZCBzdGRfbWFwLmkKCjIwMDktMTEtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvbnNpc3RlbmN5IGZvciBuZXN0ZWQgc3RydWN0cy91bmlvbnMvY2xhc3Nlcy4gVW5jb21waWxlYWJsZSBjb2RlIHdhcyBiZWluZwogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBpbm5lciBzdHJ1Y3QgYW5kIHVuaW9uIGRlY2xhcmF0aW9ucyB3ZXJlIHVzZWQgYXMgdHlwZXMgd2l0aGluIHRoZQogICAgICAgICAgICBpbm5lciBzdHJ1Y3QuIFRoZSBpbm5lciBzdHJ1Y3QvdW5pb24gaXMgbm93IHRyZWF0ZWQgYXMgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG1ha2luZyB0aGUKICAgICAgICAgICAgYmVoYXZpb3VyIHRoZSBzYW1lIGFzIGFuIGlubmVyIGNsYXNzLiAoQysrIGNvZGUpLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBJbm5lclN0cnVjdCB7IGludCB4OyB9OwogICAgICAgICAgICAgICAgSW5uZXJTdHJ1Y3QqIGdldElubmVyU3RydWN0KCk7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMDg6IHdzZnVsdG9uCgkgICAgSWdub3JlZCBuZXN0ZWQgY2xhc3Mvc3RydWN0IHdhcm5pbmdzIG5vdyBkaXNwbGF5IHRoZSBuYW1lIG9mIHRoZSBpZ25vcmVkIGNsYXNzL3N0cnVjdC4KCjIwMDktMTEtMDc6IHdzZnVsdG9uCgkgICAgQnVnICMxNTE0NjgxIC0gRml4IG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGhpbiBhIG5hbWVzcGFjZSBnZW5lcmF0ZWQgdW5jb21waWxlYWJsZQogICAgICAgICAgICBjb2RlIGFuZCBpbnRyb2R1Y2VkIHN0cmFuZ2Ugc2lkZSBlZmZlY3RzIHRvIG90aGVyIHdyYXBwZXIgY29kZSBlc3BlY2lhbGx5IGNvZGUKICAgICAgICAgICAgYWZ0ZXIgdGhlIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzcy4gTm90ZSB0aGF0IG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIGFyZSBzdGlsbCBpZ25vcmVkLgoKMjAwOS0xMS0wNzogd3NmdWx0b24KCSAgICBBZGQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgLWRlYnVnLXN5bXRhYnMgICAgLSBEaXNwbGF5IHN5bWJvbCB0YWJsZXMgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAtZGVidWctc3ltYm9scyAgICAtIERpc3BsYXkgdGFyZ2V0IGxhbmd1YWdlIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZXMKICAgICAgICAgICAgICAtZGVidWctY3N5bWJvbHMgICAtIERpc3BsYXkgQyBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCgoyMDA5LTExLTAzOiB3c2Z1bHRvbgoJICAgIEZpeCBzb21lIHVzYWdlIG9mIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgZGVub3RpbmcgZ2xvYmFsIHNjb3BlLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIEFBIHsgLyogLi4uICovIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjpBQTsKCiAgICAgICAgICAgIGFuZCBidWcgIzE4MTY4MDIgLSBTd2lnVmFsdWVXcmFwcGVyIHNob3VsZCBiZSB1c2VkOgoKICAgICAgICAgICAgICBzdHJ1Y3QgQ0MgewogICAgICAgICAgICAgICAgQ0MoaW50KTsgLy8gbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgOjpDQyB4KCk7CgogICAgICAgICAgICBhbmQgaW4gdGVtcGxhdGUgcGFyYW1ldGVyIHNwZWNpYWxpemF0aW9uczoKCiAgICAgICAgICAgICAgc3RydWN0IFMge307CiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHsgdm9pZCBhKCkge307IH07CiAgICAgICAgICAgICAgdGVtcGxhdGUgPD4gc3RydWN0IFg8Uz4geyB2b2lkIGIoKSB7fTsgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoTXlUQ29uY3JldGUpIFg8IDo6UyA+OwoKICAgICAgICAgICAgcGx1cyBwcm9iYWJseSBzb21lIG90aGVyIGNvcm5lciBjYXNlIHVzYWdlIG9mIDo6LgoKMjAwOS0xMS0wMjogb2xseQoJICAgIFtQeXRob25dIEZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgaW4gaW5pdGlhbGlzYXRpb24gY29kZSBmb3IgdGhlCgkgICAgZ2VuZXJhdGVkIG1vZHVsZS4KCjIwMDktMTAtMjM6IHdzZnVsdG9uCgkgICAgRml4IHNlZyBmYXVsdCB3aGVuIHVzaW5nIGEgbmFtZWQgbmVzdGVkIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gdXNpbmcgJXRlbXBsYXRlKG5hbWUpIAogICAgICAgICAgICB3aXRoaW4gYSBjbGFzcy4gQSB3YXJuaW5nIHRoYXQgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQgaXMgbm93IGlzc3VlZCBwbHVzIHByb2Nlc3NpbmcgCiAgICAgICAgICAgIGNvbnRpbnVlcyBhcyBpZiBubyBuYW1lIHdhcyBnaXZlbi4KCjIwMDktMTAtMjA6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRml4IHN0ZDo6dmVjdG9yPGNvbnN0IFQqPi4gVGhpcyB3b3VsZCBwcmV2aW91c2x5IGNvbXBpbGUsIGJ1dCBub3QgcnVuIGNvcnJlY3RseS4KCjIwMDktMTAtMjA6IHdzZnVsdG9uCgkgICAgRml4ZWQgcHJldmlvdXNseSBmYWlybHkgcG9vciB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFuZCBleHBsaWNpdCAKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gc3VwcG9ydC4gTnVtZXJvdXMgYnVncyBpbiB0aGlzIGFyZWEgaGF2ZSBiZWVuIGZpeGVkIGluY2x1ZGluZzoKCiAgICAgICAgICAgIC0gVGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGltcGxlbWVudGVkIGZvciB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50cywgZWcgdGhpcyBub3cKICAgICAgICAgICAgICB3b3JrczoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFggICAgICB7fTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFg8VCAqPiB7fTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShYMSkgWDxjb25zdCBpbnQgKj47IC8vIENob29zZXMgVCAqIHNwZWNpYWxpemF0aW9uCgogICAgICAgICAgICAgIGFuZCBtb3JlIGNvbXBsZXggY2FzZXMgd2l0aCBtdWx0aXBsZSBwYXJhbWV0ZXJzIGFuZCBhIG1peCBvZiB0ZW1wbGF0ZSBhcmd1bWVudAogICAgICAgICAgICAgIGRlZHVjdGlvbiBhbmQgZXhwbGljaXRseSBzcGVjaWFsaXNlZCBwYXJhbWV0ZXJzLCBlZzoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+IHN0cnVjdCBUd29QYXJtICAgICAgICAgICAgICAgeyB2b2lkIGEoKSB7fSB9OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPiAgICAgICAgICAgICAgc3RydWN0IFR3b1Bhcm08VDEgKiwgaW50ICo+ICB7IHZvaWQgZSgpIHt9IH07CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRSkgVHdvUGFybTxpbnQgKiosIGludCAqPjsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgcHJpbWFyeSB0ZW1wbGF0ZSBtdXN0IG5vdyBiZSBpbiBzY29wZSwgbGlrZSBpbiBDKyssIHdoZW4KICAgICAgICAgICAgYW4gZXhwbGljaXQgb3IgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcyBpbnN0YW50aWF0ZWQgd2l0aCAldGVtcGxhdGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDktMTQ6IHdzZnVsdG9uCgkgICAgW0MjXSBBZGQgJWNzYXR0cmlidXRlcyBmb3IgYWRkaW5nIEMjIGF0dHJpYnV0ZXMgdG8gZW51bSB2YWx1ZXMsIHNlZSBkb2NzIGZvciBleGFtcGxlLgoKMjAwOS0wOS0xMTogd3NmdWx0b24KCSAgICBGaXggbWVtbW92ZSByZWdyZXNzaW9uIGluIGNkYXRhLmkgYXMgcmVwb3J0ZWQgYnkgQWRyaWFhbiBSZW50aW5nLgoKMjAwOS0wOS0wNzogd3NmdWx0b24KCSAgICBGaXggY29uc3RhbnQgZXhwcmVzc2lvbnMgY29udGFpbmluZyA8PSBvciA+PS4KCjIwMDktMDktMDI6IHdzZnVsdG9uCgkgICAgVGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMgbm93IHJlc3VsdCBpbiB0eXBlIGJvb2wgZm9yIEMrKyAKICAgICAgICAgICAgd3JhcHBlcnMgYW5kIHJlbWFpbiBhcyB0eXBlIGludCBmb3IgQyB3cmFwcGVycywgYXMgcGVyIGVhY2ggc3RhbmRhcmQ6IAoKICAgICAgICAgICAgICAmJiB8fCA9PSAhPSA8ID4gPD0gPj0gKEFjdHVhbGx5IHRoZSBsYXN0IDQgYXJlIHN0aWxsIGJyb2tlbikuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAjZGVmaW5lIEEgMTAKICAgICAgICAgICAgICAjZGVmaW5lIEIgMTAKICAgICAgICAgICAgICAjZGVmaW5lIEFfRVFfQiAgQSA9PSBCIC8vIG5vdyB3cmFwcGVkIGFzIHR5cGUgYm9vbCBmb3IgQysrCiAgICAgICAgICAgICAgI2RlZmluZSBBX0FORF9CIEEgJiYgQiAvLyBub3cgd3JhcHBlZCBhcyB0eXBlIGJvb2wgZm9yIEMrKwoKMjAwOS0wOS0wMjogd3NmdWx0b24KCSAgICBGaXggIzI4NDU3NDYuIHRydWUgYW5kIGZhbHNlIGFyZSBub3cgcmVjb2duaXNlZCBrZXl3b3JkcyAob25seSB3aGVuIHdyYXBwaW5nIEMrKykuCiAgICAgICAgICAgIENvbnN0YW50cyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgYXJlIG5vdyB3cmFwcGVkIChhcyB0eXBlIGJvb2wpOgogICAgICAgICAgICAgICNkZWZpbmUgRk9PIHRydWUKICAgICAgICAgICAgICAjZGVmaW5lIEJBUiBGT08gJiYgZmFsc2UKClZlcnNpb24gMS4zLjQwICgxOCBBdWd1c3QgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wOC0xNzogb2xseQoJICAgIFtQZXJsXSBBZGQgIiN1bmRlZiBkb19leGVjIiB0byBvdXIgY2xlYW4gdXAgb2YgUGVybCBnbG9iYWwKCSAgICBuYW1lc3BhY2UgcG9sbHV0aW9uLgoKMjAwOS0wOC0xNzogb2xseQoJICAgIFtQSFBdIEZpeCB0byB3cmFwIGEgcmVzb3VyY2UgcmV0dXJuZWQgYnkgX19nZXQoKSBpbiBhIFBIUCBvYmplY3QgKFNGIzI1NDkyMTcpLgoKMjAwOS0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNzk3NDg1IEFmdGVyIGRvaW5nIGEgJ21ha2UgY2xlYW4nLCBpbnN0YWxsIGZhaWxzIGlmIHlvZGwybWFuIG9yIHlvZGwyaHRtbCAKICAgICAgICAgICAgaXMgbm90IGF2YWlsYWJsZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIENhdWdodCBleGNlcHRpb25zIGRpc3BsYXkgdGhlIHR5cGUgb2YgdGhlIEMrKyBleGNlcHRpb24gaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgZ2VuZXJpYyAiYysrLXNpZGUgdGhyZXcgYW4gZXhjZXB0aW9uIiBtZXNzYWdlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFdoZW4gJWNhdGNoZXMgaXMgdXNlZCwgZml4IHNvIHRoYXQgYW55IGNsYXNzZXMgc3BlY2lmaWVkIGluIHRoZSAidGhyb3dzIgogICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlICJ0aHJvd3MiIHR5cGVtYXAgYXJlIGdlbmVyYXRlZCBpbnRvIHRoZSBKYXZhIG1ldGhvZCdzIHRocm93cyBjbGF1c2UuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBleGNlcHRpb24gaGFuZGxpbmcgd2hlbiAlY2F0Y2hlcyBpcyB1c2VkLCByZXBvcnRlZCBieSBKdWFuIE1hbnVlbCBBbHZhcmV6LgoKMjAwOS0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICV0ZW1wbGF0ZSBzZWcgZmF1bHQgb24gc29tZSBjYXNlcyBvZiBvdmVybG9hZGluZyB0aGUgdGVtcGxhdGVkIG1ldGhvZC4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IEphbiBLdXBlYy4KCjIwMDktMDgtMTU6IHdzZnVsdG9uCgkgICAgW1J1YnldIEFkZCBudW1lcm91cyBtaXNzaW5nIHdyYXBwZWQgbWV0aG9kcyBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4gc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgYXMgcmVwb3J0ZWQgYnkgWW91c3NlZiBKb25lcy4KCjIwMDktMDgtMTQ6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEFkZCBTV0lHX0NvbnZlcnRQdHJBbmRPd24oKSBtZXRob2QgaW50byB0aGUgcnVudGltZSBmb3Igc21hcnQgcG9pbnRlciAKICAgICAgICAgICAgbWVtb3J5IG93bmVyc2hpcCBjb250cm9sLiBzaGFyZWRfcHRyIHN1cHBvcnQgc3RpbGwgdG8gYmUgYWRkZWQuIFBhdGNoIGZyb20gCiAgICAgICAgICAgIERhdmlkIEZsZXRjaGVyLgoKMjAwOS0wOC0xNDogb2xseQoJICAgIFtQSFBdIFBIUDUgbm93IHdyYXBzIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIGFzIGRvY3VtZW50ZWQuCgoyMDA5LTA4LTE0OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBQSFAgImNsYXNzIiBleGFtcGxlIHRvIHdvcmsgd2l0aCBQSFA1IGFuZCB1c2UKCSAgICBtb2Rlcm4gd3JhcHBpbmcgZmVhdHVyZXMuCgoyMDA5LTA4LTEzOiB3c2Z1bHRvbgoJICAgIFtQSFBdIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG92ZXJoYXVsLiBUaGV5IG5vIGxvbmdlciByZXF1aXJlIHRoZSAKICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfdmVjdG9yKCkgbWFjcm8uIEFkZGVkIHdyYXBwZXJzIGZvciBjYXBhY2l0eSgpIGFuZCByZXNlcnZlKCkuCgoyMDA5LTA4LTEzOiB3c2Z1bHRvbgoJICAgIFtQSFBdIEFkZCBjb25zdCByZWZlcmVuY2UgdHlwZW1hcHMuIGNvbnN0IHJlZmVyZW5jZSBwcmltaXRpdmUgdHlwZXMgYXJlCiAgICAgICAgICAgIG5vdyBwYXNzZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gcG9pbnRlciBsaWtlIHRoZSBvdGhlciB0YXJnZXQgbGFuZ3VhZ2VzLgoJICAgIEZpeGVzIFNGIzI1MjQwMjkuCgoyMDA5LTA4LTA4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIE1vcmUgdXNlciBmcmllbmRseSBBdHRyaWJ1dGVFcnJvciBpcyByYWlzZWQgd2hlbiB0aGVyZSBhcmUKICAgICAgICAgICAgbm8gY29uc3RydWN0b3JzIGdlbmVyYXRlZCBmb3IgdGhlIHByb3h5IGNsYXNzIGluIHRoZSBldmVudCB0aGF0IHRoZQogICAgICAgICAgICBjbGFzcyBpcyBhYnN0cmFjdCAtIHRoZSBlcnJvciBtZXNzYWdlIGlzIG5vdyAKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQgLSBjbGFzcyBpcyBhYnN0cmFjdCIgd2hlcmVhcyBpZiB0aGVyZSBhcmUgbm8KICAgICAgICAgICAgcHVibGljIGNvbnN0cnVjdG9ycyBmb3IgYW55IG90aGVyIHJlYXNvbiBhbmQgdGhlIGNsYXNzIGlzIG5vdCBhYnN0cmFjdCwKICAgICAgICAgICAgdGhlIG1lc3NhZ2UgcmVtYWlucwogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCIuCiAgICAgICAgICAgIFt0Y2xdIFNpbWlsYXJseSBmb3IgdGNsIHdoZW4gdXNpbmcgLWl0Y2wuCgoyMDA5LTA4LTA0OiBvbGx5CgkgICAgW1BIUF0gRml4IGdlbmVyYXRlZCBjb2RlIHRvIHdvcmsgd2l0aCBQSFAgNS4zLgoKMjAwOS0wOC0wNDogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBWYXJpb3VzIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMgKHdoaWNoIHdvdWxkIGNvbmZsaWN0CiAgICAgICAgICAgIHdpdGggdGhlIGJ1aWx0LWluIFBIUCBvbmVzKSBhcmUgbm93IGF1dG9tYXRpY2FsbHkgaGFuZGxlZCBieQogICAgICAgICAgICBhZGRpbmcgYSAnY18nIHByZWZpeC4KCjIwMDktMDgtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlIHN0ZDo6dmVjdG9yPFQ+IGltcGxlbWVudGF0aW9uIGlzIGltcHJvdmVkIGFuZCBub3cgdXNlcyAkdHlwZW1hcCBzdWNoCiAgICAgICAgICAgIHRoYXQgdGhlIHByb3h5IGNsYXNzIGZvciBUIG5vIGxvbmdlciBoYXMgdG8gYmUgc3BlY2lmaWVkIGluIHNvbWUgbWFjcm9zCiAgICAgICAgICAgIGZvciBjb3JyZWN0IEMjIGNvbXBpbGF0aW9uOyB0aGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVwcmVjYXRlZCwgd2hlcmUKICAgICAgICAgICAgQ1NUWVBFIHdhcyB0aGUgQyMgdHlwZSBmb3IgdGhlIEMrKyBjbGFzcyBDVFlQRToKCiAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9TUEVDSUFMSVpFX01JTklNVU0oQ1NUWVBFLCBDVFlQRSkKICAgICAgICAgICAgICB1c2FnZSBzaG91bGQgYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyCgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRShDU1RZUEUsIENUWVBFKQogICAgICAgICAgICAgIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoOgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfRU5IQU5DRUQoQ1RZUEUpCgogICAgICAgICAgICBTb21lIG1vcmUgZGV0YWlscyBpbiBjc2hhcnAvc3RkX3ZlY3Rvci5pCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDctMzE6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggaW5kZW50YXRpb24gc28gdGhhdCB3ZSBnaXZlIGEgdXNlZnVsIGVycm9yIGlmIHRoZQoJICAgIG1vZHVsZSBjYW4ndCBiZSBsb2FkZWQuICBQYXRjaCBmcm9tIEdhZXRhbiBMZWhtYW5uIGluIFNGIzI4Mjk4NTMuCgoyMDA5LTA3LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgJHR5cGVtYXAobWV0aG9kLCB0eXBlbGlzdCkgc3BlY2lhbCB2YXJpYWJsZSBtYWNyby4gVGhpcyBhbGxvd3MKICAgICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIGEgdHlwZW1hcCB0byBiZSBpbnNlcnRlZCB3aXRoaW4gYW5vdGhlciB0eXBlbWFwLgogICAgICAgICAgICBGdWxseSBkb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTA3LTI5OiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIGFyZSBub3cgcHJlZml4ZWQgd2l0aCB0aGUKICAgICAgICAgICAgY2xhc3MgbmFtZS4gVGhpcyBhbGxvd3Mgc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgd2l0aCB0aGUKICAgICAgICAgICAgc2FtZSBuYW1lIGluIGRpZmZlcmVudCBjbGFzc2VzLgoKMjAwOS0wNy0yOTogb2xseQoJICAgIFtQeXRob25dIEFkZCBtaXNzaW5nIGxvY2tzIHRvIHN0ZDo6bWFwIHdyYXBwZXJzLiAgUGF0Y2ggZnJvbSAKCSAgICBQYXVsIEhhbXBzb24gaW4gU0YjMjgxMzgzNi4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gUEhQIE9VVFBVVCB0eXBlbWFwcy4gIFJlcG9ydGVkIGJ5IEhpdG9zaGkKCSAgICBBbWFubyBpbiBTRiMyODI2MzIyLgoKMjAwOS0wNy0yOTogb2xseQoJICAgIFtQSFBdIEZpeCBtZW1vcnkgbGVhayBpbiBQSFAgcmVzb3VyY2UgZGVzdHJ1Y3RvciBmb3IgY2xhc3NlcwoJICAgIHdpdGhvdXQgYSBkZXN0cnVjdG9yIGFuZCBub24tY2xhc3MgdHlwZXMuICBQYXRjaCBmcm9tIEhpdG9zaGkgQW1hbm8KCSAgICBpbiBTRiMyODI1MzAzLgoKMjAwOS0wNy0yODogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB3YXJuaW5ncyBhYm91dCBjbGFzaGVzIGJldHdlZW4gaWRlbnRpZmllcnMgYW5kIFBIUAoJICAgIGtleXdvcmRzIGFuZCBhdXRvbWF0aWMgcmVuYW1pbmcgdG8gd29yayB3aXRoIHRoZSBQSFA1IGNsYXNzCgkgICAgd3JhcHBlcnMuICBGaXhlcyBTRiMxNjEzNjc5LgoKMjAwOS0wNy0yODogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBJZiBhIG1lbWJlciBmdW5jdGlvbiBpcyBub3QgcHVibGljIGJ1dCBpdCBoYXMgYSBiYXNlCiAgICAgICAgICAgIHdoaWNoIGlzIHB1YmxpYywgdGhlbiBub3cgYSB3YXJuaW5nIGlzIGlzc3VlZCBhbmQgdGhlIG1lbWJlcgogICAgICAgICAgICBmdW5jdGlvbiB3aWxsIGJlIHB1YmxpYywgYXMgUEhQIHJlcXVpcmVzIHRoaXMuCgoyMDA5LTA3LTIxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIERpcmVjdG9yIHN1cHBvcnQgYWRkZWQuCgoyMDA5LTA3LTE1OiBvbGx5CgkgICAgW1BlcmxdIERvbid0IHNwZWNpZnkgUGVybCBwcm90b3R5cGUgIigpIiBmb3IgYSBjb25zdHJ1Y3RvciB3aXRoIGEKCSAgICBkaWZmZXJlbnQgbmFtZSB0byB0aGUgY2xhc3MsIGFzIHN1Y2ggY29uc3RydWN0b3JzIGNhbiBzdGlsbCB0YWtlCgkgICAgcGFyYW1ldGVycy4KCjIwMDktMDctMTI6IHhhdmllcjk4CgkgICAgW09jdGF2ZV0gQWRkIHN1cHBvcnQgZm9yIE9jdGF2ZSAzLjIgQVBJCgoyMDA5LTA3LTA1OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBsaXN0IG9mIFBIUCBrZXl3b3JkcyAtICJjZnVuY3Rpb24iIGlzIG5vIGxvbmdlciBhCgkgICAga2V5d29yZCBpbiBQSFA1IGFuZCBQSFAgNS4zIGFkZGVkICJnb3RvIiwgIm5hbWVzcGFjZSIsICJfX0RJUl9fIiwKCSAgICBhbmQgIl9fTkFNRVNQQUNFX18iLgoKMjAwOS0wNy0wMzogb2xseQoJICAgIFtUY2xdIFRvIGNvbXBsZW1lbnQgVVNFX1RDTF9TVFVCUywgYWRkIHN1cHBvcnQgZm9yIFVTRV9US19TVFVCUwoJICAgIGFuZCBTV0lHX1RDTF9TVFVCU19WRVJTSU9OLiAgRG9jdW1lbnQgYWxsIHRocmVlIGluIHRoZSBUY2wgY2hhcHRlcgoJICAgIG9mIHRoZSBtYW51YWwuICBCYXNlZCBvbiBwYXRjaCBmcm9tIFNGIzI4MTAzODAgYnkgQ2hyaXN0aWFuCgkgICAgR29sbHdpdHplci4KCjIwMDktMDctMDI6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gQWRkZWQgZmFjdG9yeS5pIGZvciBQSFAsIHNlZSB0aGUgbGlfZmFjdG9yeSB0ZXN0Y2FzZQogICAgICAgICAgICBmb3IgbW9yZSBpbmZvIG9uIGhvdyB0byB1c2UgaXQuCgoyMDA5LTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggLVdhbGxrdyBvcHRpb24gYXMgcmVwb3J0ZWQgYnkgU29sb21vbiBHaWJicy4KCjIwMDktMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzeW50YXggZXJyb3Igd2hlbiBhIG5lc3RlZCBzdHJ1Y3QgY29udGFpbnMgYSBjb21tZW50IGNvbnRhaW5pbmcgYSAqIGZvbGxvd2VkIAogICAgICAgICAgICBldmVudHVhbGx5IGJ5IGEgLy4gUmVncmVzc2lvbiBmcm9tIDEuMy4zNywgcmVwb3J0ZWQgYnkgU29sb21vbiBHaWJicy4KCjIwMDktMDctMDE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gVW5rbm93biBwcm9wZXJ0aWVzIGFyZSBubyBsb25nZXIgaWdub3JlZCBpbiBwcm94eQogICAgICAgICAgICBjbGFzc2VzLgoKMjAwOS0wNy0wMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBGaXhlZCAlbmV3b2JqZWN0IGJlaGF2aW91ciwgcHJldmlvdXNseSBhbnkgbWV0aG9kCiAgICAgICAgICAgIG1hcmtlZCB3aXRoICVuZXdvYmplY3Qgd2FzIGhhbmRsZWQgYXMgYSBjb25zdHJ1Y3Rvci4KCjIwMDktMDYtMzA6IG9sbHkKCSAgICBbUnVieV0gVW5kZWZpbmUgY2xvc2UgYW5kIGNvbm5lY3QgbWFjcm9zIGRlZmluZWQgYnkgUnVieSBBUEkKCSAgICBoZWFkZXJzIGFzIHdlIGRvbid0IG5lZWQgdGhlbSBhbmQgdGhleSBjYW4gY2xhc2ggd2l0aCBDKysgbWV0aG9kcwoJICAgIGJlaW5nIHdyYXBwZWQuICBQYXRjaCBmcm9tIFZpdCBPbmRydWNoIGluIFNGIzI4MTQ0MzAuCgoyMDA5LTA2LTI2OiBvbGx5CgkgICAgW1J1YnldIEZpeCB0byBoYW5kbGUgRklYTlVNIHZhbHVlcyBncmVhdGVyIHRoYW4gTUFYSU5UIHBhc3NlZCBmb3IgYQoJICAgIGRvdWJsZSBwYXJhbWV0ZXIuCgoyMDA5LTA2LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCB0aGUgY29tcGFjdGRlZmF1bHRhcmdzIGZlYXR1cmUgCiAgICAgICAgICAgIHdoZXJlIGEgY2xhc3MgaXMgcGFzc2VkIGJ5IHZhbHVlIGFuZCBpcyBhc3NpZ25lZCBhIGRlZmF1bHQgdmFsdWUuIFRoZSBTd2lnVmFsdWVXcmFwcGVyCiAgICAgICAgICAgIHRlbXBsYXRlIHdvcmthcm91bmQgZm9yIGEgbWlzc2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIG5vIGxvbmdlciB1c2VkIGFzIHRoZSBjb2RlIAogICAgICAgICAgICBnZW5lcmF0ZWQgZG9lcyBub3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KCjIwMDktMDYtMTY6IHdzZnVsdG9uCgkgICAgW0phdmEsQyNdIEZpeCBlbnVtIG1hcnNoYWxsaW5nIHdoZW4gJWlnbm9yZSBpcyB1c2VkIG9uIG9uZSBvZiB0aGUgZW51bSBpdGVtcy4KICAgICAgICAgICAgSW5jb3JyZWN0IGVudW0gdmFsdWVzIHdlcmUgYmVpbmcgcGFzc2VkIHRvIHRoZSBDKysgbGF5ZXIgb3IgY29tcGlsYXRpb24gZXJyb3JzIHJlc3VsdGVkLgoKMjAwOS0wNi0wMjogdGFsYnkKCSAgICBbUGVybF0gUmVzb2x2ZWQgcmVmZXJlbmNlLmkgb3ZlcmxvYWQgc3VwcG9ydCBwcm9ibGVtCgkgICAgaWRlbnRpZmllZCBieSBKb2huIFBvdG93c2t5LgoKMjAwOS0wNS0yNjogd3NmdWx0b24KCSAgICBbQyNdIEltcHJvdmVkIHN0ZDo6bWFwIHdyYXBwZXJzIGJhc2VkIG9uIHBhdGNoIGZyb20gWXV2YWwgQmFyb3IuIFRoZSBDIyBwcm94eQogICAgICAgICAgICBub3cgaW1wbGVtZW50cyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRGljdGlvbmFyeTw+LgoKCSAgICBUaGVzZSBzdGQ6bWFwIHdyYXBwZXJzIGhhdmUgYSBub24tYmFja3dhcmRzIGNvbXBhdGlibGUgb3ZlcmhhdWwgdG8gbWFrZSB0aGVtCiAgICAgICAgICAgIGxpa2UgYSAuTkVUIElEaWN0aW9uYXJ5LiBTb21lIG1ldGhvZCBuYW1lcyBoYXZlIGNoYW5nZWQgYXMgZm9sbG93aW5nOgogICAgICAgICAgICAgIHNldCAtPiBzZXRpdGVtICh1c2UgdGhpc1tdIHByb3BlcnR5IG5vdykKICAgICAgICAgICAgICBnZXQgLT4gZ2V0aXRlbSAodXNlIHRoaXNbXSBwcm9wZXJ0eSBub3cpCiAgICAgICAgICAgICAgaGFzX2tleSAtPiBDb250YWluc0tleQogICAgICAgICAgICAgIGRlbCAtPiBSZW1vdmUKICAgICAgICAgICAgICBjbGVhciAtPiBDbGVhcgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgdXNlZCBmb3Igc3RkOjptYXAgd3JhcHBlcnMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgbm8gbG9uZ2VyIHdvcms6CiAgICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX2tleQogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl92YWx1ZQogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl9ib3RoCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDUtMjA6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gQWRkIHRoZSAndGhpc293bicgbWVtYmVyIHRvIGNsYXNzZXMuIFRoZSB1c2FnZSBvZiBpdAogICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyB0aGUgUHl0aG9uIHRoaXNvd24gb25lOiBpdCdzIDEgYnkgZGVmYXVsdCBhbmQKICAgICAgICAgICAgeW91IGNhbiBzZXQgaXQgdG8gMCBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IGZyZWVpbmcgaXQuIChGb3IKICAgICAgICAgICAgZXhhbXBsZSB0byBwcmV2ZW50IGEgZG91YmxlIGZyZWUuKQoKMjAwOS0wNS0xNDogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgd3JvbmcgcG9pbnRlciB2YWx1ZSByZXR1cm5lZCBieSBTd2lnUHlPYmplY3RfcmVwcigpLgoKMjAwOS0wNS0xMzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIE1pbm9yIHR3ZWFrIHdoZW4gd3JhcHBpbmcgaW4gLW5vY3dyYXAgbW9kZS4KCjIwMDktMDUtMTE6IHdzZnVsdG9uCgkgICAgW0MjXSBJbXByb3ZlZCBzdGQ6OnZlY3RvciB3cmFwcGVycyBvbiB0aGUgQyMgcHJveHkgc2lkZSBmcm9tIFl1dmFsIEJhcm9yLiBUaGVzZQoJICAgIGltcGxlbWVudCBJTGlzdDw+IGluc3RlYWQgb2YgSUVudW1lcmFibGU8PiB3aGVyZSBwb3NzaWJsZS4KCjIwMDktMDQtMjk6IHdzZnVsdG9uCgkgICAgW0phdmEsIEMjXSBBZGQgdGhlICdub3RkZXJpdmVkJyBhdHRyaWJ1dGUgdG8gdGhlIGphdmFiYXNlIGFuZCBjc2Jhc2UgdHlwZW1hcHMuCgkgICAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZSB0eXBlbWFwIHdpbGwgbm90IGFwcGx5IHRvIGNsYXNzZXMgdGhhdCBhcmUgZGVyaXZlZAoJICAgIGZyb20gYSBDKysgYmFzZSBjbGFzcywgZWcgCgkgICAgICAldHlwZW1hcChjc2Jhc2UsIG5vdGRlcml2ZWQ9IjEiKSBTV0lHVFlQRSAiQ29tbW9uQmFzZSIKCjIwMDktMDQtMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBEb24ndCBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIEdJTCBpbiBzaXR1YXRpb25zIHdoZXJlIHdlCgkgICAga25vdyB0aGF0IGl0IHdpbGwgYWxyZWFkeSBiZSBsb2NrZWQuICBUaGlzIGF2b2lkcyBzb21lIGRlYWQtbG9ja3MKCSAgICB3aXRoIG1vZF9weXRob24gKGR1ZSB0byBtb2RfcHl0aG9uIGJ1Z3Mgd2hpY2ggYXJlIGFwcGFyZW50bHkKCSAgICB1bmxpa2VseSB0byBldmVyIGJlIGZpeGVkKSwgYW5kIHJlc3VsdHMgaW4gc21hbGxlciB3cmFwcGVycyB3aGljaAoJICAgIHJ1biBhIGxpdHRsZSBmYXN0ZXIgKGluIHRlc3RzIHdpdGggWGFwaWFuIG9uIHg4Ni02NCBVYnVudHUgOS4wNCwKCSAgICB0aGUgc3RyaXBwZWQgd3JhcHBlciBsaWJyYXJ5IHdhcyAxMSUgc21hbGxlciBhbmQgcmFuIDIuNyUgZmFzdGVyKS4KCjIwMDktMDQtMjE6IHdzZnVsdG9uCgkgICAgW0MjXSBGaXggIzI3NTM0NjkgLSBib29sICZPVVRQVVQgYW5kIGJvb2wgKk9VVFBVVCB0eXBlbWFwcyBpbml0aWFsaXNhdGlvbi4KCjIwMDktMDQtMDk6IHdzZnVsdG9uCgkgICAgRml4ICMyNzQ2ODU4IC0gQyBtYWNybyBleHByZXNzaW9uIHVzaW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKCjIwMDktMDMtMzA6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVmYXVsdCBvdXQgdHlwZW1hcCBmb3IgY2hhcltBTlldIG5vdyByZXR1cm5zIHRoZSBzdHJpbmcgdXAgdG8gYQoJICAgIHplcm8gYnl0ZSwgb3IgdGhlIGVuZCBvZiB0aGUgYXJyYXkgaWYgdGhlcmUgaXMgbm8gemVybyBieXRlLiAgVGhpcwoJICAgIGlzIHRoZSBzYW1lIGFzIFB5dGhvbiBkb2VzLCBhbmQgc2VlbXMgbW9yZSBnZW5lcmFsbHkgdXNlZnVsIHRoYW4KCSAgICB0aGUgcHJldmlvdXMgYmVoYXZpb3VyIG9mIHJldHVybmluZyB0aGUgd2hvbGUgY29udGVudHMgb2YgdGhlIGFycmF5CgkgICAgaW5jbHVkaW5nIGFueSB6ZXJvIGJ5dGVzLiAgSWYgeW91IHdhbnQgdGhlIG9sZCBiZWhhdmlvdXIsIHlvdSBjYW4gcHJvdmlkZQoJICAgIHlvdXIgb3duIHR5cGVtYXAgdG8gZG8gdGhpczoKCgkgICAgJXR5cGVtYXAob3V0KSBjaGFyIFtBTlldCgkgICAgJXsKCQlSRVRWQUxfU1RSSU5HTCgkMSwgJDFfZGltMCwgMSk7CgkgICAgJX0KClZlcnNpb24gMS4zLjM5ICgyMSBNYXJjaCAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDMtMTk6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIG1lbW9yeSBsZWFrIHJlbGF0ZWQgdG8gUHl0aG9uIDMgdW5pY29kZSBhbmQgQyBjaGFyKiBjb252ZXJzaW9uLAogICAgICAgICAgICB3aGljaCBjYW4gYmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGJlZm9yZSB0aGlzIGZpeDoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZyb20gbGlfY3N0cmluZyBpbXBvcnQgKgogICAgICAgICAgICAgICAgICBpPTAKICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMQogICAgICAgICAgICAgICAgICAgICAgbiA9IHN0cihpKSoxMAogICAgICAgICAgICAgICAgICAgICAgdGVzdDMobikKCiAgICAgICAgICAgIFRoaXMgZml4IGFmZmVjdGVkIFNXSUdfQXNDaGFyUHRyQW5kU2l6ZSgpIHNvIHlvdSBjYW5ub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGgKICAgICAgICAgICAgYSBudWxsIGFsbG9jIGFuZCBub24tbnVsbCBjcHRyIGFyZ3VtZW50IGluIFB5dGhvbiAzLCBvdGhlcndpc2UgYSBydW50aW1lIGVycm9yCiAgICAgICAgICAgIHdpbGwgYmUgcmFpc2VkLgoKMjAwOS0wMy0xODogd3NmdWx0b24KCSAgICBbQyNdIHN0ZDo6dmVjdG9yPFQ+IHdyYXBwZXIgaW1wcm92ZW1lbnRzIGZvciAuTkVUIDIgYW5kIGFsc28gcHJvdmlkaW5nIHRoZQoJICAgIG5lY2Vzc2FyeSBtYWNoaW5lcnkgdG8gdXNlIHRoZSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVycyB3aXRoIG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgc3VjaAoJICAgIGFzIExJTlEgLSB0aGUgQyMgcHJveHkgY2xhc3Mgbm93IGRlcml2ZXMgZnJvbSBJRW51bWVyYWJsZTw+LiBUaGUgZGVmYXVsdCBpcyBub3cgdG8gCgkgICAgZ2VuZXJhdGUgY29kZSByZXF1aXJpbmcgLk5FVCAyIGFzIGEgbWluaW11bSwgYWx0aG91Z2ggdGhlIEMjIGNvZGUgY2FuIGJlIGNvbXBpbGVkIAoJICAgIGZvciAuTkVUIDEgYnkgZGVmaW5pbmcgdGhlIFNXSUdfRE9UTkVUXzEgQyMgcHJlcHJvY2Vzc29yIGNvbnN0YW50LiBTZWUgdGhlIAoJICAgIHN0ZF92ZWN0b3IuaSBmaWxlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDMtMTI6IHdzZnVsdG9uCgkgICAgW1J1YnldIEZpeCAjMjY3NjczOCBTV0lHIGdlbmVyYXRlZCBzeW1ib2wgbmFtZSBjbGFzaGVzLgoKMjAwOS0wMy0wMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIFNvbWUgZml4ZXMgZm9yIFB5dGhvbiAzLjAuMSBhbmQgaGlnaGVyIHN1cHBvcnQuIEluIDMuMC4xLCB0aGUgQyBBUEkgZnVuY3Rpb24KICAgICAgICAgICAgUHlPYmplY3RfQ29tcGFyZSBpcyByZW1vdmVkLCBzbyBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wgaXMgdXNlZCBmb3IgcmVwbGFjZW1lbnQuCiAgICAgICAgICAgIFN0cnVjdCBpbml0aWxpemF0aW9uIG9mIFN3aWdQeU9iamVjdCBhbmQgU3dpZ1B5T2JqZWN0X2FzX251bWJlciBjaGFuZ2VkIHRvIHJlZmxlY3QKICAgICAgICAgICAgdGhlIGRyb3Agb2YgdHBfY29tcGFyZSBhbmQgbmJfbG9uZy4KCjIwMDktMDMtMDE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjU4MzE2MC4gTm93IHRoZSBpbXBvcnRlciBpbiBQeXRob24gc2hhZG93IHdyYXBwZXIgdGFrZSBjYXJlIG9mIHRoZQogICAgICAgICAgICBjYXNlIHRoYXQgbW9kdWxlIGFscmVhZHkgaW1wb3J0ZWQgYXQgb3RoZXIgcGxhY2UuCgoyMDA5LTAyLTI4OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI2MzczNTIuIE1vdmUgc3RydWN0IGRlY2xhcmF0aW9uIG9mIFNXSUdfbW9kdWxlIGluIHB5aW5pdC5zd2cgYmVmb3JlCiAgICAgICAgICAgIHRoZSBtZXRob2QgY2FsbHMsIHNpbmNlIHNvbWUgQyBjb21waWxlciBkb24ndCBhbGxvdyBkZWNsYXJhdGlvbiBpbiBtaWRkbGUgb2YgZnVuY3Rpb24KICAgICAgICAgICAgYm9keS4KCjIwMDktMDItMjE6IHdzZnVsdG9uCgkgICAgW0FsbGVncm9jbF0gRml4IHNlZyBmYXVsdCB3cmFwcGluZyBzb21lIGNvbnN0YW50IHZhcmlhYmxlICglY29uc3RhbnQpIHR5cGVzLgoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBbQ0ZGSV0gRml4IHNlZyBmYXVsdHMgd2hlbiBmb3IgJWV4dGVuZCBhbmQgdXNpbmcgc3RhdGVtZW50cy4KCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgRml4IFNGICMyNjA1OTU1OiAtY28gb3B0aW9uIHdoaWNoIGJyb2tlIGluIDEuMy4zNy4gCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIE5ldyAlaW5zZXJ0KCJiZWdpbiIpIHNlY3Rpb24gYWRkZWQuIEFsc28gY2FuIGJlIHVzZWQgYXMgJWJlZ2luLiBUaGlzIGlzIGEgbmV3CgkgICAgY29kZSBzZWN0aW9uIHJlc2VydmVkIGVudGlyZWx5IGZvciB1c2VycyBhbmQgdGhlIGNvZGUgd2l0aGluIHRoZSBzZWN0aW9uIGlzIGdlbmVyYXRlZAoJICAgIGF0IHRoZSB0b3Agb2YgdGhlIEMvQysrIHdyYXBwZXIgZmlsZSBhbmQgc28gcHJvdmlkZXMgYSBtZWFucyB0byBwdXQgY3VzdG9tIGNvZGUKCSAgICBpbnRvIHRoZSB3cmFwcGVyIGZpbGUgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhhdCBTV0lHIGdlbmVyYXRlcy4KCjIwMDktMDItMTc6IHdzZnVsdG9uCgkgICAgJ21ha2UgY2xlYW4tdGVzdC1zdWl0ZScgd2lsbCBub3cgcnVuIGNsZWFuIG9uIEFMTCBsYW5ndWFnZXMuIFByZXZpb3VzbHkgaXQgb25seQoJICAgIHJhbiB0aGUgY29ycmVjdGx5IGNvbmZpZ3VyZWQgbGFuZ3VhZ2VzLiBUaGlzIHdheSBpdCBpcyBub3cgcG9zc2libGUgdG8gY2xlYW4gdXAKCSAgICBwcm9wZXJseSBhZnRlciBydW5uaW5nICdtYWtlIHBhcnRpYWxjaGVjay10ZXN0LXN1aXRlJy4KCjIwMDktMDItMTQ6IHdzZnVsdG9uCgkgICAgRXh0ZW5kIGF0dHJpYnV0ZSBsaWJyYXJ5IHN1cHBvcnQgZm9yIHN0cnVjdHMvY2xhc3NlcyBhbmQgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyB1c2UKCSAgICBwYXNzL3JldHVybiBieSB2YWx1ZSBzZW1hbnRpY3MuIFR3byBuZXcgbWFjcm9zIGFyZSBhdmFpbGFibGUgYW5kIHVzYWdlIGlzIGlkZW50aWNhbAoJICAgIHRvICVhdHRyaWJ1dGUuIFRoZXNlIGFyZSAlYXR0cmlidXRldmFsIGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kICVhdHRyaWJ1dGVzdHJpbmcgZm9yCgkgICAgc3RyaW5nIGNsYXNzZXMsIGxpa2Ugc3RkOjpzdHJpbmcuIFNlZSBhdHRyaWJ1dGUuc3dnIGZvciBtb3JlIGRldGFpbHMuCgoyMDA5LTAyLTEzOiB3c2Z1bHRvbgoJICAgIEFkZCBzdXBwb3J0IGZvciAlZXh0ZW5kIGFuZCBtZW1iZXJpbiB0eXBlbWFwcy4gUHJldmlvdXNseSB0aGUgbWVtYmVyaW4gdHlwZW1hcHMgd2VyZQoJICAgIGlnbm9yZWQgZm9yIG1lbWJlciB2YXJpYWJsZXMgd2l0aGluIGEgJWV4dGVuZCBibG9jay4KCjIwMDktMDItMTI6IHdzZnVsdG9uCgkgICAgUmVtb3ZlIHVubmVjZXNzYXJ5IHRlbXBvcmFyeSB2YXJpYWJsZSB3aGVuIHdyYXBwaW5nIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgcmVmZXJlbmNlcy4gCgkgICAgRXhhbXBsZSBvZiBnZW5lcmF0ZWQgY29kZSBmb3Igd3JhcHBpbmc6CgoJICAgICAgc3RydWN0IFhZWiB7CgkJc3RkOjpzdHJpbmcmIHJlZlJldHVybigpOwoJICAgICAgfTsKCgkgICAgdXNlZCB0byBiZToKCiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKnJlc3VsdCA9IDAgOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZfcmVzdWx0X3JlZiA9IChhcmcxKS0+cmVmUmV0dXJuKCk7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAoc3RkOjpzdHJpbmcgKikgJl9yZXN1bHRfcmVmOwogICAgICAgICAgICAgIH0KCgkgICAgIE5vdyBpdCBpczoKCiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKnJlc3VsdCA9IDAgOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHJlc3VsdCA9IChzdGQ6OnN0cmluZyAqKSAmKGFyZzEpLT5yZWZSZXR1cm4oKTsKCjIwMDktMDItMDg6IGJoeQogICAgICAgICAgICBDaGFuZ2UgdGhlIFNJWkUgbWFwcGVkIGJ5ICVweWJ1ZmZlcl9tdXRhYmxlX2JpbmFyeSBhbmQgJXB5YnVmZmVyX2JpbmFyeSBpbiBweWJ1ZmZlci5pIGZyb20KICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIHRvIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1ZmZlci4KCjIwMDktMDItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlZmVhdHVyZSBub3Qgd29ya2luZyBmb3IgY29udmVyc2lvbiBvcGVyYXRvcnMsIHJlcG9ydGVkIGJ5IE1hdHQgU3ByYWd1ZSwgZm9yIGV4YW1wbGU6CgkgICAgICAlZmVhdHVyZSgiY3M6bWV0aG9kbW9kaWZpZXJzIikgb3BlcmF0b3IgYm9vbCAicHJvdGVjdGVkIjsKCjIwMDktMDItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNelNjaGVtZV0gQXBwbHkgIzIwODE5NjcgY29uZmlndXJlIGNoYW5nZXMgZm9yIGV4YW1wbGVzIHRvIGJ1aWxkIHdpdGggcmVjZW50IFBMVCB2ZXJzaW9ucy4KCSAgICBBbHNvIGZpeGVzIE1ha2VmaWxlIGVycm9ycyBidWlsZGluZyBTV0lHIGV4ZWN1dGFibGUgd2hlbiBtenNjaGVtZSBwYWNrYWdlIGlzIGluc3RhbGxlZCAKCSAgICAodmVyc2lvbiAzLjcyIGFwcHJveCBhbmQgbGF0ZXIpLgoKMjAwOS0wMi0wNDogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIEZpeCBTRiMyNTY0MTkyIHJlcG9ydGVkIGJ5IERhdmlkIEtvbG92cmF0bmsuCiAgICAgICAgICAgIFNXSUdfQXNDaGFyUHRyQW5kU2l6ZSgpIG5vdyBoYW5kbGVzICJnZXQiIG1hZ2ljLgoKVmVyc2lvbiAxLjMuMzggKDMxIEphbnVhcnkgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDEtMzE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjU1MjQ4OCByZXBvcnRlZCBieSBHYWV0YW4gTGVobWFubi4gTm93ICVweXRob25wcmVwZW5kCiAgICAgICAgICAgIGFuZCAlcHl0aG9uYXBwZW5kIGhhdmUgY29ycmVjdCBpbmRlbnRhdGlvbi4KCjIwMDktMDEtMzE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjU1MjA0OCByZXBvcnRlZCBieSBHYWV0YW4gTGVobWFubi4gVGhlIHBhcmFtZXRlciBsaXN0CiAgICAgICAgICAgIG9mIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gaW4gZ2VuZXJhdGVkIHByb3h5IGNvZGUgc2hvdWxkIG5vdCBoYXZlIHRoZQogICAgICAgICAgICAnc2VsZicgcGFyYW1ldGVyLgoKMjAwOS0wMS0yOTogd3NmdWx0b24KCSAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDEuMy4zNyB3aGVyZSB0aGUgZGVmYXVsdCBvdXRwdXQgZGlyZWN0b3J5CgkgICAgZm9yIHRhcmdldCBsYW5ndWFnZSBzcGVjaWZpYyBmaWxlcyAoaW4gdGhlIGFic2VuY2Ugb2YgLW91dGRpcikgd2FzIG5vCgkgICAgbG9uZ2VyIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZ2VuZXJhdGVkIGMvYysrIGZpbGUuCgoyMDA5LTAxLTI4OiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDI10gRml4IHByb3h5IGNsYXNzIG5vdCBiZWluZyB1c2VkIHdoZW4gdGhlIGdsb2JhbCBzY29wZSBvcGVyYXRvcgoJICAgIHdhcyB1c2VkIGZvciBwYXJhbWV0ZXJzIHBhc3NlZCBieSB2YWx1ZS4gUmVwb3J0ZWQgYnkgRGF2aWQgUGllcGdyYXNzLgoKMjAwOS0wMS0xNTogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IHNlZyBmYXVsdCB3aGVuIHJ1bm5pbmcgd2l0aCAtdiBvcHRpb24sIHJlcG9ydGVkIGJ5IEpvaG4gS3kuCgpWZXJzaW9uIDEuMy4zNyAoMTMgSmFudWFyeSAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMS0xMzogbWdvc3NhZ2UKCSAgICBbTHVhXSBBZGRlZCBjb250cmFjdCBzdXBwb3J0IGZvciByZXF1aXJpbmcgdGhhdCB1bnNpZ25lZCBudW1iZXJzIGFyZSA+PTAKCSAgICBSZXdyb3RlIG11Y2ggb2YgRXhhbXBsZXMvTHVhL2VtYmVkMy4gCgkgICAgQWRkZWQgYSBsb3QgdG8gdGhlIEx1YSBkb2N1bWVudGF0aW9uLgoKMjAwOS0wMS0xMzogd3NmdWx0b24KCSAgICBGaXggY29tcGlsYXRpb24gZXJyb3Igd2hlbiB1c2luZyBkaXJlY3RvcnMgb24gcHJvdGVjdGVkIHZpcnR1YWwgb3ZlcmxvYWRlZCAKCSAgICBtZXRob2RzIHJlcG9ydGVkIGJ5IFNhbSBIZW5kbGV5LgoKMjAwOS0wMS0xMjogZHJqb2UKICAgICAgICAgICAgW1JdIEZpeGVkIGhhbmRsaW5nIG9mIGludGVnZXIgYXJyYXlzCgoyMDA5LTAxLTEwOiBkcmpvZQoJICAgIFtSXSBGaXggaW50ZWdlciBoYW5kbGluZyBpbiByIHRvIGRlYWwgY29ycmVjdGx5IHdpdGggc2lnbmVkCgkgICAgYW5kIHVuc2lnbmVkIGlzc3VlcwoKMjAwOS0wMS0xMDogd3NmdWx0b24KCSAgICBQYXRjaCAgIzE5OTI3NTYgZnJvbSBDb2xpbiBNY0RvbmFsZCAtICVjb250cmFjdCBub3Qgd29ya2luZyBmb3IgY2xhc3NlcyAKCSAgICBpbiBuYW1lc3BhY2UKCjIwMDktMDEtMDU6IG9sbHkKCSAgICBNYXJrIFNXSUdQRVJMNSwgU1dJR1BIUDUsIGFuZCBTV0lHVENMOCBhcyBkZXByZWNhdGVkIGluIHRoZSBzb3VyY2UKCSAgICBjb2RlIGFuZCByZW1vdmUgZG9jdW1lbnRhdGlvbiBvZiB0aGVtLgoKMjAwOC0xMi0zMDogd3NmdWx0b24KCSAgICBCdWcgIzI0MzA3NTYuIEFsbCB0aGUgbGFuZ3VhZ2VzIG5vdyBkZWZpbmUgYSBtYWNybyBpbiB0aGUgZ2VuZXJhdGVkIEMvQysrCgkgICAgd3JhcHBlciBmaWxlIGluZGljYXRpbmcgd2hpY2ggbGFuZ3VhZ2UgaXMgYmVpbmcgd3JhcHBlZC4gVGhlIG1hY3JvIG5hbWUgaXMgdGhlCgkgICAgc2FtZSBhcyB0aG9zZSBkZWZpbmVkIHdoZW4gU1dJRyBpcyBydW4sIGVnIFNXSUdKQVZBLCBTV0lHT0NUQVZFLCBTV0lHQ1NIQVJQIGV0YwoJICAgIGFuZCBhcmUgbGlzdGVkIGluIHRoZSAiQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24iIHNlY3Rpb24gaW4gdGhlIGRvY3VtZW50YXRpb24uCgoyMDA4LTEyLTIzOiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzIxNTM3NzMgLSAlbm9qYXZhZXhjZXB0aW9uIHdhcyBjbGVhcmluZyB0aGUgZXhjZXB0aW9uIGZlYXR1cmUKICAgICAgICAgICAgaW5zdGVhZCBvZiBkaXNhYmxpbmcgaXQuIENsZWFyaW5nIGNoZWNrZWQgSmF2YSBleGNlcHRpb25zIGFsc28gZGlkbid0IHdvcmsuIAoJICAgIFRoZSBuZXcgJWNsZWFyamF2YWV4Y2VwdGlvbiBjYW4gYmUgdXNlZCBmb3IgY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBmZWF0dXJlLgoKMjAwOC0xMi0yMjogd3NmdWx0b24KCSAgICBGaXggIzI0MzI4MDEgLSBNYWtlIFN3aWdWYWx1ZVdyYXBwZXIgZXhjZXB0aW9uIHNhZmUgZm9yIHdoZW4gY29weSBjb25zdHJ1Y3RvcnMKCSAgICB0aHJvdyBleGNlcHRpb25zLgoKMjAwOC0xMi0yMTogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMjQ0MDA0NiB3aGljaCBmaXhlcyBwb3NzaWJsZSBzZWcgZmF1bHRzIGZvciBtZW1iZXIgYW5kIGdsb2JhbAoJICAgIHZhcmlhYmxlIGNoYXIgYXJyYXlzIHdoZW4gdGhlIHN0cmluZ3MgYXJlIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgYXJyYXkgc2l6ZS4KCjIwMDgtMTItMjA6IHdzZnVsdG9uCgkgICAgVGhlIGNjYWNoZSBjb21waWxlciBjYWNoZSBoYXMgYmVlbiBhZGFwdGVkIHRvIHdvcmsgd2l0aCBTV0lHIGFuZAoJICAgIG5hbWVkIGNjYWNoZS1zd2lnLiBJdCBub3cgd29ya3Mgd2l0aCBDL0MrKyBjb21waWxlcnMgYXMgd2VsbCBhcyBTV0lHCgkgICAgYW5kIGNhbiByZXN1bHQgaW4gaW1wcmVzc2l2ZSBzcGVlZHVwcyB3aGVuIHVzZWQgdG8gcmVjb21waWxlIHVuY2hhbmdlZAoJICAgIGNvZGUgd2l0aCBlaXRoZXIgYSBDL0MrKyBjb21waWxlciBvciBTV0lHLiBEb2N1bWVudGF0aW9uIGlzIGluIENDYWNoZS5odG1sCgkgICAgb3IgdGhlIGluc3RhbGxlZCBjY2FjaGUtc3dpZyBtYW4gcGFnZS4KCjIwMDgtMTItMTI6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggZnJvbSBLYWx5YW5vdiBEbWl0cnkgd2hpY2ggZml4ZXMgcGFyc2luZyBvZiBuZXN0ZWQgc3RydWN0cwoJICAgIGNvbnRhaW5pbmcgY29tbWVudHMuCgoyMDA4LTEyLTEyOiB3c2Z1bHRvbgoJICAgIEZpeCBlcnJvciBtZXNzYWdlIGluIHNvbWUgbmVzdGVkIHN0cnVjdCBhbmQgJWlubGluZSBwYXJzaW5nIGVycm9yIHNpdHVhdGlvbnMKCSAgICBzdWNoIGFzIHVudGVybWluYXRlZCBzdHJpbmdzIGFuZCBjb21tZW50cy4KCjIwMDgtMTItMDc6IG9sbHkKCSAgICBbUEhQXSBGaXggd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXIgd2l0aCBHQ0MgNC4zLgoKMjAwOC0xMi0wNjogd3NmdWx0b24KCSAgICBbUEhQXSBEZXByZWNhdGUgJXByYWdtYShwaHA0KS4gUGxlYXNlIHVzZSAlcHJhZ21hKHBocCkgaW5zdGVhZC4KCSAgICBUaGUgZm9sbG93aW5nIHR3byB3YXJuaW5ncyBoYXZlIGJlZW4gcmVuYW1lZDoKCSAgICBXQVJOX1BIUDRfTVVMVElQTEVfSU5IRVJJVEFOQ0UgLT4gV0FSTl9QSFBfTVVMVElQTEVfSU5IRVJJVEFOQ0UKCSAgICBXQVJOX1BIUDRfVU5LTk9XTl9QUkFHTUEgICAgICAgLT4gV0FSTl9QSFBfVU5LTk9XTl9QUkFHTUEKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOC0xMi0wNDogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEFwcGxpZWQgcGF0Y2ggU0YjMjE1ODkzODogYWxsIHRoZSBTV0lHIHN5bWJvbCBuYW1lcyBzdGFydGVkIHdpdGggUHkKICAgICAgICAgICAgYXJlIGNoYW5nZWQsIHNpbmNlIHRoZXkgYXJlIGluYXBwcm9wcmlhdGUgYW5kIGRpc2NvdXJhZ2VkIGluIFB5dGhvbgogICAgICAgICAgICBkb2N1bWVudGF0aW9uIChmcm9tIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvMi41LjIvYXBpL2luY2x1ZGVzLmh0bWwpOgoKICAgICAgICAgICAgIkFsbCB1c2VyIHZpc2libGUgbmFtZXMgZGVmaW5lZCBieSBQeXRob24uaCAoZXhjZXB0IHRob3NlIGRlZmluZWQgYnkKICAgICAgICAgICAgdGhlIGluY2x1ZGVkIHN0YW5kYXJkIGhlYWRlcnMpIGhhdmUgb25lIG9mIHRoZSBwcmVmaXhlcyAiUHkiIG9yICJfUHkiLgogICAgICAgICAgICBOYW1lcyBiZWdpbm5pbmcgd2l0aCAiX1B5IiBhcmUgZm9yIGludGVybmFsIHVzZSBieSB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgZXh0ZW5zaW9uIHdyaXRlcnMuIFN0cnVjdHVyZSBtZW1iZXIgbmFtZXMgZG8KICAgICAgICAgICAgbm90IGhhdmUgYSByZXNlcnZlZCBwcmVmaXguCgogICAgICAgICAgICBJbXBvcnRhbnQ6IHVzZXIgY29kZSBzaG91bGQgbmV2ZXIgZGVmaW5lIG5hbWVzIHRoYXQgYmVnaW4gd2l0aCAiUHkiIG9yICJfUHkiLgogICAgICAgICAgICBUaGlzIGNvbmZ1c2VzIHRoZSByZWFkZXIsIGFuZCBqZW9wYXJkaXplcyB0aGUgcG9ydGFiaWxpdHkgb2YgdGhlIHVzZXIKICAgICAgICAgICAgY29kZSB0byBmdXR1cmUgUHl0aG9uIHZlcnNpb25zLCB3aGljaCBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgbmFtZXMgYmVnaW5uaW5nCiAgICAgICAgICAgIHdpdGggb25lIG9mIHRoZXNlIHByZWZpeGVzLiIKCiAgICAgICAgICAgIEhlcmUgaXMgYSBicmllZiBsaXN0IG9mIHdoYXQgY2hhbmdlZDoKCiAgICAgICAgICAgICAgICBQeVN3aWcqIC0+IFN3aWdQeSoKICAgICAgICAgICAgICAgIFB5T2JqZWN0X3B0ciAtPiBTd2lnUHRyX1B5T2JqZWN0CiAgICAgICAgICAgICAgICBQeU9iamVjdF92YXIgLT4gU3dpZ1Zhcl9QeU9iamVjdAogICAgICAgICAgICAgICAgUHlTZXF1ZW5jZV9CYXNlLCBQeVNlcXVlbmNlX0NvbnQsIFB5U2VxdWVuY2VfUmVmIC0+CiAgICAgICAgICAgICAgICAgICAgICAgIFN3aWdQeVNlcXVlbmNlX0Jhc2UsIFN3aWdQeVNlcXVlbmNlX0NvbnQsIFN3aWdQeVNlcXVlbmNlX1JlZgogICAgICAgICAgICAgICAgUHlNYXAqIC0+IFN3aWdQeU1hcCoKCiAgICAgICAgICAgIFdlIHByb3ZpZGVkIGEgcHluYW1lX2NvbXBhdC5pIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBVc2VycyB3aG9zZSBjb2RlIGhhdmluZwogICAgICAgICAgICB0aGVzZSBzeW1ib2xzIGFuZCBkbyBub3Qgd2FudCB0byBjaGFuZ2UgaXQgY291bGQgc2ltcGx5IGluY2x1ZGUgdGhpcyBmaWxlCiAgICAgICAgICAgIGF0IGZyb250IG9mIHlvdXIgY29kZS4gQSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gcnVuIHRoZSBjb252ZXJ0aW5nIHRvb2wgb24KICAgICAgICAgICAgeW91ciBjb2RlLCB3aGljaCBoYXMgYmVlbiBwdXQgaW4gU1dJRydzIFNWTiB0cnVuayAoVG9vbHMvcHluYW1lX3BhdGNoLnB5KSBhbmQKICAgICAgICAgICAgeW91IGNhbiBkb3dubG9hZCBpdCBoZXJlOgogICAgICAgICAgICBodHRwczovL3N3aWcuc3ZuLnNvdXJjZWZvcmdlLm5ldC9zdm5yb290L3N3aWcvdHJ1bmsvVG9vbHMvcHluYW1lX3BhdGNoLnB5IAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA4LTEyLTAyOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMyMTQzNzI3IGZyb20gU2VyZ2UgTW9ua2V3aXR6IHRvIGZpeCBpbXBvcnRpbmcgYmFzZSBjbGFzc2VzIAoJICAgIHdoZW4gdGhlIHBhY2thZ2Ugb3B0aW9uIGlzIHNwZWNpZmllZCBpbiAlbW9kdWxlIGFuZCB0aGF0IG1vZHVsZSBpcyAlaW1wb3J0J2VkLgoKMjAwOC0xMS0yODogd3NmdWx0b24KCSAgICBbVVRMXSBGaXggIzIwODA0OTcuIFNvbWUgaW5jb3JyZWN0IGFjY2VwdGFuY2Ugb2YgdHlwZXMgaW4gdGhlIFNUTCwgZWcgYSBkb3VibGUgKiBlbGVtZW50CgkgICAgcGFzc2VkIGludG8gYSB2ZWN0b3I8aW50ICo+IGNvbnN0cnVjdG9yIHdvdWxkIGJlIGFjY2VwdGVkLCBidXQgdGhlIGVuc3VpbmcgYmVoYXZpb3VyCgkgICAgd2FzIHVuZGVmaW5lZC4gTm93IHRoZSB0eXBlIGNvbnZlcnNpb24gY29ycmVjdGx5IHJhaXNlcyBhbiBleGNlcHRpb24uCgoyMDA4LTExLTI0OiB3c2Z1bHRvbgoJICAgIEFkZCAtb3V0Y3VycmVudGRpciBvcHRpb24uIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBvdXRwdXQgZGlyZWN0b3J5IHRvIHRoZSBjdXJyZW50IAoJICAgIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIHRoZSBwYXRoIHNwZWNpZmllZCBieSB0aGUgaW5wdXQgZmlsZS4gVGhpcyBvcHRpb24gZW5hYmxlcwoJICAgIGJlaGF2aW91ciBzaW1pbGFyIHRvIGMvYysrIGNvbXBpbGVycy4gTm90ZSB0aGF0IHRoaXMgY29udHJvbHMgdGhlIG91dHB1dCBkaXJlY3RvcnksCgkgICAgYnV0IG9ubHkgaW4gdGhlIGFic2VuY2Ugb2YgdGhlIC1vIGFuZC9vciAtb3V0ZGlyIG9wdGlvbnMuCgoyMDA4LTExLTIzOiB3c2Z1bHRvbgoJICAgIFtydWJ5XSBBcHBseSBwYXRjaCAjMjI2Mzg1MCB0byBmaXggcnVieS9maWxlLmkgLi4uIHJ1Ynlpby5oIGZpbGVuYW1lIGNoYW5nZSBpbiAKCSAgICBydWJ5IDEuOS4KCjIwMDgtMTEtMjM6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzIzMTk3OTAgZnJvbSBKb2hhbiBIYWtlIHRvIGZpeCBzaGFyZWRfcHRyIHVzYWdlIGluIHN0ZDo6dHIxIG5hbWVzcGFjZS4KCjIwMDgtMTEtMjE6IHdzZnVsdG9uCgkgICAgVGhlIHVzZSBvZiB0aGUgaW5jbHVkZSBwYXRoIHRvIGZpbmQgdGhlIGlucHV0IGZpbGUgaXMgbm93IGRlcHJlY2F0ZWQuCgkgICAgVGhpcyBtYWtlcyB0aGUgYmVoYXZpb3VyIG9mIFNXSUcgdGhlIHNhbWUgYXMgQy9DKysgY29tcGlsZXJzIGluIHByZXBhcmF0aW9uCgkgICAgZm9yIHVzZSB3aXRoIGNjYWNoZS4KCjIwMDgtMTEtMTY6IHdzZnVsdG9uCgkgICAgRml4IC1ub3ByZXByb2Nlc3Mgb3B0aW9uIHRvOgoJICAgIC0gY29ycmVjdGx5IHJlcG9ydCBmaWxlIG5hbWVzIGluIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzLgoJICAgIC0gdXNlIHRoZSBvcmlnaW5hbCBpbnB1dCBmaWxlbmFtZSB0aGF0IGNyZWF0ZWQgdGhlIHByZXByb2Nlc3NlZCBvdXRwdXQgd2hlbiAKCSAgICAgIGRldGVybWluaW5nIHRoZSBDKysgd3JhcHBlciBmaWxlIG5hbWUgKGluIHRoZSBhYnNlbmNlIG9mIC1vKS4gUHJldmlvdXNseSAKCSAgICAgIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGNvbnRhaW5pbmcgdGhlIHByZXByb2Nlc3NlZCBvdXRwdXQgd2FzIHVzZWQuCgoyMDA4LTExLTExOiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBBZGQgcGF0Y2ggIzIxNTI2OTEgZnJvbSBNQVRTVVVSQSBUYWthbm9yaSB3aGljaCBmaXhlcyBjb21waWxlcyB1c2luZyB0aGUKCSAgICBJbnRlbCBjb21waWxlcgoKMjAwOC0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHBhdGNoICMyMTI4MjQ5IGZyb20gQW5hdG9seSBUZWNodG9uaWsgd2hpY2ggY29ycmVjdHMgdGhlIEMvQysrIHByb3h5CiAgICAgICAgICAgIGNsYXNzIGJlaW5nIHJlcG9ydGVkIGZvciBQeXRob24gZG9jc3RyaW5ncyB3aGVuICVyZW5hbWUgaXMgdXNlZC4KCjIwMDgtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgc3RyaXAgZW5jb2RlciBwYXRjaCBmcm9tIEFuYXRvbHkgVGVjaHRvbmlrICMyMTMwMDE2LiBUaGlzIGVuYWJsZXMgYW4gCiAgICAgICAgICAgIGVhc3kgd2F5IHRvIHJlbmFtZSBzeW1ib2xzIGJ5IHN0cmlwcGluZyBhIGNvbW1vbmx5IHVzZWQgcHJlZml4IGluIGFsbCB0aGUKICAgICAgICAgICAgZnVuY3Rpb24vc3RydWN0IG5hbWVzLiBJdCB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIG90aGVyIGVuY29kZXJzLCBzdWNoIGFzCiAgICAgICAgICAgIHRpdGxlLCBsb3dlciwgY29tbWFuZCBldGMgb3V0bGluZWQgaW4gQ0hBTkdFUyBmaWxlIGRhdGVkIDEyLzMwLzIwMDUuIEV4YW1wbGUKICAgICAgICAgICAgYmVsb3cgd2lsbCByZW5hbWUgd3hBbm90aGVyV2lkZ2V0IHRvIEFub3RoZXJXaWRnZXQgYW5kIHd4RG9Tb21ldGhpbmcgdG8gCiAgICAgICAgICAgIERvU29tZXRoaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCIlKHN0cmlwOlt3eF0pcyIpICIiOyAKCiAgICAgICAgICAgICAgc3RydWN0IHd4QW5vdGhlcldpZGdldCB7CiAgICAgICAgICAgICAgICAgIHZvaWQgd3hEb1NvbWV0aGluZygpOwogICAgICAgICAgICAgIH07CgoyMDA4LTA5LTI2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgTG90cyBvZiB0ZXN0LXN1aXRlIHdvcmsuCgkgICAgLSBGaXggb3JkZXJpbmcgb2Ygd3JhcHBlciBvdXRwdXQgYW5kICV7ICV9IGhlYWRlciBvdXRwdXQuCgkgICAgLSBGaXggZGVjbGFyYXRpb25zIG9mIGxvY2FsIHZhcnMgaW4gQyB3cmFwcGVycy4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbiBvZiBkZWZpbmVkIGNvbnN0YW50cyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gRml4IGRlY2xhcmF0aW9uIG9mIEVudW1WYWx1ZXMgaW4gQyB3cmFwcGVycy4KCSAgICAtIGFkZCBzb21lIGNvbnN0IHR5cGVtYXBzIHRvIGFsbGVncm9jbC5zd2cKCSAgICAtIGFkZCByZW5hbWUgZm9yIG9wZXJhdG9yIGJvb2woKSBvdmVybG9hZHMuCgkKMjAwOC0wOS0yNTogb2xseQoJICAgIFtQSFA1XSBGaWxsIGluIHR5cGVtYXBzIGZvciBTV0lHVFlQRSBhbmQgdm9pZCAqIChTRiMyMDk1MTg2KS4KCjIwMDgtMDktMjI6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gU3VwcG9ydCB3cmFwcGluZyBvZiB0eXBlcyB3aG9zZSBkZWZpbml0aW9ucyBhcmUgbm90IHNlZW4gYnkKCSAgICBTV0lHLiBUaGV5IGFyZSB0cmVhdGVkIGFzIGZvcndhcmQtcmVmZXJlbmNlZCBjbGFzc2VzIGFuZCBpZiBhCgkgICAgZGVmaW5pdGlvbiBpcyBub3Qgc2VlbiBhcmUgdHJlYXRlZCBhcyAoKiA6dm9pZCkuCgkgICAgLSBEb24ndCB3cmFwIHRoZSBjb250ZW50cyBvZiB1bm5hbWVkIG5hbWVzcGFjZXMuCgkgICAgLSBNb3JlIGNvZGUgY2xlYW51cC4gUmVtb3ZlZCBzb21lIGV4dHJhbmVvdXMgd2FybmluZ3MuCgkgICAgLSBzdGFydCB3b3JrIG9uIGhhdmluZyB0aGUgYWxsZWdyb2NsIG1vZCBwYXNzIHRoZSBjcHAgdGVzdC1zdWl0ZS4KCjIwMDgtMDktMTk6IG9sbHkKCSAgICBbUEhQNV0gQWRkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZy4KCjIwMDgtMDktMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgQyMgYXJyYXkgdHlwZW1hcHMgcHJvdmlkZWQgYnkgQW50dGkgS2FyYW50YS4KICAgICAgICAgICAgVGhlIGFycmF5cyBwcm92aWRlIGEgd2F5IHRvIHVzZSBNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5MUEFycmF5KQogICAgICAgICAgICBhbmQgcGlubmluZyB0aGUgYXJyYXkgdXNpbmcgJ2ZpeGVkJy4gU2VlIGFycmF5c19jc2hhcnAuaSBsaWJyYXJ5IGZpbGUKICAgICAgICAgICAgZm9yIGRldGFpbHMuCgoyMDA4LTA5LTE4OiB3c2Z1bHRvbgoJICAgIERvY3VtZW50IHRoZSBvcHRpb25hbCBtb2R1bGUgYXR0cmlidXRlIGluIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSwKICAgICAgICAgICAgc2VlIE1vZHVsZXMuaHRtbC4gQWRkIGEgd2FybmluZyBmb3IgUHl0aG9uIHdyYXBwZXJzIHdoZW4gdGhlCiAgICAgICAgICAgIG1vZHVsZSBuYW1lIGZvciBhbiBpbXBvcnRlZCBiYXNlIGNsYXNzIGlzIG1pc3NpbmcsIHJlcXVpcmluZyB0aGUKICAgICAgICAgICAgbW9kdWxlIGF0dHJpYnV0ZSB0byBiZSBhZGRlZCB0byAlaW1wb3J0LCBlZyAKCiAgICAgICAgICAgICAgJWltcG9ydChtb2R1bGU9IkZvb01vZHVsZSIpIGZvby5oCgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIENoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlbWFwIGZvciBjaGFyICogdG8gdHVybiBQSFAKCSAgICBOdWxsIGludG8gQyBOVUxMIChwcmV2aW91c2x5IGl0IHdhcyBjb252ZXJ0ZWQgdG8gYW4gZW1wdHkgc3RyaW5nKS4KCSAgICBUaGUgbmV3IGJlaGF2aW91ciBpcyBjb25zaXN0ZW50IHdpdGggaG93IHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dAoJICAgIHR5cGVtYXAgd29ya3MgKFNGIzIwMjU3MTkpLgoKCSAgICBJZiB5b3Ugd2FudCB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyLCBhZGQgdGhlIGZvbGxvd2luZyB0eXBlbWFwCgkgICAgdG8geW91ciBpbnRlcmZhY2UgZmlsZSAoUEhQJ3MgY29udmVydF90b19zdHJpbmdfZXgoKSBmdW5jdGlvbiBkb2VzCgkgICAgdGhlIGNvbnZlcnRpbmcgZnJvbSBQSFAgTnVsbCB0byBhbiBlbXB0eSBzdHJpbmcpOgoKCSAgICAldHlwZW1hcChpbikgY2hhciAqIHsKCQljb252ZXJ0X3RvX3N0cmluZ19leCgkaW5wdXQpOwoJCSQxID0gWl9TVFJWQUxfUFAoJGlucHV0KTsKCSAgICB9CgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBleHRyYSBjb2RlIGFkZGVkIHRvIHByb3h5IGNsYXNzIGNvbnN0cnVjdG9ycyBpbiB0aGUgY2FzZQoJICAgIHdoZXJlIHRoZSBvbmx5IGNvbnN0cnVjdG9yIHRha2VzIG5vIGFyZ3VtZW50cy4KCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gRml4IHdyYXBwaW5nIG9mIGEgcmVuYW1lZCBlbnVtZXJhdGVkIHZhbHVlIG9mIGFuIGVudW0gY2xhc3MKCSAgICBtZW1iZXIgKFNGIzIwOTUyNzMpLgoKMjAwOC0wOS0xNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBGaXggaG93IGZvcndhcmQgcmVmZXJlbmNlIHR5cGVkZWZzIGFyZSBoYW5kbGVkLCBzbyBhcyBub3QgdG8gY29uZmxpY3QKCSAgICB3aXRoIG90aGVyIGxlZ2l0IHR5cGVkZWZzLgoJICAgIC0gRG9uJ3QgKGZvciBub3cpIHBlcmZvcm0gYW4gZmZpdHlwZSB0eXBlbWFwIGxvb2t1cCB3aGVuIHRyeWluZyB0bwoJICAgIHdoZW4gY2FsbGluZyBjb21wb3NlX2ZvcmVpZ25fdHlwZSgpLiBUaGlzIGlzIGFjdHVhbGx5IGEgdXNlZnVsIHRoaW5nCgkgICAgdG8gZG8gaW4gY2VydGFpbiBjYXNlcywgdGhlIHRlc3QgY2FzZXMgZm9yIHdoaWNoIEkgY2FuJ3QgY3VycmVudGx5CgkgICAgbG9jYXRlIDovLiBJdCdzIGJyZWFraW5nIHNvbWUgd3JhcHBpbmcgYmVoYXZpb3IgdGhhdCBpcyBtb3JlIGNvbW1vbmx5CgkgICAgc2VlbiwgaG93ZXZlci4gSSdsbCByZWFkZCBpbiBhIG1vcmUgYXBwcm9wcmlhdGUgd2F5IHdoZW4gSSBjYW4KCSAgICByZWNyZWF0ZSB0aGUgbmVlZGVkIHRlc3QgY2FzZSwgb3IgYSB1c2VyIGNvbXBsYWlucyAod2hpY2ggbWVhbnMKCSAgICB0aGV5IHByb2JhYmx5IGhhdmUgYSB0ZXN0IGNhc2UpLgoJICAgIC0gZG9jdW1lbnQgdGhlIC1pc29sYXRlIGNvbW1hbmQtbGluZSBhcmcgaW4gdGhlICdzd2lnIC1oZWxwJyBvdXRwdXQuCgkgICAgSXQgd2FzIGluIHRoZSBodG1sIGRvY3MsIGJ1dCBub3QgdGhlcmUuCgkgICAgLSBzbWFsbCBhbW91bnQgb2YgY29kZSBjbGVhbnVwLCByZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCgkgICAgLSBzb21lIG1pbm9yIGFlc3RoZXRpYyBjaGFuZ2VzLgoKMjAwOC0wOS0xMjogYmh5CiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAzLjAgc3VwcG9ydCBicmFuY2ggbWVyZ2VkIGludG8gU1dJRyB0cnVuay4gVGhhbmtzIHRvCiAgICAgICAgICAgIEdvb2dsZSBTdW1tZXIgb2YgQ29kZSAyMDA4IGZvciBzdXBwb3J0aW5nIHRoaXMgcHJvamVjdCEgQnkgZGVmYXVsdAogICAgICAgICAgICBTV0lHIHdpbGwgZ2VuZXJhdGUgaW50ZXJmYWNlIGZpbGVzIGNvbXBhdGlibGUgd2l0aCBib3RoIFB5dGhvbiAyLngKICAgICAgICAgICAgYW5kIDMuMC4gQW5kIHRoZXJlJ3MgYWxzbyBzb21lIFB5dGhvbiAzIG5ldyBmZWF0dXJlcyB0aGF0IGNhbiBiZQogICAgICAgICAgICBlbmFibGVkIGJ5IHBhc3NpbmcgYSAiLXB5MyIgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBTV0lHLiBUaGVzZQogICAgICAgICAgICBmZWF0dXJlcyBhcmU6CgogICAgICAgICAgICAgIC0gRnVuY3Rpb24gYW5ub3RhdGlvbiBzdXBwb3J0CiAgICAgICAgICAgICAgICAgIEFsc28sIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiBwcm94eSBmdW5jdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCwKICAgICAgICAgICAgICAgICAgZXZlbiB3aXRob3V0IHRoZSAiLXB5MyIgb3B0aW9uLiBIb3dldmVyLCB0aGUgcGFyYW1ldGVyIGxpc3QKICAgICAgICAgICAgICAgICAgd2lsbCBmYWxsYmFjayB0byAqYXJncyBpZiB0aGUgZnVuY3Rpb24gKG9yIG1ldGhvZCkgaXMgb3ZlcmxvYWRlZC4KICAgICAgICAgICAgICAtIEJ1ZmZlciBpbnRlcmZhY2Ugc3VwcG9ydAogICAgICAgICAgICAgIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBzdXBwb3J0CgogICAgICAgICAgICBGb3IgZGV0YWlscyBvZiBQeXRob24gMyBzdXBwb3J0IGFuZCB0aGVzZSBmZWF0dXJlcywgcGxlYXNlIHNlZSB0aGUKICAgICAgICAgICAgIlB5dGhvbiAzIFN1cHBvcnQiIHNlY3Rpb24gaW4gdGhlICJTV0lHIGFuZCBQeXRob24iIGNoYXB0ZXIgb2YgdGhlIFNXSUcKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgICAgIFRoZSAiLWFwcGx5IiBjb21tYW5kIGxpbmUgb3B0aW9uIGFuZCBzdXBwb3J0IG9mIGdlbmVyYXRpbmcgY29kZXMKICAgICAgICAgICAgdXNpbmcgYXBwbHkoKSBpcyByZW1vdmVkLiBTaW5jZSB0aGlzIGlzIG9ubHkgcmVxdWlyZWQgYnkgdmVyeSBvbGQKICAgICAgICAgICAgUHl0aG9uLgoKICAgICAgICAgICAgVGhpcyBtZXJnZSBhbHNvIHBhdGNoZWQgU1dJRydzIHBhcnNlciB0byBzb2x2ZSBhIGJ1Zy4gQnkgdGhpcyBwYXRjaCwKICAgICAgICAgICAgU1dJRyBmZWF0dXJlcyBhYmxlIHRvIGJlIGNvcnJlY3RseSBhcHBsaWVkIG9uIEMrKyBjb252ZXJzaW9uIG9wZXJhdG9yLAogICAgICAgICAgICBzdWNoIGxpa2UgdGhpczoKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAlZmVhdHVyZSgic2hhZG93IikgICo6Om9wZXJhdG9yIGJvb2wgJXsgLi4uICV9CgoyMDA4LTA5LTAyOiByaWNoYXJkYgoJICAgIFtQeXRob25dIENvbW1pdCBwYXRjaCAjMjA4OTE0OTogRGlyZWN0b3IgZXhjZXB0aW9uIGhhbmRsaW5nIG1hbmdsZXMKCSAgICByZXR1cm5lZCBleGNlcHRpb24uICBFeGNlcHRpb25zIHJhaXNlZCBieSBQeXRob24gY29kZSBpbiBkaXJlY3RvcnMKCSAgICBhcmUgbm93IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjYWxsZXIgd2l0aG91dCBjaGFuZ2UuICBBbHNvLCByZW1vdmUKCSAgICB0aGUgIjogIiBwcmVmaXggd2hpY2ggdXNlZCB0byBiZSBhZGRlZCB0byBvdGhlciBkaXJlY3RvciBleGNlcHRpb25zCgkgICAgKGVnLCB0aG9zZSBkdWUgdG8gaW5jb3JyZWN0IHJldHVybiB0eXBlcykuCgoyMDA4LTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBDb21taXQgcGF0Y2ggIzE5ODgyOTYgR0NJdGVtIG11bHRpcGxlIG1vZHVsZSBsaW5raW5nIGlzc3VlIHdoZW4gdXNpbmcgCiAgICAgICAgICAgIGRpcmVjdG9ycy4KCjIwMDgtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgJ3VzaW5nJyBhbmQgJ2ZpeGVkJyBibG9ja3MgaW4gdGhlICdjc2luJyB0eXBlbWFwIGlzIG5vdwogICAgICAgICAgICBwb3NzaWJsZSB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIHByZSBhdHRyaWJ1dGUgYW5kIHRoZSBuZXcgdGVybWluYXRvciBhdHRyaWJ1dGUsIGVnCgogICAgICAgICAgICAgICV0eXBlbWFwKGNzaW4sIAogICAgICAgICAgICAgICAgICAgICAgIHByZT0iICAgIHVzaW5nIChDRGF0ZSB0ZW1wJGNzaW5wdXQgPSBuZXcgQ0RhdGUoJGNzaW5wdXQpKSB7IiwKICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdG9yPSIgICAgfSAvLyB0ZXJtaW5hdGUgdGVtcCRjc2lucHV0IHVzaW5nIGJsb2NrIiwKICAgICAgICAgICAgICAgICAgICAgICkgY29uc3QgQ0RhdGUgJgogICAgICAgICAgICAgICAgICAgICAgICIkY3NjbGFzc25hbWUuZ2V0Q1B0cih0ZW1wJGNzaW5wdXQpIgoKICAgICAgICAgICAgU2VlIENTaGFycC5odG1sIGZvciBtb3JlIGluZm8uCgoyMDA4LTA5LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQ29tbWl0IHBhdGNoICMyMDc5MzgxIHN1Ym1pdHRlZCBieSBCb3JpcyBTbWlsZ2EgLSBjb25zdGFudCBleHBycyBwdXQgaW50byAKICAgICAgICAgICAgbm8tZXZhbCBjb250ZXh0IGluIERFRkNFTlVNCgoyMDA4LTA4LTAyOiB3dXp6ZWIKICAgICAgICAgICAgW0NoaWNrZW4sQWxsZWdyb10gQ29tbWl0IFBhdGNoIDIwMTkzMTQKICAgICAgICAgICAgRml4ZXMgYSBidWlsZCBlcnJvciBpbiBjaGlja2VuLCBhbmQgc2V2ZXJhbCBidWlsZCBlcnJvcnMgYW5kIG90aGVyIGVycm9ycwogICAgICAgICAgICBpbiBBbGxlZ3JvIENMCgoyMDA4LTA3LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVpbGRpbmcgb2YgVGNsIGV4YW1wbGVzL3Rlc3Qtc3VpdGUgb24gTWFjIE9TWCByZXBvcnRlZCBieSBHaWRlb24gU2ltcHNvbi4KCjIwMDgtMDctMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiAjMjAxOTE1NiBDb25maWd1cmluZyB3aXRoIC0td2l0aG91dC1vY3RhdmUgb3IgLS13aXRob3V0LWFsbGxhbmcKICAgICAgICAgICAgZGlkIG5vdCBkaXNhYmxlIG9jdGF2ZS4KCjIwMDgtMDctMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGRpcmVjdG9yIHR5cGVtYXBzIGZvciBwb2ludGVycyBzbyB0aGF0IE5VTEwgcG9pbnRlcnMgYXJlIGNvcnJlY3RseSAKICAgICAgICAgICAgbWFyc2hhbGxlZCB0byBDIy9KYXZhIG51bGwgaW4gZGlyZWN0b3IgbWV0aG9kcy4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBGb3Igc3RkX3ZlY3Rvci5pIGFuZCBzdGRfbWFwLmksIHJlbmFtZSBlbXB0eSgpIHRvIGlzX2VtcHR5KCkKCSAgICBzaW5jZSAiZW1wdHkiIGlzIGEgUEhQIHJlc2VydmVkIHdvcmQuICBCYXNlZCBvbiBwYXRjaCBmcm9tIE1hcmsgS2xlaW4KCSAgICBpbiBTRiMxOTQzNDE3LgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIFRoZSBkZXByZWNhdGVkIGNvbW1hbmQgbGluZSBvcHRpb24gIi1tYWtlIiBoYXMgYmVlbiByZW1vdmVkLiAgCgkgICAgU2VhcmNoZXMgb24gR29vZ2xlIGNvZGVzZWFyY2ggc3VnZ2VzdCB0aGF0IG5vYm9keSBpcyB1c2luZyBpdCBub3cKCSAgICBhbnl3YXkuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gVGhlIFNXSUcgY2RhdGEuaSBsaWJyYXJ5IG1vZHVsZSBpcyBub3cgc3VwcG9ydGVkLgoKMjAwOC0wNy0wMzogb2xseQoJICAgIFtQSFBdIFRoZSBkZXByZWNhdGVkIGNvbW1hbmQgbGluZSBvcHRpb24gIi1waHBmdWxsIiBoYXMgYmVlbgoJICAgIHJlbW92ZWQuICBXZSByZWNvbW1lbmQgYnVpbGRpbmcgeW91ciBleHRlbnNpb24gYXMgYSBkeW5hbWljYWxseQoJICAgIGxvYWRhYmxlIG1vZHVsZS4KCjIwMDgtMDctMDI6IG9sbHkKCSAgICBbUEhQNF0gU3VwcG9ydCBmb3IgUEhQNCBoYXMgYmVlbiByZW1vdmVkLiAgVGhlIFBIUCBkZXZlbG9wZXJzIGFyZQoJICAgIG5vIGxvbmdlciBtYWtpbmcgbmV3IFBIUDQgcmVsZWFzZXMsIGFuZCB3b24ndCBldmVuIGJlIHByb3ZpZGluZwoJICAgIHBhdGNoZXMgZm9yIGNyaXRpY2FsIHNlY3VyaXR5IGlzc3VlcyBhZnRlciAyMDA4LTA4LTA4LgoKMjAwOC0wNy0wMjogb2xseQoJICAgIFtQeXRob25dIEltcG9ydCB0aGUgQyBleHRlbnNpb24gZGlmZmVyZW50bHkgZm9yIFB5dGhvbiAyLjYgYW5kCgkgICAgbGF0ZXIgc28gdGhhdCBhbiBpbXBsaWNpdCByZWxhdGl2ZSBpbXBvcnQgZG9lc24ndCBwcm9kdWNlIGEKCSAgICBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciAyLjYgYW5kIGEgZmFpbHVyZSBmb3IgMi43IGFuZCBsYXRlci4KCSAgICBQYXRjaCBmcm9tIFJpY2hhcmQgQm91bHRvbiBpbiBTRiMyMDA4MjI5LCBwbHVzIGZvbGxvdy11cCBwYXRjaGVzCgkgICAgZnJvbSBSaWNoYXJkIGFuZCBIYW95dSBCYWkuCgpWZXJzaW9uIDEuMy4zNiAoMjQgSnVuZSAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMjQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGRlcHJlY2F0ZWQgLWMgY29tbWFuZGxpbmUgb3B0aW9uIChydW50aW1lIGxpYnJhcnkgZ2VuZXJhdGlvbikuCgowNi8yNC8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGFzc2VydGlvbiBmYWlsdXJlIHdoZW4gaGFuZGxpbmcgJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApCgkgICAgKHRlc3RjYXNlIGlnbm9yZV9wYXJhbWV0ZXIpLgoKMDYvMjQvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBzZWdmYXVsdCB3aGVuIHdyYXBwaW5nIGEgbm9uLWNsYXNzIGZ1bmN0aW9uIG1hcmtlZCB3aXRoCgkgICAgJW5ld29iamVjdCAodGVzdGNhc2UgY2hhcl9zdHJpbmdzKS4KCjA2LzIyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgYSB3YXkgdG8gdXNlIEF0dGFjaEN1cnJlbnRUaHJlYWRBc0RhZW1vbiBpbnN0ZWFkIG9mIEF0dGFjaEN1cnJlbnRUaHJlYWQKICAgICAgICAgICAgaW4gZGlyZWN0b3IgY29kZS4gRGVmaW5lIHRoZSBTV0lHX0pBVkFfQVRUQUNIX0NVUlJFTlRfVEhSRUFEX0FTX0RBRU1PTiBtYWNybywgc2VlCiAgICAgICAgICAgIExpYi9qYXZhL2RpcmVjdG9yLnN3Zy4KCjA2LzIxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggY3Jhc2hpbmcgaW4gdGhlIFNUTCB3cmFwcGVycyAocmVqZWN0ISBhbmQgZGVsZXRlX2lmIG1ldGhvZHMpCgowNi8xOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEMjIGFuZCBKYXZhIGtleXdvcmRzIHdpbGwgYmUgcmVuYW1lZCBpbnN0ZWFkIG9mIGp1c3QgaXNzdWluZyBhIHdhcm5pbmcKICAgICAgICAgICAgYW5kIHRoZW4gZ2VuZXJhdGluZyB1bmNvbXBpbGVhYmxlIGNvZGUuIFdhcm5pbmcgMzE0IGdpdmVzIHRoZSBuZXcgbmFtZSB3aGVuIGEgCiAgICAgICAgICAgIGtleXdvcmQgaXMgZm91bmQuCgowNi8xOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gS2V5d29yZCBoYW5kbGluZyBhZGRlZC4gUiBLZXl3b3JkcyB3aWxsIGJlIHJlbmFtZWQgYXMgbmVjZXNzYXJ5LgogICAgICAgICAgICBXYXJuaW5nIDMxNCBnaXZlcyB0aGUgbmV3IG5hbWUgd2hlbiBhIGtleXdvcmQgaXMgZm91bmQuCgowNi8xNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIGJvb2wmIGFuZCBib29sKi4gQWRkZWQgcnVudGVzdCBmb3IgbGlfdHlwZW1hcHMgdGVzdGNhc2UuCiAgICAgICAgICAgIChCdWcgIzE5MzgxNDIpCgowNi8wNy8yMDA4OiBiaHkKICAgICAgICAgICAgQWRkZWQgdGVzdCBjYXNlIGtleXdvcmRfcmVuYW1lLCB0aGVuIG1hZGUgdGhlIGtleXdvcmQgcmVuYW1pbmcgd29ya3MgcHJvcGVybHkKICAgICAgICAgICAgYnkgZml4aW5nIFN3aWdfbmFtZV9tYWtlKCkgZm9yIGEgaW5jb21wbGV0ZSBjb25kaXRpb24gY2hlY2tpbmcuCgowNi8wMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBlbnVtIHdyYXBwZXJzIHdoZW4gdXNpbmcgLW5vcHJveHkuCgowNS8zMC8yMDA4OiBiaHkKICAgICAgICAgICAgQWRkZWQgc3RkOjp3c3RyaW5nIGludG8gTGliL3R5cGVtYXBzL3ByaW10eXBlcy5zd2csIHNpbmNlIGl0IGlzIGFsc28gYSBwcmltaXRpdmUgCiAgICAgICAgICAgIHR5cGUgaW4gU1dJRyAtIGZpeGVkIFNGICMxOTc2OTc4LgoKMDUvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdmFyaWFibGUgd3JhcHBlcnMgd2hlbiB1c2luZyAtbm9wcm94eS4KCjA1LzI5LzIwMDg6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXhlZCBhIHR5cG8gb2YgJSNpZmRlZiBpbiBMaWIvcHl0aG9uL3B5Y29udGFpbmVyLnN3Zywgd2hpY2ggaXMgcmVsYXRlZCAKICAgICAgICAgICAgdG8gLWV4dHJhbmF0aXZlIFNXSUcgb3B0aW9uIC0gU0YgIzE5NzE5NzcuCgowNS8yMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgcGFydGlhbGNoZWNrIG1ha2VmaWxlIHRhcmdldHMgZm9yIHBhcnRpYWwgdGVzdGluZyBvZiB0aGUgdGVzdC1zdWl0ZS4gVGhlc2UKICAgICAgICAgICAganVzdCBpbnZva2UgU1dJRywgaWUgbm8gY29tcGlsYXRpb24gYW5kIG5vIHJ1bnRpbWUgdGVzdGluZy4gSXQgY2FuIGJlIGZhc3RlcgogICAgICAgICAgICB3aGVuIGRldmVsb3BpbmcgYnkganVzdCBkb2luZyBhIGRpcmVjdG9yeSBkaWZmIG9mIHRoZSBmaWxlcyBTV0lHIGdlbmVyYXRlcwogICAgICAgICAgICBhZ2FpbnN0IHRob3NlIGZyb20gYSBwcmV2aW91cyBydW4uIEV4YW1wbGUgdXNhZ2UgZnJvbSB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeToKCiAgICAgICAgICAgICAgbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZQogICAgICAgICAgICAgIG1ha2UgcGFydGlhbGNoZWNrLWphdmEtdGVzdC1zdWl0ZQoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBlbmNvbXBhc3NlcyBtb3JlIGZsZXhpYmlsaXR5IGluIHJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUsIGVnCiAgICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIHByZWZpeCB0aGUgY29tbWFuZCBsaW5lIHdoaWNoIHJ1bnMgYW55IHRhcmdldCBsYW5ndWFnZSB0ZXN0CiAgICAgICAgICAgIHdpdGggYSB0b29sLiBTZWUgdGhlIFJVTlRPT0wsIENPTVBJTEVUT09MIGFuZCBTV0lHVE9PTCB0YXJnZXRzIGluIHRoZSBjb21tb24ubWsKICAgICAgICAgICAgZmlsZSBhbmQgbWFrZWZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUgaXQgaXMgcG9zc2libGUgdG8gCiAgICAgICAgICAgIHJ1biB0aGUgcnVudGltZSB0ZXN0cyB0aHJvdWdoIHZhbGdyaW5kIHVzaW5nOgoKICAgICAgICAgICAgICBtYWtlIGNoZWNrIFJVTlRPT0w9InZhbGdyaW5kIC0tbGVhay1jaGVjaz1mdWxsIgoKICAgICAgICAgICAgb3IgaW52b2tlIFNXSUcgdW5kZXIgdmFsZ3JpbmQgdXNpbmc6CgogICAgICAgICAgICAgIG1ha2UgY2hlY2sgU1dJR1RPT0w9InZhbGdyaW5kIC0tdG9vbD1tZW1jaGVjayIKCjA1LzE5LzIwMDg6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBkZWZpbmUgdGhhdCB3YXMgYnJlYWtpbmcgcHJlLTIuNy4gIENoZWNrZWQgaW4KICAgICAgICAgICAgcGF0Y2ggZnJvbSBTb3JlbiBTb25uZW5idXJnIHRoYXQgY3JlYXRlcyBzdHJpbmdzIGluICAKCSAgICB2ZXJzaW9uIGluZGVwZW5kZW50IHdheQoKMDUvMTUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCB2YXJpYWJsZSBuYW1lIGNsYXNoIGluIGRpcmVjdG9ycyAtIFNGICMxOTYzMzE2IHJlcG9ydGVkIGJ5IFRyaXN0YW4uCgowNS8xNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgYW4gb3B0aW1pc2F0aW9uIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gb2JqZWN0cyBieSB2YWx1ZSwgcmVkdWNpbmcKICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlIG9iamVjdCB0aGF0IGFyZSBtYWRlLiBJbXBsZW1lbnRlZCB1c2luZyBhbgogICAgICAgICAgICBvcHRpb25hbCBhdHRyaWJ1dGUgaW4gdGhlICJvdXQiIHR5cGVtYXAgY2FsbGVkICJvcHRpbWFsIi4gRGV0YWlscyBpbiAKICAgICAgICAgICAgVHlwZW1hcHMuaHRtbC4KCjA1LzExLzIwMDg6IG9sbHkKCSAgICBbUEhQXSBDaGVjayBmb3IgJWZlYXR1cmUoIm5vdGFic3RyYWN0Iikgd2hlbiBnZW5lcmF0aW5nIFBIUDUgY2xhc3MKCSAgICB3cmFwcGVyLgoKMDUvMTEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGICMxOTQzNjA4IC0gJHNlbGYgc3Vic3RpdHV0aW9uIGluICVjb250cmFjdCwgcGF0Y2ggc3VibWl0dGVkIGJ5CiAgICAgICAgICAgIFRvb24gVmVyc3RyYWVsZW4uCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGNoYXIgKiB0eXBlbWFwcyB0byB3b3JrIHdoZW4gYXBwbGllZCB0byBzaWduZWQgY2hhciAqIGFuZAoJICAgIHVuc2lnbmVkIGNoYXIgKiAodW5jb3ZlcmVkIGJ5IHRlc3RjYXNlIGFwcGx5X3N0cmluZ3MpLgoKMDUvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGNoYXIgKiBtZW1iZXIgdmFyaWFibGVzIHdoZW4gdXNpbmcgYWxscHJvdGVjdGVkIG1vZGUuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBXYXJyZW4gV2FuZy4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggYmFkIFBIUCBjb2RlIGdlbmVyYXRlZCB3aGVuIHdyYXBwaW5nIGFuIGVudW0gaW4gYQoJICAgIG5hbWVzcGFjZSAodW5jb3ZlcmVkIGJ5IHRlc3RjYXNlIGFycmF5c19zY29wZSkuCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gU1dJRyBub3cgcnVucyB0aGUgUEhQIHRlc3RzdWl0ZSB1c2luZyBQSFA1LCBub3QgUEhQNC4gIFBIUDQKCSAgICBpcyBlc3NlbnRpYWxseSBvYnNvbGV0ZSBub3csIHNvIHdlIGNhcmUgbXVjaCBtb3JlIGFib3V0IHNvbGlkIFBIUDUKCSAgICBzdXBwb3J0LgoKMDUvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgU1RMIGZpeGVzIHdoZW4gdXNpbmcgJWltcG9ydCByYXRoZXIgdGhhbiAlaW5jbHVkZSBhbmQgdGhlIFNvbGFyaXMgV29ya3Nob3AKICAgICAgICAgICAgY29tcGlsZXIgYW5kIHRoZSBSb2d1ZXdhdmUgU1RMLgoKMDUvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIG92ZXJsb2FkZWQgcHJvdGVjdGVkIG1ldGhvZHMgd2hlbiB1c2luZyBhbGxwcm90ZWN0ZWQgbW9kZS4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IFdhcnJlbiBXYW5nLgoKMDUvMDMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQ29tbWl0IHBhdGNoICMxOTU2NjA3IHRvIGFkZCAtTVQgc3VwcG9ydCBmcm9tIFJpY2hhcmQgQm91bHRvbi4KICAgICAgICAgICAgVGhpcyBwYXRjaCBtaXJyb3JzIHRoZSBnY2MgLU1UIG9wdGlvbiB3aGljaCBhbGxvd3Mgb25lIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgICAgICAgICBNYWtlZmlsZSB0YXJnZXQgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gZ2VuZXJhdGluZyBtYWtlZmlsZXMgd2l0aCB0aGUgLU0gZmFtaWx5CiAgICAgICAgICAgIG9mIG9wdGlvbnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAkIHN3aWcgLWphdmEgLU1NIC1NVCBvdmVyaWRkZW5uYW1lIC1jKysgIGV4YW1wbGUuaQogICAgICAgICAgICAgIG92ZXJpZGRlbm5hbWU6IFwKICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKMDQvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBbTHVhXSBSZW1vdmVkIGdlbmVyYXRpb24gb2YgX3dyYXBfZGVsZXRlX1hYWFhYICh3cmFwcGVyZWQgZGVzdHJ1Y3RvcikKCSAgICB3aGljaCB3YXMgdW51c2VkIGFuZCBjYXVzaW5nIHdhcm5pbmcgd2l0aCBnKysgLVdhbGwuCgkgICAgUmVtb3ZlZCBvdGhlciB1bnVzZWQgd2FybmluZyBpbiB0eXBlbWFwcy5pIGFuZCBvdGhlciBwbGFjZXMuCgkgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2VtYmVkMywgYW5kIHJ1biB0ZXN0cyBhIGZldyB0ZXN0IGNhc2VzLgoKMDQvMjQvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgSUJNJ3MgQysrIGNvbXBpbGVyIG9uIEFJWCAocGF0Y2gKCSAgICBmcm9tIEdvZXJhbiBVZGRlYm9yZyBpbiBTRiMxOTI4MDQ4KS4KCjA0LzI0LzIwMDg6IG9sbHkKCSAgICBSZW5hbWUgQlNJWkUgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9hcnJheXNfc2NvcGUuaSB0byBCQlNJWkUgdG8KCSAgICBhdm9pZCBhIGNsYXNoIHdpdGggQlNJWkUgZGVmaW5lZCBieSBoZWFkZXJzIG9uIEFJWCB3aXRoIFBlcmwKCSAgICAocmVwb3J0ZWQgaW4gU0YjMTkyODA0OCkuCgowNC8yMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIGFiaWxpdHkgdG8gd3JhcCBhbGwgcHJvdGVjdGVkIG1lbWJlcnMgd2hlbiB1c2luZyBkaXJlY3RvcnMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgb25seSB0aGUgdmlydHVhbCBtZXRob2RzIHdlcmUgYXZhaWxhYmxlIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgIE5vdyBhbGwgcHJvdGVjdGVkIG1lbWJlcnMsIChzdGF0aWMgYW5kIG5vbi1zdGF0aWMgdmFyaWFibGVzLCBub24tdmlydHVhbCBtZXRob2RzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWV0aG9kcykgYXJlIHdyYXBwZWQgd2hlbiB1c2luZyB0aGUgYWxscHJvdGVjdGVkIG1vZGUuIFRoZSBhbGxwcm90ZWN0ZWQKICAgICAgICAgICAgbW9kZSBpcyB0dXJuZWQgb24gaW4gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbjoKCiAgICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLCBhbGxwcm90ZWN0ZWQ9IjEiKSBtb2R1bGVuYW1lCgpWZXJzaW9uIDEuMy4zNSAoNyBBcHJpbCAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQWRkIG1pc3NpbmcgcG9pbnRlciByZWZlcmVuY2UgdHlwZW1hcHMKCjA0LzA2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzdGFjayBvdmVyZmxvdyB3aGVuIHVzaW5nIHR5cGVtYXAgd2FybmluZyBzdXBwcmVzc2lvbiwgZWcgCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fVFlQRU1BUF9DSEFSTEVBS19NU0cpCgowNC8wNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2hhcmVkX3B0ciB0eXBlbWFwcyBzbyB0aGF0ICVweXRob25ub25keW5hbWljIGNhbiBiZSB1c2VkLiBBbHNvIGNvcnJlY3RzCiAgICAgICAgICAgIGRpc3BsYXkgb2YgdGhlIHByb3h5IGNsYXNzIHR5cGUuIFJlcG9ydGVkIGJ5IFJvYmVydCBMdXB0b24uCgowNC8wNC8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkICVuZXdvYmplY3QgcmVmZXJlbmNlIHRvIHB5dGhvbiBtZW1vcnkgbWFuYWdlbWVudCBzdWJzZWN0aW9uIG9mIG1hbnVhbAoJICAgIChwYXRjaCBmcm9tIG1kYmVhY2h5IGluIFNGIzE4OTQ2MTApLgoKMDMvMjcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNoYXJlZF9wdHIgdHlwZW1hcHMgd2hlcmUgdGhlIHBvaW50ZXIgdHlwZSBpcyBhIHRlbXBsYXRlZCB0eXBlIHdpdGgKICAgICAgICAgICAgd2l0aCBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4gUmVwb3J0ZWQgYnkgUm9iZXJ0IEx1cHRvbi4KCjAzLzI3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgdHlwZW1hcCBESVNPV04gZm9yIFNXSUdUWVBFKiBhbmQgU1dJR1RZUEVbXSwgYW5kIHN1cHBvcnQgZm9yICVkZWxvYmplY3QgZmVhdHVyZS4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL293bmVyIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjMTg0NDMwMSBmcm9tIE1vbnR5IFRheWxvciB0byBzdXBwcmVzcyBlbnVtIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHVudXNlZCB3YXJuaW5ncy4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI0NTI0IGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCBlbnN1cmVzIHRoZQogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCIgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGNhbGwgYQogICAgICAgICAgICBjb25zdHJ1Y3RvciBvbiBhIGNsYXNzIHRoYXQgZG9lc24ndCBoYXZlIGEgY29uc3RydWN0b3Igd3JhcHBlciwgZWcgaWYKICAgICAgICAgICAgdGhlIEMrKyBjbGFzcyBpcyBhYnN0cmFjdC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI1NzAyIGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCByZW1vdmVzIHdhcm5pbmcgNTEyCiAgICAgICAgICAgIGZvciBzdGQ6OnZlY3RvciB3cmFwcGVycy4KCjAzLzI2LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBBcHBseSBHQ0MgNC4zIHdhcm5pbmdzIHBhdGNoIGZyb20gUGhpbGlwcCBUaG9tYXMKCSAgICAoU0YjMTkyNTEyMikuCgowMy8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBUaHJlYWQgc2FmZXR5IHBhdGNoIGZvciBTVEwgaXRlcmF0b3JzIGZyb20gQWJoaW5hbmRhbiBKYWluLgoKMDMvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgJWx1YWNvZGUgZmVhdHVyZSB0byBhZGQgc291cmNlIGNvZGUgaW50byB3cmFwcGVycy4KICAgICAgICAgICAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoaXMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9hcnJheXMgdG8gc2hvdyBpdHMgdXNlIChhbmQgdHlwZW1hcHMpCgowMy8xNy8yMDA4OiBvbGx5CgkgICAgRml4IG5vbnBvcnRhYmxlIHNlZCB1c2FnZSB3aGljaCBmYWlsZWQgb24gTWFjIE9TIFggKGFuZCBwcm9iYWJseQoJICAgIG90aGVyIHBsYXRmb3JtcykuICBGaXhlcyBTRiMxOTAzNjEyLgoKMDMvMTcvMjAwODogb2xseQoJICAgIEZpeCBtZW1vcnkgbGVhayBpbiBTV0lHJ3MgcGFyc2VyIChiYXNlZCBvbiBwYXRjaCBmcm9tIFJ1c3NlbGwKCSAgICBCcnlhbnQgaW4gU0YjMTkxNDAyMykuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxODc4Mjg1IC0gdW5uZWNlc3NhcnkgY2FzdCBmb3IgQyBzdHJ1Y3QgY3JlYXRpb24gd3JhcHBlcnMuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgZGVidWdnaW5nIGluZm8gd2hlbiB1c2luZyBzaGFyZWRfcHRyIHN1cHBvcnQKCjAzLzA2LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgTHVhIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9leGNlcHRpb24gYW5kIEV4YW1wbGVzL2x1YS9lbWJlZDIuCiAgICAgICAgICAgIFNtYWxsIHVwZGF0ZXMgdG8gdGhlIHR5cGVtYXBzLgoKMDMvMDQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBBZGQgY2hhciAqJiB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvY2Nhc2lvbmFsIHNlZyBmYXVsdCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVwb3J0IG92ZXJsb2FkZWQgbWV0aG9kcyBhcyBiZWluZyBpZ25vcmVkLgoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCAjMTkwNDUzNyBTd2lnIGNhdXNlcyBhIFBlcmwgd2FybmluZyAieCB1c2VkIG9ubHkgb25jZSIgaW4gUGVybCA1LjEwCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEFyaSBKb2xtYQoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHNoYXJlZF9wdHIgdmFyaW4vdmFyb3V0IHR5cGVtYXBzIGZvciB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGVzLgoKMDIvMjUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICR3cmFwbmFtZSB0byB3b3JrIGluICVleGNlcHRpb24gKGZpeGVzIHNvbWUgd3JhcDpuYW1lIGFzc2VydGlvbnMpCgpWZXJzaW9uIDEuMy4zNCAoMjcgRmVicnVhcnkgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHdyYXBwaW5nIG9mIGdsb2JhbCBmdW5jdGlvbiBwb2ludGVyIHZhcmlhYmxlcy4KCjAyLzEzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgZm9yIHVzZSB3aXRoaW4gJWV4Y2VwdGlvbjoKICAgICAgICAgICAgICAkd3JhcG5hbWUgLSBsYW5ndWFnZSBzcGVjaWZpYyB3cmFwcGVyIG5hbWUKICAgICAgICAgICAgICAkb3Zlcm5hbWUgLSBpZiBhIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRoaXMgY29udGFpbnMgdGhlIGV4dHJhIG1hbmdsaW5nIHVzZWQgb24gCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG92ZXJsb2FkZWQgbWV0aG9kCiAgICAgICAgICAgICAgJGRlY2wgICAgIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgcmV0dXJuIHR5cGUKICAgICAgICAgICAgICAkZnVsbGRlY2wgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIHJldHVybiB0eXBlCgowMi8xMi8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gTm93IHNldHRpbmcgUzQgZmxhZyBpbiBTV0lHIGNyZWF0ZWQgb2JqZWN0cy4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgUi1TV0lHIGZvciAyLjYgYW5kIHdhcm5pbmcgZm9yIDIuNiBmYWlsdXJlIGhhcyBiZWVuIHJlbW92ZWQuCgowMi8xMS8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHBhdGNoIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZiB0byBmaXggdGhlIHVuYXJ5IG1pbnVzIGlzc3VlCiAgICAgICAgICAgIFJhbiAnYXN0eWxlIC0tc3R5bGU9a3IgLTInIGFjcm9zcyBsdWEuY3h4IHRvIG5lYXRlbiBpdCB1cAoKMDIvMTAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQnVtcCBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byA0LiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgQVBJIAogICAgICAgICAgICBjaGFuZ2UgaW4gdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zLCBpZSBjaGFuZ2UgaW4gZGVmaW5pdGlvbiBvZiBzd2lnX2NvbnZlcnRlcl9mdW5jLgogICAgICAgICAgICBBbnlvbmUgY2FsbGluZyBTV0lHX1R5cGVDYXN0IG11c3QgcGFzcyBpbiBhIHZhbGlkIHZhbHVlIGZvciB0aGUgbmV3IGFkZGl0aW9uYWwKICAgICAgICAgICAgKHRoaXJkKSBwYXJhbWV0ZXIgYW5kIHRoZW4gaGFuZGxlIHRoZSBuZXdseSBjcmVhdGVkIG1lbW9yeSBpZiB0aGUgcmV0dXJuZWQgdmFsdWUKICAgICAgICAgICAgaXMgc2V0IHRvIFNXSUdfQ0FTVF9ORVdfTUVNT1JZIGVsc2UgYSBtZW1vcnkgbGVhayB3aWxsIGVuc3VlLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRXhwZXJpbWVudGFsIHNoYXJlZF9wdHIgdHlwZW1hcHMgYWRkZWQuIFVzYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSByZWNlbnRseQogICAgICAgICAgICBhZGRlZCBKYXZhIGFuZCBDIyBzaGFyZWRfcHRyIHR5cGVtYXBzLiBUd28gbWFjcm9zIGFyZSBhdmFpbGFibGUsIGFsdGhvdWdoIHRoZXNlCiAgICAgICAgICAgIG1heSB3ZWxsIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgoKICAgICAgICAgICAgRm9yIGJhc2UgY2xhc3NlcyBvciBjbGFzc2VzIG5vdCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbjoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgRm9yIGRlcml2ZWQgY2xhc3NlczoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQoKICAgICAgICAgICAgVGhlIFBST1hZQ0xBU1MgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3h5IGNsYXNzLCBidXQgaXMgb25seSByZXF1aXJlZCBmb3IgSmF2YS9DIy4KICAgICAgICAgICAgRXhhbXBsZSB1c2FnZToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJvb3N0X3NoYXJlZF9wdHIuaSIKCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKEtsYXNzLCBTcGFjZTo6S2xhc3MpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoS2xhc3NEZXJpdmVkLCBTcGFjZTo6S2xhc3MsIFNwYWNlOjpLbGFzc0Rlcml2ZWQpCgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzc0Rlcml2ZWQgOiBLbGFzcyB7IC4uLiB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZ1cnRoZXIgZGV0YWlscyB0byBmb2xsb3cgaW4gZnV0dXJlIGRvY3VtZW50YXRpb24sIGJ1dCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzCiAgICAgICAgICAgIHNob3VsZCBiZSBub3RlZDoKCiAgICAgICAgICAgIC0gTm90IHJlc3RyaWN0ZWQgdG8gYm9vc3Q6OnNoYXJlZF9wdHIsIGVnIHN0ZDo6dHIxOjpzaGFyZWRfcHRyIGNhbiBhbHNvIGJlIHVzZWQuCiAgICAgICAgICAgIC0gQXZhaWxhYmxlIHR5cGVtYXAgZ3JvdXBzOgogICAgICAgICAgICAgIChhKSBUeXBlbWFwcyBmb3Igc2hhcmVkX3B0ciBwYXNzZWQgYnkgdmFsdWUsIHJlZmVyZW5jZSwgcG9pbnRlciBhbmQgcG9pbnRlciAKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLgogICAgICAgICAgICAtIChiKSBUeXBlbWFwcyBmb3IgcGFzc2luZyBieSByYXcgdmFsdWUsIHJhdyBwb2ludGVyLCByYXcgcmVmZXJlbmNlLCByYXcgcG9pbnRlcgogICAgICAgICAgICAgICAgICByZWZlcmVuY2UuIAogICAgICAgICAgICAtIFRoZSBjb2RlIGJlaW5nIHdyYXBwZWQgZG9lcyBub3QgZXZlbiBoYXZlIHRvIHVzZSBzaGFyZWRfcHRyLCBTV0lHIGNhbiB1c2UKICAgICAgICAgICAgICBzaGFyZWRfcHRyIGFzIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtIGluc3RlYWQgb2YgYSByYXcgcG9pbnRlciBkdWUgdG8gCiAgICAgICAgICAgICAgdGhlIHR5cGVtYXBzIGluIGdyb3VwIChiKSBhYm92ZS4KICAgICAgICAgICAgLSBObyBhcnJheSBzdXBwb3J0IGFzIHNoYXJlZF9wdHIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheXMuCiAgICAgICAgICAgIC0gVGhpcyB3b3JrcyBxdWl0ZSBkaWZmZXJlbnRseSB0byB0aGUgdXN1YWwgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgd2hlbgogICAgICAgICAgICAgIG9wZXJhdG9yLT4gaXMgcGFyc2VkIGJ5IFNXSUc6CiAgICAgICAgICAgICAgLSBBbiBhZGRpdGlvbmFsIHNtYXJ0IHBvaW50ZXIgY2xhc3MgaXMgbm90IGdlbmVyYXRlZCByZWR1Y2luZyBjb2RlIGJsb2F0IGluCiAgICAgICAgICAgICAgICB0aGUgd3JhcHBlcnMuCiAgICAgICAgICAgICAgLSBVc2luZyBzbWFydCBwb2ludGVycyBhbmQgcmF3IHBvaW50ZXJzIGNhbiBiZSBtaXhlZCBzZWFtbGVzc2x5LgogICAgICAgICAgICAgIC0gTWlzc2luZyBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBzbWFydCBwb2ludGVycyBpcyBubyBsb25nZXIgYSBwcm9ibGVtIGFuZCBzbwogICAgICAgICAgICAgICAgc2VwYXJhdGUgZmFjdG9yeSB0eXBlIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSB0byBiZSB3cml0dGVuIGFuZCB3cmFwcGVkLgogICAgICAgICAgICAgIC0gVGhlIGltcGxpY2l0IEMrKyBzaGFyZWRfcHRyPCBkZXJpdmVkIGNsYXNzID4gdG8gc2hhcmVkX3B0cjwgYmFzZSBjbGFzcyA+CiAgICAgICAgICAgICAgICBjYXN0IGFsc28gd29ya3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gVGhpcyBuZWdhdGVzIHRoZSBuZWNlc3NpdHkgdG8gd3JpdGUKICAgICAgICAgICAgICAgIGFuIGV4cGxpY2l0IGhlbHBlciBjYXN0IGZ1bmN0aW9uIHByb3ZpZGluZyB0aGUgdXBjYXN0IHdoaWNoIHdvdWxkIG5lZWQKICAgICAgICAgICAgICAgIGNhbGxpbmcgcHJpb3IgdG8gcGFzc2luZyBhIGRlcml2ZWQgY2xhc3MgdG8gYSBtZXRob2QgdGFraW5nIGEgc2hhcmVkX3B0ciB0bwogICAgICAgICAgICAgICAgYSBiYXNlIGNsYXNzLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHN1cHBvcnQgZm9yIG92ZXJyaWRpbmcgdGhlIGNsYXNzIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiB2aWEgYSBuZXcKICAgICAgICAgICAgInNtYXJ0cHRyIiBmZWF0dXJlLiBUaGlzIGlzIGEgdmVyeSBsb3cgbGV2ZWwgb2YgY3VzdG9taXNhdGlvbiBtb3N0IHVzZXJzCiAgICAgICAgICAgIHdvdWxkIG5ldmVyIG5lZWQgdG8ga25vdy4gVGhlIGZlYXR1cmUgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IgaW50cnVzaXZlIAogICAgICAgICAgICBzbWFydCBwb2ludGVycyBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgdHlwZW1hcHMuIEV4YW1wbGUgdXNhZ2Ugb2YgdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIsIG5vYmxvY2s9MSkgRm9vIHsgYm9vc3Q6OnNoYXJlZF9wdHI8IEZvbyA+IH0KICAgICAgICAgICAgICBjbGFzcyBGb28ge307CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIEZvb19zd2lncmVnaXN0ZXIgZnVuY3Rpb24gd2lsbCB0aGVuIHJlZ2lzdGVyIGJvb3N0OjpzaGFyZWQgPCBGb28gPgogICAgICAgICAgICAoU1dJR1RZUEVfcF9ib29zdF9fc2hhcmVkX3B0clRGb29fdCBpbnN0ZWFkIG9mIFNXSUdUWVBFX3BfRm9vKSBhcyB0aGUgdW5kZXJseWluZwogICAgICAgICAgICB0eXBlIGZvciBpbnN0YW50aWF0aW9ucyBvZiBGb28uCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGZWF0dXJlcyBub3cgc3VwcG9ydHMgdGhlIG9wdGlvbmFsICdub2Jsb2NrJyBhdHRyaWJ1dGUgZm9yIGFsbCB1c2FnZSBvZiAlZmVhdHVyZS4gCiAgICAgICAgICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgeyB9IGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmZWF0dXJlIGNvZGUuIFRoaXMgaXMgaWRlbnRpY2FsCiAgICAgICAgICAgIGluIGJlaGF2aW91ciB0byB1c2FnZSBvZiAnbm9ibG9jaycgaW4gdHlwZW1hcHMgYW5kIGlzIHVzZWQgd2hlbiB0aGUgcHJlcHJvY2Vzc29yCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9wZXJhdGUgb24gdGhlIGNvZGUgaW4gdGhlIGZlYXR1cmUgYW5kIHRoZSBlbmNsb3NpbmcgeyB9IGJyYWNlcwogICAgICAgICAgICBhcmUgbm90IHJlcXVpcmVkLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBmb28KICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPSIxIikgeyBGT086OmJhciB9CgogICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIHRoZW4gcmVkdWNlcyB0aGlzIGFzIGlmIHRoaXMgaGFkIGJlZW4gdXNlZCBpbnN0ZWFkOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiKSAiZm9vOjpiYXIiCgowMi8wMS8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGZvcm1hdCBzdHJpbmcgYnVnIChTRiMxODgyMjIwKS4KCjAxLzMxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGl0aW9ucyB0byB0aGUgJXR5cGVzIGRpcmVjdGl2ZS4gTm93IHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGNhbiBiZQogICAgICAgICAgICBvdmVycmlkZGVuIHRvIHNvbWUgY3VzdG9tIGNvZGUgaW4gdGhlICV0eXBlcyBkaXJlY3RpdmUsIGxpa2Ugc286CgogICAgICAgICAgICAgICV0eXBlcyhmcm9tdHlwZSA9IHRvdHlwZSkgJXsKICAgICAgICAgICAgICAgIC4uLiBjb2RlIHRvIGNvbnZlcnQgZnJvbXR5cGUgdG8gdG90eXBlIGFuZCByZXR1cm4gLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBzcGVjaWFsIHZhcmlhYmxlICRmcm9tIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBvZiB0aGUKICAgICAgICAgICAgdHlwZSBiZWluZyBjb252ZXJ0ZWQgZnJvbS4gVGhlIGNvZGUgbXVzdCByZXR1cm4gdGhlIHRvdHlwZSBjYXN0IHRvIHZvaWQgKi4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVGltZTsKICAgICAgICAgICAgICBjbGFzcyBEYXRlOwogICAgICAgICAgICAgIERhdGUgJlRpbWU6OmRhdGVGcm9tVGltZSgpOwoKICAgICAgICAgICAgICAldHlwZXMoVGltZSA9IERhdGUpICV7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKikkZnJvbTsKICAgICAgICAgICAgICAgIERhdGUgJmQgPSB0LT5kYXRlRnJvbVRpbWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSAmZDsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgcmVzdWx0aW5nIGluIHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGxvb2tpbmcgc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIHN0YXRpYyB2b2lkICpfcF9UaW1lVG9fcF9EYXRlKHZvaWQgKngpIHsKICAgICAgICAgICAgICAgIFRpbWUgKnQgPSAoVGltZSAqKXg7CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBpcyBhZHZhbmNlZCB1c2FnZSwgcGxlYXNlIHVzZSBvbmx5IGlmIHlvdSB1bmRlcnN0YW5kIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLgoKMDEvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBTbWFsbCB1cGRhdGUgdG8gZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sLCB0byB3YXJuIGFib3V0IHVzZSBvZiBsb2NhbCAKCSAgICB2YXJpYWJsZXMgaW4gdHlwZW1hcHMgZm9yIG11bHRpcGxlIHR5cGVzLgoKMDEvMjUvMjAwODogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IGJ1ZyByZXBvcnRlZCBieSBLZXZpbiBNaWxscyBpbiBBUlJBWVNPRkNMQVNTRVMgdHlwZW1hcHMgd2hlcmUgYW55CiAgICAgICAgICAgIGNoYW5nZXMgbWFkZSB0byBhbiBhcnJheSBlbGVtZW50IHBhc3NlZCBmcm9tIEphdmEgdG8gQyBhcmUgbm90IHJlZmxlY3RlZCBiYWNrCiAgICAgICAgICAgIGludG8gSmF2YS4KCjAxLzI0LzIwMDg6IG1nb3NzYWdlCgkgICAgTW9yZSB1cGRhdGVzIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBkZXRlY3RpbmcgbHVhLgoJICAgIEFsc28gbG9va3MgaW4gL3Vzci9pbmNsdWRlL2x1YSoKCSAgICBBbHNvIGNoYW5nZWQgdHlwZW1hcHMuaSBub3QgdG8gY2hlY2sgZm9yIE5VTEwgYmVmb3JlIGZyZWVpbmcgYSBwb2ludGVyCgowMS8yMS8yMDA4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZvciBTVEwgY29udGFpbmVycywgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8gY29udmVydCBmcm9tIG9uZQogICAgICAgICAgICBTVEwgY29udGFpbmVyIHRvIGFub3RoZXIsIGVnIGZyb20gc3RkOjp2ZWN0b3I8aW50PiB0byBzdGQ6OnZlY3Rvcjxkb3VibGU+CiAgICAgICAgICAgIG9yIHN0ZDo6bGlzdDxpbnQ+IHRvIHN0ZDo6dmVjdG9yPGludD4gb3IgZXZlbiBzdGQ6OnZlY3RvcjxGb28+IHRvCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJhcj4gYXMgaXQgcHJldmlvdXNseSBkaWQuIEluIGZhY3QgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8KICAgICAgICAgICAgY29udmVydCBhbnkgU1dJRyB3cmFwcGVkIEMrKyBwcm94eSBjbGFzcyB0aGF0IGlzIGFsc28gYSBQeXRob24gc2VxdWVuY2UsCiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZC4gQW55IG5vbi1TV0lHIFB5dGhvbiBzZXF1ZW5jZSB3aWxsIHN0aWxsIGJlCiAgICAgICAgICAgIGFjY2VwdGVkIHdoZXJldmVyIGFuIFNUTCBjb250YWluZXIgaXMgYWNjZXB0ZWQuIE92ZXJsb2FkZWQgbWV0aG9kcyB1c2luZwogICAgICAgICAgICBjb250YWluZXJzIHNob3VsZCBiZSBmYXN0ZXIuCgowMS8xOC8yMDA4OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICdkaXJlY3RvcmluYXR0cmlidXRlcycgYW5kICdkaXJlY3Rvcm91dGF0dHJpYnV0ZXMnIHR5cGVtYXAgYXR0cmlidXRlcwogICAgICAgICAgICBmb3IgdGhlIGltdHlwZSB0eXBlbWFwLiBUaGVzZSBzaG91bGQgY29udGFpbiBDIyBhdHRyaWJ1dGVzIHdoaWNoIHdpbGwKICAgICAgICAgICAgYmUgZ2VuZXJhdGVkIGludG8gdGhlIEMjIGRpcmVjdG9yIGRlbGVnYXRlIG1ldGhvZHMuCgowMS8xOC8yMDA4OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIGJ5dGUgdmFsdWUgMjU1IGluIGlucHV0IGZpbGVzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIGNoYXIgaXMgc2lnbmVkIChpdCB3YXMgZ2V0dGluZyBtYXBwZWQgdG8gRU9GKS4gIEZpeGVzIFNGIzE1MTgyMTkuCgowMS8xNi8yMDA4OiB3c2Z1bHRvbgoJICAgIEZpeCB0ZW1wbGF0ZSBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZWQgYnkgYSBzbWFydCBwb2ludGVyLiBCdWcgcmVwb3J0ZWQgCiAgICAgICAgICAgIGJ5IFJvYmVydCBMdXB0b24uCgowMS8xNC8yMDA4OiBtZ29zc2FnZQoJICAgIFN1YnN0YW50aWFsIGNoYW5nZXMgdG8gY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICAgIENvZGUgY2FuIG5vdyBsaW5rIHRvIGxpYmx1YS5hLCBsaWJsdWE1MC5hIG9yIGxpYmx1YTUxLmEKCSAgICAgIEl0J3MgYWxzbyBhIGxvdCBuZWF0ZXIgbm93LgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gQmFja2VkIG91dCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MzI2MTMgLSBUZW1wbGF0ZXMgYW5kIHNvbWUgdHlwZWRlZnMgaW52b2x2aW5nIHBvaW50ZXJzIG9yIGZ1bmN0aW9uIHBvaW50ZXJzCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzE2MzI2MjUgLSBDb21waWxhdGlvbiBlcnJvcnMgb24gVmlzdWFsIEMrKyA2IHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4ICMxNzk4NzI4IC0gbnVtYmVycyBjYW4gYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyB0YWtpbmcgY2hhciAqLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MTk4NDcgJXRlbXBsYXRlIHdpdGgganVzdCBvbmUgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBpbnQ+IGNsYXNzIEZvbyB7Li4ufTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vRGVmYXVsdCkgRm9vPD47CgoxMi8xMi8yMDA3OiBtZ29zc2FnZQoJICAgIFtMdWFdIFNtYWxsIGNvcnJlY3Rpb24gb24gTHVhLmh0bWwKCjEyLzA5LzIwMDc6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzE4MzgyNDggZnJvbSBNb250eSBUYXlsb3IgZm9yIHZwYXRoIGJ1aWxkcyBvZiBTV0lHLgoKMTIvMDgvMjAwNzogd3NmdWx0b24KCSAgICBbTHVhXSBGaXhlcyB0byByZW1vdmUgZ2NjLTQuMiB3YXJuaW5ncwoKMTIvMDYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE3MzQ0MTUgLSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgdF9pdGVtLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgdF9hbGxvYyA9IHBmYzo6YWxsb2NfZmFzdCA+CiAgICAgICAgICAgICAgICBjbGFzcyBsaXN0X3QgOiBwdWJsaWMgbGlzdF9pbXBsX3Q8dF9pdGVtLHBmYzo6YXJyYXlfdDx0X2l0ZW0sdF9hbGxvYz4gPiB7IC4uLiB9OwoKMTIvMDQvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBGaXggYSBidWcgaW4gdGhlIGNsYXNzIGhpZXJhY2h5IGNvZGUsIHdoZXJlIHRoZSBtZXRob2RzIHdlcmUgbm90IHByb3BhZ2F0ZWQsIAoJICAgIGlmIHRoZSBuYW1lIG9yZGVyaW5nIHdhcyBpbiBhIGNlcnRhaW4gb3JkZXIuCgkgICAgQWRkZWQgbmV3IGV4YW1wbGUgcHJvZ3JhbXMgKGR1YWwsIGVtYmVkKSBhbmQgcnVudGltZSB0ZXN0cyBmb3IgdGVzdC1zdWl0ZS4KCjExLzMwLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4IHVzaW5nIHN0YXRlbWVudHMgdXNpbmcgYSBiYXNlIGNsYXNzIG1ldGhvZCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG92ZXJsb2FkZWQuCiAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlIHVzaW5nIHN0YXRlbWVudHMgYW5kIG1ldGhvZCBkZWNsYXJhdGlvbnMsIHRoZXNlCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSBnZW5lcmF0aW5nIHVuY29tcGlsZWFibGUgd3JhcHBlcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZ1bmsoKTsKICAgICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmZ1bms7CiAgICAgICAgICAgICAgfTsKClZlcnNpb24gMS4zLjMzIChOb3ZlbWJlciAyMywgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjEvMjAwNzogbWlrZWwKCSAgICBbYWxsZWdyb2NsXSBvbWl0IHByaXZhdGUgc2xvdCB0eXBlIGluZm8gaW4gdGhlIGNsYXNzZXMvdHlwZXMKCSAgICBkZWZpbmVkIG9uIHRoZSBsaXNwIHNpZGUuIEZpeCBidWcgaW4gbWFwcGluZyBvZiBDLysrIHR5cGVzCgkgICAgdG8gbGlzcCB0eXBlcy4gRml4IHR5cG8gaW4gbW9kdWxlcyBnZW5lcmF0ZWQgZGVmcGFja2FnZSBmb3JtLgoJICAgIEhhdmUgc3RkOjpzdHJpbmcgKidzIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxlZCBiZXR3ZWVuIGZvcmVpZ24KCSAgICBhbmQgbGlzcCBzdHJpbmdzLgoJCjExLzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaWxsIGluIFB5dGhvbiBEaWN0aW9uYXJ5IGZ1bmN0aW9ucyBsaXN0IChwYXRjaCBmcm9tCgkgICAgSmVsbWVyIFZlcm5vb2lqIHBvc3RlZCB0byBzd2lnLWRldmVsKS4KCjExLzIwLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIEMgc2Nhbm5lciByZWxhdGVkIHRvIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLgoKMTEvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IGJyb2tlbiBjb21waWxhdGlvbiBvZiBDKysgd3JhcHBlcnMgb24gc29tZSBjb21waWxlcnMuCgoxMS8xNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgcGFzcyBQeV9zc2l6ZV90IGZvciBhICVkIHByaW50Zi1saWtlIGZvcm1hdCBhcwoJICAgIHRoYXQncyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gc2l6ZW9mKFB5X3NzaXplX3QpICE9IHNpemVvZihpbnQpLgoKVmVyc2lvbiAxLjMuMzIgKE5vdmVtYmVyIDE1LCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUGFja2FnZSBuYW1lIGFuZCBkbGwgbmFtZSBpcyBub3cgdGhlIHNhbWUgYXMgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgIG5hbWUuIEl0IHVzZWQgdG8gYmUgdGhlIG1vZHVsZSBuYW1lIHdpdGggX3dyYXAgYXMgYSBzdWZmaXguIFRoZSBwYWNrYWdlCiAgICAgICAgICAgIGFuZCBkbGwgbmFtZXMgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHRoZSAtcGFja2FnZSBhbmQgLWRsbCBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8xMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQWRkIHN1cHBvcnQgZm9yIFdpbmRvd3MgKFZpc3VhbCBDKysgOCB0ZXN0ZWQpCgoxMS8xMC8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IG1ha2VmaWxlIGdlbmVyYXRlZCBieSAtbWFrZSAoU0YjMTYzMzY3OSkuICBVcGRhdGUKCSAgICBkb2N1bWVudGF0aW9uIHRvIG1hcmsgIi1tYWtlIiBhcyBkZXByZWNhdGVkIChub25lIG9mIHRoZSBvdGhlcgoJICAgIFNXSUcgYmFja2VuZHMgc2VlbSB0byBvZmZlciBzdWNoIGEgZmVhdHVyZSwgaXQgY2FuJ3QgcmVhbGlzdGljYWxseQoJICAgIGdlbmVyYXRlIGEgZnVsbHkgcG9ydGFibGUgbWFrZWZpbGUsIGFuZCB0aGUgY29tbWFuZHMgdG8gYnVpbGQgYW4KCSAgICBleHRlbnNpb24gYXJlIGVhc3kgZW5vdWdoIHRvIHdyaXRlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBidWlsZAoJICAgIHRvb2wpLiAgQWxzbyByZWNvbW1lbmQgYWdhaW5zdCB0aGUgdXNlIG9mICItcGhwZnVsbCIgKGl0J3Mgb25seQoJICAgIHJlYWxseSB1c2VmdWwgd2hlbiBzdGF0aWMgbGlua2luZywgYW5kIGEgZHluYW1pY2FsbHkgbG9hZGFibGUKCSAgICBtb2R1bGUgaXMgdmlydHVhbGx5IGFsd2F5cyB0aGUgYmV0dGVyIGFwcHJvYWNoKS4KCjExLzA5LzIwMDc6IG9sbHkKCSAgICBGaXggLS1oZWxwIG91dHB1dCB0byBub3RlIHRoYXQgYGV4cG9ydCBTV0lHX0ZFQVRVUkVTJyBpcyByZXF1aXJlZC4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggc2VnIGZhdWx0IG9uIFdpbmRvd3MKICAgICAgICAgICAgW1JdIEV4YW1wbGVzIFIgc2NyaXB0cyBhcmUgbm93IHBsYXRmb3JtIGluZGVwZW5kZW50CgoxMC8zMC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBjbGFzc2VzIHdoaWNoIGNhc2VzIHRlbXBsYXRlX2RlZmF1bHQyCgkgICAgYW5kIHRlbXBsYXRlX3NwZWNpYWxpemF0aW9uX2RlZmFyZyB0byBmYWlsLgoJICAgIEFkZGVkIHNldmVyYWwgd2FybmluZyBmaWx0ZXJzIGludG8gdGhlIG92ZXJsb2FkJ3MgdGVzdCBjYXNlcy4KCSAgICBBZGRlZCBydW50aW1lIHRlc3RzIGZvciBzZXZlcmFsIGNvZGVzLgoJICAgIFlvdSBjYW4gbm93IG1ha2UgY2hlY2stbHVhLXRlc3Qtc3VpdGUgd2l0aCBubyBlcnJvcnMgYW5kIG9ubHkgYSBmZXcgd2FybmluZ3MuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGNvbmZpZ3VyZSB0ZXN0IHRvIHB1dCBHVUlMRUxJTksgaW4gTElCUyBub3QgTERGTEFHUwoJICAgIChTRiMxODIyNDMwKS4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgZ3VpbGUgZXhhbXBsZXMgb24gNjQtYml0IHBsYXRmb3Jtcy4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBzd2lnX2x1YV9jbGFzcyBpbnN0YW5jZXMgdG8gYmUgc3RhdGljIHRvIGFsbG93IG11bHRpcGxlCgkgICAgU1dJRyB3cmFwcGVycyB0byBiZSBjb21waWxlZCBpbnRvIHRoZSBzYW1lIGV4ZWN1dGFibGUgc3RhdGljYWxseS4KCSAgICBQYXRjaCBmcm9tIEFuZHJlYXMgRnJlZHJpa3Nzb24gKHBvc3RlZCB0byB0aGUgc3dpZyBtYWlsaW5nIGxpc3QpLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBFeGFtcGxlcy9sdWEgdG8gcGFzcyBTUkNTIGZvciBDIHRlc3RzIHJhdGhlciB0aGFuIENYWFNSQ1MuCgkgICAgVGhlIGNvZGUgYXMgaXQgd2FzIGhhcHBlbmVkIHRvIHdvcmsgb24geDg2LCBidXQgYnJva2Ugb24geDg2XzY0IChhbmQKCSAgICBwcm9iYWJseSBhbnkgb3RoZXIgcGxhdGZvcm1zIHdoaWNoIHJlcXVpcmUgLWZQSUMpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgYXBwcm9hY2ggZm9yIGZpeGluZyB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yCiAgICAgICAgICAgIG1ldGhvZHMgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZWQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gU3dpZ1ZhbHVlSW5pdCgpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFVzZSBtb3JlIGVmZmljaWVudCBTdlBWX25vbGVuKHgpIGluc3RlYWQgb2YgU3ZQVih4LFBMX25hKSBpZiBTdlBWX25vbGVuIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4KCjEwLzI2LzIwMDc6IHd1enplYgoJICAgIFtDaGlja2VuXSBGaXggZ2xvYmFsIHZhcmlhYmxlcyBvZiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgkgICAgT3RoZXIgbWlub3IgZml4ZXMsIHNvIGFsbCB0ZXN0cyBpbiB0aGUgY2hpY2tlbiB0ZXN0IHN1aXRlIG5vdyBwYXNzCgoxMC8yNS8yMDA3OiBvbGx5CgkgICAgRml4IFVUTCB0eXBlY2hlY2sgbWFjcm8gZm9yIGEgZnVuY3Rpb24gdGFraW5nIGNoYXJbXSBvciBjb25zdAoJICAgIGNoYXJbXSAoU0YjMTgyMDEzMikuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaWx0ZXIgb3V0IC1hbnNpIC1wZWRhbnRpYyBmcm9tIENGTEFHUyB3aGlsZSBjb21waWxpbmcgdGVzdCBwcm9ncmFtcyBmb3IgR3VpbGUKCSAgICBpbiBjb25maWd1cmUuICBUaGlzIGVuYWJsZXMgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgR3VpbGUgaWYgaXQgaXMgaW5zdGFsbGVkIGFuZAoJICAgIHVzYWJsZS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gRml4IHRlc3RjYXNlcyBhcHBseV9zaWduZWRfY2hhciBhbmQgYXBwbHlfc3RyaW5ncwoJICAgIGJ5IGFkZGluZyBleHBsaWNpdCBjYXN0cyB0byB0aGUgYXBwcm9wcmlhdGUgJGx0eXBlLgoKMTAvMjIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvciBtZXRob2RzLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBCdWcgIzE3OTQyNDcgLSBmaXggZ2VuZXJhdGVkIGNvZGUgZm9yIGRlcml2ZWQgY2xhc3NlcyB3aGVuIGNzYmFzZSBvciBqYXZhYmFzZQogICAgICAgICAgICB0eXBlbWFwcyBhcmUgdXNlZCB3aXRoIHRoZSByZXBsYWNlPSIxIiBhdHRyaWJ1dGUuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBEb2NzIHVwZGF0ZWQgdG8gc3VnZ2VzdCB1c2luZyBkaXN0dXRpbHMuIFBhdGNoICMxNzk2NjgxIGZyb20gQ2hyaXN0b3BoZXIgQmFya2VyLgoKMTAvMTkvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gQ2xlYXIgZXJybm8gYmVmb3JlIGNhbGxzIHRvIHN0cnRvbCgpLCBzdHJ0b3VsKCksIHN0cnRvbGwoKQoJICAgIGFuZCBzdHJ0b3VsbCgpIHdoaWNoIHdlIGNoZWNrIGVycm5vIGFmdGVyIHRvIGF2b2lkIHNlZWluZyBhIGp1bmsKCSAgICB2YWx1ZSBvZiBlcnJubyBpZiB0aGVyZSBpc24ndCBhbiBlcnJvciBpbiB0aGUgY2FsbC4KCjEwLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSAlYXR0cmlidXRlX3JlZiBhbmQgcmVwbGFjZSB3aXRoICVhdHRyaWJ1dGVyZWYuIFRoZXJlIGlzIGp1c3QgYW4gYXJndW1lbnQKICAgICAgICAgICAgb3JkZXIgY2hhbmdlIGluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggJWF0dHJpYnV0ZSwgZnJvbToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEFjY2Vzc29yTWV0aG9kLCBBdHRyaWJ1dGVOYW1lKQogICAgICAgICAgICB0bwogICAgICAgICAgICAgICVhdHRyaWJ1dGVyZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEF0dHJpYnV0ZU5hbWUsIEFjY2Vzc29yTWV0aG9kKQoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtUY2xdIEZpeCBzZXZlcmFsIG9jdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbgoJICAgIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysKCSAgICBjb2RlLgoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtQSFBdIEZpeCBtYW55IG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbQoJICAgIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrIGNvZGUKCSAgICB3aGVuIGNvbXBpbGluZyB3aXRoIGEgbmV3IGVub3VnaCB2ZXJzaW9uIG9mIFBIUCA1ICh0ZXN0ZWQgd2l0aAoJICAgIFBIUCA1LjIuMywgYnV0IFBIUCA1LjIuMSBpcyBwcm9iYWJseSB0aGUgbWluaW11bSByZXF1aXJlbWVudCkuCgoxMC8xNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjMTc5NzEzMyBmcm9tIERhdmlkIFBpZXBncmFzcyBmaXhlcyAlYXR0cmlidXRlIHdoZW4gdGhlIGdldHRlciBoYXMgdGhlIHNhbWUgbmFtZQogICAgICAgICAgICBhcyB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIG5vIGxvbmdlciBnZW5lcmF0ZSBub24tZnVuY3Rpb25hbCBzZXR0ZXIgZm9yIHJlYWQtb25seSBhdHRyaWJ1dGVzLgoKMTAvMTUvMjAwNzogb2xseQoJICAgIFtUY2xdIFByZXZlbnQgU1dJR19UY2xfQ29udmVydFB0ciBmcm9tIGNhbGxpbmcgdGhlIHVua25vd24gcHJvYy4KCSAgICBBZGQgRXhhbXBsZXMvdGNsL3N0ZF92ZWN0b3IvIHdoaWNoIHRoaXMgY2hhbmdlIGZpeGVzLiAgUGF0Y2gKCSAgICBpcyBmcm9tICJDbGlmZiBDIiBpbiBTRiMxODA5ODE5LgoKMTAvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBEZXRhY2hDdXJyZW50VGhyZWFkIGJhY2sgaW4gZm9yIGRpcmVjdG9ycy4gU2VlIGVudHJ5IGRhdGVkIDA4LzExLzIwMDYgYW5kCiAgICAgICAgICAgIHNlYXJjaCBmb3IgRGV0YWNoQ3VycmVudFRocmVhZCBvbiB0aGUgbWFpbGluZyBsaXN0cyBmb3IgZGV0YWlscy4gVGhlIGNyYXNoZXMgb24gU29sYXJpcwogICAgICAgICAgICBzZWVtIHRvIGJlIG9ubHkgcHJlc2VudCBpbiBqZGstMS40LjIgYW5kIGxvd2VyIChqZGstMS41LjAgYW5kIGpkay0xLjYuMCBhcmUgb2theSksIHNvCiAgICAgICAgICAgIGFueW9uZSB1c2luZyBkaXJlY3RvcnMgc2hvdWxkIHVzZSBhIHJlY2VudCBqZGsgb24gU29sYXJpcywgb3IgZGVmaW5lIChzZWUgZGlyZWN0b3Iuc3dnKQogICAgICAgICAgICBTV0lHX0pBVkFfTk9fREVUQUNIX0NVUlJFTlRfVEhSRUFEIHRvIHRoZSBDKysgY29tcGlsZXIgdG8gZ2V0IG9sZCBiZWhhdmlvdXIuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlbiB0aGVyZSBhcmUgQyBjb21tZW50cyBpbiB0aGUganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcy4KCjEwLzEyLzIwMDc6IHd1enplYgoJICAgIEFkZGVkIGEgdGVzdHN1aXRlIGVudHJ5IGZvciBCdWcgIzE3MzU5MzEKCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBdXRvbWF0aWNhbGx5IHJlcnVuIGF1dG9nZW4uc2ggaWYgY29uZmlndXJlLmluIGlzIG1vZGlmaWVkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEVuaGFuY2UgY2hlY2stJS10ZXN0LXN1aXRlIHJ1bGUgYW5kIGZyaWVuZHMgdG8gZ2l2ZSBhIG1vcmUgaGVscGZ1bAoJICAgIGVycm9yIG1lc3NhZ2UgaWYgeW91IHRyeSB0aGVtIGZvciBhIGxhbmd1YWdlIHdoaWNoIGRvZXNuJ3QgZXhpc3QKCSAgICAoZS5nLiAibWFrZSBjaGVjay1waHAtdGVzdC1zdWl0ZSIgcmF0aGVyIHRoYW4gdGhlIGNvcnJlY3QKCSAgICAibWFrZSBjaGVjay1waHA0LXRlc3Qtc3VpdGUiKS4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBZGQgbWFrZSBydWxlIHRvIHJlZ2VuZXJhdGUgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5pbiBpZiBpdCBoYXMKCSAgICBjaGFuZ2VkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBsb25nLXN0YW5kaW5nIG1lbW9yeSBsZWFrIGluIHdyYXBwZWQgY29uc3RydWN0b3JzIGFuZAoJICAgIHdyYXBwZWQgZnVuY3Rpb25zL21ldGhvZHMgd2hpY2ggcmV0dXJuIGFuIG9iamVjdC4KCjEwLzA4LzIwMDc6IG9sbHkKCSAgICBGaXggTWFrZWZpbGUuaW4gdG8gcmVhZCBjaGVjay5saXN0IGZpbGVzIGNvcnJlY3RseSBpbiBhIFZQQVRICgkgICAgYnVpbGQuCgoxMC8wNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkCgowOS8yNy8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGFkZGVkIG1vcmUgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IHR5cGVjaGVja3MuCgkgICAgQWRkZWQgYSByb3V0aW5lIHdoaWNoIGNoZWNrcyB0aGUgZXhhY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGEgZnVuY3Rpb24KCSAgICAoYnJlYWtzIG9wZXJhdG9yX292ZXJsb2FkaW5nIGZvciB1bmFyeSBtaW51cyBvcGVyYXRvciwgY3VycmVudGx5IGRpc2FibGVkKS4KCSAgICBSZW9yZ2FuaXNlZCB0aGUgbHVhdHlwZW1hcHMuc3dnIHRvIHRpZHkgaXQgdXAuCgkgICAgQWRkZWQgYSBsb3Qgb2YgJWlnbm9yZXMgb24gdGhlIG9wZXJhdG9ycyBub3Qgc3VwcG9ydGVkIGJ5IGx1YS4KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBjb25zdGFudCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgJiBydW50ZXN0IGZvciBtZW1iZXJfcG9pbnRlci5pCgkgICAgQWRkZWQgZmlyc3QgdmVyc2lvbiBvZiB3Y2hhci5pCgowOS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIHRocm93cyB0eXBlbWFwcyBmb3Igc3RkOjp3c3RyaW5nIHVzaW5nIEMjIHBhdGNoICMxNzk5MDY0IGZyb20gRGF2aWQgUGllcGdyYXNzCgowOS8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSAjMTc3MTMxMyB0byBmaXggYnVnICMxNjUwMjI5IC0gZml4ZXMgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcKICAgICAgICAgICAgaGFuZGxpbmcuCgowOS8yMC8yMDA3OiBvbGx5CgkgICAgW0phdmFdIEVsaW1pbmF0ZSBzb21lIHVubmVjZXNzYXJ5IHVzZXMgb2YgYSB0ZW1wb3JhcnkgYnVmZmVyCgkgICAgYWxsb2NhdGVkIHVzaW5nIG5ld1tdLiAgU0YjMTc5NjYwOS4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICRjc2lucHV0IHNwZWNpYWwgdmFyaWFibGUgY2FuIGJlIHVzZWQgaW4gdGhlIGNzdmFyaW4gdHlwZW1hcCB3aGVyZSBpdCBpcyBhbHdheXMKICAgICAgICAgICAgZXhwYW5kZWQgdG8gJ3ZhbHVlJy4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGJ1ZyByZXBvcnRlZCBieSBHbGVubiBBIFdhdHNvbiBhbmQgIzE3OTUyNjAgd2hlcmUgdGhlIGNzdHlwZSB0eXBlbWFwIHVzZWQgdGhlICdyZWYnCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIHR5cGVtYXAgYm9keSwgaXQgcHJvZHVjZWQgdW5jb21waWxhYmxlIEMjIHByb3BlcnRpZXMgKHZhcmlhYmxlIHdyYXBwZXJzKS4KICAgICAgICAgICAgVGhlIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eSBub3cgY29ycmVjdGx5IGNvbWVzIGZyb20gdGhlICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgY3N0eXBlIHR5cGVtYXAuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGNvbnN0IHN0ZDo6d3N0cmluZyYgdHlwZW1hcHMKCjA5LzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcG9pbnRlciByZWZlcmVuY2UsIGVnIGluIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlIHBnY3BwCiAgICAgICAgICAgIGlzIGFsc28gZ2VuZXJhdGVkIG5vdyB3aGVuIHVzZXIncyBjdXN0b20gdHlwZW1hcHMgdXNlIGEgcHJveHkgY2xhc3MgaW4gdGhlIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFuZCBhICdsb25nJyBpbiB0aGUganR5cGUgdHlwZW1hcC4KCjA5LzE4LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlcnMgb2YgdHlwZSBzdGQ6OnN0cmluZyAmCgkgICAgd2hpY2ggYXJlIG1vZGlmaWVkIGJ5IHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNwbGl0IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5nIGxpdGVyYWxzIHRvIGF2b2lkIGhpdHRpbmcKCSAgICBNU1ZDJ3MgbG93IGZpeGVkIGxpbWl0IG9uIHN0cmluZyBsaXRlcmFsIGxlbmd0aCAtIHBhdGNoIGZyb20KCSAgICBTRiMxNzIzNzcwLCBhbHNvIHJlcG9ydGVkIGFzIFNGIzE2MzA4NTUuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW29jYW1sXSBGaXggcmVuYW1pbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzIGluIHRoZSBtZXRob2RfdGFibGUgLQoJICAgIG15IHBhdGNoIGZyb20gU0YjOTQwMzk5LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNpbXBsZXIgY29kZSBmb3IgU1dJR19Bc1ZhbF9ib29sKCkgd2hpY2ggZml4ZXMgYSAic3RyaWN0CgkgICAgYWxpYXNpbmciIHdhcm5pbmcgZnJvbSBHQ0MgLSBwYXRjaCBmcm9tIFNGIzE3MjQ1ODEgYnkgQW5kcmV3CgkgICAgQmF1bWFubi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIFVzZSBzdl9zZXRwdm4oKSB0byBzZXQgYSBzY2FsYXIgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aAoJICAgIC0gcGF0Y2ggZnJvbSBTRiMxNzQ0NjAgYnkgIm1hdHN1YmFyYXkiLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFdoZW4gd3JhcHBpbmcgQysrIGNvZGUsIGdlbmVyYXRlIGNvZGUgd2hpY2ggdXNlcwoJICAgIHN0ZDo6c3RyaW5nOjphc3NpZ24oUFRSLCBMRU4pIHJhdGhlciB0aGFuIGFzc2lnbmluZwoJICAgIHN0ZDo6c3RyaW5nKFBUUiwgTEVOKS4gIFVzaW5nIGFzc2lnbiBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZQoJICAgICh0ZXN0ZWQgd2l0aCBHQ0MgNC4xLjIpLgoKMDkvMDcvMjAwNzogd3NmdWx0b24KCSAgICBGaXggJWlnbm9yZSBvbiBjb25zdHJ1Y3RvcnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IGRlY2xhcmVkIFtTRiAjMTc3NzcxMl0KCjA5LzA1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIC0gQ2hhbmdlIHJfbHR5cGUgaW4gdHlwZXN5cy5jIHRvIHN0b3JlIGEgaGFzaHRhYmxlIGluc3RlYWQgb2YgYSBzaW5nbGUgdmFsdWUuCgkgICAgICBzZXZlcmFsIHZlcnkgc3VidGxlIGJ1Z3Mgd2VyZSBiZWluZyBjYXVzZWQgYnkgbXVsdGlwbGUgbHR5cGVzIGJlaW5nIG1hcHBlZAoJICAgICAgdG8gYSBzaW5nbGUgbWFuZ2xlZCB0eXBlLCBtb3N0bHkgd2hlbiB1c2luZyB0eXBlZGVmZWQgdGVtcGxhdGUgcGFyYW1ldGVycy4KCSAgICAgIE5vdywgcl9sdHlwZSBzdG9yZXMgYSBoYXNodGFibGUgb2YgcG9zc2libGUgbHR5cGVzLCBhbmQgd2hlbiBnZW5lcmF0aW5nIHRoZQoJICAgICAgdHlwZSB0YWJsZSwgYWxsIHRoZSBsdHlwZXMgYXJlIGFkZGVkIGludG8gdGhlIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZS4KCjA4LzMxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxNzU0OTY3IGZyb20gSmFtZXMgQmlnbGVyLgogICAgICAgICAgICAtIEZpeCBidWcgaW4gdHVybmluZyBvbiB3YXJuaW5ncyB0aGF0IHdlcmUgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBFZyAnc3dpZyAtdyszMDknIHdpbGwgbm93CiAgICAgICAgICAgICAgdHVybiBvbiB0aGUgbm9ybWFsbHkgc3VwcHJlc3NlZCB3YXJuaW5nIDMwOS4KCiAgICAgICAgICAgIC0gTmV3IC1XZXh0cmEgY29tbWFuZGxpbmUgb3B0aW9uIHdoaWNoIGVuYWJsZXMgdGhlIGV4dHJhIHdhcm5pbmcgbnVtYmVyczoKICAgICAgICAgICAgICAyMDIsMzA5LDQwMyw1MTIsMzIxLDMyMiAodGhpcyBpcyB0aGUgbGlzdCBvZiB3YXJuaW5ncyB0aGF0IGhhdmUgYWx3YXlzIGJlZW4gc3VwcHJlc3NlZCBieQogICAgICAgICAgICAgIGRlZmF1bHQpLiBCeSBzcGVjaWZ5aW5nIC1XZXh0cmEsIGFsbCB3YXJuaW5ncyB3aWxsIGJlIHR1cm5lZCBvbiwgYnV0IHVubGlrZSAtV2FsbCwKICAgICAgICAgICAgICB3YXJuaW5ncyBjYW4gc3RpbGwgYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9uL29mZiB1c2luZyAld2FybmZpbHRlciwKICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuIG9yIGZ1cnRoZXIgLXcgY29tbWFuZGxpbmUgb3B0aW9ucywgZWc6CiAgICAgICAgICAgICAgICBzd2lnIC1XZXh0cmEgLXczMDkKICAgICAgICAgICAgICB3aWxsIHR1cm4gb24gYWxsIHdhcm5pbmdzIGV4Y2VwdCAzMDkuCgowOC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICAtIE5ldyBkZWJ1Z2dpbmcgb3B0aW9ucywgLWRlYnVnLW1vZHVsZSA8bj4gYW5kIC1kZWJ1Zy10b3AgPG4+IHRvIGRpc3BsYXkgdGhlIHBhcnNlIHRyZWUgYXQKICAgICAgICAgICAgICB2YXJpb3VzIHN0YWdlcywgd2hlcmUgPG4+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc3RhZ2VzIDEtNC5Gb3IgZXhhbXBsZSwgdG8KICAgICAgICAgICAgICBkaXNwbGF5IHRvcCBvZiBwYXJzZSB0cmVlIGF0IHN0YWdlcyAxIGFuZCAzOgogICAgICAgICAgICAgICAgc3dpZyAtZGVidWctdG9wIDEsMwoKICAgICAgICAgICAgLSBEZXByZWNhdGUgdGhlIGZvbGxvd2luZyBvcHRpb25zIHdoaWNoIGhhdmUgZXF1aXZhbGVudHMgYmVsb3c6CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfbW9kdWxlICAgID0+ICAgLWRlYnVnLW1vZHVsZSAxCiAgICAgICAgICAgICAgLWR1bXBfbW9kdWxlICAgICAgICAgID0+ICAgLWRlYnVnLW1vZHVsZSA0CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfdG9wICAgICAgID0+ICAgLWRlYnVnLXRvcCAxCiAgICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgICAgICAgID0+ICAgLWRlYnVnLXRvcCA0CgogICAgICAgICAgICAtIFJlbmFtZWQgc29tZSBjb21tYW5kbGluZSBvcHRpb25zIGZvciBuYW1pbmcgY29uc2lzdGVuY3kgYWNyb3NzIGFsbCBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAgPT4gICAtZGVidWctdGVtcGxhdGUKICAgICAgICAgICAgICAtZGVidWdfdHlwZW1hcCAgID0+ICAgLWRlYnVnLXR5cGVtYXAKICAgICAgICAgICAgICAtZHVtcF9jbGFzc2VzICAgID0+ICAgLWRlYnVnLWNsYXNzZXMKICAgICAgICAgICAgICAtZHVtcF90YWdzICAgICAgID0+ICAgLWRlYnVnLXRhZ3MKICAgICAgICAgICAgICAtZHVtcF90eXBlZGVmICAgID0+ICAgLWRlYnVnLXR5cGVkZWYKICAgICAgICAgICAgICAtZHVtcF9tZW1vcnkgICAgID0+ICAgLWRlYnVnLW1lbW9yeQoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaGFuZGxpbmcgb2YgZG91YmxlIG9yIGZsb2F0IHBhcmFtZXRlcnMgd2l0aCBhbiBpbnRlZ2VyCgkgICAgZGVmYXVsdCB2YWx1ZS4KCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gR2VuZXJhdGUgX19pc3NldCgpIG1ldGhvZHMgZm9yIHNldHRlcnMgZm9yIFBIUCA1LjEgYW5kIGxhdGVyLgoKMDgvMjAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEZpeCBkaXJlY3RvciBidWcgIzE3NzY2NTEgcmVwb3J0ZWQgYnkgU3RlcGhhbmUgUm91dGVsb3VzIHdoaWNoIG9jY3VycmVkIHdoZW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IG9mIHNvbWUgb3RoZXIgc3ltYm9scyB1c2VkIHdpdGhpbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MuCgowOC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBDb3JyZWN0IGJlaGF2aW91ciBmb3IgdGVtcGxhdGVkIG1ldGhvZHMgdXNlZCB3aXRoICVyZW5hbWUgb3IgJWlnbm9yZSBhbmQgdGhlIGVtcHR5CiAgICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9uIC0gJXRlbXBsYXRlKCkuIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgdGhlIG1ldGhvZCBoYXMgbm90IGJlZW4KICAgICAgICAgICAgcmVuYW1lZC4KCjA4LzE2LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBOYW1lIGdlbmVyYXRlZCBjbCBmaWxlIGJhc2VkIG9uIGlucHV0IGZpbGUgcmF0aGVyIHRoYW4gYnkKCSAgICBtb2R1bGUgbmFtZS4gSXQgd2FzIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgbXlwYWNrYWdlLmNsIGFuZCBhIHRlc3Rfd3JhcC5jCgkgICAgd2hlbiBwYXJzaW5nIGEgdGVzdC5pIGlucHV0IGZpbGUuIENvbmZ1c2luZy4gQWxzbywgaW5jbHVkZSBleHRlcm5hbC1mb3JtYXQKCSAgICB0ZW1wbGF0ZXMgZm9yIDpmYXQgYW5kIDpmYXQtbGUgYXV0b21hdGljYWxseSB0byBhdm9pZCB0aGVzZSBiZWluZyBjb21waWxlZAoJICAgIGF0IHJ1bnRpbWUuCgowOC8xNS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIEFwcGx5IHBhdGNoICMxNzY2MDc2IGZyb20gTGVpZ2ggU21pdGggYWRkaW5nIHN1cHBvcnQgZm9yIG5ld2x5IGludHJvZHVjZWQKICAgICAgICAgICAgaW4gY2ZmaSA6bG9uZy1sb25nIGFuZCA6dW5zaWduZWQtbG9uZy1sb25nLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBkb2N1bWVudGF0aW9uIHBhdGNoICMxNzQzNTczIGZyb20gSmVmZnJleSBTb3JlbnNlbi4gSXQgY29udGFpbnMgYSBuZWF0CiAgICAgICAgICAgIGlkZWEgd2l0aCByZXNwZWN0IHRvIGJldHRlciBtZW1vcnkgbWFuYWdlbWVudCBieSB0aGUgSlZNIG9mIEMrKyBhbGxvY2F0ZWQgbWVtb3J5LgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGx5IHBhdGNoICMxNzcxNDEwIGZyb20gV2FkZSBCcmFpbmVyZCB0byBmaXggdHlwZWRlZiBYUyhTd2lnUGVybFdyYXBwZXIpIGluCiAgICAgICAgICAgIHBlcmxydW4uc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsIGJ1aWxkIDgyMiBhbmQgUGVybCA1LjguOSBhbmQgNS4xMCBicmFuY2hlcy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIGNvbnN0IGVudW0gcmVmZXJlbmNlIHR5cGVtYXBzIGZpeGVkLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIEMrKyBjbGFzcyBtZW1iZXIgcG9pbnRlcnMuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBzdXBwb3J0IGZvciAkb3duZXIgaW4gdGhlICJvdXQiIHR5cGVtYXBzIGxpa2UgaW4gdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiBOb3RlIHRoYXQgJG93bmVyIGhhcyBhbHdheXMgYmVlbiBzdXBwb3J0ZWQgaW4gdGhlICJqYXZhb3V0IiAvICJjc291dCIKICAgICAgICAgICAgdHlwZW1hcHMuCgowOC8wMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc21hcnQgcG9pbnRlciBoYW5kbGluZyBmb3IgY2xhc3NlcyB0aGF0IGhhdmUgdGVtcGxhdGVkIG1ldGhvZHMgd2l0aGluIHRoZSBzbWFydAogICAgICAgICAgICBwb2ludGVyIHR5cGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgY3JhaWdkbyBhdCBlZS53YXNoaW5ndG9uLmVkdS4KCjA3LzMxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbY2ZmaV0gZml4ZWQgbWVtb3J5IGFjY2VzcyBhZnRlciBiZWluZyBmcmVlZCBidWcuIHRoYW5rcyB0byBNYXJ0aW4gUGVyY29zc2kuCiAgICAgICAgICAgIHBhY2thZ2UgbmFtZSBjbG9zIGNoYW5nZWQgdG8gY2wuIHRoYW5rcyB0byBSYWxmIE1hdHRlcwoKMDcvMjQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgUGFyYWxsZWwgbWFrZSBzdXBwb3J0IGFkZGVkIGZvciB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgZm9yIGRldmVsb3BlcnMgd2hvIGhhdmUKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBDUFUuIE5vdyBwYXJhbGxlbCBtYWtlIGNhbiBiZSB1c2VkIGZvciBjaGVja2luZyBpbiBhZGRpdGlvbiB0byBidWlsZGluZwogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlLiBTb21lIHR5cGljYWwgY2hlY2tpbmcgZXhhbXBsZXM6CgogICAgICAgICAgICAgIG1ha2UgLWo4IC1rIGNoZWNrCiAgICAgICAgICAgICAgbWFrZSAtajQgY2hlY2stamF2YS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgbWFrZSAtajIgY2hlY2stamF2YS1leGFtcGxlcwoKMDcvMTkvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgRml4ZWQgYnVnIHRoYXQgc3RvcHBlZCBjb25maWd1cmUgd29ya2luZyBvbiBtaW5ndyAoYXBwbGllZCBkb3MydW5peCB0byBjb25maWd1cmUuaW4pCgowNy8xMC8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBFeHRyYSBjb21wYXRpYmlsaXR5IHdpdGggTHVhIDUuMSAodXBkYXRlZCBTV0lHX2luaXQsIGRvY3MsIGV4YW1wbGVzLCB0ZXN0IHN1aXRlKQoJICAgIFJlbW92ZWQgbmFtZSBjbGFzaCBmb3Igc3RhdGljIGxpbmsgb2YgbXVsdGlwbGUgbW9kdWxlcwoKMDcvMDUvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRml4IGEgYnVnIGluIFNXSUdfQUxMT0NfQVJSQVkoKQogICAgICAgICAgICBpbXByb3ZlZCB0aGUgZXJyb3IgbWVzc2FnZXMgZm9yIGluY29ycmVjdCBhcmd1bWVudHMuCiAgICAgICAgICAgIENoYW5nZWQgdGhlIG91dHB1dCBvZiBzd2lnX3R5cGUoKSB0byB1c2UgdGhlIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhlIHR5cGUsCgkgICAgcmF0aGVyIHRoYW4gdGhlIHJhdyBzd2lnIHR5cGUuCgowNy8wMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvcnMgZm9yIHNvbWUgb3ZlcmxvYWRlZCBtZXRob2RzIHdoZXJlIHRoZSBpbXR5cGUgcmVzdWx0ZWQgaW4gaWRlbnRpY2FsCiAgICAgICAgICAgIG1ldGhvZHMgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBDIyBkaXJlY3RvciBjbGFzcywgZWcgdm9pZCBmb28oaW50ICopIGFuZCB2b2lkIGZvbyhkb3VibGUgKikKICAgICAgICAgICAgdXNlZCB0byBnZW5lcmF0ZWQgdHdvIG9mIHRoZXNlOgoKICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgU3dpZ0RpcmVjdG9yZm9vKEludFB0ciBwKSB7IC4uLiB9CgowNi8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgcGFyYW1ldGVyIG5hbWUgY2hhbmdlcyBpbiBzdGRfdmVjdG9yLmkgYWxsb3dpbmcgYmV0dGVyIHRhcmdldGluZwogICAgICAgICAgICBvZiB0eXBlbWFwcyBmb3IgbWV0aG9kIHBhcmFtZXRlcnMgKGZvciBtZW1vcnkgbWFuYWdlbWVudCBvZiBjb250YWluZXJzIG9mIHBvaW50ZXJzKS4KCjA2LzA3LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCBmb3JlaWduLXR5cGUgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgbG9vayBmb3IgZmZpdHlwZSB0eXBlbWFwCgkgICAgYmluZGluZ3MuIGZpeCBpbm91dF90eXBlbWFwcy5pIGZvciBzdHJpbmdzLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtSdWJ5XQoJICAgIFVzZSB3aGljaGV2ZXIgb2YgImxvbmciIG9yICJsb25nIGxvbmciIGlzIHRoZSBzYW1lIHNpemUgYXMgInZvaWQqIgoJICAgIHRvIGhvbGQgcG9pbnRlcnMgYXMgaW50ZWdlcnMsIHJhdGhlciB0aGFuIHdoaWNoZXZlciBtYXRjaGVzIG9mZl90LgoJICAgIEZpeGVzIGNvbXBpbGF0aW9uIG9uIE9TIFggYW5kIEdDQyB3YXJuaW5ncyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBzaXplb2Yodm9pZCopIDwgc2l6ZW9mKG9mZl90KSAoU0YgcGF0Y2ggIzE3MzE5NzkpLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCBoYW5kbGluZyBvZiBhIHBhcnRpY3VsYXIgY2FzZSBpbnZvbHZpbmcgb3ZlcmxvYWRlZCBmdW5jdGlvbnMKCSAgICB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycy4KCjA2LzA1LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBjYXNlIHdoZXJlIHdlJ2QgcGFzcyBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllcnMKCSAgICAoaS5lLiBOUzE6Ok5TMjo6Rk9PKSB0byBzd2lnLWluc2VydC1pZC4gQWxsIG5hbWVzcGFjZXMKCSAgICBzaG91bGQgYmUgc3RyaXBwZWQuCgoJICAgIEZpeCBidWcgaW4gVHlwZWRlZkhhbmRsZXIgaW50cm9kdWNlZCBieSBsYXN0IGZpeC4KCjA2LzA1LzIwMDc6IG9sbHkKCSAgICBGaXggcmVwb3J0aW5nIG9mIGZpbGVuYW1lcyBpbiBlcnJvcnMgYWZ0ZXIgJWluY2x1ZGUgKHBhdGNoIGZyb20KCSAgICBMZWlnaCBTbWl0aCBpbiAjMTczMTA0MDsgYWxzbyByZXBvcnRlZCBhcyAjMTY5OTk0MCkuCgowNS8zMS8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggIm1pc3NpbmcgaW5pdGlhbGlzZXIiIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIEMvQysrCgkgICAgd3JhcHBlciBjb2RlIHdpdGggUHl0aG9uIDIuNSB3aXRoIHdhcm5pbmdzIGVuYWJsZWQgKHBhdGNoIGZyb20KCSAgICBidWcjMTcyNzY2OCBmcm9tIEx1a2UgTW9vcmUpLgoKMDUvMjkvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgU3BsaXQgZG9jc3RyaW5ncyBpbnRvIHNlcGFyYXRlIHN0cmluZyBsaXRlcmFscyBhdCBlYWNoIG5ld2xpbmUgd2hlbgoJICAgIGdlbmVyYXRpbmcgQy9DKysgd3JhcHBlciBjb2RlICh0aGUgQy9DKysgY29tcGlsZXIgd2lsbCBqdXN0IGNvbWJpbmUKCSAgICB0aGVtIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgbGl0ZXJhbCkuICBUaGlzIGF2b2lkcyBNU1ZDCgkgICAgY29tcGxhaW5pbmcgdGhhdCB0aGUgc3RyaW5ncyBhcmUgdG9vIGxvbmcgKHByb2JsZW0gcmVwb3J0ZWQgYnkKCSAgICBCbyBQZW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QpLgoKMDUvMjgvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRXNjYXBlIGJhY2tzbGFzaGVzIGluIGRvY3N0cmluZ3MuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggYXV0b2RvYyBnZW5lcmF0aW9uIG9mIGVudW1zIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUKCSAgICBlbnVtcyBhcmUgd3JhcHBlZCAtIHBhdGNoICMxNjk3MjI2IGZyb20gSm9zaCBDaGVycnkuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdCgkgICAgRml4IHdyYXBwaW5nIG9mIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSBwb2ludGVyIHRvIGEKCSAgICBjbGFzcyAoYnVnIzE3MDA3ODgpIGFuZCB0aG9zZSB3aGljaCBoYXZlIG92ZXJsb2FkZWQgZm9ybXMgcmV0dXJuaW5nCgkgICAgYm90aCBjbGFzc2VzIGFuZCBub24tY2xhc3NlcyAoYnVnIzE3MTI3MTcsIHRoYW5rcyB0byBTaW1vbgoJICAgIEJlcnRoaWF1bWUgZm9yIHRoZSBwYXRjaCkuCgowNS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlZCAlcmVuYW1lIGluY29uc2lzdGVuY3kgaW4gY29udmVyc2lvbiBvcGVyYXRvcnMgYXMgcmVwb3J0ZWQgYnkgWmhvbmcgUmVuLiBUaGUgbWF0Y2hpbmcKICAgICAgICAgICAgaXMgbm93IGRvbmUgb24gdGhlIG9wZXJhdG9yIG5hbWUgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IGlzIGRvbmUgZm9yIHBhcmFtZXRlcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKG9wQUJDKSBTcGFjZTo6QUJDOjpvcGVyYXRvciBBQkMoKSBjb25zdDsKICAgICAgICAgICAgICAlcmVuYW1lKG1ldGhvZEFCQykgU3BhY2U6OkFCQzo6bWV0aG9kKEFCQyBhKSBjb25zdDsKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgQUJDIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKEFCQyBhKSBjb25zdCB7fQogICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEFCQygpIGNvbnN0IHsgQUJDIGE7IHJldHVybiBhOyB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBxdWFsaWZ5aW5nIHRoZSBjb252ZXJzaW9uIG9wZXJhdG9yIHByZXZpb3VzbHkgbWF5IG9yIG1heSBub3QgaGF2ZSBtYXRjaGVkLgogICAgICAgICAgICBOb3cgaXQgZGVmaW5pdGVseSB3b24ndCwgc28gdGhpcyB3aWxsIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgU3BhY2U6OkFCQygpIGNvbnN0OwoKICAgICAgICAgICAgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhpcyBkb2VzIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChTcGFjZTo6QUJDIGEpIGNvbnN0OwoKICAgICAgICAgICAgVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQgd2l0aCByZXNwZWN0IHRvICVyZW5hbWUsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlcy4KICAgICAgICAgICAgQ29udmVyc2lvbiBvcGVyYXRvcnMgZG9jdW1lbnRhdGlvbiB0b28uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA1LzE2LzIwMDc6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYmFkIGdlbmVyYXRpb24gb2YgbG9jYWwgdmFyIGx0eXBlJ3MgaW4gZnVuY3Rpb25XcmFwcGVyKCkuCgkgICAgVHJ5IHRvIHdvcmsgYmV0dGVyIHdpdGggdGhlIGJhY2t3YXJkIG9yZGVyIGluIHdoaWNoIHN3aWcKCSAgICB1bnJvbGxzIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucy4KCSAgICBjbGVhbmVkIHVwIGEgbGl0dGxlIHVubmVjZXNzYXJ5IGNvZGUvZGVidWcgcHJpbnRmJ3MuCgkgICAgUmVtb3ZlIHdhcm5pbmcgd2hlbiByZXBsYWNpbmcgJGxkZXN0cnVjdG9yIGZvciBmZjpmb3JlaWduLXBvaW50ZXIKCjA1LzEyLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIHN3aWcgLXB5dGhvbiAtdGhyZWFkcyBub3cgZ2VuZXJhdGVzIEMvQysrIGNvZGUgd2hpY2ggdXNlcyBQeXRob24ncwoJICAgIG93biB0aHJlYWRpbmcgYWJzdHJhY3Rpb24gKGZyb20gcHl0aHJlYWQuaCkgcmF0aGVyIHRoYW4gT1Mgc3BlY2lmaWMKCSAgICBjb2RlLiAgVGhlIG9sZCBjb2RlIGZhaWxlZCB0byBjb21waWxlIG9uIE1TIFdpbmRvd3MuICAoU2VlIFNGIHBhdGNoCgkgICAgdHJhY2tlciAjMTcxMDM0MSkuCgowNS8wNC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIFNUTCByZW5hbWVzIHRvIGJlIGdsb2JhbCByZW5hbWVzLiAgVGhpcyBmaXhlcwoJICAgIFNUTCBmdW5jdGlvbnMgbm90IGJlaW5nIHJlbmFtZWQgd2hlbiBhdXRvcmVuYW1lIGlzIG9uLgogICAgICAgICAgICBUaGlzIGlzIGEgbm90IGEgdG90YWxseSBwZXJmZWN0IHdvcmstYXJvdW5kLCBidXQgYmV0dGVyLgoJICAgIFNvbWVvbmUgcmVhbGx5IG5lZWRzIHRvIGZpeCB0aGUgdGVtcGxhdGUgcmVuYW1pbmcgY29kZS4KCSAgICAoU2VlIGJ1ZyAjMTU0NTYzNCkKCjA1LzA0LzIwMDcgIGdnYQoJICAgIFtBbGxdCiAgICAgICAgICAgIENoYW5nZWQgJXJlbmFtZSgiJSh1bmRlcmNhc2UpcyIpIGEgbGl0dGxlIHNvIHRoYXQgc2luZ2xlCgkgICAgbnVtYmVycyBhdCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gYXJlIG5vdCB1bmRlcmNhc2VkLiAgVGhhdCBpczoKCQlnZXRTb21ldGhpbmcgLT4gZ2V0X3NvbWV0aGluZwoJCWdldDJECSAgICAgLT4gZ2V0XzJkCgkJZ2V0MjM0CSAgICAgLT4gZ2V0XzIzNAoJICAgIEJVVDoKCQlhc0Zsb2F0MiAgICAgLT4gYXNfZmxvYXQyCgkgICAgKEJ1ZyAjMTY5OTcxNCkKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgX19zd2lndHlwZV9fID0+IEBfX3N3aWd0eXBlX18gc28gaXQgY2FuIGJlIGFjY2Vzc2VkCgkgICAgZnJvbSB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIChhbmQgZm9sbG93cyBSdWJ5J3Mgb2ZmaWNpYWwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiwganVzdCBpbiBjYXNlKS4KCSAgICBNYWRlIHRyYWNraW5nID0+IEBfX3RyYWNraW5nc19fIGZvciBzYW1lIHJlYXNvbi4KCSAgICBDdXJyZW50bHkgc3RvcmluZyBpdmFycyB3aXRob3V0IHRoZSBAIHNlZW1zIHZhbGlkLCBidXQKCSAgICB0aGUgUGlja0F4ZSBzYXlzIHRoaXMgaXMgbm90IGNvcnJlY3QsIHNvIGp1c3QgaW4gY2FzZS4uLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQXBwbGllZCBwYXRjaCBmb3IgLW1pbmhlcml0IGJ1ZyBhbmQgZXhjZXB0aW9uIGNsYXNzZXMuCgkgICAgVGhpcyBpc3N1ZSBzaG91bGQgYmUgcmV2aXNpdGVkIG1vcmUgY2xvc2VseSwgYXMgTXVsdGlwbGUKCSAgICBJbmhlcml0YW5jZSBpbiBSdWJ5IGlzIHN0aWxsIHByb2JsZW1hdGljLgoJICAgIChwYXRjaC9idWcgIzE2MDQ4NzgpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucyBpbiBydWJ5IHdpbGwgbm93IHJlcG9ydCB0byB0aGUgdXNlcgogICAgICAgICAgICB0aGUgcG9zc2libGUgcHJvdG90eXBlcyB3aGVuIHRoZSB1c2VyIG1pc3R5cGVzIHRoZSBudW1iZXIgb3IKICAgICAgICAgICAgdHlwZSBvZiBhIHBhcmFtZXRlci4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZvcmdvdCB0byBkb2N1bWVudCB0aGUgYnVnIGZpeGluZyBvZiBhbiBvbGQgYnVnIHJlZ2FyZGluZwoJICAgIGV4Y2VwdGlvbnMuCgkgICAgKGJ1ZyAjMTQ1ODI0NykKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byB1c2UgdGhlIHByb3BlciBjc3Mgc3R5bGVzIGZvcgoJICAgIGVhY2ggc2VjdGlvbi4gQWRkZWQgYXV0b2RvYyBzZWN0aW9uIHRvIFJ1YnkncyBkb2NzIHRvCgkgICAgZG9jdW1lbnQgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSBSdWJ5IGluIGRvY3VtZW50aW5nIGl0cyBtb2R1bGVzLgoJICAgIE1hZGUgcmRvYyBkb2N1bWVudGF0aW9uIHNwaXQgb3V0IHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzICsKCSAgICBtZXRob2QgbmFtZS4gIEFsYmVpdCB0aGlzIHdpbGwgbWFrZSB0aGUgY3VycmVudCByZG9jIG5vdCByZWNvZ25pemUKICAgICAgICAgICAgdGhlIG1ldGhvZCwgdGhpcyBpcyBzdGlsbCBuZWVkZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gZGlmZmVyZW50CiAgICAgICAgICAgIGNsYXNzZXMgd2l0aCBzaW1pbGFyIG1ldGhvZHMgKHJkb2Mgd2FzIGNyZWF0ZWQgdG8gZG9jdW1lbnQgdGhlCgkgICAgcnVieSBzb3VyY2Ugd2hpY2ggb25seSBjb250YWlucyBvbmUgY2xhc3MgcGVyIGMgZmlsZSwgdW5saWtlIHN3aWcpCiAgICAgICAgICAgIEkgaGF2ZSBwYXRjaGVkIHJkb2MgdG8gbWFrZSBpdCBtb3JlIGZyaWVuZGx5IHRvIHN3aWcuICBUaGlzCiAgICAgICAgICAgIHBhdGNoIG5lZWRzIHRvIGJlIG1lcmdlZCBpbiB0aGUgcnVieSBzdGQgbGlicmFyeSBub3cuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIGZsYWcgLWZlYXR1cmUgdG8gYmUgLWluaXRfbmFtZSB0byBiZXR0ZXIgcmVmbGVjdCBpdHMKCSAgICBwdXJwb3NlIGFuZCBhdm9pZCBjb25mdXNpb24gd2l0aCAtZmVhdHVyZXMuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCBhdXRvZG9jIGdlbmVyYXRpb24uCgkgICAgQWRkZWQgYXV0b2RvYyAuc3dnIGZpbGVzIHRvIFJ1YnkgbGlicmFyeSBmb3IgZWFzaWx5IGFkZGluZwoJICAgIGRvY3VtZW50YXRpb24gdG8gY29tbW9uIFJ1YnkgbWV0aG9kcyBhbmQgU1RMIG1ldGhvZHMuCgkgICAgRml4ZWQgYXV0b2RvYyBkb2N1bWVudGluZyBvZiBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFuZCBtb2R1bGUuCgkgICAgTWFkZSB0ZXN0IHN1aXRlIGFsd2F5cyBnZW5lcmF0ZSBhdXRvZG9jcy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJlbW92ZWQgc29tZSB3YXJuaW5ncyBmcm9tIFNUTCBhbmQgdGVzdCBzdWl0ZS4KCjA1LzAyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGlzc3VlcyB3aXRoIEMrKyBjbGFzc2VzIGFuZCBoaWVyYWNoaWVzIGFjcm9zcyBtdWx0aXBsZQoJICAgIHNvdXJjZSBmaWxlcy4gRml4ZWQgaW1wb3J0cyB0ZXN0IGNhc2UgJiBhZGRlZCBydW4gdGVzdC4KCSAgICBBZGRlZCBFeGFtcGxlcy9pbXBvcnRzLgoJICAgIEFkZGVkIHR5cGVuYW1lIGZvciByYXcgbHVhX1N0YXRlKgoJICAgIEFkZGVkIGRvY3VtZW50YXRpb24gb24gbmF0aXZlIGZ1bmN0aW9ucy4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIERvY3N0cmluZ3MgYXJlIG5vdyBzdXBwb3J0ZWQuCgkgICAgJWZlYXR1cmUoImF1dG9kb2MiKSBhbmQgJWZlYXR1cmUoImRvY3N0cmluZyIpIGFyZSBub3cKCSAgICBwcm9wZXJseSBzdXBwb3J0ZWQgaW4gUnVieS4gIFRoZXNlIGZlYXR1cmVzIHdpbGwgZ2VuZXJhdGUKCSAgICBhIF93cmFwLmN4eCBmaWxlIHdpdGggcmRvYyBjb21tZW50cyBpbiB0aGVtLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgU1RMIGZpbGVzIGhhdmUgYmVlbiB1cGdyYWRlZCB0byBmb2xsb3cgdGhlIG5ldyBzd2lnL3B5dGhvbgoJICAgIExpYi9zdGQgY29udmVudGlvbnMuCgkgICAgVGhpcyBtZWFucyBzdGQ6OnZlY3Rvciwgc3RkOjpzZXQsIHN0ZDo6bWFwLCBzZXQ6Om11bHRpbWFwLAoJICAgIHN0ZDo6bXVsdGlzZXQsIHN0ZDo6ZGVxdWUgYW5kIHN0ZDo6c3RyaW5nIGFyZSBub3cgcHJvcGVybHkKCSAgICBzdXBwb3J0ZWQsIGluY2x1ZGluZyB0aGVpciBpdGVyYXRvcnMsIHN1cHBvcnQgZm9yIGNvbnRhaW5pbmcKCSAgICBydWJ5IG9iamVjdHMgKHN3aWc6OkdDX1ZBTFVFKSBhbmQgc2V2ZXJhbCBvdGhlciBydWJ5CgkgICAgZW5oYW5jZW1lbnRzLgoJICAgIHN0ZDo6Y29tcGxleCwgc3RkOjppb3MsIHN0ZDo6aW9zdHJlYW0sIHN0ZDo6aW9zdHJlYW1idWYgYW5kCgkgICAgc3RkOjpzc3RyZWFtIGFyZSBub3cgYWxzbyBzdXBwb3J0ZWQuCgkgICAgc3RkOjp3c3RyaW5nLCBzdGQ6Ondpb3MsIHN0ZDo6d2lvc3RyZWFtLCBzdGQ6Ondpb3N0cmVhbWJ1ZgoJICAgIGFuZCBzdGQ6Ondzc3RyZWFtIGFyZSBzdXBwb3J0ZWQgdmVyYmF0aW0gd2l0aCBubyB1bmljb2RlCgkgICAgY29udmVyc2lvbi4KCgkgICAgc3RkX3ZlY3Rvci5pIG5vdyBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIFJ1YnkgQXJyYXlzIG11Y2ggbW9yZQoJICAgIGNsb3NlbHksIHN1cHBvcnRpbmcgc2xpY2luZywgc2hpZnRpbmcsIHVuc2hpZnRpbmcsCiAgICAgICAgICAgIG11bHRpcGxlIGluZGV4aW5nIGFuZCBwcm9wZXIgcmV0dXJuIHZhbHVlcyBvbiBhc3NpZ25tZW50LgoKCSAgICBDT01QQVRBQklMSVRZIE5PVEU6IHRoaXMgY2hhbmdlcyB0aGUgb2xkZXIgYXBpIGEgbGl0dGxlIGJpdCBpbgoJICAgIHRoYXQgaW1wcm9wZXIgaW5kZXhpbmcgd291bGQgcHJldmlvdXNseSAoaW5jb3JyZWN0bHkpIHJhaXNlCgkgICAgZXhjZXB0aW9ucy4gIE5vdywgbmlsIGlzIHJldHVybmVkIGluc3RlYWQsIGZvbGxvd2luZyBydWJ5J3MKCSAgICBzdGFuZGFyZCBBcnJheSBiZWhhdmlvci4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgdGhlIHZhbHVlIG9mIFNXSUdfVFlQRUNIRUNLX0JPT0wgdG8gYmUgMTAwMDAgKGllLiBoaWdoZXIKCSAgICB0aGFuIHRoYXQgb2YgYWxsIGludGVnZXJzKS4KCSAgICBUaGlzIGlzIGJlY2F1c2UgUnVieSBhbGxvd3MgdHlwZWNhc3RpbmcKCSAgICBpbnRlZ2VycyBkb3duIHRvIGJvb2xlYW5zIHdoaWNoIGNhbiBtYWtlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIG9uCgkgICAgYm9vbHMgYW5kIGludGVnZXJzIHRvIGZhaWwuCgkgICAgKGJ1ZyMgMTQ4ODE0MikKCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIGEgc3VidGxlIGJ1ZyBpbiBtdWx0aXBsZSBhcmdvdXRzIHRoYXQgY291bGQgZ2V0IHRyaWdnZXJlZCBpZgoJICAgIHRoZSB1c2VyIHJldHVybmVkIHR3byBvciBtb3JlIGFyZ3VtZW50cyBhbmQgdGhlIGZpcnN0IG9uZSB3YXMgYW4KCSAgICBhcnJheS4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEltcHJvdmVkIHRoZSBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoZSBuZXcgZmVhdHVyZXMKICAgICAgICAgICAgYWRkZWQsIGFkZCBkaXJlY3RvcmluL291dC9hcmdvdXQgdHlwZW1hcHMsIGV0Yy4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFkZGVkICVpbml0c3RhY2sgYW5kICVpZ25vcmVzdGFjayBkaXJlY3RpdmVzIGZvciBkaXJlY3RvcgoJICAgIGZ1bmN0aW9ucy4gIFRoZXNlIGFsbG93IHlvdSB0byBjb250cm9sIHdoZXRoZXIgYSBkaXJlY3RvcgoJICAgIGZ1bmN0aW9uIHNob3VsZCByZS1pbml0IHRoZSBSdWJ5IHN0YWNrLgoJICAgIFRoaXMgaXMgc29tZXRpbWVzIG5lZWRlZCBmb3IgYW4gZW1iZWRkZWQgUnVieSB3aGVyZSB0aGUKCSAgICBkaXJlY3RvciBtZXRob2QgaXMgdXNlZCBhcyBhIEMrKyBjYWxsYmFjayBhbmQgbm90IGNhbGxlZAogICAgICAgICAgICBieSB0aGUgdXNlciBmcm9tIHJ1YnkgY29kZS4KCSAgICBFeHBsYW5hdGlvbjoKCSAgICBSdWJ5J3MgR0MgbmVlZHMgdG8gYmUgYXdhcmUgb2YgdGhlIHJ1bm5pbmcgT1Mgc3RhY2sgaW4gb3JkZXIgdG8KCSAgICBtYXJrIGFueSBWQUxVRSAoUnVieSBvYmplY3RzKSBpdCBmaW5kcyB0aGVyZSB0byBhdm9pZCBjb2xsZWN0aW9uCgkgICAgb2YgdGhlbS4gIFRoaXMgYWxsb3dzIHRoZSBydWJ5IEFQSSB0byBiZSB2ZXJ5IHNpbXBsZSBhbmQgYWxsb3dzCgkgICAgeW91IHRvIHdyaXRlIGNvZGUgbGlrZSAiVkFMVUUgYSA9IHN0aCIgYW55d2hlcmUgd2l0aG91dCBuZWVkaW5nCgkgICAgdG8gZG8gdGhpbmdzIGxpa2UgcmVmY291bnRpbmcgbGlrZSBweXRob24uCgkgICAgQnkgZGVmYXVsdCwgdGhlIHN0YXJ0IG9mIHRoZSBzdGFjayBpcyBzZXQgd2hlbiBydWJ5X2luaXQoKSBpcwoJICAgIGNhbGxlZC4gICBJZiBydWJ5IGlzIGluaXRlZCB3aXRoaW4gbWFpbigpLCBhcyBpdCB1c3VhbGx5IGlzIHRoZQoJICAgIGNhc2Ugd2l0aCB0aGUgbWFpbiBydWJ5IGV4ZWN1dGFibGUsIHJ1Ynkgd2lsbCBiZSBhYmxlIHRvIGNhbGN1bGF0ZQoJICAgIGl0cyBzdGFjayBwcm9wZXJseS4gIEhvd2V2ZXIsIHdoZW4gdGhpcyBpcyBub3QgcG9zc2libGUsIGFzIHdoZW4KCSAgICBydWJ5IGlzIGVtYmVkZGVkIGFzIGEgcGx1Z2luIHRvIGFuIGFwcGxpY2F0aW9uIHdoZXJlIG1haW4gaXMgbm90CgkgICAgYXZhaWxhYmxlLCBydWJ5X2luaXQoKSB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UsIGFuZAoJICAgIHJ1Ynkgd2lsbCBiZSBpbmNvcnJlY3RseSB0cmFja2luZyB0aGUgc3RhY2sgZnJvbSB0aGUgZnVuY3Rpb24KCSAgICB0aGF0IGNhbGxlZCBydWJ5X2luaXQoKSBmb3J3YXJkcyBvbmx5LCB3aGljaCBjYW4gbGVhZCB0bwoJICAgIGFsbCBzb3J0cyBvZiB3ZWlyZCBjcmFzaGVzIG9yIHRvIHJ1YnkgdGhpbmtpbmcgaXQgaGFzIHJ1biBvdXQgb2YKCSAgICBzdGFjayBzcGFjZSBpbmNvcnJlY3RseS4KCSAgICBUbyBhdm9pZCB0aGlzLCBkaXJlY3RvciAoY2FsbGJhY2spIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHRhZ2dlZAoJICAgIHRvIHRyeSB0byByZXNldCB0aGUgcnVieSBzdGFjaywgd2hpY2ggd2lsbCBzb2x2ZSB0aGUgaXNzdWVzLgoJICAgIE5PVEU6IHJ1YnkxLjguNiBzdGlsbCBjb250YWlucyBhIGJ1ZyBpbiBpdCBpbiB0aGF0IGl0cyBmdW5jdGlvbgoJICAgIHRvIHJlc2V0IHRoZSBzdGFjayB3aWxsIG5vdCBhbHdheXMgZG8gc28uICBUaGlzIGJ1ZyBpcyB0cmlnZ2VyZWQKCSAgICB2ZXJ5IHJhcmVseSwgd2hlbiBydWJ5IGlzIGNhbGxlZCBmcm9tIHR3byB2ZXJ5IGRpc3RpbmN0IHBsYWNlcwoJICAgIGluIG1lbW9yeSwgbGlrZSBhIGJyYW5jaCBvZiBtYWluKCkgYW5kIGFub3RoZXIgZHNvLiAgVGhpcyBidWcKCSAgICBoYXMgbm93IGJlZW4gcmVwb3J0ZWQgdG8gcnVieS1jb3JlIGFuZCBpcyBwZW5kaW5nIGZ1cnRoZXIKCSAgICBpbnZlc3RpZ2F0aW9uLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMzAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNzA3NTgyIC0gUmVzdG9yZSBidWlsZGluZyBmcm9tIHJlYWQtb25seSBzb3VyY2UgZGlyZWN0b3JpZXMuCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IHdpbGwgbm93IHJlcG9ydCB0aGUgcGFyYW1ldGVyIGluZGV4IHByb3Blcmx5IG9uIHR5cGUKCSAgICBlcnJvcnMgYXMgd2VsbCBhcyB0aGUgY2xhc3MgYW5kIHZhbHVlIG9mIHRoZSBpbmNvcnJlY3QKCSAgICBhcmd1bWVudCBwYXNzZWQuCgkgICAgKGZlYXR1cmUgcmVxdWVzdCAjMTY5OTY3MCkKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJ1Ynkgbm8gbG9uZ2VyIGNyZWF0ZXMgdGhlIGZyZWVfQ2xhc3MgZnVuY3Rpb24gaWYgdGhlIGNsYXNzCgkgICAgY29udGFpbnMgaXRzIG93biB1c2VyIGRlZmluZWQgZnJlZSBmdW5jdGlvbiAoJWZyZWVmdW5jKS4KCSAgICAoYnVnICMxNzAyODgyKQoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgTWFkZSBkaXJlY3RvcnMgcmFpc2UgYSBydWJ5IGV4Y2VwdGlvbiBmb3IgaW5jb3JyZWN0IGFyZ291dAoJICAgIHJldHVybmVkIHZhbHVlcyBpZiBSVUJZX0VNQkVEREVEIGlzIHNldCwgaW5zdGVhZCBvZiB0aHJvd2luZwoJICAgIGFuIGFjdHVhbCBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoJICAgIFRoaXMgd2lsbCBwcmV2ZW50IGNyYXNoZXMgd2hlbiBydWJ5IGlzIGVtYmVkZGVkIGFuZCB1bmF3YXJlCgkgICAgb2YgdGhlIFN3aWdEaXJlY3RvciBleGNlcHRpb24uCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHRoZSBuZWVkIGZvciAtRFNXSUdFWFRFUk4uCgkgICAgQ2hhbmdlZCBzd2lnX3J1YnlfdHJhY2tpbmdzIHRvIGJlIGEgc3RhdGljIHZhcmlhYmxlLCBidXQgYWxzbwoJICAgIGJlIGtlcHQgd2l0aGluIGEgaGlkZGVuIGluc3RhbmNlIHZhcmlhYmxlIGluIHRoZSBTV0lHIG1vZHVsZS4KCSAgICBUaGlzIGFsbG93cyBwcm9wZXJseSBkZWFsaW5nIHdpdGggdHJhY2tpbmdzIGFjcm9zcyBtdWx0aXBsZQoJICAgIERTT3MsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGJyb2tlbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBpbXByb3ZlbWVudCB0byBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XSBGaXhlZCBHQyBtZW1vcnkgaXNzdWVzIHdpdGggdHJhY2tpbmdzIHRoYXQgY291bGQgbGVhZAoJICAgIHRvIHNlZ2ZhdWx0cyB3aGVuIGRlYWxpbmcsIG1haW5seSwgd2l0aCBzdGF0aWMgdmFyaWFibGVzLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgU3RyaW5nIGNvbnZlcnNpb24gdXNpbmcgb2xkIHJ1YnkxLjYgbWFjcm9zLiAgTm93CgkgICAgU3RyaW5nVmFsdWVQdHIoKSBpcyB1c2VkIGlmIGF2YWlsYWJsZS4gIFRoaXMgcmVtb3ZlcyB3YXJuaW5ncwoJICAgIHdoZW4gY29udmVydGluZyBzdHJpbmdzIHdpdGggXDAgaW4gdGhlbS4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIHRoZSBhcmdvdXQgY291bnQgaW4gZGlyZWN0b3JzIGZvciBSdWJ5LiAgUHJldmlvdXNseSwKCSAgICBpZ25vcmVkIG9yICJudW1pbnB1dHM9MCIgdHlwZW1hcHMgd291bGQgaW5jb3JyZWN0bHkgbm90IGdldAoJICAgIGNvdW50ZWQgdG93YXJkcyB0aGUgYXJnb3V0IGNvdW50LgoJICAgIChidWcvcGF0Y2ggIzE1NDU1ODUpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBVcGdyYWRlZCBSdWJ5IGNvbnZlcnRlciB0byByZWNvZ25pemUgIm51bWlucHV0cz0wIi4gIFByZXZpb3VzbHksCgkgICAgb25seSB0aGUgb2xkICJpZ25vcmUiIGZsYWcgd2FzIGNoZWNrZWQgKHdoaWNoIHdvdWxkIGN1cnJlbnRseQoJICAgIHN0aWxsIHdvcmsgcHJvcGVybHksIGJ1dCBpcyBkZXByZWNhdGVkKS4KCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5IC0gYnV0IHNob3VsZCBiZSBtYWRlIGdlbmVyaWNdCgoJICAgICVmZWF0dXJlKCJudW1vdXRwdXRzIiwiMCIpIGFkZGVkLgoKCSAgICBUaGlzIGZlYXR1cmUgYWxsb3dzIHlvdSB0byBpZ25vcmUgdGhlIG91dHB1dCBvZiBhIGZ1bmN0aW9uIHNvCgkgICAgdGhhdCBpdCBpcyBub3QgYWRkZWQgdG8gYSBsaXN0IG9mIG91dHB1dCB2YWx1ZXMKCSAgICAoIGllLiBhcmdvdXRzICkuCgkgICAgVGhpcyBzaG91bGQgYWxzbyBiZWNvbWUgYSBmZWF0dXJlIG9mICV0eXBlbWFwKGRpcmVjdG9yb3V0KQoJICAgIGFzICJudW1vdXRwdXRzIj0wLCBqdXN0IGxpa2UgIm51bWlucHV0cyI9MCBleGlzdHMuCgoJICAgICVmZWF0dXJlKCJkaXJlY3RvcnMiPTEpCgoJICAgICVpbmNsdWRlIDx0eXBlbWFwcy5pPgoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSB7IENsYXNzOjptZW1iZXJfZnVuY3Rpb24xIH07CgkgICAgJXR5cGVtYXAob3V0KSBNU3RhdHVzIHsgLy8gc29tZSBjb2RlLCBsaWtlIGNoZWNrIG1zdGF0dXMKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmFpc2UgZXhjZXB0aW9uIGlmIHdyb25nIH07CgoJICAgICVpbmxpbmUgJXsKCSAgICAgIHR5cGVkZWYgaW50IE1TdGF0dXM7CgkgICAgICBjbGFzcyBDbGFzcyB7CgoJICAgICAgLy8gb25lIGFyZ3VtZW50IHJldHVybmVkLCBidXQgZGlyZWN0b3Igb3V0IGNvZGUgYWRkZWQKCSAgICAgIC8vIE1TdGF0dXMgaXMgZGlzY2FyZGVkIGFzIGEgcmV0dXJuIChvdXQpIHBhcmFtZXRlci4KCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24xKCBpbnQmIE9VVFBVVCApOwoKCSAgICAgIC8vIHR3byBhcmd1bWVudHMgcmV0dXJuZWQsIGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIG5vdCBkaXNjYXJkZWQKCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24yKCBpbnQmIE9VVFBVVCApOwoJICAgICAgfTsKICAgICAgICAgICAgJX0KCgowNC8yMS8yMDA3OiBvbGx5CgkgICAgRml4IHBhcnNpbmcgb2YgZmxvYXQgY29uc3RhbnRzIHdpdGggYW4gZXhwb25lbnQgKGUuZy4gMWUtMDJmKQoJICAgIChidWcgIzE2OTk2NDYpLgoKMDQvMjAvMjAwNzogb2xseQoJICAgIFtQeXRob25dIEZpeCBsYWNrIG9mIGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyB3aGVuIC1PIGlzIHVzZWQuCgkgICAgQWxzbywgZml4IGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyBjb250YWluaW5nIGEgZG91YmxlIHF1b3RlCgkgICAgY2hhcmFjdGVyLiAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gYnVnIzE3MDAxNDYuCgowNC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFN1cHBvcnQgZm9yIGFkZGluZyBpbiBKYXZhL0MjIGNvZGUgYmVmb3JlIGFuZCBhZnRlciB0aGUgaW50ZXJtZWRpYXJ5IGNhbGwsCiAgICAgICAgICAgIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHRoZSBtYXJzaGFsbGluZyBvZiB0aGUgcHJveHkgdHlwZSB0byB0aGUgaW50ZXJtZWRpYXJ5IHR5cGUuCiAgICAgICAgICAgIFRoZSBqYXZhaW4vY3NpbiB0eXBlbWFwIG5vdyBzdXBwb3J0cyB0aGUgJ3ByZScgYW5kICdwb3N0JyBhdHRyaWJ1dGVzIHRvIGFjaGlldmUgdGhpcy4KICAgICAgICAgICAgVGhlIGphdmFpbiB0eXBlbWFwIGFsc28gc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ3BnY3BwbmFtZScgYXR0cmlidXRlIGZvciBwcmVtYXR1cmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIG5hbWluZyBhbmQgdGhlIGNzaW4gdHlwZW1hcCBzdXBwb3J0cyBhbiBvcHRpb25hbCAnY3NoaW4nCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIHBhcmFtZXRlciB0eXBlIHVzZWQgaW4gYSBjb25zdHJ1Y3RvciBoZWxwZXIgZ2VuZXJhdGVkIHdoZW4gdGhlIHR5cGUgaXMgdXNlZAogICAgICAgICAgICBpbiBhIGNvbnN0cnVjdG9yLiBEZXRhaWxzIGluIHRoZSBKYXZhLmh0bWwgYW5kIENTaGFycC5odG1sIGRvY3VtZW50YXRpb24uCgowNC8xNi8yMDA3OiBvbGx5CgkgICAgRG9uJ3QgdHJlYXQgYHJlc3RyaWN0JyBhcyBhIHJlc2VydmVkIGlkZW50aWZpZXIgaW4gQysrIG1vZGUKCSAgICAoYnVnIzE2ODU1MzQpLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaG93IHplbmRfdGhyb3dfZXhjZXB0aW9uKCkgaXMgY2FsbGVkIChidWcgIzE3MDA3ODUpLgoKMDQvMTAvMjAwNzogb2xseQoJICAgIERlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRvIHRlbXBsYXRlIGZvciBhQ0MgKHJlcG9ydGVkIG9uCgkgICAgc3dpZy11c2VyIHRoYXQgdGhpcyBpcyBuZWVkZWQpLgoKMDQvMDQvMjAwNzogb2xseQoJICAgIFtQSFA1XSBJZiBaVFMgaXMgZW5hYmxlZCwgcmVsZWFzZSA8bW9kdWxlPl9nbG9iYWxzX2lkIGluIE1TSFVURE9XTgoJICAgIHRvIGF2b2lkIFBIUCBpbnRlcnByZXRlciBjcmFzaCBvbiBzaHV0ZG93bi4gIFRoaXMgc29sdXRpb24gd2FzCgkgICAgc3VnZ2VzdGVkIGhlcmU6IGh0dHA6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD00MDk4NQoKMDQvMDMvMjAwNzogb2xseQoJICAgIFtQSFA0XSBBZGQgbWlzc2luZyBaVFMgYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGVkIEMrKyB3cmFwcGVyIGNvZGUKCSAgICB0byBmaXggY29tcGlsYXRpb24gZmFpbHVyZXMgd2hlbiB1c2luZyBaVFMgZW5hYmxlZCBTV0lHIChMaW51eAoJICAgIGRpc3RyaWJ1dGlvbnMgdGVuZCB0byBkaXNhYmxlIFpUUywgYnV0IG5vdGFibHkgdGhlIFdpbmRvd3MgYnVpbGQKCSAgICB1c2VzIGl0IGJ5IGRlZmF1bHQpLgoKMDQvMDEvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY4NDI2MTogZml4ZXMgaGFuZGxpbmcgb2YgdW5zaWduZWQgaW50IGxpdGVyYWxzLCB0aGFua3MgTGVpZ2ggU21pdGguCiAgICAgICAgICAgIEFsc28sIGltcHJvdmVkIGRvY3VtZW50YXRpb24uCgowMy8zMC8yMDA3OiBvbGx5CgkgICAgQXZvaWQgZ2VuZXJhdGluZyAnPDonIHRva2VuIHdoZW4gdXNpbmcgU3dpZ1ZhbHVlV3JhcHBlcjw+IG9uIGEgdHlwZQoJICAgIHdoaWNoIHN0YXJ0cyB3aXRoICc6OicgKHBhdGNoICMxNjkwOTQ4KS4KCjAzLzI1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtwZXJsNV0gQWRkIFNXSUdfZmFpbCB0byB0aGUgU1dJR19leGNlcHRpb24gbWFjcm8uICBGaXhlcyBhIGZldyBwcm9ibGVtcyByZXBvcnRlZAoJICAgIG9uIHRoZSBtYWlsaW5nIGxpc3QuCgowMy8yMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBTdHJpbmcgY29weWluZyBwYXRjaCBmcm9tIEpvc2ggQ2hlcnJ5IHJlZHVjaW5nIG1lbW9yeSBjb25zdW1wdGlvbiBieSBhYm91dCAyNSUuCgowMy8yMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzE2MzE5ODcgZnJvbSBVbHJpayBQZXRlcnNvbiAtIGJvb2wgSU5PVVQgdHlwZW1hcHMKICAgICAgICAgICAgZmFpbCBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLgoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCBnaXZlbiBkb2RneSBDKysgY29kZTogbmFtZXNwYWNlIGFiYzo6ZGVmIHsgfQoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHNvIHRoYXQgQVJSQVlTT0ZDTEFTU0VTIGFuZCBBUlJBWVNPRkVOVU1TIGluIGFycmF5c19qYXZhLmkgY2FuIGJlIGFwcGxpZWQKICAgICAgICAgICAgdG8gcG9pbnRlciB0eXBlcy4KCjAzLzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gV2hlbiB3ZSBrbm93IHRoZSBsaXRlcmFsIG51bWVyaWMgdmFsdWUgZm9yIGEgY29uc3RhbnQsIHVzZQoJICAgIHRoYXQgdG8gaW5pdGlhbGlzZSB0aGUgY29uc3QgbWVtYmVyIGluIHRoZSBQSFAgd3JhcHBlciBjbGFzcy4KCjAzLzAyLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IFBIUCB3cmFwcGVyIGNvZGUgZ2VuZXJhdGVkIGZvciBjZXJ0YWluIGNhc2VzIG9mCgkgICAgb3ZlcmxvYWRlZCBmb3JtcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLgoKMDIvMjYvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY1NjM5NTogZml4ZWQgaGV4IGFuZCBvY3RhbCB2YWx1ZXMgYnVnLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4KCjAyLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGJ1ZyBpbiB0eXBlbWFwcyB3aGljaCBjYXVzZWQgZGVyaXZlZF9ieXZhbHVlIGFuZCBybmFtZSB0ZXN0IGNhc2VzIHRvIGZhaWwuCgkgICAgVXBkYXRlZCBkZXJpdmVkX2J5dmFsdWUuaSB0byBleHBsYWluIGhvdyB0byBmaW5kIGFuZCBmaXggdGhlIHByb2JsZW0KCjAxLzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUzODUyMiBhbmQgIzEzMzg1MjcsIGZvcndhcmQgdGVtcGxhdGVkIGNsYXNzIGRlY2xhcmF0aW9ucyB3aXRob3V0IGEKICAgICAgICAgICAgbmFtZSBmb3IgdGhlIHRlbXBsYXRlZCBjbGFzcyBwYXJhbWV0ZXJzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIGNsYXNzPiBjbGFzcyBYOwoKMDEvMjMvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGF0Y2ggIzE2NDA4NjI6IDxtYWxsb2MuaD4gcmVwbGFjZWQgYnkgPHN0ZGxpYi5oPgoJICAgIFBhdGNoICMxNTk4MDYzIFR5cG8gaW4gdHlwZW1hcHMuaQoKMDEvMjIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBsdWEgc3BlY2lmaWMgY2FycmF5cy5pIHdoaWNoIGFkZHMgdGhlIG9wZXJhdG9yW10gc3VwcG9ydC4KCSAgICBtb2RpZmllZCB0aGUgbWFpbiBjb2RlIHRvIG1ha2UgaXQgbm90IGVtaXQgYWxsIHRoZSBjbGFzcyBtZW1iZXIgZnVuY3Rpb25zICYgYWNjZXNzb3JzCgkgICAgTm90ZTogQyBzdHJ1Y3RzIGFyZSBjcmVhdGVkIHVzaW5nIG5ld19YWFgoKSB3aGlsZSBDKysgY2xhc3NlcyB1c2UgWFhYKCkgKHNob3VsZCBiZSBzdGFuZGFyZGlzZWQpCgkgICAgVXBkYXRlZCB0ZXN0IGNhc2U6IGxpX2NhcnJheXMKCSAgICBVcGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uLgoKMDEvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkIHN1cHBvcnQgZm9yIG5ld2ZyZWUgdHlwZW1hcHMgKHNvbWV0aW1lcyB1c2VkIGJ5ICVuZXdvYmplY3QpCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC1tYWNyb2Vycm9ycy4gICBXaGVuIHN1cHBsaWVkLCB0aGlzIHdpbGwgZm9yY2UKICAgICAgICAgICAgdGhlIEMgc2Nhbm5lci9wYXJzZXIgdG8gcmVwb3J0IHByb3BlciBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgY29kZSBjb250YWluZWQKICAgICAgICAgICAgaW5zaWRlIFNXSUcgbWFjcm9zIChkZWZpbmVkIHdpdGggJWRlZmluZSkuICBCeSBkZWZhdWx0LCBTV0lHIG1lcmVseSByZXBvcnRzCiAgICAgICAgICAgIGVycm9ycyBvbiB0aGUgbGluZSBhdCB3aGljaCBhIG1hY3JvIGlzIHVzZWQuICBXaXRoIHRoaXMgb3B0aW9uLCB5b3UKICAgICAgICAgICAgY2FuIGV4cGFuZCB0aGUgZXJyb3IgYmFjayB0byBpdHMgc291cmNlLS0tc29tZXRoaW5nIHdoaWNoIG1heSBzaW1wbGlmeQogICAgICAgICAgICBkZWJ1Z2dpbmcuCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdIE1ham9yIG92ZXJoYXVsIG9mIEMvQysrIHNjYW5uaW5nIGltcGxlbWVudGF0aW9uLiAgRm9yIHF1aXRlCiAgICAgICAgICAgIHNvbWUgdGltZSwgU1dJRyBjb250YWluZWQgdHdvIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgQy9DKysgdG9rZW5pemVycy0tCiAgICAgICAgICAgIHRoZSBsZWdhY3kgc2Nhbm5lciBpbiBDUGFyc2UvY3NjYW5uZXIuYyBhbmQgYSBnZW5lcmFsIHB1cnBvc2Ugc2Nhbm5lcgogICAgICAgICAgICBpbiBTd2lnL3NjYW5uZXIuYy4gU1dJRyBzdGlsbCBoYXMgdHdvIHNjYW5uaW5nIG1vZHVsZXMsIGJ1dCB0aGUgQyBwYXJzZXIKICAgICAgICAgICAgc2Nhbm5lciAoQ1BhcnNlL2NzY2FubmVyLmMpIG5vdyByZWxpZXMgdXBvbiB0aGUgZ2VuZXJhbCBwdXJwb3NlCiAgICAgICAgICAgIHNjYW5uZXIgZm91bmQgaW4gU3dpZy9zY2FubmVyLmMuICBBcyBhIHJlc3VsdCwgaXQgaXMgbXVjaCBzbWFsbGVyIGFuZAogICAgICAgICAgICBsZXNzIGNvbXBsaWNhdGVkLiAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBtYWludGFpbiBhbGwKICAgICAgICAgICAgb2YgdGhlIGxvdy1sZXZlbCBDIHRva2VuaXppbmcgaW4gb25lIGNlbnRyYWwgbG9jYXRpb24gaW5zdGVhZCBvZiB0d28KICAgICAgICAgICAgcGxhY2VzIGFzIGJlZm9yZS4KCiAgICAgICAgICAgICoqKlBPVEVOVElBTCBGTEFLSU5FU1MqKioKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGNhdXNlIHByb2JsZW1zIHdpdGggYWNjdXJhdGUgbGluZSBudW1iZXIgcmVwb3J0aW5nCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZXJyb3IgcmVwb3J0aW5nIG1vcmUgZ2VuZXJhbGx5LiBJIGhhdmUgdHJpZWQgdG8gcmVzb2x2ZSB0aGlzCiAgICAgICAgICAgIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCB0aGVyZSBtaWdodCBiZSBzb21lIGNvcm5lciBjYXNlcy4KCjAxLzEyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIHR5cGVtYXAgdGhyb3dzIGZvciBzdGQ6OnN0cmluZyosIHR5cGVtYXAgZm9yIFNXSUdUWVBFIERZTkFNSUMsCgkgICAgY2hhbmdlZCB0aGUgZXhpc3RpbmcgdGhyb3dzIHR5cGVtYXAgdG8gdGhyb3cgYSBzdHJpbmcgaW5zdGVhZCBvZiBtYWtpbmcgYSBjb3B5IG9mCgkgICAgdGhlIG9iamVjdCAodXBkYXRpbmcgYSBmZXcgdGVzdCBjYXNlcyB0byBkZWFsIHdpdGggdGhlIGNoYW5nZSkuCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBkeW5hbWljX2Nhc3RzLCBleGNlcHRpb25fcGFydGlhbF9pbmZvLCBsaV9zdGRfc3RyaW5nLCBzaXplX3QKCjAxLzAzLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgW0ludGVybmFsc10uICBVc2Ugb2Ygc3dpZ2tleXMuYy8uaCB2YXJpYWJsZXMgaXMgcmV2b2tlZC4gIFBsZWFzZSB1c2UKICAgICAgICAgICAgc2ltcGxlIHN0cmluZ3MgZm9yIGF0dHJpYnV0ZSBuYW1lcy4KCjEyLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgSW50ZXJuYWwgQVBJIGZ1bmN0aW9ucyBIYXNoR2V0QXR0cigpIGFuZCBIYXNoQ2hlY2tBdHRyKCkgaGF2ZSBiZWVuIHJldm9rZWQuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgR2V0YXR0cigpIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMuICBUaGUgZnVuY3Rpb24gQ2hlY2thdHRyKCkgY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gY2hlY2sgYXR0cmlidXRlcy4gIE5vdGU6ICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJldm9rZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGV5IG9ubHkgYWRkZWQgYSBtYXJnaW5hbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhdCB0aGUgZXhwZW5zZQogICAgICAgICAgICBjb2RlIGNsYXJpdHkuCgoxMi8yNi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBtb3JlIFNUTCAobW9yZSBleGNlcHRpb25zLCBtYXAsIHNpemVfdCksCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBjb252ZXJzaW9uX25zX3RlbXBsYXRlLgoKMTIvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gVXBkYXRlIHRvIHRocm93IGVycm9ycyB3aGVuIHNldHRpbmcgaW1tdXRhYmxlcywKCSAgICBhbmQgYWxsb3dpbmcgdXNlciBhZGRpdGlvbiBvZiBtb2R1bGUgdmFyaWFibGVzLgoKMTIvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVkZWYnZCB2YXJpYWJsZSB3cmFwcGVycyB0aGF0IHVzZSAlbmF0dXJhbHZhciwgZWcsIHN0ZDo6c3RyaW5nLgoKMTIvMTQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90IHR5cGVtYXBzCgoxMi8xNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IGJ1ZyAjMTYxMzY3MyAoYmFkIFBIUDUgY29kZSBnZW5lcmF0ZWQgZm9yIGdldHRlcnMgYW5kCgkgICAgc2V0dGVycykuCgoxMi8wMi8yMDA2OiB3c2Z1bHRvbiwgSm9obiBMZW56LCBEYXZlIEJlYXpsZXkKICAgICAgICAgICAgTW92ZSBmcm9tIGN2cyB0byBTdWJ2ZXJzaW9uIGZvciBzb3VyY2UgY29udHJvbAoKMTEvMzAvMjAwNjogYmVhemxleQogICAgICAgICAgICBDbGVhbmVkIHVwIHN3aWd3YXJuaW5ncy5zd2cgZmlsZSBub3QgdG8gdXNlIG5lc3RlZCBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9ucy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGZvciAlZXh0ZW5kIHRvIHdvcmsgZm9yIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzLgoKVmVyc2lvbiAxLjMuMzEgKE5vdmVtYmVyIDIwLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xMi8yMDA2OiBMdWlnaSBCYWxsYWJpbwogICAgICAgICAgICBbUHl0aG9uXSBBbHRlcm5hdGUgZml4IGZvciBQeXRob24gZXhjZXB0aW9ucyBidWcgIzE1NzgzNDYgKHRoZSBwcmV2aW91cyBvbmUgYnJva2UgUHl0aG9uCiAgICAgICAgICAgIHByb3BlcnRpZXMgaW4gbW9kZXJuIGNsYXNzZXMpCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICAtZmFrZXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uIG5vdyBnZW5lcmF0ZXMgdGhlIGZha2UgdmVyc2lvbiBpbnRvIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBkaXNwbGF5aW5nIGl0IHdoZW4gdGhlIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBpcyB1c2VkLgoKMTQvMTEvMjAwNjogbWdvc3NhZ2UKCSAgICBbbHVhXSB1cGRhdGUgdG8gdHlwZW1hcCBmb3Igb2JqZWN0IGJ5IHZhbHVlLCB0byBtYWtlIGl0IGM4OSBjb21wbGlhbnQKClZlcnNpb24gMS4zLjMwIChOb3ZlbWJlciAxMywgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW2phdmFdIFJlbW92ZSBEZXRhY2hDdXJyZW50VGhyZWFkIHBhdGNoIGZyb20gIDA4LzExLzIwMDYgLSBpdCBjYXVzZXMgc2VnZmF1bHRzCiAgICAgICAgICAgIG9uIHNvbWUgc3lzdGVtcy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtweXRob25dIEZpeCAjMTU3ODM0NiAtIFB5dGhvbiBleGNlcHRpb25zIHdpdGggLW1vZGVybgoKMTEvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTkzMjkxIC0gU21hcnQgcG9pbnRlcnMgYW5kIGluaGVyaXRpbmcgZnJvbSB0ZW1wbGF0ZXMgCgoxMS8wOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlyZWN0b3Igb3BlcmF0b3IgcG9pbnRlci9yZWZlcmVuY2UgY2FzdHMgLSAjMTU5MjE3My4KCjExLzA3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAkc2VsZiBzcGVjaWFsIHZhcmlhYmxlIGZvciAlZXh0ZW5kIG1ldGhvZHMuIFBsZWFzZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGp1c3QgJ3NlbGYnCiAgICAgICAgICAgIGFzIHRoZSBDKysgJ3RoaXMnIHBvaW50ZXIuCgoxMS8wNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdIAoJICAgIGFsbGVncm9jbC5zd2c6IHN3aWctZGVmdmFyIHVwZGF0ZWQgdG8gYWxsb3cgc3BlY2lmeWluZyBvZgoJICAgIAkJICAgbm9uLWRlZmF1bHQgZm9yZWlnbiB0eXBlICh2aWEgOmZ0eXBlIGtleXdvcmQgYXJnKS4KCSAgICBhbGxlZ3JvY2wuY3h4OiBTcGVjaWZ5IHByb3BlciBhY2Nlc3MgdHlwZSBmb3IgZW51bSB2YWx1ZXMuCgoxMS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YS9DI10gRml4IGNvbnN0IHN0ZDo6c3RyaW5nJiByZXR1cm4gdHlwZXMgZm9yIGRpcmVjdG9ycyBhcyByZXBvcnRlZCBieQogICAgICAgICAgICBNYXJrIERvbnNlbHptYW5uCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIERlbGV0ZUxvY2FsUmVmIGZyb20gZW5kIG9mIGRpcmVjdG9yIG1ldGhvZHMgZm9yIG5vdyBhcyBpdCBpcyBjYXVzaW5nIGEKICAgICAgICAgICAgc2VnIGZhdWx0IHdoZW4gcnVuIG9uIFNvbGFyaXMgOC4KCjEwLzI5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gUGF0Y2ggZnJvbSBDaHJpcyBTaG9lbWFrZXIgdG8gY2xlYW4gdXAgc29tZSB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSW1wb3J0YW50IGZpeCB0byBwcmV2ZW50IGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiB0aGUgSmF2YSBwcm94eSBjbGFzcwogICAgICAgICAgICB3aGlsZSBpdCBpcyBiZWluZyB1c2VkIGluIGEgbmF0aXZlIG1ldGhvZC4gVGhlIGZpbmFsaXplciBjb3VsZCBkZXN0cm95IHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAgIEMrKyBvYmplY3Qgd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQuIFRoZSBwcm9ibGVtIG9jY3VycyB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBubwogICAgICAgICAgICBsb25nZXIgc3Ryb25nbHkgcmVhY2hhYmxlIGFmdGVyIGEgbmF0aXZlIGNhbGwuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBvY2N1ciBpbgogICAgICAgICAgICBtZW1vcnkgc3RyZXNzIHNpdHVhdGlvbnMgb24gc29tZSBKVk1zLiBJdCBkb2VzIG5vdCBzZWVtIHRvIG9jY3VyIG9uIHRoZQogICAgICAgICAgICBTdW4gY2xpZW50IEpWTSB1cCB0byBqZGsgMS41LiBIb3dldmVyIHRoZSAxLjYgY2xpZW50IGpkayBoYXMgYSBtb3JlIGFnZ3Jlc3NpdmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0b3IgYW5kIHNvIHRoZSBwcm9ibGVtIGRvZXMgb2NjdXIuIEl0IGRvZXMgb2NjdXIgb24gdGhlIFN1biBzZXJ2ZXIKICAgICAgICAgICAgSlZNcyAoY2VydGFpbmx5IDEuNCBvbndhcmRzKS4gVGhlIGZpeCBlbnRhaWxzIHBhc3NpbmcgdGhlIHByb3h5IGNsYXNzIGludG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gYWRkaXRpb24gdG8gdGhlIEMrKyBwb2ludGVyIGluIHRoZSBsb25nIHBhcmFtZXRlciwgYXMgSmF2YSBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgICAgY29sbGVjdGVkIHdoZW4gdGhleSBhcmUgcGFzc2VkIGludG8gSk5JIG1ldGhvZHMuIFRoZSBleHRyYSBwYXJhbWV0ZXIgY2FuIGJlIHN1cHByZXNzZWQKICAgICAgICAgICAgYnkgc2V0dGluZyB0aGUgbm9wZ2NwcCBhdHRyaWJ1dGUgaW4gdGhlIGp0eXBlIHR5cGVtYXAgdG8gIjEiIG9yIHVzaW5nIHRoZSBuZXcgLW5vcGdjcHAKICAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgU2VlIEphdmEuaHRtbCNqYXZhX3BnY3BwIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gdGhpcyB0b3BpYy4KCjEwLzI0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHNtYXJ0IHBvaW50ZXIgd3JhcHBlcnMuIFRoZSB2aXJ0dWFsL292ZXJyaWRlL25ldyBrZXl3b3JkIGlzIG5vdCBnZW5lcmF0ZWQKICAgICAgICAgICAgZm9yIGVhY2ggbWV0aG9kIGFzIHRoZSBzbWFydCBwb2ludGVyIGNsYXNzIGRvZXMgbm90IG1pcnJvciB0aGUgdW5kZXJseWluZyBwb2ludGVyCiAgICAgICAgICAgIGNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gU0YgIzE0OTY1MzUKCjEwLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIG5hdGl2ZSBtZXRob2RzICYgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgogICAgICAgICAgICBmaXhlZCB0ZXN0IGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzICYgY3BwX2Jhc2ljLiBBZGRlZCBuZXcgZXhhbXBsZSAoZnVuY3RvcikuCiAgICAgICAgICAgIHRpZGllZCB1cCBhIGxpdHRsZSBvZiB0aGUgY29kZSAoYXJvdW5kIGNsYXNzSGFuZGxlcikuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIGRpcmVjdG9yb3V0IHR5cGVtYXAgY2hhbmdlcyB0byBmYWxsIGluIGxpbmUgd2l0aCB0aGUgb3RoZXIgZGlyZWN0b3IKICAgICAgICAgICAgbGFuZ3VhZ2VzLiAkcmVzdWx0IGlzIG5vdyB1c2VkIHdoZXJlICQxIHVzZWQgdG8gYmUgdXNlZC4gUGxlYXNlIGNoYW5nZSB5b3VyIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIHlvdSBoYXZlIGEgY3VzdG9tIGRpcmVjdG9yb3V0IHR5cGVtYXAuCgoxMC8xOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBTb21lIGZpeGVzIGZvciBhcHBseWluZyB0aGUgY2hhciBhcnJheSB0eXBlbWFwcyB0byB1bnNpZ25lZCBjaGFyIGFycmF5cy4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQWRkIGluIGNvbnN0IHNpemVfdCYgYW5kIGNvbnN0IHN0ZDo6c2l6ZV90JiB0eXBlbWFwcy4KCjEwLzE1LzIwMDY6IGVmdXp6eW9uZSAKICAgICAgICAgICAgW0NGRkldIFN1cHByZXNzIGdlbmVyYXRpbmcgZGVmY3R5cGUgZm9yIGVudW1zLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4gUGF0Y2ggMTU2MDk4My4gCgoxMC8xNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIE1pbm9yIGZpeCB0byBtYWtlIFNXSUcgd29yayB3aXRoIHRoZSAoYXMgeWV0IHVucmVsZWFzZWQpIGNoaWNrZW4gMi41CgogICAgICAgICAgICBbR3VpbGUsQ2hpY2tlbl0gRml4IFNGIEJ1ZyAxNTczODkyLiAgQWRkZWQgYW4gZXh0X3Rlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgdG8gdGVzdAogICAgICAgICAgICB0aGlzIGJ1ZywgYnV0IHRoaXMgdGVzdCBjYW4gbm90IHJlYWxseSBiZSBtYWRlIGdlbmVyaWMgYmVjYXVzZSB0aGUgZXh0ZXJuYWwgY29kZSBtdXN0CiAgICAgICAgICAgIHBsdWcgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGludGVycHJldGVyIGRpcmVjdGx5LgogICAgICAgICAgICBTZWUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9jaGlja2VuL2V4dF90ZXN0LmkgYW5kIGV4dF90ZXN0X2V4dGVybmFsLmN4eAoKICAgICAgICAgICAgQWRkZWQgYSAlLmV4dGVybmFsdGVzdCB0byBjb21tb24ubWssIGFuZCBhbnkgaW50ZXJlc3RlZCBsYW5ndWFnZSBtb2R1bGVzIGNhbgogICAgICAgICAgICBjb3B5IGFuZCBzbGlnaHRseSBtb2RpZnkgZWl0aGVyIHRoZSBjaGlja2VuIG9yIHRoZSBndWlsZSBleHRfdGVzdC5pCgoxMC8xNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBhZGRlZCBPVVRQVVQmIGZvciBhbGwgbnVtYmVyIHR5cGVzLCBhZGRlZCBhIGxvbmcgbG9uZyB0eXBlCiAgICAgICAgICAgIGZpeGVkIHNldmVyYWwgdGVzdCBjYXNlcy4KICAgICAgICAgICAgdXBkYXRlOiBjaGFuZ2VkIHR5cGVtYXBzIHRvIHVzZSBTV0lHX0NvbnZlcnRQdHIgcmF0aGVyIHRoYW4gU1dJR19NdXN0R2V0UG9pbnRlcgogICAgICAgICAgICBzdGFydGVkIHNwbGl0aW5nIGx1YS5zd2cgaW50byBzbWFsbGVyIHBhcnRzIHRvIG1ha2UgaXQgbmVhdGVyCgoxMC8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIE1hcmdpbmFsbHkgYmV0dGVyIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlIG9ubHkgaW4gdGhhdCB5b3UgY2FuCiAgICAgICAgICAgIGNvbnRyb2wgd2hhdCB0aGUgYmFzZSBjbGFzcyBpcy4gVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBuZXcgJ3JlcGxhY2UnIGF0dHJpYnV0ZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwLCBlZyBpbiB0aGUgZm9sbG93aW5nLCAnTWUnIHdpbGwgYmUgdGhlIGJhc2UgY2xhc3MsCiAgICAgICAgICAgIG5vIG1hdHRlciB3aGF0IEZvbyBpcyByZWFsbHkgZGVyaXZlZCBmcm9tIGluIHRoZSBDKysgbGF5ZXIuCgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CgogICAgICAgICAgICBQcmV2aW91c2x5IGl0IHdhcyBub3QgcG9zc2libGUgZm9yIHRoZSBqYXZhYmFzZS9jc2Jhc2UgdHlwZW1hcHMgdG8gb3ZlcnJpZGUgdGhlIEMrKyBiYXNlLgoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBkZWxldGUoKSBtZXRob2QgCiAgICAgICAgICAgIChpdCBpcyBub3cgYSBzeW5jaHJvbml6ZWQgbWV0aG9kLCBidXQgaXMgbm93IGN1c3RvbWlzYWJsZSBieSBjaGFuZ2luZyB0aGUgCiAgICAgICAgICAgIG1ldGhvZG1vZGlmaWVycyBhdHRyaWJ1dGUgaW4gdGhlIGphdmFkZXN0cnVjdCBvciBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCB0eXBlbWFwKQoKICAgICAgICAgICAgW0MjXSBSZW1vdmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9uIHRoZSBwcm94eSBjbGFzcycgRGlzcG9zZSgpIG1ldGhvZCwgCiAgICAgICAgICAgIHNpbWlsYXIgdG8gSmF2YSdzIGRlbGV0ZSgpIGFib3ZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBSZW1vdmUgcmVkdW5kYW50IGRpcmVjdG9yIGNvZGUgaW4gJWV4dGVuZCBtZXRob2RzICglZXh0ZW5kCiAgICAgICAgICAgIG1ldGhvZHMgY2Fubm90IGJlIGRpcmVjdG9yIG1ldGhvZHMpCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBGaXggIzE1MDU1OTQgLSBkaXJlY3RvciBvYmplY3RzIG5vdCByZXR1cm5lZCBhcyBkaXJlY3RvciBvYmplY3RzCiAgICAgICAgICAgIGluICVleHRlbmQgbWV0aG9kcy4KCjEwLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggIzEyMzg3OTggLSBEaXJlY3RvcnMgdXNpbmcgdW5zaWduZWQgbG9uZyBsb25nIG9yIGFueSBvdGhlciB0eXBlCiAgICAgICAgICAgIG1hcnNoYWxsZWQgYWNyb3NzIHRoZSBKTkkgYm91bmRhcnkgdXNpbmcgYSBKYXZhIGNsYXNzICh3aGVyZSB0aGUgam5pIHR5cGVtYXAgCiAgICAgICAgICAgIGNvbnRhaW5zIGpvYmplY3QpLgoKMTAvMDYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMTYyMTk0IC0gI2luY2x1ZGUvJWluY2x1ZGUgd2l0aGluIGEgc3RydWN0dXJlCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE0NTA2NjEsIHN0cmluZyB0cnVuY2F0aW9uIGluIFN0cmluZ19zZWVrIHRydW5jYXRpbmcgSmF2YS9DIyBlbnVtcy4KCjEwLzA2LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMTU2OTU4Ny4gVGhlIG5hbWUgaXMgbm93IGNvcnJlY3QuCgoxMC8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvciBmaXhlcyBmb3IgdmlydHVhbCBjb252ZXJzaW9uIG9wZXJhdG9ycwoKMTAvMDQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCAjMTU2OTU4NyBmb3IgUEhQLiAgRG9uJ3QgdXNlIHNpemVvZigpIGV4Y2VwdCB3aXRoIHN0cmluZwoJICAgIGxpdGVyYWxzLiAgQ2hhbmdlIHNvbWUgIi8vIiBjb21tZW50cyB0byAiLyogKi8iIGZvciBwb3J0YWJpbGl0eS4KCjEwLzA0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhcnRpYWwgRml4ICMxNTY5NTg3LiBUaGUgdHlwZSBpcyBub3cgY29ycmVjdCwgYnV0IHRoZSBuYW1lIGlzIHN0aWxsIG5vdCBjb3JyZWN0LgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjMTUyNzg4NSAtIE92ZXJsb2FkZWQgZGlyZWN0b3IgdmlydHVhbCBtZXRob2RzIHNvbWV0aW1lcyBwcm9kdWNlZAogICAgICAgICAgICB1bmNvbXBpbGVhYmxlIGNvZGUgd2hlbiB1c2VkIHdpdGggdGhlIGRpcmVjdG9yOmV4Y2VwdCBmZWF0dXJlLgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3JzOiBEaXJlY3RvcnMgYXJlIG91dHB1dCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQgaW4gCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgcmF0aGVyIHRoYW4gaW4gc29tZSBwc2V1ZG8tcmFuZG9tIG9yZGVyLgoKMTAvMDMvMjAwNjogbW1hdHVzCiAgICAgICAgICAgIEZpeCAjMTQ4NjI4MSBhbmQgIzE0NzEwMzkuCgoxMC8wMy8yMDA2OiBvbGx5CgkgICAgW1BlcmxdIEZpeCBmb3IgaGFuZGxpbmcgc3RyaW5ncyB3aXRoIHplcm8gYnl0ZXMgZnJvbSBTdGVwaGVuIEh1dHNhbC4KCjA5LzMwLzIwMDY6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gQml0ZmllbGQgc3VwcG9ydCBhbmQgdmFyYXJnIHN1cHBvcnQgZHVlIHRvIEFydGh1ciBTbXlsZXMuCiAgICAgICAgICAgIEMgZXhwcmVzc2lvbiB0byBMaXNwIGNvbnZlcnNpb24sIHRoYW5rcyB0byBBcnRodXIgU215bGVzIGZvciB0aGUgaW5pdGlhbAogICAgICAgICAgICBpZGVhLCBpdCBub3cgc3VwcG9ydHMgY29udmVyc2lvbiBmb3IgYSB3aG9sZSByYW5nZSBvZiBDIGV4cHJlc3Npb25zLiAKCjA5LzI4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUwODMyNyAtIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgaGlkZGVuIHdoZW4gdXNpbmcgLWZ2aXJ0dWFsIG9wdGltaXNhdGlvbi4KICAgICAgICAgICAgT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBubyBsb25nZXIgY2FuZGlkYXRlcyBmb3IgZWxpbWluYXRpb24gLSB0aGlzIG1pbWljcwogICAgICAgICAgICBDKysgYmVoYXZpb3VyIHdoZXJlIGFsbCBvdmVybG9hZGVkIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGFuZCBpbXBsZW1lbnRlZAogICAgICAgICAgICBpbiBhIGRlcml2ZWQgY2xhc3MgaW4gb3JkZXIgZm9yIHRoZW0gdG8gYmUgYXZhaWxhYmxlLgoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbiwgT2NhbWxdIEZpeCAjMTUwNTU5MSBUaHJvd2luZyBleGNlcHRpb25zIGluIGV4dGVuZGVkIGRpcmVjdG9ycwoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDU2MTAwIC0gdmlydHVhbCBvcGVyYXRvcnMuIAoKMDkvMjQvMjAwNjogb2xseQoJICAgIERvbid0IGFjY2lkZW50YWxseSBjcmVhdGUgYSAiPDoiIHRva2VuICh3aGljaCBpcyB0aGUgc2FtZSBhcyAiWyIgaW4gQysrKS4KCSAgICBGaXhlcyBidWcgIyAxNTIxNzg4LgoKMDkvMjMvMjAwNjogb2xseQoJICAgIFtSdWJ5XSBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggcmVjZW50IHZlcnNpb25zIG9mIHRoZSBSdWJ5IDEuOQoJICAgIGRldmVsb3BtZW50IGJyYW5jaC4gIEZpeGVzIGJ1ZyAjMTU2MDA5Mi4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBUZW1wbGF0ZXMgY2FuIG5vdyBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgbmVnYXRpdmUgbnVtYmVycyBhbmQKCSAgICBjb25zdGFudCBleHByZXNzaW9ucywgZS5nLjoKCgkgICAgdGVtcGxhdGU8aW50IHE+IGNsYXNzIHgge307CgkgICAgJXRlbXBsYXRlKHhfbWludXMxKSB4PC0xPjsKCSAgICAldGVtcGxhdGUoeF8xcGx1czIpIHg8MSsyPjsKCgkgICAgQWxzbywgY29uc3RhbnQgZXhwcmVzc2lvbnMgY2FuIG5vdyBpbmNsdWRlIGNvbXBhcmlzb25zICg+LCA8LCA+PSwKCSAgICA8PSwgIT0sID09KSwgbW9kdWx1cyAoJSksIGFuZCB0ZXJuYXJ5IGNvbmRpdGlvbmFscyAoYSA/IGIgOiBjKS4KCgkgICAgRml4ZXMgYnVncyAjNjQ2Mjc1LCAjOTI1NTU1LCAjOTU2MjgyLCAjOTk0MzAxLgoKMDkvMjIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgbWV0aG9kcyAtIEJ1Z3MgIzE1NDYyNTQsICMxNTQzNTMzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWlnbm9yZSBvbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHRzIGFuZCBhc3NlcnRzIHdoZW4gZGlyZWN0b3IgbWV0aG9kcyBhcmUgaWdub3JlZCAoIzE1NDM1MzMpCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb3V0IG9mIHNvdXJjZSBidWlsZHMgLSBidWcgIzE1NDQ3MTgKCjA5LzIwLzIwMDY6IG9sbHkKCSAgICBUcmVhdCBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiByYXRoZXIKCSAgICB0aGFuIGlnbm9yaW5nIGl0IGNvbXBsZXRlbHksIHNvIHRoYXQgd2UgZ2VuZXJhdGUgY29ycmVjdCBjb2RlIGZvcgoJICAgIHBhc3Npbmcgb3BhcXVlIHBvaW50ZXJzIHRvIHRoZSBuZXN0ZWQgY2xhc3MgKGZpeGVzIFNGIGJ1ZyAjOTA5Mzg3KS4KCjA5LzIwLzIwMDY6IG9sbHkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgW3BocF0gT3ZlcmxvYWQgcmVzb2x1dGlvbiBub3cgd29ya3MuICBIb3dldmVyIHRvIGFsbG93IHRoaXMsIFNXSUcKCSAgICBnZW5lcmF0ZWQgd3JhcHBlcnMgbm8gbG9uZ2VyIGNvZXJjZSBQSFAgdHlwZXMgKHdoaWNoIHJldmVydHMgYSBjaGFuZ2UKCSAgICBtYWRlIGluIDEuMy4yNikuICBTbyBmb3IgZXhhbXBsZSwgaWYgYSBtZXRob2QgdGFrZXMgYSBzdHJpbmcsIHlvdQoJICAgIGNhbiBubyBsb25nZXIgcGFzcyBhIG51bWJlciB3aXRob3V0IGV4cGxpY2l0bHkgY29udmVydGluZyBpdCB0byBhCgkgICAgc3RyaW5nIGluIFBIUCB1c2luZzogKHN0cmluZyl4CgowOS8xOC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbQUxMXSBmaXggb24gc3dpZ2luaXQuc3dnLCBoYXMgYmVlbiByZXBvcnRlZCB0byBjcmFzaCBvbiBzZXZlcmFsIHRlc3QgY2FzZXMKCSAgICBmb3VuZCBhbmQgZml4ZWQgcHJvYmxlbSBpbiBpbXBvcnRzIHVuZGVyIHB5dGhvbiAobWluZ3cpCgowOS8xNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCBmcm9tIE1pY2hhbCBNYXJlayBmb3IgUHl0aG9uIDIuNSB0byBmaXggNjQgYml0IGFycmF5IGluZGV4ZXMgb24KICAgICAgICAgICAgNjQgYml0IG1hY2hpbmVzLgoKMDkvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGhhcyBiZWVuIHNjcmFwcGVkLiBUaGlzIGZlYXR1cmUgd2FzIGludHJvZHVjZWQgcHJpbWFyaWx5CiAgICAgICAgICAgIHRvIHNvbHZlIHJlY3Vyc2l2ZSBkaXJlY3RvciBtZXRob2QgY2FsbHMuIERpcmVjdG9yIHVwY2FsbCBpbXByb3ZlbWVudHMgbWFkZSBpbnN0ZWFkOgoKICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2NhbWxdIFRoZSBzd2lnX3VwIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIFRoZSByZXF1aXJlZCBtdXRleGVzCiAgICAgICAgICAgIHdyYXBwaW5nIHRoaXMgZmxhZyBhcmUgYWxzbyBubyBsb25nZXIgbmVlZGVkLiBUaGUgcmVjdXJzaXZlIGNhbGxzIGdvaW5nIGZyb20gQysrCiAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgYW5kIGJhY2sgYWdhaW4gZXRjIGFyZSBub3cgYXZvaWRlZCBieSBhIHN1YnRsZWx5IGRpZmZlcmVudAogICAgICAgICAgICBhcHByb2FjaC4gSW5zdGVhZCBvZiB1c2luZyB0aGUgc3dpZ191cCBmbGFnIGluIGVhY2ggZGlyZWN0b3IgbWV0aG9kIHRvIGluZGljYXRlCiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGV4cGxpY2l0IEMrKyBjYWxsIHRvIHRoZSBhcHByb3ByaWF0ZSBiYXNlIGNsYXNzIG1ldGhvZCBvciBhIG5vcm1hbAogICAgICAgICAgICBwb2x5bW9ycGhpYyBDKysgY2FsbCBzaG91bGQgYmUgbWFkZSwgdGhlIG5ldyBhcHByb2FjaCBtYWtlcyBvbmUgb2YgdGhlc2UgY2FsbHMKICAgICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgd3JhcHBlciBtZXRob2QuCgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSByZWN1cnNpdmUgY2FsbCBwcm9ibGVtIHdoZW4gY2FsbGluZyBhIEMrKyBiYXNlIGNsYXNzIG1ldGhvZCBmcm9tCiAgICAgICAgICAgIEphdmEvQyMgaXMgbm93IGZpeGVkLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvdGhlciBsYW5ndWFnZXMKICAgICAgICAgICAgYXMgdGhlIGRldGVjdGlvbiBhcyB0byB3aGV0aGVyIHRoZSBleHBsaWNpdCBjYWxsIG9yIGEgbm9ybWFsIHBvbHltb3JwaGljIGNhbGwgaXMgbWFkZQogICAgICAgICAgICBpbiB0aGUgSmF2YS9DIyBsYXllciByYXRoZXIgdGhhbiBpbiB0aGUgQysrIGxheWVyLgoKMDkvMTEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gdXBkYXRlZCBzd2lnaW5pdC5zd2cgdG8gYWxsb3cgbXVsdGlwbGUgaW50ZXJwcmV0ZXJzIHRvIHVzZSBtdWx0aXBsZQoJICAgIHN3aWcgbW9kdWxlcyBhdCBvbmNlLiBUaGlzIGhhcyBiZWVuIHRlc3RlZCBpbiBMdWEgKG1pbmd3ICYgbGludXgpLAoJICAgIHBlcmw1ICYgcHl0aG9uIChsaW51eCkgb25seS4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZnVuY3Rpb24gcG9pbnRlcnMgYXMgd2VsbCBhcyBuYXRpdmUgbHVhIG9iamVjdAogICAgICAgICAgICBpbnRvIHdyYXBwZXJlZCBmdW5jdGlvbi4KICAgICAgICAgICAgQWRkZWQgZXhhbXBsZSBmdW5jcHRyMyB0byBkZW1vbnN0cmF0ZSB0aGlzIGZlYXR1cmUKCjA5LzA1LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBSZW5hbWUgRXJyb3JDb2RlIGFuZCBFcnJvck1zZyAjZGVmaW5lLXMgdG8gU1dJR19FcnJvckNvZGUKCSAgICBhbmQgU1dJR19FcnJvck1zZyB0byBhdm9pZCBjbGFzaGVzIHdpdGggY29kZSB0aGUgdXNlciBtaWdodCBiZQoJICAgIHdyYXBwaW5nIChwYXRjaCBmcm9tIERhcnJlbiBXYXJuZXIgaW4gU0YgYnVnICMxNDY2MDg2KS4gIEFueQoJICAgIHVzZXIgdHlwZW1hcHMgd2hpY2ggdXNlIEVycm9yQ29kZSBhbmQvb3IgRXJyb3JNc2cgZGlyZWN0bHkgd2lsbAoJICAgIG5lZWQgYWRqdXN0aW5nIC0geW91IGNhbiBlYXNpbHkgZml4IHRoZW0gdG8gd29yayB3aXRoIGJvdGggb2xkCgkgICAgYW5kIG5ldyBTV0lHIGJ5IGNoYW5naW5nIHRvIHVzZSBTV0lHX0Vycm9yTXNnIGFuZCBhZGRpbmc6CgoJCSNpZm5kZWYgU1dJR19FcnJvck1zZwoJCSNkZWZpbmUgU1dJR19FcnJvck1zZygpIEVycm9yTXNnKCkKCQkjZW5kaWYKCjA4LzI5LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBNb3ZlIGNvbnN0YW50IGluaXRpYWxpc2F0aW9uIGZyb20gUklOSVQgdG8gTUlOSVQgdG8gZml4IGEKCSAgICB3YXJuaW5nIHdoZW4gdXNpbmcgQXBhY2hlIGFuZCBtb2RfcGhwLiAgV2Ugb25seSBuZWVkIHRvIGNyZWF0ZQoJICAgIFBIUCBjb25zdGFudHMgb25jZSB3aGVuIHdlJ3JlIGZpcnN0IGluaXRpYWxpc2VkLCBub3QgZm9yIGV2ZXJ5IEhUVFAKCSAgICByZXF1ZXN0LgoKMDgvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1NDI0NjYgYWRkZWQgY29kZSB0byBhbGxvdyBtYXBwaW5nIEx1YSBuaWwncyA8LT4gQy9DKysgTlVMTCdzCgkgICAgdXBkYXRlZCB2YXJpb3VzIHR5cGVtYXBzIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIGNoYW5nZXMKCSAgICBhZGRlZCB2b2lkdGVzdF9ydW5tZS5sdWEgdG8gc2hvdyB0aGUgZmVhdHVyZXMgd29ya2luZwoKMDgvMTkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBBZGQgZmVhdHVyZTpjb25zdGFzdmFyIHRvIGV4cG9ydCBjb25zdGFudHMgYXMgdmFyaWFibGVzIGluc3RlYWQgb2YgZnVuY3Rpb25zCiAgICAgICAgICAgIHRoYXQgcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZS4KCjA4LzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEZXRhY2hDdXJyZW50VGhyZWFkIGNhbGxzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IG5hdGl2ZWx5IGNyZWF0ZWQgdGhyZWFkcwogICAgICAgICAgICBubyBsb25nZXIgcHJldmVudCB0aGUgSlZNIGZyb20gZXhpdGluZy4gQnVnIHJlcG9ydGVkIGJ5IFRob21hcyBEdWR6aWFrIGFuZAogICAgICAgICAgICBQYXVsIE5vbGwuCgowOC8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBzbyB0aGV5IHdvcmsKCjA3LzI1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtb3JlIGFkZGl0aW9ucyB0byBzdGQ6OnN0cmluZywgc29tZSB0d2Vha3MgYW5kIHNtYWxsIGJ1ZyBmaXhlcwoJICAgIC1ub2N3cmFwIG1vZGUuCgowNy8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIEJ1Z2ZpeCAjMTUyNjAyMiBwZGF0ZWQgc3RkOjpzdHJpbmcgdG8gc3VwcG9ydCBzdHJpbmdzIHdpdGggJ1wwJyBpbnNpZGUgdGhlbQoJICAgIHVwZGF0ZWQgdHlwZW1hcHMuaSB0byBhZGQgc3VwcG9ydCBmb3IgcG9pbnRlciB0byBwb2ludGVycwoKMDcvMTkvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gQWRkIHN0ZF9zdHJpbmcuaSBzdXBwb3J0LgoJICAgIC0gQWRkIG5ld29iamVjdCBwYXRjaCBzdWJtaXR0ZWQgYnkgbWtvZXBwZSAodGhhbmtzISkKCSAgICAtIEZpeCB0eXBlIG5hbWUgbWlzbWF0Y2ggaXNzdWUgZm9yIG5lc3RlZCB0eXBlIGRlZmluaXRpb25zLgoJICAgICAgc3BlY2lmaWNhbGx5IHR5cGVkZWZzIGluIHRlbXBsYXRlZCBjbGFzcyBkZWZucy4KCjA3LzE4LzIwMDY6IG1nb3NzYWdlCgkgICAgQnVnZml4ICMxNTIyODU4CgkgICAgdXBkYXRlZCBsdWEuY3h4IHRvIHN1cHBvcnQgLWV4dGVybmFsLXJ1bnRpbWUgY29tbWFuZAoKMDcvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgSW5jcmVtZW50IHRoZSBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byAzLCBiZWNhdXNlIG9mIHRoZQoJICAgIGFkZGl0aW9uIG9mIHRoZSBvd25kYXRhIG1lbWJlciBpbiBzd2lnX3R5cGVfaW5mby4KCSAgICBSZXBvcnRlZCBieTogUHJhYmh1IFJhbWFjaGFuZHJhbgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU2VhcmNoIHBhdGggZml4ZXM6CiAgICAgICAgICAgIC0gRml4IHNlYXJjaCBwYXRoIGZvciBsaWJyYXJ5IGZpbGVzIHRvIGJlaGF2ZSBhcyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbC4KICAgICAgICAgICAgLSBGaXggbWluZ3cvbXN5cyBidWlsZHMgd2hpY2ggZGlkIG5vdCBmaW5kIHRoZSBTV0lHIGxpYnJhcnkgd2hlbiBpbnN0YWxsZWQuCiAgICAgICAgICAgIC0gV2luZG93cyBidWlsZHMgYWxzbyBvdXRwdXQgdGhlIG1pbmd3L21zeXMgaW5zdGFsbCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcKICAgICAgICAgICAgICBzd2lnIC1zd2lnbGliLgogICAgICAgICAgICAtIFRoZSBub24tZXhpc3RlbnQgYW5kIHVuZG9jdW1lbnRlZCBjb25maWcgZGlyZWN0b3J5IGluIHRoZSBzZWFyY2ggcGF0aCBoYXMKICAgICAgICAgICAgICBiZWVuIHJlbW92ZWQuCgowNy8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJHN5bW5hbWUgc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb24uCgowNy8wNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBBZGQgJWZlYXR1cmUoImNvbnN0YXN2YXIiKSwgd2hpY2ggaW5zdGVhZCBvZiBleHBvcnRpbmcgYSBjb25zdGFudCBhcyBhCgkgICAgc2NoZW1lIGZ1bmN0aW9uLCBleHBvcnRzIHRoZSBjb25zdGFudCBhcyBhIHNjaGVtZSB2YXJpYWJsZS4gIFVwZGF0ZSB0aGUKCSAgICBkb2N1bWVudGF0aW9uIGFzIHdlbGwuCgowNy8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbU2VlIGVudHJ5IG9mIDA5LzEzLzIwMDYgLSBleHBsaWNpdGNhbGwgZmVhdHVyZSBhbmQgZG9jdW1lbnRhdGlvbiB0byBpdCByZW1vdmVkXQogICAgICAgICAgICBOZXcgZXhwbGljaXRjYWxsIGZlYXR1cmUgd2hpY2ggZ2VuZXJhdGVzIGFkZGl0aW9uYWwgd3JhcHBlcnMgZm9yIHZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICB0aGF0IGNhbGwgdGhlIG1ldGhvZCBleHBsaWNpdGx5LCBub3QgcmVseWluZyBvbiBwb2x5bW9ycGhpc20gdG8gbWFrZSB0aGUgbWV0aG9kCiAgICAgICAgICAgIGNhbGwuIFRoZSBmZWF0dXJlIGlzIGEgZmVhdHVyZSBmbGFnIGFuZCBpcyBlbmFibGVkIGxpa2UgYW55IG90aGVyIGZlYXR1cmUgZmxhZy4KICAgICAgICAgICAgSXQgYWxzbyByZWNvZ25pc2VzIGFuIGF0dHJpYnV0ZSwgInN1ZmZpeCIgZm9yIG1hbmdsaW5nIHRoZSBmZWF0dXJlIG5hbWUsIHNlZQogICAgICAgICAgICBTV0lHUGx1cy5odG1sI1NXSUdQbHVzX2V4cGxpY2l0Y2FsbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBpcyBhbHNvIGEgd29ya2Fyb3VuZCBmb3Igc29sdmluZyB0aGUgcmVjdXJzaXZlIGNhbGxzCiAgICAgICAgICAgIHByb2JsZW0gd2hlbiBhIGRpcmVjdG9yIG1ldGhvZCBtYWtlcyBhIGNhbGwgdG8gYSBiYXNlIGNsYXNzIG1ldGhvZC4gU2VlCiAgICAgICAgICAgIEphdmEuaHRtbCNqYXZhX2RpcmVjdG9yc19leHBsaWNpdGNhbGwgZm9yIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbi4KCjA2LzI4LzIwMDY6IGpvZSAoSm9zZXBoIFdhbmcpCgkgICAgW3JdIEluaXRpYWwgc3VwcG9ydCBmb3IgUgoKMDYvMjAvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCiAgICAgICAgICAgIE1pbm9yIGZpeGVzIHRvIGdldCBhcHBseV9zdHJpbmdzLmkgdGVzdHN1aXRlIHRvIHBhc3MKCSAgICBSZW1vdmUgaW50ZWdlcnNfcnVubWUuc2NtIGZyb20gdGhlIHRlc3RzdWl0ZSwgYmVjYXVzZSBTV0lHIGFuZCBDaGlja2VuIGRvZXMKICAgICAgICAgICAgaGFuZGxlIG92ZXJmbG93cy4KCjA2LzE5LzIwMDU6IG9sbHkKCSAgICBbcGhwXSBBZGQgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBQSFA1IGNsYXNzIHdyYXBwZXJzIGZvciBDKysKCSAgICBjbGFzc2VzICh1c2UgInN3aWcgLXBocDUiKS4KCjA2LzE3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBBZGRlZCBzb21lIG1pc3Npbmcga2V5d29yZHMgdG8gdGhlIFBIUDQga2V5d29yZCBsaXN0LCBhbmQKCSAgICBmaXhlZCBfX0xJTkVfXyBhbmQgX19GSUxFX18gd2hpY2ggd2VyZSBpbiB0aGUgd3JvbmcgY2F0ZWdvcnkuCgkgICAgQWxzbyBhZGRlZCBhbGwgdGhlIGtleXdvcmRzIG5ldyBpbiBQSFA1LCBhbmQgYWRkZWQgY29tbWVudHMKCSAgICBub3RpbmcgdGhlIFBIUDQga2V5d29yZHMgd2hpY2ggYXJlbid0IGtleXdvcmRzIGluIFBIUDUuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gRG9uJ3Qgc2VnZmF1bHQgaWYgUEhQIE51bGwgaXMgcGFzc2VkIGFzIHRoaXMgcG9pbnRlciAoZS5nLgoJICAgIENsYXNzX21ldGhvZChOdWxsKSkgLSBnaXZlIGEgUEhQIEVycm9yIGluc3RlYWQuCgowNi8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IGNvbnRhaW5lciBjbGFzcy4KCSAgICBGaXggYSBmZXcgYnVncyBpbiBoZWxwZXIgZnVuY3Rpb25zLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlcGxhY2UgSk5JRVhQT1JUIHdpdGggU1dJR0VYUE9SVCwgdGhlcmVieSBlbmFibGluZyB0aGUgcG9zc2liaWxpdHkKICAgICAgICAgICAgb2YgdXNpbmcgZ2NjIC1mdmlzaWJpbGl0eT1oaWRkZW4gZm9yIHBvdGVudGlhbGx5IHNtYWxsZXIgZmFzdGVyIGxvYWRpbmcgd3JhcHBlcnMuCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIE1ha2VmaWxlcyBmb3IgYXV0b2NvbmYtMi42MCBiZXRhCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBWbGFkaW1pciBNZW5zaGFrb3YgcGF0Y2ggZm9yIGNvbXBpbGluZyB3cmFwcGVycyB3aXRoIHB5dGhvbi0yLjUgYWxwaGEuCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVmZmVyIG92ZXJmbG93IGVycm9yIHdoZW4gdXNpbmcgbGFyZ2UgJWZlYXR1cmUoZG9jc3RyaW5nKSByZXBvcnRlZAogICAgICAgICAgICBieSBKb3NlcGggV2luc3Rvbi4KCjA1LzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBPcGVyYXRvciBvdmVybG9hZCBmaXggZnJvbSBEYW5pZWwgTW9vcmUuCgowNS8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBnZW5lcmF0aW9uIG9mIENMT1MgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHVuaW9ucwoJICAgIGFuZCBlcXVpdmFsZW50IHR5cGVzLgoKMDUvMjQvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIERvbid0IHJlcXVpcmUgYSBmdWxsIGNsYXNzIGRlZmluaXRpb24gdG8gZ2VuZXJhdGUgYSBDTE9TIHdyYXBwZXIuCgowNS8yMC8yMDA2OiBvbGx5CgkgICAgW3BocF0gR0NDIFZpc2liaWxpdHkgc3VwcG9ydCBub3cgd29ya3Mgd2l0aCBQSFAuCgowNS8xOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVtb3ZlZCBzdXBwb3J0IGZvciAtZGxuYW1lICh1c2UgLW1vZHVsZSBpbnN0ZWFkKS4gIEZpeGVkCgkgICAgbmFtaW5nIG9mIFBIUCBleHRlbnNpb24gbW9kdWxlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBQSFAKCSAgICBjb252ZW50aW9ucyAobm8gInBocF8iIHByZWZpeCBvbiBVbml4OyBvbiBQSFAgPj0gNC4zLjAsIGhhbmRsZSBVbml4CgkgICAgcGxhdGZvcm1zIHdoaWNoIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAiLnNvIiBhcyB0aGUgZXh0ZW5zaW9uLikKCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRGlyZWN0b3Igc3VwcG9ydCBhZGRlZAoKMDUvMDcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCB3aGVyZSBhIEMrKyByZWZlcmVuY2UKCSAgICBpcyB3YW50ZWQuCgowNS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IHdyYXBwZXJzIGdlbmVyYXRlZCBmb3IgZ2xvYmFsICdjaGFyJyB2YXJpYWJsZXMgdG8gbm90CgkgICAgaW5jbHVkZSBhIHRlcm1pbmF0aW5nIHplcm8gYnl0ZSBpbiB0aGUgUEhQIHN0cmluZy4KCjA1LzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSB0eXBlbWFwcyBzbyB0aGF0IGNoYXIgKiBjYW4gYmUgYXBwbGllZCB0byB1bnNpZ25lZCBjaGFyICogb3Igc2lnbmVkIGNoYXIgKgogICAgICAgICAgICB0eXBlcyBhbmQgdmlzYSB2ZXJzYS4KCjA1LzAzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXVRoYW5rcyB0byBMdWtlIEogQ3Jvb2sgZm9yIHRoaXMgaWRlYS4KICAgICAgICAgICAgIC0gYSBzdHJ1Y3QvZW51bS91bmlvbiBpcyByZXBsYWNlZCB3aXRoIDpwb2ludGVyIG9ubHkgaWYKICAgICAgICAgICAgICAgdGhhdCBzbG90IGlzIGFjdHVhbGx5IGEgcG9pbnRlciB0byB0aGF0IHR5cGUuIFNvLDogCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFfc3RydWN0IHsgaW50IHg7IH0gYW5kCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJfc3RydWN0IHsgYV9zdHJ1Y3Qgc3RydWN0XzE7IH07IAogICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZCBhczoKICAgICAgICAgICAgICAgICAgIChjZmZpOmRlZmNzdHJ1Y3QgYl9zdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdF8xIGFfc3RydWN0KSkKICAgICAgICAgICAgIC0gT3RoZXIgbWlub3IgZml4ZXMgaW4gbGlzcGlmeWluZyBuYW1lcy4KCjA1LzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwb3NzaWJsZSByZWRlZmluaXRpb24gb2YgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIGZvciBWQysrLgoKMDQvMTQvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldCiAgICAgICAgICAgIFRoYW5rcyB0byBUaG9tYXMgV2VpZG5lciBmb3IgdGhlIHBhdGNoLgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBleHBvcnQgaXMgc2V0IChleHBvcnQgJ2ZvbykgaXMgCiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBldmVyeSBzeW1ib2wKICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW5saW5lIGlzIHNldCAoZGVjbGFpbSAoaW5saW5lIGZvbykpIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBiZWZvcmUgZXZlcnkgZnVuY3Rpb24gZGVmaW5pdGlvbgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBpbnRlcm5fZnVuY3Rpb24gaXMgc2V0IAogICAgICAgICAgICAgICMuKHZhbHVlLW9mLWludGVybi1mdW5jdGlvbiAibmFtZSIgIm5vZGVUeXBlIiBwYWNrYWdlKQogICAgICAgICAgICAgIGlzIGVtaXR0ZWQgaW5zdGVhZCBvZiB0aGUgcGxhaW4gc3ltYm9sLiBBIHNhbXBsZSBzd2lnLWxpc3BpZnkgCiAgICAgICAgICAgICAgaXMgcHJvdmlkZWQuCiAgICAgICAgICAgIC0gZXZlcnkgc3ltYm9sIGlzIHByZWZpeGVkIGJ5IGl0J3MgcGFja2FnZS4KCjA0LzEzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQoJICAgIEZpeGVkIHRoZSBnZW5lcmF0aW9uIG9mIHdyYXBwZXJzIGZvciBnbG9iYWwgdmFyaWFibGVzLiAKICAgICAgICAgICAgQWRkZWQgdGhlIG9wdGlvbiBbbm9dc3dpZy1saXNwIHdoaWNoIHR1cm5zIG9uL29mZiBnZW5lcmF0aW9uIAogICAgICAgICAgICBvZiBjb2RlIGZvciBzd2lnIGhlbHBlciBsaXNwIG1hY3JvLCBmdW5jdGlvbnMsIGV0Yy4KClZlcnNpb24gMS4zLjI5IChNYXJjaCAyMSwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBvdXRwdXQgdHlwZW1hcCBvZiBjaGFyIHNvIGl0IHByb2R1Y2VzIGEgY2hhcmFjdGVyIGluc3RlYWQKCSAgICBvZiBhbiBpbnRlZ2VyLiBBbHNvIGFkZHMgaW5wdXQvb3V0cHV0IHR5cGVtYXBzIGZvciAnY2hhciAqJy4KCgkgICAgYWRkIGNvbW1hbmQtbGluZSBhcmd1bWVudCAtaXNvbGF0ZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UKCSAgICBmaWxlIHRoYXQgd29uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgU1dJRyBnZW5lcmF0ZWQgZmlsZXMgdGhhdAoJICAgIG1heSBiZSB1c2VkIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLgoKMDMvMjAvMjAwNTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIE1vcmUgdHdlYWtzIHRvIElOUFVUL09VVFBVVCB0eXBlbWFwcyBmb3IgYm9vbC4KCgkgICAgRml4IGNvbnN0YW50V3JhcHBlciBmb3IgY2hhciBhbmQgc3RyaW5nIGxpdGVyYWxzLgoKCSAgICBmaW5kLWRlZmluaXRpb24ga2V5YmluZGluZ3Mgc2hvdWxkIHdvcmsgaW4gRUxJL1NMSU1FLgoJICAgIE91dHB1dCAoaW4tcGFja2FnZSA8bW9kdWxlLW5hbWU+KSB0byBsaXNwIHdyYXBwZXIKCSAgICBpbnN0ZWFkIG9mIChpbi1wYWNrYWdlICMuKnN3aWctbW9kdWxlLW5hbWUqKS4KCgkgICAgc2xpZ2h0IHJld29yayBvZiBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgoKCSAgICBkb2MgdXBkYXRlcy4KCjAzLzE3LzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtYW5nbGUgbmFtZXMgb2YgY29uc3RhbnRzIGdlbmVyYXRlZCB2aWEgY29uc3RhbnRXcmFwcGVyLgoJICAgIAoJICAgIFdoZW4gdXNpbmcgT1VUUFVUIHR5cGVtYXBzIGFuZCB0aGUgZnVuY3Rpb24gaGFzIGEgbm9uLXZvaWQKCSAgICByZXR1cm4gdmFsdWUsIGl0IHNob3VsZCBiZSBmaXJzdCBpbiB0aGUgdmFsdWVzLWxpc3QsIGZvbGxvd2VkCgkgICAgYnkgdGhlIE9VVFBVVCBtYXBwZWQgdmFsdWVzLgoKCSAgICBGaXggYnVnIHdpdGggYm9vbGVhbiBwYXJhbWV0ZXJzLCB3aGljaCBuZWVkZWQgdG8gYmUKCSAgICBwYXNzZWQgaW4gYXMgaW50IHZhbHVlcywgcmF0aGVyIHRoYW4gVCBvciBOSUwuCgowMy8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgR2VuZXJhdGUgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyB3aGVuIGluIEMrKyBvciAtY3dyYXAgbW9kZS4KCSAgICBNYWtlIC1jd3JhcCB0aGUgZGVmYXVsdCwgc2luY2UgaXQgaXMgbW9zdCBjb3JyZWN0LiBVc2VycwoJICAgIGNhbiB1c2UgdGhlIC1ub2N3cmFwIG9wdGlvbiB0byBhdm9pZCB0aGUgY3JlYXRpb24gb2YgYSAuY3h4CgkgICAgZmlsZSB3aGVuIGludGVyZmFjaW5nIHRvIEMgY29kZS4KCgkgICAgV2hlbiBpbiAtbm9jd3JhcCBtb2RlLCBpbXByb3ZlIHRoZSBoYW5kbGluZyBvZiBjb252ZXJ0aW5nCiAJICAgIGluZml4IGxpdGVyYWxzIHRvIHByZWZpeCBub3RhdGlvbiBmb3IgbGlzcC4gVGhpcyBpcyB2ZXJ5CgkgICAgYmFzaWMgYW5kIG5vdCBsaWtlbHkgdG8gYmUgaW1wcm92ZWQgdXBvbiBzaW5jZSB0aGlzIG9ubHkKCSAgICBhcHBsaWVzIHRvIHRoZSAtbm9jd3JhcCBjYXNlLiBMaXRlcmFscyB3ZSBjYW4ndCBmaWd1cmUgb3V0CgkgICAgd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nIGFuZCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkCgkgICAgY29kZS4KCgkgICAgdmFsaWRJZGVudGlmaWVyIG5vdyBtb3JlIGNsb3NlbHkgYXBwcm94aW1hdGVzIHdoYXQgbWF5IGJlCgkgICAgYSBsZWdhbCBjb21tb24gbGlzcCBzeW1ib2wuCgoJICAgIEZpeCB0eXBlbWFwIGVycm9yIGluIGFsbGVncm9jbC5zd2cKCSAgICAKMDMvMTIvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCB1cCBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgkgICAgR2VuZXJhdGUgYysrIHN0eWxlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBzdHJ1Y3QvdW5pb24gbWVtYmVycwoJICAgIHdoZW4gLWN3cmFwIG9wdGlvbiBzcGVjaWZpZWQuCgowMy8xMC8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBDIHdyYXBwZXIgZ2VuZXJhdGlvbiBpbnRyb2R1Y2VkIGJ5IGxhc3QgYWxsZWdyb2NsCgkgICAgY29tbWl0LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIENvbW1pdCAjMTQ0NzMzNyAtIERlbGV0ZSBMb2NhbFJlZnMgYXQgdGhlIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIHRvIGZpeCBwb3RlbnRpYWwgbGVhawoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDQ0OTQ5IC0gY29uZmlndXJlIGRvZXMgbm90IGhvbm9yIC0tcHJvZ3JhbS1wcmVmaXguCiAgICAgICAgICAgIFJlbW92ZWQgbm9uLXN0YW5kYXJkIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4LiBGaXggdGhlIGF1dG9jb25mIHN0YW5kYXJkCiAgICAgICAgICAgIG9wdGlvbnMgLS1wcm9ncmFtLXByZWZpeCBhbmQgLS1wcm9ncmFtLXN1ZmZpeCB3aGljaCB3ZXJlIGJlaW5nIHNob3duIGluIHRoZSBoZWxwLAogICAgICAgICAgICBidXQgd2VyZSBiZWluZyBpZ25vcmVkLiBVc2UgLS1wcm9ncmFtLXN1ZmZpeCBpbnN0ZWFkIG9mIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBub3cuCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgRml4ICMxNDQ2MzE5IHdpdGggcGF0Y2ggZnJvbSBhbmRyZWFzdGggLSBtb3JlIHRoYW4gb25lIHdzdHJpbmcgcGFyYW1ldGVyIGluIGRpcmVjdG9yIG1ldGhvZHMKCjAzLzA3LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIAoJICAgIEZpeCBmb3IgbW9kdWxlIG5hbWVzIGNvbnRhaW5pbmcgYSAiLSIgaW4gbm9uLSJzaGFkb3ciIG1vZGUuCgkgICAgUGF0Y2ggZnJvbSBBYXJvbiBWYW5EZXZlbmRlciAoIzE0NDE0NzQpLgoKMDMvMDQvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgLU8gdG8gdGhlIG1haW4gcHJvZ3JhbSwgd2hpY2ggbm93IGVuYWJsZXMgLWZhc3RkaXNwYXRjaAoJICAgIAoJICAgIFtQeXRob25dCgoJICAgIC0gQWRkIHRoZSAtZmFzdGluaXQgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgX19pbml0X18KICAgICAgICAgICAgICBtZXRob2RzLiBTZXR0aW5nICd0aGlzJyBhcyAnc2VsZi50aGlzLmFwcGVuZCh0aGlzKScgaW4gdGhlIHB5dGhvbgoJICAgICAgY29kZSBjb25mdXNlcyBQeUx1Y2VuZS4gTm93IHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lIGluIHRoZQoJICAgICAgdGhlIEMrKyBzaWRlLCBhcyByZXBvcnRlZCBieSBBbmRpIGFuZCBSb2Jpbi4KCgkgICAgLSBBZGQgdGhlIC1mYXN0cXVlcnkgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgU1dJR19UeXBlUXVlcnkgdmlhIGEKICAgICAgICAgICAgICBweXRob24gZGljdCBjYWNoZSwgYXMgcHJvcG9zZWQgYnkgQW5kaSBWYWpkYQoKCSAgICAtIEF2b2lkIHRvIGNhbGwgUHlPYmplY3RfR2V0QXR0ciBpbnNpZGUgU1dJR19QeXRob25fR2V0U3dpZ1RoaXMsCgkgICAgICBzaW5jZSB0aGlzIGNvbmZ1c2VzIFB5THVjZW5lLCBhcyByZXBvcnRlZCBieSBBbmRpIFZhamRhLgoJICAgIAowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgUmVtb3ZlZCBleHRyYSAodm9pZCAqKSBjYXN0IHdoZW4gY2FzdGluZyBwb2ludGVycyB0byBhbmQgZnJvbSBqbG9uZyBhcyB0aGlzCiAgICAgICAgICAgIHdhcyBzdXBwcmVzc2luZyBnY2MncyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5nLiBUaGlzIHdhcm5pbmcgY291bGQgYmUgaWdub3JlZCBpbiB2ZXJzaW9ucyBvZiBnY2MgcHJpb3IgdG8gNC4wLCBidXQgbm93IHRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIHVzZWZ1bCBhcyBnY2MgLU8yIGFuZCBoaWdoZXIgb3B0aW1pc2F0aW9uIGxldmVscyBpbmNsdWRlcyAtZnN0cmljdC1hbGlhc2luZyB3aGljaAogICAgICAgICAgICBnZW5lcmF0ZXMgY29kZSB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlIGNhc3RzLiBUaGUgYXNzaWdubWVudCBpcyBzaW1wbHkgbmV2ZXIgbWFkZS4KICAgICAgICAgICAgUGxlYXNlIHVzZSAtZm5vLXN0cmljdC1hbGlhc2luZyB0byBib3RoIHN1cHByZXNzIHRoZSB3YXJuaW5nIGFuZCBmaXggdGhlIGJhZCBhc3NlbWJseQogICAgICAgICAgICBjb2RlIGdlbmVyYXRlZC4gTm90ZSB0aGF0IHRoZSB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IHRoZSBDIGNvbXBpbGVyLCBidXQgbm90CiAgICAgICAgICAgIHRoZSBDKysgY29tcGlsZXIsIHlldCB0aGUgQysrIGNvbXBpbGVyIHdpbGwgYWxzbyBnZW5lcmF0ZSBicm9rZW4gY29kZS4gQWx0ZXJuYXRpdmVseSB1c2UgCiAgICAgICAgICAgIC1Xbm8tc3RyaWN0LWFsaWFzaW5nIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIGZvciBnY2MtMy54LiBUaGUgdHlwZW1hcHMgYWZmZWN0ZWQKICAgICAgICAgICAgYXJlIHRoZSAiaW4iIGFuZCAib3V0IiB0eXBlbWFwcyBpbiBqYXZhLnN3ZyBhbmQgYXJyYXlzX2phdmEuc3dnLiBVc2VycyBvdWdodCB0byBmaXgKICAgICAgICAgICAgdGhlaXIgb3duIHR5cGVtYXBzIHRvIGRvIHRoZSBzYW1lLiBOb3RlIHRoYXQgcmVtb3ZhbCBvZiB0aGUgdm9pZCAqIGNhc3Qgc2ltcGx5IHByZXZlbnRzCiAgICAgICAgICAgIHN1cHByZXNzaW9uIG9mIHRoZSB3YXJuaW5nIGZvciB0aGUgQyBjb21waWxlciBhbmQgbm90aGluZyBlbHNlLiBUeXBpY2FsIGNoYW5nZToKCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogJXsgJDEgPSAqKCQmMV9sdHlwZSkodm9pZCAqKSYkaW5wdXQ7ICV9CiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpJiRpbnB1dDsgJX0KCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBTV0lHVFlQRSAqICV7ICooJCYxX2x0eXBlKSh2b2lkICopJiRyZXN1bHQgPSAkMTsgJX0gCiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkmJHJlc3VsdCA9ICQxOyAlfSAKCjAzLzAyLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0KCSAgICBBZGQgdHlwZW1hcHMgZm9yICJsb25nIGxvbmciOyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcywgaG93ZXZlciwgZGVwZW5kcwoJICAgIG9uIHRoZSB2ZXJzaW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIEd1aWxlLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgaW5uZXIgZXhjZXB0aW9ucy4gSWYgYW55IG9mIHRoZSBkZWxlZ2F0ZXMgYXJlIGNhbGxlZCB3aGljaCBjb25zdHJ1Y3QKICAgICAgICAgICAgYSBwZW5kaW5nIGV4Y2VwdGlvbiBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZXhjZXB0aW9uLCBpdCB3aWxsIGNyZWF0ZSB0aGUgbmV3CiAgICAgICAgICAgIGV4Y2VwdGlvbiB3aXRoIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBhcyBhbiBpbm5lciBleGNlcHRpb24uCgowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBQaHA1IGV4Y2VwdGlvbnMgaWYgY29tcGlsaW5nIGFnYWluc3QgUGhwNSAocGF0Y2ggZnJvbSBPbGx5IEJldHRzKS4KCjAzLzAxLzIwMDY6IG1tYXR1cwoJICAgIFVzZSB0aGUgR0NDIHZpc2liaWxpdHkgYXR0cmlidXRlIGluIFNXSUdFWFBPUlQuCgoJICAgIE5vdyB5b3UgY2FuIGNvbXBpbGUgKHdpdGggZ2NjIDMuNCBvciBsYXRlcikgdXNpbmcKCSAgICBDRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iLgoJICAgIAoJICAgIENoZWNrIHRoZSBkaWZmZXJlbmNlIGZvciB0aGUgJ3N0ZF9jb250YWluZXJzLmknIHB5dGhvbiAKCSAgICB0ZXN0IGNhc2U6CiAKICAgICAgICAgICAgU2l6ZXM6CgoJICAgICAgMzMwNTQzMiBfc3RkX2NvbnRhaW5lcnMuc28KCSAgICAgIDIzODM5OTIgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBFeHBvcnRlZCBzeW1ib2xzIChubSAtRCA8ZmlsZT4uc28gfCB3YyAtbCk6CgogICAgICAgICAgICAgIDYxNDYgX3N0ZF9jb250YWluZXJzLnNvIAogICAgICAgICAgICAgIDE3NCAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbiAKCgkgICAgRXhjZWN1dGlvbiB0aW1lczoKCgkgICAgICByZWFsIDBtMC4wNTBzIHVzZXIgMG0wLjAzOXMgc3lzIDBtMC4wMDVzICAgX3N0ZF9jb250YWluZXJzLnNvCiAgICAgICAgICAgICAgcmVhbCAwbTAuMDM5cyB1c2VyIDBtMC4wMjZzIHN5cyAwbTAuMDA3cyAgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgUmVhZCBodHRwOi8vZ2NjLmdudS5vcmcvd2lraS9WaXNpYmlsaXR5IGZvciBtb3JlIGRldGFpbHMuCgoKMDIvMjcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBzdXBwb3J0IGZvciBJTlBVVCwgT1VUUFVULCBhbmQgSU5PVVQgdHlwZW1hcHMuCgkgICAgRm9yIE9VVFBVVCB2YXJpYWJsZXMsIHRoZSBsaXNwIHdyYXBwZXIgcmV0dXJucyBtdWx0aXBsZQoJICAgIHZhbHVlcy4KCjAyLzI2LzIwMDY6IG1tYXR1cwoKCSAgICBbUnVieV0gYWRkIGFyZ2Nhcmd2LmkgbGlicmFyeSBmaWxlLgoJICAgIAoJICAgIFVzZSBpdCBhcyBmb2xsb3c6CgoJCSVpbmNsdWRlIGFyZ2Nhcmd2LmkKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWFwcGx5IChpbnQgQVJHQywgY2hhciAqKkFSR1YpIHsgKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgfSAKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWlubGluZSB7CQkJCQogICAJICAgICAgICAgIGludCBtYWluQXBwKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgCQogICAJICAgICAgICAgIHsJCQkJCQkKICAgCSAgICAgICAgICAgIHJldHVybiBhcmdjOwkJCQkJCiAgIAkgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQkJCQkJCQkKCSAgICAgIAkJCQkJCQkKICAgCSAgICB0aGVuIGluIHRoZSBydWJ5IHNpZGU6CQkJCQkKCSAgICAgIAkJCQkJCQkJCiAgIAkgICAgICAgIGFyZ3MgPSBbImFzZGYiLCAiYXNkZjIiXQkJCQkKICAgCSAgICAgICAgbiA9IG1haW5BcHAoYXJncyk7CgkKCgkgICAgVGhpcyBpcyB0aGUgc2ltaWxhciB0byB0aGUgcHl0aG9uIHZlcnNpb24gTGliL3B5dGhvbi9hcmdjYXJndi5pCgowMi8yNC8yMDA2OiBtZ29zc2FnZQoKCSAgICBTbWFsbCB1cGRhdGUgTHVhIGRvY3VtZW50cyBvbiB0cm91Ymxlc2hvb3RpbmcgcHJvYmxlbXMKCSAgICAKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBGaXggYWxsIHRoZSBlcnJvcnMgcmVwb3J0ZWQgZm9yIDEuMy4yOC4KCSAgICAtIGZpeCBidWcgIzExNTgxNzgKCSAgICAtIGZpeCBidWcgIzEwNjA3ODkKCSAgICAtIGZpeCBidWcgIzEyNjM0NTcKCSAgICAtIGZpeCAnY29uc3QgIGNoYXIqJicgdHlwZW1hcCBpbiB0aGUgVVRMLCByZXBvcnRlZCBieSBHZW9mZiBIdXRjaGlzb24KCSAgICAtIGZpeGVzIGZvciBweXRob24gMi4xIGFuZCB0aGUgcnVudGltZSBsaWJyYXJ5CgkgICAgLSBmaXggY29weWN0b3IgKyB0ZW1wbGF0ZSBidWcgIzE0MzIxMjUKCSAgICAtIGZpeCBbIDE0MzIxNTIgXSAlcmVuYW1lIGZyaWVuZCBvcGVyYXRvcnMgaW4gbmFtZXNwYWNlCgkgICAgLSBmaXggZ2NjIHdhcm5pbmcgcmVwb3J0ZWQgYnkgUi4gQmVybnN0ZWluCgkgICAgLSBhdm9pZCBhc3NlcnQgd2hlbiBmaW5kaW5nIGEgcmVjdXJzaXZlIHNjb3BlIGluaGVyaXRhbmNlLAoJICAgICAgZW1pdCBhIHdhcm5pbmcgaW4gdGhlIHdvcnN0IGNhc2UsIHJlcG9ydGVkIGJ5IE5pdHJvIAoJICAgIC0gZml4IHByZW1hdHVyZSBvYmplY3QgZGVsZXRpb24gcmVwb3J0ZWQgYnkgUGF1bCBpbiB0Y2wzZAoJICAgIC0gZml4IHdhcm5pbmcgcmVwb3J0ZWQgYnkgTml0cm8gaW4gVkM3CgkgICAgLSBtb3JlIGZpeGVzIGZvciBvbGQgU29sYXJpcyBjb21waWxlcgoJICAgIC0gZml4IGZvciBweXRob24gMi4zIGFuZCBnY19yZWZzIGlzc3VlIHJlcG9ydGVkIGJ5IEx1aWdpCgkgICAgLSBmaXggZmFzdHByb3h5IGZvciBtZXRob2RzIHVzaW5nIGt3YXJncwoJICAgIC0gZml4IG92ZXJsb2FkICsgcHJvdGVjdGVkIG1lbWJlciBpc3N1ZSByZXBvcnRlZCBieSBDb2xpbiBNY0RvbmFsZAoJICAgIC0gZml4IHNldGVycm9ybXNnIGFzIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggZGlyZWN0b3JzLCBub3cgdGhlIHRlc3Qtc3VpdGUgcnVucyBhZ2FpbiB1c2luZyAtZGlyZWN0b3JzCgkgICAgLSBmaXggZm9yIGZyaWVuZCBvcGVyYXRvciBhbmQgVmlzdWFsIHN0dWRpbyBhbmQgYnVnIDE0MzIxNTIKCSAgICAtIGZpeCBidWcgIzE0MzUwOTAKCSAgICAtIGZpeCB1c2luZyArICVleHRlbmQgYXMgcmVwb3J0ZWQgYnkgV2lsbGlhbQoJICAgIC0gZml4IGJ1ZyAjMTA5NDk2NAoJICAgIC0gZml4IGZvciBQeV9Ob3RJbXBsZW1lbnRlZCBhcyByZXBvcnRlZCBieSBPbGx5IGFuZCBBbWF1cnkKCSAgICAtIGZpeCBuZXN0ZWQgbmFtZXNwYWNlIGlzc3VlIHJlcG9ydGVkIGJ5IENoYXJsaWUKCgkgICAgYW5kIGFsc286CgkgICAgCgkgICAgLSBhbGxvdyBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycyBieSBkZWZhdWx0CgkgICAgLSBkZWxldGUgZXh0cmEgbmV3IGxpbmVzIGluIHN3aWdtYWNyb3NbVVRMXQoJICAgIC0gY29zbWV0aWMgZm9yIGdlbmVyYXRlZCBweXRob24gY29kZQoJICAgIC0gYWRkIHRoZSBmYWN0b3J5LmkgbGlicmFyeSBmb3IgVVRMCgkgICAgLSBhZGQgc3dpZ3JlZ2lzdGVyIHByb3h5IG1ldGhvZCBhbmQgbW92ZSBfX3JlcHJfXyB0byBhCgkgICAgICBzaW5nbGUgZ2xvYmFsIG1vZHVsZSAgW3B5dGhvbl0KCjAyLzIyLzIwMDY6IG1tYXR1cyAKCgkgICAgV2hlbiB1c2luZyBkaXJlY3RvcnMsIG5vdyBzd2lnIHdpbGwgZW1pdCBhbGwgdGhlIHZpcnR1YWwKCSAgICBwcm90ZWN0ZWQgbWV0aG9kcyBieSBkZWZhdWx0LiAKCgkgICAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIHlvdSBuZWVkZWQgdG8gdXNlIHRoZSAnZGlycHJvdCcKCSAgICBvcHRpb24gdG8gYWNoZWl2ZSB0aGUgc2FtZS4KCgkgICAgSWYgeW91IHdhbnQsIHlvdSBjYW4gZGlzYWJsZSB0aGUgbmV3IGRlZmF1bHQgYmVoYXZpb3VyLAoJICAgIHVzZSB0aGUgJ25vZGlycHJvdCcgb3B0aW9uOiAKCgkgICAgICAgc3dpZyAtbm9kaXJwcm90IC4uLgoKCSAgICBhbmQvb3IgdGhlICVub2RpcmVjdG9yIGZlYXR1cmUgZm9yIHNwZWNpZmljIG1ldGhvZHMsIGkuZS46CgoJICAgICAgICVub2RpcmVjdG9yIEZvbzo6YmFyOwoKCSAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICAgIHZpcnR1YWwgfkZvbygpOwoKCSAgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKCk7CgkgICAgICAgfTsKCSAgICAKCgkgICAgQXMgYmVmb3JlLCBwdXJlIGFic3RyYWN0IHByb3RlY3RlZCBtZW1iZXJzIGFyZSBhbGx3YXlzCgkgICAgZW1pdHRlZCwgaW5kZXBlbmRlbnQgb2YgdGhlICdkaXJwcm90L25vZGlycHJvdCcgb3B0aW9ucy4KCgowMi8yMi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBsYW5ndWFnZXMgdXNpbmcgdGhlIFVUTCAocHl0aG9uLHRjbCxydWJ5LHBlcmwpLgoJICAgIAogICAgICAgICAgICBmYWN0b3J5LmkgaW1wbGVtZW50cyBhIG1vcmUgbmF0dXJhbCB3cmFwIGZvciBmYWN0b3J5IG1ldGhvZHMuIAoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmU6CQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKICAJICAgICAgICAgc3RydWN0IEdlb21ldHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIAogIAkgICAgICAgICAgIGVudW0gR2VvbVR5cGV7CQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgICAgICBQT0lOVCwJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICAgIENJUkNMRQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIH5HZW9tZXRyeSgpIHt9ICAgIAkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIGludCBkcmF3KCkgPSAwOwkJCQkgICAgCiAgCSAgICAJIAkJCQkJCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgIAkgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgCSAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgICAgc3RhdGljIEdlb21ldHJ5ICpjcmVhdGUoR2VvbVR5cGUgaSk7ICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBQb2ludCA6IEdlb21ldHJ5ICB7CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGludCBkcmF3KCkgeyByZXR1cm4gMTsgfQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBkb3VibGUgd2lkdGgoKSB7IHJldHVybiAxLjA7IH0gICAgCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgQ2lyY2xlIDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAyOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSByYWRpdXMoKSB7IHJldHVybiAxLjU7IH0gICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgIH07IAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgICAgICAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgIEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlKEdlb21UeXBlIHR5cGUpIHsJCSAgICAKICAJICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgUE9JTlQ6IHJldHVybiBuZXcgUG9pbnQoKTsJICAgICAJCSAgICAKICAJICAgICAgICAgICBjYXNlIENJUkNMRTogcmV0dXJuIG5ldyBDaXJjbGUoKTsgCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB9CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICB9CQkJCQkgICAgCQkgICAgCiAgCSAgICAtLS0tICBnZW9tZXRyeS5oIC0tLS0tLS0tCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgWW91IGNhbiB1c2UgdGhlICVmYWN0b3J5IHdpdGggdGhlIEdlb21ldHJ5OjpjcmVhdGUgbWV0aG9kIGFzIGZvbGxvd3M6CgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICVuZXdvYmplY3QgR2VvbWV0cnk6OmNyZWF0ZTsJCQkJICAgIAogIAkgICAgICAlZmFjdG9yeShHZW9tZXRyeSAqR2VvbWV0cnk6OmNyZWF0ZSwgUG9pbnQsIENpcmNsZSk7CSAgICAKICAJICAgICAgJWluY2x1ZGUgImdlb21ldHJ5LmgiCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICBhbmQgR2VvbWV0cnk6OmNyZWF0ZSB3aWxsIHJldHVybiBhICdQb2ludCcgb3IgJ0NpcmNsZScgaW5zdGFuY2UgICAKICAJICAgIGluc3RlYWQgb2YgdGhlIHBsYWluICdHZW9tZXRyeScgdHlwZS4gRm9yIGV4YW1wbGUsIGluIHB5dGhvbjoJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgICBjaXJjbGUgPSBHZW9tZXRyeS5jcmVhdGUoR2VvbWV0cnkuQ0lSQ0xFKQkJCSAgICAKICAJICAgICAgciA9IGNpcmNsZS5yYWRpdXMoKQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIHdoZXJlICdjaXJjbGUnIG5vdyBpcyBhIENpcmNsZSBwcm94eSBpbnN0YW5jZS4JICAgIAkJICAgIAoKCjAyLzE3LzIwMDY6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IGFjY2VwdCB0aGUgZnVsbCByYW5nZSBvZiBpbnRlZ3JhbAoJICAgIHZhbHVlcywgYW5kIHRoZXkgc2lnbmFsIGFuIGVycm9yIHdoZW4gYSB2YWx1ZSBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgkgICAgW0d1aWxlXSBUeXBlbWFwcyBmb3IgYWxsIGludGVncmFsIHR5cGVzIG5vdyBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUKCSAgICB0aGUgdmFsaWQgcmFuZ2UgaXMgcGFzc2VkLgoKMDIvMTMvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0RvY3VtZW50c10gdXBkYXRlZCB0aGUgZXh0ZW5kaW5nIGRvY3VtZW50cyB0byBnaXZlIGEgc2tlbGV0b24gc3dpZ2dpbmcgY29kZQogICAgICAgICAgICB3aXRoIGEgZmV3IHR5cGVtYXBzLgogICAgICAgICAgICBbTHVhXSBhZGRlZCBhbiBleHRyYSB0eXBlbWFwIGZvciB2b2lkKiBbaW5dLCBzbyBhIGZ1bmN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgdm9pZCoKICAgICAgICAgICAgY2FuIHRha2UgYW55IGtpbmQgb2YgcG9pbnRlcgoKVmVyc2lvbiAxLjMuMjggKEZlYnJ1YXJ5IDEyLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBGaXggbWFueSBpc3N1ZXMgd2l0aCBsaW5lIGNvdW50aW5nIGFuZCBlcnJvciByZXBvcnRzLgoKMDIvMTEvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQmV0dGVyIHN0YXRpYyBkYXRhIG1lbWJlciBzdXBwb3J0LCBpZiB5b3UgaGF2ZQoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4gbm93IGlzIHZhbGlkIHRvIGFjY2VzcyB0aGUgc3RhdGljIGRhdGEgbWVtYmVyLCBpZToKCiAgICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICAgIGYuYmFyID0gMwoKCSAgICBqdXN0IGFzIGluIEMrKy4KCgowMi8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0KICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHRvIHdvcmsgYWdhaW4gd2l0aCBvbGQgdmVyc2lvbnMgb2YgUGVybAogICAgICAgICAgICAoNS4wMDQgYW5kIGxhdGVyIHRlc3RlZCkKCjAyLzA0LzIwMDY6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCB0aGUgJWV4dGVuZF9zbWFydF9wb2ludGVyKCkgZGlyZWN0aXZlIHRvIGV4dGVuZAoJICAgIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IGluIHB5dGhvbi4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHNtYXJ0IHBvaW50ZXIgYXM6CgkgICAgCgkgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gY2xhc3MgUkNQdHIgewoJICAgICAgcHVibGljOgoJICAgICAgICAuLi4KCSAgICAgICAgUkNQdHIoVHlwZSAqcCk7CgkJVHlwZSAqIG9wZXJhdG9yLT4oKSBjb25zdDsKCQkuLi4KCSAgICAgIH07CgkgICAgICAKCSAgICB5b3UgdXNlIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIgZGlyZWN0aXZlIGFzOgoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSAgUkNQdHI8QT47CgkgICAgCgkgICAgdGhlbiwgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgUkNQdHI8QT4gbWFrZV9wdHIoKTsKCSAgICAgIGludCBmb28oQSAqKTsKCgkgICAgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgoKCSAgICAgIGEgPSBtYWtlX3B0cigpOwoJICAgICAgYiA9IGZvbyhhKTsKCiAgICAgICAgICAgIGllLCBzd2lnIHdpbGwgYWNjZXB0IGEgUkNQdHI8QT4gb2JqZWN0IHdoZXJlIGEgJ0EgKicgaXMKICAgICAgICAgICAgZXhwZWN0ZWQuCgoJICAgIEFsc28sIHdoZW4gdXNpbmcgdmVjdG9ycwoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSBSQ1B0cjxBPjsKCSAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfQSkgc3RkOjp2ZWN0b3I8UkNQdHI8QT4gPjsKCQkKCSAgICB5b3UgY2FuIHR5cGUKCgkgICAgICBhID0gQSgpOwoJICAgICAgdiA9IHZlY3Rvcl9BKDIpCgkgICAgICB2WzBdID0gYQoKICAgICAgICAgICAgaWUsIGFuICdBIConIG9iamVjdCBpcyBhY2NlcHRlZCwgdmlhIGltcGxpY2l0IGNvbnZlcnNpb24sIAoJICAgIHdoZXJlIGEgUkNQdHI8QT4gb2JqZWN0IGlzIGV4cGVjdGVkLiBBZGRpdGlvbmFsbHkKCgkgICAgICB4ID0gdlswXQoKCSAgICByZXR1cm5zIChhbmQgc2V0cyAneCcgYXMpIGEgY29weSBvZiB2WzBdLCBtYWtpbmcgcmVmZXJlbmNlCgkgICAgY291bnRpbmcgcG9zc2libGUgYW5kIGNvbnNpc3RlbnQuCgoJICAgICVleHRlbmRfc21hcnRfcG9pbnRlciBpcyBqdXN0IGEgY29sbGVjdGlvbnMgb2YgbmV3L29sZAoJICAgIHRyaWNrcywgaW5jbHVkaW5nICV0eXBlbWFwcyBhbmQgdGhlIG5ldyAlaW1wbGljaXRjb252CgkgICAgZGlyZWN0aXZlLgoKMDIvMDIvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgYnVnZml4ICMxMzU2NTc3LCBjaGFuZ2VkIGRvdWJsZT0+bHVhX251bWJlciBpbiBhIGZldyBwbGFjZXMuCiAgICAgICAgICAgIGFkZGVkIHRoZSBzdGQ6OnBhaXIgd3JhcHBpbmcKCjAxLzMwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFuZCBzdGQ6OndzdHJpbmcgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBub3cgdXNlCiAgICAgICAgICAgICVuYXR1cmFsdmFyIGJ5IGRlZmF1bHQsIG1lYW5pbmcgdGhleSB3aWxsIG5vdyBiZSB3cmFwcGVkIGFzIGV4cGVjdGVkIGluIGFsbCBsYW5ndWFnZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlc2Ugd2VyZSB3cmFwcGVkIGFzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhIHRhcmdldCBsYW5ndWFnZSBzdHJpbmcuCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYWRkIHRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZCB0byB3cmFwIHRoZXNlIGFzIHN0cmluZ3M6CgoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjAxLzI4LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gCgkgICAgQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgowMS8yNC8yMDA2OiBtbWF0dXMKCSAgICAtIEJldHRlciBzdXBwb3J0IGZvciB0aGUgJW5hdHVyYWx2YXIgZGlyZWN0aXZlLCBub3cgaXQKCSAgICAgIHdvcmtzIHdpdGggdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgYXMgd2VsbCBhcwoJICAgICAgSmF2YS9DIy4KCSAgICAgIAoJICAgICAgTm93LCBpdCBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIGNsYXNzIHR5cGVzOgoKCSAgICAgICAgJW5hdHVyYWx2YXIgc3RkOjpzdHJpbmc7CgkgICAgICAgICVpbmNsdWRlIDxzdGRfc3RyaW5nLmk+CgkgICAgICAKICAgICAgICAgICAgICB0aGF0IHdpbGwgdGVsbCBzd2lnIHRvIHVzZSB0aGUgJ25hdHVyYWwnIHdyYXBwaW5nCiAgICAgICAgICAgICAgbWVjaGFuaXNtIHRvIGFsbCBzdGQ6OnN0cmluZyBnbG9iYWwgYW5kIG1lbWJlcgogICAgICAgICAgICAgIHZhcmlhYmxlcy4KCgkgICAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlICVhbGxvd2V4Y2VwdCBmZWF0dXJlIGFsb25nIHRoZQogICAgICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZXMsIHdoaWNoIGFsbG93cyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgdmFyaWFibGUgYWNjZXNzIG1ldGhvZHMuIEFsc28sIGFkZAogICAgICAgICAgICAgIHRoZSAlZXhjZXB0aW9udmFyIGRpcmVjdGl2ZSB0byBzcGVjaWZ5IGEgZGlzdGludGljCiAgICAgICAgICAgICAgZXhjZXB0aW9uIG1lY2hhbmlzbSBvbmx5IGZvciB2YXJpYWJsZXMuCgkgICAgICAKCSAgICAKCSAgICAtIEFkZCBtb3JlIGRvY3MgZm9yIHRoZSAlZGVsb2JqZWN0IGRpcmVjdGl2ZSB0byBtYXJrIGEgbWV0aG9kIGFzIGEKCSAgICAgIGRlc3RydWN0b3IsICdkaXNvd25pbmcnIHRoZSBmaXJzdCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgoJICAgICAgICAlbmV3b2JqZWN0IGNyZWF0ZV9mb287CgkgICAgICAgICVkZWxvYmplY3QgZGVzdHJveV9mb287CgoJICAgICAgICBGb28gKmNyZWF0ZV9mb28oKSB7IHJldHVybiBuZXcgRm9vKCk7IH0KCSAgICAgICAgdm9pZCBkZXN0cm95X2ZvbyhGb28gKmZvbykgeyBkZWxldGUgZm9vOyB9CgoJICAgICAgb3IgaW4gYSBtZW1iZXIgbWV0aG9kIGFzOgoKCSAgICAgICAgJWRlbG9iamVjdCBGb286OmRlc3Ryb3k7CgoJICAgICAgICBjbGFzcyBGb28gewoJICAgICAgICBwdWJsaWM6CgkgICAgICAgICAgdm9pZCBkZXN0cm95KCkgeyBkZWxldGUgdGhpczt9CgoJICAgICAgICBwcml2YXRlOgoJICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgfTsKCgowMS8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIC0gUmVtb3ZlZCB0aGUgdHlwZSBzd2lnX2x1YV9jb21tYW5kX2luZm8gJiByZXBsYWNlIHdpdGggbHVhTF9yZWcKCSAgICAgICh3aGljaCB0aGVuIGJyb2tlIHRoZSBjb2RlKSwgZml4ZWQgdGhpcwoJICAgIC0gYWRkZWQgYW4gYWRkaXRpb25hbCBjYXN0IGluIHRoZSB0eXBlbWFwcyBmb3IgZW51bSdzCgkgICAgICBkdWUgdG8gdGhlIGlzc3VlIHRoYXQgVkMuTmV0IHdpbGwgbm90IGFsbG93IGNhc3Rpbmcgb2YKCSAgICAgIGEgZG91YmxlIHRvIGFuIGVudW0gZGlyZWN0bHkuIFRoZXJlZm9yZSBjYXN0IHRvIGludCB0aGVuIHRvIGVudW0KCSAgICAgICh0aGFua3MgdG8gSmFzb24gUmVnbyBmb3IgdGhpcyBvYnNlcnZhdGlvbikKCjAxLzE2LzIwMDY6IG1tYXR1cyAoQ2hhbmdlIGRpc2FibGVkLi4uIHdpbGwgYmUgYmFjayBpbiBDVlMgc29vbikKCSAgICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciByZWdleHAgdmlhIHRoZSBleHRlcm5hbCBsaWJyYXJ5CgkgICAgUnhTcGVuY2VyLiBTV0lHIGRvZXNuJ3QgcmVxdWlyZSB0aGlzIGxpYnJhcnkgdG8gY29tcGlsZQoJICAgIGFuZC9vciBydW4uIEJ1dCBpZiB5b3Ugc3BlY2lmeSAtLXdpdGgtcnhzcGVuY2VyLCBhbmQgdGhlCgkgICAgbGlicmFyeSBpcyBmb3VuZCBkdXJpbmcgaW5zdGFsbGF0aW9uLCB0aGVuIHN3aWcgd2lsbCB1c2UKCSAgICBpdCBpbiB0aHJlZSBwbGFjZXM6CgoJICAgIC0gSW4gJXJlbmFtZXMgcnVsZXMsIHZpYSB0aGUgbmV3IHJ4c21hdGNoIHJ1bGVzLCBmb3IgZXhhbXBsZToKCSAgICAJICAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c21hdGNoJG5hbWU9IkdTTF8uKiIpICIiOwoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbm9kZVR5cGU9ImVudW0gR1NMXy4qIikgIiI7CgkgICAgCSAKICAgICAgICAgICAgICByeHNtYXRjaCBpcyBzaW1pbGFyIHRvIHRoZSBtYXRjaCBydWxlLCBpdCBqdXN0IHVzZXMKICAgICAgICAgICAgICB0aGUgUnhTcGVuY2VyIHJlZ2V4cCBsaWJyYXJ5IHRvIGRlY2lkZSBpZiB0aGVyZSBpcyBhCiAgICAgICAgICAgICAgbWF0Y2ggd2l0aCB0aGUgcHJvdmlkZWQgcmVnZXhwLiBBcyB3aXRoIHRoZSBtYXRjaAogICAgICAgICAgICAgIHJ1bGUsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIG5lZ2F0ZSBydWxlIG5vdHJ4c21hdGNoLgoKCSAgICAtIEluIHRoZSAlcmVuYW1lIHRhcmdldCBuYW1lIHZpYSB0aGUgcnhzdGFyZ2V0IG9wdGlvbiwgZm9yIGV4YW1wbGU6CgkgICAgCQkgCgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHN0YXJnZXQ9MSkgIkdTTF8uKiI7CgoJICAgIAl3aGVyZSB0aGUgdGFyZ2V0IG5hbWUgIkdTTC4qIiBpcyBub3cgdW5kZXJzdG9vZCBhcyBhCgkgICAgCXJlZ2V4cCB0byBiZSBtYXRjaGVkLiAgCgkgICAgCSAKICAgICAgICAgICAgLSBJbiB0aGUgbmV3IGVuY29kZXIgInJ4c3BlbmNlciIsIHdoaWNoIGxvb2tzIGxpa2U6CgoJICAgIAkgICUocnhzcGVuY2VyOltyZWdleHBdW3JlcGxhY2VdKXMKCgkgICAgCXdoZXJlICJyZWdleHAiIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kICJyZXBsYWNlIgoJICAgIAlpcyBhIHN0cmluZyB1c2VkIGFzIGEgcmVwbGFjZW1lbnQsIHdoZXJlIHRoZSBAMCxAMSwuLi4sQDkKCSAgICAJcHNldWRvIGFyZ3VtZW50cyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlCgkgICAgCWNvcnJlc3BvbmRpbmcgbWF0Y2hpbmcgaXRlbXMgaW4gdGhlIHJlZyBleHByZXNzaW9uLgoKCSAgICAJRm9yIGV4YW1wbGU6CgkgICAgCQkgICAgICAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBIZWxsbyAgICAtPiAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBHU0xIZWxsbyAtPiBHU0xIZWxsbwoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMKC4qKV1bQDFdKXMgICAgIDwtIEdTTEhlbGxvIC0+IEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtnc2xAMV0pcyAgPC0gR1NMSGVsbG8gLT4gZ3NsSGVsbG8KCgkgICAgCUFub3RoZXIgZXhhbXBsZSBjb3VsZCBiZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKGxvd2VyY2FzZSlzIixzb3VyY2VmbXQ9IiUocnhzcGVuY2VyOltHU0xfKC4qKV1bQDFdKXMiLCUkaXNmdW5jdGlvbikgIiI7CgoJICAgIAl3aGljaCB0YWtlIG91dCB0aGUgcHJlZml4ICJHU0xfIiBhbmQgcmV0dXJucyBhbGwgdGhlCgkgICAgCWZ1bmN0aW9uIG5hbWVzIGluIGxvd2VyIGNhc2VzLCBhcyBmb2xsb3dpbmc6CgoJICAgIAkgICAgdm9pZCBHU0xfSGVsbG8oKTsgICAtPiAgIGhlbGxvKCk7CgkgICAgCSAgICB2b2lkIEdTTF9IaSgpOyAgICAgIC0+ICAgaGkoKTsKCSAgICAJICAgIGNvbnN0IGludCBHU0xfTUFYOyAgLT4gICBHU0xfTUFYOyAgLy8gbm8gY2hhbmdlLCBpcyBub3QgYSBmdW5jdGlvbgoJCgkgICAgV2UgdXNlIHRoZSBSeFNwZW5jZXIgYXMgYW4gaW5pdGlhbCB0ZXN0IGJlZCB0bwogICAgICAgICAgICBpbXBsZW1lbnRpb24gd2hpbGUgd2UgZGVjaWRlIHdoaWNoIGxpYnJhcnkgd2lsbCBiZQogICAgICAgICAgICBmaW5hbGx5IGFkZGVkIHRvIHN3aWcuCgogICAgICAgICAgICBZb3UgY2FuIG9idGFpbiB0aGUgUnhTcGVuY2VyIGxpYnJhcnkgZnJvbSAKCSAgICAKCSAgICAgIGh0dHA6Ly9hcmdsaXN0LmNvbS9yZWdleCAoVW5peCkKCgkgICAgb3IKCSAgICAgCgkgICAgICBodHRwOi8vZ251d2luMzIuc291cmNlZm9yZ2UubmV0L3BhY2thZ2VzLmh0bWwgKFdpbmRvd3MpCgoJICAgIE9uY2UgaW5zdGFsbGVkLCB1c2UgIm1hbiByeHNwZW5jZXIiIHRvIGdldCBtb3JlIGluZm8KCSAgICBhYm91dCB0aGUgcmVnZXhwIGZvcm1hdCwgb3IganVzdCBnb29nbGUgcnhzcGVuY2VyLgoKCSAgICBTaW5jZSBub3cgeW91IGNhbiBlbmFibGUgdGhlIHJ4c21hdGNoIHJ1bGVzIChzZWUgYWJvdmUpLAogICAgICAgICAgICB0aGUgc2ltcGxlIG9yICd8JyBzdXBwb3J0IGZvciB0aGUgbWF0Y2ggcnVsZXMKICAgICAgICAgICAgKDAxLzEyLzIwMDY6IG1tYXR1cykgaXMgZGlzYWJsZWQuIFN0aWxsLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIHRoZSByeHNwZW5jZXIgbGlicmFyeSwgeW91IGNhbiByZS1lbmFibGUKICAgICAgICAgICAgdGhlIHNpbXBsZSAnbWF0Y2ggb3InIHN1cHBvcnQgdXNpbmcKICAgICAgICAgICAgLURTV0lHX1VTRV9TSU1QTEVfTUFUQ0hPUi4KCSAgCgowMS8xNi8yMDA2OiBtbWF0dXMKCSAgICBDaGFuZ2UgdGhlICVyZW5hbWUgcHJlZGljYXRlcyB0byB1c2UgdGhlIHByZWZpeCAnJSQnLCBhcyBpbjoKCSAgICAKCSAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCUkaXNmdW5jdGlvbiwlJGlzbWVtYmVyKSAiIjsgCgkgICAJCiAgICAgICAgICAgIHRvIGF2b2lkIGNsYXNoaW5ncyB3aXRoIG90aGVyIHN3aWcgbWFjcm9zL2RpcmVjdGl2ZXMuCgowMS8xNC8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgUnVieSBiYW5nISBtZXRob2RzIHZpYSBhIG5ldyAlYmFuZyBmZWF0dXJlLgoJICAgIEJhbmcgbWV0aG9kcyBlbmQgaW4gZXhjbGFtYXRpb24gcG9pbnRzIGFuZCBpbmRpY2F0ZSB0aGF0IHRoZQoJICAgIG9iamVjdCBiZWluZyBwcm9jZXNzZWQgd2lsbCBiZSBtb2RpZmllZCBpbi1wbGFjZSBhcyAKCSAgICBvcHBvc2VkIHRvIGJlaW5nIGNvcGllZC4KCjAxLzEyLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBVcGRhdGVkIHRoZSBSdWJ5IG1vZHVsZSB0byBhdXRvbWF0aWNhbGx5IGNvbnZlcnQKCSAgICBtZXRob2QgbmFtZXMgdG8gbG93ZXJfY2FzZV93aXRoX3VuZGVyc2NvcmVzIHVzaW5nIHRoZQoJICAgIG5ldyAlcmVuYW1lIGZ1bmN0aW9uYWxpdHkuCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBhbGlhc2VzIGZvciAnY2FzZScgZW5jb2RlcnMgdXNlZCB3aXRoICVyZW5hbWUvJW5hbWV3YXJuCgoJICAgICAgJSh1cHBlcmNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhFTExPX1dPUkxECgkgICAgICAlKGxvd2VyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG93b3JsZAoJICAgICAgJShjYW1lbGNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhlbGxvV29ybGQKCSAgICAgICUodW5kZXJjYXNlKXMgICBIZWxsb1dvcmxkICAtPiBoZWxsb193b3JsZAoKCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAtZHVtcF9wYXJzZV9tb2R1bGUgYW5kIC1kdW1wX3BhcnNlX3RvcCBvcHRpb25zLAoJICAgIHdoaWNoIGFyZSBzaW1pbGFyIHRvIC1kdW1wX21vZHVsZSBhbmQgLWR1bXBfdG9wLCBidXQgdGhleQoJICAgIGR1bXAgdGhlIG5vZGUgdHJlZXMganVzdCBhZnRlciBwYXJzaW5nLCBzaG93aW5nIG9ubHkgdGhlIAoJICAgIGF0dHJpYnV0ZXMgdmlzaWJsZSBhdCB0aGUgcGFyc2luZyBzdGFnZSwgYW5kIG5vdCB0aGUgYWRkZWQKCSAgICBsYXRlciBpbiB0eXBlbWFwLmN4eCwgYWxsb2NhdGUuY3h4LCBsYW5nLmN4eCBvciBlbHNld2hlcmUuCgkgICAgCgkgICAgQmVzaWRlcyBkZWJ1Z2dpbmcgcG9ycHVzZXMsIHRoZXNlIG9wdGlvbnMgYXJlIHZlcnkgdXNlZnVsCgkgICAgaWYgeW91IHBsYW4gdG8gdXNlICVyZW5hbWUgaW4gYW4gImFkdmFuY2Ugd2F5Iiwgc2luY2UgaXQKCSAgICBzaG93cyBvbmx5IGFuZCBhbGwgdGhlIG5vZGUncyBhdHRyaWJ1dGVzIHlvdSBjYW4gdXNlCgkgICAgaW5zaWRlIHRoZSBtYXRjaCBydWxlcy4KCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBwcmVkaWNhdGVzIHRvICVyZW5hbWUsIHNvLCB5b3UgZG9uJ3QgbmVlZCB0bwoJICAgICAgcmVtZW1iZXIsIGZvciBleGFtcGxlLCBob3cgdG8gbWF0Y2ggYSBtZW1iZXIgZnVuY3Rpb24uCgoJICAgICAgTm93IGl0IGlzIGVhc3ksIGZvciBleGFtcGxlIHRvIHVzZSB0aGUgJ3V0aXRsZScgZW5jb2RlciAKCSAgICAgIGluIGFsbCB0aGUgbWVtYmVyIG1ldGhvZHMsIHlvdSB0eXBlOgoKCSAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJWlzZnVuY3Rpb24sJWlzbWVtYmVyKSAiIjsKCgkgICAgICBvciB0byBpZ25vcmUgYWxsIHRoZSBlbnVtaXRlbXMgaW4gYSBnaXZlbiBjbGFzczoKCgkgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCAlaXNlbnVtaXRlbSwgJWNsYXNzbmFtZT0iTXlDbGFzcyIpICIiOyAgCgoJICAgICAgQXZhaWxhYmxlIHByZWRpY2F0ZXMgYXJlIChzZWUgc3dpZy5zd2cpOgoKICAgICAgICAgICAgICAgICVpc2VudW0gICAgICAgICAKCQklaXNlbnVtaXRlbSAgICAgCgkJJWlzYWNjZXNzICAgICAgIAoJCSVpc2NsYXNzICAgICAgICAKCQklaXNleHRlbmQgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2NvbnN0cnVjdG9yICAKCQklaXNkZXN0cnVjdG9yICAgCgkJJWlzbmFtZXNwYWNlICAgIAoJCSVpc3RlbXBsYXRlICAgICAKCQklaXNjb25zdGFudCAgICAgCgkJCQkJCgkJJWlzdW5pb24gICAgICAgIAoJCSVpc2Z1bmN0aW9uICAgICAKCQklaXN2YXJpYWJsZSAgICAgCgkJJWlzaW1tdXRhYmxlICAgIAoJCQkJCQoJCSVpc3N0YXRpYyAgICAgICAKCQklaXNmcmllbmQgICAgICAgCgkJJWlzdHlwZWRlZiAgICAgIAoJCSVpc3ZpcnR1YWwgICAgICAKCQklaXNleHBsaWNpdCAgICAgCgkJJWlzZXh0ZXJuICAgICAgIAoJCQkJCQoJCSVpc21lbWJlciAgICAgICAKCQklaXNnbG9iYWwgCgkJJWlubmFtZXNwYWNlCgoJCSVpc3B1YmxpYyAgICAKCQklaXNwcm90ZWN0ZWQgCgkJJWlzcHJpdmF0ZSAgIAoJCQkJICAgICAKCQklY2xhc3NuYW1lICAgCgogICAgICAgICAgICAgIFRoZXNlIHByZWRpY2F0ZXMgY29ycmVzcG9uZCB0byBzcGVjaWZpYyAnbWF0Y2gnCiAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLCB3aGljaCBzb21ldGltZXMgYXJlIG5vdCBhcyBldmlkZW50IGFzIHRoZQogICAgICAgICAgICAgIHByZWRpY2F0ZXMgbmFtZXMuCgoKICAgICAgICAgICAgLSBBZGQgdGhlIG9yICd8JyBvcGVyYXRpb24gaW4gJXJlbmFtZSBtYXRjaCwgZm9yCiAgICAgICAgICAgICAgZXhhbXBsZSB0byBjYXBpdGFsaXplIGFsbCB0aGUgY29uc3RhbnRzICglY29uc3RhbnQgb3IKICAgICAgICAgICAgICBjb25zdCBjZGVjbCk6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIsbWF0Y2g9ImNkZWNsfGNvbnN0YW50IiwlaXNpbW11dGFibGUpICIiOwogICAgICAgICAgICAgICAgCgoKMDEvMTIvMjAwNjogbWdvc3NhZ2UKCSAgICAtCVBhcnRpYWwgZml4ZWQgb2YgZXJyb3JzIHVuZGVyIEM4OSwgYnVnICMxMzU2NTc0CgkgICAgCShjb252ZXJ0ZWQgQysrIHN0eWxlIGNvbW1lbnRzIHRvIEMgc3R5bGUpCgkgICAgLQlBZGRlZCBwYXRjaGVzIGZyb20gbmVvbWFudHJhQHVzZXJzLnNmLm5ldCAjMTM3OTk4OCBhbmQgIzEzODgzNDMKCSAgICAJbWlzc2luZyBhICdyZXR1cm4nIHN0YXRlbWVudCBmb3IgZXJyb3IgY29uZGl0aW9ucwoJICAgIAlhbHNvIHVwZGF0ZWQgdGhlICVpbml0IGJsb2NrIGJ1ZyAjMTM1NjU4NgoJCSAKMDEvMTAvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgdGhlICd1dGl0bGUnIGVuY29kZXIsIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGFkZAoJICAgICAgeW91ciBvd24gZW5jb2Rlci4gSSBhZGRlZCB0aGUgZW5jb2RlciBtZXRob2QgaW4gbWlzYy5jIAoJICAgICAgYnV0IGRldmVsb3BlcnMgY2FuIGFkZCBvdGhlcnMsIHRoZSBzYW1lIHdheSwgaW5zaWRlIGFueQoJICAgICAgdGFyZ2V0IGxhbmd1YWdlLgoJICAgICAgCgkgICAgICBXZWxsLCAndXRpdGxlJyBpcyB0aGUgcmV2ZXJzZSBvZiAnY3RpdGxlJywgaWU6CgoJICAgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7ICAtPiBDYW1lbENhc2U7CgkgICAgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIikgQ2FtZWxDYXNlOyAgIC0+IGNhbWVsX2Nhc2U7CgkJIAoKMDEvMTAvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQogICAgICAgICAgICBVcGRhdGVkIFJ1YnkgRXhjZXB0aW9uIGhhbmRsaW5nLiAgQ2xhc3NlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhyb3dzIGNsYXVzZXMsIAogICAgICAgICAgICBvciBhcmUgbWFya2VkIGFzICVleGNlcHRpb25jbGFzcywgYXJlIG5vdyBpbmhlcml0ZWQgZnJvbSByYl9lUnVudGltZUVycm9yLiAKICAgICAgICAgICAgVGhpcyBhbGxvd3MgaW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgdG8gYmUgcmV0dXJuZWQgdG8gUnVieSBhcyBleGNlcHRpb25zLiAKICAgICAgICAgICAgVGh1cyBpZiBhIEMrKyBtZXRob2QgdGhyb3dzIGFuIGluc3RhbmNlIG9mIE15RXhjZXB0aW9uLCB0aGUgY2FsbGluZyBSdWJ5IAogICAgICAgICAgICBtZXRob2Qgd2lsbCBnZXQgYmFjayBhIE15RXhjZXB0aW9uIG9iamVjdC4gIFRvIHNlZSBhbiBleGFtcGxlLCAKICAgICAgICAgICAgbG9vayBhdCBydWJ5L2V4YW1wbGVzL2V4Y2VwdGlvbl9jbGFzcy4KCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIAogICAgICAgICAgICAtIEFkZCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlLCB3aGljaCBjb21wbGVtZW50cyB0aGUgJWV4Y2VwdGlvbgoJICAgIGRpcmVjdGl2ZSBpbiBhIG1vcmUgYXV0b21hdGljIHdheS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEUxKTsKCiAgICAgICAgICAgIHN3aWcgZ2VuZXJhdGVzIHRoZSBwcm9wZXIgdHJ5L2NhdGNoIGNvZGUgdG8gZGlzcGF0Y2ggRTEuCgkgICAgCgkgICAgQnV0IGlmIHlvdSBoYXZlOgoKCgkgICAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKCSAgICAgICAgICAgICAgIHRocm93IEUxKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgdGhyb3cgRTIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGllLCB3aGVyZSB0aGVyZSBpcyBubyBleHBsaWNpdCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpbiB0aGUgZGVjbCwgeW91IAoJICAgIGVuZCB1cCBkb2luZzoKCQkgIAogICAgICAgICAgICAgICAlZXhjZXB0aW9uIGJhcmZvbyB7CQkJCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFMSkgewkuLi4gfQkJCQkgIAoJICAgICAgICAgfSBjYXRjaChFMikgewkuLi4gfQkJCQkgIAoJICAgICAgIH0JCQkJCgkgICAgCgkgICAgd2hpY2ggaXMgdmVyeSB0ZWRpb3VzLiBXZWxsLCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlIGRlZmluZXMKCSAgICB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRvIGNhdGNoLCBhbmQgZnJvbSBzd2lnOgogCQoJICAgICAgICVjYXRjaGVzKEUxLEUyKSBiYXJmb28oaW50IGkpOwoJICAgICAgIGludCBiYXJmb28oaW50IGkpOwoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0byAKCgkgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKCSAgICBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSAlY2F0Y2hlcyBsaXN0IGRvZXNuJ3QgaGF2ZSB0bwoJICAgIGNvcnJlc3BvbmQgdG8gdGhlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdQoJICAgIGhhdmU6CgoJCXN0cnVjdCBFIHt9OwoJCXN0cnVjdCBFMSA6IEUge307CgkJc3RydWN0IEUyIDogRSB7fTsKCiAgCSAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKICAgICAgICAgICAgeW91IGNhbiBkZWZpbmUKCSAgICAgICAgCgkJJWNhdGNoZXMoRSkgYmFyZm9vKGludCBpKTsKCQoJICAgIGFuZCBzd2lnIHdpbGwgZ2VuZXJhdGUgYW4gYWN0aW9uIGNvZGUgZXF1aXZhbGVudCB0bwoKCSAgICAgICAgIHRyeSB7CQkJCQoJICAgICAgICAgICAkYWN0aW9uCQkJCgkgICAgICAgICB9IGNhdGNoKEUgJl9lKSB7IAoJCSAgIDxyYWlzZSBfZT47CgkJIH0JCgogICAgICAgICAgICBPZiBjb3Vyc2UsIHlvdSBzdGlsbCBoYXZlIHRvIHNhdGlzZnkgdGhlIEMrKyByZXN0cmljdGlvbnMsCgkgICAgYW5kIHRoZSBjYXRjaGVzIGxpc3QgbXVzdCBiZSBjb21wYXRpYmxlIChub3QgdGhlIHNhbWUpCgkgICAgYXMgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgdHlwZXMgaW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgoKCSAgICBBbHNvLCB5b3UgY2FuIG5vdyBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gY2F0Y2ggdGhlCgkgICAgdW5rbm93biBleGNlcHRpb24gJy4uLicsIGZvciBleGFtcGxlOgoKCSAgICAgICAlY2F0Y2hlcyhFMSxFMiwuLi4pIGJhcmZvbyhpbnQpOwoKCSAgICBJbiBhbnkgY2FzZSwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSB3aWxsIGVtaXQgdGhlCgkgICAgY29kZSB0byBjb252ZXJ0IGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBlcnJvci9leGNlcHRpb24KICAgICAgICAgICAgdXNpbmcgdGhlICd0aHJvd3MnIHR5cGVtYXAuCgoJICAgIEZvciB0aGUgJy4uLicgY2FzZSB0byB3b3JrLCB5b3UgbmVlZCB0bwoJICAgIHdyaXRlIHRoZSBwcm9wZXIgdHlwZW1hcCBpbiB5b3VyIHRhcmdldCBsYW5ndWFnZS4gSW4gdGhlCgkgICAgVVRMLCB0aGlzIGxvb2tzIGxpa2U6CgoJICAgICAgJXR5cGVtYXAodGhyb3dzKSAoLi4uKSB7CgkgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfUnVudGltZUVycm9yLCJ1bmtub3duIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgIH0KCjAxLzA5LzIwMDY6IG11dGFuZGl6CgkgICAgW0FsbGVncm9jbF0KCiAgICAgICAgICAgIEZpeGVzIGEgbnVtYmVyIG9mIFNFR1ZzIHByaW1hcmlseSBpbiB0aGUgaGFuZGxpbmcgb2YKICAgICAgICAgICAgdmFyaW91cyBhbm9ueW1vdXMgdHlwZXMuIEZvdW5kIGluIGEgcGFzcyB0aHJvdWdoIHRoZQogICAgICAgICAgICBzd2lnIHRlc3Qtc3VpdGUuIFN0aWxsIG1vcmUgdG8gZG8gaGVyZSwgYnV0IHRoaXMgaXMgYQogICAgICAgICAgICBnb29kIGNoZWNrcG9pbnQuCgogICAgICAgICAgICBBZGRzIC1jd3JhcCBhbmQgLW5vY3dyYXAgYXMgYW4gYWxsZWdyb2NsIHNwZWNpZmljCiAgICAgICAgICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudC4gQ29udHJvbHMgZ2VuZXJhdGluZyBvZiBhIEMKICAgICAgICAgICAgd3JhcHBlciBmaWxlIHdoZW4gd3JhcHBpbmcgQyBjb2RlLiBCeSBkZWZhdWx0IG9ubHkgYQogICAgICAgICAgICBsaXNwIGZpbGUgaXMgY3JlYXRlZCBmb3IgQyBjb2RlIHdyYXBwaW5nLgoKICAgICAgICAgICAgRG9jIHVwZGF0ZXMgZm9yIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCBmaXhlcyBhcwogICAgICAgICAgICBwb2ludGVkIG91dCBvbiBzd2lnLWRldmVsCgowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHVuc2lnbmVkIGxvbmcgbG9uZyBhbmQgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICYgdHlwZW1hcHMKICAgICAgICAgICAgLSBCdWcgIzEzOTgzOTQgIHdpdGggcGF0Y2ggZnJvbSBEcmllcyBEZWNvY2sKCjAxLzA2LzIwMDY6IG1tYXR1cwoJICAgIEFkZCAnbmFtZWQnIHdhcm5pbmcgY29kZXMsIG5vdyBpbiBhZGRpdGlvbiB0bzoKCSAgICAKCSAgICAgICV3YXJuZmlsdGVyKDgxMyk7CgkgICAKCSAgICB5b3UgY2FuIHVzZQoKCSAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX0pBVkFfTVVMVElQTEVfSU5IRVJJVEFOQ0UpOwoKCSAgICBqdXN0IHVzZSB0aGUgc2FtZSBjb2RlIG5hbWUgZm91bmQgaW4gIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmggCgkgICAgcGx1cyB0aGUgJ1NXSUcnIHByZWZpeC4KCgkgICAgSWYgYSBkZXZlbG9wZXIgYWRkcyBhIG5ldyB3YXJuaW5nIGNvZGUsIHRoZSBMaWIvc3dpZ3dhcm4uc3dnIGZpbGUKICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBydW5uaW5nIHRoZSB0b3AgbGV2ZWwgbWFrZS4KCjAxLzA1LzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBSZWltcGxlbWVudGVkIG9iamVjdCB0cmFja2luZyBmb3IgUnVieS4gIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gd29ya3MKCSAgICBieSBleHBhbmRpbmcgdGhlIHN3aWdfY2xhc3Mgc3RydWN0dXJlIGZvciBSdWJ5IGJ5IGFkZGluZyBhIHRyYWNrT2JqZWN0cwoJICAgIGZpZWxkLiAgVGhpcyBmaWVsZCBjYW4gYmUgc2V0L3Vuc2V0IHZpYSAldHJhY2tvYmplY3RzIGFzIGV4cGxhaW5lZAoJICAgIGluIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24uICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIGlzIG1vcmUgcm9idXN0CgkgICAgYW5kIHRha2VzIGxlc3MgY29kZSB0byBpbXBsZW1lbnQuCgkJCjAxLzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWV4dGVuZCBhbmQgc3RhdGljIGNvbnN0IGludGVncmFsIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgYmFyID0gNDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsgCgoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluZm8gZm9yIG9sZCBhbmQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBlbnRpcmUgbm9kZSB0cmVlLCBpbmNsdWRpbmcgc3lzdGVtIG5vZGVzICAgIAogICAgIAkgICAgLWR1bXBfbW9kdWxlICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gb2YgdGhlIG1vZHVsZSBub2RlIHRyZWUsIGF2b2lkaW5nIHN5c3RlbSBub2RlcyAgICAgCiAgICAgCSAgICAtZHVtcF9jbGFzc2VzICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3NlcyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCSAgICAgICAKICAgICAJICAgIC1kdW1wX3R5cGVkZWYgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlcyBhbmQgdHlwZWRlZnMgZm91bmQgaW4gdGhlIGludGVyZmFjZQogICAgIAkgICAgLWR1bXBfdGFncyAgICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZ3MgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZGVidWdfdHlwZW1hcCAgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHR5cGVtYXBzCQkJICAgICAgIAogICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHRlbXBsYXRlcwkJCSAgICAgICAgCgoJICAtIEFkZCB0aGUgZmFrZXZlcnNpb24uIElmIHlvdSBoYXZlIGEgcHJvamVjdCB0aGF0IHVzZXMKICAgICAgICAgICAgY29uZmlndXJlL3NldHVwLnB5LCBvciBhbm90aGVyIGF1dG9tYXRpYyBidWlsZGluZyBzeXN0ZW0KICAgICAgICAgICAgYW5kIHJlcXVpcmVzIGEgc3BlY2lmaWMgc3dpZyB2ZXJzaW9uLCBsZXQgc2F5IDEuMy4yMiAKCSAgICB5b3UgY2FuIHVzZToKCgkgICAgICAgU1dJR19GRUFUVVJFUz0iLWZha2V2ZXJzaW9uIDEuMy4yMiIKCgkgICAgIG9yCiAKICAgICAgICAgICAgICAgc3dpZyAtZmFrZXZlcnNpb24gMS4zLjIyCgogICAgICAgICAgICAgYW5kIHRoZW4gc3dpZyAtdmVyc2lvbiB3aWxsIHJlcG9ydCAxLjMuMjIgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgIGN1cnJlbnQgdmVyc2lvbi4KCgkgICAgIFR5cGljYWwgdXNlIHdvdWxkIGJlCgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiIC4vY29uZmlndXJlIAkgICAgIAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBvcHRpb24vZm9ybWF0IHN1cHBvcnQgdG8gJXJlbmFtZSBhbmQgJW5hbWV3YXJuLgkKCSAgICBOb3cgJW5hbWV3YXJuIGNhbiBmb3JjZSByZW5hbWluZywgZm9yIGV4YW1wbGU6CgoJICAgICAgJW5hbWV3YXJuKCIzMTQ6IGltcG9ydCBpcyBhIGtleXdvcmQiLHJlbmFtZT0iXyVzIikgImltcG9ydCI7CgkgICAgCgkgICAgYW5kIHJlbmFtZSBjYW4gYWxzbyBzdXBwb3J0IGZvcm1hdCBmb3JtczoKCgkgICAgICAgJXJlbmFtZSgic3dpZ18lcyIpIGltcG9ydDsKCgkgICAgTm93LCBzaW5jZSB0aGUgZm9ybWF0IGlzIHByb2Nlc3NlZCB2aWEgc3dpZyBQcmludGYsIHlvdQoJICAgIGNhbiB1c2UgZW5jb2RlcnMgYXMgZm9sbG93czoKCgkgICAgICAgJXJlbmFtZSgiJSh0aXRsZSlzIikgIGltcG9ydDsgICAgIC0+IEltcG9ydAoJICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIpICBpbXBvcnQ7ICAgICAtPiBJTVBPUlQKCSAgICAgICAlcmVuYW1lKCIlKGxvd2VyKXMiKSAgSW1wb3J0OyAgICAgLT4gaW1wb3J0CgkgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7IC0+IENhbWVsQ2FzZQoJICAgICAgIAoJICAgIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBhZGQgbW9yZSBlbmNvZGVycywgYXMgdGhlIAoJICAgIGV4cGVjdGVkIG9uZSBmb3IgcmVndWxhciBleHByZXNzaW9ucy4gCgoJICAtIEFkZCB0aGUgYWJvdmUgJ2N0aXRsZScgZW5jb2Rlciwgd2hpY2ggZG9lcyB0aGUgY2FtZWwgY2FzZToKCgkgICAgICAgIGNhbWVsX2Nhc2UgLT4gQ2FtZWxDYXNlCiAgCgkgIC0gQWxzbywgd2hpbGUgd2UgZ2V0IHRoZSByZWdleHAgc3VwcG9ydCwgYWRkIHRoZSAnY29tbWFuZCcgZW5jb2RlciwKICAgICAgICAgICAgeW91IGNhbiB1c2UgaXQgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOnNlZCAtZSAncy9cKFthLXpdXCkvXFVcXDEvJyA8PDwgKXMiKSBpbXBvcnQ7IAoKCSAgICB0aGVuIHN3aWcgd2lsbCBwb3BlbiB0aGUgY29tbWFuZAoJICAgIAoJCSJzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IGltcG9ydCIKCQkKICAgICAgICAgICAgc2VlIGJlbG93IGZvciBhbm9ueW1vdXMgcmVuYW1lcyBmb3IgYmV0dGVyIGV4YW1wbGVzLgkJCgogICAgICAgICAgLSBUaGUgcmVuYW1lIGRpcmVjdGl2ZSBub3cgYWxzbyBhbGxvd3M6CgoJICAgIC0gc2ltcGxlIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgYSB0eXBlIG1hdGNoCgkgICAgICBoYXBwZW4sIGZvciBleGFtcGxlCgoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaD0iZW51bWl0ZW0iKSBoZWxsbzsKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgkJIGludCBoZWxsbygpICAtPiAgaGVsbG87IAoKCSAgICAtIGV4dGVuZGVkIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgdGhlICdleHRlbmRlZCBhdHRyaWJ1dGUnIG1hdGNoCgkgICAgICBvY2N1cnJlZCwgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHNhbWUgYXMgc2ltcGxlIG1hdGNoIAkJCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpIGhlbGxvOyAKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgoJICAgICAgIE5vdGUgdGhhdCB0aGUgc3ltYm9sICckJyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgYXR0cmlidXRlIG5hbWUgaW4KCSAgICAgICBhICdyZWN1cnNpdmUnIHdheSwgZm9yIGV4YW1wbGU6CgoJCSAvLyBtYXRjaCBvbmx5IGhlbGxvIGluICdlbnVtIEhlbGxvJwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAgLy8gbWF0Y2gKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoKICAgICAgICAgICAgICAgaGVyZSwgZm9yIEhlbGxvOjpoaSwgdGhlICJwYXJlbnROb2RlIiBpcyAiSGVsbG8iLCBhbmQgaXRzICJ0eXBlIgogICAgICAgICAgICAgICBpcyAiZW51bSBIZWxsbyIuCgkgICAgICAgCgkgICAgICAgCiAgICAgICAgICAgIC0gQW5vbnltb3VzIHJlbmFtZXM6IHlvdSBjYW4gdXNlICdhbm9ueW1vdXMnIHJlbmFtZSBkaXJlY3RpdmVzLCBmb3IgZXhhbXBsZTogCgoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyBpbiBIZWxsbwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSAiIjsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgSGksIEhlbGxvICAgLy8gbWF0Y2ggYm90aAoJCSB9OwoKCQkgZW51bSBIaSB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBoZWxsbyAgIC8vIG5vIG1hdGNoCgkJIH07CgkJIAoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyAKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkbm9kZVR5cGU9ImVudW1pdGVtIikgIiI7IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGl0ZW1zIGluIGdpdmVuIGNvbW1hbmQgKHNsb29vb3csIGJ1dC4uLikKCQkgJXJlbmFtZSglKGNvbW1hbmQ6PG15IGV4dGVybmFsIGNtZD4pcykgIiI7IAoKCQoJICAgICAgQW5vbnltb3VzIHJlbmFtZXMgd2l0aCBjb21tYW5kcyBjYW4gYmUgdmVyeSBwb3dlcmZ1bCwgc2luY2UgeW91CgkgICAgICBjYW4gJ291dHNvdXJjZScgYWxsIHRoZSByZW5hbWluZyBtZWNoYW5pc20gKG9yIHBhcnQgb2YgaXQpIHRvIGFuCgkgICAgICBleHRlcm5hbCBwcm9ncmFtOgoJICAgICAgCgkgICAgICAgIC8vIFVwcGVyY2FzZSBhbGwgKGFuZCBvbmx5KSB0aGUgbmFtZXMgdGhhdCBzdGFydCB3aXRoICdpJwoJICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6YXdrICcvXmkve3ByaW50IHRvdXBwZXIoJDEpfScgPDw8KXMiKSAiIjsgICAKCSAgICAgICAKCSAgICAgICAgaW50IGltcG9ydGVkKCkgLT4gSU1QT1JURUQ7CgkgICAgICAgIGludCBoZWxsbygpICAgIC0+IGhlbGxvCgoJICAgICAgTm90ZSB0aGF0IGlmIHRoZSAnY29tbWFuZCcgZW5jb2RlciByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywgc3dpZwoJICAgICAgdW5kZXJzdGFuZHMgdGhhdCBubyByZW5hbWUgaXMgbmVjZXNzYXJ5LgoKCSAgICAgIEFsc28gbm90ZSB0aGF0ICVyZW5hbWUgJ3Bhc3NlcycgdGhlIG1hdGNoZWQgbmFtZS4gRm9yIGV4YW1wbGUsIGluCgkgICAgICB0aGlzIGNhc2UKCgkgICAgICAgIG5hbWVzcGFjZSBuczEgewoJCSAgaW50IGZvbygpOwoJCX0KCgkgICAgICAgIG5hbWVzcGFjZSBuczIgewoJCSAgaW50IGJhcigpOwoJCX0KCgkgICAgICB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSBvbmx5IHJlY2VpdmVzICJmb28iIGFuZCAiYmFyIi4gSWYgbmVlZGVkLAoJICAgICAgaG93ZXZlciwgeW91IGNhbiByZXF1ZXN0IHRoZSAnZnVsbG5hbWUnIAoJICAgICAgIAkKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnYXdrICcvbnMxOjove2w9c3BsaXQoJDEsYSwiOjoiKTsgcHJpbnQgdG91cHBlcihhW2xdKX0nJyA8PDwpcyIsZnVsbG5hbWU9MSkgIiI7ICAgCiAgICAgICAgICAgICAgICAKCQluczE6OmZvbyAtPiBGT08KCQluczI6OmJhciAtPiBiYXIJCgkKCSAgICAtIE1peGluZyBlbmNvZGVycyBhbmQgbWF0Y2hpbmc6IG9mIGNvdXJzZSwgeW91IGNhbiBkbyBtaXggY29tbWFuZHMKCSAgICAgIGFuZCBtYXRjaCBmaWVsZHMsIGZvciBleGFtcGxlOgoKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZm5jcz4pIixtYXRjaD0iY2RlY2wiKSAiIjsKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZW51bXM+KSIsbWF0Y2g9ImVudW1pdGVtIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zIGluc2lkZSBhIGNsYXNzPikiLG1hdGNoPSJlbnVtaXRlbSIsCgkJICAgICAgICBtYXRjaCRwYXJlbnROb2RlJHBhcmVudE5vZGUkbm9kZVR5cGU9ImNsYXNzIikgIiI7CgkJCgkgICAgICBVc2UgInN3aWcgLWR1bXBfcGFyc2VfbW9kdWxlIiB0byBzZWUgdGhlIGF0dHJpYnV0ZSBuYW1lcyB5b3UgY2FuIHVzZSB0bwoJICAgICAgbWF0Y2ggYSBzcGVjaWZpYyBjYXNlLgoJCiAgICAgICAgICAgIC0gJ3NvdXJjZWZtdCcgYW5kICd0YXJnZXRmbXQnOiBzb21ldGltZXMgeW91IG5lZWQgdG8KICAgICAgICAgICAgICBwcm9jZXNzIHRoZSAnc291cmNlJyBuYW1lIGJlZm9yZSBjb21wYXJpbmcsIGZvciBleGFtcGxlCgoJICAgICAgICAlbmFtZXdhcm4oIjMxNDogZW1wdHkgaXMgYSBrZXl3b3JkIixzb3VyY2VmbXQ9IiUobG93ZXIpcyIpICJlbXB0eSI7CgoJICAgICAgdGhlbiBpZiB5b3UgaGF2ZQoKCSAgICAgICAgaW50IEVtcHR5KCk7ICAvLyAiRW1wdHkiIGlzIHRoZSBzb3VyY2UgCgkJCgkgICAgICB5b3Ugd2lsbCBnZXQgdGhlIGtleXdvcmQgd2FybmluZyBzaW5jZSAnRW1wdHknIHdpbGwgYmUKCSAgICAgIGxvd2VyIGNhc2VkLCB2aWEgdGhlIHNvdXJjZWZtdD0iJShsb3dlcilzIiBvcHRpb24sCgkgICAgICBiZWZvcmUgYmVlbiBjb21wYXJlZCB0byB0aGUgJ3RhcmdldCcgImVtcHR5Ii4KCgkgICAgICBUaGVyZSBpcyBhbiBhZGRpdGlvbmFsICd0YXJnZXRmbXQnIG9wdGlvbiB0byBwcm9jZXNzIHRoZQoJICAgICAgJ3RhcmdldCcgYmVmb3JlIGNvbXBhcmluZy4KCgkgICAgLSBjb21wbGVtZW50aW5nICdtYXRjaCc6IHlvdSBjYW4gdXNlICdub3RtYXRjaCcsIGZvciBleGFtcGxlCgkgICAgICAKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiLG5vdG1hdGNoPSJuYW1lc3BhY2UiKSAiZW1wdHkiOwoKCSAgICAgIGhlcmUsIHRoZSBuYW1lIHdhcm5pbmcgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3ltYm9scyBleGNlcHQgbmFtZXNwYWNlcy4KCSAgICAKICAgICAgCQoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgZ2NqIGFuZCBKYXZhIC0+IDx0YXJnZXQgbGFuZ3VhZ2U+IG1lY2hhbmlzbS4KCgkgICAgU2VlCWV4YW1wbGVzIGluOiAgCgkgIAoJCUV4YW1wbGVzL3B5dGhvbi9qYXZhCgkJRXhhbXBsZXMvcnVieS9qYXZhCgkJRXhhbXBsZXMvdGNsL2phdmEKCiAgICAgICAgICAgIHRvIHNlZSBob3cgdG8gdXNlIGdjaitzd2lnIHRvIGV4cG9ydCBqYXZhIGNsYXNzZXMgaW50bwogICAgICAgICAgICBweXRob24vcnVieS90Y2wuCgkgICAgCgkgICAgVGhlIGlkZWEgaXMgdG8gcHV0IGFsbCB0aGUgY29tbW9uIGNvZGUgZm9yIGdjaiBpbnNpZGUKCgkgICAgICAgICAgTGliL2djagoKICAgICAgICAgICAgYW5kIGxvY2FsaXplIHNwZWNpZmljIHR5cGVzIHN1Y2ggYXMganN0cmluZywgYXMgY2FuIGJlIGZvdW5kCiAgICAgICAgICAgIGluCgoJICAgICAgICAgTGliL3B5dGhvbi9qc3RyaW5nLmkKCSAgICAgICAgIExpYi9ydWJ5L2pzdHJpbmcuaQoJICAgICAgICAgTGliL3RjbC9qc3RyaW5nLmkKCiAgICAgICAgICAgIFVzaW5nIHRoZSBVVEwsIHRoaXMgaXMgdmVyeSBlYXN5LCBhbmQgdGhlIHBlcmwgdmVyc2lvbiBmb3IKICAgICAgICAgICAganN0cmluZy5pIHdpbGwgYmUgbmV4dC4KCQkgCSAgICAKCjEyLzI5LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgY29weWN0b3IgZmVhdHVyZS9kaXJlY3RpdmUvb3B0aW9uIHRvIGVuYWJsZSB0aGUgYXV0b21hdGljCgkgICAgZ2VuZXJhdGlvbiBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gVXNlIGFzIGluOgoKCSAgICAgICVjb3B5Y3RvciBBOwoKCSAgICAgIHN0cnVjdCBBIHsKCiAgICAgICAgICAgICAgfTsKCgkgICAgdGhlbiB0aGlzIHdpbGwgd29yawoKCSAgICAgIGExID0gQSgpOwoJICAgICAgYTIgPSBBKGExKTsKCgkgICAgQWxzbywgc2luY2UgaXQgaXMgYSBmZWF0dXJlLCBpZiB5b3UganVzdCB0eXBlCgoJICAgICAgJWNvcHljdG9yOwoKCSAgICB0aGF0IHdpbGwgIGVuYWJsZSB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gZm9yIGFsbCB0aGUKCSAgICBjbGFzc2VzLiBJdCBpcyBhbHNvIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgc3dpZyAtY29weWN0b3IgLWMrKyAuLi4KCgkgICAgTm90ZXM6IAoKCSAgICAxLi0gVGhlIGZlYXR1cmUgb25seSB3b3JrcyBpbiBDKysgbW9kZS4KCgkgICAgMi4tIFRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgdGhlIGNvcHkgY29uc3RydWN0b3Igd2lsbAoJICAgICAgICB1c3VhbGx5IHByb2R1Y2Ugb3ZlcmxvYWRpbmcuIEhlbmNlLCBpZiB0aGUgdGFyZ2V0CgkgICAgICAgIGxhbmd1YWdlIGRvZXNuJ3Qgc3VwcG9ydCBvdmVybG9hZGluZywgYSBzcGVjaWFsIG5hbWUKCSAgICAgICAgd2lsbCBiZSB1c2VkIChBX2NvcHkpLgoJICAgIAoJICAgIDMuLSBGb3IgdGhlIG92ZXJsb2FkaW5nIHJlYXNvbnMgYWJvdmUsIGl0IGlzIHByb2JhYmx5IG5vdAogICAgICAgICAgICAgICAgYSBnb29kIGlkZWEgdG8gdXNlIHRoZSBmbGFnIHdoZW4sIGZvciBleGFtcGxlLCB5b3UgYXJlCgkJdXNpbmcga2V5d29yZHMgaW4gUHl0aG9uLgoKICAgICAgICAgICAgNC4tIFRoZSBjb3B5Y3RvciBhdXRvbWF0aWMgbWVjaGFuaXNtIGZvbGxvd3MgbW9yZSBvciBsZXNzCgkgICAgICAgIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG1lY2hhbmlzbSwKCSAgICAgICAgaS5lLiwgYSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZQoJICAgICAgICBjbGFzcyBpcyBhYnN0cmFjdCBvciBpZiB0aGVyZSBpcyBhIHBlcnRpbmVudCBub24tcHVibGljIAoJCWNvcHkgY3RvciBpbiB0aGUgY2xhc3Mgb3IgaXRzIGhpZXJhcmNoeS4KCgkJSGVuY2UsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSBmb3IgeW91IHRvIGNvbXBsZXRlIHRoZQoJCWNsYXNzIGRlY2xhcmF0aW9uIHdpdGggdGhlIHByb3BlciBub24tcHVibGljIGNvcHkgY3RvcgoJCXRvIGF2b2lkIGEgd3JvbmcgY29uc3RydWN0b3IgYWRkaXRpb24uCgkJCiAgICAgICAgICAtIEZpeCBmZWF0dXJlcy9yZW5hbWUgZm9yIHRlbXBsYXRlcyBjdG9yL2R0b3IgYW5kIG90aGVyCiAgICAgICAgICAgIHRoaW5ncyBhcm91bmQgd2hpbGUgYWRkaW5nIHRoZSBjb3B5Y3RvciBtZWNoYW5pc20uCgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICdtYXRjaCcgb3B0aW9uIHRvIHR5cGVtYXBzLiBBc3N1bWUgeW91IGhhdmU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoKCSAgICB0aGVuIGlmIHlvdSBkbwogCgkgICAgICAldHlwZW1hcChpbikgQSAqIHsuLi59CgoJICAgIHN3aWcgd2lsbCAnb3ZlcmxvYWQgdGhlICdpbicgdHlwZW1hcCwgYnV0IHRoZSAnZnJlZWFyZycgCgkgICAgdHlwZW1hcCB3aWxsIGJlIGFsc28gYXBwbGllZCwgZXZlbiB3aGVuIHRoaXMgaXMgd3JvbmcuIFRoZSBvbGQKCSAgICBzb2x1dGlvbnMgaXMgdG8gd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQogIAkgICAgICAldHlwZW1hcChmcmVlYWcpIEEgKiAiIjsKCgkgICAgb3ZlcmxvYWQgJ2ZyZWVhcmcnIHdpdGggYW4gZW1wdHkgZGVmaW5pdGlvbi4KCgkgICAgVGhlIHByb2JsZW0gaXMsIGhvd2V2ZXIsIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHlvdSBuZWVkCgkgICAgdG8gZG8gdGhhdCB1bnRpbCB5b3Ugc3RhcnQgZ2V0dGluZyBicm9rZW4gQysrIGNvZGUsIG9yCgkgICAgd29yc2UsIGJyb2tlbiBydW50aW1lIGNvZGUuCgoJICAgIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGluZmFtb3VzICd0eXBlY2hlY2snIHR5cGVtYXAsCgkgICAgd2hpY2ggYWx3YXlzIGNvbmZ1c2VzIHBlb3BsZSwgc2luY2UgdGhlIGZpcnN0IHRoaW5nIHlvdSBkbwoJICAgIGlzIHRvIGp1c3Qgd3JpdGUgdGhlICdpbicgdHlwZW1hcC4KCgkgICAgVGhlICdtYXRjaCcgb3B0aW9uIHNvbHZlcyB0aGUgcHJvYmxlbSwgYW5kIGlmIGluc3RlYWQgeW91IHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnLG1hdGNoPSJpbiIpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoJICAgICAgJXR5cGVtYXAodHlwZWNoZWNrLG1hdGNoPSJpbiIscHJlY2VkZW5jZS4uLikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoJICAgIGl0IHdpbGwgdGVsbCBzd2lnIHRvIGFwcGx5IHRoZSAnZnJlZWFyZy90eXBlY2hlY2snCgkgICAgdHlwZW1hcHMgb25seSBpZiB0aGV5ICdtYXRjaCcgdGhlIHR5cGUgb2YgdGhlICdpbicKCSAgICB0eXBlbWFwLiBUaGUgc2FtZSBjYW4gYmUgZG9uZSB3aXRoIG90aGVyIHR5cGVtYXBzIGFzOgoKCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yb3V0KSBTV0lHVFlQRSAqIHsuLi59CgkgICAgICAldHlwZW1hcChkaXJlY3RvcmZyZWUsbWF0Y2g9ImRpcmVjdG9yb3V0IikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uL21vZGUvZmVhdHVyZSB0byB0cmVhdCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgaW4gYSBtb3JlIG5hdHVyYWwgd2F5LCBpZSwgc2ltaWxhciB0byB0aGUgZ2xvYmFsCgkgICAgdmFyaWFibGUgYmVoYXZpb3IuCgoJICAgIFlvdSBjYW4gdXNlIGl0IGluIGEgZ2xvYmFsIHdheSB2aWEgdGhlIGNvbW1hbmQgbGluZQoKCSAgICAgIHN3aWcgLW5hdHVyYWx2YXIgLi4uCgoJICAgIG9yIHRoZSBtb2R1bGUgbW9kZSBvcHRpb24KIAoJICAgICAgJW1vZHVsZShuYXR1cmFsdmFyPTEpCgoJICAgIGJvdGggZm9ybXMgbWFrZSBzd2lnIHRyZWF0IGFsbCB0aGUgbWVtYmVyIHZhcmlhYmxlcyBpbiB0aGUKCSAgICBzYW1lIHdheSBpdCB0cmVhdHMgZ2xvYmFsIHZhcmlhYmxlcy4gCgoJICAgIEFsc28sIHlvdSBjYW4gdXNlIGl0IGluIGEgY2FzZSBieSBjYXNlIGFwcHJvYWNoIGZvcgoJICAgIHNwZWNpZmljIG1lbWJlciB2YXJpYWJsZXMgdXNpbmcgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICVuYXR1cmFsdmFyIEJhcjo6czsKCSAgICAKCSAgICBUaGVuLCBpbiB0aGUgZm9sbG93aW5nIGNhc2UgZm9yIGV4YW1wbGU6CgoJICAgICAgIHN0ZDo6c3RyaW5nIHM7CgkgICAgICAgc3RydWN0IEJhciB7CgkJIHN0ZDo6c3RyaW5nIHM7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB5b3UgY2FuIGRvOiAgCgoJICAgICAgIGIgPSBCYXIoKQoJICAgICAgIGIucyA9ImhlbGxvIgoJICAgICAgIGN2YXIucyA9ICJoZWxsbyIKCSAgICAgICAKCSAgICAgICBpZiAoYi5zICE9IGN2YXIucyk6CgkgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCgoJCSAgCiAgICAgICAgICAgIFRoaXMgaXMgdmFsaWQgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgdGhlCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGZvcmNpbmcgdGhlIHVzZSBvZiB0aGUgCiAgICAgICAgICAgIGNvbnN0IFNXSUdUWVBFJiAoQysrKS9TV0lHVFlQRSAoQykgdHlwZW1hcHMgZm9yIHRoZQogICAgICAgICAgICBnZXQvc2V0IG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgU1dJR1RZUEUgKiB0eXBlbWFwcy4KCSAgICBIZW5jZSwgZm9yICduYXR1cmFsdmFyJyB0byB3b3JrLCBlYWNoIHRhcmdldCBsYW5ndWFnZQoJICAgIG11c3QgaW1wbGVtZW50ICd0eXBlbWFwKGluL291dCkgY29uc3QgVHlwZSYnIHByb3Blcmx5LgoKCSAgICBUaGUgJ25hdHVyYWx2YXInIG9wdGlvbiByZXBsYWNlcyBvciBtYWtlcyB3b3JrYXJvdW5kcyBzdWNoICBhczoKCSAgICAKCQklYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp9CgogICAgICAgICAgICB1bm5lY2Vzc2FyeS4KCgkgICAgTm90ZTE6IElmIHlvdXIgaW50ZXJmYWNlIGhhcyBvdGhlciBraW5kcyBvZiB3b3JrYXJvdW5kcyB0bwoJICAgIGRlYWwgd2l0aCB0aGUgb2xkICd1bm5hdHVyYWwnIHdheSB0byBkZWFsIHdpdGggbWVtYmVyCgkgICAgdmFyaWFibGVzIChyZXR1cm5pbmcvZXhwZWN0aW5nIHBvaW50ZXJzKSwgdGhlCgkgICAgJ25hdHVyYWx2YXInIG9wdGlvbiBjb3VsZCBicmVhayB0aGVtLgoJICAgIAoJICAgIE5vdGUyOiB0aGUgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdW5uYW1lZCB0eXBlcywgc3VjaAoJICAgIGFzIHVubmFtZWQgbmVzdGVkIHVuaW9ucy4KCSAgICAKCSAgCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBtb3JlICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzIGZvciB0aGUgdHlwZW1hcAogICAgICAgICAgICBsaWJyYXJpZXMuCgoJICAgIEluIHRoZSBwYXN0LCBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlcywgeW91IHdvdWxkIGRvIGNoZWNraW5nIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgIGlmIChDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncykgIT0gLTEpIHsKCSAgICAgICAgLy8gc3VjY2VzcwogICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGVycm9yCgkgICAgICB9CgoJICAgIE5vdyB0aGUgcmVzdWx0IHN0YXRlIGNhbiBjYXJyeSBtb3JlIGluZm9ybWF0aW9uLAoJICAgIGluY2x1ZGluZzoKCgkgICAgICAtIEVycm9yIHN0YXRlOiBsaWtlIHRoZSBvbGQgLTEvMCwgYnV0IHdpdGggZXJyb3IgY29kZXMgZnJvbSBzd2lnZXJyb3JzLnN3Zy4KCgkgICAgICAgICBpbnQgcmVzID0gQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpOwoJCSBpZiAoU1dJR19Jc09LKHJlcykpIHsKCQkgICAvLyBzdWNjZXNzIGNvZGUKICAgICAgICAgICAgICAgICB9IGVsc2UgewoJCSAgIFNXSUdfRXJyb3IocmVzKTsgLy8gcmVzIGNhcnJpZXMgdGhlIGVycm9yIGNvZGUKICAgICAgICAgICAgICAgICB9CgoJICAgICAgLSBDYXN0IHJhbms6IHdoZW4gcmV0dXJuaW5nIGEgc2ltcGxlIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgIGNvbnZlcnNpb24sIHlvdSBqdXN0IHJldHVybiBTV0lHX09LLCBidXQgaWYgeW91IG5lZWQKICAgICAgICAgICAgICAgIHRvIGRvIGEgJ2Nhc3QnLCB5b3UgY2FuIGFkZCB0aGUgY2FzdGluZyByYW5rLCBpZToKCQkKCQkgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CgkJICAgIHJldHVybiBTV0lHX09LOwoJCSAgfSBlbHNlIGlmIChQeUludF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gKGRvdWJsZSkgUHlJbnRfQXNMb25nKG9iaik7CgkJICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CQkgICAgCiAgICAgICAgICAgICAgICAgIH0KCQkKCQlsYXRlciwgdGhlIGNhc3RpbmcgcmFuayBpcyB1c2VkIHRvIHByb3Blcmx5IGRpc3BhdGNoCgkJdGhlIG92ZXJsb2FkZWQgZnVuY3Rpb24sIGZvciBleGFtcGxlLiBUaGlzIG9mIGNvdXJzZQoJCXJlcXVpcmVzIHlvdXIgbGFuZ3VhZ2UgdG8gc3VwcG9ydCBhbmQgdXNlIHRoZSBuZXcKCQlkaXNwYXRjaCBjYXN0L3JhbmsgbWVjaGFuaXNtIChOb3cgbWFpbmx5IHN1cHBvcnRlZCBpbgoJCXBlcmwgYW5kIHB5dGhvbiwgYW5kIGVhc2lseSBleHBhbmRhYmxlIHRvIHJ1YnkgYW5kIHRjbCkuCgkgICAgICAKCSAgLSBbVVRMXSBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldyAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcy4KCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgQysrIGltcGxpY2l0IGNvbnZlcnNpb24gbWVjaGFuaXNtLCB3aGljaAogICAgICAgICAgICByZXF1aXJlZCBzb21lIG1vZGlmaWNhdGlvbnMgaW4gcGFyc2VyLnkgKHRvIHJlY29nbml6ZQogICAgICAgICAgICAnZXhwbGljaXQnKSBhbmQgb3ZlcmxvYWQuY3h4ICh0byByZXBsYWNlICRpbXBsaWNpdGNvbnYgYXMKICAgICAgICAgICAgbmVlZGVkKS4KCSAgICAKCSAgICBTdGlsbCwgcmVhbCBzdXBwb3J0IGluIGVhY2ggdGFyZ2V0IGxhbmd1YWdlIHJlcXVpcmVzIGVhY2gKCSAgICB0YXJnZXQgbGFuZ3VhZ2UgdG8gYmUgbW9kaWZpZWQuIFB5dGhvbiBwcm92aWRlcyBhbiBleGFtcGxlLAogICAgICAgICAgICBzZWUgYmVsb3cuCgoKCSAgLSBBZGQgc3VwcG9ydCBmb3IgbmF0aXZlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9ucywgaWUsIGlmIHlvdQogICAgICAgICAgICBoYXZlCgoJICAgICAgICAlaW1wbGljaXRjb252IEE7CgoJICAgICAgICBzdHJ1Y3QgQSB7CgkJICAgaW50IGlpOwoJCSAgIEEoKSB7aWkgPSAxO30KCQkgICBBKGludCkge2lpID0gMjt9CgkJICAgQShkb3VibGUpIHtpaSA9IDM7fQoJCSAgIGV4cGxpY2l0IEEoY2hhciAqcykge2lpID0gNDt9CgkJfTsKCQkKCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgogICAgICAgICAgICB5b3UgY2FuIGNhbGw6CgoJICAgICAgICBhID0gQSgpCgkgICAgICAgIGFpID0gQSgxKQoJICAgICAgICBhZCA9IEEoMS4wKQoJICAgICAgICBhcyA9IEEoImhlbGxvIikKCQkKCQkjIG9sZCBmb3JtcwoJICAgICAgICBnZXQoYSkgIC0+IDEKCSAgICAgICAgZ2V0KGFpKSAtPiAyCgkgICAgICAgIGdldChhZCkgLT4gMwoJICAgICAgICBnZXQoYXMpIC0+IDQKCQkKCQkjaW1wbGljaXQgY29udmVyc2lvbnMKCSAgICAgICAgZ2V0KDEpICAgICAgIC0+IDIKCSAgICAgICAgZ2V0KDEuMCkgICAgIC0+IDMKCSAgICAgICAgZ2V0KCJoZWxsbyIpIC0+IEVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKICAgICAgICAgICAgQWxzbywgYXMgaW4gQysrLCBub3cgaW1wbGljaXQgY29udmVyc2lvbnMgYXJlIHN1cHBvcnRlZCBpbgogICAgICAgICAgICB2YXJpYWJsZSBhc3NpZ21lbnRzLCBhbmQgaWYgeW91IGhhdmU6CgoJICAgICAgQSBnYTsKCSAgICAgIHN0cnVjdCBCYXIgewoJICAgICAgICBBIGE7CiAgICAgICAgICAgICAgfTsKCgkgICAgeW91IGNhbiBkbzoKCgkgICAgICBjdmFyLmdhID0gQSgxKQoJICAgICAgY3Zhci5nYSA9IDEKCSAgICAgIGN2YXIuZ2EgPSAxLjAKCSAgICAgIGN2YXIuZ2EgPSBBKCJoZWxsbyIpIAoJICAgICAgY3Zhci5nYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgICAgYiA9IEJhcigpCgkgICAgICBiLmEgPSBBKCJoZWxsbyIpCgkgICAgICBiLmEgPSAxCgkgICAgICBiLmEgPSAxLjAKCSAgICAgIGIuYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgIE5vdGUgdGhhdCB0aGUgbGFzdCBjYXNlLCBhc3NpZ25pbmcgYSBtZW1iZXIgdmFyIGRpcmVjdGx5LCAKCSAgICBhbHNvIHJlcXVpcmVzIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uLgoKCSAgICBUaGlzIHN1cHBvcnQgbm93IG1ha2VzIHRoZSBvbGQgJyVpbXBsaWNpdCcgbWFjcm8sIHdoaWNoCgkgICAgd2FzIGZvdW5kIGluICdpbXBsaWNpdC5pJyBhbmQgaXQgd2FzIGZyYWdpbGUgaW4gbWFueSB3YXlzLAoJICAgIG9ic29sZXRlLCBhbmQgeW91IHNob3VsZCB1c2UgdGhlIG5ldyAnJWltcGxpY2l0Y29udicKCSAgICBkaXJlY3RpdmUgaW5zdGVhZC4KCgkgICAgTm90ZSB0aGF0IHdlIGZvbGxvdyB0aGUgQysrIGNvbnZlbnRpb25zLCBpZSwgaW4gdGhlCgkgICAgZm9sbG93aW5nIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIGFsbG93ZWQ6CgoJCWludCBnZXQoQSBhKSB7cmV0dXJuIGEuaWk7fQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCSAgICAKCSAgICBidXQgbm90IGluIHRoZXNlIGNhc2VzOgoKCQlpbnQgZ2V0KEEgKmEpIHtyZXR1cm4gYS0+aWk7fQoJCWludCBnZXQoQSYgYSkge3JldHVybiBhLmlpO30KCQkKCSAgICBBbHNvLCBpdCB3b3JrcyBmb3IgZGlyZWN0b3IgbWV0aG9kcyB0aGF0IHJldHVybiBhIGJ5IHZhbHVlCgkgICAgcmVzdWx0LCBpZSwgdGhlIGZvbGxvd2luZyB3aWxsIHdvcms6CgogICAgICAgICAgICAgICAgdmlydHVhbCBBIGdldF9hKCkgPSAwOwoKCQlkZWYgZ2V0X2Eoc2VsZik6CgkJICAgcmV0dXJuIDEKCiAgICAgICAgICAgIGJ1dCBub3QgaW4gdGhpcyBjYXNlOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgY29uc3QgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBKiBnZXRfYSgpID0gMDsKCSAgICAKCSAgTm90ZXM6CgoJICAtIHRoZSBpbXBsaWNpdGNvbnYgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIGJ5IGRpcmVjdGx5CgkgICAgY2FsbGluZy9kaXNwYXRjaGluZyB0aGUgcHl0aG9uIGNvbnN0cnVjdG9yLCB0cmlnZ2VyaW5nIGEKCSAgICBjYWxsIHRvIHRoZSBfX2luaXRfX21ldGhvZC4gSGVuY2UsIGlmIHlvdSBleHBhbmRlZCB0aGUKCSAgICBfX2luaXRfXyBtZXRob2QsIGxpa2UgaW46CgoJICAgICAgICBjbGFzcyBBOgoJCSAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZ3MpOgoJCSAgICAgIDxzd2lnIGNvZGU+CgkJICAgICAgPG15IGNvZGUgaGVyZT4KCiAgICAgICAgICAgIHRoZW4gJ215IGNvZGUnIHdpbGwgYWxzbyBiZSBleGVjdXRlZC4KCSAgICAKCSAgLSBTaW5jZSB0aGUgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgaXMgYSBTV0lHIGZlYXR1cmUsIGlmIHlvdSB0eXBlOgoJICAgIAogIAkgICAgICAgJWltcGxpY2l0Y29udjsgIAoKCSAgICB0aGF0IHdpbGwgZW5hYmxlIGltcGxpY2l0IGNvbnZlcnNpb24gZm9yIGFsbCB0aGUgY2xhc3NlcyBpbgoJICAgIHlvdXIgbW9kdWxlLgoKCSAgICBCdXQgaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHBlcmZvcm1hbmNlLCBtYXliZSB0aGF0IHdpbGwgYmUKCSAgICB0b28gbXVjaCwgZXNwZWNpYWxseSBpZiB5b3UgaGF2ZSBvdmVybG9hZGVkIG1ldGhvZHMsIHNpbmNlCgkgICAgdG8gcmVzb2x2ZSB0aGUgZGlzcGF0Y2hpbmcgcHJvYmxlbSwgcHl0aG9uIHdpbGwgZWZlY3RpdmVseQoJICAgIHRyeSB0byBjYWxsIGFsbCB0aGUgaW1wbGljaXQgY29uc3RydWN0b3JzIGFzIG5lZWRlZC4KCgkgIC0gRm9yIHRoZSBzYW1lIHJlYXNvbiwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZQogICAgICAgICAgICB0aGUgbmV3ICdjYXN0bW9kZScgd2hlbiBtaXhpbmcgaW1wbGljaXQgY29udmVyc2lvbiBhbmQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcuCgoJIC0gW3B5dGhvbl0gVGhlICVpbXBsaWNpdCBkaXJlY3RpdmUgaXMgZGVjbGFyZWQgb2Jzb2xldGUsIGFuZAogICAgICAgICAgIHlvdSBzaG91bGQgdXNlICVpbXBsaWNpdGNvbnYgaW5zdGVhZC4gSWYgeW91IGluY2x1ZGUKCSAgIHRoZSBpbXBsaWNpdC5pIGZpbGUsIGEgd2FybmluZyB3aWxsIHJlbWluZCB5b3Ugb2YgdGhpcy4KCgkgICBOb3RlOiBTaW5jZSAlaW1wbGljaXQgaXMgZnJhZ2lsZSwganVzdCByZXBsYWNpbmcgaXQgYnkKCSAgICVpbXBsaWNpdGNvbnYgY291bGQgbGVhZCB0byBkaWZmZXJlbnQgYmVoYXZpb3IuIEhlbmNlLCB3ZQoJICAgZG9uJ3QgYXV0b21hdGljYWxseSBzd2l0Y2ggZnJvbSB0byB0aGUgb3RoZXIsIGFuZCB0aGUgdXNlcgoJICAgbXVzdCBtaWdyYXRlIHRvIHRoZSBuZXcgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgbWFudWFsbHkuCgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBNb2RpZnkgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgdG8gdXNlIHN0ZDo6dmVjdG9yOjp2YWx1ZV90eXBlIGFzIHRoaXMgaXMKICAgICAgICAgICAgY2xvc2VyIHRvIHRoZSByZWFsIFNUTCBkZWNsYXJhdGlvbnMgZm9yIHNvbWUgbWV0aG9kcywgZWcgZm9yIHB1c2hfYmFjaygpLgogICAgICAgICAgICBGaXhlcyBzb21lIGNvbXBpbGF0aW9uIGVycm9ycyBmb3Igc29tZSBjb21waWxlcnMgZWcgd2hlbiB0aGUgdGVtcGxhdGVkCiAgICAgICAgICAgIHR5cGUgaXMgYSBwb2ludGVyLgoKICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yIGltcHJvdmVtZW50cyAtIGEgZmV3IG1vcmUgbWV0aG9kcyBhcmUgd3JhcHBlZCBhbmQgc3BlY2lhbGl6YXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcmVxdWlyZWQuIFRoZSBzcGVjaWFsaXplX3N0ZF92ZWN0b3IgbWFjcm8gaXMgbm8gbG9uZ2VyIG5lZWRlZCAoYQogICAgICAgICAgICB3YXJuaW5nIGlzIGlzc3VlZCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlIGl0KS4KCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgQWRkIGluIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzLiBUaGlzIGFsc28gZW5hYmxlcyBvbmUgdG8gZWFzaWx5IHdyYXAKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gd2hlcmUgVCBpcyBhIHBvaW50ZXIuCgoxMi8yNC8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFRoZSBjZmZpIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEZ1bGx5IHN1cHBvcnRzIEMsIGJ1dCBwcm92aWRlcyBsaW1pdGVkIHN1cHBvcnRzIGZvciBDKyssIGluCiAgICAgICAgICAgICAgIHBhcnRpY3VsYXIgQysrIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyBhbmQgb3ZlcmxvYWRpbmcgbmVlZHMgdG8KICAgICAgICAgICAgICAgYmUgd29ya2VkIHVwb24uIAoKMTIvMjMvMjAwNTogbW1hdHVzCgkgICAgW3B5dGhvbl0gQWRkIHRoZSBjYXN0bW9kZSB0aGF0IGFsbG93cyB0aGUgcHl0aG9uCgkgICAgdHlwZSBjYXN0aW5nIHRvIG9jY3VyLgoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgJ2ludCBmb28oaW50KScsIG5vdwoJICAgIAoJICAgICAgY2xhc3MgQWkoKToKCSAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLHgpOiAKCQkgICAgc2VsZi54ID0geAoJICAgICAgICAgZGVmIF9faW50X18oc2VsZik6IAoJCSAgICByZXR1cm4gc2VsZi54CgoJICAgICAgZm9vKDEpICAgLy8gT2sKCSAgICAgIGZvbygxLjApIC8vIE9rCgkgICAgICBmb28oMS4zKSAvLyBFcnJvcgoJICAgICAgYSA9IEFpKDQpCiAgICAgICAgICAgICAgZm9vKGFpKSAgLy8gT2sKCiAgICAgICAgICAgIFRoZSBjYXN0bW9kZSwgd2hpY2ggY2FuIGJlIGVuYWJsZWQgZWl0aGVyIHdpdGggdGhlCiAgICAgICAgICAgICctY2FzdG1vZGUnIG9wdGlvbiBvciB0aGUgJW1vZHVsZSgiY2FzdG1vZGUiKSBvcHRpb24sIHVzZXMKICAgICAgICAgICAgdGhlIG5ldyBjYXN0L3JhbmsgZGlzcGF0Y2ggbWVjaGFuaXNtLiBIZW5jZSwgbm93IGlmIHlvdQogICAgICAgICAgICBoYXZlICdpbnQgZm9vKGludCk7IGludCBmb28oZG91YmxlKTsnLCB0aGUgZm9sbG93aW5nIHdvcmtzCiAgICAgICAgICAgIGFzIGV4cGVjdGVkOgoKCSAgICAgIGZvbygxKSAgIC0+IGZvbyhpbnQpCgkgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQoJICAgICAgYWkgPSBBaSg0KQoJICAgICAgZm9vKGFpKSAgLT4gZm9vKGludCkKCgkgICAgTm90ZTE6IHRoZSAnY2FzdG1vZGUnIGNvdWxkIGRpc3J1cHQgc29tZSBzcGVjaWFsaXplZAoJICAgIHR5cGVtYXBzLiBJbiBwYXJ0aWN1bGFyLCB0aGUgImltcGxpY2l0LmkiIGxpYnJhcnkgc2VlbXMgdG8KCSAgICBoYXZlIHByb2JsZW0gd2l0aCB0aGUgY2FzdG1vZGUuIEJ1dCBiZXNpZGVzIHRoYXQgb25lLCB0aGUKCSAgICBlbnRpcmUgdGVzdC1zdWl0ZSBjb21waWxlcyBmaW5lIHdpdGggYW5kIHdpdGhvdXQgdGhlCgkgICAgY2FzdG1vZGUuCgogCSAgICBOb3RlMjogdGhlIGNhc3QgbW9kZSBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHRoZSBmYXN0CgkgICAgZGlzcGF0Y2ggbW9kZSwgaWUsIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiBoYXMgbm8gZWZmZWN0CgkgICAgd2hlbiB0aGUgY2FzdCBtb2RlIGlzIHNlbGVjdGVkLiBUaGUgcGVuYWx0aWVzLCBob3dldmVyLAoJICAgIGFyZSBtaW5pbXVtIHNpbmNlIHRoZSBjYXN0IGRpc3BhdGNoIGNvZGUgaXMgYWxyZWFkeSBiYXNlZAoJICAgIG9uIHRoZSBzYW1lIGZhc3QgZGlzcGF0Y2ggbWVjaGFuaXNtLgoKCSAgICBTZWUgdGhlIGZpbGUgb3ZlcmxvYWRfZGlzcGF0Y2hfY2FzdF9ydW5tZS5weSBmaWxlIGZvcgoJICAgIG5ldyBjYXNlcyBhbmQgZXhhbXBsZXMuCgoxMi8yMi8yMDA1OiBtbWF0dXMKCSAgICBBZGQgdGhlIGNhc3QgYW5kIHJhbmsgbWVjaGFuaXNtIHRvIGRpc3BhdGNoIG92ZXJsb2FkaW5nCgkgICAgZnVuY3Rpb25zLiBUaGUgVVRGIHN1cHBvcnRzIGl0IG5vdywgYnV0IGZvciBlYWNoIGxhbmd1YWdlCgkgICAgaXQgbXVzdCBiZSBkZWNpZGVkIGhvdyB0byBpbXBsZW1lbnQgYW5kL29yIHdoZW4gdG8gdXNlIGl0LgoKCSAgICBbcGVybF0gTm93IHBlcmwgdXNlcyB0aGUgbmV3IGNhc3QgYW5kIHJhbmsgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIHdoaWNoIHNvbHZlcyBhbGwgdGhlIHBhc3QgcHJvYmxlbXMga25vd24gCgkgICAgaW4gcGVybCwgc3VjaCBhcyB0aGUgb2xkICcrIDEnIHByb2JsZW06CgoJICAgICAgICBpbnQgZm9vKGludCk7CgkgICAgCgkJJG4gPSAxCiAgICAgICAgICAgICAgICAkbiA9ICRuICsgMQogICAgICAgICAgICAgICAgJHIgPSBmb28obikKCiAgICAgICAgICAgIGFsc28gd29ya3M6CgogICAgICAgICAgICAgICAgIGZvbygxKTsKICAgICAgICAgICAgICAgICBmb28oIjEiKTsKICAgICAgICAgICAgICAgICBmb28oMS4wKTsKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpOwoKICAgICAgICAgICAgIGJ1dCBmYWlscwoKICAgICAgICAgICAgICAgICBmb28oImwiKTsKCiAgICAgICAgICAgICBhbmQgd2hlbiBvdmVybG9hZGluZyAgZm9vKGludCkgYW5kIGZvbyhkb3VibGUpOwoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGVycm9yCgkJIGZvbygkbikgLT4gZm9vKGludCkgIGZvciBnb29kIHBlcmwgdmVyc2lvbnMKCQkgZm9vKCRuKSAtPiBmb28oZG91YmxlKSAgZm9yIG9sZCBiYWQgcGVybCB2ZXJzaW9ucwoKCSAgICAgd2hlbiBvdmVybG9hZGluZyBmb28oaW50KSwgZm9vKGNoYXIqKSBhbmQgZm9vKGRvdWJsZSk6CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGZvbyhjaGFyKikKCiAgICAgICAgICAgICBOb3RlOiBJbiBwZXJsIHRoZSBvbGQgZGlzcGF0Y2ggbWVjaGFuaXNtIHdhcyBicm9rZW4sCiAgICAgICAgICAgICBzbywgd2UgZG9uJ3QgcHJvdmlkZSBhbiBvcHRpb24gdG8gZW5hYmxlIHRoZSBvbGQgb25lCgkgICAgIHNpbmNlLCBhZ2FpbiwgaXQgd2FzIHJlYWxseSByZWFsbHkgYnJva2VuLgoKCSAgICAgU2VlICdvdmVybG9hZF9zaW1wbGVfcnVubWUucGwnIGZvciBtb3JlIGNhc2VzIGFuZCB0ZXN0cy4KCgkgICAgIFBTOiBhbGwgdGhlIG9sZCBrbm93biBpc3N1ZXMgYXJlIGRlY2xhcmVkIHJlc29sdmVkLCBhbnkKCSAgICAgbmV3ICJwcm9ibGVtIiB0aGF0IGNvdWxkIGJlIGRpc2NvdmVyZWQgaXMgZGVjbGFyZWQsIAoJICAgICBhIHByaW9yaSwgYXMgImZlYXR1cmVzIiBvZiB0aGUgbmV3IGRpc3BhdGNoIG1lY2hhbmlzbQoJICAgICAodW50aWwgd2UgZmluZCBhbm90aGVyIHNvbHV0aW9uIGF0IGxlYXN0KS4KCSAgICAgCgkgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoJICAgIEFzIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgVVRGLCBzb21lIHRoaW5ncyBjb3VsZAoJICAgIG5vdyBzdGFydCB0byB3b3JrIGFzIGV4cGVjdGVkLCBhbmQgcGVvcGxlIHVzZWQgdG8gZGVhbCBvcgoJICAgIHdvcmthcm91bmQgcHJldmlvdXMgYnVncyByZWxhdGVkIHRvIHRoZSBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgY291bGQgc2VlIG5vdyBhIGRpZmZlcmVuY2UgaW4gcGVybCBiZWhhdmlvci4KCjEyLzIxLzIwMDU6IG1tYXR1cwoJICAtIFRoZSAnLW5vZGVmYXVsdCcgZmxhZyAocHJhZ21hIGFuZCBmZWF0dXJlKSBub3cgZ2VuZXJhdGVzCgkgICAgYSB3YXJuaW5nLCBhbmQgcmVjb21tZW5kcyB0byB1c2UgdGhlIGV4cGxpY2l0CgkgICAgLW5vZGVmYXVsdGN0b3IgYW5kICAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoJICAgIFRoZSByZWFzb24gdG8gc3BsaXQgdGhlICdub2RlZmF1bHQnIGJlaGF2aW9yIGlzIHRoYXQsIGluCgkgICAgZ2VuZXJhbCwgaWdub3JpbmcgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciBnZW5lcmF0ZXMgbWVtb3J5CgkgICAgbGVha3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gSGVuY2UsIGlzIHRvbyByaXNreSBqdXN0IHRvCgkgICAgZGlzYWJsZSBib3RoIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCgkgICAgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgSWYgeW91IG5lZWQgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yLCBpdCBpcwoJICAgIGFsc28gcmVjb21tZW5kZWQgeW91IHVzZSB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgICVub2RlZmF1bHRkdG9yICBNeVZlcnlTcGVjaWFsQ2xhc3M7CgogICAgICAgICAgICBmb3Igc3BlY2lmaWMgY2xhc3NlcywgYW5kIGFsd2F5cyBhdm9pZCB1c2luZyB0aGUgZ2xvYmFsCiAgICAgICAgICAgIC1ub2RlZmF1bHQgYW5kIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCjEyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgRml4IGluY29ycmVjdCBjb2RlIGdlbmVyYXRpb24gd2hlbiB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzbmFtZSBpcyBjaGFuZ2VkCiAgICAgICAgICAgIGluIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGZyb20gaXRzIGRlZmF1bHQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbW9kdWxlKGpuaWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gSmF2YQogICAgICAgICAgICAgICVtb2R1bGUoaW1jbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEMjCgogICAgICAgICAgICBBZGQgaW4gbmV3IHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lLiBTZWUgZG9jcy4KCjEyLzE3LzIwMDU6IG1tYXR1cwoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWFsaWFzb2JqMC8tbm9hbGlhc29iajAgb3B0aW9ucyB0byB1c2Ugd2l0aAoJICAgIC1mYXN0dW5wYWNrIGFuZC9vciAtTyBhbmQgb2xkIHR5cGVtYXBzIHRoYXQgdXNlICdvYmowJwoJICAgIGRpcmVjdGx5LgoKCSAgICBTbywgaWYgeW91IGNvbXBpbGUgeW91ciBjb2RlIHVzaW5nIC1PIGFuZCBnZXQgZXJyb3JzIGFib3V0CgkgICAgdGhlIHVuZGVjbGFyZWQgJ29iajAnIHZhcmlhYmxlLCBydW4gYWdhaW4gdXNpbmcgCgoJCXN3aWcgLU8gLWFsaWFzb2JqMCAtcHl0aG9uIC4uLi4KCSAgICAKCSAgICBGb3IgbmV3IHR5cGVtYXBzLCBuZXZlciB1c2UgJ29iajAnIGRpcmVjdGx5LCBpZiBuZWVkZWQsCgkgICAgdXNlIHRoZSAnJHNlbGYnIG5hbWUgdGhhdCB3aWxsIGJlIHByb3Blcmx5ICBleHBhbmRlZCB0bwoJICAgICdvYmowJyAobm9mYXN0dW5wYWNrKSBvciAnc3dpZ19vYmpbMF0nIChmYXN0dW5wYWNrKS4gCiAgCgkgICAgSWYgeW91IGhhdmUgbm8gaWRlYSB3aGF0IEkgYW0gdGFsa2luZyBhYm91dCwgYmV0dGVyLCB0aGF0CgkgICAgbWVhbnMgeW91IGhhdmUgbm8gdHlwZW1hcCB3aXRoIHRoaXMgcHJvYmxlbS4KCgoxMi8xNC8yMDA1OiBtbWF0dXMgCSAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1mYXN0dW5wYWNrLy1ub2Zhc3R1bnBhY2sgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSB1c2Ugb2YgdGhlIGludGVybmFsIFVucGFja1R1cGxlIG1ldGhvZCwgaW5zdGVhZCBvZgoJICAgIGNhbGxpbmcgdGhlIG9uZSBmcm9tIHRoZSBweXRob24gQyBBUEkuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtZmFzdHVucGFjay4KCSAgICAKCjEyLzExLzIwMDU6IG1tYXR1cyAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1wcm94eWRlbC8tbm9wcm94eWRlbCBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIGdlbmVyYXRpb24gb2YgcHJveHkvc2hhZG93IF9fZGVsX18gbWV0aG9kcywgZXZlbgoJICAgIHdoZW4gbm93IHRoZXkgYXJlIHJlZHVuZGFudCwgc2luY2UgdGhleSBhcmUgZW1wdHkuCgkgICAgSG93ZXZlciwgb2xkIGludGVyZmFjZXMgY291bGQgcmVseSBvbiBjYWxsaW5nIHRoZW0uCgoJICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGdlbmVyYXRlIHRoZSBfX2RlbF9fIG1ldGhvZHMKCSAgICBhcyBpbiAxLjMuMjcgb3Igb2xkZXIgc3dpZyB2ZXJzaW9ucy4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1ub3Byb3h5ZGVsLgoKMTIvMTAvMjAwNTogbW1hdHVzIAoJICBbVVRGXQogICAgICAgICAgLSBGaXggdW5uZWNjZXNzYXJ5IGNhbGxzIHRvIFNXSUdfVHlwZVF1ZXJ5IGZvciAnY2hhciAqJwoJICAgIGFuZCAnd2NoYXJfdCAqJywgcHJvYmxlbSBmb3VuZCBieSBDbGF5IEN1bHZlciB3aGlsZQoJICAgIHByb2ZpbGluZyB0aGUgUHlPZ3JlIHByb2plY3QuCgoJICAKCSAgW1B5dGhvbl0gCgkgIC0gQWRkIHRoZSAtZGlydnRhYmxlLy1ub2RpcnZ0YWJsZSB0byBlbmFibGUvZGlzYWJsZQoJICAgIGEgcHNldWRvIHZpcnR1YWwgdGFibGUgdXNlZCBmb3IgZGlyZWN0b3JzLCBhdm9pZGluZwoJICAgIHRoZSBuZWVkIHRvIHJlc29sdmUgdGhlIHB5dGhvbiBtZXRob2QgYXQgZWFjaCBjYWxsLgoJICAgIAoJICAtIEFkZCB0aGUgLXNhZmVjc3RyaW5ncy8tbm9zYWZlY3N0cmluZ3Mgb3B0aW9ucyB0bwoJICAgIGVuYWJsZS9kaXNhYmxlIHRoZSB1c2Ugb2Ygc2FmZSBjb252ZXJzaW9ucyBmcm9tIFB5U3RyaW5nCgkgICAgdG8gY2hhciAqLiBQeXRob24gcmVxdWlyZXMgeW91IHRvIG5ldmVyIGNoYW5nZSB0aGUgaW50ZXJuYWwKCSAgICBidWZmZXIgZGlyZWN0bHksIGFuZCBoZW5jZSAnc2FmZWN0cmluZ3MnIHdhcnJhbnRpZXMgdGhhdAoJICAgIGJ1dCByZXR1cm5pbmcgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBweXRob24gc3RyaW5nIGJ1ZmZlci4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHByZXZpb3VzIHJlbGVhc2VzLCBpcyB0byByZXR1cm4gYQoJICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAobm9zYWZlY3N0cmluZ3MpLCBzbywgaXQgaXMgdGhlIHVzZXIncwoJICAgIHJlc3BvbnNpYmlsaXR5IHRvIGF2b2lkIGl0cyBtb2RpZmljYXRpb24uCgkgICAgCgkgIC0gQWRkIHRoZSAtTyBvcHRpb24gdG8gZW5hYmxlIGFsbCB0aGUgb3B0aW1pemF0aW9uIG9wdGlvbnMKCSAgICBhdCBvbmNlLCBpbml0aWFsbHkgZXF1aXZhbGVudCB0bwoKCSAgICAtbW9kZXJuIC1mYXN0ZGlzcGF0Y2ggLWRpcnZ0YWJsZSAtbm9zYWZlY3N0cmluZ3MgLWZ2aXJ0dWFsCgoxMi8wOC8yMDA1OiBtbWF0dXMgCgoJICAtIEFkZCB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24gKGZhc3RkaXNwYXRjaCBmZWF0dXJlKS4gVGhpcwoJICAgIGVuYWJsZXMgdGhlICJmYXN0IGRpc3BhdGNoIiBtZWNoYW5pc20gZm9yIG92ZXJsb2FkZWQKCSAgICBtZXRob2RzIHByb3ZpZGVkIGJ5IFNhbHZhZG9yIEZhbmRpfm5vIEdhcmMnaWEgKCM5MzA1ODYpLgoKCSAgICBUaGUgcmVzdWx0aW5nIGNvZGUgaXMgc21hbGxlciBhbmQgZmFzdGVyIHNpbmNlIGxlc3MgdHlwZQoJICAgIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4gSG93ZXZlciwgdGhlIGVycm9yIG1lc3NhZ2VzIHlvdQoJICAgIGdldCB3aGVuIHRoZSBvdmVybG9hZGluZyBpcyBub3QgcmVzb2x2ZWQgY291bGQgYmUKCSAgICBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSB0cmFkaXRpb25hbCBtZXRob2QgcmV0dXJucy4KCgkgICAgV2l0aCB0aGUgb2xkIG1ldGhvZCB5b3UgYWx3YXlzIGdldCBhbiBlcnJvciBzdWNoIGFzIAoKCSAgICAgICAiTm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIG92ZXJsb2FkZWQgLi4uIgoKICAgICAgICAgICAgd2l0aCB0aGUgbmV3IG1ldGhvZCB5b3UgY2FuIGFsc28gZ2V0IGVycm9ycyBzdWNoIGFzCgoJICAgICAgICJUeXBlIGVycm9yIGluIGFyZ3VtZW50IDEgb2YgdHlwZSAuLi4iCgoJICAgIFNlZSBidWcgcmVwb3J0ICM5MzA1ODYgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgCiAgCSAgICBTbywgdGhpcyBvcHRpbWl6YXRpb24gbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQgYnkgdXNlcnMuCgoJICAgIFRoZSBuZXcgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICBzd2lnIC1mYXN0ZGlzcGF0Y2gKCiAgICAgICAgICAgIG9yIHVzaW5nIHRoZSBmZWF0dXJlIGZvcm0KCgkgICAgICAlZmVhdHVyZSgiZmFzdGRpc3BhdGNoIikgbWV0aG9kOwogICAgICAgICAgICBvcgogICAgICAgICAgICAgICVmYXN0ZGlzcGF0Y2ggbWV0aG9kOwoJICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzIAoKICAgICAgICAgIC0gU2V2ZXJhbCBtZW1vcnkgYW5kIHNwZWVkIGltcHJvdmVtZW50cywgc3BlY2lhbGx5IGZvcgoJICAgIHRlbXBsYXRlcy4gTm93IHN3aWcgaXMgdXAgdG8gMjAgZmFzdGVyIHRoYW4gYmVmb3JlIGZvcgoJICAgIGxhcmdlIHRlbXBsYXRlIGludGVyZmFjZXMsIHN1Y2ggYXMgdGhlIHN0ZF9jb250YWluZXJzLmkKCSAgICBhbmQgdGVtcGxhdGVfbWF0cml4LmkgZmlsZXMgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLgoKCSAgICBNZW1vcnkgZm9vdHByaW50IGlzIGFsc28gcmVkdWNlZCBpbiBjb25zaWRlcmF0aW9uIG9mIHNtYWxsCgkgICAgcGNzL2FyY2hpdGVjdHVyZXMuCgoJICAtIGFkZCBjb21tYW5kbGluZSBvcHRpb25zIC1jcHBlcnJhc3dhcm4gYW5kIC1ub2NwcGVycmFzd2FybiIgdG8gZm9yY2UKICAgICAgICAgICAgdGhlIHN3aWcgcHJlcHJvY2Vzc29yIHRvIHRyZWF0IHRoZSAjZXJyb3IgZGlyZWN0aXZlIGFzIGEgI3dhcm5pbmcuCgkgICAgCgkgICAgdGhlIHByYWdtYXMKCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MQogICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgY3BwZXJyYXN3YXJuPTAKCSAgICAgICAKCSAgICBhcmUgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gVGhlIGdlbmVyYXRlZCBjb2RlIGlzIG5vdyBtb3JlIHBvcnRhYmxlLCBlc3BlY2lhbGx5CgkgICAgZm9yIFdpbmRvd3MuIEZvbGxvd2luZyAKCiAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9mYXEvd2luZG93cy5odG1sCgogICAgICAgICAgICBQeV9Ob25lIGlzIG5ldmVyIGFjY2Vzc2VkIGFzIGEgc3RydWN0dXJlLCBwbHVzIG90aGVyCiAgICAgICAgICAgIHRyaWNrcyBtZW50aW9uZWQgdGhlcmUuCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHRocmVhZHMgYmFzZWQgaW4gdGhlCgkgICAgcHJvcG9zYWwgYnkgSm9zZXBoIFdpbnN0b24uCgoJICAgIFRoZSB1c2VyIGludGVyZmFjZSBpcyBhcyBmb2xsb3dzOgoKCSAgICAxLi0gdGhlIG1vZHVsZSB0aHJlYWQgc3VwcG9ydCBpcyBlbmFibGUgdmlhIHRoZSAidGhyZWFkcyIgbW9kdWxlCiAgICAgICAgICAgICAgICBvcHRpb24sIGkuZS4KCiAgICAgICAgICAgICAgICAgICVtb2R1bGUoInRocmVhZHMiPTEpCgogICAgICAgICAgICAyLi0gRXF1aXZhbGVudCB0byB0aGF0LCBpcyB0aGUgbmV3ICctdGhyZWFkcycgc3dpZyBvcHRpb24KCiAgICAgICAgICAgICAgICAgIHN3aWcgLXRocmVhZHMgLXB5dGhvbiAuLi4KCiAgICAgICAgICAgIDMuLSBZb3UgY2FuIHBhcnRpYWxseSBkaXNhYmxlIHRocmVhZCBzdXBwb3J0IGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICBtZXRob2QgdXNpbmc6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWQiKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkIG1ldGhvZDsKCiAgICAgICAgICAgICAgICBhbHNvLCB5b3UgY2FuIGRpc2FibGUgc2VjdGlvbnMgb2YgdGhlIHRocmVhZCBzdXBwb3J0LCAKICAgICAgICAgICAgICAgIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRibG9jayIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRibG9jayBtZXRob2Q7CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRhbGxvdyIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRhbGxvdyBtZXRob2Q7CgogICAgICAgICAgICAgICAgdGhlIGZpcnN0IGRpc2FibGVzIHRoZSBDKysvcHl0aG9uIHRocmVhZCBwcm90ZWN0aW9uLCBhbmQgdGhlCiAgICAgICAgICAgICAgICBzZWNvbmQgZGlzYWJsZXMgdGhlIHB5dGhvbi9DKysgdGhyZWFkIHByb3RlY3Rpb24uIAoKICAgICAgICAgICAgNC4tIFRoZSBjdXJyZW50IHRocmVhZCBzdXBwb3J0IGlzIGJhc2VkIGluIHRoZSBQeUdJTAogICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHByZXNlbnQgaW4gcHl0aG9uIHZlcnNpb24gMi4zIG9yIGxhdGVyLCBidXQKICAgICAgICAgICAgICAgIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGhyZWFkIGNvZGUgZm9yIG9sZGVyIHZlcnNpb25zIGJ5CiAgICAgICAgICAgICAgICBkZWZpbmluZyB0aGUgbWFjcm9zIGluIHB5dGhyZWFkcy5zd2cuCgoJCUlmIHlvdSBnZXQgYSB3b3JraW5nIGltcGxlbWVudGF0aW9uIGZvciBvbGRlciB2ZXJzaW9ucywKCQlwbGVhc2Ugc2VuZCB1cyBhIHBhdGNoLgoKICAgICAgICAgICAgRm9yIHRoZSBjdXJpb3VzIGFib3V0IHBlcmZvcm1hbmNlLCBoZXJlIGFyZSBzb21lIG51bWJlcnMKICAgICAgICAgICAgZm9yIHRoZSBwcm9maWxldGVzdC5pIHRlc3QsIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHNwZWVkCgkgICAgb2YgdGhlIHdyYXBwZWQgY29kZToKCgkgICAgICAgIG5vdGhyZWFkICAgICAgICAgICA5LjZzICAobm8gdGhyZWFkIGNvZGUpCgkJbm90aHJlYWRibG9jayAgICAgMTIuMnMgIChvbmx5ICdhbGxvdycgY29kZSkKCQlub3RocmVhZGFsbG93ICAgICAxMy42cyAgKG9ubHkgJ2Jsb2NrJyBjb2RlKQogICAgICAgICAgICAgICAgZnVsbCB0aHJlYWQgICAgICAgMTUuNXMgICgnYWxsb3cnICsgJ2Jsb2NrJyBjb2RlKQoJICAgIAoJICAgIGkuZS4sIGZ1bGwgdGhyZWFkIGNvZGUgZGVjcmVhc2VzIHRoZSB3cmFwcGluZyBwZXJmb3JtYW5jZSBieQoJICAgIGFyb3VuZCA2MCUuIElmIHRoYXQgaXMgaW1wb3J0YW50IHRvIHlvdXIgYXBwbGljYXRpb24sIHlvdQoJICAgIGNhbiB0dW5lIGVhY2ggbWV0aG9kIHVzaW5nIHRoZSBkaWZmZXJlbnQgJ25vdGhyZWFkJywKCSAgICAnbm90aHJlYWRibG9jaycgb3IgJ25vdGhyZWFkYWxsb3cnIGZlYXR1cmVzIGFzCgkgICAgbmVlZGVkLiBOb3RlIHRoYXQgZm9yIHNvbWUgbWV0aG9kcyBkZWFjdGl2YXRpbmcgdGhlCgkgICAgJ3RocmVhZCBibG9jaycgb3IgJ3RocmVhZCBhbGxvdycgY29kZSBpcyBub3QgYW4gb3B0aW9uLAoJICAgIHNvLCBiZSBjYXJlZnVsLgoJICAgIAoKMTEvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIHVzZSBzeXN0ZW0gYW5nbGUgYnJhY2tldHMgZXZlcnl3aGVyZSBmb3IgJWluY2x1ZGUsIGVnCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF9jb21tb24uaSIKICAgICAgICAgICAgYmVjb21lcwogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfY29tbW9uLmk+CgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMgaGF2ZSBhbiBleHRyYSBjb25zdHJ1Y3RvciBzbyB0aGF0IGVudW0gaXRlbSB2YWx1ZXMgdGhhdAogICAgICAgICAgICBhcmUgaW5pdGlhbGlzZWQgYnkgYW5vdGhlciBlbnVtIGl0ZW0gdmFsdWUgY2FuIGJlIHdyYXBwZWQgd2l0aG91dCBoYXZpbmcgdG8gdXNlICVqYXZhY29uc3R2YWx1ZS8KICAgICAgICAgICAgJWNzY29uc3R2YWx1ZSBmb3Igd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpLiBTdWdnZXN0aW9uIGJ5CiAgICAgICAgICAgIEJvYiBNYXJpbmllci9Eb3VnbGFzIFBlYXJzb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgeHl6LAogICAgICAgICAgICAgICAgIGxhc3QgPSB4eXoKICAgICAgICAgICAgICB9IHJlcGVhdDsKCjExLzIxLzIwMDU6IG1tYXR1cwoJICAgIFtydWJ5ICsgcHl0aG9uXQoKCSAgICBGaXhlcyBmb3IgZGlyZWN0b3JzICsgcG9pbnRlcnMuIFRoaXMgaXMgYW4gdWdseSBwcm9ibGVtIHdpdGhvdXQgYW4gZWFzeQoJICAgIHNvbHV0aW9uLiBCZWZvcmUgd2UgaWRlbnRpZmllZCB0aGlzIGNhc2UgYXMgcHJvYmxlbWF0aWM6CgoJICAgICAgICAgIHZpcnR1YWwgY29uc3QgTXlDbGFzcyYgbXlfbWV0aG9kKCk7CgogICAgICAgICAgICBidXQgaXQgdHVybnMgb3V0IHRoYXQgYWxsIHRoZSBjYXNlcyB3aGVyZSBhIHBvaW50ZXIsIGFycmF5IG9yCiAgICAgICAgICAgIHJlZmVyZW5jZSBpcyByZXR1cm5lZCwgYXJlIHByb2JsZW1hdGljLCBldmVuIGZvciAKCSAgICBwcmltaXRpdmUgdHlwZXMgKGFzIGludCwgZG91YmxlLCBjaGFyKiwgZXRjKS4KCgkgICAgVG8gdHJ5IHRvIGZpeCB0aGUgaXNzdWUsIGEgbmV3IHR5cGVtYXAgd2FzIGFkZGVkLAoJICAgICdkaXJlY3RvcmZyZWUnLCB3aGljaCBpcyB1c2VkIHRvICdmcmVlJyB0aGUgcmVzb3VyY2VzCgkgICAgYWxsb2NhdGVkIGR1cmluZyB0aGUgJ2RpcmVjdG9yb3V0JyBwaGFzZS4gQXQgdGhlIHNhbWUKCSAgICB0aW1lLCBhIHByaW1pdGl2ZSBnYXJiYWdlIGNvbGxlY3RvciBlbmdpbmUgd2FzIGFkZGVkIHRvCgkgICAgZGVhbCB3aXRoIG9ycGhhbmVkIGFkZHJlc3Nlcywgd2hlbiBuZWVkZWQuCgkgICAgCgkgICAgVGhlIHNpdHVhdGlvbiBpcyBtdWNoIGJldHRlciBub3csIGJ1dCBzdGlsbCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlCgkgICAgbWVtb3J5IGV4aGF1c3RhdGlvbiBpZiByZWN1cnNpb24gaXMgdXNlZC4KCgkgICAgU28sIHN0aWxsIHlvdSBuZWVkIHRvIGF2b2lkIHJldHVybmluZyBwb2ludGVycywgYXJyYXlzIG9yCgkgICAgcmVmZXJlbmNlcyB3aGVuIHVzaW5nIGRpcmVjdG9yIG1ldGhvZHMuCgoJICAgIC0gQWRkZWQgc3RkaW50LmkgLSB0eXBlbWFwcyBmb3IgbGF0ZXN0IEM5OSBpbnRlZ3JhbCB0eXBlcyBmb3VuZCBpbiBzdGRpbnQuaC4KCSAgICAKMTEvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSB0eXBlcyBhZGRlZCB0byB3aW5kb3dzLmksIGVnIFVJTlQ4LCBXT1JELCBCWVRFIGV0Yy4gCiAgICAgICAgICAgIEluY2x1ZGluZyB3aW5kb3dzLmkgd2lsbCBhbHNvIGVuYWJsZSBTV0lHIHRvIHBhcnNlIHRoZSBfX2RlY2xzcGVjIE1pY3Jvc29mdAogICAgICAgICAgICBleHRlbnNpb24sIGVnIF9fZGVjbHNwZWMoZGxsaW1wb3J0KS4gQWxzbyBvdGhlciBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMKICAgICAgICAgICAgc3VjaCBhcyBfX3N0ZGNhbGwuCgoxMS8xMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlIGZvciBXaW5kb3dzIC0gd2luZG93cy5pLiBUaGlzIGZpbGUgd2lsbCBjb250YWluIHVzZWZ1bCB0eXBlCiAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciB1c2VycyB3aG8gaW5jbHVkZSB3aW5kb3dzLmguIEluaXRpYWwgc3VwcG9ydCBpcyBmb3IgdGhlCiAgICAgICAgICAgIG5vbiBJU08gaW50ZWdyYWwgdHlwZXM6IF9faW50OCwgX19pbnQxNiwgX19pbnQzMiwgX19pbnQ2NCBhbmQgdW5zaWduZWQgdmVyc2lvbnMuCiAgICAgICAgICAgIFRoZSB1bnNpZ25lZCB2ZXJzaW9ucyBwcmV2aW91c2x5IGNvdWxkIG5vdCBiZSBwYXJzZWQgYnkgU1dJRy4gIFNGICM4NzIwMTMuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFBvcnRhYmlsaXR5IHdhcm5pbmcgZm9yIGZpbGVzIHdoaWNoIHdpbGwgb3ZlcndyaXRlIGVhY2ggb3RoZXIgb24gY2FzZQogICAgICAgICAgICBpbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbXMgc3VjaCBhcyBGQVQzMi9OVEZTLiBUaGlzIHdpbGwgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHR3bwogICAgICAgICAgICBjbGFzcyBuYW1lcyBhcmUgdGhlIHNhbWUgYmFycmluZyBjYXNlLiBUaGUgd2FybmluZyBpcyBpc3N1ZWQgb24gYWxsIHBsYXRmb3JtcyBhbmQKICAgICAgICAgICAgY2FuIGJlIHN1cHByZXNzZWQgd2l0aCB0aGUgdXN1YWwgd2FybmluZyBzdXBwcmVzc2lvbiB0ZWNobmlxdWVzLiBTRiBidWcgIzEwODQ1MDcuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcHl0aG9uIC0td2l0aC1ydWJ5IC0td2l0aC1wZXJsNSBldGMgZW5hYmxlIHRoZXNlIGxhbmd1YWdlcywKICAgICAgICAgICAgaWUgdGhlIC0td2l0aC14eHh4IG9wdGlvbnMsIHdoZXJlIG5vIHBhdGggaXMgc3BlY2lmaWVkLCB3b3JrIHRoZSBzYW1lIGFzIGlmIAogICAgICAgICAgICB0aGUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkIGF0IGFsbC4gQmFzZWQgb24gcGF0Y2hlcyAjMTMzNTA0MiAjMTMyOTA0OCAjMTMyOTA0Ny4KCjExLzA5LzIwMDU6IGRhbmN5CgoJICAgIFtBbGxlZ3JvY2xdCgkgICAgQWRkIEMrKyBzdXBwb3J0IHRvIHRoZSBBbGxlZ3JvY2wgbW9kdWxlLiBGdXJ0aGVyCgkgICAgZW5oYW5jZXMgdGhlIEMgc3VwcG9ydCBhcyB3ZWxsLiBTb21lIG9mIHRoZQoJICAgIGZlYXR1cmVzOgoKCSAgICAtIE1VQ0ggYmV0dGVyIGdlbmVyYXRpb24gb2YgZm9yZWlnbiB0eXBlcyBiYXNlZCBvbgoJICAgIHRoZSBDL0MrKyB0eXBlcyBmb3IgdXNlIGluIGRlZmluaW5nIHRoZSBGRkkgb24KCSAgICB0aGUgbGlzcCBzaWRlLiBXZSBkb24ndCBwYXNzIGV2ZXJ5dGhpbmcgYXMgYSAoKiA6dm9pZCkKCSAgICBhbnkgbG9uZ2VyLgoKCSAgICAtIFVzZXMgdHlwZW1hcHMgZm9yIGJldHRlciBjb250cm9sIG9mIHR5cGUgY29udmVyc2lvbnMKCSAgICBhbmQgY29kZSBnZW5lcmF0aW9uIGluIHRoZSBnZW5lcmF0ZWQgbGlzcCBhbmQgYysrIHdyYXBwZXIKCSAgICBjb2RlLgoKCSAgICAtIENMT1Mgd3JhcHBpbmcgb2YgcG9pbnRlcnMgcmV0dXJuZWQgZnJvbSBmb3JlaWduIHNwYWNlCgkgICAgbWFrZXMgaXQgZWFzaWVyIHRvIGRpZmZlcmVudGlhdGUgcG9pbnRlcnMgaW4gdXNlciBjb2RlLgoJICAgIFRoZSB3cmFwcGluZyBvYmplY3RzIGNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gRkYgY2FsbHMuCgoJICAgIC0gRGVmdW4gd3JhcHBpbmcgb2YgRkYgY2FsbHMsIGFsbG93aW5nIGZvciBtb3JlIGxpc3B5CgkgICAgaW50ZXJmYWNlLiBDb252ZXJzaW9uLCBHQ2luZywgb2YgbGlzcCBvYmplY3RzIHRvIAoJICAgIGZvcmVpZ24gb2JqZWN0cyBjYW4gYmUgZG9uZSBpbiB0aGUgd3JhcHBpbmcgZGVmdW4gdmlhCgkgICAgdGhlIHVzZSBvZiB0eXBlbWFwcy4KCSAgICAKCSAgICAtIG92ZXJsb2FkIGRpc3BhdGNoaW5nIGltcGxlbWVudGVkIG9uIHRoZSBsaXNwIHNpZGUKCSAgICB1c2luZyBnZW5lcmljIGZ1bmN0aW9ucy4KCgkgICAgLSBUZW1wbGF0ZXMgYW5kIHN5bm9ueW1vdXMgdHlwZXMgc3VwcG9ydGVkLgoKMTEvMDcvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBwcm9wZXIgc3VwcG9ydCBmb3IgbXVsdGktaW5oZXJpdGFuY2UgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUsIGllLCBpZiB5b3UgaGF2ZSB0d28gQysrIHdyYXBwZWQgY2xhc3MsIEZvbwoJICAgIGFuZCBCYXIsIG5vdzoKCgkgICAgICAgY2xhc3MgTXlQeXRob25DbGFzcyhGb28sQmFyKToKCSAgICAgICAgICAuLi4uCgogICAgICAgICAgICB3aWxsIHByb3Blcmx5IHdvcmssIGV2ZW4gd2l0aCBkaXJlY3RvcnMsIGFuZCB0aGUKICAgICAgICAgICAgZGVhbGxvY2F0aW9uIG9mIEZvby50aGlzIGFuZCBCYXIudGhpcyB3aWxsIGZvbGxvdwogICAgICAgICAgICBjb3JyZWN0bHkuIEJlZm9yZSwgYSBjbGFzcyBjb3VsZCBvbmx5IGhhdmUgb25lICd0aGlzJwogICAgICAgICAgICBpbnN0YW5jZSAodW5saWtlIEMrKyksIG9ubHkgdGhlIGxhc3QgYmFzZSBjbGFzcyB3YXMKICAgICAgICAgICAgcHJvcGVybHkgZGVsZXRlZCwgb3IgZGV0ZWN0ZWQgd2l0aCBkaXJlY3RvcnMuCgoJICAgIE5vdyAnc2VsZi50aGlzJyBjYW4gYmUgYSBsaXN0LCB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIEMrKwoJICAgIGluc3RhbmNlIHBvaW50ZXJzIGZvciBhbGwgdGhlIGJhc2UgY2xhc3Nlcy4KCSAgICAKCSAgICBBbHNvLCBzd2lnLnRoaXMgaXMgcmVzcG9uc2libGUgZm9yIGRlYWxsb2NhdGluZyB0aGUgQysrCgkgICAgaW5zdGFuY2UocyksIGFuZCB0aGUgX19kZWxfXyBtZXRob2QgaXMgbm90IGVtaXR0ZWQgdW5sZXNzCgkgICAgdGhlIHVzZXIgcHJlcHBlbmQvYXBwZW5kIHNvbWUgY29kZSB0byBpdC4KCgkgIC0gU3dpZyBjYW4gbm93IGRldGVjdCBtZW1vcnkgbGVha3MsIGllLCBpZiB5b3Ugc3RpbGwKCSAgICBkb24ndCB1c2UgcHJveHkvc2hhZG93IGNsYXNzZXMsIGFuZCB0eXBlIHNvbWV0aGluZyBsaWtlCgkgICAgCgkgICAgICAgICBpbXBvcnQgX2V4YW1wbGUKCSAgICAgICAgIGYgPSBfZXhhbXBsZS5uZXdfRm9vKCkKCgkgICAgYW5kIGZvcmdldCB0byBjYWxsIF9leGFtcGxlLmRlbGV0ZV9Gb28oZiksIHRoZW4gc3dpZyB3aWxsCgkgICAgdGVsbCB5b3UgdGhhdCB0aGVyZSBpcyBhIG1lbW9yeSBsZWFrLgoKCSAgICBPdGhlcndpc2UsIGlmIHlvdSBhbHdheXMgdXNlIHRoZSBwcm94eSBjbGFzc2VzLCB5b3UgcHJvYmFibHkKCSAgICB5b3Ugd2lsbCBuZXZlciBldmVyIHNlZSB0aGlzIHdhcm5pbmcgdW5sZXNzIHRoZXJlIGlzCgkgICAgc29tZXRoaW5nIHdyb25nIGluc2lkZSB0aGUgc3dpZyB3cmFwcGluZyBjb2RlLgoJICAgICAgIAoJCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIElmIHlvdSBvdmVybG9hZGVkIHRoZSBfX2RlbF9fIG1ldGhvZCwgYW5kIGNhbGwgdGhlIGJhc2UKCSAgICBvbmUJIHdpdGhvdXQgYSB0cnkgYmxvY2ssIGFzIGluCgoJICAgICAgICAgICBjbGFzcyBNeUNsYXNzKFN3aWdDbGFzcyk6CgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICBTd2lnQ2xhc3MuX19kZWxfXyhzZWxmKQoJCQkgIAogICAgICAgICAgICBweXRob24gY291bGQgY29tcGxhaW4gdGhhdCB0aGUgbWV0aG9kIFN3aWdDbGFzcy5fX2RlbF9fIGlzCiAgICAgICAgICAgIHVuZGVmaW5lZC4gVHJ5IHRvIHVzZSBpbnN0ZWFkOgoJICAgIAoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICB0cnk6IFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgZXhjZXB0OiBwYXNzCgoJICAgIG9yIHNpbXBseSAJCSAgCgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoKMTEvMDIvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBtb3JlIGZ1biB0byBTVEwvU1REIGNvbnRhaW5lcnMsIG5vdyB5b3UKCSAgICBjYW4gZG8KCgkgICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxQeU9iamVjdCAqPjsJCQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8UHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxQeU9iamVjdCAqLFB5T2JqZWN0ICo+OwkKCSAgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CgkgICAgICAgLi4uLgoKCSAgICBUaGUgc2FtZSAgYXBwbGllcyB0byBzdGQ6Omxpc3QsIHN0ZDo6ZGVxdWUsIHN0ZDo6bXVsdGlzZXQsIGV0Yy4KCgkgICAgVGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlIHlvdSBjYW4gZG8gbm93OgoKCSAgICAgICAjIEMrKyBzdGQ6OnZlY3RvciBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgdiA9IHB5dmVjdG9yKFsxLCJoZWxsbyIsKDEsMildKQoJICAgICAgIHByaW50IHZbMV0KCSAgICAgICA+PiAnaGVsbG8nCgkgICAgICAgcHJpbnQgdlsyXQoJICAgICAgID4+ICgxLDIpCgkgICAgICAgCQkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6OnNldCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgcyA9IHB5c2V0KCkJCQkgICAKCSAgICAgICBzLmluc2VydCgoMSwyKSkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KDEpCQkJICAgCgkgICAgICAgcy5pbnNlcnQoImhlbGxvIikKCSAgICAgICBzdW09KCkKCSAgICAgICBmb3IgaSBpbiBzOgoJICAgICAgICAgc3VtICs9KGksKQoJICAgICAgIHByaW50IHN1bQoJICAgICAgID4+PiAoMSwgJ2hlbGxvJywgKDEsIDIpKQoJICAgICAgIAkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6Om1hcCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgbSA9IHB5bWFwKCkJCQkgICAKCSAgICAgICBtWyJmb28iXSA9ICJoZWxsbyIJCSAgIAoJICAgICAgIG1bMV0gPSAoMSwyKQoJICAgICAgIHBtID0ge30KCSAgICAgICBmb3IgayBpbiBtOgkgICAgCSAgIAoJICAgICAgICAgcG1ba10gPSBtW2tdCgkgICAgICAgcHJpbnQgcG0KCSAgICAgICA+Pj4gezE6ICgxLCAyKSwgJ2Zvbyc6ICdoZWxsbyd9CgoJICAgIGllLCB0aGUgU1REL1NUTCBjb250YWluZXJzIHdvcmsgYXMgcmVhbCBuYXRpdmUgcHl0aG9uCgkgICAgY29udGFpbmVyLCB3aXRoIGFyYml0cmFyeSBpdGVtIHR5cGVzIGFuZCBzby4KCgkgICAgQnV0IHNpbmNlIG5vcm1hbCBDKysgY29udGFpbmVycyBkbyBub3QgcHJvcGVybHkgcmVmL3VucmVmCgkgICAgdGhlaXIgaXRlbXMsIHlvdSBzaG91bGQgdXNlIHRoZSBzYWZlciB2ZXJzaW9uczoKCSAgICAKCSAgICAgICV0ZW1wbGF0ZShweXNldCkgc3RkOjpzZXQ8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxzd2lnOjpQeU9iamVjdF9wdHIsIHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPHN3aWc6OlB5T2JqZWN0X3B0cixzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgLi4uLgoKCSAgICB3aGVyZSBzd2lnOjpQeU9iamVjdF9wdHIgaXMgYSBQeU9iamVjdCAqIGVudmVsb3BlIGNsYXNzIHByb3ZpZGVkCgkgICAgdG8gc2FmZWx5IGluY3JlZi9kZWNyZWYgdGhlIHB5dGhvbiBvYmplY3QuIAoJICAgIAoJICAgIFNvLCBub3cgeW91IGNhbiB1c2UgYWxsIHRoZSBTVEwvU1REIGNvbnRhaW5lcnMgYXMgbmF0aXZlCgkgICAgUHl0aG9uIGNvbnRhaW5lcnMuIAoKCSAgICBOb3RlIDE6IHN0ZDo6bWFwLCBzdGQ6OnNldCBhbmQgdGhlIG90aGVyICdvcmRlcmVkJwoJICAgIGNvbnRhaW5lcnMgd2lsbCBwcm9wZXJseSB1c2UgUHlPYmplY3RfQ29tcGFyZSBmb3Igc29ydGluZywKCSAgICB3aGVuIG5lZWRlZC4KCgkgICAgTm90ZSAyOiBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBoYXZlIGEgbGltaXQgc2l6ZSBvZgoJICAgIFNJWkVfTUFYLCBpZSwgeW91IGNhbiBoYXZlIG1hbmFnZSBjb250YWluZXJzIGxhcmdlciB0aGFuCgkgICAgSU5UX01BWCwgdGhlIHB5dGhvbiBsaW1pdC4KCSAgICAKCSAgICAgIAoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0KCSAgICAtIGFkZCAnaXRlcmF0b3IoKScgbWV0aG9kIGZvciBhbGwgc2VxdWVuY2VzIGFuZCBhZGRpdGlvbmFsbHkKCSAgICAgICdrZXlfaXRlcmF0b3IoKScgZm9yIG1hcHMuCgoJICAgICAgJ2l0ZXJhdG9yKCknIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgbmF0aXZlIEMrKyBpdGVyYXRvci4KCSAgICAgIEFkZGl0aW9uYWxseSwgaW4gbWFwcywgJ2tleV9pdGVyYXRvcigpJyB3aWxsIHJldHVybiBhIHB5dGhvbgoJICAgICAgaXRlcmF0b3IgdXNpbmcgb25seSB0aGUgbWFwIGtleXMuCgkgICAgICAKCSAgICAgIEluIGdlbmVyYWwgdGhlIHNlcXVlbmNlIG1ldGhvZCBfX2l0ZXJfXyB3aWxsIGNhbGwKCSAgICAgICdpdGVyYXRvcigpJywgcmV0dXJuaW5nIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLCBidXQgaW4KCSAgICAgIG1hcHMgaXQgd2lsbCBjYWxsICdrZXlfaXRlcmF0b3IoKScsIG1haW50YWluaW5nCgkgICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgoKCSAgICAgIEhlbmNlLCBmb3Igc3RkOjptYXBzLCB5b3UgY2FuIHBsYXkgdGhlbiB3aXRoIHRoZSBuYXRpdmUKCSAgICAgIEMrKyBpdGVyYXRvciwgd2hpY2ggdmFsdWUgaXMgYSAoa2V5LCB2YWx1ZSkgcGFpciwgYnkKCSAgICAgIGNhbGxpbmcgbWFwLml0ZXJhdG9yKCksIGFzIHdpdGggbWFwLmJlZ2luKCksIG1hcC5lbmQoKSwgZXRjLgoKCSAgICAgIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbWFwLml0ZXJhdG9yKCkgcmV0dXJucyBhIHNhZmUKCSAgICAgICdjbG9zZWQnIGl0ZXJhdG9yLCB3aGlsZSBtYXAuYmVnaW4oKSBhbmQgbWFwLmVuZCgpIGFyZQoJICAgICAgJ29wZW4nIGl0ZXJhdG9ycy4KCgkgICAgICBBICdjbG9zZWQnIGl0ZXJhdG9yIGtub3dzIHRoZSBiZWdpbiBhbmQgdGhlIGVuZCBvZiB0aGUKCSAgICAgIHNlcXVlbmNlLCBhbmQgaXQgbmV2ZXIgY2FuIHNlZy4gZmF1bHQuIEFuICdvcGVuJwoJICAgICAgaXRlcmF0b3IsIGFzIGluIEMrKywgY2FuIHNlZy4gZmF1bHQgYXQgdGhlIEMrKyBzaWRlLgoKCSAgICAgICAgICMgYSBjbG9zZWQgaXRlcmF0b3IgaXMgc2FmZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCgkJICMgdGhlIG5leHQoKSBtZXRob2Qgd2lsbCB0aHJvdyBhIFN0b3BJdGVyYXRpb24KCSAgICAgICAgICMgZXhjZXB0aW9uIGFzIG5lZWRlZAoJCgkgICAgICAgICBpID0gc2VxLml0ZXJhdG9yKCkKCQkgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKCQkgICAgICAgIHN1bSArPSBpLm5leHQoKQoJCSBleGNlcHQ6IHBhc3MKCQkgCgkJICMgYW4gb3BlbiBpdGVyYXRvciBhbHdheXMgbmVlZCB0byBiZSBjaGVja2VkLAoJCSAjIG9yIGl0IHdpbGwgY3Jhc2ggYXQgdGhlIEMrKyBzaWRlCgoJICAgICAgICAgY3VycmVudCA9IHNlcS5iZWdpbigpCiAgICAgICAgICAgICAgICAgZW5kID0gc2VxLmVuZCgpCgkJIHdoaWxlIChjdXJyZW50ICE9IGVuZCk6CgkJICAgIHN1bSArPSBjdXJyZW50Lm5leHQoKQoJICAgICAgCgkgICAgICAKCSAgICBbUHl0aG9uXQoJICAgIC0gRmluYWxseSwgd2hlbiB3ZSBjYWxsIAoKCSAgICAgICAgZiA9IEZvbygpCgoJICAgICAgdGhlIGNvbnN0cnVjdGlvbiBpcyAnb25lLXdheScuIEJlZm9yZSBjb25zdHJ1Y3Rpb24gIHdhcyBkb25lCgkgICAgICBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspIAogICAgICAgICAgICAgICAgICBuZXdfRm9vKCkgKEMrKykgLT4gRm9vUHRyKCkgKHB5dGhvbikgCiAgICAgICAgICAgICAgICAgIEZvb1B0cigpIChweXRob24pIC0+IEZvbygpIChweXRob24pCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHdhcyBkb25lIGxpa2UKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICBGb29QdHIocHl0aG9uKSAtPiBGb28oKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICAJCSAgCgoJICAgICAgaWUsIHdlIHdoZW4gZ29pbmcgYmFjayBhbmQgZm9yd2FyZCBiZXR3ZWVuIHRoZSBDKysgYW5kCgkgICAgICBweXRob24gc2lkZS4KCgkgICAgICBOb3cgc2luY2UgdGhlcmUgaXMgbm8gRm9vUHRyIHRoZSBjb25zdHJ1Y3Rpb24gcHJvY2VzcyBpcwoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspCiAgICAgICAgICAgICAgICAgIF9uZXdfRm9vKCkgKEMrKykgLT4gTmV3UG9pbnRlck9iaigpIChDKyspIChubyBzaGFkb3cgY2xhc3MpCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIGlzIGRvbmUKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAod2l0aCBzaGFkb3cgY2xhc3MpIC0+IE5ld0luc3RhY2VPYmooKSAoQysrKQoKCSAgICAgIHdoZXJlIE5ld0luc3RhbmNlT2JqIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2l0aG91dAoJICAgICAgY2FsbGluZyBfX2luaXRfXyBhbmQgaXQgZG9lc24ndCBnbyAnYmFjaycgdG8gcHl0aG9uLCBpcwoJICAgICAgJ3B1cmUnIEMgQVBJLgoKCSAgICAgLSBXaXRoIHRoaXMgY2hhbmdlLCBhbmQgdGhlIG90aGVyIG9uZXMgaW4gdGhlCiAgICAgICAgICAgICAgIFB5U3dpZ09iamVjdCB0eXBlLCB3aGljaCBub3cgY2FycmllcyB0aGUgdGhpc293biBhbmQKICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gcG9pbnRlciwgdGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBiZSBhcwogICAgICAgICAgICAgICBmYXN0IGFzIGJvb3N0OjpQeXRob24gYW5kL29yIHRoZSBvdGhlciBweXRob24gd3JhcHBlcnMKICAgICAgICAgICAgICAgYmFzZWQgaW4gcHVyZSBQeXRob24vQyBBUEkgY2FsbHMuCgoJICAgICAgIEFzIGEgcmVmZXJlbmNlLCB0aGUgcHJvZmlsZXRlc3RfcnVubWUucHkgZXhhbXBsZSwgd2hpY2gKCSAgICAgICBkb2VzIGEgc2ltcGxlIGNhbGwgZnVuY3Rpb24gbWFueSB0aW1lcywgc3VjaCBhcyB0aGlzIGNvZGU6CgogICAgICAgICAgICAgICAgICAgIGltcG9ydCBwcm9maWxldGVzdCAgICAgICAKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCSAgICBhID0gcHJvZmlsZXRlc3QuQSgpICAgICAgCgkJICAgIGIgPSBwcm9maWxldGVzdC5CKCkgICAgICAKCQkgICAgZm9yIGkgaW4gcmFuZ2UoMCwxMDAwMDAwKQoJICAgICAgICAgICAgICBhID0gYi5mbihhKSAgICAgICAgICAgIAoKCgkgICAgICAgd2hlcmUgZm4gaXMgZGVmaW5lZCBhcyAnQSogQjo6Zm4oQSAqYSkge3JldHVybiBhO30nLAoJICAgICAgIHByb2R1Y2VzICB0aGUgZm9sbG93aW5nIHRpbWVzCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9tb2Rlcm4gICAgbW9kZXJuCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAxOS43MHMgICAgICA1Ljk4cwogICAgICAgICAgICAgICAgIHN3aWctQ1ZTICAgICAgICAwLjk5cyAgICAgIDAuOThzCgkgICAgICAgCgoJICAgICAgIENsZWFybHksIHRoZXJlIGlzIGEgbGFyZ2UgaW1wcm92ZW1lbnQgZm9yIHRoZSBweXRob24KCSAgICAgICAnbm9tb2Rlcm4nIG1vZGUuIFN0aWxsLCB0aGUgJ21vZGVybicgbW9kZSBpcyBhcm91bmQKCSAgICAgICA2IHRpbWVzIGZhc3RlciB0aGFuIGJlZm9yZS4gRm9yIHRoZSBzYW1lIHRlc3QsIGJ1dAoJICAgICAgIHVzaW5nIHRoZSBub24tc2hhZG93IHZlcnNpb24gb2YgdGhlIG1vZHVsZSwgd2UgZ2V0CgoJICAgICAgICAgICAgICAgICAgICAgICBfcHJvZmlsZXRlc3QgKG5vbi1zaGFkb3cpCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAgMC44MHMgCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuNjBzIAoKCSAgICAgICBIZW5jZSwgbm93IGZvciBwcmFjdGljYWwgcHVycG9zZXMsIHRoZSBwcm94eSBvdmVyaGVhZAoJICAgICAgIGlzIGluc2lnbmlmaWNhbnQuCgoJICAgICAgIE5vdGUgdGhhdCB0aGUgcGVyZm9ybWFuY2UgbnVtYmVycyB3ZSBhcmUgc2hvd2luZyBpcyBmb3IKCSAgICAgICBhIHNpbXBsZSBtb2R1bGUgKHR3byB0eXBlcykgYW5kIGEgc2ltcGxlIGZ1bmN0aW9uIChvbmUKCSAgICAgICBhcmd1bWVudCkuIEZvciByZWFsIHNpdHVhdGlvbnMsIGZvciBtb2R1bGVzIHdpdGggbWFueQoJICAgICAgIG1vcmUgdHlwZXMgYW5kL29yIGZ1bmN0aW9ucyB3aXRoIG1hbnkgbW9yZSBwYXJhbWV0ZXJzLAoJICAgICAgIHlvdSB3aWxsIHNlZSBldmVuIGJldHRlciByZXN1bHRzLgoJICAgICAgIAoJCSAgCSAgICAgIAoxMC8zMS8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXQoKCSAgICAtIEZpbmFsbHksIG5vIG1vcmUgQ2xhc3NQdHIgcHJveHkgY2xhc3Nlcy4gWW91IHdpbGwgc2VlCgkgICAgICBvbmx5IGEgY2xlYW4gQ2xhc3MgcHJveHkgY2xhc3MgaW4gdGhlIC5weSBmaWxlLgoKCSAgICAtIE5vIG1vcmUgJ3JlYWwnIHRoaXNvd24gYXR0cmlidXRlIGVpdGhlciwgdGhlIFB5U3dpZ09iamVjdCBub3cKICAgICAgICAgICAgICBjYXJyaWVzIHRoZSBvd25lcnNoaXAgaW5mby4KCgkgICAgICBZb3UgY2FuIGFsc28gZG8gc29tZXRoaW5nIGxpa2UKCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IFRydWUKCQkgIAoJCSAgc2VsZi50aGlzLmRpc293bigpCgkJICBzZWxmLnRoaXMub3duKDApCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpcy5hY3F1aXJlKCkKCQkgIHNlbGYudGhpcy5vd24oMSkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoKCSAgICAgIFN0aWxsIHRoZSBvbGQgd2F5LAoJICAgICAgCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKCQkgIHNlbGYudGhpc293biA9IDAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBGYWxzZQkJICAKCgkJICBzZWxmLnRoaXNvd24gPSAxCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKICAgICAgICAgICAgICBpcyBzdXBwb3J0ZWQsIGFuZCBweXRob24gZGlzcGF0Y2hlcyB0aGUgcHJvcGVyIG1ldGhvZAogICAgICAgICAgICAgIGNhbGxzIGFzIG5lZWRlZC4gCQkgIAoJICAgICAgIAoKCSAgICAtIFN1cHBvcnQgZm9yIGl0ZXJhdG9ycyBpbiBTVEwvU1REIGNvbnRhaW5lcnMsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgICAgICAldGVtcGxhdGU8c2V0X3N0cmluZz4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+OwoJICAgICAgICAgIAogICAgICAgICAgICAgICB5b3UgY2FuIHVzZSB0aGUgQysrIGl0ZXJhdG9ycyBhczogIAoKICAgICAgICAgICAgICAgICAgICAgcyA9IHNldF9zdHJpbmcoKQoJCSAgICAgICAgICAgICAgICAgICAgIAoJCSAgICAgcy5hcHBlbmQoImMiKSAgIAoJCSAgICAgcy5hcHBlbmQoImEiKSAgIAoJICAgICAgICAgICAgIHMuYXBwZW5kKCJiIikKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBiLm5leHQoKSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJhYmMiIAoKCQlhZHZhbmNlIHRoZSBpdGVyYXRvciBhcyBpbiBDKysKCiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGN1cnJlbnQgKz0gMQogICAgICAgICAgICAgICAgICAgICBwcmludCBjdXJyZW50LnZhbHVlKCkKCQkgICAgID4+PiAiYiIKCQkgICAgIAoJCW5vdyB1c2luZyB0aGUgcmV2ZXJzZSBvcGVyYXRvcnMKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLnJiZWdpbigpICAgICAgCgkJICAgICBlID0gcy5yZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgoJICAgICAgICBvciB0aGUgJ3ByZXZpb3VzJyBtZXRob2QKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBlLnByZXZpb3VzKCkKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgogICAgICAgICAgICAgICAgb3IganVzdCBhcyBpbiBhIHB5dGhvbiBmYXNoaW9uCgogICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIE5vdGUgMTogSXRlcmF0b3JzIGluIEMrKyBhcmUgdmVyeSBwb3dlcmZ1bCwgYnV0CiAgICAgICAgICAgICAgICBkYW5nZXJvdXMgdG9vLiBBbmQgaW4gcHl0aG9uIHlvdSBjYW4gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QKICAgICAgICAgICAgICAgIGp1c3QgbGlrZSBpbiBDKyssIHNvLCBiZSBjYXJlZnVsLgoJCQoJCU5vdGUgMjogdGhlIGl0ZXJhdG9ycyBhcmUgJ2xpZ2h0JywgaWUsIHRoZXkgZG8gbm90CgkJY29udmVydCBzZXF1ZW5jZSBlbGVtZW50cyB1bnRpbCB5b3UgcmVxdWVzdCB0byBkbyBzbywgdmlhCgkJbmV4dCgpLCB2YWx1ZSgpIG9yIHByZXZpb3VzKCkuIElmIHlvdSBqdXN0IGluY3JlbWVudC9kZWNyZW1lbnQgb25lCgkJbm8gY29udmVyc2lvbiBpcyBwZXJmb3JtZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkgICAgICAgICAgICAgYiArPSAxCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigpCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigyKQoJCSAgICAgYi5kZWNyKDIpCiAgICAgICAgICAgICAgICAgICAgIGIuZGVjcigpCiAgICAgICAgICAgICAgICAgICAgIGIgLT0gMQoKCQkgb25seSB0aGUgaXRlcmF0b3IgaXMgbW9kaWZpZWQsIGFuZCBub3QgdmFsdWUgd3JhcHBlcgoJCSBpcyBnZW5lcmF0ZWQuIE90aGVyIHR5cGljYWwgQysrIG9wZXJhdGlvbnMgYXJlIGFsc28gCgkJIGF2YWlsYWJsZSwgc3VjaCBhczoKCgkJICAgICBwcmludCBzLmVuZCgpIC0gcy5iZWdpbigpCgkJICAgICA+Pj4gMwoJCSAgICAgZiA9IHMuYmVnaW4oKSArIDEKCQkgICAgIHByaW50IGYudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgbCA9IHMuZW5kKCkgLSAxCgkJICAgICBwcmludCBsLnZhbHVlKCkKCQkgICAgID4+PiAiYyIKCQkgCgkJIGV0Yy4gIE9mIGNvdXJzZSwgdGhlICdmaW5kJywgJ2luc2VydCcsICdlcmFzZScsIGFuZAoJCSBzbyBvbiBtZXRob2RzIGFsc28gc3VwcG9ydHMgaXRlcmF0b3JzIG5vdywgaWU6CgoJCSAgICAgIGkgPSBzLmJlZ2luKCkKCQkgICAgICBpICs9IDEKCQkgICAgICBzLmVyYXNlKGkpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkKCQkgICAgICBwcmludCBzdW0KCQkgICAgICA+Pj4gImFjIgoJCSAgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlcmUgaXMgbm8gbW9yZSAndGhpc293bicgYXR0cmlidXRlLiBJZiB5b3UgdXNlIGl0LCBweXRob24KCSAgICB3aWxsIHRyYW5zbGF0ZSB0aGUgZm9sbG93aW5nIGNvZGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi50aGlzb3duKTogICA9PT4gICBpZiAoc2VsZi50aGlzLm93bigpKToKCQlzZWxmLnRoaXNvd24gPSAxICAgICA9PT4gICBzZWxmLnRoaXMub3duKDEpCiAgICAgICAgICAgICAgICBzZWxmLnRoaXNvd24gPSAwICAgICA9PT4gICBzZWxmLnRoaXMub3duKDApCgoJICAgIFN0aWxsLCBtYXliZSBpbiBzb21lIHVudXN1YWwgY2FzZXMgdGhlIHRyYW5zbGF0aW9uIHdpbGwgbm90IGJlCgkgICAgMTAwJSBjb3JyZWN0LCBzbyBpZiB5b3UgaGF2ZSBhIHByb2JsZW0sIHBsZWFzZSByZXBvcnQgaXQKCSAgICBhbmQvb3IgdXNlIHRoZSBuZXcgJ3NlbGYudGhpcy5vd24oKScgYWNjZXNzb3IuCgkgICAgCgkgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIFRoZXJlIGlzIG5vIG1vcmUgQ2xhc3NQdHIgY2xhc3NlcyBpbiB0aGUgcHl0aG9uIGNvZGUuIEhlbmNlLAoJICAgIGlmIGluIHRoZSBwYXN0IHlvdSBuZWVkZWQgdG8gcmVzb3J0IHRvIHNvbWUga2luZCBvZiB0cmlja2VyeQoJICAgIHdpdGggdGhlbSwgb3Igb3ZlcmNvbWUgdGhlaXIgcHJlc2VuY2UsIGl0IGlzIG5vIGxvbmdlcgoJICAgIHJlcXVpcmVkLCBidXQgdGhlIGV4dHJhIGNvZGUgeW91IGFkZGVkIGNvdWxkIG5vdyBicmVhawoJICAgIHRoaW5ncy4KCgkgICAgSWYgbmVlZGVkLCB5b3UgY2FuIHVzZSB0aGUgb3B0aW9uIC1jbGFzc3B0ciwgaS5lLiwKCiAgICAgICAgICAgICAgIHN3aWcgLWNsYXNzcHRyIC1weXRob24gLi4uCgoJICAgIHRvIGdlbmVyYXRlIHRoZSBvbGQgQ2xhc3NQdHIgY2xhc3Nlcy4KCgoxMC8zMC8yMDA1OiBta29lcHBlIAoJICAgIFtHdWlsZV0gTWFrZSBkZWNsYXJlZCBhbmQgZGVmaW5lZCBsaW5rYWdlIG9mIFNXSUdfaW5pdCBjb25zaXN0ZW50LiAgCgkgICAgUmVwb3J0ZWQgYnkgU3RldmVuIEcuIEpvaG5zb24gKFNGIHBhdGNoIDEzMTU0OTgpLgoKMTAvMjYvMjAwNTogbW1hdHVzCgoJICAtIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSBnbG9iYWwgbGlicmFyeSBkaXJlY3Rvci4KCSAgICBOb3cgaXQgY2FuIGJlIHVzZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMgdGhhdCBkbyBub3QgdXNlCgkgICAgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5IGFzIHdlbGwuCgoJICAgIFNvLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgJWluY2x1ZGUgYXR0cmlidXRlLmkKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGUoQSwgaW50LCBhLCBnZXRfYSwgc2V0X2EpOwoJICAgICAgIAkJCQkgICAgICAJICAKCSAgICAgICBzdHJ1Y3QgQQkJCSAgICAgIAkgIAoJICAgICAgIHsgICAgCQkJCSAgCgkgICAgICAgICBpbnQgZ2V0X2EoKSBjb25zdDsgCQkgIAoJICAgICAgICAgdm9pZCBzZXRfYShpbnQgYWEpOyAJCSAgCgkgICAgICAgfTsJCQkJICAKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGVfcmVmKEIsIGludCwgYyk7CgkgICAgICAgCQkJCQoJICAgICAgIHN0cnVjdCBCCQkJCgkgICAgICAgeyAgICAJCQkKCSAgICAgICAgIGludCYgYygpOyAJCQoJICAgICAgIH07IAoKCSAgICB0aGVuIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdGhlICdBLmEnIGFuZCAnQi5jJyBhdHRyaWJ1dGVzIHdpbGwKCSAgICBiZSB2aXNpYmxlLCBpZSwgeW91IGNhbiBhY2Nlc3MgdGhlbSBhcyBwbGFpbiB2YXJpYWJsZXM6CgogICAgICAgICAgICAgICBmICAgPSBBKCkKICAgICAgICAgICAgICAgZi5hID0gMwogICAgICAgICAgICAgICBnICAgPSBCKCkKICAgICAgICAgICAgICAgZy5jID0gMyAKICAgICAgICAgICAKCSAgICAgICBoICAgPSBmLmEgKyBnLmMKCgkgICAgYW5kIHRoZSBwcm9wZXIgZ2V0L3NldCBtZXRob2RzIHdpbGwgYmUgZGlzcGF0Y2hlZC4gU2VlCgkgICAgYXR0cmlidXRlLmkgZm9yIG1vcmUgaW5mby4KICAgCiAgICAgICAgICAtIE1vcmUgY2xlYW51cHMgYXJvdW5kIGFuZCBhZGRpbmcgbW9yZSB0ZXN0LWNhc2VzLiBUaGUKICAgICAgICAgICAgRElTT1dOIHR5cGVtYXAgbm93IGlzIHRlc3RlZCBhbmQgd29ya2luZyBpbiBhbGwgdGhlCiAgICAgICAgICAgIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGllLCB0Y2wsCiAgICAgICAgICAgIHJ1YnksIHBlcmwgYW5kIHB5dGhvbi4KCSAgICAKCjEwLzI1LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwsIGNvbXBsZXRlIHRoZSBESVNPV04gdHlwZW1hcC4KCSAgICAKCSAgICAtIGFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSB1bmlmaWVkIHR5cGVtYXAKICAgICAgICAgICAgICBsaWJyYXJ5IChiZWZvcmUgd2FzIG9ubHkgdXNhYmxlIGZyb20gcHl0aG9uKS4KCgkgICAgLSB1bmlmeSB0aGUgbmFtZXMgZm9yIHRoZSBzZXR0ZXIgYW5kIGdldHRlciBtZXRob2RzIGluCgkgICAgICBwZXJsLHRjbCxydWJ5IGFuZCBweXRob24sIHNvLCB0aGUgYXR0cmlidXRlLmkgbGlicmFyeQoJICAgICAgY2FuIHdvcmsgYWNyb3NzIHRoZW0uCgkgICAgICAKCSAgICAtIHNlZSB0aGUgbGlfYXR0cmlidXRlLmkgdGVzdC1jYXNlIG9yIHRoZSBsaWJyYXJ5IGZpbGUKCiAJICAgICAgICBMaWIvdHlwZW1hcHMvYXR0cmlidXRlLnN3ZwoKICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvIGFib3V0IGhvdyB0byB1c2UgaXQuCgogCgkgICAgICAKCjEwLzI0LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwgbm93IHVzZXMgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LgoKCSAgICAtIENoYW5nZXMgaW4gcnVieSB0byB1c2UgdGhlICR0cmFjayBvcHRpb24gaW4gdHlwZW1hcHMuCgoJICAgIC0gQ2hhbmdlcyBpbiB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgdG8gZm9sbG93IHRoZQoJICAgICAgY29udmVudGlvbiB0aGF0IGFsbCBtYWNyb3MgdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlCgkgICAgICBDL0MrKyBzaWRlIHN0YXJ0cyB3aXRoICUsIHN1Y2ggYXMKCgkgICAgICAgICAgICVkZWxldGUKCQkgICAlbmV3X2FycmF5CgogICAgICAgICAgICAgIGV0Yy4KCSAgICAgIAoJICAgIC0gRG9jdW1lbnRpbmcgZnJhZ21lbnRzLCBzZWUgZnJhZ21lbnRzLnN3Zy4KCgkgICAgLSBDbGVhbmVyIHdheSB0byB1c2UgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LCBpbmNsdWRlCgkgICAgICBqdXN0IDx0eXBlbWFwcy9zd2lndHlwZXMuc3dnPi4KCgkgICAgICBDaGVjayBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBwZXJsLCB0Y2wsIHJ1YnksCgkgICAgICBweXRob24uCgoJICAgICAgQWx3YXlzIHN0YXJ0IHdpdGggdGhlIGhlYWQgZmlsZSwgc3VjaCBhcwoKCSAgICAgICAgIHB5dGhvbi9weXRob24uc3dnCgkgICAgICAgICB0Y2wvdGNsOC5zd2cKCSAgICAgICAgIHJ1YnkvcnVieS5zd2cKCSAgICAgICAgIHBlcmw1L3Blcmw1LnN3ZwoKICAgICAgICAgICAgICBhbmQgdGhlIHByaW5jaXBhbCBmaWxlIHRoYXQgaW52b2tlcyB0aGUgdW5pZmllZCBsaWJyYXJ5LCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHRjbC90Y2x0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcnVieS9ydWJ5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHBlcmwvcGVybHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgCgkgICAgICBUaGUgZmlsZSB0aGF0IHByb3ZpZGUgdGhlIHNwZWNpYWxpemF0aW9uIGZvciBlYWNoCgkgICAgICBsYW5ndWFnZSBhcmUgdGhlIG9uZSB0aGF0IHByb3ZpZGVzIHRoZSBiYXNpYyB0eXBlczoKCgkgICAgICAgICBweXRob24vcHlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcnVieS9ydWJ5cHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcGVybDUvcGVybHByaW10eXBlcy5zd2cKCgkgICAgICBhbmQgdGhlIHN0cmluZyBtYW5pcHVsYXRpb246ICAJIAoJICAgIAoJICAgICAgICAgcHl0aG9uL3B5c3RyaW5ncy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHBlcmw1L3BlcmxzdHJpbmdzLnN3ZwoKCQkgCgkgICAgICBUaGUgcmVzdCBvZiB0aGUgZmlsZXMsIHN1Y2ggYXMgY2FycmF5LmksIGFyZSBtb3N0bHkgb25lIAoJICAgICAgbGluZSBmaWxlcyB0aGF0IGluY2x1ZGUgdGhlIHByb3BlciB0eXBlbWFwIGxpYnJhcnkKCSAgICAgIHZlcnNpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBpbiBQZXJsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gUGVybC4KCjEwLzIzLzIwMDU6IHd1enplYgogICAgICAgICAgICBDaGlja2VuOgogICAgICAgICAgICAgICsgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucyBmaW5hbGx5IHdvcmsgcHJvcGVybHkKICAgICAgICAgICAgICArIGFkZCB0ZXN0IG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyB0byBjcHBfYmFzaWMuaQoKMTAvMjAvMjAwNTogZGFuY3kKCSAgICBbYWxsZWdyb2NsXSBBZGRlZCBDKysgc3VwcG9ydC4gTGFyZ2UgdXBkYXRlLCBtYW55IGNoYW5nZXMuIFNlZQoJICAgIG5ld2x5IGFkZGVkIEFsbGVncm8gQ29tbW9uIExpc3Agc2VjdGlvbiBpbiBsaXNwLmh0bWwKCjEwLzIwLzIwMDU6IG1tYXR1cwoJICAgIFJ1YnksIFRjbCwgUHl0aG9uOgoKCSAgICAtIFVuaWZvcm0gd2F5IHRvIGZhaWwgKGxhYmVsIGZhaWw6KSwgbm93IGZpbmFsbHkKCSAgICAgIFNXSUdfZXhjZXB0aW9uIHdvcmtzIGFjcm9zcyB0aGUgdGhyZWUgbGFuZ3VhZ2VzIGFuZCBhbGwKCSAgICAgIHRoZSB0eXBlbWFwcy4KCgkgICAgLSBBZGQgcHJvcGVyIGNsZWFudXAgY29kZSB0byBydWJ5CgoJICAgIC0gTW9yZSB2YWxncmluZCBmaXhlcwoKCSAgICAtIFNpbXBsaWZ5IHRoZSBpbmxpbmUgdXNlLCBpdCBzZWVtcyBhIHNtYWxsIGludGVyZmFjZSBvZgoJICAgICAgMjAsMDAwIGxpbmVzIChwbHVzIG1hbnkgbWFueSB0ZW1wbGF0ZXMpIGNhbiBicmVhayAKCSAgICAgIGdjYyAtTzMgZWFzaWx5LgoKCSAgICAtIEZpbmFsaXplIHRoZSB0eXBlbWFwcyBsaWJyYXJ5LiBBbGwgdGhlIG9sZCAgKi5pIGZpbGVzCgkgICAgICAoY2FycmF5LmksIGNwb2ludGVyLmksIGV4Y2VwdGlvbi5pKSBoYWQgYmVlbiBpbXBsZW1lbnRlZAoJICAgICAgaW4gdGhlIG5ldyB0eXBlbWFwcyBsaWJyYXJ5LgoJICAgIAoKMTAvMTkvMjAwNTogd3V6emViCgkgICAgVXBkYXRlIHRoZSBSdW50aW1lIFR5cGVtYXAgZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sCgoxMC8xOC8yMDA1OiB3dXp6ZWIKCSAgICBDaGlja2VuOgoJICAgICAgLSBDb3JyZWN0bHkgaGFuZGxlICVpZ25vcmVkIGNsYXNzZXMKICAgICAgICAgICAgICAtIENvcnJlY3RseSBjb252ZXJ0IGxvbmcsIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZywgZXRjCiAgICAgICAgICAgICAgICB0byBjaGlja2VuIHByaW1pdGl2ZXMuIChUaGFua3MgdG8gRmVsaXggV2lua2VsbWFubikKICAgICAgICAgICAgICAtIFVzaW5nIGFyZ291dCBwYXJhbWV0ZXJzIHdoZW4gdGhlIHJldHVybiB2YWx1ZSB3YXMgYQogICAgICAgICAgICAgICAgd3JhcHBlZCBwb2ludGVyIGNhdXNlZCBhIG1lbW9yeSBjb3JydXB0aW9uLiAgVGhlIGNoaWNrZW4KICAgICAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIG1vdmVkIGEgcG9pbnRlciBvdXQgZnJvbSB1bmRlciB1cy4KICAgICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGJ5IHJ1bm5pbmcgYWxsIHRoZSBwcm94eSBjcmVhdGlvbgogICAgICAgICAgICAgICAgZnVuY3Rpb25zIGFzIGNvbnRpbnVhdGlvbnMgYWZ0ZXIgdGhlIHdyYXBwZXIgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHJldHVybnMuICBBcyBwYXJ0IG9mIHRoaXMsIHdlIG5vIGxvbmdlciBuZWVkIHRoZQogICAgICAgICAgICAgICAgY2hpY2tlbmZhc3Rwcm94eSBmbGFnIG9uIG91dHB1dCB0eXBlbWFwcy4KICAgICAgICAgICAgICAtIHVzaW5nIC1wcm94eSBhbmQgLW5vY29sbGVjdGlvbiB0b2dldGhlciB3b3JrcyBub3cKICAgICAgICAgICAgICAgIEJlZm9yZSwgaXQgd2FzIG5vdCBleHBvcnRpbmcgdGhlIGRlc3RydWN0b3IgaW4gdGhlIHByb3h5CiAgICAgICAgICAgICAgICB3cmFwcGVyLgoKMTAvMTgvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgQWRkZWQgdGhlIFVuaWZpZWQgVHlwZW1hcCBMaWJyYXJ5IChVVEwpLiBJdCB1bmlmaWVzIHRoZSB0eXBlbWFwcyBmb3IKCiAJICAgICAgICBweXRob24sIHJ1YnksIHRjbAoKCSAgICBhbmQgaW4gdGhlIHByb2Nlc3MsIGZpeGVzIHNldmVyYWwgcHJvYmxlbXMgaW4gZWFjaCBvZiB0aGUgdGhyZWUKCSAgICBsYW5ndWFnZXMgdG8gd29yayBpbiBhICJjYW5vbmljYWwiIHdheSBub3cgZXN0YWJsaXNoZWQgaW4KCSAgICB0aGUgdHlwZW1hcCBsaWJyYXJ5CgkgICAgCgkgICAgICAgU1dJRy9MaWIvdHlwZW1wYXMKCgkgICAgVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB1bmlmaWNhdGlvbiBpcyB0aGF0IGV2ZXJ5dGhpbmcKCSAgICBjb21waWxlcyBhbmQgcnVucyBpbnNpZGUgdGhlIHRlc3Qtc3VpdGUgYW5kIGV4YW1wbGVzCgkgICAgZGlyZWN0b3JpZXMuIEFuZCBmb3IgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0aGFuIHBhc3MgdGhlIHByaW1pdGl2ZV90eXBlcy5pIGNhc2UuCgoJICAgIEFsc28sIHdlIGhhdmUgYSB1bmlmb3JtIHdheSB0byB0cmVhdCB0aGUgZXJyb3JzLCBmb3IgZXhhbXBsZQoJICAgIGlmIHlvdSBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgID4+PiBmcm9tIHByaW1pdGl2ZV90eXBlcyBpbXBvcnQgKgogICAgICAgICAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTApCiAgICAgICAgICAgICAgMTAKCSAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTAwMCkKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CQkgICAgICAKCSAgICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwkJCSAgICAKCSAgICAgIE92ZXJmbG93RXJyb3I6IGluIGFyZ3VtZW50IDEgb2YgdHlwZSAndW5zaWduZWQgY2hhcicKCgkgICAgeW91IGdldCB0aGUgc2FtZSBleGNlcHRpb24gaW4gYWxsIHRoZSB0aHJlZSBsYW5ndWFnZXMuCgkgICAgCgkgICAgQW5kIHdlbGwsIG1hbnkgbW9yZSBnb29kIHRoaW5ncyB3aWxsIGNvbWUgZnJvbSB0aGlzCgkgICAgdW5pZmljYXRpb24sIGZvciBleGFtcGxlLCBwcm9wZXIgc3VwcG9ydCBvZiB0aGUgU1RML1NURCBjbGFzc2VzCgkgICAgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgaG9wZWZ1bGx5LCB3ZSBjYW4ga2VlcAoJICAgIGFkZGluZyBvdGhlciBsYW5ndWFnZXMuCgoJICAgIFRoZSBoYXJkZXN0IHBhcnQsIHdyaXRpbmcgYSBjb21tb24gdHlwZW1hcCBsaWJyYXJ5CgkgICAgdGhhdCBzdWl0ZXMgdGhlIHRocmVlIGRpZmZlcmVudCBsYW5ndWFnZXMsIGlzIGRvbmUsCgkgICAgYW5kIGFkZGluZyBhbm90aGVyIGxhbmd1YWdlIHNob3VsZCBub3cgYmUgZWFzeS4gCgoJICAgIFN0aWxsIHRoZSBnbG9iYWwgdW5pZmljYXRpb24gaXMgbm90IGNvbXBsZXRlLCB0aGUgU1RML1NURCAKCSAgICBwYXJ0IGlzIG5leHQsIGFuZCBwcm9iYWJseSBhcyB3ZWxsIGFzIGFkZGluZyBvbmUgb3IgdHdvIG1vcmUKCSAgICBsYW5ndWFnZXMuCgoJICAgIElmIHlvdSBhcmUgY3VyaW91cywgbG9vayBhdCB0aGUgcHl0aG9uLCBydWJ5IGFuZC9vciB0Y2wKCSAgICBkaXJlY3RvcmllcyB0byBzZWUgd2hhdCBpcyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgbmV3CgkgICAgY29tbW9uIHR5cGVtYXBzIGxpYnJhcnkuICBTdGlsbCwgdGhlIGZpbmFsIHdheSB0bwoJICAgIGludGVncmF0ZSBhIG5ldyBsYW5ndWFnZSBjb3VsZCBjaGFuZ2UgYXMgd2UgbW92ZSB0bwoJICAgIGludGVncmF0ZSB0aGUgU1REL1NUTC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFJ1YnkvVGNsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgYmVoYXZpb3IsIHNwZWNpYWxseSBpbiBydWJ5IGFuZCB0Y2wuCgpWZXJzaW9uIDEuMy4yNyAoT2N0b2JlciAxNSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB0eXBlc2FmZSBlbnVtIHdyYXBwaW5nIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8KICAgICAgICAgICAgb3ZlcmxvYWQgYSBtZXRob2Qgd2l0aCAyIGRpZmZlcmVudCBlbnVtIHR5cGVzLgoKMTAvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlZmVhdHVyZSgiaW1tdXRhYmxlIiwiMCIpIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgc2V0dGVycwogICAgICAgICAgICBmb3IgY29uc3RhbnRzLgoKICAgICAgICAgICAgUmVzdG9yZWQgJWltbXV0YWJsZSBhbmQgJW1ha2VkZWZhdWx0IHRvIGNsZWFyIHRoZSBmZWF0dXJlIGFzIGl0CiAgICAgICAgICAgIGJlaGF2ZWQgaW4gU1dJRy0xLjMuMjUgYW5kIGVhcmxpZXIuCgoxMC8xNC8yMDA1OiBtbWF0dXMKICAgICAgICAgICAgRml4IGJ1ZyBpbiBhbm9ueW1vdXMgdHlwZWRlZiBzdHJ1Y3R1cmVzIHdoaWNoIHdhcyBsZWFkaW5nIHRvCiAgICAgICAgICAgIHN0cmFuZ2UgYmVoYXZpb3VyLgoKMTAvMTMvMjAwNTogbW1hdHVzCgkgICAgU2V2ZXJhbCBtaW5vciBjaGFuZ2VzOgoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgd2NoYXJfdCB0eXBlIHN1cHBvcnQKCSAgICAtIEFkZCBhIHdhcm5pbmcgZm9yIHdoZW4geW91IGRlZmluZSB0aGUgJ2luJyB0eXBlbWFwIGJ1dAoJICAgICAgeW91IGRvbid0IGRlZmluZSB0aGUgJ3R5cGVjaGVjaycgb25lLiBWZXJ5IGNvbW1vbiBtaXN0YWtlLgoJICAgIC0gQWRkIHByb3BlciBkZWZhdWx0IHJ1bGUgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLCBub3cgeW91CgkgICAgICBjYW4gZGVmaW5lIGEgdHlwZW1hcCBzdWNoIGFzOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAoKCopKEFOWSkpIHsuLi59CgoJICAgICAgVGhhdCB3aWxsIGFwcGx5IHRvIGFsbCB0aGUgcG9pbnRlciB0byBmdW5jdGlvbnMuIFRoZQoJICAgICAgcnVsZSBpbiBDKysgYWxzbyBhcHBseSB0byB0aGUgZnVuY3Rpb24gJ3JlZmVyZW5jZScsIGllLAoJICAgICAgaW4gYm90aCBjYXNlcwoKCSAgICAgICAgdHlwZWRlZiAgaW50ICgqZnB0cikoaW50IGEpOwoJICAgICAgICB0eXBlZGVmICBpbnQgKGZ1bmMpKGludCBhKTsKCgkgICAgICBUaGlzIHdhcyBuZWVkZWQgc2luY2UgaXQgc2VlbXMgdG8gYmUgJ2lsbGVnYWwnIGluIEMrKyB0bwoJICAgICAgZG8gc29tZXRoaW5nIGxpa2U6CgoJICAgICAgICAgdm9pZCAqcHRyID0gc3RhdGljX2Nhc3Q8dm9pZCAqPihmcHRyKTsKCgkgICAgICBhbmQgcHJvYmFibHksIGFzIGZvciBtZW1iZXIgZnVuY3Rpb25zLCBpdCBpcyBub3QKCSAgICAgIHdhcnJhbnRpZWQgdGhhdCB0aGUgcG9pbnRlciBzaXplcyB3aWxsIG1hdGNoLgoKCSAgICAtIEFkZCB0aGUgI2Vycm9yLyN3YXJuaW5nIGRpcmVjdGl2ZXMgdG8gc3dpZydzIGNwcC4KCgkgICAgLSBBZGQgdGhlIG5vYmxvY2sgb3B0aW9uIGZvciB0eXBlbWFwcywgd2hpY2ggaXMgdXNlZCBhcwogICAgICAgICAgICAgIGZvbGxvd3M6IHN1cHBvc2VkIHlvdSBhIHR5cGVtYXAsIGxpa2UgdGhpcwoKCSAgICAgIAoJICAgICAgJXR5cGVtYXAoaW4sbm9ibG9jaz0xKSBIZWxsbyB7CQkJICAgCgkgICAgICAgICAuLi4uCiAgICAgICAgICAgICAgfQoKCSAgICAgIHRoZW4gdGhlIHR5cGVtYXAgd2lsbCBiZSBpbnNlcnRlZCB3aXRob3V0IHRoZSBibG9jawoJICAgICAgaW1wb3NlZCBieSB0aGUgYnJhY2tldHMsIHNpbWlsYXIgdG8KCgkgICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIuLi4iOwoKCSAgICAgIFNvLCB3aHkgeW91IGRvbid0IGp1c3QgdXNlIHRoZSBxdW90ZSBzdHlsZT8sIGJlY2F1c2U6CgkgICAgICAKCSAgICAgICAgIDEuLSBUaGUgcXVvdGUgc3R5bGUgZG9lc24ndCBnZXQgcHJlcHJvY2Vzc2VkLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiJDE9IFNXSUdfbWFjcm8oJDEpOyI7CgkgICAgICAKCSAgICAgICAgICAgICBoZXJlLCBTV0lHX21hY3JvIGRvZXNuJ3QgZ2V0IGV4cGFuZGVkCgogICAgICAgICAgICAgICAgIDIuLSBJbnNpZGUgYSBxdW90ZSB0eXBlbWFwLCB5b3UgaGF2ZSB0byB1c2UgCiAgICAgICAgICAgICAgICAgICAgIHF1b3RlcyBjYXJlZnVsbHkKCgkJICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMSA9IFwiaGVsbG9cIiAiOwoKCQkgMy4tIFlvdSBjYW4ndCBtYWtlIGVtYWNzIGFuZC9vciBvdGhlciBlZGl0b3JzCgkJICAgICB0byBpbmRlbnQgaW5zaWRlIGEgc3RyaW5nIS4gCgoKCSAgICAgIFNvLCB3aHkgZG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBibG9jaz8sIGJlY2F1c2UgYW4gZXh0cmEKCSAgICAgIGJsb2NrIHdoZW4gbm90IG5lZWRlZCAobm8gbG9jYWwgdmFyaWFibGVzIGluIGl0KToKCgkgICAgICAgICAgMS4tIG1ha2VzIHRoZSBjb2RlIGhhcmRlciB0byByZWFkCiAgICAgICAgICAgICAgICAgIDIuLSBtYWtlcyB0aGUgY29kZSBsYXJnZXIKICAgICAgICAgICAgICAgICAgMy4tIG9yIGluIHNob3J0LCBmb3IgdGhlIHNhbWUgcmVhc29uIHdlIGhhdmUgdGhlIHF1b3RlIHN0eWxlLgoKVmVyc2lvbiAxLjMuMjYgKE9jdG9iZXIgOSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZGVkICd0aHJvd3MnIHR5cGVtYXBzLgoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGxhbmd1YWdlcyB0aGF0IGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIFRoZQogICAgICAgICAgICBmaXJzdCBub24taWdub3JlZCBjbGFzcyBpbiB0aGUgcHVibGljIGJhc2UgY2xhc3MgbGlzdCBpcyB1c2VkIGZvciBpbmhlcml0YW5jZS4KICAgICAgICAgICAgYnkgdGhlIHByb3h5IGNsYXNzLiBQcmV2aW91c2x5LCBpZiB0aGUgZmlyc3QgY2xhc3MgaW4gdGhlIGxpc3Qgd2FzIGlnbm9yZWQsIHRoZW4KICAgICAgICAgICAgdGhlIHByb3h5IGNsYXNzIHdvdWxkbid0IGhhdmUgYW55IGJhc2UgY2xhc3Nlcy4KCjEwLzA3LzIwMDU6IG1tYXR1cwoJICAgICBVcGRhdGUgbW9yZSBmZWF0dXJlcyB0byBmb2xsb3cgbmV3IGNvbnZlbnRpb24sIGluY2x1ZGluZzoKCgkgICAgICAgY2FsbGJhY2sKCSAgICAgICByZWYvdW5yZWYKCSAgICAgICBleGNlcHQKCSAgICAKCSAgICAgQWxsIG9mIHRoZW0gdXNlIG5vdCBvbmx5IHRoZSBmZWF0dXJlIGFzIGEgZmxhZywgYnV0IGFsc28KCSAgICAgYXMgY29kZSB2YWx1ZS4gVG8gZGVhbCB3aXRoIHRob3NlIGZlYXR1cmVzLCB3ZSB1c2Ugbm93CgkgICAgIEdldEZsYWdBdHRyLCB3aGljaCBpcyBzaW1pbGFyIHRvIEdldEZsYWcsIGJ1dCBpbnN0ZWFkIG9yCgkgICAgIHJldHVybmluZyAxIG9yIDAsIGl0IHJldHVybnMgdGhlIGF0dHIgdmFsdWUsIGlmIGhhcHBlbnMKCSAgICAgdG8gYmUgZGlmZmVyZW50IG9mICIwIiBvZiBjb3Vyc2UuCgoJICAgICBOb3cgdGhlcmUgYXJlIGFsc28gbW9yZSB1bmlmb3JtIGRpcmVjdGl2ZSBuYW1lcyBmb3IgdGhlIAoJICAgICBvbmVzIGJhc2VkIGluIGZlYXR1cmVzLCBmb3IgZXhhbXBsZSwgZm9yIHRoZSBvbGQKCSAgICAgJW5ld29iamVjdCBkaXJlY3RpdmUgbm93IHdlIGhhdmUgdHJlZSBkaXJlY3RpdmVzIGRlZmluZWQ6CgkgICAgIAoKCSAgICAgI2RlZmluZSAlbmV3b2JqZWN0ICAgICAgICAlZmVhdHVyZSgibmV3IikKCSAgICAgI2RlZmluZSAlbm9uZXdvYmplY3QgICAgICAlZmVhdHVyZSgibmV3IiwiMCIpCgkgICAgICNkZWZpbmUgJWNsZWFybmV3b2JqZWN0ICAgJWZlYXR1cmUoIm5ldyIsIiIpCgoJICAgICBhbmQgc28gb24gZm9yIGFsbCB0aGUgb3RoZXIgZmVhdHVyZSBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8zMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHNvbWUgZmVhdHVyZXMuIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkaXNhYmxlIG1hbnkKICAgICAgICAgICAgZmVhdHVyZXMgb25jZSB0aGV5IGhhZCBiZWVuIGVuYWJsZWQuIFRoaXMgd2FzIGZvciBtb3N0IGZlYXR1cmVzIHRoYXQgYmVoYXZlIGFzCiAgICAgICAgICAgIGZsYWdzLiBUaGVzZSBmZWF0dXJlcyBub3cgd29yayBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIpICAgICAgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMSIpICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjAiKSAgICAgICAgIC8vIGRpc2FibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiIikgICAgICAgICAgLy8gY2xlYXJzIHRoZSBmZWF0dXJlCgogICAgICAgICAgICBJbiBmYWN0IGFueSBub24tZW1wdHkgdmFsdWUgb3RoZXIgdGhhbiAiMCIgd2lsbCBlbmFibGUgdGhlIGZlYXR1cmUgKGxpa2UgQyBib29sZWFuIGxvZ2ljKS4KICAgICAgICAgICAgUHJldmlvdXNseSAiMSIsICIwIiBvciBhbnkgb3RoZXIgbm9uLWVtcHR5IHZhbHVlIHdvdWxkIGVuYWJsZSB0aGUgZmVhdHVyZSBhbmQgaXQgd291bGQKICAgICAgICAgICAgb25seSBiZSBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSBmZWF0dXJlIGJ5IGNsZWFyaW5nIGl0IChhc3N1bWluZyB0aGVyZSB3YXMgbm8gZ2xvYmFsIGVuYWJsZSkuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBhZmZlY3RlZDoKCiAgICAgICAgICAgICAgYWxsb3dleGNlcHQKICAgICAgICAgICAgICBjb21wYWN0ZGVmYXVsdGFyZ3MKICAgICAgICAgICAgICBjbGFzc2ljICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgY3M6Y29uc3QgICAgICAgICAgICAgICAoQyMpCiAgICAgICAgICAgICAgZGlyZWN0b3IKICAgICAgICAgICAgICBleGNlcHRpb25jbGFzcyAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgaWdub3JlCiAgICAgICAgICAgICAgaW1tdXRhYmxlCiAgICAgICAgICAgICAgamF2YTpjb25zdCAgICAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBqYXZhOmRvd25jYXN0ICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGt3YXJncwogICAgICAgICAgICAgIG1vZGVybiAgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBuZXcKICAgICAgICAgICAgICBub2F1dG9kb2MgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbm9kZWZhdWx0CiAgICAgICAgICAgICAgbm9kaXJlY3RvcgogICAgICAgICAgICAgIG5vcmVmCiAgICAgICAgICAgICAgbm90YWJzdHJhY3QKICAgICAgICAgICAgICBub3VucmVmCiAgICAgICAgICAgICAgbm92YWx1ZXdyYXBwZXIKICAgICAgICAgICAgICBweXRob246bWF5YmVjYWxsICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgcHl0aG9uOm5vbmR5bmFtaWMgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG1vZHVsYTM6bXVsdGlyZXR2YWwgICAgKE1vZHVsYTMpCiAgICAgICAgICAgICAgcHJlZGljYXRlICAgICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB0cmFja29iamVjdHMgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHZhbHVld3JhcHBlcgoKICAgICAgICAgICAgSXQgaXMgbm93IHBvc3NpYmxlLCBmb3IgZXhhbXBsZSB0byBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcyBpbiBhIGhlYWRlciBmaWxlLCBleGNlcHQgZm9yIGEKICAgICAgICAgICAgZmV3IHRhcmdldHRlZCBtZXRob2RzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIHNvbWVfZnVuY3Rpb24oaW50LCBkb3VibGUpOyAvLyBkbyBub3QgaWdub3JlIHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczsgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgQ2xhc3MKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczo6bWV0aG9kOyAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgbWV0aG9kCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJpZ2hlYWRlci5oIgoKICAgICAgICAgICAgUmVtb3ZlZCAlcHl0aG9uZHluYW1pYyAtIGl0IG5ldmVyIHdvcmtlZCBwcm9wZXJseS4gVXNlICVweXRob25ub25keW5hbWljIGluc3RlYWQuCiAgICAgICAgICAgIFJlbW92ZWQgJWZlYXR1cmUoIm5va3dhcmdzIikgLSBpdCB3YXNuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgIC0gdXNlICVmZWF0dXJlKCJrd2FyZ3MiLCIwIikgaW5zdGVhZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMjUvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gQWRkICJ0aHJvd3MiIHR5cGVtYXBzLgoKMDkvMjQvMjAwNTogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XSBBZGRzIG5ldyAldHJhY2tvYmplY3RzIGZ1bmN0aW9uYWxpdHkgdGhhdCBtYXBzIEMrKyBvYmplY3RzIHRvCiAgICAgICAgICAgIFJ1Ynkgb2JqZWN0cy4gIFRoaXMgZnVuY3Rpb25hbGl0eSBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBpbXBsZW1lbnQKICAgICAgICAgICAgbWFyayBmdW5jdGlvbnMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gIEZvciBtb3JlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIHJlZmVyIHRvIHRoZSB1cGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuCiAgICAgICAgICAgIAowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGF0Y2ggMTExNjQzMSBmcm9tIEpvc2ggQ2hlcnJ5LiBGaXhlcyBub24gbWVtYmVyIGZ1bmN0aW9ucyBpbmFkdmVydGVudGx5CiAgICAgICAgICAgIGJlaW5nIGNhbGxlZCBpbnN0ZWFkIG9mIG1lbWJlciBmdW5jdGlvbnMuCgowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQYXRjaCBmcm9tIE1hcmsgR29zc2FnZSB0byBhZGQgc3VwcG9ydCBmb3IgTHVhLTUuMSwgc3RkOjpzdHJpbmcsCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yLCBzdGQ6OmV4Y2VwdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KCjA5LzE0LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCAtbm9jcHBjYXN0LiBOb3cgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8KCSAgICBhbHdheXMgdXNlIHRoZSBjcHBjYXN0IG9wZXJhdG9ycy4gQmVmb3JlIHRoYXQgd2FzIHRoZSBjYXNlCgkgICAgb25seSB3aGVuIHlvdSB1c2VkIHRoZSAtY3BwY2FzdCBvcHRpb24uCgogICAgICAgICAgICBJZiB0aGlzIHNlZW1zIHRvIGJyZWFrIHlvdXIgY29kZS4uLiB5b3VyIHdlbGNvbWUhLCBpdAoJICAgIG1lYW5zIGl0IHdhcyBicm9rZW4gYmVmb3JlLCBhbmQgeW91IG5ldmVyIG5vdGljZS4gCgoJICAgIElmIHlvdSB0aGluZyB0aGUgZXJyb3IgaXMgZHVlIHRvIG9uZSBvZiB0aGUgU1dJRyB0eXBlbWFwcywKCSAgICBzZW5kIHVzIGFuIGV4YW1wbGUuCgoJICAgIFVzZSAtbm9jcHBjYXN0IG9ubHkgd2l0aCB2ZXJ5IG9sZCBDKysgY29tcGlsZXJzIHRoYXQKCSAgICBkbyBub3Qgc3VwcG9ydCB0aGUgY3BwY2FzdCBvcGVyYXRpb25zLiAKCgkgICAgU28sIGhlcmUgYXBwbGllczoKCgkJVGhpcyBjaGFuZ2UgZG9lc24ndCBicmVhayBjb21wYXRpYmlsaXR5LCBpdCB3YXMgYnJva2VuIGJlZm9yZS4KCjA5LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9yIG1ldGhvZHMgd2hlbiBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhcyBhCiAgICAgICAgICAgIHBhcmFtZXRlci4KCjA5LzExLzIwMDU6IG1tYXR1cwogICAgICAgICAgICBBZGRpbmcgdGhlIG1vZHVsZSBvcHRpb24gdG8gdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBOb3cgeW91CiAgICAgICAgICAgIGNhbiB1c2UgaXQgYXMKCgkgICAgICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCSAgICB3aGVyZSBzdWJmaWxlIGNvdWxkIChvciBub3QpIGRlZmluZSB0aGUgbW9kdWxlIG5hbWUgdmlhCgkgICAgdGhlICVtb2R1bGUgZGlyZWN0aXZlLiBUaGUgbW9kdWxlIG9wdGlvbiB0YWtlIHByZWNlZGVuY2UKCSAgICBhbmQgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdHMgdGhhbiBoYXZpbmcgdGhlIGRpcmVjdGl2ZSAKCgkgICAgICAgICVtb2R1bGUgQmlnTW9kdWxlICAKCgkgICAgaW5zaWRlIHRoZSBpbXBvcnRlZCBmaWxlIGZvby5pLgoKCSAgICBZb3UgY2FuIHVzZSB0aGUgb3B0aW9uIGluIG1haW5seSB0d28gY2FzZXM6CgoJICAgIDEuLSBZb3UgdXNlZCB0aGUgLW1vZHVsZSBvcHRpb24gd2hlbiB5b3UgZ2VuZXJhdGVkIHRoZQogICAgICAgICAgICAgICAgbW9kdWxlIHRvIGJlIGltcG9ydGVkLCBhbmQgaGVuY2UgdGhlIG1vZHVsZSBuYW1lIGluCiAgICAgICAgICAgICAgICB0aGUgaW1wb3J0ZWQgJW1vZHVsZSBkaXJlY3RpdmUgaXMgbm90IHJlYWxseSB1c2VmdWwuCgoJICAgIDIuLSBUaGUgbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydCBpcyB2ZXJ5IGxhcmdlLCBhbmQgaXQKICAgICAgICAgICAgICAgIGhhcyBzZXZlcmFsIC5pLy5oIGZpbGVzLiBUaGVuLCBpZiB5b3UganVzdCBvbmUgdG8KICAgICAgICAgICAgICAgIGltcG9ydCBhIGNsYXNzIG9yIHNvIGZyb20gdGhlIG1vZHVsZSwgc2F5cyAnZm9vJywgYW5kCiAgICAgICAgICAgICAgICBub3QgdGhlIGVudGlyZSBtb2R1bGUgdmlhIGltcG9ydGluZyB0aGUgbWFpbgogICAgICAgICAgICAgICAgQmlnTW9kdWxlLmkgZmlsZSwgdGhlbiB5b3UganVzdCBkbzoKCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmgKCiAgIAkgICAgICAgIG9yCgkJCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkJd2hlcmUgZm9vLmkgY29udGFpbnMgdGhlICdmb28nIGRlY2xhcmF0aW9uIGFuZCBtYXliZSBhCgkJY291cGxlIG9mIGV4dHJhICVpbmNsdWRlIGRpcmVjdGl2ZXMsIGFzIG5lZWRlZC4KCgkgICAgCjA5LzExLzIwMDU6IG1tYXR1cwoJICAgIEZpeCBidWcgIzEyODI2MzcsIGFib3V0IHRoZSAtbW9kdWxlIG9wdGlvbiBub3QgaGF2aW5nIGVmZmVjdAoJICAgIGluIHBsYWNlcyB3aGVyZSBpdCB3YXMgbmVlZGVkLgoKMDkvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgV2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIHR5cGVtYXBzIHVzZWQgZm9yIHRoZQogICAgICAgICAgICBzZXQgd3JhcHBlcnMgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBnZXQgd3JhcHBlcnMuIEkgZG91YnQgdGhpcyB3YXMgYQogICAgICAgICAgICBwcm9ibGVtIGZvciBhbnkgbGFuZ3VhZ2VzIGV4Y2VwdCBmb3IgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgbnVsbCBhdHRyaWJ1dGUKICAgICAgICAgICAgaW4gdGhlIG91dCB0eXBlbWFwIChDIyBvbmx5KS4KCjA5LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZXMgd2hlbiBmaWxlcyBmYWlsIHRvIG9wZW4uCgowOS8wNi8yMDA1OiBtbWF0dXMgCgoJICAgIEFsbG93IGEgJWRlZmluZSBhIG1hY3JvIGluc2lkZSBhbm90aGVyICVkZWZpbmUgbWFjcm8sIGZvciBleGFtcGxlCgoJICAgICAgJWRlZmluZSBoZWxsbyhuYW1lLCBUeXBlKQoJICAgICAgJWRlZmluZSBuYW1lICMjIGEoVHlwZSkKCSAgICAgICV0eXBlbWFwKGluKSBUeXBlICJoZWxsbzsiOwoJICAgICAgJWVuZGRlZgoJICAgICAgJWVuZGRlZgoJICAgICAgCgkgICAgVG8gbGVhcm4gaG93IHRvIHVzZSB0aGlzIG5ldyBmZWF0dXJlcyBpbiB5b3VyIG93biB0eXBlbWFwcyBsaWJyYXJ5LCBzZWUKCSAgICBweXRob24vY3N0cmluZy5pLCBweXRob24vY3dzdHJpbmcuaSBhbmQgcHl0aG9uL2N3c3RyYmFzZS5pLgkgICAgCgogICAgICAgICAgICBbUHl0aG9uXSBOb3JtYWxpemUgdGhlIGNzdHJpbmcuaSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgZnJhZ21lbnRzLCBhbmQgYWRkCiAgICAgICAgICAgIGN3c3RyaW5nLmksIHdoaWNoIGltcGxlbWVudHMgdGhlIHNhbWUgdHlwZW1hcHMgYnV0IGZvciB3Y2hhcl90IHN0cmluZ3MuCgoJICAgIFtQeXRob25dIEJ1ZyBmaXhlZDogMTI0NzQ3NywgMTI0NTU5MSwgMTI0OTg3OCBhbmQgb3RoZXJzLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEltcGxlbWVudCBzdXBwb3J0IGZvciBTV0lHVFlQRSogRElTT1dOIHR5cGVtYXAgKGxpa2UgaW4gUHl0aG9uKSBmb3IKICAgICAgICAgICAgYmV0dGVyIGNvbnRyb2wgb2YgbWVtb3J5IG1hbmFnZW1lbnQsIGVnIHdoZW4gYWRkaW5nIGFuIG9iamVjdCBjcmVhdGVkIGluIFJ1YnkKICAgICAgICAgICAgdG8gYSBDKysgY29udGFpbmVyLiBQYXRjaCAjMTI2MTY5MiBmcm9tIENoYXJsaWUgU2F2YWdlLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gNjQgYml0IHBsYXRmb3JtIGZpeGVzIGZvciB0aGUgdmFyYXJncyBoYW5kbGluZyBpbiBTV0lHX0dldEFyZ3MuIFRoaXMgaXMgYW4KICAgICAgICAgICAgaW1wcm92ZWQgZml4IGZvciBidWcgIzEwMTE2MDQgYXMgc3VnZ2VzdGVkIGJ5IEplcmVteSBMaW4uCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBCdWcgIzEyNDA0NjkgLSAlbmV3b2JqZWN0IHN1cHBvcnQgZm9yIFRjbC4gUGF0Y2ggZnJvbSBCb2IgTWFyaW5pZXIuCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQnVnICMxMjU0NDk0IC0gRml4IGZvciBnbG9iYWwgbmFtZXNwYWNlIHBvbGx1dGlvbiBieSBwZXJsIGhlYWRlciBmaWxlcwogICAgICAgICAgICAoYm9vbCBkZWZpbmUpIHByZXZlbnRlZCBTVEwgaGVhZGVycyBmcm9tIGJlaW5nIHVzZWQgb24gc29tZSBzeXN0ZW1zLCBlZwogICAgICAgICAgICBXaW5kb3dzIHdpdGggVmlzdWFsIFN0dWRpby4KCjA4LzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBCdWcgIzEyNDA5MzcgLSBSZWRlZmluaXRpb24gb2YgX19pbnQ2NCB0eXBlZGVmIGZvciBJbnRlbCBjb21waWxlcnMuCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBCdWcgIzEyNTE4MzIgLSAgQysrIHRlbXBsYXRlIG1heSBnZW5lcmF0ZSBpbnZhbGlkIFhNTCBmaWxlCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBTdXBwb3J0IGFkZGVkIGZvciBMdWEuIFBhdGNoICMxMjQyNzcyIGZyb20gTWFyayBHb3NzYWdlLgogICAgICAgICAgICBJdCBzdXBwb3J0cyBtb3N0IEMvQysrIGZlYXR1cmVzIChmdW5jdGlvbnMsIHN0cnVjdCwgY2xhc3NlcywgYXJyYXlzLCBwb2ludGVycywKICAgICAgICAgICAgZXhjZXB0aW9ucyksIGFzIHdlbGwgYXMgbG90cyBvZiBkb2N1bWVudGF0aW9uIGFuZCBhIGZldyB0ZXN0IGNhc2VzICYgZXhhbXBsZXMuCgowOC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBGaXggaW5jb3JyZWN0IHhtbCBlc2NhcGluZyBpbiBiYXNlIGNsYXNzIG5hbWUgd2hlbiBiYXNlIGNsYXNzIGlzIGEgdGVtcGxhdGUuCgowOC8xMy8yMDA1OiBlZnV6enlvbmUKCSAgICBbQ0xJU1BdIEFkZGVkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIGVudW1zLiBEb2VzIG5vdCBhZGRzIHRoZSByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbgoJICAgIHRvIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLCBpZiBhIGZ1bmN0aW9uIHJldHVybnMgdm9pZC4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBOZXcgbGFuZ3VhZ2UgbW9kdWxlLCBDb21tb24gTGlzcCB3aXRoIFVGRkksIGZyb20gVXR6LVV3ZSBIYXVzLgoKMDgvMDkvMjAwNTogbWtvZXBwZQoJICAgIEZpeCB0aGUgTGlzcCBzLWV4cHJlc3Npb24gb3V0cHV0IG1vZHVsZTsgaXQgbm8gbG9uZ2VyIGNvbXBsYWlucyBhYm91dCAidW5rbm93biB0YXJnZXRzIi4KCjA3LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgdG8gU1RMIHdyYXBwZXJzIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgdXNlcidzICVleGNlcHRpb24gZGlyZWN0aXZlCiAgICAgICAgICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIFNUTCB3cmFwcGVyIG1ldGhvZHMuIFByZXZpb3VzbHkgdGhlIGZvbGxvd2luZyBnbG9iYWwgJWV4Y2VwdGlvbgogICAgICAgICAgICBkaXJlY3RpdmUgd291bGQgbm90IGJlIHVzZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsgCiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgdW5jYXVnaHQgZXhjZXB0aW9ucwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGltcGxlbWVudGVkIGJ5IHJlcGxhY2luZyAlZXhjZXB0aW9uIGRpcmVjdGl2ZXMgZm9yIHNwZWNpZmljIFNUTCB3cmFwcGVyCiAgICAgICAgICAgIG1ldGhvZHMgd2l0aCBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBkZWNsYXJlZCBvbiB0aGUgd3JhcHBlciBtZXRob2RzLiB0aHJvd3MgdHlwZW1hcHMKICAgICAgICAgICAgYXJlIG5vdyBzdXBwbGllZCBmb3IgaGFuZGxpbmcgdGhlIFNUTCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gVGhlc2UgY2FuIGFsc28gYmUgZWFzaWx5CiAgICAgICAgICAgIG92ZXJyaWRkZW4sIGZvciBleGFtcGxlIHRoZSBzdGQ6Om91dF9vZl9yYW5nZSBleGNlcHRpb24sIHdoaWNoIGlzIHVzZWQgYSBsb3QgaW4gdGhlIFNUTAogICAgICAgICAgICB3cmFwcGVycywgY2FuIGJlIGN1c3RvbWlzZWQgZWFzaWx5OgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3ZlY3Rvci5pIgogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgc3RkOjpvdXRfb2ZfcmFuZ2UgewogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGV4Y2VwdGlvbiBoYW5kbGVyCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0SW50KSBzdGQ6OnZlY3RvcjxpbnQ+OwoKMDcvMjIvMjAwNTogZWZ1enp5b25lCiAgICAgICAgICAgIFtDTElTUF0gVGhlIGNsaXNwIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEl0IGNhbiBvbmx5IGhhbmRsZSBDLCBjbGlzcCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydHMgZmZpIGJpbmRpbmdzIHRvIEMrKy4KICAgICAgICAgICAgICAtIEl0IGhhcyB0d28gb3B0aW9ucywgKGEpIC1leHRlcm4tYWxsIHRoaXMgd2lsbCBnZW5lcmF0ZSB3cmFwcGVycyBmb3IgYWxsIGZ1bmN0aW9ucwogICAgICAgIAlhbmQgdmFyaWFibGVzdGlvbnMsIChiKSAtZ2VuZXJhdGUtdHlwZWRlZiB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgImRlZi1jLXR5cGUiCgkgICAgICAgIHdyYXBwZXJzIGZvciB0eXBlZGVmcwoJICAgICAgLSBDYW4gaGFuZGxlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywgY29tcGxleCB0eXBlcyBzdWNoIGFzIG4tZGltZW5zaW9uYWwgYXJyYXlzIG9mIAoJIAlwb2ludGVycyBvZiBkZXB0aCBkCgkgICAgICAtIEdlbmVyYXRlcyB3cmFwcGVycyBmb3IgY29uc3RhbnRzIGFzIHdlbGwgYXMgdmFyaWFibGVzCgkgICAgICAtIENvcnJlY3RseSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdGhlIGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcyBpbiBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMKCSAgICAgIC0gQ3JlYXRlcyBhIGRlZnBhY2thZ2UgImRlY2xhcmF0aW9uIiB3aXRoIHRoZSBtb2R1bGUgbmFtZSBhcyB0aGUgcGFja2FnZSBuYW1lLCB0aGUgY3JlYXRlZCAKCSAgICAJcGFja2FnZSBleHBvcnRzIGJvdGggZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMKCSAgICAgIC0gdHJpZXMgdG8gZ3Vlc3Mgd2hlbiBzaG91bGQgYSBwb2ludGVyIHZhcmlhYmxlIGJlIGRlY2xhcmVkIGFzIGMtcHRyIG9yIGMtcG9pbnRlcgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDaGFuZ2VzIHRvIHN1cHBvcnQgQyMgc3RydWN0cyByZXR1cm5lZCBieSB2YWx1ZS4gVGhlIGNoYW5nZXMgcmVxdWlyZWQgYXJlOgogICAgICAgICAgICAgIC0gVXNpbmcgYW4gb3B0aW9uYWwgJ251bGwnIGF0dHJpYnV0ZSBpbiB0aGUgb3V0IHR5cGVtYXAuIElmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgICAgIHRoZW4gaXQgaXMgdXNlZCBmb3IgdGhlICRudWxsIHNwZWNpYWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgogICAgICAgICAgICAgIC0gVGhlIGN0eXBlIHVzZWQgaW4gdGhlIEMvQysrIHdyYXBwZXJzIGlzIG5vIGxvbmdlciBpbml0aWFsaXNlZCB0byAwIG9uIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBCb3RoIG9mIHRoZXNlIGNoYW5nZXMgZml4IHRoZSBzaXR1YXRpb25zIHdoZXJlIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYXNzaWduIDAgdG8gdGhlCiAgICAgICAgICAgIHJldHVybmVkIHN0cnVjdC4gTWFyc2hhbGxpbmcgc3RydWN0cyBhcyB2YWx1ZSB0eXBlcyBzdGlsbCByZXF1aXJlcyB1c2VyIGRlZmluZWQgdHlwZW1hcHMuCiAgICAgICAgICAgIFNlZSBkb2N1bWVudGF0aW9uIGZvciBhbiBleGFtcGxlLgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggU1dJR19leGNlcHRpb24gdXNhZ2UgdG8gd29yayB3aXRoIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgZW1wdHkgbWFjcm8KICAgICAgICAgICAgYXJndW1lbnRzLiBVbmZvcnR1bmF0ZWx5IHRoaXMgZml4IHdpbGwgc3RvcCB1c2FnZSBvZiBTV0lHX2V4Y2VwdGlvbiBiZWluZyB1c2VkIHdpdGhpbiB0eXBlbWFwcwogICAgICAgICAgICB0aGF0IHVzZSAiIiBvciAleyAlfSBkZWxpbWl0ZXJzLCBidXQgY29udGludWVzIHRvIHdvcmsgd2l0aCB0eXBlbWFwcyB1c2luZyB7fSBkZWxpbWl0ZXJzLgogICAgICAgICAgICBQbGVhc2UgdXNlIHRoZSBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb25Bcmd1bWVudCBvciBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbiBtZXRob2RzIGluc3RlYWQKICAgICAgICAgICAgYXMgU1dJR19leGNlcHRpb24gaXMgcmVhbGx5IGludGVuZGVkIGFzIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFjcm8gZm9yIHRoZSBTV0lHIGxpYnJhcnkgd3JpdGVycy4KCjA3LzE2LzIwMDU6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gVXNlIHNwZWNpZmljIGZvcmVpZ24gdHlwZXMgcmF0aGVyIHRoYW4gKCogOnZvaWQpLiAKCSAgICBVc2UgKnN3aWctaWRlbnRpZmllci1jb252ZXJ0ZXIqLgoKMDYvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRnVuY3Rpb25zIGRlY2xhcmVkIGFzICdleHRlcm4nIG5vIGxvbmdlciBoYXZlIGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24gYWRkZWQgdG8gdGhlIAogICAgICAgICAgICB3cmFwcGVyIGZpbGVzLiBUaGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBTV0lHIGRvZXMgbm90IGdldCB0aGlzIHJpZ2h0LCBlZyBidWcgIzEyMDU4NTkgKGV4dGVybgogICAgICAgICAgICBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBkZWNsYXJlZCBpbiBhIG5hbWVzcGFjZSkuIEFsc28gU1dJRyBjYW5ub3QgZ2V0IG5vbi1zdGFuZGFyZAogICAgICAgICAgICBjYWxsaW5nIGNvbnZlbnRpb25zIGNvcnJlY3QsIGVnIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucyBhcmUgdXN1YWxseSBoYW5kbGVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVAogICAgICAgICAgICAgICNkZWZpbmUgU1REQ0FMTAogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBETExJTVBPUlQgZXh0ZXJuIFNURENBTEwgdm9pZCBmdW5jdGlvbihpbnQpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBTV0lHIGluY29ycmVjdGx5IGdlbmVyYXRlczoKCiAgICAgICAgICAgIGV4dGVybiB2b2lkIGZ1bmN0aW9uKGludCk7CgogICAgICAgICAgICBUbyB3aGljaCB0aGVyZSBpcyBubyBzb2x1dGlvbiBhcyBTV0lHIGRvZXNuJ3QgaGFuZGxlIG5vbi1zdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb25zLiBUaGUgZXh0cmEKICAgICAgICAgICAgJ2V4dGVybicgZnVuY3Rpb24gdGhhdCBTV0lHIGdlbmVyYXRlcyBpcyBzdXBlcmZsdW91cyB1bmxlc3MgYSB1c2VyIGhhcyBmb3Jnb3R0ZW4gdG8gYWRkIHRoZSBmdW5jdGlvbgogICAgICAgICAgICBkZWNsYXJhdGlvbiBpbnRvIHRoZSB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZSAtbm9leHRlcm4gY29tbWFuZGxpbmUgYXJndW1lbnQgaXMgbm93IHJlZHVuZGFudCBhbmQgYSBuZXcgY29tbWFuZGxpbmUgYXJndW1lbnQgLWFkZGV4dGVybiBjYW4KICAgICAgICAgICAgYmUgdXNlZCB0byBvYnRhaW4gdGhlIG9yaWdpbmFsIGJlaGF2aW91ci4gVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHVubGVzcyB0aGUgaGVhZGVyIGZpbGUKICAgICAgICAgICAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gd2FzIGluYWR2ZXJ0ZW50bHkgbm90IGFkZGVkIHRvIHRoZSB3cmFwcGVycy4gVG8gZml4IHRoaXMKICAgICAgICAgICAgYWRkIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvIHlvdXIgd3JhcHBlcnMsIEZvciBleGFtcGxlLCByZXBsYWNlOgoKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKCiAgICAgICAgICAgIHdpdGg6CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNi8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmEsIE1vZHVsYTMsIE9jYW1sXQogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXJ5IGZ1bmN0aW9uIG5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHdoZW4gd3JhcHBpbmcgdmFyaWFibGVzIHRvCiAgICAgICAgICAgIG1hdGNoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzIHNvIHRoYXQgJWV4dGVuZCBmb3IgYSBtZW1iZXIgdmFyaWFibGUgd29ya3MKICAgICAgICAgICAgdW5pZm9ybWx5IGFjcm9zcyBhbGwgbGFuZ3VhZ2UgbW9kdWxlcywgZWc6CgogICAgICAgICAgICAgICVleHRlbmQgRXh0ZW5kTWUgewogICAgICAgICAgICAgICAgVmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIEV4dGVuZE1lX1Zhcl9zZXQoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIEV4dGVuZE1lX1Zhcl9nZXQoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1ldGhvZHMgaW1wbGVtZW50aW5nIHRoZSBnZXQvc2V0IHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIGdldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhpcyBhbHNvIGNoYW5nZXMgdGhlIG5hbWUgb2YgdmFyaWFibGUgd3JhcHBlciBmdW5jdGlvbnMgd2hlbiB1c2luZyAtbm9wcm94eS4KICAgICAgICAgICAgVGhlIG9yaWdpbmFsIG5hbWVzIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUgLW9sZHZhcm5hbWVzIGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKVmVyc2lvbiAxLjMuMjUgKEp1bmUgMTEsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMTEvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGhhbmRsaW5nIG9mIGFub255bW91cy1lbnVtIHZhcmlhYmxlcy4KCjA2LzEwLzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCBieQoJICAgIGNvcHktb2YtdmFsdWUuICBGaXggZm9yIGdsb2JhbCAiY29uc3QgY2hhciAqIiB2YXJpYWJsZXMuCgkgICAgRml4IHRlc3RjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcywgYXJyYXlzX2dsb2JhbC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3Igd2hlbiBhIGJhc2UgY2xhc3MgZGVmaW5lcyBhIHN5bWJvbCBhcyBhIG1lbWJlciB2YXJpYWJsZSBhbmQgYSBkZXJpdmVkIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgdGhlIHNhbWUgc3ltYm9sIGFzIGEgbWVtYmVyIG1ldGhvZC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIC0gd2hlbiBhIG1ldGhvZCBoYXMgcHJvdGVjdGVkIGFjY2VzcyAKICAgICAgICAgICAgaW4gYmFzZSBhbmQgcHVibGljIGFjY2VzcyBpbiBkZXJpdmVkIGNsYXNzLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDY2MzYzIC0gRm9sbG93IGNvbnZlbnRpb24gb2YgcmVsZWFzZSB0YXJiYWxsIG5hbWUgbWF0Y2hpbmcgZGlyZWN0b3J5IG5hbWUuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCAjMTIxMTM1MyAtIHR5cGVzYWZlIGVudW1zIChhbmQgSmF2YSBwcm9wZXIgZW51bXMpIHdyYXBwZXJzIHdoZW4gZW51bSB2YWx1ZQogICAgICAgICAgICBpcyBuZWdhdGl2ZS4KCjA1LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGVybmlzZWQgYW5kIHRpZGllZCB1cCBXaW5kb3dzIG1hY3JvcyAtLT4gU1dJR0VYUE9SVCwgU1dJR1NURENBTEwuIFRoZXkgY2FuIGJlIG92ZXJyaWRkZW4KICAgICAgICAgICAgYnkgdXNlcnMgdmlhIC1EIGNvbXBpbGVyIGRpcmVjdGl2ZXMgaWYgbmVlZCBiZS4KCjA1LzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICVjc21ldGhvZG1vZGlmaWVycyBjYW4gYmUgYXBwbGllZCB0byB2YXJpYWJsZXMgYXMgd2VsbCBhcyBtZXRob2RzIG5vdy4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0ICdwdWJsaWMnIG1vZGlmaWVyIHRoYXQgU1dJRyBnZW5lcmF0ZXMsICVjc21ldGhvZG1vZGlmaWVycyB3aWxsIGFsc28KICAgICAgICAgICAgcmVwbGFjZSB0aGUgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIHRoYXQgU1dJRyB0aGlua3MgaXMgYXBwcm9wcmlhdGUuIFRoaXMgZmVhdHVyZSBpcwogICAgICAgICAgICB1c2VmdWwgZm9yIHNvbWUgb2JzY3VyZSBjYXNlcyB3aGVyZSBTV0lHIG1pZ2h0IGdldCB0aGUgbW9kaWZpZXJzIGluY29ycmVjdCwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZSBhbmQgb3ZlcnJpZGluZyBhIG1ldGhvZCBpbiB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGNvbnN0cnVjdG9ycyB0byBzdGQ6OnBhaXIgd3JhcHBlcnMgKHN0ZF9wYWlyLmkpIGZvciBhbGwgbGFuZ3VhZ2VzLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBzdGQ6OnBhaXIgd3JhcHBlcnMgaW4gc3RkX3BhaXIuaQoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgQyMgJ25ldycgYW5kICdvdmVycmlkZScgbW9kaWZpZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gYSBDKysgY2xhc3MgaW5oZXJpdHMgbWV0aG9kcwogICAgICAgICAgICB2aWEgYSBDKysgJ3VzaW5nJyBkZWNsYXJhdGlvbi4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHByZXZpb3VzbHkgYmVpbmcgaWdub3JlZCBpbiBjbGFzc2VzIHRoYXQgaW5oZXJpdGVkIG1ldGhvZHMKICAgICAgICAgICAgZnJvbSAndXNpbmcnIGRlY2xhcmF0aW9ucywgZWcgY2FsbHMgdG8gRGVyaXZlZDo6YmFyIGJlbG93IHdpbGwgY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvCiAgICAgICAgICAgIGEgdGFyZ2V0IGxhbmd1YWdlIGV4Y2VwdGlvbi9lcnJvciwgbGlrZSBpdCBhbHdheXMgaGFzIGRvbmUgZm9yIEJhc2U6OkJhci4KCiAgICAgICAgICAgIGNsYXNzIEJhc2UgewogICAgICAgICAgICAgIHZpcnR1YWwgYmFyKCkgdGhyb3cgKHN0ZDo6c3RyaW5nKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKICAgICAgICAgICAgICB1c2luZyBCYXNlOjpiYXI7CiAgICAgICAgICAgIH07CgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGV0ZWN0aW5nIHZpcnR1YWwgbWV0aG9kcyBpbiAlZXh0ZW5kIGZvciB0aGUgLWZ2aXJ0dWFsIG9wdGlvbiBhbmQgQyMgb3ZlcnJpZGUgYW5kIG5ldwogICAgICAgICAgICBtZXRob2QgbW9kaWZpZXJzLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgJ25ldycgbW9kaWZpZXIgaXMgbm93IGdlbmVyYXRlZCBvbiB0aGUgcHJveHkgbWV0aG9kIHdoZW4gYSBtZXRob2QgaW4gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGlzIG5vdCBwb2x5bW9ycGhpYyBhbmQgdGhlIHNhbWUgbWV0aG9kIGV4aXN0cyBpbiB0aGUgZGVyaXZlZCBjbGFzcyAoaWUgaXQgaGlkZXMKICAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MnIG5vbi12aXJ0dWFsIG1ldGhvZCkuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeGVzIHRvIGRldGVjdGlvbiBvZiBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzIC0gd2hlbiB0aGUgY2xhc3MgaGllcmFyY2h5IGlzIG1vcmUKICAgICAgICAgICAgdGhhbiAyIGNsYXNzZXMgZGVlcC4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcHMgbW92ZWQgZnJvbSBzdGRfc3RyaW5nLmkgdG8gc3RkX3dzdHJpbmcuaQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBjcmFzaCBpbiBEb2hTdHJzdHIsIGJ1ZyAjMTE5MDkyMQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gRml4IGZvciBtZXRob2RzIHdpdGggc2ltaWxhciBuYW1lcyB3aGVuIHNob3dpbmcgbGlzdCBvZiBuYW1lcyBvbiBlcnJvciAtIGJ1ZyAjMTE5MTgyOC4KICAgICAgICAgICAgUGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIGxvbmcgbG9uZyBvdmVybG9hZGluZyBmaXggLSBidWcgIzExOTE4MzUsIHBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxMTk2NzU1IHRvIHJlbW92ZSBkZWJ1ZyBmcm9tIHN3aWd0Y2w4LnN3Zy4KCjA1LzE5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBhbmQgLWZ2aXJ0dWFsIG9wdGlvbl0gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIGRlcml2ZWQgY2xhc3Mgd2hlbiBhCiAgICAgICAgICAgIHZpcnR1YWwgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgd2FzIGEgdHlwZWRlZiBpbiBlaXRoZXIgdGhlIGJhc2Ugb3IgZGVyaXZlZCBjbGFzcy4gQWxzbyBlbnN1cmVzIHRoZQogICAgICAgICAgICBtZXRob2QgaXMgZWxpbWluYXRlZCB3aGVuIHVzaW5nIHRoZSAtZnZpcnR1YWwgb3B0aW9uLiBGb3IgZXhhbXBsZSwgRGVyaXZlZC5tZXRob2Qgbm93IGhhcyB0aGUgQyMKICAgICAgICAgICAgb3ZlcnJpZGUga2V5d29yZCBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50KiBJbnRlZ2VyUHRyOwoKICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEludGVnZXJQdHIgbWV0aG9kKCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIGludCAqIG1ldGhvZCgpIGNvbnN0OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBbQyNdIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBiZWluZyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIHZpcnR1YWwgbWV0aG9kcyB3aGVuIGEgYmFzZSBjbGFzcwogICAgICAgICAgICBpcyBpZ25vcmVkIHdpdGggJWlnbm9yZS4KCjA1LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byByZW1vdmUgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZ3MgaW4gQyB3cmFwcGVycyB3aGVuIGNvbXBpbGluZyBDIGNvZGUgd2l0aCAnZ2NjIC1XYWxsIC1mc3RyaWN0LWFsaWFzaW5nJy4gUGF0Y2ggZnJvbQogICAgICAgICAgICBNaWNoYWVsIENhaGlsbC4gVGhpcyBtb2RpZmllcyBtYW55IG9mIHRoZSBjYXN0cyBzbGlnaHRseSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopJmphcmcxOwogICAgICAgICAgICB0bwogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikodm9pZCAqKSZqYXJnMTsKCjA1LzEyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgQyMgYXR0cmlidXRlcy4gQyMgYXR0cmlidXRlcyBjYW4gYmUgZ2VuZXJhdGVkOgogICAgICAgICAgICAxKSBPbiBhIEMvQysrIHR5cGUgYmFzaXMgYnkgc3BlY2lmeWluZyBhbiBpbmF0dHJpYnV0ZXMgYW5kL29yIG91dGF0dHJpYnV0ZXMgdHlwZW1hcCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgaW4gdGhlIGltdHlwZSBvciBjc3R5cGUgdHlwZW1hcHMgKGZvciBDIyByZXR1cm4gdHlwZSBvciBDIyBwYXJhbWV0ZXIgdHlwZSBhdHRyaWJ1dGVzKS4KICAgICAgICAgICAgMikgT24gYSB3cmFwcGVkIG1ldGhvZCBvciB2YXJpYWJsZSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIGZlYXR1cmUgKCVmZWF0dXJlKS4KICAgICAgICAgICAgMykgT24gYSB3cmFwcGVkIHByb3h5IGNsYXNzIG9yIGVudW0gYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyB0eXBlbWFwLgoKICAgICAgICAgICAgRXhhbXBsZXMgYXJlIGluIHRoZSBDIyBkb2N1bWVudGF0aW9uIChDU2hhcnAuaHRtbCkuCgowNC8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgY29uZmlndXJlIG9wdGlvbiB0byB0dXJuIG9mZiB0aGUgZGVmYXVsdCBtYXhpbXVtIGNvbXBpbGVyIHdhcm5pbmcgYXMKICAgICAgICAgICAgdGhleSBjb3VsZG4ndCBiZSByZW1vdmVkIGV2ZW4gd2hlbiBvdmVycmlkaW5nIENGTEFHUyBhbmQgQ1hYRkxBR1Mgd2l0aCBjb25maWd1cmUKICAgICAgICAgICAgKC4vY29uZmlndXJlIENGTEFHUz0gQ1hYRkxBR1M9KS4gVG8gdHVybiB0aGUgbWF4aW11bSB3YXJuaW5ncyBvZmYsIHJ1bjogIAoKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtbWF4aW11bS1jb21waWxlLXdhcm5pbmdzCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB3aGljaCByZXdvcmtzIHRoZSBKYXZhIGNvbnN0cnVjdG9yIGFuZCBmaW5hbGl6ZS9kZXN0cnVjdG9yIHR5cGVtYXBzLAogICAgICAgICAgICBmb3IgZGlyZWN0b3JzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG92ZXJhbGwgSmF2YSB0eXBlbWFwcy4gQWRkZWQgdGhlIGRpcmVjdG9yX3Rha2UgYW5kIAogICAgICAgICAgICBkaXJlY3Rvcl9yZWxlYXNlIHR5cGVtYXBzIHRvIGVtdWxhdGUgb3RoZXIgbW9kdWxlcycgX19kaXNvd25fXyBmdW5jdGlvbmFsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXhlZCBwcm9ibGVtcyBkdWUgdG8gdGhlIG92ZXIgZWFnZXIgZ2FyYmFnZSBjb2xsZWN0b3IuIE9jY2FzaW9uYWxseSB0aGUKICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd291bGQgY29sbGVjdCBhIEMjIHByb3h5IGNsYXNzIGluc3RhbmNlIHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkCiAgICAgICAgICAgIGluIHVubWFuYWdlZCBjb2RlIGlmIHRoZSBvYmplY3Qgd2FzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byBhIHdyYXBwZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSB0aGlzIGNhdXNlZCBoYXZvYyBhcyB0aGUgQyMgcHJveHkgY2xhc3MgY2FsbHMgdGhlIEMrKyBkZXN0cnVjdG9yCiAgICAgICAgICAgIHdoZW4gaXQgaXMgY29sbGVjdGVkLiBQcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcyBub3cgdXNlIGEgSGFuZGxlUmVmLAogICAgICAgICAgICB3aGljaCBob2xkcyBhbiBJbnRQdHIsIGluc3RlYWQgb2YgYSBwbGFpbiBJbnRQdHIgdG8gbWFyc2hhbCB0aGUgQysrIHBvaW50ZXIgdG8gdW5tYW5hZ2VkCiAgICAgICAgICAgIGNvZGUuIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBhcyBhIHJlc3VsdCBvZiB0aGlzCiAgICAgICAgICAgIG1vZGlmaWNhdGlvbi4KCiAgICAgICAgICAgIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgc3dpZ0NQdHIgaXMgbm93IG9mIHR5cGUgSGFuZGxlUmVmCiAgICAgICAgICAgIGluc3RlYWQgb2YgSW50UHRyIGFuZCBjb25zZXF1ZW50bHkgdGhlIGdldENQdHIgbWV0aG9kIHJldHVybiB0eXBlIGhhcyBhbHNvIGNoYW5nZWQuIFRoZSBuZXQKICAgICAgICAgICAgZWZmZWN0IGlzIHRoYXQgYW55IGN1c3RvbSB3cml0dGVuIHR5cGVtYXBzIG1pZ2h0IGhhdmUgdG8gYmUgbW9kaWZpZWQgdG8gc3VpdGUuIEFmZmVjdGVkIHVzZXJzCiAgICAgICAgICAgIHNob3VsZCBub3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIG5ldyAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGltdHlwZSB0eXBlbWFwIGFzIHRoZQogICAgICAgICAgICBpbnB1dCB0eXBlIGlzIG5vdyBhIEhhbmRsZVJlZiBhbmQgdGhlIG91dHB1dCB0eXBlIGlzIHN0aWxsIGFuIEludFB0ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIGFzeW1tZXRyaWMgdHlwZSBtYXJzaGFsbGluZyBhZGRlZC4gU29tZXRpbWVzIHRoZSBvdXRwdXQgdHlwZSBuZWVkcyB0byBiZQogICAgICAgICAgICBkaWZmZXJlbnQgdG8gdGhlIGlucHV0IHR5cGUuIFN1cHBvcnQgZm9yIHRoaXMgY29tZXMgaW4gdGhlIGZvcm0gb2YgYSBuZXcgb3B0aW9uYWwgJ291dCcKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgY3R5cGUsIGltdHlwZSBhbmQgY3N0eXBlIHR5cGVtYXBzLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIG5vdAogICAgICAgICAgICBzcGVjaWZpZWQsIHRoZW4gdGhlIHR5cGUgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGlzIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICAgICAgdHlwZW1hcCwgYXMgaGFzIGFsd2F5cyBwcmV2aW91c2x5IGJlZW4gdGhlIGNhc2UuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICB0aGVuIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIG91dHB1dCB0eXBlcyBhbmQgdGhlIHR5cGUgc3BlY2lmaWVkCiAgICAgICAgICAgIGluIHRoZSB0eXBlbWFwIGl0c2VsZiBpcyB1c2VkIGZvciB0aGUgaW5wdXQgdHlwZS4gQW4gb3V0cHV0IHR5cGUgaXMgYSByZXR1cm4gdmFsdWUgZnJvbQogICAgICAgICAgICBhIHdyYXBwZWQgbWV0aG9kIG9yIHdyYXBwZWQgY29uc3RhbnQgYW5kIGFuIGlucHV0IHR5cGUgaXMgYSBwYXJhbWV0ZXIgaW4gYSB3cmFwcGVkIG1ldGhvZC4KCiAgICAgICAgICAgIEFuIGV4YW1wbGUgc2hvd3MgdGhhdCBjaGFyICogY291bGQgYmUgbWFyc2hhbGxlZCBpbiBkaWZmZXJlbnQgd2F5cywgCgogICAgICAgICAgICAgICV0eXBlbWFwKGltdHlwZSwgb3V0PSJJbnRQdHIiKSBjaGFyICogInN0cmluZyIKICAgICAgICAgICAgICBjaGFyICogZnVuY3Rpb24oY2hhciAqKTsKCiAgICAgICAgICAgIFRoZSBvdXRwdXQgdHlwZSBpcyB0aHVzIEludFB0ciBhbmQgdGhlIGlucHV0IHR5cGUgaXMgc3RyaW5nLiBUaGUgcmVzdWx0aW5nIGludGVybWVkaWFyeSBDIyBjb2RlIGlzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgZnVuY3Rpb24oc3RyaW5nIGphcmcxKTsKCjA0LzIyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBnZW5lcmF0aW9uIG9mICJkZWZpbmUtbWV0aG9kIiBmb3IgbWV0aG9kcyBvZgoJICAgIGNsYXNzZXMgd2l0aCBhIGNvbnN0cnVjdG9yLiAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgowNC8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBGb3Igd3JhcHBlZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gbXVsdGlwbGUgdmFsdWVzICh1c2luZyBhcmdvdXQpLAoJICAgIFNXSUcgQ0hJQ0tFTiBub3cgcmV0dXJucyB0aGVtIGFzIG11bHRpcGxlIHZhbHVlcyBpbnN0ZWFkIG9mIGFzCgkgICAgYSBsaXN0LiAgVGhleSBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB1c2luZyAoY2FsbC13aXRoLXZhbHVlcykuCgowNC8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dCiAgICAgICAgICAgICsgQWRkZWQgYSB3aG9sZSBidW5jaCBvZiBuZXcgX3J1bm1lIHNjcmlwdHMgaW50byB0aGUgY2hpY2tlbiB0ZXN0CiAgICAgICAgICAgIHN1aXRlLiAgQWxzbyBmaXggc29tZSBidWdzIHRoZXNlIG5ldyBzY3JpcHRzIHR1cm5lZCB1cC4KCiAgICAgICAgICAgICsgQWRkZWQgb3B0aW1pemF0aW9uIHdoZW4gcmV0dXJuaW5nIGEgd3JhcHBlZCBwcm94eSBjbGFzcy4gIEJlZm9yZSwKICAgICAgICAgICAgYSBtaW5vciBnYXJiYWdlIGNvbGxlY3Rpb24gd2FzIGludm9rZWQgZXZlcnkgdGltZSBhIGZ1bmN0aW9uIHJldHVybmVkLgoKCSAgICArIEFsbCB0aGUgY2hpY2tlbiBFeGFtcGxlcyBzaG91bGQgbm93IHJ1biBjb3JyZWN0bHkKCjA0LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdHlwZW1hcCBtYXRjaGluZyB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgaW4gcGFydGljdWxhcgogICAgICAgICAgICBzdGQ6OnN0cmluZywgc28gdGhhdCBzdGQ6OnN0cmluZyB2YXJpYWJsZXMgY2FuIGJlIGVhc2lseSBtYXJzaGFsbGVkIHdpdGgKICAgICAgICAgICAgYSBDIyBzdHJpbmcgcHJvcGVydHkgdXNpbmc6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfc3RyaW5nLmkiCiAgICAgICAgICAgICAgJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqdmFyaWFibGVfbmFtZSB9OwogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhcmlhYmxlX25hbWU7CgogICAgICAgICAgICAoUmVjYWxsIHRoYXQgYWxsIGNsYXNzIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwb2ludGVycykKCjA0LzA1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgQWRkZWQgRXhhbXBsZXMvY2hpY2tlbi9lZ2csIGFuIGV4YW1wbGUgb24gaG93IHRvIGJ1aWxkIGEgY2hpY2tlbgoJICAgICAgZXh0ZW5zaW9uIGxpYnJhcnkgaW4gdGhlIGZvcm0gb2YgYW4gZWdnLiAgQWxzbyB1cGRhdGVkIHRoZQoJICAgICAgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZGlmZmVyZW50IGxpbmtpbmcgb3B0aW9ucy4KCgkgICAgKyBjaGlja2VuIHRlc3Qtc3VpdGUgbm93IGhhcyBzdXBwb3J0IHRvIGNoZWNrIFNXSUcgd2l0aCB0aGUgLXByb3h5CgkgICAgICBhcmd1bWVudCBpZiB0aGVyZSBleGlzdHMgYSBfcHJveHlfcnVubWUuc3MgZmlsZS4KCgkgICAgKyBNb3JlIGZpeGVzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgLXByb3h5CgowMy8zMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBUdXJuZWQgb24gZXh0cmEgdGVtcGxhdGUgZmVhdHVyZXMgZm9yIGFsbCBsYW5ndWFnZXMgd2hpY2ggd2VyZQogICAgICAgICAgICBwcmV2aW91c2x5IG9ubHkgYXZhaWxhYmxlIHRvIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgZW5hYmxlcyB0eXBlbWFwcyBkZWZpbmVkIHdpdGhpbiBhIHRlbXBsYXRlZCBjbGFzcyB0byBiZSB1c2VkIGFzCiAgICAgICAgICAgIGV4cGVjdGVkLiBSZXF1aXJlcyAldGVtcGxhdGUgb24gdGhlIHRlbXBsYXRlZCBjbGFzcywgJXRlbXBsYXRlKCkgd2lsbAogICAgICAgICAgICBhbHNvIHBpY2sgdXAgdGhlIHR5cGVtYXBzLiBFeGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgICBvcgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxUPiAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIAogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29faSkgRm9vPGludD47CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgRm9vPGRvdWJsZT47CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgdGhlIHByb3BlciAnaW4nIHR5cGVtYXBzIHdoZXJldmVyIEZvbzxpbnQ+IGFuZCBGb288ZG91YmxlPgogICAgICAgICAgICBhcmUgdXNlZC4KCjAzLzMwLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFBhdGNoIGZyb20gSGFucyBPZXN0ZXJob2x0IGZvciBzdXBwb3J0aW5nIE16U2NoZW1lIDMweC4KCjAzLzI5LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgUmVhbGxvdyBvbGRlciB2ZXJzaW9ucyBvZiBjaGlja2VuICgxLjQwIHRvIDEuODkpIGJ5IHBhc3NpbmcgLW5vY29sbGVjdGlvbgoJICAgICAgYXJndW1lbnQgdG8gU1dJRwoJICAgICsgJWltcG9ydCBub3cgd29ya3MgY29ycmVjdGx5IHdpdGggdGlueWNsb3MuICAoZGVjbGFyZSAodXNlcyAuLi4pKSB3aWxsIGJlCgkgICAgICBleHBvcnRlZCBjb3JyZWN0bHkuCgkgICAgKyBUaW55Q0xPUyBwcm94eSBjbGFzc2VzIG5vdyB3b3JrIGNvcnJlY3RseSB3aXRoIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgICBhbmQgY29uc3RydWN0b3JzLgoKMDMvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3Rvcm91dCB0eXBlbWFwcy4gSmF2YSBkaXJlY3RvcnMKICAgICAgICAgICAgcmVxdWlyZSB0aGUgZGlyZWN0b3JvdXQgdHlwZW1hcHMgbGlrZSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIG5vdy4gVGhlIG5ldwogICAgICAgICAgICB0eXBlbWFwcyBwcm92aWRlIGZpeGVzIGZvciBtZXRob2RzIHdoZXJlIHRoZSByZXR1cm4gdHlwZSBpcyByZXR1cm5lZAogICAgICAgICAgICBieSByZWZlcmVuY2UgKHRoaXMgY2Fubm90IGF1dG9tYXRpY2FsbHkgYmUgbWFkZSB0aHJlYWQgc2FmZSB0aG91Z2gpLgoKMDMvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRW51bSBjYXN0aW5nIGZpeGVzLiBWaXN1YWwgQysrIGRpZG4ndCBsaWtlIHRoZSBDIHR5cGUgY2FzdGluZyBTV0lHIHByb2R1Y2VkCiAgICAgICAgICAgIHdoZW4gd3JhcHBpbmcgQysrIGVudW0gcmVmZXJlbmNlcywgYXMgcmVwb3J0ZWQgYnkgQWRtaXJlIEthbmRhd2FzdmlrYS4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBTRiAjMTEyNDQ5MC4gRml4IFBlcmwgbWFjcm8gY2xhc2hlcyB3aGVuIHVzaW5nIFZpc3VhbCBTdHVkaW8ncyBTVEwgc3RyaW5nLAogICAgICAgICAgICBzbyBub3cgcHJvamVjdHMgY2FuICNpbmNsdWRlIDxzdHJpbmc+LgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXZhcmFyZ3Mgd2hpY2ggZ290IGJyb2tlbiB3aXRoIHRoZSByZWNlbnQgZGVmYXVsdCBhcmd1bWVudCBjaGFuZ2VzLgogICAgICAgICAgICBBbHNvIHdvcmtzIGZvciBKYXZhIGFuZCBDIyBmb3IgdGhlIGZpcnN0IHRpbWUgbm93LgoKMDMvMTcvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICArIEZpeCBhIHdob2xlIGJ1bmNoIG9mIGJ1Z3MgaW4gdGhlIGNoaWNrZW4gbW9kdWxlLiAgVGhlIGVudGlyZQogICAgICAgICAgICAgIHRlc3Qgc3VpdGUgbm93IGNvbXBpbGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHRlc3RzIHRoYXQgcmVxdWlyZQoJICAgICAgc3RkX3ZlY3Rvci5pLCBzdGRfZGVxdWUuaSwgYW5kIHNvIG9uLCB3aGljaCBjaGlja2VuIGRvZXMgbm90IGhhdmUgeWV0LgoKCSAgICArIEFkZCBzdXBwb3J0IGZvciAlZXhjZXB0aW9uIGFuZCAldHlwZW1hcChleGNlcHRpb25zKS4gIEV4Y2VwdGlvbnMgYXJlCgkgICAgICB0aHJvd24gd2l0aCBhIGNhbGwgdG8gKGFib3J0KSBhbmQgY2FuIGJlIGhhbmRsZWQgYnkgKGhhbmRsZS1leGNlcHRpb25zKQoKMDMvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3RvcnMuIE1vZGlmaWNhdGlvbnMgdG8gdGhlIHR5cGVtYXBzCiAgICAgICAgICAgIGdpdmluZyB1c2VycyBmaW5lIGNvbnRyb2wgb3ZlciBtZW1vcnkgb3duZXJzaGlwIGFuZCBsaWZldGltZSBvZiBkaXJlY3RvciBjbGFzc2VzLgogICAgICAgICAgICBEaXJlY3RvciBjbGFzc2VzIG5vIGxvbmdlciBsaXZlIGZvcmV2ZXIgYnkgZGVmYXVsdCBhcyB0aGV5IGFyZSBub3cgY29sbGVjdGFibGUKICAgICAgICAgICAgYnkgdGhlIEdDLgoKMDMvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEFkZCBzdXBwb3J0IGZvciBhZGRpbmcgZmluYWxpemVycyBnYXJiYWdlIGNvbGxlY3RlZCBvYmplY3RzLgoJICAgIEZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgb2JqZWN0cyBzaG91bGQgYmUgbWFya2VkIHdpdGggJW5ld29iamVjdCBhbmQKCSAgICBpbnB1dCBhcmd1bWVudHMgd2hpY2ggY29uc3VtZSAob3IgdGFrZSBvd25lcnNoaXApIG9mIGEgcG9pbnRlciBzaG91bGQKCSAgICBiZSBtYXJrZWQgd2l0aCB0aGUgRElTT1dOIHR5cGVtYXAuCgoJICAgIEFsc28gYWRkIHN1cHBvcnQgZm9yIGNvcnJlY3RseSBjaGVja2luZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQKCSAgICB0byBhIGZ1bmN0aW9uLCBhbmQgcmFpc2luZyBhbiBlcnJvciBpZiB0aGUgd3JvbmcgbnVtYmVyIGFyZSBwYXNzZWQuCgowMy8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgQWRkIC0td2l0aG91dC1hbGxsYW5nIG9wdGlvbiB0byBjb25maWd1cmUuaW4sIHdoaWNoIGlzIHRoZSBzYW1lIGFzCiAgICAgICAgICAgIHBhc3NpbmcgYWxsIHRoZSAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1wZXJsNSBldGMuLi4gdGhhdCBNYXR0aGlhcyBhZGRlZC4KCjAzLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIE1lbW9yeSBsZWFrIGZpeCBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBjbGFzc2VzL3N0cnVjdHMgYnkgdmFsdWUuCgowMy8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGZvciBQZXJsIGluY29ycmVjdGx5IHRha2luZyBtZW1vcnkgb3duZXJzaGlwIGZvciByZXR1cm4gdHlwZXMgdGhhdAogICAgICAgICAgICBhcmUgdHlwZWRlZnMgdG8gYSBzdHJ1Y3QvY2xhc3MgcG9pbnRlci4gUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFZhcmlvdXMgZXhjZXB0aW9uIGNoYW5nZXMgZm9yIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlc2Ugbm93IG1vcmUKICAgICAgICAgICAgYWNjdXJhdGVseSBtaXJyb3IgdGhlIHNhbWUgZXhjZXB0aW9ucyB0aGF0IFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QgdGhyb3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGFmdGVyIGFueSBvZiB0aGUgc3RkOjp2ZWN0b3IgbWV0aG9kcwogICAgICAgICAgICB0aHJvdyBhbiBleGNlcHRpb24uCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFdoZW4gbnVsbCBpcyBwYXNzZWQgZm9yIGEgQysrIHJlZmVyZW5jZSBvciB2YWx1ZSBwYXJhbWV0ZXIsIHRoZSAKICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93biBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gYW4gQXJndW1lbnROdWxsRXhjZXB0aW9uIGluc3RlYWQKICAgICAgICAgICAgb2YgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiBhcyByZWNvbW1lbmRlZCBpbiB0aGUgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyB0dXJuIGEgQysrIGV4Y2VwdGlvbiBpbnRvIGFuIEFwcGxpY2F0aW9uRXhjZXB0aW9uLAogICAgICAgICAgICBub3QgYSBTeXN0ZW1FeGNlcHRpb24gbm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOdW1lcm91cyBjaGFuZ2VzIGluIEMjIGV4Y2VwdGlvbiBoYW5kbGluZyBoYXZlIGJlZW4gbWFkZSBvdmVyIHRoZSBwYXN0CiAgICAgICAgICAgIGZldyB3ZWVrcy4gQSBzdW1tYXJ5IGZvbGxvd3M6CgogICAgICAgICAgICBUaGUgd2F5IGluIHdoaWNoIEMrKyBleGNlcHRpb25zIGFyZSBtYXBwZWQgdG8gQyMgZXhjZXB0aW9ucyBpcyBxdWl0ZSBkaWZmZXJlbnQuCiAgICAgICAgICAgIFRoZSBjaGFuZ2UgaXMgdG8gZml4IEMjIGV4Y2VwdGlvbnMgc28gdGhhdCB0aGUgQysrIGV4Y2VwdGlvbiBzdGFjayBpcyBjb3JyZWN0bHkKICAgICAgICAgICAgdW53b3VuZCBhcyBwcmV2aW91c2x5IEMrKyBleGNlcHRpb25zIHdlcmUgYmVpbmcgdGhyb3duIGFjcm9zcyB0aGUgQyBQSW52b2tlIGxheWVyCiAgICAgICAgICAgIGludG8gdGhlIG1hbmFnZWQgd29ybGQuCgogICAgICAgICAgICBOZXcgdHlwZW1hcCBhdHRyaWJ1dGVzIChjYW50aHJvdyBhbmQgZXhjb2RlKSBoYXZlIGJlZW4gaW50cm9kdWNlZCB0byBjb250cm9sIHRoZQogICAgICAgICAgICBtYXBwaW5nIG9mIEMrKyB0byBDIyBleGNlcHRpb25zLiBFc3NlbnRpYWxseSBhIGNhbGxiYWNrIGludG8gdGhlIHVubWFuYWdlZCB3b3JsZAogICAgICAgICAgICBpcyBtYWRlIHRvIHNldCBhIHBlbmRpbmcgZXhjZXB0aW9uLiBUaGUgZXhjZXB0aW9uIHRvIHRocm93IGlzIHN0b3JlZCBpbiB0aHJlYWQgbG9jYWwKICAgICAgICAgICAgc3RvcmFnZSAoc28gdGhlIGFwcHJvYWNoIGlzIHRocmVhZC1zYWZlKS4gVGhlIHR5cGVtYXBzIGFyZSBleHBlY3RlZCB0byByZXR1cm4KICAgICAgICAgICAgZnJvbSB1bm1hbmFnZWQgY29kZSBhcyBzb29uIGFzIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBpcyBzZXQuIEFueSBwZW5kaW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgYXJlIGNoZWNrZWQgZm9yIGFuZCB0aHJvd24gb25jZSBtYW5hZ2VkIGNvZGUgc3RhcnRzIGV4ZWN1dGluZy4gVGhlcmUgc2hvdWxkCiAgICAgICAgICAgIGJlIG1pbmltYWwgaW1wYWN0IG9uIGV4ZWN1dGlvbiBzcGVlZCBkdXJpbmcgbm9ybWFsIGJlaGF2aW91ci4gRnVsbCBkZXRhaWxzIHdpbGwgYmUKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiBDU2hhcnAuaHRtbC4KCiAgICAgICAgICAgIFRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKCkgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUKICAgICAgICAgICAgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQoKSBhbmQgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uKCkKICAgICAgICAgICAgZnVuY3Rpb25zLiBUaGUgb3JpZ2luYWwgbmFtZSBoYXMgYmVlbiBkZWxpYmVyYXRlbHkgY2hhbmdlZCB0byBicmVhayBvbGQgY29kZSBhcwogICAgICAgICAgICB0aGUgb2xkIGFwcHJvYWNoIHdhcyBzb21ld2hhdCBmbGF3ZWQuIEFueSB1c2VyIGRlZmluZWQgZXhjZXB0aW9ucyB0aGF0IGZvbGxvdyB0aGUKICAgICAgICAgICAgc2FtZSBwYXR0ZXJuIGFzIHRoZSBvbGQgYXBwcm9hY2ggc2hvdWxkIGFsc28gYmUgZml4ZWQuCgogICAgICAgICAgICBOdW1lcm91cyBuZXcgLk5FVCBmcmFtZXdvcmsgZXhjZXB0aW9ucyBhcmUgbm93IGF2YWlsYWJsZSBmb3IgZWFzeSB0aHJvd2luZyBmcm9tIAogICAgICAgICAgICB1bm1hbmFnZWQgY29kZS4gVGhlIGNvbXBsZXRlIGxpc3QgaXM6IAoKICAgICAgICAgICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgQXJpdGhtZXRpY0V4Y2VwdGlvbiwgRGl2aWRlQnlaZXJvRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLCBPdXRPZk1lbW9yeUV4Y2VwdGlvbiwgT3ZlcmZsb3dFeGNlcHRpb24sIAogICAgICAgICAgICAgIFN5c3RlbUV4Y2VwdGlvbiwgQXJndW1lbnRFeGNlcHRpb24sIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBhbmQKICAgICAgICAgICAgICBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMDUvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgRml4IHNldmVyYWwgbWVtb3J5IGxlYWtzIGFyb3VuZC4gRXZlbiB3aGVuIHdlIHN1cnZpdmUgIGtub3duaW5nCgkgICAgc3dpZyBpcyBhIG1lbW9yeSBsZWFrIGZhY3RvcnksIGl0IHdhcyBhIGxpdHRsZSBvdXQgb2YKCSAgICBjb250cm9sLiBUbyBydW4gc3RkX2NvbnRhaW5lcnMuaSBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUsCgkgICAgc3dpZyB3YXMgdXNpbmcgfjI2ME1CLCBub3cgaXQgdXNlcyAnb25seScgfjQwTUIsIHdoaWNoIGlzCgkgICAgdGhlIHNhbWUgYW1tb3VudCB0aGF0IGcrKyB1c2VzLCBzbywgaXMgbm90IHRoYXQgYmFkLgoJICAgIEluIHRoZSBwcm9jZXNzLCBJIGZvdW5kIGEgY291cGxlIG9mIGV4dHJhIERlbGV0ZXMsIHdoaWNoCgkgICAgaW4gc29tZSBjYXNlcyBjb3VsZCB0cmlnZ2VyIHNlZy4gZmF1bHRzIGFuZC9vcgoJICAgIERPSC9hc3NlcnRzLgoJICAgIAoJICAgIFtweXRob25dIEJldHRlciBzdXBwb3J0IGZvciBkaXJlY3RvcnMgKyBleGNlcHRpb24uIE1vcmUKCSAgICB2ZXJib3NlIGVycm9ycyBhbmQgYWRkZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gaGFuZGxlci4KCgkgICAgW3B5dGhvbl0gRml4IG1lbW9yeSBsZWFrIGZvciB0aGUKCgkgICAgCSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID4gCgoJICAgIGNhc2UscmVwb3J0ZWQgYnkgQm8gUGVuZy4KCgkgICAgW3B5dGhvbl0gRml4IFN3aWdQeU9iamVjdCBjb21wYXJlIHByb2JsZW0gcmVwb3J0ZSBieQoJICAgIENhbWVyb24gUGF0cmljay4gCgoJICAgIFtweXRob25dIEZpeCBzZXZlcmFsIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSAKCSAgICBmb3IgZ251LWdjYywgSW50ZWwgYW5kIFZDNy4xICBjb21waWxlcnMuCgoKMDIvMjUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gdXNlIENTUyBhbmQgPGRpdj4gaW5zdGVhZCBvZiA8YmxvY2txdW90ZT4KCSAgICBJIHVzZWQgYSBzY3JpcHQgdG8gY29udmVydCB0aGUgZG9jcywgYW5kIGl0IHNldCBhbGwgdGhlIGJveCBjbGFzc2VzCgkgICAgdG8gYmUgImNvZGUiLiAgVGhlcmUgYXJlIGFjdHVhbGx5IDQgZGlmZmVyZW50IGNsYXNzZXMsCgkgICAgInNoZWxsIiwgImNvZGUiLCAidGFyZ2V0bGFuZyIsIGFuZCAiZGlhZ3JhbSIuICBXZSBuZWVkIHRvIGdvIHRocm91Z2gKCSAgICBhbmQgY29udmVydCB0aGUgZGl2cyBkZXBlbmRpbmcgb24gd2hhdCB0aGV5IGNvbnRhaW4uCgowMi8yMy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkZWQgb3B0aW9uIC1ub3J0dGkgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIG5hdGl2ZQoJICAgIEMrKyBSVFRJIHdpdGggZGlyZWN0b3JzIChkeW5hbWljX2Nhc3Q8PiBpcyBub3QgdXNlZCkuCgoJICAgIEFkZCBtb3JlIGNvZGUgZm9yIGRpcmVjdG9ycyB0byBkZXRlY3QgYW5kIHJlcG9ydCBlcnJvcnMgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUuCgoJICAgIEV4dGVuZCB0aGUgdXNlIG9mIFNXSUdJTlRFUk4gd2hlbmV2ZXIgaXMgcG9zc2libGUuCgoJICAgIFJlbW92ZSB0ZW1wbGF0ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBWQzcuMS4KCgkgICAgUmVtb3ZlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IGdjYy9nKysuIEZpbmFsbHkgeW91IGNhbgoJICAgIGNvbXBpbGUgdXNpbmcKCgkgICAgICAgZysrIC1XIC1XYWxsIC1jIG15bW9kdWxlX3dyYXAuY3h4CgoJICAgIGFuZCBubyBzcHVyaW91cyBlcnJvcnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIKCSAgICBjb2RlLgoKMDIvMjMvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgQWRkZWQgLWV4dGVybmFsLXJ1bnRpbWUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZHVtcAoJICAgIG91dCBhbGwgdGhlIGNvZGUgbmVlZGVkIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHJ1bnRpbWUgc3lzdGVtLAoJICAgIGFuZCBpdCByZXBsYWNlcyBpbmNsdWRpbmcgdGhlIGZpbGVzIGRpcmVjdGx5LiAgVGhpcyBjaGFuZ2UgYWRkcwoJICAgIHR3byBuZXcgdmlydHVhbCBmdW5jdGlvbnMgdG8gdGhlIExhbmd1YWdlIGNsYXNzLCB3aGljaCBhcmUgdXNlZAoJICAgIHRvIGZpbmQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHJ1bnRpbWUgY29kZS4gIEkgYWxzbyB1cGRhdGVkCgkgICAgYWxsIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgcnVudGltZSB0byBpbXBsZW1lbnQgdGhlc2UgdHdvIGZ1bmN0aW9ucy4KCjAyLzIyLzIwMDU6IG1tYXR1cyAKCSAgICBGaXggJXRlbXBsYXRlICsgcHJpdmF0ZSBlcnJvciBTRiMxMDk5OTc2LgoKMDIvMjEvMjAwNTogbW1hdHVzIAoKCSAgICBGaXggc3dpZ3J1bi5zd2cgd2FybmluZ3MgcmVwb3J0ZWQgd2hlbiB1c2luZyAiZ2NjIC1XIC1XYWxsIgoJICAgIChzdGF0aWMvaW5saW5lIG5vdCB1c2VkIGluIGZyb250IG9mIGEgZnVuY3Rpb24KCSAgICBkZWNsYXJhdGlvbiksIGFuZCBhZGQgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQKCSAgICB1bnVzZWQgd2FybmluZ3MgZWxzZXdoZXJlLgoKCSAgICBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmdzLgoKCSAgICBbUHl0aG9uXSBVc2UgbmV3IFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkIHdhcm5pbmdzIGluCgkgICAgU1dJR0lOVEVSTiBtZXRob2RzLgoKCSAgICBbUHl0aG9uXSBGaXggUHlPU19zbnByaW50ZiBmb3IgcHl0aG9uIHZlcnNpb25zIDwgMi4yIChTRiAjMTEwNDkxOSkuCgoJICAgIFtQeXRob25dIEZpeCBtYXAvbXVsdGltYXAgdG8gYWxsb3cgZW1wdHkgbWFwcyAocmVwb3J0ZWQgYnkKICAJICAgIFBoaWxpcHBlIEhldHJveSkuCgoJICAgIFtEb2NzXSBBZGQgc29tZSBkb2N1bWVudGF0aW9uIHRvIFB5dGhvbi5odG1sIGFuZAoJICAgIFNXSUdQbHVzLmh0bWwsIGluY2x1ZGluZyBmb3IgZXhhbXBsZSB0aGUgZmFjdCB0aGF0CgkgICAgJ2ZyaWVuZHMnIGFyZSBub3cgc3VwcG9ydGVkLgoKMDIvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gUGF0Y2ggZnJvbSBPbGx5IEJldHRzLCBzbyB0aGF0IHdyYXBwZXJzIGNvbXBpbGUgd2l0aCBaZW5kIHRocmVhZCBzYWZldHkgZW5hYmxlZC4KCjAyLzE3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lbW9yeSBsZWFrIGZpeCBpbiBzb21lIG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbW9kdWxlcyB3aGVuIHVzaW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIGluIGNvbnN0cnVjdG9ycy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZSB3YXMgbm90IHRha2luZyBvd25lcnNoaXAgb2YgdGhlCiAgICAgICAgICAgIEMrKyBvYmplY3QgbWVtb3J5IHdoZW4gYW55IG9mIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdCB1c2UgZGVmYXVsdCBhcmd1bWVudHMgd2FzIGNhbGxlZC4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxMTE1MDU1OiBGYWlsZWQgbWFrZSBpbnN0YWxsLiBQYXRjaCBmcm9tIFJvYiBTdG9uZS4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiAjMTEyMzQxNiBmcm9tIFBhdWwgTW9vcmUuIENvcnJlY3QgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFNUUklOR0FSUkFZCiAgICAgICAgICAgIHR5cGVtYXBzIGluIHZhcmlvdXMuaS4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIERpc2FibGVkIHR5cGVtYXAgc2VhcmNoIGNoYW5nZXMgZm9yIG5vdyAoc2VlIGVudHJ5IDE5LzEyLzIwMDQpLiBJdCBicmVha3MKICAgICAgICAgICAgb2xkIHR5cGVtYXBzLCBsZW5ndGhlbnMgdGhlIGV4ZWN1dGlvbiB0aW1lIGJ5IGFib3V0IDI1JSBhbmQgaW50cm9kdWNlcwogICAgICAgICAgICBpbmNvbnNpc3RlbmNpZXMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBzd2lnIC1oZWxwIGZvbGxvd3Mgb3RoZXIgc29mdHdhcmUgYnkgcHJpbnRpbmcgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgc3dpZyAtdmVyc2lvbiBhbHNvIGRpc3BsYXlzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIEJlaGF2aW91ciByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGZvciB0aGUgbGVzcyBjb21tb25seSB1c2VkIG9yZGVyaW5nIG9mICVpbmNsdWRlIGFuZCAjaW5jbHVkZSwgc28KICAgICAgICAgICAgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMuIEJ1ZyByZXBvcnRlZCBieSByZXBvcnRlZCBieSBNYXggQm93c2hlci4KICAgICAgICAgICAgICAlaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2luY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlfSAKCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gU1dJR19leGNlcHRpb24gbWFjcm8gd2lsbCBub3cgcmV0dXJuIGZyb20gdW5tYW5hZ2VkIGNvZGUgLyBuYXRpdmUgY29kZQogICAgICAgICAgICBhcyBzb29uIGFzIGl0IGlzIGNhbGxlZC4gRml4ZXMgcG9zc2libGUgSlZNIGNyYXNoZXMgYW5kIG90aGVyIGNvZGUgdW5leHBlY3RlZGx5CiAgICAgICAgICAgIGJlaW5nIGV4ZWN1dGVkLiBOb3RlIFNXSUdfZXhjZXB0aW9uIGlzIG9ubHkgb2NjYXNpb25hbGx5IHVzZWQgYnkgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgIHdyaXRlcnMsIGFuZCBpcyBiZXN0IGF2b2lkZWQgYnkgU1dJRyB1c2Vycy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gVHlwZW1hcHMgY2FuIG5vdyBiZSB0YXJnZXRlZCBhdCBnbG9iYWwgdmFyaWFibGUgbmFtZXMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgbmFtZXMuIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIGZvciAKICAgICAgICAgICAgdGhlIHNldHRlcnMgd2VyZSBpZ25vcmVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBnbG9iYWxpbnQgIi4uLiIKICAgICAgICAgICAgICBpbnQgZ2xvYmFsaW50OwoKMDIvMTMvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkICV0eXBlY2hlY2sgZm9yIFNXSUdUWVBFLCBhZGQgJXR5cGVjaGVjayBmb3IgcHRyZGlmZl90LCBmaXgKCSAgICB0eXBlbWFwcyBmb3Igc2l6ZV90LgoKCSAgICBbUGlrZV0gTWVyZ2UgcGF0Y2ggZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYgZm9yIGltcHJvdmVkIFBpa2UgY29uZmlndXJhdGlvbi4KCjAyLzEyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgY29uZmlndXJlIHN3aXRjaGVzIC0td2l0aG91dC10Y2wsIC0td2l0aG91dC1weXRob24gZXRjLiBhbGxvdyB0bwogICAgICAgICAgICBkaXNhYmxlIHRoZSBzZWFyY2ggZm9yIGluc3RhbGxlZCBsYW5ndWFnZXMuCgowMS8zMS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBBZGQgRG9oU29ydExpc3QgdG8gRE9ICgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtOgogICAgICAgICAgICAgICArIFNwZWVkLiBUeXBlIGxvYWRpbmcgaXMgbm93IE8obiBsb2cgbikgaW5zdGVhZCBvZiBPKE5eMiksIHdoaWNoCgkgICAgICAgICBmb3IgbGFyZ2UgbW9kdWxlcyBpcyBhIGh1Z2UgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgICAgICsgQSB3aG9sZSBidW5jaCBvZiBmdW5jdGlvbnMgaW4gc3dpZ3J1bi5zd2cgbm8gbG9uZ2VyIG5lZWQgdGhlIAogICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9saXN0X2hhbmRsZSBwYXNzZWQgdG8gdGhlbS4gIFRoZSBvbmx5IG9uZSBsZWZ0IGlzIAoJCSBUeXBlUXVlcnkuICBUaGlzIGFsc28gbWFrZXMgcnVudGltZS5zd2cgYSBsb3Qgc21hbGxlci4KCSAgICAgICArIFNwbGl0IHVwIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZSBpbnRvIHR3byBzdHJ1Y3R1cmVzCgkgICAgICAgICAoc3dpZ190eXBlX2luZm8gYW5kIHN3aWdfY2FzdF9pbmZvKQoJICAgICAgICsgU3RvcmUgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8gcmF0aGVyIHRoYW4ganVzdCB0aGUgdHlwZQoJICAgICAgICAgbmFtZSBzdHJpbmcgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGNhc3RzLiBGaXJzdCBvZmYsIHRoaXMgbWFrZXMKCSAgICAgICAgIHRoZSBndWlsZSBtb2R1bGUgYSBsaXR0bGUgZmFzdGVyLCBhbmQgc2Vjb25kLCB0aGUKCSAgICAgICAgIFNXSUdfVHlwZUNsaWVudERhdGEoKSBmdW5jdGlvbiBpcyBmYXN0ZXIgdG9vLiAKCSAgICAgICArIEFkZCB0aGUgaWRlYSBvZiBhIG1vZHVsZSBpbnRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZSwgYWxsIHRoZQoJICAgICAgICAgdHlwZXMgd2VyZSBzdG9yZWQgaW4gb25lIGh1Z2UgbGlua2VkIGxpc3QuIE5vdywgYW5vdGhlciBsZXZlbCBpcwoJICAgICAgICAgYWRkZWQsIGFuZCB0aGUgdHlwZSBzeXN0ZW0gc3RvcmVzIGEgbGlua2VkIGxpc3Qgb2YgbW9kdWxlcywgZWFjaAoJICAgICAgICAgb2Ygd2hpY2ggc3RvcmVzIGFuIGFycmF5IG9mIHR5cGVzIGFzc29jaWF0ZWQgd2l0aCBpdC4KCSAgICAgICArIEZvciBtb3JlIGluZm9ybWF0aW9uIG9mIGhvdyB0aGUgcnVudGltZSB0eXBlIHN5c3RlbSBub3cgd29ya3MsCgkgICAgICAgICBwbGVhc2Ugc2VlIERvYy9NYW51YWwvdHlwZW1hcHMuaHRtbCBhbmQgRG9jL0RldmVsL3J1bnRpbWUudHh0CgkJIAoJICAgIC0gVXBkYXRlIGFsbCBsYW5ndWFnZSBtb2R1bGVzIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgVGhlIGNoYW5nZXMKCSAgICAgIHRvIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlIGFyZSBtaW5vci4gIEFsbCBsYW5ndWFnZXMgYXJlIG5vdyBhYmxlIHRvCgkgICAgICB1c2UgcnVudGltZS5zd2cgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUKCSAgICAgIG9ubHkgcHl0aG9uIGFuZCBwZXJsIGRpZC4KCgkgICAgLSBbZ3VpbGUsIG16c2NoZW1lLCBvY2FtbCwgYW5kIHBocDRdICBUaGVzZSBsYW5ndWFnZXMgb3BlbmVkIHVwIHRoZQoJICAgICAgaW5pdCBmdW5jdGlvbiBpbnNpZGUgdGhlIC5jeHggY29kZSwgYW5kIGFueSBjb2RlIGluIHRoZSAuc3dnIGZpbGVzCgkgICAgICBpbiB0aGUgaW5pdCBzZWN0aW9uIHdhcyBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIFRoaXMgd2FzIGEgcHJvYmxlbQoJICAgICAgZm9yIHN3aWdpbml0LnN3Zywgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBTV0lHX2luaXQKCSAgICAgIGZ1bmN0aW9uIGlzIG9wZW5lZC4gIFRodXMgSSBjaGFuZ2VkIHRoZXNlIGxhbmd1YWdlcyB0byBiZSBsaWtlCgkgICAgICBweXRob24gb3IgcGVybCwgd2hlcmUgdGhlIGluaXQgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIC5zd2cKCSAgICAgIGZpbGUuCgkgICAgICAKCSAgICAtIFtSdWJ5XSBJbnN0ZWFkIG9mIG1vdmluZyB0aGUgaW5pdCBmdW5jdGlvbiB0byB0aGUgLnN3ZyBmaWxlLCBJCgkgICAgICBhZGRlZCBhIG5ldyBzZWN0aW9uIGluaXRiZWZvcmVmdW5jLCBhbmQgdGhlbiBhZGRlZAoJICAgICAgJWluc2VydChpbml0YmVmb3JlZnVuYykgInN3aWdpbml0LnN3ZyIKCgkgICAgLSBbTXpTY2hlbWVdIEZpeCBlbnVtcyBhbmQgZml4IEV4YW1wbGVzL01ha2VmaWxlLmluIHNvIHRoYXQgaWYKCSAgICAgIG11bHRpcGxlIC1JIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBJTkNMVURFUyB2YXJpYWJsZSwgZWFjaAoJICAgICAgZ2V0cyBhICsrY2NmLgoKCSAgICAtIFtHdWlsZSBHSF0gVXBkYXRlIEd1aWxlIEdIIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgU2VlCgkgICAgICBEb2MvTWFudWFsL0d1aWxlLmh0bWwgZm9yIGhvdyBzbW9icyBhcmUgbm93IHVzZWQuCgowMS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyB0eXBlbWFwIGNhbGxlZCAnY3Njb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwIGNhbGxlZCAnamF2YWNvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuIEFub3RoZXIgdHlwZW1hcCBuYW1lZCAnamF2YWNvbnN0cnVjdF9kaXJlY3RvcicKICAgICAgICAgICAgaXMgdXNlZCBpbnN0ZWFkIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIGEgZGlyZWN0b3IgY2xhc3MuCgogICAgICAgICAgICBbQyMsIEphdmFdIElmIGEgQysrIGNsYXNzIGRpZCBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGEgcHJvdGVjdGVkIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoaXMgc2VlbXMgaXMgdW5uZWNlc3NhcnkgYW5kIGhhcyBiZWVuIHJlbW92ZWQKICAgICAgICAgICAgYW5kIHRoZXJlYnkgZ2l2aW5nIHRoZSB1c2VyIGFsbW9zdCBjb21wbGV0ZSBjb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBjb2RlIGFsb25nIHdpdGggdGhlCiAgICAgICAgICAgIG5ldyB0eXBlbWFwcyBhYm92ZS4KCjE5LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbRGlzYWJsZWQsIHNlZSBlbnRyeSAwMi8xNS8yMDA0XQogICAgICAgICAgICAtIEZpeCB0eXBlbWFwIHNlYXJjaCwgbm93IHRoZSAib3V0IiB0eXBlbWFwIHNlYXJjaCBpcyBkb25lIGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICAgaW50ICpGb286OmZvbyhpbnQgYmFyKSAgIC0+ICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKkZvbzo6Zm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqCgogICAgICAgICAgICAgICB0aGVuLCBub3cgeW91IGNhbiBiZSBtb3JlIHNwZWNpZmljLCBhbmQgZGVmaW5lCgogICAgICAgICAgICAgIC8qIGFwcGx5IG9ubHkgZm9yICAnRm9vOjpmb28nIG1ldGhvZCAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogRm9vOjpmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgIC8qIGFwcGx5IGZvciBhbGwgJ2ZvbycgZnVuY3Rpb25zL21ldGhvZHMgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIGZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCAqZm9vKGludCAqYmFyKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoJICAKCjE1LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICAtIE1vcmUgZml4ZXMgZm9yIHRlbXBsYXRlcyBhbmQgdGVtcGxhdGUgZGVmYXVsdCBhcmdzLgogICAgICAgICAgICAgIFNlZSB0ZW1wbGF0ZV9kZWZhdWx0LmkgZm9yIHNjYXJ5IGNhc2VzIHRoYXQgbm93IGFyZSAKICAgICAgICAgICAgICBzdXBwb3J0ZWQsIGJlc2lkZXMgdGhlIGFscmVhZHkgdWdseSBTVEwvc3RkIGNhc2VzLgogICAgICAgICAgICAgIAogICAgICAgICAgICAtIENvc21ldGljcyBhbmQgbW9yZSB1c2Ugb2YgJ2NvbnN0JyB3aGVyZSBpdCB3YXMgaW1wbGljaXQuCiAgICAgICAgICAgIC0gT3RoZXIgZml4ZXMgZm9yIE9TUywgd2hpY2ggaXMgbm93IHdvcmtpbmcgYWdhaW4gd2l0aCAxLjMuMjUuCgkKVmVyc2lvbiAxLjMuMjQgKERlY2VtYmVyIDE0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIEZpeCBhIGJ1bmNoIG9mIGJ1Z3MgcmVsYXRpbmcgdG8gLXByb3h5IHN1cHBvcnQKCSAgICAgICsgbm9uLWNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBtZW1iZXIgY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIGFkZGVkIGEgLW5vdW5pdCBhcmd1bWVudCwgd2hpY2ggZG9lcyBub3QgZXhwb3J0IHRoZSAoZGVjbGFyZSAodW5pdCAuLi4pKQoJICAgICAgKyBjb3JyZWN0bHkgaW5zdGFsbCBzd2lnY2xvc3ByZWZpeC5zY20KCSAgICAgICsgY29uc3RhbnRzIChlbnVtcywgZGVmaW5lcykgbm93IGNvcnJlY2x5IGV4cG9ydCB3aGVuIHVzaW5nIC1wcm94eQoKMTIvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uZmlndXJlIGZpeCBmb3Igd2hlbiBtb3JlIHRoYW4gb25lIHZlcnNpb24gb2Ygam5pX21kLmggaXMgZm91bmQKICAgICAgICAgICAgaW4gdGhlIEphdmEgaW5jbHVkZSBkaXJlY3RvcnkgKHdhcyBnZW5lcmF0aW5nIGxvdHMgb2Ygc2VkIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2VzKS4KCjEyLzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byBhcnJheXNfamF2YS5pIHNvIHRoYXQgb25lIGNhbiBhcHBseSB0aGUgYXJyYXkKICAgICAgICAgICAgdHlwZW1hcHMgdG8gZnVuY3Rpb25zIHRha2luZyBwb2ludGVycyBhcyBpbnB1dCwgZWcKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgICVhcHBseSBpbnRbXSB7aW50Kn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKmEpOwoKMTIvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIG1vZHMgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLiBOZXcgdHlwZW1hcHMKICAgICAgICAgICAgZGlyZWN0b3JkaXNjb25uZWN0IGFuZCBkaXJlY3RvcmRpc2Nvbm5lY3RfZGVyaXZlZCBmb3IgdGhlIAogICAgICAgICAgICBzd2lnRGlyZWN0b3JEaXNjb25uZWN0KCkgbWV0aG9kLiBBbHNvIGZpeCB0byBnZXQgdGhlIGphdmFwYWNrYWdlCiAgICAgICAgICAgIHR5cGVtYXAgd29ya2luZyBhZ2Fpbi4KCjEyLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gRmluaXNoaW5nIHRoZSBmaXhlcyBmb3IgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyArIHNwZWNpYWxpemF0aW9ucy4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gTm93IHdlIHVzZSB0aGUgbmV3IHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgaW4gdGhlIHN0ZC9TVEwgbGlicmFyeS4gVGhhdCBtZWFucyB0aGUgaW50ZXJuYWwKCSAgICAgIHN3aWcgZmlsZXMgYXJlIGdldHRpbmcgdWdsaWVyIHNpbmNlIHdlIG5vdyBzdXBwb3J0IHRoZQoJICAgICAgb3JpZ2luYWwgZGVjbGFyYXRpb25zOgoKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjwgX1RwID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJLi4uLgoJCX07CgkgICAgICAJICAgICAKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleSA+LAoJICAgICAgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwID4gPiA+CiAgICAgICAgICAgICAgICBjbGFzcyBtYXAgewoJCS4uLi4KCQl9OwogCiAgICAgICAgICAgICAgYW5kIHRoZSB1c2VyIGNhbiB1c2UgdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXMKCgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgc3RkOjphbGxvY2F0b3I8aW50PiA+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIE15QWxsb2NhdG9yPGludD4gPjsKCiAgICAgICAgICAgICAgTm93IHdlIGFyZSBjbG9zZXIgdG8gdGhlIGNsZWFuaW5nL3Jld3JpdGluZyBvZiB0aGUKCSAgICAgIHB5dGhvbiBzdGQvU1RMIHN1cHBvcnQsIHN1Y2ggdGhhdCB3ZSByZWNvdmVyIHN1cHBvcnQgZm9yCgkgICAgICBNU1ZDKysgNi4wLCBhbmQgd2UgY2FuIGFkZCBzdXBwb3J0IGZvciBvdGhlciBsYW5ndWFnZXMKCSAgICAgIHRvby4KCgoxMi8wMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyBtZXRob2RzIHVzaW5nIGEgbWVtYmVyIGVudW0KICAgICAgICAgICAgYW5kIHR5cGVzYWZlL3Byb3BlciBlbnVtcyBlbmFibGVkLgoKMTIvMDEvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdHlwZW1hcHMgdG8gd29yayB3aXRoIHRlbXBsYXRlcyBhbmQgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncywgaWUKCgkgICAgICAgdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEIgPSBpbnQ+CiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgIH07CgoJICAgICAgICV0eXBlbWFwKGluKSBGb288aW50PiAqey4uLn0KCSAgICAgICAldHlwZW1hcChvdXQpIEZvbzxpbnQsaW50PiAqey4uLn0KCgkgICAgICAgRm9vPGludD4gKiBmb28oIEZvbzxpbnQ+ICpmMSwgRm9vPGludCxpbnQ+ICpmMik7CgoJICAgICAgbm93ICdmMScsICdmMicgYW5kIHRoZSByZXR1cm4gdmFsdWUgcmVzb2x2ZSB0aGUgcHJvdmlkZWQKCSAgICAgIHR5cGVtYXBzIHByb3Blcmx5LgoKCSAgICAgIFRoaXMgaXMgaGlnaGx5IG5lZWRlZCBmb3IgcHJvcGVyIFNUTCBzdXBwb3J0LCBzZWUgbmV3IAoJICAgICAgc3RkX2Jhc2ljX3N0cmluZy5pLCBzdGRfc3N0cmVhbS5pLCBldGMuCgoJICAgIC0gQWRkZWQgc3RkX3NzdHJlYW0uaSwgYW5kIGZpeCBzdGRfYmFzaWNfc3RyaW5nLmkgdG8gdXNlCgkgICAgICB0aGUgbmV3IHR5cGVtYXBzICsgdGVtcGxhdGUgZGVmLiBhcmcgbWVjaGFuaXNtLiBBbHNvLAoJICAgICAgYWRkZWQgdGhlIG5lZWRlZCBzdGRfYWxsb2MuaS4gTm93LCBhbGwgdGhlIGNvbnRhaW5lcnMKCSAgICAgIGNhbiBiZSBtb2RpZmllZCB0byBzdXBwb3J0IHN0ZDo6YWxsb2NhdG9yLCBsaWtlIGluOgoJICAgICAgCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEEgPSBzdGQ6OmFsbG9jYXRvcjxUID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJcHVibGljOgoJCS4uLi4KCQl9OwoJICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBpcyBvbmx5IGNvbXBsZXRlZCBieSBub3cgZm9yIGJhc2ljX3N0cmluZy4KCgkgICAgLSBGaXggZm9yIHNtYXJ0IHBvaW50ZXJzICsgbWVtYmVycyArIGV4dGVuc2lvbnM6CgoJICAgICAgJWV4dGVuZCBGb28gewoJICAgICAgICBpbnQgZXh0ZW5zaW9uKGludCBpLCBpbnQgaikgeyByZXR1cm4gaTsgfQoJCWludCBleHRlbnNpb24oKSB7IHJldHVybiAxOyB9CgkgICAgICB9CgoJICAgICAgJWlubGluZSAlewoKCSAgICAgIGNsYXNzIEZvbyB7CgkgICAgICBwdWJsaWM6CgkJaW50IHk7CgkJc3RhdGljIGNvbnN0IGludCB6OwoJICAgICAgfTsKICAKCSAgICAgIGNsYXNzIEJhciB7CgkgICAgICAgIEZvbyAqZjsKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgQmFyKEZvbyAqZikgOiBmKGYpIHsgfQoJCUZvbyAqb3BlcmF0b3ItPigpIHsKCQkgIHJldHVybiBmOwoJCX0KCSAgICAgIH07CgoJICAgICAgbm93IHlvdSBjYW4gCgkgICAgIAoJICAgICAgZiA9IEZvbygpCgkgICAgICBmLnkgPSAzCgkgICAgICBhID0gZi56CgkgICAgICBmLT5leHRlbnNpb24oKQogCgkgICAgICBiID0gQmFyKGYpCgkgICAgICBiLnkgPSAzCgkgICAgICBhID0gYi56CgkgICAgICBiLT5leHRlbnNpb24oKQoKCSAgICAtIE90aGVyIHNtYWxsIGVycm9ycyBmaXhlcywgbW9zdGx5IHB5dGhvbi4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBidWcgZml4ZXMgc28gdGhhdCB0aGUgY29ycmVjdCBqYXZhIHR5cGVzCiAgICAgICAgICAgIGFuZCBjYW5vbmljYWxpemVkIHR5cGVzIGluIHRoZSBKTkkgY29kZSBhcmUgZW1pdHRlZC4gVXNlIG9mIHRoZQogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgbm93CiAgICAgICAgICAgIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLWRpcmVjdG9yIHR5cGVtYXBzLiBUaGUgdHlwZXMgdXNlZCBmb3IgCiAgICAgICAgICAgIHR5cGVtYXAgbG9va3VwcyBhcmUgYWxzbyBjb3JyZWN0ZWQgaW4gYSBmZXcgcGxhY2VzLiBJZiB5b3UgCiAgICAgICAgICAgIHByZXZpb3VzbHkgaGFkIHlvdXIgb3duIGRpcmVjdG9yIHR5cGVtYXBzLCBlbnN1cmUgdGhleSBhcmUgdXNpbmcgdGhlCiAgICAgICAgICAgIGNvcnJlY3QgQysrIHR5cGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25zdCBlbnVtIFNXSUdUWVBFICYgdHlwZW1hcHMgYWRkZWQuIFRoZXNlIHdyYXAgY29uc3QgZW51bSByZWZlcmVuY2VzCiAgICAgICAgICAgIGFzIGlmIHRoZXkgd2VyZSBwYXNzZWQgYnkgdmFsdWUuIENvbnN0IGVudW0gcmVmZXJlbmNlcyB0aHVzIHdvcmsgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgY29uc3QgcmVmZXJlbmNlIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIGNvbnN0IGRvdWJsZSAmLCAKICAgICAgICAgICAgY29uc3QgaW50ICYgZXRjLiBUeXBlbWFwcyBhZGRlZCBmb3IgSmF2YSwgQyMsIFJ1YnksIFRjbCwgUGVybCBhbmQgUGlrZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IHNwZWNpYWwgdmFyaWFibGU6ICQqamF2YWNsYXNzbmFtZSwgc2ltaWxhciB0byAkamF2YWNsYXNzbmFtZQogICAgICAgICAgICBhbmQgJCZqYXZhY2xhc3NuYW1lLiBUaGUgbmV3IG9uZSByZW1vdmVzIGEgcG9pbnRlciBmcm9tIHRoZSBDIHR5cGUgYmVmb3JlCiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgSmF2YSBjbGFzcyBuYW1lLiBPbmUgb3IgbW9yZSBvZiAkamF2YWNsYXNzbmFtZSwKICAgICAgICAgICAgJCZqYXZhY2xhc3NuYW1lIG9yICQqamF2YWNsYXNzbmFtZSBtYXkgbm93IGFwcGVhciBpbiBhIHR5cGVtYXAuIExpa2V3aXNlIGZvcgogICAgICAgICAgICBDIyB1c2luZyBjc2NsYXNzbmFtZSBpbnN0ZWFkIG9mIGphdmFjbGFzc25hbWUuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgbGFzdCB2ZXN0aWdlcyBvZiBlbnVtcyBiZWluZyBoYW5kbGVkIGFzIGludGVnZXJzIHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAgICAgaW50ZXJuYWxzLiBUaGUgd3JhcHBlciBtZXRob2RzIHVzZSB0aGUgZW51bSB0eXBlIHJhdGhlciB0aGFuIGFuIGludAogICAgICAgICAgICBub3cuIFRoZSBuZXQgcmVzdWx0IGlzIGFkZGVkIHR5cGUgc2FmZXR5IGZvciBlbnVtcyB3aGVuIGhhbmRsZWQgYXMKICAgICAgICAgICAgcG9pbnRlcnMsIHJlZmVyZW5jZXMgZXRjLiBQcmV2aW91c2x5IGluIHNpdHVhdGlvbnMgc3VjaCBhcyBhIG1ldGhvZAogICAgICAgICAgICB0YWtpbmcgYSBwb2ludGVyIHRvIGFuIGVudW0sIGEgcG9pbnRlciB0byBhbiBpbnQgb3IgYSBwb2ludGVyIHRvIGFuCiAgICAgICAgICAgIGVudW0gb2Ygc29tZSBvdGhlciB0eXBlIGNvdWxkIGluYWR2ZXJ0YW50bHkgYmUgcGFzc2VkIHRvIHRoZSBtZXRob2QuCiAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGFzIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBlbnVtIGlzIG5vIGxvbmdlciBiYXNlZCBvbgogICAgICAgICAgICBhbiBpbnQsIGJ1dCB0aGUgZW51bSB0eXBlIGluc3RlYWQuIEFub255bW91cyBlbnVtcyBhcmUgc3RpbGwgaGFuZGxlZAogICAgICAgICAgICBhcyBpbnRlZ2Vycy4KCiAgICAgICAgICAgIFRoZSBjb25zZXF1ZW5jZSBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlIHVzZXJzIGluIGNvcnJlY3QgdXNhZ2Ugb2YgZW51bXMKICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBub3RpY2VhYmxlLiBUaGVyZSBpcyBubyBjaGFuZ2UgZm9yIGFueSBvZiB0aGUgbGFuZ3VhZ2VzCiAgICAgICAgICAgIHdoZXJlIGVudW1zIGFyZSBwYXNzZWQgYnkgdmFsdWUgLSBtb3N0IG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdpbGwKICAgICAgICAgICAgc3RpbGwgYWNjZXB0IGFuIGludGVnZXIgZm9yIGFuIGVudW0gdmFsdWUgYW5kIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICBsYW5ndWFnZXMgc3RpbGwgdXNlIGVpdGhlciB0eXBlc2FmZSBlbnVtcywgaW50ZWdlcnMgb3IgcHJvcGVyIGVudW1zCiAgICAgICAgICAgIGRlcGVuZGluZyBvbiB3aGF0IHRoZSB1c2VyIGNvbmZpZ3VyZXMuIEZvciBKYXZhIGFuZCBDIyB1c2VycyBhIGNoYW5nZQogICAgICAgICAgICBpbiB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgbmFtZSBoYXMgb2NjdXJyZWQgKGZvciBlbnVtIHBvaW50ZXJzLAogICAgICAgICAgICByZWZlcmVuY2VzIGV0YykuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyBvbmU9MSwgdHdvIH07CiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzKiBudW1iZXIoKTsKCiAgICAgICAgICAgIEluIEphdmEgYW5kIEMjIHRoaXMgbXVzdCBub3cgYmUgY29kZWQgYXMKCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9OdW1iZXJzIG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgcmF0aGVyIHRoYW4KCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzIwMDQ6IHdzZnVsdG9uL21tYXR1cwogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGRlcHJlY2F0ZWQgd2FybmluZyBmb3IgJW5hbWUgYW5kIHJlbW92ZSByZW1haW5pbmcgJW5hbWUKICAgICAgICAgICAgdXNhZ2UgaW4gdGhlIFNXSUcgbGlicmFyaWVzLgoKMTEvMjEvMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIHRoZSBQeVN3aWdPYmplY3QgdG8gYmUgdXNlZCBmb3IgY2FycnlpbmcKCSAgICAgIHRoZSBpbnN0YW5jZSBDL0MrKyBwb2ludGVycy4gVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YKCSAgICAgIHN0cmluZyBhbmQgUHlDT2JqZWN0cy4KCgkgICAgICBUaGUgbmV3IFB5U3dpZ09iamVjdCBpcyBldmVuIHNhZmVyIHRoYW4gUHlDT2JqZWN0LCBhbmQKCSAgICAgIG1vcmUgZnJpZW5kbHkgdGhhbiBwbGFpbiBzdHJpbmdzOgoKCSAgICAgIG5vdyB5b3UgY2FuIGRvCgoJICAgICAgICBwcmludCBhLnRoaXMKCQk8U3dpZyBPYmplY3QgYXQgXzAwNjkxNjA4X3BfQT4KCgkJcHJpbnQgc3RyKGEudGhpcykKCQlfMDA2OTE2MDhfcF9BCgoJCXByaW50IGxvbmcoYS50aGlzKQoJCTEzNTY4NjQwMAoKCQlwcmludCAiJXMgMHgleCIgJSAoYS50aGlzLCBhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQSAweDgxNjY5MDAKCgkgICAgICB0aGUgbGFzdCBvbmUgaXMgdmVyeSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgdGhlIEMvQysrCgkgICAgICBzaWRlLCBzaW5jZSBpcyB0aGUgcG9pbnRlciB2YWx1ZSB5b3Ugd2lsbCB1c3VhbGx5IGdldAoJICAgICAgZnJvbSB0aGUgZGVidWdnZXIuCgoJICAgICAgQWxzbywgaWYgeW91IGhhdmUgc29tZSBvbGQgY29kZSB0aGF0IHVzZXMgdGhlIHN0cmluZwoJICAgICAgcmVwcmVzZW50YXRpb24gIl8wMDY5MTYwOF9wX0EiLCB5b3UgY2FuIHVzZSBpdCBub3cgYWdhaW4KCSAgICAgIHVzaW5nICdzdHIocHRyKScsIG9yIGJ5IGNhbGxpbmcgJ3N0ciA9IFB5T2JqZWN0X1N0cihvYmopJwoJICAgICAgaW4gdGhlIEMvQysrIHNpZGUuCiAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG1haW5seSBmb3Igbm9zdGFsZ2ljIHN3aWcgdXNlcnMgdGhhdCBtaXNzCgkgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBidXQgYWxzbyBhbGxvd3MgdG8gc2F5IGFnYWluCgoJICAgICAgICBpZiBhLnRoaXMgPT0gYi50aGlzOgoJCSAgcmV0dXJuICJhIGlzIGIiCgoJICAgICAgYW5kIHdlbGwsIHNpbmNlIHRoZSBjaGFuZ2Ugd2VyZSByZWFsbHkgc2ltcGxlLCBtYXliZSBpbgoJICAgICAgdGhlIGZ1dHVyZSB3ZSB3aWxsIGJlIGFibGUgdG8gZG8KICAgCgkJbmV4dCA9IGEudGhpcyArIDEKCgkgICAgICBvciBhZGQgbmF0aXZlIHB5dGhvbiBpdGVyYXRpb24gb3ZlciBuYXRpdmUgQy9DKysgYXJyYXlzLAoJICAgICAgaWUsIG5vIG5lZWQgdG8gY3JlYXRlL2NvcHkgbmV3IHR1cGxlcyB3aGVuIHJldHVybmluZyBhbmQKCSAgICAgIGFycmF5IG9yIHZlY3Rvci4KCgkgICAgICBBbHNvLCBhIFB5U3dpZ1BhY2tlZCBvYmplY3Qgd2FzIGFkZGluZyB0byBjYXJyeSBhIG1lbWJlcgoJICAgICAgbWV0aG9kIHBvaW50ZXIsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGEgdGVtcG9yYWwgc29sdXRpb24KCSAgICAgIHVudGlsIGEgbW9yZSBnZW5lcmFsIG9iamVjdCBmb3IgbWV0aG9kcyBpcyBhZGRlZC4KCgkgICAgICBCZSBhd2FyZSB0aGF0IHRvIHNpbXBsaWZ5IG1haW50YWluaW5nIGFuZCBjb21wYXRpYmlsaXR5CgkgICAgICB3aXRoIG90aGVyIHRvb2xzLCB0aGUgb2xkIHN0cmluZyBhbmQgUHlDT2JqZWN0cwoJICAgICAgcmVwcmVzZW50YXRpb24gY291bGQgZGlzYXBwZWFyIHZlcnkgc29vbiwgYW5kIHRoZQoJICAgICAgU1dJR19DT0JKRUNUU19UWVBFUyBvciBTV0lHX05PX09CSkVDVF9UWVBFUyBtYWNyb3Mgd2lsbAoJICAgICAgaGF2ZSBubyBlZmZlY3QgYXQgY29tcGlsYXRpb24gdGltZS4gU3RpbGwsIHRoZSB0aHJlZQoJICAgICAgbWVjaGFuaXNtcyBhcmUgcHJlc2VudCBpbiB0aGUgY29kZSBqdXN0IGZvciB0ZXN0aW5nLAoJICAgICAgZGVidWdnaW5nIGFuZCBjb21wYXJpc29uIHB1cnBvc2VzLgoJICAgICAgCjExLzIxLzA0OiBtbWF0dXMKCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgYmFjayBzdXBwb3J0IGZvciB1c2luZyB0aGUgc3dpZyBydW50aW1lIGNvZGUKCSAgICAgIGluc2lkZSB0aGUgdXNlciBjb2RlLiBXZSBqdXN0IGFsbG93IHRoZSB1c2VyIHRvIGluY2x1ZGUKCSAgICAgIHRoZSBtaW5pbWFsIGNvZGUgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgcnVudGltZQoJICAgICAgbWVjaGFuaXNtIHN0YXRpY2FsbHksIGp1c3QgYXMgaW4gZG9uZSBpbiB0aGUgc3dpZwoJICAgICAgbW9kdWxlcy4KCSAgICAgIAoJICAgICAgVG8gdXNlIHRoZSBzd2lnIHJ1bnRpbWUgY29kZSwgZm9yIGV4YW1wbGUgd2l0aCBweXRob24sCgkgICAgICB0aGUgdXNlciBuZWVkcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgI2luY2x1ZGUgPFB5dGhvbi5oPiAgICAgICAgIC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN3aWdydW4uc3dnPgogICAgICAgICAgICAgICAjaW5jbHVkZSA8cHl0aG9uL3B5cnVuLnN3Zz4gLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8cnVudGltZS5zd2c+CgoJICAgICAgdGhlIGZpbGVzIHN3aWdydW4uc3dnLCBweXJ1bi5zd2cgYW5kIHJ1bnRpbWUuc3dnIGNhbiAKCSAgICAgIGJlIGNoZWNrZWQgb3V0IGJ5IHVzaW5nIHN3aWcgLWNvLCBvciB0aGV5IGNhbiBzaW1wbHkgCgkgICAgICBiZSBmb3VuZCBieSBhZGRpbmcgdGhlIHN3aWcgbGliIGRpcmVjdG9yeSB0byB0aGUKCSAgICAgIGNvbXBpbGVyIGluY2x1ZGUgZGlyZWN0b3J5IGxpc3QsIGZvciBleGFtcGxlCgoJICAgICAgIFNXSUdMSUI9YHN3aWcgLXN3aWdsaWJgCgkgICAgICAgYysrIC1JJHtTV0lHTElCfSAuLgoKCSAgICAgIG9mIGJldHRlciwgdXNpbmcgdGhlIENQUEZMQUdTLCBidXQgdGhhdCBkZXBlbmRzIG9uIHlvdXIKCSAgICAgIGVudmlyb25tZW50LgoJICAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgY2FuIGJlIHBvcnRlZCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRvbywKCSAgICAgIHlvdSBqdXN0IG5lZWQgdG8gaXNvbGF0ZSB0aGUgbmVlZGVkIHJ1bnRpbWUgY29kZSBpbgoJICAgICAgYSBzaW5nbGUgZmlsZSBsaWtlICdweXJ1bi5zd2cnLCBhbmQgcHJvdmlkZSB0aGUgCgkgICAgICBTV0lHX1J1bnRpbWVfR2V0VHlwZUxpc3QoKSBtZXRob2QuIExvb2sgYXQgdGhlCgkgICAgICBMaWIvcHl0aG9uL3B5cnVuLnN3ZyBmaWxlIGFuZCB0aGUgRXhhbXBsZXMvcHl0aG9uL3N3aWdydW4KCSAgICAgIGV4YW1wbGUuCgoxMS8xNS8wNDogbW1hdHVzCgkgICAgLSBGaXggbWl4ZWRfdHlwZXMuaSArIGdjYy0zLjQsIGllLCBhcnJheXMgKyByZWZlcmVuY2VzICsKCSAgICAgIHR5cGVkZWZzCgoJICAgIC0gRml4IG11bHRpZGltIGFycmF5cyArIHR5cGVkZWZzLGllCgoJICAgICAgIHR5cGVkZWYgY2hhciBjaGFyYWN0ZXJbMV07CgkgICAgICAgdHlwZWRlZiBjaGFyYWN0ZXIgd29yZFs2NF07CgoJICAgIC0gUHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBiYXNlcyBpbiB0aGUgc2FtZSB3YXkgYmVmb3JlCgkgICAgICB3ZSBwcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIG1lbWJlcnMsIGllLCB3ZSBjaGVjawoJICAgICAgZm9yIGNvbnN0cnVjdG9ycywgb3BlcmF0b3IgbmV3LCB2aXJ0dWFsIG1lbWJlcnMsIGV0Yy4KICAgCgkgICAgLSBGaXggUnVieS9KYXZhIHRvIHdvcmsgKG9yIGlnbm9yZSkgbXVsdGktaW5oZXJpdGFuY2UgKwogICAgICAgICAgICAgIGRpcmVjdG9ycy4gQWxsb3cgb3RoZXIgbGFuZ3VhZ2VzIHRvIGRlZmluZSBpZiBpdCBpcwogICAgICAgICAgICAgIHN1cHBvcnRlZCBvciBub3QuCgkgICAgCgkgICAgLSBOb3cgeW91IGNhbiBydW4KCiAgICAgICAgICAgICAgICBTV0lHX0ZFQVRVUkVTPSItZGlyZWN0b3JzIC1kaXJwcm90IiAKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1vY2FtbC10ZXN0LXN1aXRlCgoJICAgICAgYW5kIHlvdSB3aWxsIGdldCBvbmx5ICdyZWFsJyBlcnJvcnMuIHJ1YnkgYW5kIHB5dGhvbgoJICAgICAgY29tcGlsZSB3aXRoIG5vIGVycm9ycywgamF2YSBzaG93cyBzb21lIHByb2JsZW1zLgkKClZlcnNpb24gMS4zLjIzIChOb3ZlbWJlciAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzk4Mjc1MyBmcm9tIEZhYnJpY2UgU2FsdmFpcmU6IEFkZHMgZGVwZW5kZW5jaWVzIGdlbmVyYXRpb24gZm9yCiAgICAgICAgICAgIGNvbnN0cnVjdGluZyBtYWtlZmlsZXMuIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAtTUYgLU1EIC1NTUQgdG8gd29yawogICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IG9wdGlvbnMgLU0gYW5kIC1NTS4gVGhlc2Ugb3B0aW9ucyBhcmUgbmFtZWQgdGhlIHNhbWUKICAgICAgICAgICAgYW5kIHdvcmsgdGhlIHNhbWUgYXMgaW4gZ2NjLgoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWlnbm9yZS8lcmVuYW1lIGNoYW5nZXMgZm9yIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB0byBtaXJyb3IKICAgICAgICAgICAgJWZlYXR1cmUgYmVoYXZpb3VyLiBTZWUgcHJldmlvdXMgZW50cnkuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIGZpbmUgdHVuaW5nIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB3aXRoCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLiBBbnkgJWZlYXR1cmUgdGFyZ2V0aW5nIGEgbWV0aG9kIHdpdGggZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgd2lsbCBhcHBseSB0byBhbGwgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlmIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLiBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlCiAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUsIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBtYXRjaCB0aGF0IGV4YWN0CiAgICAgICAgICAgIHdyYXBwZXIgbWV0aG9kIG9ubHkgYW5kIG5vdCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0Iikgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgd2lsbCBhcHBseSB0aGUgZmVhdHVyZSB0byBhbGwgdGhyZWUgd3JhcHBlciBtZXRob2RzLCB0aGF0IGlzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgb25seSBhcHBseSB0byB0aGlzIHdyYXBwZXIgbWV0aG9kOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CgogICAgICAgICAgIGFuZCBub3QgdGhlc2Ugd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBtYWtlICVmZWF0dXJlIG1vcmUgcG93ZXJmdWwgdG8gZWFzZSB0aGUgbWlncmF0aW9uCiAgICAgICAgICAgdG8gbmV3IGRlZmF1bHQgYXJndW1lbnRzIHdyYXBwaW5nIGFwcHJvYWNoLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBJZiB5b3UgcHJldmlvdXNseSBoYWQgYSAlZmVhdHVyZSBhbmQgZGlkbid0IHNwZWNpZnkgdGhlIGRlZmF1bHQgYXJndW1lbnRzLAogICAgICAgICAgIHlvdSB3aWxsIGhhdmUgdG8gYWRkIHRoZW0gaW4gbm93IG9yIHlvdSBjYW4gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIKICAgICAgICAgICBieSB1c2luZyAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikuCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXBzIGZvciBzdGQ6OnZlY3RvciBhZGRlZCBpbnRvIHN0ZF92ZWN0b3IuaS4gVGhlIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGFyZSBtb2RlbGxlZCBvbiB0aGUgLk5FVCBBcnJheUxpc3QgY2xhc3MuIFRoaXMgaXNuJ3QgcXVpdGUKICAgICAgICAgICAgcmVhZHkgZm9yIGdlbmVyYWwgY29uc3VtcHRpb24geWV0LCBidXQgd2lsbCB3b3JrIHdpdGggdmVjdG9ycyBvZiBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgYW5kIHNvbWUgY2xhc3Nlcy4KCjEwLzMvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtHVUlMRV0gVGhlIC1zY20gaW50ZXJmYWNlIGlzIG5vdyB0aGUgZGVmYXVsdC4gIFRoZSBvbGQgR0ggaW50ZXJmYWNlIGNhbgoJICAgIHN0aWxsIGJlIGVuYWJsZWQgYnkgcGFzc2luZyAtZ2ggdG8gU1dJRy4KCjEwLzIvMjAwNDogbW1hdHVzCgoJICAgIC0gTW9yZSBmaXhlcyBmb3IgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLgoJICAgICAgQXMgYW4gZXh0cmEgYm9udXMsIHdlIGdldCAldGVtcGxhdGUgc3VwcG9ydCBmb3Igc3RhdGljL21lbWJlcnMgY2xhc3MKCSAgICAgIG1ldGhvZHMsIGllLCBub3cgeW91IGNhbiBzYXk6CgoJICAgICAgICBuYW1lc3BhY2Ugc3BhY2UgewogICAgICAgICAgICAgICAgIHN0cnVjdCBBCQkJICAgIAoJICAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkgICAgCgkgICAgICAgICAgIHN0YXRpYyB2b2lkIGZvb1QoWSB5KSB7IH0KCSAgICAgICAgIH07CQoJCX0JCQkgICAgCgkgICAgICAJICAgICAgCQkJICAgIAoJICAgICAgICBzdHJ1Y3QgQgkJCSAgICAKCSAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CQkgICAgCgkgICAgICAgICAgdm9pZCBiYXJUKFkgeSkge30gCgkgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGRvdWJsZT47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8aW50PjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxjaGFyPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGRvdWJsZT47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxpbnQ+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8Y2hhcj47CgoJICAgICAgYW5kIGNhbGwKCgkgICAgICAgIEEuZm9vKDEpCgkJYiA9IEIoKQoJCWIuYmFyKDEpCgkgICAgICAKCSAgICAgIG5vdGUgdGhlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgaW5zaWRlIHRoZSBjbGFzc2VzLAoJICAgICAgYW5kIGhlbmNlLCB0aGUgJXRlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIHRoZSAnbWVtYmVyJwoJICAgICAgbWV0aG9kIG5hbWUsIG5vdCBhIGdsb2JhbCBuYW1lc3BhY2UgbmFtZS4KCjEwLzMxLzIwMDQ6IG1tYXR1cwoJICAgIC0gU29sdmUgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLCBhcyBpbgoKCSAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyOwoJCSBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBzdHJ1Y3QgZm9vOjpCYXIgOiBGb28gewogICAgICAgICAgICAgICB9OwoKCSAgICAgICBzZWUgbmFtZXNwYWNlX2NsYXNzLmkgZm9yIG1vcmUgZXhhbXBsZXMuCgogICAgICAgICAgICAtIEZpeCAldGVtcGxhdGUgZGlyZWN0aXZlIHRvIHByb3Blcmx5IHVzZSBuYW1lc3BhY2VzLAogICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgY2FzZToKCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsKCQkgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CgkJICAgICAgIHN0cnVjdCBQdHIge307CiAgICAgICAgICAgICAgICAgICB9CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CQkgIAoJCSAgICAgICBzdHJ1Y3QgT2JqMSB7fTsKCQkgICAgICAgdHlwZWRlZiBQdHI8T2JqMT4gT2JqMV9wdHI7CiAgCQkgICAgICAgJXRlbXBsYXRlKE9iajFfcHRyKSBQdHI8T2JqMT47IAoJCSAgIH0JCQkJICAKCQkgICAJCQkJICAKCQkgICBuYW1lc3BhY2UgdHdvICAKCQkgICB7CgkJICAgICAgIHN0cnVjdCBPYmoyIHt9OwkKCQkgICAgICAgdHlwZWRlZiBvbmU6OlB0cjxPYmoyPiBPYmoyX3B0cjsKCQkgICAgICAgJXRlbXBsYXRlKE9iajJfcHRyKSBvbmU6OlB0cjxPYmoyPjsKCQkgICB9CgoJICAgICAgdGhpcyBpcyBkb25lIGJ5IHVzaW5nIHRoZSBuYW1lc3BhY2UgbmFtZSAnb25lJyB0byBjcmVhdGUKICAgICAgICAgICAgICBhIG5hbWVzcGFjZSBub2RlIHRvIGVtaXQgdGhlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24sCiAgICAgICAgICAgICAganVzdCBhcyBiZWZvcmUsIGJ1dCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcmVzb2x2ZWQKICAgICAgICAgICAgICBhbmQgcXVhbGlmaWVkIGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZSAoJ29uZScgb3IgJ3R3bycpLgogICAgICAgICAgICAgIFRoaXMgaXMgc2FtZSB3YXkgdGhhdCB0eXBlZGVmIHdvcmtzLiAKCgkgICAgICBUaGlzIHJlc29sdmUgdGhlIHNtYXJ0X3BvaW50ZXJfbmFtZXNwYWNlMi5pIGNhc2UsIGFuZCBhdAogICAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUsIHNldmVyYWwgb3RoZXIgb25lcyB3aGVyZSBiZWZvcmUgc3dpZyB3YXMKICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZQoKCSAgICAgICAgIkNhbid0IGluc3RhbnRpYXRlIHRlbXBsYXRlICd4eCcgaW5zaWRlIG5hbWVzcGFjZSAneXknIgoJICAgICAgCgkgICAgICBlcnJvciBtZXNzYWdlLiBJbiBmYWN0LCB0aGF0IGVycm9yIGRvZXNuJ3QgZXhpc3QKCSAgICAgIGFueW1vcmUuIFlvdSBjYW4gb25seSBnZXQgYW4gZXJyb3IgaWYgeW91IHVzZSBhIGJhZAoJICAgICAgbmFtZXNwYWNlIG5hbWUgb3Igc28uCgoxMC8zMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtydWJ5XSBEaXJlY3RvcnMgZml4ZXM6CgkgICAgICAtIGVudW1zIGFuZCBzdGQ6OnN0cmluZ3MgYXJlIHdvcmtpbmcgbm93IChzZXZlcmFsCgkgICAgICAgIHJlcG9ydHMgaW4gYnVnIHRyYWNrIHN5c3RlbSkKCSAgICAgIC0gYWRkZWQgcGF0Y2ggMTAyNTg2MSBmb3IgZGlyZWN0b3IgKyBleGNlcHRpb25zCgkJCiAgICAgICAgICAgICAgKioqIEF0dGVudGlvbiAqKio6IHJ1Ynkgd2l0aCBkaXJlY3RvcnMgKyBwcm90ZWN0ZWQKICAgICAgICAgICAgICBtZW1iZXJzIHdvcmsgd2l0aCB2ZXJzaW9uIDEuNysuIE9sZGVyIHZlcnNpb25zIHNlZW1zIHRvCiAgICAgICAgICAgICAgaGF2ZSBhIGJyb2tlbiBzaWduYXR1cmUgZm9yJ3JiX3Byb3RlY3QnLgoJCQoJICAgICAgSWYgeW91IG5lZWQgdG8gdXNlIGFuIG9sZCB2ZXJzaW9uLCBsb29rIGF0CgoJICAgICAgaHR0cDovL2V4Y3J1Ynkuc291cmNlZm9yZ2UubmV0L2RvY3MvaHRtbC9ydWJ5X19oYWNrc184aHBwLXNvdXJjZS5odG1sCiAgCSAgICAgIGZvciB3b3JrYXJvdW5kcy4KCSAgICAgIAogICAgICAgICAgICAtIFtydWJ5XSBGaXggbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbSBpbiB0eXBlbWFwIChidWcgMTAzNzI1OSkKCgkgICAgLSBbdGNsXSBGaXggKGVudW1zfGNvbnN0YW50cykgKyBuYW1lc3BhY2Ugb3B0aW9uIAoJICAgICAgICAgICAgKHJlcG9ydGVkIGJ5IGphc29uLm0uc3VycHJpc2VAaW50ZWwuY29tKS4KCiAgICAgICAgICAgIC0gW3BlcmxdIEFkZCBwYXRjaCA5NjIxNjggZm9yIG11bHRpcGxlIGluaGVyZXRhbmNlCgkgICAgCgkgICAgLSBGaXggJ2RlZmluZWQnIGFzIHZhcmlhYmxlIG5hbWUuCgoxMC8yOS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBnbG9iYWwgc2NvcGUgb3BlcmF0b3IgdXNlZCBmb3IgZnJpZW5kIG1ldGhvZHM6CgogICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgZnJpZW5kIHZvaWQgOjpnbG9iYWxzY29wZSgpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjEwLzI4LzIwMDQ6bW1hdHVzCgkgICAgLSBBZGRlZCBtb2R1bGUgYW5kIHN3aWcgb3B0aW9uICJ0ZW1wbGF0ZXJlZHVjZSIgdG8gZm9yY2Ugc3dpZwoJICAgICAgdG8gcmVkdWNlIGFueSB0eXBlIG5lZWRlZCB3aXRoIHRlbXBsYXRlcywgaWUsIGluIHRoZXNlIGNhc2VzCgogICAgICAgICAgICAgICAgJW1vZHVsZSgidGVtcGxhdGVyZWR1Y2UiKSB0ZXN0CgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBBIHsgfTsKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnQ7CgkgICAgICAgICV0ZW1wbGF0ZShBX0ludCkgQTxJbnQ+ICA9PT4gICV0ZW1wbGF0ZShBX0ludCkgQTxpbnQ+CgogICAgICAgICAgICAgICAgdHlwZWRlZiBCKiBCcDsKCSAgICAgICAgJXRlbXBsYXRlKEFfQnApIEE8QnA+ICA9PT4gICV0ZW1wbGF0ZShBX0JwKSBBPEIqPgoKICAgICAgICAgICAgICBzd2lnIHJlZHVjZXMgdGhlIHR5cGVzIEludCBhbmQgQnAgdG8gdGhlaXIgcHJpbWl0aXZlcwogICAgICAgICAgICAgIGludCBhbmQgQiouIFRoaXMgaXMgY2xvc2VyIHRvIHRoZSB1c3VhbCBjb21waWxlcgogICAgICAgICAgICAgIHJlc29sdXRpb24gbWVjaGFuaXNtLCBhbmQgaXQgaXMgcmVhbGx5IG5lZWRlZCBzb21ldGltZXMKICAgICAgICAgICAgICB3aGVuIHlvdSBtaXggdGVtcGxhdGVzICsgdHlwZWRlZnMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgICAgRG9uJ3QgdXNlIGl0IGlmIHlvdSBkb24ndCBoYXZlIGFueSBwcm9ibGVtIGFscmVhZHksCgkgICAgICBzaW5jZSB0aGUgdHlwZSByZWR1Y3Rpb24gY2FuIGludGVyZmVyZSB3aXRoIHNvbWUKCSAgICAgIHVzZXIgdHlwZW1hcHMsIHNwZWNpYWxseSBpZiB5b3UgZGVmaW5lZCBzb21ldGhpbmcgbGlrZQoKCQkgICB0eXBlZGVmIGludCBJbnQ7CgkJICAgJXR5cGVtYXAoaW4pIEludCAuLi47CgogICAgICAgICAgICAgIGluIHRoaXMgY2FzZSwgd2hlbiB5b3UgdXNlIHRoZSAidGVtcGxhdGVyZWR1Y2UiIG9wdGlvbiwKCSAgICAgIHN3aWcgd2lsbCBpZ25vcmUgdGhlIHVzZXIgdHlwZW1hcCwgc2luY2UgdGhlICJ0eXBlZGVmIGludCBJbnQiCgkgICAgICB3aWxsIHRha2UgcHJlY2VkZW5jZSwgYW5kIHRoZSB1c3VhbCAiaW50IiB0eXBlbWFwIHdpbGwgYmUKCSAgICAgIGFwcGxpZWQuIAoKCSAgICAgIE5vdGUgdGhhdCB0aGUgcHJldmlvdXMgY2FzZSBpcyBub3QgY29tbW9uLCBhbmQgc2hvdWxkIGJlCgkgICAgICBhdm9pZGVkLCBpZSwgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSBhIHR5cGVkZWYgYW5kIGEKCSAgICAgIHR5cGVtYXAgYXQgdGhlIHNhbWUgdGltZSwgc3BlY2lhbGx5IGlmIHlvdSBhcmUgZ29pbmcgdG8KCSAgICAgIHVzZSB0ZW1wbGF0ZXMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgIC0gRGlyZWN0b3JzOgoKCSAgICAgICAgdmlydHVhbCBkZXN0cnVjdG9yIGlzIGFsd2F5cyBlbWl0dGVkIG5vdywgdGhpcyBkb2Vzbid0CgkgICAgICAgIGNhdXNlIGFueSBoYXJtLCBhbmQgY291bGQgc29sdmUgc29tZSBuYXN0eSBhbmQKCSAgICAgICAgbXlzdGVyaW91cyBlcnJvcnMsIGxpa2UgdGhlIG9uZSBtZW50aW9uZWQgYnkgU2NvdHQuCgoJCWFsc28gdGhlIGRlc3RydWN0b3IgaXMgbm90IGluLWxpbmVkLCBzbywgdGhhdCBjYW4gc29sdmUKCQlzb21lIG90aGVyIG15c3RlcmlvdXMgZXJyb3JzIHdoZW4gbWl4aW5nIGRpcmVjdG9ycyArCgkJaW1wb3J0cyArIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyArIHNvbWUgc3BlY2lmaWMgY29tcGlsZXJzLgoJCQoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIHR5cGVtYXBzLmkgbGlicmFyeSBmaWxlIHdpdGggSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgYWRkZWQuCgoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXAgZml4ZXMgaW4gc3RkX3N0cmluZy5pIGZyb20gUnVzc2VsbCBLZWl0aC1NYWdlZS4KCjEwLzI1LzIwMDQ6IG1tYXR1cyAKCgkgICAgLSBVc2luZyArIG5hbWVzcGFjZSBpcyB3b3JraW5nIG5vdyAodXNpbmdfbmFtZXNwYWNlLmkpLgoKCSAgICAtIERlcml2ZWQgKyBuZXN0ZWQgY2xhc3NlcyBpcyB3b3JraW5nIG5vdwoJICAgICAgKGRlcml2ZXJfbmVzdGVkLmkpLCBidXQgb2YgY291cnNlLCB3ZSBhcmUgc3RpbGwgd2FpdGluZwoJICAgICAgZm9yIHRoZSBuZXN0ZWQgY2xhc3Mgc3VwcG9ydC4KCSAgICAKCSAgICAtIERpcmVjdG9yczoKCSAgICAgIC0gdW5uYW1lZCBwYXJhbWV0ZXJzIHN1cHBvcnQsCgoJICAgICAgLSBwcm90ZWN0ZWQgY29uc3RydWN0b3Igc3VwcG9ydCAoYXV0b21hdGljIGFuZCB3aXRoCiAgICAgICAgICAgICAgICBkaXJwcm90IG1vZGUpLAoKCSAgICAgIC0gZGV0ZWN0aW9uIG9mIHJlYWxseSBuZWVkZWQgcHJvdGVjdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgKG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycykgbm93IGlzIGRvbmUgYXV0b21hdGljYWxseS4KICAgICAgICAgICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHVzZSB0aGUgJ2RpcnByb3QnIG1vZGUsIHN3aWcgd2lsbAogICAgICAgICAgICAgICAgd3JhcCB3aGF0IGlzIG1pbmltYWxseSBuZWVkZWQgKGFuZCBwcm90ZWN0ZWQpIGZvciB0aGUKICAgICAgICAgICAgICAgIGNvZGUgdG8gY29tcGlsZS4KCQkKCQl3aGF0IGlzIHB1YmxpYywgYXMgdXN1YWwsIGlzIGFsd2F5cyB3cmFwcGVkLCBhbmQgaWYKCQl5b3UgdXNlIHRoZSAnZGlycG9ydCcKCQkKCgkgICAgLSBGaW5hbCBmaXhlcyBmb3IgdGhlIE9TUyB0byBjb21waWxlIHdpdGggU1dJRyAxLjMuMjMgKG15CgkgICAgICB2ZXJ5IHZlcnkgdWdseSBDKysgKyB0ZW1wbGF0ZXMgKyBldmVyeXRoaW5nIG1vdW50ZXJzIHdyYXApLgoKMTAvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1kbGxpbXBvcnQuIFRoaXMgZW5hYmxlcyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgRExMIGZvciB0aGUgRGxsSW1wb3J0IGF0dHJpYnV0ZS4gTm9ybWFsbHkgdGhpcyBuYW1lCiAgICAgICAgICAgIGNvbWVzIGZyb20gdGhlIG1vZHVsZSBuYW1lLCBzbyBub3cgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhpczoKCiAgICAgICAgICAgICAgc3dpZyAtY3NoYXJwIC1kbGxpbXBvcnQgeHl6IGV4YW1wbGUuaQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBmb3IgYWxsIHRoZSB3cmFwcGVkIFBJbnZva2UgbWV0aG9kczoKCiAgICAgICAgICAgICAgW0RsbEltcG9ydCgieHl6IiwgRW50cnlQb2ludD0iLi4uIildCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gLi4uCgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZnJvbSBtYW55IGRpZmZlcmVudCBTV0lHIGludm9jYXRpb25zIGNhbiB0aHVzIGJlIGNvbXBpbGVkCiAgICAgICAgICAgIGludG8gb25lIERMTC4KCiAgICAgICAgICAgIEEgbmV3IHNwZWNpYWwgdmFyaWFibGUgJGRsbGltcG9ydCBjYW4gYWxzbyBiZSB1c2VkIGluIHR5cGVtYXBzLCBwcmFnbWFzLAogICAgICAgICAgICBmZWF0dXJlcyBldGMuIFRoaXMgd2lsbCBnZXQgdHJhbnNsYXRlZCBpbnRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgLWRsbGltcG9ydAogICAgICAgICAgICBpZiBzcGVjaWZpZWQsIG90aGVyd2lzZSB0aGUgbW9kdWxlIG5hbWUuCgoxMC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzEwNDk0OTYgZnJvbSBTY290dCBNaWNoZWwgZml4ZXMgZGlyZWN0b3JzIG1ldGhvZHMgd2l0aCAKICAgICAgICAgICAgZW51bXMgd2hlbiB3cmFwcGVkIHdpdGggdHlwZXNhZmUgb3IgcHJvcGVyIEphdmEgZW51bXMuCgoxMC8yMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgaW4gZGlyZWN0b3IgY29uc3RydWN0b3JzIChQeXRob24sIFJ1YnksIE9jYW1sKS4KCjEwLzIxLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLWNwbHVzY2FzdCcgb3B0aW9uIHRvIGVuYWJsZSB0aGUgJ25ldycKCSAgICAgIEMrKyBjYXN0aW5nIG9wZXJhdG9ycywgc3VjaCBhcyAnc3RhdGljX2Nhc3QnLCBpbnNpZGUgdGhlCgkgICAgICB0eXBlbWFwcy4gQnkgZGVmYXVsdCBzd2lnIHVzZSB0aGUgb2xkIEMgY2FzdCBzdHlsZSwgZXZlbgoJICAgICAgd2hlbiBwYXJzaW5nIEMrKy4KCSAgICAgIAoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5ld192d20nIG9wdGlvbiB0byBlbmFibGUgdGhlIG5ldwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIgbW9kZS4gTm93IHRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAgdGhhdCB0aGUgdHlwZW1hcHMgYXJlIHJlYWxseSBzYWZlIGZvciBhbnkgZnV0dXJlCiAgICAgICAgICAgICAgc29sdXRpb24sIGJ1dCB5b3UgY2FuIHVzZSBpdCBpZiB5b3UgaGF2ZSBhIHZlcnkgc3RyYW5nZQogICAgICAgICAgICAgIGVycm9yIHdpdGggZGVmYXVsdCBjb3NudHJ1Y3RvcnMgbWlzc2luZyArICVhcHBseSArCiAgICAgICAgICAgICAgJXR5cGVtYXAsIGFuZCBpZiBldmVyeXRoaW5nIGVsc2UgZmFpbHMgKHNlZQogICAgICAgICAgICAgIHZhbHV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbHRlcm5hdGl2ZSBhbmQgY3VycmVudAogICAgICAgICAgICAgIHNvbHV0aW9ucykuIElmIHlvdSBhcmUgYSB1c2VyIHRoYXQgZG9uJ3Qga25vdyB3aGF0IGlzCiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgZG9uJ3QgZXZlbiB0cnkgaXQuCgoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5vaCcgb3B0aW9uIHRvIGJlIHVzZWQgd2l0aCBkaXJlY3RvcnMKCSAgICAgIGFuZCB3aGVuIHlvdSBwcmVmZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKCSAgICAgIGRpcmVjdG9yIGhlYWRlciBmaWxlLiBJZiBub3QgdXNlZCwgc3dpZyB3aWxsIHdvcmsgYXMKCSAgICAgIHVzdWFsIGdlbmVyYXRpbmcgYm90aCB0aGUgd3JhcC5jeHggYW5kIHdyYXAuaCBmaWxlcy4gSWYKCSAgICAgIHlvdSB1c2UgaXQsIHN3aWcgd2lsbCBvbmx5IGdlbmVyYXRlIHdyYXAuY3h4LgoKMTAvMjEvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gSWYgeW91IGRlZmluZSBTV0lHX1RZUEVfVEFCTEUgd2hlbiBjb21waWxpbmcgYSB3cmFwcGVyIGZpbGUsCgkgICAgICB0aGUgcnVudGltZSB0eXBlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gdHlwZSB0YWJsZSBuYW1lLgoJICAgICAgVXNpbmcgdGhpcywgeW91IGNhbiBzZXBlcmF0ZSBkaWZmZXJlbnQgbW9kdWxlcyB0byBzaGFyZSB0aGVpcgoJICAgICAgb3duIHR5cGUgc3lzdGVtcy4gIC1EU1dJR19UWVBFX1RBQkxFPU15dGFibGUKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfU1RBVElDX1JVTlRJTUUgdGhlbiB0aGUgdHlwZSBpbmZvcm1hdGlvbgoJICAgICAgd2lsbCBiZSBzdGF0aWMgdG8gdGhpcyB3cmFwcGVyLiAgTm90aGluZyB3aWxsIGJlIHNoYXJlZCB3aXRoIGFueQoJICAgICAgb3RoZXIgbW9kdWxlcwoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19MSU5LX1JVTlRJTUUsIHRoZW4gaW5zdGVhZCBvZiB1c2luZwoJICAgICAgdGhlIG5ldyB3YXkgb2Ygc2hhcmluZyB0eXBlIGluZm9ybWF0aW9uLCB0aGUgd3JhcHBlciB3aWxsIGV4cGVjdAoJICAgICAgdG8gYmUgbGlua2VkIGFnYWluc3QgdGhlIExpYi9saW5rcnVudGltZS5jIGZpbGUuICBBbnkgbW9kdWxlcyBjb21waWxlZAoJICAgICAgd2l0aCBTV0lHX0xJTktfUlVOVElNRSBhbmQgbGlua2VkIGFnYWluc3QgbGlua3J1bnRpbWUuYyB3aWxsIGFsbAoJICAgICAgc2hhcmUgdHlwZSBpbmZvcm1hdGlvbi4KCjEwLzIwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gSW5pdGlhbCBmaXggZm9yIHB5dGhvbi9pbXBvcnQgZXhhbXBsZS4gUGxlYXNlCgkgICAgICB1cGRhdGUgdGhlIE1ha2VmaWxlIChhdXRvY29uZiwgY29uZmlndXJlLCBldGMsIGV4cGVydCksCgkgICAgICBzaW5jZSBub3cgcHJvYmFibHkgaXMgb25seSB3b3JraW5nIHdpdGggZysrLCBpY2MgYW5kIGEKCSAgICAgIGZldyBvdGhlciBjb21waWxlcnMgdGhhdCBoYXZlIHRoZSAtc2hhcmVkIG9wdGlvbi4KCgkgICAgICBXZSBuZWVkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNoYXJlZCBsaWJyYXJpZXMgZm9yIHRoZQoJICAgICAgdmlydHVhbCBkZXN0cnVjdG9ycy4gT2xkIGFuZCB1c3VhbGx5IGZvcmdvdHRlbiBDKysKCSAgICAgIHJlcXVpcmVtZW50LgoJICAgICAgCgkgICAgICBTYW1lIGZpeCBuZWVkIHRvIGJlIHVzZWQgaW4gcGVybCwgSSB0aGluay4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gRml4IGdlbmVyYXRpb24gb2YgaGVhZGVyIGZpbGUgZm9yIGRpcmVjdG9ycywKICAgICAgICAgICAgICBub3cgZGlyZWN0b3JzLnN3ZyBpcyBhbHNvIGluY2x1ZGVkLCBzbywgaXQgY2FuIGJlIHJlYWxseQoJICAgICAgdXNlZCBmcm9tIEMrKywgYW5kIGl0IHNvbHZlcyBzb21lIHByb2JsZW0gd2l0aCBjb21waWxlcgoJICAgICAgdGhhdCByZXF1aXJlIHRoYXQsIGV2ZW4gd2l0aCB0aGUgc2ltcGxlIHN3aWcgaW5jbHVzaW9uLiAgCgogICAgICAgICAgICAtIFtQeXRob25dIFJlb3JkZXJpbmcgdGhlIG1ldGhvZHMgYW5kIG1vdmluZyBzb21lIGJvZGllcwogICAgICAgICAgICAgIG91dHNpZGUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBkdWUgdG8KICAgICAgICAgICAgICBzb21lIGdjYy0yLjk2IGludGVybmFsIGNvbXBpbGVyIGVycm9ycy4gSXQgc2VlbXMgdGhlCiAgICAgICAgICAgICAgUFlUSE9OIGNsYXNzIGlzIGdldHRpbmcgdG9vIGxhcmdlIHRvIGJlZW4gZGVjbGFyZWQgYW5kCiAgICAgICAgICAgICAgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLgoKCSAgICAtIEFkZCB0aGUgLW9oIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG91dHB1dCBoZWFkZXIgZmlsZSBuYW1lCiAgICAgICAgICAgICAgaWYgbmVlZGVkOgoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAtb2ggdGVzdC5ISAoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBtYWlubHkgbmVlZGVkIHdoZW4gdXNpbmcgZGlyZWN0b3JzLCBhbmQgaWYgdGhlCiAgICAgICAgICAgICAgY3VycmVudCBkZWZhdWx0IGhlYWRlciBmaWxlIG5hbWUgaXMgbm90IGdvb2QgZm9yIHlvdSwKICAgICAgICAgICAgICB3aGljaCBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93OgkgICAgICAKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pICAgICAgICAgICAgID0+IHRlc3Rfd3JhcC5oCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgID0+IHRlc3QuaAoKCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIDEpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgZmVhdHVyZSBhZGRlZC4gVGhpcyBmZWF0dXJlIGFsbG93cyBvbmUKICAgICAgICAgICAgICB0byB1c2UgdGhlIGRlZmF1bHQgYXJndW1lbnQgY29kZSBnZW5lcmF0aW9uIHRoYXQgd2FzIHVzZWQgaW4KICAgICAgICAgICAgICBTV0lHLTEuMy4yMiBhbmQgZWFybGllciB2ZXJzaW9ucy4gSXQgcHJvZHVjZXMgbW9yZSBjb21wYWN0IHdyYXBwZXJzCiAgICAgICAgICAgICAgYXMgb25seSBvbmUgd3JhcHBlciBtZXRob2QgaXMgZ2VuZXJhdGVkIGZvciBhbnkgbWV0aG9kIHdpdGggZGVmYXVsdAogICAgICAgICAgICAgIGFyZ3VtZW50cy4gU28gdGhlIGFkdmFudGFnZSBpcyBpdCBnZW5lcmF0ZXMgbGVzcyBjb2RlIGJ1dCBoYXMgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgbGltaXRhdGlvbnMsIGxpa2UgaXQgaXQgZG9lcyBub3Qgd29yayB3aXRoIGFsbCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBjYW5ub3QgYmUgdGFrZW4gYWR2YW50YWdlIG9mIGluIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICAgIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpLiBJdCBpcyBpbXBsZW1lbnRlZCB2aWEgdGhlIHVzdWFsICVmZWF0dXJlIG1lY2hhbmlzbToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIik7CgogICAgICAgICAgICAyKSBLZXl3b3JkIGFyZ3VtZW50cyAoa3dhcmdzKSBhcmUgd29ya2luZyBhZ2FpbiBmb3IgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgaW4gdGhlIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgaXQsIGllLCBQeXRob24gYW5kIFJ1YnkuIFRoZSBuZXcgZGVmYXVsdAogICAgICAgICAgICAgICBhcmd1bWVudCB3cmFwcGluZyBhcHByb2FjaCB1c2luZyBvdmVybG9hZGVkIG1ldGhvZHMgY2Fubm90IHN1cHBvcnQga3dhcmdzCiAgICAgICAgICAgICAgIHNvIHRoZSBjb21wYWN0IGRlZmF1bHQgYXJndW1lbnQgZmVhdHVyZSBpcyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuCiAgICAgICAgICAgICAgIGt3YXJncyBhcmUgc3BlY2lmaWVkLCBieSAlZmVhdHVyZSgia3dhcmdzIikuCgogICAgICAgICAgICAzKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4gd3JhcHBpbmcKICAgICAgICAgICAgICAgQyAobm90IEMrKykgY29kZS4gVGhpcyBpcyB0byBzdXBwb3J0IHRoZSBiaXphcnJlIG5vdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBmb3IgQyBjb2RlLgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zIGluIG5hbWVzcGFjZXMgYWxzbyB3b3JraW5nIG5vdy4KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGluIG5hbWVzcGFjZXMgdG9vLgoKMTAvMTkvMjAwNDogbW1hdHVzCgoJICAgIC0gQWxsb3cgdG8gZGlzYWJsZSB0aGUgbmV3IFN3aWdWYWx1ZVdyYXBwZXIgbWVjaGFuaXNtLAoJICAgICAgaWYgeW91IGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBsYW5ndWFnZSBtYWluLgoKCQkgLyogVHVybiBvbiBzYWZlIHZhbHVlIHdyYXBwZXIgdXNlIG1vZGUgKi8KICAgICAgICAgICAgICAgICBTd2lnX3ZhbHVlX3dyYXBwZXJfbW9kZSgxKTsKCgkgICAgICAKCSAgICAgIE5vdyBpcyBvbmx5IGFjdGl2ZSBpbiBweXRob24uIEFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICBhcmUgdXNpbmcgdGhlIG9sZCByZXNvbHV0aW9uLCBidXQgdGhleSAgY2FuIGFsc28gdXNlIHRoZQoJICAgICAgInZhbHVld3JhcHBlciIvIm5vdmFsdWV3cmFwcGVyIiBmZWF0dXJlcyB0byBmaXggc29tZQoJICAgICAgb2YgdGhlIG9sZCBicm9rZW4gY2FzZXMuIE5vdGUsIGhvd2V2ZXIsICB0aGF0IG5vdCBhbGwgCgkgICAgICB0aGUgYnJva2VuIGNhc2VzIGNhbiBiZSBzb2x2ZWQgaW4gdGhhdCB3YXkuCgoJICAgICAgVGhlIG5ldyBtZWNoYW5pc20gc2VlbXMgdG8gYmUgd29ya2luZyBmaW5lIGluIHBlcmwsIHJ1YnkKCSAgICAgIGFuZCB0Y2wsIGJ1dCBmYWlsaW5nIGluIHNvbWUgdHlwZW1hcHMgaW4gamF2YS4KCgkgICAgICBIZW5jZSwgaXMgdXB0byB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0byB0ZXN0IGl0LCBhbmQKCSAgICAgIGRlY2lkZSB0byBlbmFibGUgaXQgb3Igbm90LgoKCSAgICAgIExvb2sgYXQgdGhlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgZXhhbXBsZXMuCgoJICAgIC0gRml4IG1vcmUgU3dpZ1ZhbHVlV3JhcHBlciBjYXNlcyB3aGVuIHRoZSBuZXcgbWVjaGFuaXNtCgkgICAgICBpcyBhY3RpdmUuIE5vdyBpdCBhbHNvIGNoZWNrIGZvciBsb2NhbCB0eXBlbWFwCgkgICAgICB2YXJpYWJsZXMsIHNlZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFuIGV4YW1wbGUgd2hlbgoJICAgICAgdGhpcyBpcyBuZWVkZWQuIEJ1dCBhZ2FpbiwgdGhpcyBleHRyYSBjaGVja2luZyB3aWxsIG9ubHkKCSAgICAgIGJlIGFjdGl2YXRlZCB3aGVuIHVzaW5nIHRoZSBuZXcgdmFsdWUgd3JhcHBlciBtb2RlLgoKCSAgICAtIFtQeXRob25dIEZpeCB2YXJpYWJsZSB3cmFwcGluZyBvZiBjbGFzc2VzIHdpdGggcHJpdmF0ZQoJICAgICAgYXNzaWduIG9wZXJhdG9ycy4gSXQgc2hvdWxkIGJlIGVhc3kgdG8gZml4IGluIGFsbCB0aGUgCgkgICAgICBvdGhlciBtb2R1bGVzLCBpbnN0ZWFkIG9mIGNoZWNraW5nCgoJICAgICAgICAgaWYgKCFHZXRhdHRyKG4sImltbXV0YWJsZSIpKSAuLi4KCQoJICAgICAgeW91IG5lZWQgdG8gdmVyaWZ5CgoJICAgICAgICAgaWYgKGlzX2Fzc2lnbmFibGUobikpIC4uLgoKCSAgICAgIExvb2sgYXQgdGhlIHByaXZhdGVfYXNzaWduLmkgZm9yIGFuIGV4YW1wbGUuCgoxMC8xOC8yMDA0OiBtbWF0dXMKCSAgICAtICVmZWF0dXJlcyAiZGlyZWN0b3IiLyJub2RpcmVjdG9yIiBub3cgd29yayBhcyBleHBlY3RlZC4KICAgICAgICAgICAgLSBHZW5lcmFsIGZpeGVzIGluICVmZWF0dXJlIHRvIHJlc29sdmUgZnVuY3Rpb24gZGVjbAoJICAgICAgcHJvcGVybHksCgkgICAgICAKCSAgICAgICAgJWZlYXR1cmUoImhlbGxvIikgZm9vKCk7CgkgICAgICAgIGNoYXIgZm9vKCkgLT4gIGYoKSAgICAvLyB3YXMgd29ya2luZwoJICAgICAgICBjaGFyICpmb28oKSAtPiBmKCkucCAgLy8gaXQgd2Fzbid0CiAKCiAgICAgICAgICAgIC0gVGVtcGxhdGUgKyBzcGVjaWFsaXphdGlvbiArIGRlZmF1bHQgdGVtcGxhdGUgYXJncyBub3cgaXMKCSAgICAgIHdvcmtpbmcsIChkb24ndCBjb25mdXNlIHdpdGggdGVtcGxhdGUgKyBkZWZhdWx0IGFyZwoJICAgICAgdmFsdWVzLCB0aGF0IHdhcyBzb2x2ZWQgYmVmb3JlKSwgbm93IHRoaXMgdWdseSBjYXNlIGlzCgkgICAgICB3b3JraW5nOgoKCSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEEgPSBBbGxvYzxUPiA+CgkJc3RydWN0IFZlY3RvcgoJCXsKCQkgICBWZWN0b3IoVCBhKXt9CgkJfTsJCSAgIAoKCQl0ZW1wbGF0ZSA8PgoJCXN0cnVjdCBWZWN0b3I8ZG91YmxlPgoJCXsKCQkgIFZlY3Rvcigpe30KCQkgIGludCBmb28oKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgJXRlbXBsYXRlKFZfYykgVmVjdG9yPGNoYXIsIEFsbG9jPGNoYXI+ID47CgkgICAgICAgICV0ZW1wbGF0ZShWX2kpIFZlY3RvcjxpbnQ+OyAgICAvLyBwaWNrcyBWZWN0b3I8aW50LEFsbG9jPGludD4gPgoJICAgICAgICAldGVtcGxhdGUoVl9kKSBWZWN0b3I8ZG91YmxlPjsgLy8gcGlja3MgdGhlIHNwZWNpYWxpemF0aW9uCgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG5lZWRlZCBmb3IgYXV0b21hdGljIFNUTCBzdXBwb3J0IChsYXRlciB3aWxsCiAgICAgICAgICAgICAgYmUpLgoKCSAgICAtIEZpeCB0aGUgdGVtcGxhdGUgKyB0eXBlZGVmIGVycm9ycyBpbiB0ZXN0LXN1aXRlLCB3aGljaAogICAgICAgICAgICAgIHByb2JhYmx5IHdpbGwgZml4IGFub3RoZXIgZ3JvdXAgb2Ygc3RyYW5nZSB0ZW1wbGF0ZSArCiAgICAgICAgICAgICAgbmFtZXNwYWNlcyArIHR5cGVkZWZzIGVycm9ycy4KCgkgICAgLSAld2FybmZpbHRlciBpcyB3b3JraW5nIGJldHRlciBub3csIHBhcnNlci55IHRyaWVzIHRvIHVzZQoJICAgICAgdGhlbSB3aGVuIG5lZWRlZC4KCgkgICAgLSAqKioqIE5ldyBkZWZhdWx0IHR5cGUgcmVzb2x1dGlvbiBtZXRob2QgKHN0eXBlLmMpICoqKioqIAoKCSAgICAgIEl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgbWl4ZWQgdHlwZXMsIHRoZW4gaXQgZ29lcwoJICAgICAgJ2JhY2t3YXJkJyBmaXJzdCBkZWxldGluZyB0aGUgcXVhbGlmaWVyLCB0aGVuIHRoZSBpbm5lcgoJICAgICAgdHlwZXMsIGZvciBleGFtcGxlOgogICAgCQkgCQkJCQkJCSAgCiAgICAJCSB0eXBlZGVmIEEgKkFwdHI7CQkJCSAgCiAgICAJCSBjb25zdCBBcHRyJjsJCQkJCQkKICAgIAkJIHIucShjb25zdCkuQXB0ciAgICAgICAtPiByLnEoY29uc3QpLnAuU1dJR1RZUEUJCQogICAgCQkgci5xKGNvbnN0KS5wLlNXSUdUWVBFIC0+IHIucC5TV0lHVFlQRQkJCQogICAgCQkgci5wLlNXSUdUWVBFICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBlbnVtIEhlbGxvIHt9OwkJCQkJCQogICAgCQkgY29uc3QgSGVsbG8mIGhpOwkJCQkJCiAgICAJCSByLnEoY29uc3QpLkhlbGxvICAgICAgICAgIC0+IHIucShjb25zdCkuZW51bSBTV0lHVFlQRQkKICAgIAkJIHIucShjb25zdCkuZW51bSBTV0lHVFlQRSAgLT4gci5lbnVtIFNXSUdUWVBFCQkKICAgIAkJIHIuZW51bSBTV0lHVFlQRSAgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGludCBhWzJdWzRdOwkJCQkJCQogICAgCQkgYSgyKS5hKDQpLmludCAgICAgICAgICAgLT4gYShBTlkpLmEoQU5ZKS5TV0lHVFlQRQkKICAgIAkJIGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUgIC0+IGEoQU5ZKS5hKCkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLmEoKS5TV0lHVFlQRSAgICAgLT4gYShBTlkpLnAuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLnAuU1dJR1RZUEUgICAgICAgLT4gYShBTlkpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5TV0lHVFlQRSAgICAgICAgIC0+IGEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKCkuU1dJR1RZUEUgICAgICAgICAgICAtPiBwLlNXSUdUWVBFCQkJCiAgICAJCSBwLlNXSUdUWVBFICAgICAgICAgICAgICAtPiBTV0lHVFlQRSAgICAgICAgICAgICAgICAgICAgCgoJICAgICAgYmVmb3JlIGl0IGFsd2F5cyBzdG9wcyBhZnRlciBmaW5kaW5nIHJlZi9wb2ludGVyL2VudW0vYXJyYXkvZXRjLgoJICAgICAgIAoJICAgICAgTm93LCB0aGVuLCB5b3UgY2FuIGRlZmluZSAodXNlIGFuZCBhcHBseSkgJ2hpZ2hlcicgdHlwZW1hcHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKG91dCkgY2hhciBGSVhTSVpFW0FOWV0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGVudW0gU1dJR1RZUEUmCgkgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRVtBTlldW0FOWV0KCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGNoYXIgKCYpW0FOWV0KCSAgICAgICAKCSAgICAgIEl0IGlzIHBvc3NpYmxlIHdpdGggdGhpcyBjaGFuZ2UgdGhhdCBwcmV2aW91cyB0eXBlbWFwcwoJICAgICAgdGhhdCB3ZXJlIGRlZmluZWQgKGJ1dCBpZ25vcmVkKSwgbm93IHdpbGwgc3RhcnQgdG8gd29yay4KCgkgICAgICBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgY2hlY2sgZm9yIHRoZSAnJXR5cGVtYXAodmFyaW4pIFNXSUdUWVBFW10nLAoJICAgICAgYmVmb3JlIGl0IHdhcyB1c3VhbGx5IG5vdCBkZWZpbmVkIChidXQgY2hhcltdIHdhcyksCgkgICAgICBhbmQgdGhhdCBjYW4gcHJvZHVjZSBzb21lIGluY29uc2lzdGVuY2llcy4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgICBUaGlzIGNoYW5nZSB3YXMgbmVlZGVkIGZvciBTVEwsIHNpbmNlIHN0ZDo6dmVjdG9yPGVudW0gSGVsbG8+IAoJICAgICAgc3RkOjp2ZWN0b3I8QSo+LCBldGMsIHdpbGwgYWx3YXlzIGdlbmVyYXRlIG1ldGhvZHMgdGhhdAoJICAgICAgbWl4IGNvbnN0IHJlZmVyZW5jZXMgd2l0aCB0aGUgdmVjdG9yIHR5cGUuCgoJICAgICAgTm93IHRoYXQgaXMgd29ya2luZywgYWxsIHRoZSBzdGQ6OmNvbnRhaW5lcjxUKj4KCSAgICAgIHNwZWNpYWxpemF0aW9uIHdpbGwgbm90IGJlIG5lZWRlZCBhbnltb3JlLCB3ZWxsLCBpbgoJICAgICAgdGhlb3J5LiAKCgkgICAgICBJbiB0aGUgcHJhY3RpY2UsIGV2ZXJ5dGhpbiBpcyB3b3JraW5nIGFzIGJlZm9yZSB1bnRpbAoJICAgICAgdGhlIHByb3BlciBtaXhlZCB0eXBlcyBhcmUgZGVmaW5lZCBhbmQgdGhlIGxpYnJhcmllcwoJICAgICAgc2ltcGxpZmllZCB0byB1c2UgdGhlbS4KCgkgICAgLSBDaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGV4dGVybiAiamF2YSIvImZvcnRyYW4iLyJldGMiLCAKCSAgICAgIG5vdyBzd2lnIHByb2R1Y2VzIGEgd2FybmluZywgYW5kIHVzZSBleHRlcm4gIkMiIGluc3RlYWQuCgkgICAgICBUaGUgd2FybmluZyBjYW4gYWxzbyBiZSBkaXNhYmxlIHdpdGggdGhlICItdyAzMTMiIGZsYWcuCgkgICAgICAoV0FSTl9QQVJTRV9VTkRFRklORURfRVhURVJOKS4KCgkgICAgLSBTd2lnVmFsdWVXcmFwcGVyIGlzIG5vdyBtb3JlIHNlbGVjdGl2ZSAobGFuZy5jeHgpLgoKICAgICAgICAgICAgW1BlcmwvVGNsXQoJICAgIC0gRml4IHNvbWUgdHlwZW1hcHMgKHBlcmwvdGNsKSB0byB3b3JrIHByb3Blcmx5IHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIuIFRoaXMgd2FzIG5vdCBhIHByb2JsZW0gd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgYnV0IHdpdGggdGhlIHR5cGVtYXBzIHRoYXQgbm93IGFyZQoJICAgICAgc2FmZSB0byB1c2Ugd2l0aCAlYXBwbHkuCgoJICAgIFtQeXRob25dCgogICAgICAgICAgICAtIEZpeCAlY2FsbGJhY2svJXB5dGhvbmNhbGxiYWNrIHdvcmsgbm93IGFzIGJlZm9yZSBhZnRlcgoJICAgICAgdGhlIGRlZiBhcmdzIGNoYW5nZXMuIEFsc28sICVjYWxsYmFjayBub3cgaXMgYW4gYWxpYXMKCSAgICAgIGZvciAlcHl0aG9uY2FsbGJhY2ssIHNvLCB0aGV5IGRvIHRoZSBzYW1lLgoKCSAgICBbUHl0aG9uL1J1YnldCgkgICAgLSAlY2FsbGJhY2sgaXMgbW9yZSB1c2FibGUgYW5kIHVuaWZvcm06CgogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKSBmb28oKTsgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKTsgICAgICAgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygxKSBmb28oKTsgICAgICAgIC8vIG9ubHkgaW4gcHl0aG9uLgoKMTAvMTcvMjAwNDogYXJ0eQoJICAgIFtPQ0FNTF0KCSAgICAtIFR3ZWFrIHRvIGVudW0gdHlwaW5nIGZvciBzb3VuZG5lc3MgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlCgkgICAgICBtb2R1bGVzLgoJICAgIC0gZ2xvYmFsIGZ1bmN0aW9ucyBhcmUgbm93IHVuYW1iaWd1b3VzIGluIG11bHRpcGxlIGxvYWRlZCBtb2R1bGVzLgoJICAgIC0gRml4ZWQgdGVzdCBjYXNlIGNvZGUgdG8gYnVpbGQgbXVsdGltb2R1bGUgdGVzdCBjYXNlcyBjb3JyZWN0bHkuCgkgICAgLSBUaGVyZSBpcyBubyB3YXkgdG8gc2hhcmUgb3ZlcmxvYWQgcmVzb2x1dGlvbiBhY3Jvc3MgbW9kdWxlcwoJICAgICAgYmVjYXVzZSBvZiBzb3VuZG5lc3MgaXNzdWVzLiAgSWYgdGhlIHVzZXIgd2FudHMgdG8gY2FsbCBzb21lCgkgICAgICBmdW5jdGlvbiBmb28gZnJvbSBhbiBhcmJpdHJhcnkgbW9kdWxlIGJhciwgdGhleSB3aWxsIGhhdmUgdG8KCSAgICAgIHVzZSBCYXIuX2ZvbyB0byBjYWxsIGl0IGNvcnJlY3RseS4gIExhdGVyIEkgd2lsbCBmaXggdGhlIAoJICAgICAgY2FtbHA0IG1vZHVsZSB0byBkbyBzb21ldGhpbmcgY2xldmVyIGluIHRoaXMgY2FzZS4gIAogICAgICAgICAgICAtIFByb21pZGVkIHBlcmZvcm1hbmNlIG92ZXJoYXVsIG9mIGNsYXNzIG1lY2hhbmlzbS4KCSAgICAtIFJlbW92ZWQgc3ltYm9sIGhhY2sgZm9yIG9jYW1sLTMuMDcgYW5kIGJlbG93IHdoaWNoIGlzIG5vdCBuZWVkZWQKCSAgICAgIGZvciBvY2FtbC0zLjA4IGFuZCBhYm92ZS4KCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ0hJQ0tFTl0KCSAgICAtIENvbXBsZXRseSBjaGFuZ2UgaG93IGNoaWNrZW4uY3h4IGhhbmRsZXMgQ0xPUyBhbmQgZ2VuZXJpYyBjb2RlLgoJICAgICAgY2hpY2tlbiBubyBsb25nZXIgZXhwb3J0cyAtY2xvcy5zY20gYW5kIC1nZW5lcmljLnNjbS4gIFRoZSBjbG9zCgkgICAgICBjb2RlIGlzIGV4cG9ydGVkIGRpcmVjdGx5IGludG8gdGhlIG1vZHVsZS5zY20gZmlsZSBpZiAtcHJveHkgaXMgcGFzc2VkLgoJICAgIC0gVGhlIGNvZGUgbm93IGFsd2F5cyBleHBvcnRzIGEgdW5pdC4gIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUgaXMgbm93CgkgICAgICBtYWpvcmx5IGJyb2tlbiwgYW5kIG5lZWRzIHRvIGJlIGZpeGVkLgoJICAgIC0gQ0xPUyBub3cgZ2VuZXJhdGVzIHZpcnR1YWwgc2xvdHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgc2ltaWxhciB0byBob3cKCSAgICAgIEdPT1BTIHN1cHBvcnQgd29ya3MgaW4gdGhlIGd1aWxlIG1vZHVsZS4KCSAgICAtIGNoaWNrZW4gbm8gbG9uZ2VyIHByZWZpeGVzIHN5bWJvbHMgYnkgdGhlIG1vZHVsZSBuYW1lLCBhbmQgbm8gbG9uZ2VyCgkgICAgICBmb3JjZXMgYWxsIG5hbWVzIHRvIGxvd2VyIGNhc2UuICBJdCBub3cgaGFzIC11c2VjbGFzc3ByZWZpeCBhbmQgLWNsb3NwcmVmaXgKCSAgICAgIHNpbWlsYXIgdG8gaG93IGd1aWxlIGhhbmRsZXMgR09PUFMgbmFtZXMuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgd29ya2luZyB3aXRoIG5ldyBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHdyYXBwaW5nIGFwcHJvYWNoLiBUaGUgbmV3IGFwcHJvYWNoIG5vIGxvbmdlciBmYWlscyB3aXRoIHRoZSBmb2xsb3dpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudCBwYXR0ZXJuIChwcmV2aW91c2x5IGZhaWxlZCB3aXRoIHNvbWUgcHJpbWl0aXZlIHR5cGVzLCBsaWtlIAogICAgICAgICAgICB1bnNpZ25lZCBwcmltaXRpdmUgdHlwZXMpOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZm9vKGNvbnN0IFQmIHUgPSBUKCkpOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzx1bnNpZ25lZCBpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWxpZXMgb24gdGhlIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyBzdXBwb3J0IGp1c3QgYWRkZWQsIHNvIGFsbAogICAgICAgICAgICB0aGUgY29tYmluYXRpb25zIG9mIG92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlIHBhcmFtZXRlcnMgYW5kIG5vcm1hbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgb3ZlcmxvYWRpbmcgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgd29ya3MuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgbGFyZ2UgcmFuZ2Ugb2YgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHRoYXQgQysrCiAgICAgICAgICAgIHN1cHBvcnRzLgoKICAgICAgICAgICAgLSBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQsIGNvbnN0IFQgJnIpOwoKICAgICAgICAgICAgLSBGaXhlcyB3aGVyZSB0aGUgdGVtcGxhdGVkIHR5cGUgaXMgbm90IHVzZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHh5eigpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCB4eXo8ZG91YmxlPigpOwoKICAgICAgICAgICAgLSBGaXhlcyBmb3Igb3ZlcmxvYWRpbmcgb2YgcGxhaW4gZnVuY3Rpb25zIGJ5IGEgdGVtcGxhdGVkIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKCiAgICAgICAgICAgIC0gT3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGVkIHBhcmFtZXRlcnMgZml4ZWQ6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZm9vKFQgdCkge30KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiB2b2lkIGZvbyhUIHQsIFUgdSkge30KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPGRvdWJsZSwgZG91YmxlPjsKCiAgICAgICAgICAgIC0gQWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYWxzbyB3b3JraW5nIGluY2x1ZGluZyBzcGVjaWFsaXphdGlvbnMsIGVnOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjPGRvdWJsZT4oZG91YmxlIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmMoaW50IHQpOwoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVtb3ZlIHRoZSBhYmlsaXR5IHRvIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24gYnkgdXNpbmcgYyBsaW5raW5nLgogICAgICAgICAgICAgIEFsbCB0eXBlIHNoYXJpbmcgaGFwcGVucyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgICAgICArIFJlbW92ZSBTV0lHX05PSU1QT1JULCBTV0lHX1JVTlRJTUUsIGFuZCByZWxhdGVkIGRlZmluZXMuCiAgICAgICAgICAgICAgICArIERlcHJlY2lhdGUgLXJ1bnRpbWUsIC1ub3J1bnRpbWUgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRlc3Qtc3VpdGUgY29tbW9uLm1rIHRvIGNvcnJlY3RseSBidWlsZCBtdWx0aWNwcHRlc3QKICAgICAgICAgICAgICAgICsgUmVtb3ZlIHJlZmVyZW5jZSB0byBwcmVjb21tb24uc3dnCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0aGUgZ3VpbGVfZ2ggaW50ZXJmYWNlIHRvIHNoYXJlIGRhdGEgYnkgYSBnbG9iYWwgdmFyIGluc3RlYWQKICAgICAgICAgICAgICAgICAgb2YgYyBsaW5rYWdlLgoKICAgICAgICAgICAgLSBSZW1vdmUgQWR2YW5jZWQuaHRtbCwgc2luY2UgZXZlcnl0aGluZyBpbiBpdCBpcyBub3cgb2Jzb2xldGUKCjEwLzA5LzIwMDQ6IG1tYXR1cwoJICAgIC0gU3BsaXQgdGhlIHB5dGhvbiBzdGQvU1RMIEMrKyBsaWJyYXJ5IGZpbGVzLCBub3cKCSAgICAgIGFsbCB0aGUgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgZGVmaW5pdGlvbnMgYXJlIHVuZGVyCgkgICAgICB0aGUgZGlyZWN0b3J5CgkgICAgICAKCQlMaWIvc3RkCgoJICAgICAgYW5kIGhlbmNlLCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgLSBBZGQgbW9yZSBkb2N1bWVudGF0aW9uIHRvIHRoZSBQeXRob24gU1RMLCBhbmQKCSAgICAgIGNsZWFuIHVubmVjZXNzYXJ5IGNvZGUuCgoJICAgIC0gQWRkIGluaXRpYWwgQzk5IGNvbXBsZXggc3VwcG9ydCwgYW5kIHNvbWUgZml4ZXMKCSAgICAgIGZvciBsb25nIGRvdWJsZS4KCjEwLzA4LzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHRoZSBTd2lnVmFsdWVXcmFwcGVyIGZvciBvcGFxdWUgdHlwZXMsIG5vdyBpdCBpcyAKCSAgICAgIGFwcGxpZWQgZm9yIG9wYXF1ZSB0ZW1wbGF0ZXMgYW5kIGNsYXNzZXMsIGZvciB3aGljaCB3ZQoJICAgICAgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBvciBub3QgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBpZQoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQShpbnQpOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICBTdGlsbCwgaWYgeW91IGtub3cgdGhhdCB5b3UgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBhbmQgZm9yIHNvbWUgdmVyeSB2ZXJ5IHBhcnRpY3VsYXIgcmVhc29uCiAgICAgICAgICAgICAgeW91IHdhbnQgdG8gYXZvaWQgdGhlIFN3aWdWYWx1ZVdyYXBwZXIsIGFuZCB5b3UgZG9uJ3QKICAgICAgICAgICAgICB3YW50IG9yIGNhbid0IGV4cG9zZSB0aGUgY2xhc3MgdG8gc3dpZywgbm93IHlvdSBjYW4KICAgICAgICAgICAgICBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdmFsdWV3cmFwcGVyIikgQTsgICAgCiAgICAgICAgICAgICAgICAgY2xhc3MgQTsKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgb3IgdGhlIG90aGVyIHdheSBhcm91bmQsIGlmIHRoZSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGJ1dCB5b3Ugd2FudCB0byB1c2UgdGhlIHZhbHVlIHdyYXBwZXIsIHlvdQogICAgICAgICAgICAgIGNhbiBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoInZhbHVld3JhcHBlciIpIEE7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoKTsKCQkgICAuLi4uCiAgICAgICAgICAgICAgICAgfTsgICAKICAgICAgCgkgICAgLSBGaXggZm9yIGNoYXIgPiAxMjgsIGllCgogICAgICAgICAgICAgICAgY29uc3QgY2hhciB0aWxkZV9hID0gJ1wzNDEnOwoKICAgICAgICAgICAgLSBBZGQgcGF0Y2ggMTA0MTg1OCBmb3IgJGxleHR5cGUsIHdoaWNoIGNhcnJpZXMgdGhlIAogICAgICAgICAgICAgIGxpdGVyYWwgdHlwZSBvZiBhIHN5bWJvbC4gU2VlIGxleHR5cGUuaSBpbiB0aGUKICAgICAgICAgICAgICB0ZXN0LXN1aXRlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKCjEwLzA3LzIwMDQ6IHdzZnVsdG9uCgkgICAge1J1YnksIEphdmFdIEZpeCBkaXJlY3RvciArICdlbXB0eScgdGhyb3dzCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgQSgpIHRocm93KCk7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgICAgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgoKMTAvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtUQ0xdCiAgICAgICAgICAgIC0gRml4IGJ1ZyByZXBvcnRlZCBieSBXaWxsaWFtIEEuIEhvZmZtYW4gcHJvcGFnYXRpbmcgY2xpZW50ZGF0YQogICAgICAgICAgICBiZXR3ZWVuIG1vZHVsZXMuICBBZGRlZCBjbGllbnRkYXRhX3Byb3AubXVsdGljcHB0ZXN0IHRvIGNoZWNrIGZvcgogICAgICAgICAgICB0aGlzIGJ1Zy4gIFRoZSBmaXggaW52b2x2ZWQgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgogICAgICAgICAgICAgICAgKyBTd2lnVHlwZV9jbGllbnRkYXRhX2NvbGxlY3QgZG9lcyBub3QgbmVlZCB0byBjaGVjawogICAgICAgICAgICAgICAgdHlwZXMgaW4gcl9yZXNvbHZlZCBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBwcm9wYWdhdGUgY2xpZW50ZGF0YQogICAgICAgICAgICAgICAgdG8gdHlwZWRlZmVkIGNsYXNzZXMsIGFuZCByX21hbmdsZWQgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHR5cGVkZWZzLgoKICAgICAgICAgICAgICAgICsgU1dJR19UeXBlUmVnaXN0ZXIgbm93IGNvcGllcyB0aGUgY2xpZW50ZGF0YSBmaWVsZCBjb3JyZWN0bHkKCiAgICAgICAgICAgICAgICArIE1vdmUgU1dJR19HdWlsZV9Qcm9wYWdhdGVDbGllbnREYXRhIGZ1bmN0aW9uIGZyb20gZ3VpbGUgbW9kdWxlCiAgICAgICAgICAgICAgICBpbnRvIGNvbW1vbi5zd2csIGJlY2F1c2Ugd2UgbmVlZCB0byBjYWxsIGl0IGZyb20gYm90aCBndWlsZSBhbmQgdGNsLgoKICAgICAgICAgICAgICAgICsgQWRkIGJhc2VfbmFtZXMgdG8gc3dpZ19jbGFzcyB0byBkZWxheSB0aGUgbG9va3VwIG9mIGJhc2VzLiAgU1dJRwogICAgICAgICAgICAgICAgbm93IGV4cG9ydHMgdGhlIGJhc2UgbmFtZXMgYW5kIG9ubHkgd2hlbiB0aGUgYmFzZSBzd2lnX2NsYXNzIGlzCiAgICAgICAgICAgICAgICBuZWVkZWQgaXMgU1dJR19UeXBlUXVlcnkobmFtZSktPmNsaWVudGRhdGEgbG9va2VkIHVwLgoKICAgICAgICAgICAgLSBjb252ZXJzaW9uX25zX3RlbXBsYXRlIHRlc3RzdWl0ZSB0ZXN0IHdhcyBmYWlsaW5nIGJlY2F1c2UKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZWQgY29uc3RydWN0b3IgZnVuY3Rpb24gd2FzIG5vdCBjYWxjdWxhdGVkCiAgICAgICAgICAgIGNvcnJlY3RseSBmb3Igc3RydWN0cy4gIEZpeGVkLgoKMTAvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIHVzZWQgaW4gZGlyZWN0b3JzIC0gaW4gdmlydHVhbAogICAgICAgICAgICBtZXRob2RzIGFuZCBkaXJlY3RvciBjb25zdHJ1Y3RvcnMuCgoxMC8wNi8yMDA0OiBtbWF0dXMKCSAgICBGaXggdGhlIF9fY3BsdXNwbHVzIG1hY3JvLCBhbmQgYnVnIDEwNDExNzAuCgkgICAgTm93IGl0IGlzIHdvcmtpbmcgYXMgc3VwcG9zZWQsIGllLCB5b3UgY2FuIHNhZmVseSB1c2UKCgkgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKCSAgICAgIC4uLgoJICAgIAoJICAgIGFsbCBvdmVyIHN3aWcsIGluY2x1ZGluZyBpbnNpZGUgJWRlZmluZXMgYW5kICV7ICV9IGJvZGllcy4KCgkgICAgCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlIG9sZCB0cmljayBvZiB1c2luZwoKCSAgICAgICNpZiBfX2NwbHVzcGx1cwoKCSAgICBkb2Vzbid0IHdvcmsgYW55IG1vcmUuIFNvLCBpZiB5b3UgaGF2ZSB5b3VyIG93biB0eXBlbWFwcwoJICAgIHVzaW5nIHRoYXQgc3ludGF4LCB5b3Ugd2lsbCBuZWVkIHRvIG1pZ3JhdGUgdGhlbSB0byB1c2UKCSAgICAiI2lmZGVmIF9fY3BsdXNwbHVzIi4KCjEwLzA1LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlb3JnYW5pemUgaG93IHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYW5kIHNoYXJlZAoJICAgIGJldHdlZW4gbW9kdWxlcy4gIEZvciBjaGlja2VuIGFuZCBtenNjaGVtZSwgSSByZW1vdmVkCgkgICAgdGhlIGFiaWxpdHkgdG8gdXNlIHJ1bnRpbWUgbGlicmFyaWVzLCB3aGlsZSBwZXJsLCB0Y2wsIHB5dGhvbiwgYW5kCgkgICAgcnVieSBkZWZhdWx0IHRvIHVzaW5nIHRoZSBuZXcgbWV0aG9kIGJ1dCBjYW4gZ28gYmFjayB0byB0aGUgb2xkCgkgICAgbWV0aG9kIGJ5IGRlY2xhcmluZyBTV0lHX0FMTE9XX1JVTlRJTUUuCgoJICAgIC0gbGluZSA1ODIgaW4gbXpzY2hlbWUuY3h4IHdhcyBnZW5lcmF0aW5nIGEgc2VnZmF1bHQgb24gCgkgICAgaW1wb3J0cy5tdWx0aWNwcHRlc3QsIHNvIEkgZml4ZWQgaXQuCgoxMC8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgJWV4dGVuZCBhbmQgb3ZlcmxvYWRlZCBzdGF0aWMgbWV0aG9kcyB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzLgoKMTAvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBbcHl0aG9uXSBGaXggZGlyZWN0b3IgKyBtZXRob2Qgd2l0aCAnZW1wdHknIHRocm93LCBpZQoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgkJICAgIAoJICAgICAgb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBhbHNvIGVhc3kgdG8gZml4LCBsb29rIGZvcgoJICAgICAgR2V0YXR0cihuLCJ0aHJvdyIpIGluIHB5dGhvbi5jeHguCgoJICAgIC0gRml4IGRpcmVjdG9yICsgZGVzdHJ1Y3RvciB3aXRoICdlbXB0eScgdGhyb3cKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgfTsKCgkgICAgLSBOb3cgU1dJR19GRUFUVVJFUyBwYXJzZSBhbGwgYW5kIHRoZSBzYW1lICBvcHRpb25zIHlvdQogICAgICAgICAgICAgIGNhbiBwYXNzIHRvIHN3aWcgaW4gdGhlIGNvbW1hbmQgbGluZS4KCSAgICAgIAoJICAgIC0gTmV3IGNvbW1hbmQgbGluZSBmbGFnOiAtZmVhdHVyZXMgPGxpc3Q+LCBhcyBpbgoKCSAgICAgICAgc3dpZyAtZmVhdHVyZXMgYXV0b2RvYz0zLGRpcmVjdG9yCgoJICAgICAgaWUsIGFueSBnbG9iYWwgZmVhdHVyZSBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKCSAgICAgIGNvbW1hbmQgbGluZS4gVGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCB1c2VycwoJICAgICAgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuCgoxMC8wNC8yMDA0OiBtbWF0dXMKCSAgICAtIFByb3Blcmx5IHF1YWxpZnkgdHlwZSBpbiBzeW50YXggYXMgJ2xvbmcoMiknIG9yICdGb28oKScsCgkgICAgICB0aGlzIHNvbHZlIG9sZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmdzLCBhbmQgcHJvYmFibHkKCSAgICAgIG90aGVyIHByb2JsZW1zIGFyb3VuZC4gSG93ZXZlciwgdGhlIGRlZmF1bHQgYXJnIHByb2JsZW0KCSAgICAgIHdhcyBhbHNvIGFscmVhZHkgc29sdmVkIGJ5IFdpbGxpYW0gKHNlZSBiZWxsb3cpLgoKCSAgICAtIEZpeCBmZWF0dXJlX3NldCBhbmQgZmVhdHVyZV9nZXQgbWV0aG9kcy4gQmVmb3JlCgkgICAgICB0aGV5IGxvb2sgZnJvbSBwYXJ0aWN1bGFyIHRvIGdlbmVyYWwgYW5kIGtlZXAgdGhlIGZpcnN0CgkgICAgICBmZWF0dXJlIGZvdW5kLiBUaGlzIGRpZG4ndCB3b3JrIHdlbGwgd2l0aCB0ZW1wbGF0ZXMuCgkgICAgICBOb3cgdGhlIG1ldGhvZHMgbG9vayBmcm9tIGdlbmVyYWwgdG8gcGFydGljdWxhciwgYW5kCgkgICAgICBvdmVycmlkZSBhbnkgZm91bmQgZmVhdHVyZS4KCiAgICAgICAgICAgIC0gUHJldmlvdXNseSBhIGZlYXR1cmUgY291bGQgbm90IGJlIGFwcGxpZWQgdG8gY29uc3RydWN0b3JzCiAgICAgICAgICAgICAgb3IgZGVzdHJ1Y3RvcnMgdGhhdCB3ZXJlbid0IGV4cGxpY2l0bHkgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgogICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSBGb28oKSAiLi4uIgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIikgfkZvbygpICIuLi4iCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAvLyBpbXBsaWNpdCBGb28oKSBhbmQgfkZvbygpCiAgICAgICAgICAgICAgICB9OwoKCSAgICAtIEZpeCBtaXNzaW5nIGZlYXR1cmVzIGZvciBkZWZhdWx0IGNvbnN0L2Rlc3QsIGJ5IHJlYWxseQoJICAgICAgJ2NyZWF0aW5nJyB0aGUgbWV0aG9kcyBhbmQgYXBwbHlpbmcgdGhlIGZlYXR1cmVzLgoKCSAgICAtIEZpeCByZXR1cm5fY29uc3RfdmFsdWUuaSBjYXNlIGJ5IGFkZGluZyBTd2lnVmFsdWVXcmFwcGVyPGNvbnN0IFQ+CgkgICAgICBzcGVjaWFsaXphdGlvbi4KCgkgICAgLSBGaXggJWV4dGVuZCArIG92ZXJsb2FkLCBpbmNsdWRpbmcgb3ZlcmxvYWRpbmcgYWN0dWFsCiAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kcy4gCgoJICAgIC0gQWRkaW5nIG1vcmUgY2FzZXMgaW4gcmVsYXRlZCBmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZS4gIAoKMTAvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgd2F5IGRlZmF1bHQgYXJndW1lbnRzIGFyZSB3cmFwcGVkLiBQcmV2aW91c2x5IGEgc2luZ2xlCiAgICAgICAgICAgIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBlYWNoIG1ldGhvZCB0aGF0IGhhZCBkZWZhdWx0IGFyZ3VtZW50cy4gSWYKICAgICAgICAgICAgYSBtZXRob2QgaGFkIDUgYXJndW1lbnRzLCBzYXksIG9mIHdoaWNoIDEgaGFkIGEgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB0aGVuIHRoZSBjYWxsIHRvIHRoZSB3cmFwcGVkIG1ldGhvZCB3b3VsZCBwYXNzIDUgYXJndW1lbnRzLiBUaGUgZGVmYXVsdAogICAgICAgICAgICB2YWx1ZSB3YXMgY29waWVkIGludG8gdGhlIHdyYXBwZXIgbWV0aG9kIGFuZCB1c2VkIGlmIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgcGFzc2VkIGp1c3QgNCBhcmd1bWVudHMuIEhvd2V2ZXIsIHRoaXMgd2FzIGZsYXdlZCBhcyB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudCBzb21ldGltZXMgZG9lcyBub3QgaGF2ZSBnbG9iYWwgYWNjZXNzLCBmb3IgZXhhbXBsZQogICAgICAgICAgICBTV0lHIHdvdWxkIGdlbmVyYXRlIGNvZGUgdGhhdCBjb3VsZG4ndCBjb21waWxlIHdoZW4gd3JhcHBpbmc6CgogICAgICAgICAgICAgIGNsYXNzIFRyaWNreSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCA9IHByaXZhdGV2YWx1ZSk7CiAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgdmFsID0gVHJpY2t5OjpnZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGdldERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGVudW0geyBwcml2YXRldmFsdWUgPSAyMDAgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQWxzbyBidWdzIGluIHJlc29sdmluZyBzeW1ib2xzIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgKHByb2JhYmx5IGZpeGFibGUgdGhvdWdoKToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEtsYXNzIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBLbGFzcyBjb25zdHJ1Y3RvcmNhbGwoY29uc3QgS2xhc3MmIGsgPSBLbGFzcygpKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgYXBwcm9hY2ggYWxzbyBkb2VzIG5vdCB3b3JrIGZvciBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpCiAgICAgICAgICAgIGFzIHRoZXNlIGxhbmd1YWdlcyBkbyBub3QgYWxsb3cgbWV0aG9kcyB0byBoYXZlIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCiAgICAgICAgICAgIEFsdGhvdWdoIEMjIGhhcyBhIG1lY2hhbmlzbSB0byBwYXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGV5CiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYXJlIG1vcmUgbGlrZSB2YXJhcmdzLgoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBzb2x2ZXMgdGhlIGFib3ZlIHByb2JsZW1zIGFuZCB3cmFwcyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZC4gU28gU1dJRyB3aWxsIG5vdyB0cmVhdAoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYXMgaWYgaXQgaGFkIHBhcnNlZDoKCiAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICB2b2lkIGZvbygpOwoKICAgICAgICAgICAgVGhlIGNvZGUgZ2VuZXJhdGVkIGlzIHRoZW4gZXhhY3RseSB0aGUgc2FtZSBhcyBpZiBTV0lHIGhhZCBwYXJzZWQgdGhlIHR3bwogICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGNvdW50IHRoZSBhcmd1bWVudHMgcGFzc2VkIGFuZCBjYWxsCiAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QsIGp1c3QgbGlrZSBvdmVybG9hZGVkIG1ldGhvZHMuIEMjIGFuZCBKYXZhIGFyZSBub3cgYWJsZQogICAgICAgICAgICB0byBwcm9wZXJseSB3cmFwIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBieSBnZW5lcmF0aW5nIGV4dHJhIG1ldGhvZHMsCiAgICAgICAgICAgIGFnYWluIGFzIGlmIHRoZSBtZXRob2Qgd2FzIG92ZXJsb2FkZWQsIHNvIGZvcjoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHM9ImhlbGxvIiwgZG91YmxlIGQ9MTAuMCwgaW50IGk9MCk7CgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByb3h5IG1ldGhvZHMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkLCBpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcyk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggY29tZXMgd2l0aCBhIGNvdXBsZSBvZiBtaW5vciBrbm9jayBvbiBlZmZlY3RzLgoKICAgICAgICAgICAgMSkgU1dJRyBzdXBwb3J0IGZvciBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgQyAobm90IEMrKykgY29kZSBubyBsb25nZXIgd29ya3MuCiAgICAgICAgICAgIFByZXZpb3VzbHkgeW91IGNvdWxkIGhhdmUgdGhpcyBpbnRlcmZhY2U6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlIHdyYXBwZWQgbWV0aG9kIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIHBhc3Mgbm8gYXJndW1lbnRzCiAgICAgICAgICAgIHdoZXJldXBvbiB0aGUgZGVmYXVsdCBvZiAwIHdhcyB1c2VkLiBZb3UgY2FuIGdldCB0aGUgc2FtZSBiZWhhdmlvdXIgZm9yIEMKICAgICAgICAgICAgY29kZSBieSB1c2luZyB0aGUgImRlZmF1bHQiIHR5cGVtYXA6CgogICAgICAgICAgICAgICV0eXBlbWFwKGRlZmF1bHQpIGludCB2YWwgIiQxID0gMDsiOwogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKCiAgICAgICAgICAgIG9yIHlvdSBjb3VsZCBvZiBjb3Vyc2UgY29tcGlsZSB5b3VyIGNvZGUgYXMgQysrIGlmIHlvdSB3YW50IEMrKyBmZWF0dXJlcyA6KSA6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBBIGNvdXBsZSBvZiBTV0lHJ3MgbGlicmFyaWVzIHVzZWQgdGhpcyBDIGV4dGVuc2lvbiBhbmQgdGhlc2UgaGF2ZSBiZWVuIG1vZGlmaWVkCiAgICAgICAgICAgIHRvIHVzZSB0aGUgImRlZmF1bHQiIHR5cGVtYXAuIFRoZSAiZGVmYXVsdCIgdHlwZW1hcCBpcyB0aHVzIHVuY2hhbmdlZCAoYW5kIHN0aWxsCiAgICAgICAgICAgIGlzIG5vdCBhbmQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSBDIyBhbmQgSmF2YSwgYW5kIGlzIGxpa2VseSB0byByZW1haW4gc28pLgoKCiAgICAgICAgICAgIDIpIEFsbCBmZWF0dXJlcyAoJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUgZXRjKSBubyBsb25nZXIgd29yayBhcyBpZiB0aGUgbWV0aG9kCiAgICAgICAgICAgIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaXMganVzdCBvbmUgbWV0aG9kLiBGb3IgZXhhbXBsZSwgcHJldmlvdXNseQoKICAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwoKICAgICAgICAgICAgd291bGQgaGF2ZSBpZ25vcmVkIHRoZSBtZXRob2QgY29tcGxldGVseS4gTm93IGl0IHdpbGwgb25seSBpZ25vcmUgZm9vKGludCkgYnV0CiAgICAgICAgICAgIG5vdCB0aGUgZXh0cmEgZm9vKCkgbWV0aG9kLiBJbnN0ZWFkIHVzZToKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb287CgogICAgICAgICAgICB0byBpZ25vcmUgdGhlbSBhbGwuIG9yCgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oKTsKCiAgICAgICAgICAgIFRoaXMgb2YgY291cnNlIGFsbG93cyBvbmUgdG8gZmluZSB0dW5lIHRoZSB3cmFwcGluZywgZm9yIGV4YW1wbGUgb25lIGNvdWxkIHVzZToKCiAgICAgICAgICAgICAgJXJlbmFtZShmb29pbnQpIGZvbyhpbnQpOwogICAgICAgICAgICAgICVyZW5hbWUoZm9vZGVmYXVsdHMpIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGVtIGZyb20gYW55IGxhbmd1YWdlIGxpa2Ugc286CgogICAgICAgICAgICAgIGZvb2ludCgyMDApCiAgICAgICAgICAgICAgZm9vZGVmYXVsdHMoKQoKICAgICAgICAgICAgb3IgZm9yIGV4YW1wbGUgaWdub3JlIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZCwgc28gdGhlIGRlZmF1bHRzIGNhbm5vdCBiZSB1c2VkOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8yLzIwMDQ6IG1tYXR1cwoJICAgW1B5dGhvbl0KCSAgIC0gTW9yZSBjbGVhbmluZyB1cCBhbmQgdW5pZm9ybWF0aW9uIG9uIHRoZSBQeXRob24gTGliCgoJICAgLSBBZGRlZCBSb2JpbidzIGRvY3N0cmluZyBwYXRjaCwgcGx1cyBzb21lIGZpeGVzLCBwbHVzCgkgICAgIHNvbWUgZXh0ZW5zaW9ucywgc2VlIGF1dG9kb2MuaSBleGFtcGxlIGluIHRoZSB0ZXN0LXN1aXRlLAoJICAgICBhbmQgdHJ5IHVzaW5nICVmZWF0dXJlKCJhdXRvZG9jIiwiZXh0ZW5kZWQiKS4KCSAgICAKCSAgICAgVGhpcyBwYXRjaCBpcyBub3QgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgdGhlCgkgICAgIGRvY3VtZW50YXRpb24gcHJvYmxlbSwganVzdCBlbm91Z2ggdG8gaW5mb3JtIHB5dGhvbiBhYm91dAoJICAgICB0aGUgcGFyYW1ldGVyIGxpc3QuCgoJICAgICBUaGUgZXhwZWN0ZWQgc3dpZyBkb2N1bWVudGF0aW9uIHN1cHBvcnQgaXMgZmFyIGZhciBhd2F5IHlldC4KCSAgICAgCgoxMC8xLzIwMDQ6IG1tYXR1cwoJICAgLSBGaXggdGhlICVjYWxsYmFjayBmZWF0dXJlIChvbmx5IHVzZWQgaW4gcnVieSBhbmQgcHl0aG9uIGV4YW1wbGVzLAoJICAgICBieSBub3csIGJ1dCBpdCBzaG91bGQgYmUgZ2VuZXJpYyksIG5vdyBtZW1iZXIgY2FsbGJhY2tzCgkgICAgIGFyZSB3b3JraW5nIGFnYWluCgkgICAgIAoJICAgLSBGaXggd3JhcHBpbmcgb2YgZnVuY3Rpb25zIHBvaW50ZXJzIGxpa2UKCgkJIHN0ZDo6b3N0cmVhbSYgc3RkOjplbmRsKHN0ZDo6b3N0cmVhbSYpOwoKCSAgICAgaWUsIHRoZSBvbmVzIHRoYXQgcmV0dXJuIHJlZmVyZW5jZXMgb3IgZW51bXMuCgkgCgkgICBbUHl0aG9uXSBBZGQgdGhlICVweXRob25jYWxsYmFjayBkaXJlY3RpdmUsIHdoaWNoIGlzIAoJICAgYW4gaW1wcm92ZWQgdmVyc2lvbiBvZiAlY2FsbGJhY2ssIGllLAoKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIGZvbzsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcjsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcm07CgoJICAgICBpbnQgZm9vKGludCBhKSB7CgkgICAgICAgICByZXR1cm4gYTsKCSAgICAgfQogIAoJICAgICBzdHJ1Y3QgQSAKCSAgICAgewoJICAgICAgIHN0YXRpYyBpbnQgYmFyKGludCBhKTsKCSAgICAgICBpbnQgYmFybShpbnQgYSk7CgoJICAgICB9OwoKICAgICAgICAgICAgIGludCBmb29iYXIoaW50IGEsIGludCAoKnBmKShpbnQgYSkpOwoKCSAgIGluIHB5dGhvbiB5b3UgY2FuIHVzZQoKICAgICAgICAgICAgIGZvbygyKQoJICAgICBmb29iYXIoMixmb28pCiAgICAgICAgICAgICBBLmJhcigyKQoJICAgICBmb29iYXIoMixBLmJhcikKICAgICAgICAgIAogICAgICAgICAgIGllLCBubyBhZGRpdGlvbmFsIHBvaW50ZXIgZWxlbWVudHMgYXJlIGNyZWF0ZWQsIGFuZAoJICAgdGhlIG9yaWdpbmFsICdmb28nIGFuZCAnQS5iYXInIGNhbiBiZSB1c2VkIGFzIHBhcmFtZXRlcnMuCgoJICAgSW4gdGhlIGNhc2Ugb2YgbWVtYmVyIGZ1Y250aW9uIGhvd2V2ZXIsIHN0aWxsIHlvdSBuZWVkCgkgICB0byB1c2UgdGhlIHNwZWNpYWwgdmFyaWFibGUgQ2xhc3M6OjxmbmNfbmFtZT5fY2JfcHRyLCBpZToKCiAJICAgICBmb29iYXJtKDMsIGEsIEEuYmFybV9jYl9wdHIpCgkgICAKCSAgIHdlIHdpbGwgdHJ5IHRvIGZpeCB0aGlzIHNpdHVhdGlvbiBhbHNvLCBidXQgbGF0ZXIuICAKCgkgICBbUHl0aG9uXSBBZGQgbW9yZSBlbGVtZW50cyBmcm9tIHRoZSBTVEwgbGlicmFyeSwgbm93CgkgICB5b3UgY2FuIHVzZQoKCSAgICAgaW1wb3J0IHN0ZAoJICAgICBzdGQuY291dCA8PCAiaGVsbG8gIiA8PCAxMjMgPDwgc3RkLmVuZGwKCgkgICBbUHl0aG9uXSBGaXggaW4vb3V0IHJldHVybiBtZWNoYW5pc20sIG5vdyBzd2lnIHdpbGwgYmVoYXZlCgkgICBhcyAxLjMuMjEgYnV0IHVzaW5nIGEgcHl0aG9uIGxpc3Qgd2hlbiBuZWVkZWQuIFRoZSBwcm9ibGVtCgkgICBpcyB0aGF0IHRoZSB0eXBlcyBzdGQ6OnBhaXIsc3RkOjp2ZWN0b3IsZXRjLCB1c2UgdHVwbGVzLAoJICAgYW5kIHRoZXkgaW50ZXJmZXIgd2l0aCB0aGUgcHJldmlvdXMgaW5vdXQgdHVwbGUgdHlwZS4KCgkgICBCeSB1c2luZyBsaXN0cyB3ZSBzb2x2ZSB0aGUgY29uZmxpY3RzLCBzd2lnIGFjdHMgYXMgYmVmb3JlLAoJICAgYnV0IHJldHVybnMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIgYXJlIHVzaW5nCgkgICB0aGUgT1VUIHR5cGVtYXAuIFNlZSB0aGUgbmV3IGlub3V0LmkgZXhhbXBsZSBpbiB0aGUKCSAgIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCQkgICAKICAgICAgICAgICBbUHl0aG9uXSBNdWNoIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgYmFkIGFyZ3VtZW50cywgbm93CgkgICB5b3UgYWx3YXlzIGdldCB0aGUgYXJndW1lbnQgbnVtYmVyIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KCjA5LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2UgLQogICAgICAgICAgICAxKSBXYXJuaW5nIGVtaXR0ZWQgd2hlbiAtaW1wb3J0YWxsIGFuZCAtaW5jbHVkZWFsbCBpcyB1c2VkIHRvZ2V0aGVyLAogICAgICAgICAgICAgICB3aXRoIC1pbmNsdWRlYWxsIHRha2luZyBwcmVjZWRlbmNlLgogICAgICAgICAgICAyKSBFbnN1cmUgU1dJR0lNUE9SVEVEIGlzIGFsd2F5cyBkZWZpbmVkIHdoZW4gYSBmaWxlIGlzIGJlaW5nCiAgICAgICAgICAgICAgIGltcG9ydGVkIHdpdGggJWltcG9ydC4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIFNXSUdJTVBPUlQsCiAgICAgICAgICAgICAgIHdoaWNoIGdldHMgZGVmaW5lZCBpbiBhbGwgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZXMuCgowOS8yNi8yMDA0OiBtbWF0dXMKCgkgICAgLSBhZGQgJWZlYXR1cmUoImV4Y2VwdGlvbmNsYXNzIikgdG8gaWRlbnRpZnkgYSBjbGFzcyB1c2VkCgkgICAgICBhcyBleGNlcHRpb24uIEJlZm9yZSBzd2lnIGlkZW50aWZpZWQgYW5kIG1hcmtlZCBhIGNsYXNzCgkgICAgICB1c2luZyB0aGUgImNwbHVzOmV4Y2VwdGlvbmNsYXNzIiBhdHRyaWJ1dGUuIEhvd2V2ZXIsIHRoZQoJICAgICAgY2xhc3MgbmVlZGVkIHRvIGFwcGVhciBvbiBhbiB0aHJvdygpIHN0YXRlbWVudC4gIE5vdwoJICAgICAgc3dpZyBrZWVwcyB0cnlpbmcgdG8gaWRlbnRpZnkgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzLCBhcwoJICAgICAgYmVmb3JlLCBidXQgaXQgYWxzbyBhbGxvd3MgdGhlIHVzZXIgdG8gbWFyayBhIGNsYXNzIGJ5CgkgICAgICB1c2luZyB0aGUgJWZlYXR1cmUgZXhwbGljaXRseS4gKG1vc3RseSByZWxldmFudCBmb3IKCSAgICAgIHB5dGhvbiBhbmQgY2hpY2tlbikKCgkgICAgW1B5dGhvbl0KCgkgICAgLSBmaXggLW1vZGVybiBvcHRpb24gKyBleGNlcHRpb25zLCB3aGljaCBtaXggb2xkIGNsYXNzCgkgICAgICBzdHlsZSB3aXRoIHRoZSBuZXcgb25lLiBTbywgd2UgYWx3YXlzIG5lZWQgdG8gZW1pdAoJICAgICAgdGhlICJub25tb2Rlcm4iIHB5dGhvbiBjb2RlLgoKCSAgICAtIGFkZCB0aGUgInB5dGhvbjpub25keW5hbWljIiBmZWF0dXJlIGFuZCBpdHMgaGFuZGxlcgoKCSAgICAgIG5vdyBpZiB5b3UgaGF2ZQoJICAgICAgCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYygxKSBBOwoJICAgICAgCgkgICAgICBzdHJ1Y3QgQSB7CgkgICAgICAgaW50IGE7CgkgICAgICAgaW50IGI7CgkgICAgICB9OwoKCSAgICAgIHRoZW4sIGluIHRoZSBweXRob24gc2lkZQoJICAgICAgCgkgICAgICBhYSA9IEEoKQoJICAgICAgCgkgICAgICBhYS5hID0gMSAjIG9rCgkgICAgICBhYS5iID0gMiAjIG9rCgkgICAgICBhYS5jID0gMyAjIGVycm9yLCB0aGUgY2xhc3MgY2FuIG5vdCBiZSBleHRlbmRlZCBkeW5hbWljYWxseS4KCgkgICAgCgkgICAgU2luY2UgdGhpcyBpcyBhIGZlYXR1cmUsIHlvdSBjYW4gdXNlCgoJICAgICAgJXB5dGhvbm5vbmR5bmFtaWMoMSk7CgogICAgICAgICAgICBvciAKCgkgICAgICAlcHl0aG9uZHluYW1pYygwKTsgWyBOb3RlOiAlcHl0aG9uZHluYW1pYyBzaW5jZSBkZXByZWNhdGVkIF0KICAgCgkgICAgdG8gZm9yY2UgYWxsIHRoZSB3cmFwcGVkIGNsYXNzZXMgdG8gYmUgIm5vbmR5bmFtaWMiIG9uZXMuCgoJICAgIFRoZSBkZWZhdWx0LCBhcyBpbiByZWd1bGFyIHB5dGhvbiwgaXMgdGhhdCBhbGwgdGhlIHdyYXBwZWQKCSAgICBjbGFzc2VzIGFyZSBkeW5hbWljcy4gU28sIGNhcmVmdWwgd2l0aCB5b3VyIHNwZWxsaW5nLgoKMDkvMTQvMjAwNDogbW1hdHVzIAoJICAgIC0gU3VwcG9ydCB0aGUgLUktIG9wdGlvbi4KCgkgICAgLSBEaWZmZXJlbnRpYXRlIGJldHdlZW4gJWluY2x1ZGUgPGZpbGU+IGFuZCAlaW5jbHVkZSAiZmlsZSIuCgkgICAgICBUaGlzIGZpeCBzZXZlcmFsIGNvcm5lciBjYXNlcy4KCgkgICAgCgkgICAgW1B5dGhvbl0gU2V2ZXJhbCBwYXRjaGVzOgoKCSAgICAtIE5vcm1hbGl6ZSB0aGUgTGliIGZpbGUgbmFtZXM6IAoJCSouc3dnIGludGVybmFsIGZpbGVzLCAKCQkqLmkgICB1c2VyIGZpbGVzLgoKCSAgICAtIEZpeCBDaGFyW0FOWV0gdHlwZW1hcHMsIHNvIHRoZXkgYWxzbyBkZWxldGUgYW55IGV4dHJhICdcMCcgY2hhcnMsCgkgICAgICBub3cgdGhleSBiZWhhdmUgYXMgYmVmb3JlICgxLjMuMjEpLiBTdGlsbCwgeW91IGNhbiB1c2UKCSAgICAgIHRoZSBTV0lHX1BSRVNFUlZFX0NBUlJBWV9TSVpFIG1hY3JvIGlmIHlvdSBuZWVkIHRvCgkgICAgICBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc2l6ZSAoc2VlIHB5c3RyYmFzZS5zd2cpLgoKCSAgICAtIEFkZCB0aGUgQ2hhciBGSVhTSVpFW0FOWV0gdHlwZW1hcHMsIHRvIHByZXNlcnZlIHRoZQogICAgICAgICAgICAgIG9yaWdpbmFsIEMgYXJyYXkgc2l6ZXMgKHNlZSBhYm92ZSkuIFRob3VnaCwgeW91IGNhbid0CiAgICAgICAgICAgICAgdXNlIHRoZW0geWV0IHNpbmNlICVhcHBseSBhbmQgYXJyYXlzIGFyZSBub3Qgd29ya2luZwogICAgICAgICAgICAgIHRvZ2V0aGVyLgoKICAgICAgICAgICAgLSBBZGQgcHlmcmFnbWVudHMuc3dnLCBub3cgdGhlIHVzZXIgY2FuIGFkZCBmcmFnbWVudHMKCSAgICAgIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9uZXMuCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIEJpbGwgQ2xhcmtlIHdoaWNoIGZpeGVzIHNwdXJpb3VzIHByZXByb2Nlc3NvciBidWcgd2hpY2gKICAgICAgICAgICAgc2hvd3Mgb24gU29sYXJpcyBhbmQgZ2NjLCBlZzoKICAgICAgICAgICAgICAgIFdhcm5pbmcoMjAyKTogQ291bGQgbm90IGV2YWx1YXRlICchZGVmaW5lZChTV0lHSkFWQSkgJiYKICAgICAgICAgICAgICAgICEoZGVmaW5lZChTV0lHQ1NIQVJQKScKICAgICAgICAgICAgQWxzbyBmaXhlcyBhIGJ1ZyB3aGVyZSAnI2lmICJhIiA9PSAiYiIgPT0gMScgd291bGRuJ3QgaGF2ZSB3b3JrZWQgCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBmb3IgdGhlIHRlc3Qtc3VpdGUuIFBhdGNoIGZyb20KICAgICAgICAgICAgQmlsbCBDbGFya2UuCgowOS8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbWlzc2luZyBydW50aW1lLmRzcCBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMgZm9yIHRoZQogICAgICAgICAgICBpbXBvcnQgZXhhbXBsZXMgdG8gd29yay4KCgpWZXJzaW9uIDEuMy4yMiAoU2VwdGVtYmVyIDQsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA5LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBzd2lnLm00IG1hY3JvIGZvciB1c2Ugd2l0aCB0aGUgQXV0b2NvbmYvQXV0b21ha2UvTGlidG9vbCBoYXMKICAgICAgICAgICAgYmVlbiByZW1vdmVkIGFuZCBpcyBubyBsb25nZXIgaW5zdGFsbGVkLiBQbGVhc2UgdXNlIHRoZSBuZXcgYW5kIGJldHRlcgogICAgICAgICAgICBtYWludGFpbmVkIHZlcnNpb24gZGVyaXZlZCBmcm9tIHN3aWcubTQgaW4gdGhlIEF1dG9jb25mIG1hY3JvIGFyY2hpdmUuCiAgICAgICAgICAgIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYWMtYXJjaGl2ZS9odG1sZG9jL2FjX3BrZ19zd2lnLmh0bWwgYW5kCiAgICAgICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcHl0aG9uX2RldmVsLmh0bWwuCgowOS8wMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCBwYXRjaCAjMTAxOTY2OSBmcm9tIENocmlzdG9waCBGbGFtbS4gQWRkcyBzdXBwb3J0CiAgICAgICAgICAgIGZvciAlZmVhdHVyZSgic2hhZG93IikgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IHdvcmtzIGluIFB5dGhvbi4gVGhpcwogICAgICAgICAgICBlbmFibGVzIG9uZSB0byBvdmVycmlkZSB0aGUgZ2VuZXJhdGVkIHNoYWRvdy9wcm94eSBtZXRob2RzLCBpbmNsdWRpbmcKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIC8qIExldCdzIG1ha2UgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcyBTcXVhcmUgbW9yZSB2ZXJib3NlICovCgogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKSBTcXVhcmUoZG91YmxlIHcpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHN1YiBuZXcgewogICAgICAgICAgICAgICAgICBteSAkcGtnID0gc2hpZnQ7CiAgICAgICAgICAgICAgICAgIG15ICRzZWxmID0gZXhhbXBsZWM6Om5ld19TcXVhcmUoQF8pOwogICAgICAgICAgICAgICAgICBwcmludCBTVERFUlIgIkNvbnN0cnVjdGVkIGFuIEB7W3JlZigkc2VsZildfVxuIjsKICAgICAgICAgICAgICAgICAgYmxlc3MgJHNlbGYsICRwa2cgaWYgZGVmaW5lZCgkc2VsZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgY2xhc3MgU3F1YXJlIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBTcXVhcmUoZG91YmxlIHcpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjA4LzMxLzIwMDQ6IG1tYXR1cyAKCSAgICBbUHl0aG9uXSBJbmNvbXBhdGliaWxpdHkgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UgKGxsaWJAY29tcHV0ZXIub3JnKToKCSAgICAKCSAgICBJZiB5b3UgYXJlIHVzaW5nIFN1biBTdHVkaW8gOCAoYW5kIHBvc3NpYmx5IGVhcmxpZXIKCSAgICB2ZXJzaW9ucykgdG8gY29tcGlsZSB0aGUgb3V0cHV0IHByb2R1Y2VkIGJ5IHN3aWcKCSAgICAxLjMuMjJyYzEsIGFuZCB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgU1RMIHRlbXBsYXRlcyB0aGVuCgkgICAgeW91IG5lZWQgdG8gdXNlIGVpdGhlciAiLXJ1bnRpbWUiIG9yICItbm9ydW50aW1lIi4gIElmIHlvdQoJICAgIHVzZSBuZWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSBnZXQKCSAgICBjb21waWxlciBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSB0aGUgd3JhcHBlciBmaWxlOwoJICAgIHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgbGlrZSB0aGlzOiBUaGUgbmFtZQoJICAgIFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJbLi4uXSBpcyB1bnVzYWJsZSBpbiBzdGF0aWMKCSAgICBzd2lncHk6OnRyYWl0c19hc3B0clsuLi5dICBJZiB5b3UgZ2V0IHRoaXMgZXJyb3IgbWVzc2FnZSwKCSAgICB5b3UgbmVlZCB0byByZWdlbmVyYXRlIHlvdXIgd3JhcHBlciBmaWxlIHVzaW5nICdzd2lnCgkgICAgLXJ1bnRpbWUnIG9yICdzd2lnIC1ub3J1bnRpbWUnLgoKCSAgICBZb3Ugc2hvdWxkbid0IGdldCB0aGlzIHByb2JsZW0gd2l0aCBTdW4gU3R1ZGlvIDkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCSAgICAKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGxpZWQgIzkzMjMzMyBmcm9tIElrZWdhbWkgVHN1dG9tdS4gRml4ZXMgbG9uZyBsb25nICpPVVRQVVQKICAgICAgICAgICAgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyAqT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICM4NTczNDQgZnJvbSBBcnQgWWVya2VzLiBXb3JrYXJvdW5kIGZvciBhdXRvY29uZiBidWcgd2hlbgogICAgICAgICAgICBydW5uaW5nICdtYWtlIGluc3RhbGwnLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFBhcnQgb2YgcGF0Y2ggIzk4Mjc1MyBhcHBsaWVkLiBUaGlzIGltcGxlbWVudHMgYSAlcGVybGNvZGUgZGlyZWN0aXZlLgogICAgICAgICAgICBJdCBhbGxvd3Mgb25lIHRvIGFkZCBQZXJsIGNvZGUgdG8gdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gV29ya3MgdGhlIHNhbWUgCiAgICAgICAgICAgIGFzICVweXRob25jb2RlLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgdmlydHVhbCBtZXRob2RzIHdpdGggZXhjZXB0aW9uCiAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIHRoYXQgd2VyZSBub3Qgc2ltcGxlIHR5cGVzLiBQcmV2aW91c2x5IGNvZGUgd2FzIGdlbmVyYXRlZCB0aGF0CiAgICAgICAgICAgIGRpZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB3YXMgYSBwb2ludGVyLgoKMDgvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwIGZpeCBmb3IgbWV0aG9kcyB0aGF0IHJldHVybiBjaGFyICouIFRoZSBDTFIgd291bGQgaW5jb3JyZWN0bHkKICAgICAgICAgICAgZGVsZXRlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBjaGFyICouIEFsc28gYXBwbGllZCB0aGUgc2FtZSBjb3JyZWN0aW9uIHRvCiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IHR5cGVtYXBzLgoKMDgvMjQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIC1mbWljcm9zb2Z0IGVycm9yL3dhcm5pbmcgbWVzc2FnZSBkaXNwbGF5OiAKICAgICAgICAgICAgLSBFbmQgb2YgZmlsZSAoRU9GKSB3YXJuaW5nIG1lc3NhZ2VzIG5vdCBkaXNwbGF5aW5nIGluIGNvcnJlY3QgZm9ybWF0CiAgICAgICAgICAgIC0gU29tZSBtZXNzYWdlcyBjb250YWluaW5nIGEgZmlsZSBwYXRoIHdlcmUgZGlzcGxheWluZyBhIGRvdWJsZSBiYWNrc2xhc2gKICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGEgc2luZ2xlIGJhY2tzbGFzaAoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXBwbGllZCBwYXRjaCAjMTAxMTYwNCBzdWJtaXR0ZWQgYnkgQ2hhcmxlcyBTY2h3aWV0ZXJzLiBGaXggZm9yIDY0IGJpdCB0Y2wKICAgICAgICAgICAgaW50ZXJwcmV0ZXJzLgoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBidWcgIzg3NTU4MyAtIGVudW0gZm9yd2FyZCBkZWNsYXJhdGlvbnMgcHJldmlvdXNseSBnYXZlIGEgc3ludGF4IGVycm9yLgoKMDgvMjMvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBVc2UgdHlwZW1hcHMgImZmaXR5cGUiIGFuZCAibGlzcHR5cGUiIHRvIGRldGVybWluZSB0aGUgRkZJIHR5cGUKCSAgICBzcGVjaWZpZXJzIGZyb20gdGhlIEMgdHlwZS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUsIGZvciBpbnN0YW5jZSwgdG8gY29udHJvbAoJICAgIHdoZXRoZXIgYSBDICJjaGFyIiBhcmd1bWVudCB0YWtlcyBhIExpc3AgY2hhcmFjdGVyIG9yIGEgTGlzcCBpbnRlZ2VyIHZhbHVlLgoJICAgIFRoZSBkZWZhdWx0ICh0YWtpbmcgTGlzcCBjaGFyYWN0ZXJzKSBpcyBkb25lIGJ5IHRoZXNlIGJ1aWx0LWluIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiY2hhcmFjdGVyIjsKCSAgICBJZiBjaGFyIG1lYW5zIGFuIGludGVnZXIgaW5zdGVhZCwgdXNlIHRoZXNlIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiaW50ZWdlciI7CgowOC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcyBkaXNjdXNzZWQgaW4gYnVnICM3NzI0NTMsIHRoZSBTV0lHIGxpYnJhcnkgZGlyZWN0b3J5IGlzIG5vdyBpbnN0YWxsZWQKICAgICAgICAgICAgaW50byBhIGRpZmZlcmVudCBkZWZhdWx0IGRpcmVjdG9yeS4gVGhlIGxpYnJhcnkgdXNlZCB0byBiZSBpbnN0YWxsZWQgdG8KICAgICAgICAgICAgL3Vzci9sb2NhbC9saWIvc3dpZzEuMy4gSXQgaXMgbm93IGluIHRoZSBtb3JlIHVzdWFsIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudAogICAgICAgICAgICBkaXJlY3RvcnkgYW5kIEkgaGF2ZSBhZGRpdGlvbmFsbHkgdXNlZCBhIHZlcnNpb24gc3BlY2lmaWMgc3ViZGlyZWN0b3J5IGFzCiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHdpbGwgcmFyZWx5IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBTV0lHLiBUaGlzIHJlbGVhc2UKICAgICAgICAgICAgd2lsbCB0aHVzIHVzZSAvdXNyL2xvY2FsL3NoYXJlL3N3aWcvMS4zLjIyIGJ5IGRlZmF1bHQsIHdoaWNoIGNhbiBiZQogICAgICAgICAgICB0YWlsb3JlZCBhcyBiZWZvcmUgdXNpbmcgJy4vY29uZmlndXJlIC0tc3dpZ2xpYmRpcicuCgowOC8xNy8yMDA0OiBta29lcHBlCgkgICAgW016U2NoZW1lXSBBZGQgc3VwcG9ydCB0byBjcmVhdGUgbmF0aXZlIE16U2NoZW1lIHN0cnVjdHVyZXMgZnJvbSBDIHN0cnVjdHVyZXMuCgkgICAgVG8gY29udmVydCBhIEMgc3RydWN0dXJlIHRvIGFuIE16U2NoZW1lIHN0cnVjdHVyZSwgdXNlIHRoZSBuZXcgcnVudGltZSBtYWNybwoJICAgIFNXSUdfTmV3U3RydWN0RnJvbVB0ciBpbiBhIHR5cGVtYXAuICBQYXRjaCBmcm9tIERtaXRyaXkgWmF2aW4uIAoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzgzNzcxNSBmcm9tIEJlbiBSZXNlciB0byBjb3JyZWN0bHkgZGV0ZWN0IFB5dGhvbiBsaWIgZGlyZWN0b3J5CiAgICAgICAgICAgIG9uIDY0IGJpdCBzeXN0ZW1zLgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiB0aGUgY2FzZSBvZiBlYXJseSByZXR1cm4KICAgICAgICAgICAgZnJvbSB3cmFwcGVyIG1ldGhvZHMgdXNpbmcgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXJhbWV0ZXJzLiBNb2RpZmllZAogICAgICAgICAgICBNYXJrIFRyYXVkdCBwYXRjaCAjOTUxNTY1LgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQnVnICM5NDM3ODMgd2l0aCBwYXRjaCBmaXhlcyBwaHAgY2hhciAqIG91dCB0eXBlbWFwIE5VTEwgdmFsdWVzLgoKMDgvMDMvMjAwNDogQWhtb24gRGFuY3kgIDxkYW5jeUBkYW5jeT4KCiAgICAgICAgICAgIFthbGxlZ3JvY2xdIEFkZGl0aW9uYWwgY2FzZSBtb2RlIGZpeGVzLiAgQWxzbywgbWFrZSBzdXJlCgkgICAgZm9yZWlnbiB0eXBlcyBhcmUgZXhwb3J0ZWQuCgowNy8yNC8yMDA0OiBta29lcHBlIAoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBTV0lHIG1vZHVsZXMgbm93IGV4Y2hhbmdlIHRoZWlyIHBvaW50ZXIgdHlwZQoJICAgIGluZm9ybWF0aW9uIHZpYSB0aGUgR3VpbGUgaW50ZXJwcmV0ZXIuICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGJ1aWxkIGEKCSAgICBydW50aW1lIGxpYnJhcnkgb3IgdG8gdXNlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGV0Yy4KCSAgICAKCSAgICBUaGUgbW9kdWxlIChTd2lnIHN3aWdydW4pIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBjaGFuZ2Ugb2YgMDUvMTcvMjAwNCBpcwoJICAgIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IGJ1aWx0LiAgSWYgeW91IG5lZWQgaXQsIHJ1biBTV0lHIG9uIHRoZSBpbnRlcmZhY2UgZmlsZQoJICAgIHN3aWdydW4uaS4gCgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEJ1ZyAjOTE3NjAxIE1hcHBpbmcgQysrIGJvb2wgZml4IGZyb20gTWFyayBUcmF1ZHQKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJQTSBmaXhlcyBmb3IgbGF0ZXN0IENWUyB2ZXJzaW9uIGluY2x1ZGluZyByZW1vdmFsIG9mIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyeS4KCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5MDg5NTUgZnJvbSBSb2JlcnQgSCBEZSBWcmllcy4KICAgICAgICAgICAgUlBNIGZpbGUgZ2VuZXJhdGlvbiBmaXggZm9yIEZlZG9yZSBDb3JlIDEgYW5kIFJlZGhhdCBBUzIuMS4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM4NjQ2ODkgZnJvbSBSb2JpbiBEdW5uOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBjb3JyZWN0cyB0d28gcHJvYmxlbXMgaW4gdGhlIFhNTCBvdXRwdXQgb2YgU1dJRzoKICAgICAgICAgICAgIAogICAgICAgICAgICAgIDEuIFRoZXJlIHdlcmUgb2Z0ZW4gZXh0cmEgJy8+XG4nIGluIHRoZSBvdXRwdXQuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgMi4gdmFsdWUgYXR0cmlidXRlcyB3ZXJlIG91dHB1dCB3aXRoICdcbicgaW4gdGhlbSBidXQKICAgICAgICAgICAgICBzaW5jZSB0aGF0IGlzIG5vdCB0ZWNobmljYWxseSBsZWdhbCBtb3N0IChhbGw/KSBYTUwKICAgICAgICAgICAgICBwYXJzZXJzIHdpbGwgc3RyaXAgdGhlbSBvdXQuIFJlcGxhY2luZyB0aGUgJ1xuJyB3aXRoCiAgICAgICAgICAgICAgdGhlICcmIzEwOycgZW50aXR5IHJlZmVyZW5jZSBzb2x2ZXMgdGhpcyBhcyB0aGF0IGlzCiAgICAgICAgICAgICAgbGVnYWwgYW5kIFhNTCBwYXJzZXJzIHdpbGwgY29udmVydCBpdCB0byBhICdcbicgd2hlbgogICAgICAgICAgICAgIHJlYWRpbmcgdGhlIHZhbHVlcyBiYWNrIGluLgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIFRoaXMgcGF0Y2ggYWxzbyBhZGRzIGEgbmV3IGdsb2JhbCBjb21tYW5kIGxpbmUgb3B0aW9uCiAgICAgICAgICAgICAgdGhhdCB3aWxsIGFsbG93IHRoZSBwYXJzZSB0cmVlIHRvIGJlIHdyaXR0ZW4gb3V0IGluIFhNTAogICAgICAgICAgICAgICphZnRlciogc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGUgaGFzIGJlZW4gcnVuLCBpbgogICAgICAgICAgICAgIG9yZGVyIHRvIGJlIGFibGUgdG8gZ2V0IGV4dHJhIGluZm8gdGhhdCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICBtb2R1bGUgcHV0cyBpbiB0aGUgdHJlZS4gSW4gdGhpcyB3YXkgdGhlIFhNTCBpcyBhCiAgICAgICAgICAgICAgcG9zdC1wcm9jZXNzZWQgdmVyc2lvbiBvZiB0aGUgdHJlZSByYXRoZXIgdGhhbiBhCiAgICAgICAgICAgICAgcHJlLXByb2Nlc3NlZCB2ZXJzaW9uLiAKIAogICAgICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb24gaXMgLWR1bXBfeG1sIG9yIC14bWxvdXQgPGZpbGU+CgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgdG8gZml4IHR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMKICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBIVE1MIGRvY3VtZW50YXRpb24gKG1ha2VjaGFwLnB5KSBmaWxlIGdlbmVyYXRvciBtaXNzaW5nIGVuZCBvZiBsaW5lCiAgICAgICAgICAgIHBhdGNoICM5MDg5NTEgZnJvbSBSb2JlcnQgZGUgVnJpZXMuCgowNy8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgZGVwcmVjYXRlZCBydW50aW1lIGxpYnJhcnkgYnVpbGQgaGFzIGJlZW4gcmVtb3ZlZC4gVGhpcyBhbHNvIHJlbW92ZXMKICAgICAgICAgICAgdGhlIGRlcGVuZGVuY3kgb24gTGlidG9vbC4gTGlidG9vbCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gYnVpbGQgU1dJRy4KICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgLWxkZmxhZ3MgU1dJRyBjb21tYW5kbGluZSBvcHRpb24gaGFzIGFsc28gYmVlbiByZW1vdmVkLgoKICAgICAgICAgICAgVGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRlc3RjYXNlcyB0aGF0IHVzZWQgdGhlIHJ1bnRpbWUgbGlicmFyeSBoYXZlCiAgICAgICAgICAgIGJlZW4gdXBkYXRlZCB0byB1c2UgdGhlIHJlcGxhY2VtZW50IGFwcHJvYWNoIHRvIHVzaW5nIFNXSUcgYWNyb3NzIAogICAgICAgICAgICBtdWx0aXBsZSBtb2R1bGVzLCB0aGF0IGlzIHRoZXkgdXNlIHRoZSAtbm9ydW50aW1lIGFuZCAtcnVudGltZSBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLCBzZWUgTW9kdWxlcy5odG1sLiBFZmZlY3RpdmVseSB0aGV5IGJ1aWxkIHRoZWlyIG93biBydW50aW1lCiAgICAgICAgICAgIGxpYnJhcmllcyB1c2luZyAtcnVudGltZS4gVGhlIGV4YW1wbGVzIGFyZSBpbXBvcnQgYW5kIGltcG9ydF90ZW1wbGF0ZS4KICAgICAgICAgICAgVGhlIHRlc3QgY2FzZXMgYXJlIGluIHRoZSBpbXBvcnRzIGFuZCB0ZW1wbGF0ZV90eXBlZGVmX2ltcG9ydCBkaXJlY3Rvcmllcy4KCiAgICAgICAgICAgIEFueW9uZSB3aG8gd2FudHMgdGhlIG9yaWdpbmFsIHJ1bnRpbWUgbGlicmFyaWVzIGNhbiBlaXRoZXIgcnVuIHRoZSB0ZXN0LXN1aXRlCiAgICAgICAgICAgIG9yIGJ1aWxkIHRoZSBleGFtcGxlcyBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFyZWQgb2JqZWN0L0RMTCB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aXRoIHRoZSAtcnVudGltZSBjb21tYW5kbGluZSBvcHRpb24uIEZvciBleGFtcGxlIGxpYmltcG9ydHNfcnVudGltZS5zbwogICAgICAgICAgICAoUHl0aG9uIGNhbGxzIGl0IGxpYl9pbXBvcnRzX3J1bnRpbWUuc28pIGlzIGdlbmVyYXRlZCBhZnRlciBydW5uaW5nIHRoZSAKICAgICAgICAgICAgJ21ha2UgaW1wb3J0cy5tdWx0aWNwcHRlc3QnIHRlc3RjYXNlIGluIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlLzxsYW5nPgogICAgICAgICAgICBkaXJlY3RvcnkuIE9yIHVzZSBsaWJydW50aW1lLnNvIC8gcnVudGltZS5kbGwgYWZ0ZXIgYnVpbGRpbmcgdGhlIGltcG9ydAogICAgICAgICAgICBleGFtcGxlcyBpbiBFeGFtcGxlcy88bGFuZz4vaW1wb3J0LgoKMDcvMDcvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBDb252ZXJ0IGNoYXJhY3RlciBhbmQgc3RyaW5nIGxpdGVyYWxzIGluIGNvbnN0YW50cyB0byAKCSAgICBDTCBzeW50YXguICBGaXggRkY6REVGLUZPUkVJR04tQ0FMTCBmb3IgbWl4ZWQtY2FzZSBDIGZ1bmN0aW9ucy4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZmVhdHVyZSBmb3IgSmF2YSBleGNlcHRpb25zIHdpdGggZm9ybWF0ICVqYXZhZXhjZXB0aW9uKGV4Y2VwdGlvbmNsYXNzZXMpLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgYSBzbGlnaHQgZW5oYW5jZW1lbnQgdG8gJWV4Y2VwdGlvbiBhbmQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgCiAgICAgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBleGNlcHRpb24gY2xhc3NlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGludG8gYSB0aHJvd3MgY2xhdXNlLgogICAgICAgICAgICBUaGUgJ2V4Y2VwdGlvbmNsYXNzZXMnIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBhc3NvY2lhdGVkIHByb3h5IG1ldGhvZCdzIHRocm93cyBjbGF1c2UuIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycKICAgICAgICAgICAgYXJlIHNwZWNpZmllZCBsaWtlIHRoZSBleGNlcHRpb24gY2xhc3NlcyBpbiB0aGUgJ3Rocm93cycgYXR0cmlidXRlIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwcy4gVGhpcyBmZWF0dXJlIHNob3VsZCBiZSB1c2VkIGZvciBjb3JyZWN0bHkgaGFuZGxpbmcgY2hlY2tlZCBleGNlcHRpb25zCiAgICAgICAgICAgIHRocm93biBmcm9tIEpOSSBjb2RlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWphdmFleGNlcHRpb24oImphdmEubGFuZy5FeGNlcHRpb24iKSB0aHJvd0V4Y2VwdGlvbiAlewogICAgICAgICAgICAgICAgLi4uIGNvbnZlcnQgYSBzdGQ6OmxvZ2ljX2Vycm9yIGludG8gYSBqYXZhLmxhbmcuRXhjZXB0aW9uIHVzaW5nIEpOSSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAgICAgICAgICAgICAgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHsKICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkxvZ2ljIGVycm9yISIpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgYSBtZXRob2Qgd2l0aCBhIHRocm93cyBjbGF1c2UgaW4gdGhlIG1vZHVsZSBjbGFzczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geyAuLi4gfQoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgJWNzY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFRoaXMgd29ya3MgdGhlIHNhbWUgd2F5IGFzICVqYXZhY29uc3R2YWx1ZS4gRm9yIEMjLCB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgICBpcyB0aGUgb25seSB3YXkgdGhhdCBvbmUgY2FuIGZpeCB3cmFwcGluZyBvZiBDL0MrKyBlbnVtcyB3aXRoIHByb3BlciBDIwogICAgICAgICAgICBlbnVtcyBpZiB0aGUgZW51bSBpdGVtJ3MgaW5pdGlhbGlzZXIgY2Fubm90IGNvbXBpbGUgYXMgQyMgY29kZS4gVGhpcyBpcwogICAgICAgICAgICBiZWNhdXNlIEphdmEgZW51bXMgY2FuIHVzZSBhIGNhbGwgaW50byBDIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgZW51bSBpdGVtLAogICAgICAgICAgICB3aGVyZWFzIGluIEMjLCB0aGUgZW51bSB2YWx1ZSBtdXN0IGJlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LiBUaGF0IGlzLAogICAgICAgICAgICB1c2luZyAlY3Njb25zdCgwKSBjYW5ub3QgYmUgdXNlZCBpbiBDIyB0byBpbml0aWFsaXNlIHRoZSBDIyBlbnVtIGl0ZW0gdmlhCiAgICAgICAgICAgIGEgUElOVk9LRSBjYWxsLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyAlamF2YWNvbnN0dmFsdWUodmFsdWUpIGZlYXR1cmUgZGlyZWN0aXZlIGZvciB1c2Ugd2l0aCBjb25zdGFudHMgYW5kCiAgICAgICAgICAgIGVudW1zLiBTb21ldGltZXMgdGhlIHVzZSBvZiAlamF2YWNvbnN0KDEpIHdpbGwgcHJvZHVjZSBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZQogICAgICAgICAgICB1bmRlciBKYXZhLiBJZiBhIGNvbXBpbGUgdGltZSBjb25zdGFudCBpcyByZXF1aXJlZCwgJWphdmFjb25zdCgwKSBpcyBub3QgYW4KICAgICAgICAgICAgb3B0aW9uLiBUaGUgJWphdmFjb25zdHZhbHVlIGRpcmVjdGl2ZSBhY2hpZXZlcyB0aGlzIGdvYWwgYW5kIHRoZSB2YWx1ZSBzcGVjaWZpZWQKICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIGFzIEphdmEgY29kZSB0byBpbml0aWFsaXNlIHRoZSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgxMDAwKSBCSUc7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKCJuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoXCIyMDAwXCIpIikgTEFSR0U7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwKSBiYXI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXIgPSAxMDsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICNkZWZpbmUgQklHIDEwMDBMTAogICAgICAgICAgICAgICAgI2RlZmluZSBMQVJHRSAyMDAwVUxMCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7IEJBUiA9IDo6YmFyIH07CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEdlbmVyYXRlczoKCiAgICAgICAgICAgICAgcHVibGljIGludGVyZmFjZSBleGFtcGxlQ29uc3RhbnRzIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMDAwOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBMQVJHRSA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiMjAwMCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9vIEJBUiA9IG5ldyBGb28oIkJBUiIsIDEwKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFByZXZpb3VzbHksIG5vbmUgb2YgQklHLCBMQVJHRSBvciBCQVIgd291bGQgaGF2ZSBwcm9kdWNlZCBjb21waWxlYWJsZSBjb2RlCiAgICAgICAgICAgIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGVuaGFuY2VtZW50cy4gRmVhdHVyZXMgY2FuIG5vdyB0YWtlIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYXR0cmlidXRlcwogICAgICAgICAgICBpbiBhZGRpdGlvbiB0byB0aGUgZmVhdHVyZSBuYW1lIGFuZCBmZWF0dXJlIHZhbHVlLiBUaGUgYXR0cmlidXRlcyBhcmUgb3B0aW9uYWwgCiAgICAgICAgICAgIGFuZCBhcmUgbXVjaCB0aGUgc2FtZSBhcyB0aGUgdHlwZW1hcCBhdHRyaWJ1dGVzLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwogICAgICAgICAgICBzcGVjaWZpZXMgdHdvIG9wdGlvbmFsIGF0dHJpYnV0ZXMsIGF0dHJpYjEgYW5kIGF0dHJpYjI6CgogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZSAidmFsIjsKICAgICAgICAgICAgICVmZWF0dXJlKGZlYXR1cmVuYW1lLCB2YWwsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZTsKCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGltcHJvdmVtZW50cyBmb3IgdGhlIHN5bnRheCB0aGF0IHRha2VzIHRoZSBmZWF0dXJlIHZhbHVlIHdpdGhpbiB0aGUKICAgICAgICAgICAgJWZlYXR1cmUoKSBicmFja2V0cy4gVGhlIHZhbHVlIHNwZWNpZmllZCBpcyBubyBsb25nZXIgcmVzdHJpY3RlZCB0byBiZWluZyBqdXN0CiAgICAgICAgICAgIGEgc3RyaW5nLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIuIEZvciBleGFtcGxlLCB0aGlzIGlzIG5vdyBhY2NlcHRhYmxlCiAgICAgICAgICAgIHN5bnRheDoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLDIwLjApOwogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQgaGF2ZSB0byBoYXZlIGJlZW46CiAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIiwiMjAuMCIpOwogICAgICAgICAgICBVc2VmdWwgZm9yIGZlYXR1cmVzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFzIGEgbWFjcm8sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgICNkZWZpbmUgJXNvbWVmZWF0dXJlKHZhbHVlKSAgICAgICVmZWF0dXJlKCJzb21lZmVhdHVyZSIsdmFsdWUpCiAgICAgICAgICAgIFRoZXNlIHdpbGwgbm93IHdvcmsgYWNjZXB0aW5nIGVpdGhlciBhIHN0cmluZyBvciBhIG51bWJlcjoKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoIkZyZWQiKTsKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoNCk7CgowNi8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW4sIEd1aWxlXQogICAgICAgICAgICAgLSBDcmVhdGVkIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL3NjaGVtZXJ1bm1lIGRpcmVjdG9yeSwgd2hpY2ggaG9sZHMgYWxsIHRoZQoJICAgICAgIHJ1bm1lIHNjcmlwdHMgZm9yIGd1aWxlIGFuZCBjaGlja2VuIChhbmQgcG9zc2libHkgbXpzY2hlbWUuLi4pLiAgVGhlIGd1aWxlCgkgICAgICAgYW5kIGNoaWNrZW4gX3J1bm1lIGZpbGVzIHRoZW4gKGxvYWQgIi4uL3NjaGVtZXJ1bm1lL2Zvby5zY20iKS4KICAgICAgICAgICAgIC0gSW4gY2hpY2tlbiBtb2R1bGUsIGZpeCBhIGZldyBidWdzIGludmxvbHZpbmcgZHluYW1pYyBjYXN0cy4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIHRvIGZpeCB3cmFwcGluZyBvZiB0ZW1wbGF0ZWQgbWV0aG9kcy4gSVNPIGNvbXBsaWFudCBjb21waWxlcnMsIGxpa2UKICAgICAgICAgICAgQ29tZWF1IGFuZCBHQ0MtMy40LjAsIGRvbid0IGxpa2UgdGhlIHRlbXBsYXRlIHNwZWNpZmllciB0aGF0IFNXSUcgd2FzIGdlbmVyYXRpbmcKICAgICAgICAgICAgd2hlbiBjYWxsaW5nIHRoZSBtZXRob2QuIFRoaXMgZml4IG1heSBicmVhayBzb21lIG5vbiBzdGFuZGFyZCBjb21wbGlhbnQgY29tcGlsZXJzLAogICAgICAgICAgICBmb3IgZXhhbXBsZSwgU3VuIHdvcmtzaG9wIGNvbXBpbGVycyBwcmlvciB0byB2ZXJzaW9uIDYuMi5wMi4gUGF0Y2ggc3VibWl0dGVkCiAgICAgICAgICAgIGJ5IEJpbGwgQ2xhcmtlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBVbmRvY3VtZW50ZWQgc3BlY2lhbCB2YXJpYWJsZSAkaW1jbGFzc25hbWUgcmVtb3ZlZC4KICAgICAgICAgICAgTmV3IHNwZWNpYWwgdmFyaWFibGUgJG1vZHVsZSBpcyByZXBsYWNlZCBieSB0aGUgbW9kdWxlIG5hbWUsIGFzIHNwZWNpZmllZAogICAgICAgICAgICBieSAlbW9kdWxlIG9yIC1tb2R1bGUgY29tbWFuZGxpbmUgb3B0aW9uLiAkaW1jbGFzc25hbWUgY2FuIGJlIGNyZWF0ZWQgZnJvbSAkbW9kdWxlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTYW1lIGFzIGZvciBKYXZhIGJlbG93LiBUaGUgbmV3IHR5cGVtYXBzIGFyZSBuYW1lZCBkaWZmZXJlbnRseSwgbmFtZWx5LAogICAgICAgICAgICBjc2JvZHkgYW5kIGNzYm9keV9kZXJpdmVkLiBUaGUgZGVwcmVjYXRlZCB0eXBlbWFwcyBhcmUgY3NnZXRjcHRyIGFuZAogICAgICAgICAgICBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUeXBlbWFwIGNoYW5nZXMgZm9yIHRoZSBKYXZhIHByb3h5IC8gdHlwZXdyYXBwZXIgYW5kIGVudW0gY2xhc3Nlcy4gQSBuZXcKICAgICAgICAgICAgdHlwZW1hcCBjYWxsZWQgamF2YWJvZHkgY29udGFpbnMgdGhlIGVzc2VudGlhbCBzdXBwb3J0IGNvZGUgZm9yIGdlbmVyYXRpb24gaW50byB0aGUgYm9keQogICAgICAgICAgICBvZiB0aGVzZSBjbGFzc2VzLiBUaGVyZSBpcyBhbHNvIGEgbmV3IGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcCB3aGljaCBpcyB1c2VkIGluc3RlYWQgZm9yCiAgICAgICAgICAgIHdyYXBwZWQgY2xhc3NlcyB0aGF0IGhhdmUgYSB3cmFwcGVkIGJhc2UgY2xhc3MuIFRoZSBjb2RlIGlzIGJhc2ljYWxseSwgdGhlIGdldENQdHIoKQogICAgICAgICAgICBtZXRob2QgYW5kIHN3aWdDUHRyIGFuZCBzd2lnQ01lbU93biBtZW1iZXIgdmFyaWFibGVzLiBUaGVzZSB1c2VkIHRvIGJlIGhhcmQgY29kZWQKICAgICAgICAgICAgd2l0aCBubyB3YXkgdG8gbW9kaWZ5IHRoZSBjb2RlLiBUaGUgaW50cm9kdWN0aW9uIG9mIHRoaXMgdHlwZW1hcCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgICAgdGhlIHVzZXIgdG8gdGFpbG9yIG5lYXJseSBldmVyeSBhc3BlY3Qgb2YgdGhlIGNvZGUgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBub3cgaXMgdGhlIGNvZGUgZm9yIGRpcmVjdG9yIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgYW5kIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyB0eXBlbWFwcyBhcmUgZGVwcmVjYXRlZCBhbmQgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciB1c2VkIGFzIHRoZSBjb2RlIHRoYXQgdGhlc2UgZ2VuZXJhdGVkIGNhbiBiZSBwdXQgaW4gdGhlIG1vcmUgZmxleGlibGUKICAgICAgICAgICAgamF2YWJvZHkgYW5kIGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwgbWF5IGhlbHAgeW91IHVwZ3JhZGUgaWYgeW91IGhhdmUgdXNlZAogICAgICAgICAgICB0aGUgamF2YWdldGNwdHIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgICAvKiBVdGlsaXR5IG1hY3JvIGZvciBtYW5pcHVsYXRpbmcgdGhlIEphdmEgYm9keSBjb2RlIG1ldGhvZCBhdHRyaWJ1dGVzICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIENUT1JfQVRUUklCLCBHRVRDUFRSX0FUVFJJQikKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5KSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHN3aWdDTWVtT3duOwoKICAgICAgICAgICAgICAgICAgQ1RPUl9BVFRSSUIgJGphdmFjbGFzc25hbWUobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAgICAgICBzd2lnQ01lbU93biA9IGNNZW1vcnlPd247CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NQdHIgPSBjUHRyOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBHRVRDUFRSX0FUVFJJQiBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gMCA6IG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYm9keV9kZXJpdmVkKSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKCRtb2R1bGVKTkkuU1dJRyRqYXZhY2xhc3NuYW1lVXBjYXN0KGNQdHIpLCBjTWVtb3J5T3duKTsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgICAgIC8qIFRoZSBkZWZhdWx0IGlzIHByb3RlY3RlZCBnZXRDUHRyLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoU1dJR1RZUEUsIHByb3RlY3RlZCwgcHJvdGVjdGVkKQoKICAgICAgICAgICAgICAgIC8qIFB1YmxpYyBnZXRDUHRyIG1ldGhvZCwgcHJvdGVjdGVkIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFBVQkxJQ19HRVRDUFRSKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHJvdGVjdGVkLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwdWJsaWMgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0JPRFlNRVRIT0RTKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHVibGljLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3MgbW9kaWZpZXIgdHlwZW1hcHMgYW5kIHByYWdtYXMgaGF2ZSBjaGFuZ2VkLgogICAgICAgICAgICBUaGV5IG11c3Qgbm93IGluY2x1ZGUgdGhlIGNsYXNzIHR5cGUuIFByZXZpb3VzbHkgJ2NsYXNzJyB3YXMgaGFyZCBjb2RlZC4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgZW5hYmxlcyBmbGV4aWJpbGl0eSBpbnRvIHdoYXQgdHlwZSBvZiBjbGFzcyBpcyBnZW5lcmF0ZWQsCiAgICAgICAgICAgIGZvciBleGFtcGxlIHRoZSBwcm94eSBjbGFzcyBjb3VsZCBiZSBhbiBpbnRlcmZhY2UgaW5zdGVhZCBvZiBhIGNsYXNzLgoKICAgICAgICAgICAgRm9yIEphdmEgdGhpcyBhZmZlY3RzIHRoZSBqYXZhY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBGb3IgQyMgdGhpcyBhZmZlY3RzIHRoZSBjc2NsYXNzbW9kaWZpZXJzIHR5cGVtYXAgYW5kIHRoZSBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBVbmxlc3MgeW91IGhhdmUgb3ZlcnJpZGRlbiB0aGUgZGVmYXVsdCB2ZXJzaW9ucyBvZiB0aGVzZSB0eXBlbWFwcyBvciBwcmFnbWFzLCB5b3UKICAgICAgICAgICAgc2hvdWxkbid0IGJlIGFmZmVjdGVkLiBIb3dldmVyLCBpZiB5b3UgaGF2ZSwgdXBncmFkaW5nIGlzIGVhc3ksIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCIKCiAgICAgICAgICAgIG11c3Qgbm93IGJlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgRm9vICJwdWJsaWMgZmluYWwgY2xhc3MiCgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHRoYXQgYXJlIHJlZmVyZW5jZXMuIFByb2JsZW0gcmVwb3J0ZWQgYnkKICAgICAgICAgICAgT3JlbiBNaWxsZXIuIEFsc28gaW1wcm92ZXMgdGhlIGdlbmVyYXRlZCBleGNlcHRpb24gZGVjbGFyYXRpb25zIGluIHRoZQogICAgICAgICAgICBjYXRjaCBoYW5kbGVyIGZvciBwb2ludGVycyAtIGEgcG9pbnRlciBpcyB1c2VkIGluc3RlYWQgb2YgYSByZWZlcmVuY2UgdG8KICAgICAgICAgICAgYSBwb2ludGVyLiBBZGRlZCBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgJiwgU1dJR1RZUEUgKiBhbmQKICAgICAgICAgICAgU1dJR1RZUEVbQU5ZXSAoSmF2YSBhbmQgQyMpLgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIG1pbm9yIHR5cGVzYWZlIGVudW0gaW1wcm92ZW1lbnRzLCBpbmNsdWRpbmcgc3RvcmluZyB0aGUgbmFtZSBvZgogICAgICAgICAgICB0aGUgZW51bSBpdGVtLiBUaGUgdG9TcmluZygpIC8gVG9TdHJpbmcoKSBtZXRob2RzIGFyZSBvdmVycmlkZGVuIHRvIHJldHVybiB0aGlzIG5hbWUuCgowNS8zMC8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIAoJICAgICAtIFVwZGF0ZSBob3cgZXhhbXBsZXMgYW5kIHRoZSB0ZXN0IHN1aXRlIGFyZSBidWlsdC4KCSAgICAgLSBTeW1ib2wgbmFtZXMgYXJlIG5vIGxvbmdlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZQoJICAgICAtIEFkZGVkIHVuaW9uX3J1bm1lLnNzLCB3aGljaCB3YXMgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBndWlsZSBtb2R1bGUKCjA1LzI2LzIwMDQ6IGxiYWxsYWJpbyAoTHVpZ2kgQmFsbGFiaW8pCiAgICAgICAgICAgIENvbW1pdHRlZCBvbiBiZWhhbGYgb2YgTWFyY2VsbyAod2hvIHN0aWxsIGhhcyBwcm9ibGVtcyB3aXRoIAoJICAgIHRoZSBTb3VyY2VGb3JnZSBDVlMuKQoKCSAgICBBZGRlZCBQeXRob24gdHlwZW1hcHMgZm9yIEZJTEUqIHdpdGggKFB5dGhvbi1vbmx5KSB0ZXN0LgoKNS8yNC8yMDA0OiAgZGFuY3kKCgkqIEFsbGVncm8gQ0wgbW9kdWxlOiAgTm93IHVzaW5nIHNvbWUgbWFjcm9zIChkZWZpbmVkIGluCglMaWIvYWxsZWdyb2NsL2FsbGVncm9jbC5zd2cpLCBzd2lnLWRlZmNvbnN0YW50IGFuZCBzd2lnLWRlZnVuLCBmb3IKCWRlZmluaW5nIGNvbnN0YW50cyBhbmQgZm9yZWlnbiBmdW5jdGlvbnMuICBUaGlzIG1ha2VzIHRoZQoJZ2VuZXJhdGVkIGZpbGUgYSBiaXQgbmVhdGVyLiAgICAKCglOb3cgc3RyaXBzIGEgbGF5ZXIgb2YgcGFyZW50aGVzaXMgZnJvbSBjb25zdGFudHMuCgoJVXNlcyAoKiA6dm9pZCkgaW5zdGVhZCBvZiA6Zm9yZWlnbi1hZGRyZXNzIG5vdy4KCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFVubmFtZWQgZW51bSBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3cgc3VwcG9ydGVkIGluIGFkZGl0aW9uCiAgICAgICAgICAgIHRvIHRoZSByZWNlbnRseSBhZGRlZCBzdXBwb3J0IGZvciB1bm5hbWVkIGVudW0gbWVtYmVyIHZhcmlhYmxlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMSwgZW51bTIgfSBNZW1iZXJJbnN0YW5jZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBlbnVtIHsgZW51bTMsIGVudW00IH0gR2xvYmFsSW5zdGFuY2U7CgogICAgICAgICAgICBUaGUgaW50IHR5cGVtYXBzIGFyZSB1c2VkIGZvciB3cmFwcGluZyB0aGUgZ2V0L3NldCBhY2Nlc3NvciBtZXRob2RzLgogICAgICAgICAgICBJZiB0aGUgc2l6ZW9mIGFuIGVudW0gaXMgbm90IHRoZSBzYW1lIHNpemUgYXMgYW4gaW50IHRoZW4gc2V0dGluZyB0aGUKICAgICAgICAgICAgdmFyaWFibGUgd2lsbCBzaWxlbnRseSBkbyBub3RoaW5nIGFzIHRoZSBjYXN0cyBjYW5ub3QgYmUgZWFzaWx5IGFuZCBwb3J0YWJseQogICAgICAgICAgICBnZW5lcmF0ZWQuIElmIHlvdSBuZWVkIHRvIHNvbHZlIHRoaXMgaGlnaGx5IG9ic2N1cmUgc2l0dWF0aW9uLCB3cml0ZQogICAgICAgICAgICB0aGUgYXNzaWdubWVudCB1c2luZyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlLgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDIyBlbnVtIHdyYXBwaW5nIG1vZHMuIFNpbWlsYXIgdG8gdGhlIEphdmEgbW9kdWxlLCBlbnVtcyBjYW4gYmUgd3JhcHBlZCB1c2luZwogICAgICAgICAgICBvbmUgb2YgMyBhcHByb2FjaGVzOgoKICAgICAgICAgICAgMSkgUHJvcGVyIEMjIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWNzZW51bSh3cmFwYXBwcm9hY2gpOwoKICAgICAgICAgICAgd2hlcmUgd3JhcGFwcHJvYWNoIHNob3VsZCBiZSBvbmUgb2Y6ICJwcm9wZXIiLCAidHlwZXNhZmUiLCAidHlwZXVuc2FmZSIgb3IgInNpbXBsZSIuCiAgICAgICAgICAgIFtObyBpbXBsZW1lbnRhdGlvbiBkZWVtZWQgbmVjZXNzYXJ5IGZvciB0eXBlIHVuc2FmZSBlbnVtc10uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcHByb2FjaCBpcyBwcm9wZXIgQyMgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGVudW0gc3VwcG9ydCBhZGRlZC4gVGhlcmUgYXJlIG5vdyA0IHdheXMgaW4gd2hpY2ggZW51bXMgY2FuIGJlIHdyYXBwZWQ6CgogICAgICAgICAgICAxKSBQcm9wZXIgSmF2YSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXMuc3dnIgogICAgICAgICAgICAyKSBUeXBlc2FmZSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGVzYWZlLnN3ZyIKICAgICAgICAgICAgMykgVHlwZSB1bnNhZmUgZW51bXMgKGNvbnN0YW50IGludGVnZXJzKSAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGV1bnNhZmUuc3dnIgogICAgICAgICAgICA0KSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWphdmFlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZW1hcHMgd2lsbCBoYW5kbGUgZW51bXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNwZWNpZmllZCBpbml0aWFsCiAgICAgICAgICAgIHZhbHVlcywgZm9yIGV4YW1wbGUgdGVuIGlzIHNwZWNpZmllZDoKCiAgICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyB6ZXJvLCB0ZW4oMTApIH07CgogICAgICAgICAgICBIb3dldmVyLCB0aGUgYW1vdW50IG9mIGdlbmVyYXRlZCBKYXZhIGNvZGUgY2FuIGJlIGN1dCBkb3duLCBieSBtb2RpZnlpbmcgdGhlc2UgdHlwZW1hcHMKICAgICAgICAgICAgaWYgbm9uZSBvZiB0aGUgZW51bXMgaGF2ZSBpbml0aWFsIHZhbHVlcyAocHJvcGVyIEphdmEgZW51bXMgYW5kIHR5cGVzYWZlIGVudW1zIGFwcHJvYWNoKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHR5cGVzYWZlIGVudW1zLiBBbm9ueW1vdXMgZW51bXMgYXJlIGFsd2F5cyB3cmFwcGVkIGJ5CiAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGJ1ZyB1c2luZyAlcmVuYW1lIG9uIGVudW0gaXRlbXMgYW5kIHdoZW4gdXNpbmcKICAgICAgICAgICAgJWphdmFjb25zdCgxKSAvICVjc2NvbnN0KDEpCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShPYmopIE9iamVjdDsKICAgICAgICAgICAgICAgIGVudW0gR3JhbW1hciB7IFN1YmplY3QsIE9iamVjdCB9OwoKMDQvMjgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBNaW5vciBmaXhlcyB3aGVuIHVzaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgCiAgICAgICAgICAgIGphdmFpbnRlcmZhY2VzLCBqYXZhYmFzZSwgY3NpbnRlcmZhY2VzIGFuZCBjc2Jhc2UgdHlwZW1hcHMuCgowNS8xOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSlZNIGxpbmsgZmFpbHVyZSBvbiBzb21lIHN5c3RlbXMgZml4ZWQgd2hlbiB1c2luZyBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIEFsc28gYWRkcyBkZWZhdWx0IHZlY3RvciBjb25zdHJ1Y3RvciBmb3IgdXNlIGZyb20gSmF2YS4KCjA1LzE3LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCgkgICAgW0d1aWxlXSBOZXcgcnVudGltZSBmdW5jdGlvbnMgU1dJR19Qb2ludGVyQWRkcmVzcywKCSAgICBTV0lHX1BvaW50ZXJUeXBlLCBTV0lHX0lzUG9pbnRlck9mVHlwZSwgU1dJR19Jc1BvaW50ZXIuCgoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCB3cmFwIHNldmVyYWwgU1dJRyBydW50aW1lIGZ1bmN0aW9ucwoJICAgIGFuZCBleHBvcnQgdGhlbSBpbnRvIHRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikuICBUaGUKCSAgICBydW50aW1lIG1vZHVsZSBpcyBub3cgYnVpbHQgd2l0aCAibW9kdWxlIiBsaW5rYWdlLgoKCSAgICBbR3VpbGVdIEdPT1BTIHByb3h5IG9iamVjdHMgbm93IGFsc28gcHJpbnQgdGhlIHBvaW50ZXIKCSAgICBhZGRyZXNzIG9mIHRoZSBDIG9iamVjdC4KCjA1LzE0LzIwMDQ6IGx5bGUKICAgICAgICAgICAgQWRkZWQgS291J3MgcGF0Y2ggZm9yIHRoZSBSdWJ5ICVpbXBvcnQgZGlyZWN0aXZlIHNvIHRoYXQgbW9kdWxlcwogICAgICAgICAgICB3aXRoICJuZXN0ZWQiIG5hbWVzIGFyZSBoYW5kbGVkIHByb3Blcmx5LiBDb25zaWRlciBhbiBpbnRlcmZhY2UKICAgICAgICAgICAgZmlsZSBmb28uaSB0aGF0IGhhcyB0aGlzICVtb2R1bGUgZGVjbGFyYXRpb24gYXQgaXRzIHRvcDoKCiAgICAgICAgICAgICAgICAlbW9kdWxlICJtaXNjOjp0ZXh0Ojpmb28iCgogICAgICAgICAgICBOb3cgY29uc2lkZXIgYW5vdGhlciBpbnRlcmZhY2UgZmlsZSBzcGFtLmkgdGhhdCBpbXBvcnRzIGZvby5pOgoKICAgICAgICAgICAgICAgICVpbXBvcnQgZm9vLmkKICAgICAgICAgICAgCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIHBhdGNoLCB0aGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBzcGFtX3dyYXAuYzoKCiAgICAgICAgICAgICAgICByYl9yZXF1aXJlKCJtaXNjOjp0ZXh0Ojpmb28iKTsKCiAgICAgICAgICAgIFdpdGggdGhpcyBwYXRjaCwgaG93ZXZlciwgeW91J2xsIGdldCB0aGUgY29ycmVjdCBwYXRoIG5hbWUKICAgICAgICAgICAgZm9yIHRoZSBjYWxsIHRvIHJiX3JlcXVpcmUoKSwgZS5nLgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2MvdGV4dC9mb28iKTsKCiAgICAgICAgICAgIFNlZSBTb3VyY2VGb3JnZSBCdWcgIzkyODI5OS4KCjA1LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZvciBlbWl0dGluZyBkaXJlY3RvcnMgd2hlbiAlZmVhdHVyZSgiZGlyZWN0b3IiKSBzcGVjaWZpZWQKICAgICAgICAgICAgZm9yIGEgY2xhc3Mgd2l0aCBubyB2aXJ0dWFsIG1ldGhvZHMsIGJ1dCBkb2VzIGhhdmUgYSB2aXJ0dWFsIGRlc3RydWN0b3IuCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBLZXZpbiBTbWl0aC4KCjA1LzA2LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgU1dJRyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVByZXR0eU5hbWUsIHdoaWNoIAoJICAgIHJldHVybnMgYW4gdW5tYW5nbGVkIHR5cGUgbmFtZSBmb3IgYSBzd2lnX3R5cGVfaW5mbwoJICAgIG9iamVjdC4gCgoJICAgIFtHdWlsZV06IFVzZSBpdCBmb3IgcHJpbnRpbmcgcG9pbnRlciBvYmplY3RzLgoKMDUvMDMvMjAwNDogIGRhbmN5IChBaG1vbiBEYW5jeSkKCgkqIExpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZzogIFVwZGF0ZWQgY29tbWVudHMgYWJvdXQgaWRlbnRpZmVyCgljb252ZXJzaW9uLiAgCgoJKiBTb3VyY2VzL01vZHVsZXMvYWxsZWdyb2NsLmN4eDogIFJlZ2lzdGVyIC9kZXYvbnVsbCBmb3IgImhlYWRlciIKCXRhcmdldC4gICBBbHNvLCBkaXNyZWdhcmQgImNvbnN0IiBxdWFsaWZpZXJzIGR1cmluZyB0eXBlCgljb252ZXJzaW9uLiAgCgoJCjA1LzAyLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBGaXggYnVnIDc4MjQ2OC4KCSAgICBUbyBmaXggdGhpcyBidWcsIHRoZSBydW50aW1lIGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuLCBhbmQKCSAgICBwb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGEgQ19TV0lHX1BPSU5URVJfVFlQRS4KCgkgICAgQ2hpY2tlbiB2ZXJzaW9uID4gMS40MCBpcyBub3cgcmVxdWlyZWQhCgoJICAgICogVHlwZW1hcCBpbmNvbXBhdGliaWxpdHk6ICB0eXBlbWFwcyBubyBsb25nZXIgdXNlIGNoaWNrZW5fd29yZHMuCgkgICAgICBJZiBhIHR5cGVtYXAgbmVlZHMgc29tZSBzcGFjZSwgaXQgc2hvdWxkIGp1c3QgY2FsbCBDX2FsbG9jCgoJICAgICogYXJnb3V0IHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgdGhlIC8qIGlmIE9ORSAqLyBjb25zdHJ1Y3QgdG8KCSAgICAgIGJ1aWxkIGFuIG91dHB1dCBsaXN0LiAgQSBTV0lHX0FQUEVORF9WQUxVRSBtYWNybywgZXhhY3RseSBsaWtlCgkgICAgICBndWlsZSBhbmQgbXpzY2hlbWUgaXMgbm93IHVzZWQuCgowNC8yNS8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiB0aGUgZ2VuZXJhdGVkIEdPT1BTIGNvZGUsIGRvbid0IGNyZWF0ZSBtZXRob2RzCgkgICAgdGhhdCB3b3VsZCBub3Qgc3BlY2lhbGl6ZSBhbnkgYXJndW1lbnRzOyBzaW1wbHkgcmUtZXhwb3J0CgkgICAgdGhlIHByaW1pdGl2ZSBmdW5jdGlvbnMuICAoVGhpcyBpcyBhIHBlcmZvcm1hbmNlCgkgICAgb3B0aW1pemF0aW9uIHdoaWNoIHJlZHVjZXMgbG9hZCB0aW1lIGFuZCBleGVjdXRpb24gdGltZS4pCgoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGZpeCB0aGUgInRvbyBtYW55IGluaXRpYWxpemVycyIgZXJyb3IKCSAgICB3aGljaCB3YXMgY2F1c2VkIGJ5IGFuIGluY29tcGF0aWJsZSBzd2lnX3R5cGVfaW5mbyBsYXlvdXQuCgoJICAgIFtHdWlsZV0gVGhlIHR5cGVtYXAgZm9yIEZJTEUgKiBpbiBwb3J0cy5pIG5vdyBhbHNvIGFjY2VwdHMKCSAgICBhIHJlZ3VsYXIgRklMRSAqIHBvaW50ZXIgb2JqZWN0LiAgQWxzbyBhIGJ1ZyB3aXRoIFNjaGVtZQoJICAgIGZpbGUgcG9ydHMgdGhhdCBhcmUgb3BlbiBmb3IgaW5wdXQgYW5kIG91dHB1dCBoYXMgYmVlbgoJICAgIGZpeGVkLiAKCjA0LzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENoYW5nZSBlbnRyeSAwMy8yMS8yMDA0IHJldm9rZWQuIFRoZSBjaGFuZ2UgaW50cm9kdWNlZCBhbm90aGVyCiAgICAgICAgICAgIGluY29uc2lzdGVuY3kgKHJlZmVyZW5jZSB0eXBlbWFwcyBiZWluZ3MgdXNlZCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHBvaW50ZXIgdHlwZW1hcHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgYXMgd2VsbCBhcyBzdGF0aWMKICAgICAgICAgICAgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBmb3Igc29tZSBsYW5ndWFnZXMsCiAgICAgICAgICAgIGJ1dCBvbmx5IGZvciBDKysgYW5kIG5vdCBDKS4gVGhpcyB3b3VsZCBicmVhayB1c2VyJ3MgY3VycmVudAogICAgICAgICAgICB0eXBlbWFwcyBhbmQgaW50cm9kdWNlIGZ1cnRoZXIgaW5jb25zaXN0ZW5jaWVzLiBBbHRlcm5hdGl2ZQogICAgICAgICAgICBzb2x1dGlvbiByZXF1aXJlZCBhbmQgYmVpbmcgZGlzY3Vzc2VkLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBBZGRlZCB0aGUgLWRpcmVjdG9ycyBmbGFnLiBUaGlzIGVuYWJsZXMgdGhlIGRpcmVjdG9yCgkgICAgbW9kZSBmb3IgdGhlIGludGVyZmFjZSBhbmQgYWxsIHRoZSBjbGFzc2VzIHRoYXQKCSAgICBkb24ndCBzZXQgdGhlICJmZWF0dXJlOm5vZGlyZWN0b3IiIGV4cGxpY2l0bHkuCgoJICAgIFlvdSBjYW4gdXNlIHRoaXMgaW4geW91ciBtb2R1bGUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZQoJICAgIGRpcmVjdG9yIGZlYXR1cmUgaW4gYWxsIHlvdXIgY2xhc3NlcywgYnV0IGl0IGlzIG1vc3QKCSAgICBpbnRlbmRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcywgbGlrZToKCgkgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLXJ1YnktdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoJICAgICAgbWFrZSBjaGVjay1qYXZhLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCgkgICAgVGhlc2UgY29tbWFuZHMgd2lsbCBydW4gdGhlIGVudGlyZSB0ZXN0LXN1aXRlIHVzaW5nCgkgICAgZGlyZWN0b3JzLCBhbmQgbm90IG9ubHkgdGhlIHNwZWNpZmljICdkaXJlY3RvcnNfKicKCSAgICBjYXNlcy4gVGhpcyBzaG91bGQgYmUgZG9uZSBmcm9tIHRpbWUgdG8gdGltZS4KCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgW3B5dGhvbl0gQWRkZWQgc3VwcG9ydCBmb3Igc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90LAoJICAgIGZvciBjb21waWxlciBhbmQgcHl0aG9uIHZlcnNpb25zIHRoYXQgc3VwcG9ydCB0aGVtLgoJICAgIAoJICAgIFdoZW4gbmVlZGVkLCB1c2UgCgoJICAgICAlaW5sY3VkZSBzdGRfc3RyaW5nLmkgICAgICAvLyAnY2hhcicgc3RyaW5ncwoJICAgICAlaW5sY3VkZSBzdGRfd3N0cmluZy5pICAgICAvLyAnd2NoYXJfdCcgc3RyaW5ncwoJICAgIAoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBGaXggdGhlIGRlZmF1bHQgYmVoYXZpb3VyIChzZWcuIGZhdWx0KSB3aGVuIGFuCgkgICAgaW5wbGFjZSBvcGVyYXRvciAoKz0sLT0sLi4uKSB3YXMgd3JhcHBlZCwgYXMgcmVwb3J0ZWQgYnkKCSAgICBMdWNyaXogKGx1Y3JpekBzaXRpbGFuZGlhLml0KSwgd2hlbiB0aGUgbW9zdCBjb21tb24KCSAgICBmb3JtIHdhcyB1c2VkOgoKICAgICAgICAgICAgICAgICAgIEEmICBBOjpvcGVyYXRvcis9KGludCBpKSB7IC4uLjsgcmV0dXJuICp0aGlzOyB9CiAgICAgICAgICAgICAgICAgIF5eXl4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KCSAgICAKCgkgICAgaWUsIGFuIG9iamVjdCBpcyByZXR1cm5lZCBhbmQgaXRzIGNvbnRhaW5zIHRoZSBzYW1lICd0aGlzJwoJICAgIHZhbHVlIHRoYW4gdGhlIGlucHV0IG9iamVjdCwgd2hpY2ggaXMgZGVsZXRlZCBhZnRlciB0aGUKCSAgICBvcGVyYXRpb24gImEgKz0gYiIsIGxlYXZpbmcgdGhlIHJlc3VsdCB3aXRoIG5vIHJlYWwKCSAgICBvYmplY3QsIGJ1dCBhIHNlZy4gZmF1bHQuCgoJICAgIFRvIGZpeCBpdCwgd2UgbmVlZGVkIHRvIGludHJvZHVjZSBhIG5ldyBmZWF0dXJlIGFuZCB1c2UgYW4KCSAgICBvbGQgb25lOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIpIEE6Om9wZXJhdG9yKz07CgkgICAgCgkgICAgaGVyZSwgInNlbGY6ZGlzb3duIiBkaXNhYmxlIHRoZSBvd25lcnNoaXAgb2YgdGhlICdzZWxmJwoJICAgIG9yIGlucHV0IG9iamVjdCwgYW5kIHRoZSAibmV3IiBmZWF0dXJlIHRyYW5zZmVycyB0aGUKCSAgICBvd25lcnNoaXAgdG8gdGhlIHJlc3VsdCBvYmplY3QuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUvc29sdXRpb24gY291bGQgYWxzbyBiZSB1c2VkIGluIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgdXNlIGdjIGFuZCBpbXBsZW1lbnQgdGhlIGlucGxhY2Ugb3BlcmF0b3JzLCBvciBvdGhlcgoJICAgIG9wZXJhdG9ycywgaW4gYSBzaW1pbGFyIHdheS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQeXRob24gTU9EVUxFICoqKgoKCSAgICBJZiB5b3UgYWxyZWFkeSBhcmUgdXNpbmcgdGhlIGlucGxhY2Ugb3BlcmF0b3JzIGluIHB5dGhvbiwKCSAgICBhbmQgeW91IGltcGxlbWVudGVkIHNvbWUga2luZCBvZiB3b3JrYXJvdW5kIHRvIHRoZSBwcm9ibGVtCgkgICAgZml4ZWQgaGVyZSwgaXQgaXMgcG9zc2libGUgeW91IGNvdWxkIGVuZCB3aXRoICdmcmVlJwoJICAgIG9iamVjdHMgdGhhdCBuZXZlciBnZXQgZGVsZXRlZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgYW5kCgkgICAgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGUgY3VycmVudCBmaXgsIHVzZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJzZWxmOmRpc293biIsIiIpIEE6Om9wZXJhdG9yKz07CiAgICAgICAgICAgICAgICVmZWF0dXJlKCJuZXciLCIiKSBBOjpvcGVyYXRvcis9OwoKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEMrKyBlbnVtcyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgaW50ZWdlcnMsIHRoZXkgYXJlIG5vdyB3cmFwcGVkIGJ5IAogICAgICAgICAgICBDIyBlbnVtcy4gRm9yIEV4YW1wbGUsIGdpdmVuIEMrKzoKCiAgICAgICAgICAgICAgICBlbnVtIEFuRW51bSB7IGZvbywgYmFyIH07CiAgICAgICAgICAgICAgICB0eXBlZGVmIEFuRW51bSBBbkVudW1lcmF0aW9uOwogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoQW5FbnVtIGUsIEFuRW51bWVyYXRpb24gZik7CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgZW51bSBBbkVudW0gewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtIGYpIHsuLi59CgogICAgICAgICAgICBOb3RlIHRoYXQgYSBnbG9iYWwgZW51bSBsaWtlIEFuRW51bSBhYm92ZSBpcyBnZW5lcmF0ZWQgaW50byBpdHMgb3duCiAgICAgICAgICAgIGZpbGUgY2FsbGVkIEFuRW51bS5jcy4gRW51bXMgZGVmaW5lZCB3aXRoaW4gYSBDKysgY2xhc3MgYXJlIGRlZmluZWQKICAgICAgICAgICAgd2l0aGluIHRoZSBDIyBwcm94eSBjbGFzcy4gU29tZSBvZiB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZyBDIyBwcm94eQogICAgICAgICAgICBjbGFzc2VzIGFsc28gd29yayBmb3IgZW51bXMuIEZvciBleGFtcGxlIGdsb2JhbCBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbXBvcnRzKSB0byBhZGQgaW4gZXh0cmEgdXNpbmcgc3RhdGVtZW50cy4KCiAgICAgICAgICAgIEdsb2JhbCBlbnVtcyBhbmQgY2xhc3MgZW51bXMgY2FuIHVzZQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIHRvIG1ha2UgdGhlIGVudW0gcHJpdmF0ZSwgcHVibGljIGV0Yy4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSkgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGVudW0gdHlwZSAoZW51bSBiYXNlKQoKICAgICAgICAgICAgSWYgd2UgYWRkIHRoaXMgZm9yIHRoZSBhYm92ZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIEFuRW51bSAicHJvdGVjdGVkIgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSBBbkVudW0gImxvbmciCgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZW51bSBBbkVudW0gOiBsb25nIHsKICAgICAgICAgICAgICAgICAgZm9vLAogICAgICAgICAgICAgICAgICBiYXIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8wNy8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU2VnIGZhdWx0IGZpeCBmb3IgZW1wdHkgZW51bXMsIGxpa2UKICAgICAgICAgICAgICAgIGVudW0gRm9vIHt9OwoKMDMvMjEvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIFtOb3RlOiB0aGlzIGNoYW5nZSByZXZva2VkIG9uIDA0LzI1LzIwMDRdCgkgICAgW1B5dGhvbl0gTWFrZXMgdGhlIGZvbGxvd2luZyAndmFyJyBjYXNlcyBtb3JlIHVuaWZvcm06CgogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2E7CiAKICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHNhOwogICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYTsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgbm93IHRoZSB0aHJlZSB2YXJpYWJsZXMgKGdhLCBzYSwgbWEpIGNhbiBiZSBhc3NpZ25lZCBhczoKCgogICAgICAgICAgICAgICAgICBjdmFyLmdhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgQS5zYSA9ICJoZWxsbyI7CiAgICAgICAgICAgICAgICAgIGEubWEgPSAiaGVsbG8iOwoKICAgICAgICAgICAgaWUsIG5vdyAnbWEnIHdpbGwgYWxzbyB1c2UgYSBzdGQ6OnN0cmluZyB0eXBlbWFwICdpbicgaWYKICAgICAgICAgICAgZGVmaW5lZCwgYmVmb3JlIGl0IHdhcyBvbmx5IGFjY2VwdGluZyBhICdwX3N0ZF9zdHJpbmcnCiAgICAgICAgICAgIHBvaW50ZXIuICBOb3RlLCBob3dldmVyLCB0aGF0ICdtYScgd2lsbCBub3QgdXNlIHRoZQogICAgICAgICAgICAndmFyaW4vdmFyb3V0JyB0eXBlbWFwcyAodGhhdCBwcm9iYWJseSBjb3VsZCBiZSBtb3JlCiAgICAgICAgICAgIG5hdHVyYWwpLCBidXQgaXQgd2lsbCBwaWNrIHVwIHRoZSAnaW4nIHR5cGVtYXAgZm9yIGNvbnN0CiAgICAgICAgICAgIHN0ZDo6c3RyaW5nJiAod2hpY2ggaXMgZWFzaWVyKS4KCgkgICAgVGhlIGNoYW5nZXMgaW4gY3dyYXAuYyBhbmQgbGFuZy5jeHggd2lsbCBwcm9iYWJseSBmaXggdGhlCgkgICAgYmVoYXZpb3VyIGluIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCBvdmVybG9hZCB0aGUKCSAgICBtZW1iZXJ2YXJIYW5kbGVyIG1ldGhvZCAidG9vIG11Y2giLgogCiAgICAgICAgICAgIAowMy8yMS8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBEaXNhYmxpbmcgdGhlIGRlZmF1bHQgaW5zdGFudGlhdGlvbnMgbGlrZToKCgkgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8aW50LGludD47CgogICAgICAgICAgICBmb3IgYWxsIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIFNUTCBjb250YWluZXJzL2NsYXNzZXMuCgkgICAgVGhleSBhcmUgZXhwZW5zaXZlLCBzcGVjaWFsbHkgZm9yIHBhaXIgYW5kIG1hcCwgYW5kIHRoZQoJICAgIHByZXZpb3VzIGJlaGF2aW91ciBhbHNvIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHBlcmZvcm0KCSAgICBtYW51YWwgaW5zdGFudGlhdGlvbnMuIFN0aWxsLCBpZiB0aGUgc3BlZWQgZGlmZmVyZW5jZSBpcwoJICAgIG5vdCBpbXBvcnRhbnQsIGl0IGNhbiBiZSByZS1lbmFibGVkIGJ5IGRlZmluaW5nIHRoZSBtYWNybwoJICAgIFNXSUdfU1REX0RFRkFVTFRfSU5TVEFOVElBVElPTiAoc2VlIHN0ZF9jb21tb24uaSkuCgoJICAgIEFsc28sIG5vcm1hbGl6aW5nIHRoZSBJTlBVVC9PVVRQVVQvSU5PVVQgdHlwZW1hcHMuIE5vdwoJICAgIHRoZXkgdXNlIHRoZSBzYW1lIGNvbnZlcnNvcnMgdGhhbiB0aGUgcmVzdCBvZiB0aGUKCSAgICB0eXBlbWFwcywgYW5kIHlvdSBjYW4gdXNlIHRoZW0gZm9yIHN0ZDo6cGFpciwgc3RkOjpzdHJpbmcKCSAgICBhbmQgYWxsIHRoZSBvdGhlciBTVEwgdHlwZXMsIGxpa2UgaW46CgoJICAgICAgdm9pZCBwX2lub3V0ZChzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+ICpJTk9VVCk7CgoJICAgIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBhbmQgaW1wbGljaXQuaSBmaWxlcyB3aXRoIG1hY3JvcyB0bwoJICAgIHRyYW5zZm9ybSBmdW5jdGlvbnMgcGFpcnMgbGlrZSAnc2V0X3gnLydnZXRfeCcgCgkgICAgKG9yICdUJiB4KCknLydjb25zdCBUJiB4KCkgY29uc3QnKSBpbnRvIGFuIGF0dHJpYnV0ZSwKCSAgICBhbmQgYWxsb3dpbmcgdGhlIHVzZSBvZiBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgaW4gdHlwZW1hcHMKCSAgICAoc2VlIHRoZSBmaWxlcyBmb3IgbW9yZSBkZXRhaWxzKS4KCjAzLzIxLzIwMDQ6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmdzIG9mIGZ1bmN0aW9ucyB3aXRoCgkgICAgYW5vbnltb3VzIGFyZ3VtZW50cy4KCjAzLzE4LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIE1vcmUgZ2VuZXJhbCBzdGRfc3RyaW5nLmkgaW50ZXJmYWNlLgoJICAgIE5vdyB5b3UgY2FuIHdyYXAgaXQgdXNpbmcKCgkgICAgICAldGVtcGxhdGUoc3RyaW5nKSBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPjsKCiAgICAgICAgICAgIGFuZCB1c2UgdGhlIHN0ZDo6c3RyaW5nIGFzIGEgYmFzZSBjbGFzczoKCgkgICAgICBzdHJ1Y3QgQSA6IHN0ZDo6c3RyaW5nIHsKICAgICAgICAgICAgICB9OwoKCSAgICBCdXQgbW9yZSBpbXBvcnRhbnQsIHN3aWcgd2lsbCByZWNvZ25pemUgCgkgICAgYm90aCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPiBhbmQgc3RkOjpzdHJpbmcgYXMKCSAgICB0aGUgc2FtZSB0eXBlLgoKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgUHJldmlvdXNseSBhZGRlZCwgYnV0IG5vdCBtZW50aW9uZWQgYmVmb3JlOgoKCSAgICAtIGZyaWVuZCBkZWNsYXJhdGlvbiBzdXBwb3J0LCBzd2lnIG5vdyBlbWl0cyBhIGdsb2JhbAoJICAgICAgZnVuY3Rpb24gaW4gdGhlIHNhbWUgY2xhc3Mgc2NvcGUuCgoJICAgIC0gcmVmL3VucmVmIGZlYXR1cmVzOiB0byBtaXggcmVmIGNvdW50aW5nIEMrKyBjbGFzc2VzCgkgICAgICBhbmQgbmF0aXZlIHNjcmlwdCByZWYgY291bnRpbmcgbWVjaGFuaXNtcyAobGlrZSBpbiBweXRob24pLgoJICAgIAoJICAgICAgVXNlIGl0IGxpa2U6CgogCSAgICAgICAgJWZlYXR1cmUoInJlZiIpICAgUkNPYmogIiR0aGlzLT5yZWYoKTsiCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgidW5yZWYiKSBSQ09iaiAiJHRoaXMtPnVucmVmKCk7IgoKCSAgICAgIEFuZCB0aGUgY2xhc3MgUkNPYmosIGFuZCBhbGwgdGhlIGRlcml2ZWQgb25lcywgd2lsbAoJICAgICAgcGVyZm9ybSB0aGUgcmlnaHQgcmVmL3VucmVmIGNhbGxzIHdoZW4gYSBuZXcgcG9pbnRlciAgCgkgICAgICBpcyByZXR1cm5lZCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLCBvciB3aGVuIHRoZSB0YXJnZXQKCSAgICAgIGxhbmd1YWdlIGF0dGVtcHRzIHRvIGRlbGV0ZSB0aGUgb2JqZWN0LgoJICAgICAgCgkgICAgICBTZWUgdGhlIHJlZmNvdW50LmkgZmlsZSBpbiB0aGUgdGVzdC1zdWl0ZSBmb3IgbW9yZQoJICAgICAgZGV0YWlscy4KCgkgICAgCjAzLzE2LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIFVzaW5nIHRoZSBuZXcgJWZyYWdtZW50IHN1cHBvcnQsIG1ham9yIHJld3JvdGUgCgkgICAgb2YgdGhlIHB5dGhvbiBzd2lnIGxpYnJhcnksIGluY2x1ZGluZzoKCgkgICAgLSBBbG1vc3QgYXV0b21hdGljIHRlbXBsYXRlL3R5cGVtYXAgaW5zdGFudGlhdGlvbiBmb3IKCSAgICAgIHRoZSBTVEwgY29tcG9uZW50cy4gRm9yIGV4YW1wbGUsIG5vdyB5b3UgY2FuIHdyaXRlOgoKCQkgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICAgIGFuZCBhIHNwZWNpYWxpemVkIHZlY3Rvcl9pIGNsYXNzIGlzIGVtaXR0ZWQgd2l0aCBhbGwKCSAgICAgIHRoZSBuZWVkZWQgdHlwZW1hcHMuIE5vIG5lZWQgdG8gdXNlIHRoZSBvbGQKCSAgICAgICdzcGVjaWFsaXplX3ZlY3RvcicgbWFjcm9zLgoKCSAgICAgIE5vdGUgeW91IGNhbiBhbHNvIGRlZmluZQoKCSAgICAgICAgICAldGVtcGxhdGUobWF0cml4X2kpICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+OwoJICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfcGlpKSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LGludD4gPjsKCgkgICAgLSBUaGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAKIAkgCiAgICAgICAgICAgCSAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCgkgICAgICBkZWZpbmVzIHRoZSB2ZWN0b3IgdHlwZW1hcHMsIGJ1dCBubyBwcm94eSBjbGFzcy4gRm9yIGFsbCB0aGUKICAgICAgICAgICAgICBmdW5kYW1lbnRhbCB0eXBlcywgdGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gYXJlCiAgICAgICAgICAgICAgZGVmaW5lZCwgc28sIHlvdSBjYW4gc2F5CgoJICAgICAgJWluY2x1ZGUgc3RkX3ZlY3RvcgoKCSAgICAgIGludCBmdW5jKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGEpOwoJICAgICAgCgkgICAgICB3aGVyZSB0aGUgcHJvcGVyIHR5cGVtYXAgaXMgYXBwbGllZCB0byAnYScsIGJ1dCBubwoJICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwcm94eSBpcyBnZW5lcmF0ZWQuCgkgICAgICAKCiAgICAgICAgICAgIC0gQWxsIHRoZSBTVEwgY29udGFpbmVycyBwcmVzZW50IGEgbW9yZSB1bmlmb3JtIGJlaGF2aW9yIGFuZAoJICAgICAgbW9yZSBjb21wbGV0ZSBpbnRlcmZhY2UgZGVjbGFyYXRpb24uIFRoZSBmb2xsb3dpbmcgYXJlIAoJICAgICAgbm93IHN1cHBvcnRlZDoKCgkJICBzdGQ6OnZlY3RvcjxUPgoJCSAgc3RkOjpsaXN0PFQ+CgkJICBzdGQ6OmRlcXVlPFQ+CgkJICBzdGQ6OnNldDxUPgoJCSAgc3RkOjptdWx0aXNldDxUPgoJCSAgc3RkOjptYXA8VD4KCQkgIHN0ZDo6bXVsdGltYXA8VD4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBub3QgYSBjb250YWluZXIsIGJ1dCBhbHNvIHN1cHBvcnRlZDoKCgkJICBzdGQ6OnBhaXI8VCxVPgoKICAgICAgICAgICAgICBhbHNvLCBtb3JlIHR5cGVtYXBzIGFyZSBkZWZpbmVkIGZvciBhbGwgb2YgdGhlbSwKCSAgICAgIGluY2x1ZGluZyB2YXJpbiwgdmFyb3V0LCB0eXBlY2hlY2ssIGV0Yy4KCiAgICAgICAgICAgIC0gSW5pdGlhbCBhdHRlbXB0IHRvIGltcGxlbWVudCB0aGUgU1RMIGNvbnRhaW5lcnMKICAgICAgICAgICAgICBjb25zaWRlcmluZyBhbGxvY2F0b3JzLCBpZToKCgkgICAgICAgICAgc3RkOjp2ZWN0b3I8VCxBPgkJCQoKCSAgICAgIGl0IGlzIHBhcnRpYWxseSB3b3JraW5nLCBidXQgaXQgaXMganVzdCBhIHdvcmthcm91bmQKCSAgICAgIHdoaWxlIHN3aWcgaW1wcm92ZXMgaXRzIHRlbXBsYXRlIHR5cGUgc3VwcG9ydC4KCSAgICAgIAoJICAgICAgCgkgICAgIFBsZWFzZSB0ZXN0IHdpdGggeW91ciBwYXJ0aWN1bGFyIHNldHVwLiBJdCBzZWVtcyB0byBiZQoJICAgICB3b3JraW5nIHdpdGggZysrIDMuMi4yLCBnKysgMi45NiwgSW50ZWwgaWNjIGFuZCBTR0kgQ0MKCSAgICAgY29tcGlsZXJzLCBwbHVzIHB5dGhvbiAxLjUuMiwgMi4wIGFuZCAyLjMsIGJ1dCBzaW5jZQoJICAgICB3ZSBhcmUgdXNpbmcgdGVtcGxhdGVzLCB0aGVyZSBpcyBhIGNoYW5jZSB5b3UgY2FuIGZpbmQKCSAgICAgc29tZSBwcm9ibGVtcyB3aGVuIHVzaW5nIHdpdGggYW4gb2xkIEMrKyBjb21waWxlci4KCjAzLzE2LzIwMDQ6IG1tYXR1cwoKICAgICAgICAgICAgLSBBbGxvd2luZyB0aGUgZW1wdHkgJXRlbXBsYXRlIGRpcmVjdGl2ZSwgc3VjaCBhcwoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIHRvIHByb2Nlc3MgdGhlIGNsYXNzICJ0eXBlZGVmInMgYW5kICJ0eXBlbWFwInMuIEJlZm9yZQoJICAgICAgb25seSB0aGUgaW50ZXJuYWwgInR5cGVkZWYicyB3ZXJlIHByb2Nlc3NlZC4KCiAgICAgICAgICAgICAgVGhpcyBtYWtlcyBwb3NzaWJsZSB0byBlbWl0IHRoZSBkZWZhdWx0IGluL291dAogICAgICAgICAgICAgIHR5cGVtYXBzIHdpdGhvdXQgdGhlIG5lZWQgb2Ygd3JhcHBpbmcgYW4gc3BlY2lhbGl6ZWQKICAgICAgICAgICAgICB2ZWN0b3IgaW5zdGFuY2UuCgoJICAgIC0gQWRkaW5nIHRoZSBwcmVwcm9jZXNzb3IgZXh0ZW5zaW9uICNAIHdoaWNoIG1hbmdsZXMgdGhlCiAgICAgICAgICAgICAgZm9sbG93aW5nIG1hY3JvIGFyZ3VtZW50LCBsaWtlIGluOgoKICAgICAgICAgICAgICAgICNkZWZpbmUgbWFjcm8oWCkgICNAWAogICAgICAgICAgICAgICAgbWFjcm8oaW50KSAgICAgICAgIC0+IGludAogICAgICAgICAgICAgICAgbWFjcm8oc3RkOjpzdHJpbmcpIC0+IHN0ZF9zX3Nfc3RyaW5nCiAgICAgICAgICAgICAgICAKCSAgICAtIEZyYWdtZW50cyBjYW4gbm93IGJlICJ0eXBlIHNwZWNpYWxpemVkIiwgYXMgdGhlIHR5cGVtYXBzLiBUaGUKCSAgICAgIHN5bnRheCBpcyBhcyBmb2xsb3dzCiAKICAgICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZSIsImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIGEgdHlwZSBpbmRlcGVuZGVudCBmcmFnbWVudCAob2xkIHN5bnRheCkgKi8gfQogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiB7VHlwZX0sICJoZWFkZXIiKSAKICAgICAgICAgICAgICAgICAgeyAvKiB0aGUgZnJhZ21lbnQgaXMgdHlwZSBkZXBlbmRlbnQgKi99CiAKICAgICAgICAgICAgICBOb3cgZnJhZ21lbnRzIGNhbiBhbHNvIGJlIHVzZWQgaW5zaWRlIHRlbXBsYXRlczogCgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAlZnJhZ21lbnQoImluY29kZSJ7QTxUPn0sImhlYWRlciIpIHsKCQkgICAgICAvKiAnaW5jb2RlJyBzcGVjaWFsaXplZCBmcmFnbWVudCAqLwoJCSAgIH0KIAoJCSAgICV0eXBlbWFwKGluLGZyYWdtZW50PSJpbmNvZGUie0E8VD59KSB7CgkJICAgICAgLyoKCQkgICAgICAgICBoZXJlIHdlIHVzZSB0aGUgJ3R5cGUgc3BlY2lhbGl6ZWQnIAogICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgImluY29kZSJ7QTxUPn0KICAgICAgICAgICAgICAgICAgICAgICovCgkJICAgIH0KICAgICAgICAgICAgICAgIH07CgkJCSAgICAgCQoKMDMvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBidWcgd2hpY2ggbWVhbnQgdGhhdCBzb21lIHZpcnR1YWwgZnVuY3Rpb25zIG92ZXJyaWRkZW4gaW4KICAgICAgICAgICAgSmF2YSB3ZXJlIG5vdCBiZWluZyBjYWxsZWQgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gQnVnIHJlcG9ydGVkIGFuZCBmaXhlZAogICAgICAgICAgICBieSBSb2JlcnQgZGUgVnJpZXMgYW5kIFNjb3R0IE1pY2hlbC4KCjAzLzAyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgZm9yZ2V0IHRvIGNoZWNrIHRoZSB0eXBlIG9mIHN0cmluZyBhcmd1bWVudHMuCgowMi8yNC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1uYW1lc3BhY2UgPG5hbWU+LiBUaGlzIGFsbG93cyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICBhIEMjIG5hbWVzcGFjZSBpbnRvIHdoaWNoIGFsbCBDIyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQuCgowMi8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpIAoJICAgIFtNelNjaGVtZV0gVXNlIEZVTkNfTkFNRSByYXRoZXIgdGhhbiBhIGJvZ3VzIHR5cGVtYXAgdmFyaWFibGUgZm9yIHNpZ25hbGxpbmcKCSAgICBlcnJvcnMuICBDYWxsIHNjaGVtZV93cm9uZ190eXBlIHdpdGggYSB6ZXJvLWJhc2VkIGFyZ3VtZW50IG51bWJlci4gIAoJICAgIFJlcG9ydGVkIGJ5IE9uZHJlaiBQYWNvdnNreSwgU0YgIzkwMjYyMS4KCgkgICAgW0d1aWxlXSBEZWZpbmUgRlVOQ19OQU1FIGFsc28gaW4gdGhlIGRpc3BhdGNoIHdyYXBwZXIgZm9yIG92ZXJsb2FkZWQKCSAgICBmdW5jdGlvbnMuICBQYXRjaCBieSBKb2huIExlbnosIFNGICM4OTYyNTUuCgowMi8yMi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIGRvbid0IHRyeSB0byBpbnZva2UgYSBudWxsIGRlc3RydWN0b3IgZnVuY3Rpb24uCgowMi8yMC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgc28gdGhhdCB0aGUgU1dJRyBzb3VyY2Ugd2lsbCBjb21waWxlIHVzaW5nIHRoZSBEaWdpdGFsIE1hcnMgQ29tcGlsZXIKICAgICAgICAgICAgKGZvcm1lcmx5IFN5bWFudGljIGNvbXBpbGVyKSBvbiBXaW5kb3dzLiBTdWJtaXR0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMDIvMTMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gTmV3IGNvbW1hbmQtbGluZSBhcmd1bWVudCAtbm9pbml0LiAgVXNlIGl0IGZvciBidWlsZGluZwoJICAgIHRoZSBydW50aW1lIGxpYnJhcnksIHdoZXJlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBmdW5jdGlvbnMKCSAgICBzY2hlbWVfaW5pdGlhbGl6ZSBldGMuICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTE3NTQuCgoJICAgIFtNelNjaGVtZV0gRG9uJ3QgcHJvZHVjZSBpbnZhbGlkIEMgY29kZSB3aGVuIGludm9rZWQgd2l0aCB0aGUKCSAgICAtZGVjbGFyZW1vZHVsZSBvcHRpb24uICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTExMDguCgkgICAgCgkgICAgW0d1aWxlXSBCdWlsZCB0aGUgcnVudGltZSBsaWJyYXJ5IHdpdGggcGFzc2l2ZSBsaW5rYWdlLCB0byByZW5hbWUKCSAgICB0aGUgU1dJR19pbml0IGZ1bmN0aW9uIHVuaXF1ZWx5LgoKMDIvMTIvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gUGF0Y2ggc3VibWl0dGVkIGJ5IEJpbGwgSG9mZm1hbiB3aGljaCBwcmV2ZW50cyBTV0lHIGZyb20gY3Jhc2hpbmcKICAgICAgICAgICAgd2hlbiBhIGZpbGUgZm9yIHRoZSB0eXBld3JhcHBlciBjbGFzcyBjYW5ub3QgYmUgb3BlbmVkLgoKMDIvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gT3ZlcmxvYWRpbmcgY2hhbmdlczoKICAgICAgICAgICAgICAtIE1ldGhvZHMgd2hpY2ggYXJlIG92ZXJsb2FkZWQgaW4gY29uc3Qgb25seSBubyBsb25nZXIgZ2VuZXJhdGUgSmF2YQogICAgICAgICAgICAgICAgY29kZSB0aGF0IHdvbid0IGNvbXBpbGUgLSB0aGUgZmlyc3QgbWV0aG9kIHBhcnNlZCBpcyB1c2VkIGFuZCBhCiAgICAgICAgICAgICAgICB3YXJuaW5nIGlzIGRpc3BsYXllZC4gTm90ZSB0aGF0IHRoaXMgYmVoYXZpb3VyIGlzIHNsaWdodGx5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2hpY2ggYWx3YXlzIHVzZXMgdGhlIG5vbi1jb25zdCBtZXRob2QuCiAgICAgICAgICAgICAgLSBXYXJuaW5nIG1lc3NhZ2VzIDUwOSBhbmQgNTEyIHJlcGxhY2VkIGJ5IG5ldyB3YXJuaW5nIG51bWJlciA1MTYsIHdoaWNoIAogICAgICAgICAgICAgICAgaXMgbW9yZSByZWxldmFudCB0byB0aGVzZSBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyBhcyB0aGUgb3ZlcmxvYWRlZAogICAgICAgICAgICAgICAgbWV0aG9kcyBhcmVuJ3QgJ3NoYWRvd2VkJywgdGhleSBhcmUgaWdub3JlZC4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFJlcGxhY2UgdGhlICJrbm93bl9jbGFzc2VzIiBoYXNoIHRhYmxlIGJ5IGEgbm9kZQoJICAgIGF0dHJpYnV0ZS4gIE1ldGhvZHMgb2YgY2xhc3NlcyBpbiBDKysgbmFtZXNwYWNlcyBub3cgZ2V0CgkgICAgdGhlIHByb3BlciBzcGVjaWFsaXplciBpbiB0aGUgR09PUFMgZGVjbGFyYXRpb24uCgkgICAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBVbmlxdWlmeSB0aGUgYXJndW1lbnQgbmFtZXMgaW4gR09PUFMgc2hhZG93IG1ldGhvZAoJICAgIGRlY2xhcmF0aW9ucy4gIFJlcG9ydGVkIGJ5IHJtQG1oLWZyZWlidXJnLmRlLgoKMDEvMjEvMjAwNDogc3Vuc2hpbmUgKEVyaWMgU3Vuc2hpbmUpCiAgICAgICAgICAgIFJldml2ZWQgdGhlIE5leHRTdGVwIHBvcnQgb2YgU1dJRy4KCiAgICAgICAgICAgIEZpeGVkIGZhdGFsIHByb2JsZW0gaW4gRG9oU3Ryc3RyKCkgY2F1c2VkIGJ5IGRpZmZlcmVuY2UgaW4gc3Ryc3RyKCkKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFkZSAlYXBwbHkgYmVjb21lIGVudGlyZWx5IGR5c2Z1bmN0aW9uYWwuICBPbgogICAgICAgICAgICBOZXh0U3RlcCwgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0ZXMgdG8gTlVMTDsgd2hlcmVhcywgb24gbW9kZXJuCiAgICAgICAgICAgIHBsYXRmb3JtcywgaXQgZXZhbHVhdGVzIHRvICJmb28iLiAgJWFwcGx5IHJlbGllcyBleHRlbnNpdmVseSB1cG9uCiAgICAgICAgICAgIHN0cnN0cigiZm9vIiwiIikgZXZhbHVhdGluZyB0byBub24tTlVMTCwgdGhlcmVmb3JlIGl0IGZhaWxlZAogICAgICAgICAgICBjYXRhc3Ryb3BoaWNhbGx5IHdoZW4gZmFjZWQgd2l0aCBOZXh0U3RlcCdzIHN0cnN0cigpLgoKICAgICAgICAgICAgQWRkZWQgYGJvb2wnIGNoZWNrIHRvIGNvbmZpZ3VyZS5pbiBzaW5jZSBOZXh0U3RlcCdzIEMrKyBjb21waWxlcgogICAgICAgICAgICBkb2VzIG5vdCBzdXBwbHkgdGhpcyB0eXBlLiAgc3dpZy5oIG5vdyBmYWtlcyB1cCBgYm9vbCcgaWYgbmVlZGVkLgoKICAgICAgICAgICAgV29ya2VkIGFyb3VuZCBOZXh0U3RlcCBDKysgY29tcGlsZXIgYnVnIGluIHdoaWNoIEMrKyBjb2RlIGlzCiAgICAgICAgICAgIGRpc2FsbG93ZWQgaW5zaWRlIGV4dGVybiAiQyIgZnVuY3Rpb25zLiAgVGhpcyBwcm9ibGVtIGFmZmVjdGVkIGFsbAogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLCBzaW5jZSB0aGV5IHB1Ymxpc2ggaG9vayBmdW5jdGlvbnMgb2YgdGhlIGZvcm06CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgRml4ZWQgYnkgY3JlYXRpbmcgYSBDKysgd3JhcHBlcjoKICAgICAgICAgICAgICAgIHN0YXRpYyBMYW5ndWFnZSAqbmV3X3N3aWdfZm9vKCkgeyByZXR1cm4gbmV3IEZPTygpOyB9CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXdfc3dpZ19mb28oKTsgfQoKICAgICAgICAgICAgRW5zdXJlZCB0aGF0IFN3aWdfY29weV9zdHJpbmcoKSBpcyB1c2VkIGluIHBsYWNlIG9mIHN0cmR1cCgpIHNpbmNlCiAgICAgICAgICAgIE5leHRTdGVwIGRvZXMgbm90IHN1cHBseSBzdHJkdXAoKS4KCiAgICAgICAgICAgIEZpeGVkIGRldGVjdGlvbiBvZiBSdWJ5IGxpYnJhcnkgbmFtZSBhbmQgbG9jYXRpb24gaW4gY29uZmlndXJlLmluLgogICAgICAgICAgICBQcm9ibGVtIDE6IEFzc3VtZWQgdGhhdCBsaWJyYXJ5IGFsd2F5cyByZXNpZGVkIGluIFJ1YnkncyAiYXJjaGRpciIsCiAgICAgICAgICAgIHdoaWNoIHdhcyBjb3JyZWN0IGZvciBSdWJ5IDEuNi54LCBidXQgd2hpY2ggaXMgaW5jb3JyZWN0IGZvciBSdWJ5CiAgICAgICAgICAgIDEuOC54LCBpbiB3aGljaCBjYXNlIHRoZSBsaWJyYXJ5IG5vcm1hbGx5IHJlc2lkZXMgaW4gUnVieSdzCiAgICAgICAgICAgICJsaWJkaXIiLiAgUHJvYmxlbSAyOiBBc3N1bWVkIHRoYXQgdGhlIGxpYnJhcnkgY291bGQgYWx3YXlzIGJlCiAgICAgICAgICAgIGxpbmtlZCB2aWEgIi1sIitSVUJZX0lOU1RBTExfTkFNRSAod2hlcmUgUlVCWV9JTlNUQUxMX05BTUUKICAgICAgICAgICAgdHlwaWNhbGx5IGlzICJydWJ5IiksIGhvd2V2ZXIgdGhpcyBmYWlsZWQgZm9yIHBsYXRmb3Jtcywgc3VjaCBhcwogICAgICAgICAgICBOZXh0U3RlcCwgd2hpY2ggZG8gbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4gIEluIHRoaXMgY2FzZSwgdGhlCiAgICAgICAgICAgIHN0YXRpYyBsaWJyYXJ5IG5hbWUgaW4gMS44LnggaXMgbGlicnVieS1zdGF0aWMuYSwgdGh1cwogICAgICAgICAgICAtbHJ1Ynktc3RhdGljIGlzIHJlcXVpcmVkLiAgVGhlIG5ldyBsb2dpYyB3b3JrcyBjb3JyZWN0bHkgZm9yCiAgICAgICAgICAgIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBmb3IgMS42LnggYW5kIDEuOC54LgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFBlcmwgQ0ZMQUdTIGluIGNvbmZpZ3VyZS5pbiBmb3IgTmV4dFN0ZXAuCiAgICAgICAgICAgIERldGVjdGlvbiBjb2RlIGV4dHJhY3RlZCBDRkxBR1MgZnJvbSBQZXJsJ3MgJUNvbmZpZyBoYXNoIGJ1dAogICAgICAgICAgICBuZWdsZWN0ZWQgdG8gYWRkIGEgbmV3bGluZSB0byB0aGUgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgdGhyb3VnaAogICAgICAgICAgICBgc2VkJy4gIE5leHRTdGVwJ3MgYW5jaWVudCBgc2VkJyBkaXNjYXJkcyBpbnB1dCB3aGljaCBpcyBub3QKICAgICAgICAgICAgdGVybWluYXRlZCB3aXRoIGEgbmV3bGluZSwgdGh1cyBQZXJsIENGTEFHUyBhbHdheXMgZXZhbHVhdGVkIHRvIHRoZQogICAgICAgICAgICBlbXB0eSBzdHJpbmcuCgowMS8xNi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGlkeSB1cCBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgdGhhdCBpcyBnZW5lcmF0ZWQgd2hlbgogICAgICAgICAgICBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGFyZSB3cmFwcGVkIHdpdGggdGhlIHRocm93cyB0eXBlbWFwLgogICAgICAgICAgICBUaGlzIHJlZHVuZGFudCBjb2RlIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3c7IAogICAgICAgICAgICAgICAgfQoKMDEvMTIvMjAwNDogd3NmdWx0b24gb24gYmVoYWxmIG9mIG1tYXR1cyAobWFyY2VsbyBtYXR1cykgCiAgICAgICAgICAgIGlmIGEgbWV0aG9kIHVzZXMgJWV4Y2VwdGlvbiBhbmQgdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgdXNlCiAgICAgICAgICAgIG9mIHRoZSB0aHJvd3MgdHlwZW1hcCwgdGhlIGNvZGUgaW4gYSB0aHJvd3MgdHlwZW1hcCB3aWxsIGJlCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnNpZGUgdGhlIHRyeSBib2R5LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBtZXRob2QgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGludCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGdlbmVyaWMgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIEV4Y2VwdCAlewogICAgICAgICAgICAgICAgLy8gdGhyb3dzIHR5cGVtYXAgRXhjZXB0IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgY2xhc3MgRXhjZXB0IHt9OwogICAgICAgICAgICAgIHZvaWQgbWV0aG9kKGludCBpKSB0aHJvdyAoRXhjZXB0KTsKCiAgICAgICAgICAgIFdpbGwgZ2VuZXJhdGU6CgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBhY3Rpb24gCiAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdCAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGludCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgQXMgY2FuIGJlIHNlZW4sIHRoZSBpbm5lciB0cnkgY2F0Y2ggYmxvY2sgaXMgZm9yIHRoZSB0aHJvd3MgdHlwZW1hcHMuCiAgICAgICAgICAgIFByZXZpb3VzbHksIHRoaXMgd2FzIHJldmVyc2VkIHNvIHRoYXQgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jawogICAgICAgICAgICB3YXMgdGhlICVleGNlcHRpb24gY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGl0IHdvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICBpbXBvc3NpYmxlIHRvIGNhdGNoIEV4Y2VwdCBhcyB0aGUgY2F0Y2ggYWxsICguLi4pIHdvdWxkIGNhdGNoIHRoZQogICAgICAgICAgICBleGNlcHRpb24gaW5zdGVhZC4KClZlcnNpb24gMS4zLjIxIChKYW51YXJ5IDExLCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzEwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgb3V0cHV0IGZvcm1hdCBmb3IgYm90aCB3YXJuaW5ncyBhbmQgZXJyb3JzIGNhbiBiZSBzZWxlY3RlZCBmb3IKICAgICAgICAgICAgaW50ZWdyYXRpb24gd2l0aCB5b3VyIGZhdm91cml0ZSBJREUvZWRpdG9yLiBFZGl0b3JzIGFuZCBJREVzIGNhbiB1c3VhbGx5CiAgICAgICAgICAgIHBhcnNlIGVycm9yIG1lc3NhZ2VzIGFuZCBpZiBpbiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0IHdpbGwgZWFzaWx5IHRha2UgeW91IAogICAgICAgICAgICBkaXJlY3RseSB0byB0aGUgc291cmNlIG9mIHRoZSBlcnJvci4gVGhlIHN0YW5kYXJkIGZvcm1hdCBpcyB1c2VkIGJ5IAogICAgICAgICAgICBkZWZhdWx0IGV4Y2VwdCBvbiBXaW5kb3dzIHdoZXJlIHRoZSBNaWNyb3NvZnQgZm9ybWF0IGlzIHVzZWQgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICQgc3dpZyAtcHl0aG9uIC1Gc3RhbmRhcmQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmk6NDogU3ludGF4IGVycm9yIGluIGlucHV0LgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZtaWNyb3NvZnQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmkoNCk6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4NzE5MDkgXSBzaW1wbGUgbmFtZXNwYWNlIHByb2JsZW0uCiAgICAgICAgICAgIFRoaXMgd2FzIGEgcHJvYmxlbSB1c2luZyBhbm9ueW1vdXMgc3RydWN0dXJlcyBpbiBhIG5hbWVzcGFjZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0ICB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgbjsKICAgICAgICAgICAgICAgICAgIH0gUzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NoIENoZXJyeS4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBicm9rZW4gUGVybCBleGFtcGxlcy4KCjEyLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSBhbmQgQyNdIEZpeGVzIGZvciB3cmFwcGluZyBjb3ZhcmlhbnQgKHBvbHltb3JwaGljKSByZXR1cm4gdHlwZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCB+QmFzZSgpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIEJhc2UqIGNvcHkoKSBjb25zdCA9IDA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBEZXJpdmVkKiBjb3B5KCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIERlcml2ZWQ6OmNvcHkgcHJveHkgbWV0aG9kIHJldHVybnMgQmFzZSBub3QgRGVyaXZlZC4gQSB3YXJuaW5nIGlzIGlzc3VlZAogICAgICAgICAgICBhYm91dCB0aGlzLiBQcmV2aW91c2x5IHRoZSBwb2ludGVyIHVzZWQgYnkgdGhlIHByb3h5IGNsYXNzIHdhcyBpbmNvcnJlY3RseQogICAgICAgICAgICB0cmVhdGVkIGFzIGEgQmFzZSogaW5zdGVhZCBvZiBhIERlcml2ZWQqLgoKMTIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBzbyB0aGF0IFdpbmRvd3MgcGF0aHMgYXJlIGRpc3BsYXllZCBjb3JyZWN0bHkgd2hlbiByZXBvcnRpbmcgZXJyb3JzLgogICAgICAgICAgICBBbiBlcnJvciBwcmV2aW91c2x5IHdvdWxkIGhhdmUgYmVlbiBzaG93biBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgICAgICAgLj94YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKICAgICAgICAgICAgaW5zdGVhZCBvZjoKCiAgICAgICAgICAgICAgLlxleGFtcGxlLmk6MTQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCgpWZXJzaW9uIDEuMy4yMCAoRGVjZW1iZXIgMTcsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTGFzdCBtaW51dGUgbW9kaWZpY2F0aW9ucy4gICBQZXJsNSBtb2R1bGUgbm93IGdlbmVyYXRlcyBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgICBieSBkZWZhdWx0IGxpa2UgYWxsIG9mIHRoZSBvdGhlciBtb2R1bGVzLiAgUEhQNCB3cmFwcGVycyBubyBsb25nZXIKICAgICAgICAgICAgaW5jbHVkZSAiY29uZmlnLmgiLiAKCjEyLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgV2Vha2VuZWQgd2FybmluZyBtZXNzYWdlIHJlbGF0ZWQgdG8gY29uc3RydWN0b3IgbmFtZXMgc28gdGhhdCBhbgogICAgICAgICAgICB1bnVzdWFsIG5lc3RlZC1jbGFzcyB3cmFwcGluZyB0ZWNobmlxdWUgd291bGQgd29yayBhZ2FpbiAoYXBwYXJlbnRseQogICAgICAgICAgICBpdCB3b3JrZWQgaW4gc29tZSBvbGRlciBTV0lHIHJlbGVhc2VzKS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlIHsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQTsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQjsKICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGU6OkNsYXNzQSB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NCIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGU6ICBUaGVyZSBpcyBzdGlsbCBzb21lIG9kZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBTV0lHIHN5bWJvbAogICAgICAgICAgICB0YWJsZS90eXBlIHN5c3RlbSB0aGF0IHdpbGwgbmVlZCB0byBiZSBsb29rZWQgYXQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR3VzdGF2byBOaWVtZXllci4KCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3RlY3RlZCBjbGFzcyBtZXRob2RzIGFyZSB3cmFwcGVkIGFzIHByb3RlY3RlZCBKYXZhIG1ldGhvZHMgCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdGhlIGRpcnByb3QgZGlyZWN0b3IgZmVhdHVyZS4gVGhpcyBjYW4gYmUgY2hhbmdlZCB1c2luZwogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyB0byBzb21ldGhpbmcgZWxzZSBzaG91bGQgdGhlIG5lZWQgYXJpc2UsIGZvcgogICAgICAgICAgICBleGFtcGxlLCBwcml2YXRlIG9yIHBhY2thZ2UgYWNjZXNzLgoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIChKYXZhKSBhbmQgJWNzbWV0aG9kbW9kaWZpZXJzIChDIykgb3BlcmF0ZSBzbGlnaHRseSAKICAgICAgICAgICAgZGlmZmVyZW50bHkuIFByZXZpb3VzbHkgdGhpcyBmZWF0dXJlIGhhZCB0byBiZSBwcmVzZW50IHRvIHNldCB0aGUgbWV0aG9kCiAgICAgICAgICAgIG1vZGlmaWVycy4gTm93IGl0IGlzIG9ubHkgdXNlZCBpZiBpdCBleGlzdHMgZm9yIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgInB1YmxpYyIgYXMgcHJldmlvdXMgaG93ZXZlciwgd2hlbiB3cmFwcGluZyBwcm90ZWN0ZWQKICAgICAgICAgICAgZGlyZWN0b3IgbWV0aG9kcyBpdCBpcyAicHJvdGVjdGVkIi4gVGhpcyBjaGFuZ2Ugd2lsbCBub3QgYWZmZWN0IGV4aXN0aW5nCiAgICAgICAgICAgIHVzZSBvZiB0aGUgJWphdmFtZXRob2Rtb2RpZmllcnMgb3IgJWNzbWV0aG9kbW9kaWZpZXJzLgoKMTIvMTEvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGlzIGZpeCBzb21lIHJlY3VycmluZyByZXBvcnRzIGFib3V0IGtleXdvcmRzIG5vdCBiZWVuCgkgICAgcHJvcGVybHkgaWRlbnRpZmllZCBhbmQgd2FybmVkLCBhbmQgaXQgc29sdmVzIHRoZSBwcm9ibGVtCgkgICAgb2YgaG93IHRvIGFkZCBhIHRlc3QgZmlsZSB0byB0aGUgdGVzdC1zdWl0ZSBzdWNoIHRoYXQgaXQKCSAgICBkb2Vzbid0IHVzZSBhbnkga2V5d29yZCBvZiBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMKCSAgICAoYW5kIGRvaW5nIGl0IHdpdGhvdXQgY29tcGlsaW5nIHRoZSB0ZXN0IGZvciBhbGwgdGhlCgkgICAgc3VwcG9ydGVkIGxhbmd1YWdlcywgdGhpbmcgdGhhdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLAoJICAgIGFuZCB3aXRob3V0IHJlcXVpcmluZyB5b3UgdG8ga25vdyBhbGwgdGhlIHN1cHBvcnRlZAoJICAgIGxhbmd1YWdlIGtleXdvcmRzLCB0aGluZyB0aGF0IGlzIGFsd2F5cyBpbXBvc3NpYmxlKS4KCgkgICAgU28gdGhlc2UgYXJlIHRoZSBjaGFuZ2VzIGdsb2JhbGx5IHNwZWFraW5nOgoKCSAgICAtIFVuaWZvcm0gdGhlIGRlZmluaXRpb24gb2YgdGhlIGtleXdvcmQgd2FybmluZ3MgdGhyb3VnaAoJICAgICAgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IGFsbCB0aGUgbGFuZ3VhZ2VzIGhhcyBub3cgYQoJICAgICAgc2VwYXJhdGUgZmlsZSB0aGF0IGRlZmluZXMgdGhlIGtleXdvcmRzIG9yIGJhZCBuYW1lczoKCgkJICBweXRob24vcHl0aG9ua3cuc3dnCgkJICBjaGlja2VuL2NoaWNrZW5rdy5zd2cKICAgICAgICAgICAgICAgICAgLi4uLgoKCSAgICAtIEFkZGVkIGtleXdvcmQgbGlzdCBmb3IgbW9zdCBvZiB0aGUgbGFuZ3VhZ2VzIHRoYXQgZGlkbid0CgkgICAgICBoYXZlIG9uZSAodXNpbmcgdGhlIG5ldyBzZXBhcmF0ZWQgZmlsZSkuCgkJICAgIAkgICAgCgkgICAgLSBBZGRlZCB0aGUgIkFsbCBrZXl3b3JkcyIgd2FybmluZyBzdXBwb3J0OiAtV2FsbGt3IG9wdGlvbi4KCiAgICAgICAgICAgICAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBpbmNsdWRlIGFsbCB0aGUga25vd24ga2V5d29yZHMKCSAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMsIGFuZCBjYW4gYmUgdXNlZCBhczoKCiAgICAgICAgICAgICAgICAgc3dpZyAtV2FsbGt3IC4uLi4KCSAgICAKCSAgICAgIFRoaXMgd2lsbCBoZWxwIHRvIHRoZSBwcm9jZXNzIG9mIGFkZGluZyBhIHRlc3Qtc3VpdGUKCSAgICAgIGZpbGUgdGhhdCBjYW4gYmUgY29tcGlsZWQgaW4gYWxsIHRoZSBzd2lnIHN1cHBvcnRlZAoJICAgICAgbGFuZ3VhZ2VzLCBhbmQgaXQgd2lsbCBiZSBhbHNvIGhlbHBmdWwgZm9yIHVzZXJzIHdobwoJICAgICAgd2FudCB0byBjcmVhdGUgbXVsdGktbGFuZ3VhZ2UgbGlicmFyaWVzLgoJICAgIAoJICAgIEFuZCB0aGVzZSBhcmUgdGhlIGRldGFpbGVkIGNoYW5nZXMgKG1vc3RseSBmaWxlIGFkZGl0aW9uKToKCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBzb21lIHNvcnQgb2Yga2V5d29yZAoJICAgICAgd2FybmluZyBsaXN0LCBtb3ZlIGl0IHRvIGFuIGV4dGVybmFsIGxhbmd1YWdla3cuc3dnCgkgICAgICBmaWxlLCBpZToKCSAgICAKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSBweXRob24uc3dnIC0+IHB5dGhvbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIGNoaWNrZW4uc3dnIC0+IGNoaWNrZW5rdy5zd2cKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSB0Y2w4LnN3ZyAtPiB0Y2xrdy5zd2cKIAogICAgICAgICAgICAgIGFuZCByZS1pbmNsdWRlIGxhbmd1YWdla3cuc3dnIGZyb20gbGFuZ3VhZ2Uuc3dnLgoJICAgIAoJICAgIC0gRm9yIHRoZSBsYW5ndWFnZSB0aGF0IGRpZG4ndCBoYXZlIGEga2V5d29yZCBsaXN0LCBhbmQKCSAgICAgIGZvciB0aGUgb25lcyB0aGF0IEkgY291bGQgZmluZCBhIGxpc3QsIGFkZCB0aGUKCSAgICAgIGxhbmd1YWdla3cuc3dnIGZpbGUsIGllOgoKICAgICAgICAgICAgICAgICBjc2hhcnAvY3NoYXJwa3cuc3dnCiAgICAgICAgICAgICAgICAgamF2YS9qYXZha3cuc3dnCiAgICAgICAgICAgICAgICAgcGhwNC9waHBrdy5zd2cKCQkgcGlrZS9waWtla3cuc3dnCSAKCQkgcnVieS9ydWJ5a3cuc3dnCgoKICAgICAgICAgICAgICBhbHNvIGFkZCBhIGxpbmUgaW4gbGFuZ3VhZ2Uuc3dnIHRvIGluY2x1ZGUKCSAgICAgIGxhbmd1YWdla3cuc3dnLCBidXQgbm93IGl0IGlzIGNvbW1lbnRlZCEhISwgbGlrZSBpbgoJICAgICAgamF2YS5zd2c6CgogICAgICAgICAgICAgICAgICAvKiBqYXZhIGtleXdvcmRzICovCiAgICAgICAgICAgICAgICAgIC8qIHBsZWFzZSB0ZXN0IGFuZCBhY3RpdmF0ZSAqLwogICAgICAgICAgICAgICAgICAvLyVpbmNsdWRlICJqYXZha3cuc3dnIgoKCSAgICAgIGllLCB0aGVyZSB3aWxsIGJlIG5vIGNoYW5nZSBpbiBob3cgc3dpZyBydW5zIG5vcm1hbGx5CgkgICAgICB1bnRpbCB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0ZXN0IGFuZCB1bmNvbW1lbnQgdGhhdAoJICAgICAgbGluZS4KCSAgICAgIAoJICAgICAgU28sIHBsZWFzZSBjaGVjayBlYWNoIGxhbmd1YWdla3cuc3dnIGZpbGUgKEkgbGVmdCB0aGUKCSAgICAgIGxpbmsgdG8gdGhlIGtleXdvcmQgbGlzdCBzb3VyY2UgZm9yIGNoZWNraW5nKSwgYW5kIGFmdGVyCgkgICAgICB0ZXN0aW5nLCB1bmNvbW1lbnQgdGhlICVpbmNsdWRlIGxpbmUuCgoJICAgIC0gQWRkZWQgdGhlIGZpbGUgYWxsa3cuc3dnLCB3aGljaCBpbmNsdWRlcyBhbGwgdGhlCiAgICAgICAgICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZXMuCgoJICAgICAgRm9yIHRoZSBsYW5ndWFnZXMgdGhhdCBoYXMgbm8gbGFuZ3VhZ2Vrdy5zd2cgZmlsZSByaWdodAoJICAgICAgbm93LCBhbmQgaWYgdGhleSBuZWVkIG9uZSwgYWRkIHRoZSBmaWxlIGludG8gdGhlCgkgICAgICBsYW5ndWFnZSBkaXJlY3RvcnksIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgaW5jbHVkZQoJICAgICAgbGluZSBpbnRvIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIAoJICAgIC0gQWRkZWQgdGhlIC1XYWxsa3cgdGhhdCBpbmNsdWRlcyB0aGUgYWxsa3cuc3dnIGZpbGUuCgkgICAgICBOb3RlIHRoYXQgdGhlIG9sZCAtbGFsbGt3LnN3ZyBvcHRpb24gY291bGRuJ3QgYmUgdXNlZAoJICAgICAgc2luY2UgaXQgaW5jbHVkZSB0aGUgZmlsZSBhZnRlciBpdCB3b3VsZCBiZSBuZWVkZWQuCgoKCSAgICBIb3BlZnVsbHksIHRoZSAtV2FsbGt3IG9wdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0CgkgICAgcnVsZXMgaW4gdGhlIHJlbGF0ZWQgdGVzdC1zdWl0ZSBNYWtlZmlsZXMsIHNvLCB3aGVuCgkgICAgY3JlYXRpbmcgYSBuZXcgdGVzdCwgb3IgYWRkaW5nIGEgbmV3IHN3aWcgbGlicmFyeSBmaWxlCgkgICAgKGxpa2UgX3N0ZF9kZXF1ZS5pKSwgc3dpZyB3aWxsIHdhcm4geW91IGlmIHlvdSBhcmUgdXNpbmcgYQoJICAgIGJhZCBuYW1lLCBjb25zaWRlcmluZyBhbGwgdGhlIGxhbmd1YWdlIHdoZXJlIGl0IG5lZWRzIHRvCgkgICAgcnVuLgoJICAgIAoJICAgIFJpZ2h0IG5vdyB5b3UgY2FuIHRlc3QgaXQgYnkgdXNpbmc6CgogICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9InN3aWcgLVdhbGxrdyIKCgkgICAgb3IgdXNpbmcgeW91ciBmYXZvcml0ZSB0YXJnZXQgbGFuZ3VhZ2UsIGl0IGRvZXNuJ3QgbWF0dGVyLgoKCSAgICBBbmQgeWVzLCB0aGVyZSBhcmUgc2V2ZXJhbCBleGFtcGxlcyB0aGF0IGFyZSB1c2luZwoJICAgIHJlc2VydmVkIGtleXdvcmRzLCBzcGVjaWFsbHkgZnJvbSBjc2hhcnAuCiAgICAgICAgICAKCSAgICAqKiogUmVtZW1iZXIgKioqKjogdGhlIG5ldyBrZXl3b3JkIHdhcm5pbmcgbGlzdHMgYXJlIG5vdAoJICAgIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gYW55IG9mIGxhbmd1YWdlIHRoYXQgYmVmb3JlIGRpZG4ndAoJICAgIGhhdmUgb25lLiBUbyBlbmFibGUgdGhlIGtleXdvcmQgd2FybmluZ3MgYXMgdGhlIGRlZmF1bHQKCSAgICBiZWhhdmlvciwgdGhlIGluY2x1c2lvbiBvZiB0aGUgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSBoYXMgdG8KCSAgICBiZSB1bmNvbW1lbnRlZCBhdCBlYWNoIGxhbmd1YWdlLnN3ZyBmaWxlLgoKCSAgICBTbywgYWxsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVycywgcGxlYXNlIGNoZWNrIHRoZQoJICAgIGtleXdvcmRzIGxpc3QuIAoKCSAgICBBbHNvLCB5b3UgY2FuIGFkZCBidWl0LWluIG5hbWVzLCBhbmQgbm90IG9ubHkga2V5d29yZHMsIGxpa2UKCSAgICAnVHJ1ZS9GYWxzZScgaW4gcHl0aG9uLiAgUmVtZW1iZXIgdGhhdCB5b3UgY2FuIGJlIG1vcmUKCSAgICBzcGVjaWZpYyBhbmQgcmVmZXIgb25seSB0byBtZW1iZXIgbmFtZXMsIGxpa2UgKjo6Y29uZmlndXJlCgkgICAgb3IgKjo6Y2dldCAoc2VlIGFuIGV4YW1wbGUgaW4gdGhlIHRjbDgvdGNsOGt3LnN3ZyBmaWxlKSwKCSAgICBvciBvbmx5IGdsb2JhbCBuYW1lcywgbGlrZSA6OnJhbmdlIChzZWUgYW4gZXhhbXBsZSBpbiB0aGUKCSAgICBweXRob24vcHl0aG9ua3cuc3dnIGZpbGUuCgoJICAgIEp1c3QgdG8gYmUgY29uc2lzdGVudCwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZXM6CgoJICAgIC0gVXNlIGNvZGUgMzE0IGZvciBrZXl3b3JkIGFuZC9vciBmYXRhbCBiYWQgbmFtZXMuCgkgICAgLSBVc2UgY29kZSAzMjEgZm9yIGJ1aXQtaW4gYW5kL29yIG5vdCBmYXRhbCBiYWQgbmFtZXMuCiAgICAgICAgICAgCiAgICAgICAgICAgIHNvLCB0aGV5IGNhbid0IGJlIGRpc2FibGVkL2VuYWJsZWQgaW5kZXBlbmRlbnRseSAoc2VlCgkgICAgcHl0aG9uL3B5aHRvbmt3LnN3ZyBmb3IgZXhhbXBsZXMpLgoKCSAgICAqKioqIEFuZCBkb24ndCBhZGQgYW55IG5ldyB0ZXN0IGZpbGUgd2l0aG91dCBjaGVja2luZyBpdAoJICAgIHdpdGggdGhlIC1XYWxsa3cgb3B0aW9uISEgKHRoYXQgaW5jbHVkZXMgbWUpICoqKioqLgoJICAKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTRiBidWcgIzg1NDYzNAogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBhY2NlcHRpbmcgdGhlIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciAnLycgb24gCiAgICAgICAgICAgIFdpbmRvd3MgYW5kIHRoZSBNYWMgaW4gYWRkaXRpb24gdG8gdGhlIG5hdGl2ZSBvbmUgKCAnXCcgb24gCiAgICAgICAgICAgIFdpbmRvd3MpLiBUaGlzIGNhbiBiZSB1c2VkIGluICVpbXBvcnQsICVpbmNsdWRlIGFuZCBjb21tYW5kbGluZSAKICAgICAgICAgICAgb3B0aW9ucyB0YWtpbmcgYSBwYXRoLCBmb3IgZXhhbXBsZSAtSS4gT24gQ3lnd2luLCBib3RoIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIGFuZCBVbml4IGRpcmVjdG9yeSBzZXBhcmF0b3IgY2FuIG5vdyBiZSB1c2VkICh3YXMgJy8nIG9ubHkpLgogICAgICAgICAgICAKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKICAgICAgICAgICAgW3B5dGhvbl0gSW1wbGVtZW50aW5nIHRoZSBydW50aW1lICJyZXByb3RlY3RlZCIgZGlyZWN0b3IKCSAgICBtZW1iZXJzLCBpZiB5b3UgaGF2ZToKICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXIoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgaGVsbG8oKSB7IHJldHVybiBkb19oZWxsbygpOykKCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGRvX2hpKCkge3JldHVybiAwO30KICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGVsbG8oKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4sIGF0IHRoZSBweXRob24gc2lkZQoKICAgICAgICAgICAgICAgIGltcG9ydCBteV9tb2R1bGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28obXlfbW9kdWxlLkJhcik6CiAgICAgICAgICAgICAgICAgIGRlZiBkb19oZWxsbyhzZWxmKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgCgkgICAgICAgIGIgPSBCYXIoKSAjIFB1cmUgQysrIERpcmVjdG9yIGNsYXNzCiAgICAgICAgICAgICAgICBmID0gRm9vKCkgIyBDKysgRGlyZWN0b3IgKyBweXRob24gbWV0aG9kcwoKICAgICAgICAgICAgICAgIGIuaGVsbG8oKSAjIE9rLCBhbmQgaXQgY2FsbHMgQysrIEJhcjo6ZG9faGVsbG8oKQogICAgICAgICAgICAgICAgZi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBQeXRob24gRm9vOjpkb19oZWxsbygpCgogICAgICAgICAgICAgICAgYi5kb19oaSgpICMgUnVudGltZUVycm9yLCBkb19oaSgpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKIAogICAgICAgICAgICAgICAgYi5kb19oZWxsbygpICMgUnVudGltZUVycm9yLCBkb19oZWxsbygpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hlbGxvKCkgIyBPaywgc2luY2UgaXQgaXRzIHJlZGVmaW5lZCBpbiBweXRob24uCgogICAgICAgICAgICBIZXJlIEJhci5kb19oZWxsbyBpcyBhbHdheXMgcHJvdGVjdGVkLCBidXQgRm9vLmRvX2hlbGxvCiAgICAgICAgICAgIGlzICJwdWJsaWMiLCBiZWNhdXNlIGl0IGlzIHJlZGVmaW5lZCBpbiBweXRob24uIEJlZm9yZSwKCSAgICBhbGwgdGhlICdkb19oZWxsbycgbWV0aG9kcyB3ZXJlIHB1YmxpYy4KCgkgICAgVGhpcyBzZWVtcyB0byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIEMrKyBhbmQgcHl0aG9uCgkgICAgcGhpbG9zb3BoaWVzLCBpZSwgYWxsIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBrZWVwCgkgICAgcHJvdGVjdGVkIGF0IHRoZSB1c2VyIHNpZGUgKEMrKyB3YXkpIHVudGlsIHRoZXkgYXJlCgkgICAgcmVkZWZpbmVkIChweXRob24gd2F5LCB3ZXJlIGFsbCBkZWZpbmVkIG1ldGhvZHMgYXJlIGFsd2F5cwoJICAgIHB1YmxpYykuIEFuZCB0aGlzIGlzIG5vdCBvbmx5IGEgZ29vZCBjb21wcm9taXNlLCBpdCBhbHNvCgkgICAgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIGRvIGl0IDopLgoKCSAgICBOb3cgcnVieSBoYXMgbmF0aXZlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzLCBhbmQgcHl0aG9uCgkgICAgcHVyZSBydW50aW1lIHN1cHBvcnQuIEkgZ3Vlc3MgdGhlc2UgYXJlIHRoZSB0d28gcG9zc2libGUKCSAgICBleHRyZW1lIGNhc2VzLiBBbmQgaG9wZWZ1bGx5LCB0aGV5IGNvdWxkIGJlIHVzZWQgYXMKCSAgICB0ZW1wbGF0ZXMgdG8gbW9kaWZ5IHRoZSBvdGhlciBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0CgkgICAgZGlyZWN0b3JzLCBzbyB0aGV5IGNhbiAicmVwcm90ZWN0IiB0aGUgcHJvdGVjdGVkIGRpcmVjdG9yCgkgICAgbWVtYmVycyBhdCB0aGUgdGFyZ2V0IGxhbmd1YWdlIHNpZGUuCgoJICAgIFRoaXMgZmluaXNoZWQgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBzdXBwb3J0IGZvciB0aGUgCgkgICAgcHl0aG9uIGxhbmd1YWdlLiBPY2FsbSB3aWxsIG5lZWQgdG8gYWRkIHRoZQoJICAgICJyZXByb3RlY3Rpb24iIGxhdGVyLgoKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGUgZm9sbG93aW5nIGNhc2UgKHJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbikgd2FzIGZpeGVkOgoKCSAgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CiAKCSAgICAgIGNsYXNzIEZvbyB7IAoJICAgICAgcHVibGljOgoJICAgICAgICB2b2lkIHkoKTsKCgkgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgIGludCB4OwoJICAgICAgfTsKCgkgICBzd2lnIHdhcm5lZCB0aGF0IHRoZSBzeW1ib2wgJ3gnIHdhcyBhbHJlYWR5IGRlZmluZWQsIGFuZAogICAgICAgICAgIHRoZSByZW5hbWluZyBmYWlscy4gJ3gnIHdhcyBub3QgZW1pdHRlZCwgc2luY2UgaXQgaXMKICAgICAgICAgICBwcm90ZWN0ZWQsIGJ1dCBpdCB3YXMga2VwdCBpbiB0aGUgc3ltYm9sIHRhYmxlIHdpdGggdG9vCiAgICAgICAgICAgbXVjaCBpbmZvcm1hdGlvbi4KCgkgICBOb3cgc3dpZyB3b3JrcyBmb3IgYWxsIHRoZSBjYXNlcyAocGxhaW4sIGRpcmVjdG9yIGFuZAoJICAgZGlycHJvdCkgYWdhaW4uIFRoaXMgd2FzIGZpeGVkIGJ5IGFsbG93aW5nIHRoZSBwYXJzZXIueSB0bwoJICAgZGVjaWRlIG11Y2ggY2xvc2VyIHdoYXQgdG8gZG8gd2l0aCAneCcuIEJlZm9yZSBhbGwgdGhlCgkgICBkaXNjYXJkaW5nIG9yIGdlbmVyYXRpb24gd2FzIHJlc29sdmVkIGF0IHRoZSBsYW5nLmN4eAoJICAgc3RhZ2UuIEFsc28gdGhlIGNoYW5nZXMgaW4gcGFyc2VyLnkgdG8gaW1wbGVtZW50IHRoZQoJICAgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUgYXJlIG5vdyBtdWNoIG1vcmUgZW5jYXBzdWxhdGVkLCBhbmQKCSAgIHRoZXkgZ2V0IGRpc2FibGVkIGlmIHRoZSBtb2RlIGlzIG5vdCBlbmFibGVkLiBCZWZvcmUgdGhlCgkgICBkZWFjdGl2YXRpb24gd2FzIGRvbmUgYXQgdGhlIGdlbmVyYXRpb24gc3RhZ2UgKGxhbmcuY3h4KS4KCgkgICBCeSB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGRpcmVjdG9yIG1vZGUgaXMgZW5hYmxlZCwgYW5kCgkgICAlcmVuYW1lIGlzIGRvbmUsIHJldXNpbmcgYSBwcm90ZWN0ZWQgbWVtYmVyIG5hbWUsIHRoZXJlIGlzCgkgICBhIHBhdGhvbG9naWNhbCBjYXNlOgoKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAogICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEEgewoJICAgICBwdWJsaWM6CgkgICAgICAgdm9pZCB5KCk7CgoJICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgaW50IHg7ICAgICAgICAgICAgLyogd29ya3MgKi8KCSAgICAgICBzdGF0aWMgIGludCB4OyAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgdm9pZCB4KCk7IC8qIHdvcmtzICovCgkgICAgICAgdHlwZWRlZiB2b2lkIHgoKTsgLyogd29ya3MgKi8KCgkgICAgICAgdmlydHVhbCB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBhcyBpdCBzaG91bGQsIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbzo6eCgpIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3IgKi8KCgkgICAgICAgdm9pZCB4KCk7IC8qIGFsd2F5cyBmYWlscywgYnV0IHNvbWV0aW1lcyBpdCBzaG91bGRuJ3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSB0aGUgRm9vOjp4KCkgd2lsbCBub3QgYmUgZW1pdHRlZCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgbm90IHZpcnR1YWwgKi8KCgkgICAgIH07CgoJICAgVGhlIGxhc3QgY2FzZSBpcyBub3QgYWx3YXlzIHJpZ2h0IGJlY2F1c2UgYXQgdGhlIHBhcnNlci5weQoJICAgc3RhZ2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlY2lkZSBpZiB0aGUgcHJvdGVjdGVkIG1lbWJlcgoJICAgRm9vOjp4KCkgY291bGQgb3Igbm90IGNvbmZsaWN0IHdpdGggdGhlIHJlbmFtZWQgRm9vOjp5KCksCgkgICBzaW5jZSBGb286OngoKSBjb3VsZCBiZSB2aXJ0dWFsIGJ5IGluaGVyaXRhbmNlLgoKCSAgIEkgZ3Vlc3MgdGhpcyBqdXN0IGFuIGludHJpbnNpYyBsaW1pdGF0aW9uLCBhbmQgbm8gbXVjaCBjYW4KCSAgIGJlIGRvbmUgYWJvdXQgaXQgd2l0aG91dCByZXNvcnRpbmcgaW50byBsYXJnZXIgY2hhbmdlcyB0bwoJICAgcG9zdHBvbmUsIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgdGhlIG11bHRpcGx5IHN5bWJvbAoJICAgZGV0ZWN0aW9uIChsYW5nLmN4eCBzdGFnZSkuCgkgICAKCSAgIFNvLCBieSBub3csIGl0IGlzIGp1c3QgY29uc2lkZXJlZCBhIHdlbGwga25vd24gImZlYXR1cmUiIGluCgkgICB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUuIFRoZSBnb29kIG5ld3MgaXMgdGhhdCBpdCBzZWVtcwoJICAgdG8gYmUgYSByYXJlIGNhc2UsIGFuZCBpdCBjYW4gYmUgYXZvaWRlZCBieSB0aGUgdXNlciBieQoJICAgaGlkaW5nICd4JyBiZWZvcmUgcmVuYW1pbmcgJ3knOgoKCSAgICAgJXJlbmFtZShfeCkgRm9vOjp4KCk7CgkgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CgkgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgdmlydHVhbCBtZXRob2QgZGV0ZWN0aW9ucyBub3cgcHJvcGVybHkKCSAgICB0cmVhdHMgdGhlIGZvbGxvd2luZyBjYXNlczoKCiAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsgdHlwZWRlZiBpbnQgSW50OyB9CgkgICAgIHN0cnVjdCBBIHt9OwoJICAgICB0eXBlZGVmIEEgQjsKCiAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgdmlydHVhbCB+Rm9vKCkge30KCiAgICAgICAgICAgICAgIHZpcnR1YWwgRm9vKiBjbG9uZXIoKSA9IDA7CgkgICAgICAgdmlydHVhbCBpbnQgZ2V0X3ZhbHVlKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgQSogZ2V0X2NsYXNzKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgdm9pZCBqdXN0X2RvX2l0KCkgPSAwOwoJICAgICB9OwoKICAgICAgICAgICAgIHN0cnVjdCBCYXIgOiBGb28KICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgQmFyKiBjbG9uZXIoKTsKICAgICAgICAgICAgICAgZm9vOjpJbnQgZ2V0X3ZhbHVlKCk7CiAgICAgICAgICAgICAgIEIqIGdldF9jbGFzcygpOwogICAgICAgICAgICAgICB2b2lkIGp1c3RfZG9faXQoKTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgQWxsIHRoZSBGb28gYW5kIEJhciBtZXRob2RzIGFyZSB2aXJ0dWFsLiAgQSBuZXcgYXR0cmlidXRlCgkgICAgInZpcnR1YWw6dHlwZSIgcmVjb3JkIHRoZSBiYXNlIHBvbHltb3JwaGljIHR5cGUuIEluIHRoZQoJICAgIHByZXZpb3VzIGNhc2VzIHdlIGhhdmU6CgoJICAgICAgIHR5cGUgOiBCYXIgICAgICAgdmlydHVhbDp0eXBlIDogRm9vCgkgICAgICAgdHlwZSA6IGZvbzo6SW50ICB2aXJ0dWFsOnR5cGUgOiBpbnQKCSAgICAgICB0eXBlIDogQiAgICAgICAgIHZpcnR1YWw6dHlwZSA6IEEKCSAgICAgICB0eXBlIDogdm9pZCAgICAgIHZpcnR1YWw6dHlwZSA6IHZvaWQKCiAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHVzZWZ1bCBpbiBsYW5ndWFnZXMgKGphdmErZGlyZWN0b3JzKQoJICAgIHRoYXQgY291bGQgaGF2ZSBwcm9ibGVtcyByZWRlZmluaW5nIEJhciogQmFyOjpjbG9uZXIoKS4KCgkgICAgSWYgeW91IG5ldmVyIGhhZCBjb2RlIGxpa2UgdGhlIGFib3ZlLCB5b3Ugd2lsbCBzZWUgbm8KCSAgICBlZmZlY3RzLiBCdXQgaWYgeW91IGhhdmUgc29tZSBjb2RlIGxpa2UgdGhhdCwgeW91CgkgICAgd2lsbCBzZWUgc29tZSBlZmZlY3RzIHNpbmNlIHNvbWUgbWV0aG9kcyB0aGF0CgkgICAgYmVmb3JlIHdlcmUgbm90IHByb3Blcmx5IHRyZWF0ZWQgYXMgdmlydHVhbCwKCSAgICB3aWxsIHN0YXJ0IHRvIGFjdCBsaWtlIHRoYXQuIFRoaXMgY291bGQgZW5sYXJnZQoJICAgIHlvdXIgZGlyZWN0b3IgY2xhc3Nlcy4KCSAgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlciBzdXBwb3J0IChkaXJwcm90KQoJICAgIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCgkgICAgCgkgICAgSXQgY2FuIGJlIGVuYWJsZSBieSB1c2luZyAnLWRpcnByb3QnIG9yIGJ5IGFkZGluZwoJICAgIHRoZSBvcHRpb24gdG8gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbiwgbGlrZToKCiAgICAgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIixkaXJwcm90PSIxIikgbXlfbW9kdWxlCgoJICAgIFRoaXMgbW9kdWxlIG9wdGlvbiB3YXMgYWRkZWQgdG8gcHJvcGVybHkgY29tcGlsZSB0aGUKCSAgICBkaXJlY3Rvcl9wcm90ZWN0ZWQuaSBhbmQgZGlyZWN0b3JfbmVzdGVkLmkgZXhhbXBsZXMuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUgaGFzIGJlZW4gdGVzdGVkIHdpdGggcHl0aG9uWzIuMiwyLjNdIAoJICAgIGFuZCBydWJ5WzEuNi43XSwgYm90aCBhdCBjb21waWxhdGlvbiBhbmQgcnVudGltZSwgYW5kIAoJICAgIGphdmFbajJzZGsxLjQuMV8wMV0sIGJ1dCBvbmx5IGF0IGNvbXBpbGF0aW9uIChteSBqYXZhCgkgICAgaW5zdGFsbGF0aW9uIGRvZXNuJ3QgcnVuIGFueSBvZiB0aGUgZGlyZWN0b3IgZXhhbXBsZXMsCgkgICAgb2xkcyBub3IgbmV3cykuCgoJICAgIFBsZWFzZSB0ZXN0IGZvciBvY2FtbCBhbmQgamF2YS4KCSAgICAKCSAgICBUaGUgZXJyb3JzIHJlcG9ydGVkIGJ5IFdpbGxpYW0gYW5kIFNjb3R0IHdlcmUgZml4ZWQsCgkgICAgZXhjZXB0IGZvciBhIHdhcm5pbmcgYWJvdXQgIFNXSUdfSmF2YVRocm93RXhlY3B0aW9uKCkKCSAgICBtdWx0aXBseSBkZWZpbmVkLiBJIGNhbid0IHJlcHJvZHVjZSB0aGlzIGVycm9yIHdpdGggbXkKCSAgICBleGFtcGxlcy4gV2Ugd2lsbCB3YWl0IGZvciBTY290dCB0byBzZW5kIHVzIGEgbWluaW1hbAoJICAgIGNhc2UuCgoKMTIvMDcvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgaGFzIGJlZW4KCSAgICBjb21wbGV0bHkgbW92ZWQgb3V0IGZyb20gcHl0aG9uLmN4eCwgYW5kIG5vdwoJICAgIHJlc2lkZXMgaW4gdGhlIGNvbW1vbiBsYW5nLmN4eCwgZW1pdC5jeHggYW5kCgkgICAgYWxsb2NhdGUuY3h4IGZpbGVzLiAKCgkgICAgVGhpcyBtZWFucyBpdCBzaG91bGQgd29yayBmb3IgYWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICB0aGF0IGN1cnJlbnRseSBzdXBwb3J0IGRpcmVjdG9ycywgaWUsIHB5dGhvbiwgamF2YSwgb2NhbG0KCSAgICBhbmQgcnVieS4KCgkgICAgVGhlIGNoYW5nZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob24gKGNvbXBpbGF0aW9uK3J1bnRpbWUpCgkgICAgYW5kIGphdmEgKGp1c3QgY29tcGlsYXRpb24pLgoJICAgIAoJICAgIFBsZWFzZSBhZGQgcnVudGltZSB0ZXN0cyBmb3IgdGhlIG1pc3NpbmcgbGFuZ3VhZ2VzIAoJICAgIGFuZCB0ZXN0IGl0LgoKCSAgICBUaGUgJy1ub2RpcnByb3QnIG9wdGlvbiB3YXMgbW92ZWQgdG8gdGhlIHByaW5jaXBhbCBtYWluLAoJICAgIGFuZCBjYW4gYmUgdXNlZCBmcm9tIGFsbCB0aGUgbGFuZ3VhZ2VzLgoKMTIvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBhbmQgaW1wcm92ZWQgZXJyb3IgY2hlY2tpbmcgb2YgU1RSSU5HX09VVCB0eXBlbWFwcyBpbiAKICAgICAgICAgICAgdmFyaW91cy5pLgoKMTIvMDQvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICAtIE5vdyB0aGUgdmlydHVhbCBtZW1iZXJzIHdpdGggbm8gZXhwbGljaXQgZGVjbGFyYXRvcgoJICAgIGFyZSBwcm9wZXJseSBpZGVudGlmaWVkOgoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgewogICAgICAgICAgICAgICAgICBpbnQgZigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgSGVyZSwgQjo6ZigpIGlzIHZpcnR1YWwsIGFuZCB0aGUgZGlyZWN0b3IgYW5kIHRoZQoJICAgIHZpcnR1YWwgZWxpbWluYXRpb24gbWVjaGFuaXNtIG5vdyByZWNvZ25pemUgdGhhdC4KCiAgICAgICAgICAgIC0gW0MjXSBUaGlzIGZpeCBhbHNvIGZpeGVzIHRoZSBwcm9ibGVtIHdoZXJlICdvdmVycmlkZScgd2FzIG5vdCBiZWluZyAKICAgICAgICAgICAgdXNlZCBvbiBhbnkgb3ZlcnJpZGRlbiB2aXJ0dWFsIG1ldGhvZCwgc28gZm9yIHN0cnVjdCBCIGFib3ZlLCAKICAgICAgICAgICAgdGhpcyBDIyBjb2RlIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgQiA6IEEgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBmKCkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCSAgICAtIEluaXRpYWwgc3VwcG9ydCBmb3IgcHJvdGVjdGVkIHZpcnR1YWwgbWV0aG9kcy4gVGhleSBhcmUgbm93CgkgICAgcHJvcGVybHkgZW1pdHRlZCB3aGVuIHVzaW5nIHdpdGggZGlyZWN0b3IgKHB5dGhvbiBvbmx5IGJ5CgkgICAgbm93KS4KCSAgICAKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEE7ICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMSgpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQXsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgZjIoKTsKICAgICAgICAgICAgICAgIH07CgoJICAgIFRoaXMgY2FuIGJlIGRpc3NhYmxlZCBieSB1c2luZyB0aGUgJy1ub2RpcnByb3QnIG9wdGlvbi4KCgkgICAgLSBUaGUgZmVhdHVyZSAnbm9kaXJlY3RvcicgaXMgd29ya2luZyBub3cgYXQgdGhlIHRvcCBsZXZlbCwKCSAgICBzbywgaXQgbXVzdCB3b3JrIGZvciBhbGwgdGhlIGxhbmd1YWdlczoKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBBOwogICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vZGlyZWN0b3IiKSBBOjpmMjsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMigpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIAoJICAgIGluIHRoaXMgY2FzZSwgb25seSAnZjEnIGlzIGV4cG9ydGVkIHRvIHRoZSBkaXJlY3RvciBjbGFzcy4KCSAgICAKCSAgICAtIEFkZGVkIGRpcmVjdG9yIHN1cHBvcnQgZm9yIGNvbnN0IFRZUEUmIGFyZ3VtZW50cyAocHl0aG9uKS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBJTk9VVCBhbmQgT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIHdoZW4gdGhlIEpOSSB0eXBlIAogICAgICAgICAgICBpcyBiaWdnZXIgdGhhbiB0aGUgQyB0eXBlLiBGb3IgZXhhbXBsZSwgdW5zaWduZWQgbG9uZyAoMzJiaXRzIG9uIG1vc3Qgc3lzdGVtcykKICAgICAgICAgICAgaXMgbWFwcGVkIHRvIGpsb25nICg2NGJpdHMpLiBSZXR1cm5lZCB2YWx1ZSB3YXMgaW5jb3JyZWN0LiBCdWcgcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEJyaWFuIEhhd2xleS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEJldHRlciBmaXggZm9yIGVudHJ5IGRhdGVkIDA1LzExLzIwMDMuIEZpeGVzIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgdHlwZW1hcHM6CgogICAgICAgICAgICBKYXZhOiBqYXZhYmFzZSwgamF2YWludGVyZmFjZXMsIGphdmFpbXBvcnRzLCBqYXZhY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgamF2YWZpbmFsaXplLCBqYXZhZ2V0Y3B0ciAmIGphdmFjb2RlLgogICAgICAgICAgICBDIzogY3NiYXNlLCBjc2ludGVyZmFjZXMsIGNzaW1wb3J0cywgY3NjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgY3NmaW5hbGl6ZSwgY3NnZXRjcHRyICYgY3Njb2RlLgoKICAgICAgICAgICAgSXQgYWxzbyBmaXhlcyBidWcgaW4gdXNpbmcgYXJyYXlzIG9mIEMgc3RydWN0cyB3aXRoIGFycmF5c19qYXZhLmkgCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIFNjb3R0IE1pY2hlbC4KCjEyLzAyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1BlcmxdIEZpeGVkIFsgODUyMTE5IF0gcmVjdXJzaXZlIGluaGVyaXRhbmNlIGluIG91dHB1dCAucG0sIHBlcmw1LgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIERvd2xpbmcuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIFsgNzU1MzgyIF0gY2FsbGluZyBmdW5jKGNvbnN0IHZlY3RvcjxUPiYgcCkgZXZhbHVhdGVzIHBbMF0gaW4gaW50ZXJwLgogICAgICAgICAgICBUaGUgVGNsIHR5cGUgY2hlY2tlciB3YXMgaW1wcm9wZXJseSBoYW5kbGluZyB0aGUgaW50ZXJwcmV0ZXIgcmVzdWx0IHdoZW4KICAgICAgICAgICAgdHlwZSB2aW9sYXRpb25zIHdlcmUgc3VwcG9zZWQgdG8gYmUgaWdub3JlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxhdml1IFBvcHAtTm93YWsuCgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA1NDUwNTggXSBjb25maWd1cmUncyAtLXdpdGgtdGNsaW5jbCBoYXMgbm8gZWZmZWN0CgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgNzY2NDA5IF0gbWlzc2luZyBzeW1ib2wgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gZHVyaW5nIG1vZHVsZSBsb2FkCiAgICAgICAgICAgIFNXSUdzIGludGVybmFsIGZ1bmN0aW9ucyBhcmUgYWxsIHN0YXRpYyBhcyB0aGVyZSBpcyBubyBuZWVkIGZvciBkaWZmZXJlbnQgU1dJRwogICAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcyB0byBzaGFyZSBhbnkgY29kZSBhdCBydW50aW1lLgoKMTEvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBBZGRlZCBzdXBwb3J0IGZvciBDKysgcG9pbnRlcnMgdG8gbWVtYmVycy4KCjExLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDg0ODMzNSBdIERpcmVjdG9yczogI2luY2x1ZGUgd3JhcHBlciAuaCBmaWxlIC0gd2FzIGluY29ycmVjdGx5CiAgICAgICAgICAgIGFkZGluZyBhIGRpcmVjdG9yeSB0byB0aGUgZ2VuZXJhdGVkICNpbmNsdWRlICJmb29fd3JhcC5oIiBzdGF0ZW1lbnQKICAgICAgICAgICAgaW4gc29tZSBzaXR1YXRpb25zLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBbIDg0OTA2NCBdIEpBVkEgOiBBY2Nlc3MgbW9kaWZpZXIgZm9yIGRlcml2ZWQgY2xhc3Mgd3JvbmcuCiAgICAgICAgICAgIFRoZSBkZWxldGUoKSBtZXRob2QgaXMgYWx3YXlzIHB1YmxpYyBub3cuIEl0IHVzZWQgdG8gYmUgcHJvdGVjdGVkIHdoZW5ldmVyIGEgCiAgICAgICAgICAgIGRlc3RydWN0b3Igd2FzIG5vbiBwdWJsaWMuIEFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHJ1bnRpbWUgCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zdGVhZCBvZiBtYWtpbmcgZGVsZXRlKCkgcHJvdGVjdGVkIG5vdy4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBBZGRlZCBzdXBwb3J0IGZvciBDKysgcG9pbnRlcnMgdG8gbWVtYmVycy4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4NTAxNTEgXSBQWVZFUlNJT04gd2l0aCBweXRob24yLjMgaW4gY29uZmlndXJlIG9mIFNXSUcgMS4zLjE5IChNYXliZSkuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkICBbIDg1MDY2NiBdICNpbmNsdWRlIGV4dHJhIGxpbmUgYWRkZWQuICAKICAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHNvbWUgcHJvYmxlbXMgd2l0aCBnZXR0aW5nIGNvcnJlY3QgbGluZSBudW1iZXJzIG9uCiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2VzLgoKMTEvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhbm90aGVyIG9uZSBvZiBNYXJjZWxvJ3MgZXZpbCB0ZW1wbGF0ZSBidWdzIChpbmZpbml0ZQogICAgICAgICAgICByZWN1cnNpb24pLiBbIDg0OTUwNCBdIHRlbXBsYXRlIGFuZCB0eXBlZGVmIC0+IGluZi4gcmVjdXJzaW9uLgoKMTEvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwYXJzaW5nIHByb2JsZW0gd2l0aCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzOgoKCSAgICAgICAgIGludCAqeCA9ICZzb21lYXJyYXlbMF07CgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzU2NTUyIF0gbWlzc2luZyBkZWZhdWx0IGFyZ3VtZW50IGNsYXNzIHNjb3BlIHdpdGggInwiLgogICAgICAgICAgICBUaGlzIGlzIHJlYWxseSBvbmx5IGEgYmFuZC1haWQgZml4IGZvciB1c2Ugb2YgY2xhc3MtZW51bXMgaW4KICAgICAgICAgICAgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGVudW0gRmxhZyB7IGZsYWcxID0gMHgxLCBmbGFnMiA9IDB4MiB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgeCA9IGZsYWcxIHwgZmxhZzIpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm90ZTogdGhlcmUgYXJlIHN0aWxsIHNvbWUgKG1vcmUgc3VidGxlKSBjYXNlcyB0aGF0IGFyZSBicm9rZW4sCiAgICAgICAgICAgIGJ1dCBoYXJkIHRvIGZpeCBkdWUgdG8gYW4gaXNzdWUgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24uIFdpbGwKICAgICAgICAgICAgYWRkcmVzcyBsYXRlci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRG1pdHJ5IE1pcm9ub3YuCgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBbIDg0MDg3OCBdIHN1cHBvcnQgZm9yICVpbmxpbmUgeyAuLi4gfSAoUEFUQ0gpLgogICAgICAgICAgICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICAgICVpbmxpbmUgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCAlaW5saW5lICV7IC4uLiAlfSBpcyB0aGF0IHRoZQogICAgICAgICAgICBlbmNsb3NlZCB0ZXh0IGlzIHByb2Nlc3NlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICAgVGhpcwogICAgICAgICAgICBhbGxvd3Mgc3BlY2lhbCBtYWNyb3MgYW5kIG90aGVyIHByb2Nlc3NpbmcgdG8gYmUgdXNlZCBpbiAKICAgICAgICAgICAgY29uanVuY3Rpb24gd2l0aCAlaW5saW5lLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kaW5vIEdhcmNpYS4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MzY5MDMgXSBDKysgaW5jb25zaXN0ZW5jeSAod2l0aCB2b2lkIGFyZ3VtZW50cykuCiAgICAgICAgICAgIFNXSUcgd2FzIGhhdmluZyBkaWZmaWN1bHR5IHdpdGggZigpIHZzIGYodm9pZCkgaW4gQysrIHByb2dyYW1zLgogICAgICAgICAgICBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYodm9pZCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmKCk7ICAgIC8vIE5vdCBtYXRjaGVkIHRvIGYodm9pZCkgY29ycmVjdGx5CiAgICAgICAgICAgICAgICAgIH07IAoKICAgICAgICAgICAgVGhlIHBhcnNlciBub3cgbm9ybWFsaXplcyBhbGwgZGVjbGFyYXRpb25zIG9mIHRoZSBmb3JtIGYodm9pZCkgCiAgICAgICAgICAgIGluIEMrKyBjbGFzc2VzIHRvIGYoKS4gIFRoaXMgc2hvdWxkIGZpeCBhIHZhcmlldHkgb2Ygc3VidGxlIAogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIGluaGVyaXRhbmNlLCBvcHRpbWl6YXRpb25zLCBvdmVybG9hZGluZywgZXRjLgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBhcnRobyBCaG93bWljay4KIAoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gSW5jb3Jwb3JhdGVkIFsgODQxMDc0IF0gYmV0dGVyIGNyb2FraW5nIChQQVRDSCkuICBUaGlzIGZpeGVzIHNvbWUgcHJvYmxlbXMKICAgICAgICAgICAgd2l0aCBzdHJpbmdzIGFuZCBwcm92aWRlcyBzb21lIG5ldyBlcnJvciBmdW5jdGlvbnMuIAogICAgICAgICAgICBDb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kaW5vIEdhcmNpYS4KICAgICAgICAgICAgCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTE4MzUgXSBEZWZhdWx0IGFyZ3VtZW50IHdpdGggY2FzdDogdHh0ID0gKGNoYXIgKikidHh0IiBzeW50YXggRXJyb3IuCiAgICAgICAgICAgIFRoZSBwYXJzZXIgc2hvdWxkIG5vdyBhY2NlcHQgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciAqcyA9IChjaGFyICopICJIZWxsbyIpOwoKICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBDbGF1ZGl1cyBTY2hub3JyLgoKMTEvMjQvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBGaXhlZCBwcm9ibGVtIHdpdGggY3Jvc3MgbW9kdWxlIGxpbmtpbmcuICBQcmV2aW91c2x5IG1vZHVsZXMgcmVmZXJyZWQKICAgICAgICAgICAgdG8gYmFzZSBjbGFzc2VzIHRocm91Z2ggYSBnbG9iYWwgdmFyaWFibGUuICAgTm93LCB0aGUgbW9kdWxlIGxvb2tzIHVwIGJhc2UKICAgICAgICAgICAgY2xhc3NlcyB0aHJvdWdoIHRoZSB0eXBlIHN5c3RlbSBpdHNlbGYtLS1hdm9pZGluZyB0aGUgbmVlZCB0byBsaW5rIHRvIGEgZ2xvYmFsCiAgICAgICAgICAgIGxpa2UgYmVmb3JlLiAgQ2F2ZWF0OiAgbW9kdWxlcyB3aXRoIGJhc2UgY2xhc3NlcyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUKICAgICAgICAgICAgbW9kdWxlcyB3aXRoIGRlcml2ZWQgY2xhc3Nlcy4KIAoxMS8yNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIHVzZSAoKSB0byByZXByZXNlbnQgbnVsbCBwb2ludGVycywKCSAgICBhcyBpdCBpcyBkb25lIGluIC1naCBtb2RlLgoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIEFkZCBhIGdlbmVyYXRlZCBzY3JpcHQgInByZWluc3Qtc3dpZyIsIHdoaWNoIGNhbiBiZSB1c2VkCgkgICAgdG8gaW52b2tlIFNXSUcgYmVmb3JlIGl0IGhhcyBiZWVuIGluc3RhbGxlZC4gIEl0IGFycmFuZ2VzCgkgICAgdGhhdCB0aGUgcnVudGltZSBsaWJyYXJpZXMgZnJvbSB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUKCSAgICB1c2VkLiAKCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1naCBtb2RlLCBkb24ndCBmb3JnZXQgdG8gY2FsbCBTV0lHX0d1aWxlX0luaXQuCgkgICAgQWRkIGEgU1dJR19jb250cmFjdF9hc3NlcnQgbWFjcm8uCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBVcGRhdGUgdGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhlIGR5bmV4dCBvYmplY3QgdG8gd29yawoJICAgIHdpdGggTXpTY2hlbWUgMjA1LgoKMTEvMjAvMjAwMzogbW1hdHVzCgkgICAgRml4ZWQgdGhlIGluY2x1ZGUvaW1wb3J0IGVycm9yIHJlcG9ydGVkIGJ5IEtlcmltIEJvcmNoYWV2LAoJICAgIHdoZXJlIHR3byBmaWxlcyB3aXRoIG5hbWVzIGxpa2UKCgkgICAgJ2RpcjEvaGVsbG8uaScKCSAgICAnZGlyMi9oZWxsby5pJwoJICAgIAoJICAgIGNhbiBub3QgYmUgaW5jbHVkZSBhdCB0aGUgc2FtZSB0aW1lLiBTd2lnIHdhcyBpbmNsdWRpbmcKCSAgICBqdXN0IHRoZSBmaXJzdCBvbmUsIGFzc3VtaW5nIHRoZSBzZWNvbmQgb25lIHdhcyBub3QgYQoJICAgIGRpZmZlcmVudCBvbmUsIHNpbmNlIGl0IHdhcyBjaGVja2luZy9rZWVwaW5nIGp1c3QgdGhlCgkgICAgYmFzZW5hbWUgJ2hlbGxvLmknLgoKMTEvMTkvMjAwMzogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeSBzdXBwb3J0LiAKICAgICAgICAgICAgICAtICBUaGUgLWMgY29tbWFuZCBsaW5lIG9wdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIC1ub3J1bnRpbWUKICAgICAgICAgICAgICAtICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbjogLXJ1bnRpbWUuICBXaGVuIHN1cHBsaWVkLCB0aGlzCiAgICAgICAgICAgICAgICAgaW5zZXJ0cyB0aGUgc3ltYm9sIFNXSUdfR0xPQkFMIGludG8gdGhlIHdyYXBwZXIgY29kZS4gIFRoaXMsCiAgICAgICAgICAgICAgICAgaW4gdHVybiwgbWFrZXMgYWxsIG9mIHRoZSBydW50aW1lIHN1cHBvcnQgZnVuY3Rpb25zIGdsb2JhbGx5CiAgICAgICAgICAgICAgICAgdmlzaWJsZS4KICAgICAgICAgICAgICAgLSBOZXcgbGlicmFyeSBmaWxlOiBzd2lncnVuLmkuICAgVXNlZCB0byBjcmVhdGUgbW9kdWxlcwogICAgICAgICAgICAgICAgIGZvciBydW50aW1lIGxpYnJhcnkgKGlmIG5lZWRlZCkuCiAgICAKMTEvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgICdtYWtlIHNyY3JwbScgcnBtYnVpbGQgZml4IC0gcGF0Y2ggZnJvbSBKb2UgQ29vcGVyCgoxMS8xOC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBDaGFuZ2UgbWVhbmluZyBvZiBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1ndWlsZSB0bwoJICAgIHRoZSBuYW1lIG9mIHRoZSBHdWlsZSBleGVjdXRhYmxlLiAgVGhlIG5ldyBvcHRpb24gLS13aXRoLWd1aWxlLXByZWZpeCAKCSAgICBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0cmVlIHdoZXJlIEd1aWxlIGlzCgkgICAgaW5zdGFsbGVkLiAgKEhvd2V2ZXIsIHVzdWFsbHkgaXQgc3VmZmljZXMgdG8gdXNlIHRoZQoJICAgIHNpbmdsZSBvcHRpb24gLS13aXRoLWd1aWxlLWNvbmZpZy4pICAKCSAgICBXaGVuIHJ1bm5pbmcgdGhlIHJ1biB0ZXN0cyB0ZXN0LXN1aXRlLCBtYWtlIHN1cmUgdG8gdXNlIHRoZQoJICAgIHZlcnNpb24gb2YgR3VpbGUgdGhhdCBTV0lHIHdhcyBjb25maWd1cmVkIGZvci4KCjExLzE3LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEltcHJvdmVtZW50cyB0byBvYmplY3Qtb3duZXJzaGlwIG1hbmFnZW1lbnQgaW4gCgkgICAgIi1zY20iIG1vZGUuICAoVGhleSBkbyBub3QgYXBwbHkgdG8gdGhlIGRlZmF1bHQgIi1naCIgbW9kZS4pCgkgICAgKiBSZW5hbWVkIHRoZSBzbW9iIHR5cGUgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0IGNhbgoJICAgICAgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgZnJvbSAiY29sbGVjdGVkIHN3aWciIHRvICJjb2xsZWN0YWJsZQoJICAgICAgc3dpZyIsIHdoaWNoIGlzIG1vcmUgcHJlY2lzZS4gIAoJICAgICogRXhwb3J0IHRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9ucyBhZ2Fpbi4gIEl0IGlzIG5vdwogCSAgICAgIGFsbG93ZWQgdG8gZXhwbGljaXRseSBjYWxsIGRlc3RydWN0b3JzLCBldmVuIGZvcgoJICAgICAgZ2FyYmFnZS1jb2xsZWN0ZWQgcG9pbnRlciBvYmplY3RzLiAgQSBwb2ludGVyIG9iamVjdAoJICAgICAgdGhhdCBoYXMgYmVlbiBwYXNzZWQgdG8gYSBkZXN0cnVjdG9yIGlzIG1hcmtlZCBpbiBhCgkgICAgICBzcGVjaWFsIHdheSB1c2luZyBhIG5ldyBzbW9iIHR5cGUsICJkZXN0cm95ZWQgc3dpZyIuCgkgICAgICAoVGhpcyBoZWxwcyBhdm9pZCBuYXN0eSBtZW1vcnkgYnVncywgd2hlcmUgcmVmZXJlbmNlcyB0bwoJICAgICAgZGVhZCBDIG9iamVjdHMgYXJlIHN0aWxsIGhlbGQgaW4gU2NoZW1lLiBNb3Jlb3ZlciwgdGhlCgkgICAgICBnYXJiYWdlIGNvbGxlY3RvciB3aWxsIG5vdCB0cnkgdG8gZnJlZSBhIGRlc3Ryb3llZAoJICAgICAgb2JqZWN0IG9uY2UgbW9yZS4pCgkgICAgKiBEZXN0cnVjdG9yLWxpa2UgZnVuY3Rpb25zIGNhbiBhbHNvIG1hcmsgdGhlaXIgYXJndW1lbnRzIAoJICAgICAgYXMgZGVzdHJveWVkIGJ5IGFwcGx5aW5nIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpERVNUUk9ZRUQuCgkgICAgICAoSXQgY2FsbHMgdGhlIGZ1bmN0aW9uIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJEZXN0cm95ZWQuKQoJICAgICogRnVuY3Rpb25zIHRoYXQgImNvbnN1bWUiIHRoZWlyIG9iamVjdHMgKG9yIHRoYXQgIm93biIKCSAgICAgIHRoZW0gYWZ0ZXIgdGhlIGNhbGwpIGNhbiBtYXJrIHRoZWlyIGFyZ3VtZW50cyBhcwoJICAgICAgbm90IGdhcmJhZ2UgY29sbGVjdGFibGUuICBUaGlzIGNhbiBiZSBkb25lIGJ5IGFwcGx5aW5nCgkgICAgICB0aGUgdHlwZW1hcCBTV0lHVFlQRSAqQ09OU1VNRUQuICAoSXQgY2FsbHMgdGhlIGZ1bmN0aW9uCgkgICAgICBTV0lHX0d1aWxlX01hcmtQb2ludGVyTm9uY29sbGVjdGFibGUuKQoJICAgICogVGhlIG1hY3JvIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQgZnJvbSBsaWJyYXJ5CgkgICAgICBwb2ludGVyLWluLW91dC5pIGNyZWF0ZXMgYWRkaXRpb25hbCB0eXBlbWFwcyAKCSAgICAgIFBUUlRZUEUgKklOUFVUX0NPTlNVTUVELCBQVFJUWVBFICpJTlBVVF9ERVNUUk9ZRUQuCgkgICAgICBUaGV5IG1hcmsgdGhlIHBhc3NlZCBwb2ludGVyIG9iamVjdCBsaWtld2lzZS4KCSAgICAgIFRoZSB0eXBlbWFwIFBUUlRZUEUgKk9VVFBVVCBjcmVhdGVzIGEgZ2FyYmFnZS1jb2xsZWN0YWJsZQoJICAgICAgcG9pbnRlciBvYmplY3QsIGxpa2UgJW5ld29iamVjdCBkb2VzIGZvciBhIHJldHVybmVkIAoJICAgICAgcG9pbnRlci4gIFVzZSB0aGUgbmV3IHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUX05PTkNPTExFQ1RBQkxFCgkgICAgICB0byBjcmVhdGUgYSBwb2ludGVyIG9iamVjdCB0aGF0IHdpbGwgbm90IGJlIGdhcmJhZ2UgY29sbGVjdGVkLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSGFuZGxlICRpbnB1dCBpbiAiZnJlZWFyZyIgdHlwZW1hcHMuCgkgICAgTmV2ZXIgcXVhbGlmeSBHT09QUyBzbG90IG5hbWVzIHdpdGggdGhlIGNsYXNzIG5hbWUuIAoJICAgIEhhbmRsZSBvcHRpb25hbCBhcmd1bWVudHMgcHJvcGVybHkgaW4gdGhlIEdPT1BTIG1ldGhvZHMuCgoxMS8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgZm9yIGluc3RhbGxhdGlvbiB0byB3b3JrIHdpdGggdGhlIHVwY29taW5nIEF1dG9tYWtlLTEuOC4KICAgICAgICAgICAgbWtpbnN0YWxsZGlycyB3YXMgYmVpbmcgdXNlZCBieSBhIG5vbi1BdXRvbWFrZSBtYWtlZmlsZS4gCiAgICAgICAgICAgIG1raW5zdGFsbGRpcnMgaXMgYmVpbmcgcGhhc2VkIG91dCBhbmQgc28gd2FzIG5vdCBiZWluZwogICAgICAgICAgICBjcmVhdGVkIGJ5IEF1dG9tYWtlLiBpbnN0YWxsLXNoIHVzZWQgaW5zdGVhZC4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTnVtZXJvdXMgZGlyZWN0b3IgaW1wcm92ZW1lbnRzLCB0d2Vha3MgYW5kIGJ1ZyBmaXhlcyBzaW5jZSAKICAgICAgICAgICAgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gaGF2ZSBiZWVuIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjExLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiAlZmVhdHVyZSgic2hhZG93IikgaXMgdXNlZCB0byBhZGQgY29kZSB0byBzaGFkb3cKICAgICAgICAgICAgY2xhc3NlcywgdGhlIHNwZWNpYWwgdmFyaWFibGUgJGFjdGlvbiBleHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICB1bmRlcmx5aW5nIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCB3b3VsZCBoYXZlIGJlZW4gY2FsbGVkIG5vcm1hbGx5LgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuIGdlbmVyYXRpbmcgcHJveHkgY2xhc3MgY29kZSwgU1dJRyBlbWl0cyBhIGZldwogICAgICAgICAgICBkZWZhdWx0IG1ldGhvZHMgZm9yIF9fcmVwcl9fKCkgYW5kIG90aGVyIFB5dGhvbiBzcGVjaWFsCiAgICAgICAgICAgIG1ldGhvZHMuICBTb21lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgYWZ0ZXIgYWxsIG9mIHRoZQogICAgICAgICAgICBjb250ZW50cyBvZiBhIGNsYXNzLiBIb3dldmVyLCB0aGlzIG1ha2VzIGl0IGhhcmQgdG8gb3ZlcnJpZGUKICAgICAgICAgICAgdGhlIG1ldGhvZHMgdXNpbmcgJXB5dGhvbmNvZGUgYW5kIHNvbWUgb3RoZXIgZGlyZWN0aXZlcyB0aGF0CiAgICAgICAgICAgIGFsbG93IGNvZGUgdG8gYmUgaW5zZXJ0ZWQgaW50byBhIGNsYXNzLiAgVGhlc2Ugc3BlY2lhbCBtZXRob2RzCiAgICAgICAgICAgIGFyZSBub3cgZW1pdHRlZCBpbnRvIHRoZSBjb2RlICpiZWZvcmUqIGFsbCBvZiB0aGUgb3RoZXIgbWV0aG9kcy4KICAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEVyaWMgSm9uZXMuCiAKMTEvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBQcmVwcm9jZXNzb3IgZW5oYW5jZW1lbnQuICAgRm9yIGluY2x1ZGUgc3RhdGVtZW50cyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAlaW5jbHVkZSAiZm9vL2Jhci5pIgoKICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSAiZm9vIiBpcyBub3cgYWRkZWQgdG8gdGhlIHNlYXJjaCBwYXRoIHdoaWxlIAogICAgICAgICAgICBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBiYXIuaS4gIFRodXMsIGlmIGJhci5pIGluY2x1ZGVzIG90aGVyCiAgICAgICAgICAgIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgdGhleSB3aWxsIGJlIGZvdW5kLiBQcmV2aW91c2x5LAogICAgICAgICAgICB5b3Ugd291bGQgaGF2ZSB0byBhZGQgYWRkaXRpb25hbCBkaXJlY3RvcmllcyB1c2luZyAtSSB0byBtYWtlIHRoaXMKICAgICAgICAgICAgd29yayBjb3JyZWN0bHkuICBOb3RlOiB0aGUgQyBwcmVwcm9jZXNzb3Igc2VlbXMgdG8gYmVoYXZlIGluCiAgICAgICAgICAgIGFuIGlkZW50aWNhbCBtYW5uZXIgb24gbWFueSAobW9zdD8gYWxsPykgc3lzdGVtcy4KICAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEtlcmltIEJvcmNoYWV2LgoKMTEvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBDb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gbWFrZSBTV0lHIHdvcmsgb24gTWFjIE9TWCAxMC4zLnggKFBhbnRoZXIpLgogICAgICAgICAgICBUZXN0ZWQgd2l0aCBQeXRob24sIFRjbCwgUGVybCwgYW5kIFJ1YnktLS1hbGwgb2Ygd2hpY2ggc2VlbSB0byB3b3JrLgoKMTEvMDgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCB0aGUgdHlwZW1hcHMgaW4gdmFyaW91cy5pIHdoaWNoIHdlcmUgbW9zdGx5IGJyb2tlbi4KICAgICAgICAgICAgY2hhciAqKlNUUklOR19JTiBhbmQgY2hhciAqKlNUUklOR19SRVQgdHlwZW1hcHMgcmVwbGFjZWQgd2l0aCAKICAgICAgICAgICAgU1RSSU5HX0FSUkFZLiBmbG9hdCAqRkxPQVRfQVJSQVlfUkVUVVJOIHR5cGVtYXAgcmVtb3ZlZC4KCjExLzA4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gVGNsIG1vZHVsZSBub3cgZW1pdHMgYSBzYWZlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBieQogICAgICAgICAgICBkZWZhdWx0LiAgSXQgY2FuIGJlIHJlbW92ZWQgYnkgcnVubmluZyAnc3dpZyAtbm9zYWZlJy4KCjExLzA0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE9ubHkgdXNlIHRoZSBTQ01fIEFQSSB3aGVuIHRoZSBmdW5jdGlvbgoJICAgIGBzY21fc2xvdF9leGlzdHNfcCcgZXhpc3RzIChuZWVkZWQgZm9yIEdPT1BTIHN1cHBvcnQpLiAgCgkgICAgVGhpcyBmdW5jdGlvbiB3YXMgcmVuYW1lZCBkdXJpbmcgdGhlIEd1aWxlIDEuNSBzZXJpZXMKCSAgICBmcm9tIGBzY21fc2xvdHNfZXhpc3RzX3AnLgoJICAgIFJlcG9ydCB0aGUgcmlnaHQgcnVudGltZSBsaWJyYXJ5IHdoZW4gaW52b2tlZCB3aXRoCgkgICAgLXNjbSAtbGRmbGFncy4KCjExLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRml4ICM3ODIwNTIuICBUaGUgLS13aXRoLWNoaWNrZW5jZmcgY29uZmlndXJlCgkgICAgb3B0aW9uIChhbmQgb3RoZXJzKSB3ZXJlIG5vdCBhY2NlcHRlZC4KCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE1lcmdlIG5ldyBzZXQgb2YgR09PUFMgY2hhbmdlcyBieSBKb2huIExlbnouCgkgICAgR09PUFMgb2JqZWN0cyBhcmUgbm93IG1hbmlwdWxhdGVkIGRpcmVjdGx5IGJ5IHRoZSBDIGNvZGUuCgkgICAgU29tZSBmaXhlcyB0byB0eXBlbWFwLUdPT1BTIGludGVyYWN0aW9uLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVtb3ZlIHRoZSBmaWxlIGFyZ3VtZW50IHRvIC1zY21zdHViIGFuZCAtZ29vcHMuCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IGFsd2F5cyBjYWxsZWQgTU9EVUxFLnNjbSBvcgoJICAgIE1PRFVMRS1wcmltaXRpdmUuc2NtLCB3aGVyZSBNT0RVTEUgaXMgdGhlIG1vZHVsZSBuYW1lIGFuZCAKCSAgICAicHJpbWl0aXZlIiBjYW4gYmUgY2hhbmdlZCBieSB0aGUgLXByaW1zdWZmaXggb3B0aW9uLgoJICAgIFRoZSBTY2hlbWUgZmlsZXMgYXJlIG5vdyBwbGFjZWQgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBieQoJICAgIHRoZSAtb3V0ZGlyIG9wdGlvbiwgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgoJICAgIChQYXRjaCBieSBKb2huIExlbnosIHNsaWdodGx5IG1vZGlmaWVkLikKCgkgICAgKioqIElOQ09NUEFUSUJJTElUWSBbR3VpbGVdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFVuaWZ5IHRoZSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuICBUaGUgc3RhbmRhcmQKCSAgICBmdW5jdGlvbnMgYXJlOgoJICAgICAqIFNXSUdfTmV3UG9pbnRlck9iaiAoUE9JTlRFUiwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIENyZWF0ZSBhbiBzY3JpcHRpbmcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHR5cGVkCgkJICAgcG9pbnRlci4gRkxBR1MgYXJlIGxhbmd1YWdlIHNwZWNpZmljLgoJICAgICAqIFNXSUdfQ29udmVydFB0ciAoSU5QVVQsIFJFU1VMVCwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICBzdG9yZSBpdCBpbiB0aGUgcGxhY2UgUkVTVUxULiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggCgkJICAgb2NjdXJzLCByZXR1cm4gbm9uemVyby4KCSAgICAgKiBTV0lHX011c3RHZXRQdHIgKElOUFVULCBUWVBFLCBBUkdOVU0sIEZMQUdTKQoJICAgICAgICAtLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIHNjcmlwdGluZyBvYmplY3QgSU5QVVQgYW5kCgkJICAgcmV0dXJuIGl0LiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggb2NjdXJzLCB0aHJvdyBhbgoJCSAgIGV4Y2VwdGlvbi4gIElmIEFSR05VTSA+IDAsIHJlcG9ydCBpdCBhcyB0aGUgCgkJICAgYXJndW1lbnQgbnVtYmVyIHRoYXQgaGFzIHRoZSB0eXBlIG1pc21hdGNoLgogICAgICAgICAgICBbR3VpbGVdOiAgICBObyBjaGFuZ2VzLgoJICAgIFtNelNjaGVtZV06IE5vIGNoYW5nZXMuCgkgICAgW1BlcmxdOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmouCgkJICAgICAgICBUaGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIGlzIGtlcHQuCgkJCVRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIgaXMgY3VycmVudGx5IG5vdAoJCQlzdXBwb3J0ZWQuCgkgICAgW1B5dGhvbl06ICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1J1YnldOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1RjbF06ICAgICAgUmVtb3ZlIHRoZSAiaW50ZXJwIiBhcmd1bWVudCBvZgoJCSAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaiwgU1dJR19Db252ZXJ0UHRyLAoJCSAgICAgICAgU1dJR19Db252ZXJ0UGFja2VkLCBhbmQgU1dJR19Db252ZXJ0UHRyRnJvbVN0cmluZy4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgCgkJCW5vdCBzdXBwb3J0ZWQuCgkgICAgTm8gY2hhbmdlcyB0byBQaWtlIGJlY2F1c2UgaXRzIHBvaW50ZXIgY29udmVyc2lvbiBjb2RlIGRpZAoJICAgIG5vdCBsb29rIGNvbXBsZXRlLiAgTm8gY2hhbmdlcyB0byBQSFA0LCBiZWNhdXNlIEkgZGlkIG5vdAoJICAgIHVuZGVyc3RhbmQgaXRzIHJ1bnRpbWUgY29kZS4gIE5vIGNoYW5nZXMgdG8gQ2hpY2tlbgoJICAgIGJlY2F1c2UgbWFqb3IgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgc29vbiBhbnl3YXkuICBObwoJICAgIGNoYW5nZXMgdG8gSmF2YSwgT0NhbWwsIEMjIGJlY2F1c2UgdGhleSBkbyBub3Qgc2VlbSB0bwoJICAgIGhhdmUgYSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuCgogICAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZIFtUY2xdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtQZXJsNSwgUEhQNCwgUGlrZSwgUHl0aG9uLCBSdWJ5LCBUY2xdOiBVc2UgdGhlCgkgICAgcHJlcHJvY2Vzc29yIHRvIHJlbmFtZSBleHRlcm5hbCBmdW5jdGlvbnMgb2YgdGhlIFNXSUcKCSAgICBydW50aW1lIEFQSSB0byBmb2xsb3cgdGhlIG5hbWluZyBjb252ZW50aW9uCgkgICAgU1dJR188bGFuZ3VhZ2U+XzxmdW5jdGlvbj4uICBUaGlzIHNob3VsZCBhbGxvdyBsaW5raW5nCgkgICAgbW9yZSB0aGFuIG9uZSBpbnRlcnByZXRlciBpbnRvIGEgcHJvZ3JhbS4KCjEwLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCBzaW5jZSBpbnRyb2R1Y2luZyB0aGUgZXhjZXB0aW9uIGFuZCBzdGQ6OnN0cmluZyBkZWxlZ2F0ZXMuCiAgICAgICAgICAgIFRoZSBmaXggb3ZlcmNvbWVzIGxpbmtlciBlcnJvcnMgd2hlbiB1c2luZyBtb3JlIHRoYW4gb25lIFNXSUcgbW9kdWxlLgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IEFuZHJlYXMgU2No9nJrLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODIzMzAyIF0gSW5jciBUY2wgc3VwcG9ydC4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgQWxleGV5IER5YWNoZW5rby4KICAgICAgICAgICAgTm90ZTogbmVlZHMgZG9jdW1lbnRhdGlvbi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMyNSBdIG5ldyBQeXRob24gTW9kdWxlIG9wdGlvbnMgYW5kIGZlYXR1cmVzLgogICAgICAgICAgICBSb2JpbiBEdW5uIHdyaXRlczoKCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgYSBudW1iZXIgb2YgY2hhbmdlcyB0byB0aGUgU1dJRyBweXRob24gbW9kdWxlLgoKICAgICAgICAgICAgMS4gQWRkIC1hcHBseSBvcHRpb24sIGFuZCBjaGFuZ2UgdGhlIGRlZmF1bHQgY29kZQogICAgICAgICAgICBvdXRwdXQgdG8gdXNlIHRoZSBmb28oKmFyZ3MsICoqa3cpIGNhbGxpbmcgc3ludGF4CiAgICAgICAgICAgIGluc3RlYWQgb2YgdXNpbmcgYXBwbHkoKS4gSWYgdGhlIC1hcHBseSBvcHRpb24gaXMKICAgICAgICAgICAgZ2l2ZW4gdGhlbiBjb2RlIGlzIGdlbmVyYXRlZCBhcyBiZWZvcmUuIFRoaXMgaXMgdmVyeQogICAgICAgICAgICBzaW1pbGFyIHRvIFBhdGNoICM3MzcyODEgYnV0IHRoZSBuZXcgLW1vZGVybiBvcHRpb24KICAgICAgICAgICAgbWFrZXMgdGhlIHNlY29uZCBoYWxmIG9mIHRoYXQgcGF0Y2ggdW5uZWNlc3Nhcnkgc28gaXQKICAgICAgICAgICAgaXMgbm90IGluY2x1ZGVkIGhlcmUuCgkgICAgCiAgICAgICAgICAgIDIuIEFkZCAtbmV3X3JlcHIgb3B0aW9uLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG15IFBhdGNoCiAgICAgICAgICAgICM3OTcwMDIgd2hpY2ggSSB3aWxsIG1hcmsgYXMgY2xvc2VkIHNpbmNlIGl0IGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBuZWVkZWQuIFdoZW4gdGhpcyBuZXcgb3B0aW9uIGlzIHVzZWQgdGhlbiB0aGUKICAgICAgICAgICAgX19yZXByX18gbWV0aG9kcyB0aGF0IGFyZSBnZW5lcmF0ZWQgZm9yIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgd2lsbCBiZSBtb3JlIGluZm9ybWF0aXZlIGFuZCBnaXZlIGRldGFpbHMgYWJvdXQgdGhlCiAgICAgICAgICAgIHB5dGhvbiBjbGFzcyBhbmQgdGhlIEMrKyBjbGFzcy4KCSAgICAKICAgICAgICAgICAgMy4gQWRkICVmZWF0dXJlKCJhZGR0b2Z1bmMiKS4gSXQgYWxsb3dzIHlvdSB0byBpbnNlcnQKICAgICAgICAgICAgb25lIG9yIG1vcmUgbGluZXMgb2YgY29kZSBpbnNpZGUgdGhlIHNoYWRvdyBtZXRob2Qgb3IKICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCBpcyBhbHJlYWR5IGdlbmVyYXRlZCwgaW5zdGVhZCBvZgogICAgICAgICAgICByZXBsYWNpbmcgdGhlIHdob2xlIHRoaW5nIGxpa2UgJWZlYXR1cmUoInNoYWRvdyIpIGRvZXMuCiAgICAgICAgICAgIEZvciBfX2luaXRfXyBpdCBnb2VzIGF0IHRoZSBlbmQsIGZvciBfX2RlbF9fIGl0IGdvZXMKICAgICAgICAgICAgYXQgdGhlIGJlZ2luaW5nIGFuZCBmb3IgYWxsIG90aGVycyB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgICAgaXMgZXhwYW5kZWQgb3V0IHRvIGJlIGxpa2UKCSAgICAKICAgICAgICAgICAgZGVmIEJhcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICB2YWwgPSBfbW9kdWxlLkZvb19CYXIoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICByZXR1cm4gdmFsCgkgICAgCiAgICAgICAgICAgIGFuZCB0aGUgImFkZHRvZnVuYyIgY29kZSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSB0aGUKICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IHVzZWQgZm9yIGEKICAgICAgICAgICAgcGFydGljdWxhciBtZXRob2Qgb3IgZnVuY3Rpb24gdGhlbiB0aGUgc2hvcnRlciBjb2RlIGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBqdXN0IGxpa2UgYmVmb3JlLgoJICAgIAogICAgICAgICAgICA0LiBBIGxpdHRsZSBiaXQgb2YgcmVmYWN0b3JpbmcgdG8gbWFrZSBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgYWRkdG9mdW5jIGEgbGl0dGxlIGVhc2llci4KCSAgICAKICAgICAgICAgICAgNS4gQWRkZWQgYSAtbW9kZXJuIGNvbW1hbmQtbGluZSBmbGFnIHRoYXQgd2lsbCBjYXVzZQogICAgICAgICAgICBTV0lHIHRvIG9taXQgdGhlIGNydWZ0IGluIHRoZSBwcm94eSBtb2R1bGVzIHRoYXQgYWxsb3dzCiAgICAgICAgICAgIGl0IHRvIHdvcmsgd2l0aCB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi4yLiBUaGUKICAgICAgICAgICAgcmVzdWx0IGlzIGEgc2ltcGxlciwgY2xlYW5lciBhbmQgZmFzdGVyIHB5dGhvbiBwcm94eQogICAgICAgICAgICBtb2R1bGUsIGJ1dCBvbmUgdGhhdCByZXF1aXJlcyBQeXRob24gMi4yIG9yIGdyZWF0ZXIuIAoKMTAvMzEvMjAwMzogYmVhemxleSAKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxOSBdIFhNTCBtb2R1bGUgdHdlYWtzLgogICAgICAgICAgICBUaGlzIGFkZHMgYSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAteG1sbGl0ZSB0aGF0IAogICAgICAgICAgICBncmVhdGx5IHJlZHVjZXMgdGhlIGFtb3VudCBvZiBlbWl0dGVkIFhNTCBjb2RlIGJ5CiAgICAgICAgICAgIGVsaW1pbmF0aW5nIHNvbWUgZmllbGRzIG1vc3RseSB1c2VkIGluIFNXSUcncwogICAgICAgICAgICBpbnRlcm5hbCBwcm9jZXNzaW5nLiAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxNyBdIEFkZHMgRG9oU3BsaXRMaW5lcyBmdW5jdGlvbi4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4Mjc5MDcgXSBhcmdvdXQgb2JqZWN0cyBub3QgYmVpbmcgd3JhcHBlZCBwcm9wZXJseSAoUEFUSCkuCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoJICAgICAKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNjk5NiBdIHBlcmwgdHlwZSBjaGVja2luZyBpZ25vcmVzIHBlcmwgc3ViY2xhc3Nlcy4KICAgICAgICAgICAgVGhpcyBlbmhhbmNlbWVudCBtYWtlcyBpdCBzbyB3cmFwcGVkIGNsYXNzZXMgYW5kIHN0cnVjdHMgY2FuCiAgICAgICAgICAgIGJlIHN1YmNsYXNzZWQgaW4gUGVybCBhbmQgdXNlZCBub3JtYWxseS4gCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoKMTAvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW50UHRyIG1hcnNoYWxsZWQgd2l0aCBhIHZvaWQqIGluc3RlYWQgb2YgaW50IGluIEMgZnVuY3Rpb24gCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucy4gVGhlIGNhc3RzIHRodXMgbG9vayBtb3JlIGNvbnZlbnRpb25hbCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgLy8gb2xkCiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeChpbnQgamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKihTaGFwZSAqKikmamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gbmV3CiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeCh2b2lkICogamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKFNoYXBlICopamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCjEwLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgc21hcnQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIGEgY2xhc3MgaGFzIG92ZXJsb2FkZWQgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCB4KTsKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXIoaW50IHgsIGludCB5KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgYW5kIHRoZSBjbGFzcyBpcyB1c2VkIGFzIGEgc21hcnQgcG9pbnRlcjoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb29QdHIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgU1dJRyB3b3VsZCB0cnkgdG8gZXhwb3NlIHRoZSBzdGF0aWMgbWVtYmVyIEZvbzo6YmFyCiAgICAgICAgICAgIHRocm91Z2ggRm9vUHRyLS0tcmVzdWx0aW5nIGJvZ3VzIHdyYXBwZXIgY29kZSBhbmQgYSBjb21waWxlcgogICAgICAgICAgICBlcnJvci4KCiAgICAgICAgICAgIER1ZSB0byB0aGUgd2F5IGluIHdoaWNoIG92ZXJsb2FkaW5nIGlzIGhhbmRsZWQsIGl0IGlzCiAgICAgICAgICAgIGV4dHJlbWVseSBkaWZmaWN1bHQgdG8gZWxpbWluYXRlIHRoZSBzdGF0aWMgbWV0aG9kIGluCiAgICAgICAgICAgIHRoaXMgY2FzZS4gIFRoZXJlZm9yZSwgaXQgaXMgc3RpbGwgZXhwb3NlZC4gIEhvd2V2ZXIsCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgY29kZSBub3cgY29tcGlsZXMgYW5kIHdvcmtzLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZSwgTXpTY2hlbWUsIENoaWNrZW5dOiBSZW1vdmUgc3ltYm9sIGNsYXNoZXMgYmV0d2VlbgoJICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBieSByZW5hbWluZyBhbGwgZXh0ZXJuIGNvbW1vbi5zd2cKCSAgICBmdW5jdGlvbnMgd2l0aCB0aGUgcHJlcHJvY2Vzc29yLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkZWQgYmFzaWMgR09PUFMgc3VwcG9ydCwgY29udHJpYnV0ZWQgYnkgSm9obiBMZW56LgoJICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KCSAgICAKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTmV3IG9wdGlvbiwgLW9ubHktc2V0dGVycywgd2hpY2ggZGlzYWJsZXMKCSAgICB0cmFkaXRpb25hbCBnZXR0ZXIgYW5kIHNldHRlciBwcm9jZWR1cmVzIGZvciBzdHJ1Y3R1cmUgc2xvdHMuCgoxMC8wMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBydW4gdGVzdCBmb3IgcmVmZXJlbmNlX2dsb2JhbF92YXJzIGJ5IEpvaG4gTGVuei4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUGFydGlhbCBzb2x1dGlvbiB0byBbIDc5MjE4MCBdIEMrKyBzbWFydC1wb2ludGVyL25hbWVzcGFjZSBtaXh1cCByZXZpc2l0ZWQuCiAgICAgICAgICAgIFRoZSBwcm9ibGVtIGlzIG5vdCBlYXN5IHRvIGZpeCAoYXQgbGVhc3QgaXQgZG9lc24ndCBzZWVtIHNvKSwgYnV0IGlzCiAgICAgICAgICAgIHJlbGF0ZWQgdG8gdGhlIGluc3RhbnRpYXRpb24gb2YgcXVhbGlmaWVkIHRlbXBsYXRlcyBpbnNpZGUgb2Ygb3RoZXIKICAgICAgICAgICAgbmFtZXNwYWNlcy4gICBTV0lHIG5vdyBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIGNhc2UgcmF0aGVyCiAgICAgICAgICAgIHRoYW4gZ2VuZXJhdGluZyBicm9rZW4gd3JhcHBlcnMuCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODAwMDEyIF0gRU5URVIgbWFjcm8gZnJvbSBDT1JFL3Njb3BlLmggY2xhc2hlcyB3aXRoIGxpYmMgc2VhcmNoLmguCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMTUxOCBdIENhc3RpbmcgaW50cyB0byBkb3VibGVzICh3LyBzb2x1dGlvbj8pCiAgICAgICAgICAgIEFkZHJlc3NlcyBhIHByb2JsZW0gd2l0aCBvdmVybG9hZGluZyBpbiB0aGUgUGVybCBtb2R1bGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBEYWxsZXkuCgowOS8yOC8yMDAzOiBta29lcHBlCgkgICAgW0d1aWxlIHdpdGggLXNjbSBvcHRpb25dIEZpeCB0eXBvIGluIGdlbmVyYXRlZCBjb2RlIGZvcgoJICAgIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzLiAgUmVwb3J0ZWQgYnkgSm9obiBMZW56LgoKMDkvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMjUyOCBdIGV4dGVybnMgbm90IGNvcnJlY3Qgd2hlbiB0aHJvdyBpcyBpbiBzaWduYXR1cmUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgogICAgICAgICAgICAKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNXSUcgd2FzIGdlbmVyYXRpbmcgYSBudW1iZXIgb2Ygc3ltYm9scyB0aGF0IGRpZG4ndCBjb21wbHkgd2l0aCAKICAgICAgICAgICAgdGhlIElTTyBDL0MrKyBzdGFuZGFyZCwgaW4gcGFydGljdWxhciBJU08vSUVDIDE0ODgyOjE5OTgoRSkgMTcuNC4zLjEuMgogICAgICAgICAgICB3aGVyZSBkb3VibGUgdW5kZXJzY29yZXMgYXJlIGZvcmJpZGRlbiBhcyB3ZWxsIGFzIHN5bWJvbHMgc3RhcnRpbmcgd2l0aAogICAgICAgICAgICBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IGFuIHVwcGVyIGNhc2UgbGV0dGVyLiBNb3N0IG9mIHRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiByb290ZWQgb3V0LiBTZWUgbmV3IHNlY3Rpb24gYWRkZWQgdG8gaW50ZXJuYWxzLmh0bWwgZGV2ZWxvcG1lbnQKICAgICAgICAgICAgbWFudWFsICdTeW1ib2wgTmFtaW5nIEd1aWRlbGluZXMgZm9yIEdlbmVyYXRlZCBDL0MrKyBDb2RlJy4KCjA5LzIzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaXJlY3RvciB0eXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgaW52ICAgICA9PiBkaXJlY3RvcmluCiAgICAgICAgICAgIG91dHYgICAgPT4gZGlyZWN0b3JvdXQKICAgICAgICAgICAgYXJnb3V0diA9PiBkaXJlY3RvcmFyZ291dAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8xOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBbUHl0aG9uXSBEaXJlY3RvciBjb25zdHJ1Y3RvcnMgbm93IGRlZmF1bHQgdG8gX19kaXNvd24gPSAwLCAKCSAgICB3aGljaCBpcyB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgYW5kIGZpeGVzIHRoZSBkaXJlY3Rvcl9maW5hbGl6ZXIgCgkgICAgdGVzdCBjYXNlIHVuZGVyIHB5dGhvbi4KCjA5LzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIC0gVHlwZW1hcHMgYWRkZWQgZm9yIHN0ZDo6c3RyaW5nIGFuZCBjb25zdCBzdGQ6OnN0cmluZyAmLgogICAgICAgICAgICAgICAgIC0gTmV3IGRlbGVnYXRlIGZvciBjcmVhdGluZyBhIEMjIHN0cmluZyBnaXZlbiBhIGNoYXIgKi4gSXQKICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIGJ5IGNhbGxpbmcgU1dJR19jc2hhcnBfc3RyaW5nX2NhbGxiYWNrIGFzIHNob3duCiAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3RkOjpzdHJpbmcgJ291dCcgdHlwZW1hcC4gVXNlZnVsIGlmIHRoZSByZXR1cm4gdHlwZSBpcwogICAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIGEgQyMgc3RyaW5nIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSAKICAgICAgICAgICAgICAgICAgIGZvciBjbGVhbmluZyB1cCBtZW1vcnkgYXMgdGhlIEMjIGdhcmJhZ2UgY29sbGVjdG9yIGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgIGZyZWUgdGhlIG1lbW9yeSBjcmVhdGVkIGluIEMvQysrIGFuZCB0aGVuIHJldHVybmVkIGFzIGEgQyMgc3RyaW5nLgogICAgICAgICAgICAgICAgIC0gVGhlIGV4Y2VwdGlvbiBkZWxlZ2F0ZXMgaGF2ZSBtb3ZlZCBpbnRvIGFuIGlubmVyIGNsYXNzIGluIHRoZQogICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlIGNsYXNzLCB0aGVyZWJ5IGZyZWVpbmcgdXAgdGhlIHN0YXRpYyBjb25zdHJ1Y3Rvci4KCjA5LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgKEludGVybmFscykKICAgICAgICAgICAgTWFqb3IgcmVmYWN0b3Jpbmcgb2YgaXRlcmF0aW9uIG92ZXIgbGlzdHMgYW5kIGhhc2hlcy4gIFRoZQogICAgICAgICAgICBET0ggbGlicmFyeSBub3cgdXNlcyBpdGVyYXRvcnMuICBUaGV5IHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIExpc3QgKmwgPSAoc29tZSBsaXN0KTsKCiAgICAgICAgICAgICAgICBJdGVyYXRvciBpOwogICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gY29udGFpbnMgdGhlIGFjdHVhbCBsaXN0IGl0ZW0uCiAgICAgICAgICAgICAgICAgICAgLy8gaS5pdGVtIGlzIE5VTEwgYXQgZW5kIG9mIGxpc3QKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBIYXNoICpoID0gKHNvbWUgaGFzaCk7CiAgICAgICAgICAgICAgICBJdGVyYXRvciBqOwogICAgICAgICAgICAgICAgZm9yIChqID0gRmlyc3QoaCk7IGouaXRlbTsgaiA9IE5leHQoaikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBqLml0ZW0gY29udGFpbnMgaGFzaCB0YWJsZSBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gai5rZXkgIGNvbnRhaW5zIGhhc2ggdGFibGUga2V5CiAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBqLml0ZW0gYW5kIGoua2V5IGFyZSBOVUxMIGF0IGVuZAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgIFRoZSBvbGQgaXRlcmF0aW9uIGZ1bmN0aW9ucyBGaXJzdGl0ZW0oKSwgTmV4dGl0ZW0oKSwgRmlyc3RrZXkoKSwKICAgICAgICAgICAgYW5kIE5leHRrZXkoKSBhcmUgZ29uZS4gIAoKICAgICAgICAgICAgVGhlIG5ldyBpdGVyYXRvcnMgYXJlIHNpbXBsZXIsIHJlc3VsdCBpbiBiZXR0ZXIgbWVtb3J5IHVzZSwKICAgICAgICAgICAgYW5kIG1heSBiZSBmYXN0ZXIuICBBbHNvLCB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBwcm9ibGVtcwogICAgICAgICAgICBpdGVyYXRpbmcgb3ZlciB0aGUgc2FtZSBsaXN0L2hhc2ggaW4gbXVsdGlwbGUgcGxhY2VzIGF0CiAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyBmaW5lOgoKICAgICAgICAgICAgICAgICBJdGVyYXRvciBpLGo7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChsKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIChUaGlzIG5ldmVyIHdvcmtlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucykuCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4gIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayAKICAgICAgICAgICAgdGhpcmQgcGFydHkgZXh0ZW5zaW9ucyB0byBTV0lHIChvciBnaXZlIHRoZW0gZnVydGhlciBlbmNvdXJhZ2VtZW50CiAgICAgICAgICAgIHRvIGpvaW4gdGhlIFNXSUcgQ1ZTLXRyZWUgOi0pLgoKMDkvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gRml4IG1lbW9yeSBsZWFrcyBpbiB0aGUgImxpc3QtdmVjdG9yLmkiIHR5cGVtYXBzLgoKMDkvMDkvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBVc2UgQ19ta19ib29sIHJhdGhlciB0aGFuIENfbWtib29sLiAgVGhpcyBmaXhlcwoJICAgIHRoZSB3cmFwcGluZyBvZiBib29sZWFuIHZhbHVlcyBmb3IgQ2hpY2tlbiAxLjEwIGFuZCBuZXdlci4KCSAgICBSZXBvcnRlZCBieSBEYXZlIDxodW5kb0B5YWhvby5jb20+IC8gRmVsaXggV2lua2VsbWFubgoJICAgIDxmZWxpeEBwcm94aW1hLW10LmRlPi4KCjA5LzA1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3JzIGltcGxlbWVudGVkIGZvciBKYXZhLiBJbiBzdW1tYXJ5IHRoaXMgaXMgYSBiaWcgbmV3IGZlYXR1cmUgCiAgICAgICAgICAgIHdoaWNoIHN1cHBvcnRzIHVwY2FsbHMgZnJvbSBDKysgdG8gSmF2YS4gQ29kZSBpcyBnZW5lcmF0ZWQgdG8gc3VwcG9ydCBDKysgCiAgICAgICAgICAgIGNhbGxiYWNrcyB0byBjYWxsIGludG8gSmF2YSBhbmQgdHJ1ZSBwb2x5bW9ycGhpYyBiZWhhdmlvdXIgZm9yIEphdmEgY2xhc3NlcyAKICAgICAgICAgICAgZGVyaXZlZCBmcm9tIEMrKyBjbGFzc2VzLiBTZWUgamF2YS5odG1sIGZvciBkZXRhaWxzLiBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgU2NvdHQgTWljaGVsLgoKMDkvMDUvMjAwMzogVGlnZXIKICAgICAgICAgICAgQ3JlYXRlZCBjb250cmFjdCBleGFtcGxlIGRpcmVjdG9yeSBhdCAvU1dJRy9FeGFtcGxlcy9jb250cmFjdAogICAgICAgICAgICBBZGRlZCBzaW1wbGUgY29udHJhY3QgZXhhbXBsZXMgKHNpbXBsZV9jICYgc2ltcGxlX2N4eCkKICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgbW9kdWxlJ3Mgb3V0cHV0IGZvcm1hdAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMDEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRlc3Qtc3VpdGUgYnVpbGQgaW1wcm92ZW1lbnRzOgogICAgICAgICAgICAtIE11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIHdvcmtpbmcgZm9yIHRoZSB0ZXN0IHN1aXRlLCBzbyBpdCBpcyBub3cKICAgICAgICAgICAgICBwb3NzaWJsZSB0byBydW4gY29uZmlndXJlIGluIG11bHRpcGxlIHN1YmRpcmVjdG9yaWVzIGFuZCBydW4gdGhlIHRlc3QKICAgICAgICAgICAgICBzdWl0ZSBpbiBlYWNoIG9mIHRoZXNlIHN1YiBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSAnbWFrZSBkaXN0Y2xlYW4nIGZpeGVkIHNvIGl0IGRvZXNuJ3QgYm9tYiBvdXQgb24gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeQogICAgICAgICAgICAgIHdoZW4gdXNpbmcgbXVsdGlwbGUgc3ViZGlyZXRvcnkgYnVpbGRzLiBSZXF1aXJlZCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQ6CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BlcmwgLT4gRXhhbXBsZXMvR0lGUGxvdC9QZXJsNQogICAgICAgICAgICAgICAgRXhhbXBsZXMvR0lGUGxvdC9QaHAgIC0+IEV4YW1wbGVzL0dJRlBsb3QvUGhwNAogICAgICAgICAgICAgIFRoZXNlIG5ldyBkaXJlY3RvcmllcyB1c2VkIHRvIGJlIHN5bWJvbGljIGxpbmtzIHRvIHRoZSBvbGQgZGlyZWN0b3J5LgogICAgICAgICAgICAgIEFsc28gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvUGVybCBzeW1ib2xpYyBsaW5rIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICAgICAgIC0gUnVubmluZyB0aGUgdGVzdC1zdWl0ZSwgb3RoZXIgdGhhbiBmcm9tIHRoZSByb290IGRpcmVjdG9yeSwgc2F5CiAgICAgICAgICAgICAgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9weXRob24gd2lsbCBub3cgZGlzcGxheSBhbGwgdGhlIGNvZGUgYmVpbmcKICAgICAgICAgICAgICBleGVjdXRlZC4KICAgICAgICAgICAgLSBUaGUgZm9sbG93aW5nIDMgQyMgY29tcGlsZXJzIGFyZSBkZXRlY3RlZCBkdXJpbmcgY29uZmlndXJlIGFuZCB3b3JrIHdpdGggCiAgICAgICAgICAgICAgdGhlIHRlc3Qtc3VpdGU6IE1vbm8sIFBvcnRhYmxlLk5FVCBhbmQgTWljcm9zb2Z0LgoKMDkvMDEvMjAwMzogVGlnZXIKICAgICAgICAgICAgQWRkZWQgaW5oZXJpdGFuY2Ugc3VwcG9ydCBmb3IgZGVzaWduIGJ5IGNvbnRyYWN0IGZlYXR1cmUuCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk0OTE0IF0gV3JvbmcgdHlwZXMgaW4gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCiAgICAgICAgICAgIFNXSUcgd2FzIG5vdCBoYW5kbGluZyBhcmd1bWVudHMgY29ycmVjdGx5IGluIHRlbXBsYXRlIAogICAgICAgICAgICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vPFQgKj4gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIFQgKmJsYWgoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0ludCkgRm9vPGludCAqPjsKCiAgICAgICAgICAgIGluIHRoaXMgY2xhc3MsIHRoZSByZXR1cm4gdHlwZSBvZiBibGFoIHdhcyBzZXQgdG8KICAgICAgICAgICAgJ2ludCAqKicsIGJ1dCBpdCBzaG91bGQgcmVhbGx5IGJlICdpbnQgKicuICBUaGlzIGhhcyBiZWVuCiAgICAgICAgICAgIGZpeGVkLCBidXQgaXQgd2lsbCBhZmZlY3QgYWxsIHByaW9yIHVzZXMgb2YgcGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbi4KIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzg2Mzk0IF0gUGF0Y2ggZm9yIGdlbmVyYXRlZCBwZXJsIGNvZGUgZG9lcyBub3QgY29tcGlsZSB1bmRlciBSZWRIYXQ5LgogICAgICAgICAgICBSZXBvcnRlZCBieSBTY290dCBGaW5uZXJhbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTE1NzkgXSAodW5zaWduZWQpIGxvbmcgbG9uZyBoYW5kbGVkIGluY29ycmVjdGx5IChUY2wpLgogICAgICAgICAgICBUaGlzIHdhcyBhbiBlcnJvciBpbiB0aGUgVGNsIHR5cGVtYXBzLmkgZmlsZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEtqZWxsIFdvb2RpbmcuCiAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzMgXSBubyB3YXkgdG8gcmVuYW1lIGNsYXNzZXMgY29taW5nIGZyb20gQyBzdHJ1Y3R1cmVzLgogICAgICAgICAgICBUaGlzIHByb2JsZW0gcmVsYXRlcyB0byByZW5hbWluZyBvZiBhbm9ueW1vdXMgc3RydWN0dXJlcyB3aXRoIGEKICAgICAgICAgICAgdHlwZWRlZi4gIEZvciBleGFtcGxlOiAKCiAgICAgICAgICAgICAgICAgICVyZW5hbWUoQmFyKSBGb287CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCiAgICAgICAgICAgIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk3NTc2IF0gLWhlbHAgc2VlbXMgdG8gaW1wbHkgdGhhdCBvbmx5IHRjbC1zcGVjaWZpYyBvcHRpb25zIGV4aXN0LgogICAgICAgICAgICBBZGRlZCBhIGNvbW1lbnQgdG8gYWxlcnQgdXNlciB0byBvdGhlciBvcHRpb25zLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTgyMDUgXSBTZWdmYXVsdCBpbiBTV0lHX0NvbnZlcnRQdHIuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFByYWJodSBSYW1hY2hhbmRyYW4uCgowOC8zMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNb2RpZmllZCB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgaW4gcHl0aG9uL3N0ZF9jb21wbGV4LmkgdG8gdXNlIHRoZSAKCSAgICBuZXctc3R5bGUgbWFjcm8gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zLCB3aGljaCBlbGltaW5hdGVkIHNvbWUKCSAgICByZWR1bmRhbnQgY29kZS4gIEZpeGVkIGEgZmV3IGJ1Z3MgaW4gdGhlc2UgdHlwZW1hcHMgYXMgd2VsbCwgYWx0aG91Z2gKCSAgICBtb3JlIHRlc3RpbmcgaXMgbmVlZGVkLgoKMDgvMjkvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQ29tcGxldGVkIGluaXRpYWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgYWJzdHJhY3QgY2xhc3NlcyB3aXRoIGRpcmVjdG9ycy4KCSAgICBDb25zdHJ1Y3RvciB3cmFwcGVycyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYWJzdHJhY3QgY2xhc3NlcyB0aGF0IGhhdmUKCSAgICBkaXJlY3RvcnMsIGFuZCBpbnN0YW5jZXMgb2YgdGhlIGRpcmVjdG9yIGNsYXNzZXMgd2lsbCBiZSBjcmVhdGVkIHJlZ2FyZGxlc3MKCSAgICBvZiB3aGV0aGVyIHRoZSBwcm94eSBjbGFzcyBoYXMgYmVlbiBzdWJjbGFzc2VkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgkgICAgTm8gY2hlY2tzIGFyZSBtYWRlIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gZW5zdXJlIHRoYXQgYWxsIHB1cmUgdmlydHVhbAoJICAgIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuICBJbnN0ZWFkLCBjYWxscyB0bwoJICAgIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyB3aWxsIHRocm93IFNXSUdfRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTgoJICAgIGV4Y2VwdGlvbnMgaW4gQysrLgoKCSAgICBJbnRlZ3JhdGVkIFByYWJodSBSYW1hY2hhbmRyYW4ncyB0eXBlbWFwIHBhdGNoZXMsIHdoaWNoIHByb3ZpZGUgZGlyZWN0b3IKCSAgICB0eXBlbWFwIHN1cHBvcnQgZm9yIGVudW1zIGFuZCBzdGQ6OnNpemVfdCwgYW5kIGZpeCBhIGNvdXBsZSBidWdzIGluIHRoZSAKCSAgICBkaXJlY3RvciBzdGQ6OnZlY3Rvcjw+IHR5cGVtYXBzLgoKMDgvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW1wbGVtZW50ZWQgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciB0aHJvd2luZyBDIyBleGNlcHRpb25zIGZyb20gQy9DKysgY29kZS4KICAgICAgICAgICAgQSBmZXcgZGVsZWdhdGUgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGNhbGxpbmcgd2hpY2ggdGhlbiB0aHJvdyB0aGUgQyMKICAgICAgICAgICAgZXhjZXB0aW9uLiBVc2UgdGhlIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24gZnVuY3Rpb24gZnJvbSBDL0MrKyB0eXBlbWFwcy4KICAgICAgICAgICAgU2VlIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIG9yIGNzaGFycGhlYWQuc3dnIGZvciBhbGwgYXZhaWxhYmxlIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24oU1dJR19DU2hhcnBFeGNlcHRpb24sICJleGNlcHRpb24gZGVzY3JpcHRpb24iKTsKCiAgICAgICAgICAgIFRoZSAndGhyb3dzJyB0eXBlbWFwcyBhcmUgYWxzbyBub3cgaW1wbGVtZW50ZWQsIHNvIGNvZGUgaXMgYXV0b21hdGljYWxseSAKICAgICAgICAgICAgZ2VuZXJhdGVkIHRvIGNvbnZlcnQgYW55IEMrKyBleGNlcHRpb24gaW50byBhIEMjIFN5c3RlbS5FeGNlcHRpb24gd2hlbiB0aGUgQysrIAogICAgICAgICAgICBtZXRob2QgZGVjbGFyZXMgYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gc3VjaCBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhCYXIpOwoKICAgICAgICAgICAgQWxzbyBhbnkgcGFyYW1ldGVycyB0aGF0IGFyZSByZWZlcmVuY2VzIHRvIGEgQysrIGNsYXNzIG9yIGEgY2xhc3MgcGFzc2VkIGJ5IHZhbHVlCiAgICAgICAgICAgIGFuZCBhcmUgcGFzc2VkIGFzIGEgQyMgbnVsbCB3aWxsIG5vdyB0aHJvdyBhIEMjIE51bGxSZWZlcmVuY2VFeGNlcHRpb24uCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaXggdG8gbWF0Y2ggdGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiBhbGwgcGludm9rZSBtZXRob2RzIHNvIHRoYXQgdGhleQogICAgICAgICAgICBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIHVzZWQgYnkgZGVmYXVsdCBpbiB0aGUgQyMgJ3N0YXRpYyBleHRlcm4nIGRlY2xhcmF0aW9ucyAKICAgICAgICAgICAgKF9fc3RkY2FsbCBpcyB1c2VkIG9uIFdpbmRvd3MpLgoKMDgvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZXdvcmtlZCBzdGQ6OnN0cmluZyB0eXBlbWFwcy4gRml4ZXMgYSBudW1iZXIgb2Ygc3RyaW5nIGluIHN0ZCBuYW1lc3BhY2UgCiAgICAgICAgICAgIHByb2JsZW1zLiBGb3IgZXhhbXBsZSAldGVtcGxhdGUgdmVjdG9yPHN0cmluZz4uIFRoZSB0ZW1wbGF0ZWQgY2xhc3MnIGdldCBtZXRob2QgCiAgICAgICAgICAgIHdhc24ndCByZXR1cm5pbmcgYSBKYXZhIFN0cmluZywgYnV0IGEgU1dJR1RZUEVfcF9zdHJpbmcuIFJlcG9ydGVkCiAgICAgICAgICAgIGJ5IFphY2ggQmF1bS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1MjIgXSAxLjMuMTkgc2VnZmF1bHQgaW4gU3dpZ1R5cGVfYWRkX3BvaW50ZXIvRG9oSW5zZXJ0aXRlbS4KICAgICAgICAgICAgUmVsYXRlZCB0byBwcm9ibGVtIHdpdGggdW5uYW1lZCBjbGFzcyBoYW5kbGluZyBpbiBQZXJsIG1vZHVsZS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1NjMgXSBNaXNzaW5nIGluZGljYXRpb24gb2Ygb3B0aW9uYWwgYXJndW1lbnRzLgogICAgICAgICAgICBUY2wgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODc0MzIgXSBsb25nIHBhcmFtIGhhbmRsZWQgYXMgaW50LiAgVGNsIG1vZHVsZQogICAgICAgICAgICBub3cgdXNlcyBUY2xfR2V0TG9uZ0Zyb21PYmogdG8gY29udmVydCBpbnRlZ2VyIHZhbHVlcy4KCjA4LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU5ODkgXSBudW1lcmljIHRlbXBsYXRlIHBhcmFtZXRlcnMuICAgVGhlcmUgd2VyZQogICAgICAgICAgICBzb21lIGVycm9ycyBpbiB0ZW1wbGF0ZSBleHBhbnNpb24gcmVsYXRlZCB0byB0aGUgdXNlIG9mCiAgICAgICAgICAgIGFycmF5cyB3aGVyZSB0aGUgYXJyYXkgZGltZW5zaW9uIHdhcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4KICAgICAgICAgICAgSXQgc2hvdWxkIHdvcmsgbm93LiAgUmVwb3J0ZWQgYnkgQnJ5YW4gR3JlZW4uCgowOC8xMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIGRpcmVjdG9yIHR5cGVtYXAgKG91dHYpIGZvciByZXR1cm4gYnkgdmFsdWUgYW5kIGNsZWFuZWQgdXAgdXAgYSBmZXcgCgkgICAgb2YgdGhlIGNvbW1lbnRlZCBkaXJlY3RvciB0eXBlbWFwcy4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24gZm9yIGRpcmVjdG9yIGNsYXNzZXMgdG8gaWdub3JlIHByaXZhdGUKCSAgICBjb25zdHJ1Y3RvcnMuICBQcm90ZWN0ZWQgY29uc3RydWN0b3JzIGFyZSBhbHNvIGlnbm9yZWQgZm9yIG5vdywgcGVuZGluZwoJICAgIGEgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gb2Ygd3JhcHBpbmcgY2xhc3NlcyB0aGF0IG9ubHkgZGVmaW5lIHByb3RlY3RlZAoJICAgIGNvbnN0cnVjdG9ycy4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1vdXRkaXIgPGRpcj4gdG8gc3BlY2lmeSB3aGVyZSB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZmlsZXMgYXJlIHRvIGJlIGdlbmVyYXRlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRhcmdldCBsYW5ndWFnZXMgbGlrZSBQeXRob24sCiAgICAgICAgICAgIEphdmEgZXRjIHdoaWNoIGdlbmVyYXRlIHByb3h5IGZpbGVzIGluIHRoZSBhcHByb3ByaWF0ZSBsYW5ndWFnZS4KICAgICAgICAgICAgVGhpcyBvcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gdGhlIEMvQysrIHdyYXBwZXIgZmlsZS4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBPbiBXaW5kb3dzIHRoZSBnZW5lcmF0ZWQgZmlsZXMgKG90aGVyIHRoYW4gdGhlIF93cmFwLmMgb3IgX3dyYXAuY3h4IGZpbGVzKQogICAgICAgICAgICB3ZXJlIHNvbWV0aW1lcyBpbmNvcnJlY3RseSBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgdW5sZXNzCiAgICAgICAgICAgIHRoZSBpbnB1dCBmaWxlIHVzZWQgdGhlIFVuaXggcGF0aCBzZXBhcmF0b3IuIFRoZSBXaW5kb3dzIHBhdGggc2VwYXJhdG9yIAogICAgICAgICAgICBzaG91bGQgbm93IGJlIHVzZWQuIEJ1ZyByZXBvcnRlZCBieSBSb2JlcnQgRGF2aWVzLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhcnJheSB2YXJpYWJsZSBzZXQgdHlwZW1hcCB0byBQZXJsIG1vZHVsZS4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU2NzcgXSBBcnJheSBpbml0IGNhdXNlcyBjb2RlZ2VuIGJ1Zy4uCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc5MDYyIF0gQ2xhc3MiXG4iOjpmb28gbm90IHN1cHBvcnRlZC4gIFNXSUcKICAgICAgICAgICAgc2hvdWxkIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHdoaXRlc3BhY2UgaW4gYmV0d2VlbiAKICAgICAgICAgICAgbmFtZXNwYWNlIHF1YWxpZmllcnMuICBGb3IgZXhhbXBsZSAiQSA6OiBGb28gOjogQmFyIi4KICAgICAgICAgICAgCjA3LzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgcGFyYW1ldGVycyB3aGljaCBhcmUgY2xhc3NlcyB0aGF0IGFyZSBwYXNzZWQgYnkgdmFsdWUgYW5kIGhhdmUgCiAgICAgICAgICAgIGEgZGVmYXVsdCB2YWx1ZS4gQSBjb3B5IGNvbnN0cnVjdG9yIGZvciBTd2lnVmFsdWVXcmFwcGVyIGlzIHJlcXVpcmVkIAogICAgICAgICAgICAoU0YgIzc4MDA1NikuIEFsc28gZml4ZWQgbWVtb3J5IGxlYWsgaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcy4gVGhlc2UgbW9kcwogICAgICAgICAgICBhbHNvIGZpeCBTRiAjNzgwMDU0LgoKMDcvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBydW4tdGltZSBlcnJvciBtZXNzYWdlIGZvciBwb2ludGVycyBpbiBQeXRob24gbW9kdWxlLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBab29rby4KCjA3LzEwLzIwMDM6IGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgW0FsbW9zdCBhbGwgbGFuZ3VhZ2VzXSBXcmFwcGVycyBmb3Igc3RkOjpwYWlyIGFkZGVkLgoJICAgIFR5cGVtYXBzIGZvciBQeXRob24sIFJ1YnksIEd1aWxlIGFuZCBNelNjaGVtZS4KCjA3LzAxLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gSGFuZGxlIHRoZSBjYXNlIG9mIG1vcmUgdGhhbiBvbmUgYXJnb3V0IHR5cGVtYXAKCSAgICBwZXIgZnVuY3Rpb24uCgowNi8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBTRiAjNjcwOTQ5IHJlcXVlc3QuIFRoZSBkZXN0cnVjdG9yIHdyYXBwZXIgZnVuY3Rpb24gbmFtZSBpcyBub3cgCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZS4gIEEgbmV3IGF0dHJpYnV0ZSBjYWxsZWQgbWV0aG9kbmFtZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFkZXN0cnVjdC9qYXZhZGVzdHJ1Y3RfZGVyaXZlZCAoSmF2YSkgb3IgY3NkZXN0cnVjdC9jc2Rlc3RydWN0X2Rlcml2ZWQgKEMjKQogICAgICAgICAgICB0eXBlbWFwcyBzcGVjaWZpZXMgdGhlIG1ldGhvZCBuYW1lLiBGb3IgZXhhbXBsZSBpbiBKYXZhIHRoZSBkZXN0cnVjdG9yIGlzIAogICAgICAgICAgICB3cmFwcGVkIGJ5IGRlZmF1bHQgd2l0aCB0aGUgZGVsZXRlIG1ldGhvZDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhZGVzdHJ1Y3QsIG1ldGhvZG5hbWU9ImRlbGV0ZSIpIFNXSUdUWVBFIHsuLi59CgowNi8yNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgdGhyb3dzIGF0dHJpYnV0ZSBmb3IgYWRkaW5nIGV4Y2VwdGlvbiBjbGFzc2VzIHRvIHRoZSB0aHJvd3MKICAgICAgICAgICAgY2xhdXNlIGFsc28gbm93IHdvcmtzIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlbWFwczogCiAgICAgICAgICAgIG5ld2ZyZWUKICAgICAgICAgICAgamF2YWluLCBqYXZhb3V0IChKYXZhKQogICAgICAgICAgICBjc2luLCBjc291dCAoQyMpCgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlICdBbkV4Y2VwdGlvbicgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGhyb3dzIGNsYXVzZSBpbiB0aGUKICAgICAgICAgICAgcHJveHkgZnVuY3Rpb246CgogICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0LCB0aHJvd3M9IkFuRXhjZXB0aW9uIikgaW50IHsKICAgICAgICAgICAgICAgIGludCByZXR1cm5WYWx1ZT0kam5pY2FsbDsKICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZT09MCkgdGhyb3cgbmV3IEFuRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IG5vdCBiZSB6ZXJvIik7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgICAgICAgIH0KCjA2LzI1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIHR5cGVtYXAgbWFyc2hhbGxpbmcgY2hlY2tzIGZvciBudWxsIHBvaW50ZXJzIHdoZW4KCSAgICB3YWxraW5nIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbnN0ZWFkIG9mIHJlbHlpbmcgc29sZXkgb24gdGhlIHBhcmFtZXRlcgoJICAgIGNvdW50LiAgQ3VyZXMgYSBzZWdmYXVsdCB0aGF0IG9jY3VycmVkIGZvciBtdWx0aXBsZSBhcmd1bWVudCBpbnYgdHlwZW1hcHMuCgkgICAgU29tZW9uZSB3aXRoIG1vcmUgU3dpZyBleHBlcmllbmNlIHNob3VsZCBwcm9iYWJseSByZXZpZXcgdGhpcyBjb2RlLgoKMDYvMjQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBEb24ndCBlbWl0IGNhbGxzIHRvICJDX2NoZWNrX2Zvcl9pbnRlcnJ1cHQiLAoJICAgIHdoaWNoIG1heSByZXN1bHQgaW4gYW4gZW5kbGVzcyBsb29wLiAgUGF0Y2ggYnkgZmVsaXhAcHJveGltYS1tdC5kZS4KCjA2LzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpbmFsaXplcnMgbm93IHVzZSBkZXN0cnVjdG9yIHN5bnRheCBhcyB0aGUgb3ZlcnJpZGUgd2hpY2ggd2FzIHVzZWQgaW4gCiAgICAgICAgICAgIHRoZSBGaW5hbGl6ZSBtZXRob2QgaXMgbm90IGluIHRoZSBFQ01BIHN0YW5kYXJkcywgc3BvdHRlZCBieSB0aGUgTVMgY29tcGlsZXIuCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBBIG51bWJlciBvZiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHJlbW92ZSB0aGUgSmF2YSBuYW1pbmcgCiAgICAgICAgICAgIHRoYXQgd2FzIHVzZWQgaW4gdGhlIEMjIG1vZHVsZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqbmkgICAgICAgICAgICAgICAgICAgICAgICAgLT4gY3R5cGUKICAgICAgICAgICAganR5cGUgICAgICAgICAgICAgICAgICAgICAgIC0+IGltdHlwZQogICAgICAgICAgICBqc3R5cGUgICAgICAgICAgICAgICAgICAgICAgLT4gY3N0eXBlCiAgICAgICAgICAgIGphdmFpbiAgICAgICAgICAgICAgICAgICAgICAtPiBjc2luCiAgICAgICAgICAgIGphdmFvdXQgICAgICAgICAgICAgICAgICAgICAtPiBjc291dAogICAgICAgICAgICBqYXZhaW50ZXJmYWNlcyAgICAgICAgICAgICAgLT4gY3NpbnRlcmZhY2VzCiAgICAgICAgICAgIGphdmFiYXNlICAgICAgICAgICAgICAgICAgICAtPiBjc2Jhc2UKICAgICAgICAgICAgamF2YWNsYXNzbW9kaWZpZXJzICAgICAgICAgIC0+IGNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgamF2YWNvZGUgICAgICAgICAgICAgICAgICAgIC0+IGNzY29kZQogICAgICAgICAgICBqYXZhaW1wb3J0cyAgICAgICAgICAgICAgICAgLT4gY3NpbXBvcnRzCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyAtPiBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFnZXRjcHRyICAgICAgICAgICAgICAgICAtPiBjc2dldGNwdHIKICAgICAgICAgICAgamF2YWZpbmFsaXplICAgICAgICAgICAgICAgIC0+IGNzZmluYWxpemUKCiAgICAgICAgICAgIEZlYXR1cmUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqYXZhY29uc3QgICAgICAgICAgICAgICAgICAgLT4gY3Njb25zdAogICAgICAgICAgICBqYXZhbWV0aG9kbW9kaWZpZXJzICAgICAgICAgLT4gY3NtZXRob2Rtb2RpZmllcnMKCiAgICAgICAgICAgIFByYWdtYSBjaGFuZ2VzOgogICAgICAgICAgICBwcmFnbWEoamF2YSkgICAgICAgICAgICAgICAgLT4gcHJhZ21hKGNzaGFycCkKICAgICAgICAgICAgam5pY2xhc3NiYXNlICAgICAgICAgICAgICAgIC0+IGltY2xhc3NiYXNlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgICAgICAtPiBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3Njb2RlICAgICAgICAgICAgICAgIC0+IGltY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzaW1wb3J0cyAgICAgICAgICAgICAtPiBpbWNsYXNzaW1wb3J0cwogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZXMgICAgICAgICAgLT4gaW1jbGFzc2ludGVyZmFjZXMKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSAgICAgICAgICAgICAgLT4gJGNzY2xhc3NuYW1lCiAgICAgICAgICAgICRqYXZhaW5wdXQgICAgICAgICAgICAgICAgICAtPiAkY3NpbnB1dAogICAgICAgICAgICAkam5pY2FsbCAgICAgICAgICAgICAgICAgICAgLT4gJGltY2FsbAoKICAgICAgICAgICAgVGhpcyB3aWxsIGJyZWFrIFNXSUcgaW50ZXJmYWNlIGZpbGVzIHRoYXQgdXNlIHRoZXNlIHR5cGVtYXBzLCBmZWF0dXJlcwogICAgICAgICAgICBhbmQgcHJhZ21hcy4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgb3IgdXNlIG1hY3JvcyBmb3IgYmFja3dhcmRzCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gQXBwbGllZCBNelNjaGVtZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieQoJICAgIEpvaG4gTGVueiA8amVsZW56QHN0dWRlbnRzLndpc2MuZWR1Pi4KCiAgICAgICAgICAgIC0gVXBkYXRlZCBtenNjaGVtZSB0byB1c2UgU1dJRydzIGNvbW1vbiBydW50aW1lIHR5cGUKICAgICAgICAgICAgICBzeXN0ZW0gZnJvbSBjb21tb24uc3dnLiAKCgkgICAgLSBUaGUgTGliL216c2NoZW1lIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyB0aGUgbGFuZ3VhZ2UgbW9kdWxlczoKICAgICAgICAgICAgICBtenNjaGVtZS5pIHdhcyBtb3ZlZCB0byBtenNjaGVtZS5zd2csIG16c2NoZW1lLnN3ZyBhbmQKICAgICAgICAgICAgICBtenNjaGVtZWRlYy5zd2cgaGF2ZSBiZWVuIHJlbW92ZWQsIG16cnVuLnN3ZyAod2hpY2gKICAgICAgICAgICAgICBjb250YWlucyB0aGUgcnVudGltZSBjb2RlKSBoYXMgYmVlbiBhZGRlZC4KCiAgICAgICAgICAgIC0gVGhlIHN3aWdfcHJveHkgc3RydWN0dXJlIHdhcyByZW5hbWVkIHRvIHN3aWdfbXpfcHJveHkuCiAgICAgICAgICAgICAgc3dpZ19tel9wcm94eSBub3cgY29udGFpbnMgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8KICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAKCgkgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQKICAgICAgICAgICAgICBTV0lHVFlQRSAmLgoKCSAgICAtIEdhcmJhZ2UgY29sbGVjdGlvbiBieSBjYWxsaW5nIHNjaGVtZV9hZGRfZmluYWxpemVyKCkgaGFzCiAgICAgICAgICAgICAgYmVlbiBhZGRlZC4KCgkgICAgKioqIE5FVyBGRUFUVVJFIFtNelNjaGVtZV0gKioqCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwczogamF2YWRlc3RydWN0IGFuZCBqYXZhZGVzdHJ1Y3RfZGVyaXZlZAogICAgICAgICAgICBmb3IgdGhlIEMrKyBkZXN0cnVjdG9yIHdyYXBwZXIuIFRoZSBqYXZhZGVzdHJ1Y3QgdmVyc2lvbiBnZXRzIHVzZWQgYnkKICAgICAgICAgICAgY2xhc3NlcyBhdCB0aGUgdG9wIG9mIGFuIGluaGVyaXRhbmNlIGNoYWluIGFuZCB0aGUgamF2YWRlc3RydWN0X2Rlcml2ZWQgCiAgICAgICAgICAgIHZlcnNpb24gZ2V0cyB1c2VkIGJ5IG90aGVyIGNsYXNzZXMuCgogICAgICAgICAgICBbQyNdIGNpbGRpc3Bvc2UgYW5kIGNpbGRpc3Bvc2VvdmVycmlkZSB0eXBlbWFwcyByZXBsYWNlZCBieQogICAgICAgICAgICBjc2Rlc3RydWN0IGFuZCBjc2Rlc3RydWN0X2Rlcml2ZWQgdHlwZW1hcHMuIFRoZSBkZWxldGUoKQogICAgICAgICAgICBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXRzIGZ1bmN0aW9uYWxpdHkgcHV0IGludG8gdGhlc2UKICAgICAgICAgICAgdHlwZW1hcHMgZGVzaWduZWQgZm9yIHRoZSBEaXNwb3NlKCkgbWV0aG9kLgoKICAgICAgICAgICAgLSBOZXcgdHlwZW1hcHMgY3NpbnRlcmZhY2VzIGFuZCBjc2ludGVyZmFjZXNfZGVyaXZlZCByZXBsYWNlCiAgICAgICAgICAgIHRoZSBqYXZhaW50ZXJmYWNlcyB0eXBlbWFwLiBBbHNvIGZpeGVzIHRoZSBwZWN1bGlhcml0eSBvZiBhbGwgY2xhc3NlcwogICAgICAgICAgICBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiBpbmRpdmlkdWFsbHkgZGVyaXZpbmcgZnJvbSB0aGUgSURpc3Bvc2FibGUgCiAgICAgICAgICAgIGludGVyZmFjZS4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXAgY3NmaW5hbGl6ZSBmb3IgZmluYWxpemVycy4gQysrIGRlc3RydWN0b3JzIGFyZSBub3cgY2FsbGVkCiAgICAgICAgICAgIGJ5IGdhcmJhZ2UgY29sbGVjdG9yIGR1cmluZyBmaW5hbGl6YXRpb24uIFByb2JsZW0gcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEFuZHJlYXMgU2No9nJrLgoKMDYvMTAvMjAwMzogVGlnZXIKCSAgICBNb2RpZmllZCBjb250cmFjdCBjb2RlIGZvciBlcnJvciBtZXNzYWdlIG91dHB1dC4KICAgICAgICAgICAgQ29udHJhY3QgY29kZSBjYW4gbm93IHByaW50IG91dCBzaW1wbGUgZXJyb3IgbWVzc2FnZS4KICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSB0byBwcmVwYXJlIGZvciBpbmhlcml0YW5jZQogICAgICAgICAgICAKMDYvMDMvMjAwMzogbWtvZXBwZQoJICAgIFtHdWlsZV0gQXBwbGllZCBHdWlsZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieSAKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uIAoKCSAgICAtIFNXSUcgY3VycmVudGx5IHVzZXMgR3VpbGUncyBnaF8gQVBJLCB3aGljaCBpcyBtYXJrZWQgYXMKCSAgICAgIGRlcHJlY2F0ZWQgaW4gR3VpbGUgMS42IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gR3VpbGUKCSAgICAgIDEuOS4gIFRoaXMgY2hhbmdlIGludHJvZHVjZXMgYSBjb21tYW5kLWxpbmUgZmxhZyAiLXNjbSIKCSAgICAgIHdoaWNoIGNhdXNlcyBTV0lHIHRvIGdlbmVyYXRlIHdyYXBwZXJzIHRoYXQgdXNlIEd1aWxlJ3MKCSAgICAgIFNDTSBBUEkgaW5zdGVhZDsgdGhpcyByZXF1aXJlcyBHdWlsZSA+PSAxLjYuCgkgICAgCgkgICAgLSBUaGUgTGliL2d1aWxlIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyBsYW5ndWFnZSBtb2R1bGVzOiBndWlsZWRlYy5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGUuc3dnIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGd1aWxlX2doX3J1bi5zd2csCiAgICAgICAgICAgICAgZ3VpbGUuaSBoYXMgYmVlbiBtb3ZlZCB0byBndWlsZV9naC5zd2csIGd1aWxlX3NjbS5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGVfc2NtX3J1bi5zd2cgd2hpY2ggY29udGFpbiB0aGUgU0NNIEFQSSBzdHVmZgogICAgICAgICAgICAgIGhhdmUgYmVlbiBhZGRlZAoKCSAgICAtIGdoaW50ZXJmYWNlLmksIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWZpbmVzIGZyb20gdGhlIGdoXwogICAgICAgICAgICAgIGZ1bmN0aW9ucyB0byB0aGUgc2NtX2Z1bmN0aW9ucyBoYXMgYmVlbiBhZGRlZAoKCSAgICAtIFRoZSBBUEkgZm9yIGRlYWxpbmcgd2l0aCBwb2ludGVyIG9iamVjdHMgaXMgbm93CgkgICAgICBTV0lHX0NvbnZlcnRQdHIsIFNXSUdfTXVzdEdldFB0ciwgU1dJR19OZXdQb2ludGVyT2JqLgoKICAgICAgICAgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQgU1dJR1RZUEUgJgoKICAgICAgICAgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgW0d1aWxlXSAqKioKCSAgICAJCjA2LzAxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaW1lbnNpb25sZXNzIGFycmF5cyBzdWNoIGFzIAoKICAgICAgICAgICAgICAgIGludCBmb29bXSA9IHsxLCAyfTsKICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgYmFyW107CgogICAgICAgICAgICBwcm9kdWNlIGEgd2FybmluZyB0aGF0IHRoZSB2YXJpYWJsZSBpcyByZWFkLW9ubHkuIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlLCB0aGlzIHVzZWQgdG8gY2F1c2UgY29tcGlsZSBlcnJvcnMgb3IgZ2VuZXJhdGUgYSBzZXR0ZXIgdGhhdAogICAgICAgICAgICBnZW5lcmF0ZWQgYSBydW50aW1lIGVycm9yLiBBIHNldHRlciBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGUgYXJyYXkgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBTV0lHLiBBIHZhcmluLCBnbG9iYWxpbiAKICAgICAgICAgICAgb3IgbWVtYmVyaW4gdHlwZW1hcCAoZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpIG11c3QgYmUgd3JpdHRlbiAKICAgICAgICAgICAgYnkgdGhlIHVzZXIuCgowNS8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZW1lbnQgdG8gZGVmYXVsdCB0eXBlbWFwIG1hdGNoaW5nIGFuZCBhcnJheXMuICBXaGVuIGFuCiAgICAgICAgICAgIGFycmF5IGlzIGRlY2xhcmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvb1s0XTsKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHR5cGVtYXAgbm93IHJlc29sdmVzIHRvIAoKICAgICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbQU5ZXQoKICAgICAgICAgICAgSWYgbm8gbWF0Y2ggaXMgZm91bmQgZm9yIHRoYXQsIGl0IHRoZW4gcmVzb2x2ZXMgdG8KCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KCiAgICAgICAgICAgIElmIG5vIGFycmF5IGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uLAogICAgICAgICAgICB0aGUgU1dJR1RZUEUgW10gaXMgdXNlZCByaWdodCBhd2F5LiAKCiAgICAgICAgICAgIE5vdGU6IFRoaXMgY2hhbmdlIGhhcyBiZWVuIG1hZGUgdG8gcmVzb2x2ZSBwcm9ibGVtcyByZWxhdGVkIHRvCiAgICAgICAgICAgIGFycmF5cyB3aXRoIGFuZCB3aXRob3V0IGRpbWVuc2lvbnMuICBGb3IgZXhhbXBsZSwgc29tZXRpbWVzIFNXSUcKICAgICAgICAgICAgd2FzIGdlbmVyYXRpbmcgc2V0dGVyIGZ1bmN0aW9ucyBmb3IgYXJyYXkgdmFyaWFibGVzIHdpdGggbm8gZGltZW5zaW9ucwogICAgICAgICAgICAoYW4gZXJyb3IpLiBMaWtld2lzZSwgU1dJRyBzb21ldGltZXMgbWFkZSBhcnJheXMgd2l0aCBkaW1lbnNpb25zCiAgICAgICAgICAgIHJlYWQtb25seSAoYWxzbyBhbiBlcnJvcikuICBUaGlzIGZpeGVzIHRoZSBhcnJheXNfZ2xvYmFsIHRlc3QKICAgICAgICAgICAgcHJvYmxlbS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA1LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHR5cGUgaGFuZGxpbmcgYnVnIHdpdGggcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIHlvdSBoYWQgZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKCiAgICAgICAgICAgICAgICAgIEZvbyAqZnVuYzEoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBmdW5jMihCYXIgJngpOwoKICAgICAgICAgICAgVGhlbiBmdW5jMigpIHdvdWxkbid0IGFjY2VwdCBvYmplY3RzIHJldHVybmVkIGJ5IGZ1bmMxKCkKICAgICAgICAgICAgYmVjYXVzZSBvZiBhIHR5cGUgZXJyb3IuICAgSXQgc2hvdWxkIHdvcmsgbm93LgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmlhbiBZYW5nLgoKMDUvMjEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIHRvIHNvbWUgb2YgdGhlIFZpc3VhbCBDKysgZXhhbXBsZSBwcm9qZWN0IGZpbGVzIHdoaWNoIHdvdWxkIG5vdCAKICAgICAgICAgICAgd29yayB3aXRoIHNwYWNlcyBpbiB0aGUgcGF0aHMgaGVsZCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgdG8gCiAgICAgICAgICAgIHBvaW50IHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UncyBsaWJyYXJ5IC8gaW5jbHVkZSBkaXJlY3RvcnkuCiAgICAgICAgICAgIFNGIGJ1ZyAjNzQwNzY5CgowNS8yMS8yMDAzOiAgc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCAtY29udHJhY3RzIG9wdGlvbi4KICAgICAgICAgICAgRmlyc3QgdHJ5IG9mIHRoZSBpZGVhIG9mICJXcmFwIGJ5IENvbnRyYWN0IjogCiAgICAgICAgICAgIGJ1aWxkIHVwIHJlYWxpYWJsZSBjcm9zcy1sYW5ndWFnZSBtb2R1bGUgYnkgd3JhcHBpbmcgd2l0aCBTV0lHLgogICAgICAgICAgICBJbXBsZW1lbnRlZCBiYXNpYyBhc3NlcnRpb24KICAgICAgICAgICAgKHByZWFzc2VydGlvbiAmIHBvc3Rhc3NlcnRpb24gJiBpbnZhcmlhbnQpCiAgICAgICAgICAgIGZvciBzaW1wbGUgQy9DKysgZnVuY3Rpb25zLgogICAgICAgICAgICAKICAgICAgICAgICAgQ3VycmVudCBmb3JtYXQgb2YgY29udHJhY3RzIGFyZToKICAgICAgICAgICAgJWNvbnRyYWN0IGNsYXNzX25hbWUgOjogZnVuY19uYW1lIChwYXJhcy4uLikgewogICAgICAgICAgICByZXF1aXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByczsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICBlbnN1cmU6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHI7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgaW52YXJpYW50OgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCSAgICAJCjA1LzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCB0d2Vha3MuIFRoZXJlIHdlcmUgYSBmZXcgcHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIHdoaWNoIHdlcmUKICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBNYWtlZmlsZSBmb3IgcGFzc2luZyBvbiB0aGUgY29tbWFuZGxpbmUgd2hlbiBjb21waWxpbmcuCiAgICAgICAgICAgIFRoZXNlIGFyZSBub3cgYWxsIGRlZmluZWQgaW4gc3dpZ2NvbmZpZy5oLiBBdXRvY29uZiBkb2Vzbid0IG5vcm1hbGx5IAogICAgICAgICAgICBhbGxvdyBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgdG8gYmUgZGVmaW5lZCBpbiB0aGlzIGNvbmZpZyBoZWFkZXIgZmlsZSwgCiAgICAgICAgICAgIGJ1dCBhbiBhdXRvY29uZiBhcmNoaXZlIG1hY3JvIGVuYWJsZXMgdGhpcy4gVGhpcyBtYWNybyBhbG9uZyB3aXRoIGZ1dHVyZSAKICAgICAgICAgICAgYXV0b2NvbmYgbWFjcm9zIGFyZSBnb2luZyB0byBiZSBwdXQgaW4gdGhlIFRvb2xzL2NvbmZpZyBkaXJlY3RvcnkuCgogICAgICAgICAgICAnc3dpZyAtdmVyc2lvbicgbm93IHJlcG9ydHMgdGhlIHRhcmdldCBidWlsZCBwbGF0Zm9ybS4KCjA1LzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEZpeCB0byB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOgoKICAgICAgICAgICAgamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KCiAgICAgICAgICAgIFRoZXNlIGFyZSB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZy9nZW5lcmF0aW5nIHByb3h5IGNsYXNzZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIHdvdWxkIHVzZSB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgbm90IHRoZSAKICAgICAgICAgICAgQysrIHR5cGUsIHdoaWNoIHdhcyBpbmNvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgdHlwZW1hcHMuIAoKICAgICAgICAgICAgSW4gbW9zdCBjaXJjdW1zdGFuY2VzIHRoZSBwcm94eSBjbGFzcyBuYW1lIGFuZCB0aGUgQysrIGNsYXNzIG5hbWUvdHlwZSAKICAgICAgICAgICAgaXMgdGhlIHNhbWUgZXhjZXB0IGZvciBjbGFzc2VzIGluIG5hbWVzcGFjZSwgdGVtcGxhdGVkIGNsYXNzZXMgZXRjLiBzbwogICAgICAgICAgICB0aGlzIHNob3VsZG4ndCBhZmZlY3QgbW9zdCBjYXNlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIGFuZCBDIyBNT0RVTEVTICoqKgoKMDUvMDkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFZpc3VhbCBDKysgUHJvamVjdCBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCB0aGUgcnVudGltZSBsaWJyYXJpZXMKICAgICAgICAgICAgY2FuIGJlIGJ1aWx0IG9uIFdpbmRvd3MgKGZvciBUY2wsIFBlcmwsIFB5dGhvbiBhbmQgUnVieSkuCgowNS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCByZXR1cm4gYnkgdmFsdWUsIGNvbnN0LCBhbmQgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgIEIoKTsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIEIoY29uc3QgQiYpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgY29uc3QgQiByZXR1cm5CKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcm9ibGVtIGFuZCBwYXRjaCBzdWdnZXN0aW9uIHJlcG9ydGVkIGJ5IEJpbGwgSG9mZm1hbi4KCjA0LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIFNpbmdsZSBhdXRvY29uZiBpbnZvY2F0aW9uIC0gYXV0b2NvbmYgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeSBoYXMgZ29uZS4KCiAgICAgICAgICAgIC0gTGlidG9vbCBib290c3RyYXBwZWQgd2hlbiBydW5uaW5nIGF1dG9nZW4uc2guIFRoaXMgcmVxdWlyZXMgYW55b25lCiAgICAgICAgICAgICAgdXNpbmcgdGhlIGN2cyB2ZXJzaW9uIG9mIFNXSUcgdG8gaGF2ZSBsaWJ0b29sIGluc3RhbGxlZCBvbiB0aGVpcgogICAgICAgICAgICAgIG1hY2hpbmUuIFN1Z2dlc3QgdmVyc2lvbiAxLjQuMiBvciBoaWdoZXIsIHByZWZlcmFibHkgdGhlIGxhdGVzdCAtIDEuNS4KCiAgICAgICAgICAgIC0gQXV0b21ha2UgaXMgbm93IHVzZWQgdG8gYnVpbGQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGluIGNvbmp1bmN0aW9uIAogICAgICAgICAgICAgIHdpdGggbGlidG9vbC4KCiAgICAgICAgICAgIC0gUnVudGltZSBsaWJyYXJpZXMgYXJlIG5vdyBzdWNjZXNzZnVsbHkgYnVpbHQgYXMgRExMcyBvbiBDeWd3aW4uCgogICAgICAgICAgICAtIFNraXBwaW5nIGxhbmd1YWdlcyBpcyBubyBsb25nZXIganVzdCBkZXRlcm1pbmVkIGluIHRoZSB0b3AgbGV2ZWwgCiAgICAgICAgICAgICAgbWFrZWZpbGUgYnV0IGluIGNvbmZpZ3VyZS5pbi4gVGhpcyBpbmZvIGlzIHVzZWQgZm9yIGJ1aWxkaW5nCiAgICAgICAgICAgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGFuZCBmb3IgcnVubmluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAtIFRoZXNlIGNoYW5nZXMgaGF2ZSBmaXhlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcnkgYnVpbGRzLCB0aGF0IGlzCiAgICAgICAgICAgICAgYnVpbGRpbmcgZnJvbSBkaXJlY3RvcmllcyBvdGhlciB0aGFuIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LiAKICAgICAgICAgICAgICBJbnN0YWxsYXRpb24gZnJvbSBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBhbHNvIHdvcmtpbmcuIEFuIGluaXRpYWwKICAgICAgICAgICAgICBjb25maWd1cmUgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhcyBkZXNjcmliZWQKICAgICAgICAgICAgICBpbiAwNC8wMi8yMDAzIGVudHJ5LiBBICdtYWtlIGRpc3RjbGVhbicgd2lsbCBiZSBuZWVkZWQgYmVmb3JlIGJ1aWxkaW5nCiAgICAgICAgICAgICAgaW4gYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpZiB0aGUgYXV0b3Rvb2xzIAogICAgICAgICAgICAgIGhhdmUgYmVlbiBydW4gZnJvbSB0aGlzIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgc29tZSBwb2ludCwgYnV0IAogICAgICAgICAgICAgIGF1dG9jb25mIHdpbGwgdGVsbCB5b3UgdGhpcy4gTm90ZSB0aGF0ICdtYWtlIGNoZWNrJyBvbmx5IHdvcmtzIGZyb20gCiAgICAgICAgICAgICAgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgdGhlIG1vbWVudC4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3MjM0NzEgXSBXcmFwcGVyX3ByaW50KCkgZmFpbHMgd2l0aCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgcmVmaW5lbWVudCBvZiBjb25zdCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIGhhbmRsaW5nIAogICAgICAgICAgICBkZXNjcmliZWQgaW4gQ0hBTkdFUyAwOC8xMS8yMDAyLiAgIFByZXZpb3VzbHksIFNXSUcgbWVyZWx5CiAgICAgICAgICAgIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbiBpbml0aWFsaXplciBpbiB0aGUgZGVjbGFyYXRpb24uCiAgICAgICAgICAgIE5vdywgU1dJRyBhZGRpdGlvbmFsbHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIG1lbWJlcgogICAgICAgICAgICBpcyBjb25zdC4KCjA0LzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIGtpbmQgb2YgbGltaXRlZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSwKICAgICAgICAgICAgYWN0aXZhdGVkIHVzaW5nIHRoZSAtbWluaGVyaXQgY29tbWFuZC1saW5lIG9wdGlvbi4gSSd2ZSBhbHNvIHVwZGF0ZWQKICAgICAgICAgICAgdGhlICJDKysgSW5oZXJpdGFuY2UiIHNlY3Rpb24gb2YgdGhlIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byBkaXNjdXNzCiAgICAgICAgICAgIGhvdyB0aGlzIHdvcmtzLCBhbmQgaXRzIGxpbWl0YXRpb25zLiBBbHNvIGFsc28gbW9kaWZpZWQgdGhlIG1pbmhlcml0LmkKICAgICAgICAgICAgdGVzdCBjYXNlIHRvIHJ1biBhZ2FpbnN0IHRoaXMuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIC1nbG9iYWxtb2R1bGUgY29tbWFuZC1saW5lIG9wdGlvbiBmb3IgdGhlIFJ1YnkKICAgICAgICAgICAgbW9kdWxlLCBmb3Igd3JhcHBpbmcgc3R1ZmYgaW50byB0aGUgZ2xvYmFsIG1vZHVsZSAoS2VybmVsKSBpbnN0ZWFkCiAgICAgICAgICAgIG9mIGEgbmVzdGVkIG1vZHVsZS4gVXBkYXRlZCBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LgoKMDQvMjMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgc3ltbmFtZSBlcnJvciBpbiBkaXJlY3RvciBjYWxscyB0byBQeXRob24gbWV0aG9kcwoJICAgIHRoYXQgZXh0ZW5kIEMrKyBvcGVyYXRvcnMuCgoJICAgIFN0b3BwZWQgZGlyZWN0b3IgZGVzdHJ1Y3RvciB3cmFwcGVycyBmcm9tIGNhbGxpbmcgX19zZXRfdXAsCgkgICAgd2hpY2ggd2FzIGxlYXZpbmcgdGhlIGRpcmVjdG9yIGZsYWcgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLgoKMDQvMjMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggbmFtZXNwYWNlIHJlc29sdXRpb24gYW5kIG5lc3RlZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBbGZyZWQgTG9yYmVyIChhbmQgTWFyY2VsbyBNYXR1cykuCgowNC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUGF0Y2ggZm9yIEphdmEgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdG8gcnVuIG9uIE1hYyBPUyBYLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEluY29ycG9yYXRlZCBOb2J1IE5ha2FkYSdzIHBhdGNoZXMgZm9yIHN1cHBvcnRpbmcgdGhlIFJ1YnkKICAgICAgICAgICAgMS44IGFsbG9jYXRpb24gZnJhbWV3b3JrLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFJlcGxhY2VkIGFsbCB1c2VzIG9mIHRoZSBkZXByZWNhdGVkIFNUUjJDU1RSKCkgbWFjcm8gd2l0aCB0aGUKICAgICAgICAgICAgc2FmZXIgU3RyaW5nVmFsdWVQdHIoKSBtYWNyby4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBydWJ5LXRhbGs6NjcwNTkKICAgICAgICAgICAgYW5kIGZvbGxvdy11cHMgdG8gdGhhdCBwb3N0LgoKMDQvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcHJlcHJvY2Vzc29yIG1hY3JvIGV4cGFuc2lvbi4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICAjZGVmaW5lIG1pbih4LHkpICgoeCkgPCAoeSkpID8gKHgpIDogKHkpIAogICAgICAgICAgICAgICAgaW50IGYoaW50IG1pbik7CgogICAgICAgICAgICBSZXBvcnRlZCBieSBTZWJhc3RpZW4gUmVjaW8uCgowNC8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIGEgcnVudGltZSBjaGVjayB0byB0eXBlbWFwcyBpbiBhcnJheXNfamF2YS5pIGxpYnJhcnkgdG8gY2hlY2sgCiAgICAgICAgICAgIHRoYXQgdGhlIEphdmEgYXJyYXkgcGFzc2VkIGluIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIEMgYXJyYXkgYW5kIHRocm93IGFuIAogICAgICAgICAgICBleGNlcHRpb24gaWYgbm90LgoKICAgICAgICAgICAgQWxzbyBmaXggdG8gdXNlIGRlbGV0ZSBpbnN0ZWFkIG9mIGZyZWUgZm9yIGFycmF5cyBjcmVhdGVkIHVzaW5nIG5ldy4KCjA0LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBSZW1vdmUgR0NDMyB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZToKCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogY2hhbmdpbmcgc2VhcmNoIG9yZGVyIGZvciBzeXN0ZW0gZGlyZWN0b3J5ICIvdXNyL2luY2x1ZGUiCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgYSBub24tc3lzdGVtIGRpcmVjdG9yeSAKCiAgICAgICAgICAgIFNlZSBTRiBwYXRjaCAjNzE1NTMxIHN1Ym1pdHRlZCBieSBHZXJhbGQgV2lsbGlhbXMKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEltcHJvdmVkIHdyYXBwaW5nIG9mIGVudW1zIGFuZCBjb25zdGFudHMuIFRoZXNlIHdlcmUgcHJldmlvdXNseQogICAgICAgICAgICB3cmFwcGVkIGFzIEMjIHZhcmlhYmxlcyByYXRoZXIgdGhhbiBjb25zdGFudHMuIEVpdGhlciB0aGVzZSBhcmUgd3JhcHBlZAogICAgICAgICAgICBhcyByZWFkb25seSAocnVudGltZSkgY29uc3RhbnRzIG9yIGNvbXBpbGUgdGltZSBjb25zdGFudHMsIGRlcGVuZGluZyBvbgogICAgICAgICAgICB0aGUgJWphdmFjb25zdCBkaXJlY3RpdmUgKFRoZSBkaXJlY3RpdmUgaXMgbGlrZWx5IHRvIGNoYW5nZSBuYW1lIHNvb24pLgogICAgICAgICAgICBGb3IgZXhhbXBsZSB3cmFwcGluZzoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDApOwogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDIyCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBYWVo7CiAgICAgICAgICAgICAgI2RlZmluZSBYWVogMzMKICAgICAgICAgICAgaXMgbm93OgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW50IEFCQyA9IGV4YW1wbGVQSU5WT0tFLmdldF9BQkMoKTsKICAgICAgICAgICAgICBwdWJsaWMgY29uc3QgaW50IFhZWiA9IDMzOwoKMDQvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBHbG9iYWwgY29uc3RhbnRzIGFuZCBlbnVtcyBhcmUgcHV0IGluIHRoZWlyIG93biBpbnRlcmZhY2UgY2FsbGVkCiAgICAgICAgICAgIHh4eENvbnN0YW50cywgd2hlcmUgeHh4IGlzIHRoZSBtb2R1bGUgbmFtZS4gVGhpcyBpcyBhbiBpbXByb3ZlbWVudCBhcyAKICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gZGVyaXZlIChpbXBsZW1lbnQpIGEgSmF2YSBjbGFzcyBmcm9tIHRoZSB4eHhDb25zdGFudHMKICAgICAgICAgICAgaW50ZXJmYWNlIHRvIGltcHJvdmUgdGhlIHN5bnRheDsgbmFtZWx5IHdoZW4gd3JhcHBpbmc6CiAgICAgICAgICAgICAgZW51bSB7T05FPTEsIFRXTywgVEhSRUV9OwogICAgICAgICAgICBhY2Nlc3NpbmcgdGhlc2UgZnJvbSBhIEphdmEgY2xhc3MgaW1wbGVtZW50aW5nIHh4eENvbnN0YW50cyBpcyBuZWF0ZXI6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IE9ORTsKICAgICAgICAgICAgdGhhbiB0aGUgcHJldmlvdXM6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IHh4eC5PTkU7CgogICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgRGF2ZSBEcmliaW4uCgowNC8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgaW1wcm92ZW1lbnRzIGZvciBtdWx0aXBsZSBidWlsZHMuIFRoaXMgYWxsb3dzIG9uZSB0byBidWlsZAogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlIGFuZCBydW50aW1lIGxpYnJhcmllcyBmb3IgZGlmZmVyZW50IHBsYXRmb3Jtcy9jb21waWxlcnMgCiAgICAgICAgICAgIGV0YyBieSBydW5uaW5nIGNvbmZpZ3VyZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuIFRoaXMgaXNuJ3QgMTAwJSBqdXN0IAogICAgICAgICAgICB5ZXQgYW5kIHdvbid0IGJlIHVudGlsIGxpYnRvb2wgaXMgYmV0dGVyIGNvbmZpZ3VyZWQuLi4gYSAnY29uZmlndXJlJyBhbmQgCiAgICAgICAgICAgICdtYWtlIGRpc3RjbGVhbicgbmVlZHMgdG8gYmUgcnVuIGluIHRoZSByb290IGRpcmVjdG9yeSBiZWZvcmUgaXQgYWxsIHdvcmtzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKICAgICAgICAgICAgICAkIC4vY29uZmlndXJlCiAgICAgICAgICAgICAgJCBtYWtlIGRpc3RjbGVhbgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMTsgY2QgY29uZmlnMTsgLi4vY29uZmlndXJlIENDPWdjYyBDWFg9ZysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMjsgY2QgY29uZmlnMjsgLi4vY29uZmlndXJlIENDPWNjIENYWD1jKys7IG1ha2U7IGNkIC4uCiAgICAgICAgICAgIAogICAgICAgICAgICBUbyBiZSBpbXByb3ZlZC4gQSAnbWFrZSBjaGVjaycgZG9lcyBub3Qgd29yayB5ZXQgZWl0aGVyLiAKCjA0LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhcmd1bWVudCBleHBhbnNpb24gYnVnLgogICAgICAgICAgICBUaGlzIHNob3dlZCB1cCB3aGVuIHRyeWluZyB0byB1c2Ugc3RkX3ZlY3Rvci5pIHdpdGggdmVjdG9ycwogICAgICAgICAgICBvZiBwb2ludGVycy4KCjAzLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHBhcmFsbGVsIG1ha2UgYnVpbGRzIG9mIFNXSUcsIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgbWFrZSAtaiA0CiAgICAgICAgICAgIEJ1aWxkIGZhaWx1cmUgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UuCgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlbGVhc2VkIDEuMy4xOS4KCgoKVmVyc2lvbiAxLjMuMTkgKE1hcmNoIDI4LCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFZhcmlldHkgb2YgbWlub3IgYnVnIGZpeGVzIHRvIHRoZSAxLjMuMTggcmVsZWFzZSBpbmNsdWRpbmc6CgogICAgICAgICAgICAgICAgLSBTZWdtZW50YXRpb24gZmF1bHQgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZS4KICAgICAgICAgICAgICAgIC0gVHlwZW1hcCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBFeHByZXNzaW9uIGV2YWx1YXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBMYXJnZSBtZW1vcnkgbGVhayB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4KClZlcnNpb24gMS4zLjE4IChNYXJjaCAyMywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0d28gcHJvYmxlbXMgd2l0aCB0aGUgJWV4dGVuZCBkaXJlY3RpdmUsIG92ZXJsb2FkaW5nLCBhbmQKICAgICAgICAgICAgdGVtcGxhdGUgZXhwYW5zaW9uLiAgU2VlIHRoZSAndGVtcGxhdGVfZXh0ZW5kX292ZXJsb2FkJyBhbmQKICAgICAgICAgICAgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZF8yJyB0ZXN0cyBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlIGZvcgogICAgICAgICAgICBkZXRhaWxzLgoKMDMvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQWRkZWQgc29tZSB0eXBlbWFwcyBhcyBzdWdnZXN0ZWQgYnkgQW5kcmVhcyBTY2hvZXJrIGZvciBoYW5kbGluZwogICAgICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBhcyBwb2ludGVycyBvciBieSByZWZlcmVuY2UuIFRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiBwdXQgaW4gdHlwZW1hcHMuaS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBDKysgc2NvcGluZyBidWcgcmVsYXRlZCB0byBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgRm9vOjpiYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5LCBTV0lHIGp1c3QgdG9zc2VkIG91dCB0aGUgRm9vOjpiYXIoKSBkZWNsYXJhdGlvbi4gTm93LAogICAgICAgICAgICB0aGUgZGVjbGFyYXRpb24gaXMgd3JhcHBlZCBwcm92aWRlZCB0aGF0IHRoZSBwcmVmaXggaXMgZXhhY3RseSB0aGUKICAgICAgICAgICAgc2FtZSBhcyB0aGUgY3VycmVudCBzY29wZSAoaW5jbHVkaW5nIGFueSBlbmNsb3NpbmcgbmFtZXNwYWNlcykuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJydWNlIExvd2VyeS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgNjk2NTE2IF0gRW5hYmxpbmcgZXhjZXB0aW9uIHByb2Nlc3NpbmcgZm9yIGRhdGEgbWVtYmVyIGFjY2Vzcy4KICAgICAgICAgICAgSW4gc29tZSBjb21waWxlcnMsIGF0dHJpYnV0ZSBhY2Nlc3MgY2FuIGdlbmVyYXRlIGV4Y2VwdGlvbnMuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIG9yZGluYXJpbHkgYXNzdW1lcyB0aGF0IG5vIGV4Y2VwdGlvbnMgd2lsbCBiZSByYWlzZWQuICBUbyBkaXNhYmxlIHRoaXMsCiAgICAgICAgICAgIHVzZSB0aGUgJWZlYXR1cmUoImFsbG93ZXhjZXB0IikuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCB4OyAgICAgLyogRXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgWWFrb3YgTWFya292aXRjaC4gCiAKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgUGF0Y2guIFsgNzAxODYwIF0gSW1wcm92ZSBQZXJmb3JtYW5jZSAocHl0aG9uIHByb3hpZXMpLgogICAgICAgICAgICBHaXZlcyBhIHBlcmZvcm1hbmNlIGJvb3N0IHRvIHByb3h5IGNsYXNzIGNvZGUgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHRoZQogICAgICAgICAgICAudGhpcyBhbmQgLnRoaXNvd24gYXR0cmlidXRlcy4gIENvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjAzLzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEFkZGVkIG1pc3NpbmcgdmFyYXJnIHN1cHBvcnQuCgowMy8xOC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBSZW1vdmVkIGNvZGUgcmVsYXRlZCB0byB0YWdnaW5nIGluZGl2aWR1YWwgbWV0aG9kcyBmb3IgZGlyZWN0b3JzLgoJICAgIFRoZSBjb25jZXB0IG9mIGhhdmluZyBkaXJlY3RvcnMgZm9yIHNvbWUgYnV0IG5vdCBhbGwgdmlydHVhbCBtZXRob2RzCgkgICAgb2YgYSBjbGFzcyBpcyBkZWVwbHkgZmxhd2VkLiAgVGhlICVmZWF0dXJlKCJub2RpcmVjdG9yIikgdGFnIGlzIGFsc28KCSAgICBnb25lLiAgCgkgICAgCgkgICAgRGlyZWN0b3JzIGFyZSBvZmYgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtIGZvciBhIGNsYXNzLCBpc3N1ZQoJICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIGNsYXNzbmFtZTsgd2hpY2ggd2lsbCBjcmVhdGUgZGlyZWN0b3IgbWV0aG9kcwoJICAgIGZvciBldmVyeSB2aXJ0dWFsIG1ldGhvZCBpbiB0aGUgaGllcmFyY2h5IG9mIHRoZSBjbGFzcy4KCjAzLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHBhc3NpbmcgYXJndW1lbnRzIG9mIHR5cGUgZnVuY3Rpb24uICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oaW50IHgoaW50LCBpbnQpKTsKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90IHgpOwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zLCB0aGlzIHdvdWxkIHByb2R1Y2UgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuICBOb3csCiAgICAgICAgICAgIFNXSUcgbWVyZWx5IGFkZHMgYW4gZXh0cmEgcG9pbnRlciwgbWFraW5nIHRoZXNlIGRlY2xhcmF0aW9ucyB0aGUgc2FtZQogICAgICAgICAgICBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oaW50ICgqeCkoaW50LCBpbnQpKTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IGJpbm9wX3QoaW50LCBpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGJpbm9wX3QgKngpOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2FydGggQnVzaGVsbC4KCjAzLzE3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciBkaXJlY3RvciBiYXNlIGNsYXNzIGNhbGxzIHRoYXQgaGF2ZSBubwogICAgICAgICAgICByZXR1cm4gdmFsdWUuCgowMy8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnN0IHNtYXJ0LXBvaW50ZXIgd3JhcHBpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBvbmx5ICJ4IiBhbmQgImJhciIgYXJlIHZpc2libGUgZnJvbSBCbGFoIChzaW5jZSBhcHBsaWNhdGlvbgogICAgICAgICAgICBvZiBzcGFtIHZpb2xhdGVzIGNvbnN0bmVzcykuICBNb3Jlb3ZlciwgYWNjZXNzIHRvICJ4IiBpcyByZWFkLW9ubHkuCiAgICAgICAgICAgCjAzLzE1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENsZWFuZWQgdXAgdHdvIHNpZ25lZCB2ZXJzdXMgdW5zaWduZWQgY29tcGFyaXNvbnMgaW4gcHl0aG9uL3N0ZF92ZWN0b3IuaS4KCSAgICAKMDMvMTUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gR2xvYmFsIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgZ2V0IGFuZCBzZXQgbWV0aG9kcy4KICAgICAgICAgICAgTWVtYmVyIHZhcmlhYmxlIHdyYXBwaW5nIGJ1ZyBmaXhlcywgZm9yIGV4YW1wbGUgd3JhcHBpbmcgcG9pbnRlcnMgd29yayBub3cuCiAgICAgICAgICAgIFR5cGVtYXBzIGFyZSB1c2VkIGZvciBhbGwgdmFyaWFibGUgd3JhcHBpbmcgdG8gZ2VuZXJhdGUgdGhlIHByb3BlcnR5IGNvZGUuCgowMy8xMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgdmlydHVhbCBtZXRob2QgdW5yb2xsaW5nIGZvciBkaXJlY3RvcnMuIAoJICAgIFRoZSBvcmRlciBvZiB1bnJvbGxpbmcgaXMgbm93IGZyb20gYmFzZSB0byBkZXJpdmVkLCB0byBlbnN1cmUKCSAgICB0aGF0IHRoZSBtb3N0IGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBkaXJlY3RvciBtZXRob2QgaXMKCSAgICBmb3VuZC4KCgkgICAgRGlyZWN0b3IgbWV0aG9kcyBmb3IgcHVyZSB2aXJ0dWFsIG1ldGhvZHMgbm93IHRocm93CgkgICAgRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTiBpZiBfdXAgaXMgc2V0LgoKMDMvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gUG9seW1vcnBoaXNtIGZpeDogdmlydHVhbCBmdW5jdGlvbnMgbm93IHVzZSB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgICAga2V5d29yZCBpbiB0aGUgQyMgcHJveHkgY2xhc3MsIHZpcnR1YWwgb3Igb3ZlcnJpZGUuCiAgICAgICAgICAgIFNvbWUgJ3VzaW5nIFN5c3RlbTsnIHN0YXRlbWVudCBmaXhlcyBuZWVkZWQgYnkgdGhlIE1vbm8gY29tcGlsZXIuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIFN3aWdWYWx1ZVdyYXBwZXI8PiB0bwogICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcnVjZSBMb3dlcnkuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAkZGVzY3JpcHRvcih0eXBlKSB2YXJpYWJsZSBpcyBub3cgZXhwYW5kZWQgaW4gY29kZSBzdXBwbGllZCB0bwogICAgICAgICAgICAlZXh0ZW5kLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4ga2luZHMgb2YgYWR2YW5jZWQgd3JhcHBpbmcgCiAgICAgICAgICAgIChlc3BlY2lhbGx5IGNvbnRhaW5lciBjbGFzc2VzKS4KCjAzLzExLzIwMDM6IGx1aWdpCiAgICAgICAgICAgIFN1cHBvcnQgZm9yIHN0ZDo6bWFwLgogICAgICAgICAgICAoYSkgSW50ZWdyYXRpb24gd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGEgbGEgc3RkOjp2ZWN0b3IpIGZvcgogICAgICAgICAgICAgICAgUHl0aG9uLCBSdWJ5LCBNelNjaGVtZSwgYW5kIEd1aWxlOwogICAgICAgICAgICAoYikgU2ltcGxlIHdyYXBwZXIgZm9yIG90aGVyIGxhbmd1YWdlcwoKMDMvMTAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmcgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICBTV0lHCiAgICAgICAgICAgIHdhc24ndCBwYXJzaW5nIGNlcnRhaW4gb2N0YWwgY29kZXMgY29ycmVjdGx5LgoKMDMvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2Ygc3VidGxlIHByZXByb2Nlc3NvciBwcm9ibGVtcyByZXBvcnRlZCBieQogICAgICAgICAgICBTZWJhc3RpZW4gUmVjaW8uCgogICAgICAgICAgICAoYSkgRW1wdHkgcHJlcHJvY2Vzc29yIHZhbHVlcyBubyBsb25nZXIgZ2VuZXJhdGUgImJhZCBjb25zdGFudAogICAgICAgICAgICB2YWx1ZSIgZXJyb3JzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTwogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBCQVIKCiAgICAgICAgICAgIChiKSBNYWNybyBuYW1lcyBjYW4gbm93IHNwYW4gbXVsdGlwbGUgbGluZXMgKHRlY2huaWNhbGx5IHZhbGlkLAogICAgICAgICAgICBhbHRob3VnaCBxdWVzdGlvbmFibGUgcHJhY3RpY2UpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEFfTE9OR19NQUNST19cCiAgICAgICAgICAgICAgICAgIE5BTUUgNDIKCiAgICAgICAgICAgIChjKSBXaGl0ZXNwYWNlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBiZWZvcmUgY2VydGFpbiBtYWNybyB2YWx1ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08iSGVsbG8iCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgQkFSXAogICAgICAgICAgICAgICAgICAiSGVsbG8iCiAKMDMvMDcvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZW1hcHMKICAgICAgICAgICAgaW4gdGhlIExpYi9ydWJ5L3R5cGVtYXBzLmkgbGlicmFyeSBmaWxlLgoKMDMvMDcvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2NhbGxiYWNrIHRvIGRlbW9zdHJhdGUgaG93IGRpcmVjdG9ycyBjYW4KCSAgICBiZSB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3MgaW4gUHl0aG9uCgkgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2V4dGVuZCB0byBkZW1vbnN0cmF0ZSB2aXJ0dWFsIG1ldGhvZAoJICAgIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiAocmVhbGx5IHRoZSBzYW1lIGFzIHRoZSBjYWxsYmFjawoJICAgIGV4YW1wbGUsIGp1c3QgYSBkaWZmZXJlbnQgY29udGV4dCkuCgkgICAgQWRkZWQgZm91ciB0ZXN0cyBmb3IgdmVyeSBiYXNpYyBkaXJlY3RvciBmdW5jdGlvbmFsaXR5LiAgVGhlc2UKCSAgICBoYXZlIHJ1bnRpbWUgdGVzdHMgdW5kZXIgcHl0aG9uLgoJICAgIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbWl0cyAjZGVmaW5lIFNXSUdfRElSRUNUT1JTIG5lYXIgdGhlCgkgICAgdG9wIG9mIHRoZSBvdXRwdXQgZmlsZSBpZiBkaXJlY3RvcnMgYXJlIGVuYWJsZWQuICBUaGlzIGlzIHVzZWZ1bAoJICAgIGZvciBkaXNhYmxpbmcgcGFydHMgb2YgdGVzdHMgaW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvbid0CgkgICAgc3VwcG9ydCBkaXJlY3RvcnMuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIHNlY3Rpb24gdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbCBvbiBjcm9zcyBsYW5ndWFnZQoJICAgIHBvbHltb3JwaGlzbSAoZGlyZWN0b3JzKS4KCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFRoZSBzaG9ydC1saXZlZCAiLWZkaXJlY3RvcnMiIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgVG8gZW5hYmxlIGRpcmVjdG9ycywgaW5zdGVhZCB1c2UgdGhlIGV4dGVuZGVkICVtb2R1bGUgCgkgICAgZGlyZWN0aXZlIGFzIGZvbGxvd3M6CgoJICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIpIG1vZHVsZW5hbWUKCjAzLzA2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgbG9uZyBsb25nIHR5cGVtYXBzIGhhdmUgYmVlbiByZXdyaXR0ZW4gc28gdGhhdCB0aGV5IGNhbiBiZSBtb3JlCiAgICAgICAgICAgIGVhc2lseSB1c2VkIHdpdGggbm9uIElTTyBjb21waWxlcnMsIGxpa2UgVmlzdWFsIEMrKy4gRm9yIGV4YW1wbGUKICAgICAgICAgICAgaWYgeW91IGFyZSB3cmFwcGluZyB0aGUgV2luZG93cyA2NCBiaXQgdHlwZSBfX2ludDY0IHRoZSBsb25nIGxvbmcKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHk6CgogICAgICAgICAgICAgICAgJWFwcGx5IGxvbmcgbG9uZyB7IF9faW50NjQgfTsKICAgICAgICAgICAgICAgIF9faW50NjQgdmFsdWUxKF9faW50NjQgeCk7CgogICAgICAgICAgICBfX2ludDY0IHdpbGwgbm93IGFwcGVhciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgaW5zdGVhZCBvZiBsb25nIGxvbmcuCiAgICAgICAgICAgIAowMy8wNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgQ0hBTkdFICoqKgogICAgICAgICAgICBTd2lnIG1vZHVsZSBtdXRhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgV2hlbiBhIGxhbmd1YWdlCiAgICAgICAgICAgIGNsYXNzIG1ldGhvZCB3YW50cyB0byBzYXZlIG5vZGUgYXR0cmlidXRlcywgaXQgbm93IHVzZXMgb25lIG9mIHRoZQogICAgICAgICAgICBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKICAgICAgICAgICAgICAgICAgU3dpZ19yZXF1aXJlKCkKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCkKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVzZSBmdW5jdGlvbnMgaXMgYSBuYW1lc3BhY2UgaW4gd2hpY2gKICAgICAgICAgICAgc2F2ZWQgYXR0cmlidXRlcyBhcmUgcGxhY2VkLiAgRm9yIGV4YW1wbGUsdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgICBOb2RlICpuOwogICAgICAgICAgICAgICAgICBTd2lnX3NhdmUoImNEZWNsYXJhdGlvbiIsbiwidHlwZSIsInBhcm1zIiwibmFtZSIsTklMKTsKCiAgICAgICAgICAgIHNhdmVzIHRoZSBhdHRyaWJ1dGVzIGFzICJjRGVjbGFyYXRpb246dHlwZSIsICJjRGVjbGFyYXRpb246cGFybXMiLAogICAgICAgICAgICBhbmQgc28gZm9ydGguICAgSWYgbmVjZXNzYXJ5LCBhIGxhbmd1YWdlIG1vZHVsZSBjYW4gcmVmZXIgdG8KICAgICAgICAgICAgb2xkIHZhbHVlcyBieSB1c2luZyB0aGlzIHNwZWNpYWwgbmFtZXNwYWNlIHF1YWxpZmllci4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoaXMsIGEgc3BlY2lhbCBhdHRyaWJ1dGUgInZpZXciIGNvbnRhaW5zIHRoZSBuYW1lCiAgICAgICAgICAgIG9mIHRoZSBsYXN0IG5hbWVzcGFjZSB1c2VkIHRvIHNhdmUgYXR0cmlidXRlcy4gIEluIHRoZSBhYm92ZSAKICAgICAgICAgICAgZXhhbXBsZSwgInZpZXciIHdvdWxkIGhhdmUgdGhlIHZhbHVlICJjRGVjbGFyYXRpb24iLiAgIFRoZSB2YWx1ZQogICAgICAgICAgICBvZiAiY0RlY2xhcmF0aW9uOnZpZXciIHdvdWxkIGhhdmUgdGhlIHByZXZpb3VzIHZpZXcgYW5kIHNvIGZvcnRoLgoKICAgICAgICAgICAgU3dpZ19yZXN0b3JlKG4pIHJlc3RvcmVzIGEgbm9kZSB0byB0aGUgc3RhdGUgYmVmb3JlIHRoZSBsYXN0CiAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpIG9yIFN3aWdfc2F2ZSgpIGNhbGwuCgogICAgICAgICAgICBOb3RlOiAgVGhpcyBjaGFuZ2UgbWFrZXMgaXQgZWFzaWVyIGZvciBsYW5ndWFnZSBtb2R1bGVzIHRvIHJlZmVyCiAgICAgICAgICAgIHRvIG9sZCB2YWx1ZXMgb2YgYXR0cmlidXRlcy4gIAoKCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1lcmdlZCB0aGUgY3Jvc3MtbGFuZ3VhZ2UgcG9seW1vcnBoaXNtIHBhdGNoLiAgV2hlbiBlbmFibGVkLCBDKysgCgkgICAgInByb3h5IiBjbGFzc2VzIChjYWxsZWQgZGlyZWN0b3JzKSBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIHNwZWNpZmllZCAKCSAgICBDKysgY2xhc3MuICBEaXJlY3RvcnMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSBDKysgdG8gUHl0aG9uLCBzaW1pbGFyIAoJICAgIHRvIHRoZSB3YXkgdGhlIHVzdWFsIHByb3h5IChzaGFkb3cpIGNsYXNzZXMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSAKCSAgICBQeXRob24gdG8gQysrLiAgVG9nZXRoZXIsIHRoZXNlIHR3byB0eXBlcyBvZiBwcm94aWVzIGFsbG93IEMrKyAKCSAgICBjbGFzc2VzIHRoYXQgYXJlIGV4dGVuZGVkIGluIFB5dGhvbiB0byBiZWhhdmUganVzdCBsaWtlIG9yZGluYXJ5IAoJICAgIEMrKyBjbGFzc2VzIGFuZCBiZSB1c2VkIGluIEMrKyBsaWtlIG5hdGl2ZSBvYmplY3RzLiAgCgkgICAgCgkgICAgVGhpcyBmZWF0dXJlIGlzIHN0aWxsIHZlcnkgZXhwZXJpbWVudGFsIGFuZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIFRvIGVuYWJsZSBkaXJlY3RvciBzdXBwb3J0LCBzcGVjaWZ5ICctZmRpcmVjdG9ycycgb24gdGhlIFNXSUcgY29tbWFuZAoJICAgIGxpbmUgb3IgaW4gdGhlIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJbiB0aGUgaW50ZXJmYWNlCgkgICAgZmlsZSwgYWRkICVmZWF0dXJlKCJkaXJlY3RvciIpIHRvIGdlbmVyYXRlIGRpcmVjdG9ycyBmb3IgYWxsIGNsYXNzZXMKCSAgICB0aGF0IGhhdmUgdmlydHVhbCBtZXRob2RzLiAgCgkgICAgCgkgICAgU2VlIGh0dHA6Ly9zdG0ubGJsLmdvdi9+dG0yL3N3aWcvUHJveHlEb2MuaHRtbCBmb3IgbW9yZSBkZXRhaWxzLgoJICAgIAoKMDMvMDMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHNtYWxsIGdsaXRjaCBpbiB0eXBlbWFwIGxvY2FsIHZhcmlhYmxlIHJlcGxhY2VtZW50LiAgSWYgeW91IGhhZAogICAgICAgICAgICBhIHR5cGVtYXAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSAoJDFfdHlwZSB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAuLi47CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgbm8gb2NjdXJyZW5jZSBvZiAiJDFfdHlwZSIgYXBwZWFyZWQgaW4gdGhlIGJvZHksIHRoZW4gdGhlIGxvY2FsCiAgICAgICAgICAgIHZhcmlhYmxlIHR5cGUgd291bGRuJ3QgYmUgc3Vic3RpdHV0ZWQuCgowMy8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgdmVyc2lvbiBvZiB0aGUgQ1NoYXJwIG1vZHVsZSB3aGljaCBpcyB0eXBlbWFwIGJhc2VkLgogICAgICAgICAgICBJdCBhbHNvIHVzZXMgRUNNQSBDIyBhbmQgbm8gbG9uZ2VyIHVzZXMgTWljcm9zb2Z0IFZpc3VhbCBDKysuTkVUIAogICAgICAgICAgICBnbHVlLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCB3b3JrIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgTmVpbCBDYXdzZS4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTM1NDggXSBlcnJvciBwYXJzaW5nIGNhc3Rpbmcgb3BlcmF0b3IgZGVmaW5pdGlvbi4KICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyBjYXN0aW5nIG9wZXJhdG9ycyBkZWNsYXJlZCBvdXRzaWRlIG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGlubGluZSBBOjpvcGVyYXRvciBjaGFyICooKSB7IC4uLiB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFydGluIENhc2Fkby4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYW5vbnltb3VzIGJpdC1maWVsZHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgICA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeSA6IDg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFub255bW91cyBiaXQtZmllbGRzIGFyZSBpZ25vcmVkIGJ5IFNXSUcuICAgUHJvYmxlbQogICAgICAgICAgICByZXBvcnRlZCBieSBGcmFueiBI9nBmaW5nZXIuCgowMi8yNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJldHRlciB0eXBlbWFwcyBpbiB0aGUgRXhhbXBsZXMvamF2YS90eXBlbWFwIGV4YW1wbGUgYW5kIGFsc28gCiAgICAgICAgICAgIGZpeGVzIHN1YnRsZSBidWcgd2hlbiB1c2luZyB0aGUgU3RyaW5nQnVmZmVyIHR5cGVtYXBzIG1vcmUgdGhhbiBvbmNlLgoKMDIvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0MjExMiBdIENvbnN0YW50cyBjaGFyIGJ1Zy4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzUzMzcgXSBQYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG5vdCBlbnRpcmVseSB3b3JraW5nLgogICAgICAgICAgICBUaGVyZSB3YXMgYSBzdWJ0bGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBuYW1pbmcgYW5kIG9yZGVyaW5nIG9mCiAgICAgICAgICAgIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnRzLiAgTWF0Y2hpbmcgd29ya2VkIG9rYXksCiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgdGVtcGxhdGVzIHdlcmVuJ3QgZXhwYW5kZWQgY29ycmVjdGx5LgoKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcGFyc2luZyAoYW5kIGdlbmVyYXRpbmcgY29kZSkgZm9yIAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIGFycmF5cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBmb28oaW50ICgmeClbMTBdKTsKICAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTM0NyBdIENvbXBpbGF0aW9uIHdhcm5pbmcgZnJvbSBsaWJweS5jLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYW5pZWwgTC4gUmFsbC4KIAowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB2aXJ0dWFsIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBjaGVja2luZyBhbmQgdHlwZWRlZi4KCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKmludHB0cjsKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICpmb28oKSA9IDA7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludHB0ciBmb28oKSB7IH07CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyZWF0aW5nIHRoZXNlIGRlY2xhcmF0aW9ucyBhcyBkaWZmZXJlbnQgZXZlbiB0aG91Z2gKICAgICAgICAgICAgdGhleSBhcmUgdGhlIHNhbWUgKHZpYSB0eXBlZGVmKS4KCjAyLzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCByYW5nZSBjaGVja2luZyBmb3IgdGhlIE5VTTJVU0hSVCBtYWNybywgcGVyIFsgNjc1MzUzIF0uCgowMi8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB0aGUgY29kZSB0aGF0IGRldGVybWluZWQgaWYgYSBjbGFzcyBpcyBhYnN0cmFjdAogICAgICAgICAgICBhbmQgY2FuIGJlIGluc3RhbnRpYXRlZC4gICAgSWYgeW91IGhhZCBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZm9vKGludCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgc3RydWN0IEMgOiB2aXJ0dWFsIEEgeyAKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIC8qIE5vdGUgb3JkZXIgb2YgYmFzZSBjbGFzc2VzICovCQogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRCA6IEIsIEMgeyB9OyAgICAvKiBPayAqLwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRSA6IEMsIEIgeyB9OyAgICAvKiBCcm9rZW4gKi8KCiAgICAgICAgICAgIHRoZW4gU1dJRyBkZXRlcm1pbmVkIHRoYXQgaXQgY291bGQgaW5zdGFudGlhdGUgRCgpLCBidXQgbm90IEUoKS4KICAgICAgICAgICAgVGhpcyBpbmNvbnNpc3RlbmN5IGFyb3NlIGZyb20gdGhlIGRlcHRoLWZpcnN0IHNlYXJjaCBvZiB0aGUgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB0byBsb2NhdGUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMuICAgVGhpcyBwcm9ibGVtIHNob3VsZCBub3cgYmUgZml4ZWQtLS1TV0lHIHdpbGwgYXR0ZW1wdAogICAgICAgICAgICB0byBsb2NhdGUgYW55IHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIGEgdmlydHVhbCBtZXRob2QgYnkKICAgICAgICAgICAgdHJhdmVyc2luZyBvdmVyIHRoZSBlbnRpcmUgaGllcmFyY2h5LgoKMDIvMjIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHVzaW5nIGVudW0gdHlwZW1hcHMuIFRoZSBKYXZhIGZpbmFsIHN0YXRpYyB2YXJpYWJsZSB0eXBlCiAgICAgICAgICAgIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGpzdHlwZSB0eXBlbWFwLCBlbmFibGluZyBlbnVtcyB0byBiZSBtYXBwZWQgdG8gCiAgICAgICAgICAgIHNvbWV0aGluZyBvdGhlciB0aGFuIGludC4gQnVnIHJlcG9ydGVkIGJ5IEhlaW5lciBQZXRpdGguCgowMi8yMS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIENTaGFycCAoQyMpIG1vZHVsZSBwcm90b3R5cGUKICAgICAgICAgICAgaS5lLiBjc2hhcnAuY3h4ICYgY3NoYXJwLmggYXQgU291cmNlL01vZHVsZXMvLgogICAgICAgICAgICBUaGV5IGFyZSBmb3IgdGVzdCB1c2FnZSBvbmx5IG5vdyBhbmQgbmVlZCBpbXByb3ZlbWVudC4KICAgICAgICAgICAgVGhlIGludGVyZmFjZSBhbHNvIG5lZWQgdG8gYmUgbW9kaWZpZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgCjAyLzIwLzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgd2l0aCAtZnZpcnR1YWwuCiAgICAgICAgICAgIFNpbWlsYXIgYXMgYmVhemxleSdzIG1vZGlmaWNhdGlvbiB0b2RheS4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZ2NjLXN0eWxlIHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICAKICAgICAgICAgICAgUGF0Y2ggWyA2MjMyNTggXSBHQ0Mtc3R5bGUgdmFyYXJnIG1hY3JvIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZSBNYXNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgY2xhc3NlcyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKGludCB4KSA9IDA7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKEludGVnZXIgeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyBnZXR0aW5nIGNvbmZ1c2VkIGFib3V0IHRoZSBsYXR0ZXIgbWV0aG9kLS0tbWFraW5nIEJhcgogICAgICAgICAgICBhYnN0cmFjdC4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowMi8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVqYXZhY29uc3QoZmxhZykgY2FuIGFsc28gYmUgdXNlZCBvbiBlbnVtcyBhcyB3ZWxsIGFzIGNvbnN0YW50cy4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGVuYWJsZXMgdHJ1ZSBKYXZhIGNvbXBpbGVyIGNvbnN0YW50cyBzbyB0aGF0IHRoZXkgY2FuIGJlIAogICAgICAgICAgICB1c2VkIGluIEphdmEgc3dpdGNoIHN0YXRlbWVudHMuIFRoYW5rcyB0byBIZWluZXIgUGV0aXRoIGZvciBwYXRjaGVzLgoKMDIvMTkvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBNb2RpZmllZCAtZmNvbXBhY3QgZmVhdHVyZSB0byBkZWFsIHdpdGggUFAgbGluZXMKCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2ODkwNDAgXSBNaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvYmVydCBILiBkZSBWcmllcy4KCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBmZXcgZXZpbCBzY29waW5nIHByb2JsZW1zIHdpdGggdGVtcGxhdGVzLCBuYW1lc3BhY2VzLCBhbmQgdGhlCiAgICAgICAgICAgICVleHRlbmQgZGlyZWN0aXZlLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCgowMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW1J1YnldIEltcHJvdmVkIHN1cHBvcnQgZm9yIFZpc3VhbCBDKysgYW5kIG90aGVyIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4gCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc3BlY2lmeSAiL0VYUE9SVDpJbml0Xzxtb2R1bGU+Iiwgd2hlcmUgPG1vZHVsZT4gaXMgdGhlCiAgICAgICAgICAgIHN3aWcgbW9kdWxlIG5hbWUgd2hlbiBsaW5raW5nIHVzaW5nIHRoZXNlIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4KCjAyLzE1LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWZ2aXJ0dWFsIG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIHJlZGlmaW5lZCB2aXJ0dWFsIGZ1bmN0aW9uIGluIGNoaWxkcmVuIGNsYXNzZXMuCgogICAgICAgICAgICBNb2RpZmllZCAtY29tcGFjdCBvcHRpb24gdG8gLWZjb21wYWN0IG9wdGlvbgoKICAgICAgICAgICAgQWRkZWQgLXNtYWxsIG9wdGlvbi4KICAgICAgICAgICAgLXNtYWxsID0gLWZ2aXJ0dWFsIC1mY29tcGFjdAogICAgICAgICAgICBBbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IGZ1dHVyZSBmZWF0dXJlIG9wdGlvbnMsCiAgICAgICAgICAgIHdoaWNoIGFyZSB1c2VkIHRvIHJlZHVjZSB3cmFwcGVyIGZpbGUgc3ppZS4KCiAgICAgICAgICAgIEFkZGVkIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hlY2suCiAgICAgICAgICAgIFRvIGR5bmFtaWNhbGx5IHNldCB0aGUgZmVhdHVyZSBvcHRpb25zIHN1Y2ggYXMgLWZjb21wYWN0ICYgLWZ2aXJ0dWFsCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAyLzEzLzIwMDM6IGxlbnoKICAgICAgICAgICAgVXBkYXRlZCBEb2MvTWFudWFsL1Blcmw1Lmh0bWwgdG8gdGFsayBhYm91dCBDKysgY29tcGlsZSBwcm9ibGVtcwogICAgICAgICAgICBjb25maWd1cmUuaW4gbm93IGNoZWNrcyBmb3IgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBSdW50aW1lL01ha2VmaWxlLmluIGFuZCBFeGFtcGxlL01ha2VmaWxlLmluIG5vdyB1c2UgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBBZGRlZCBMaWIvcGVybDUvbm9lbWJlZC5oIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUga25vd24gbWFjcm8gY29uZmxpY3RzCgowMi8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg1NDEwIF0gQysrIEV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gY2F1c2VzIFNXSUcgdG8gZXhpdC4KICAgICAgICAgICAgRml4ZXMgYSBzeW50YXggZXJyb3Igd2l0aCBkZWNsYXJhdGlvbnMgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgaW5zdGFudGlhdGlvbiBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlLgogICAgICAgICAgICBXZSBtaWdodCBkbyBtb3JlIGxhdGVyLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIFdpbGxpYW1zb24uCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmV3cm90ZSBib29sIHR5cGVtYXBzIHRvIHJlbW92ZSBwZXJmb3JtYW5jZSB3YXJuaW5nIGZvciBjb21waWxpbmcgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgdW5kZXIgVmlzdWFsIEMrKy4KCjAyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHdyYXBwaW5nIHJlZmVyZW5jZSB2YXJpYWJsZXMgKGNvbnN0IG5vbi1wcmltaXRpdmUgYW5kIGFsbCBub24tY29uc3QgdHlwZXMpIAogICAgICAgICAgICBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBpbnQmIGk7CiAgICAgICAgICAgICAgQ2xhc3MmIGM7CiAgICAgICAgICAgICAgY29uc3QgQ2xhc3MmIGM7CgowMi8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG1vcmUgdmVyeSBzdWJ0bGUgcHJlcHJvY2Vzc29yIGNvcm5lciBjYXNlcyByZWxhdGVkIHRvIHJlY3Vyc2l2ZQogICAgICAgICAgICBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGNhdCh4LHkpIHggIyMgeQoKICAgICAgICAgICAgICAgICAgIGNhdChjYXQoMSwyKSwzKSAgICAvLyBQcm9kdWNlczogY2F0KDEsMikzCiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgeGNhdCh4LHkpIGNhdCh4LHkpCgogICAgICAgICAgICAgICAgICAgeGNhdCh4Y2F0KDEsMiksMykgIC8vIFByb2R1Y2VzIDEyMwoKICAgICAgICAgICAgU2VlIEsmUiwgMm5kIEVkLiBwLiAyMzEuCgowMi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA2ODM4ODIgXSAtIHBhdGNoIHN1Ym1pdHRlZCBieSBGLiBQb3N0bWEgZm9yIFNXSUcgdG8gY29tcGlsZSBvbiBIUC1VWC4KCjAyLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByZXByb2Nlc3NvciBhcmd1bWVudCBleHBhbnNpb24gYnVnLiBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTAvMjAwMzogc29uZ3lhbmYKICAgICAgICAgICAgQWRkZWQgLWNvbXBhY3Qgb3B0aW9uLgogICAgICAgICAgICBSZWR1Y2UgdGhlIGxpbmVzIGFuZCBzaXplIG9mIHRoZSB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgYnkgb21pdHRpbmcgY29tbWVudHMgYW5kIGNvbWJpbmluZyBzaG9ydCBsaW5lcy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTEzNTUgXSBTeW50YXggZXJyb3Igd2l0aCBjc3RyaW5nLmkKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgT21yaSBCYXJlbC4KCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NjM2MzIgXSBpbmNvbXBhdGliaWxpdHkgd2l0aCBzdGFuZGFyZCBjcHAuCiAgICAgICAgICAgIFRoaXMgaXMgYSByZWZpbmVtZW50IHRoYXQgZml4ZXMgdGhpcyBwcm9ibGVtOgoKICAgICAgICAgICAgICAgICAvLyBTb21lIG1hY3JvIHdpdGggYW4gYXJndW1lbnQKICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyh4KSAgICAgICB4CgogICAgICAgICAgICAgICAgIGludCBGT087ICAgICAgICAvKiBOb3QgYSBtYWNyby0tLW5vIGFyZ3VtZW50cyAqLwogCjAyLzA1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzU0OTEgXSBwYXJzZSBlcnJvciB3aXRoIGdsb2JhbCBuYW1lc3BhY2UgcXVhbGlmaWNhdGlvbi4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEplcmVteSBZYWxsb3AuCgowMi8wNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB2YXJhcmdzIHByb2Nlc3NpbmcgaW50cm9kdWNlZCBieSB0aGUgbnVtaW5wdXRzIHR5cGVtYXAgcGFyYW1ldGVyLgoKMDEvMDgvMjAwMzogdHRuCgkgICAgW3htbF0gRml4IHN0cmluZy1yZXBsYWNlbWVudCBvcmRlcmluZyBidWdsZXQuCgkgICAgVGhhbmtzIHRvIEdhcnkgSGVycm9uLgoKMTIvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZ1cnRoZXIgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBUaGUgU1dJRyBleGVjdXRhYmxlIGlzIG5vdyBidWlsdCB1c2luZyBhIHNpbmdsZSBNYWtlZmlsZS4KICAgICAgICAgICAgLSBUaGlzIG1ha2VmaWxlIGlzIGdlbmVyYXRlZCBieSBBdXRvbWFrZSAoU291cmNlL01ha2VmaWxlLmFtKS4KICAgICAgICAgICAgLSBEZXBlbmRlbmN5IHRyYWNraW5nIGFuZCB0YWdzIHN1cHBvcnQgYXJlIGluIHRoaXMgbWFrZWZpbGUuCiAgICAgICAgICAgIC0gQXV0b21ha2UgMS43LjIgYW5kIEF1dG9jb25mIDIuNTQgbWluaW11bSB2ZXJzaW9ucyBhcmUgbmVlZGVkIHRvIGJ1aWxkIFNXSUcgZnJvbSBDVlMuCiAgICAgICAgICAgIC0gUnVubmluZyAuL2F1dG9nZW4uc2ggbm93IGluc3RhbGxzIEF1dG9jb25mL0F1dG9tYWtlIHN1cHBvcnQgZmlsZXMgaW50bwogICAgICAgICAgICAgIFRvb2xzL2NvbmZpZyBhbmQgdGhlc2UgZmlsZXMgYXJlIG5vIGxvbmdlciBzdG9yZWQgaW4gQ1ZTLgogICAgICAgICAgICAtIEJ1ZyBmaXhlcyBpbiAnbWFrZSBpbnN0YWxsJyBmb3Igc3lzdGVtcyB1c2luZyAuZXhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIGFuZAogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1yZWxlYXNlLXN1ZmZpeD13aGF0ZXZlcgoKMTIvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE1vcmUgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBBdXRvY29uZidzIEFDX0NBTk9OSUNBTF9IT1NUIHJlcGxhY2VzIHByb3ByaWV0YXJ5IGFwcHJvYWNoIGZvciBkZXRlY3RpbmcgYnVpbGQgaG9zdC4KICAgICAgICAgICAgLSBBdXRvY29uZiBzdXBwb3J0IGZpbGVzIG1vdmVkIHRvIFRvb2xzL2NvbmZpZy4KCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIHJ1biBvbiBNYWNPUywgc3VibWl0dGVkIGJ5IEJlcm5hcmQgRGVzZ3JhdXBlcy4KICAgICAgICAgICAgTWFpbmx5IGVuc3VyaW5nIGdlbmVyYXRlZCBmaWxlcyBhcmUgb3V0cHV0IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgZm9yCiAgICAgICAgICAgIHNvbWUgbW9kdWxlcy4KCjEyLzExLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWYXJpb3VzIGJ1aWxkIG1vZGlmaWNhdGlvbnMgYW5kIGJ1ZyBmaXhlczoKICAgICAgICAgICAgLSBTaW1wbGlmaWNhdGlvbiBvZiB2ZXJzaW9uIHN0cmluZy4gVXNlIGF1dG9jb25mJ3MgUEFDS0FHRV9WRVJTSU9OIGluc3RlYWQuCiAgICAgICAgICAgIC0gQnVpbGQgdGltZSByZW1vdmVkIGZyb20gU1dJRyB2ZXJzaW9uLgogICAgICAgICAgICAtIFVzaW5nIHN0YW5kYXJkIGF1dG9jb25mIGNvbmZpZyBoZWFkZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgLSBVcGRhdGVkIG9sZCBhdXRvY29uZiBtYWNyb3MgYXMgcmVwb3J0ZWQgYnkgYXV0b3VwZGF0ZS4KICAgICAgICAgICAgLSBSZW1vdmVkICRwcmVmaXggaW4gYXV0b2NvbmYgZnJvbSBzZWFyY2ggcGF0aHMgYXMgYXV0b2NvbmYgd29uJ3QgZXhwYW5kIHRoZW0uCiAgICAgICAgICAgIC0gU3VidGxlIGJ1ZyBmaXggd2hlcmUgJ21ha2UgcHJlZml4PS9zb21ld2hlcmU7IG1ha2UgY2xlYW47IG1ha2UgcHJlZml4PS9zb213aGVyZS9lbHNlJwogICAgICAgICAgICAgIHByb2R1Y2VkIGFuIGV4ZWN1dGFibGUgdXNpbmcgdGhlIGluY29ycmVjdCBsaWJyYXJ5IGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtIEFkZGVkIC1sZGZsYWdzIGNvbW1hbmRsaW5lIG9wdGlvbiBmb3IgTXpTY2hlbWUsIE9jYW1sLCBQaWtlIGFuZCBQSFAuCiAgICAgICAgICAgIC0gRml4ZWQgcmVwb3J0aW5nIG9mIGNvbXBpbGVyIHVzZWQgd2hlbiB1c2luZyAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCiAgICAgICAgICAgIC0gU1dJRyB3ZWIgYWRkcmVzcyBhZGRlZCB0byAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCgoxMi8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGZpeCB0byBUY2wgZHluYW1pYyBjYXN0IHR5cGVtYXBzLiBSZXBvcnRlZCBieQogICAgICAgICAgICBLcmlzdG9waGVyIEJsb20uCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0ZW1wbGF0ZSBhcmd1bWVudCByZXBsYWNlIGJ1Zy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIENocmlzIEZsYXRsZXkuCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJldmVydGVkIENIQU5HRVMgMDkvMDMvMjAwMiwgcHJlcHJvY2Vzc29yIGFyZ3VtZW50IGV2YWx1YXRpb24uICBBcmd1bWVudHMKICAgICAgICAgICAgYXJlIG5vdCBldmFsdWF0ZWQgZHVyaW5nIGNvbGxlY3Rpb24sIEsmUiwgcC4gMjMwLgoKMTIvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0OTAyMiBdIENvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggS0FJL0tDQwoKMTIvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHICdyZWwtMS0zJyBDVlMgYnJhbmNoIG1lcmdlZCBiYWNrIGludG8gdGhlIG1haW4gYnJhbmNoLgoKClZlcnNpb24gMS4zLjE3IChOb3ZlbWJlciAyMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxMzkyMiBdIHByZXByb2Nlc3NvciBlcnJvcnMgd2l0aCBIQVZFX0xPTkdfTE9ORy4KICAgICAgICAgICAgCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTU0ODAgXSBtenNjaGVtZSBTV0lHX011c3RHZXRQdHJfLgoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTExOSBdIFNXSUdfY3JvYWsgY2F1c2VzIGNvbXBpbGVyIHdhcm5pbmcuCgoxMS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHR5cGVtYXBzIGZvciBwb2ludGVycyB0byBjbGFzcyBtZW1iZXJzLgoKMTEvMTUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBPdmVybG9hZGVkIEMrKyBmdW5jdGlvbnMgd2hpY2ggY2Fubm90IGJlIG92ZXJsb2FkZWQgaW4gSmF2YSAKICAgICAgICAgICAgb25jZSBhZ2FpbiBpc3N1ZSBhIHdhcm5pbmcuCgoxMS8xNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEhhbmRsaW5nIG9mIE5VTEwgcG9pbnRlcnMgaXMgaW1wcm92ZWQuIEEgamF2YSBudWxsIG9iamVjdCB3aWxsIG5vdwogICAgICAgICAgICBiZSB0cmFuc2xhdGVkIHRvIGFuZCBmcm9tIGEgTlVMTCBDL0MrKyBwb2ludGVyIGJ5IGRlZmF1bHQuIFByZXZpb3VzbHkgd2hlbiAKICAgICAgICAgICAgd3JhcHBpbmc6CgogICAgICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNzIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzICpzKTsKCiAgICAgICAgICAgIGFuZCBpdCB3YXMgY2FsbGVkIGZyb20gSmF2YSB3aXRoIG51bGw6CgogICAgICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28obnVsbCkKCiAgICAgICAgICAgIGEgSmF2YSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiBFeHRyYSB0eXBlbWFwcyBoYWQgdG8gYmUgd3JpdHRlbiBpbgogICAgICAgICAgICBvcmRlciB0byBvYnRhaW4gYSBOVUxMIHBvaW50ZXIgdG8gcGFzcyB0byBmdW5jdGlvbnMgbGlrZSB0aGlzIG9uZS4gTm93IHRoZSAKICAgICAgICAgICAgZGVmYXVsdCB3cmFwcGluZyB3aWxsIGRldGVjdCAnbnVsbCcgYW5kIHRyYW5zbGF0ZSBpdCBpbnRvIGEgTlVMTCBwb2ludGVyLgogICAgICAgICAgICBBbHNvIGlmIGEgZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgcG9pbnRlciwgZWc6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgU29tZUNsYXNzICpiYXIoKSB7IHJldHVybiBOVUxMOyB9CiAgICAgICAgICAgIAogICAgICAgICAgICBUaGVuIHRoaXMgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggYSBTb21lQ2xhc3MgcHJveHkgY2xhc3MgaG9sZGluZyBhIE5VTEwKICAgICAgICAgICAgcG9pbnRlci4gTm93IG51bGwgaXMgcmV0dXJuZWQgaW5zdGVhZC4gVGhlc2UgY2hhbmdlcyBhcmUgc3VidGxlIGJ1dCB1c2VmdWwuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSBvcmlnaW5hbCB0eXBlbWFwczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkJmphdmFjbGFzc25hbWUoJGpuaWNhbGwsIHRydWUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCjExLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IG1ldGhvZHMgYW5kIHNpZ25hdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgICBtZXRoKGludCBtZXRoX3BhcmFtKSA9IDA7IAogICAgICAgICAgICB9OyAKIAogCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2JhciA6IHB1YmxpYyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIGludCBtZXRoKGludCBtZXRoX3BhcmFtXzEsIGludCBtZXRoX3BhcmFtXzIpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYWJzdHJhY3RfYmFyIGlzIHN0aWxsIGFic3RyYWN0LgoKICAgICAgICAgICAgRml4ZXMgWyA2Mjg0MzggXSBEZXJpdmVkIGFic3RyYWN0IGNsYXNzIG5vdCBhYnN0cmFjdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYW5kIHBhdGNoZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIG1hdGNoaW5nIHByb2JsZW0gd2l0aCB0eXBlbWFwcyBhbmQgYXJyYXkgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICAgaGFkIHRoaXM6CgogICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgYmxhaFsyMF07CgogICAgICAgICAgICBhbmQgYSB0eXBlbWFwOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAgIC4uLiAkMV9kaW0wIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuICQxX2RpbSogdmFyaWFibGVzIHdlcmVuJ3QgYmUgZXhwYW5kZWQgcHJvcGVybHkuICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFua2FqIEt1bWFyIEdvZWwuCiAgICAgICAgICAgICAgIAoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgQWRkZWQgYW4gZXhwZXJpbWVudGFsIG5ldyBtb2R1bGUgdGhhdCBkdW1wcyBTV0lHJ3MgcGFyc2UKCSAgICB0cmVlIGFzIChDb21tb24pIExpc3Agcy1leHByZXNzaW9ucy4gIFRoZSBtb2R1bGUgaXMKCSAgICBpbnZva2VkIHdpdGggU1dJRydzIC1zZXhwIGNvbW1hbmQtbGluZSBzd2l0Y2guICBUaGUgb3V0cHV0CgkgICAgY2FuIGJlIHJlYWQgaW50byBDb21tb24gTGlzcC4gIFRoZXJlIGlzIChwcm90b3R5cGUpCgkgICAgZXhhbXBsZSBMaXNwIGNvZGUgdGhhdCBnZW5lcmF0ZXMgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKCSAgICBkZWZpbml0aW9ucyBmb3IgdXNlIHdpdGggS2V2aW4gUm9zZW5iZXJnJ3MgVUZGSS4KCgkgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBSZW1vdmVkIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiAiY3BwX3RlbXBsYXRlX2RlY2wiIGluCgkgICAgcGFyc2VyLnk7IGJpc29uIDEuNzUgY29tcGxhaW5lZC4KCjExLzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBwcmltaXRpdmUgYXJyYXkgaGFuZGxpbmcgaGFzIGNoYW5nZWQgbGlrZSBhcnJheXMgb2YgY2xhc3Nlcy4gCiAgICAgICAgICAgIEMgcHJpbWl0aXZlIGFycmF5cyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgYSBKYXZhIGFycmF5IGJ1dCB3aXRoIGEgcG9pbnRlciAKICAgICAgICAgICAgKHR5cGUgd3JhcHBlciBjbGFzcykuIEFnYWluIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuIAogICAgICAgICAgICBUaGUgb3JpZ2luYWwgdHlwZW1hcHMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYXJyYXlzX2phdmEuaSwgc28gdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIG1lcmVseSBpbmNsdWRpbmcgdGhpcyBmaWxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgoKICAgICAgICAgICAgVGhlIGFycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBubyBsb25nZXIgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZXkgYXJlIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5jbHVkaW5nIHRoaXMgZmlsZSwgdGh1cyB0aGlzIG9mdGVuIHVudXNlZCBjb2RlIGlzIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gc3BlY2lmaWNhbGx5IHJlcXVpcmluZyB0aGlzIHR5cGUgb2YgYXJyYXkgc3VwcG9ydC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjExLzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBuZXN0ZWQgbW9kdWxlIGRlY2xhcmF0aW9ucyAoYXMgd2FzCiAgICAgICAgICAgIHByZXZpb3VzbHkgYWRkZWQgZm9yIHRoZSBQZXJsIG1vZHVsZSkuIFNvIGEgJW1vZHVsZSBkaXJlY3RpdmUKICAgICAgICAgICAgb2YgdGhlIGZvcm06CgogICAgICAgICAgICAgICAgJW1vZHVsZSAiT3V0ZXI6OklubmVyOjpGb28iCgogICAgICAgICAgICB3aWxsIG5lc3QgZXZlcnl0aGluZyBhcyAoaW4gUnVieSBjb2RlKToKCiAgICAgICAgICAgICAgICBtb2R1bGUgT3V0ZXIKICAgICAgICAgICAgICAgICAgbW9kdWxlIElubmVyCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlIEZvbwogICAgICAgICAgICAgICAgICAgICAgIyBzdHVmZiBnb2VzIGhlcmUKICAgICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBlbmQKIAoxMS8wNS8yMDAyOiBta29lcHBlIAoJICAgIFtNelNjaGVtZV0gQWRkIGFuIGFyZ3VtZW50ICgtZGVjbGFyZW1vZHVsZSkgdGhhdCBnZW5lcmF0ZXMKCSAgICBjb2RlIHRvIGNvcnJlY3RseSBkZWNsYXJlIGEgcHJpbWl0aXZlIG1vZHVsZSBleHRlbnNpb24uCgkgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEJydWNlIEJ1dHRlcmZpZWxkLgoKMTEvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBwYXRjaCBzdWJtaXR0ZWQgYnkgTWljaGFlbCBDYWhpbGwgdG8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIKICAgICAgICAgICAgd2FybmluZ3MgZm9yIHRoZSBqZW52IGFuZCBjbHMgcGFyYW1ldGVycy4gVGhpcyBwYXRjaCBhbHNvIGFsc28gYWxsb3dzIG9uZQogICAgICAgICAgICB0byB1c2UgInZvaWQiIGluIHRoZSBqbmkgdHlwZW1hcCBmb3IgYW55IHR5cGUgd2l0aG91dCBjb2RlIGJlaW5nIGdlbmVyYXRlZAogICAgICAgICAgICBhdHRlbXB0aW5nIHRvIHJldHVybiBhIHZhbHVlLgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBcnJheSBoYW5kbGluZyBpcyBkaWZmZXJlbnQuIEFycmF5cyBvZiBjbGFzc2VzIGFyZSBubyBsb25nZXIgd3JhcHBlZAogICAgICAgICAgICB3aXRoIHByb3h5IGFycmF5cywgZWcgd3JhcHBpbmcKCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwogICAgICAgICAgICAKICAgICAgICAgICAgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggdGhlc2UgSmF2YSBnZXR0ZXJzIGFuZCBzZXR0ZXJzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWFtdIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYW10gZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgdmVyeSBpbmVmZmljaWVudCBhcyB0aGUgZW50aXJlIGFycmF5IGlzIGNvcGllZCBudW1lcm91cwogICAgICAgICAgICB0aW1lcyBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhlIGdldHRlciBvciBzZXR0ZXIuIFRoZXNlIGFycmF5cyBhcmUgbm93CiAgICAgICAgICAgIHdyYXBwZWQgd2l0aCBhIHBvaW50ZXIgc28gaXQgaXMgb25seSBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgCiAgICAgICAgICAgIHVzaW5nIGEgcHJveHkgY2xhc3M6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBBcnJheXMgb2YgZW51bXMgaGF2ZSBhbHNvIGJlZW4gc2ltaWxhcmx5IGNoYW5nZWQuIFRoaXMgYmVoYXZpb3VyIGlzIG5vdyBsaWtlIHRoZSAKICAgICAgICAgICAgb3RoZXIgU1dJRyBsYW5ndWFnZSdzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgYXJyYXkgbGlicmFyeSBzaG91bGQgYmUgdXNlZCB0byAKICAgICAgICAgICAgYWNjZXNzIHRoZSBvdGhlciBlbGVtZW50cy4gVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgdGhlIAogICAgICAgICAgICBtYWNyb3MgYW5kIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmksIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgSkFWQV9BUlJBWVNPRkNMQVNTRVMoWCkKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFR3byBuZXcgdHlwZW1hcHMgamF2YWluIGFuZCBqYXZhb3V0IGZvciBnZW5lcmF0aW5nIHRoZSBwcm94eSBjbGFzcyAKICAgICAgICAgICAgYW5kIHR5cGUgd3JhcHBlciBjbGFzcyBtZXRob2QgY2FsbHMgdG8gdGhlIEpOSSBjbGFzcy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgCiAgICAgICAgICAgIHJlYWxseSB1c2VkIGZvciB0cmFuc2Zvcm1pbmcgdGhlIGpzdHlwZSAodXNlZCBpbiBwcm94eSBjbGFzcyBhbmQgdHlwZSB3cmFwcGVyCiAgICAgICAgICAgIGNsYXNzZXMpIHRvIHRoZSBqdHlwZSAodXNlZCBpbiB0aGUgSk5JIGNsYXNzKSBhbmQgdmlzYSB2ZXJzYS4gQSBqYXZhaW4gdHlwZW1hcAogICAgICAgICAgICBpcyByZXF1aXJlZCB3aGVuZXZlciBhbiBpbiB0eXBlbWFwIGlzIHdyaXR0ZW4gYW5kIHNpbWlsYXJseSBqYXZhb3V0IGZvciBhbiBvdXQKICAgICAgICAgICAgdHlwZW1hcC4gQW4gZXhhbXBsZSBpcyBwcm9iYWJseSBiZXN0IHRvIHNob3cgdGhlbSB3b3JraW5nOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgQ2xhc3MgIkNsYXNzLmdldENQdHIoJGphdmFpbnB1dCkiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIHVuc2lnbmVkIHNob3J0ICIkamF2YWlucHV0IgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgQ2xhc3MgKiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcygkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzcyB7fTsKICAgICAgICAgICAgICAgICAgICBDbGFzcyAqIGJhcihDbGFzcyBjbHMsIHVuc2lnbmVkIHNob3J0IHVzaCkgeyByZXR1cm4gbmV3IENsYXNzKCk7IH07CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBwcm94eSBjb2RlIGlzIHRoZW46CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzcyBiYXIoQ2xhc3MgY2xzLCBpbnQgdXNoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoZXhhbXBsZUpOSS5iYXIoQ2xhc3MuZ2V0Q1B0cihjbHMpLCB1c2gpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgU29tZSBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gdXNlIHRoZXNlIHR5cGVtYXBzLgogICAgICAgICAgICBIZXJlICRqYXZhaW5wdXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2NscycgYW5kICd1c2gnLiAkam5pY2FsbCBoYXMgYmVlbiByZXBsYWNlZCBieSAKICAgICAgICAgICAgdGhlIG5hdGl2ZSBtZXRob2QgY2FsbCwgJ2V4YW1wbGVKTkkuYmFyKC4uLiknIGFuZCAkb3duZXIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2ZhbHNlJy4KICAgICAgICAgICAgJGphdmFpbnB1dCBpcyBhbmFsb2dvdXMgdG8gdGhlICRpbnB1dCBzcGVjaWFsIHZhcmlhYmxlLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICAgICAgICRqbmljYWxsIGlzIGFuYWxvZ291cyB0byAkYWN0aW9uIGluICVleGNlcHRpb24uIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjYWxsIHRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgICRvd25lciBpcyByZXBsYWNlZCBieSBlaXRoZXIgdHJ1ZSBpZiAlbmV3b2JqZWN0IGhhcyBiZWVuIHVzZWQgb3RoZXJ3aXNlIGZhbHNlLgoKICAgICAgICAgICAgVGhlIGphdmEuc3dnIGZpbGUgY29udGFpbnMgZGVmYXVsdCBqYXZhaW4gYW5kIGphdm91dCB0eXBlbWFwcyB3aGljaCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgY29kZQogICAgICAgICAgICBhcyBwcmV2aW91c2x5LiBUaGlzIGNoYW5nZSBpcyBvbmx5IG9mIGNvbmNlcm4gdG8gdGhvc2Ugd2hvIGhhdmUgd3JpdHRlbiB0aGVpciBvd24gdHlwZW1hcHMgYXMKICAgICAgICAgICAgeW91IHdpbGwgdGhlbiBtb3N0IGxpa2VseSBoYXZlIHRvIHdyaXRlIHlvdXIgb3duIGphdmFpbiBhbmQgamF2YW91dCB0eXBlbWFwcy4KCiAgICAgICAgICAgIFRoZSBqYXZhb3V0IHR5cGVtYXAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgYSBKYXZhIGRvd25jYXN0IHRvIGJlIHVzZWQgb24gYWJzdHJhY3QgCiAgICAgICAgICAgIHByb3h5IGJhc2UgY2xhc3Nlcy4gU2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gb24gZHluYW1pY19jYXN0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjQvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBVcGdhZGVkIHRvIGxpYnRvb2wgMS40LjMsIHByZXN1bWFibHkgdy8gYmV0dGVyCgkgICAgc3VwcG9ydCBmb3IgbmV3aXNoIHBsYXRmb3JtcyAobGlrZSBNYWNPUyBYKS4KCjEwLzIxLzIwMDI6IHR0bgoJICAgIEZpeGVkIFJ1bnRpbWUvTWFrZWZpbGUuaW4gYnVnIC0tIHRoYW5rcyB0byBSaWNoYXJkIENhbG1iYWNoLgoKMTAvMTgvMjAwMjogdHRuCgkgICAgRml4ZWQgdHlwbyBpbiBkb2guaCAtLSB0aGFua3MgdG8gTWF4IEhvcm4uCgpWZXJzaW9uIDEuMy4xNiAoT2N0b2JlciAxNCwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCAlZmVhdHVyZSByZXBvcnRlZAogICAgICAgICAgICBieSBXaWxsaWFtIEZ1bHRvbi4KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgT3BlblZNUyBidWlsZCBkaXJlY3RvcnkgKHZtcykuICBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgSmVhbi1GcmFu529pcyBQaWVyb25uZS4KCjEwLzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIGNsYXVzZSB0byB0aGUgbmF0aXZlIGZ1bmN0aW9ucyBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICBUaGUgdGhyb3dzIGNsYXVzZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGdlbmVyYXRlZCBmb3IgcHJveHkgZnVuY3Rpb25zCiAgICAgICAgICAgIGFuZCBtb2R1bGUgY2xhc3MgZnVuY3Rpb25zLgoKMDkvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlIGFuZCBjbGFzc2VzIHRoYXQKICAgICAgICAgICAgd2VyZSBkZWZpbmVkIGJ1dCBub3Qgd3JhcHBlZC4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTGVzbGllIEJyb29rcywKICAgICAgICAgICAgR2VycnkgV29vZHMsIGFuZCBvdGhlcnMuCgowOS8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbWUgZXJyb3IgY2hlY2tpbmcgYWRkZWQ6CiAgICAgICAgICAgIDEpIE91dE9mTWVtb3J5RXhjZXB0aW9uIGNoZWNrIGluIHRoZSBjaGFyICogdHlwZW1hcHMuIAogICAgICAgICAgICAyKSBBcyBTV0lHIHRyZWF0cyBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcGFzc2luZyBieSB2YWx1ZSBhbGwgdGhlCiAgICAgICAgICAgIHNhbWUsIGl0IGlzIHBvc3NpYmxlIHRvIHBhc3MgYSBOVUxMIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMKICAgICAgICAgICAgYW4gb2JqZWN0IHBhc3NlZCBieSB2YWx1ZSBvciBieSByZWZlcmVuY2UuIEEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgCiAgICAgICAgICAgIG5vdyB0aHJvd24gdW5kZXIgdGhpcyBzY2VuYXJpby4KCjA5LzIwLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2xlYW4iIGFuZCAibWFrZSBpbnN0YWxsIgoJCQkgIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBFeHBsYWluIGhvdyB0byBleHRlbmQgIm1ha2UgaW5zdGFsbCIgdy8gZXh0cmEtaW5zdGFsbC5saXN0LgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGlvbiBvZiB0aGUgImlnbm9yZSIgdHlwZW1hcC4gICBUaGUgImlnbm9yZSIgdHlwZW1hcCBoYXMKICAgICAgICAgICAgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlICJpbiIgdHlwZW1hcC4KICAgICAgICAgICAgVG8gaWdub3JlIGFuIGFyZ3VtZW50LCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcyBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluLG51bWlucHV0cz0wKSBpbnQgKm91dHB1dCAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uCiAgICAgICAgICAgIG9mIHRoZSAiaW4iIGFuZCAiaWdub3JlIiB0eXBlbWFwcyAod2hpY2ggd2VyZSBzdXBwb3NlZCB0byBiZQogICAgICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUpLgoKICAgICAgICAgICAgVGhlIHVzZSBvZiB0aGUgbnVtaW5wdXRzIGFyZ3VtZW50IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICBDdXJyZW50bHksIHZhbHVlcyA+MSB3aWxsIGdlbmVyYXRlIGFuIGVycm9yLiAgSG93ZXZlciwgZnV0dXJlCiAgICAgICAgICAgIHJlbGVhc2VzIG9mIFNXSUcgbWF5IHV0aWxpemUgdGhhdCB0byBzdXBwb3J0IG11bHRpLWlucHV0IHR5cGVtYXBzLgoKICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBzdGlsbCB3b3JrcywgYnV0IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgaXMKICAgICAgICAgICAgdHJhbnNsYXRlZCB0byAldHlwZW1hcChpbixudW1pbnB1dHM9MCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgZm9yIHVubmFtZWQgc3RydWN0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICB9ICpibGFoOwoKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvZ2VyIEdpYnNvbi4KICAgICAgICAgICAgTm90ZTogd2UgbWlnaHQgYmUgYWJsZSB0byBnZW5lcmF0ZSB3cmFwcGVycyBpbiBzcGVjaWFsIGNhc2VzLgoKMDkvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBtb2RpZmljYXRpb24gdG8gZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb25zLiAgUG9pbnRlciBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICBhbHdheXMgc2V0IHRvIGFuIGluaXRpYWwgdmFsdWUgb2YgMC4gICBTaW1wbGlmaWVzIHR5cGVtYXAgd3JpdGluZyBhbmQgY2xlYW51cAogICAgICAgICAgICBjb2RlIChzaW5jZSB5b3UgY2FuIHJlbHkgb24gemVyby12YWx1ZSBpbml0aWFsaXphdGlvbikuICAgVGhpcyBhbHNvIGdyZWF0bHkKICAgICAgICAgICAgcmVkdWNlcyB0aGUgbmVlZCB0byBldmVyIHdyaXRlIGFuICJhcmdpbml0IiB0eXBlbWFwLgoKMDkvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBzbWFydC1wb2ludGVyIHN1cHBvcnQuICBJZiBvcGVyYXRvci0+KCkKICAgICAgICAgICAgaXMgcGFydCBvZiBhbiBpZ25vcmVkIGJhc2UgY2xhc3MgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAlaWdub3JlIEJhcjsKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgICAgICAgICAvKiBJZ25vcmVkICovCiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIHRoZW4gbWV0aG9kcyBmcm9tIEZvbyBhcmUgc3RpbGwgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpCiAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgIFRoZSBvbmx5IGNhdGNoIGlzIHRoYXQgdGhlIG9wZXJhdG9yLT4oKSBpdHNlbGYgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgKHNpbmNlIGl0IHdhc24ndCB3cmFwcGVkKS4gICBUaGVyZWZvcmUsIHRoZXJlIHdvbid0IGJlIGFueQogICAgICAgICAgICAgX19kZXJlZl9fKCkgb3BlcmF0aW9uIHVubGVzcyBpdCBpcyBleHBsaWNpdGx5IGFkZGVkIHRvIFNwYW0KICAgICAgICAgICAgIChlaXRoZXIgdXNpbmcgJWV4dGVuZCBvciBqdXN0IHBsYWNpbmcgb3BlcmF0b3ItPigpIGluIHRoZQogICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiBTcGFtKS4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2hlY2siIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBEb2N1ZW1lbnRlZCBtZXRob2RvbG9neSBpbiBNYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbRG9jc10gUHJlZml4ZWQgTWFudWFsLyouaHRtbCB3aXRoICI8IURPQ1RZUEUgaHRtbCAuLi4+IiB0bwoJICAgIHBhbmRlciBkb3RpbmdseSB0byAob3Zlci0pc2Vuc2l0aXZlIGVkaXRvcnMuCgowOS8xMC8yMDAyOiB0dG4KCSAgICBbR3VpbGVdIENvbnZlcnRlZCBFeGFtcGxlcy9ndWlsZS9zaW1wbGUgIm1ha2UgY2hlY2siCgkgICAgYmVoYXZpb3IgdG8gYWN0dWFsbHkgY2hlY2sgZXhlY3V0aW9uIHJlc3VsdHMuICBSZWR1Y2VkCgkgICAgaXRlcmF0aW9uIGNvdW50cyBzbyB0aGF0IHRoZSB0ZXN0IGRvZXNuJ3QgdGFrZSB0b28gbG9uZy4KCjA5LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRy0xLjMuMTUgcmVsZWFzZWQuCgoKVmVyc2lvbiAxLjMuMTUgKFNlcHRlbWJlciA5LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG5hc3R5IHJ1bnRpbWUgdHlwZSBjaGVja2luZyBidWcgd2l0aCBzdWJ0eXBlcyBhbmQgaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4gCgowOS8wOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgZXhjZXB0aW9uIGNsYXNzZXMgZm9yIGEgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IAogICAgICAgICAgICBzcGVjaWZ5aW5nIHRoZW0gaW4gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbiB0aGUgdGhyb3dzIGF0dHJpYnV0ZSBpbiBhbnkgb25lCiAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6IGluLCBvdXQsIGNoZWNrLCBmcmVlYXJnLCBhcmdvdXQgYW5kIHRocm93cy4gQSBjbGFzc2ljCiAgICAgICAgICAgIGV4YW1wbGUgd291bGQgYmUgdG8gY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvIGEgc3RhbmRhcmQgSmF2YSBleGNlcHRpb246CgogICAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzLCB0aHJvd3M9ImphdmEuaW8uSU9FeGNlcHRpb24iKSBmaWxlX2V4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgamNsYXNzIGV4Y2VwID0gamVudi0+RmluZENsYXNzKCJqYXZhL2lvL0lPRXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwKQogICAgICAgICAgICAgICAgICAgICAgICBqZW52LT5UaHJvd05ldyhleGNlcCwgJDEud2hhdCgpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG51bGw7IC8vIG9yIHVzZSBTV0lHX2ZhaWwKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGFzcyBmaWxlX2V4Y2VwdGlvbiB7Li4ufTsKICAgICAgICAgICAgICAgIHZvaWQgb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkgdGhyb3coZmlsZV9leGNlcHRpb24pOwoKICAgICAgICAgICAgVGhlIEphdmEgbWV0aG9kIHdpbGwgdGhlbiBiZSBkZWNsYXJlZCB3aXRoIGEgdGhyb3dzIGNsYXVzZToKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbihTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsuLi59CgowOS8wOC8yMDAyOiBta29lcHBlCgkgICogW0d1aWxlXSBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgYXJnbGlzdCBubwoJICAgIGxvbmdlciBnZXRzIGNsdXR0ZXJlZCB3aXRoIHR5cGUgc3BlY2lmaWNhdGlvbiwgbWFraW5nIGl0CgkgICAgbW9yZSByZWFkYWJsZS4gIChBbHNvIHRoZSBJTElTUCBmdW5jdGlvbiBDLXUgTS14CgkgICAgYGFyZ2xpc3QtbGlzcCcgUkVUIHdvcmtzIGJldHRlciB0aGlzIHdheS4pICBUaGUgdHlwZXMgb2YKCSAgICBhcmd1bWVudHMgYXJlIGV4cGxhaW5lZCBpbiBhbiBleHRyYSBzZW50ZW5jZSBhZnRlciB0aGUKCSAgICBhcmdsaXN0LiAKCSAgICAKCSAgICBUaGVyZSBhcmUgbm93IHR3byBkb2N1bWVudGF0aW9uLXJlbGF0ZWQgdHlwZW1hcCBhcmd1bWVudHM6CgoJICAgICAgICAldHlwZW1hcChpbiwgZG9jPSIkTkFNRSBpcyBhIHZlY3RvciBvZiBpbnRlZ2VycyIsIAoJCQkgYXJnbGlzdD0iJG5hbWUiKSAgaW50ICpWRUNUT1IgeyAuLi4gfQoJCQkgCiAgICAgICAgICAgIFRoZSAiYXJnbGlzdCIgdGV4dHMgb2YgYWxsIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIG1ha2UgdXAKCSAgICBpdHMgYXJnbGlzdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gIFRoZSAiZG9jIiB0ZXh0cyBvZiBhbGwKCSAgICBhcmd1bWVudHMgYXJlIGNvbGxlY3RlZCB0byBtYWtlIGEgc2VudGVuY2UgdGhhdCBkZXNjcmliZXMKCSAgICB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4gIFJlYXNvbmFibGUgZGVmYXVsdHMgYXJlCgkgICAgcHJvdmlkZWQuIAoKCSAgICBBcyB1c3VhbCwgJG5hbWUgaXMgc3Vic3RpdHV0ZWQgYnkgdGhlIG5hbWUgb2YgdGhlCgkgICAgYXJndW1lbnQuIFRoZSBuZXcgdHlwZW1hcCB2YXJpYWJsZSAkTkFNRSBpcyBsaWtlICRuYW1lLAoJICAgIGJ1dCBtYXJrZWQtdXAgYXMgYSB2YXJpYWJsZS4gIFRoaXMgbWVhbnMgdGhhdCBpdCBpcwoJICAgIHVwcGVyLWNhc2VkOyBpbiBUZVhpbmZvIG1vZGUgKCItcHJvY2RvY2Zvcm1hdCB0ZXhpbmZvIikgaXQKCSAgICBjb21lcyBvdXQgYXMgQHZhcntuYW1lfS4gCgkgICAgCgkgICAgVGhlIGRpcmVjdGl2ZXMgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICAlbXVsdGlwbGVfdmFsdWVzIG5vdyBhbHNvIGhhdmUgYW4gZWZmZWN0IG9uIHRoZQoJICAgIGRvY3VtZW50YXRpb24uIChUaGlzIGlzIGFjaGlldmVkIHZpYSB0aGUgbmV3IHByYWdtYXMKCSAgICByZXR1cm5fbm90aGluZ19kb2MsIHJldHVybl9vbmVfZG9jLCByZXR1cm5fbXVsdGlfZG9jLikKCgkgICAgRG9jdW1lbnRhdGlvbiBoYXMgYWxzbyBpbXByb3ZlZCBmb3IgdmFyaWFibGVzIHRoYXQgYXJlCgkgICAgd3JhcHBlZCBhcyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVycyAoY29tbWFuZC1saW5lIHN3aXRjaAoJICAgICItZW1pdC1zZXR0ZXJzIikuCgogICAgICAgICAgKiBbR3VpbGVdIEVtaXQgY29uc3RhbnRzIGFzIF9pbW11dGFibGVfIHZhcmlhYmxlcy4gIChUaGlzCiAgICAgICAgICAgIHdhcyBicm9rZW4gcmVjZW50bHkuKQoKMDkvMDcvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gVXBkYXRlZCB0aGUgdHlwZW1hcHMgaW4gbGlzdC12ZWN0b3IuaS4KCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBTaG9ydC1jaXJjdWl0IHRoZSB0eXBlY2hlY2tzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucy4KCSAgICAoVGhlIGNoYW5nZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFyZSB2aXNpYmxlIGluIHRoZSBuZXcKCSAgICB0ZXN0Y2FzZSAib3ZlcmxvYWRfY29tcGxpY2F0ZWQiLikKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU29sdXRpb24gZm9yIFsgNTk2NDEzIF0KICAgICAgICAgICAgTmV3IHR5cGVtYXAgc28gdGhhdCB0aGUgSmF2YSBwcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcwogICAgICAgICAgICB3cmFwcGVyIGNvbnN0cnVjdG9yIG1vZGlmaWVyIGNhbiBiZSB0YWlsb3JlZCBieSB1c2Vycy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgCiAgICAgICAgICAgIHByb3RlY3RlZC4gTm9ybWFsbHkgU1dJRyBnZW5lcmF0ZXMgYSBjb25zdHJ1Y3RvciBsaWtlIHRoaXMgd2hpY2ggY2FuIG9ubHkgCiAgICAgICAgICAgIGJlIGFjY2Vzc2VkIHdpdGhpbiBvbmUgcGFja2FnZToKCiAgICAgICAgICAgICAgcHJvdGVjdGVkIEJhcihsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIElmIHlvdSBhcmUgdXNpbmcgU1dJRyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMgb3Igd2FudCB0byB1c2UgdGhpcyBjb25zdHJ1Y3RvcgogICAgICAgICAgICBhbnl3YXksIGl0IGNhbiBub3cgYmUgYWNjZXNzZWQgb3V0c2lkZSB0aGUgcGFja2FnZS4gVG8gbW9kaWZ5IHVzZSBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSAicHVibGljIgoKICAgICAgICAgICAgdG8gY2hhbmdlIHRvIHB1YmxpYyBmb3IgYWxsIHByb3h5IGNsYXNzZXMgYW5kIHNpbWlsYXJseSBmb3IgYWxsIHR5cGUgd3JhcHBlciBjbGFzc2VzOgogICAgICAgICAgICAKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAicHVibGljIgoKMDkvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0aHJvd3MgdHlwZW1hcHMgZm9yIHRoZSBKYXZhIG1vZHVsZS4gQysrIGV4Y2VwdGlvbnMgZ2V0IGNvbnZlcnRlZCBpbnRvCiAgICAgICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIEphdmEgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIAogICAgICAgICAgICBXYXJuaW5nOiBUaGlzIG1heSBjaGFuZ2UgZnJvbSBqYXZhLmxhbmcuUnVudGltZSBleGNlcHRpb24gaW4gdGhlIGZ1dHVyZS4KCjA5LzA1LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB2YXJpYWJsZXMgZGVjbGFyZWQgYXMgcmVmZXJlbmNlcy4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4gUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDkvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1vcmUgdXBkYXRlcyB0byB0aGUgUnVieSBtb2R1bGUgZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nCgkgICAgYSBuZXcgdHlwZW1hcCBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBjb2xsZWN0IGtleS12YWx1ZQoJICAgIHBhaXJzIGZyb20gYW4gYXJndW1lbnQgbGlzdCBpbnRvIGEgSGFzaC4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uIGFuZCBjb25zdHJ1Y3RvcnMuCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBGb288VD4oKSB7IH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZXh0cmEgPFQ+IGluIHRoZSBjb25zdHJ1Y3RvciB3YXMgY2FycmllZCB0aHJvdWdoIGluIHRoZQogICAgICAgICAgICBuYW1lLS1jYXVzaW5nIHJ1bnRpbWUgcHJvYmxlbXMgaW4gZ2VuZXJhdGVkIG1vZHVsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvcmRpIEFybmFiYXQgQmVuZWRpY3RvLgogCjA5LzA1LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFN1cHBvcnQgb3ZlcmxvYWRpbmcuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVXBkYXRlZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZXMKCSAgICB0byB1c2UgUnVieSAxLjcgc3VwcG9ydCBmb3IgdGhlc2UgdHlwZXMgd2hlbiBhdmFpbGFibGUuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgb3V0cHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2UgdG8gcHJpbWl0aXZlCgkgICAgdHlwZXMuCgowOS8wNC8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggcGFzcy1ieS12YWx1ZSB0eXBlbWFwcy4gIFJlcG9ydGVkIGJ5IEFybm8KCSAgICBQZXRlcnMgdmlhIERlYmlhbiBidWd0cmFja2luZyAoIzE1NjkwMiksIHBhdGNoIGJ5IFRvcnN0ZW4KCSAgICBMYW5kc2Nob2ZmIDx0b3JzdGVuQGRlYmlhbi5vcmc+LgoKMDkvMDMvMjAwMjogc2FtamFtIChTYW0gTGlkZGljb3R0KQoJICAgIEJldHRlciByZWZlcmVuY2Ugc3VwcG9ydC4KCSAgICBGdW5jdGlvbnMgdGhhdCB3YW50IGEgdm9pZCoqIGNhbiB0YWtlIGEgTlVMTCBieSByZWZlcmVuY2UgYW5kCgkgICAgdGhlIHZvaWQqIHdpbGwgYmUgbWFkZSBmb3IgeW91IGFuZCB0aGVuIHBhc3NlZC1ieS1yZWZlcmVuY2UKCgkgICAgQWxzbyBhbGwgaW50ZWdlci1jbGFzcyBuYXRpdmUgdHlwZXMgY2FuIGJlIHBhc3NlZCBieSByZWZlcmVuY2UKCSAgICB3aGVyZSBhbiBpbnQqIG9yIGludCYgZXRjIGlzIG5lZWRlZAoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VkIHRoZSBldmFsdWF0aW9uIG9yZGVyIG9mIHByZXByb2Nlc3NvciBtYWNybyBhcmd1bWVudHMuCiAgICAgICAgICAgIEFyZ3VtZW50cyBhcmUgbm93IGV4cGFuZGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IgKmJlZm9yZSogdGhleQogICAgICAgICAgICBhcmUgcGFzc2VkIHRvIG1hY3JvIGV4cGFuc2lvbi4gIFRoaXMgZml4ZXMgYSBzdWJ0bGUgZXhwYW5zaW9uCiAgICAgICAgICAgIGJ1ZyByZXBvcnRlZCBieSBBbnRob255IEhlYWRpbmcuCgowOS8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRoZSBmaWxlIGluY2x1ZGUgb3JkZXIgKGFnYWluLCBhcHBhcmVudGx5KS4gU2VlIDIvMjcvOTkuCgowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBCZXR0ZXIgZXhjZXB0aW9uIGhhbmRsaW5nIHN1cHBvcnQuICBTaW5jZSBQZXJsIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHJlbGllcyBvbiBzZXRqbXAvbG9uZ2ptcCwgd3JhcHBlciBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHNsaWdodGx5CiAgICAgICAgICAgIHRvIHByb3ZpZGUgYW4gZXh0cmEgYmxvY2sgc2NvcGU6CgogICAgICAgICAgICAgICAgWFMoZm9vKSB7CiAgICAgICAgICAgICAgICAgICBjaGFyIF9zd2lnbXNnW1NXSUdfTUFYX0VSUk1TR10gPSAiIjsKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKl9zd2lnZXJyID0gX3N3aWdtc2c7CiAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgd3JhcHBlciBmdW5jdGlvbiBoZXJlICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFNXSUdfY3JvYWsoIkFuIGVycm9yIG9jY3VycmVkXG4iKTsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgWFNSRVRVUk4oYXJndmkpOyAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuICovCiAgICAgICAgICAgICAgICAgICAgICBmYWlsOgogICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGNyb2FrKF9zd2lnX2Vycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgbWFjcm8gU1dJR19jcm9hayh4KSBzZXRzIHRoZSB2YWx1ZSBvZiBfc3dpZ2VyciB0byB4IGFuZAogICAgICAgICAgICBleGVjdXRlcyBhICJnb3RvIGZhaWwiLiAgVGhlIHdob2xlIHdyYXBwZXIgZnVuY3Rpb24gaXMgZW5jbG9zZWQKICAgICAgICAgICAgYmxvY2sgc2NvcGUgdG8gcHJvdmlkZSBwcm9wZXIgY2xlYW51cCBvZiBDKysgb2JqZWN0cy4gIFNpbmNlCiAgICAgICAgICAgIGNyb2FrIGV4ZWN1dGVzIGEgbG9uZ2ptcCgpLCB0aGVyZSBpcyBubyB3YXkgdG8gcHJvcGVybHkgcmVjbGFpbQogICAgICAgICAgICByZXNvdXJjZXMgaWYgdGhpcyBleGVjdXRlcyBpbiB0aGUgc2FtZSBzY29wZSBhcyB0aGUgd3JhcHBlcgogICAgICAgICAgICBmdW5jdGlvbi4KCiAgICAgICAgICAgIFRoZSBfc3dpZ21zZ1tdIHZhcmlhYmxlIGlzIG5vcm1hbGx5IHVudXNlZCwgYnV0IGNhbiBiZSB1c2VkCiAgICAgICAgICAgIHRvIHN0b3JlIHNtYWxsIGVycm9yIG1lc3NhZ2VzIHVzaW5nIHNwcmludGYgb3Igc25wcmludGYuIEl0CiAgICAgICAgICAgIGhhcyBhIGNhcGFjaXR5IG9mIGF0IGxlYXN0IDI1NiBieXRlcyAoU1dJR19NQVhfRVJSTVNHKS4KICAgICAgICAgICAgCjA5LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gQWRkZWQgYmV0dGVyIHN1cHBvcnQgZm9yIGV4Y2VwdGlvbnMuICBJbnN0ZWFkIG9mIHJldHVybmluZyBUQ0xfRVJST1IsCiAgICAgICAgICAgIHVzZSB0aGUgbWFjcm8gU1dJR19mYWlsIHRvIHJldHVybiB3aXRoIGFuIGVycm9yLiAgVGhpcyBlbnN1cmVzIHRoYXQKICAgICAgICAgICAgYXJndW1lbnRzIGFyZSBwcm9wZXJseSBjbGVhbmVkIHVwLiAgRXhjZXB0aW9uIHNwZWNpZmllcnMgYXJlIG5vdwogICAgICAgICAgICBoYW5kbGVkIGJ5IGRlZmF1bHQuCgowOS8wMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVGhlIHR5cGUtY2hlY2tpbmcgc3lzdGVtIGZvciB0aGUgUnVieSBtb2R1bGUgaGFzIGhhZCBhIGZsYXcKCSAgICBpbiB0aGF0IHNvbWUgdHlwZXMgd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudAoJICAgIHdlcmVuJ3QuIFRoaXMgYnVnIHdhcyBiZXN0IGRlbW9uc3RyYXRlZCBieSB0aGUgaW5oZXJpdF9taXNzaW5nLmkKCSAgICB0ZXN0IHN1aXRlIGNhc2UsIHdoaWNoIGRlZmluZXMgYSBiYXNlIGNsYXNzICJGb28iIHRoYXQgaXMKCSAgICBzdWJjbGFzc2VkIGJ5ICJCYXIiLiBUaGUgIkZvbyIgY2xhc3MgaXNuJ3QgYWN0dWFsbHkgd3JhcHBlZCAoaS5lLgoJICAgIGl0J3Mgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSBSdWJ5KSBidXQgd2UnZCBzdGlsbCBsaWtlIHRvIGJlCgkgICAgYWJsZSB0byBwYXNzICJCYXIiIGluc3RhbmNlcyB0byBmdW5jdGlvbnMgZXhwZWN0aW5nIEZvb3MgYW5kIGhhdmUKCSAgICB0aGF0IHdvcms7IGl0IHdhc24ndC4gVGhlIHJldmlzZWQgaW1wbGVtZW50YXRpb24gKHNpbWlsYXIgdG8gdGhhdAoJICAgIHVzZWQgZm9yIHNvbWUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcykgYWRkcyBhIG5ldyBpbnN0YW5jZSB2YXJpYWJsZQoJICAgIChfX3N3aWd0eXBlX18pIHRvIGVhY2ggb2JqZWN0IHRoYXQgaW5kaWNhdGVzIGl0cyBTV0lHIHR5cGU7CgkgICAgdGhhdCBpcywgZWFjaCAiQmFyIiBpbnN0YW5jZSB3aWxsIG5vdyBoYXZlIGEgc3RyaW5nIGluc3RhbmNlCgkgICAgdmFyaWFibGUgY2FsbGVkICJfX3N3aWd0eXBlX18iIHdob3NlIHZhbHVlIGlzICJfcF9CYXIiLgoKICAgICAgICAgICAgVW5sZXNzIGRldmVsb3BlcnMgd2VyZSB0YWtpbmcgYWR2YW50YWdlIG9mIHRoaXMgbG93LWxldmVsCgkgICAgaW1wbGVtZW50YXRpb24gZGV0YWlsLCB0aGV5IHNob3VsZG4ndCBub3RpY2UgYW55IGNvbXBhdGliaWxpdHkKCSAgICBwcm9ibGVtczsgbmV2ZXJ0aGVsZXNzLCBJJ20gbWFya2luZyBpdCBhcyBhICJwb3RlbnRpYWwKCSAgICBpbmNvbXBhdGliaWxpdHkiLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8wMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU0YgQnVnICM2MDMxOTkuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIE9VVFBVVCwgSU5QVVQgYW5kIElOT1VUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIEMrKyAKICAgICAgICAgICAgcmVmZXJlbmNlcy4KCjA4LzI3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeGVkIGVycm9yIGluICJsaWJfc3RkX3ZlY3RvciIgdGVzdGNhc2UgYW5kCgkgICAgY29tcGlsZXIgd2FybmluZyBpbiAibGliX2NkYXRhIiB0ZXN0Y2FzZS4KCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgIiVtaXhpbiIgZGlyZWN0aXZlLCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8KCSAgICBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRvIG1peC1pbiB0byBhCgkgICAgY2xhc3MuIFNvLCBmb3IgZXhhbXBsZSwgaWYgeW91J2QgbGlrZSB0byBzcGVjaWZ5IHRoYXQgUnVieSdzCgkgICAgRW51bWVyYWJsZSBtb2R1bGUgc2hvdWxkIGJlIG1peGVkLWluIHRvIHlvdXIgY2xhc3MgRm9vLCB5b3UnZAoJICAgIHdyaXRlOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJFbnVtZXJhYmxlIjsKCQkKICAgICAgICAgICAgb3IgdG8gc3BlY2lmeSB0aGF0IHRoZSBtb2R1bGVzIEZlZSwgRmllIGFuZCBGbyBzaG91bGQgYmUgbWl4ZWQKCSAgICBpbiB0byBGb286CgkgICAgCgkgICAgICAgICVtaXhpbiBGb28gIkZlZSxGaWUsRm8iOwoJCQoJICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb2RpZmllZCB0aGUgJWFsaWFzIGRpcmVjdGl2ZSBzbyB0aGF0IG11bHRpcGxlIGFsaWFzZXMKCSAgICBjYW4gYmUgc3BlY2lmaWVkIGZvciBhbiBpbnN0YW5jZSBtZXRob2QgYnkgdXNpbmcgYSBjb21tYS1zZXBhcmF0ZWQKCSAgICBsaXN0IG9mIGFsaWFzZXMuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgInRocm93IiB0eXBlbWFwcyBmb3IgdGhlIFJ1YnkgbW9kdWxlLgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBwcmludGluZyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgICdzd2lnIC1NJyBsaXN0cyBhbGwgZmlsZSBkZXBlbmRlbmNpZXMuICAnc3dpZyAtTU0nIGxpc3RzCiAgICAgICAgICAgIGRlcGVuZGVuY2llcywgYnV0IGV4Y2x1ZGVzIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkuIAogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICAgJSBzd2lnIC1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3N3aWcuc3dnIFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3B5dGhvbi9weXRob24uc3dnIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAgICAlIHN3aWcgLU1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTk3NTk5IF0gdW5pb24gaW4gY2xhc3M6IGluY29ycmVjdCBzY29wZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQXJ0IFllcmtlcy4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDAxMzIgXSBEZWZhdWx0IGFyZ3VtZW50IHdpdGggbmFtZXNwYWNlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hpYnVrYXdhIFlvc2hpa2kuCiAKMDgvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBBdXRvbWF0aWMgQysrIGV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkIGZvciBhbGwgbGFuZ3VhZ2UgbW9kdWxlcy4gICAgVGhpcyBpcwogICAgICAgICAgICBwcmV0dHkgc2ltcGxlLiAgSWYgeW91IGhhdmUgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHdyYXBfQmFyX2JsYWgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMS0+YmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEZvbyAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogInRocm93IiB0eXBlbWFwIGNvZGUgaW5zZXJ0ZWQuICQxID0gX2UgKi8KICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBUaGUgInRocm93IiB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIHJhaXNlIGFuIGVycm9yIGluIHRoZSB0YXJnZXQgCiAgICAgICAgICAgIGxhbmd1YWdlLiAgSXQgY2FuIGRvIGFueXRoaW5nLiAgSGVyZSBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKCJ0aHJvdyIpIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJGb28gZXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRvIG1ha2UgdGhpcyB3b3JrIGluIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlLCBzaW1wbHkgZGVmaW5lIGEgZmV3IGRlZmF1bHQKICAgICAgICAgICAgInRocm93IiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUsIFNXSUdUWVBFICosIGludCwgY29uc3QgY2hhciAqLCBhbmQgYQogICAgICAgICAgICBmZXcgY29tbW9uIGV4Y2VwdGlvbiB0eXBlcy4gICBUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0LgoKICAgICAgICAgICAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgLW5vZXhjZXB0IG9yCiAgICAgICAgICAgIHNldHRpbmcgdGhlIE5vRXhjZXB0IGdsb2JhbCB2YXJpYWJsZSB0byAxLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFsgUHl0aG9uIF0KICAgICAgICAgICAgQXV0b21hdGljIHRyYW5zbGF0aW9uIG9mIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgaW50byBlcnJvciBoYW5kbGluZyBjb2RlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIEZvbyBpcyB3cmFwcGVkIGFzIGEgY2xhc3NpYy1zdHlsZSBjbGFzcyAoY29tcGF0aWJsZQogICAgICAgICAgICB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZykuICBGdXJ0aGVybW9yZSwgeW91IGNhbiB3cml0ZSBQeXRob24gY29kZQogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgRm9vLGU6ICAgICAjIE5vdGUgdXNlIG9mIGV4Y2VwdGlvbiBjbGFzcyBoZXJlIQogICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIEZvbyBlcnJvcgogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlIG9iamVjdCAiZSIgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGp1c3QgYSB3cmFwcGVkIEZvbwogICAgICAgICAgICBvYmplY3QuICBBY2Nlc3MgaXQgbGlrZSBhIG5vcm1hbCBvYmplY3QuCgogICAgICAgICAgICBJZiBhbiBleGNlcHRpb24gaXMgbm90IHdyYXBwZWQgYXMgYSBjbGFzcywgYSBSdW50aW1lRXJyb3IKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIFRoZSBhcmd1bWVudCB0byB0aGlzIGV4Y2VwdGlvbiBpcwogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIG9iamVjdC4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KGludCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICBiLmJsYWgoKTsKICAgICAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsZToKICAgICAgICAgICAgICAgICAgIHByaW50IGUuYXJnc1swXSAgICAgICAjIEludGVnZXIgZXhjZXB0aW9uIHZhbHVlCgogICAgICAgICAgICBDb21tZW50czoKCiAgICAgICAgICAgICAgICAtICBJZiBhIGNsYXNzIGlzIHVzZWQgYXMgYW4gZXhjZXB0aW9uLCBpdCAqbXVzdCogYmUgd3JhcHBlZAogICAgICAgICAgICAgICAgICAgYXMgYSBQeXRob24gY2xhc3NpYy1zdHlsZSBjbGFzcyAobmV3IGNsYXNzZXMgZG9uJ3Qgd29yaykuCgogICAgICAgICAgICAgICAgLSAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBjb21wYXRpYmxlIHdpdGggJWV4Y2VwdGlvbi4KCiAgICAgICAgICAgICAgICAtICBVc2UgLW5vZXhjZXB0IHRvIHR1cm4gb2ZmIHRoaXMgZmVhdHVyZS4KCiAgICAgICAgICAgICAgICAtICBUaGUgbmV3bHkgaW50cm9kdWNlZCAidGhyb3ciIHR5cGVtYXAgaXMgdXNlZCB0byByYWlzZQogICAgICAgICAgICAgICAgICAgUHl0aG9uIGVycm9ycyAobmF0dXJhbGx5KS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluZm9ybWF0aW9uIGZyb20gdGhyb3coKSBzcGVjaWZpZXJzIGlzIG5vdyBzdG9yZWQgaW4gdGhlIHBhcnNlCiAgICAgICAgICAgIHRyZWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpIHRocm93KHNwYW0sYmFyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBzdG9yZWQgaW5mb3JtYXRpb24gaXMgZnVsbHkgY29ycmVjdGVkIGZvciBuYW1lc3BhY2VzIGFuZCB3b3JrcwogICAgICAgICAgICB3aXRoIHRlbXBsYXRlcy4gIFVzZXMgd2lsbCBmb2xsb3cuCiAgICAgICAgICAgIAowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGlzIG5vIGxvbmdlciBhcHBsaWVkIHRvIG1lbWJlciBhY2Nlc3MKICAgICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgaW4gdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCh3aGF0ZXZlcikgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBub3QgYXBwbGllZCB0byBhY2Nlc3NvciBmdW5jdGlvbnMKICAgICAgICAgICAgZm9yIEZvbzo6eC4gICBUaGlzIHNob3VsZCByZWR1Y2UgdGhlIGFtb3VudCBvZiBleHRyYSBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRlZC4KCiAgICAgICAgICAgIENhdmVhdDogIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlICppcyogdXNlZCB3aGVuIGF0dHJpYnV0ZXMgYXJlCiAgICAgICAgICAgIGFjY2Vzc2VkIHRocm91Z2ggYSBzbWFydC1wb2ludGVyIG9yIGEgc3ludGhlc2l6ZWQgYXR0cmlidXRlZAogICAgICAgICAgICBhZGRlZCB3aXRoICVleHRlbmQgaXMgdXNlZC4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSBtb3JlIHBhdGNoZXMgdG8gaG9wZWZ1bGx5IGVsaW1pbmF0ZSBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyBTV0lHIAogICAgICAgICAgICBhcyBhIDY0LWJpdCBleGVjdXRhYmxlLgoKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGNvbnN0IHJlZmVyZW5jZSBtZW1iZXJzLCB2YXJpYWJsZXMsIGFuZCBzdGF0aWMgbWVtYmVycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAmcmVmOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgdHJ5aW5nIHRvIGdlbmVyYXRlICJzZXQiIGZ1bmN0aW9ucyB3aGljaCB3b3VsZG4ndCBjb21waWxlLiAKCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSB0aGUgd2FybmluZyBtZXNzYWdlIGZvciAiQ2xhc3MgWCBtaWdodCBhYnN0cmFjdCIgb2ZmIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIEVuYWJsZSB3aXRoIC1XYWxsLgoKMDgvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZWZpbmVkIGhhbmRsaW5nIG9mIGNvbnN0IGFuZCBub24tY29uc3Qgb3ZlcmxvYWRlZCBtZXRob2RzLiAgSWYKICAgICAgICAgICAgYSBjbGFzcyBkZWZpbmVzIGEgbWV0aG9kIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVuIHRoZSBub24tY29uc3QgbWV0aG9kIGlzICphbHdheXMqIHNlbGVjdGVkIGluIG92ZXJsb2FkaW5nIGFuZAogICAgICAgICAgICB0aGUgY29uc3QgbWV0aG9kIHNpbGVudGx5IGRpc2NhcmRlZC4gIElmIHJ1bm5pbmcgd2l0aCAtV2FsbCwgYSB3YXJuaW5nCiAgICAgICAgICAgIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgowOC8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIGluaGVyaXRhbmNlLiAgIENvbnNpZGVyIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBibGFoKGRvdWJsZSB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vQmFyIDogcHVibGljIEZvbywgcHVibGljIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBjaGFyICpibGFoKGNoYXIgKngpOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgQmFyOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBTV0lHIHdyYXBzIEZvb0Jhcjo6YmxhaCBhcyBhbiBvdmVybG9hZGVkIG1ldGhvZCB0aGF0IHVzZXMgYWxsCiAgICAgICAgICAgIGFjY2Vzc2libGUgdmVyc2lvbnMgb2YgYmxhaCgpLiAgU2VlIHNlY3Rpb24gMTUuMi4yIGluIFN0cm91c3RydXAsIDNyZCBFZC4KCiAgICAgICAgICAgIFNXSUcgYWxzbyBzdXBwb3J0cyBhY2Nlc3MgY2hhbmdlIHRocm91Z2ggdXNpbmcgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBDYXZlYXQ6ICAgU1dJRyBkb2VzIG5vdCBhY3R1YWxseSBjaGVjayB0byBzZWUgaWYgZGVjbGFyYXRpb25zIGltcG9ydGVkCiAgICAgICAgICAgIHZpYSAndXNpbmcnIGFyZSBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiAgSWYgdGhpcyBvY2N1cnMsIHRoZQogICAgICAgICAgICB3cmFwcGVyIGNvZGUgd29uJ3QgY29tcGlsZSBhbnl3YXlzLS0tbm90IHN1cmUgaXQncyB3b3J0aCB3b3JyeWluZyBhYm91dC4KICAgICAgICAgIAowOC8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIG92ZXJsb2FkaW5nIGRpc3BhdGNoIHRvIG5vdCBpbmNsdWRlIG5vZGVzIHdpdGggYW4gImVycm9yIiBhdHRyaWJ1dGUuCiAgICAgICAgICAgIEEgbGFuZ3VhZ2UgbW9kdWxlIGNhbiBzZXQgdGhpcyBpZiBhIG5vZGUgY291bGRuJ3QgYmUgd3JhcHBlZCBhbmQgeW91IGRvbid0IHdhbnQKICAgICAgICAgICAgaXQgaW5jbHVkZWQgaW4gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uLgoKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIGRpc3BhdGNoLiAgIFRoZSBkaXNwYXRjaGVyIGlzIG5vdyBhd2FyZSBvZgogICAgICAgICAgICBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShGb28gKmYpOwogICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKEJhciAqYik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBkaXNwYXRjaGVyIHJlLW9yZGVycyB0aGUgZnVuY3Rpb25zIHNvIHRoYXQgc3BhbShCYXIgKmIpIGlzCiAgICAgICAgICAgIGNoZWNrZWQgZmlyc3QtLS1pdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gc3BhbShGb28gKmYpLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtV2Vycm9yIGNvbW1hbmQgbGluZSBvcHRpb24uICAgSWYgc3VwcGxpZWQsIHdhcm5pbmcgbWVzc2FnZXMgYXJlIHRyZWF0ZWQKICAgICAgICAgICAgYXMgZXJyb3JzIGFuZCBTV0lHIHdpbGwgcmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NjEzNSBdIFR5cGVkZWYgb2YgcmVmZXJlbmNlIGNhbid0IGNvbXBpbGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgJkludFJlZjsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhJbnRSZWYgaSk7CgogICAgICAgICAgICBTV0lHLTEuMy4xNCBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuCgpWZXJzaW9uIDEuMy4xNCAoQXVndXN0IDEyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgU3RhdGljIGNvbnN0IG1lbWJlcnMgaW5pdGlhbGl6ZWQgZHVyaW5nIGRlY2xhcmF0aW9uLCBhbmQKCSAgICBvbmx5IHRoZW0sIGllOgoKCSAgICBzdHJ1Y3QgQQoJICAgIHsJCSAKCQlzdGF0aWMgY29uc3QgaW50IGEgPSAxIDsgIC8vIHRoaXMgb25lCgkJc3RhdGljIGNvbnN0IGludCBiOyAgICAgICAvLyBub3QgdGhpcyBvbmUKICAgICAgICAgICAgfTsgICAgIAoKCSAgICBhcmUgZW1pdHRlZCBsaWtlIGNvbnN0YW50cyAoZXF1aXZhbGVudCB0byBlbnVtcyBvcgoJICAgIGV4cGxpY2l0ICVjb25zdGFudCkuCgkgICAgCgkgICAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgY2Fubm90IGJlIGFkZGVkIGRpcmVjdGx5IHRvICdjdmFyJwoJICAgIHNpbmNlIHRoZXkgbGFjayB0aGUgbmVlZGVkIHJlZmVyZW5jZSAod2VsbCwgeW91IGNhbiBmb3JjZQoJICAgIHRoZW0gdG8gaGF2ZSBhIHJlYWwgcmVmZXJlbmNlLCBidXQgaW4gYW4gdWdseSB3YXkgd2hpY2gKCSAgICBnb2VzIGNvbXBsZXRlbHkgYWdhaW4gdGhlIG9yaWdpbmFsIHB1cnBvc2Ugb2YgaW5pdGlhbGl6ZQoJICAgIHRoZW0gZHVyaW5nIGRlY2xhcmF0aW9uLCB5b3UgYWxzbyBoYXZlIHRvIGRlYWwgd2l0aCBleHRyYQoJICAgIGxpbmtpbmcgbWF0dGVycywgYW5kIGl0IHRha2UgYSB3aGlsZSB0byBmaWd1cmUgb3V0IHdoYXQgaXMKCSAgICB0aGUgcHJvYmxlbSBhbmQgaG93IHRvIHNvbHZlIGl0KS4KCSAgICAKCSAgICBQbGVhc2UgdGVzdCBpdCB3aXRoIHlvdXIgcHJlZmVycmVkIHRhcmdldCBsYW5ndWFnZSwgYW5kCgkgICAgbm90IG9ubHkgdGhlIGNvZGUgZ2VuZXJhdGlvbiwgYnV0IHJlYWxseSBydW4gdGhlIGV4YW1wbGUKCSAgICBpbiB0aGUgdGVzdC1zdWl0ZSAoc3RhdGljLWNvbnN0LW1lbWJlci0yLmkpIGJlY2F1c2UgdGhlCgkgICAgcHJvYmxlbSBhbmQgdGhlIHNvbHV0aW9uIGNhbm5vdCBiZSAiZnVsbHkiIGFwcHJlY2lhdGVkCgkgICAgdW50aWwgeW91IHRyeSB0byBsb2FkIHRoZSBtb2R1bGUgYW5kIHJ1biBpdC4KCgkgICAgSW4gc29tZSB0YXJnZXQgbGFuZ3VhZ2VzIChweXRob24gc3BlY2lhbGx5KSwgdGhpcyBjYW4KCSAgICBwcm9kdWNlcyBhIGRpZmZlcmVuY2UgaW4gdGhlIHdheSB0aGF0IHRoZSBzdGF0aWMgY29uc3RhbnQKCSAgICBtZW1iZXJzICdhJyBhbmQgJ2InIGFyZSBpbnRlcm5hbGx5IHdyYXBwZWQuIEhvcGVmdWxseSwKCSAgICB0aGV5IHN0aWxsIGNhbiBiZSBhY2Nlc3NlZCBpbiB0aGUgc2FtZSB3YXkuCgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gTm93IHN0YXRpYyBjb25zdCBtZW1iZXJzIGNhbiBiZSBhY2Nlc3NlZCBpbiBhIG1vcmUKCSAgICBuYXR1cmFsIHdheSwgaWUsIGlmIHlvdSBoYXZlCgoJICAgIHN0cnVjdCBBCiAgICAgICAgICAgICB7CQkgCgkJdHlwZWRlZiB1bnNpZ25lZCBpbnQgdmlld2ZsYWdzOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgZm9yd2FyZF9maWVsZCA9IDA7CgkJc3RhdGljIGNvbnN0IHZpZXdmbGFncyBiYWNrd2FyZF9maWVsZDsKICAgICAgICAgICAgfTsgICAgIAoJICAgIAoJICAgIG5vdyB5b3UgY2FuIGRvOgoKCQlwcmludCBBLmJhY2t3YXJkX2ZpZWxkCgoJICAgIGFuZCBhbHNvCgoJICAgICAgICBhID0gQSgpCgkJcHJpbnQgYS5mb3J3YXJkX2ZpZWxkCgkJCgkgICAgTm90ZSB0aGF0IGlmIHRoZSBzdGF0aWMgY29uc3QgbWVtYmVycyBkb24ndCBoYXZlIGFuCgkgICAgaW5pdGlhbGl6ZXIgKGxpa2UgYmFja3dhcmRfZmllbGQpLCBzdGlsbCB5b3UgY2FuIGFjY2VzcwoJICAgIHRoZW0gaW4gdGhlIHNhbWUgd2F5IGluIHRoZSBweXRob24gc2lkZSwgYnV0IHRoZQoJICAgIGltcGxlbWVudGF0aW9uIGlzIGEgcXVpdGUgZGlmZmVyZW50OiBiYWNrd2FyZF9maWVsZCB3aWxsCgkgICAgc3RpbGwgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSwgYW5kIGFsc28sIHlvdSBhcmUgCgkgICAgcmVzcG9uc2libGUgdG8gaW5pdGlhbGl6ZSBpdCBpbiBzb21lIGNvZGUgdW5pdCwgYW5kIGxpbmsgaXQKCSAgICBwcm9wZXJseS4gZm9yd2FyZF9maWVsZCwgYnkgdGhlIG90aGVyIGhhbmQsIHdpbGwgbm90CgkgICAgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSBidXQgb25seSBhcyBhIEEgbWVtYmVyLCBzaW1pbGFyCgkgICAgdG8gd2hhdCBoYXBwZW4gd2l0aCBlbnVtIG9yICVjb25zdGFudCBtZW1iZXJzLgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gQ29tbW9uIGNvZGUgaW4gdGhlIF9fc2V0YXR0cl9fL19fZ2V0YXR0cl9fIG5vdwoJICAgIGdvZXMgdG8gdHdvICJmcmVlIiBtZXRob2RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb3h5CgkgICAgZmlsZSwgZnJvbSB3aGVyZSBlYWNoIGNsYXNzIHVzZSBpdC4gVGhpcyBjaGFuZ2UgcmVkdWNlcwoJICAgIHRoZSBzaXplIG9mIHRoZSBwcm94eSBmaWxlLCBzcGVjaWFsbHkgaWYgeW91IHdyYXAgYSBsb3Qgb2YKCSAgICBzbWFsbCBjbGFzc2VzIGluIG9uZSBtb2R1bGUgKHVwIHRvIDMzJSBpbiBzb21lIGNhc2VzKSwKCSAgICBtYWtpbmcgaXQgZmFzdGVyIHRvIGxvYWQgdG9vLgoKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIElmIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGNoYXIgKiByZXR1cm5zIE5VTEwsCiAgICAgICAgICAgIHVuZGVmIGlzIHJldHVybmVkIHRvIHRoZSBQZXJsIGludGVycHJldGVyLgogCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFuZCBuYW1lc3BhY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRm9vKigpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGUgd3JhcHBlciBjb2RlLCBTV0lHIHdhcyB1c2luZyAtPm9wZXJhdG9yIEZvbyooKQogICAgICAgICAgICB3aGVuIGl0IHNob3VsZCBoYXZlIGJlZW4gdXNpbmcgLT5vcGVyYXRvciBuczo6Rm9vKigpLgoKICAgICAgICAgICAgTm90ZTogaWYgdXNpbmcgJXJlbmFtZSB3aXRoIGEgY29udmVyc2lvbiBvcGVyYXRvciwgeW91CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVyZW5hbWUodG9Gb29QdHIpIG5zOjpvcGVyYXRvciBuczo6Rm9vKigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgXl5eXiBub3RlIGV4dHJhIHF1YWxpZmllcgogICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gTWlub3IgZW5oYW5jZW1lbnQgdG8gJ2NvbnN0JyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgICBOb3JtYWxseSBjb25zdCBkZWNsYXJhdGlvbnMgYXJlIHdyYXBwZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcwogICAgICAgICAgICBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCB0aGUgY3ZhciBhdHRyaWJ1dGUgKHNlZSBTV0lHLmh0bWwgZm9yCiAgICAgICAgICAgIGEgZGlzY3Vzc2lvbiBvZiB3aHkpLiAgSG93ZXZlciwgaW4gbWFueSBwcm9ncmFtcywgImNvbnN0IiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zIG1heSBqdXN0IGJlIGNvbnN0YW50cy0tLW1ha2luZyB0aGUgY3Zhci4gYWNjZXNzCiAgICAgICAgICAgIGF3a3dhcmQuICBUbyBmaXggdGhpcywgImNvbnN0IiBkZWNsYXJhdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUKICAgICAgICAgICAgYm90aCB0aHJvdWdoIGN2YXIuIGFuZCBhcyBhIHNpbXBsZSBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNvbnN0IGludCBGT08gPSA0MjsKCiAgICAgICAgICAgIEluIFB5dGhvbjoKCiAgICAgICAgICAgICAgICAgPj4+IHByaW50IGV4YW1wbGUuY3Zhci5GT08KICAgICAgICAgICAgICAgICA0MgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLkZPTwogICAgICAgICAgICAgICAgIDQyCgogICAgICAgICAgICBOb3RlOiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgImNvbnN0IiB2YXJpYWJsZQogICAgICAgICAgICBtaWdodCBjaGFuZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2hhciAqY29uc3QgQkFSID0gIkhlbGxvIFdvcmxkIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHBvaW50ZXIgaXRzZWxmIGNhbiBub3QgY2hhbmdlLCBidXQgdGhlIAogICAgICAgICAgICBkYXRhIGJlaW5nIHBvaW50ZWQgdG8gY291bGQgYmUgbW9kaWZpZWQuICBJbiB0aGVzZSBzaXR1YXRpb25zLAogICAgICAgICAgICBjdmFyLkJBUiBzaG91bGQgYmUgYWNjZXNzZWQgdG8gb2J0YWluZWQgdGhlIGN1cnJlbnQgdmFsdWUuCgowOC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIEZpeGVkIGdlbmVyYXRpb24gb2YgdGhlIHByb3h5IGNvZGUgKC5weSBmaWxlcykgdG8gbW9yZQogICAgICAgICAgICBjbG9zZWx5IGZvbGxvdyB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb25zIGFzIHRoZXkgYXBwZWFyIGluCiAgICAgICAgICAgIHRoZSAuaSBmaWxlLiAgIEluIHRoZSBwYXN0LCBhbGwgb2YgdGhlIGNsYXNzIHdyYXBwZXJzIGFwcGVhcmVkCiAgICAgICAgICAgIGZpcnN0LCBmb2xsb3dlZCBieSBmdW5jdGlvbiBzdHVicywgaW5zZXJ0ZWQgUHl0aG9uIGNvZGUsIGFuZAogICAgICAgICAgICBvdGhlciBkZXRhaWxzLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eSBtZXRob2QgX2RlbGV0ZSgpIGNoYW5nZWQgdG8gZGVsZXRlKCkuIFRoZXJlIHNob3VsZG4ndCBldmVyCiAgICAgICAgICAgIGJlIGEgd3JhcHBlZCBmdW5jdGlvbiBjYWxsZWQgZGVsZXRlKCkgYXMgaXQgaXMgYSBDKysga2V5d29yZCBhbmQgdGhlcmUKICAgICAgICAgICAgaXMgbm8gc3VjaCB0aGluZyBhcyBhIG1lbWJlciBmdW5jdGlvbiBpbiBDLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGUgZnVuY3Rpb24gYmFjayBpbgogICAgICAgICAgICBmb3IgYWxsIHByb3h5IGNsYXNzZXM6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBKYXZhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHN1bW1hcnkKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIGltcHJvdmluZyB0aGUgSmF2YSBtb2R1bGUgCiAgICAgICAgICAgIGZvciB2ZXIgMS4zLjE0LiAgSWYgYXQgYWxsIHBvc3NpYmxlIGNoYW5nZSB5b3VyIGNvZGUgdG8gdGFrZSBhZHZhbnRhZ2VzIG9mIHRoZSAKICAgICAgICAgICAgaW1wcm92ZW1lbnRzLiBJZiB5b3Ugd2VyZSB1c2luZyBwcm94eSBjbGFzc2VzIHlvdSBtYXkgbm90IG5vdGljZSBhbnkgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IGlzc3Vlcy4gSGVyZSBpcyBhbiBleGFtcGxlIHdoaWNoIHdpbGwgaGVscCB3aXRoIG1vc3QgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdoZXJlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIGNvZGUgdGhhdCB1c2VzCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgb3V0cHV0OgoKICAgICAgICAgICAgUmVwbGFjZToKICAgICAgICAgICAgICAgICVtb2R1bGUgbW9kdWxlbmFtZQoKICAgICAgICAgICAgV2l0aDoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibW9kdWxlbmFtZSIpIG1vZHVsZW5hbWU7CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyJGphdmFjbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgX2RlbGV0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnM9InB1YmxpYyI7CgogICAgICAgICAgICBUaGUgcHJveHkgY29uc3RydWN0b3JzIHRoYXQgdG9vayBwYXJhbWV0ZXJzIChsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikKICAgICAgICAgICAgd2VyZSBwdWJsaWMgYW5kIGFyZSBub3cgcHJvdGVjdGVkLiBJZiB5b3Ugd2VyZSBtYWtpbmcgdXNlIG9mIHRoZXNlIHRoZW4geW91J2xsIAogICAgICAgICAgICBoYXZlIHRvIG1vZGlmeSB5b3VyIGNvZGUgYW5kIHRoZSBiZXN0IHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSB0aGUgbmV3IHR5cGUgCiAgICAgICAgICAgIHdyYXBwZXIgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBvdGhlciBtYWluIGFyZWFzIGFyZSB0aGUgcHJhZ21hcyBhbmQgZ2xvYmFsIHZhcmlhYmxlIHdyYXBwaW5nLiBSZXBsYWNlIAogICAgICAgICAgICB0aGUgcHJhZ21hcyB3aXRoIG9uZSBvZiB0aGUgbmV3IGRpcmVjdGl2ZXMgb3IgdHlwZW1hcHMgbWVudGlvbmVkIGJlbG93IGFuZCB1c2UKICAgICAgICAgICAgJXJlbmFtZSBvbiB0aGUgdmFyaWFibGVzLgoKICAgICAgICAgICAgSWYgeW91IHdlcmUgbm90IHVzaW5nIHByb3h5IGNsYXNzZXMsIHlvdSB3aWxsIGhhdmUgdG8gZGVmaW5lIGEganN0eXBlIHR5cGVtYXAKICAgICAgICAgICAgYXMgd2VsbCBhcyBhIGp0eXBlIHR5cGVtYXAuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3Igd3JhcHBpbmcgdHdvIGRpbWVuc2lvbiBhcnJheSB2YXJpYWJsZXMuCgowOC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsXQogICAgICAgICAgICBPYmplY3QgbWFuYWdlbWVudCBub3cgaGFzIGEgbXVjaCBiZXR0ZXIgc2Vuc2Ugb2Ygb3duZXJzaGlwLgogICAgICAgICAgICBPd25lcnNoaXAgYml0cyBpcyBjaGFuZ2VkIHdoZW5ldmVyIGFuIG9iamVjdCBpcyBzdG9yZWQgaW4gYQogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgb3Igc3RydWN0dXJlIG1lbWJlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB2YWw7CiAgICAgICAgICAgICAgICAgICAgRm9vICpuZXh0OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBpbiBQeXRob24KCiAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGYudGhpc293bgogICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgID4+PiBnID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGcubmV4dCA9IGYgICAgICAgICAgIyBBc3NpZ24gYSBwb2ludGVyCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24gICAgICAgICAgICMgTm90aWNlIG93bmVyc2hpcCBjaGFuZ2UKICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICA+Pj4KCiAgICAgICAgICAgIFRoaXMgc2NoZW1lIGlzIG1vc3RseSBhIGNvbnNlcnZhdGl2ZSBoZXVyaXN0aWMgZGVzaWduZWQgdG8gCiAgICAgICAgICAgIHByb3ZpZGUgc2VnbWVudGF0aW9uIGZhdWx0cy4gIEl0IGNvdWxkIGNhdXNlIGEgbWVtb3J5IGxlYWsKICAgICAgICAgICAgaWYgb3duZXJzaGlwIGlzIGNoYW5nZWQgdW5uZWNlc3NhcmlseS4gIEluIHRoaXMgY2FzZSwgeW91IGNhbgogICAgICAgICAgICBlaXRoZXIgd3JpdGUgYSB0eXBlbWFwICh0aGF0IGRvZXNuJ3QgY2hhbmdlIG93bmVyc2hpcCksIG9yCiAgICAgICAgICAgIG1hbnVhbGx5IHNldCB0aGUgdGhpc293biBhdHRyaWJ1dGUgYmFjayB0byAxLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbVGNsXSBNYWpvciB1c2FiaWxpdHkgaW1wcm92ZW1lbnRzIHRvIHRoZSBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgICBTdXBwb3NlIHlvdSBoYWQgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28geyAKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBzcGFtKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgdm9pZCAgYmxhaChGb28gKmYpOwoKICAgICAgICAgICAgSW4gcGFzdCB2ZXJzaW9ucyBvZiBTV0lHLCB5b3UgY291bGQgY3JlYXRlIG9iamVjdHMgYW5kIHVzZQogICAgICAgICAgICB0aGVtIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlIEZvbyBmCiAgICAgICAgICAgICAgICAlIGYgY29uZmlndXJlIC14IDMKICAgICAgICAgICAgICAgICUgZiBzcGFtCiAgICAgICAgICAgICAgICAzNwogICAgCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gaXMgdGhhdCBpZiB5b3UgdHJpZWQgdG8gY2FsbCBibGFoKCksIGl0IGRpZG4ndAogICAgICAgICAgICB3b3JrOgoKICAgICAgICAgICAgICAgICUgYmxhaCBmCiAgICAgICAgICAgICAgICBUeXBlIEVycm9yLiBFeHBlY3RlZCBfcF9Gb28KICAgICAgICAgICAgICAgICUKCiAgICAgICAgICAgIEluc3RlYWQsIHlvdSBoYWQgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICAlIGJsYWggW2YgY2dldCAtdGhpc10KICAKICAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBleHRyYWN0cyB0aGUgLXRoaXMgcG9pbnRlciwgYXZvaWRpbmcgdGhpcwogICAgICAgICAgICBwcm9ibGVtLiAgVGhpcyBtZWFucyB0aGF0IHNheWluZyAiYmxhaCBmIiBpcyBwZXJmZWN0bHkgbGVnYWwgYW5kCiAgICAgICAgICAgIGV2ZXJ5dGhpbmcgd2lsbCBzdGlsbCB3b3JrIG5vcm1hbGx5LgoKICAgICAgICAgICAgQ2F2ZWF0OiBTaW5jZSBwb2ludGVyIHN0cmluZ3Mgc3RhcnQgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZSAoXyksCiAgICAgICAgICAgIGRvbid0IHVzZSB0aGlzIGluIG9iamVjdCBuYW1lcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICUgRm9vIF9mIAogICAgICAgICAgICAgICAgJSBibGFoIF9mICAgICAgICAjIFBvdGVudGlhbCBjcmFzaAoKICAgICAgICAgICAgT2JqZWN0cyBub3cgaGF2ZSBhIC10aGlzb3duIGF0dHJpYnV0ZSB0aGF0IHNob3dzIHRoZSBvd25lcnNoaXAuCiAgICAgICAgICAgIFRoaXMgYnVpbGRzIHVwb24gdGhlIENIQU5HRVMgMTEvMjQvMjAwMSBlbnRyeS4KCjA4LzA3LzIwMDI6IHNhbWphbSwgU2FtIExpZGRpY290dAogICAgICAgICAgICBQcm9wZXJseSBpbXBsZW1lbnRlZCBwb2ludGVyIHN5c3RlbSB1c2luZyBwaHAgcmVzb3VyY2VzLgogICAgICAgICAgICBTdGlsbCBuZWVkIHRvIHdvcmsgb3V0IHdoZXRoZXIgb3Igbm90IHRvIGxldCBzY3JpcHQtdXNlcnMgY2FsbAogICAgICAgICAgICBkZXN0cnVjdG9ycyBkaXJlY3RseQoKMDgvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBVcGdyYWRlZCBtenNjaGVtZSBtb2R1bGUgdG8gc3VwcG9ydCB2ZXJzaW9uIDIwMSBhbmQgYWRkZWQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcgc3VwcG9ydC4KCjA4LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBleHRyYSBncm91cGluZyAoaW4gdmVyeSBsaW1pdGVkIGNhc2VzKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IChGdW5jUHRyKShpbnQsIGRvdWJsZSk7CgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMICoqKgogICAgICAgICAgICAKMDgvMDMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZXMgdG8gdHlwZW1hcHMuaSBhcyB0aG9zZSBkb25lIHByZXZpb3VzbHkgZm9yIFBlcmwsCiAgICAgICAgICAgIFB5dGhvbiBhbmQgVGNsIG1vZHVsZXMuIE5vdyBzdXBwb3J0cyByZWZlcmVuY2UgdHlwZXMgd2l0aCBJTlBVVCwKICAgICAgICAgICAgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcy4KCjA4LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZSBjc3RyaW5nLmkgYWRkZWQuICBQcm92aWRlcyBtYWNyb3MgZm9yCiAgICAgICAgICAgIG1hbmlwdWxhdGluZyBjaGFyICogZGF0YS4KIAowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVuZXcgZGlyZWN0aXZlLiAgVXNlICVuZXdvYmplY3QgaW5zdGVhZC4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgJW5ld29iamVjdCBmb287CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICBjaGFyICpmb28oKTsKCiAgICAgICAgICAgICVuZXdvYmplY3QgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwKICAgICAgICAgICAgZXRjLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBhdHRyaWJ1dGUgJ2puaWNsYXNzbmFtZScgZm9yIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGFsbG93cyBhIHdheSBvZgogICAgICAgICAgICBjaGFuZ2luZyB0aGUgSk5JIGNsYXNzIG5hbWUgZnJvbSB0aGUgZGVmYXVsdCB3aGljaCB1c2VzIHRoZSBtb2R1bGVuYW1lIHdpdGggSk5JCiAgICAgICAgICAgIGFwcGVuZGVkIGFmdGVyIGl0LgoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibmFtZSIpIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIElmICduYW1lJyBpcyB0aGUgc2FtZSBhcyAnbW9kdWxlbmFtZScgdGhlbiB0aGUgbW9kdWxlIGNsYXNzIG5hbWUgZ2V0cyBjaGFuZ2VkCiAgICAgICAgICAgIGZyb20gJ21vZHVsZW5hbWUnIHRvIG1vZHVsZW5hbWVNb2R1bGUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmaWxlIGluY2x1ZGUgb3JkZXIuICBMYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBkaXJlY3RvcmllcyBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZ2VuZXJpYyBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6ICAic3dpZ19saWIvcHl0aG9uL2Zvby5pIiBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICAic3dpZ19saWIvZm9vLmkiLiAgICBJIHRob3VnaHQgdGhpcyB3YXMgdGhlIGNhc2UgYWxyZWFkeSwgYnV0CiAgICAgICAgICAgIGFwcGFyZW50bHkgaXQgaGFzIGJlZW4gYnJva2VuIGZvciBxdWl0ZSBzb21lIHRpbWUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN0ZF9kZXF1ZS5pIGxpYnJhcnkgZmlsZS4gIFdvcmsgaW4gcHJvZ3Jlc3MuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsLFBlcmxdCiAgICAgICAgICAgIEltcHJvdmVtZW50cyB0byB0eXBlbWFwcy5pLiAgSU5QVVQvSU5PVVQgdHlwZW1hcHMgcGVyZm9ybSBiZXR0ZXIKICAgICAgICAgICAgZXJyb3IgY2hlY2tpbmcuICBUeXBlbWFwcyBhcmUgbm93IHN1cHBsaWVkIGZvciByZWZlcmVuY2VzIGxpa2UgCiAgICAgICAgICAgIGludCAmT1VUUFVULCBkb3VibGUgJklOT1VULCBldGMuCiAgICAgICAgICAKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBEZXByZWNhdGVkIHRoZSBUXyogYW5kIExfKiB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pLgogICAgICAgICAgICBNdWx0aXBsZSByZXR1cm4gdmFsdWVzIGFyZSBhbHdheXMgcGxhY2VkIGluIGEgdHVwbGUuIERlcHJlY2F0ZWQKICAgICAgICAgICAgdGhlIEJPVEggdHlwZW1hcHMuICBUaGlzIGlzIG5vdyBJTk9VVCAoZS5nLiwgaW50ICpJTk9VVCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgYXJyYXkuaSwgY2FycmF5LmksIGFuZCB0aW1lci5pIGxpYnJhcnkgZmlsZXMuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBVc2UgY3BvaW50ZXIuaSBpbnN0ZWFkLgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjA4LzAxLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRm9yIGNvbnNpc3RlbmN5IHRoZSBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB1c2UgdGhlIEphdmFCZWFuIAogICAgICAgICAgICBwcm9wZXJ0eSBkZXNpZ24gcGF0dGVybiBsaWtlIG1lbWJlciB2YXJpYWJsZXMgYWx3YXlzIGhhdmUuIFRoaXMgbWVhbnMgaWYgeW91IGFyZSAKICAgICAgICAgICAgd3JhcHBpbmcgYSB2YXJpYWJsZSBjYWxsZWQgZm9vLCB0aGUgZ2V0dGVyIGlzIGNhbGxlZCBnZXRGb28oKSBhbmQgdGhlIHNldHRlciBpcyAKICAgICAgICAgICAgY2FsbGVkIHNldEZvbygpLiBCZWZvcmUgdGhlIHJlY2VudCBjaGFuZ2VzIHRvIHRoZSBKYXZhIG1vZHVsZSB0aGUgZ2V0dGVycyBhbmQgCiAgICAgICAgICAgIHNldHRlcnMgd2VyZSBjYWxsZWQgZ2V0X2ZvbygpIGFuZCBzZXRfZm9vKCkuIElmIHlvdSByZWFsbHkgd2FudCB0aGUgb3JpZ2luYWwgCiAgICAgICAgICAgIGZ1bmN0aW9uIG5hbWVzIHVzZSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgbGlrZSB0aGlzOiAlcmVuYW1lKF9mb28pIEZvbzsKCjA3LzMxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY2FzdGluZyBwcm9ibGVtIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgICBjbGFzcyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJhciA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJheiA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIHNwYW0gOiBwdWJsaWMgYmFyLCBwdWJsaWMgYmF6IHt9OwoKICAgICAgICAgICAgdGhlbiB0aGUgd3JhcHBlcnMgd291bGRuJ3QgY29tcGlsZSBkdWUgdG8gYW4gYW1iaWd1b3VzIGNhc3QuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIER1ZSB0byBuZXcgc3RhdGljIHR5cGVjaGVja2luZyBhbGwgcG9pbnRlcnMgaGVsZCBpbiBhIEphdmEgbG9uZyBhcmUgcGFydCBvZiAKICAgICAgICAgICAgdGhlIGludGVybmFsIHdvcmtpbmdzIGFuZCB0aGlzIHBvaW50ZXIgdmFsdWUgaW4gdGhlIEphdmEgbG9uZyBoYXMgYmVjb21lIGFic3RyYWN0ZWQKICAgICAgICAgICAgZGF0YS4gVGhlIHR5cGUgd3JhcHBlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFzIHN1Y2ggcHJvdGVjdGVkLgogICAgICAgICAgICBJZiB5b3UgbmVlZCB0byBtZXNzIGFyb3VuZCB3aXRoIHBvaW50ZXJzIGZyb20gSmF2YSBvciBmb3IgZXhhbXBsZSBjcmVhdGUgYSBwcm94eSAKICAgICAgICAgICAgY2xhc3Mgb3IgdHlwZSB3cmFwcGVyIGNsYXNzIGFyb3VuZCBhIG51bGwgcG9pbnRlciwgYWRkIGEgZnVuY3Rpb24vY29uc3RydWN0b3IgCiAgICAgICAgICAgIHRvIGRvIHNvIHdpdGggdGhlICVqYXZhY29kZSB0eXBlbWFwLiBZb3UgY2FuIGFsc28gbWFrZSBnZXRDUHRyKCkgcHVibGljIGFnYWluIHdpdGgKICAgICAgICAgICAgdGhlICVqYXZhZ2V0Y3B0ciB0eXBlbWFwLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBmb3IgJXR5cGVtYXAoaWdub3JlKS4gSW4gcGFydGljdWxhciB3aGVuIGlnbm9yaW5nIHRoZSBsYXN0IHBhcmFtZXRlcgogICAgICAgICAgICBpbiBhIGZ1bmN0aW9uLiBBbHNvIGZvciBhbGwgcGFyYW1ldGVycyBpbiBjb25zdHJ1Y3RvcnMuIFRoZXNlIG1vZHMgaGF2ZSBhbHNvIGZpeGVkCiAgICAgICAgICAgIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzIGZvciBwcm94eSBjbGFzc2VzIC0gU0YgNTgxNzkxLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlbmV3b2JqZWN0IChyZXBsYWNlbWVudCBmb3IgJW5ldykgbm93IGltcGxlbWVudGVkIGZvciBKYXZhLiAKCjA3LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVtYXAgY29waWVzLCAlYXBwbHksIGFuZCAlY2xlYXIgaW5zaWRlCiAgICAgICAgICAgIEMrKyBuYW1lc3BhY2VzLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgSk5JIGNsYXNzIG5vdyBoYXMgcGFja2FnZSBhY2Nlc3MgYXMgdGhlIGNsYXNzIG1vZGlmaWVyCiAgICAgICAgICAgIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSAicHVibGljIiB0byBub3RoaW5nLiBUaGlzIGhhcyBiZWVuIGRvbmUKICAgICAgICAgICAgYXMgdGhpcyBjbGFzcyBpcyBub3cgbW9yZSBmb3IgdGhlIGludGVybmFsIHdvcmtpbmdzIG9mIFNXSUcgc2luY2UgdGhlIG1vZHVsZQogICAgICAgICAgICBjbGFzcyBoYXMgc3RhdGljIHR5cGUgY2hlY2tpbmcgZm9yIGFsbCB0eXBlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgJWpuaWNsYXNzY2xhc3Ntb2RpZmllciAKICAgICAgICAgICAgcHJhZ21hIHRvIGNoYW5nZSBpdCBiYWNrIHRvICJwdWJsaWMiLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eS9TaGFkb3cgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZSAtcHJveHkgYW5kIAogICAgICAgICAgICAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBkZXByZWNhdGVkLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIAogICAgICAgICAgICBsb3ctbGV2ZWwgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdGhlbiB1c2UgdGhlIG5ldyAtbm9wcm94eSBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJlbWFpbmluZyBwcmFnbWFzIHNoYWtldXAuIFRoZXNlIHdlcmUgdGhlIHJlbWFpbmluZyBwcmFnbWFzIGFuZCB0aGVpcgogICAgICAgICAgICBuZXcgbmFtZXMgd2hlcmUgY2hhbmdlZDoKCiAgICAgICAgICAgIG1vZHVsZWJhc2UKICAgICAgICAgICAgbW9kdWxlY29kZQogICAgICAgICAgICBtb2R1bGVjbGFzc21vZGlmaWVycwogICAgICAgICAgICBtb2R1bGVpbXBvcnQgPT4gbW9kdWxlaW1wb3J0cwogICAgICAgICAgICBtb2R1bGVpbnRlcmZhY2UgPT4gbW9kdWxlaW50ZXJmYWNlcwoKICAgICAgICAgICAgVGhlIG1vZHVsZWltcG9ydHMgd29ya3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHkgdG8gaG93IHRoZSBtb2R1bGVpbXBvcnQgcHJhZ21hIHdvcmtlZC4gCiAgICAgICAgICAgIE5vdyBpdCBhY3R1YWxseSB0YWtlcyBjb2RlIHdoaWNoIGdldHMgcGxhY2VkIGJlZm9yZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiBzbyB0aGUgCiAgICAgICAgICAgIHdob2xlIGltcG9ydCBzdGF0ZW1lbnQgaGFzIHRvIGJlIGdpdmVuLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW1wb3J0cz0lewogICAgICAgICAgICBpbXBvcnQgamF2YS5pby4qOwogICAgICAgICAgICBpbXBvcnQgamF2YS5tYXRoLio7CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgbW9kdWxlaW50ZXJmYWNlcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8gdGhlIG9sZCBtb2R1bGVpbnRlcmZhY2UgaW4gdGhhdCBpZiAKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgaXMgcmVxdWlyZWQgdGhleSBtdXN0IGJlIGNvbW1hIHNlcGFyYXRlZCBpbiBvbmUgdXNlIG9mIAogICAgICAgICAgICB0aGUgcHJhZ21hLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW50ZXJmYWNlcz0iU2VyaWFsaXphYmxlLCBNeUludGVyZmFjZSIKCiAgICAgICAgICAgIFRoZXNlIGxhc3QgdHdvIHByYWdtYXMgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgamF2YWludGVyZmFjZXMgYW5kIGphdmFpbXBvcnRzIAogICAgICAgICAgICB0eXBlbWFwLgoKICAgICAgICAgICAgQSBzaW1pbGFyIHNldCBvZiBwcmFnbWFzIGhhcyBiZWVuIGludHJvZHVjZWQsIG5hbWVseToKCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NvZGUKICAgICAgICAgICAgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqbmljbGFzc2ltcG9ydAogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZQoKICAgICAgICAgICAgVGhlc2Ugd29yayBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIgbW9kdWxlIGNvdW50ZXJwYXJ0cy4gTm90ZSB0aGF0IHByZXZpb3VzbHkKICAgICAgICAgICAgdGhlIG1vZHVsZVhYWCBwcmFnbWFzIHdvcmtlZCBvbiB0aGUgb2xkIG1vZHVsZSBjbGFzcyB3aGljaCBpcyBub3cgY2FsbGVkIHRoZQogICAgICAgICAgICBKTkkgY2xhc3MgKHRoZSBjbGFzcyB3aXRoIHRoZSBuYXRpdmUgZnVuY3Rpb25zKS4gVGhlIGpuaWNsYXNzWFhYIHByYWdtYXMgbm93IAogICAgICAgICAgICB3b3JrIG9uIHRoZSBuZXcgbW9kdWxlIGNsYXNzICh0aGUgY2xhc3MgdGhhdCBoYXMgYWxsIHRoZSBnbG9iYWwgZnVuY3Rpb25zIGFuZAogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMsIHBsdXMgYWxsIG90aGVyCiAgICAgICAgICAgIHJlbWFpbmluZyBmdW5jdGlvbnMgd2hlbiB1c2luZyB0aGUgbG93LWxldmVsIHByb2NlZHVyYWwgaW50ZXJmYWNlKS4KCiAgICAgICAgICAgIEluIHN1bW1hcnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcmFnbWFzIG1ha2UgdXAgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICA8am5pY2xhc3NpbXBvcnRzPgogICAgICAgICAgICA8am5pY2xhc3Ntb2RpZmllcnM+IGNsYXNzIG1vZHVsZW5hbWUgZXh0ZW5kcyA8am5pY2xhc3NiYXNlPiBpbXBsZW1lbnRzIDxqbmljbGFzc2ludGVyZmFjZXM+IHsKICAgICAgICAgICAgICAgIDxqbmljbGFzc2NvZGU+CiAgICAgICAgICAgICAgICAuLi4gU1dJRyBnZW5lcmF0ZWQgZnVuY3Rpb25zIC4uLgogICAgICAgICAgICB9Cn0KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEZXByZWNhdGVkIG1vZHVsZW1ldGhvZG1vZGlmaWVycyBwcmFnbWEgYW5kIHJlcGxhY2VkIHdpdGggCiAgICAgICAgICAgIGEgYmV0dGVyICVmZWF0dXJlIGJhc2VkIGRpcmVjdGl2ZSBjYWxsZWQgJWphdmFtZXRob2Rtb2RpZmllcnMuCiAgICAgICAgICAgIEEgdXNlZnVsIGV4YW1wbGUgd291bGQgYmUgZm9yIHN5bmNocm9uaXNhdGlvbiBpbiBtdWx0aS10aHJlYWRlZCBhcHBzOgoKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgZm9vKGludCBhKSAicHVibGljIHN5bmNocm9uaXplZCI7CgogICAgICAgICAgICBDaGFuZ2VzIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZGVmYXVsdCAoInB1YmxpYyIpIHRvICJwdWJsaWMgc3luY2hyb25pemVkIi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU2V2ZXJhbCBkaXJlY3RpdmVzIG5vdyBhbGxvdyBvcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIFRoZXNlIGluY2x1ZGU6CgogICAgICAgICAgICAgICAgJW1vZHVsZShuYW1lPSJ2YWx1ZSIsIG5hbWU9InZhbHVlIiwgLi4uKSBtb2R1bGVuYW1lCiAgICAgICAgICAgICAgICAlaW1wb3J0KG5hbWU9InZhbHVlIiwgLi4uKSAiZmlsZW5hbWUuaSIKICAgICAgICAgICAgICAgICVleHRlbmQobmFtZT0idmFsdWUiLCAuLi4pIGNsYXNzbmFtZSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZXNlIGN1cnJlbnRseSBoYXZlIG5vIGVmZmVjdCBhbmQgYXJlIHJlc2VydmVkIGZvcgogICAgICAgICAgICBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICAgICAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudHMgdG8gc21hcnQtcG9pbnRlciBoYW5kbGluZy4gIFNXSUcgb25seSBwcm92aWRlcwogICAgICAgICAgICBleHRyYSBzdXBwb3J0IGZvciBhIHNtYXJ0LXBvaW50ZXIgaWYgb3BlcmF0b3ItPigpIHJldHVybnMKICAgICAgICAgICAgYSBwcm9wZXIgcG9pbnRlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKCiAgICAgICAgICAgIElmIG9wZXJhdG9yLT4oKSByZXR1cm5zIGFuIG9iamVjdCBieSB2YWx1ZSBvciByZWZlcmVuY2UsCiAgICAgICAgICAgIHRoZW4gU1dJRyBleGFtaW5lcyB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIHNlZSBpZiBpdCBhbHNvCiAgICAgICAgICAgIGltcGxlbWVudHMgb3BlcmF0b3ItPigpLiAgSWYgc28sIFNXSUcgY2hhc2VzIG9wZXJhdG9yLT4oKQogICAgICAgICAgICB1bnRpbCBpdCBjYW4gZmluZCBvbmUgdGhhdCByZXR1cm5zIGEgcG9pbnRlci4gIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIGNhc2VzIGxpa2UgdGhpcyB0byB3b3JrOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBTcGFtIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgQmFyIG9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgPj4+IHMgPSBTcGFtKCkKICAgICAgICAgICAgICAgICA+Pj4gcy5ibGFoKCkgICAgICAjIEludm9rZXMgRm9vOjpibGFoKCkKCiAgICAgICAgICAgIFRoZSBzLmJsYWgoKSBjYWxsIGFjdHVhbGx5IGludm9rZXM6CgogICAgICAgICAgICAgICAgICAoKHMub3BlcmF0b3ItPigpKS5vcGVyYXRvci0+KCkpLT5ibGFoKCk7CiAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHR5cGVkZWYgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gJiBGb29SZWY7CiAgICAgICAgICAgICAgICAgRm9vUmVmIGJsYWgoKTsKCiAgICAgICAgICAgIFByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndAogICAgICAgICAgICBjb21waWxlLgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBXcmFwcGluZyBvZiBzdGF0aWMgbWV0aG9kcyBoYXMgYmVlbiBpbXByb3ZlZCBpbiBwcm94eSBjbGFzc2VzLiAgSW4gb2xkZXIKICAgICAgICAgICAgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGlzOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCBiYXIoKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBzdGF0aWMgbWV0aG9kIHdhcyBvbmx5IGF2YWlsYWJsZSBhcyBhIGZ1bmN0aW9uIEZvb19iYXIoKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvb19iYXIoKQoKICAgICAgICAgICAgTm93LCB0aGUgc3RhdGljIG1ldGhvZCBjYW4gYWxzbyBiZSBpbnZva2VkIHRocm91Z2ggYW4gaW5zdGFuY2UgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgPj4+IGYgPSBGb28oKQogICAgICAgICAgICAgICAgICA+Pj4gZi5iYXIoKSAgICAgICAgIyBJbnZva2VzIHN0YXRpYyBtZXRob2QKCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBhbGwgdmVyc2lvbnMgb2YgUHl0aG9uLiAgQWRkaXRpb25hbGx5LCBmb3IgUHl0aG9uLTIuMiwKICAgICAgICAgICAgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGJlIGludm9rZWQgYXM6CgogICAgICAgICAgICAgICAgICA+Pj4gRm9vLmJhcigpCgogICAgICAgICAgICBUaGUgb2xkLXN0eWxlIGZ1bmN0aW9uIGlzIHN0aWxsIHN1cHBvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZgogICAgICAgICAgICB5b3UgY2FyZSBhYm91dCBtYWtpbmcgeW91ciBjb2RlIGFjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgUHl0aG9uLAogICAgICAgICAgICBlaXRoZXIgdXNlIEZvb19iYXIoKSBvciBhY2Nlc3MgdGhlIG1ldGhvZCB0aHJvdWdoIGFuIGluc3RhbmNlLgogCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZS4gIFByb3h5IGNsYXNzZXMgbm93IHV0aWxpemUgbmV3IFB5dGhvbi0yLjIKICAgICAgICAgICAgZmVhdHVyZXMgaW5jbHVkaW5nIHByb3BlcnRpZXMgYW5kIHN0YXRpYyBtZXRob2RzLiAgSG93ZXZlciwgdGhlc2UgZmVhdHVyZXMKICAgICAgICAgICAgYXJlIHN1cHBvcnRlZCBpbiBhIHdheSB0aGF0IHByb3ZpZGVzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKICAgICAgICAgICAgUHl0aG9uIHZlcnNpb25zLiAgSW4gb3RoZXIgd29yZHMsIHByb3h5IGNsYXNzZXMgd29yayB3aXRoIGFsbCB2ZXJzaW9ucwogICAgICAgICAgICBvZiBQeXRob24gYW5kIG9ubHkgdXNlIG5ldyBmZWF0dXJlcyB3aGVuIHJ1bm5pbmcgb24gUHl0aG9uLTIuMi4KCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICVleHRlbmQgc28gdGhhdCBvdmVybG9hZGVkIG1ldGhvZHMgY2FuIGJlIGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgeCkgeyB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpzKSB7IH07CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGJvdGggQysrICphbmQqIEMuCgowNy8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE1vcmUgbmV3IHR5cGVtYXBzIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgY2FuIGJlIGZ1cnRoZXIgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBjb2RlIGZvciBnZW5lcmF0aW5nIHRoZSAKICAgICAgICAgICAgZmluYWxpemUoKSBtZXRob2RzIChwcm94eSBjbGFzc2VzIG9ubHkpIGFuZCB0aGUgZ2V0Q1B0cigpIG1ldGhvZHMgZm9yIHByb3h5IAogICAgICAgICAgICBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFmaW5hbGl6ZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgICAgICAgIF9kZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwIHdpbGwgZW5hYmxlIHVzZXJzIHRvIGhhbmRsZSBKYXZhIG51bGwgYnkgb3ZlcnJpZGluZwogICAgICAgICAgICB0aGlzIHR5cGVtYXAgLSBhIHJlcXVlc3RlZCBmZWF0dXJlLgoKICAgICAgICAgICAgVGhlIC1ub2ZpbmFsaXplIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBUaGUgamF2YWZpbmFsaXplCiAgICAgICAgICAgIHR5cGVtYXAgaXMgbW9yZSBwb3dlcmZ1bCBhcyBpdCB3aWxsIGFsbG93IHRoZSByZW1vdmFsIG9mIHRoZSBmaW5hbGl6ZSBtZXRob2RzIAogICAgICAgICAgICBmb3IgYWxsIG9yIGFueSBvbmUgb3IgbW9yZSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzLgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgZ2V0Q1B0clhYWCgpIGZ1bmN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgdG8gYSBzdGF0aWMgZnVuY3Rpb24gYW5kCiAgICAgICAgICAgIGlzIG5vdyBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKFhYWCBvYmopIHsuLi59CgogICAgICAgICAgICBUaGlzIGlzIGEgcmVxdWVzdGVkIGNoYW5nZSB3aGljaCB3aWxsIGFsbG93IEphdmEgbnVsbCBwb2ludGVycyB0byBiZSB1c2VkIGFzIG51bGwKICAgICAgICAgICAgY2FuIGJlIHBhc3NlZCBpbiBmb3Igb2JqLiBIb3dldmVyLCB0byBhY2hpZXZlIHRoaXMgdGhlIGFwcHJvcHJpYXRlIGNvZGUgbXVzdCBiZQogICAgICAgICAgICB3cml0dGVuIHVzaW5nIHRoZSBuZXcgamF2YWdldGNwdHIgdHlwZW1hcCBkaXJlY3RpdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoaXMgZnVuY3Rpb24gYmFjayBpbiB1c2luZyB0aGUKICAgICAgICAgICAgbmV3IGphdmFjb2RlIHR5cGVtYXA6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKCiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTIgYW5kIFNXSUctMS4zLjEzCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMSBhbmQgZWFybGllcgogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJX0KCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBkaXJlY3RpdmUgdG8gY29udHJvbCBjb25zdGFudCBjb2RlIGdlbmVyYXRpb24gLSAlamF2YWNvbnN0LgogICAgICAgICAgICBUaGUgZGVmYXVsdCBoYW5kbGluZyBmb3IgaGFuZGxpbmcgY29uc3RhbnRzIGlzIHRvIGdldCB0aGUgdmFsdWUgdGhyb3VnaAogICAgICAgICAgICBhIEpOSSBjYWxsLCBlZwoKICAgICAgICAgICAgI2RlZmluZSBZRUxMT1cgNQogICAgICAgICAgICAjZGVmaW5lIEJJRyAxMjM0TEwKCiAgICAgICAgICAgIHJlc3VsdHMgaW46CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSBtb2R1bGVuYW1lLmdldF9ZRUxMT1coKTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IG1vZHVsZW5hbWUuZ2V0X0JJRygpOwoKICAgICAgICAgICAgRWFybGllciB2ZXJzaW9ucyBvZiB0aGUgSmF2YSBtb2R1bGUgaW5pdGlhbGlzZWQgdGhlIHZhbHVlIHVzaW5nIHRoZSBDIHZhbHVlOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gNTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEyMzRMTDsKCiAgICAgICAgICAgIFRoaXMgd29ya3MgaW4gbW9zdCBjYXNlcywgYnV0IHRoZSB2YWx1ZSBmb3IgQklHIHdvbid0IGNvbXBpbGUgYXMgMTIzNExMIGlzIG5vdAogICAgICAgICAgICB2YWxpZCBKYXZhIGNvZGUgYW5kIHRoaXMgaXMgb25lIG9mIHRoZSByZWFzb25zIHdoeSB0aGUgZGVmYXVsdCBpcyBub3cgdG8gZ2V0IHRoZSAKICAgICAgICAgICAgdmFsdWVzIHRocm91Z2ggYSBKTkkgY2FsbC4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgdGhlc2UgJ2NvbnN0YW50cycgY2Fubm90IGJlIHVzZWQgCiAgICAgICAgICAgIGluIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGUgJWphdmFjb25zdCBkaXJlY3RpdmUgYWxsb3dzIG9uZSB0byBzcGVjaWZ5IHRoZQogICAgICAgICAgICB3YXkgdGhlIGNvbnN0YW50IHZhbHVlIGlzIGluaXRpYWxpc2VkIGFuZCB3b3JrcyBsaWtlIG90aGVyICVmZWF0dXJlCiAgICAgICAgICAgIGRpcmVjdGl2ZXMsIGVnCgogICAgICAgICAgICAlamF2YWNvbnN0KDApOyAgICAgLy8gYWxsIGNvbnN0YW50cyBmcm9tIHRoaXMgcG9pbnQgb24gYXJlIGluaXRpYWxpc2VkIHVzaW5nIHRoZSBDIHZhbHVlCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQklHOyAvLyBqdXN0IEJJRyBpbml0aWFsaXNlZCB1c2luZyBKTkkgY2FsbCAobXVzdCBiZSBwYXJzZWQgYmVmb3JlIEJJRyBpcyBkZWZpbmVkKQoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICAqKiogSU1QT1JUQU5UIENIQU5HRVMgVE8gVEhFIFBZVEhPTiBNT0RVTEUgKioqCgogICAgICAgICAgICAoMSkgVGhlIFB5dGhvbiBtb2R1bGUgbm93IGVuYWJsZXMgc2hhZG93L3Byb3h5IGNsYXNzZXMgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHR3byBmaWxlcyBhcmUgYWx3YXlzIGNyZWF0ZWQgYnkgU1dJRy4gIEZvcgogICAgICAgICAgICBpbnN0YW5jZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICAgLy8gZmlsZTogZm9vLmkKICAgICAgICAgICAgICAgICAlbW9kdWxlIGZvbwogICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlbiBzd2lnIGdlbmVyYXRlcyB0d28gZmlsZXMgImZvb193cmFwLmMiIGFuZCAiZm9vLnB5Ii4KCiAgICAgICAgICAgICgyKSBUaGUgbmFtZSBvZiB0aGUgbG93LWxldmVsIEMgZXh0ZW5zaW9uIG1vZHVsZSBoYXMgYmVlbiBjaGFuZ2VkCiAgICAgICAgICAgIHRvIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUuICAgVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlCiAgICAgICAgICAgIHRvIGNvbXBpbGUgdGhlIG1vZHVsZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICQgY2MgLWMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvcHl0aG9uMi4yIGZvb193cmFwLmMKICAgICAgICAgICAgICAgICQgY2MgLXNoYXJlZCBmb29fd3JhcC5vICQoT0JKUykgLW8gX2Zvby5zbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgZXh0cmEgdW5kZXJzY29yZQoKICAgICAgICAgICAgVGhpcyBuYW1pbmcgc2NoZW1lIGlzIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBQeXRob24gbW9kdWxlcyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgZXh0ZW5zaW9uIGNvZGUuICBGb3IgaW5zdGFuY2UsIHRoZSBzb2NrZXQgbW9kdWxlIGNvbnNpc3RzCiAgICAgICAgICAgIG9mICJfc29ja2V0LnNvIiBhbmQgInNvY2tldC5weSIuICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLAogICAgICAgICAgICB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIHdhcyBuYW1lZCAiZm9vY21vZHVsZS5zbyIuCgogICAgICAgICAgICAoMykgQSBuZXcgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluc2VydCBQeXRob24gY29kZSBpbnRvCiAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIC5weSBmaWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXB5dGhvbmNvZGUgJXsKICAgICAgICAgICAgICAgIGRlZiBmb28oKToKICAgICAgICAgICAgICAgICAgICBwcmludCAiSGVsbG8gV29ybGQiCiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gY3JlYXRlIG1vZHVsZXMgYXMgYSBtaXggb2YgQyBhbmQgUHl0aG9uLgogICAgICAgICAgICAgUHl0aG9uIGNvZGUgaXMgc2VhbWxlc3NseSBhZGRlZCB0byB0aGUgbW9kdWxlLgoKICAgICAgICAgICAgKDQpIFRoZSAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZGVwcmVjYXRlZC4gIFRoaXMgaXMgdHVybmVkIG9uCiAgICAgICAgICAgIGJ5IGRlZmF1bHQuCgogICAgICAgICAgICAoNSkgVG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0cmEgcHl0aG9uIGZpbGUsIHVzZSB0aGUgIi1ub3Byb3h5IgogICAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIHdpbGwgbGlrZWx5IGJyZWFrIHRoZSBidWlsZCBlbnZpcm9ubWVudCBvZiBwcm9qZWN0cyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgc2hhZG93IGNsYXNzZXMuICAgVG8gZml4IHRoaXMsIHlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdG8KICAgICAgICAgICAgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgLnNvIGZpbGUuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKICAgICAgICAgICAgTWFrZWZpbGUgaW5mb3JtYXRpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IGV4YW1wbGVjbW9kdWxlLnNvCgogICAgICAgICAgICBKdXN0IGNoYW5nZSBpdCB0bzoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBfZXhhbXBsZS5zbwoKICAgICAgICAgICAgKioqIERPQ1VNRU5UQVRJT04gVVBEQVRFICoqKgogICAgICAgICAgICBUaGUgZmlsZSBEb2MvTWFudWFsL1B5dGhvbi5odG1sIGhhcyBiZWVuIHVwZGF0ZWQgdG8gZGVzY3JpYmUgdGhlc2UgY2hhbmdlcy4KCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1ub2V4dGVybiBvcHRpb24uICAgSWYgc3VwcGxpZWQsIFNXSUcgd2lsbCBub3QgZ2VuZXJhdGUKICAgICAgICAgICAgZXh0cmEgZXh0ZXJuIGRlY2xhcmF0aW9ucy4gIFRoaXMgaXMgc29tZXRpbWVzIGFuIGlzc3VlIG9uIAogICAgICAgICAgICBub24tdW5peCBwbGF0Zm9ybXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgd2FybmluZyBmb3IgaWdub3JlZCBmcmllbmQgZnVuY3Rpb25zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NDQ5OCBdIC1wcm94eSBhbmQgJWluY2x1ZGUgInBvaW50ZXIuaSIgY2xhc2guCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERhdmlkIENyZWFzeS4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzYxMDMgXSBnbG9iYWwgZGVzdHJ1Y3Rpb24gd2FybmluZyB3aXRoIHNoYWRvdy4KICAgICAgICAgICAgUGVybCBleHRlbnNpb25zIHNob3VsZCBubyBsb25nZXIgcmVwb3J0IHRoZSB3YXJuaW5nCgogICAgICAgICAgICAgICAiVXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZHVyaW5nIGdsb2JhbCBkZXN0cnVjdGlvbi4iCiAKICAgICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggInBlcmwgLXciLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJldHQgV2lsbGlhbXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluIEMrKyBtb2RlLCBTV0lHIG5vdyBhbHdheXMgZGVmaW5lcyBuYW1lc3BhY2Ugc3RkLiAgQnkgZGVmYXVsdCwKICAgICAgICAgICAgaXQncyBlbXB0eS4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBzaWxlbmNlIGVycm9ycyBmcm9tIHByb2dyYW1zCiAgICAgICAgICAgIHRoYXQgaW5jbHVkZSBzdGF0ZW1lbnRzIHN1Y2ggYXMgInVzaW5nIG5hbWVzcGFjZSBzdGQ7Ii4KICAgICAgICAgICAgVGhpcyBmaXhlcyBCdWcgWyA1ODQwMTcgXSB1c2luZyBuYW1lc3BhY2Ugc3RkIGdlbmVyYXRlcyBlcnJvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCgowNy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgbmV3IHdhcm5pbmcgbWVzc2FnZSBmb3IgJWFwcGx5LiAgSWYgeW91IHVzZSAlYXBwbHkgYnV0IG5vIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBkZWZpbmVkLCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIHNob3VsZCBoZWxwIHdpdGgKICAgICAgICAgICAgcHJvYmxlbXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICVhcHBseSBjaGFyICpPVVRQVVQgeyAuLi4gfTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucyBvZiBTV0lHLCB0aGlzIHNpbGVudGx5IGRpZCBub3RoaW5nLiAgTm93IHlvdSBnZXQgYW4gZXJyb3IgbGlrZSB0aGlzOgogIAogICAgICAgICAgICAgICAgICAgZmlsZTpsaW5lLiBXYXJuaW5nLiBDYW4ndCBhcHBseSAoY2hhciAqT1VUUFVUKS4gTm8gdHlwZW1hcHMgYXJlIGRlZmluZWQuCgowNy8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN0YXJ0ZWQgSmF2YSBwcmFnbWEgZGVwcmVjYXRpb24uIFJlcGxhY2VtZW50cyB1c2UgJXR5cGVtYXAgYmFzZWQgCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgYW5kIGVuYWJsZSBwcm94eSBjbGFzc2VzIGFuZCB0aGUgbmV3IHR5cGUgd3JhcHBlciBjbGFzc2VzIHRvIGJlIAogICAgICAgICAgICB0YWlsb3JlZCBpbiB2YXJpb3VzIHdheXMuIFRoZXNlIGFyZSB0aGUgbmV3IHR5cGVtYXBzOgogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UpICAgICAgICAgICAtIGJhc2UgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgLSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBKYXZhIGNsYXNzOiBkZWZhdWx0IGlzICJwdWJsaWMiCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSAgICAgICAgICAgLSBqYXZhIGNvZGUgaXMgY29waWVkIHZlcmJhdGltIHRvIHRoZSBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSAgICAgICAgLSBpbXBvcnQgc3RhdGVtZW50cyBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW50ZXJmYWNlcykgICAgIC0gaW50ZXJmYWNlcyAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgCiAgICAgICAgICAgIEFuZCB0aGVzZSBhcmUgdGhlICVwcmFnbWEgZGlyZWN0aXZlcyBiZWluZyBkZXByZWNhdGVkOgogICAgICAgICAgICBhbGxzaGFkb3diYXNlCiAgICAgICAgICAgIGFsbHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFsbHNoYWRvd2NvZGUKICAgICAgICAgICAgYWxsc2hhZG93aW1wb3J0CiAgICAgICAgICAgIGFsbHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICBzaGFkb3diYXNlCiAgICAgICAgICAgIHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIHNoYWRvd2NvZGUKICAgICAgICAgICAgc2hhZG93aW1wb3J0CiAgICAgICAgICAgIHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICAKICAgICAgICAgICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHRhcmdldCBhIHBhcnRpY3VsYXIgcHJveHkgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBGb28gImltcG9ydCBqYXZhLnV0aWwuKiI7CiAgICAgICAgICAgIG9yIGEgcGFydGljdWxhciB0eXBlIHdyYXBwZXIgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBkb3VibGUqICJpbXBvcnQgamF2YS5tYXRoLioiOwogICAgICAgICAgICBOb3RlIHRoYXQgJGphdmFjbGFzc25hbWUgaW4gdGhlc2UgdHlwZW1hcHMgYXJlIHN1YnN0aXR1dGVkIHdpdGggZWl0aGVyIHRoZSBwcm94eSAKICAgICAgICAgICAgY2xhc3NuYW1lIHdoZW4gdXNpbmcgcHJveHkgY2xhc3NlcyBvciB0aGUgU1dJR1RZUEUgY2xhc3MgbmFtZS4KCjA3LzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSmF2YSBtb2R1bGUgb3ZlcmhhdWwgdG8gaW1wbGVtZW50IHN0YXRpYyB0eXBlIGNoZWNraW5nIG9mIGFsbCAKICAgICAgICAgICAgdHlwZXMuIAogICAgICAgICAgICAKICAgICAgICAgICAgMSkgQ2hhbmdlcyB3aGVuIHVzaW5nIEphdmEgUHJveHkgY2xhc3NlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBQcmV2aW91c2x5IHdoZW4gd3JhcHBpbmcgZ2xvYmFsIGZ1bmN0aW9uczogCgogICAgICAgICAgICBjbGFzcyBTb21lQ2xhc3N7fTsKICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzKiBzKTsKICAgICAgICAgICAgU29tZUNsYXNzKiBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuYXRpdmUgbWV0aG9kIHByb3RvdHlwZXMgdXNlZCBhIGxvbmcgZm9yIHBvaW50ZXJzIGFuZCBsb29rZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBmb28obG9uZyBqYXJnMSk7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSBsb25nIGJhcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgdW5saWtlIG1lbWJlciBmdW5jdGlvbnMgb2YgYSBDKysgY2xhc3MgdGhlcmUgd2FzIG5vIHdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgY2FsbHMgCiAgICAgICAgICAgIHRvIG1ha2UgdGhlIHVzZSBvZiB0aGVtIG1vcmUgdXNlciBmcmllbmRseS4gVGhleSB3b3VsZCBiZSB1c2VkIGZyb20gSmF2YSBsaWtlIHRoaXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG5ldyBTb21lQ2xhc3MobW9kdWxlbmFtZS5iYXIoKSwgZmFsc2UpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzLmdldENQdHJTb21lQ2xhc3MoKSk7CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0LCBidXQgdGhlbiBpdCB3b3VsZCBub3QgaGF2ZSAKICAgICAgICAgICAgYmVlbiBwb3NzaWJsZSB0byBjYWxsIGFueSBwcm94eSBtZW1iZXIgZnVuY3Rpb25zIGluIFNvbWVDbGFzczoKCiAgICAgICAgICAgIGxvbmcgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgTm93IHdyYXBwZXIgZnVuY3Rpb25zIGFyZSBnZW5lcmF0ZWQ6CgogICAgICAgICAgICBwdWJsaWMgY2xhc3MgbW9kdWxlbmFtZSAgewogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvbyhTb21lQ2xhc3MgcykgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFNvbWVDbGFzcyBiYXIoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5hdGl2ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBXaGljaCBtZWFucyB0aGVzZSBmdW5jdGlvbnMgY2FuIG5vdyBiZSB1c2VkIG1vcmUgbmF0dXJhbGx5IHdpdGggcHJveHkgY2xhc3NlczoKCiAgICAgICAgICAgIFNvbWVDbGFzcyBzID0gbW9kdWxlbmFtZS5iYXIoKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocyk7CgogICAgICAgICAgICAyKSBDaGFuZ2VzIHdoZW4gbm90IHVzaW5nIEphdmEgUHJveHkgY2xhc3NlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgVGhlIHNvIGNhbGxlZCBsb3ctbGV2ZWwgaW50ZXJmYWNlIHdhcyByYXRoZXIgbG93LWxldmVsIGluZGVlZC4gVGhlIAogICAgICAgICAgICBuZXcgc3RhdGljIHR5cGUgY2hlY2tpbmcgaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgbGVzcyBzbyBidXQgaXQgcmVtYWlucyBhCiAgICAgICAgICAgIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRvIHRoZSBDL0MrKyB3b3JsZC4gUHJveHkgY2xhc3NlcyBhcmUgdGhlIG9idmlvdXMgd2F5IHRvIHVzZQogICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBjb2RlLCBidXQgZm9yIHRob3NlIHdobyB3YW50IGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgYWxsIG5vbi1wcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgbm93IGhhdmUgYSBzaW1wbGUgSmF2YSBjbGFzcyB3cmFwcGVyIGFyb3VuZCB0aGUgQy9DKysgdHlwZS4gUG9pbnRlcnMgYW5kCiAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlIHR5cGVzIGFyZSBhbHNvIHdyYXBwZWQgYnkgdHlwZSB3cmFwcGVyIGNsYXNzZXMuIFRoZSB0eXBlCiAgICAgICAgICAgIHdyYXBwZXIgY2xhc3NuYW1lcyBhcmUgYmFzZWQgb24gdGhlIFNXSUcgZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgb3RoZXIgbGFuZ3VhZ2UgCiAgICAgICAgICAgIG1vZHVsZXMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgQy9DKysgdHlwZSAgICAgIEphdmEgdHlwZSB3cmFwcGVyIGNsYXNzIG5hbWUKICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgaW50KiAgICAgICAgICAgIFNXSUdUWVBFX3BfaW50CiAgICAgICAgICAgIGRvdWJsZSoqICAgICAgICBTV0lHVFlQRV9wX3BfZG91YmxlCiAgICAgICAgICAgIFNvbWVDbGFzcyogICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwogICAgICAgICAgICBTb21lQ2xhc3MmICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCgogICAgICAgICAgICBOb3RlIHRoYXQgZXZlcnl0aGluZyB3cmFwcGVkIGJ5IFNXSUcgaXMgYWNjZXNzZWQgdmlhIGEgcG9pbnRlciBldmVuIHdoZW4gd3JhcHBpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IHBhc3MgYnkgdmFsdWUgb3IgcmVmZXJlbmNlLiBTbyB0aGUgcHJldmlvdXMgZXhhbXBsZSB3b3VsZCBub3cgYmUgCiAgICAgICAgICAgIHVzZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MgcyA9IGV4YW1wbGUuYmFyKCk7CiAgICAgICAgICAgIGV4YW1wbGUuZm9vKHMpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHR5cGVkZWZzIHRoYXQgU1dJRyBrbm93cyBhYm91dCBhcmUgcmVzb2x2ZWQsIHNvIHRoYXQgaWYgb25lIGhhcyAKCiAgICAgICAgICAgIGNsYXNzIEZvb3t9OwogICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CgogICAgICAgICAgICB0aGVuIGFueSB1c2Ugb2YgQmFyIHdpbGwgcmVxdWlyZSBvbmUgdG8gdXNlIFNXSUdUWVBFX3BfRm9vOwoKICAgICAgICAgICAgU29tZSBjb25zaWRlcmF0aW9uczoKICAgICAgICAgICAgTWFrZSBzdXJlIHlvdSBtYWtlIGEgZmlybSBkZWNpc2lvbiB0byB1c2UgZWl0aGVyIHByb3h5IGNsYXNzZXMgb3IgdGhlIGZ1bmN0aW9uYWwgCiAgICAgICAgICAgIGludGVyZmFjZSBlYXJseSBvbiBhcyB0aGUgY2xhc3NuYW1lcyBhcmUgZGlmZmVyZW50LgoKICAgICAgICAgICAgMykgUG9pbnRlcnMgYW5kIG5vbi1wYXJzZWQgdHlwZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgU29tZXRpbWVzIFNXSUcgY2Fubm90IGdlbmVyYXRlIGEgcHJveHkgY2xhc3MuIFRoaXMgb2NjdXJzIHdoZW4gdGhlIGRlZmluaXRpb24gb2YgCiAgICAgICAgICAgIGEgdHlwZSBpcyBub3QgcGFyc2VkIGJ5IFNXSUcsIGJ1dCBpcyB0aGVuIHVzZWQgYXMgYSB2YXJpYWJsZSBvciBhIHBhcmFtZXRlci4gCiAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgdm9pZCBmb28oU25henp5IHNkcyk7CgogICAgICAgICAgICBJZiBTV0lHIGhhcyBub3QgcGFyc2VkIFNuYXp6eSBpdCBoYW5kbGVzIGl0IHNpbXBseSBhcyBhIHBvaW50ZXIgdG8gYSBTbmF6enkuCiAgICAgICAgICAgIFRoZSBKYXZhIG1vZHVsZSBnaXZlcyBpdCBhIHR5cGUgd3JhcHBlciBjbGFzcyBhcm91bmQgdGhlIHBvaW50ZXIgYW5kIGNhbGxzIGl0IAogICAgICAgICAgICBTV0lHVFlQRV9wX1NuYXp6eS4gSW4gb3RoZXIgd29yZHMgaXQgaGFuZGxlcyBpdCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdHlwZXMgYXJlIAogICAgICAgICAgICBoYW5kbGVkIGluIHRoZSBsb3ctbGV2ZWwgZnVuY3Rpb25hbCBpbnRlcmZhY2UuIFRoaXMgYXBwcm9hY2ggaXMgdXNlZCBmb3IgYWxsIAogICAgICAgICAgICBub24tcHJveHkgY2xhc3NlcywgZWcgYWxsIHBvaW50ZXIgdG8gcG9pbnRlcnMgYW5kIHBvaW50ZXJzIHRvIHByaW1pdGl2ZSB0eXBlcy4KCiAgICAgICAgICAgIDQpIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBpZiB5b3UgaGF2ZSBiZWVuIHVzaW5nIHByb3h5IGNsYXNzZXMgYW5kIAogICAgICAgICAgICBubyBnbG9iYWwgdmFyaWFibGVzL2Z1bmN0aW9ucy4gT3RoZXJ3aXNlIHNvbWUgY2hhbmdlcyB3aWxsIGhhdmUgdG8gYmUgbWFkZS4gCiAgICAgICAgICAgIFRoZSBuYXRpdmUgbWV0aG9kcyBzdGlsbCBleGlzdCBidXQgdGhleSBhcmUgbm93IGluIGEgSk5JIGNsYXNzLCB3aGljaCBpcyBjYWxsZWQgCiAgICAgICAgICAgIG1vZHVsZW5hbWVKTkkuIEFzIHRoaXMgY2xhc3MgaXMgcmVhbGx5IHBhcnQgb2YgdGhlIGludGVybmFsIHdvcmtpbmdzLAogICAgICAgICAgICBpdCBzaG91bGQgbm90IGJlIHJlcXVpcmVkIHNvIHRoZSBjbGFzcyBoYXMgYmVjb21lIHByb3RlY3RlZC4gU29tZSBwcmFnbWFzL2RpcmVjdGl2ZXMKICAgICAgICAgICAgd2lsbCBob3BlZnVsbHkgYmUgYWRkZWQgdG8gaGVscCB3aXRoIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCB3cmFwcGluZyBvZiB1bmluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgcmV0dXJuZWQgYnkKICAgICAgICAgICAgdmFsdWUuICBKdXN0IHRvIGJlIHNhZmUsIHRoZXkgYXJlIG5vdyB3cmFwcGVkIGJ5IFN3aWdWYWx1ZVdyYXBwZXI8PgogICAgICAgICAgICBqdXN0IGluIGNhc2UgdGhleSBkb24ndCBkZWZpbmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgVGhpcwogICAgICAgICAgICB3b3VsZCBiZSB1c2VkIGlmIHlvdSBoYWQgY29kZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgRm9vPGludD4gYmxhaCgpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgIG1vcmVibGFoKEZvbzxpbnQ+IHgpOwoKICAgICAgICAgICAgYnV0IHlvdSBkaWRuJ3QgaW5zdGFudGlhdGUgRm9vPGludD4gdXNpbmcgJXRlbXBsYXRlLiAgCiAgICAgICAgICAgIFdlIHNob3VsZCBwcm9iYWJseSBhZGQgYSB3YXJuaW5nIGZvciB0aGlzLgoKMDcvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhbiBlcnJvciBjaGVjayB0byBkZXRlY3Qgc2hhZG93ZWQgdGVtcGxhdGUgcGFyYW1hdGVycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBUOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGFuIGVycm9yLCBub3QgYSB3YXJuaW5nLiAgVGhpcyB3YXJuaW5nIGlzCiAgICAgICAgICAgIGFsc28gbmVlZGVkIHRvIGZpeCBzb21lIHJhdGhlciBpbnNpZGlvdXMgcHJvYmxlbXMgbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgVCB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgIGJsYWg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIFQgVHJhaXRzOyAgICAvLyBXaGljaCBUIGlzIHRoaXM/Pz8/CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBUIHNoYWRvd3MgdGhlIG91dGVyCiAgICAgICAgICAgIHN0cnVjdHVyZSAod2hpY2ggaXMgd2hhdCB5b3Ugd2FudCkuCgowNy8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEltcHJvdmVkIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyB3aXRoIGludGVnZXIgYXJndW1lbnRzLiAgU1dJRyBpcwogICAgICAgICAgICBtdWNoIG1vcmUgYXdhcmUgb2Ygc2l0dWF0aW9ucyBzdWNoIGFzIHRoaXM6CgogICAgICAgICAgICAgICAgY29uc3QgaW50IFNpemUgPSAxMDA7CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvbzEwMCkgRm9vPDEwMD47CiAgICAgICAgICAgICAgICB2b2lkIGJhcihGb288U2l6ZT4gKngpOyAgIC8vIEtub3dzIHRoYXQgRm9vPFNpemU+IGlzIHRoZSBzYW1lIGFzIEZvbzwxMDA+OwoKMDcvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCAlZmVhdHVyZS8laWdub3JlLyVyZW5hbWUgYW5kIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpCYXIKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNy8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgY29uc3RydWN0b3JzIHRoYXQgdHJ5IHRvIGNhdGNoCiAgICAgICAgICAgIGV4Y2VwdGlvbnMgaW4gaW5pdGlhbGl6ZXJzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIEJhciBiOwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBGb28oaW50IHgpIHRyeSAKICAgICAgICAgICAgICAgICAgICAgOiBiKHgpIHsgLi4uIH0KICAgICAgICAgICAgICAgICBjYXRjaChpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXJzLiAgSG93ZXZlciwgdGhlIHRyeSBhbmQgY2F0Y2gKICAgICAgICAgICAgcGFydHMgb2YgdGhlIGRlY2xhcmF0aW9uIGFyZSBpZ25vcmVkLiAgU2VlIFN0cm91c3RydXAsIDNyZCBFZCwgc2VjdGlvbiAKICAgICAgICAgICAgMTQuNC42LjEgZm9yIGRldGFpbHMuCiAgICAgICAgICAgICAgICAgICAKMDcvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgaW4gdGVtcGxhdGUgc3ltYm9sIHRhYmxlIG1hbmFnZW1lbnQuICBUaGlzIGZpeGVzCiAgICAgICAgICAgIHR3byBidWdzLiAgRmlyc3QsIG1peGluZyBhYnN0cmFjdCBtZXRob2RzLCB0ZW1wbGF0ZXMsIGFuZCAKICAgICAgICAgICAgaW5oZXJpdGFuY2Ugbm8gbG9uZ2VyIGdlbmVyYXRlcyBhIGZhaWxlZCBhc3NlcnRpb24uCiAKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBPFQ+CiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgJXRlbXBsYXRlKEFfaW50KSBBPGludD47CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShCX2ludCkgQjxpbnQ+OwoKICAgICAgICAgICAgVGhpcyBmaXggYWxzbyBmaXhlcyBhIHN1YnRsZSBwcm9ibGVtIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kCiAgICAgICAgICAgIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEM+CiAgICAgICAgICAgICAgIHN0cnVjdCBCIHsKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdHlwZTsKICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUgbmluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPigtMSk7CiAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhzaXplX3R5cGUgaW5kZXggPSBuaW5kZXgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQnVncyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKCjA3LzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBDaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBTV0lHX0NvbnZlcnRQdHIoKSBmdW5jdGlvbgoJICAgIGZvciB0aGUgU1dJRy9SdWJ5IHJ1bnRpbWUgc3VwcG9ydCBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhlCgkgICAgUHl0aG9uIHZlcnNpb24uIElmIHRoZSBsYXN0IGFyZ3VtZW50IChmbGFncykgaXMgbm9uLXplcm8sCgkgICAgU1dJR19Db252ZXJ0UHRyKCkgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gZm9yIHR5cGUgbWlzbWF0Y2hlcwoJICAgIGFzIGJlZm9yZS4gSWYgZmxhZ3MgaXMgemVybywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAtMSBmb3IKCSAgICB0eXBlIG1pc21hdGNoZXMgd2l0aG91dCByYWlzaW5nIGFuIGV4Y2VwdGlvbi4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUlVCWSBNT0RVTEUgKioqCgowNy8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE92ZXJsb2FkZWQgZnVuY3Rpb25zL21ldGhvZHMvY29uc3RydWN0b3JzIG5vdyB3b3JrIGluIG1hbnkgbGFuZ3VhZ2UKICAgICAgICAgICAgbW9kdWxlcy4gIFRoZSBzdXBwb3J0IGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQtLWp1c3QgY2FsbCB0aGUKICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsbHkgYW5kIFNXSUcgd2lsbCBkaXNwYXRjaCB0byB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICAgVGhlcmUgYXJlIGEgdmFyaWV0eSBvZiBpc3N1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMuICBQbGVhc2UgcmVmZXIKICAgICAgICAgICAgdG8gdGhlIG92ZXJsb2FkaW5nIHNlY3Rpb24gb2YgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sIGZvciBkZXRhaWxzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNy8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggbmFtZXNwYWNlcywgZW51bXMsIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIG5hbWVzcGFjZSBoZWxsbyB7CiAgICAgICAgICAgICAgICAgIGVudW0gSGVsbG8geyBIaSwgSG9sYSB9OwogCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxIZWxsbyBIPgogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIHZhbHVlX3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgICAgdHJhaXRzPEhpPjo6dmFsdWVfdHlwZSBzYXlfaGkoKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzPEhpPjo6dmFsdWVfdHlwZSgxKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgU1dJRyB3YXNuJ3QgZ2VuZXJhdGluZyB3cmFwcGVycyB0aGF0IHByb3Blcmx5IHF1YWxpZmllZCAKICAgICAgICAgICAgdHJhaXRzPEhpPi4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuICAgICAgICAgCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIGFycmF5IHZhcmlhYmxlIHR5cGVtYXBzIGZvciBUY2wgbW9kdWxlLiAgIElmIHlvdSBoYXZlIGEKICAgICAgICAgICAgdmFyaWFibGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGludCBmb29bMTBdOwoKICAgICAgICAgICAgdGhlbiBhIHNldCBmdW5jdGlvbiBsaWtlIHRoaXMgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vX3NldChpbnQgKngpIHsKICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoZm9vLHgsMTAqc2l6ZW9mKGludCkpOwogICAgICAgICAgICAgICAgfQoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgJWZyYWdtZW50IGRpcmVjdGl2ZS4gICBXaGVuIHdyaXRpbmcgdHlwZW1hcHMsIGl0IGNhbiBiZSBlYXN5IHRvCiAgICAgICAgICAgIGdldCBjYXJyaWVkIGF3YXkgYW5kIHdyaXRlIGEgbG90IG9mIGNvZGUuICBIb3dldmVyLCBkb2luZyBzbyBjYXVzZXMKICAgICAgICAgICAgdHJlbWVuZG91cyBjb2RlIGJsb2F0LiAgIEEgY29tbW9uIHdheSB0byBzb2x2ZSB0aGlzIGlzIHRvIHdyaXRlIAogICAgICAgICAgICBoZWxwZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgc29tZV9oZWxwZXJfZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSB7CiAgICAgICAgICAgICAgICAgICBzb21lX2hlbHBlcl9mdW5jdGlvbiguLi4pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIG9ubHkgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0aGUgd3JhcHBlciBmaWxlIGdldHMgcG9sbHV0ZWQKICAgICAgICAgICAgd2l0aCBoZWxwZXIgZnVuY3Rpb25zIGV2ZW4gaWYgdGhleSBhcmVuJ3QgdXNlZC4gICAgVG8gZml4IHRoaXMsCiAgICAgICAgICAgIGEgbmV3IGZyYWdtZW50IGRpcmVjdGl2ZSBpcyBhdmFpbGFibGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIChjb3JyZWN0ZWQgdHlwbyBpbiBsaW5lIGJlbG93IC0gMDYvMjYvMjAwOCkKICAgICAgICAgICAgICAgJWZyYWdtZW50KCJ0eXBlX2hlYWRlciIsImhlYWRlciIpICV7CiAgICAgICAgICAgICAgICAgIHZvaWQgc29tZV9oZWxwZXJfZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIGZyYWdtZW50PSJ0eXBlX2hlYWRlciIpIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgY29kZSBmcmFnbWVudCBpcyBvbmx5IGVtaXR0ZWQgaWYgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYWN0dWFsbHkgdXNlZC4gICBBIHNpbWlsYXIgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCBmb3IgZGVjbGFyYXRpb24KICAgICAgICAgICAgYW5ub3RhdGlvbiBhbmQgdGhlICVmZWF0dXJlIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImZyYWdtZW50IiwidHlwZV9oZWFkZXIiKSAgU29tZURlY2xhcmF0aW9uOwoKICAgICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvICVmcmFnbWVudCBpcyB0aGUgZnJhZ21lbnQgbmFtZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQKICAgICAgICAgICAgaXMgdGhlIGZpbGUgc2VjdGlvbiB3aGVyZSB0aGUgZnJhZ21lbnQgc2hvdWxkIGJlIGVtaXR0ZWQuICAKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGRpcmVjdGl2ZSBpcyBmb3Igd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICAgIGFuZCBhZHZhbmNlZCB1c2VycyB3YW50aW5nIHRvIHN0cmVhbWxpbmUgdHlwZW1hcCBjb2RlLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VwcGxpZWQgbWVtYmVyaW4gdHlwZW1hcHMgZm9yIGFsbCBhcnJheXMgaW4gYW4gYXR0ZW1wdCB0byBlbGltaW5hdGUKICAgICAgICAgICAgY29uZnVzaW9uIGFib3V0IHRoZWlyIHVzZS4KCjA2LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHNtYXJ0LXBvaW50ZXJzLiAgV2hlbiBhIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgb3BlcmF0b3ItPigpIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIEJhciAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbG9jYXRlcyBjbGFzcyBCYXIgYW5kIHRyaWVzIHRvIHdyYXAgaXRzIG1lbWJlciB2YXJpYWJsZXMgYW5kCiAgICAgICAgICAgIG1ldGhvZHMgYXMgcGFydCBvZiBGb28uICBGb3IgZXhhbXBsZSwgaWYgQmFyIHdhcyBkZWZpbmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgWW91IGNvdWxkIGRvIHRoaXMgKGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpOgoKICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICBmLnggPSA0ICAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OngKICAgICAgICAgICAgICBmLnNwYW0oKSAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OnNwYW0KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gZW11bGF0ZSB0aGUgYmVoYXZpb3Igb2YgQysrCiAgICAgICAgICAgIHNtYXJ0LXBvaW50ZXJzLS0td2hpY2ggYWxsb3cgYXR0cmlidXRlcyB0byBhY2Nlc3NlZCB0cmFuc3BhcmVudGx5CiAgICAgICAgICAgIHRocm91Z2ggb3BlcmF0b3ItPi4KCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYXV0b21hdGljYWxseSBpbiBTV0lHLS0tbm8gc3BlY2lhbCBkaXJlY3RpdmVzCiAgICAgICAgICAgIGFyZSBuZWVkZWQuICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLiAgVXNlICVpZ25vcmUgdG8gaWdub3JlIAogICAgICAgICAgICBvcGVyYXRvci0+LgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNi8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVleGNlcHQgZGlyZWN0aXZlLiAgICVleGNlcHRpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KCjA2LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2xlYW51cCBvZiB0aGUgbW9kdWxlcyBkaXJlY3RvcnkuICBFbGltaW5hdGVkIG1vc3QKICAgICAgICAgICAgaGVhZGVyIGZpbGVzLCBjb25zb2xpZGF0ZWQgbW9kdWxlIGNvZGUgaW50byBzaW5nbGUgZmlsZXMuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJld29ya2VkIHRoZSBpbnN0YW50aWF0aW9uIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBBbGwgbGFuZ3VhZ2UKICAgICAgICAgICAgbW9kdWxlcyBtdXN0IG5vdyBkZWZpbmUgYSBmYWN0b3J5IGZ1bmN0aW9uIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICoKICAgICAgICAgICAgICAgIHN3aWdfcHl0aG9uKHZvaWQpIHsKICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUFlUSE9OKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZW4gcGxhY2VkIGluIGEgdGFibGUgYW5kIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgICBhIGNvbW1hbmQgbGluZSBvcHRpb24gaW4gc3dpZ21haW4uY3h4LiAgCgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGhhcyBhIG51bWJlciBvZiBiZW5lZml0cy4gIEl0IGRlY291cGxlcyB0aGUgCiAgICAgICAgICAgIFNXSUcgbWFpbiBwcm9ncmFtIGZyb20gaGF2aW5nIHRvIGtub3cgYWJvdXQgdGhlIGNsYXNzCiAgICAgICAgICAgIGRlZmluaXRpb25zIGZvciBlYWNoIG1vZHVsZS4gIEFsc28sIGJ5IHVzaW5nIGEgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbiwgaXQgd2lsbCBiZSBlYXNpZXIgdG8gaW1wbGVtZW50IGR5bmFtaWMgbG9hZGluZwogICAgICAgICAgICBvZiBtb2R1bGVzIChzaW1wbHkgbG9hZCB0aGUgZmlsZSBhbmQgaW52b2tlIHRoZSBmYWN0b3J5CiAgICAgICAgICAgIGZ1bmN0aW9uKS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIGZvciByZWZlcmVuY2UgY29udmVyc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyAmKCk7CgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3Igb3BlcmF0b3IgbmV3W10gYW5kIG9wZXJhdG9yIGRlbGV0ZVtdLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gcHJvYmxlbSBmb3IgY29uc3RhbnRzIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICBpbnZvbHZpbmcgdGVtcGxhdGVzLgoKMDYvMTkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIGEgYnVnIGZvciB0aGUgJy1mZWF0dXJlJyBjb21tYW5kIGxpbmUgYXJndW1lbnQ7CiAgICAgICAgICAgIHRoYXQgc2V0dGluZyB3YXMgZWZmZWN0aXZlbHkgYmVpbmcgaWdub3JlZCBhbmQgc28gdGhlIGZlYXR1cmUKICAgICAgICAgICAgbmFtZSB3YXMgYWx3YXlzIHNldCBlcXVhbCB0byB0aGUgbW9kdWxlIG5hbWUuCgowNi8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW1zIHdpdGggc3RhdGljIG1lbWJlcnMgYW5kIGVudW1zIGluIHRlbXBsYXRlcy4KClZlcnNpb24gMS4zLjEzIChKdW5lIDE3LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBfX0ZJTEVfXyBleHBhbnNpb24gaW4gdGhlIHByZXByb2Nlc3Nvci4gICBPbiBXaW5kb3dzLAogICAgICAgICAgICB0aGUgYmFja3NsYXNoIChcKSBpcyBub3cgY29udmVydGVkIHRvIChcXCkgaW4gdGhlIHN0cmluZyBsaXRlcmFsCiAgICAgICAgICAgIHVzZWQgZm9yIF9fRklMRV9fLiAgUmVwb3J0ZWQgYnkgU3RldmUgR2xhc2VyLgoKMDYvMTQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgJ25hbWUgcHJpdmF0ZSBpbiB0aGlzIGNvbnRleHQnLiAgVGhlCiAgICAgICAgICAgIHdhcm5pbmcgaXMgb25seSBnZW5lcmF0ZWQgZm9yIHB1YmxpYyBtZXRob2RzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgU2NvdHQgTWljaGVsLgogCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gCiAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VzLiAgIFdoZW4gU1dJRyBleHBhbmRzIGEgdGVtcGxhdGUsIGl0IGRvZXMKICAgICAgICAgICAgc28gd2l0aCBmdWxseSByZXNvbHZlZCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGZvbyB7IH07CiAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBEb3VibGU7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vX2QpIGZvbzxEb3VibGU+OwoKICAgICAgICAgICAgdGhlbiwgaXQgaXMgaGFuZGxlZCBhcyBmb288ZG91YmxlPiBpbiB0aGUgdHlwZXN5c3RlbS4KICAgICAgICAgICAgVGhpcyBmaXhlcyBhIG51bWJlciBvZiBzdWJ0bGUgcHJvYmxlbXMgd2l0aCBpbmhlcml0YW5jZQogICAgICAgICAgICBhbmQgdGVtcGxhdGVzLgoKMDYvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgYm9vbCB0eXBlbWFwcyBmb3IgSU5QVVQsIE9VVFBVVCBhbmQKCSAgICBJTk9VVCBpbiBMaWIvcnVieS90eXBlbWFwcy5pLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGEgY291cGxlIG9mIGJyb2tlbiBwcmFnbWFzLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3IgdW5uZWNlc3NhcnkgY2FzdCB3aGVuIHdyYXBwaW5nIGdsb2JhbCB2YXJpYWJsZSB3aGVyZSAKICAgICAgICAgICAgdGhlIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHIC0gSmF2YSB2YXJpYWJsZXMgZXhhbXBsZSAKICAgICAgICAgICAgZmFpbHVyZSBhcyByZXBvcnRlZCBieSBMYXJyeSBWaXJkZW4uCgowNi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICV0ZW1wbGF0ZSB0byBhbGxvdyBmb3IgZW1wdHkgaW5zdGFudGlhdGlvbnMuCgogICAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBmb288aW50LGludD47CgogICAgICAgICAgICBUaGlzIHJlZ2lzdGVycyBmb288aW50LGludD4gd2l0aCB0aGUgdHlwZSBzeXN0ZW0sIGJ1dAogICAgICAgICAgICBkb2Vzbid0IHdyYXAgaXQgKHNhbWUgYXMgJWlnbm9yZSkuICAgVGhpcyBtYXkgb25seSBiZSBhCiAgICAgICAgICAgIHRlbXBvcmFyeSBtZWFzdXJlLiAgIFNXSUcgbWlnaHQgYmUgYWJsZSB0byBhdXRvbWF0aWNhbGx5CiAgICAgICAgICAgIGluc3RhbnRpYXRlIHRlbXBsYXRlcyBpbiBjZXJ0YWluIGNhc2VzLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBmdW5jdGlvbiBwcm90b3R5cGUgcHJvYmxlbXMgd2l0aCBUY2wgOC40CgowNi8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0ZW1wbGF0ZXMgYW5kIGxvY2F0aW9uIG9mIGJhc2UgY2xhc3Nlcy4gIAogICAgICAgICAgICBUaGlzIG9uZSBpcyBhIGxpdHRsZSBtaW5kLWJlbmRpbmcsIGJ1dCBoZXJlIGlzIGFuIGV4YW1wbGUKICAgICAgICAgICAgdGhhdCBpbGx1c3RyYXRlczoKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGUsIGNsYXNzIFJlc1R5cGU+CiAgICAgICAgICAgICBzdHJ1Y3QgdHJhaXRzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgQXJnVHlwZSBhcmdfdHlwZTsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBSZXNUeXBlIHJlc190eXBlOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGUsIGNsYXNzIFJlc1R5cGU+CiAgICAgICAgICAgICBzdHJ1Y3QgRnVuY3Rpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBRiwgY2xhc3MgQUc+CiAgICAgICAgICAgICBzdHJ1Y3QgQ2xhc3MgOiBGdW5jdGlvbjx0eXBlbmFtZSB0cmFpdHM8QUYsIEFHPjo6YXJnX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8QUYsIEFHPjo6cmVzX3R5cGU+CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICV0ZW1wbGF0ZSh0cmFpdHNfZGQpIHRyYWl0cyA8ZG91YmxlLCBkb3VibGU+OwogICAgICAgICAgICAgJXRlbXBsYXRlKEZ1bmN0aW9uX2RkKSBGdW5jdGlvbiA8ZG91YmxlLCBkb3VibGU+OwogICAgICAgICAgICAgJXRlbXBsYXRlKENsYXNzX2RkKSBDbGFzcyA8ZG91YmxlLCBkb3VibGU+OwoKCiAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIGJhc2UgY2xhc3Mgb2YgJ0NsYXNzJyBpcyBkZXRlcm1pbmVkIGZyb20KICAgICAgICAgICAgdGhlIEZ1bmN0aW9uIHRlbXBsYXRlLCBidXQgdGhlIHR5cGVzIGFyZSBvYnRhaW5lZCB0aHJvdWdoIHR5cGVkZWZzLgogICAgICAgICAgICBCZWNhdXNlIG9mIHRoaXMsIFNXSUcgY291bGQgbm90IGxvY2F0ZSB0aGUgd3JhcHBlZCBiYXNlIGNsYXNzCiAgICAgICAgICAgIChGdW5jdGlvbjxkb3VibGUsZG91YmxlPikuICAgU2hvdWxkIGJlIGZpeGVkIGluIDEuMy4xMyBldmVuCiAgICAgICAgICAgIHRob3VnaCBJIGNhbiB0aGluayBvZiBhIG1pbGxpb24gb3RoZXIgdGhpbmdzIHRoYXQgbWlnaHQKICAgICAgICAgICAgYWxzbyBiZSBicm9rZW4uCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnZlcnNpb24gb3BlcmF0b3JzLiAgSWYgeW91IGhhZCBhbgogICAgICAgICAgICBvcGVyYXRvciBsaWtlIHRoaXMsCgogICAgICAgICAgICAgICAgICBvcGVyYXRvciBkb3VibGUoKSBjb25zdDsKCiAgICAgICAgICAgIFNXSUcgd2FzIG9tbWl0dGluZyB0aGUgImNvbnN0IiBxdWFsaWZpZXIuICBUaGlzIGFmZmVjdGVkCiAgICAgICAgICAgICVyZW5hbWUgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICBSZXBvcnRlZCBieSBaaG9uZyBSZW4uCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIExlc3NlbmVkIHRoZSBzdHJpY3RuZXNzIG9mIGFic3RyYWN0IGNsYXNzIGNoZWNraW5nLiAgSWYKICAgICAgICAgICAgeW91IGhhdmUgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IG1ldGhvZCgpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgIFNXSUcgd2lsbCBnbyBhaGVhZCBhbmQgZ2VuZXJhdGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcnMKICAgICAgICAgICAgIGZvciBCYXIuICBIb3dldmVyLCBpdCB3aWxsIGFsc28gZ2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UgCiAgICAgICAgICAgICB0aGF0ICJCYXIiIG1pZ2h0IGJlIGFic3RyYWN0IChzaW5jZSBtZXRob2QoKSBpc24ndCBkZWZpbmVkKS4KICAgICAgICAgICAgIEluIFNXSUctMS4zLjEyLCBTV0lHIHJlZnVzZWQgdG8gZ2VuZXJhdGUgYSBjb25zdHJ1Y3RvciBhdCBhbGwuCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byAldGVtcGxhdGUgZGlyZWN0aXZlLiAgSWYgeW91IHNwZWNpZnkgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmkpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBJdCBpcyAqZXhhY3RseSogdGhlIHNhbWUgYXMgdGhpczoKIAogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFNXSUctMS4zLjEyIHRyaWVkIHRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBvdXRzaWRlIG9mIHRoZSBuYW1lc3BhY2UKICAgICAgICAgICAgdXNpbmcgc29tZSB0cmljay4gIEhvd2V2ZXIsIHRoaXMgd2FzIGV4dHJlbWVseSBwcm9ibGVtYXRpYyBhbmQgZnVsbAogICAgICAgICAgICBob2xlcy4gICBUaGlzIHZlcnNpb24gaXMgc2FmZXIuCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIHNjb3BlIHF1YWxpZmljYXRpb24gYW5kIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBBPEI6OkM+OjpERAoKICAgICAgICAgICAgQmVmb3JlLCB0aGlzIHdhcyBzZXBhcmF0ZWQgYXMgc2NvcGVzIEE8QiwgQz4sIGFuZCBERC4gIEZpeGVkIG5vdy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWxsb3cgdGhlIGZvbGxvd2luZyBzeW50YXg6IAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgY2xhc3MgQSB7IH07CiAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQSB7IC4uLiB9OwoKICAgICAgICAgICAgQSBiYXNlIGNsYXNzIHdpdGhvdXQgYSBzcGVjaWZpZXIgaXMgYXNzdW1lZCB0byBiZSBwdWJsaWMgZm9yIGEgc3RydWN0LgogCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIHdpdGggdGVtcGxhdGUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cy4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBwcm9ibGVtcyB3aXRoICVyZW5hbWUgZGlyZWN0aXZlIGFuZCB0ZW1wbGF0ZQogICAgICAgICAgICBleHBhbnNpb24uCgogICAgICAgICAgICBDb2RlIGxpa2UgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWgpIGZvbzxkb3VibGU+OjptZXRob2Q7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZCgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgJXRlbXBsYXRlKHdoYXRldmVyKSBmb288ZG91YmxlPjsKCjA2LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVzb2x2ZWQgc29tZSB0cmlja3kgaXNzdWVzIG9mIG11bHRpLXBhc3MgY29tcGlsYXRpb24gYW5kIAogICAgICAgICAgICBhbmQgaW5oZXJpdGFuY2UuICBUaGUgZm9sbG93aW5nIHNpdHVhdGlvbiBub3cgZ2VuZXJhdGVzCiAgICAgICAgICAgIGFuIGVycm9yOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgZ2VuZXJhdGVzIGEgd2FybmluZyBhYm91dCBpbmNvbXBsZXRlIGNsYXNzZXMuCgogICAgICAgICAgICAgICAgICBjbGFzcyBCYXI7CiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgYW4gdW5kZWZpbmVkIGNsYXNzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7IH07ICAvLyBCYXIgdW5kZWZpbmVkCgogICAgICAgICAgICBUaGlzIGZpeGVzIGEgZmFpbGVkIGFzc2VydGlvbiBidWcgcmVwb3J0ZWQgYnkgSmFzb24gU3Rld2FydC4KCjA2LzA1LzIwMDI6IGxqb2huc29uCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIFJ1YnkgbW9kdWxlIGFib3V0IHRoZSBsYWNrCiAgICAgICAgICAgIG9mIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLiBPbmx5IHRoZSBmaXJzdCBiYXNlIGNsYXNzCiAgICAgICAgICAgIGxpc3RlZCBpcyB1c2VkIGFuZCB0aGUgb3RoZXJzIGFyZSBpZ25vcmVkLiAoUmVwb3J0ZWQgYnkgQ3JhaWcKICAgICAgICAgICAgRmlsZXMpLgogICAgICAgICAgICAKMDYvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHN0cnVjdCBkZWNsYXJhdGlvbnMgYW5kIHR5cGVkZWYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBGb28gRm9vOwogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBIGZldyBvdGhlciBzdWJ0bGUgc3RydWN0IHJlbGF0ZWQgdHlwaW5nIHByb2JsZW1zIHdlcmUKICAgICAgICAgICAgYWxzbyByZXNvbHZlZC4KClZlcnNpb24gMS4zLjEyIChKdW5lIDIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgIAowNS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gcmVsYXRlZCB0byBmb3J3YXJkIHRlbXBsYXRlIGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICAgbmFtZXNwYWNlcy4gIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAnbWFrZSB1bmluc3RhbGwnIHRhcmdldC4gIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyBidWcgd2l0aCAlcmVuYW1lLCAlZmVhdHVyZSBhbmQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVleGNlcHRpb24gdmVjdG9yOjpfX2dldGl0ZW1fXyB7CiAgICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFQgX19nZXRpdGVtX18oaW50IGluZGV4KTsgICAgICAgLy8gRmluZQogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIE9vcHMuCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93LCB0aGUgJWV4Y2VwdGlvbiBkaXJlY3RpdmUgKGFuZCBvdGhlciBmZWF0dXJlcykgc2hvdWxkIGNvcnJlY3RseSBhcHBseSB0bwogICAgICAgICAgICBib3RoIHZlY3RvciBhbmQgc3BlY2lhbGl6YXRpb25zLgoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlcyB0byAldGVtcGxhdGUoKSBkaXJlY3RpdmUuICAgVGVtcGxhdGUgYXJndW1lbnRzIGFyZSBub3cKICAgICAgICAgICAgcmVkdWNlZCB0byBwcmltaXRpdmUgdHlwZXMgaW4gdGVtcGxhdGUgbWF0Y2hpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvcjxUICo+IHsKICAgICAgICAgICAgICAgIC4uLiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCAqSW50UHRyOyAgICAgLy8gR3Jvc3MgdHlwZWRlZgoKICAgICAgICAgICAgICAgLy8gR2V0cyB0aGUgYWJvdmUgcGFydGlhbCBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICAgICAldGVtcGxhdGUodmVjdG9ySW50UHRyKSB2ZWN0b3I8SW50UHRyPjsKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGV4dHJlbWVseSBzdWJ0bGUsIGJ1dCBpdCBmaXhlcyBhIG51bWJlciBvZiBwb3RlbnRpYWwKICAgICAgICAgICAgaG9sZXMgaW4gTHVpZ2kncyBTVEwgbGlicmFyeSBtb2R1bGVzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvcmkpIHZlY3RvcjxpbnQ+OwoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCByYXRoZXIgaW5zaWRpb3VzIHR5cGVtYXAgYnVnIHJlbGF0ZWQgdG8gY29uc3QuICBjb25zdAogICAgICAgICAgICB3YXMgYmVpbmcgZGlzY2FyZGVkIHRocm91Z2ggdHlwZWRlZnMuCgowNS8yOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgaW5wdXQgdHlwZW1hcHMgZm9yIGNvbnN0IHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIChpbiBMaWIvcnVieS9ydWJ5LnN3ZykuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBqYXZhIGFycnJheSBzdXBwb3J0IGZ1bmN0aW9ucyBhcmUgZW5jbG9zZWQgYnkgCiAgICAgICAgICAgIGEgU1dJR19OT0FSUkFZUyAjZGVmaW5lLiBVc2VmdWwgaWYgbm90IHVzaW5nIGFycmF5cyBhbmQgCiAgICAgICAgICAgIGl0IGlzIGRlc2lyYWJsZSB0byBtaW5pbWlzZSB0aGUgYW1vdW50IG9mIGNvbXBpbGVkIGNvZGUuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEVudW1zIHdlcmUgbm90IHJlbmFtZWQgd2hlbiB1c2luZyAlbmFtZSBvciAlcmVuYW1lCiAgICAgICAgICAgIGZpeC4KCjA1LzI4LzIwMDI6IGxqb2huc29uCiAgICAgICAgICAgIFtSdWJ5XSBNb2RpZmllZCB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHRoZQoJICAgICJuZXciIHNpbmdsZXRvbiBtZXRob2QgYW5kICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yCgkgICAgY29uc2lzdGVuY3kgd2l0aCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcy4gVGhlIHdyYXBwZXIgbmFtZQoJICAgIGZvciB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzICJuZXciIGlzIGFsbG9jX2NsYXNzbmFtZSBhbmQKCSAgICB0aGUgd3JhcHBlciBuYW1lIGZvciB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzICJpbml0aWFsaXplIgoJICAgIGlzIG5ld19jbGFzc25hbWUuCgoKMDUvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHJ1bnRpbWUuICBQb2ludGVyIGNvbnZlcnNpb24vY3JlYXRpb24gZnVuY3Rpb25zCiAgICAgICAgICAgIG5vdyBhbG1vc3QgYWx3YXlzIGhhdmUgYW4gZXh0cmEgImZsYWdzIiBhcmd1bWVudC4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX0NvbnZlcnRQdHIob2JqLCB2b2lkICoqLCBzd2lnX3R5cGVfaW5mbyAqdHksIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eCiAgICAgICAgICAgIFRoaXMgZXh0cmEgcGFyYW1ldGVyIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uIGFuZCB3aWxsCiAgICAgICAgICAgIGJlIHVzZWQgZm9yIG1vcmUgY29udHJvbCBvdmVyIHBvaW50ZXJzIGluIGZ1dHVyZSB2ZXJzaW9ucy4KCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IGZvciBDKysgY2xhc3NlcyB3aXRoIHByaXZhdGUgYXNzaWdubWVudCBvcGVyYXRvcnMuICBJdAogICAgICAgICAgICBpcyBub3cgcG9zc2libGUgdG8gc2FmZWx5IHJldHVybiBvYmplY3RzIGxpa2UgdGhpcyBieSB2YWx1ZS4KICAgICAgICAgICAgQ2F2ZWF0OiAgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBhIGNvcHkgY29uc3RydWN0b3IuCgkgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgLXByb3h5IG9wdGlvbiBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuICBUaGlzIGlzIHRoZQogICAgICAgICAgICBzYW1lIGFzIC1zaGFkb3cuICBXZSBhcmUgbWVyZWx5IGNoYW5naW5nIHRlcm1pbm9sb2d5LgogICAgICAgICAgICAKMDUvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgc29tZSBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIC1wYWNrYWdlIG9wdGlvbi4KICAgICAgICAgICAgLXBhY2thZ2UgbWVyZWx5IHNldHMgdGhlIHBhY2thZ2UgbmFtZSB0byBiZSB1c2VkIG9uIHRoZQogICAgICAgICAgICB3cmFwcGVycy4gIEl0IGRvZXMgbm90IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkKICAgICAgICAgICAgZmlsZSBvciB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiAgVGhpcyB3YXMKICAgICAgICAgICAgYnJva2VuIGF0IHNvbWUgcG9pbnQsIGJ1dCB3b3JrcyBhZ2FpbiBub3cuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBbIDQ3NTQ1MiBdIG1lbW9yeSBsZWFrIGluIHJldHVybi1ieS12YWx1ZS4KICAgICAgICAgICAgUHJvYmxlbSByZWxhdGVkIHRvIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHJldHVybmluZyBuZXdseQogICAgICAgICAgICBhbGxvY2F0ZWQgb2JqZWN0cy4gUmVwb3J0ZWQgYnkgUm95IExlY2F0ZXMuCiAKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA1MTMxMzQgXSAlQkxFU1NFRE1FTUJFUlMgaXNuJ3QgYWx3YXlzIHJpZ2h0LgogICAgICAgICAgICBSZXBvcnRlZCBieSBGbGV1ciBEaWFuYSBEcmFnYW4uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwNzM1IF0gLWltcG9ydGFsbCBhbmQgdGhlIC1JIG9wdGlvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW2d1aWxlXSBGaXhlZCBbIDUzMjcyMyBdIERlZmF1bHQgYXJnIGZvciBjaGFyKiBjYW4gU2VnVi4gIAogICAgICAgICAgICBFcnJvciBpbiBndWlsZSBtb2R1bGUuICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byB0eXBlbWFwIGFwcGxpY2F0aW9uIGNvZGUuICBUaGUgImZyZWVhcmciCiAgICAgICAgICAgIHR5cGVtYXAgbXVzdCBleGFjdGx5IG1hdGNoIHVwIHdpdGggdGhlICJpbiIgb3IgImlnbm9yZSIKICAgICAgICAgICAgdHlwZW1hcC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGNoYXIgKmRhdGEsIGludCBsZW4pIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgY2hhciAqZGF0YSB7IC4uLiB9OyAKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciAqZGF0YSwgaW50IGxlbik7CgogICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgImluIiB0eXBlbWFwIGlzIGFwcGxpZWQsIGJ1dCB0aGUKICAgICAgICAgICAgIGZyZWVhcmcgdHlwZW1hcCBpcyBub3QuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGZyZWVhcmcKICAgICAgICAgICAgIHR5cGVtYXAgZG9lc24ndCBtYXRjaCB1cCB3aXRoIHRoZSBpbnB1dCBhcmd1bWVudCBzZXF1ZW5jZS4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDgyNzIgXSBEZWZhdWx0IGFyZ3VtZW50IGNvZGUgbWlzc2luZyBicmFjZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyZXR0IFdpbGxpYW1zLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0NzczMCBdIFN3aWdWYWx1ZVdyYXBwZXIgbmVlZGVkIGZvciBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBVbmRlZmluZWQgaWRlbnRpZmllcnMgbm93IGV2YWx1YXRlIHRvIDAgd2hlbiBldmFsdWF0aW5nCiAgICAgICAgICAgIHByZXByb2Nlc3NvciBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2lmICFGT08KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAKICAgICAgICAgICAgd2hlcmUgRk9PIGlzIHVuZGVmaW5lZCBvciBzZXQgdG8gc29tZSBub24tbnVtZXJpYyB2YWx1ZS4KCiAgICAgICAgICAgIEZpeGVzIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCgogCjA1LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgQysrICdleHBvcnQnIGtleXdvcmQuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgcmVmaW5lbWVudCBvZiB0eXBlLW5hbWUgbWFuZ2xpbmcgdG8gYWNjb3VudCBmb3IgcG9pbnRlcnMsIGFycmF5cywKICAgICAgICAgICAgcmVmZXJlbmNlcywgYW5kIG90aGVyIGVtYmVkZGVkIHR5cGUgY29uc3RydWN0cy4KCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW5pdGlhbCBhdHRlbXB0IGF0IHN1cHBvcnRpbmcgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4gIEF0CiAgICAgICAgICAgIHRoZSB2ZXJ5IGxlYXN0LCBpdCBpcyBwYXJzZWQgYW5kIHRoZSBjbGFzc2VzIGFyZSBzdG9yZWQuICBNYXRjaGluZwogICAgICAgICAgICBvZiBpbnN0YW50aWF0aW9ucyB0byBzcGVjaWFsaXplZCB2ZXJzaW9uIGlzIG1vcmUgbGltaXRlZCBhbmQgYmFzZWQgb24KICAgICAgICAgICAgdGhlIFNXSUcgZGVmYXVsdCB0eXBlbWFwIHJ1bGVzOgoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKgogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbXQogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAmCgogICAgICAgICAgICBOb3csIHdoeSBpbiB0aGUgd29ybGQgd291bGQgeW91IHdhbnQgdG8gdXNlIHRoaXMgZmVhdHVyZT8gIE90aGVyCiAgICAgICAgICAgIHRoYW4gYWxsb3dpbmcgZm9yIHNsaWdodGx5IG1vZGlmaWVkIGNsYXNzIEFQSXMsIHRoaXMgY2FwYWJpbGl0eSBpcwogICAgICAgICAgICBwcmltYXJpbHkgdXNlZCB0byBwcm92aWRlIGFkdmFuY2VkIHdyYXBwaW5nIHN1cHBvcnQgZm9yIFNUTC1saWtlCiAgICAgICAgICAgIG9iamVjdHMuICBJdCBjYW4gYWxzbyBiZSBtaXhlZCB3aXRoIHR5cGVtYXBzLiAgSGVyZSBpcyBhbiBleGFtcGxlOgoKCiAgICAgICAgICAgICAgICAvKiBHZW5lcmljIHZlcnNpb24gKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxUPiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2Ygb2JqZWN0cyAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLyogUGFydGlhbCBzcGVjaWFsaXphdGlvbiAocG9pbnRlcnMpICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxUPiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2YgcG9pbnRlcnMgdG8gb2JqZWN0cy4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLyogU3BlY2lhbGl6YXRpb24gKGludGVnZXJzKS4gKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2YgaW50ZWdlcnMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50IHRvIHR5cGVtYXBzLiAgIE5vcm1hbGx5LCB0eXBlbWFwIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICAgcmVuYW1lZCB0byBhdm9pZCBjb25mbGljdHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgKiAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gY29kZSB0aGF0IGNyZWF0ZXMgYW5kIHVzZXMgdmFyaWFibGVzICJ0ZW1wMSIsInRlbXAyIiwgCiAgICAgICAgICAgICJ0ZW1wMyIgYW5kIHNvIGZvcnRoIGRlcGVuZGluZyBvbiBob3cgbWFueSB0aW1lcyB0aGUgdHlwZW1hcCBpcyB1c2VkLgogICAgICAgICAgICBTb21ldGltZXMgeW91IHdhbnQgYSBzaW5nbGUgdmFyaWFibGUgaW5zdGVhZC4gIFRvIGRvIHRoYXQsIHVzaW5nCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgbmFtaW5nIHNjaGVtZToKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICooaW50IF9nbG9iYWxfdGVtcCkgewogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgIElzIHRoaXMgY2FzZSwgYSBzaW5nbGUgdmFyaWFibGUgX2dsb2JhbF90ZW1wIGlzIGVtaXR0ZWQgaW4gdGhlCiAgICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb25zLiAgSXQgaXMgc2hhcmVkIGFjcm9zcyBhbGwgdHlwZW1hcHMuICBSZXBlYXRlZAogICAgICAgICAgICB0eXBlbWFwcyBkbyBub3QgcmVwbGljYXRlIHRoZSB2YXJpYWJsZS0tLXRoZXkgdXNlIHRoZSBmaXJzdCBvbmUKICAgICAgICAgICAgZW1pdHRlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHR5cGVtYXBzLiAgSWYgeW91IGhhdmUgdGhpcyBjb2RlLAoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbyAoaW50IHNvbWV2YXIgPSAzKSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igc29tZXZhciBpcyBub3cgZW1pdHRlZCBpbnRvIHRoZSB3cmFwcGVyIGNvZGUuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkICVleHRlbmQgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgaW4gbmFtZXNwYWNlcy4gIElmIHlvdSBoYXZlIGNvZGUKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgCiAgICAgICAgICAgIFNXSUcgbWF0Y2hlcyB0aGUgYmxhaCgpIG1ldGhvZCB0byBhIEMgZnVuY3Rpb24gbmFtZWQgCiAgICAgICAgICAgIHZvaWQgZm9vX2Jhcl9ibGFoKGZvbzo6YmFyICpzZWxmKS4KCiAgICAgICAgICAgIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBub24tbmFtZXNwYWNlIHZlcnNpb24uCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlczogY3BvaW50ZXIuaSwgY2FycmF5cy5pLCBjbWFsbG9jLmkuICBUaGVzZQogICAgICAgICAgICBwcm92aWRlIGFjY2VzcyB0byBDIHBvaW50ZXJzIGFuZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCiAgICAgICAgICAgIFNlZSBEb2MvTWFudWFsL0xpYnJhcnkuaHRtbCBmb3IgZGV0YWlscy4KCjA1LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQyB0eXBlIGNoYXIgbm8gbG9uZ2VyIG1hcHMgdG8gSmF2YSB0eXBlIGJ5dGUsIGJ1dCB0byBKYXZhIHR5cGUgY2hhci4KICAgICAgICAgICAgSXQgaXMgbm93IHRyZWF0ZWQgYXMgYSBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYSBzaWduZWQgbnVtYmVyLiBUaGlzIGZpdHMgaW4KICAgICAgICAgICAgd2l0aCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgaXMgYSBtb3JlIG5hdHVyYWwgbWFwcGluZyBhcyBjaGFyKiBpcyAKICAgICAgICAgICAgbWFwcGVkIGFzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuIE5vdGUgdGhhdCB0aGUgQyBzaWduZWQgY2hhciB0eXBlIGlzIHN0aWxsCiAgICAgICAgICAgIG1hcHBlZCB0byBhIEphdmEgYnl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSW1wcm92ZWQgY29uc3RhbnRzIHdyYXBwaW5nLiBDb25zdGFudHMgKCNkZWZpbmUgYW5kICVjb25zdGFudCkgdmFsdWVzIAogICAgICAgICAgICBhcmUgbm93IG9idGFpbmVkIHRocm91Z2ggYSBKTkkgY2FsbC4gUHJldmlvdXNseSB0aGUgdmFsdWUgd2FzIGNvbXBpbGVkIGFzIAogICAgICAgICAgICBKYXZhIGNvZGUsIGJ1dCB0aGlzIGRpZG4ndCB3b3JrIGZvciBhbGwgY2FzZXMsIGVnICNkZWZpbmUgMTIzVUxMLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBib2d1cyBlcnJvciBtZXNzYWdlIHdpdGggJWV4dGVuZCBkaXJlY3RpdmUgYW5kIEMrKwogICAgICAgICAgICBhY2Nlc3Mgc3BlY2lmaWVycy4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5hbWVzcGFjZXMgYW5kIGVudW1zIG5vdyB3b3JrIGNvcnJlY3RseS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGVudW0gQmFyIHsgQSwgQiB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldHlwZXMgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCB0byBzcGVjaWZ5IGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgaW4gdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAldHlwZXMoRm9vID0gQmFyKTsKCiAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IEZvbyBpc2EgQmFyLiAgICBVc2luZyB0aGlzIGlzIHBvdGVudGlhbGx5IHF1aXRlIGRhbmdlcm91cy4KICAgICAgICAgICAgSG93ZXZlciwgdGhpcyBpcyB1c2VmdWwgaW4gY2VydGFpbiBjYXNlcyAoYW5kIGluIHRoZSBTV0lHIGxpYnJhcnkpLgogICAgICAgICAgICAKMDUvMjAvMjAwMjogYmVhemxleQogICAgICAgICAgICAlbm9kZWZhdWx0IGFuZCAlbWFrZWRlZmF1bHQgZGlyZWN0aXZlcyBub3cgcmVxdWlyZSBhIHRyYWlsaW5nIHNlbWljb2xvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdDsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0OwoKICAgICAgICAgICAgSW4gYWRkaXRpb24gYm90aCBkaXJlY3RpdmVzIGNhbiB0YWtlIGEgY2xhc3MgbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQgRm9vOwoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7ICAgLyogTm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yICovCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7ICAvKiBEZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZ2VuZXJhdGVkICovCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIElmIHlvdSBkb24ndCB1c2UgdGhlIHRyYWlsaW5nIHNlbWljb2xvbiwgdGhpbmdzIHdpbGwgbXlzdGVyaW91c2x5IGJyZWFrLgoKMDUvMjAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb3JlIGltcHJvdmVtZW50cyB0byB0eXBlIHN5c3RlbSBoYW5kbGluZy4gIFNXSUcgbm93IGNvcnJlY3RseSBoYW5kbGVzCiAgICAgICAgICAgIHRlbXBsYXRlIG5hbWVzIGFuZCBwYXJhbWV0ZXJzIGluIGEgbmFtZXNwYWNlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBiYXIgeyB9OwogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChiYXI8SW50ZWdlcj4gKngpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoZSBnZW5lcmF0ZWQgY29kZSwgYWxsIG9mIHRoZSB0eXBlbmFtZXMgYXJlIHByb3Blcmx5IHF1YWxpZmllZC4KCjA1LzE3LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gZGVwcmVjYXRlZCBicm9rZW4gLWpuaWMgYW5kIC1qbmljcHAgY29tbWFuZGxpbmUgb3B0aW9ucy4gVGhlIEMgb3IgQysrIAogICAgICAgICAgICBKTkkgY2FsbGluZyBjb252ZW50aW9uIGlzIG5vdyBkZXRlcm1pbmVkIGZyb20gdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uLgoKMDUvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgSkNBTEwgbWFjcm9zIHdoaWNoIGV4aXN0IHNvIHRoYXQgdGhlIHNhbWUgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgICAgZm9yIGdlbmVyYXRpbmcgYm90aCB0aGUgQyBhbmQgQysrIEpOSSBjYWxsaW5nIGNvbnZlbnRpb25zIG5vIGxvbmdlciBhcHBlYXIKICAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIG91dHB1dCBpcyBub3cgcGFzc2VkIHRocm91Z2ggdGhlIAogICAgICAgICAgICBTV0lHIHByZXByb2Nlc3NvciB3aGljaCBkb2VzIHRoZSBtYWNybyBleHBhbnNpb24gZm9yIGVpdGhlciBDIG9yIEMrKyAoZGVwZW5kaW5nCiAgICAgICAgICAgIG9uIHdoZXRoZXIgLWMrKyBpcyBwYXNzZWQgb24gdGhlIFNXSUcgY29tbWFuZGxpbmUpLgoKICAgICAgICAgICAgVGhlIGdlbmVyYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBhcnJheSB0eXBlbWFwcyBoYXZlIGJlZW4gYWRqdXN0ZWQgCiAgICAgICAgICAgIHRvIHRha2UgYWNjb3VudCBvZiB0aGlzLiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCBhbnkgdHlwZW1hcHMgd2hpY2ggY29udGFpbmVkIAogICAgICAgICAgICBKQ0FMTCBtYWNyb3Mgd2l0aGluICV7ICV9IGJyYWNrZXRzIHdpbGwgaGF2ZSB0byBiZSBtb3ZlZCB3aXRoaW4ge30gYnJhY2tldHMgCiAgICAgICAgICAgIHNvIHRoYXQgdGhlIFNXSUcgcHJlcHJvY2Vzc29yIGNhbiBleHBhbmQgdGhlIG1hY3Jvcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2xhc3MgdGVtcGxhdGVzIG1heSBub3cgYmUgdXNlZCBhcyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBDPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29pKSBGb288aW50LCBCYXI+OwogICAgIAogICAgICAgICAgICBTV0lHIGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIHNwZWNpYWwgd2l0aCB0aGlzLS0taXQncyBqdXN0CiAgICAgICAgICAgIGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICAKICAgICAgICAgCjA1LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgcmVmaW5lbWVudCBvZiB0ZW1wbGF0ZSBzdXBwb3J0LiAgVGVtcGxhdGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBubyBsb25nZXIKICAgICAgICAgICAgcmVxdWlyZWQgZm9yIHR5cGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Ym9vbD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBPYnZpb3VzbHksIG5hbWVzIGFyZSByZXF1aXJlZCBmb3IgdGVtcGxhdGU8Y2xhc3MgVD47CgowNS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBtYWNybyBleHBhbnNpb24gaW4gdHlwZW1hcHMuICBUaGUgc2VxdWVuY2U6CgogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IodHlwZSkKCiAgICAgICAgICAgIFdpbGwgZXhwYW5kIGludG8gdGhlIFNXSUcgdHlwZSBkZXNjcmlwdG9yIHN0cnVjdG9yIGZvcgogICAgICAgICAgICB0aGUgZ2l2ZW4gdHlwZS4gIFR5cGUgbWF5IGJlIGFueSBhYnN0cmFjdCBkYXRhdHlwZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICopCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcihpbnQgKCopKGludCxkb3VibGUpKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IodmVjdG9yPGludD4gKikKCiAgICAgICAgICAgIENhdmVhdDogSXQgaXMgKk5PVCogY3VycmVudGx5IGxlZ2FsIHRvIHVzZSBvdGhlciB0eXBlbWFwCiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgaW4gdGhlIG1hY3JvLiAgRm9yIGV4YW1wbGUgCiAgICAgICAgICAgICRkZXNjcmlwdG9yKCQxX3R5cGUpLgoKICAgICAgICAgICAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIG1vZGlmaWNhdGlvbiBpcyB0byBiZXR0ZXIKICAgICAgICAgICAgc3VwcG9ydCB0eXBlbWFwcyBmb3IgY29udGFpbmVyIG9iamVjdHMgb3IgdG8gYWxsb3cgdHlwZW1hcHMKICAgICAgICAgICAgdGhhdCBtaWdodCBiZSBwZXJmb3JtaW5nIHR5cGUgY29udmVyc2lvbnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlIHdyYXBwaW5nIG9mIHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlIHR5cGVzIGhhcyBiZWVuCiAgICAgICAgICAgIGNoYW5nZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgIEFyZ3VtZW50cyBvZiB0eXBlICdjb25zdCBwcmltaXRpdmUgJicgYXJlIG5vdyBwYXNzZWQKICAgICAgICAgICAgYnkgdmFsdWUgYXMgb3Bwb3NlZCB0byBwb2ludGVycy4gIFJldHVybiB2YWx1ZXMgb2YKICAgICAgICAgICAgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSByZXR1cm5lZCBhcyB2YWx1ZXMgaW5zdGVhZCBvZgogICAgICAgICAgICBwb2ludGVycy4KCiAgICAgICAgICAgICdwcmltaXRpdmUnIGlzIGFueSBvbmUgb2YgaW50LCBzaG9ydCwgbG9uZywgbG9uZyBsb25nLAogICAgICAgICAgICBjaGFyLCBmbG9hdCwgZG91YmxlLCBib29sIChhcyB3ZWxsIGFzIHVuc2lnbmVkIHZhcmlhbnRzKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGJlaW5nIG1hZGUgdG8gYmV0dGVyIHN1cHBvcnQgQysrIHdyYXBwaW5nLS1lc3BlY2lhbGx5CiAgICAgICAgICAgIGNvZGUgdGhhdCBtYWtlcyB1c2Ugb2YgdGVtcGxhdGVzIGFuZCB0aGUgU1RMLgogICAgICAgICAgICAKMDUvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gYWNjZXNzIHRlbXBsYXRlcwogICAgICAgICAgICBpbiBhIG5hbWVzcGFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGNvbXBsZXggewogICAgICAgICAgICAgICAgICAgICAgIFQgcmUsIGltOwogICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4KFQgX3IgPSBUKCksIFQgX2kgPSBUKCkpIDogcmUoX3IpLCBpbShfaSkgeyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCByZWFsKCkgeyByZXR1cm4gcmU7IH0KICAgICAgICAgICAgICAgICAgICAgICBUIGltYWcoKSB7IHJldHVybiBpbTsgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGNvbXBsZXgpIHN0ZDo6Y29tcGxleDxkb3VibGU+OwoKICAgICAgICAgICAgTm90ZTogVGhlcmUgYXJlIHNvbWUgdmVyeSBzdWJ0bGUgbmFtZXNwYWNlL3N5bWJvbCB0YWJsZSAKICAgICAgICAgICAgbWFuYWdlbWVudCBpc3N1ZXMgaW52b2x2ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMuCiAgICAgICAgICAgIEl0IG1heSBub3Qgd29yayBpbiBjZXJ0YWluIGNhc2VzLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGUgY29uc3RydWN0b3Igc3VwcG9ydCBhZGRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+IAogICAgICAgICAgICAgICBzdHJ1Y3QgcGFpciB7CiAgICAgICAgICAgICAgICAgX1QxIGZpcnN0OwogICAgICAgICAgICAgICAgIF9UMiBzZWNvbmQ7CiAgICAgICAgICAgICAgICAgcGFpcigpIDogZmlyc3QoX1QxKCkpLCBzZWNvbmQoX1QyKCkpIHsgfQogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyPiBwYWlyKGNvbnN0IHBhaXI8X1UxLF9VMj4gJngpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVG8gaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlLCB1c2UgJXRlbXBsYXRlIGFuZCAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyBleHBhbmRzIHRoZSBjb25zdHJ1Y3RvciBpbnRvIGEgZGVmYXVsdAogICAgICAgICAgICBjb3B5IGNvbnN0cnVjdG9yOgoKICAgICAgICAgICAgICAgJWV4dGVuZCBwYWlyIHsKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHBhaXIpIHBhaXI8X1QxLF9UMj47CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwuICBPdGhlciB1c2VzIG1heSBiZSBicm9rZW4uCgowNS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlZXh0ZW5kICglYWRkbWV0aG9kcykgZGlyZWN0aXZlIG5vIGxvbmdlciB3b3JrcyB1bmxlc3MKICAgICAgICAgICAgaXQgYXBwZWFycyBpbiB0aGUgcHVibGljIHNlY3Rpb24gb2YgYSBjbGFzcy4gICBBbiBlcnJvcgogICAgICAgICAgICBtZXNzYWdlIGlzIG5vdyBnZW5lcmF0ZWQgKGFzIG9wcG9zZWQgdG8gYSBzZWdtZW50YXRpb24gZmF1bHQpLgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgJXdhcm5maWx0ZXIoKSBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBhdHRhY2hlcyBhIHdhcm5pbmcKICAgICAgICAgICAgZmlsdGVyIHRvIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBhbmQgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcwogICAgICAgICAgICAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIGZvbzsgICAvLyBTdXBwcmVzcyBvdmVybG9hZGVkIHdhcm5pbmcKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7IAoKICAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgICV3YXJuZmlsdGVyKDUwMSkgT2JqZWN0Ojpmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgY2xhc3MgT2JqZWN0IHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBvbmx5IHN1cHByZXNzZXMgd2FybmluZ3MgaW4gbGF0ZXIgc3RhZ2VzIG9mIGNvZGUKICAgICAgICAgICAgZ2VuZXJhdGlvbi4gIEl0IGRvZXMgbm90IHN1cHByZXNzIHdhcm5pbmdzIHJlbGF0ZWQgdG8gcHJlcHJvY2Vzc2luZwogICAgICAgICAgICBvciBwYXJzaW5nLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IHN1cHBvcnRzIEM5OSB2YXJpYWRpYyBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsX19WQV9BUkdTX18pCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgIi4uLiIgaXMgdXNlZCB0byBpbmRpY2F0ZSB2YXJpYWJsZSBhcmd1bWVudHMgd2hpY2gKICAgICAgICAgICAgYXJlIGFsbCBwbGFjZWQgaW50byB0aGUgc3BlY2lhbCBhcmd1bWVudCBuYW1lIF9fVkFfQVJHU19fIGluCiAgICAgICAgICAgIHRoZSBtYWNybyBleHBhbnNpb24uICAKCiAgICAgICAgICAgIFNXSUcgYWxzbyBpbXBsZW1lbnRzIHRoZSBHTlUgKCMjKSBleHRlbnNpb24gZm9yIHN3YWxsb3dpbmcgdGhlCiAgICAgICAgICAgIHByZWNlZGluZyBjb21tYSB3aGVuIF9fVkFfQVJHU19fIGlzIGVtcHR5LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgZGVidWdmKGZtdCwuLi4pIGZwcmludGYoc3RkZXJyLGZtdCwgIyNfX1ZBX0FSR1NfXykKCiAgICAgICAgICAgIEhlcmUgaXMgaG93IHRoaXMgaXMgZXhwYW5kZWQ6CgogICAgICAgICAgICAgICBkZWJ1Z2YoIiVkIiwgMykgIC0tPiBmcHJpbnRmKHN0ZGVyciwiJWQiLDMpCiAgICAgICAgICAgICAgIGRlYnVnZigiSGVsbG8iKSAgLS0+IGZwcmludGYoc3RkZXJyLCJIZWxsbyIgKQoKICAgICAgICAgICAgKG5vdGljZSB0aGUgZGVsZXRlZCBjb21tYSkuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA4LzIwMDI6IHNhbWphbSAoU2FtIExpZGRpY290dCkKICAgICAgICAgICAgTWFueSBjaGFuZ2VzIHRvIHBocCBtb2R1bGUuICBTaGFkb3cgY2xhc3NlcyBhcmUgbm93IGltcGxlbWVudGVkCiAgICAgICAgICAgIGVudGlyZWx5IGluIG5hdGl2ZSBDIGFuZCBubyBuZWVkIGZvciBwaHAtY29kZSBzaGFkb3cgd3JhcHBlcnMKICAgICAgICAgICAgUG9wdWxhdGVkIHRlbXBsYXRlIGNvbmZpZy5tNCBhbmQgTWFrZWZpbGUuaW4gYXMgbmVlZGVkIGJ5CiAgICAgICAgICAgIHBocGl6ZSBhcmUgZ2VuZXJhdGVkLgoKMDUvMDgvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEEgY29weSBjb25zdHJ1Y3RvciBpcyBub3cgdHVybmVkIGludG8gYSAiY2xvbmUiCiAgICAgICAgICAgIGluc3RhbmNlIG1ldGhvZCAoc2VlIERhdmUncyBjaGFuZ2UgZm9yIGNvcHkgY29uc3RydWN0b3JzCiAgICAgICAgICAgIGRhdGVkIDQvNy8yMDAyKS4gVGhpcyBzZWVtcyBsaWtlIHRoZSBhcHByb3ByaWF0ZSB0aGluZwogICAgICAgICAgICB0byBkbyBmb3IgUnVieSBjb2RlLgoKMDUvMDgvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFsgNTUzODY0IF0gSW5saW5lIGRlc3RydWN0b3IgY29kZSBub3Qgd3JpdHRlbi4KCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJWlnbm9yZSBiZWhhdmVzIGJldHRlciB3aXRoIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMsIGFuZCB0aGUKICAgICAgICAgICAgdHlwZSBzeXN0ZW0gaW4gZ2VuZXJhbC4gICBGb3IgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycywKICAgICAgICAgICAgJWlnbm9yZSBub3cgc3VwcHJlc3NlcyB0aGUgY3JlYXRpb24gb2YgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIG9yIGRlc3RydWN0b3IuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJWlnbm9yZSB+Rm9vOwogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICB+Rm9vKCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiBTV0lHLTEuMy4xMSwgfkZvbygpIHNpbXBseSAiZGlzYXBwZWFyZWQiIGFuZCB0aGUgY29kZSBnZW5lcmF0b3IKICAgICAgICAgICAgY3JlYXRlZCBhIHdyYXBwZXIgZm9yIGEgZGVmYXVsdCBkZXN0cnVjdG9yIChhcyBpZiBpdCB3YXMgbmV2ZXIKICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIGludGVyZmFjZSkuICBJbiBTV0lHLTEuMy4xMiwgJWlnbm9yZSBzdXBwcmVzc2VzCiAgICAgICAgICAgIHRoZSBjcmVhdGlvbiBvZiBhIGRlc3RydWN0b3IgaWYgb25lIGlzIGFjdHVhbGx5IGRlZmluZWQuIAoKICAgICAgICAgICAgU2ltaWxhcmx5LCBldmVuIHRob3VnaCBhIGRlY2xhcmF0aW9uIGlzIGlnbm9yZWQsIGluZm9ybWF0aW9uCiAgICAgICAgICAgIG1heSBzdGlsbCBiZSBuZWVkZWQgdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzLiBGb3IgZXhhbXBsZSwgaGVyZQogICAgICAgICAgICBpcyBhIHZlcnkgc3VidGxlIGVycm9yIHRoYXQgaXMgZml4ZWQgYnkgdGhpcyBjaGFuZ2U6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBzdGQ6OnN0cmluZzsgICAgICAgICAvLyBQcmV2ZW50IGNsYXNzIHdyYXBwaW5nCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgIGNsYXNzIHN0cmluZyB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBzdHJpbmcgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhzdGQ6OnN0cmluZyAqcyk7ICAgLy8gQnJva2VuLgoKICAgICAgICAgICAgQmVmb3JlIHRoaXMgZml4LCAlaWdub3JlIHdvdWxkIGNhdXNlIHRoZSBjbGFzcyBkZWZpbml0aW9uIHRvIGRpc2FwcGVhci4KICAgICAgICAgICAgVGhpcywgaW4gdHVybiwgd291bGQgY2F1c2UgdGhlIHR5cGVtYXAgdG8gYmUgbWlzYXBwbGllZC4gCiAKMDUvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzCiAgICAgICAgICAgIGZvciBiZXR0ZXIgc3VwcG9ydCBvZiBkZXN0cnVjdG9ycy4gIERlc3RydWN0b3JzIGNhbiBub3cgYmUgcHJlY2lzZWx5CiAgICAgICAgICAgIHRhZ2dlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgJWlnbm9yZSBGb286On5Gb287CiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhY3Rpb24iKSB+QmFyIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgKkRldmVsb3BlciB3YXJuaW5nKiAKICAgICAgICAgICAgT3BlcmF0aW9ucyBzdWNoIGFzIHJlbmFtaW5nIGFuZCBmZWF0dXJlIGF0dGFjaG1lbnQgZm9yIGNsYXNzZXMgdXNlZCB0bwogICAgICAgICAgICBiZSBhcHBsaWVkIHRvIGRlc3RydWN0b3JzIGFzIHdlbGwuICBGb3IgaW5zdGFuY2UsIGlmIHlvdSBkaWQgdGhpczoKIAogICAgICAgICAgICAgICAgICVyZW5hbWUoQmFyKSBGb287CgogICAgICAgICAgICBUaGUgb3BlcmF0aW9uIGFwcGxpZWQgdG8gdGhlIGNsYXNzIGl0c2VsZiwgdGhlIGNvbnN0cnVjdG9yLCBhbmQKICAgICAgICAgICAgdGhlIGRlc3RydWN0b3IuICAgVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuICBOb3cgc3VjaCBvcGVyYXRpb25zCiAgICAgICAgICAgIHdpbGwgb25seSBhcHBseSB0byB0aGUgY2xhc3MgYW5kIHRoZSBjb25zdHJ1Y3Rvci4gIE5vdGU6IGlmIHlvdQogICAgICAgICAgICB3ZXJlIHJlbHlpbmcgb24gdGhpcyBmb3IgY2xhc3MgcmVuYW1pbmcsIGJlIGF3YXJlIHRoYXQgcmVuYW1lZAogICAgICAgICAgICBjbGFzc2VzIHNob3VsZCByZWFsbHkgb25seSBiZSBoYW5kbGVkIGF0IHRoZSBsZXZlbCBvZiB0aGUgY2xhc3MgaXRzZWxmCiAgICAgICAgICAgIGFuZCBub3QgdGhlIGxldmVsIG9mIGluZGl2aWR1YWwgZGVjbGFyYXRpb25zIGluIHRoZSBjbGFzcyAoYWx0aG91Z2gKICAgICAgICAgICAgdGhleSBjYW4gYmUgcmVuYW1lZCBpbmRpdmlkdWFsbHkgaWYgbmVlZGVkKS4gIEFzIGZhciBhcyBJIGtub3csCiAgICAgICAgICAgIHRoZSBMYW5ndWFnZSBjbGFzcyBpcyBhbHJlYWR5IHRha2luZyBjYXJlIG9mIHRoaXMgY2FzZSBjb3JyZWN0bHkuCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBzZXQgb2YgdGVzdHMuICBUaGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9lcnJvcnMgZGlyZWN0b3J5IGNvbnRhaW5zCiAgICAgICAgICAgIHRlc3RzIHRoYXQgdHJ5IHRvIGV4ZXJjaXNlIGFsbCBvZiBTV0lHJ3MgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMuCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN0YXJ0IG9mIGEgd2FybmluZyBmcmFtZXdvcmsuICBXYXJuaW5nIG1lc3NhZ2VzIGFyZSBub3cgYXNzaWduZWQgbnVtZXJpYyB2YWx1ZXMKICAgICAgICAgICAgdGhhdCBhcmUgc2hvd24gaW4gd2FybmluZyBtZXNzYWdlcy4gICBUaGVzZSBjYW4gYmUgc3VwcHJlc3NlZCB1c2luZyB0aGUKICAgICAgICAgICAgLXcgb3B0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICAgc3dpZyAtdzMwMiwzMDUgZXhhbXBsZS5pCgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgI3ByYWdtYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhpczoKCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIKICAgICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPTMwMiwzMDUKCiAgICAgICAgICAgIE5vdGU6IFNpbmNlIFNXSUcgaXMgYSBtdWx0aS1wYXNzIGNvbXBpbGVyLCB0aGlzIHByYWdtYSBzaG91bGQKICAgICAgICAgICAgb25seSBiZSB1c2VkIHRvIGNoYW5nZSBnbG9iYWwgc2V0dGluZ3Mgb2YgdGhlIHdhcm5pbmcgZmlsdGVyLiAgSXQgc2hvdWxkCiAgICAgICAgICAgIG5vdCBiZSB1c2VkIHRvIHNlbGVjdGl2ZWx5IGVuYWJsZS9kaXNhYmxlIHdhcm5pbmdzIGluIGFuIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgICBUaGUgaGFuZGxpbmcgb2YgI3ByYWdtYSBvY2N1cnMgaW4gdGhlIEMrKyBwcmVwcm9jb2Vzc29yIGFuZCBhZmZlY3RzIGFsbCAKICAgICAgICAgICAgc3Vic2VxdWVudCBzdGFnZXMgb2YgY29tcGlsYXRpb24uCgogICAgICAgICAgICBUaGUgLVdhbGwgb3B0aW9uIHR1cm5zIG9uIGFsbCB3YXJuaW5ncyBhbmQgb3ZlcnJpZGVzIGFueSBmaWx0ZXJzIHRoYXQKICAgICAgICAgICAgbWlnaHQgaGF2ZSBiZWVuIHNldC4KCiAgICAgICAgICAgIFdhcm5pbmdzIGNhbiBiZSBpc3N1ZWQgZnJvbSBhbiBpbnRlcmZhY2UgdXNpbmcgJXdhcm4uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXdhcm4gIjExMDolc2VjdGlvbiBpcyBkZXByZWNhdGVkIgoKICAgICAgICAgICAgVGhlIGZpcnN0IHBhcnQgb2YgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgYW4gb3B0aW9uYWwgd2FybmluZyBudW1iZXIuCiAgICAgICAgICAgIEEgY29tcGxldGUgc2V0IG9mIHdhcm5pbmcgbnVtYmVycyBpcyBmb3VuZCBpbiBTb3VyY2UvSW5jbHVkZS9zd2lnd2Fybi5oLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEludGVybmFsIHBhcnNpbmcgY2hhbmdlLiAgIERpcmVjdGl2ZXMgdG8gaW5jbHVkZSBmaWxlcyBub3cgdXNlIGJyYWNrZXRzIFsgLi4uIF0KICAgICAgICAgICAgaW5zdGVhZCBvZiB7IC4uLiB9LiAgIAoKICAgICAgICAgICAgICAgICAgJWluY2x1ZGVmaWxlICJmb28uaSIgWwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgXQoKICAgICAgICAgICAgVGhlIHVzZSBvZiB7IC4uLiB9IHdhcyBhIGJhZCBjaG9pY2UgYmVjYXVzZSB0aGV5IHdlcmUgaW5jbHVkZWQgaW1wbGljaXRseSBieQogICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yIGFuZCBtYWRlIGl0IGltcG9zc2libGUgdG8gcHJvcGVybHkgZGV0ZWN0IGxlZ2l0aW1hdGUgbWlzc2luZyAnfScgCiAgICAgICAgICAgIGVycm9ycy4KCjA0LzE2LzIwMDItCjA1LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBFdXJvcGVhbiBUb3VyOiBQYXJpcy1BbXN0ZXJkYW0tQmF0aC4KCjA0LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBoYXMgYmVlbiByZW5hbWVkIHRvICVleHRlbmQuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgaW50IGJhcigpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3RpdmF0aW9uOiB0aGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGZvciBtYW55CiAgICAgICAgICAgIG90aGVyIHRhc2tzIGluY2x1ZGluZyBhZGRpbmcgc3ludGhlc2l6ZWQgYXR0cmlidXRlcywgY29uc3RydWN0b3JzLAogICAgICAgICAgICBhbmQgdHlwZW1hcHMuIEJlY2F1c2Ugb2YgdGhpcywgImFkZG1ldGhvZHMiIGlzIHNvbWV3aGF0IG1pc2xlYWRpbmcuCiAgICAgICAgICAgICVleHRlbmQgbW9yZSBwcmVjaXNlbHkgZGVzY3JpYmVzIHRoaXMgb3BlcmF0aW9uLS0tZXh0ZW5zaW9uIG9mIGEKICAgICAgICAgICAgY2xhc3Mgb3Igc3RydWN0dXJlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICVhZGRtZXRob2RzIHN0aWxsIHdvcmtzIHZpYSBhIG1hY3JvIGRlZmluaXRpb24uICAgSG93ZXZlciwKICAgICAgICAgICAgYSB3YXJuaW5nIG1lc3NhZ2UgbWF5IGJlIGdlbmVyYXRlZC4gICBFcnJvcnMgaW52b2x2aW5nICVhZGRtZXRob2RzCiAgICAgICAgICAgIHdpbGwgYWN0dWFsbHkgcmVmZXIgdG8gdGhlICVleHRlbmQgZGlyZWN0aXZlLiAgCiAgICAgICAgICAgIAowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZ1cnRoZXIgcmVmaW5lbWVudCBvZiB0aGUgdHlwZSBzeXN0ZW0uICBUeXBlZGVmIG5vdwogICAgICAgICAgICBwcm9wYWdhdGVzIHRocm91Z2ggZnVuY3Rpb25zLCBwb2ludGVycyB0byBmdW5jdGlvbnMsCiAgICAgICAgICAgIGFuZCBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCAoKngpKGludCksIEludGVnZXIgKCp5KShJbnRlZ2VyKSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFyZ3VtZW50cyAneCcgYW5kICd5JyBoYXZlIGV4YWN0bHkKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZSAoYW5kIHdvdWxkIG9idmlvdXNseSBhY2NlcHQgb2JqZWN0cwogICAgICAgICAgICBvZiBlaXRoZXIgdHlwZSkuCgogICAgICAgICAgICBTaW1pbGFybHksIGNvbnNpZGVyIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwogICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgKEZvbzo6KngpKGludCksIGludCAoQmFyOjoqeSkoaW50KSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFyZ3VtZW50cyB4IGFuZCB5IGFyZSB0aGUgc2FtZSAKICAgICAgICAgICAgdHlwZSAodmlhIHR5cGVkZWYpLgogICAgICAgICAgICAKMDQvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgYW55IHBhcnQgb2YKICAgICAgICAgICAgYW4gZXhwcmVzc2lvbiBpbnZvbHZlcyB2YWx1ZXMgZnJvbSBhIHByaXZhdGUgcGFydCBvZiBhIGNsYXNzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IFg7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSBYKTsgICAvLyBXYXJuaW5nCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyBpZ25vcmVkLiAgVGhlcmUKICAgICAgICAgICAgYXJlIHdvcmthcm91bmRzLCBidXQgdGhleSBhcmUgcmF0aGVyIGNsdW1zeS4gIEZvciBpbnN0YW5jZSwKICAgICAgICAgICAgeW91IG1pZ2h0IGRvIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhY3Rpb24iKSBibGFoKGludCxpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG5hcmdzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBibGFoKGFyZzEpOwogICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxLGFyZzIpOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludCBhLCBpbnQgYiA9IDApOwoKCjA0LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVXNlIG9mIHRoZSAlaW5saW5lIGRpcmVjdGl2ZSBpbnNpZGUgYSBuYW1lc3BhY2UgaXMKICAgICAgICAgICAgZm9yYmlkZGVuIGFuZCBub3cgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UuICAgVGhpcyBpcwogICAgICAgICAgICBub3QgYWxsb3dlZCBzaW5jZSB0aGUgaW5saW5lZCBjb2RlIHRoYXQgaXMgZW1pdHRlZCBpcwogICAgICAgICAgICBub3QgcGxhY2VkIGluc2lkZSBhIG5hbWVzcGFjZS4gIFRoaXMgY29uZnVzZXMgb3RoZXIKICAgICAgICAgICAgc3RhZ2VzIG9mIHBhcnNpbmcuCiAgICAgICAgICAgICAgICAgICAgCjA0LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBidWcgZml4ZXMgdG8gY2FzdGluZyBvcGVyYXRpb25zIGFuZCBleHByZXNzaW9uCiAgICAgICAgICAgIHBhcnNpbmcuICAgRHVlIHRvIHNvbWUgcGFyc2luZyBpc3N1ZXMsIGl0IGlzIG5vdCAKICAgICAgICAgICAgY3VycmVudGx5IHBvc3NpYmxlIHRvIHVzZSBjYXN0cyBmb3IgYWxsIHBvc3NpYmxlCiAgICAgICAgICAgIGRhdGF0eXBlcy4gICBIb3dldmVyLCB0aGUgY29tbW9uIGNhc2VzIHdvcmsuCgowNC8yMC8yMDAyOiBiZWF6bGV5IChBbXN0ZXJkYW0pCiAgICAgICAgICAgIE1lbWJlciB0ZW1wbGF0ZXMgbm93IHdvcmsuICBTaW1wbHkgdXNlIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIG9yICVhZGRtZXRob2RzIHRvIGNyZWF0ZQogICAgICAgICAgICBpbnN0YW50aWF0aW9ucyAoc2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCkuICBTdXBwb3J0aW5nCiAgICAgICAgICAgIHRoaXMgd2FzIGVhc3ktLS1lYXJsaWVyIGNoYW5nZXMgdG8gdGVtcGxhdGVzIG1hZGUgaXQKICAgICAgICAgICAgcG9zc2libGUgdXNpbmcgb25seSBhIHR3by1saW5lIG1vZGlmaWNhdGlvbiB0byB0aGUgcGFyc2VyCiAgICAgICAgICAgIGFuZCBhIGZldyBtaW5vciBtb2RpZmljYXRpb25zIGVsc2V3aGVyZS4gIEhtbW0sIGNvbWUgdG8gCiAgICAgICAgICAgIHRoaW5rIG9mIGl0LCB0aGUgc21va2Ugd2FzIHJhdGhlciB0aGljayBpbiB0aGF0IEludGVybmV0ICJjYWZlIi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDQvMTkvMjAwMjogYmVhemxleSAoVEdWKQogICAgICAgICAgICBJbXByb3ZlZCBoYW5kbGluZyBvZiBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQsMTAwPjsKCiAgICAgICAgICAgIFNpbXBsZSBudW1iZXJzIGFuZCBzdHJpbmdzIGNhbiBiZSB1c2VkIHdpdGggdGhlICV0ZW1wbGF0ZQogICAgICAgICAgICBkaXJlY3RpdmUgYXMgd2VsbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50MTAwKSB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBOb3RlOiBBcml0aG1ldGljIGV4cHJlc3Npb25zIGFyZSBub3QgY3VycmVudGx5IGFsbG93ZWQuCiAgICAgICAgICAgIAogICAgICAgICAgICBEZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cyBub3cgd29yayBhbmQgZG8gbm90IGhhdmUgdG8KICAgICAgICAgICAgYmUgZ2l2ZW4gdG8gJXRlbXBsYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAKMDQvMTgvMjAwMjogYmVhemxleSAoUGFyaXMpCiAgICAgICAgICAgIENoYW5nZSBpbiBpbnRlcm5hbCB0ZW1wbGF0ZSBoYW5kbGluZy4gIFRlbXBsYXRlCiAgICAgICAgICAgIHBhcmFtZXRlcnMgYXJlIG5vdyBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHR5cGUKICAgICAgICAgICAgc3lzdGVtIGFuZCBhcmUgYXdhcmUgb2YgdHlwZWRlZnMsIGV0Yy4gIFRoaXMgYnVpbGRzCiAgICAgICAgICAgIHVwb24gdGhlIGNoYW5nZSBiZWxvdy4gICAKCiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgV0FSTklORyAqKioKICAgICAgICAgICAgV29yZCBvZiBjYXV0aW9uIHRvIGxhbmd1YWdlIG1vZHVsZSB3cml0ZXJzLiAgVGhlICJuYW1lIgogICAgICAgICAgICBwYXJhbWV0ZXIgb2YgY2VydGFpbiBwYXJzZSB0cmVlIG5vZGVzIChjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pCiAgICAgICAgICAgIG1heSBiZSBwYXJhbWV0ZXJpemVkIHdpdGggdHlwZXMuICAgVGhpcyBwYXJhbWV0ZXJpemF0aW9uIGlzCiAgICAgICAgICAgIGRvbmUgdXNpbmcgU1dJRyB0eXBlLXN0cmluZ3MgYW5kIG5vdCB0aGUgdW5kZXJseWluZyBDIHZlcnNpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgaW50IG1heDxpbnQgKj4oaW50ICosaW50ICopICAKCiAgICAgICAgICAgIGhhcyBhIG5hbWUgb2YgIm1heDwocC5pbnQpPiIuICBJZiB5b3UgdXNlIHRoZSBuYW1lIGRpcmVjdGx5LAogICAgICAgICAgICB5b3UgbWF5IGdldCBzeW50YXggZXJyb3JzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gIFRvIGZpeCB0aGlzLAogICAgICAgICAgICB1c2UgU3dpZ1R5cGVfbmFtZXN0cihuYW1lKSB0byBjb252ZXJ0IGEgcGFyYW1ldGVyaXplZCBuYW1lIAogICAgICAgICAgICB0byBhIEMgbmFtZSB3aXRoIHZhbGlkIHN5bnRheC4gIFRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlzCiAgICAgICAgICAgIHVzZWQgdG8gcmVkdWNlIHRlbXBsYXRlIHR5cGVzIHRvIGEgY29tbW9uIHJlcHJlc2VudGF0aW9uIAogICAgICAgICAgICBhbmQgdG8gaGFuZGxlIGlzc3VlcyBvZiB0eXBlZGVmLgogICAgICAgICAgICAKMDQvMTYvMjAwMjogYmVhemxleSAoc29tZXdoZXJlIG92ZXIgdGhlIEF0bGFudGljKQogICAgICAgICAgICBFbmhhbmNlbWVudCBvZiB0eXBlZGVmIHJlc29sdXRpb24uICBUaGUgdHlwZSBzeXN0ZW0gaXMgbm93CiAgICAgICAgICAgIGF3YXJlIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgZm9vKHZlY3RvcjxpbnQ+ICp4LCB2ZWN0b3I8SW50ZWdlcj4gKnkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB2ZWN0b3I8aW50PiBhbmQgdmVjdG9yPEludGVnZXI+IGFyZQogICAgICAgICAgICB0aGUgc2FtZSB0eXBlLiAgIFRoZXJlIGlzIHNvbWUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGlzCiAgICAgICAgICAgIG1lY2hhbmlzbSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgIGEgdHlwZW1hcCBkZWZpbmVkIGZvciB2ZWN0b3I8aW50PiAqIHdvdWxkIGFwcGx5IHRvIGVpdGhlciB0eXBlLgogICAgICAgICAgICBIb3dldmVyLCBhIHR5cGVtYXAgZm9yIHZlY3RvcjxJbnRlZ2VyPiAqIHdvdWxkIG9ubHkgYXBwbHkgdG8KICAgICAgICAgICAgdGhhdCB0eXBlLgoKICAgICAgICAgICAgVHlwZWRlZnMgYW5kIHR5cGVtYXBzIGFuZCBtYXRjaGVkIGJ5IGxlZnQtbW9zdCBleHBhbnNpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2ZWN0b3I8SW50ZWdlcixJbnRlZ2VyPiAtLT4gCiAgICAgICAgICAgICAgdmVjdG9yPGludCwgSW50ZWdlcj4gLS0+CiAgICAgICAgICAgICAgdmVjdG9yPGludCwgaW50PgoKCjA0LzI0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQ2hhbmdlcyB0byBKYXZhIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgICBPdmVyY29tZXMgYSBidWcgd2hlcmUgdGhlIG1vZHVsZSBhc3N1bWVkIHRoYXQgYSBwb2ludGVyIHRvIGEgZGVyaXZlZAogICAgICAgICAgICBjbGFzcyBjb3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIGEgcG9pbnRlciB0byBhIGJhc2UgY2xhc3MuIFRoYW5rcyAKICAgICAgICAgICAgdG8gU3RlcGhlbiBNY0NhdWwgZm9yIGFuYWx5c2luZyB0aGUgYnVnIGFuZCBzdWJtaXR0aW5nIHBhdGNoZXMuCgogICAgICAgICAgICBBIGNvbnNlcXVlbmNlIGlzIHRoYXQgdGhlIGdldENQdHIoKSBtZXRob2QgaW4gZWFjaCBzaGFkb3cgY2xhc3MgaGFzCiAgICAgICAgICAgIGRpc2FwcGVhcmVkIGFuZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGEgZ2V0Q1B0clhYWCgpLCB3aGVyZSBYWFggaXMgdGhlIAogICAgICAgICAgICBzaGFkb3cgY2xhc3MgbmFtZS4gSWYgeW91IGhhdmUgY29kZSB0aGF0IHByZXZpb3VzbHkgdXNlZCBnZXRDUHRyKCksIAogICAgICAgICAgICBhbmQgdGhlIGFzc29jaWF0ZWQgY2xhc3MgaXMgd3JhcHBpbmcgYSBDIHN0cnVjdCBvciBhIEMrKyBjbGFzcyB0aGF0CiAgICAgICAgICAgIGlzIG5vdCBpbnZvbHZlZCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiwganVzdCB1c2UgdGhlIG5ldyBtZXRob2QuIElmCiAgICAgICAgICAgIGhvd2V2ZXIsIHRoZSBjbGFzcyBpcyBpbnZvbHZlZCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiwgeW91J2xsIGhhdmUKICAgICAgICAgICAgdG8gY2hvb3NlIHdoaWNoIHBvaW50ZXIgeW91IHJlYWxseSB3YW50LiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAKICAgICAgICAgICAgaGFzIGJlZW4gYnJva2VuIGFzIG5vdCB1c2luZyB0aGUgY29ycmVjdCBwb2ludGVyIGNhbiBsZWFkIHRvIHdlaXJkIGJ1Z3MKICAgICAgICAgICAgdGhyb3VnaCBpbGwtZGVmaW5lZCBiZWhhdmlvdXIuIElmIHlvdSBhcmUgc3VyZSB5b3Ugd2FudCB0aGUgb2xkIG1ldGhvZHMsIAogICAgICAgICAgICB5b3UgY291bGQgYWRkIHRoZW0gYmFjayBpbnRvIGFsbCBzaGFkb3cgY2xhc3NlcyBieSBhZGRpbmcgdGhpcyBhdCB0aGUgCiAgICAgICAgICAgIGJlZ2lubmluZyBvZiB5b3VyIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBhbGxzaGFkb3djb2RlPSV7CiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0cigpewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFBsZWFzZSBzZWUgZW50cnkgZGF0ZWQgMDcvMjMvMjAwMiB0byBzZWUgaG93IHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIGRlcHJlY2F0aW9uCiAgICAgICAgICAgIG9mIHRoZSBhbGxzaGFkb3djb2RlIHByYWdtYS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA0LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCByZWZlcmVuY2VzLiAgIERlY2xhcmF0aW9ucyBzdWNoIAogICAgICAgICAgICBhcyB0aGlzIHNob3VsZCBub3cgd29yazoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhjb25zdCBzdHJpbmcgJnggPSAiSGVsbG8iKTsKCjA0LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgdHlwZW1hcCAkKiBzdWJzdGl0dXRpb25zIGZvciB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzLgogICAgICAgICAgICBSZXF1ZXN0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowNC8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGlzIG5vdyBzdXBwb3J0ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFdoZW4gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgdXNlZCwgaXQgd2lsbCB1c2UgYSBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICBpZiBvbmUgaXMgZGVmaW5lZC4gICBUaGVyZSBhcmUgc3RpbGwgc29tZSBsaW1pdGF0aW9ucy4gUGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgQSB0ZW1wbGF0ZSBvZiB0eXBlIDx2b2lkICo+IGRvZXMKICAgICAgICAgICAgbm90IG1hdGNoIGFsbCBwb2ludGVycy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWpvciBjaGFuZ2UgdG8gdGVtcGxhdGUgd3JhcHBpbmcgaW50ZXJuYWxzLiBUZW1wbGF0ZSBkZWNsYXJhdGlvbnMgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciBwcm9jZXNzZWQgYXMgbWFjcm9zIGJ1dCBub3cgcmVzdWx0IGluIHJlYWwgcGFyc2UtdHJlZQogICAgICAgICAgICBub2Rlcy4gIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGV4cGFuZHMgdGhlc2Ugbm9kZXMgaW50byBhCiAgICAgICAgICAgIHNwZWNpZmljIGluc3RhbnRpYXRpb24uICAgVGhpcyBjaGFuZ2UgZW5hYmxlcyBhIG51bWJlciBvZgogICAgICAgICAgICBuZXcgYW5kIGludGVyZXN0aW5nIGNhcGFiaWxpdGllczoKCiAgICAgICAgICAgIERpcmVjdGl2ZXMgc3VjaCBhcyAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kICVhZGRtZXRob2RzIGNhbgogICAgICAgICAgICBub3cgYmUgYXBwbGllZCB0byB1bmluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJzaXplKSB2ZWN0b3I6OmJhcihjaGFyICpidWYsIGludCBsZW4pOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1Zik7CiAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsgICAvLyBSZW5hbWVkCiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGludHZlY3RvcikgdmVjdG9yPGludD47ICAgLy8gUmVuYW1pbmcgY2FycmllcyB0aHJvdWdoCgogICAgICAgICAgICAKICAgICAgICAgICAgQnkgcGFyc2luZyB0ZW1wbGF0ZXMgaW50byBhbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSwgaXQgd2lsbAogICAgICAgICAgICBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IHNwZWNpYWxpemF0aW9uIChhbmQgbWF5YmUgcGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbikuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwgYW5kIGEgd29yayBpbiBwcm9ncmVzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJbiBTV0lHLTEuMy4xMSwgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHdlcmUgc2ltcGx5IHByb2Nlc3NlZAogICAgICAgICAgICBhcyB3ZWlyZCBtYWNyb3MuICBObyBvdGhlciBpbmZvcm1hdGlvbiB3YXMgcmV0YWluZWQuICAgVGhpcyAKICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHN1cHBvcnQgbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBhbmQgCiAgICAgICAgICAgIGNvbXBsaWNhdGVkIG1hbnkgb3RoZXIgcGFydHMgb2YgdGhlIGltcGxlbWVudGF0aW9uLgoKMDQvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gdGVtcGxhdGUgY2xhc3Mgd3JhcHBpbmcuICAgVGhlcmUgd2VyZSBhIHZhcmlldHkgb2YKICAgICAgICAgICAgImlzc3VlcyIgd2l0aCB0aGUgb2xkIGFwcHJvYWNoIHJlbGF0ZWQgdG8gcGFyc2luZywgdGhlIHR5cGUKICAgICAgICAgICAgc3lzdGVtLCBhbmQgbmFtZXNwYWNlcy4gICBUaGVzZSBjaGFuZ2VzIGFyZSBtZWFudCB0byByZWN0aWZ5CiAgICAgICAgICAgIHNvbWUgb2YgdGhlc2UgcHJvYmxlbXM6CgogICAgICAgICAgICBBIHNwZWNpZmljIGluc3RhbnRpYXRpb24gb2YgYSB0ZW1wbGF0ZSBjYW4gbm93IGJlIHNwZWNpZmllZAogICAgICAgICAgICBieSBpbmNsdWRpbmcgdGhlIGNsYXNzIGlubGluZSBsaWtlIHRoaXM6CiAKICAgICAgICAgICAgICAgICAgY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICB+dmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uIHdoYXRldmVyIC4uLgoJICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgaXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24sIGJ1dCBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzCiAgICAgICAgICAgIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBoYXMgYmVlbiBtb2RpZmllZCB0byBleHBhbmQgcm91Z2hseSBhcwogICAgICAgICAgICBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSh2ZWNpbnQ+IHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgc2ltcGx5IGJ1aWxkcyB1cG9uIHRoZSBjb2RlIGFib3ZlICh0ZW1wbGF0ZXMKICAgICAgICAgICAgaW5jbHVkZWQgaW5saW5lKS4KCiAgICAgICAgICAgIFRoaXMgbW9kaWZpZWQgYXBwcm9hY2ggdG8gd3JhcHBpbmcgZml4ZXMgc29tZSBzdWJ0bGUgdHlwZQogICAgICAgICAgICBpc3N1ZXMuICBGb3IgaW5zdGFuY2UsIHlvdSBjYW4gbm93IGRlZmluZSB0eXBlbWFwcyBhbmQgdHlwZWRlZnMKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPGludD4gaW50dmVjdG9yOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnR2ZWN0b3IgKnYpOyAgIC8vIEdldHMgdGhlIGFib3ZlIHR5cGVtYXAKCiAgICAgICAgICAgIFRoaXMgZGlkIG5vdCB3b3JrIGluIFNXSUctMS4zLjExIGR1ZSB0byBhIHBlY3VsaWFyaXR5IG9mCiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICV0ZW1wbGF0ZShuYW1lKSBubyBsb25nZXIgaW5zdGFsbHMgdGhlIHRlbXBsYXRlIGFzIGEgY2xhc3MKICAgICAgICAgICAgd2l0aCBuYW1lICJuYW1lIi4gICBUaGlzIG1pZ2h0IGJyZWFrICVhZGRtZXRob2RzIGFzIGRlc2NyaWJlZAogICAgICAgICAgICBpbiB0aGUgbWFudWFsLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY2ludCB7ICAgIC8vIEZhaWxzLiB2ZWNpbnQgbm90IGEgY2xhc3MKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgCiAgICAgICAgICAgIFRvIGZpeCB0aGlzLCBqdXN0IHVzZSB0aGUgdGVtcGxhdGUgbmFtZSBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGU6IFRoaXMgdGVjaG5pcXVlIG1pZ2h0IGJlIGEgd2F5IHRvIGltcGxlbWVudCBzb21lIGJpemFycmUKICAgICAgICAgICAgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGVjaG5pcXVlcy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFwcGxpZWQgaWYgdmVjdG9yPGludD4gaW5zdGFudGlhdGVkIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAgCjA0LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDA4NjggXSAjaWYgZGVmaW5lZCB3aGF0ZXZlciAtIG5vdCBwYXJzZWQuICBTV0lHIHNob3VsZAogICAgICAgICAgICBub3cgY29ycmVjdGx5IGhhbmRsZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgI2lmIGRlZmluZWQgX19jcGx1c3BsdXMKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAKICAgICAgICAgICAgTm90ZTogd2FzIGltcGxlbWVudGVkIHByZXZpb3VzbHksIGJ1dCB0aGVyZSB3YXMgYSBtaW5vciBidWcuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFkYW0gSHVwcC4KICAgICAgICAgICAgICAgICAgIAowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBhcmUgZGVwcmVjYXRlZCBkdWUgdG8gYSBjaGFuZ2UgaW4gdGhlIAogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4gIEluc3RlYWQgb2YgYmVpbmcgcHJhZ21hcywgbXV0YWJpbGl0eSBpcyBub3cKICAgICAgICAgICAgY29udHJvbGxlZCBhcyBhICJmZWF0dXJlIiB1c2luZyB0aGUgZm9sbG93aW5nIHR3byBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAgICAlaW1tdXRhYmxlOwogICAgICAgICAgICAgICAgIGludCB4OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgaW50IHk7ICAgICAgICAgICAvLyByZWFkLW9ubHkgdmFyaWFibGUKICAgICAgICAgICAgICAgICAlbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgejsgICAgICAgICAgIC8vIE1vZGlmaWFibGUKCiAgICAgICAgICAgICVpbW11dGFibGUgYW5kICVtdXRhYmxlIGFyZSBtdWNoIG1vcmUgcG93ZXJmdWwgdGhhbiB0aGVpciBvbGRlcgogICAgICAgICAgICBjb3VudGVycGFydHMuICBUaGV5IGNhbiBub3cgcGlucG9pbnQgYSBzcGVjaWZpYyBkZWNsYXJhdGlvbiBsaWtlCiAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAlaW1tdXRhYmxlICB4OyAgICAgICAgIC8qIEFueSB4ICovCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIEZvbzo6eDsgICAgLyogeCBpbiBjbGFzcyBGb28gKi8KCiAgICAgICAgICAgIEluIGZhY3QsIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gaXMgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUsIAogICAgICAgICAgICAlaWdub3JlLCBhbmQgb3RoZXIgZGlyZWN0aXZlcy4gICBUaGlzIG1lYW5zIHRoYXQgdGhlIGRlY2xhcmF0aW9uCiAgICAgIAogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7CgogICAgICAgICAgICB3b3VsZCBub3Qgb25seSBhcHBseSB0byBjbGFzcyBGb28gYnV0IHRvIGFsbCBkZXJpdmVkIGNsYXNzZXMKICAgICAgICAgICAgYXMgd2VsbC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBtdXN0IGJlIHRlcm1pbmF0ZWQgYnkgYSBzZW1pLWNvbG9uLiAgVGhpcwogICAgICAgICAgICBkaWZmZXJzIHNsaWdodGx5IGZyb20gdGhlIG9sZGVyICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBkaXJlY3RpdmVzLgogICAgICAgICAgICBTaW5jZSAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBjYW4gYmUgYXBwbGllZCB0byBkZWNsYXJhdGlvbnMgdGhlCiAgICAgICAgICAgIHNlbWljb2xvbiBpcyBuZWVkZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGdsb2JhbCBmZWF0dXJlIGFuZCAKICAgICAgICAgICAgb25lIHRhcmdldGVkIHRvIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgTm90ZTogdGhpcyBpbmNvbXBhdGliaWxpdHkgaXMgdGhlCiAgICAgICAgICAgIHByaW1hcnkgcmVhc29uIGZvciBjaGFuZ2luZyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgaGFuZGxpbmcgb2YgY29weSBjb25zdHJ1Y3RvcnMuICBJZiBhIGNsYXNzIGRlZmluZXMgCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIEZvbygpOwogICAgICAgICAgICAgICAgICAgICAgRm9vKGNvbnN0IEZvbyAmKTsgICAgICAgLy8gQ29weSBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgZnVuY3Rpb24gY29weV9Gb28oKSBmb3IgdGhlIGNvcHkKICAgICAgICAgICAgY29uc3RydWN0b3IuCgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJpb25zLCB0aGlzIGdlbmVyYXRlZCBhIG5hbWUtY2xhc2ggYW5kIGFuCiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UuICAgVG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIFNXSUcKICAgICAgICAgICAgZG9lcyBub3QgY2hhbmdlIHRoZSBiZWhhdmlvciBpZiAlcmVuYW1lIGlzIHVzZWQgdG8gcmVzb2x2ZQogICAgICAgICAgICB0aGUgbmFtZSBjb25mbGljdC4gICBIb3dldmVyLCBpZiBubyBuYW1lIHJlc29sdXRpb24gaXMgbWFkZSwKICAgICAgICAgICAgdGhpcyBuZXcgYXBwcm9hY2ggaXMgdXNlZC4KCiAgICAgICAgICAgIENvcHkgY29uc3RydWN0b3JzIG1heSBiZSBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlIGluIHRoZQogICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UuICBIb3dldmVyLCB0aGlzIGlzIHVwIHRvIHRoZSBsYW5ndWFnZSBtb2R1bGUKICAgICAgICAgICAgaXRzZWxmLgogICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBpcyBub3cgbmFtZXNwYWNlIGF3YXJlLiAgIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IG1heChUIGEsIFQgYikgeyByZXR1cm4gYSA+IGIgPyBhIDogYjsgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBmb287CiAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBtYXg8aW50PjsgICAgICAgICAgICAvLyBPawoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBiYXIgewogICAgICAgICAgICAgICAgICAgdXNpbmcgZm9vOjptYXg7CiAgICAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4ZG91YmxlKSBtYXg8ZG91YmxlPjsgICAvLyBPawogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ2F2ZWF0OiB0aGUgdGVtcGxhdGUgbmFtZSBzdXBwbGllZCB0byAldGVtcGxhdGUgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICAgICAgICBzYW1lIHNjb3BlIGluIHdoaWNoIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGFwcGVhcnMuICAgVGhpcyBjb2RlIGlzCiAgICAgICAgICAgIGlsbGVnYWw6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgZm9vOjptYXg8aW50PjsKCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gcHJlcHJvY2Vzc29yLiAgIFRoZSBwcmVwcm9jZXNzb3IgY2FuIG5vdyBwZXJmb3JtCiAgICAgICAgICAgIHN0cmluZyBjb21wYXJpc29uLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBBICJoZWxsbyIKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICNpZiBBID09ICJoZWxsbyIKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgaXMgaW4gU1dJRyBtYWNyb3MuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWRlZmluZSBGT08oeCkgCiAgICAgICAgICAgICAgI2lmICN4ID09ICJpbnQiCiAgICAgICAgICAgICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaW50ICovCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgTm9ybWFsIHVzZXJzIGNhbiBwcm9iYWJseSBzYWZlbHkgaWdub3JlIHRoaXMgZmVhdHVyZS4gIEhvd2V2ZXIsIGl0IG1heQogICAgICAgICAgICBiZSB1c2VkIGluIHBhcnRzIG9mIHRoZSBTV0lHIGxpYnJhcnkuCgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZ1cnRoZXIgcmVmaW5lbWVudCBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igd3JhcHBlciBnZW5lcmF0aW9uLgogICAgICAgICAgICBTV0lHIGlzIG5vdyBtdWNoIG1vcmUgYXdhcmUgb2YgcHVyZSB2aXJ0dWFsIG1ldGhvZHMuIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgY2xhc3MgQSB7ICAgICAgICAgICAgIC8qIEFic3RyYWN0ICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QxKCkgPSAwOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QyKCkgPSAwOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsgIC8qIEFic3RyYWN0ICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QxKCkgeyB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIGNsYXNzIEMgOiBwdWJsaWMgQiB7ICAvKiBPayAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBTV0lHIHdpbGwgb25seSBnZW5lcmF0ZSBkZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgQy4KICAgICAgICAgICAgRXZlbiB0aG91Z2ggQiBsb29rcyBmaW5lLCBpdCdzIG1pc3NpbmcgYSByZXF1aXJlZCBtZXRob2QgYW5kIGlzIGFic3RyYWN0LgoKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHN0cnVjdHVyZSBkYXRhIG1lbWJlciBhY2Nlc3MuICBJZiB5b3UKICAgICAgICAgICAgaGF2ZSBhIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgQmFyICAgYjsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciBiIGFyZSBnZW5lcmF0ZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICgxKSBJZiBiIGlzICpub3QqIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgb3IgY2xhc3M6CgogICAgICAgICAgICAgICAgQmFyIEZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi0+YjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZvaWQgRm9vX2Jfc2V0KEZvbyAqc2VsZiwgQmFyIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi0+YiA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKDIpIElmIGIgKmlzKiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciAqRm9vX2JfZ2V0KEZvbyAqc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAmc2VsZi0+YjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZvaWQgRm9vX2Jfc2V0KEZvbyAqc2VsZiwgQmFyICp2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSAqdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNlZSB0aGUgIlN0cnVjdHVyZSBkYXRhIG1lbWJlcnMiIHNlY3Rpb24gb2YgRG9jL01hbnVhbC9TV0lHLmh0bWwKICAgICAgICAgICAgZm9yIGZ1cnRoZXIgZGV0YWlscy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQgcmVsaWVkIG9uIGEgbG90IG9mIGEgdW5kZWNsYXJlZAogICAgICAgICAgICBzdHJ1Y3R1cmUgYW5kIGNsYXNzIG5hbWVzLiAgICBUbyBnZXQgdGhlIG9sZCBiZWhhdmlvciwgc2ltcGx5CiAgICAgICAgICAgIHVzZSBhIGZvcndhcmQgZGVjbGFyYXRpb24gc3VjaCBhcyAic3RydWN0IEJhcjsiCiAgICAgICAgICAgIAowNC8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEMrKyBuYW1lc3BhY2Ugc3VwcG9ydCBhZGRlZC4gIFNXSUcgc3VwcG9ydHMgYWxsIGFzcGVjdHMgb2YKICAgICAgICAgICAgbmFtZXNwYWNlcyBpbmNsdWRpbmcgbmFtZXNwYWNlLCB1c2luZywgYW5kIG5hbWVzcGFjZSBhbGlhcwogICAgICAgICAgICBkZWNsYXJhdGlvbnMuICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIFNXSUcgaXMgdG8gZmxhdHRlbgogICAgICAgICAgICBuYW1lc3BhY2VzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuICBIb3dldmVyLCBuYW1lc3BhY2VzIGFyZQogICAgICAgICAgICBmdWxseSBzdXBwb3J0ZWQgYXQgdGhlIEMrKyBsZXZlbCBhbmQgaW4gdGhlIHR5cGUgc3lzdGVtLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sIGZvciBkZXRhaWxzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICAKMDQvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTdW4gaGFzIG1vZGlmaWVkIGphdmFjIGluIGpkazEuNCB0byBubyBsb25nZXIgY29tcGlsZQogICAgICAgICAgICBhbiBpbXBvcnQgb2YgYW4gdW5uYW1lZCBuYW1lc3BhY2UuIFRvIGZpeCB0aGlzIFNXSUcgbm8gbG9uZ2VyIAogICAgICAgICAgICBnZW5lcmF0ZXMgdGhlIGltcG9ydCBmb3IgcGFja2FnZWxlc3MgY2xhc3Nlcy4KICAgICAgICAgICAgaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQzNjE1NzUuaHRtbAogICAgICAgICAgICBBcyByZXBvcnRlZCBTRiAjNTM4NDE1LgoKMDMvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHN1cHBvcnQgZm9yIHBvaW50ZXItdG8tbWVtYmVyLCBzaW1pbGFyIHRvIHRoYXQKICAgICAgICAgICAgZm9yIHRoZSBQeXRob24gbW9kdWxlLiBSZW1hcmthYmx5IHNpbWlsYXIuIEFsc28gYWRkZWQgYSBuZXcKICAgICAgICAgICAgZXhhbXBsZSBmb3IgdGhpcyAoRXhhbXBsZXMvcnVieS9tcG9pbnRlciksIHdoaWNoIGlzIHJlbWFya2FibHkKICAgICAgICAgICAgc2ltaWxhciB0byB0aGUgUHl0aG9uIGV4YW1wbGUgb2YgdGhlIHNhbWUgbmFtZS4KCjAzLzI2LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZmV3IG1pbm9yIGVkaXRzIHRvIHRoZSAiQWR2YW5jZWQgVG9waWNzIgogICAgICAgICAgICBjaGFwdGVyIG9mIHRoZSBTV0lHIG1hbnVhbCBhbmQgYWRkZWQgYSBuZXcgbWFqb3Igc2VjdGlvbgogICAgICAgICAgICBhYm91dCBob3cgdG8gY3JlYXRlIG11bHRpLW1vZHVsZSBSdWJ5IHBhY2thZ2VzIHdpdGggU1dJRy4KCjAzLzI2LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBSZW1vdmVkIGFsbCBvZiB0aGUgb2xkIFJ1YnkgcHJhZ21hcy4gSWYgYW55IG9mIHRoaXMKICAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyB0cnVseSBtaXNzZWQgd2UgY2FuIHJlc3VycmVjdCBpdCwgcHJlZmVyYWJseQogICAgICAgICAgICB3aXRoIHNvbWUga2luZCBvZiBmZWF0dXJlLWJhc2VkIGRpcmVjdGl2ZS4KICAgICAgICAgICAgCjAzLzI1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBTV0lHIGV4Y2VwdGlvbiBsaWJyYXJ5IHN1cHBvcnQgZm9yIFJ1YnksIHdoaWNoCiAgICAgICAgICAgIGhhcyBhcHBhcmVudGx5IGJlZW4gYnJva2VuIGZvciBzb21lIHRpbWUuIEx1Y2tpbHksIG5vIG9uZSBzZWVtcwogICAgICAgICAgICB0byBoYXZlIG5vdGljZWQuCgowMy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEMrKy1uYW1lc3BhY2Ugc3VwcG9ydCBpbiBTV0lHIGRpcmVjdGl2ZXMuCgogICAgICAgICAgICAlYWRkbWV0aG9kczogCgogICAgICAgICAgICBUaGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIG5vdyBhY2NlcHRzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZQogICAgICAgICAgICBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIEMrKyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBGb286OkJhciBiZWxvdwogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIEZvbzo6QmFyIHsKICAgICAgICAgICAgICAgICAgICAgaW50IHNvbWVtZXRob2QoKSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoZXMgdG8gdGhlIGNsYXNzIEJhciBhYm92ZQogICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgb3RoZXJtZXRob2QoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAlZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSwgJWV4Y2VwdGlvbiwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlczoKCiAgICAgICAgICAgIE5hbWVzcGFjZXMgYXJlIGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgcmVuYW1pbmcgYW5kIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIG1hdGNoZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXJlbmFtZShkaXNwbGF5KSBGb286OnByaW50OyAgICAgICAgICAvLyBSZW5hbWUgaW4gbmFtZXNwYWNlIEZvbwogICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpCYXI6OmJsYWg7ICAgICAgICAgICAgICAgLy8gSWdub3JlIGEgZGVjbGFyYXRpb24KCiAgICAgICAgICAgICVyZW5hbWUgZGlyZWN0aXZlcyBjYW4gYmUgcGxhY2VkIGluc2lkZSBuYW1lc3BhY2UgYmxvY2tzIGFzIHdlbGwuIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgJXJlbmFtZShkaXNwbGF5KSBwcmludDsgICAgICAgICAvLyBBcHBsaWVzIHRvIHByaW50IGJlbG93CgogICAgICAgICAgICAgICAgICAgdm9pZCBwcmludCgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE1vc3Qgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIHNob3VsZCB3b3JrIHByb3Blcmx5IGluc2lkZSBuYW1lc3BhY2VzLgogICAgICAgICAgICBObyBvdGhlciBjaGFuZ2VzIGFyZSBuZWVkZWQuCiAgICAgIAowMy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgY2hhbmdlcyB0byBpbnRlcm5hbCBzeW1ib2wgdGFibGUgaGFuZGxpbmcuICAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICAgbWFuYWdlcyBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMgaW4gYSBzZXBhcmF0ZSBuYW1lc3BhY2UgdGhhbiBub3JtYWwKICAgICAgICAgICAgZGVjbGFyYXRpb25zIGxpa2UgQU5TSSBDLiAgVGhpcyBtZWFucyB5b3UgY2FuJ3QgaGF2ZSBhIHN0cnVjdHVyZQogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBmdW5jdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgRm9vKCkgeyAuLi4gfQoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBpcyBtb3JlIGxpa2UgQysrLiAgIEl0J3Mgbm90IGNsZWFyIHRoYXQgU1dJRyBldmVyCiAgICAgICAgICAgIHJlYWxseSBzdXBwb3J0ZWQgdGhlIEFOU0kgQyBhbnl3YXlzLS0tdXNpbmcgdGhlIHNhbWUgbmFtZSB3b3VsZAogICAgICAgICAgICBhbG1vc3QgY2VydGFpbmx5IGdlbmVyYXRlIGEgbmFtZS1jbGFzaCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKMDMvMjIvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFsgNTE3MzAyIF0gZm9yIGhhbmRsaW5nIG9mIHJlbmFtZWQgb3ZlcmxvYWRlZAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMuIE5vdywgcmVuYW1lZCBvdmVybG9hZGVkIGNvbnN0cnVjdG9ycyBhcmUgY29udmVydGVkCiAgICAgICAgICAgIGludG8gY2xhc3Mgc2luZ2xldG9uIG1ldGhvZHMgKGJhc2ljYWxseSBhY3RpbmcgYXMgImZhY3RvcnkiCiAgICAgICAgICAgIG1ldGhvZHMpLgoKMDMvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUzMjk1NyBdICVpZ25vcmUgcGFyc2UgZXJyb3IgYW5kIGNhc3Rpbmcgb3BlcmF0b3IuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDMvMTgvMjAwMjogYmVhemxleSAoKiogQURWQU5DRUQgVVNFUlMgT05MWSAqKikKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZHluYW1pYyBjYXN0aW5nIGluIHJldHVybiB2YWx1ZXMuICBBIHNvbWV3aGF0CiAgICAgICAgICAgIGNvbW1vbiBwcm9ibGVtIGluIGNlcnRhaW4gQysrIHByb2dyYW1zIGlzIGZ1bmN0aW9ucyB0aGF0IGhpZGUKICAgICAgICAgICAgdGhlIGlkZW50aXR5IG9mIHVuZGVybHlpbmcgb2JqZWN0cyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIAogICAgICAgICAgICBmcm9tIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBhIHByb2dyYW0gbWlnaHQgaW5jbHVkZQogICAgICAgICAgICBzb21lIGdlbmVyaWMgbWV0aG9kIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAgICBOb2RlICpnZXROb2RlKCk7CgogICAgICAgICAgICBIb3dldmVyLCBOb2RlICogbWF5IGp1c3QgYmUgYmFzZSBjbGFzcyB0byBhIHdob2xlIGhpZXJhcmNoeQogICAgICAgICAgICBvZiBkaWZmZXJlbnQgb2JqZWN0cy4gICBJbnN0ZWFkIG9mIHJldHVybmluZyB0aGlzIGdlbmVyaWMgTm9kZSAqLAogICAgICAgICAgICBpdCBtaWdodCBiZSBuaWNlIHRvIGF1dG9tYXRpY2FsbHkgZG93bmNhc3QgdGhlIG9iamVjdCBpbnRvIHRoZQogICAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlIHVzaW5nIHNvbWUga2luZCBkeW5hbWljIGNhc3QuCgogICAgICAgICAgICBBc3N1bWluZyB5b3UgdW5kZXJzdGFuZCB0aGUgcGVyaWwgaW52b2x2ZWQsIGEgZG93bmNhc3QgY2FuIG5vdwogICAgICAgICAgICBiZSBwZXJmb3JtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpbiB0aGUgcnVuLXRpbWUgdHlwZQogICAgICAgICAgICBjaGVja2VyOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqU1dJR19UeXBlRHluYW1pY0Nhc3Qoc3dpZ190eXBlX2luZm8gKiwgdm9pZCAqKnB0cik7CgogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byBhbm90aGVyCiAgICAgICAgICAgIHR5cGUuICBJZiBzbywgYSBkaWZmZXJlbnQgdHlwZSBkZXNjcmlwdG9yIChmb3IgdGhlIGNvbnZlcnRlZCB0eXBlKQogICAgICAgICAgICBpcyByZXR1cm5lZC4gICBUaGlzIHR5cGUgZGVzY3JpcHRvciB3b3VsZCB0aGVuIGJlIHVzZWQgdG8gY3JlYXRlCiAgICAgICAgICAgIGEgcG9pbnRlciBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKICAgICAgICAgICAgVG8gdXNlIHRoaXMsIHlvdSB3b3VsZCB3cml0ZSBhIHR5cGVtYXAgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIE5vZGUgKiB7CiAgICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTV0lHX1R5cGVEeW5hbWljQ2FzdCgkMV9kZXNjcmlwdG9yLCAodm9pZCAqKikgJiQxKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBTV0lHX05ld1BvaW50ZXJPYmooJDEsIHR5KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LAoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIE5vZGUgKiA9IFNXSUdUWVBFICpEWU5BTUlDOwoKICAgICAgICAgICAgVG8gbWFrZSB0aGUgdHlwZW1hcCBoYXZlIGFueSBlZmZlY3QsIHlvdSBoYXZlIHRvIHdyaXRlIGEgc3VwcG9ydGluZyAKICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCBrbm93cyBob3cgdG8gcGVyZm9ybSBkb3duY2FzdGluZy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgc3RhdGljIHN3aWdfdHlwZV9pbmZvICoKICAgICAgICAgICAgICBOb2RlX2R5bmFtaWNfY2FzdCh2b2lkICoqcHRyKSB7CiAgICAgICAgICAgICAgICAgTm9kZSAqKm5wdHIgPSAoTm9kZSAqKikgcHRyOwogICAgICAgICAgICAgICAgIEVsZW1lbnQgKmUgPSBkeW5hbWljX2Nhc3Q8RWxlbWVudCAqPigqbnB0cik7CiAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHZvaWQgKikgZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJR1RZUEVfcF9FbGVtZW50OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBEYXRhICpkID0gZHluYW1pY19jYXN0PERhdGEgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRGF0YTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBob3cgdHlwZXMgYXJlIGRldGVybWluZWQuIGR5bmFtaWNfY2FzdDw+CiAgICAgICAgICAgIHVzZXMgQysrIFJUVEkuICBIb3dldmVyLCBpZiB5b3UgaGFkIHNvbWUgb3RoZXIgbWVjaGFuaXNtIGZvciBkZXRlcm1pbmluZwogICAgICAgICAgICB0aGUgdHlwZSwgeW91IGNvdWxkIHVzZSB0aGF0IGhlcmUuICBOb3RlOiBpdCBpcyBpbXBvcnRhbnQgdG8gc2F2ZQogICAgICAgICAgICB0aGUgbmV3IHBvaW50ZXIgdmFsdWUgYmFjayBpbnRvIHRoZSBhcmd1bWVudCBhcyBzaG93bi4gIFdoZW4gZG93bmNhc3RpbmcsCiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciBjb3VsZCBjaGFuZ2UuIAoKICAgICAgICAgICAgRmluYWxseSwgdG8gbWFrZSB0aGUgY2FzdGluZyBmdW5jdGlvbiBhdmFpbGFibGUsIHlvdSBoYXZlIHRvIHJlZ2lzdGVyCiAgICAgICAgICAgIGl0IHdpdGggdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlci4gUHV0IHRoaXMgbWFjcm8gaW4geW91ciBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgICAgICAgIERZTkFNSUNfQ0FTVChTV0lHVFlQRV9wX05vZGUsIE5vZGVfZHluYW1pY19jYXN0KTsKCiAgICAgICAgICAgIE5vdGU6IHRoaXMgZmVhdHVyZSBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBwZXJmb3JtYW5jZSBwZW5hbHR5IG9uIAogICAgICAgICAgICBub3JtYWwgU1dJRyBvcGVyYXRpb24uICBUaGUgZmVhdHVyZSBpcyBvbmx5IGVuYWJsZWQgYnkgd3JpdGluZwogICAgICAgICAgICBhIG5ldyB0eXBlbWFwIHRoYXQgZXhwbGljaXRseSBjYWxscyBTV0lHX1R5cGVEeW5hbWljQ2FzdCgpIHRvCiAgICAgICAgICAgIG1ha2UgYSBjb252ZXJzaW9uLiAKICAKICAgICAgICAgICAgRXhhbXBsZXMvdGVzdC1zdWl0ZS9keW5hbWljX2Nhc3QuaSBjb250YWlucyBhIHNpbXBsZSBleGFtcGxlLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgSmF2YSBtb2R1bGUgZHVlIHRvIGRpZmZlcmVuY2VzCiAgICAgICAgICAgIGluIHRoZSB0eXBlLWNoZWNraW5nIGltcGxlbWVudGF0aW9uLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKMDMvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTbWFsbCBjaGFuZ2UgdG8gdHlwZS1uYW1lIGhhbmRsaW5nIG9mIHVubmFtZWQgc3RydWN0dXJlcyBhbmQKICAgICAgICAgICAgdHlwZWRlZi4gIElmIGEgc3RydWN0dXJlIG9mIHRoaXMgZm9ybSBhcHBlYXJzOgoKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9IEZvbzsKCiAgICAgICAgICAgIFRoZW4gJ0ZvbycgaXMgdXNlZCBhcyB0aGUgcHJvcGVyIHR5cGVuYW1lIGZvciB0aGUgc3RydWN0dXJlLgogICAgICAgICAgICBGdXJ0aGVybW9yZSwgRm9vIGNhbiBub3cgYmUgdXNlZCBhcyBhIG5hbWUgaW4gQysrIGluaGVyaXRhbmNlLgogICAgICAgICAgICBTV0lHIHdhcyBhbHJlYWR5IGtpbmQgb2YgZG9pbmcgdGhpcywgYnV0IHRoaXMgbW9kaWZpY2F0aW9uIHJlZmluZXMKICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIHRvIG1vcmUgY2xvc2VseSBmb2xsb3cgdGhlIEMrKyBBUk0sIHNlY3Rpb24KICAgICAgICAgICAgNy4xLjMsIHAuIDEwNi4gIFRoaXMgZml4ZXMgYSBjb3VwbGUgb2Ygb2JzY3VyZSBjb3JuZXIgY2FzZXMuCgowMy8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIEMrKyBpbmhlcml0YW5jZSB3aXRoIGEgZmV3IGVuaGFuY2VtZW50cy4gIEZpcnN0LCB0eXBlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIG5lZWRlZCBmb3IgY2FzdGluZyBhbmQgdHlwZS1lcXVpdmFsZW5jZSBpcyBnZW5lcmF0ZWQgZXZlbiB3aGVuIGJhc2UtY2xhc3NlcwogICAgICAgICAgICBhcmVuJ3QgZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciAgeyAgICAvKiBCYXIgdW5zcGVjaWZpZWQgKi8KICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdm9pZCBibGFoKEJhciAqYik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBibGFoKCkgZnVuY3Rpb24gc3RpbGwgYWNjZXB0cyBGb28gKiBldmVuIHRob3VnaCBub3RoaW5nCiAgICAgICAgICAgIGlzIHJlYWxseSBrbm93biBhYm91dCBCYXIuICAgUHJldmlvdXMgU1dJRyB2ZXJzaW9ucyB3b3VsZCBqdXN0IGdlbmVyYXRlCiAgICAgICAgICAgIGEgdHlwZSBlcnJvci4KCiAgICAgICAgICAgIEluaGVyaXRhbmNlIGhhcyBhbHNvIGJlZW4gbW9kaWZpZWQgdG8gd29yayB0aHJvdWdoIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIEJhciBPdGhlckJhcjsKICAgICAgICAgICAgICAgY2xhc3MgRm9vOiBwdWJsaWMgT3RoZXJCYXIgewogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBiYXNlIGNsYXNzIG9mIE90aGVyQmFyIGlzIGNvcnJlY3RseSByZXNvbHZlZCBiYWNrIHRvCiAgICAgICAgICAgIEJhci4gICBUaGUgdXNlIG9mIHRoZSBuYW1lIE90aGVyQmFyIGlzIGxvc3QgaW4gdGhpcyByZXNvbHV0aW9uICh0aGUgd3JhcHBlcnMKICAgICAgICAgICAgd2lsbCBzaW1wbHkgdXNlIEJhciBpbnN0ZWFkIG9mIHRoZSB0eXBlZGVmIG5hbWUgT3RoZXJCYXIpLgogICAgICAgICAgIAowMy8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICV0eXBlbWFwLCAlYXBwbHksIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgY2FuIG5vdyBhcHBlYXIgaW5zaWRlCiAgICAgICAgICAgIGNsYXNzIGRlZmluaXRpb25zLiAgIAoKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2YgcHJvYmxlbXMgcmVsYXRlZCB0byBjb21waWxpbmcgU1dJRyBvbiA2NC1iaXQKICAgICAgICAgICAgcGxhdGZvcm1zLgoKMDMvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggImlnbm9yZSIgYW5kICJpbiIgdHlwZW1hcHMuICBMb2NhbCB2YXJpYWJsZXMKICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoICJpbiIgd2VyZSBiZWluZyBhZGRlZCB0byB0aGUgd3JhcHBlciBmdW5jdGlvbiBldmVuCiAgICAgICAgICAgIHRob3VnaCB0aGV5IHdlcmUgbmV2ZXIgdXNlZC4gICBNb3N0bHkgaGFybWxlc3MsIGJ1dCBpdCB3b3VsZCBsZWFkCiAgICAgICAgICAgIHRvIGEgdmFyaWV0eSBvZiBjb21waWxhdGlvbiB3YXJuaW5ncy4KICAKMDMvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gdGhlIGludGVybmFsIHR5cGUgc3lzdGVtIGFuZCBoYW5kbGluZyBvZiBuZXN0ZWQgQysrCiAgICAgICAgICAgIHR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGlmIHlvdSBoYWQgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc29tZW1ldGhvZChCbGFoIHgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgYXJndW1lbnQgdHlwZSBpbiBzb21lbWV0aG9kKCkgd291bGQgaW1wbGljaXRseSBiZSBzZXQgdG8gQmFyOjpCbGFoLgogICAgICAgICAgICBBbHRob3VnaCB0aGlzIGlzIHRlY2huaWNhbGx5IGFsbG93ZWQsIGl0IGJyZWFrcyB0eXBlbWFwcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vOjpCbGFoIHsgLi4uIH0KCiAgICAgICAgICAgIGRvZXNuJ3QgbWF0Y2ggbGlrZSB5b3UgZXhwZWN0LiAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBpbiBTV0lHLTEuMy4xMi4KICAgICAgICAgICAgTm93LCB0eXBlcyBhcmUgZXhwYW5kZWQgdXNpbmcgdGhlIGNsYXNzIGluIHdoaWNoIHRoZXkgd2VyZSBkZWZpbmVkLgogICAgICAgICAgICBTbywgdGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdpbGwgYmUgRm9vOjpCbGFoLS0tc2luY2UgdGhlCiAgICAgICAgICAgIHR5cGUgQmxhaCB3YXMgZGVmaW5lZCBpbiBGb28uCiAKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHN1YnRsZSB0eXBlIHNjb3BpbmcgcHJvYmxlbXMgd2l0aCB0eXBlZGVmIGFuZCBDKysgY2xhc3Nlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEJsYWg7CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIEJsYWg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oQmxhaCB4LCA6OkJsYWggeSk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSGlnaGx5IGV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gaGFuZGxlIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCiAgICAgICAgICAgIEZpcnN0LCB0aGVyZSBpcyBubyBwb3J0YWJsZSBvciByZWxpYWJsZSB3YXkgdG8gd3JhcAogICAgICAgICAgICBhIHZhcmFyZ3MgZnVuY3Rpb24gaW4gZnVsbCBnZW5lcmFsaXR5LiAgSG93ZXZlciwgeW91ICpjYW4qIGNoYW5nZQogICAgICAgICAgICB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIHVzaW5nICV2YXJhcmdzLgoKICAgICAgICAgICAgICAgJXZhcmFyZ3MoY2hhciAqKSBmcHJpbnRmOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgLi4uKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHZhcmlhYmxlIGxlbmd0aCBwYXJhbWV0ZXIgIi4uLiIgaXMKICAgICAgICAgICAgc2ltcGx5IHJlcGxhY2VkIGJ5IHRoZSBwYXJhbWV0ZXJzIGdpdmVuIGluICV2YXJhcmdzLiBUaGlzCiAgICAgICAgICAgIHJlc3VsdHMgaW4gYSBmdW5jdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICB2b2lkIGZwcmludGYoRklMRSAqZiwgY2hhciAqZm10LCBjaGFyICpzKTsKCiAgICAgICAgICAgIE1vcmUgdGhhbiBvbmUgYXJndW1lbnQgY2FuIGJlIHVzZWQgYW5kIGRlZmF1bHQgdmFsdWVzCiAgICAgICAgICAgIGNhbiBiZSBkZWZpbmVkLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBzcGVjaWZpZXMgYQogICAgICAgICAgICBtYXhpbXVtIG9mIGZvdXIgYXJndW1lbnRzLgoKICAgICAgICAgICAgICAgJXZhcmFyZ3MoY2hhciAqeDEgPSAwLCBjaGFyICp4MiA9IDAsIGNoYXIgKngzID0gMCwgY2hhciAqeDQgPSAwKSBmcHJpbnRmOwogCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gaGFuZGxpbmcgb2YgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4gIHZhcmFyZ3MKICAgICAgICAgICAgaXMgbm93IGhhbmRsZWQgYXMgYSBwcm9wZXIgcGFyYW1ldGVyIGFuZCBpcyBwYXNzZWQgdG8gdGhlCiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdG9yLiAgSG93ZXZlciwgaXQgc3RpbGwgY2FuJ3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkKICAgICAgICAgICAgKGFuZCB3aWxsIGdlbmVyYXRlIGEgdHlwZW1hcCB3YXJuaW5nKS4gICBUaGlzIGNoYW5nZSBoYXMgYmVlbgogICAgICAgICAgICBtYWRlIHRvIGJldHRlciBpbmNvcnBvcmF0ZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzIHdpdGggb3RoZXIKICAgICAgICAgICAgZGlyZWN0aXZlcyBzdWNoIGFzICVpZ25vcmUsICVyZW5hbWUsICVmZWF0dXJlLCBhbmQgc28gZm9ydGguCgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTIyNTU1IF0gU3ludGF4IGVycm9yIHBhcnNpbmcgImRlZmluZSIgY29uc3RydWN0LiBTV0lHCiAgICAgICAgICAgIGlzIGEgbGl0dGxlIG1vcmUgcmVzdHJpY3RpdmUgaW4gZGV0ZXJtaW5pbmcgI2RlZmluZSBzdGF0ZW1lbnRzCiAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGFzIGNvbnN0YW50cy4gIEFsc28gYWRkZWQgYSBiZXR0ZXIgcGFyc2VyCiAgICAgICAgICAgIGVycm9yIHJ1bGUgZm9yIGhhbmRsaW5nIGJhZCBjb25zdGFudHMuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IENsYXNzZXMgcmVuYW1lZCB3aXRoICVyZW5hbWUgdGhhdCBhcmUgZGVyaXZlZCBmcm9tIAogICAgICAgICAgICBhbm90aGVyIGNsYXNzIGdlbmVyYXRlIG1vcmUgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIGNvZGUuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFNGIFsgIzUyMzYzMiBdIGFuZCBbICM1MTMzMzUgXSBib3RoIHJlcG9ydGVkIGJ5IElzcmFlbCAKICAgICAgICAgICAgVGFubmVyLiBTdXBwb3J0IGZvciB0eXBlcyB0aGF0IGFyZSB1c2VkIHdoaWNoIGFyZSBpbiBhIHR5cGVkZWYuIFRoZQogICAgICAgICAgICBhcHByb3ByaWF0ZSBzaGFkb3cgY2xhc3MgbmFtZSBpcyBnZW5lcmF0ZWQuIEFsc28gZ2VuZXJhdGVkIGNvcnJlY3QKICAgICAgICAgICAgc2hhZG93IGNsYXNzbmFtZSB3aGVuIGEgdGVtcGxhdGVkIGNsYXNzIGlzIHVzZWQgd2l0aGluIGFub3RoZXIgCiAgICAgICAgICAgIHRlbXBsYXRlZCBjbGFzcy4gU2VlIHRoZSBjcHBfdHlwZWRlZi5pIHRlc3RjYXNlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBObyB0eXBlIHdhcyBnZW5lcmF0ZWQgaW4gc2hhZG93IGNsYXNzZXMgZm9yIHR5cGVzIAogICAgICAgICAgICB0aGF0IHdlcmVuJ3Qgd3JhcHBlZCBieSBTV0lHLiAgVGhlIHR5cGUgaXMgdHJlYXRlZCBhcyBhIHJhdyAKICAgICAgICAgICAgcG9pbnRlciwgaWUgbm8gc2hhZG93IGNsYXNzLgoKMDIvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZWZpbmVkIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gdXNlZCBieSAlcmVuYW1lLCAlaWdub3JlLCBhbmQKICAgICAgICAgICAgJWZlYXR1cmUuICAgSWYgYSB0eXBlIHNpZ25hdHVyZSBpcyBzdXBwbGllZCwgaXQgbXVzdCBleGFjdGx5CiAgICAgICAgICAgIG1hdGNoIHRoYXQgdXNlZCBpbiB0aGUgZGVjbGFyYXRpb24tLS1pbmNsdWRpbmcgYW55IHVzZSBvZgogICAgICAgICAgICBjb25zdC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vMSkgICBmb28oaW50KTsKICAgICAgICAgICAgICAgICVyZW5hbWUoYmFyMSkgICBiYXIoaW50KSBjb25zdDsKCiAgICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7ICAgICAgIC8vIE1hdGNoZWQgLS0+IGZvbzEKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCkgY29uc3Q7IC8vIE5vdCBtYXRjaGVkIAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsgICAgICAgLy8gTm90IG1hdGNoZWQKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCkgY29uc3Q7IC8vIE1hdGNoZWQgLS0+IGJhcjEKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIG5vbi1jb25zdCBzcGVjaWZpY2F0aW9uIHdvdWxkIG1hdGNoCiAgICAgICAgICAgIGJvdGggdGhlIG5vbi1jb25zdCBhbmQgY29uc3QgZGVjbGFyYXRpb25zLiAgSG93ZXZlciwgdGhlIHdob2xlCiAgICAgICAgICAgIHBvaW50IG9mICVyZW5hbWUgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcyBpcyB0aGF0IHRoZXkgYmUgYWJsZQogICAgICAgICAgICB0byBwcmVjaXNlbHkgcGlucG9pbnQgZXhhY3QgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZS4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgdGhlIHByb2JsZW0uCgowMi8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJld29ya2VkIHRoZSBoYW5kbGluZyBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9ycy4KICAgICAgICAgICAgU1dJRyBub3cgbWFrZXMgYSBwcmVsaW1pbmFyeSBwYXNzIG92ZXIgdGhlIHBhcnNlIHRyZWUgdG8gZGlzY292ZXIKICAgICAgICAgICAgd2hpY2ggY2xhc3NlcyBzdXBwb3J0IGRlZmF1bHQgYWxsb2NhdGlvbi4gICBUaGlzIGZpeGVzIGEgbnVtYmVyCiAgICAgICAgICAgIG9mIHZlcnkgc3VidGxlIGlzc3VlcyBpbiBjb2RlIGdlbmVyYXRpb24gYW5kIGNhbGwvcmV0dXJuIGJ5IHZhbHVlLgoKMDIvMTgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEltcHJvdmVkIHN1cHBvcnQgb24gQ3lnd2luOiBQZXJsLCBQeXRob24sIFRjbCwgUnVieSBhbmQgSmF2YSBzaG91bGQKICAgICAgICAgICAgd29yayBvdXQgb2YgdGhlIGJveCwgYmFycmluZyB0aGUgcnVudGltZSBsaWJyYXJ5LiBSZW1vdmVkIGRsbHdyYXAgCiAgICAgICAgICAgIGFuZCByZXBsYWNlZCB3aXRoIG5ld2x5IHdvcmtpbmcgZ2NjIC1zaGFyZWQgaW5zdGVhZCBmb3IgQ3lnd2luLiAKICAgICAgICAgICAgQWxsIHRoaXMgd2lsbCByZXF1aXJlIHRoZSBuZXcgaW1wcm92ZWQgYmludXRpbHMgMjAwMTA4MDIgYW5kIGxhdGVyLAogICAgICAgICAgICBidXQgdGhlIGxhdGVzdCBDeWd3aW4gaXMgdXN1YWxseSB0aGUgYmVzdCByZWNvbW1lbmRhdGlvbi4KCjAyLzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIHdyYXBwaW5nIG9mIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgICAgYW5kIFBlcmwgc2hhZG93IGNsYXNzZXMuIFJlcG9ydGVkIGJ5IENoaWEtbGlhbmcgS2FvLgoKMDIvMTUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hZGUgYSBmaXggdG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBmb3IgQysrIGNsYXNzCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBzbyB0aGF0IHdlIGdldCBib3RoIGEgIm5ldyIgc2luZ2xldG9uIG1ldGhvZAogICAgICAgICAgICBhbmQgYW4gImluaXRpYWxpemUiIGluc3RhbmNlIG1ldGhvZCBmb3IgZWFjaCBjbGFzcy4gVGhpcwogICAgICAgICAgICBjaGFuZ2UgZW5hYmxlcyBkZXZlbG9wZXJzIHRvIGRlcml2ZSBuZXcgUnVieSBjbGFzc2VzIGZyb20KICAgICAgICAgICAgU1dJRy13cmFwcGVkIEMrKyBjbGFzc2VzIGFuZCB0aGVuIG92ZXJyaWRlIHRoZWlyIGluaXRpYWxpemUKICAgICAgICAgICAgbWV0aG9kcyB0byBwcm92aWRlIHN1YmNsYXNzLXNwZWNpZmljIGluc3RhbmNlIGluaXRpYWxpemF0aW9uLgoKMDIvMTUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hc3NpdmUgZG9jdW1lbnRhdGlvbiB1cGRhdGUgZm9yIHRoZSBSdWJ5IG1vZHVsZSwKICAgICAgICAgICAgY29udHJpYnV0ZWQgYnkgQ3JhaWcgRmlsZXMuCgowMi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQnVnIGZpeDogQW4gZXJyb3IgaW4gdGhlIFNXSUcgcnVudGltZSBzdXBwb3J0IGZvciBSdWJ5CiAgICAgICAgICAgIHdhcyBjYXVzaW5nIHNldmVyYWwgb2YgdGhlIGV4YW1wbGVzIHRvIGZhaWwuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFdpbGxpYW0gRnVsdG9uLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEVudW1lcmF0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIGNsYXNzIChzdWNoCiAgICAgICAgICAgIGFzIHRob3NlIHNlZW4gaW4gdGhlIEV4YW1wbGVzL3J1YnkvZW51bSBleGFtcGxlKSB3ZXJlIG5vdAogICAgICAgICAgICBiZWluZyBleHBvcnRlZCB3aXRoIHRoZSBjb3JyZWN0IG5hbWVzLiBSZXBvcnRlZCBieSBXaWxsaWFtCiAgICAgICAgICAgIEZ1bHRvbi4KCjAyLzEzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHdlIHJ1biBhY3Jvc3Mgb3ZlcmxvYWRlZAogICAgICAgICAgICBjbGFzcyBjb25zdHJ1Y3RvcnMgZm9yIEMrKyBjb2RlLCB0aGF0IHRoaXMgaXMgY3VycmVudGx5IG5vdAogICAgICAgICAgICBzdXBwb3J0ZWQgKGV2ZW4gaWYgdGhlIG92ZXJsb2FkcyBoYXZlIGJlZW4gJXJlbmFtZWQpLiBGb3IgYW4KICAgICAgICAgICAgZXhhbXBsZSBvZiB3aGVyZSB0aGlzIGRvZXNuJ3Qgd29yaywgc2VlIEV4YW1wbGVzL3J1Ynkvb3BlcmF0b3IuCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYW4gImlnbm9yZWQiIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHRoZSBwYXJzZXIgcnVucwogICAgICAgICAgICBhY3Jvc3MgYW4gb3BlcmF0b3IhPSgpIGRlY2xhcmF0aW9uIGZvciBDKysgY29kZS4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgImltcG9ydCIsICJpbXBvcnRfdGVtcGxhdGUiLCAib3BlcmF0b3IiIGFuZAogICAgICAgICAgICAidGVtcGxhdGUiIGV4YW1wbGVzLgoKMDIvMTEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG11bHRpLW1vZHVsZSBzdXBwb3J0LgoKMDIvMDkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSBtaXNzaW5nICIjZGVmaW5lIFNXSUdfTk9JTkNMVURFIiBhdCB0aGUgdG9wIG9mCiAgICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2hlbiB0aGUgJy1jJyBvcHRpb24gaXMgdXNlZC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIENvcnJlY3RlZCBhIG1pbm9yIG9mZi1ieS1vbmUgZXJyb3IgZm9yIHRoZSBzaXplIG9mIHRoZQogICAgICAgICAgICBzd2lnX3R5cGVzW10gYXJyYXkgdGhhdCdzIGdlbmVyYXRlZCBpbiB0aGUgd3JhcHBlciBjb2RlLgoKMDIvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBTRiBbICM1MTUwNTggXSBXcm9uZyBjb2RlIGZvciBDKysgdGVtcGxhdGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBJc3JhZWwgVGFsbGVyLgoKVmVyc2lvbiAxLjMuMTEgKEphbnVhcnkgMzEsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggdG8gcGFzcy9yZXR1cm4gYnkgdmFsdWUgZm9yIEMrKyBvYmplY3RzIHRoYXQgZGVmaW5lCiAgICAgICAgICAgIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuICBDaGFuZ2VzIHRvIHRoZSB0eXBlbWFwIHN5c3RlbQogICAgICAgICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gd3JhcCBDKysgb2JqZWN0cyB3aXRoIG5vIGRlZmF1bHQKICAgICAgICAgICAgY29uc3RydWN0b3IuICAgVGhpcyBoYXMgYmVlbiBmaXhlZCwgYnV0IHRoZSBzb2x1dGlvbiAKICAgICAgICAgICAgaW52b2x2ZXMgc29tZSBjbGV2ZXIgdGVtcGxhdGUgbWFnaWMgY29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIFdpbGxpYW0gRnVsdG9uLiAgUGxlYXNlIHNlZSB0aGUgY29tbWVudHMgaW4gdGhlIGZpbGUKICAgICAgICAgICAgTGliL3N3aWcuc3dnIGZvciBmdXJ0aGVyIGRldGFpbHMuICBUaGlzIHNvbHV0aW9uIGlzCiAgICAgICAgICAgIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGJlIHJlZmluZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgR2xvYmFsIHZhcmlhYmxlcyBhbmQgbWVtYmVyIGRhdGEgb2YgdHlwZSAiY29uc3QgY2hhciAqIgogICAgICAgICAgICBjYW4gYmUgc2V0LCBidXQgdGhlIG9sZCB2YWx1ZSBpcyBzaWxlbnRseSBkaXNjYXJkZWQgd2l0aG91dAogICAgICAgICAgICBhbnkgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgIFRoaXMgbWF5IGdlbmVyYXRlIGEgbWVtb3J5IGxlYWsuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIG5lZWRlZCB0byBtb3JlIHNhZmVseSBoYW5kbGUgdmFyaWFibGVzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb28gPSAiSGVsbG8gV29ybGRcbiI7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGl0J3Mgbm90IHNhZmUgdG8gZnJlZSB0aGUgb2xkIHZhbHVlLiAgSG93ZXZlciwKICAgICAgICAgICAgU1dJRyBjYW4gZHluYW1pY2FsbHkgYWxsb2NhdGUgYSBuZXcgdmFsdWUgYW5kIG1ha2UgZm9vIHBvaW50CiAgICAgICAgICAgIHRvIGl0LiAgIFRvIGZpeCB0aGlzIG1lbW9yeSBsZWFrLCB5b3UgY2FuIHByb2JhYmx5IGRvIHRoaXM6CgogICAgICAgICAgICAgICAlY2xlYXIgY29uc3QgY2hhciAqZm9vOwogICAgICAgICAgICAgICAlYXBwbHkgY2hhciAqIHtjb25zdCBjaGFyICpmb299OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIAowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFR3byBtaW5vciB0eXBlbWFwIGVuaGFuY2VtZW50cyBoYXZlIGJlZW4gYWRkZWQuICBGaXJzdCwKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlIGJ5IGluY2x1ZGluZyBhIHNwZWNpYWwKICAgICAgICAgICAgd2FybmluZyBhdHRyaWJ1dGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGluLHdhcm5pbmc9IkknbSBnb2luZyB0byBkbyBzb21ldGhpbmcgZGFuZ2Vyb3VzIikgLi4uCgogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlIHdpbGwgc2hvdyB1cCB3aGVuZXZlciB0aGUgdHlwZW1hcCBpcwogICAgICAgICAgICBhcHBsaWVkLgoKICAgICAgICAgICAgU2Vjb25kLCBhIHR5cGVtYXAgY2FuIGZvcmNlIGEgbm8tbWF0Y2ggYnkgZGVmaW5pbmcKCiAgICAgICAgICAgICAldHlwZW1hcChpbikgc29tZXR5cGUgInBhc3MiOwoKICAgICAgICAgICAgSWYgdGhpcyBpcyB1c2VkLCB0aGUgdHlwZW1hcCBzeXN0ZW0gd2lsbCAqbm90KiByZWNvcmQgYQogICAgICAgICAgICB0eXBlbWFwIG1hdGNoIGZvciAic29tZXR5cGUiLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gYmxvY2sKICAgICAgICAgICAgc2VsZWN0ZWQgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBkaXNhYmxlCiAgICAgICAgICAgIGEgdHlwZW1hcCBmZWF0dXJlIGZvciBzb21lIHR5cGUsIHlvdSBjb3VsZCBkbyB0aGlzLgoKICAgICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93IGdsb2JhbCB2YXJpYWJsZXMgb2YgdHlwZSAnY29uc3QgY2hhciAqJyB0byBiZSBzZXQuCiAgICAgICAgICAgICAgICV0eXBlbWFwKHZhcmluKSBjb25zdCBjaGFyICogInBhc3MiOwoKICAgICAgICAgICAgSXQgbWlnaHQgYWxzbyBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyB0byBkbyBzdWJ0bGUgYW5kCiAgICAgICAgICAgIHN0cmFuZ2UgdGhpbmdzIHdpdGggdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0bwogICAgICAgICAgICBtYWtlICdibGFoIConIGFuIG91dHB1dCB2YWx1ZSBhbmQgJ2NvbnN0IGJsYWggKicgYW4gaW5wdXQKICAgICAgICAgICAgcGFyYW1ldGVyLCB5b3UgbWlnaHQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIGJsYWggKihibGFoIHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBibGFoICogewogICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEJsb2NrIHVucXVhbGlmaWVkIHR5cGVtYXBzIGRlZmluZWQgYWJvdmUgKi8KICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgY29uc3QgYmxhaCAqICJwYXNzIjsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgY29uc3QgYmxhaCAqICJwYXNzIjsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAgICAgY29uc3QgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGlucHV0IHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgIChUaGlzIHBvdGVudGlhbCBhcHBsaWNhdGlvbnMgb2YgdHlwZW1hcHMgc3VnZ2VzdGVkIGJ5IEdyZWcgU3RlaW4pLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8yOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gZW51bWVyYXRpb25zIHdlcmUgd3JhcHBlZCB3aGVuIHRoZSAtc2hhZG93IAogICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZC4gUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KCjAxLzI4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBHbG9iYWwgYXJyYXlzIGFyZSBzdWNjZXNzZnVsbHkgd3JhcHBlZC4gSW4gZmFjdCB0aGV5IHN0YXJ0ZWQKICAgICAgICAgICBtb3N0bHkgd29ya2luZyBpbiBTV0lHLTEuMy4xMC4KCjAxLzI4LzIwMDI6cmljaGFyZHAKCSAgIEFkZGVkIGZpcnN0IGF0dGVtcHQgYXQgQysrIGFuZCAtc2hhZG93IHN1cHBvcnQgZm9yIFBIUDQgbW9kdWxlLAoJICAgcGxlYXNlIHRlc3QgYW5kIG1haWwgbWUgaWYgYW55IHByb2JsZW1zL2lkZWFzIG9uIGltcHJvdmluZyBpdC4KCgkgICBUaGVyZSBpcyBhIGtub3duIHByb2JsZW0gd2l0aCB1bmluaXRpYWxpemVkIG1lbWJlciB2YXJpYWJsZXMsCgkgICBwbGVhc2Ugc2VlIEV4YW1wbGVzL3BocDQvc3luYy9SRUFETUUgZm9yIGRldGFpbHMuCgoJICAgQWxzbyBtb3JlIFBIUCBkb2N1bWVudGF0aW9uIGFkZGVkIHRvIERvYy9NYW51YWwvUGhwLmh0bWwKCjAxLzI3LzIwMDI6YmVhemxleQogICAgICAgICAgIFRoZSBBTlNJIEMgc2l6ZV90IHR5cGUgaXMgbm93IHJlY29nbml6ZWQgYXMgYW4gaW50ZWdlciBieSBkZWZhdWx0LgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgc3VwcG9ydCBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgVGhpcyBpcyBub3QgYSBwb3J0YWJsZSBmZWF0dXJlIGFuZCB3aWxsIHJlcXVpcmUgY29tcGlsZXIgc3VwcG9ydAogICAgICAgICAgIGZvciB0aGUgbG9uZyBsb25nIHR5cGUuICBJbiB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHN1cHBvcnQKICAgICAgICAgICBsb25nIGxvbmcgKGUuZy4sIFRjbCBhbmQgUGVybCksIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZwogICAgICAgICAgIG9mIGRpZ2l0cy4gIFRoaXMgcHJldmVudHMgdGhlaXIgdXNlIGluIGFyaXRobWV0aWMgY2FsY3VsYXRpb25zLCBidXQKICAgICAgICAgICBzdGlsbCBhbGxvd3MgdmFsdWVzIHRvIGJlIHNldCBmcm9tIGEgc3RyaW5nLiAgCgogICAgICAgICAgIGxvbmcgbG9uZyBzdXBwb3J0IHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHN0cnRvbGwoKSBhbmQgc3RydG91bGwoKQogICAgICAgICAgIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSAnbGxkJyBhbmQgJ2xsdScgZm9ybWF0IHNwZWNpZmllcnMKICAgICAgICAgICBvZiBzcHJpbnRmKCkuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM1MDE4MjcgXSBEZWxldGUgbWV0aG9kIGlzIG5vdCBjYWxsZWQuICAgVGhlIFRjbAogICAgICAgICAgIG1vZHVsZSB3YXNuJ3QgY29ycmVjdGx5IGNhbGxpbmcgZGVzdHJ1Y3RvcnMgd2hlbiB0aGV5CiAgICAgICAgICAgd2VyZSBkZWZpbmVkIHVzaW5nICVhZGRtZXRob2RzLiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBSZWluaGFyZCBGb2JiZS4KCjAxLzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuICBUeXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiBhIG51bWJlciBvZiBtb2R1bGVzIGZvciBoYW5kbGluZyB0aGVzZSB0eXBlcy4KICAgICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIHBhcnNlciBoYXMgYmVlbiBtb2RpZmllZCB0byBhY2NlcHQgbG9uZyBsb25nCiAgICAgICAgICAgbGl0ZXJhbHMgc3VjaCBhcyAxMjM0TEwgYW5kIDEyMzRVTEwuCgowMS8yNy8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQSBDIGNoYXJbXSBpcyBtYXBwZWQgdG8gYSBKYXZhIFN0cmluZyB3aGljaCBpcyB0aGUgZGVmYXVsdCAKICAgICAgICAgICBTV0lHIGhhbmRsaW5nIG9mIGNoYXJbXSBhbmQgY2hhciouIEl0IHVzZWQgdG8gYmUgbWFwcGVkIHRvIGJ5dGVbXS4gCiAgICAgICAgICAgTm90ZSB0aGF0IGEgQyBzaWduZWQgY2hhcltdIGFycmF5IGlzIG1hcHBlZCB0byBieXRlW10uCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDEvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHJldHVybi1ieS12YWx1ZSwgQysrLCBhbmQKICAgICAgICAgICBvYmplY3RzIHRoYXQgZGVmaW5lIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9lbCBSZWVkLgoKMDEvMjUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE92ZXJoYXVsIG9mIHRoZSBKYXZhIG1vZHVsZS4gVGhlIEMgY29kZSBnZW5lcmF0aW9uIGlzIG5vdyAKICAgICAgICAgICBkb25lIGZyb20gdHlwZW1hcHMuCgowMS8yNC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gU3VwcG9ydCBmb3IgYXJyYXlzIG9mIGVudW0gcG9pbnRlcnMKCjAxLzIwLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBFcnJvciBjaGVja2luZyBmb3IgbnVsbCBKYXZhIG9iamVjdHMgYmVpbmcgcGFzc2VkIHRvIG5hdGl2ZSAKICAgICAgICAgICBmdW5jdGlvbnMuICBFeGNlcHRpb24gdGhyb3duIG5vdyB3aGVyZWFzIGJlZm9yZSB0aGUgSlZNIGNyYXNoZWQuCgowMS8xOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ29ycmVjdGVkIGJlaGF2aW91ciBmb3IgZnVuY3Rpb25zIHRoYXQgdGFrZSBhcnJheXMuIEZvciAKICAgICAgICAgICBleGFtcGxlLCB3aGVuIHRoaXMgYyBmdW5jdGlvbjogCgogICAgICAgICAgIHZvaWQgYXJyYXlmbihpbnQgYXJyYXlbXSk7CiAgICAgICAgICAgCiAgICAgICAgICAgaXMgd3JhcHBlZCB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgZnVuY3Rpb24KCiAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBhcnJheWZuKGludFtdIGFycmF5KTsKCiAgICAgICAgICAgaXMgcHJvZHVjZWQuIFByZXZpb3VzbHkgaWYgdGhlIEMgZnVuY3Rpb24gbWFkZSBhbnkgY2hhbmdlcyB0byB0aGUgCiAgICAgICAgICAgYXJyYXkgZWxlbWVudHMsIHRoZXNlIHdlcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gdGhlIEphdmEgYXJyYXkuIAogICAgICAgICAgIFRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZCBzbyB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBwcm9wb2dhdGVkIGJhY2sKICAgICAgICAgICB0byBKYXZhIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiB3aWxsIHNlZSB0aGVzZSBjaGFuZ2VzLiBUaGlzIGlzIAogICAgICAgICAgIGhvdyBwdXJlIEphdmEgZnVuY3Rpb25zIHdvcmssIGllIGFycmF5cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KCjAxLzE1LzIwMDI6bWtvZXBwZQogICAgICAgICAgIFtHdWlsZV0gTmV3IGZpbGUgY3BsdXNwbHVzLmkgd2l0aCBDKysgdHlwZW1hcHMgY29udHJpYnV0ZWQKICAgICAgICAgICBieSBNYXJjaW8gTHVpcyBUZWl4ZWlyYSA8bWFyY2lvdEBob2xseS5jb2xvc3RhdGUuZWR1Pi4KCjAxLzExLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDaGFuZ2VkIG1hcHBpbmcgb2YgQyBsb25nIHRvIEphdmEgdHlwZS4gV2FzIG1hcHBlZCB0byBKYXZhCiAgICAgICAgICAgbG9uZywgbm93IG1hcHBlZCB0byBKYXZhIGludC4gSWYgeW91IHdhbnQgdGhlIHByZXZpb3VzIG1hcHBpbmcgdG8gCiAgICAgICAgICAgSmF2YSBsb25nIHVzZSB0aGlzIGFwcHJvYWNoIGluIHlvdXIgaW50ZXJmYWNlIGZpbGU6CiAgICAgICAgICAgCiAgICAgICAgICAgICAlY2xlYXIgbG9uZzsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZyAgICAgICAgICAgICAiamxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZyAgICAgICAgICAgImxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmcgICAgICAgICAgImxvbmciCgogICAgICAgICAgICAgJWNsZWFyIGxvbmdbQU5ZXTsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZ1tBTlldICAgICAgICAiamxvbmdBcnJheSIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nW0FOWV0gICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nW0FOWV0gICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChpbikgbG9uZ1tBTlldICAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBsb25nW0FOWV0gICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgbG9uZ1tBTlldICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBsb25nW0FOWV0gICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgVGhpcyBuZXcgbWFwcGluZyBpcyBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gaW50ZXJmYWNpbmcgdG8gMzIgYml0IAogICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiB0aGUgY3VycmVudCAzMi1iaXQgSlZNcy4gRm9yIGZ1dHVyZSAKICAgICAgICAgICA2NC1iaXQgSlZNcyB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHRoZXNlIG1hcHBpbmdzIC0gZWcgb24gVW5peCBMUDY0IAogICAgICAgICAgIHN5c3RlbXMsIGJ1dCBub3Qgb24gTWljcm9zb2Z0IDY0Yml0IFdpbmRvd3Mgd2hpY2ggd2lsbCBiZSB1c2luZyBhIAogICAgICAgICAgIFA2NCBJTDMyIG1vZGVsLiBUaGlzIG1heSBiZSBhdXRvbWF0ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTV0lHLgoKMDEvMTAvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyA1MDE2NzcgXSAlaW5pdCBibG9jayBpbiB3cm9uZyBwbGFjZS4gUmVwb3J0ZWQKICAgICAgICAgICBieSBMdWlnaSBCYWxsYWJpby4KCjAxLzA5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHN1cHBvcnQgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gc2lnbmVkIGxvbmcgbG9uZyBpcyAKICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGxvbmcuIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyBtYXBwZWQgdG8gQmlnSW50ZWdlci4KCjAxLzA5LzIwMDI6YmVhemxleQogICAgICAgICAgIEV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gcGFyc2VyIHRvIGJldHRlciBzdXBwb3J0IG1peGluZyBvZgogICAgICAgICAgIGludCwgbG9uZywgc2hvcnQsIHVuc2lnbmVkLCBmbG9hdCwgYW5kIGRvdWJsZS4gICBUaGUgcGFyc2VyCiAgICAgICAgICAgc2hvdWxkIG5vdyBzdXBwb3J0IHR5cGVzIGxpa2UgdGhpczoKICAgIAogICAgICAgICAgICAgICAgc2hvcnQgdW5zaWduZWQgaW50CiAgICAgICAgICAgICAgICBpbnQgICB1bnNpZ25lZCBzaG9ydAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hvcnQKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5hYmxlcyBhIHR5cGUgb2YgJ2xvbmcgZG91YmxlJyAocHJldmlvdXNseQogICAgICAgICAgICB1bnN1cHBvcnRlZCkgdG8gYmUgdXNlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENhc3RpbmcgZml4IGZvciB3aGVuIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGEgcG9pbnRlciBhcyAKICAgICAgICAgICByZXBvcnRlZCBieSBHYXJ5IFBlbm5pbmd0b24gMjAwMi0wMS0wNS4gVGhlIHVwcGVyIDMyYml0cyBvZiB0aGUgCiAgICAgICAgICAgNjQgYml0IGpsb25nIHdpbGwgaGF2ZSBjb250YWluZWQganVuayBmb3IgMzJiaXQgcG9pbnRlcnMuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQmV0dGVyIHBvaW50ZXIgaGFuZGxpbmcgaW4gSmF2YSBpcyBwb3NzaWJsZSBhcyB0aGUgCiAgICAgICAgICAgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkZGVkIGludG8gdHlwZW1hcHMuaS4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSAkbnVsbCBjYW4gYmUgdXNlZCBpbiBpbnB1dCB0eXBlbWFwcyB0byByZXR1cm4gZWFybHkgZnJvbSBKTkkgCiAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgaGF2ZSBlaXRoZXIgdm9pZCBvciBhIG5vbi12b2lkIHJldHVybiB0eXBlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGNoZWNrKSBpbnQgKiAleyAKICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgJX0KCiAgICAgICAgICAgSWYgdGhlIHR5cGVtYXAgZ2V0cyBwdXQgaW50byBhIGZ1bmN0aW9uIHdpdGggdm9pZCBhcyByZXR1cm4sICRudWxsIAogICAgICAgICAgIHdpbGwgZXhwYW5kIHRvIG5vdGhpbmc6CgogICAgICAgICAgICAgdm9pZCBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgogICAgICAgICAgIG90aGVyd2lzZSAkbnVsbCBleHBhbmRzIHRvIHplcm8sIHdoZXJlIGphdmFyZXR1cm50eXBlIGlzIGVpdGhlciBhIAogICAgICAgICAgIHBvaW50ZXIgb3IgYSBwcmltaXRpdmUgdHlwZToKCiAgICAgICAgICAgICBqYXZhcmV0dXJudHlwZSBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKMDEvMDIvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFRoZSBKYXZhIG1vZHVsZSBpbmNvcnJlY3RseSB1c2VkIGFyZ291dCB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgc3RyaW5ncy4gVGhpcyBpcyBub3cgY29ycmVjdGVkIGFuZCB0aGUgY29kZSBub3cgcmVzaWRlcwogICAgICAgICAgIGluIHRoZSBmcmVlYXJnIHR5cGVtYXAuIFRoZSBhcmdvdXQgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIHNwbGl0IGludG8gCiAgICAgICAgICAgYXJnb3V0IGFuZCBmcmVlYXJnIHR5cGVtYXBzLiBUaGlzIGNvcnJlY3Rpb24gbWF5IHJlcXVpcmUgc29tZSB1c2VyIAogICAgICAgICAgIHdyaXR0ZW4gdHlwZW1hcHMgdG8gYmUgbW9kaWZpZWQuIAogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE11bHRpIHR5cGVtYXBzIG5vdyB3b3JraW5nIGZvciBKYXZhIHNlZSBtdWx0aW1hcCBleGFtcGxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIC0gZnJlZWFyZyB0eXBlbWFwIGNvZGUgd2FzIGFwcGVhcmluZwogICAgICAgICAgIGJlZm9yZSB0aGUgZnVuY3Rpb24gY2FsbC4KCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBKQ0FMTCBtYWNybyBmb3IgSk5JIGNhbGxzIHRoYXQgd29yayBpbiBib3RoIEMgYW5kIEMrKyB0eXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIEpDQUxMMCwgSkNBTEwxLCBKQ0FMTDIsIEpDQUxMMyBhbmQgSkNBTEw0IAogICAgICAgICAgIG1hY3Jvcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJlc29sdmVkIHNvbWUgaW5jb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggJXJlbmFtZSBhbmQgY2xhc3MgcmVuYW1pbmcuCiAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgIEJhcjsKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlbiB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgYXBwbGllcyB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsCiAgICAgICAgICAgYW5kIHRoZSBkZXN0cnVjdG9yIChhbGwgd2lsbCBiZSByZW5hbWVkIHRvIEZvbykuCgogICAgICAgICAgIElmIGEgY2xhc3MgZGVmaW5lcyBtb3JlIHRoYW4gb25lIGNvbnN0cnVjdG9yLCB0aGUgb3ZlcmxvYWRlZCB2YXJpYW50cwogICAgICAgICAgIGNhbiBzdGlsbCBiZSByZW5hbWVkIGJ5IHNwZWNpZnlpbmcgcGFyYW1ldGVycyB0byAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlcmVuYW1lKEJhcl9jb3B5KSBCYXIoQmFyICYpOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgICBCYXIoQmFyICYpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgb2RkIGNvcm5lciBjYXNlcy4gIElmIHlvdSBzcGVjaWZ5CgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgOjpCYXI7CgogICAgICAgICAgIHRoZW4gb25seSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgY2hhbmdlZCBhbmQgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IKICAgICAgICAgICBuYW1lcyBhcmUgbGVmdCB1bm1vZGlmaWVkLiAgSWYgeW91IHNwZWNpZnkgCgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgKjo6QmFyOwoKICAgICAgICAgICB0aGVuIHRoZSBuYW1lcyBvZiB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYXJlIG1vZGlmaWVkIGJ1dAogICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBub3QuCgoxMi8yMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gam5pLCBqdHlwZSBhbmQganN0eXBlIHR5cGVtYXBzIG5vIGxvbmdlciBoYXJkY29kZWQgYnV0IHJlYWwgCiAgICAgICAgICAgdHlwZW1hcHMuIE5ldyB2YXJpYWJsZSBzdWJzdGl0dXRpb24sICRqYXZhY2xhc3NuYW1lLCBjYW4gYmUgdXNlZCBpbgogICAgICAgICAgIHRoZSBqc3R5cGUgdHlwZW1hcHMuIEl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIEphdmEgc2hhZG93IGNsYXNzIG5hbWUKICAgICAgICAgICB3aGVyZSBhcHBsaWNhYmxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIHRvIGRvIHdpdGggaW5oZXJpdGFuY2Ugd2hlbiAKICAgICAgICAgICB1c2luZyAlaW1wb3J0LgogICAgICAgICAgIFtKYXZhXSBBIGZldyBtb3JlIGJ1ZyBmaXhlcywgdG9kbyB3aXRoICVyZW5hbWUgYW5kIHVzaW5nIHRoZSBraW5kCiAgICAgICAgICAgd2l0aCB0aGUgdHlwZSwgZWcgCiAgICAgICAgICAgdm9pZCBmbih1bmlvbiB1bmkgbXl1bmksIHN0cnVjdCBzdHIgbXlzdHIsIGNsYXNzIGNsIG15Y2wpOwoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDk0NTI0IF0gUHJlcHJvY2Vzc29yIGJ1ZyAtIGFwb3N0cm9waGUgYW5kICNzdWJzdC4KCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIFNXSUdfVkVSU0lPTiBwcmVwcm9jZXNzb3Igc3ltYm9sLiAgIFRoaXMgaXMgYSBoZXhhZGVjaW1hbAogICAgICAgICAgIGludGVnZXIgc3VjaCBhcyAweDAxMDMxMSAoY29ycmVzcG9uZGluZyB0byBTV0lHLTEuMy4xMSkuICBUaGlzIGNhbgogICAgICAgICAgIGJlIHVzZWQgaW4gdGhlIGludGVyZmFjZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgI2lmIFNXSUdfVkVSU0lPTiA+PSAweDAxMDMxMQogICAgICAgICAgICAgICAvKiBVc2Ugc29tZSBmYW5jeSBuZXcgZmVhdHVyZSAqLwogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgTm90ZTogVGhlIHZlcnNpb24gc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgU1dJRwogICAgICAgICAgIHdyYXBwZXIgZmlsZS4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTIvMjAvMjAwMTpta29lcHBlCgkgICBbTXpTY2hlbWVdOiBSZW5hbWVkIG16c3dpZ19tYWtlX2Jvb2xlYW4gdG8KCSAgIHN3aWdfbWFrZV9ib29sZWFuLCBhcyB0aGUgbGF0dGVyIGlzIHVzZWQgaW4gdGhlIHR5cGVtYXBzLgoJICAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoxMi8xNy8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IFJld3JvdGUgbGlzdC12ZWN0b3IuaSB1c2luZyBtdWx0aS1kaXNwYXRjaAoJICAgdHlwZW1hcHMuICBVcGRhdGVkIHBvaW50ZXItaW4tb3V0LmkuICBNYWtlIHRoZQoJICAgZGVwcmVjYXRlZCB0eXBlbWFwLXN1YnN0aXR1dGlvbiBvZiAiJHNvdXJjZSIgaW4gImFyZ291dCIKCSAgIHdvcmsgYXMgYmVmb3JlLgoKMTIvMTYvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCBtYWNyb3MgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICVtdWx0aXBsZV92YWx1ZXMgdG8gdXNlIHRoZSBwcm9wZXIgJXByYWdtYSBzeW50YXguICBOZXcKCSAgIEd1aWxlIGV4YW1wbGUvdGVzdCAibXVsdGl2YWx1ZSI7IG5ldyBHdWlsZSBydW4tdGVzdCBmb3IKCSAgIHRlc3Qtc3VpdGUgaXRlbSAibGlzdC12ZWN0b3IiIChjdXJyZW50bHkgYnJva2VuKS4KCjEyLzE0LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgdHlwZW1hcC1zdWJzdGl0aW9uIGJ1ZyBmb3IgInZhcmluIi4gIFJlbGF4ZWQKCSAgIHZhbGlkLWlkZW50aWZpZXIgY2hlY2sgdG8gYWxsb3cgYWxsIFI1UlMgaWRlbnRpZmllcnMuCgoKVmVyc2lvbiAxLjMuMTAgKERlY2VtYmVyIDEwLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCAldHlwZW1hcCBzbyB0aGF0ICV7IC4uLiAlfSBjYW4gYWxzbyBiZSB1c2VkIGFzIGEKICAgICAgICAgICBjb2RlIGJsb2NrIChtb3N0bHkgZm9yIGNvbXBsZXRlbmVzcykuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICV7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhpcyBmb3JtIGRvZXMgbm90IGludHJvZHVjZSBhIG5ldyBibG9jayBzY29wZS4gIEFsc28sIHRoZQogICAgICAgICAgIGNvZGUgZW5jbG9zZWQgaW4gJXsgLi4uICV9IGlzIG5vdCBwcm9jZXNzZWQgYnkgdGhlIHByZXByb2Nlc3Nvci4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ1OTYxNCBdIFNXSUcgd2l0aCBtdWx0aXBsZSBUQ0wgaW50ZXJwcmV0ZXJzLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDE3MTQxIF0gcnVieWRlYy5zd2cgaXMgd3JvbmcKICAgICAgICAgICBSZXBvcnRlZCBieSBQYXVsIEJyYW5uYW4uCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTA1NTcgXSBQcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgb24gTlQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFnbnVzIExqdW5nLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDQ1MjMzIF0gRW5oYW5jZW1lbnQ6IGhhbmRsZSBhY2Nlc3MgY2hhbmdlLgogICAgICAgICAgIFNXSUcgbm93IHBhcnNlcyAoYnV0IGlnbm9yZXMpIEMrKyBhY2Nlc3MgY2hhbmdlcyBmb3IgdGhlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKCkgeyB9CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBBKCkge30KICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgY2xhc3MgQiA6IHByaXZhdGUgQSB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyB9CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICBBOjpzb21ldGhpbmc7ICAgIDwtLS0tIFBhcnNlZCwgYnV0IGlnbm9yZWQKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjEyLzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIEZpeCBmb3IgUnVieSB0byB3b3JrIHVzaW5nIFZpc3VhbCBDKysuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NjU2ODcgXSB1bnNpZ25lZCBzaG9ydCBwYXJhbWV0ZXJzIGZhaWwuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDg5NTk0IF0gUHlTdHJpbmdfRnJvbVN0cmluZyBjYW4ndCB0YWtlIE5VTEwgYXJnLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvaG4gTWVycml0dC4gICBTV0lHIG5vdyBjb252ZXJ0cyBzdHJpbmcgdmFsdWVzCiAgICAgICAgICAgdG8gUHl0aG9uIHVzaW5nIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICByZXN1bHRvYmogPSByZXN1bHQgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCkgOiBQeV9CdWlsZFZhbHVlKCIiKTsKCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ2MzU2MSBdIFR5cGUgY29udmVyc2lvbnMgbm90IGdlbmVyYXRlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgkKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcwMjE3IF0gVGNsIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzIwODggXSBkZWZpbmVkKE1BQ1JPKSBleHBhbmRlZCBldmVyeXdoZXJlLgogICAgICAgICAgIEVtYmVkZGVkIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgJSNpZiBkZWZpbmVkKEZPTykKCiAgICAgICAgICAgYXJlIG5vdCBleHBhbmRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc2NDY3IF0gUHJvYmxlbXMgd2l0aCAjZGVmaW5lICYgY29tbWFzLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc3NTQ3IF0gd3JvbmcgZGVjbGFyYXRpb24gb2YgcG9pbnRlciBmdW5jdGlvbnMuCiAgICAgICAgICAgQmFkIHByb3RvdHlwZXMgaW4gTGliL3RjbC9wdHJsYW5nLmkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODMxODIgXSBDb25zdGFudHMgY2FuIHRha2UgYXJncyBieSBtaXN0YWtlLiAKICAgICAgICAgICBXaGVuIHN3aWcgLXBlcmw1IC1jb25zdCBpcyB1c2VkLCBjb25zdGFudHMgYXJlIGRlY2xhcmVkCiAgICAgICAgICAgd2l0aCBhIHZvaWQgcHJvdG90eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3ViIElDT05TVCAoKSB7ICRleGFtcGxlYzo6SUNPTlNUIH0KCiAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IFJpY2ggV2FsZXMuCgoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBOZXcgJWV4Y2VwdGlvbiBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byByZXBsYWNlICVleGNlcHQuCiAgICAgICAgICAgSXQgd29ya3MgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIgZXhjZXB0IGl0IGRvZXMgbm90IGFjY2VwdCBhIAogICAgICAgICAgIGxhbmd1YWdlIHNwZWNpZmllci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgY2F0Y2goU29tZUVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAlZXhjZXB0aW9uIGlzIGFsc28gbmFtZSBhd2FyZS0tLWFsbG93aW5nIGl0IHRvIGJlIGFwcGxpZWQgdG8KICAgICAgICAgICBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgYW55IGZ1bmN0aW9uL21ldGhvZCBmb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhciBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhcihkb3VibGUpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhcihkb3VibGUpIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBuYW1lIG1hdGNoaW5nIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJzdGFudGlhbCBjbGVhbnVwIG9mIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUuICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIHVzZWQgdG8gYmUgY3JlYXRlZCBpbiB0aGlzIHJhdGhlciBjb21wbGljYXRlZCBtYW5uZXIgaW52b2x2aW5nIGFib3V0CiAgICAgICAgICAgYSBoYWxmLWRvemVuIHN0cmluZ3MgY3JlYXRlZCBpbiBiaXRzIGFuZCBwaWVjZXMuICAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZCBpbiBhIG1vcmUgc3RyYWlnaHRmb3J3YXJkIG1hbm5lci0taW4gdGhlIHNhbWUKICAgICAgICAgICBvcmRlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggZGVjbGFyYXRpb25zIGFwcGVhciBpbiB0aGUgc2hhZG93IGZpbGUgbWF5IGRpZmZlci4KICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVpbnNlcnQgZGlyZWN0aXZlICgleyAuLi4gJX0sICVydW50aW1lLCAlaGVhZGVyLCAld3JhcHBlciwgZXRjLikKICAgICAgICAgICBjYW4gbm93IGJlIHVzZWQgaW5zaWRlIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBUaGlzIGhhcyBwb3RlbnRpYWwKICAgICAgICAgICB1c2VzIHdoZW4gZ2VuZXJhdGluZyBzaGFkb3cgY2xhc3MgY29kZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlaW5zZXJ0KCJzaGFkb3ciKSAlewogICAgICAgICAgICAgICAgICMgU29tZSBweXRob24gY29kZQogICAgICAgICAgICAgICAgIGRlZiBibGFoKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkknbSBibGFoISIKICAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgc3VwcG9ydCBmb3IgY2xhc3MgY29kZSBpbnNlcnRpb24gZGVwZW5kcyBvbiB0aGUgbGFuZ3VhZ2UgbW9kdWxlLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBpbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGV4dGVuZGluZwogICAgICAgICAgIHNoYWRvdyBjbGFzcyBjb2RlLiAgIEluIHRoZSBQeXRob24gbW9kdWxlLCB0aGlzIGluc2VydHMgY29kZSB3aXRoIHRoZQogICAgICAgICAgIHByb3BlciBsZXZlbCBvZiBpbmRlbmRhdGlvbiAocmVnYXJkbGVzcyBvZiB3aGF0IHdhcyB1c2VkIGluIHRoZSBTV0lHCiAgICAgICAgICAgaW50ZXJmYWNlKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBKYXZhIGFuZCBQeXRob24gbW9kdWxlcyB0byB3b3JrIG9uIGN5Z3dpbi4KICAgICAgICAgICBVbmZvcnR1bmF0ZWx5IGEgbG90IG9mIHRoZSBweXRob24gbW9kdWxlIGhhcyBzdGFydGVkIHRvIHByb2R1Y2VzIGNvZGUgCiAgICAgICAgICAgd2hpY2ggY2Fubm90IGJlIGF1dG8taW1wb3J0ZWQgdXNpbmcgY3lnd2luIGxpYnRvb2xzIHNvIG1vc3Qgb2YgaXQgaXMgCiAgICAgICAgICAgc3RpbGwgYnJva2VuLgoKMTEvMjgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVyZW5hbWUgYW5kICVmZWF0dXJlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiB0aGlzIG1hbm5lciwgdGhlICVyZW5hbWUgZGlyZWN0aXZlIG9ubHkgYXBwbGllcwogICAgICAgICAgIHRvIG1lbWJlcnMgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGFwcGVhcnMgYXMgd2VsbCBhcyBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMuICBJbiBmYWN0LCB0aGlzIGlzIHJlYWxseSBqdXN0IHRoZSBzYW1lCiAgICAgICAgICAgYXMgc2F5aW5nOgoKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIEZvbzo6Zm9vKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBGb286OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgdGhlIGV4cGVyaW1lbnRhbCAlZmVhdHVyZSBkaXJlY3RpdmUuICAlZmVhdHVyZSBjYW4gYmUKICAgICAgICAgICB1c2VkIHRvIGF0dGFjaCBhcmJpdHJhcnkgc3RyaW5nIGF0dHJpYnV0ZXMgdG8gcGFyc2UgdHJlZSBub2Rlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBibGFoIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgd2hhdGV2ZXI7ICAgICAgCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNldCIpICo6Onhfc2V0ICJ4IjsKCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImJsYWgiKSBGb286OmJhcihpbnQsZG91YmxlKSBjb25zdCAic3BhbSI7CgogICAgICAgICAgIFRoZSBzeW50YXggaXMgYm9ycm93ZWQgZnJvbSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuICBJbiBmYWN0LCB0aGUKICAgICAgICAgICBleGFjdCBzYW1lIHNlbWFudGljcyBhcHBseSAoaW5oZXJpdGFuY2UsIG1hdGNoaW5nLCBldGMuKS4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgYSB2ZXJ5IHBvd2VyZnVsIGxvdy1sZXZlbCBwcmltaXRpdmUgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgIGN1c3RvbWl6ZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgYW5kIHRvIHByb3ZpZGUgaGludHMgdG8gCiAgICAgICAgICAgYW55IHN0YWdlIG9mIGNvZGUgZ2VuZXJhdGlvbi4gICBGZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8KICAgICAgICAgICBwYXJzZSB0cmVlIG5vZGVzIGFzIGF0dHJpYnV0ZXMgd2l0aCBuYW1lcyBsaWtlICJmZWF0dXJlOioiIHdoZXJlICogCiAgICAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGZlYXR1cmUgbmFtZSAoZS5nLiwgImZlYXR1cmU6ZXhjZXB0IiwgImZlYXR1cmU6c2V0IiwgCiAgICAgICAgICAgZXRjLikuICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gdGhlbiBsb29rIGZvciB0aGUgZmVhdHVyZXMgdXNpbmcgCiAgICAgICAgICAgYSBzaW1wbGUgYXR0cmlidXRlIGxvb2t1cC4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBmb3IgYSBudW1iZXIgb2YKICAgICAgICAgICBvbGRlciBTV0lHIGRpcmVjdGl2ZXMgaW5jbHVkaW5nICVleGNlcHQgYW5kIHNwZWNpYWxpemVkCiAgICAgICAgICAgcHJhZ21hcy4gSXQgaXMgbW9yZSBwb3dlcmZ1bCAoZHVlIHRvIGl0cyBwYXJhbWV0ZXJpemVkCiAgICAgICAgICAgbmFtZSBtYXRjaGluZykgYW5kIGl0IHByb3ZpZGVzIHZlcnkgcHJlY2lzZSBjb250cm9sIG92ZXIKICAgICAgICAgICBob3cgY3VzdG9taXphdGlvbiBmZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8gaW5kaXZpZHVhbAogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICBUaGVyZSBhcmUgZnV0dXJlIGV4cGFuc2lvbiBwbGFucyB0aGF0IHdpbGwKICAgICAgICAgICBidWlsZCB1cG9uIHRoaXMgY2FwYWJpbGl0eSBhcyB3ZWxsLgoKICAgICAgICAgICBJdCdzIG5vdCBjZXJ0YWluIHRoYXQgJWZlYXR1cmUgd2lsbCBldmVyIGJlIHVzZWQgZGlyZWN0bHkKICAgICAgICAgICBieSBTV0lHIHVzZXJzLiAgSW5zdGVhZCwgaXQgbWF5IGJlIGEgbG93LWxldmVsIHByaW1pdGl2ZQogICAgICAgICAgIHRoYXQgaXMgdXNlZCBpbiBoaWdoLWxldmVsIG1hY3JvIGRlZmluaXRpb25zLiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgIHRvIHN1cHBvcnQgcHJvcGVydGllcywgeW91IG1pZ2h0IGRlZmluZSBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgJWRlZmluZSAlcHJvcGVydHkobmFtZSwgc2V0ZiwgZ2V0ZikKICAgICAgICAgICAlZmVhdHVyZSgic2V0Iikgc2V0ZiAjbmFtZTsKICAgICAgICAgICAlZmVhdHVyZSgiZ2V0IikgZ2V0ZiAjbmFtZTsKICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFdoaWNoIGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAlcHJvcGVydHkocCwgZ2V0X3AsIHNldF9wKTsKCiAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgIGludCAgZ2V0X3AoKTsKICAgICAgICAgICAgICB2b2lkIHNldF9wKGludCk7CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAKMTEvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFRjbCBtb2R1bGUgaGFzIGJlZW4gZXhwYW5kZWQgd2l0aCBzb21lIG5ldyBmZWF0dXJlcyBmb3IKICAgICAgICAgICBtYW5hZ2luZyBvYmplY3Qgb3duZXJzaGlwLiAgRm9yIGV4YW1wbGU6CiAgICAgICAgIAogICAgICAgICAgICAgICAgc2V0IGMgW0NpcmNsZSAtYXJncyAyMF0KICAgICAgICAgICAgICAgICRjIGFyZWEgICAgICAgICAgICAgIyBJbnZva2UgYSBtZXRob2QKICAgICAgICAgICAgICAgICRjIC1kaXNvd24gICAgICAgICAgIyBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAogICAgICAgICAgICAgICAgJGMgLWFjcXVpcmUgICAgICAgICAjIEFjcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CgogICAgICAgICAgIElmIFRjbCBvd25zIHRoZSBvYmplY3QsIGl0cyBkZXN0cnVjdG9yIGlzIGludm9rZWQgd2hlbiB0aGUgCiAgICAgICAgICAgY29ycmVzcG9uZGluZyBvYmplY3QgY29tbWFuZCBpcyBkZWxldGVkIGluIFRjbC4gIAoKICAgICAgICAgICBUbyBzaW1wbGlmeSB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cywgdGhlIGZvbGxvd2luZyBzeW50YXgKICAgICAgICAgICBjYW4gYmUgdXNlZDoKCiAgICAgICAgICAgICAgICAkYyAtZGVsZXRlICAgICAgICAgIyBEZWxldGUgYW4gb2JqZWN0CgogICAgICAgICAgIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgZm9yIHRoZSBtb3JlIG9ic2N1cmUgdmFyaWFudCBvZiAKCiAgICAgICAgICAgICAgICByZW5hbWUgJGMge30KCiAgICAgICAgICAgVGhlc2UgZmVhdHVyZXMgYWxzbyBhZGQgZnVuY3Rpb25hbGl0eSBhdCB0aGUgQyBBUEkgbGV2ZWwuCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFuYWdlIG93bmVyc2hpcCBmcm9tIEMgYW5kCiAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gdHlwZW1hcHMuCgogICAgICAgICAgICAgICAgU1dJR19BY3F1aXJlKHZvaWQgKnB0cik7CiAgICAgICAgICAgICAgICBTV0lHX0Rpc293bih2b2lkICpwdHIpOwoKICAgICAgICAgICBBIG5ldyBmdW5jdGlvbiBmb3IgY29uc3RydWN0aW5nIGluc3RhbmNlcyBpcyBhbHNvIGF2YWlsYWJsZToKCiAgICAgICAgICAgICAgICBUY2xfT2JqICoKICAgICAgICAgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmooVGNsX0ludGVycCAqaW50ZXJwLCB2b2lkICpwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eXBlLCBpbnQgb3duKTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIGEgdHlwZW1hcCwgdGhpcyBjcmVhdGVzIGEgcG9pbnRlciBvYmplY3QgYW5kCiAgICAgICAgICAgYW4gaW50ZXJwcmV0ZXIgY29tbWFuZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlzc3VlIG1ldGhvZHMgYW5kCiAgICAgICAgICAgYWNjZXNzIGF0dHJpYnV0ZXMgYXMgc2hvd24gYWJvdmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBbGwgUHl0aG9uLXJlbGF0ZWQgJXByYWdtYSBvcGVyYXRpb25zIGhhdmUgYmVlbiBlbGltaW5hdGVkLgogICAgICAgICAgIE1vc3Qgb2YgdGhlc2Ugd2VyZSB3cml0dGVuIGZvciBvbGRlciBTV0lHIHZlcnNpb25zIGluIG9yZGVyIHRvCiAgICAgICAgICAgY29tcGVuc2F0ZSBmb3IgbGltaXRhdGlvbnMgaW4gZWFybGllciByZWxlYXNlcy4gIEluIGFuIGVmZm9ydAogICAgICAgICAgIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGNvZGUtY2x1dHRlciBhbmQgcG90ZW50aWFsIGZvciBlcnJvcnMsCiAgICAgICAgICAgaXQgaXMgZWFzaWVyIHRvIHNpbXBseSBlbGltaW5hdGUgdGhlIHByYWdtYXMgYW5kIHRvIHN0YXJ0IG92ZXIKICAgICAgICAgICAoaWYgbmVlZGVkKS4gIFRvIGJlIGhvbmVzdCwgSSdtIG5vdCBldmVuIHN1cmUgdGhlIHByYWdtYXMKICAgICAgICAgICB3b3JrZWQgaW4gMS4zLjkgYW5kIHJlY2VudCByZWxlYXNlcy4KCiAgICAgICAgICAgTm90ZTogSWYgeW91IG5lZWQgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgc2hhZG93IGNsYXNzIGZpbGUKICAgICAgICAgICBjcmVhdGVkIGJ5IFNXSUcsIHNpbXBseSB1c2UgdGhlICVzaGFkb3cgZGlyZWN0aXZlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXNoYWRvdyAlewogICAgICAgICAgICAgIGRlZiBzb21lX3B5dGhvbl9jb2RlKCk6ICAgICAgICAgCiAgICAgICAgICAgICAgICAgIHByaW50ICJibGFoISIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFN3ZWVwaW5nIGNoYW5nZXMgdG8gdGhlIHdheSBpbiB3aGljaCB0aGUgUHl0aG9uIG1vZHVsZSBoYW5kbGVzCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMuICAgSW4gZWFybHkgaW1wbGVtZW50YXRpb25zLCBzaGFkb3cgY2xhc3NlcyB3ZXJlCiAgICAgICAgICAgbWVyZWx5IFB5dGhvbiB3cmFwcGVycyBhcm91bmQgdHlwZWQgcG9pbnRlciBvYmplY3RzLiBIb3dldmVyLCAKICAgICAgICAgICBzb21lIHVzZXJzIGFjdHVhbGx5IHdhbnRlZCB0byByZWNlaXZlIHRoZSBzaGFkb3cgY2xhc3Mgb2JqZWN0IGluIEMuCiAgICAgICAgICAgVG8gYWNjb21tb2RhdGUgdGhpcywgdGhlIGRlcmVmZXJlbmNpbmcgb2YgdGhlICJ0aGlzIiBwb2ludGVyIGluCiAgICAgICAgICAgYSBzaGFkb3cgY2xhc3Mgd2FzIG1vdmVkIHRvIEMgYXMgZGVzY3JpYmVkIGluIENIQU5HRVMgWzgvOC85OV0uCiAgICAgICAgICAgSG93ZXZlciwgdGhlIHByb2Nlc3Mgb2YgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIFB5dGhvbiB3YXMgc3RpbGwKICAgICAgICAgICBzb21ld2hhdCBwcm9ibGVtYXRpYy4gIFNwZWNpZmljYWxseSwgc2hhZG93IGNsYXNzZXMgbmV2ZXIgd29ya2VkCiAgICAgICAgICAgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIHRoZXNlOgoKICAgICAgICAgICAgIC0gICBVc2Ugb2YgYW55IGtpbmQgb2Ygb3V0cHV0IHR5cGVtYXAgKCdvdXQnIG9yICdhcmdvdXQnKQogICAgICAgICAgICAgLSAgIEdsb2JhbCB2YXJpYWJsZXMgKGJyb2tlbiBhcyBmYXIgYXMgSSBjYW4gdGVsbCkuCgogICAgICAgICAgIEluIHRoZSBwYXN0LCBzb21lIHVzZXJzIGhhdmUgZGVhbHQgd2l0aCB0aGlzIGJ5IG1hbnVhbGx5IHRyeWluZwogICAgICAgICAgIHRvIGNyZWF0ZSBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0aGVtc2VsdmVzIGZyb20gQy9DKysuICBIb3dldmVyLAogICAgICAgICAgIHRoaXMgd2FzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSBDIHdyYXBwZXJzIGRvbid0IHJlYWxseSBrbm93IGhvdwogICAgICAgICAgIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIGNsYXNzLgoKICAgICAgICAgICBUaGUgUHl0aG9uIG1vZHVsZSBoYXMgbm93IGJlZW4gbW9kaWZpZWQgdG8gYXV0b21hdGljYWxseSBhdHRhY2gKICAgICAgICAgICBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0byBwb2ludGVycyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIHRvIAogICAgICAgICAgIFB5dGhvbi4gICBUaGlzIHByb2Nlc3Mgb2NjdXJzIGluIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmooKQogICAgICAgICAgIHNvIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gdXNlcnMuICAgIEFzIGEgcmVzdWx0LAogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzIGFyZSBub3cgbW9yZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgd2l0aCB0eXBlbWFwcwogICAgICAgICAgIGFuZCBvdGhlciBmZWF0dXJlcyBvZiBTV0lHLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgaW50cm9kdWNlIGEgbnVtYmVyIG9mIGluY29tcGF0aWJpbGl0aWVzLiAgVGhlCiAgICAgICAgICAgU1dJR19OZXdQb2ludGVyT2JqKCkgbm93IHRha2VzIGFuIGV4dHJhIHBhcmFtZXRlciAib3duIiB0byAKICAgICAgICAgICBpbmRpY2F0ZSBvYmplY3Qgb3duZXJzaGlwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGEgcG9pbnRlcgogICAgICAgICAgIHRvIFB5dGhvbiB0aGF0IFB5dGhvbiBzaG91bGQgZGVzdHJveS4gICBJbiBhZGRpdGlvbiwgb2xkZXIgY29kZQogICAgICAgICAgIHRoYXQgdHJpZXMgdG8gbWFudWFsbHkgY29uc3RydWN0IHNoYWRvdyBjbGFzcyBvYmplY3RzIG9yIHdoaWNoCiAgICAgICAgICAgZXhwZWN0cyBiYXJlIHBvaW50ZXJzIG1heSBicmVhay0tLXN1Y2ggcG9pbnRlcnMgbWF5IGFscmVhZHkgYmUKICAgICAgICAgICBlbmNhcHN1bGF0ZWQgYnkgYSBzaGFkb3cgY2xhc3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWluc2VydCBkaXJlY3RpdmUgdG8gYWNjZXB0IHNpbmdsZSBicmFjZXMgeyAuLi4gfS4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5zZXJ0KCJoZWFkZXIiKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAleyAuLi4gJX0gZXhjZXB0IHRoYXQgdGhlIGNvZGUgaW4gdGhlCiAgICAgICAgICAgYnJhY2VzIGlzIHByb2Nlc3NlZCB1c2luZyB0aGUgcHJlcHJvY2Vzc29yLiAgIFRoaXMgY2FuIGJlIHVzZWZ1bAogICAgICAgICAgIGluIGNlcnRhaW4gY29udGV4dHMgc3VjaCBhcyBsb3ctbGV2ZWwgY29kZSBnZW5lcmF0aW9uIGluIAogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgbm93IHRyYW5zbGF0ZWQgaW50byBwcmVwcm9jZXNzb3IKICAgICAgICAgICBzeW1ib2xzLiAgRm9yIGV4YW1wbGU6CgkKICAgICAgICAgICAgICAuL3N3aWcgLXB5dGhvbiAtc2hhZG93IC1tb2R1bGUgYmxhaCBpbnRlcmZhY2UuaQoKICAgICAgICAgICBDcmVhdGVzIHRoZSBzeW1ib2xzOgoKICAgICAgICAgICAgICBTV0lHT1BUX1BZVEhPTiAxCiAgICAgICAgICAgICAgU1dJR09QVF9TSEFET1cgMQogICAgICAgICAgICAgIFNXSUdPUFRfTU9EVUxFIGJsYWgKICAgICAgICAgICAgICAKICAgICAgICAgICBNb2R1bGVzIGNhbiBsb29rIGZvciB0aGVzZSBzeW1ib2xzIHRvIGFsdGVyIHRoZWlyIGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGlmIG5lZWRlZC4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgUGVybDUgbW9kdWxlLiAgQSBsb3Qgb2YgY29kZSBnZW5lcmF0aW9uIGlzCiAgICAgICAgICAgbm93IGRyaXZlbiBieSB0YWJsZXMgYW5kIHR5cGVtYXBzLiAgIFRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIAogICAgICAgICAgIGFsc28gbWFrZXMgdXNlIG9mIHRhYmxlcyB0byBpbnN0YWxsIGNvbnN0YW50cywgdmFyaWFibGVzLCBhbmQKICAgICAgICAgICBmdW5jdGlvbnMgaW5zdGVhZCBvZiBpbmxpbmluZyBhIGJ1bmNoIG9mIHByb2NlZHVyZSBjYWxscy4gIFRoZQogICAgICAgICAgIHNlcGFyYXRlIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIGdvbmUuICAgTW9zdAogICAgICAgICAgIGNvZGUgZ2VuZXJhdGlvbiBpcyBjb250cm9sbGVkIHZpYSB0aGUgcGVybDUuc3dnIGZpbGUgaW4gdGhlCiAgICAgICAgICAgbGlicmFyeS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAKMTEvMTMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgQysrIHR5cGVuYW1lIGtleXdvcmQuICBQcmltYXJpbHkgdGhpcwogICAgICAgICAgIGlzIGFkZGVkIHRvIGJldHRlciBzdXBwb3J0IHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgIGJsYWgoQyYgdikgewogICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yIGkgPSB2LmJlZ2luKCk7CiAgICAgICAgICAgICB9CgogICAgICAgICAgIE5vdGU6IHR5cGVuYW1lIGlzIHN1cHBvcnRlZCBpbiB0aGUgcGFyc2VyIGluIHRoZSBzYW1lIHdheSBhcyAnc3RydWN0JwogICAgICAgICAgIG9yICdjbGFzcycuICBZb3UgcHJvYmFibHkgc2hvdWxkbid0IHVzZSBpdCBhbnl3aGVyZSBleGNlcHQgaW4gdGVtcGxhdGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZSBBUEkuICAgTW9zdCBmdW5jdGlvbnMgbm93CiAgICAgICAgICAgdXNlIGEgY29tbW9uLCB2ZXJ5IHNpbXBsZSwgIEFQSS4gICBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZgogICAgICAgICAgIGludGVyZXN0aW5nIHNlbWFudGljIHNpZGUtZWZmZWN0cyBvZiBob3cgY29kZSBpcyBhY3R1YWxseSBnZW5lcmF0ZWQuCiAgICAgICAgICAgRGV0YWlscyB3aWxsIGJlIGZvcnRoY29taW5nIGluIERvYy9NYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiBMYW5ndWFnZSBtb2R1bGVzIHdyaXR0ZW4gZm9yCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyB3aWxsIG5vIGxvbmdlciB3b3JrLAoKMTEvMTAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSB2ZXJ5IHN1YnRsZSBidWcgZHVlIHRvIHVubmFtZWQgY2xhc3Mgd3JhcHBpbmcuIEZvciBleGFtcGxlLCBpZgogICAgICAgICAgIHlvdSBkaWQgdGhpcwoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB4LHk7CiAgICAgICAgICAgICAgfSBnZFBvaW50LCAqZ2RQb2ludFB0cjsKCiAgICAgICAgICAgICAgdm9pZCBmb28oZ2RQb2ludFB0ciB4KTsKCiAgICAgICAgICAgVGhlbiB0aGUgZm9vIGZ1bmN0aW9uIHdvdWxkIGdldCBhIHR5cGUtZXJyb3IuICAgVGhlIHByb2JsZW0gaGFzCiAgICAgICAgICAgdG8gZG8gd2l0aCBpbnRlcm5hbCB0eXBlZGVmIGhhbmRsaW5nIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSB0eXBlZGVmCiAgICAgICAgICAgZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3QgYXBwZWFyIGxhdGVyIGluIHRoZSBwYXJzZSB0cmVlLgogICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgVmluIEpvdmFub3ZpYy4KCjExLzA5LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gIm91dCIgdHlwZW1hcHMgKGFuZCByZWxhdGVkIHZhcmlhdGlvbnMpLiAgVGhlIG5hbWUKICAgICAgICAgICB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSB0eXBlbWFwIGlzIG5vdyB0aGUgcmF3IEMgaWRlbnRpZmllciB0aGF0CiAgICAgICAgICAgYXBwZWFycyBvbiBhIGRlY2xhcmF0aW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgogICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBmb28oKTsgICAgLy8gdHlwZW1hcCBnZXRzIGFwcGxpZWQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBuZXZlciByZWFsbHkgc3BlY2lmaWVkIGhvdyB0aGlzIHdhcyBzdXBwb3NlZCB0bwogICAgICAgICAgIHdvcmsuICBJbiBTV0lHMS4xLCB5b3UgY291bGQgcHJvYmFibHkgd3JpdGUgYSB0eXBlbWFwIGZvciB0aGUKICAgICAgICAgICB3cmFwcGVyIG5hbWUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IEJsYWhfZm9vIHsgLi4uIH0KCiAgICAgICAgICAgSG93ZXZlciwgdGhpcyBvbGQgYmVoYXZpb3IgaXMgbm93IHdpdGhkcmF3biBhbmQgbm90IHN1cHBvcnRlZC4gCiAgICAgICAgICAgSnVzdCB1c2UgdGhlIG1lbWJlciBuYW1lIHdpdGhvdXQgYW55IHNvcnQgb2Ygc3BlY2lhbCBwcmVmaXguCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFRjbCBtb2R1bGUgaW5pdGlhbGl6YXRpb246CgogICAgICAgICAgICgxKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBjb2RlIG5lZWRlZCB0byB3b3JrIHdpdGgKICAgICAgICAgICAgICAgIFRjbCBzdHVicy4gIFNpbXBseSBjb21waWxlIHdpdGggLURVU0VfVENMX1NUVUJTLgoKICAgICAgICAgICAoMikgU1dJRyBub3cgYXV0b21hdGljYWxseSBjYWxscyBUY2xfUGtnUHJvdmlkZSB0byByZWdpc3RlcgogICAgICAgICAgICAgICBhIHBhY2thZ2UgbmFtZS4gIFRoZSBwYWNrYWdlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUKICAgICAgICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlICVtb2R1bGUgZGlyZWN0aXZlLiAgVGhlIHZlcnNpb24gbnVtYmVyIGlzCiAgICAgICAgICAgICAgIHNldCB0byAiMC4wIiBieSBkZWZhdWx0LiAgVG8gY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciwgdXNlCiAgICAgICAgICAgICAgIHN3aWcgLXBrZ3ZlcnNpb24gMS4yIGludGVyZmFjZS5pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBNb2R1bGVzIHRoYXQgcHJvdmlkZWQgc3R1YnMgYW5kIFRjbF9Qa2dQcm92aWRlIG9uIHRoZWlyIG93biBtaWdodAogICAgICAgICAgIGJyZWFrLiAgU2ltcGx5IHJlbW92ZSB0aGF0IGNvZGUuCgoxMS8wNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIGNvZGUgZ2VuZXJhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFRjbCBtb2R1bGUuICBDb25zdGFudHMKICAgICAgICAgICBhcmUgbm93IHN0b3JlZCBpbiBhIGxhcmdlIHRhYmxlIHRoYXQgZ2V0IGluc3RhbGxlZCBhdCBtb2R1bGUgc3RhcnR1cC4KICAgICAgICAgICBUaGVyZSBhcmUgYWxzbyBubyBsb25nZXIgYW55IHN0YXRpYyB2YXJpYWJsZXMgc28gaXQgc2hvdWxkIGdlbmVyYXRlCiAgICAgICAgICAgc29tZXdoYXQgbGVzcyBjb2RlLgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICJjb25zdCIgdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvICJjb25zdGFudCIgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMuICAiY29uc3QiIGlzIGEgQyBrZXl3b3JkIHdoaWNoIG1hZGUgdGhlIGhhbmRsaW5nIG9mIHRoZSB0eXBlbWFwCiAgICAgICAgICAgZGlyZWN0aXZlIHNvbWV3aGF0IGF3a3dhcmQgaW4gdGhlIHBhcnNlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgICV0eXBlbWFwIGRpcmVjdGl2ZSBjYW4gbm93IGFjY2VwdCBuZWFybHkgYXJiaXRyYXJ5IGtleXdvcmQgcGFyYW1ldGVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4scGFyc2U9ImkiLGRvYz0iaW50ZWdlciIpIGludCAiLi4uIjsKCiAgICAgICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhlIGtleXdvcmQgcGFyYW1ldGVycyBpcyB0byBzdXBwbHkgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICAgaGludHMgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSBtb2R1bGUuICAgVGhlIGludGVwcmV0YXRpb24gb2YgdGhlCiAgICAgICAgICAgcGFyYW1ldGVycyBpcyBsYW5ndWFnZSBzcGVjaWZpYy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTbGlnaHQgc2VtYW50aWMgY2hhbmdlIHRvIGludGVybmFsIGNhbGwvcmV0dXJuIGJ5IHZhbHVlIGhhbmRsaW5nLgogICAgICAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGNhbGwtYnktdmFsdWUgd2FzIHRyYW5zbGF0ZWQKICAgICAgICAgICBpbnRvIHBvaW50ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBkb3VibGUgZG90X3Byb2R1Y3QoVmVjdG9yIGEsIFZlY3RvciBiKTsKCiAgICAgICAgICAgdHVybmVkIGludG8gdGhpczoKCiAgICAgICAgICAgICAgIGRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkb3RfcHJvZHVjdCgqYSwqYik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyB0cmFuc2xhdGlvbiB3YXMgbm9ybWFsbHkgcGVyZm9ybWVkIGJ5IHRoZSBTV0lHIGNvcmUsIG91dHNpZGUKICAgICAgICAgICBvZiB0aGUgY29udHJvbCBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgSG93ZXZlciwgYSBzaWRlIGVmZmVjdAogICAgICAgICAgIG9mIHRoaXMgd2FzIGEgbG90IG9mIGJpemFycmUgdHlwZW1hcCBiZWhhdmlvci4gICBGb3IgZXhhbXBsZSwKICAgICAgICAgICBpZiB5b3UgZGlkIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgWW91IHdvdWxkIGZpbmQgdGhhdCBpbnQzMiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIHBvaW50ZXIgZXZlcnl3aGVyZSEKICAgICAgICAgICAobmVlZGxlc3MgdG8gc2F5LCBzdWNoIGJlaGF2aW9yIGlzIHVuZXhwZWN0ZWQgYW5kIHF1aXRlIGF3a3dhcmQgdG8KICAgICAgICAgICBkZWFsIHdpdGgpLiAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCBpZiBhIHR5cGVkZWYgd2FzIGFsc28gdXNlZCwKICAgICAgICAgICB0aGUgcG9pbnRlciBiZWhhdmlvciBzdWRkZW5seSBkaXNhcHBlYXJlZC4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBwb2ludGVyIHRyYW5zZm9ybWF0aW9uIGlzIG5vdyBwdXNoZWQgdG8gdGhlCiAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4gICBUaGlzIHByb2R1Y2VzIHdyYXBwZXJzIHRoYXQgbG9vayByb3VnaGx5CiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgVmVjdG9yIGFyZzEgPSAqYTsKICAgICAgICAgICAgICAgICAgVmVjdG9yIGFyZzIgPSAqYjsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KGFyZzEsYXJnMik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBpdCBlYXN5IHRvIGRlZmluZSB0eXBlbWFwcyBmb3IKICAgICAgICAgICBhcmJpdHJhcnkgdW5kZWZpbmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZG8gdGhpcyAoYW5kIGl0CiAgICAgICAgICAgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgd2hhdCBpbnQzMiBpcyk6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAkMSA9IChpbnQzMikgUHlJbnRfQXNMb25nKCRpbnB1dCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTUNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNhbGwvcmV0dXJuIGJ5IHZhbHVlIGNvZGUgZ2VuZXJhdGlvbiBpbgogICAgICAgICAgIHNvbWUgbGFuZ3VhZ2UgbW9kdWxlcy4KCjExLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZWQgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgdHlwZW1hcHMgdG8gdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgIHsgCiAgICAgICAgICAgICAgICAgICAuLi4gYW4gb2JqZWN0IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgKiB7CiAgICAgICAgICAgICAgICAgICAuLi4gYSBwb2ludGVyIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgJiB7CiAgICAgICAgICAgICAgICAgICAuLi4gYSByZWZlcmVuY2UgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAuLi4gYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBlbnVtIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgLi4uIGFuIGVudW0gdmFsdWUgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAoQ0xBU1M6OiopIHsKICAgICAgICAgICAgICAgICAgIC4uLiBwb2ludGVyIHRvIG1lbWJlciAuLi4KICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgVGhlc2UgdHlwZXMgYXJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCB0eXBlcyB0aGF0IGRvbid0IG1hdGNoCiAgICAgICAgICAgYW55dGhpbmcgZWxzZS4gIFNlZSBDSEFOR0VTIGxvZyBlbnRyeSBmb3IgOC8yNy8yMDAwIGZvciB0aGUKICAgICAgICAgICBvbGQgYmVoYXZpb3IuICBUaGUgcm9sZSBvZiB0aGVzZSB0eXBlcyBpcyBhbHNvIGRlc2NyaWJlZCBpbiAKICAgICAgICAgICBEb2MvTWFudWFsL1R5cGVtYXBzLmh0bWwKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAKMTAvMjUvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgR3VpbGUgYW5kIE16c2NoZW1lIG1vZHVsZXMgdG8gc3VwcG9ydAogICAgICAgICAgIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEZpeCB0byBoYW5kbGUgcG9pbnRlcnMgdG8gYXJyYXlzLgoKMTAvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRGVmaW5pbmcgYSB0eXBlbWFwIHJ1bGUgZm9yIGVudW0gU1dJR0VOVU0gY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICAgdG8gZGVmaW5lIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGVudW0gdmFyaWFibGVzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgUnVieSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjEwLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSBSdWJ5IG1vZHVsZSBjYW4gbm93IGhhbmRsZSBmdW5jdGlvbnMgd2l0aCBhbiBhcmJpdHJhcnkKICAgICAgICAgICBudW1iZXIgb2YgYXJndW1lbnRzLiAgUHJldmlvdXMgdmVyc2lvbnMgd2VyZSBsaW1pdGVkIHRvIAogICAgICAgICAgIHRvIGZ1bmN0aW9ucyB3aXRoIG9ubHkgOSBvciAxNiBhcmd1bWVudHMgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgdGhlIHVzZSBvZiBkZWZhdWx0IGFyZ3VtZW50cy4gICBOb3RlOiBmcm9tIHNvbWUgaW5zcGVjdGlvbgogICAgICAgICAgIG9mIHRoZSBSdWJ5IGludGVycHJldGVyIHNvdXJjZSwgdGhlIG5ldyBhcHByb2FjaCBtaWdodCBiZQogICAgICAgICAgIGEgbGl0dGxlIGZhc3RlciBhcyB3ZWxsLgoKMTAvMTgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICB0ZW1wbGF0ZXMuCgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA8UyxUPjsKCiAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IElyaW5hIEtvdGxvdmEuCgoxMC8xNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcyBhZGRlZC4gIFRoZSB0eXBlbWFwcwogICAgICAgICAgIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlIHN5bnRheCBiZWxvdy4gICBXaXRoaW4gZWFjaAogICAgICAgICAgIHR5cGVtYXAsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBpcyBoYW5kbGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAkYXJnOyAgLy8gVGhlIGlucHV0IG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlCiAgICAgICAgICAgICAgICAgICQxOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBmaXJzdCBhcmd1bWVudAogICAgICAgICAgICAgICAgICAkMjsgICAgLy8gQyBsb2NhbCB2YXJpYWJsZSBmb3Igc2Vjb25kIGFyZ3VtZW50CgogICAgICAgICAgICAgICAgICAvLyBUaGVzZSB2YXJpYWJsZXMgcmVmZXIgdG8gZWl0aGVyIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQxX3R5cGUsICQxX2x0eXBlLCAkMV9iYXNldHlwZSwgZXRjLi4uICAoYXJnYykKICAgICAgICAgICAgICAgICAgJDJfdHlwZSwgJDJfbHR5cGUsICQyX2Jhc2V0eXBlLCBldGMuLi4gIChhcmd2W10pCgogICAgICAgICAgICAgICAgICAvLyBBcnJheSBkaW1lbnNpb24gb2YgYXJndgogICAgICAgICAgICAgICAgICAkMl9kaW0wCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBCYXNpY2FsbHkgYW55IHZhcmlhYmxlIHRoYXQgd2FzIGF2YWlsYWJsZSBpbiBub3JtYWwgdHlwZW1hcHMKICAgICAgICAgICBpcyBhdmFpbGFibGUgZm9yIGVpdGhlciBhcmd1bWVudCBieSBwcmVmYWNpbmcgdGhlIHZhcmlhYmxlCiAgICAgICAgICAgbmFtZSBieSAnJG5fJyB3aGVyZSBuIGlzIHRoZSBhcmd1bWVudCBwb3NpdGlvbi4KCiAgICAgICAgICAgTm90ZXM6ICAKICAgICAgICAgICAoMSkgTXVsdGktdmFsdWVkIHR5cGVtYXBzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBzaW5nbGUKICAgICAgICAgICAgICAgb2JqZWN0IGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgICAgICB5b3UgY2FuIHNwbGl0IGEgc3RyaW5nIGludG8gYSAoY2hhciAqLCBpbnQpIHBhaXIgb3IKICAgICAgICAgICAgICAgc3BsaXQgYSBsaXN0IGludG8gYSAoaW50LCBjaGFyIFtdKSBwYWlyLiAgSXQgaXMgbm90CiAgICAgICAgICAgICAgIHBvc3NpYmxlIHRvIG1hcCBtdWx0aXBsZSBvYmplY3RzIHRvIG11bHRpcGxlIGFyZ3VtZW50cy4KCiAgICAgICAgICAgKDIpIFRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBTV0lHIHZlcnNpb25zLCB0aGUKICAgICAgICAgICAgICAgdmFyaWFibGVzIHN1Y2ggYXMgJHRhcmdldCBhbmQgJHR5cGUgYXJlIHByZXNlcnZlZCBhbmQKICAgICAgICAgICAgICAgYXJlIG1hcHBlZCBvbnRvIHRoZSBmaXJzdCBhcmd1bWVudCBvbmx5LgoKICAgICAgICAgICAoMykgVGhpcyBzaG91bGQgbm90IGFmZmVjdCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgY29kZS4KICAgICAgICAgICAgICAgTXVsdGktdmFsdWVkIHR5cGVtYXBzIGFyZSBhbiBleHRlbnNpb24gdG8gdHlwZW1hcCBoYW5kbGluZy4KICAgICAgICAgICAgICAgU2luZ2xlIHZhbHVlZCB0eXBlbWFwcyBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSB1c3VhbAogICAgICAgICAgICAgICB3YXkuCgogICAgICAgICAgIFRoZSBvbGQgJHNvdXJjZSBhbmQgJHRhcmdldCB2YXJpYWJsZXMgYXJlIG9mZmljaWFsbHkKICAgICAgICAgICBkZXByZWNhdGVkLiAgSW5wdXQgdmFyaWFibGVzIGFyZSByZWZlcmVuY2VkIHRocm91Z2gKICAgICAgICAgICAkYXJnJCBhbmQgb3V0cHV0IHZhbHVlcyBhcmUgcmVmZXJlbmNlIHRocm91Z2ggJHJlc3VsdCQuCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgdHlwZW1hcHMuICBUaGUgc3ludGF4CiAgICAgICAgICAgaXMgYSBsaXR0bGUgZnVua3ksIGJ1dCBoZXJlIGdvZXM6CgogICAgICAgICAgICAgIC8vIERlZmluZSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICAgICAgICAgICAgICAgICAuLi4gdHlwZW1hcCBjb2RlIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gTXVsdGl2YWx1ZWQgdHlwZW1hcCB3aXRoIGxvY2FscwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAuLi4gdHlwZW1hcCBjb2RlIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvLyBDb3B5IGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2NvdW50LCBjaGFyICoqYXJndikgPSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CgogICAgICAgICAgICAgIC8vIEFwcGx5IGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICVhcHBseSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeyAoaW50IGFyZ2NvdW50LCBjaGFyICoqYXJndikgfTsKCiAgICAgICAgICAgTm90ZTogdGhpcyBleHRyYSBwYXJzaW5nIHN1cHBvcnQgaXMgYWRkZWQgZm9yIGZ1dHVyZSBleHRlbnNpb24uCiAgICAgICAgICAgTm8gbGFuZ3VhZ2UgbW9kdWxlcyBjdXJyZW50bHkgc3VwcG9ydCBtdWx0aS12YWx1ZWQgdHlwZW1hcHMuCgoxMC8xMS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgdHlwZW1hcCBtYXRjaGluZyBjb2RlIHRvIGRpc2NhcmQgcXVhbGlmaWVycyB3aGVuCiAgICAgICAgICAgY2hlY2tpbmcgZm9yIGEgbWF0Y2guICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZGVjbGFyYXRpb24KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBjaGFyICp4KTsKCiAgICAgICAgICAgVGhlIHR5cGVtYXAgY2hlY2tlciBjaGVja3MgZm9yIGEgbWF0Y2ggaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKgogICAgICAgICAgICAgICAgIGNoYXIgKngKICAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgSWYgdHlwZWRlZidzIGFyZSBpbnZvbHZlZCwgcXVhbGlmaWVyIHN0cmlwcGluZyBvY2N1cnMgYmVmb3JlCiAgICAgICAgICAgdHlwZWRlZiByZXNvbHV0aW9uLiAgU28gaWYgeW91IGhhZCB0aGlzLAoKICAgICAgICAgICAgICAgIHR5cGVkZWYgY2hhciAqc3RyaW5nOwogICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IHN0cmluZyB4KTsKCiAgICAgICAgICAgdHlwZW1hcCBjaGVja2luZyB3b3VsZCBiZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyB4CiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcKICAgICAgICAgICAgICAgIHN0cmluZyB4CiAgICAgICAgICAgICAgICBzdHJpbmcKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKngKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKgogICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgY2hhciAqCgogICAgICAgICAgIFRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIFdpdGhvdXQgcXVhbGlmaWVyIHN0cmlwcGluZywgb25lIGhhcyB0byB3cml0ZQogICAgICAgICAgIHNlcGVyYXRlIHR5cGVtYXBzIGZvciBhbGwgdmFyaWF0aW9ucyBvZiBjb25zdCBhbmQgdm9sYXRpbGUgKHdoaWNoCiAgICAgICAgICAgaXMgYSBwYWluKS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUeXBlbWFwcyBtaWdodCBiZSBhcHBsaWVkIGluCiAgICAgICAgICAgcGxhY2VzIHdoZXJlIHRoZXkgd2VyZW4ndCBiZWZvcmUuCgoKMTAvOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIHdyYXBwZXJzIHRoYXQgcHJvcGVybHkgZGlzYW1iaWd1YXRlCiAgICAgICAgICAgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgb25seSB2YXJ5IGluIGNvbnN0bmVzcy4gIEZvcgogICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gaGFuZGxlIHRoaXMsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBub3JtYWxseS4KICAgICAgICAgICAKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoX2NvbnN0KSBibGFoKCkgY29uc3Q7CgogICAgICAgICAgIEluIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlLCBtZXRob2QgY2FsbHMgbGlrZSB0aGlzCiAgICAgICAgICAgYXJlIG5vdyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAob2JqKS0+YmxhaCgpICAgICAgICAgICAgICAgLy8gTm9uLWNvbnN0IHZlcnNpb24KICAgICAgICAgICAgICAgKChGb28gY29uc3QgKilvYmopLT5ibGFoKCkgIC8vIGNvbnN0IHZlcnNpb24KCiAgICAgICAgICAgVGhpcyBzaG91bGQgZm9yY2UgdGhlIHJpZ2h0IG1ldGhvZCB0byBiZSBpbnZva2VkLgogICAgICAgICAgIEFkbWl0dGVkbHksIHRoaXMgaXMgcHJvYmFibHkgb2JzY3VyZSwgYnV0IHdlIG1pZ2h0CiAgICAgICAgICAgYXMgd2VsbCBnZXQgaXQgcmlnaHQuCgoxMC84LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIG5vdyBpZ25vcmVzICdccicgaW4gdGhlIGlucHV0LgogICAgICAgICAgIFRoaXMgc2hvdWxkIGZpeCB0aGUgZm9sbG93aW5nIGJ1ZzoKICAgICAgICAgICBbICM0Njg0MTYgXSBTV0lHIHRoaW5rcyBtYWNybyBkZWZzIGFyZSBkZWNsYXJhdGlvbnM/CgoxMC84LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB8fCwgJiYsIGFuZCAhIGluIGNvbnN0YW50cy4gIFRoaXMKICAgICAgICAgICBmaXhlcyBTRiBbICM0Njg5ODggXSBMb2dpY2FsIG9wcyBicmVhayBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgSG93ZXZlciwgYXQgdGhpcyB0aW1lLCBjb25zdGFudHMgdXNpbmcgdGhlc2Ugb3BlcmF0b3JzCiAgICAgICAgICAgYXJlIG5vdCBzdXBwb3J0ZWQgKHRoZSBwYXJzZXIgd2lsbCBpc3N1ZSBhIHdhcm5pbmcpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgLXNob3dfdGVtcGxhdGVzIGNvbW1hbmQgbGluZSBvcHRpb24uICBUaGlzIG1ha2VzCiAgICAgICAgICAgU1dJRyBkaXNwbGF5IHRoZSBjb2RlIGl0IGFjdHVhbGx5IHBhcnNlcyB0byBnZW5lcmF0ZQogICAgICAgICAgIHRlbXBsYXRlIHdyYXBwZXJzLiAgTW9zdGx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byBzZW1hbnRpY3Mgb2YgJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIFdoZW4KICAgICAgICAgICB1c2luZyAldGVtcGxhdGUsIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYXJlIGhhbmRsZWQKICAgICAgICAgICBhcyB0eXBlcyBieSBkZWZhdWx0LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8ZG91YmxlPjsKCiAgICAgICAgICAgVG8gc3BlY2lmeSBhIHRlbXBsYXRlIGFyZ3VtZW50IHRoYXQgaXMgKm5vdCogYSB0eXBlLCB5b3UKICAgICAgICAgICBuZWVkIHRvIHVzZSBkZWZhdWx0LXZhbHVlIHN5bnRheC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludCxpbnQ9NTA+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2RvdWJsZSkgdmVjdG9yPGludCxzaXplPTEwMD47CgogICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXR0ZXItLW9ubHkKICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSAoZS5nLiwgNTAsIDEwMCkgaXMgdXNlZCBkdXJpbmcKICAgICAgICAgICBleHBhbnNpb24uICBUaGlzIGRpZmZlcnMgZnJvbSBub3JtYWwgQysrLCBidXQgSSBjb3VsZG4ndAogICAgICAgICAgIGZpZ3VyZSBvdXQgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0IGluIHRoZSBwYXJzZXIuICBNaWdodAogICAgICAgICAgIGltcGxlbWVudCBhbiBhbHRlcm5hdGl2ZSBsYXRlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgIAoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYWpvciBjaGFuZ2VzIHRvIHRlbXBsYXRlIGhhbmRsaW5nIGluIG9yZGVyIHRvIHByb3ZpZGUKICAgICAgICAgICBiZXR0ZXIgaW50ZWdyYXRpb24gd2l0aCB0aGUgQysrIHR5cGUtc3lzdGVtLiBUaGUgbWFpbgogICAgICAgICAgIHByb2JsZW0gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgU3VwcG9zZSB5b3UgaGF2ZSBhIHRlbXBsYXRlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBibGFoKGNvbnN0IFQgeCkgeyBzdHVmZiB9OwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgTm93IHN1cHBvc2UsIHRoYXQgeW91IGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBvbiBhCiAgICAgICAgICAgdHlwZSBsaWtlIHRoaXMgaW4gU1dJRzoKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8aW50ICo+OwoKICAgICAgICAgICBJbiBDKyssIHRoaXMgaXMgKnN1cHBvc2VkKiB0byBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICBIb3dldmVyLCBpbiBTV0lHLTEuMy45LCB0aGUgdGVtcGxhdGUgc3Vic3RpdHV0aW9uIGdldHMgaXQgd3JvbmcKICAgICAgICAgICBhbmQgcHJvZHVjZXMKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGludCAqeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICAobm90aWNlIHRoZSBiYWQgcGxhY2VtZW50IG9mIHRoZSAnY29uc3QnIHF1YWxpZmllcikuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCB0aGUgU1dJRyBwYXJzZXIgbm93IGdlbmVyYXRlcyBpbXBsaWNpdCB0eXBlZGVmcwogICAgICAgICAgIGZvciB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50cyB0aGF0IHByb2R1Y2VzIGNvZGUgcm91Z2hseQogICAgICAgICAgIGVxdWl2YWxlbnQgdG8gZG9pbmcgdGhpczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKl9fc3dpZ3RtcGwxOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShibGFoaW50KSBibGFoPF9fc3dpZ3RtcGwxPjsKCiAgICAgICAgICAgd2hpY2ggZ2VuZXJhdGVzIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICBTaW5jZSB0aGlzIGlzIGNvcnJlY3QgaW4gYm90aCBDKysgYW5kIFNXSUcsIGl0IHByb3ZpZGVzIHRoZSByaWdodAogICAgICAgICAgIHNlbWFudGljcyBhbmQgYWxsb3dzIGV2ZXJ5dGhpbmcgdG8gY29tcGlsZSBwcm9wZXJseS4gIEhvd2V2ZXIsCiAgICAgICAgICAgdG8gY2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBjb2RlIGEgbGl0dGxlIGJpdCwgdGhlIHBhcnNlciBrZWVwcwogICAgICAgICAgIHRyYWNrIG9mIHRoZSB0ZW1wbGF0ZSB0eXBlcyBhbmQgcGVyZm9ybXMgYmFjay1zdWJzdGl0dXRpb24gdG8KICAgICAgICAgICB0aGUgb3JpZ2luYWwgdHlwZSB3aGVuIGJ1aWxkaW5nIHRoZSBwYXJzZSB0cmVlLiAgVGh1cywgZXZlbgogICAgICAgICAgIHRob3VnaCB0aGUgaW1wbGljaXQgdHlwZWRlZiBpcyB1c2VkIGluIHRoZSBpbnB1dCBhbmQgbWF5IGFwcGVhcgogICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlIChmb3IgcHJvcGVyIGNvbXBpbGF0aW9uKSwgdGhlIHBhcnNlCiAgICAgICAgICAgdHJlZSB3aWxsIGhpZGUgYSBsb3Qgb2YgdGhlc2UgZGV0YWlscy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IF9fc3dpZ3RtcGwxIHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgd2lsbCBsb29rIGxpa2UgaXQgd2FzIGRlY2xhcmVkIGFzIGZvbGxvd3MgKHdoaWNoIGlzIHdoYXQKICAgICAgICAgICB5b3Ugd2FudCk6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgKmNvbnN0IHgpIHsgc3R1ZmYgfQoKICAgICAgICAgICBUaGUgb25seSBwbGFjZSB5b3UgYXJlIGxpa2VseSB0byBub3RpY2UgdGhlIHR5cGVkZWYgaGFjawogICAgICAgICAgIGlzIGluIGJvZGllcyBvZiB0ZW1wbGF0ZSBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgZGlkIHRoaXMsCgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGJsYWggewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB7CiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIFQgIHRlbXB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICB5b3Ugd2lsbCBmaW5kIHRoYXQgJ1QgdGVtcHZhbHVlJyBnb3QgZXhwYW5kZWQgaW50byBzb21lCiAgICAgICAgICAgc3RyYW5nZSB0eXBlZGVmIHR5cGUuICBUaGlzICpzdGlsbCogY29tcGlsZXMgY29ycmVjdGx5IAogICAgICAgICAgIHNvIGl0J3Mgbm90IGEgYmlnIGRlYWwgKG90aGVyIHRoYW4gbG9va2luZyBraW5kIG9mIHVnbHkKICAgICAgICAgICBpbiB0aGUgd3JhcHBlciBmaWxlKS4KCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHNvbWUgaW5oZXJpdGFuY2UgcHJvYmxlbXMgaW4gVGNsIE9iamVjdCBpbnRlcmZhY2UuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUY2wgbW9kdWxlIGhhcyBjaGFuZ2VkIHRvIHVzZSBieXRlLWJhY2tlZCBwb2ludGVyIHN0cmluZ3MuICBUaGlzCiAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHNhZmUgb24gNjQtYml0IHBsYXRmb3Jtcy4gIEhvd2V2ZXIsCiAgICAgICAgICAgdGhlIG9yZGVyIGluIHdoaWNoIGRpZ2l0cyBhcHBlYXIgaW4gcG9pbnRlciB2YWx1ZXMgbm8gbG9uZ2VyCiAgICAgICAgICAgZGlyZWN0bHkgY29ycmVzcG9uZHMgdG8gdGhlIGFjdHVhbCBudW1lcmljYWwgdmFsdWUgb2YgYQogICAgICAgICAgIHBvaW50ZXIgKG9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHBhaXJzIG9mIGRpZ2l0cyBhcHBlYXIKICAgICAgICAgICBpbiByZXZlcnNlIG9yZGVyKS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFBlcmw1IG1vZHVsZSBpcyBub3cgZHJpdmVuIGJ5IGEgY29uZmlndXJhdGlvbiBmaWxlICdwZXJsNS5zd2cnCiAgICAgICAgICAgaW4gdGhlIFNXSUcgbGlicmFyeS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwZXJsNSBtb2R1bGUgbm8gbG9uZ2VyIHRyaWVzIHRvIGFwcGx5IHRoZSAib3V0IiB0eXBlbWFwCiAgICAgICAgICAgaW4gY29kZSBnZW5lcmF0ZWQgZm9yIG1hZ2ljIHZhcmlhYmxlcy4gIEknbSBzdXJwcmlzZWQgdGhhdAogICAgICAgICAgIHRoaXMgZXZlciB3b3JrZWQgYXQgYWxsIChzaW5jZSBhbGwgb2YgdGhlIGNvZGUgdGhhdCB3YXMgdGhlcmUKICAgICAgICAgICB3YXMgd3JvbmcgYW55d2F5cykuICAgVXNlIHRoZSAidmFyb3V0IiB0eXBlbWFwIHRvIGhhbmRsZQogICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZXMuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIGNoYXJhY3RlciBhcnJheSBtZW1iZXJzIG9mIHN0cnVjdHVyZXMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMzJdOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBpcyBub3JtYWxseSBzdXBwb3NlZCB0byByZXR1cm4gYSBzdHJpbmcsIGJ1dCB0aGlzIHdhcwogICAgICAgICAgIGJyb2tlbiBpbiAxLjMuOS4gICBUaGUgcmVhc29uIGl0IHdhcyBicm9rZW4gd2FzIGFjdHVhbGx5CiAgICAgICAgICAgZHVlIHRvIGEgc3VidGxlIG5ldyBmZWF0dXJlIG9mIHR5cGVtYXBzLiAgV2hlbiBhIGRhdGEgbWVtYmVyCiAgICAgICAgICAgaXMgc2V0IHRvIGFuIGFycmF5IGxpa2UgdGhpcywgdGhlIHJldHVybiB0eXBlIG9mIHRoZSByZWxhdGVkCiAgICAgICAgICAgYWNjZXNzb3IgZnVuY3Rpb24gaXMgYWN0dWFsbHkgc2V0IHRvIGFuIGFycmF5LiAgVGhpcyBtZWFucwogICAgICAgICAgIHRoYXQgeW91IGNhbiBub3cgd3JpdGUgdHlwZW1hcHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChweXRob24sb3V0KSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJHNvdXJjZSwkZGltMCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgZGVmdW5jdAogICAgICAgICAgIG1lbWJlcm91dCB0eXBlbWFwIGluIGEgbW9yZSBlbGVnYW50IG1hbm5lci4KCjkvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNvbWUgZnVydGhlciByZWZpbmVtZW50IG9mIHF1YWxpZmllZCBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGZvbygpIGNvbnN0OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKGkpIFRoZSBTV0lHIHBhcnNlciB3YXMgZXh0ZW5kZWQgc2xpZ2h0bHkgdG8gYWxsb3cgJ3ZvbGF0aWxlJwogICAgICAgICAgIGFuZCBjb21iaW5hdGlvbnMgb2YgJ2NvbnN0JyBhbmQgJ3ZvbGF0aWxlJyB0byBiZSB1c2VkLiAgVGhpcwogICAgICAgICAgIGlzIHByb2JhYmx5IHJhcmUsIGJ1dCB0ZWNobmljYWxseSBsZWdhbC4gIE9ubHkgYWRkZWQgZm9yCiAgICAgICAgICAgY29tcGxldGVuZXNzLgoKICAgICAgICAgICAoaWkpIEZvciB0aGUgcHVycG9zZXMgb2Ygb3ZlcmxvYWRpbmcsIHF1YWxpZmllZCBhbmQgbm9uLXF1YWxpZmllZAogICAgICAgICAgIGZ1bmN0aW9ucyBhcmUgZGlmZmVyZW50LiAgVGh1cywgd2hlbiBhIGNsYXNzIGhhcyBtZXRob2RzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpIGNvbnN0OwoKICAgICAgICAgICBUd28gZGlzdGluY3QgbWV0aG9kcyBhcmUgZGVjbGFyZWQuICBUbyBkZWFsIHdpdGggdGhpcywgJXJlbmFtZQogICAgICAgICAgIGFuZCBzaW1pbGFyIGRpcmVjdGl2ZXMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHJlY29nbml6ZSBjb25zdC4KICAgICAgICAgICBUaHVzLCBvbmUgY2FuIGRpc2FtYmlndWF0ZSB0aGUgdHdvIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZShmb29jb25zdCkgRm9vOjpmb28oKSBjb25zdDsKCiAgICAgICAgICAgb3Igc2ltcGx5IGlnbm9yZSB0aGUgY29uc3QgdmFyaWFudCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBOb3RlOiBTV0lHIGN1cnJlbnRseSBoYXMgbm8gd2F5IHRvIGFjdHVhbGx5IGludm9rZSB0aGUgY29uc3QKICAgICAgICAgICBtZW1iZXIgc2luY2UgdGhlICdjb25zdCcgaXMgZGlzY2FyZGVkIHdoZW4gZ2VuZXJhdGluZyB3cmFwcGVycwogICAgICAgICAgIGZvciBvYmplY3RzLiAgCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBOZXcgZGlyZWN0aXZlLiAlbmFtZXdhcm4gY2FuIGJlIHVzZWQgdG8gaXNzdWUgd2FybmluZwogICAgICAgICAgIG1lc3NhZ2VzIGZvciBjZXJ0YWluIGRlY2xhcmF0aW9uIG5hbWVzLiAgIFRoZSBuYW1lCiAgICAgICAgICAgbWF0Y2hpbmcgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZS4KICAgICAgICAgICBUaGUgaW50ZW50IG9mIHRoaXMgZGlyZWN0aXZlIGlzIHRvIGlzc3VlIHdhcm5pbmdzIGZvcgogICAgICAgICAgIHBvc3NpYmxlIG5hbWVzcGFjZSBjb25mbGljdHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJW5hbWV3YXJuKCJwcmludCBpcyBhIHB5dGhvbiBrZXl3b3JkIikgcHJpbnQ7CgogICAgICAgICAgIFRoZSBuYW1lIG1hdGNoaW5nIGFsZ29yaXRobSBpcyBwZXJmb3JtZWQgYWZ0ZXIgYSBuYW1lCiAgICAgICAgICAgaGFzIGJlZW4gcmVzb2x2ZWQgdXNpbmcgJXJlbmFtZS4gIFRoZXJlZm9yZSwgYQogICAgICAgICAgIGRlY2xhcmF0aW9uIGxpa2UgdGhpcyB3aWxsIG5vdCBnZW5lcmF0ZSBhIHdhcm5pbmc6CgogICAgICAgICAgICAgICVyZW5hbWUoIlByaW50IikgcHJpbnQ7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgdm9pZCBwcmludCgpOyAgICAvKiBObyB3YXJuaW5nIGdlbmVyYXRlZCAqLwoKICAgICAgICAgICBTaW5jZSB0aGUgd2FybmluZyBtZWNoYW5pc20gZm9sbG93cyAlcmVuYW1lIHNlbWFudGljcywgaXQgaXMKICAgICAgICAgICBhbHNvIHRvIGlzc3VlIHdhcm5pbmdzIGZvciBzcGVjaWZpYyBjbGFzc2VzIG9yIGp1c3QgZm9yCiAgICAgICAgICAgY2VydGFpbiBtZW1iZXIgZnVuY3Rpb24gbmFtZXMuCgogICAgICAgICAgIChEYXZlIC0gSSd2ZSBiZWVuIHRoaW5raW5nIGFib3V0IGFkZGluZyBzb21ldGhpbmcgbGlrZSB0aGlzCiAgICAgICAgICAgZm9yIHF1aXRlIHNvbWUgdGltZS4gIEp1c3QgbmV2ZXIgZ290IGFyb3VuZCB0byBpdCkKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoKOS8yNy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW5oYW5jZWQgdGhlICVpZ25vcmUgZGlyZWN0aXZlIHNvIHRoYXQgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgIGNhbiBiZSBpc3N1ZWQgdG8gdXNlcnMuICAgVGhpcyBpcyBkb25lIHVzaW5nICVpZ25vcmV3YXJuCiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICVpZ25vcmV3YXJuKCJvcGVyYXRvciBuZXcgaWdub3JlZCIpIG9wZXJhdG9yIG5ldzsKCiAgICAgICAgICAgVGhlIG5hbWVzIGFuZCBzZW1hbnRpY3Mgb2YgJWlnbm9yZXdhcm4gaXMgZXhhY3RseSB0aGUgCiAgICAgICAgICAgc2FtZSBhcyAlaWdub3JlLiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICAgaXMgZm9yIG1vZHVsZSB3cml0ZXJzIHdobyB3YW50IHRvIGlnbm9yZSBjZXJ0YWluIHR5cGVzCiAgICAgICAgICAgb2YgZGVjbGFyYXRpb25zLCBidXQgd2hvIGFsc28gd2FudCB0byBhbGVydCB1c2VycyBhYm91dCBpdC4KICAgICAgICAgICBBIHVzZXIgbWlnaHQgYWxzbyB1c2UgdGhpcyBmb3IgZGVidWdnaW5nIChzaW5jZSBtZXNzYWdlcwogICAgICAgICAgIHdpbGwgYXBwZWFyIHdoZW5ldmVyIGFuIGlnbm9yZWQgZGVjbGFyYXRpb24gYXBwZWFycykuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yNi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU3VwZXItZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIG92ZXJsb2FkZWQgb3BlcmF0b3JzLiAKICAgICAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGNvbnNpc3RzIG9mIGEgZmV3IGRpZmZlcmVudCBwYXJ0cy4KCiAgICAgICAgICAgKGkpIE9wZXJhdG9yIG5hbWVzIHN1Y2ggYXMgJ29wZXJhdG9yKycgYXJlIG5vdyBhbGxvd2VkCiAgICAgICAgICAgYXMgdmFsaWQgZGVjbGFyYXRvciBuYW1lcy4gIFRodXMgdGhlICdvcGVyYXRvcicgc3ludGF4CiAgICAgICAgICAgY2FuIGFwcGVhciAqYW55cGxhY2UqIGEgbm9ybWFsIGRlY2xhcmF0b3IgbmFtZSB3YXMgdXNlZAogICAgICAgICAgIGJlZm9yZS4gIE9uIHRoZSBzdXJmYWNlLCB0aGlzIG1lYW5zIHRoYXQgb3BlcmF0b3JzIGNhbgogICAgICAgICAgIGJlIHBhcnNlZCBqdXN0IGxpa2Ugbm9ybWFsIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy4gCiAgICAgICAgICAgSG93ZXZlciwgaXQgYWxzbyBtZWFucyB0aGF0IG9wZXJhdG9yIG5hbWVzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgaW4gbWFueSBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcmVuYW1lKF9fYWRkX18pIENvbXBsZXg6Om9wZXJhdG9yKyhjb25zdCBDb21wbGV4ICYpOwoKICAgICAgICAgICAoaWkpIE9wZXJhdG9ycyBhcmUgd3JhcHBlZCAqZXhhY3RseSogbGlrZSBub3JtYWwgZnVuY3Rpb25zCiAgICAgICAgICAgYW5kIG1ldGhvZHMuICBJbnRlcm5hbGx5LCB0aGUgb3BlcmF0b3IgbmFtZSBpcyB1c2VkIAogICAgICAgICAgIGRpcmVjdGx5IG1lYW5pbmcgdGhhdCB0aGUgd3JhcHBlciBjb2RlIG1pZ2h0IGNvbnRhaW4KICAgICAgICAgICBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBhcmcwLT5vcGVyYXRvciooKENvbXBsZXggY29uc3QgJikqYXJnMSk7CgogICAgICAgICAgIFRoaXMgYWxsIHNlZW1zIHRvIHBhcnNlIGFuZCBjb21waWxlIGNvcnJlY3RseSAoYXQgbGVhc3QKICAgICAgICAgICBvbiBteSBtYWNoaW5lKS4KCiAgICAgICAgICAgKGlpaSkgU1dJRyB3aWxsIG5vIGxvbmdlciB3cmFwIGEgZGVjbGFyYXRpb24gaWYgaXRzIHN5bWJvbAogICAgICAgICAgIHRhYmxlIG5hbWUgY29udGFpbnMgaWxsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMuICBJZgogICAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVycyBhcmUgZGV0ZWN0ZWQsIHlvdSB3aWxsIHNlZSBhbiBlcnJvcgogICAgICAgICAgIGxpa2UgdGhpczoKIAogICAgICAgICAgICAgICAgV2FybmluZy4gQ2FuJ3Qgd3JhcCBvcGVyYXRvciogdW5sZXNzIHJlbmFtZWQgdG8gYSB2YWxpZCBpZGVudGlmaWVyLgoKICAgICAgICAgICBUaGUgb25seSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gdXNlICVyZW5hbWUgb3IgJW5hbWUgdG8gYmluZAogICAgICAgICAgIHRoZSBvcGVyYXRvciB0byBhIG5pY2UgbmFtZSBsaWtlICJhZGQiIG9yIHNvbWV0aGluZy4gTm90ZToKICAgICAgICAgICB0aGUgbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSB0YXJnZXQKICAgICAgICAgICBsYW5ndWFnZS4KCiAgICAgICAgICAgVGhlcmUgYXJlIGNlcnRhaW4gaXNzdWVzIHdpdGggZnJpZW5kIGZ1bmN0aW9ucyBhbmQgb3BlcmF0b3JzLgogICAgICAgICAgIFNvbWV0aW1lcywgZnJpZW5kcyBhcmUgdXNlZCB0byBkZWZpbmUgbWl4ZWQgb3BlcmF0b3JzIHN1Y2gKICAgICAgICAgICBhcyBhZGRpbmcgYSBDb21wbGV4IGFuZCBhIGRvdWJsZSB0b2dldGhlci4gIEN1cnJlbnRseSwgU1dJRwogICAgICAgICAgIGlnbm9yZXMgYWxsIGZyaWVuZCBkZWNsYXJhdGlvbnMgaW4gYSBjbGFzcy4gIEEgZ2xvYmFsIG9wZXJhdG9yCiAgICAgICAgICAgZGVjbGFyYXRpb24gY2FuIHByb2JhYmx5IGJlIG1hZGUgdG8gd29yaywgYnV0IHlvdSdsbCBoYXZlIHRvCiAgICAgICAgICAgcmVuYW1lIGl0IGFuZCBpdCBwcm9iYWJseSB3b24ndCB3b3JrIHZlcnkgY2xlYW5seSBpbiB0aGUKICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2Ugc2luY2UgaXQncyBub3QgYSBjbGFzcyBtZW1iZXIuCgogICAgICAgICAgIFNXSUcgZG9lc24ndCBrbm93IGhvdyB0byBoYW5kbGUgb3BlcmF0b3Igc3BlY2lmaWNhdGlvbnMgCiAgICAgICAgICAgc29tZXRpbWVzIHVzZWQgZm9yIGF1dG9tYXRpYyB0eXBlIGNvbnZlcnNpb24uIEZvciBleGFtcGxlOgoKICAgICAgICAgICBjbGFzcyBTdHJpbmcgewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCk7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKHRoaXMgZG9lc24ndCBwYXJzZSBjb3JyZWN0bHkgYW5kIGdlbmVyYXRlcyBhIHN5bnRheCBlcnJvcikuCgogICAgICAgICAgIEFsc286IG9wZXJhdG9ycyBubyBsb25nZXIgc2hvdyB1cCBhcyBzZXBhcmF0ZSBwYXJzZS10cmVlCiAgICAgICAgICAgbm9kZXMgKGluc3RlYWQgdGhleSBhcmUgbm9ybWFsICdjZGVjbCcgbm9kZXMpLiAgSSBtYXkKICAgICAgICAgICBzZXBhcmF0ZSB0aGVtIGFzIGEgc3BlY2lhbCBjYXNlIGxhdGVyLgoKICAgICAgICAgICBTZWUgRXhhbXBsZXMvcHl0aG9uL29wZXJhdG9yIGZvciBhbiBleGFtcGxlLgoKICAgICAgICAgICAqKiogU1VQRVItRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKVmVyc2lvbiAxLjMuOSAoU2VwdGVtYmVyIDI1LCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlIGRlY2xhcmF0aW9ucyBsaWtlIAogICAgICAgICAgICdjaGFyICoqIGNvbnN0Jy4gIFNXSUcgcGFyc2VkIHRoaXMgY29ycmVjdGx5LCBidXQgdGhlCiAgICAgICAgICAgaW50ZXJuYWwgdHlwZSB3YXMgcmVwcmVzZW50ZWQgaW5jb3JyZWN0bHkgKHRoZSBwb2ludGVycwogICAgICAgICAgIGFuZCBxdWFsaWZpZXJzIHdlcmUgaW4gdGhlIHdyb25nIG9yZGVyKS4KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIFdpdGhkcmV3IGV4cGVyaW1lbnRhbCBmZWF0dXJlIChub3RlZCBiZWxvdykgdGhhdCB3YXMKICAgICAgICAgICBjYXVzaW5nIHNlcmlvdXMgcGFyc2luZyBwcm9ibGVtcy4KClZlcnNpb24gMS4zLjggKFNlcHRlbWJlciAyMywgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgaW1wcm92ZWQgZGlzdHV0aWxzIHNldHVwLnB5IGZpbGUgaW4gdGhlIFRvb2xzIAogICAgICAgICAgIGRpcmVjdG9yeSAobG9vayBmb3IgdGhlIHNldHVwLnB5LnRtcGwgZmlsZSkuICBDb250cmlidXRlZCBieQogICAgICAgICAgIFRvbnkgU2V3YXJkLgoKOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgdHdvIG5ldyBSUE0gc3BlYyBmaWxlcyBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5LiBDb250cmlidXRlZAogICAgICAgICAgIGJ5IFRvbnkgU2V3YXJkIGFuZCBVd2UgU3RlaW5tYW5uLgogIAo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYzNjM1IF0gUGVybDUuc3dnIGRvZXMgbm90IGNvbXBpbGUgaW4gVmlzdWFsIEMrKwoKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVHdvIG5ldyBkaXJlY3RpdmVzIGNvbnRyb2wgdGhlIGNyZWF0aW9uIG9mIGRlZmF1bHQKICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQKICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdAoKICAgICAgICAgICBUaGVzZSByZXBsYWNlICVwcmFnbWEgbm9kZWZhdWx0IGFuZCAlcHJhZ21hIG1ha2VkZWZhdWx0LgogICAgICAgICAgIChvbGQgY29kZSB3aWxsIHN0aWxsIHdvcmssIGJ1dCBkb2N1bWVudGF0aW9uIHdpbGwgb25seQogICAgICAgICAgIGRlc2NyaWJlIHRoZSBuZXcgZGlyZWN0aXZlcykuCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYyMzU0IF0gJWltcG9ydCBicm9rZW4gaW4gMS4zLjcuCgo5LzIwLzIwMDE6IGJlYXpsZXkKCiAgICAgICAgICAgUGFyc2VyIG1vZGlmaWVkIHRvIGlnbm9yZSBvdXQtb2YtY2xhc3MgY29uc3RydWN0b3IKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvciBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGlubGluZSBGb286OkZvbygpIDoKICAgICAgICAgICAgICAgICAgICBCYXIoImZvbyIpCiAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgIH0gCgogICAgICAgICAgICAgICBpbmxpbmUgRm9vOjp+Rm9vKCkgewogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFN1Z2dlc3RlZCBieSBKYXNvbiBTdGV3YXJ0LgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gaWdub3JlIGZvcndhcmQgdGVtcGxhdGUgY2xhc3MKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFYsIGxvbmcgUz4gY2xhc3MgTWFwSXRlcjsKCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IGFuIGVtYWlsIGV4YW1wbGUgZnJvbSBJcmluYSBLb3Rsb3ZhLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHVuZGVjbGFyZWQgdGNsX3Jlc3VsdCB2YXJpYWJsZSBpbiAKICAgICAgICAgICB0aGUgIm91dCIgdHlwZW1hcCBmb3IgVGNsLiAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEFjdGl2ZVBlcmwuICAKICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwYXJzaW5nIG9mIEMrKyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgRm9vKCkgOiBCYXIoLi4uKSB7Li4ufQogICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgbm93IGRpc2NhcmRzIHRoZSBjb250ZW50cyBvZiB0aGUgKC4uLikgcmVnYXJkbGVzcyBvZiAKICAgICAgICAgICB3aGF0IG1pZ2h0IGVuY2xvc2VkIChldmVuIGlmIHN5bnRhY3RpY2FsbHkgd3JvbmcpLiAgU1dJRwogICAgICAgICAgIGRvZXNuJ3QgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGFuZCB0aGVyZSBpcyBubyByZWFzb24gdG8KICAgICAgICAgICBuZWVkbGVzcyBhZGQgc3ludGF4IHJ1bGVzIHRvIGhhbmRsZSBhbGwgb2YgdGhlIHBvc3NpYmlsaXRpZXMKICAgICAgICAgICBoZXJlLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHR5cGVtYXBzIGZvciBzdHJ1Y3R1cmUgbWVtYmVycy4gIElmIHlvdSBoYXZlIGEKICAgICAgICAgICBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgIGludCAqYmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBtZW1iZXIgbmFtZSAnYmFyJyBpcyBub3cgdXNlZCBpbiBhbnkgYWNjZXNzb3IgZnVuY3Rpb25zLgogICAgICAgICAgIFRoaXMgYWxsb3dzIHRoZSAiaW4iIHR5cGVtYXAgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIHZhbHVlLgogICAgICAgICAgIEZvciBleGFtcGxlLCB0aGlzIHR5cGVtYXAKCiAgICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixpbikgaW50ICpiYXIgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgbm93IG1hdGNoZXMgVmVjdG9yOjpiYXIuICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIHdpbGwgYWxzbwogICAgICAgICAgIG1hdGNoIGFueSBmdW5jdGlvbiB3aXRoIGFuIGFyZ3VtZW50IG9mICJpbnQgKmJhciIgKHNvIHlvdSBzaG91bGQKICAgICAgICAgICBiZSBjYXJlZnVsKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUuIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjY0MiBzZXR0aW5nIHN0cmluZyB2YWx1ZXMgaW4gc3RydWN0dXJlcwoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjIzOTggcHJvYmxlbSB3aXRoIG5lc3RlZCB0ZW1wbGF0ZXMuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MTYyNiBwcm9ibGVtIHdpdGggZm9ybWF0dGluZyBhbmQgQysrIGNvbW1lbnRzLgogICAgICAgICAgICAKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjI4NDUgV3Jvbmcgb3duZXJzaGlwIG9mIHJldHVybmVkIG9iamVjdHMuCiAgICAgICAgICAgCjkvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDU5MzY3LiAgRGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIGNsYXNzZXMKICAgICAgICAgICB3aXRoIHB1cmUgdmlydHVhbCBtZXRob2RzLgoKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCBjbGFzcyBzY29wZS4gIEZvcgogICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGVudW0gYmFyIHsgRk9PLCBCQVIgfTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGJhciBiID0gRk9PKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU1dJRyBub3cgY29ycmVjdGx5IGdlbmVyYXRlcyBhIGRlZmF1bHQgdmFsdWUgb2YgIkZvbzo6Rk9PIiBmb3IKICAgICAgICAgICB0aGUgYmxhaCgpIG1ldGhvZCBhYm92ZS4gIFRoaXMgdXNlZCB0byB3b3JrIGluIDEuMSwgYnV0IHdhcwogICAgICAgICAgIGJyb2tlbiBpbiAxLjMuNy4gICBCdWcgcmVwb3J0ZWQgYnkgTWlrZSBSb21iZXJnLgoKVmVyc2lvbiAxLjMuNyAgKFNlcHRlbWJlciAzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzAyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzcGVjaWFsICVpZ25vcmUgZGlyZWN0aXZlIHRvIGlnbm9yZSBkZWNsYXJhdGlvbnMuICBUaGlzCiAgICAgICAgICAgZmVhdHVyZSB3b3JrcyBleGFjdGx5IGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgIGZvbzsgICAgICAgIC8vIElnbm9yZSBhbGwgZGVjbGFyYXRpb25zIGZvbwogICAgICAgICAgICAgJWlnbm9yZSAgOjpmb287ICAgICAgLy8gT25seSBpZ25vcmUgZm9vIGluIGdsb2JhbCBzY29wZQogICAgICAgICAgICAgJWlnbm9yZSAgU3BhbTo6Zm9vOyAgLy8gT25seSBpZ25vcmUgaW4gY2xhc3MgU3BhbQogICAgICAgICAgICAgJWlnbm9yZSAgKjo6Zm9vOyAgICAgLy8gSWdub3JlIGluIGFsbCBjbGFzc2VzCgogICAgICAgICAgICVpZ25vcmUgY2FuIGFsc28gYmUgcGFyYW1ldGVyaXplZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIDo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIFNwYW06OmZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSAqOjpmb28oaW50KTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKCjkvMDIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIHNoYWRvd2NvZGUgcHJhZ21hIG1vZGlmaWVkIHNvIHRoYXQgdGhlIGNvZGUgdGhhdCBpcyBvdXRwdXQgCiAgICAgICAgICAgaW4gdGhlIHNoYWRvdyBmaWxlIGlzIHBsYWNlZCByZWxhdGl2ZSB0byB3aGVyZSBpdCBpcyBwbGFjZWQgaW4gdGhlIAogICAgICAgICAgIGMvYysrIGNvZGUuIFRoaXMgYWxsb3dzIHN1cHBvcnQgZm9yIEphdmFEb2MgZnVuY3Rpb24gY29tbWVudHMuIAoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgUGF0Y2ggWyAjNDQ3NzkxIF0gRml4IGZvciBweXRob24gLWludGVyZmFjZSBvcHRpb24uCiAgICAgICAgICAgU3VibWl0dGVkIGJ5IFRhcm4gV2Vpc25lciBCdXJ0b24uCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKICAgICAgICAgICBmb3IgYSBjbGFzcyBpZiBpdCBvbmx5IGRlZmluZXMgYSBwcml2YXRlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcgogICAgICAgICAgIG9yIGRlc3RydWN0b3Igb3IgaWYgYW55IG9uZSBvZiBpdHMgYmFzZSBjbGFzc2VzIG9ubHkgaGFzCiAgICAgICAgICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuICBUaGlzIHdhcyByZXBvcnRlZCBpbgogICAgICAgICAgIFNGIFBhdGNoIFsgIzQ0NDI4MSBdIG5vbnB1YmxpYy9kZWZhdWx0L2luaGVyZXRlZCBjdG9yL2R0b3IKICAgICAgICAgICBieSBNYXJjZWxvIE1hdHVzLgoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gUGVybDUgbW9kdWxlIHRoYXQgYWxsb3dzIGNvbnN0YW50cyB0byBiZQogICAgICAgICAgIHdyYXBwZWQgYXMgY29uc3RhbnRzIHRoYXQgZG9uJ3QgcmVxdWlyZSB0aGUgbGVhZGluZyAkLgogICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIHVzaW5nIHRoZSAtY29uc3Qgb3B0aW9uLgogICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFJpY2ggV2FsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgJ3ZvbGF0aWxlJyB0eXBlIHF1YWxpZmllci4KICAgICAgICAgICB2b2xhdGlsZSBkb2Vzbid0IG1lYW4gYW55dGhpbmcgdG8gU1dJRywgYnV0IGl0IGlzCiAgICAgICAgICAgbmVlZGVkIHRvIHByb3Blcmx5IGdlbmVyYXRlIHByb3RvdHlwZXMgZm9yIGRlY2xhcmF0aW9ucwogICAgICAgICAgIHRoYXQgdXNlIGl0LiAgSXQncyBhbHNvIGJlZW4gYWRkZWQgdG8gbWFrZSB0aGUgU1dJRyB0eXBlCiAgICAgICAgICAgc3lzdGVtIG1vcmUgY29tcGxldGUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCAlcmVuYW1lIGRpcmVjdGl2ZS4gICoqKiBUaGlzCiAgICAgICAgICAgbmV3IGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gZ3JlYXRseSBzaW1wbGlmeSB0aGUgdGFzayBvZgogICAgICAgICAgIHJlc29sdmluZyBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4gKioqCiAgICAgICAgICAgCiAgICAgICAgICAgSW4gcHJpb3IgdmVyc2lvbnMgb2YgU1dJRywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIHdhcwogICAgICAgICAgIHVzZWQgdG8gY29uc2lzdGVudGx5IGFwcGx5IGFuIGlkZW50aWZpZXIgcmVuYW1pbmcuIEZvciAKICAgICAgICAgICBleGFtcGxlLCBpZiB5b3Ugc2FpZCB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUgZm9vIGJhcjsKCiAgICAgICAgICAgRXZlcnkgb2NjdXJyZW5jZSBvZiAnZm9vJyB3b3VsZCBiZSByZW5hbWVkIHRvICdiYXInLiAKICAgICAgICAgICBBbHRob3VnaCB0aGlzIHdvcmtzIGZpbmUgZm9yIHJlc29sdmluZyBhIGNvbmZsaWN0IHdpdGggYQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSByZXNlcnZlZCB3b3JkLCBpdCBpcyB1c2VsZXNzIGZvcgogICAgICAgICAgIGZvciBkZWFsaW5nIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzLiAgICBUaGlzIGlzIGJlY2F1c2UKICAgICAgICAgICBhbGwgbWV0aG9kcyBhcmUgc2ltcGx5IHJlbmFtZWQgdG8gdGhlIHNhbWUgdGhpbmcgCiAgICAgICAgICAgKGdlbmVyYXRpbmcgdGhlIHNhbWUgY29uZmxpY3QgYXMgYmVmb3JlKS4KCiAgICAgICAgICAgVGhlcmVmb3JlLCB0aGUgb25seSB3YXkgdG8gZGVhbCB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcwogICAgICAgICAgIHdhcyB0byBnbyB0aHJvdWdoIGFuZCBpbmRpdmlkdWFsbHkgcmVuYW1lIHRoZW0gYWxsIHVzaW5nCiAgICAgICAgICAgJW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgeW91IGhhZCB0byBkbyB0aGlzIGZvciBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMgdG9vLgoKICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKHZvaWQpOwogICAgICAgICAgICAgICAgICVuYW1lKGJhcl9pKSB2aXJ0dWFsIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBOZWVkbGVzcyB0byBzYXksIHRoaXMgbWFrZXMgaXQgZXh0cmVtZWx5IGhhcmQgdG8gcmVzb2x2ZQogICAgICAgICAgIG92ZXJsb2FkaW5nIHdpdGhvdXQgYSBsb3Qgb2Ygd29yayBhbmQgbWFrZXMgaXQgYWxtb3N0CiAgICAgICAgICAgaW1wb3NzaWJsZSB0byB1c2UgU1dJRyBvbiByYXcgQysrIC5oIGZpbGVzLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgJXJlbmFtZSBub3cgYWNjZXB0cyBwYXJhbWV0ZXIgZGVjbGFyYXRvcnMuCiAgICAgICAgICAgVGhlIHN5bnRheCBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBGb3IgZXhhbXBsZSwKICAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIHJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXIoaW50KScKICAgICAgICAgICB0byAnYmFyX2knLCBsZWF2aW5nIGFueSBvdGhlciBvY2N1cnJlbmNlIG9mICdiYXInIGFsb25lLgoKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIGJhcihpbnQpOwoKICAgICAgICAgICBVc2luZyB0aGlzIGZlYXR1cmUsIHlvdSBjYW4gbm93IHNlbGVjdGl2ZWx5IHJlbmFtZSAKICAgICAgICAgICBjZXJ0YWluIGRlY2xhcmF0aW9ucyBpbiBhZHZhbmNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9kKSBiYXIoZG91YmxlKTsKCiAgICAgICAgICAgICAvLyBJbmNsdWRlIHJhdyBDKysgaGVhZGVyICAgIAogICAgICAgICAgICAgJWluY2x1ZGUgImhlYWRlci5oIgoKICAgICAgICAgICBXaGVuICVyZW5hbWUgaXMgdXNlZCBpbiB0aGlzIG1hbm5lciwgYWxsIG9jY3VycmVuY2Ugb2YgYmFyKGludCkKICAgICAgICAgICBhcmUgcmVuYW1lZCB3aGVyZXZlciB0aGV5IG1pZ2h0IG9jY3VyLiAgTW9yZSBjb250cm9sIGlzIG9idGFpbmVkCiAgICAgICAgICAgdGhyb3VnaCBleHBsaWNpdCBxdWFsaWZpY2F0aW9uLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgOjpiYXIoaW50KTsKCiAgICAgICAgICAgb25seSBhcHBsaWVzIHRoZSByZW5hbWluZyBpZiBiYXIoaW50KSBpcyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCiAgICAgICAgICAgVGhlIGRlY2xhcmF0aW9uLAogICAgIAogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIEZvbzo6YmFyKGludCk7CgogICAgICAgICAgIGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gYSBjbGFzcyBGb28uCiAgICAgICAgICAgVGhpcyBsYXR0ZXIgZm9ybSBhbHNvIHN1cHBvcnRzIGluaGVyaXRhbmNlLiAgVGhlcmVmb3JlLCBpZiB5b3UKICAgICAgICAgICBoYWQgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIFNwYW06OmJhcihpbnQpIG1ldGhvZCB3b3VsZCBhbHNvIGJlIHJlbmFtZWQgKHNpbmNlIFNwYW0gCiAgICAgICAgICAgaXMgYSBzdWJjbGFzcyBvZiBGb28pLiAgIFRoaXMgbGF0dGVyIGZlYXR1cmUgbWFrZXMgaXQgZWFzeQogICAgICAgICAgIGZvciBTV0lHIHRvIGFwcGx5IGEgY29uc2lzdGVudCByZW5hbWluZyBhY3Jvc3MgYW4gZW50aXJlCiAgICAgICAgICAgY2xhc3MgaGllcmFyY2h5IHNpbXBseSBieSBzcGVjaWZ5aW5nIHJlbmFtaW5nIHJ1bGVzIGZvcgogICAgICAgICAgIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICBBIGNsYXNzIHdpbGRjYXJkIG9mICogY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gcmVuYW1pbmcKICAgICAgICAgICBhbGwgbWF0Y2hpbmcgbWVtYmVycyBvZiBhbGwgY2xhc3Nlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSAqOjpiYXIoaW50KTsKCiAgICAgICAgICAgd2lsbCByZW5hbWUgYWxsIG1lbWJlcnMgYmFyKGludCkgdGhhdCBhcmUgZGVmaW5lZCBpbiBjbGFzc2VzLgogICAgICAgICAgIEl0IHdpbGwgbm90IHJlbmFtZWQgZGVmaW5pdGlvbnMgb2YgYmFyKGludCkgaW4gdGhlIGdsb2JhbAogICAgICAgICAgIHNjb3BlLgoKICAgICAgICAgICBUaGUgb2xkIHVzZSBvZiAlcmVuYW1lIGlzIHN0aWxsIHN1cHBvcnRlZCwgYnV0IGlzIHNvbWV3aGF0CiAgICAgICAgICAgZW5oYW5jZWQuICAKCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIGJhcjsgICAgICAvLyBSZW5hbWVzIGFsbCBvY2N1cnJlbmNlcyBvZiAnYmFyJy4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgOjpiYXI7ICAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gZ2xvYmFsIHNjb3BlIG9ubHkuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pICo6OmJhcjsgICAvLyBSZW5hbWUgYWxsICdiYXInIGluIGNsYXNzZXMgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgRm9vOjpiYXI7IC8vIFJlbmFtZSBhbGwgJ2JhcicgZGVmaW5lZCBpbiBjbGFzcyBGb28uCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGRhdGEtbWVtYmVyIHRvIG1lbWJlci1mdW5jdGlvbiAKICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5vdyBzdXBwb3NlIHRoYXQgeW91IHdhbnRlZCB0byBhY2Nlc3MgeCBhbmQgeSAKICAgICAgICAgICB0aHJvdWdoIGEgbWVtYmVyIGZ1bmN0aW9uIGludGVyZmFjZSBpbnN0ZWFkIAogICAgICAgICAgIG9mIHRoZSB1c3VhbCBTV0lHIGJlaGF2aW9yLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZi5zZXRfeCgzLjQpICAgICAgIyBpbnN0ZWFkIG9mIGYueCA9IDMuNAogICAgICAgICAgICAgIHggPSBmLmdldF94KCkgICAgICMgaW5zdGVhZCBvZiB4ID0gZi54CgogICAgICAgICAgIFRvIGRvIHRoaXMsIHNpbXBseSB1c2UgdGhlIG5ldyAlYXR0cmlidXRlZnVuYwogICAgICAgICAgIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXRfJXMsc2V0XyVzKQogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgIGRvdWJsZSB4LHk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAlbm9hdHRyaWJ1dGVmdW5jCgogICAgICAgICAgIFRoZSBhcmd1bWVudHMgdG8gJWF0dHJpYnV0ZWZ1bmMgYXJlIEMtc3R5bGUgcHJpbnRmCiAgICAgICAgICAgZm9ybWF0IHN0cmluZ3MgdGhhdCBkZXRlcm1pbmUgdGhlIG5hbWluZyBjb252ZW50aW9uCiAgICAgICAgICAgdG8gdXNlLiAgJXMgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlCiAgICAgICAgICAgZGF0YSBtZW1iZXIuIFNXSUcgcHJvdmlkZXMgYSBudW1iZXIgb2YgcHJpbnRmCiAgICAgICAgICAgZXh0ZW5zaW9ucyB0aGF0IG1pZ2h0IGhlbHAuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgd2FudGVkIHRvIHRpdGxlIGNhc2UgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzLCB5b3UKICAgICAgICAgICBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXQlKHRpdGxlKXMsc2V0JSh0aXRsZSlzKTsKCiAgICAgICAgICAgVGhpcyB3aWxsIHR1cm4gYW4gYXR0cmlidXRlICdiYXInIHRvICdnZXRCYXIoKScgYW5kICdzZXRCYXIoKScuCgogICAgICAgICAgIChzb21lb25lIHJlcXVlc3RlZCB0aGlzIGxvbmcgYWdvLCBidXQgSSBmaW5hbGx5IGZpZ3VyZWQKICAgICAgICAgICBob3cgdG8gaW1wbGVtZW50IGl0IGluIGEgc3RyYWlnaHRmb3J3YXJkIG1hbm5lcikuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgaWYgbm9uZSBhcmUgZGVmaW5lZC4gIFRoaXMgdXNlZCB0byBiZQogICAgICAgICAgIGVuYWJsZWQgd2l0aCBhIGNvbW1hbmQgbGluZSBzd2l0Y2ggLW1ha2VfZGVmYXVsdCwgYnV0CiAgICAgICAgICAgbW9zdCBwZW9wbGUgd2FudCB0aGVzZSBmdW5jdGlvbnMgYW55d2F5cy4gIFRvIHR1cm4KICAgICAgICAgICBvZmYgdGhpcyBiZWhhdmlvciB1c2UgdGhlIC1ub19kZWZhdWx0IG9wdGlvbiBvciBpbmNsdWRlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW4gdGhlIGludGVyZmFjZSBmaWxlOgogCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0OwogIAogICAgICAgICAgIFRoaXMgbWF5IGJyZWFrIGNlcnRhaW4gaW50ZXJmYWNlcyB0aGF0IGRlZmluZWQgdGhlaXIKICAgICAgICAgICBvd24gY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIHVzaW5nIHRoZSBzYW1lIG5hbWluZwogICAgICAgICAgIGNvbnZlbnRpb24gYXMgU1dJRy4gIElmIHNvLCB5b3Ugd2lsbCBnZXQgZHVwbGljYXRlCiAgICAgICAgICAgc3ltYm9scyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyIGZpbGUuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFBlcmw1IHNoYWRvdyBjbGFzcyBjb2RlIGdlbmVyYXRpb24uICBJdGVyYXRvcnMKICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCAoRklSU1RLRVksIE5FWFRLRVkpLiAgQWxzbywgYXR0cmlidXRlCiAgICAgICAgICAgYWNjZXNzIGhhcyBiZWVuIGNoYW5nZWQgdG8gcmVseSBvbiBpbmhlcml0YW5jZSBpbiBvcmRlcgogICAgICAgICAgIHRvIHByb3ZpZGUgYmV0dGVyIGJlaGF2aW9yIGFjcm9zcyBtb2R1bGVzLiAgCgo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBWYXJpb3VzIG9ic2N1cmUgaW1wcm92ZW1lbnRzIHRvIHRoZSB0eXBlIHN5c3RlbSBhbmQgY2xhc3Nlcy4KICAgICAgICAgICBTdHJhbmdlIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMgYXJlIG5vdyB3cmFwcGVkIGNvcnJlY3RseQogICAgICAgICAgIChpLmUuLCB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBkb2Vzbid0IGNhdXNlIHRoZSBDKysKICAgICAgICAgICAgY29tcGlsZXIgdG8gZGllIHdpdGggYSB0eXBlIGVycm9yKS4KCiAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBSZWFsOwogICAgICAgICAgICAgICAgIFJlYWwgZm9vKFJlYWwgKCpvcCkoUmVhbCxSZWFsKSwgUmVhbCB4LCBSZWFsIHkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICBJbmhlcml0YW5jZSBvZiB0eXBlcyBpcyBhbHNvIGhhbmRsZWQgY29ycmVjdGx5LgogICAgICAgICAgIAo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIGNsYXNzIHdyYXBwZXJzLiAgIFdoZW4gU1dJRyBzZWVzIHR3byBjbGFzc2VzIGxpa2UgdGhpcywKIAogICAgICAgICAgIGNsYXNzIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBjbGFzcyBZIDogcHVibGljIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBpdCBub3cgb25seSBnZW5lcmF0ZXMgdHdvIHdyYXBwZXIgZnVuY3Rpb25zOgogCiAgICAgICAgICAgICBYX2ZvbyhYICp4KSB7IHgtPmZvbygpOyB9CiAgICAgICAgICAgICBZX2JhcihZICp5KSB7IHktPmJhcigpOyB9CiAKICAgICAgICAgICBVbmxpa2UgU1dJRzEuMTUsIHRoZSBmb28oKSBtZXRob2QgZG9lcyAqbm90KiBwcm9wYWdhdGUgdG8gYSB3cmFwcGVyCiAgICAgICAgICAgZnVuY3Rpb24gWV9mb28oKS4gSW5zdGVhZCwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIFhfZm9vKCkgbXVzdCBiZQogICAgICAgICAgIHVzZWQuCgogICAgICAgICAgIFRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IG1vZHVsZXMgdGhhdCB1c2Ugc2hhZG93IGNsYXNzZXMsIGJ1dAogICAgICAgICAgIGl0IG1pZ2h0IGJyZWFrIG1vZHVsZXMgdGhhdCBkaXJlY3RseSB1c2UgdGhlIGxvdy1sZXZlbCBDIHdyYXBwZXJzLgogICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGJlaW5nIG1hZGUgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnM6CgogICAgICAgICAgICAgICAtICBJdCBncmVhdGx5IHNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFNXSUctLWVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgd2l0aCBhbnRpY2lwYXRlZCBmdXR1cmUgY2hhbmdlcyBzdWNoIGFzIG92ZXJsb2FkZWQgbWV0aG9kcy4KCiAgICAgICAgICAgICAgIC0gIEl0IHJlc3VsdHMgaW4gc3Vic3RhbnRpYWxseSBsZXNzIHdyYXBwZXIgY29kZS0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICBmb3IgYmlnIEMrKyBjbGFzcyBoaWVyYXJjaGllcyAoaW5oZXJpdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIGNvcGllZCBpbnRvIGV2ZXJ5IHNpbmdsZSBkZXJpdmVkIGNsYXNzKS4KCiAgICAgICAgICAgICAgIC0gIEl0IGFsbG93cyBmb3IgYmV0dGVyIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyAoY29kZSBpc24ndCByZXBsaWNhdGVkIGluCiAgICAgICAgICAgICAgICAgIGV2ZXJ5IHNpbmdsZSBtb2R1bGUpLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgUHJvdmlkZWQgc29tZSBXaW5kb3dzIGRvY3VtZW50YXRpb24gaW4gdGhlIFdpbiBkaXJlY3RvcnkgYW5kIHNvbWUKICAgICAgICAgICBWaXN1YWwgQysrIHByb2plY3QgZmlsZXMgZm9yIHJ1bm5pbmcgZXhhbXBsZXMgb24gV2luZG93cy4KCjgvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBIYW5kbGUgcmVuYW1lZCBvdmVybG9hZGVkIGZ1bmN0aW9ucyBwcm9wZXJseTsKCSAgIHRoYW5rcyB0byBNYXJjIFpvbnpvbiA8TWFyYy5ab256b25AdW5pdi1yZW5uZXMxLmZyPiBmb3IgdGhlCgkgICBwYXRjaC4gIFNlZSB0aGUgbmV3IHRlc3QgY2FzZSBuYW1lX2N4eC4KCjgvMjcvMjAwMTogbWtvZXBwZQoJICAgW1RjbF0gUmVtb3ZlZCBsb3RzIG9mIHdhcm5pbmdzIGlzc3VlZCBieSB0aGUgU3VuIEZvcnRlCgkgICBjb21waWxlcnMsIHdoaWNoIHdlcmUgY2F1c2VkIGJ5IG1peGluZyBmdW5jdGlvbiBwb2ludGVycwoJICAgb2YgZGlmZmVyZW50IGxpbmthZ2VzIChDKysvQykuIAoKOC8yMy8yMDAxOiBta29lcHBlCgkgICBJbXByb3ZlZCB0aGUgTXpTY2hlbWUgbW9kdWxlIGJ5IHBvcnRpbmcgR3VpbGUncyBwb2ludGVyCgkgICB0eXBlIGNoZWNraW5nIHN5c3RlbSBhbmQgbWFraW5nIHR5cGUgZGlzcGF0Y2gKCSAgIHR5cGVtYXAtZHJpdmVuLiAKCjgvMjIvMjAwMTogYmVhemxleQogICAgICAgICAgIEVudGlyZWx5IG5ldyBzeW1ib2wgdGFibGUgcHJvY2Vzc2luZy4gICBTV0lHIHNob3VsZCBiZSBhYmxlIHRvCiAgICAgICAgICAgcmVwb3J0IG11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgIEFsc28sIHRoZSBuZXcgc3ltYm9sIHRhYmxlIGFsbG93cyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMKICAgICAgICAgICAoYWx0aG91Z2ggb3ZlcmxvYWRpbmcgaXNuJ3QgcXVpdGUgc3VwcG9ydGVkIGluIHRoZSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMgeWV0KS4KCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gJW5ldyBzdXBwb3J0IGFkZGVkLgogICAgICAgICAgICogW0phdmFdIFBhY2thZ2UgSk5JIG5hbWUgcmVmaXhlZCEKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFB5dGhvbiBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBwb2ludGVycyB0byBDKysgbWVtYmVycy4gIFRoaXMKICAgICAgICAgICBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIGxpbWl0ZWQgcGFyc2luZyBhbmQgZnVsbCB0eXBlLXN5c3RlbSBzdXBwb3J0IGZvciBwb2ludGVycyB0bwogICAgICAgICAgIG1lbWJlcnMuIE5vbmUgb2YgU1dJRydzIGxhbmd1YWdlIG1vZHVsZXMgcmVhbGx5IGtub3cgaG93IHRvIGRlYWwgd2l0aAogICAgICAgICAgIHRoaXMgc28gdGhpcyBpcyByZWFsbHkgb25seSBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzIGFuZCBmdXR1cmUKICAgICAgICAgICBleHBhbnNpb24uICBOb3RlOiBTV0lHIGRvZXMgbm90IHN1cHBvcnQgcG9pbnRlcnMgdG8gbWVtYmVycyB3aGljaCAKICAgICAgICAgICBhcmUgdGhlbXNlbHZlcyBwb2ludGVycyB0byBtZW1iZXJzLCByZWZlcmVuY2VzIHRvIHBvaW50ZXJzIHRvIG1lbWJlcnMsCiAgICAgICAgICAgb3Igb3RoZXIgY29tcGxpY2F0ZWQgZGVjbGFyYXRpb25zIGxpa2UgdGhpcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIGlzIG11Y2ggYmV0dGVyIGF0IHBhcnNpbmcgY2VydGFpbiBDKysgZGVjbGFyYXRpb25zLiBPcGVyYXRvcnMgYW5kCiAgICAgICAgICAgZnJpZW5kcyBnZW5lcmFsbHkgZG9uJ3QgY2F1c2UgYW55bW9yZSBzeW50YXggZXJyb3JzLiAgSG93ZXZlciwgbmVpdGhlcgogICAgICAgICAgIGFyZSByZWFsbHkgc3VwcG9ydGVkLgoKOC8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgKmhpZ2hseSogZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHdyYXBwaW5nIG9mIEMrKwogICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9ucy4gIFNpbmNlIEMrKyB0ZW1wbGF0ZXMgYXJlIGVzc2VudGlhbGx5CiAgICAgICAgICAgZ2xvcmlmaWVkIG1hY3JvcyBhbmQgU1dJRyBoYXMgYSBmdWxseSBvcGVyYXRpb25hbCBDIAogICAgICAgICAgIHByZXByb2Nlc3NvciB3aXRoIG1hY3JvIHN1cHBvcnQsIHRoZSBwYXJzZXIgbm93IGNvbnZlcnRzCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHRvIG1hY3Jvcy4gIEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uCiAgICAgICAgICAgdGVtcGxhdGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBUIG1heChUIGEsIFQgYik7CgogICAgICAgICAgIGlzIGludGVybmFsbHkgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAlZGVmaW5lICVfdGVtcGxhdGVfbWF4KF9fbmFtZSxUKQogICAgICAgICAgICAgICAlbmFtZShfX25hbWUpIFQgbWF4KFQgYSwgVCBiKTsKICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBUbyBpbnN0YW50aWF0ZSBhIHZlcnNpb24gb2YgdGhlIHRlbXBsYXRlLCBhIHNwZWNpYWwgJXRlbXBsYXRlIGRlY2xhcmF0aW9uCiAgICAgICAgICAgaXMgdXNlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBtYXg8aW50PjsgICAgICAgICAgCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhkb3VibGUpIG1heDxkb3VibGU+OwoKICAgICAgICAgICBUaGUgcGFyYW1ldGVyIHRvIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIG11c3QgYmUgcHJvcGVyIEMgaWRlbnRpZmllciB0aGF0J3MKICAgICAgICAgICB1c2VkIHRvIHVuaXF1ZWx5IG5hbWUgdGhlIHJlc3VsdGluZyBpbnN0YW50aWF0aW9uLiAgIFdoZW4gdXNlZCwgdGhlCiAgICAgICAgICAgdGhlIGV4cGFuZGVkIG1hY3JvIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJW5hbWUobWF4aW50KSBpbnQgbWF4KGludCBhLCBpbnQgYik7CiAgICAgICAgICAgICAgJW5hbWUobWF4ZG91YmxlKSBkb3VibGUgbWF4KGRvdWJsZSBhLCBkb3VibGUgYik7CgogICAgICAgICAgIEEgc2ltaWxhciB0ZWNobmlxdWUgaXMgdXNlZCBmb3IgdGVtcGxhdGUgY2xhc3Nlcy4gICBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgVCAqZGF0YTsKICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZlY3RvcihpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICBUICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgIEdldHMgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV92ZWN0b3IoX19uYW1lLCBUKQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8VD4gX19uYW1lOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgY2xhc3MgX19uYW1lIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgX19uYW1lKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0eXBlZGVmIF9fbmFtZSB2ZWN0b3I8VD47CiAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBBbiBhIHNwZWNpZmljIGluc3RhbnRpYXRpb24gaXMgY3JlYXRlZCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheToKCiAgICAgICAgICAgICAldGVtcGxhdGUoaW50dmVjKSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgVGhlIHJlc3VsdGluZyBjb2RlIHBhcnNlZCBieSBTV0lHIGlzIHRoZW46CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50PiBpbnR2ZWM7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBpbnR2ZWMgewogICAgICAgICAgICAgICAgICBpbnQgKmRhdGE7CiAgICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludHZlYyhpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICAgaW50ICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgaW50dmVjIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBOb3RlOiB0aGUgbGFzdCB0eXBlZGVmIGlzIG5vbi1zdGFuZGFyZCBDIGFuZCBpcyB1c2VkIGJ5IFNXSUcgdG8gcHJvdmlkZQogICAgICAgICAgIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIG5hbWUgImludHZlYyIgYW5kIHRoZSB0ZW1wbGF0ZSB0eXBlIAogICAgICAgICAgICJ2ZWN0b3I8aW50PiIuCgogICAgICAgICAgIENBVVRJT046ICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCB0aGUgZmlyc3QgdGltZSBTV0lHIGhhcwogICAgICAgICAgIHN1cHBvcnRlZCBDKysgdGVtcGxhdGVzLiAgIEVycm9yIHJlcG9ydGluZyBpcyBlc3NlbnRpYWwgbm9uLWV4aXN0ZW50LgogICAgICAgICAgIEl0IHdpbGwgcHJvYmFibHkgYnJlYWsgaW4gY2VydGFpbiBjYXNlcy4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKioKCjgvMTUvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB3cmFwcGluZyBvZiBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuICBBcnJheXMKICAgICAgICAgICBhcmUgbm93IHByb3Blcmx5IG1hcHBlZCB0byBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKICAgICAgICAgICBvbmUgbGVzcyBkaW1lbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgWzEwXTsgICAgICAgICAgICAgIC0tPiAgaW50ICoKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXTsgICAgICAgICAgLS0+ICBpbnQgKCopWzIwXTsKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXVszMF07ICAgICAgLS0+ICBpbnQgKCopWzIwXVszMF07CgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjZXJ0YWluIFNXSUcgZXh0ZW5zaW9ucyBiZWNhdXNlCiAgICAgICAgICAgb2xkZXIgdmVyc2lvbnMgc2ltcGx5IG1hcHBlZCBhbGwgYXJyYXlzIGludG8gYSBzaW5nbGUKICAgICAgICAgICBwb2ludGVyIHN1Y2ggYXMgImludCAqIi4gICBBbHRob3VnaCBwb3NzaWJseSB1bnVzdWFsLCAKICAgICAgICAgICB0aGUgbmV3IHZlcnNpb24gaXMgY29ycmVjdCBpbiB0ZXJtcyBvZiB0aGUgQyB0eXBlIHN5c3RlbS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgIAo4LzA2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogW0phdmFdIEFycmF5IHNldHRlcnMgZ2VuZXJhdGVkIGZvciBzdHJ1Y3QvY2xhc3MgYXJyYXkgbWVtYmVycy4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hbnkgaW1wcm92ZW1lbnRzIHRvIFRjbC9QZXJsL1B5dGhvbiBtb2R1bGVzIHRvIGJldHRlcgogICAgICAgICAgIHdvcmsgd2l0aCBtdWx0aXBsZSBpbnRlcmZhY2UgZmlsZXMgYW5kIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHVwIHRoZSBiZWhhdmlvciBvZiAlaW1wb3J0IGluIHRoZSBQeXRob24gbW9kdWxlLgogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIHBvbGx1dGVzIHRoZSBtb2R1bGUgbmFtZXNwYWNlIGJ5IHVzaW5nCiAgICAgICAgICAgJ2Zyb20gbW9kdWxlIGltcG9ydCAqJyB0byByZWZlciB0byB0aGUgb3RoZXIgbW9kdWxlLiAKICAgICAgICAgICBJbnN0ZWFkLCBpdCBkb2VzIGEgcHJvcGVyICdpbXBvcnQgbW9kdWxlJy4gICBBbHNvLCBTV0lHCiAgICAgICAgICAgbWF5IHdvcmsgYSBsb3QgYmV0dGVyIHdoZW4gaW1wb3J0aW5nIG1vZHVsZXMgdGhhdCBpbmNsdWRlCiAgICAgICAgICAgcmVmZXJlbmNlcyB0byBvdGhlciBpbXBvcnRlZCBtb2R1bGVzLgoKOC8xMy8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBuZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsaXppbmcgdGhvc2Ugb2YgdGhlCgkgICBHdWlsZS1zcGVjaWZpYyA1LzI3LzIwMDEgY2hhbmdlczogCgkgICAqICRkZXNjcmlwdG9yIGlzIHRoZSBzYW1lIGFzIFNXSUdUWVBFJG1hbmdsZSwgYnV0IGFsc28KCSAgICAgZW5zdXJlcyB0aGF0IHRoZSB0eXBlIGRlc2NyaXB0b3Igb2YgdGhpcyBuYW1lIGdldHMKCSAgICAgZGVmaW5lZC4KCSAgICogJCp0eXBlLCAkKmx0eXBlLCAkKm1hbmdsZSwgJCpkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBzdGFyLCBidXQgdGhleSBSRU1PVkUgb25lIGxldmVsIG9mCgkgICAgIHBvaW50ZXJzIGZyb20gdGhlIHR5cGUuIChUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHBvaW50ZXIgCgkgICAgIHR5cGVzLikKCSAgICogJCZ0eXBlLCAkJmx0eXBlLCAkJm1hbmdsZSwgJCZkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBhbXBlcnNhbmQsIGJ1dCB0aGV5IEFERCBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgdG8gdGhlIHR5cGUuCgkgICBUaGUgR3VpbGUtc3BlY2lmaWMgc3Vic3RpdHV0aW9uICRiYXNlZGVzY3JpcHRvciB3YXMgcmVtb3ZlZAoJICAgYmVjYXVzZSBpdCB3YXMgdXNlbGVzcy4KCjgvMTIvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlZXh0ZXJuIGRpcmVjdGl2ZSBpcyBub3cgZGVwcmVjYXRlZCBhbmQgd2l0aGRyYXduLiAgVGhlCiAgICAgICAgICAgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZSB3YXMgdG8gaW1wb3J0IHNlbGVjdGVkIGRlZmluaXRpb25zCiAgICAgICAgICAgZnJvbSBvdGhlciBpbnRlcmZhY2UgZmlsZXMgYW5kIGhlYWRlcnMuICBIb3dldmVyLCB0aGUgc2FtZQogICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgYmV0dGVyIGhhbmRsZWQgdGhyb3VnaCAlaW1wb3J0LiAgIFRoaXMKICAgICAgICAgICBsZWF2ZXMgU1dJRyB3aXRoIHR3byBmaWxlIGluY2x1c2lvbiBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAlaW5jbHVkZSBmaWxlbmFtZSAgICAgLSBJbnNlcnRzIGludG8gY3VycmVudCBpbnRlcmZhY2UKICAgICAgICAgICAgICAlaW1wb3J0IGZpbGVuYW1lICAgICAgLSBJbXBvcnQgdHlwZXMgYW5kIGNsYXNzZXMgZnJvbSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG1vZHVsZQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMDkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIG5ldyBzdXBwb3J0IGZvciB3cmFwcGluZyBDL0MrKyBjYWxsYmFjayBmdW5jdGlvbnMuIAogICAgICAgICAgIEEgY29tbW9uIHByb2JsZW0gd2l0aCBzb21lIEMgbGlicmFyaWVzIGlzIHRoYXQgbWFueQogICAgICAgICAgIGZ1bmN0aW9ucyB0YWtlIGEgZnVuY3Rpb24gcG9pbnRlciBhcyBhbiBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGludCBkb19vcCguLi4sIGludCAoKm9wKShpbnQsaW50KSwgLi4uKTsKCiAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgdGhlIG9ubHkgd2F5IHRvIGNhbGwgc3VjaCBhIGZ1bmN0aW9uIGlzIHRvCiAgICAgICAgICAgcGFzcyBpdCBhIGZ1bmN0aW9uIHBvaW50ZXIgb2Ygc29tZSBjb21wYXRpYmxlIHR5cGUuICBJbgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIHlvdSBoYWQgdG8gc29sdmUgdGhpcyBwcm9ibGVtCiAgICAgICAgICAgd2l0aCBzb21lIHJlYWxseSBncm9zcyBoYWNrcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYXMgYSBjYWxsYmFjaywKCiAgICAgICAgICAgICAgIGludCBmb28oaW50LCBpbnQpOwoKICAgICAgICAgICB5b3UgaGFkIHRvIGluc3RhbGwgYSBwb2ludGVyIHRvIGl0IGFzIGEgY29uc3RhbnQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gZm9vOwoKICAgICAgICAgICBvciAKCiAgICAgICAgICAgICAgIGNvbnN0IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIGlmIHlvdSBoYWQgYSByZWFsbHkgb2xkIFNXSUcgdmVyc2lvbjoKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqT1BfRlVOQykoaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBkb19vcCguLi4sIE9QX0ZVTkMsIC4uLik7CiAgICAgICAgICAgICAgIGNvbnN0IE9QX0ZVTkMgRk9PID0gZm9vOwoKICAgICAgICAgICAKICAgICAgICAgICBOb3csIHlvdSBjYW4gZG8gb25lIG9mIHR3byB0aGluZ3M6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50IGZvbyhpbnQsaW50KTsKCiAgICAgICAgICAgVGhpcyBjcmVhdGVzIGEgY29uc3RhbnQgJ2Zvbycgb2YgdHlwZSBpbnQgKCopKGludCxpbnQpLgogICAgICAgICAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CgogICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGZ1bmN0aW9ucyBhcmUgaW5zdGFsbGVkIGFzIGNvbnN0YW50cyB3aGVyZQogICAgICAgICAgIHRoZSBuYW1lIGlzIGRlZmluZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgZ2l2ZW4gdG8gJWNhbGxiYWNrKCkuCiAgICAgICAgICAgSWYgdGhlIG5hbWVzIGdlbmVyYXRlZCBieSB0aGUgZm9ybWF0IHN0cmluZyBkaWZmZXIgZnJvbSB0aGUKICAgICAgICAgICBhY3R1YWwgZnVuY3Rpb24gbmFtZSwgYm90aCBhIGZ1bmN0aW9uIHdyYXBwZXIgYW5kIGEgY2FsbGJhY2sgCiAgICAgICAgICAgY29uc3RhbnQgYXJlIGNyZWF0ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVjYWxsYmFjaygiJSh1cHBlcilzIik7CiAgICAgICAgICAgICAgIGludCBmb28oaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBiYXIoaW50LGludCk7CiAgICAgICAgICAgICAgICVub2NhbGxiYWNrOwogICAgICAgICAgIAogICAgICAgICAgIENyZWF0ZXMgdHdvIHdyYXBwZXIgZnVuY3Rpb25zICdmb28nLCAnYmFyJyBhbmQgYWRkaXRpb25hbGx5CiAgICAgICAgICAgY3JlYXRlcyB0d28gY2FsbGJhY2sgY29uc3RhbnRzICdGT08nLCAnQkFSJy4KCiAgICAgICAgICAgTm90ZTogU1dJRyBzdGlsbCBkb2VzIG5vdCBwcm92aWRlIGF1dG9tYXRpYyBzdXBwb3J0IGZvciAKICAgICAgICAgICB3cml0aW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBzdHJ1Y3QgbmVzdGluZyBmaXhlcyBhcyBwZXIgU0YgYnVnICM0NDc0ODguCgo4LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgJW5hbWUgZGlyZWN0aXZlIG5vdyBhcHBsaWVzIHRvIGNvbnN0YW50cyBjcmVhdGVkIHdpdGgKICAgICAgICAgICAjZGVmaW5lIGFuZCAlY29uc3RhbnQuICBIb3dldmVyLCBtb3N0IGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgICB3ZXJlIG5ldmVyIHdyaXR0ZW4gdG8gc3VwcG9ydCB0aGlzIGFuZCB3aWxsIGhhdmUgdG8gYmUKICAgICAgICAgICBtb2RpZmllZCB0byBtYWtlIGl0IHdvcmsuICBUY2wsIFB5dGhvbiwgYW5kIFBlcmwgbW9kdWxlcwogICAgICAgICAgIGFyZSB3b3JraW5nIG5vdy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIGNoYW5nZXMgYW5kIHNpbXBsaWZpY2F0aW9uIG9mIEMgZGVjbGFyYXRpb24gcGFyc2luZy4KICAgICAgICAgICBBbHRob3VnaCBTV0lHIGlzIHN0aWxsIG5vdCBhIGZ1bGwgQyBwYXJzZXIsIGl0cyBhYmlsaXR5CiAgICAgICAgICAgdG8gaGFuZGxlIGNvbXBsZXggZGF0YXR5cGVzIGluY2x1ZGluZyBwb2ludGVycyB0byBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gYXJyYXlzIGhhcyBiZWVuIHZhc3RseSBpbXByb3ZlZC4gIAoKOC8wMy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIERpc3RyaWJ1dGlvbiBmaXhlczogYXV0b2NvbmYgbm8gbG9uZ2VyIG5lZWRlZCB0byBpbnN0YWxsIFNXSUcuCgo4LzAyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHR3byB1bmRvY3VtZW50ZWQgcGFyc2luZyBmZWF0dXJlcy4gIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgc3VwcG9ydHMgb3V0LW9mLWNsYXNzIHN0YXRpYyBmdW5jdGlvbiBvciB2YXJpYWJsZQogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgRm9vOjpiYXI7CgogICAgICAgICAgIFRoaXMgZmVhdHVyZSBtYXkgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQgZGVtYW5kLiAKICAgICAgICAgICBIb3dldmVyLCBzaW5jZSBTV0lHIGlzIG1vc3Qgb2Z0ZW4gdXNlZCB3aXRoIGhlYWRlciBmaWxlcywKICAgICAgICAgICBpdCBpcyBtb3JlIGxpa2VseSBmb3IgdGhlc2UgZGVmaW5pdGlvbnMgdG8gYmUgaW5jbHVkZWQKICAgICAgICAgICBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMDIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIENsZWFudXAgb2YgdGhlIEdJRlBsb3QgZXhhbXBsZXMuIFVwZ3JhZGVkIEphdmEgR0lGUGxvdCBleGFtcGxlLgoKOC8wMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEVmZmljaWVuY3kgY2hhbmdlczogX2NQdHIgdXNlZCB3aGVyZSBwb3NzaWJsZSByYXRoZXIgdGhhbgoJICAgICBnZXRDUHRyKCkuIEJ1ZyBmaXhlcyBmb3IgaW5oZXJpdGFuY2UgLSBkZXJpdmVkIGNsYXNzIHNvbWV0aW1lcwoJICAgICBkaWRuJ3QgZGVsZXRlIHRoZSBjIG1lbW9yeSB3aGVuIF9kZWxldGUoKSB3YXMgY2FsbGVkLgoJICAgKiBbSmF2YV0gQWJzdHJhY3QgYysrIGNsYXNzZXMgYXJlIHdyYXBwZWQgd2l0aCBhIGphdmEgYWJzdHJhY3Qgc2hhZG93CgkgICAgIGNsYXNzLiBBbHNvIGEgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGlzIG1hcHBlZCB3aXRoIGFuIGFic3RyYWN0IG1ldGhvZC4KCSAgICogVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgaGFzIGFsd2F5cyBiZWVuIDxtb2R1bGU+X3dyYXAuYy4gSXQgaXMgbm93CgkgICAgIDxtb2R1bGU+X3dyYXAuY3h4IGlmIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbiBpcyBwYXNzZWQgdG8gc3dpZy4KCSAgICAgVGhpcyBoYXMgYmVlbiBkb25lIGFzIG90aGVyd2lzZSBjKysgY29kZSB3b3VsZCBhcHBlYXIgaW4gYSBjIGZpbGUuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAoKNy8zMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlICVjb25zdGFudCBkaXJlY3RpdmUgdG8gYmUgbW9yZSBDLWxpa2UgaW4gc3ludGF4LgogICAgICAgICAgIFRoZSBzeW50YXggaXMgbm93OgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBOQU1FID0gVkFMVUU7CiAgICAgICAgICAgICAgICAlY29uc3RhbnQgVFlQRSBOQU1FID0gVkFMVUU7CiAKICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlY29uc3RhbnQgRm9vICpCYXIgPSAmU3BhbTsKCiAgICAgICAgICAgQSBtb3JlIHN1YnRsZSBjYXNlIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50ICgqRk9PKShpbnQsaW50KSA9IGJsYWg7CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgTW9kdWxlcyB0aGF0IHdlcmUgdXNpbmcKICAgICAgICAgICB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSBkaXJlY3RseSB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQuCiAgICAgIAo3LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIG9ic2N1cmUgYW5kIHVuZG9jdW1lbnRlZCBmb3JtIG9mIHRoZSAlaW5saW5lIGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICVpbmxpbmUgaW50IGJsYWgoaW50IGEsIGludCBiKSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAKICAgICAgICAgICAobm90ZTogdGhpcyBmZWF0dXJlIHdhcyBuZXZlciBkb2N1bWVudGVkIGFuZCBpcyB3aXRoZHJhd24pCgo3LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIGZ1bmN0aW9ucyB3aXRoIG5vIGV4cGxpY2l0bHkgZGVjbGFyZWQKICAgICAgICAgICByZXR1cm4gdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgZm9vKGludCk7CgogICAgICAgICAgIEluIEMsIHN1Y2ggZnVuY3Rpb25zIHdlcmUgaW1wbGljaXRseSBhc3N1bWVkIHRvIHJldHVybiBhbiAnaW50Jy4KICAgICAgICAgICBJbiBDKyssIHRoaXMgaXMgaWxsZWdhbC4gIEVpdGhlciB3YXksIGl0J3MgY29uc2lkZXJlZCBiYWQKICAgICAgICAgICBzdHlsZS4gIFJlbW92aW5nIHN1cHBvcnQgZm9yIHRoaXMgaW4gU1dJRyB3aWxsIHNpbXBsaWZ5CiAgICAgICAgICAgY2VydGFpbiBpc3N1ZXMgaW4gcGFyc2luZy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMzAvMjAwMTogbWtvZXBwZQoJICAgKiBQYXJ0aWFsIG1lcmdlIGZyb20gdGhlIENWUyB0cnVuay4gIFRoZSBTb3VyY2UvRE9IIGRpcmVjdG9yeQoJICAgICBhbmQgbW9zdCBvZiB0aGUgU291cmNlL1N3aWcgZGlyZWN0b3J5IGlzIHVwLXRvLWRhdGUgbm93LgoJICAgKiBbR3VpbGVdICVzY2hlbWUgaXMgbm93IGEgbWFjcm8gZm9yICVpbnNlcnQoInNjaGVtZSIpLiAgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICJGSUxFTkFNRSI7IAoJICAgICBOZXcgc3ludGF4OiAgJXNjaGVtZSAleyBTQ0hFTUUtQ09ERSAlfQoJICAgICBOZXcgbWFjcm9zICVtdWx0aXBsZV92YWx1ZXMsICV2YWx1ZXNfYXNfbGlzdCwKCSAgICAgJXZhbHVlc19hc192ZWN0b3IuIAoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGhhdmUgYmVlbiB0dXJuZWQgaW50byBTV0lHIHByYWdtYXMuCiAgICAgICAgICAgJXByYWdtYShzd2lnKSByZWFkb25seSBhbmQgJXByYWdtYShzd2lnKSByZWFkd3JpdGUuICBNYWNyb3MKICAgICAgICAgICBhcmUgdXNlZCB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcHJhZ21hIGRpcmVjdGl2ZS4gICVwcmFnbWEgbXVzdCBhbHdheXMKICAgICAgICAgICBiZSBkaXJlY3RlZCB0byBhIHNwZWNpZmljIGxhbmd1YWdlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVwcmFnbWEoc3dpZykgbWFrZV9kZWZhdWx0OwogICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGluY2x1ZGUgPSAiYmxhaC5pIjsKCiAgICAgICAgICAgQWxzbyBleHRlbmRlZCB0aGUgcHJhZ21hIGRpcmVjdGl2ZSB0byBhbGxvdyBjb2RlIGJsb2NrcwogCiAgICAgICAgICAgICAgJXByYWdtYShmb28pIGNvZGUgPSAlewogICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHRoZSB3YXkgJ2NvbnN0JyB2YXJpYWJsZXMgYXJlIHdyYXBwZWQuICBJbiAKICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBhICdjb25zdCcgdmFyaWFibGUgd2FzCiAgICAgICAgICAgd3JhcHBlZCBhcyBhIGNvbnN0YW50LiAgIE5vdywgJ2NvbnN0JyB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgd3JhcHBlZCBhcyByZWFkLW9ubHkgdmFyaWFibGVzLiAgVGhlcmUgYXJlIHNldmVyYWwKICAgICAgICAgICByZWFzb25zIGZvciBtYWtpbmcgdGhpcyBjaGFuZ2UsIG1vc3RseSBwZXJ0YWluaW5nIHRvCiAgICAgICAgICAgc3VidGxlIGRldGFpbHMgb2YgaG93ICdjb25zdCcgYWN0dWFsbHkgd29ya3MuIAoKICAgICAgICAgICBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgb2xkIGludGVyZmFjZXMgdGhhdCB1c2VkICdjb25zdCcKICAgICAgICAgICB0byBjcmVhdGUgY29uc3RhbnRzLiAgIEFzIGEgcmVwbGFjZW1lbnQsIGNvbnNpZGVyIHVzaW5nIHRoaXM6CgogICAgICAgICAgIGNvbnN0IGludCBhID0gNDsgICA9PT0+ICAgJWNvbnN0YW50IGludCBhID0gNDsKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlb3JnYW5pemF0aW9uIGFuZCBzaW1wbGlmaWNhdGlvbiBvZiB0eXBlIHBhcnNpbmcuCiAgICAgICAgICAgVHlwZXMgd2l0aCAnY29uc3QnIHNob3VsZCB3b3JrIGNvcnJlY3RseSBub3cuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb3N0IHN3aWcgZGlyZWN0aXZlcyByZWxhdGVkIHRvIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQogICAgICAgICAgIGFyZSBub3cgZGVwcmVjYXRlZC4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgT2JqZWN0aXZlLUMgaW4gb3JkZXIgdG8gc2ltcGxpZnkKICAgICAgICAgICBwYXJzZXIgcmVjb25zdHJ1Y3Rpb24uICBXaWxsIHJldHVybiBpZiB0aGVyZSBpcyBzdWZmaWNpZW50CiAgICAgICAgICAgZGVtYW5kLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ29kZSBpbmNsdXNpb24gaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIHBhcnNlci4gIEEgY29tbW9uCiAgICAgICAgICAgZGlyZWN0aXZlICVpbnNlcnQgaXMgbm93IHVzZWQgZm9yIGV2ZXJ5dGhpbmcuICBUaGlzCiAgICAgICAgICAgaW5zZXJ0cyBhIGZpbGUgaW50byB0aGUgb3V0cHV0OgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICJmb28uc3dnIgoKICAgICAgICAgICBUaGlzIGluc2VydHMgc29tZSBpbmxpbmUgY29kZSBpbnRvIHRoZSBvdXRwdXQKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVyKSAlewogICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4gCiAgICAgICAgICAgICAgICV9CgogICAgICAgICAgIFRoZXJlIGFyZSBmaXZlIHByZWRlZmluZWQgdGFyZ2V0cyBmb3IgdGhlIGluc2VydCBkaXJlY3RpdmU6CgogICAgICAgICAgICAgICAiaGVhZGVyIiAgICAtIEhlYWRlciBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAicnVudGltZSIgICAtIFJ1bnRpbWUgc2VjdGlvbiBvZiB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgICAgIndyYXBwZXIiICAgLSBXcmFwcGVyIHNlY3Rpb24KICAgICAgICAgICAgICAgImluaXQiICAgICAgLSBJbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICAgICAgICAgICAgICAibnVsbCIgICAgICAtIE5vdGhpbmcuIERpc2NhcmQuCgogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBhcmUgc3RpbGwgc3VwcG9ydGVkLCBidXQgYXJlCiAgICAgICAgICAgbm93IGRlZmluZWQgaW4gdGVybXMgb2YgbWFjcm9zOgoKICAgICAgICAgICAgICAgJXsgLi4uICV9ICAgICAgICAgICAtPiAlaW5zZXJ0KGhlYWRlcikgICV7IC4uLiAlfQogICAgICAgICAgICAgICAlaW5pdCAleyAuLi4gJX0gICAgIC0+ICVpbnNlcnQoaW5pdCkgICAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICV3cmFwcGVyICV7IC4uLiAlfSAgLT4gJWluc2VydCh3cmFwcGVyKSAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXJ1bnRpbWUgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHJ1bnRpbWUpICV7IC4uLiAlfQoKICAgICAgICAgICBMYW5ndWFnZSBtb2R1bGVzIGNhbiBkZWZpbmUgbmV3IG5hbWVkIHRhcmdldHMgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgQyBBUEkgZnVuY3Rpb24gU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCkgKHNlZSBtYWluLmN4eCkuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gZXhwb3NlIGEgc2hhZG93IGNsYXNzIGZpbGUsCiAgICAgICAgICAgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgIFN3aWdfcmVnaXN0ZXJfZmlsZWJ5bmFtZSgic2hhZG93IiwgZl9zaGFkb3cpOwoKICAgICAgICAgICBUaGVuIGluIHRoZSBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICAgJWluc2VydChzaGFkb3cpICV7IC4uLiAlfQoKICAgICAgICAgICBOb3RlOiB0aGlzIGNoYW5nZSBzaG91bGQgbm90IGFmZmVjdCBhbnkgb2xkIGludGVyZmFjZXMsIGJ1dAogICAgICAgICAgIGRvZXMgb3BlbiB1cCBuZXcgcG9zc2liaWxpdGllcyBmb3IgZW5oYW5jZW1lbnRzLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgYWx3YXlzIGluY2x1ZGVzIGEgc3RhbmRhcmQgbGlicmFyeSBmaWxlICdzd2lnLnN3ZycuCiAgICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYSBsYXJnZSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMKICAgICAgICAgICB0aGF0IGRlZmluZSB0aGUgYmVoYXZpb3Igb2YgdmFyaW91cyBTV0lHIGRpcmVjdGl2ZXMuCiAgICAgICAgICAgUHJldmlvdXNseSwgYWxsIFNXSUcgZGlyZWN0aXZlcyB3ZXJlIGhhbmRsZWQgYXMgc3BlY2lhbAogICAgICAgICAgIGNhc2VzIGluIHRoZSBwYXJzZXIuICBUaGlzIG1hZGUgdGhlIHBhcnNlciBhIGxhcmdlIAogICAgICAgICAgIGJsb2F0ZWQgbWVzcy4gIE5vdywgdGhlIHBhcnNlciBpcyBzdHJpcHBlZCBkb3duIHRvIGEgZmV3CiAgICAgICAgICAgc2ltcGxlIGRpcmVjdGl2ZXMgYW5kIG1hY3JvcyBhcmUgdXNlZCB0byBoYW5kbGUgZXZlcnl0aGluZyBlbHNlLgoKNy8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogRml4ZXMgZm9yIFNvdXJjZWZvcmdlIGJ1ZyAjNDQ0NzQ4IC0gbmV3IHRlc3RjYXNlIGNwcF9zdGF0aWM6CgkgICAgIFtUQ0xdIENsYXNzIHdpdGgganVzdCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlL2Z1bmN0aW9uIGZpeAoJICAgICBbSmF2YV0gRml4ZWQgc3RhdGljIHZhcmlhYmxlcyBzdXBwb3J0CgkgICAgIFtSdWJ5XSBTdGF0aWMgdmFyaWFibGVzIHdvcmthcm91bmQgcmVtb3ZlZAoKNy8yNy8yMDAxOiBta29lcHBlCgkgICAqIHN0eXBlLmMgKFN3aWdUeXBlX2RlZmF1bHQpOiBTdHJpcCBxdWFsaWZpZXJzIGZpcnN0LiBUaGUKCSAgICAgZGVmYXVsdCB0eXBlIG9mICJpbnQgKiBjb25zdCIgaXMgbm93ICJTV0lHUE9JTlRFUiAqIi4KCSAgICogbWFpbi5jeHg6IERlZmluZSAiX19jcGx1c3BsdXMiIGluIFNXSUcncyBwcmVwcm9jZXNzb3IgaWYKCSAgICAgaW4gQysrIG1vZGUuCgkgICAqIFtHdWlsZV06IEFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgYXJyYXlzIGFuZCBDKysKCSAgICAgcmVmZXJlbmNlcywgZml4aW5nIHRoZSAiY29uc3RhbnRfcG9pbnRlcnMiIHRlc3QgY2FzZS4KCSAgICogTW92ZWQgbW9zdCB0ZXN0cyBmcm9tIHRoZSBvbGQgR3VpbGUtc3BlY2lmaWMgdGVzdC1zdWl0ZQoJICAgICB0byB0aGUgbmV3IHRlc3Qtc3VpdGUuICBBbHNvIG1vdmVkIHBlcmw1L3BvaW50ZXItY3h4CgkgICAgIGV4YW1wbGUgdGhlcmUuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBUZXN0LXN1aXRlIGFkZGVkLgoJICAgKiBJbml0aWFsIHRlc3RjYXNlczogY29uc3RhbnRfcG9pbnRlcnMgY3BwX2VudW0gZGVmaW5lcwoJICAgICBzaXplb2ZfcG9pbnRlcnMgdW5pb25zIHZpcnR1YWxfZGVzdHJ1Y3RvcgoJICAgKiBNYWtlIGNsZWFuIGltcHJvdmVtZW50cy4KCjcvMjQvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBVbmRlcnNjb3JlcyBpbiB0aGUgcGFja2FnZSBuYW1lIGFuZC9vciBtb2R1bGUgbmFtZQoJICAgbm8gbG9uZ2VyIGdpdmUgbGlua2luZyBwcm9ibGVtcy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIE1vcmUgcGFyc2VyIGJ1ZyBmaXhlcyBmb3IgY29uc3RhbnQgcG9pbnRlcnMKCjcvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdIEFlc3RoZXRpYyBpbXByb3ZlbWVudCBpbiB2YXJpYWJsZSB3cmFwcGVycy4KCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgY29yZS1kdW1wIHByb2JsZW0gaW4gcG9pbnRlciBsaWJyYXJ5IHdoZW4gCiAgICAgICAgICAgICBmcmVlaW5nIGNoYXJhY3RlciBhcnJheXMuCiAgICAgICAgICAgICBTRiBCdWcgWyAjNDE1ODM3IF0gcG9pbnRlciBsaWIgY29yZSBkdW1wCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGRlc3RydWN0b3JzIGFuZCBzaGFkb3cKICAgICAgICAgICAgIGNsYXNzZXMuICBTRiBidWcgIzIyMTEyOC4KCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogVG8gcHJvdmlkZSBiZXR0ZXIgbGluZS1udW1iZXIgdHJhY2tpbmcgaW4gaW50ZXJmYWNlcwogICAgICAgICAgICAgd2l0aCBsb3RzIG9mIG1hY3Jvcywgc3BlY2lhbCBsb2NhdG9yIGNvbW1lbnRzIGFyZQogICAgICAgICAgICAgbm93IGdlbmVyYXRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgLypAZm9vLmksNDIsQkxBSEAqL2V4cGFuZGVkIG1hY3JvLypAQCovCgogICAgICAgICAgICAgVGhlIGZpcnN0IC8qQC4uLkAqLyBzZXF1ZW5jZSBzZXRzIHRoZSBjb250ZXh0CiAgICAgICAgICAgICB0byBwb2ludCB0byB0aGUgbWFjcm8gY29kZS4gIFRoZSAvKkBAKi8gY29tbWVudAogICAgICAgICAgICAgdGVybWluYXRlcyB0aGUgY29udGV4dC4gIFRoZSBTV0lHIHBhcnNlciBzaG91bGQKICAgICAgICAgICAgIGlnbm9yZSBhbGwgb2YgdGhlIGxvY2F0b3IgY29tbWVudHMgYXMgc2hvdWxkCiAgICAgICAgICAgICB0aGUgQyBjb21waWxlciAoc2hvdWxkIHN1Y2ggY29tbWVudHMgZW5kIHVwCiAgICAgICAgICAgICBpbiBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlKS4KCjcvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBUaGUgcGFyc2VyIG5vdyBoYW5kbGVzIHNldmVyZWx5IGNvbnN0aWZpZWQgdHlwZXMgaW4KCSAgIHR5cGVtYXBzLiAgVGhpcyBpbnRyb2R1Y2VkIGEgbmV3IHNoaWZ0L3JlZHVjZSBjb25mbGljdCwgYnV0CgkgICBvbmx5IHdpdGggYSBoZXVyaXN0aWMgZnVuY3Rpb24tcG9pbnRlciBjYXRjaC1hbGwgcnVsZS4gIAoJICAgKiBbR3VpbGVdOiBBZGRlZCB0eXBlbWFwcyBmb3Igc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcy4gCgkgICAqIEZpeGVkIHRoZSAidGVtcGxhdGUtd2hpdGVzcGFjZSIgcHJvYmxlbSBieSBjYW5vbmljYWxpemluZwoJICAgICB3aGl0ZXNwYWNlLCBlc3BlY2lhbGx5IGFyb3VuZCBhbmdsZSBicmFja2V0cyBhbmQgY29tbWFzLiAKCjcvMTcvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBBIFNjaGVtZSBmaWxlIGlzIGVtaXR0ZWQgaWYgdGhlIC1zY21zdHViIEZJTEUuU0NNCgkgICBjb21tYW5kLWxpbmUgb3B0aW9uIGlzIHVzZWQuICBUaGUgJXNjaGVtZSBkaXJlY3RpdmUKCSAgIChpbXBsZW1lbnRlZCBhcyBhIG1hY3JvIGZvciBhIHByYWdtYSkgYWxsb3dzIHRvIGluc2VydAoJICAgYXJiaXRyYXJ5IGNvZGUgaGVyZS4gIEluICJzaW1wbGUiIGFuZCAicGFzc2l2ZSIgbGlua2FnZSwKCSAgIHRoZSBmaWxlIGdldHMgZmlsbGVkIHdpdGggZGVmaW5lLW1vZHVsZSBhbmQgZXhwb3J0CgkgICBkZWNsYXJhdGlvbnMuCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBQYXJzZXIgYnVnIGZpeCB0byBzdXBwb3J0IGNvbnN0YW50IHBvaW50ZXJzLCBlZyBpbnQqIGNvbnN0IHB0ci4KCSAgIEZpeGVkIGV2ZXJ5d2hlcmUgLSB2YXJpYWJsZXMsIHBhcmFtZXRlcnMsIHJldHVybiB0eXBlcyBldGMuIE5vdGUgdGhhdAoJICAgd2hlbiB3cmFwcGluZyBhIGNvbnN0YW50IHBvaW50ZXIgdmFyaWFibGUgb25seSB0aGUgZ2V0dGVyIGlzIGdlbmVyYXRlZC4KCjcvMTcvMjAwMTogbWtvZXBwZQoJICAgKiBGaXhlZCBTRiBidWcgIzQ0MTQ3MCAoI2RlZmluZSBYICIvLyIgd291bGQgbm90IGJlIHBhcnNlZCwKCSAgICAgc2VlIHRlc3Qtc3VpdGUgZW50cnkgInByZXByb2MtMSIpLCByZXBvcnRlZCBieSBULiBXLiBCdXJ0b24KCSAgICAgPHR3YnVydG9uQHVzZXJzLnNmLm5ldD4uCgkgICAqIENoYW5nZWQgdGhlIHR5cGUgb2YgY2hhcmFjdGVyIGNvbnN0YW50cyB0byAiY2hhciIsIHJhdGhlcgoJICAgICB0aGFuICJjaGFyICoiLiAgQ2hhbmdlZCB0aGUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzCgkgICAgIHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXIsIGV4Y2VwdCBmb3IgdGhlIEd1aWxlIG1vZHVsZSwKCSAgICAgd2hlcmUgaXQgaXMgZGVzaXJlZCB0byBtYWtlIHRoZW0gU2NoZW1lIGNoYXJhY3RlcnMuICBUaGlzCgkgICAgIGZpeGVzIFNGIGJ1ZyAjMjMxNDA5LCB0ZXN0LXN1aXRlIGVudHJ5ICJjaGFyLWNvbnN0YW50Ii4KCSAgICogQXBwbGllZCBwYXRjaCBmb3IgRE9IL0RvaC9tZW1vcnkuYyBieSBMZXMgU2NoYWZmZXIKCSAgICAgPHNjaGFmZmVyQG9wdG9ubGluZS5uZXQ+IChhdm9pZCByZXF1aXJlZCBzaWRlIGVmZmVjdHMgaW4KCSAgICAgYXNzZXJ0KS4gCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBCdWcgZml4IGluIHBhcnNlciBmb3IgdmlydHVhbCBkZXN0cnVjdG9yIHdpdGggdm9pZCBhcyBwYXJhbWV0ZXIKCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgI2RlZmluZXMgZW1iZWRkZWQgd2l0aGluIGNsYXNzZXMvc3RydWN0cy91bmlvbnMKCSAgIENvbnNlcXVlbnRseSAlY29uc3RhbnQgY2FuIG5vdyBhbHNvIGJlIHBsYWNlZCB3aXRoaW4gYSBzdHJ1Y3QvY2xhc3MvdW5pb24uCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIHRvIGFsbG93IHNpemVvZigqSV9hbV9hX3BvaW50ZXIpIHdpdGhpbiBhICNkZWZpbmUKCjcvMTYvMjAwMTogbWtvZXBwZQoJICAgKiBBZGRlZCBjaGFuZ2VzIGZvciB0aGUgTWFjaW50b3NoIGNvbnRyaWJ1dGVkIGJ5IEx1aWdpCgkgICBCYWxsYWJpbyA8YmFsbGFiaW9AbWFjLmNvbT4uIAoJICAgKiBTb21lICJjb25zdCIgZml4ZXMgaW4gdGhlIGNvZGUuCgkgICAqIFtHdWlsZV06IE1hZGUgdGhlIGNvbnN0YW50LXdyYXBwZXIgZnVuY3Rpb25zIG11Y2ggc2hvcnRlci4KCjcvMTMvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBTb21lICJjb25zdCIgZml4ZXMgZm9yIEd1aWxlIHZlcnNpb24gMS4zLjQuCgkgICAqIEhhbmRsZSBhbm9ueW1vdXMgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kIHN0YXRpYwoJICAgICBhcnJheSBtZW1iZXJzIG9mIGNsYXNzZXMuICBCb3RoIGJ1Z3MgcmVwb3J0ZWQgYnkgQW5uYWxpc2EgVGVycmFjaW5hCgkgICAgIDxhbm5hbGlzYS50ZXJyYWNpbmFAZGF0YW1hdC5pdD47IHNlZSB0aGUgZmlsZXMKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9zdGF0aWMtYXJyYXktbWVtYmVyLmkgYW5kCgkgICAgIGFub255bW91cy1hcmcuaS4KClZlcnNpb24gMS4zLjYgIChKdWx5IDksIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo3LzA5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBHSUZQbG90IGV4YW1wbGVzOiBGT1JFR1JPVU5EIGFuZCBCQUNLR1JPVU5EIGRlZmluaXRpb24gbWlzc2luZyAKCSAgIGFmdGVyIFRSQU5TUEFSRU5UICNkZWZpbmUgZml4IGluIEdJRlBsb3QKCjcvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHVwIHRoZSB2ZXJzaW9uIG51bWJlcnMgc28gdGhhdCB0aGUgcmVsZWFzZSBpcyBrbm93bgogICAgICAgICAgIGFzIDEuMy42LiAgQWxsIGZ1dHVyZSByZWxlYXNlcyBzaG91bGQgaGF2ZSBhIHNpbWlsYXIKICAgICAgICAgICB2ZXJzaW9uIGZvcm1hdC4KCjcvMDIvMjAwMTogbWtvZXBwZQoJICAgKiBbUHl0aG9uXTogUHJldmVudCB0aGUgcHJvYmxlbSBvZiBzZWxmLnRoaXNvd24gbm90IGJlaW5nCgkgICBkZWZpbmVkIGlmIHRoZSBDKysgY2xhc3MgY29uc3RydWN0b3IgcmFpc2VkIGFuIGV4Y2VwdGlvbi4KCSAgIFRoYW5rcyB0byBMdWlnaSBCYWxsYWJpbyA8YmFsbGFiaW9AbWFjLmNvbT4uCgo2LzI5LzIwMDE6IG1rb2VwcGUKCSAgICogTW9yZSBwb3J0YWJpbGl0eSBmaXhlczsgZml4ZWQgImdjYyAtV2FsbCIgd2FybmluZ3MuCgo2LzI5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBHSUZQbG90IGV4YW1wbGVzOiBUUkFOU1BBUkVOVCAjZGVmaW5lIG11bHRpcGxlIHRpbWVzIG9uIFNvbGFyaXMgCgkgICAoY2xhc2hlcyB3aXRoIHN0cmVhbS5oKS4KCSAgICogTXVsdGlwbGUgZGVmaW5pdGlvbiBidWcgZml4IGZvciBzaGFkb3cgY2xhc3Nlcy4gVGhlIHBlcmwgYW5kIHB5dGhvbiAKCSAgIG1vZHVsZXMgaGFkIHdvcmthcm91bmRzIHdoaWNoIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGZpeGVzIGluIAoJICAgdGhlIGNvcmUuIE1hbnkgb2YgdGhlIExhbmd1YWdlOjpjcHBfeHh4eCBmdW5jdGlvbnMgbm93IHNldCBhIAoJICAgZmxhZyB3aGljaCB0aGUgZGVyaXZlZCBjbGFzc2VzIGNhbiBhY2Nlc3MgdGhyb3VnaCAKCSAgIGlzX211bHRpcGxlX2RlZmluaXRpb24oKSB0byBzZWUgd2hldGhlciBvciBub3QgY29kZSBzaG91bGQgYmUgCgkgICBnZW5lcmF0ZWQuICBUaGUgY29kZSBiZWxvdyB3b3VsZCBoYXZlIHByb2R1Y2VkIHZhcnlpbmcgZGVncmVlcyAKCSAgIG9mIGluY29ycmVjdCBzaGFkb3cgY2xhc3MgY29kZSBmb3IgdGhlIHZhcmlvdXMgbW9kdWxlczoKCSAgIGNsYXNzIFRlc3RDbGFzcwoJICAgewoJICAgcHVibGljOgoJICAgICBUZXN0Q2xhc3MoKSB7fTsKCSAgICAgVGVzdENsYXNzKGludCBhKSB7fTsKCSAgICAgflRlc3RDbGFzcygpIHt9OwoJICAgICB1bnNpZ25lZCBsb25nIHh5eihzaG9ydCBrKSB7fTsKCSAgICAgdW5zaWduZWQgbG9uZyB4eXooaW50IG4pIHt9OwoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYygpIHt9OwoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYyhpbnQgYSkge307CgkgICB9OwoJICAgdm9pZCBkZWxldGVfVGVzdENsYXNzKGludCBhKTsKCjYvMjcvMjAwMTogbWtvZXBwZQoJICAgKiBbUGVybF0gQW5vdGhlciBjb25zdC1yZWxhdGVkIHBvcnRhYmlsaXR5IGZpeC4KCjYvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBBZGRlZCBpbiBjcHBfcHJhZ21hKCkgc3VwcG9ydCB3aXRoIGEgaG9zdCBvZiBuZXcgcHJhZ21hcyAtIHNlZSAKCSAgIGpzd2lnLmh0bWwuIFRoZXNlIGFyZSBkZXNpZ25lZCBmb3IgYmV0dGVyIG1peGluZyBvZiBKYXZhIGFuZCBjKysuIEl0IAoJICAgZW5hYmxlcyB0aGUgdXNlciB0byBzcGVjaWZ5IHB1cmUgSmF2YSBjbGFzc2VzIGFzIGJhc2VzIGFuZC9vciBpbnRlcmZhY2VzIAoJICAgZm9yIHRoZSB3cmFwcGVkIGMvYysrLgoJICAgKiBbSmF2YV0gT2xkIHByYWdtYXMgcmVuYW1lZC4gV2FybmluZyBnaXZlbiBmb3IgdGhlIG1vbWVudCBpZiB1c2VkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKNi8yNS8yMDAxOiBta29lcHBlCgkgICAqIEluY29ycG9yYXRlZCBtb3JlIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiBmb3Igc3dpZy9ydWJ5IG9uIGN5Z3dpbi4KCjYvMjAvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIE1ha2VmaWxlIG1vZHMgc28gdGhhdCAnbWFrZSBjaGVjaycgdXNlcyB0aGUgc3dpZyBvcHRpb25zIGluIHRoZSBtYWtlZmlsZXMKCSAgICogW0phdmFdIFJlbW92ZWQgR2VuZXJhdGluZyB3cmFwcGVycyBtZXNzYWdlCgkgICAqIFtKYXZhXSBOVUxMIHBvaW50ZXIgYnVnIGZpeAoJICAgKiBbSmF2YV0gQnVnIGZpeCBmb3IgS2FmZmUgSlZNCgo2LzIwLzIwMDE6IG1rb2VwcGUKCSAgICogU1dJR19UeXBlUXVlcnkgZnJvbSBjb21tb24uc3dnIG5vdyByZXR1cm5zIGEKCSAgIHN3aWdfdHlwZV9pbmZvKiByYXRoZXIgdGhhbiBhIHZvaWQqLiAgVGhpcyBmaXhlcyBhIHByb2JsZW0KCSAgIHdoZW4gdXNpbmcgcG9pbnRlci5pIGFuZCBDKyssIGFzIGlsbHVzdHJhdGVkIGJ5IHRoZSBuZXcKCSAgIHRlc3Qtc3VpdGUgZXhhbXBsZSBwZXJsNS9wb2ludGVyLWN4eC4KCSAgICogUG9ydGFiaWxpdHkgZml4ZXMgKGNvbnN0IGNoYXIgKikuIAoJICAgKiBJbmNvcnBvcmF0ZWQgYnVpbGQgY2hhbmdlcyBjb250cmlidXRlZCBieSBXeXNzIENsZW1lbnMKCSAgIDxXWVNAaGVsYmxpbmcuY2g+LCB3aGljaCBtYWtlIHN3aWcgcnVubmFibGUgb24gY3lnd2luLgoKNi8xOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIFNGIGJ1ZyAjMjExMTQ0LiBUaGlzIGZpeCBpcyBhIHdvcmthcm91bmQgCgkgICAgIHVudGlsIGZpeGVkIGluIHRoZSBjb3JlLgoKNi8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFBvcnRhYmlsaXR5IGZpeGVzIGZvciB1c2Ugd2l0aCB0aGUgU3VuIEZvcnRlCgkgICBjb21waWxlcnMuIAoJICAgKiBbVGNsXTogUG9ydGFiaWxpdHkgZml4IChjb25zdCBjaGFyICopLgoJICAgKiBbVGNsXTogQ29uZmlndXJlIG5vdyBmaXJzdCB0cmllcyB0byBmaW5kIGEgdGNsQ29uZmlnLnNoCgkgICBmaWxlIGluIG9yZGVyIHRvIGZpbmQgdGhlIFRjbCBpbmNsdWRlIGRpcmVjdG9yeSwgbGlicmFyeQoJICAgbG9jYXRpb24gYW5kIGxpYnJhcnkgbmFtZS4KCSAgICogW1B5dGhvbl06IEFkZGVkIGEgZmV3IHBvc3NpYmxlIGxpYnJhcnkgbG9jYXRpb25zLgoKNi8xOC8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IERvbid0IGNhbGwgc2NtX2NfZXhwb3J0IGlmIG5vdGhpbmcgaXMgdG8gYmUKCSAgICAgZXhwb3J0ZWQuICBEb24ndCB3YXJuIG9uICVtb2R1bGUgaWYgbW9kdWxlIGhhcyBiZWVuIHNldAoJICAgICBhbHJlYWR5ICh0aGlzIGZyZXF1ZW50bHkgb2NjdXJzIHdoZW4gJWltcG9ydCBpcyB1c2VkKS4KCjYvMTYvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBOZXcgInBhc3NpdmUiIGxpbmthZ2UsIHdoaWNoIGlzIGFwcHJvcHJpYXRlIGZvcgoJICAgICBtdWx0aS1tb2R1bGUgZXh0ZW5zaW9ucyB3aXRob3V0IEd1aWxlIG1vZHVsZSBtYWdpYy4KCjYvMTUvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBGaXhlZCBwcmludGluZyBvZiBzbW9icyAoc3BhY2UgYW5kIGFuZ2xlIHdlcmUKCSAgICAgbWlzc2luZykuIAoJICAgKiBQcm9wZXJseSBnZW5lcmF0ZSB0eXBlIGluZm9ybWF0aW9uIGZvciBiYXNlIGNsYXNzZXMKCSAgICAgaW1wb3J0ZWQgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuICBUaGFua3MgdG8gTWFyY2VsbwoJICAgICBNYXR1cyA8bW1hdHVzQGFjbXMuYXJpem9uYS5lZHU+IGZvciB0aGUgcmVwb3J0IGFuZCB0aGUKCSAgICAgcGF0Y2g7IHRoaXMgY2xvc2VzIFNGIGJ1ZyAjMjMxNjE5OyBzZWUgYWxzbwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL2ltcG9ydCouIAoJICAgKiBbR3VpbGVdOiBGaXggY2FzdGluZyBiZXR3ZWVuIGNsYXNzIGFuZCBiYXNlIGNsYXNzOyB0aGUKCSAgICAgcnVudGltZSB0eXBlIHN5c3RlbSBoYWQgaXQgdGhlIHdyb25nIHdheSBhcm91bmQ7IHNlZQoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL2Nhc3RzLmkKCSAgICogTWFrZSB0eXBlbWFwcyBmb3IgU1dJR1BPSU5URVIgKiB3aXRoIGFyZyBuYW1lIHRha2UKCSAgICAgcHJlY2VkZW5jZSBvdmVyIHRob3NlIHdpdGhvdXQgYXJnIG5hbWUsIHRvIG1hdGNoIG5vcm1hbAoJICAgICB0eXBlbWFwIHByZWNlZGVuY2UgcnVsZXMuCgkgICAqIEZpeGVkIHRoZSByYW5kb20tbGluZS1udW1iZXJzIHByb2JsZW0gcmVwb3J0ZWQgYXMgU0YgYnVnCgkgICAgICMyMTczMTA7IHRoYW5rcyB0byBNaWNoYWVsIFNjaGFyZiA8c2NoYXJmQHVzZXJzLnNmLm5ldD4uCgkgICAqIFtHdWlsZV06IEhhbmRsZSB0aGUgJW5hbWUgYW5kICVyZW5hbWUgZGlyZWN0aXZlcy4KCSAgICogTmV3IHN5bnRheDogJW5hbWUgYW5kICVyZW5hbWUgbm93IG9wdGlvbmFsbHkgdGFrZSBkb3VibGUKCSAgICAgcXVvdGVzIGFyb3VuZCB0aGUgc2NyaXB0aW5nIG5hbWUuICBUaGlzIGlzIHRvIGFsbG93IHNjcmlwdGluZwoJICAgICBuYW1lcyB0aGF0IGFyZW4ndCB2YWxpZCBDIGlkZW50aWZpZXJzLgoKNi8xNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFkZSBhIG1pbm9yIGNoYW5nZSB0byB0aGUgd2F5IGZpbGVzIGFyZSBsb2FkZWQgaW4KICAgICAgICAgICBvcmRlciB0byBnZXQgZmlsZS9saW5lIG51bWJlciByZXBvcnRpbmcgY29ycmVjdCBpbgogICAgICAgICAgIHRoZSBwcmVwcm9jZXNzb3IuCgo2LzE0LzIwMDE6IG1rb2VwcGUKCSAgICogVGhlIHBhcnNlciBub3cgdW5kZXJzdGFuZHMgdGhlIChub24tc3RhbmRhcmQpICJsb25nIGxvbmciCgkgICAgIHR5cGVzLiBJdCBpcyB1cCB0byB0aGUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzIHRvCgkgICAgIHByb3ZpZGUgdHlwZW1hcHMgaWYgbmVlZGVkLiBSZXBvcnRlZCBieSBTYW0gU3RlaW5nb2xkLCBTRgoJICAgICBidWcgIzQyOTE3Ni4KCSAgICogVGhlIHBhcnNlciBub3cgdW5kZXJzdGFuZHMgYXJndW1lbnRzIGxpa2UgImNvbnN0IGludCAqCgkgICAgIGNvbnN0IGkiLiBUaGlzIGZpeGVzIFNGIGJ1ZyAjMjE1NjQ5LgoJICAgKiBGaXhlZCB0aGUgR3VpbGUgdGVzdC1zdWl0ZS4KCjYvMTMvMjAwMTogbWtvZXBwZQoJICAgUGFydGlhbCBtZXJnZSBmcm9tIHRoZSBDVlMgdHJ1bmsgYXQgdGFnCgkgICAibWtvZXBwZS1tZXJnZS0xIi4gVGhpcyBjb3ZlcnMgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgoKfCAwMS8xNi8wMTogdHRuCnwJICAgV3JvdGUgdGFibGUgb2YgY29udGVudHMgZm9yIERvYy9lbmdpbmVlcmluZy5odG1sLiAgQWRkZWQgc2VjdGlvbgp8CSAgIG9uIENWUyB0YWdnaW5nIGNvbnZlbnRpb25zLiAgQWRkZWQgY29weXJpZ2h0IHRvIG90aGVyIGRvY3MuCnwgOS8yNS8wMCA6IGJlYXpsZXkKfCAJICAgTW9kaWZpZWQgdGhlIHByZXByb2Nlc3NvciBzbyB0aGF0IG1hY3JvIG5hbWVzIGNhbiBzdGFydCB3aXRoIGEgJyUnLgp8IAkgICBUaGlzIG1heSBhbGxvdyBuZXcgU1dJRyAiZGlyZWN0aXZlcyIgdG8gYmUgZGVmaW5lZCBhcyBtYWNyb3MgaW5zdGVhZAp8IAkgICBvZiBoYXZpbmcgdG8gYmUgaGFyZC1jb2RlZCBpbnRvIHRoZSBwYXJzZXIuICAKfAp8ICoqKiBBbHNvIGEgeWV0LXRvLWJlLWRvY3VtZW50ZWQgcXVvdGluZyBtZWNoYW5pc20gd2l0aCBiYWNrcXVvdGVzCnwgKioqIGhhcyBiZWVuIGltcGxlbWVudGVkPwoKNi8xMy8yMDAxOiBta29lcHBlCgkgKiBXaGVuIGNvbmZpZ3VyZSBkb2VzIG5vdCBmaW5kIGEgbGFuZ3VhZ2UsIGRvbid0IHVzZSBkZWZhdWx0CgkgICBwYXRocyBsaWtlIC91c3IvbG9jYWwvaW5jbHVkZTsgdGhpcyBvbmx5IGNhdXNlcyBidWlsZAoJICAgcHJvYmxlbXMuCgkgKiBOZXcgZGlyZWN0b3J5OiBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlLCB3aGVyZSBhIGZldwoJICAgYnVncyBpbiAxLjNhNSBhcmUgZGVtb25zdHJhdGVkLiAKCSAqIEhhbmRsZSBDKysgbWV0aG9kcyB0aGF0IGhhdmUgYm90aCBhICJjb25zdCIgYW5kIGEgInRocm93IgoJICAgZGlyZWN0aXZlIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9jcGx1c3BsdXMtdGhyb3cuaSk7IAoJICAgdGhhbmtzIHRvIFNjb3R0IEIuIERydW1tb25kcyBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlIGZpeC4gCgkgKiBIYW5kbGUgQysrIHBvaW50ZXItcmVmZXJlbmNlIGFyZ3VtZW50cyAobGlrZSAiaW50IComIGFyZyIpIAoJICAgKHNlZSBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlL3BvaW50ZXItcmVmZXJlbmNlLmksCgkgICByZXBvcnRlZCBhcyBTRiBidWcgIzQzMjIyNCkuCgkgKiBbUnVieV0gRml4ZWQgdHlwbyBpbiBydWJ5ZGVjLnN3ZzsgdGhhbmtzIHRvIEx5bGUgSm9obnNvbiEKCSAqIERvbid0IHN0b3AgdGVzdGluZyB3aGVuIG9uZSB0ZXN0IGZhaWxzLgoJICogW0d1aWxlLCBNelNjaGVtZV0gRG9uJ3QgcHJpbnQgIkdlbmVyYXRpbmcgd3JhcHBlcnMuLi4iLgoKNi8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFZFQ1RPUkxFTklOUFVUIGFuZCBMSVNUTEVOSU5QVVQgbm93IGhhdmUgc2VwYXJhdGUKCSAgIGxpc3QgbGVuZ3RoIHZhcmlhYmxlcy4gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVAoJICAgYXR0YWNoZXMgYXJndW1lbnQgZG9jdW1lbnRhdGlvbiBpbnZvbHZpbmcgU0NNX1RZUEUgdG8gdGhlCgkgICBzdGFuZGFyZCBwb2ludGVyIHR5cGVtYXBzLiBJTk9VVCBpcyBub3cgYW4gYWxpYXMgZm9yIEJPVEguCgo2LzEyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgU29tZSBKYXZhIGRvY3VtZW50YXRpb24gYWRkZWQuCgkgICBbSmF2YV0gRml4ZWQgYnVncyBpbiBpbXBvcnQgcHJhZ21hIGFuZCBzaGFkb3cgcHJhZ21hLiAKCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgRml4IGRlY2xhcmF0aW9ucyBvZiBTV0lHX2RlZmluZV9jbGFzcwoJICAgKExpYi9ydWJ5L3J1YnlkZWMuc3dnKSBhbmQgU1dJR19UeXBlUXVlcnkKCSAgIChMaWIvY29tbW9uLnN3ZykuIFRoYW5rcyB0byBMeWxlIEpvaG5zb24KCSAgIDxsam9obnNvbkByZXNnZW4uY29tPiBmb3IgdGhlIHBhdGNoZXMuCgo2LzExLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gVXNlIGxvbmcgaW5zdGVhZCBvZiBzY21fYml0c190OyB0aGlzIG1ha2VzIHRoZQoJICAgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBjb21wYXRpYmxlIHdpdGggR3VpbGUgMS4zLjQKCSAgIGFnYWluLiBUaGFua3MgdG8gTWFzYWtpIEZ1a3VzaGltYSBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCgo2LzExLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgVGhlIGdlbmVyaWMgSU5TVEFMTCBmaWxlIGZyb20gYXV0b2NvbmYgYWRkZWQuIEZldyBjaGFuZ2VzIHRvIFJFQURNRSBmaWxlLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBGaXhlZCB0eXBvIGluIE1ha2VmaWxlLmluOyB0aGFua3MgdG8gR3JlZyBUcm94ZWwKCSAgIDxnZHRAaXIuYmJuLmNvbT4uIAoKNi8wOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIG1ha2UgY2hlY2sgd29ya3MgYWdhaW4uIEV4YW1wbGVzL0dJRlBsb3QgY29uZmlndXJlIGdlbmVyYXRlZCBieQoJICAgdG9wIGxldmVsIGF1dG9jb25mIG5vdy4KCjYvMDgvMjAwMTogbWtvZXBwZQoJICAgQW5vdGhlciBidWlsZCBjaGFuZ2U6IFRoZSBuZXcgc2NyaXB0IGF1dG9nZW4uc2ggcnVucwoJICAgYXV0b2NvbmYgaW4gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzLiAgVGhlIHRvcC1sZXZlbAoJICAgY29uZmlndXJlIGFsc28gY29uZmlndXJlcyBpbiBFeGFtcGxlcy9HSUZQbG90LgoKNi8wNy8yMDAxOiBta29lcHBlCgkgICBNYWRlIHRoZSBNYWtlZmlsZSB3b3JrIHdpdGggbm9uLUdOVSBtYWtlIGFnYWluLgoKNi8wNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBDbGFzcy9zdHJ1Y3QgbWVtYmVycyB0aGF0IGFyZSBhcnJheXMgb2YgcG9pbnRlcnMgdG8gY2xhc3Nlcy9zdHJ1Y3RzIC0KCSAgIFNoYWRvdyBjbGFzcydzIGdldC9zZXQgYWNjZXNzb3JzIG5vdyB1c2UgSmF2YSBjbGFzc2VzIGluc3RlYWQgb2YgbG9uZ3MgKHBvaW50ZXJzKS4KCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3NlcyB3aWxsIG5vdyBjbGVhbiB1cCBtZW1vcnkgaWYgZnVuY3Rpb24gcmV0dXJuIHR5cGUgCgkgICBpcyBhIGNsYXNzL3N0cnVjdC4KCSAgIFtKYXZhXSBOZXcgZXhhbXBsZSBjYWxsZWQgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzLgoKNi8wNi8yMDAxOiBta29lcHBlCgkgICBOZXcgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtcmVsZWFzZS1zdWZmaXggYWxsb3dzIGZvcgoJICAgYXR0YWNoaW5nIGEgc3VmZml4IHRvIHRoZSBzd2lnIGJpbmFyeSBhbmQgdGhlIHN3aWcgcnVudGltZQoJICAgbGlicmFyaWVzLiAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgInN3aWcKCSAgIC1zd2lnbGliIiB3b3JrcyBhZ2Fpbi4gIElmIGludm9rZWQgd2l0aCB0aGUgbmV3IG9wdGlvbgoJICAgIi1sZGZsYWdzIiwgU1dJRyBwcmludHMgYSBsaW5lIG9mIGxpbmtlciBmbGFncyBuZWVkZWQgdG8KCSAgIGxpbmsgd2l0aCB0aGUgcnVudGltZSBsaWJyYXJ5IG9mIHRoZSBzZWxlY3RlZCBsYW5ndWFnZQoJICAgbW9kdWxlLiAKCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBnc3dpZ19saXN0X3AgaXMgYW4gaW50LCBub3QgYSBTQ00uICBUaGlzIHR5cG8KCSAgIGNhdXNlZCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoIGEgR3VpbGUgY29uZmlndXJlZCB3aXRoCgkgICBzdHJpY3QgQyB0eXBlIGNoZWNraW5nLiBJbiBJTlBVVCBhbmQgQk9USCB0eXBlbWFwcwoJICAgZ2VuZXJhdGVkIGJ5IHRoZSBTSU1QTEVfTUFQIG1hY3JvLCB1c2UgdGhlIFNDTV9UT19DCgkgICBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gR3VpbGUgdG8gQyAocmF0aGVyIHRoYW4gQ19UT19TQ00pLgoJICAgVXNlIHNjbV9pbnRwcmludCB0byBwcmludCBwb2ludGVycyAocmF0aGVyIHRoYW4KCSAgIHNwcmludGYpLiBBbGxvdyB1c2luZyAiLWxpbmthZ2UiIGluc3RlYWQgb2YgIi1MaW5rYWdlIi4gCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIE1vZHMgZm9yIHVzaW5nIGluaGVyaXRlZCBjKysgY2xhc3NlcyBmcm9tIEphdmEKCSAgIFtKYXZhXSBOZXcgZXhhbXBsZSBjYWxsZWQgY2xhc3MgYmFzZWQgb24gdGhlIHNhbWUgZXhhbXBsZSBmcm9tIG90aGVyIG1vZHVsZXMKCjYvMDUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gZGVzdHJ1Y3RvciAoX2RlbGV0ZSgpKSB3YXMgbm90IGF3YXJlIG9mICVuYW1lIHJlbmFtaW5nCgkgICBbSmF2YV0gZXh0ZW5kcyBiYXNlY2xhc3MgZGlkIG5vdCBrbm93IGFib3V0ICVuYW1lIHJlbmFtaW5nCgkgICBbSmF2YV0gZXh0ZW5kcyBiYXNlY2xhc3MgZGlkIGV4dGVuZCBldmVuIHdoZW4gdGhlIGJhc2VjbGFzcyB3YXMgbm90IGtub3duIHRvIHN3aWcKCSAgIFtKYXZhXSBzb21ldGltZXMgZW51bS1kZWNsYXJhdGlvbnMgb2NjdXJyZWQgYmVmb3JlIHRoZSBKYXZhIGNsYXNzIGRlY2xhcmF0aW9uCgkgICBbSmF2YV0gdW5yZWxhdGVkIGVudW0gaW5pdGlhbGlzYXRpb25zIG5vIGxvbmdlciBhcHBlYXIgaW4gSmF2YSBjbGFzcwoJICAgW0phdmFdIGlmIG1vZHVsZSBlbmRzIGluICdfJyBjb3JyZWN0IEpOSSBuYW1lcyBhcmUgbm93IHByb2R1Y2VkCgo2LzA0LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBtb2RzIC0gTW9kaWZpZWQgY29uc3RydWN0b3IgcmVwbGFjZXMKCSAgIG5ld0luc3RhbmNlKCkuIF9kZWxldGUoKSBub3cgdGhyZWFkIHNhZmUuIGdldENQdHIoKSByZXBsYWNlcwoJICAgX3NlbGYuIF9zZWxmQ2xhc3MoKSByZW1vdmVkIGFzIG5vdyByZWR1bmRhbnQuIAogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCSAgIFtKYXZhXSBOb3QgYWxsIG91dHB1dCBqYXZhIGZpbGVzIGhhZCBTV0lHIGJhbm5lci4gTmV3IGJhbm5lci4KCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzIGZpbmFsaXplcnMgYXJlIG91dHB1dCBieSBkZWZhdWx0OiBDb21tYW5kCgkgICBsaW5lIG9wdGlvbiAtZmluYWxpemUgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgd2l0aCAtbm9maW5hbGl6ZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvIDEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBDYXN0IFNDTV9DQVIoKSB0byBzY21fYml0c190IGJlZm9yZSBzaGlmdGluZyBpdC4KCSAgIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGNvbXBpbGluZyB3aXRoIGEgR3VpbGUgY29uZmlndXJlZCB3aXRoCgkgICBzdHJpY3QgQyB0eXBlIGNoZWNraW5nLiAgCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIGNvbmZpZ3VyZSBvcHRpb24gIi0td2l0aC1zd2lnbGliZGlyIi4KCjUvMzEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBTdXBwb3J0IG11bHRpcGxlIHBhcmFsbGVsIGxpc3RzIG9yIHZlY3RvcnMgaW4KCSAgIHRoZSB0eXBlbWFwcyBwcm92aWRlZCBieSBsaXN0LXZlY3Rvci5pLiAgTmV3IHR5cGVtYXBzIGZpbGUsCgkgICBwb2ludGVyLWluLW91dC5pLiAKCjUvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gSFRNTCB1cGRhdGUgZm9yIGV4YW1wbGVzLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBNaW5vciBjaGFuZ2VzIHRvIHRoZSBidWlsZCBzeXN0ZW0uICBBZGRlZCBzdWJkaXJlY3RvcnkgZm9yCgkgICBEZWJpYW4gcGFja2FnZSBjb250cm9sIGZpbGVzLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEJ1aWxkIGEgcnVudGltZSBsaWJyYXJ5LCBsaWJzd2lnZ3VpbGUuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9uICQqZGVzY3JpcHRvci4gIFVzZSB0aGUge30KCSAgIHN5bnRheCwgcmF0aGVyIHRoYW4gdGhlICIiIHN5bnRheCBmb3IgdGhlIHN0YW5kYXJkCgkgICB0eXBlbWFwcywgaW4gb3JkZXIgdG8gd29yayBhcm91bmQgc3RyYW5nZSBtYWNyby1leHBhbnNpb24KCSAgIGJlaGF2aW9yIG9mIHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIFRoaXMgaW50cm9kdWNlcyBzb21lCgkgICBleHRyYSBicmFjZXMuCgo1LzI3LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gSGFuZGxlIHBvaW50ZXIgdHlwZXMgd2l0aCB0eXBlbWFwcywgcmF0aGVyIHRoYW4KCSAgIGhhcmQtY29kZWQuIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMgJGRlc2NyaXB0b3IsCgkgICAkYmFzZWRlc2NyaXB0b3I7IHNlZSBkb2N1bWVudGF0aW9uLiBTb21lIGNsZWFuLXVwIGluIHRoZQoJICAgdmFyaWFibGUvY29uc3RhbnRzIHdyYXBwZXIgZ2VuZXJhdG9yIGNvZGUuICBOZXcgY29udmVuaWVuY2UKCSAgIG1hY3JvIFNXSUdfR3VpbGVfTXVzdEdldFB0ciwgd2hpY2ggYWxsb3dzIGdldHRpbmcgcG9pbnRlcnMKCSAgIGZyb20gc21vYnMgaW4gYSBmdW5jdGlvbmFsIHN0eWxlLiAgTmV3IHR5cGVtYXAgZmlsZQoJICAgImxpc3QtdmVjdG9yLmkiLCBwcm92aWRpbmcgbWFjcm9zIHRoYXQgZGVmaW5lIHR5cGVtYXBzIGZvcgoJICAgY29udmVydGluZyBiZXR3ZWVuIEMgYXJyYXlzIGFuZCBTY2hlbWUgbGlzdHMgYW5kIHZlY3RvcnMuCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIFNUTCBzdHJpbmcgbW92ZWQgaW50byBpdHMgb3duIHR5cGVtYXAgYXMgaXQgaXMgYysrIGNvZGUgYW5kIAoJICAgaXQgYnJlYWsgYW55IGMgY29kZSB1c2luZyB0aGUgdHlwZW1hcHMuaSBmaWxlLgoJICAgLSBGaXhlcyBmb3Igd3JhcHBlcnMgYXJvdW5kIGdsb2JhbCB2YXJpYWJsZXMgLSBhcHBsaWVzIHRvIHByaW1pdGl2ZSAKCSAgIHR5cGVzIGFuZCB1c2VyIHR5cGVzIChjbGFzcy9zdHJ1Y3QpIGFuZCBwb2ludGVycyB0byB0aGVzZS4KCSAgIC0gU3RydWN0dXJlIG1lbWJlciB2YXJpYWJsZXMgYW5kIGNsYXNzIHB1YmxpYyBtZW1iZXIgdmFyaWFibGVzIGdldHRlcnMgCgkgICBhbmQgc2V0dGVycyBwYXNzIGEgcG9pbnRlciB0byB0aGUgbWVtYmVyIGFzIHdhcyBpbiAxLjNhMyBhbmQgMS4xIAoJICAgKDEuM2E1IHdhcyBwYXNzaW5nIGJ5IHZhbHVlKQoJICAgLSBQYXJhbWV0ZXJzIHRoYXQgd2VyZSBhcnJheXMgYW5kIHJldHVybiB0eXBlcyB3ZXJlIGluY29ycmVjdGx5IAoJICAgYmVpbmcgcGFzc2VkIHRvIGNyZWF0ZV9mdW5jdGlvbigpIGFzIHBvaW50ZXJzLgoJICAgLSBGaXggZm9yIGFycmF5cyBvZiBlbnVtcy4gCgkgICBbSmF2YV0gVXBkYXRlZCBqYXZhIGV4YW1wbGVzIGFuZCBhZGRlZCB0d28gbW9yZS4KCSAgIFtKYXZhXSBKYXZhIG1vZHVsZSB1cGRhdGVkIGZyb20gU1dJRzEuM2EzIGluY2x1ZGluZyBjb2RlIGNsZWFudXAgZXRjLgoJICAgW0phdmFdIGVudW0gc3VwcG9ydCBhZGRlZC4KCSAgIFtKYXZhXSBBcnJheSBzdXBwb3J0IGltcGxlbWVudGVkCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgaW1wcm92ZWQgLSBKYXZhIG9iamVjdHMgdXNlZCByYXRoZXIgdGhhbiAKCSAgIGxvbmdzIGhvbGRpbmcgdGhlIGMgcG9pbnRlciB0byB0aGUgd3JhcHBlZCBzdHJ1Y3R1cmUvYysrY2xhc3MKCjUvMjIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCBleHRlcm4gIkMiIGRlY2xhcmF0aW9ucyBpbiBDKysgbW9kZS4gVGhhbmtzCgkgICB0byBHcmVnIFRyb3hlbCA8Z2R0QGlyLmJibi5jb20+LgoKNS8yMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyBsaW5rYWdlICJtb2R1bGUiIGZvciBjcmVhdGluZyBHdWlsZSBtb2R1bGVzIGZvcgoJICAgR3VpbGUgdmVyc2lvbnMgPj0gMS41LjAuIAoKNC8xOC8yMDAxOiBta29lcHBlCgkgICBbTXpTY2hlbWVdIEFkZGVkIHR5cGVtYXBzIGZvciBwYXNzaW5nIHRocm91Z2ggU2NoZW1lX09iamVjdAoJICAgcG9pbnRlcnMuIAoKNC85LzIwMDEgOiBta29lcHBlIAoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgYGJvb2wnLiAgSW5jbHVzaW9uIG9mIGhlYWRlcnMKCSAgIGFuZCBzdXBwb3J0IHJvdXRpbmVzIGlzIG5vdyBkYXRhLWRyaXZlbiB2aWEgbXpzY2hlbWUuaS4KCSAgIEhlYWRlcnMgY29tZSBmcm9tIHRoZSBuZXcgZmlsZSBtenNjaGVtZGVjLnN3Zy4gIERvbid0IGFib3J0CgkgICBpbW1lZGlhdGVseSB3aGVuIGEgdHlwZS1oYW5kbGluZyBlcnJvciBpcyByZXBvcnRlZC4gIFdoZW4KCSAgIHNlYXJjaGluZyBmb3IgdHlwZW1hcHMgZm9yIGVudW1zLCBmYWxsIGJhY2sgdG8gdXNpbmcgaW50LAoJICAgbGlrZSB0aGUgR3VpbGUgYmFja2VuZCBkb2VzLiAgU3VwcG9ydCBjaGFyIGNvbnN0YW50cy4gIEVtaXQKCSAgIGNvcnJlY3Qgd3JhcHBlciBjb2RlIGZvciB2YXJpYWJsZXMuCgozLzEyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKipPVVRQVVQsIGNoYXIgKipCT1RILgoKMy8yLzIwMDEgOiBta29lcHBlIAoJICAgW0d1aWxlXSBFdmVyeSB3cmFwcGVyIGZ1bmN0aW9uIG5vdyBnZXRzIGEgYm9vbGVhbiB2YXJpYWJsZQoJICAgZ3N3aWdfbGlzdF9wIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIG11bHRpcGxlIHZhbHVlcyBhcmUKCSAgIHByZXNlbnQuIFRoZSBtYWNyb3MgR1VJTEVfQVBQRU5EX1JFU1VMVCwgR1VJTEVfTUFZQkVfVkFMVUVTCgkgICBhbmQgR1VJTEVfTUFZQkVfVkVDVE9SIHVzZSB0aGlzIHZhcmlhYmxlLCByYXRoZXIgdGhhbgoJICAgY2hlY2tpbmcgd2hldGhlciB0aGUgY3VycmVudCByZXR1cm4gdmFsdWUgaXMgYSBsaXN0LiBUaGlzCgkgICBhbGxvd3MgZm9yIHR5cGVtYXBzIHJldHVybmluZyBhIGxpc3QgYXMgYSBzaW5nbGUgdmFsdWUgKGEKCSAgIGxpc3Qgd2FzIGVycm9uZW91c2x5IGNvbnZlcnRlZCBpbnRvIGEgdmVjdG9yIG9yIGEKCSAgIG11bHRpcGxlLXZhbHVlIG9iamVjdCBpbiB0aGlzIGNhc2UpLgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIHJldHVybmluZyBtdWx0aXBsZSB2YWx1ZXMgYXMKCSAgIHZlY3RvcnMsIG9yIHBhc3NpbmcgdGhlbSB0byBhIG11bGlwbGUtdmFsdWUKCSAgIGNvbnRpbnVhdGlvbi4gQnkgZGVmYXVsdCwgbXVsdGlwbGUgdmFsdWVzIHN0aWxsIGdldAoJICAgcmV0dXJuZWQgYXMgYSBsaXN0LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIGEgImJlZm9yZXJldHVybiIgcHJhZ21hLiBUaGUgdmFsdWUgb2YgdGhpcwoJICAgcHJhZ21hIGlzIGluc2VydGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IHJldHVybiBzdGF0ZW1lbnQuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgc3VwcG9ydCBmb3IgR3VpbGUgMS40LjEgcHJvY2VkdXJlCgkgICBkb2N1bWVudGF0aW9uIGZvcm1hdHMsIHNlZSBpbnRlcm5hbHMuaHRtbC4KCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBNYWRlIHRoZSB3cmFwcGVyIGNvZGUgY29tcGlsZSB3aXRoIEMrKyBpZiB0aGUKCSAgICItYysrIiBjb21tYW5kLWxpbmUgc3dpdGNoIGlzIGdpdmVuLiAgVGhhbmtzIHRvCgkgICA8bW9ua2V5aXFAZGluZ29ibHVlLm5ldC5hdT4uIAoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5vdyB0d28gdHlwZSB0YWJsZXMsIHN3aWdfdHlwZXMgYW5kCgkgICBzd2lnX3R5cGVzX2luaXRpYWwsIGFyZSB1c2VkLCBhcyBhbGwgb3RoZXIgU1dJRyBsYW5ndWFnZQoJICAgbW9kdWxlcyBkby4gIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCBmb3IgdGhlIHRyaWNreQoJICAgY29uc3RydWN0aW9uIHVzZWQgYmVmb3JlIHRoYXQgdGhlIGJyb2tlbiBSZWRoYXQgNy4wIGdjYwoJICAgZG9lc24ndCBwYXJzZS4gUmVwb3J0ZWQgYnkgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCB0eXBlbWFwcyBmb3IgY2hhciAqT1VUUFVULCBjaGFyICpCT1RIOyBhIGJhZAoJICAgZnJlZSgpIHdvdWxkIGJlIGVtaXR0ZWQuICBBZGRlZCB0eXBlbWFwIGZvciBTQ00uCgoKVmVyc2lvbiAxLjMgQWxwaGEgNSAKPT09PT09PT09PT09PT09PT09PQoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFtQeXRob25dIFB5dGhvbiBtb2R1bGUgZ2VuZXJhdGVzIG1vcmUgZWZmaWNpZW50IGNvZGUgZm9yCiAgICAgICAgICBjcmVhdGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgd3JhcHBlciBmdW5jdGlvbi4gTW9kaWZpY2F0aW9uCiAgICAgICAgICBzdWdnZXN0ZWQgYnkgSm9uIFRyYXZpcy4KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBMaWJyYXJ5IGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZSAtbCBvcHRpb24gYXJlIG5vdyBpbmNsdWRlZCBhdCB0aGUKICAgICAgICAgIGVuZCBvZiB0aGUgaW50ZXJmYWNlIGZpbGUgKHJldmVydGluZyB0byB0aGUgb2xkIGJlaGF2aW9yKS4KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggZW51bSBoYW5kbGluZy4gIGVudW1zIGFyZSBub3cgbWFuaXB1bGF0ZWQgYXMKICAgICAgICAgICdpbnQnLCBidXQgY2FzdCBpbnRvIHRoZSBlbnVtIHR5cGUgd2hlbiB2YWx1ZXMgYXJlIHBhc3NlZCB0byB0aGUgCiAgICAgICAgICBjb3JyZXNwb25kaW5nIEMgZnVuY3Rpb24uCgo5LzE5LzAwIDogbWtvZXBwZQoJICBbR3VpbGVdIFJlbW92ZWQgIi13aXRoLXNtb2JzIiBjb21tYW5kLWxpbmUgb3B0aW9uLCBhcyB0aGlzIGlzIHRoZQoJICBkZWZhdWx0IG5vdy4gIEFkZGVkICItZW1pdC1zZXR0ZXJzIiBjb21tYW5kLWxpbmUgb3B0aW9uLAoJICB3aGljaCB0dXJucyBvbiBnZW5lcmF0aW5nIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzOyBzZWUKCSAgaW50ZXJuYWxzLmh0bWwuCgo5LzE4LzAwIDogbWtvZXBwZQoJICBJbmNvcnBvcmF0ZWQgcGF0Y2ggIzEwMTQzMCwgZml4aW5nIGJ1Z3MgaW4gdGhlIEd1aWxlIG1vZHVsZTogCgkgIDEuIFNvbWUgYXJndW1lbnRzIHdlcmUgZXJyb25lb3VzbHkgdGFrZW4gYXMgKm9wdGlvbmFsKiBhcmd1bWVudHMgd2hlbgoJICAgICBpZ25vcmVkIGFyZ3VtZW50cyB3ZXJlIHByZXNlbnQuIAoJICAyLiBHdWlsZSAxLjMuNCB3YXMgbm90IHN1cHBvcnRlZCBzaW5jZSBmdW5jdGlvbnMgaW50cm9kdWNlZCBpbiBHdWlsZQoJICAgICAgMS40IHdlcmUgdXNlZC4JICAKCSAgMy4gQWRkZWQgaGFuZGxpbmcgb2YgYGNvbnN0IGNoYXIgKicuCgo5LzE3LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGZhaWxlZCBhc3NlcnRpb24gYW5kIGxhcmdlIGZpbGVzLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0aGUgJyUnIGNoYXJhY3RlciBhcHBlYXJpbmcgaW4gYWRkZWQgbWV0aG9kcwogICAgICAgICAgYW5kIGZ1bmN0aW9uIGJvZGllcy4gIFByZXByb2Nlc3NvciBidWcuCgpWZXJzaW9uIDEuMyBBbHBoYSA0IChTZXB0ZW1iZXIgNCwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzMvMDAgIDogdHRuCiAgICAgICAgICBBZGRlZCBpbnN0cnVjdGlvbnMgZm9yIG1haW50YWluZXJzIGluIEV4YW1wbGVzL1JFQURNRSBvbiBob3cKICAgICAgICAgIHRvIG1ha2UgZXhhbXBsZXMgYWxzbyBiZSB1c2VmdWwgaW4gdGhlIHRlc3RpbmcgZnJhbWV3b3JrLgogICAgICAgICAgQWxzbywgIm1ha2UgY2hlY2siIG5vdyB1c2VzIC4vTGliIGJ5IHZpYSBlbnYgdmFyIGBTV0lHX0xJQicuCiAgICAgICAgICBUaGlzIGlzIG92ZXJyaWRhYmxlIGxpa2Ugc286CiAgICAgICAgICAgICBtYWtlIGNoay1zd2lnbGliPS9teS9leHBlcmltZW50YWwvc3dpZy9MaWIgY2hlY2sKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAkdHlwZW1hcCB2YXJpYWJsZSB0byB0eXBlbWFwcy4gIFRoaXMgZ2V0cyByZXBsYWNlZCB3aXRoCiAgICAgICAgICBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSB0eXBlbWFwIHRoYXQgaXMgYXBwbGllZC4gIEZlYXR1cmUKICAgICAgICAgIHJlcXVlc3QgZnJvbSByc2Fsei4KCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBFeHBlcmltZW50YWwgb3B0aW1pemF0aW9uIHRvIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdmlydHVhbAogICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIElmIHlvdSBoYXZlIHR3byBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgQSgpIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIGNsYXNzIEIoKSA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgU3dpZyBub3cgd2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGlzCgogICAgICAgICAgICAgICAgQV9mb28oQSAqYSkgewogICAgICAgICAgICAgICAgICAgIGEtPmZvbygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIGFuZCB1c2UgaXQgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGJvdGggQV9mb28oKSBhbmQgQl9mb28oKS4KICAgICAgICAgIFRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgaWYgYm90aCBtZXRob2RzIGFyZSBkZWNsYXJlZAogICAgICAgICAgYXMgdmlydHVhbCBhbmQgYm90aCB0YWtlIGlkZW50aWNhbCBwYXJhbWV0ZXJzLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlc3RvcmVkIHRoZSAibWVtYmVyaW4iIHR5cGVtYXAgZm9yIHNldHRpbmcgc3RydWN0dXJlIG1lbWJlcnMuCiAgICAgICAgICBVbmxpa2UgdGhlIG9sZCB2ZXJzaW9uLCB0aGUgbmV3IHZlcnNpb24gaXMgZXhwYW5kZWQgaW5saW5lIGluIHRoZQogICAgICAgICAgd3JhcHBlciBmdW5jdGlvbiBhbGxvd2luZyBhY2Nlc3MgdG8gc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBpbnRlcm5hbHMgKGEgc29tZXRpbWVzIHJlcXVlc3RlZCBmZWF0dXJlKS4gVGhlICJtZW1iZXJvdXQiIHR5cGVtYXAKICAgICAgICAgIGlzIGdvbmUuIFVzZSB0aGUgIm91dCIgdHlwZW1hcHMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEF0dHJpYnV0ZSBzZXQgbWV0aG9kcyBubyBsb25nZXIgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIG1lbWJlci4KICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBub3cgZ2V0cyBzZXQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgdm9pZCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgIGYtPnggPSB4OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiBTV0lHMS4xIGl0IHVzZWQgdG8gYmUgdGhpczoKCiAgICAgICAgICAgICAgaW50IEZvb194X3NldChGb28gKmYsIGludCB4KSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gKGYtPnggPSB4KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGR1ZSB0byB0aGUgY29tcGxleGl0eSBjcmVhdGVkIGJ5IHRyeWluZwogICAgICAgICAgdG8gZG8gdGhpcyB3aXRoIG1vcmUgZXhvdGljIGRhdGF0eXBlcyBzdWNoIGFzIGFycmF5cy4gIEl0IGFsc28KICAgICAgICAgIGNvbXBsaWNhdGVzIGlubGluaW5nIGFuZCBoYW5kbGluZyBvZiB0aGUgIm1lbWJlcmluIiB0eXBlbWFwLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgcHRyY2FzdCgpIGFuZCBwdHJtYXAoKSBmdW5jdGlvbnMgZnJvbSB0aGUKICAgICAgICAgIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBPbGQgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wYXRpYmxlCiAgICAgICAgICB3aXRoIG5ldyB0eXBlIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVF1ZXJ5KGNvbnN0IGNoYXIgKm5hbWUpIGFkZGVkLgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHRoZSB0eXBlIGluZm8gc3RydWN0dXJlCiAgICAgICAgICB0aGF0IGlzIHVzZWQgZm9yIHR5cGUtY2hlY2tpbmcuICBJdCB3b3JrcyB3aXRoIGVpdGhlciB0aGUKICAgICAgICAgIG5pY2UgQyBuYW1lIG9yIG1hbmdsZWQgdmVyc2lvbiBvZiBhIGRhdGF0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJpbnQgKiIpOwogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJfcF9pbnQiKTsKCiAgICAgICAgICBUaGlzIGlzIGFuIGFkdmFuY2VkIGZlYXR1cmUgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IHNvbWUKICAgICAgICAgIGV4b3RpYyBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG5lZWQgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZQogICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlIG9iamVjdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgTmV3IGRpcmVjdGl2ZSAldHlwZXMoKSBhZGRlZC4gIFRoaXMgaXMgdXNlZCB0bwogICAgICAgICAgZXhwbGljaXRseSBsaXN0IGRhdGF0eXBlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbgogICAgICAgICAgdGhlIHJ1bnRpbWUgdHlwZS1jaGVja2luZyBjb2RlLiBOb3JtYWxseSBpdCBpcyBuZXZlcgogICAgICAgICAgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGJ1dCBzb21ldGltZXMgYWR2YW5jZWQgZXh0ZW5zaW9ucwogICAgICAgICAgKHN1Y2ggYXMgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5KSBtYXkgbmVlZCB0byBtYW51YWxseQogICAgICAgICAgYWRkIHR5cGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzAwIDogYmVhemxleQogICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygc3RyaW5nIGFycmF5IHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsCiAgICAgICAgICBhIGdsb2JhbCB2YXJpYWJsZSBvZiB0aGUgZm9ybSAiY2hhciBuYW1lWzY0XSIgaXMgYXV0b21hdGljYWxseQogICAgICAgICAgbWFuYWdlZCBhcyBhIDY0IGNoYXJhY3RlciBzdHJpbmcuICBQcmV2aW91c2x5IHRoaXMgZGlkbid0CiAgICAgICAgICB3b3JrIGF0IGFsbCBvciByZXF1aXJlZCB0aGUgdXNlIG9mIGEgc3BlY2lhbCB0eXBlbWFwLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFIChUY2wsIFBlcmwsIFB5dGhvbikgKioqCgo4LzMxLzAwIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCBgY2hlY2stYysrLWV4YW1wbGVzJywgd2hpY2ggdXNlcyBuZXcKCSAgZmlsZXMgdW5kZXIgRXhhbXBsZXMvQysrIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuICBOb3cgIm1ha2UKCSAgY2hlY2siIGFsc28gZG9lcyAibWFrZSBjaGVjay1jKystZXhhbXBsZXMiLiAgQWxzbywgZXhwYW5kZWQKCSAgYWN0aW9ucyBpbiBgY2hlY2stZ2lmcGxvdC1leGFtcGxlJyBhbmQgYGNoZWNrLWFsaXZlbmVzcycuCgo4LzMwLzAwIDogbWtvZXBwZQoJICBNYWpvciBjbGVhbi11cCBpbiB0aGUgR3VpbGUgbW9kdWxlLiBBZGRlZCB0eXBlbWFwLWRyaXZlbgoJICBkb2N1bWVudGF0aW9uIHN5c3RlbS4gQ2hhbmdlZCB0byBoYW5kbGUgbW9yZSB0aGFuIDEwCgkgIGFyZ3MuIFVwZGF0ZWQgYW5kIGV4dGVuZGVkIGV4YW1wbGVzLgoJICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVpbnNlcnQgZGlyZWN0aXZlIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlCiAgICAgICAgICBpbnRvIGEgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IHdyYXBwZXIgZmlsZS4gIFRoaXMgaXMgb25seSBpbnRlbmRlZAogICAgICAgICAgZm9yIHVzZSBieSB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXb3JrcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXJzKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChydW50aW1lKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydCh3cmFwcGVycykgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChpbml0KSAgICAgImZpbGUuc3dnIjsKCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVydW50aW1lIGRpcmVjdGl2ZSB3aGljaCBpbmNsdWRlcyBjb2RlIGludG8gdGhlIHJ1bnRpbWUKICAgICAgICAgIHBvcnRpb24gb2YgdGhlIHdyYXBwZXIgY29kZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVydW50aW1lICV7CiAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgaW50ZXJuYWwgcnVudGltZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgVGhlcmUgaXMgbm8gcHJhY3RpY2FsIHJlYXNvbiBmb3Igb3JkaW5hcnkgdXNlcnMgdG8gdXNlIHRoaXMKICAgICAgICAgIGZlYXR1cmUgKGFsbW9zdCBldmVyeXRoaW5nIGNhbiBiZSBkb25lIHVzaW5nICV7IC4uLiAlfQogICAgICAgICAgaW5zdGVhZCkuICAgSG93ZXZlciwgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzIG1heSB3YW50IHRvCiAgICAgICAgICB1c2UgdGhpcyBpbiBsYW5ndWFnZSBjb25maWd1cmF0aW9uIGZpbGVzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZyBsaXRlcmFscyBsaWtlCiAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICIkdGFyZ2V0ID0gU3ZJVigkc291cmNlKTsiOwoKICAgICAgICAgIFdoZW4gY29kZSBpcyBzcGVjaWZpZWQgbGlrZSB0aGlzLCBpdCBpcyAqTk9UKiBlbmNsb3NlZAogICAgICAgICAgaW5zaWRlIGEgbG9jYWwgc2NvcGUgKGFzIHdpdGggb2xkZXIgdHlwZW1hcCBkZWNsYXJhdGlvbnMpLgogICAgICAgICAgTm90ZTogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGludGVycHJldGVkIGluIHRoZQogICAgICAgICAgY29kZSBzdHJpbmcgc28gaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHF1b3RlIG9yIHNvbWUKICAgICAgICAgIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVyLCBtYWtlIHN1cmUgeW91IHVzZSBhIChcKS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93IHR5cGVkZWYgZGVjbGFyYXRpb25zLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IE51bWJlcjsKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGludGVnZXIgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2b2lkIGZvbyhOdW1iZXIgYSk7CgogICAgICAgICAgVGhlIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgYXJndW1lbnQgJ051bWJlciBhJy4KICAgICAgICAgIE9mIGNvdXJzZSwgaWYgeW91IHNwZWNpZnkgYSB0eXBlbWFwIGZvciAnTnVtYmVyJyBpdCB3aWxsIHRha2UKICAgICAgICAgIHByZWNlZGVuY2UgKG5vciB3aWxsIGl0IGV2ZXIgYmUgYXBwbGllZCB0byBhbiAnaW50JykuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWZhdWx0IHR5cGVtYXAgc3BlY2lmaWNhdGlvbiBoYXMgY2hhbmdlZC4gICBJbiBvbGRlcgogICAgICAgICAgdmVyc2lvbnMgb2Ygc3dpZywgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgVG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBhIGRhdGF0eXBlLiAgIE5vdyB0aGF0CiAgICAgICAgICBTV0lHIGZvbGxvd3MgdHlwZWRlZiBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICBTaW1wbHkgc3BlY2lmeWluZyBhIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgd29yayBmb3IgYWxsCiAgICAgICAgICB2YXJpYXRpb25zIG9mIGludGVnZXJzIHRoYXQgYXJlIHR5cGVkZWYnZCB0byAnaW50Jy4KCiAgICAgICAgICBDYXZlYXQsIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHBvaW50ZXJzLAogICAgICAgICAgcmVmZXJlbmNlcywgYXJyYXlzLCBhbmQgdXNlciBkZWZpbmVkIHR5cGVzIGlzIGEgbGl0dGxlCiAgICAgICAgICBkaWZmZXJlbnQuICBUaGlzIG11c3QgYmUgZG9uZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUE9JTlRFUiAqIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUkVGRVJFTkNFICYgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR0FSUkFZIFtdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHVzZXItZGVmaW5lZCB0eXBlIChieSB2YWx1ZSkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGR1c3RpbgogICAgICAgICAgVGhlIGZpbGUgc3dpZy0xLjNhMS0xLnNwZWMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFRvb2xzIGRpcmVjdG9yeS4KICAgICAgICAgIEl0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgcmVkaGF0IHBhY2thZ2UgZm9yIFNXSUcsIGFsdGhvdWdoIGl0CiAgICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgdGhlIG5leHQgcHVibGljIHJlbGVhc2UuCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuLiAgRXZlbnR1YWxseSB0aGV5IG1heSBiZQogICAgICAgICAgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgYmV0dGVyLCBidXQgZm9yIG5vdyB0aGV5IHN0YXkuICBIb3dldmVyLAogICAgICAgICAgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGEgc2lnbmlmaWNhbnQgY2hhbmdlcyB0aGF0IG1heSB0cmlwIHNvbWUKICAgICAgICAgIHBlb3BsZSB1cDoKCiAgICAgICAgICAxLiAgVHlwZW1hcCBzY29waW5nIGlzIGN1cnJlbnRseSBicm9rZW4uICBCZWNhdXNlIG9mIHRoaXMsIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIHdvbid0IHdvcmsuCgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICogewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGludCBiYXIoYmxhaCAqeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICo7ICAgLyogQ2xlYXIgdHlwZW1hcCAqLwoKICAgICAgICAgICAgICAodGhpcyBicmVha3MgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhlIGNsYXNzIEZvbyBpcyBhY3R1YWxseQogICAgICAgICAgICAgIGdlbmVyYXRlZCBhZnRlciB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCkuCiAgICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IGJ1Zy4KCiAgICAgICAgICAyLiAgSW4gU1dJRzEuMSwgdGhlICVhcHBseSBkaXJlY3RpdmUgd29ya2VkIGJ5IHBlcmZvcm1pbmcgYQogICAgICAgICAgICAgIHZlcnkgY29tcGxleCB0eXBlLWFsaWFzaW5nIHByb2NlZHVyZS4gIEZyb20gdGhpcyBwb2ludCBvbiwKICAgICAgICAgICAgICAlYXBwbHkgaXMgc2ltcGx5IGEgZ2VuZXJhbGl6ZWQgdHlwZW1hcCBjb3B5IG9wZXJhdGlvbi4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCwgZG91YmxlICp5IH07CgogICAgICAgICAgICAgIENvcGllcyAqQUxMKiBjdXJyZW50bHkgZGVmaW5lZCB0eXBlbWFwcyBmb3IgJ2RvdWJsZSAqT1VUUFVUJyBhbmQKICAgICAgICAgICAgICBjb3BpZXMgdGhlbSB0byAnZG91YmxlICp4JyBhbmQgJ2RvdWJsZSAqeScuCgogICAgICAgICAgICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IHdvbid0IGV2ZW4gbm90aWNlIHRoaXMgY2hhbmdlIGluCiAgICAgICAgICAgICAgJWFwcGx5LiAgSG93ZXZlciwgd2hlcmUgaXQgd2lsbCBicmVhayB0aGluZ3MgaXMgaW4gY29kZSBsaWtlCiAgICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCB9OwogICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICpPVVRQVVQgewogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICp4KTsKCiAgICAgICAgICAgICAgSW4gU1dJRzEuMSwgeW91IHdpbGwgZmluZCB0aGF0ICdmb28nIHVzZXMgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZQogICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlICh0aGlzIGlzCiAgICAgICAgICAgICAgdGhlIHdlaXJkIGFsaWFzaW5nIHNjaGVtZSBhdCB3b3JrKS4gIEluIFNXSUcxLjMgYW5kIGxhdGVyLAogICAgICAgICAgICAgIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUgaXMgaWdub3JlZCBiZWNhdXNlIGl0IGlzIGRlZmluZWQKICAgICAgICAgICAgICBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICAzLiAgVGhlICVjbGVhciBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXJhc2UgYWxsIGN1cnJlbnRseQogICAgICAgICAgICAgIGRlZmluZWQgdHlwZW1hcHMgZm9yIGEgcGFydGljdWxhciB0eXBlLiAgVGhpcyBkaWZmZXJzIGZyb20KICAgICAgICAgICAgICBTV0lHMS4xIHdoZXJlICVjbGVhciBvbmx5IHJlbW92ZWQgcnVsZXMgdGhhdCB3ZXJlIGFkZGVkIHVzaW5nCiAgICAgICAgICAgICAgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgNC4gIFR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCB1c2luZyAqZXhhY3QqIHR5cGVzLgogICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7IH0KICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICogeyB9CgogICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQgdHlwZW1hcHMuICAgIEEgc2ltaWxhciBydWxlIGFwcGxpZXMgZm9yIHBvaW50ZXJzLAogICAgICAgICAgICAgIGFycmF5cywgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogeyB9CgogICAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgdG8gJ2RvdWJsZSAmJywgJ2RvdWJsZSBbXScsICBOb3csIGl0IG9ubHkgYXBwbGllcwogICAgICAgICAgICAgIHRvICdkb3VibGUgKicuICBJZiB5b3Ugd2FudCBhICdkb3VibGUgJicsIHlvdSdsbCBuZWVkIHRvIGhhbmRsZQogICAgICAgICAgICAgIHRoYXQgc2VwYXJhdGVseS4KCiAgICAgICAgICA1LiAgQXJyYXkgbWF0Y2hpbmcgaGFzIGJlZW4gc2ltcGxmaWVkLiAgSW4gU1dJRzEuMSwgYXJyYXkgbWF0Y2hpbmcKICAgICAgICAgICAgICB3YXMgcGVyZm9ybWVkIGJ5IHRyeWluZyB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLCAnZG91YmxlIGFbMTBdWzIwXScgd2FzIG1hdGNoZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdW0FOWV0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgICAgIEluIFNXSUcxLjMsIG9ubHkgdGhlIGZvbGxvd2luZyBtYXRjaGVzIGFyZSBhdHRlbXB0ZWQ6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgIE9uIHRoZSBwb3NpdGl2ZSBzaWRlLCB0eXBlbWFwIG1hdGNoaW5nIGlzIG5vdyAqc2lnbmlmaWNhbnRseSogZmFzdGVyCiAgICAgICAgICB0aGFuIGJlZm9yZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFNlY3JldCBkZXZlbG9wZXIgZmVhdHVyZS4gIFNpbmNlIGRhdGF0eXBlcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIAogICAgICAgICAgc3RyaW5ncyBpbnRlcm5hbGx5LCB5b3UgY2FuIGJ5cGFzcyBsaW1pdGF0aW9ucyBvZiB0aGUgcGFyc2VyIGFuZAogICAgICAgICAgY3JlYXRlIGEgd2lsZCBkYXRhdHlwZSBieSBzaW1wbHkgZW5jbG9zaW5nIHRoZSByYXcgc3RyaW5nIGVuY29kaW5nCiAgICAgICAgICBpbiBiYWNrdGlja3MgKGBgKSBhbmQgc3RpY2tpbmcgaXQgaW4gdGhlIGludGVyZmFjZSBmaWxlIGFueXdoZXJlIGEKICAgICAgICAgIHR5cGUgaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSwgYGEoMjApLmEoMTApLnAuZihpbnQsaW50KWAuICBUaGlzIAogICAgICAgICAgZmVhdHVyZSBpcyBvbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nIChpLmUuLCB5b3Ugd2FudCB0byBzZWUgd2hhdAogICAgICAgICAgaGFwcGVucyB0byB5b3VyIGxhbmd1YWdlIG1vZHVsZSBpZiBpdCBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgcG9pbnRlcgogICAgICAgICAgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9yIHNvbWV0aGluZykuIAogICAgICAgICAgKioqIFNJQ0sgSEFDSyAqKioKCjgvMTQvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IG5ldyB0eXBlLXN5c3RlbSBhZGRlZCB0byB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICBNb3JlIGRldGFpbHMgbGF0ZXIuCgo4LzExLzAwIDogYmVhemxleQogICAgICAgICAgQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBJL08gaGFuZGxpbmcuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMKICAgICAgICAgIGFueSB0ZW1wb3JhcnkgZmlsZXMgc3VjaCBhcyBfd3JhcC53cmFwLCBfd3JhcC5paSwgX3dyYXAuaW5pdC4KICAgICAgICAgIEluc3RlYWQsIHRoZXNlICJmaWxlcyIgYXJlIGtlcHQgYXJvdW5kIGluIG1lbW9yeSBhcyBzdHJpbmdzCiAgICAgICAgICAoYWx0aG91Z2ggdGhpcyBpcyB0cmFuc3BhcmVudCB0byBsYW5ndWFnZSBtb2R1bGVzKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJjaGVjayIgYW5kIHZhcmlhbnRzLgoJICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgIm1ha2UgY2hlY2siIG9yLCB0byBleHBsaWNpdGx5IHNraXAgYQoJICBsYW5ndWFnZSBMQU5HOiAibWFrZSBza2lwLUxBTkc9dHJ1ZSBjaGVjayIuICBMQU5HIGlzIHNraXBwZWQKCSAgYXV0b21hdGljYWxseSBpZiAuL2NvbmZpZ3VyZSBkZXRlcm1pbmVzIHRoYXQgTEFORyBzdXBwb3J0IGlzCgkgIGluc3VmZmljaWVudC4KCgkgIEN1cnJlbnRseSwgdGhlIGNoZWNrIGlzIGxpbWl0ZWQgdG8gZG9pbmcgdGhlIGVxdWl2YWxlbnQgb2YKCSAgIm1ha2UgYWxsIiBpbiBzb21lIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3Rvcmllcy4gIFRoaXMgc2hvdWxkCgkgIGJlIGV4cGFuZGVkIGJvdGggaG9yaXpvbnRhbGx5IChkaWZmZXJlbnQgdHlwZXMgb2YgdGVzdHMpIGFuZAoJICB2ZXJ0aWNhbGx5IChhZnRlciAibWFrZSBhbGwiIGluIGFuIEV4YW1wbGVzIHN1YmRpciBzdWNjZWVkcywKCSAgZG8gc29tZSBhZGRpdGlvbmFsIHRlc3RzIHdpdGggdGhlIHJlc3VsdGluZyBpbnRlcnByZXRlciwgZXRjKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJkaXN0Y2xlYW4iLCB3aGljaCBkZWxldGVzIGFsbCB0aGUKCSAgZmlsZXMgLi9jb25maWd1cmUgY3JlYXRlcywgaW5jbHVkaW5nIGNvbmZpZy5zdGF0dXMgYW5kIGZyaWVuZHMuCgo4LzMvMDAgIDogaGFyY29oCgkgIGphdmEgY2hhbmdlcz8/PyBbdG9kbzogZG9jdW1lbnQgY2hhbmdlc10KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8ga2V5IG9mZiBvZiB0aGUgcmVhbCBkYXRhdHlwZXMKICAgICAgICAgIHVzZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IHR5cGVtYXBzIGZvcgogICAgICAgICAgImNvbnN0IGNoYXIgKiIgYW5kICJjaGFyICoiIHdpbGwgYmUgZGlmZmVyZW5jZSBhcyB3aWxsIHR5cGVtYXBzCiAgICAgICAgICBmb3IgIlZlY3RvciIgYW5kICJWZWN0b3IgKi4iCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgaXMgbGlrZWx5IHRvIGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWx5IG9uIHRoZSBvZGQgdHlwZQogICAgICAgICAgaGFuZGxpbmcgYmVoYXZpb3Igb2YgdHlwZW1hcHMgaW4gU1dJRzEuMS0tZXNwZWNpYWxseSB3aXRoCiAgICAgICAgICByZXNwZWN0IHRvIGludGVyZmFjZXMgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTmV3ICVjb25zdGFudCBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgY3JlYXRlIHRydWUgY29uc3RhbnRzIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLgogICAgICAgICAgSXQncyBtb3N0IHNpbXBsZSBmb3JtIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWNvbnN0YW50IEZPTyA0MjsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHN5bnRheCBvZiB0aGUKICAgICAgICAgIHZhbHVlIChpbiByZWFsaXR5LCBhbGwgI2RlZmluZSBtYWNyb3MgYXJlIHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgZGlyZWN0aXZlcyBvZiB0aGlzIGZvcm0pLgoKICAgICAgICAgIEFuIGV4cGFuZGVkIHZlcnNpb24gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICVjb25zdGFudChGb28gKikgRk9PID0gJkZvb09iajsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFuIGV4cGxpY2l0IHR5cGUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMKICAgICAgICAgIGxhdHRlciBmb3JtIG1heSBiZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0CiAgICAgICAgICB1c2VkIHRvIGJlIHNwZWNpZmllZCBhcwoKICAgICAgICAgICAgIGNvbnN0IEZvbyAqRk9PID0gJkZvb09iajsKCiAgICAgICAgICAod2hpY2ggYXJlIG5vdyB0cmVhdGVkIGFzIHZhcmlhYmxlcykuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqIFRoZSBzeW50YXggbWF5IGNoYW5nZSBpbgogICAgICAgICAgdGhlIGZpbmFsIHJlbGVhc2UuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciBzbyB0aGF0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybQogICAgICAgICAgImNvbnN0IHR5cGUgKmEiIGFyZSBoYW5kbGVkIGFzIHZhcmlhYmxlcywgbm90IGNvbnN0YW50cy4KICAgICAgICAgIE5vdGU6IFNXSUcxLjEgaGFuZGxlZCB0aGlzIGNhc2UgZXJyb25lb3VzbHkgYmVjYXVzZQogICAgICAgICAgY29uc3QgY2hhciAqYSBpcyBhIHBvaW50ZXIgdmFyaWFibGUgdGhhdCBjYW4gYmUgcmVhc3NpZ25lZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgTm90ZToganVzdCBiZWNhdXNlIHRoaXMgaXMgdGhlICJyaWdodCIgd2F5IHRvIGRvIHRoaW5ncywKICAgICAgICAgIGRvZXNuJ3QgbWVhbiBpdCdzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGludGVycHJldGF0aW9uLgogICAgICAgICAgSSBzdXNwZWN0IHRoYXQgbWFueSBDIHByb2dyYW1tZXJzIG1pZ2h0IHVzZSAnY29uc3QgY2hhciAqJwogICAgICAgICAgd2l0aCB0aGUgaW50ZW50IG9mIGNyZWF0aW5nIGEgY29uc3RhbnQsIHdpdGhvdXQgcmVhbGl6aW5nCiAgICAgICAgICB0aGF0IHRoZXkndmUgY3JlYXRlZCBhIHJlYXNzaWduYWJsZSBnbG9iYWwgdmFyaWFibGUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlIEMvQysrIHdyYXBwaW5nIGxheWVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCBhbmQKICAgICAgICAgIHJlaW1wbGVtZW50ZWQuICBUaGlzIGNoYW5nZSBzaG91bGQgaXJvbiBvdXQgYSBmZXcgcm91Z2gKICAgICAgICAgIHNwb3RzIHdpdGggdGhlIGhhbmRsaW5nIG9mIGRhdGF0eXBlcy4gIEluIGFkZGl0aW9uLCB0aGUKICAgICAgICAgIHdyYXBwZXIgY29kZSBpcyBzb21ld2hhdCBjbGVhbmVyLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IGludm9sdmUKICAgICAgICAgIHN1YnRsZSBjb3JuZXItY2FzZXMgd2l0aCB0eXBlbWFwcyBhbmQgdGhlICVhZGRtZXRob2RzCiAgICAgICAgICBkaXJlY3RpdmUgc2luY2Ugc29tZSBvZiB0aGVzZSBmZWF0dXJlcyBoYWQgc29tZXdoYXQKICAgICAgICAgIHR5cGUgaGFuZGxpbmcgYmVoYXZpb3IgaW4gU1dJRzEuMS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgIm1lbWJlcmluIiBhbmQgIm1lbWJlcm91dCIgdHlwZW1hcHMgYXJlIGdvbmUgZm9yIHRoZQogICAgICAgICAgbW9tZW50LCBidXQgdGhleSBtaWdodCByZXR1cm4gYXMgc29vbiBhcyBJIGZpZ3VyZSBvdXQKICAgICAgICAgIGhvdyB0byBpbnRlZ3JhdGUgdGhlbSB3aXRoIHNvbWUgb2YgdGhlIHN0cmVhbWxpbmVkIEMgd3JhcHBlcgogICAgICAgICAgZnVuY3Rpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIyLzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIG9sZCB0eXBlIGhhbmRsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIHByaW50X3R5cGUoKSwKICAgICAgICAgIHByaW50X2Z1bGwoKSwgcHJpbnRfbWFuZ2xlKCksIGV0Yy4uLiBhcmUgZ29uZSBhbmQgaGF2ZSBiZWVuCiAgICAgICAgICByZXBsYWNlZCB3aXRoIGEgc21hbGxlciBzZXQgb2YgZnVuY3Rpb25zLiAgU2VlIHRoZSBmaWxlCiAgICAgICAgICBEb2MvaW50ZXJuYWxzLmh0bWwgZm9yIGRldGFpbHMuICBUaGlzIHdpbGwgYnJlYWsgYWxsIHRoaXJkCiAgICAgICAgICBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogYmVhemxleQogICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJXZhbCBhbmQgJW91dCBkaXJlY3RpdmVzLiAgVGhlc2UgZGlyZWN0aXZlcwogICAgICAgICAgc2hvdWxkbid0IHJlYWxseSBiZSBuZWNlc3Nhcnkgc2luY2UgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIGFjaGlldmUgc2ltaWxhciByZXN1bHRzLiAgIFRoaXMgYWxzbyBjbGVhbnMgdXAgdGhlCiAgICAgICAgICBoYW5kbGluZyBvZiB0eXBlcyBhbmQgcGFyYW1ldGVycyBxdWl0ZSBhIGJpdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IHR0bgoJICBGaXhlZCB1bnNwZWNpZmllZC1tb2R1bGUgYnVnIGluIEd1aWxlIHN1cHBvcnQgYW5kIHJlbW92ZWQKCSAgbW9yZSBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcGF0Y2hlcyBzdWJtaXR0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKCSAgUmUtZW5hYmxlIHJlY29nbml0aW9uIG9mICItd2l0aC1zbW9icyIgKHdpdGggbm8gZWZmZWN0IHNpbmNlCgkgIHdlIHVzZSBzbW9icyBieSBkZWZhdWx0IG5vdykgZm9yIHRoZSB0aW1lIGJlaW5nLiAgQWZ0ZXIgdGhlCgkgIDEuM2E0IHJlbGVhc2UsIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmFsIGFuIGVycm9yLgoKNy8xNy8wMCA6IHR0bgoJICBGaXhlZCBOVUxMLWlucHV0IGJ1ZyBpbiBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZy4KCSAgUmVwb3J0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoKNy8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIG1lbW9yeSBsZWFrIGluIFB5dGhvbiB0eXBlLWNoZWNraW5nIGNvZGUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICBLZWl0aCBEYXZpZHNvbi4gIEJ1ZyAjMTA5Mzc5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZnVuY3Rpb24gcGFyYW1ldGVycy4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaGFuZGxpbmcgb2YgdGhlICVuYW1lKCkgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgY2xhc3NlcyBpbiB0aGUgVGNsIG1vZHVsZS4gUHJvYmxlbSByZXBvcnRlZCBieSBKYW1lcyBCYWlsZXkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcGFyc2luZyBhbmQgZW51bSBoYW5kbGluZyBwcm9ibGVtcyB3aXRoIGNoYXJhY3RlciBjb25zdGFudHMuCiAgICAgICAgICBSZXBvcnRlZCBieSBHcmVnIEtvY2hhbnNraS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIFdyYXBwZXJGdW5jdGlvbiBjbGFzcyBmcm9tIHRoZSBjb3JlIGFuZCB1cGRhdGVkIHRoZSBsYW5ndWFnZQogICAgICAgICAgbW9kdWxlLiAgVGhpcyB3aWxsIGJyZWFrIHRoaXJkIHBhcnR5IG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOS8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBTV0lHIG5vIGxvbmdlciBtYWtlcyB1c2Ugb2YgQysrIG9wZXJhdG9yIG92ZXJsb2FkaW5nLgogICAgICAgICAgVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgKmFsbCogdGhpcmQgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG1haW4gU1dJRyBDVlMgdHJlZS4gU29ycnkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOC8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBleHBlcmltZW50YWwgYW5kIHVuZG9jdW1lbnRlZCAiYnVpbGQiIHR5cGVtYXAgdGhhdAogICAgICAgICAgd2FzIGludGVuZGVkIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMuIFNpbXBseSB0b28gd2VpcmQKICAgICAgICAgIHRvIGtlZXAgYXJvdW5kLiAgQmVzaWRlcywgYSBiZXR0ZXIgcmVwbGFjZW1lbnQgaXMgaW4gdGhlIHdvcmtzLgoKNy82LzAwICA6IHR0bgogICAgICAgICAgUmVtb3ZlZCBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgKEd1aWxlIHN1cHBvcnQpLCBpLmUuLAogICAgICAgICAgIi13aXRoLXNtb2JzIiBpcyBub3cgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlciBuZWVkcyB0byBiZQoJICBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KCjcvNS8wMCAgOiB0dG4KICAgICAgICAgIEluY29ycG9yYXRlZCBSdWJ5IHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWFzYWtpIEZ1a3VzaGltYS4KCjYvMjgvMDAgOiB0dG4KICAgICAgICAgIEFwcGxpZWQgbW9yZS10aGFuLTEwLWFyZ3MgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjYvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXdyb3RlIHNvbWUgb2YgdGhlIHN0cmluZyBoYW5kbGluZyBhbmQgZWxpbWluYXRlZCB0aGUgQysrCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAod2hpY2ggaXMgbm93IGp1c3QgYSB3cmFwcGVyKS4KCjYvMjcvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIERvYy9pbmRleC5odG1sIGFuZCBEb2MvaW50ZXJuYWxzLmh0bWwuICBUaGUgdGFyZ2V0CiAgICAgICAgICBhdWRpZW5jZSBmb3IgdGhlIGxhdHRlciBpcyBuZXcgU1dJRyBkZXZlbG9wZXJzLgoKClZlcnNpb24gMS4zIEFscGhhIDMgKEp1bmUgMTgsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzE4LzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgbmFtaW5nLmN4eCwgaGFzaC5jeHgsIGFuZCBzeW1ib2wuY3h4IGZpbGVzIGZyb20KICAgICAgICAgIHRoZSBTV0lHMS4xIGRpcmVjdG9yeS4gICBDb250aW51ZWQgdG8gbWlncmF0ZSB0aGluZ3MgYXdheQogICAgICAgICAgZnJvbSB0aGUgQysrIGJhc2UgKGFsdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBkbykuCgo2LzE3LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBmZXcgbW9yZSBleGFtcGxlcyB0byB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5LiAgU3RpbGwKICAgICAgICAgIG5lZWQgdG8gZG8gYSBsb3Qgb2Ygd29yayBvbiB0aGlzLgoKNi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1pbmNsdWRlYWxsIHRvIGZvbGxvdyBhbGwgI2luY2x1ZGUgc3RhdGVtZW50cyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjYvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUcmllZCB0byBmaXggYXMgbWFueSBDKysgd2FybmluZ3MgYXMgcG9zc2libGUgd2hlbiBjb21waWxpbmcKICAgICAgICAgIHdpdGggdGhlIFN1biBXb3Jrc2hvcCBDKysgY29tcGlsZXIuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCiAgICAgICAgICB0aGF0IHRoZXJlIGFyZSBhIGxvdCBvZiBzdGF0ZW1lbnRzIHRoYXQgY29udGFpbiBzdHJpbmcgbGl0ZXJhbHMKICAgICAgICAgIG9mIHRoZSBmb3JtIChjaGFyKikiQmxhaCIuCgo2LzE1LzAwOiAgYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIGNsZWFudXAgYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBpbiB0aGUKICAgICAgICAgIGxvdy1sZXZlbCBET0ggbGlicmFyeS4gICBUaGlzIHNlZW1zIHRvIHJlc3VsdCBpbiBhIHNwZWVkdXAKICAgICAgICAgIG9mIDUwLTEwMCUgZm9yIHByZXByb2Nlc3NpbmcgYW5kIG90aGVyIHJlbGF0ZWQgdGFza3MuCgo1LzEwLzAwIDogdHRuCgkgIEFwcGxpZWQgdmFyaWFibGUtd3JhcHBpbmcgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjQvMTcvMDAgOiB0dG4KCSAgVXBkYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBXZSBub3cgdXNlIGEgYFNjaGVtZV9UeXBlJy1iYXNlZCBzdHJ1Y3R1cmUgdG8gd3JhcCBwb2ludGVycy4KCjQvMTEvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIGZ1cnRoZXIgR3VpbGUtc3VwcG9ydCBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFR5cGVtYXBzIHByZXZpb3VzbHkgZGVsZXRlZCBoYXZlIGJlZW4gcmUtYWRkZWQuICBUaGVyZSBpcyBub3cKCSAgZXhjZXB0aW9uIGhhbmRsaW5nIChzZWUgRG9jL2VuZ2luZWVyaW5nLmh0bWwpLiAgYFNXSUdfaW5pdCcgaXMgbm93CgkgIGRlY2xhcmVkIGV4dGVybiBvbmx5IGZvciBzaW1wbGUgbGlua2FnZS4gIFNvbWUgYnVncyB3ZXJlIGZpeGVkLgoKNC8wNi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgVGhpcyBpbmNsdWRlcyBuZXcgZGlyZWN0b3JpZXMgTGliL216c2NoZW1lIGFuZCBFeGFtcGxlcy9tenNjaGVtZS4KCjQvMDMvMDAgOiB0dG4KCSAgQWRkZWQgRXhhbXBsZXMvZ3VpbGUgYW5kIGNoaWxkcmVuLiAgVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mCgkgIHRoZSBzYW1lLW5hbWVkIGRpcmVjdG9yeSBmcm9tIHRoZSBTV0lHLTEuMXA1IGRpc3RyaWJ1dGlvbi4KCSAgQWRkZWQgR3VpbGUtc3BlY2lmaWMgc2VjdGlvbiB0byBEb2MvZW5naW5lZXJpbmcuaHRtbC4KCjQvMDIvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIG5ldyBndWlsZW1haW4uaSBieSBNYXJ0aW4gRnJvZWhsaWNoLgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUtc3VwcG9ydCByZXdyaXRlIHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi13aXRoLXNtb2JzIiBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mCgkgIHBvaW50ZXIgdHlwZSBoYW5kbGluZyB1c2luZyBzbW9icywgdGhlIGNhbm9uaWNhbCBtZWNoYW5pc20gZm9yCgkgIGRlZmluaW5nIG5ldyB0eXBlcyBpbiBHdWlsZS4gIFByZXZpb3VzIGltcGxlbWVudGF0aW9uICh1c2luZwoJICBzdHJpbmdzKSBpcyBhdCB0aGUgbW9tZW50IHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4gIEF0CgkgIHNvbWUgcG9pbnQsICItd2l0aC1zbW9icyIgd2lsbCBiZSB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyCgkgIHJlcXVpcmVkLgoKMy8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHB1cmlmeSBwYXRjaGVzIHN1Ym1pdHRlZCBieSBSYW0gQmhhbWlkaXBhdHkuCgozLzAyLzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgR3VpbGUgImxpbmthZ2UiIHNjaGVtZXMuCgkgIEN1cnJlbnRseSwgIi1MaW5rYWdlIGhvYmJpdCIgd29ya3MuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMiAoTWFyY2ggMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNYWRlIFNXSUcgaWdub3JlIHRoZSAnbXV0YWJsZScga2V5d29yZC4KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgc29tZSBwYXRjaGVzIHRvIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0bwogICAgICAgICAgdGhlIC1oaWRlIG9wdGlvbiBhbmQgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgS2FybCBGb3JuZXIuCgoyLzI3LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhpcyBpbmNsdWRlcyBhIGNwcCBtYWNybyBpbiBMaWIvZ3VpbGUvZ3VpbGUuc3dnIGFuZCB0aGUKCSAgZW50aXJlIGZpbGUgTGliL2d1aWxlL3R5cGVtYXBzLmkuCgoyLzI1LzAwIDogdHRuCgkgIE1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBhbmQgTWFrZWZpbGUuaW4gZmlsZXMgdG8gc3VwcG9ydAoJICBub24tbG9jYWwgYnVpbGQgKHVzZWZ1bCBpbiBtdWx0aS1hcmNoIGVudmlyb25tZW50cykuCgoyLzI0LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IENsYXJrIE1jR3Jldy4KCSAgVGhpcyB3b3JrcyB3aXRoIEd1aWxlIDEuMywgYnV0IHNpbmNlIGl0IGRlcGVuZHMgaGVhdmlseQoJICBvbiB0aGUgZ2hfIGludGVyZmFjZSwgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCBsYXRlciB2ZXJzaW9ucy4KCSAgSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjMuCgkgIFdBUk5JTkc6IENvZGUgaXMgdW5zdGFibGUgZHVlIHRvIGV4cGVyaW1lbnRhdGlvbiBieSB0dG4uCgoyLzE2LzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgTWFueSBvZiB0aGVzZSByZXN1bHQgaW4gc3Vic3RhbnRpYWwKICAgICAgICAgIHJ1bnRpbWUgcGVyZm9ybWFuY2UgZ2FpbnMuICBIb3dldmVyLCB0aGVzZSBoYXZlIGNvbWUgYXQKICAgICAgICAgIGEgY29zdCBvZiByZXF1aXJpbmcgdGhlIHVzZSBvZiBQeXRob24gMS41LjIuICBGb3Igb2xkZXIKICAgICAgICAgIHZlcnNpb25zLCB1c2UgJ3N3aWcgLW5vb3B0IC1weXRob24nIHRvIHR1cm4gb2ZmIHRoZXNlCiAgICAgICAgICBvcHRpbWl6YXRpb24gZmVhdHVyZXMuCgpWZXJzaW9uIDEuMyBBbHBoYSAxIChGZWJydWFyeSAxMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzExLzAwIDogQWRkZWQgJ3ZvaWQnIHRvIHByb3RvdHlwZSBvZiBQeXRob24gbW9kdWxlIGluaXRpYWxpemVyLgogICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyayBIb3dzb24gKDEvMjAvMDApLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUgdG8gZGlzY2FyZCBvd25lcnNoaXAgb2YgYW4KICAgICAgICAgIG9iamVjdCB3aGVuZXZlciBpdCBpcyBhc3NpZ25lZCB0byBhIG1lbWJlciBvZiBhbm90aGVyIG9iamVjdC4KICAgICAgICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBhcm91bmQgZm9yIGF3aGlsZSwgYnV0IHdhcyBtb3N0IHJlY2VudGx5CiAgICAgICAgICByZXBvcnRlZCBieSBCdXJraGFyZCBLbG9zcyAoMTIvMzAvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGJyYWNlcyBhcm91bmQgbWFjcm9zIGluIHRoZSBleGNlcHRpb24uaSBsaWJyYXJ5LiAgUmVwb3J0ZWQKICAgICAgICAgIGJ5IEJ1Y2sgSG9kZ2VzICgxMi8xOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBidWcgaW4gdGhlIGNvbnN0cmFpbnRzLmkgbGlicmFyeS4gUmVwb3J0ZWQgYnkgQnVjawogICAgICAgICAgSG9kZ2VzICgxMi8xNC85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgJW5hdGl2ZSBkaXJlY3RpdmUgbm93IGdlbmVyYXRlcyBUY2w4IG9iamVjdC1zdHlsZSBjb21tYW5kIGNhbGxzLgogICAgICAgICAgQSBmdWxsIHNvbHV0aW9uIGZvciBUY2w3IGFuZCBUY2w4IGlzIHN0aWxsIG5lZWRlZC4gUGF0Y2ggc3VnZ2VzdGVkCiAgICAgICAgICBieSBNaWtlIFdlaWJsZW4gKDExLzI5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIGNvZGUgdG8gaW5jbHVkZSB0aGUgJG5kaW0gdmFyaWFibGUgZm9yIGFycmF5cy4KICAgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IE1pY2hlbCBTYW5uZXIgKDExLzEyLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byByYWlzZSBhIFJ1bnRpbWUgZXJyb3IgaWYgYW4gYXR0ZW1wdAogICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSByZWFkLW9ubHkgbWVtYmVyIG9mIGEgc2hhZG93IGNsYXNzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgIE1pY2hlbCBTYW5uZXIgKDExLzUvOTkpLgoKMi8xMC8wMCA6IFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiByZW1vdmVkLiBIb3dldmVyLCBpdCBpcyBsaWtlbHkKICAgICAgICAgIHRvIHJldHVybiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCgoyLzEvMDAgIDogQWRkZWQgYSBudW1iZXIgb2YgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2luZyBhbmQgdHlwZS1jaGVja2luZyBjb2RlLiAgQ29udHJpYnV0ZWQgYnkgVmFkaW0gQ2h1Z3Vub3YuCgogICAgICAgICAgMS4gUmVtb3ZlIF9rd2FyZ3MgYXJndW1lbnQgZnJvbSB0aGUgc2hhZG93IHdyYXBwZXJzIHdoZW4gLWtleXdvcmQKICAgICAgICAgICAgIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGlzIHNhdmVzIHVzIGEgY29uc3RydWN0aW9uIG9mIGtleXdvcmQKICAgICAgICAgICAgIGRpY3Rpb25hcnkgb24gZWFjaCBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MsICoqX2t3YXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncywgX2t3YXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMi4gSW5jb3Jwb3JhdGUgc2VsZiBpbnRvIHRoZSBfYXJncyB0dXBsZS4gIFRoaXMgc2F2ZXMgYXQgbGVhc3Qgb25lIHR1cGxlCiAgICAgICAgICAgICBhbGxvY2F0aW9uIHBlciBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMSgqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMy4gUmVtb3ZlICpQdHIgY2xhc3Nlcy4KICAgICAgICAgICAgIEFzc3VtZSB0aGF0IHdlIGFyZSBTV0lHZ2luZyBhIGMrKyBjbGFzcyBDcHBDbGFzcy4KICAgICAgICAgICAgIEN1cnJlbnRseSBTV0lHIHdpbGwgZ2VuZXJhdGUgYm90aCBDcHBDbGFzc1B0ciBjbGFzcwogICAgICAgICAgICAgdGhhdCBob3N0cyBhbGwgbWV0aG9kcyBhbmQgYWxzbyBDcHBDbGFzcyB0aGF0IGlzIGRlcml2ZWQKICAgICAgICAgICAgIGZyb20gdGhlIGZvcm1lciBhbmQgY29udGFpbnMganVzdCB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICAgICBXaGVuIENwcENsYXNzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIHRyeQogICAgICAgICAgICAgdG8gZmluZCBpdCBpbiB0aGUgQ3BwQ2xhc3MncyBkaWN0aW9uYXJ5IGZpcnN0LCBhbmQgb25seSB0aGVuCiAgICAgICAgICAgICBjaGVjayB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICBDcHBDbGFzc1B0ciBmdW5jdGlvbmFsaXR5IG1heSBiZSBlbXVsYXRlZCB3aXRoOgoKICAgICAgICAgICAgIGltcG9ydCBuZXcKICAgICAgICAgICAgIF9uZXdfaW5zdGFuY2UgPSBuZXcuaW5zdGFuY2UKICAgICAgICAgICAgIGRlZiBDcHBDbGFzc1B0cih0aGlzKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdfaW5zdGFuY2UoQ3BwQ2xhc3MsIHsidGhpcyI6dGhpcywidGhpc293biI6MH0pCgogICAgICAgICAgICAgVGhpcyBzYXZlcyB1cyBvbmUgZGljdGlvbmFyeSBsb29rdXAgcGVyIGNhbGwuCgogICAgICAgICAgICAgPERCPlRoZSBuZXcgbW9kdWxlIHdhcyBmaXJzdCBhZGRlZCBpbiBQeXRob24tMS41LjIgc28gaXQKICAgICAgICAgICAgIHdvbid0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucy4gIEkndmUgaW1wbGVtZW50ZWQgYW4KICAgICAgICAgICAgIGFsdGVybmF0aXZlIHRoYXQgYWNoaWV2ZXMgdGhlIHNhbWUgdGhpbmc8L0RCPgoKICAgICAgICAgIDQuIFVzZSBDT2JqZWN0cyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIHBvaW50ZXJzLgoKICAgICAgICAgIERhdmU6IFRoaXMgZW5oYW5jZW1lbnRzIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiB1cCB0byA1MCUgaW4gc29tZQogICAgICAgICAgb2YgdGhlIHByZWxpbWluYXJ5IHRlc3RzIEkgcmFuLgoKMi8xLzAwICA6IFVwZ3JhZGVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHVzZSBhIG5ldyB0eXBlLWNoZWNraW5nIHNjaGVtZSB0aGF0CiAgICAgICAgICBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSwgYW5kCiAgICAgICAgICBpcyBsZXNzIGVycm9yIHByb25lLiBVbmZvcnR1bmF0ZWx5LCBpdCB3aWxsIGJyZWFrIGFsbCBjb2RlIHRoYXQKICAgICAgICAgIGRlcGVuZHMgb24gdGhlIFNXSUdfR2V0UHRyKCkgZnVuY3Rpb24gY2FsbCBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0dldFB0cihzdHJpbmcsJnB0ciwiX0Zvb19wIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihweW9iaiwgJnB0ciwgU1dJR19UWVBFX0Zvb19wKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdGU6IEluIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gU1dJR19UWVBFX0Zvb19wIGlzIG5vIGxvbmdlcgogICAgICAgICAgYSB0eXBlLXNpZ25hdHVyZSBzdHJpbmcsIGJ1dCByYXRoZXIgYW4gaW5kZXggaW50byBhIHR5cGUKICAgICAgICAgIGVuY29kaW5nIHRhYmxlIHRoYXQgY29udGFpbnMgdHlwZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8zMC8wMCA6IGxvaWMKCSAgQ29uZGl0aW9uYWx5IGNvbXBpbGUgZXhwZXJpbWVudGFsIGNvZGUgd2l0aCAtLWVuYWJsZS1leHBlcmltZW50CgkgIGNvbmZpZ3VyZSBmbGFnLgoJICBGaXggLmN2c2lnbm9yZSB0byBpZ25vcmUgY29uZmlncnVlICYgeWFjYyBnZW5lcmF0ZWQgZmlsZXMKCjEvMjgvMDAgOiBsb2ljCgkgIEFwcGx5IGF1dG9tYWtlIGV2ZXJ5d2hlcmUKCSAgS2VlcCBjb25maWd1cmUgc2NyaXB0cyBzbyB0aGF0IHBlb3BsZSBhcmUgbm90ICpmb3JjZWQqIHRvIGF1dG9jb25mCiAgICAgICAgICBLZWVwIHNvdXJjZXMgZ2VuZXJhdGVkIGJ5IHlhY2Mgc28gdGhhdCBjb21waWxhdGlvbiB3aXRob3V0IHlhY2MKCSAgaXMgcG9zc2libGUuCgkgIFNvdXJjZS9MUGFyc2UvY3NjYW5uZXIuYzogY2hhbmdlIGx5YWNjLmggaW50byBwYXJzZXIuaCB0byBwbGVhc2UKCSAgZGVmYXVsdCB5YWNjIGdlbmVyYXRpb24gcnVsZXMuCgkgIFVzZSBBQ19DT05GSUdfU1VCRElSUyBpbiBjb25maWd1cmUuaW4gaW5zdGVhZCBvZiBoYW5kIG1hZGUgc2NyaXB0LgoJICBVcGRhdGUgYWxsIHJlbGV2YW50IC5jdnNpZ25vcmUgdG8gaW5jbHVkZSAuZGVwcwoJICBGaXhlZCBtaXNzaW5nIDsgbGluZSAxMzYgU291cmNlL1N3aWcvc3dpZy5oCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBudW1iZXIgb2YgbWlub3IgZW5kLW9mLWZpbGUgcGFyc2luZyBwcm9ibGVtcyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtZnJlZXplIG9wdGlvbiB0aGF0IGZvcmNlcyBTV0lHIHRvIGZyZWV6ZSB1cG9uIGV4aXQuCiAgICAgICAgICBUaGlzIGlzIG9ubHkgdXNlZCBhcyBhIGRlYnVnZ2luZyB0b29sIHNvIHRoYXQgSSBjYW4gbW9yZQogICAgICAgICAgZWFzaWx5IGV4YW1pbmUgU1dJRydzIG1lbW9yeSBmb290cHJpbnQuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gZ3VpbGUgbW9kdWxlIGZvciBzdXBwb3J0aW5nIG9wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGlldGVyIEJhcm9uLgoKMS8xMy8wMCA6IGxvaWMKCSAgQWRkZWQgLmN2c2lnbm9yZSwgRXhhbXBsZXMvLmN2c2lnbm9yZSwgU291cmNlL0RPSC9Eb2gvLmN2c2lnbm9yZQoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogRml4ZWQgLUkgaGFuZGxpbmcgYnVnCgkgIFNvdXJjZS9Nb2R1bGVzMS4xL2phdmEuY3h4OiBmaXhlZCBjaGFyKiAtPiBjb25zdCBjaGFyKiB3YXJuaW5ncyB0aGF0IGFyZQoJICBlcnJvcnMgd2hlbiBjb21waWxpbmcgd2l0aCBnY2MtMi45NS4yCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBjYXN0IGNvbnN0IGNoYXIqIHRvIGNoYXIqIGZvciBTdHJpbmdfcmVwbGFjZQoJICB0b2tlbiBhbmQgcmVwIHNob3VsZCByZWFsbHkgYmUgY29uc3QuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgSGFyY28ncyBKYXZhIG1vZHVsZXMuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmV2b2tlZCB0aGUgJWlmZGVmLCAlaWZuZGVmLCAlZW5kaWYsICVpZiwgJWVsaWYsIGFuZCAlZWxzZQogICAgICAgICAgZGlyZWN0aXZlcy4gIFRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkIGFzIFNXSUcgbm93IGhhcyBhIHJlYWwKICAgICAgICAgIHByZXByb2Nlc3Nvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vdmVkIHRoZSBkb2N1bWVudGF0aW9uIG1vZHVsZXMgZnJvbSB0aGUgU1dJRyBkaXJlY3RvcnkKICAgICAgICAgIHRvIHRoZSBNb2R1bGVzIGRpcmVjdG9yeSAod2hlcmUgdGhleSByZWFsbHkgc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgdG8gYmVnaW4gd2l0aCkuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXN0YXQgb3B0aW9uIGZvciBwcmludGluZyBzdGF0aXN0aWNzLiBUaGUKICAgICAgICAgIHN0YXRpc3RpY3MgcmVwb3J0aW5nIHdhcyBpbmFkZXF1YXRlIGFuZCBtb3N0bHkgYnJva2VuCiAgICAgICAgICBhbnl3YXkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtdCBvcHRpb24gZm9yIHJlYWRpbmcgYSB0eXBlbWFwIGZpbGUuICBNb3JlCiAgICAgICAgICB0cm91YmxlIHRoYW4gaXQncyB3b3J0aC4gIEp1c3QgaW5jbHVkZSB0eXBlbWFwcyBhdCB0aGUgdG9wCiAgICAgICAgICBvZiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAlY2hlY2tvdXQgZGlyZWN0aXZlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLWNpIG9wdGlvbiBmb3IgZmlsZSBjaGVja2luLiAgIFRvbyBwcm9ibGVtYXRpYwogICAgICAgICAgdG8gaW1wbGVtZW50LiAgUHJvYmFibHkgYmV0dGVyIHRvIGp1c3QgcHV0IHlvdXIgU1dJRyBsaWJyYXJ5CiAgICAgICAgICB1bmRlciBDVlMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWxldGVkIHRoZSBMQVRFWCBtb2R1bGUuICBTb3JyeS4uLiBEaWRuJ3Qga25vdyBhbnlvbmUKICAgICAgICAgIHdobyB3YXMgdXNpbmcgaXQuICBCZXNpZGVzLCBJJ20gbG9va2luZyB0byBzaW1wbGlmeQogICAgICAgICAgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24gbW9kdWxlIHRvIHVzZSBhIC50eHQKICAgICAgICAgIHN1ZmZpeCBmb3IgaXRzIG91dHB1dCBmaWxlIGluc3RlYWQgb2YgLmRvYy4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCB0aGUgbG9uZy1sb3N0IFNXSUcgcHJlcHJvY2Vzc29yIGJhY2sgdG8gdGhlIHN5c3RlbS4KICAgICAgICAgIEl0IHNob3VsZCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBSYXcgcHJlcHJvY2Vzc2VkIG91dHB1dAogICAgICAgICAgY2FuIGJlIHZpZXdlZCB1c2luZyBzd2lnIC1FIGZpbGUuaS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5IGFuZCBkam1pdGNoZQogICAgICAgICAgQ29tcGxldGVseSByZW9yZ2FuaXplZCB0aGUgU1dJRyBkaXJlY3Rvcnkgc3RydWN0dXJlLiAgVGhlCiAgICAgICAgICBiYXNpYyBvcmdhbml6YXRpb24gaXMgbm93OgoKICAgICAgICAgICAgICAgIFNvdXJjZS8gICAgICAgICBTV0lHIHNvdXJjZSBjb2RlCiAgICAgICAgICAgICAgICBMaWIvICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIChzd2lnX2xpYikKICAgICAgICAgICAgICAgIERvYy8gICAgICAgICAgICBEb2N1bWVudGF0aW9uCiAgICAgICAgICAgICAgICBFeGFtcGxlcy8gICAgICAgRXhhbXBsZXMKCiAgICAgICAgICBNb3JlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYWRkZWQgYXMgbmVlZGVkLgoKMTIvMDgvOTk6IExvaWMgRGFjaGFyeSAobG9pY0BzZW5nYS5vcmcpCgkgIEVuaGFuY2VkIHBhY2thZ2UgaGFuZGxpbmcgZm9yIHBlcmw1IGFuZCBjKysuCgoJICBXaXRoIG5ldyBvcHRpb24gLWhpZGUgRm9vOjpCYXIsIGV2ZXJ5IHBlcmw1IG9iamVjdCAoRnJvYikgaXMKCSAgcXVhbGlmaWVkIGJ5IEZvbzo6QmFyOjpGcm9iLiBUaGUgcGFja2FnZSBuYW1lIGlzIHNvbGVseSB1c2VkCgkgIHRvIGVuY2Fwc3VsYXRlIEMvQysrIHdyYXBwZXJzIG91dHB1dCBpbiA8bW9kdWxlPl93cmFwLmMgYW5kIHRoZQoJICBjb3JyZXNwb25kaW5nIHBlcmwgcGFja2FnZSBpbiA8bW9kdWxlPi5wbS4gTm90ZSB0aGF0IGEgcGFja2FnZQoJICBuYW1lIG1heSBjb250YWluIDo6IChGcm9iOjpOaXR6KSBhbmQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUKCSAgcGFja2FnZSBuYW1lIHByb3ZpZGVkIGJ5IC1oaWRlIChGb286OkJhcjo6RnJvYjo6Tml0eikuCgoJICBJbiAqX3dyYXAuYywgU1dJR19pbml0IG1hY3JvIGlzIHVzZWQuIFdhcyBwcmV2aW91c2x5IGRlZmluZWQKCSAgYnV0IG5vdCB1c2VkIGFuZCBzaW1wbGlmaWVzIGNvZGUuCgoJICBBZGRlZCB0eXBlbWFwKHBlcmw1LHBlcmw1aW4pIGFuZCB0eXBlbWFwKHBlcmw1LHBlcmw1b3V0KSB0aGF0CgkgIGRvIHRoZSBlcXVpdmFsZW50IG9mIHR5cGVtYXAocGVybDUsaW4pIGFuZCB0eXBlbWFwKHBlcmw1LG91dCkKCSAgYnV0IGNvbnRhaW4gcGVybCBjb2RlIGFuZCBhcHBsaWVzIHRvIHdyYXBwZXJzIGdlbmVyYXRlZCBieQoJICAtc2hhZG93LgoKCSAgTGFja2luZyBwcm9wZXIgcmVncmVzc2lvbiB0ZXN0cyBJIHVzZWQKCSAgRXhhbXBsZXMvcGVybDUve2MrKyxjb25zdHJhaW50LGRlZmFyZyxleGNlcHQsCgkgIGdyYXBoL2dyYXBoWzEyMzRdLG11bHRpbmhlcml0LG5lc3RlZCxzaGFkb3csc2ltcGxlLHRyZWUsCgkgIHR5cGVtYXBzL3thcmd2LGFyZ3YyLGFycmF5bWVtYmVyLGRhdGFiYXNlLGZpbGUsaWdub3JlLGludGVnZXIsCgkgIG91dHB1dCxwYXNzcmVmLHJlZmVyZW5jZSxyZXR1cm59fS8uIEkgcmFuIHN3aWcgd2l0aCBhbmQgd2l0aG91dAoJICB0aGUgcGF0Y2hlcywgZGlmZiB0aGUgZ2VuZXJhdGVkc291cmNlcywgcnVuIHRoZSAucGwgZmlsZXMKCSAgYW5kIGNoZWNrZWQgdGhhdCB0aGUgcmVzdWx0cyBhcmUgaWRlbnRpY2FsLiBJbiBhbGwgdGhvc2UgZXhhbXBsZXMKCSAgSSBoYWQgbm8gZXJyb3IuCgoxMS8yMS85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gcHJvdmlkZSBmdWxsIHZhcmlhYmxlIGxpbmtpbmcgY2FwYWJpbGl0aWVzCiAgICAgICAgICB0byBhbGwgZGF0YXR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIHBhaXIgb2YgYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICB3ZXJlIGNyZWF0ZWQgZm9yIGRhdGF0eXBlcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgVGNsX0xpbmtWYXIoKSBmdW5jdGlvbi4KICAgICAgICAgIE5vdywgd2Ugc2ltcGx5IHVzZSB2YXJpYWJsZSB0cmFjZXMgdG8gc3VwcG9ydCBldmVyeXRoaW5nLiBUaGlzIG1heQogICAgICAgICAgYnJlYWsgc2NyaXB0cyB0aGF0IHJlbHkgdXBvbiB0aGUgb2xkZXIgYmVoYXZpb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzk5OiBBZGRlZCBzbGlnaHQgdHdlYWsgdG8gd3JhcHBlciBnZW5lcmF0b3IgdG8gY29sbGVjdCBsb2NhbCB2YXJpYWJsZXMKICAgICAgICAgIG9mIHNpbWlsYXIgdHlwZS4gIFByb2R1Y2VzIHNvbWV3aGF0IG1vcmUgY29tcGFjdCB3cmFwcGVyIGNvZGUuCgoxMS8yMC85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gdXNlIFNXSUdfR2V0QXJncygpIHRvIHBhcnNlCiAgICAgICAgICBhcmd1bWVudHMuICAgIFRoaXMgaXMgYSB0ZWNobmlxdWUgYm9ycm93ZWQgZnJvbSBQeXRob24gaW4gd2hpY2gKICAgICAgICAgIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHVzaW5nIGEgZm9ybWF0IHN0cmluZyBjb252ZW50aW9uIHNpbWlsaWFyCiAgICAgICAgICB0byBmcHJpbnRmKCkuICAgVGhpcyByZXN1bHRzIGluIGEgKnN1YnN0YW50aWFsKiByZWR1Y3Rpb24gaW4gdGhlCiAgICAgICAgICBzaXplIG9mIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlIHdpdGggb25seSBhIG1vZGVzdCBydW50aW1lIG92ZXJoZWFkCiAgICAgICAgICBpbiBnb2luZyB0aHJvdWdoIHRoZSBleHRyYSBjb252ZXJzaW9uIGZ1bmN0aW9uLgoKMTEvMTMvOTk6IENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgY2xhc3Mvc3RydWN0dXJlIGdlbmVyYXRpb24gY29kZSBmb3IgdGhlCiAgICAgICAgICBUY2wgbW9kdWxlLiAgTm93LCBhIHNtYWxsIHNldCBvZiBydW50aW1lIGZ1bmN0aW9ucyBhcmUgdXNlZAogICAgICAgICAgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbmFsaXR5IGZvciBhbGwgY2xhc3NlcyAoaW5zdGVhZCBvZiBhCiAgICAgICAgICBtYXNzaXZlIGFtb3VudCBvZiBydW50aW1lIGNvZGUgYmVpbmcgZ2VuZXJhdGVkIGZvciBlYWNoIGNsYXNzKS4KICAgICAgICAgIENsYXNzIHNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHNpbXBseSBlbmNvZGVkIGluIGEgc2VyaWVzIG9mCiAgICAgICAgICBzdGF0aWMgdGFibGVzLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpIVUdFKiByZWR1Y3Rpb24gaW4gd3JhcHBlcgogICAgICAgICAgY29kZSBzaXplLS1lc3BlY2lhbGx5IGZvciBDKysuCgoxMS8xMy85OTogUmVtb3ZlZCB0aGUgLXRjbCAoVGNsIDcueCkgbW9kdWxlLiAgVGNsIDguMCBpcyBub3cgc2V2ZXJhbAogICAgICAgICAgeWVhcnMgb2xkIGFuZCB0aGUgZGVmYWN0byBzdGFuZGFyZC0tbm8gcmVhbCByZWFzb24gdG8ga2VlcAogICAgICAgICAgc3VwcG9ydGluZyB0aGUgb2xkIHZlcnNpb24gYXQgdGhpcyBwb2ludC4KCjExLzEzLzk5OiBDbGVhbmVkIHVwIC1jIG9wdGlvbiBmb3IgUHl0aG9uIG1vZHVsZS4gIFRoZSBweWV4cC5zd2cgZmlsZQogICAgICAgICAgaXMgbm93IGdvbmUuCgoxMS8xMy85OTogRml4ZWQgZXh0ZXJuYWwgZGVjbGFyYXRpb25zIHRvIHdvcmsgYmV0dGVyIHdpdGggc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9uIFdpbmRvd3MuICBTdGF0aWMgbGlua2luZyBzaG91bGQgbm93IGJlIHBvc3NpYmxlIGJ5IGRlZmluaW5nCiAgICAgICAgICB0aGUgLURTVEFUSUNfTElOSyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBBbGJlcnRvIEZvbnNlY2EuCgoxMS81Lzk5IDogRml4ZWQgYW4gb2JzY3VyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHJlbGF0ZWQgdG8gdGhlIGdlbmVyYXRpb24KICAgICAgICAgIG9mIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgIEJ1ZyByZXBvcnRlZCBieSBCcmFkIENsZW1lbnRzLgoKMTEvNS85OSA6IEZpeGVkIGEgZmV3IG1lbW9yeSBwcm9ibGVtcyBmb3VuZCBieSBwdXJpZnkuCgoxMS81Lzk5IDogT2ZmaWNpYWxseSBkZXByZWNhdGVkIHRoZSAtaHRjbCwgLWh0aywgYW5kIC1wbHVnaW4gb3B0aW9ucwogICAgICAgICAgZnJvbSB0aGUgVGNsIGFuZCBUY2w4IG1vZHVsZXMuCgoxMC8yNi85OTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgZnJvbSBweXRob24vdHlwZW1hcHMuaS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBLZWl0aCBEYXZpZHNvbi4KCjgvMTYvOTkgOiBBZGRlZCBfV0lOMzIgc3ltYm9sIHRvIGxpYnJhcmllcyB0byBiZXR0ZXIgc3VwcG9ydCBXaW5kb3dzLgoKOC8xNi85OSA6IERlcHJlY2F0ZWQgdGhlIFBlcmw0IG1vZHVsZS4gICBJdCBpcyBubyBsb25nZXIgaW5jbHVkZWQgaW4gdGhlCiAgICAgICAgICBkaXN0cmlidXRpb24gYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBJbiB0aGUgZW50aXJlIDMgeWVhcnMgU1dJRwogICAgICAgICAgaGFzIGJlZW4gYXJvdW5kIEkgbmV2ZXIgcmVjZWl2ZWQgYSBzaW5nbGUgY29tbWVudCBhYm91dCBpdCBzbyBJJ20KICAgICAgICAgIGFzc3VtaW5nIG5vIG9uZSB3aWxsIG1pc3MgaXQuLi4KCjgvMTYvOTkgOiBNb2RpZmllZCB0aGUgdHlwZS1jaGVja2luZyBjb2RlIHRvIHJlZ2lzdGVyIHR5cGUgbWFwcGluZ3MgdXNpbmcgYQogICAgICAgICAgdGFibGUgaW5zdGVhZCBvZiByZXBlYXRlZCBjYWxscyB0byBTV0lHX1JlZ2lzdGVyTWFwcGluZygpLiAgVGhpcwogICAgICAgICAgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHNvbWV3aGF0LgoKOC8xNS85OSA6IENsZWFuZWQgdXAgdGhlIHBvaW50ZXIgdHlwZS1jaGVja2luZyBjb2RlIGluIHRoZSBUY2wgbW9kdWxlLgoKOC8xNS85OSA6IE1hbnkgY2hhbmdlcyB0byB0aGUgbGlicmFyaWVzIHRvIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMuCgo4LzEzLzk5IDogRWxpbWluYXRlZCBDKysgY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcyBhYm91dCBleHRlcm4gIkMiIGxpbmthZ2UuCgo4LzEzLzk5IDogU29tZSBjbGVhbnVwIG9mIFB5dGhvbiAuc3dnIGZpbGVzIHRvIGJldHRlciBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICBvbiBXaW5kb3dzLgoKOC8xMy85OSA6IE1vZGlmaWVkIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZSB0byBhdHRhY2ggcHJhZ21hcyBkZWNsYXJlZCBpbnNpZGUKICAgICAgICAgIGEgY2xhc3MgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MgaXRzZWxmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgJXByYWdtYShweXRob24pIGFkZHRvbWV0aG9kID0gImluc2VydDpwcmludCBgaGVsbG8gd29ybGQnIgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgTW9zdCBwZW9wbGUgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBob3cgdGhpcyB3b3Jrcy4gIEZvciBwZW9wbGUKICAgICAgICAgIHdyaXRpbmcgYmFja2VuZCBtb2R1bGVzLCBjbGFzcy1iYXNlZCBwcmFnbWFzIHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBsYW5nLT5jcHBfb3Blbl9jbGFzcygpICAgICAgICAgICAgIC8vIE9wZW4gYSBjbGFzcwogICAgICAgICAgICAgIGxhbmctPmNwcF9wcmFnbWEoKSAgICAgICAgICAgICAgICAgLy8gU3VwcGx5IHByYWdtYXMKICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgbWVtYmVycwoKICAgICAgICAgICAgICBsYW5nLT5jcHBfY2xvc2VfY2xhc3MoKSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjbGFzcwoKICAgICAgICAgIEFsbCBvZiB0aGUgcHJhZ21hcyBhcmUgcGFzc2VkIGZpcnN0IHNpbmNlIHRoZXkgbWlnaHQgYmUgdXNlZCB0bwogICAgICAgICAgYWZmZWN0IHRoZSBjb2RlIGdlbmVyYXRpb24gb2Ygb3RoZXIgbWVtYmVycy4gICBQbGVhc2Ugc2VlCiAgICAgICAgICB0aGUgUHl0aG9uIG1vZHVsZSBmb3IgYW4gZXhhbXBsZS4gICBQYXRjaGVzIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMy85OSA6IFBhdGNoIHRvIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byBlbGltaW5hdGUgaWdub3JlZAogICAgICAgICAgZXhjZXB0aW9uIGVycm9ycyBpbiBkZXN0cnVjdG9ycy4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMS85OSA6IE1pbm9yIHBhdGNoIHRvIHN3aWdfbGliL3B5dGhvbi9zd2lncHRyLnN3ZyAgKGFkZGVkIFNXSUdTVEFUSUMKICAgICAgICAgIGRlY2xhcmF0aW9uKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEx5bGUgSm9obnNvbi4KCjgvMTEvOTkgOiBBZGRlZCBGSVJTVEtFWS9ORVhUS0VZIG1ldGhvZHMgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjgvMTEvOTkgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgcmV0dXJuZWQKICAgICAgICAgIGFuZCBwYXNzZWQgYXMgJ05vbmUuJyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgVGFsIFNoYWxpZi4KCjgvMTAvOTkgOiBGaXhlZCBtaXNzaW5nICdpbnQnIHNwZWNpZmllcnMgaW4gdmFyaW91cyBwbGFjZXMuCgo4LzEwLzk5IDogQWRkZWQgV2luZG93cyBtYWtlZmlsZSBmb3IgUnVudGltZSBsaWJyYXJpZXMuICBDb250cmlidXRlZAogICAgICAgICAgYnkgQm9iIFRlY2hlbnRpbi4KCjgvMTAvOTkgOiBGaXhlZCBtaW5vciBwcm9ibGVtIGluIFB5dGhvbiBydW50aW1lIG1ha2VmaWxlIGludHJvZHVjZWQKICAgICAgICAgIGJ5IGtleXdvcmQgYXJndW1lbnRzLgoKOC84Lzk5ICA6IENoYW5nZWQgJHRhcmdldCBvZiBwZXJsNShvdXQpIHR5cGVtYXAgZnJvbSBTVCgwKSB0bwogICAgICAgICAgU1QoYXJndmkpLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiBGaXhlZCBidWcgaW4gdHlwZW1hcCBjaGVja2luZyByZWxhdGVkIHRvIHRoZSBBTlkga2V5d29yZAogICAgICAgICAgaW4gYXJyYXlzIGFuZCBpZ25vcmVkIGFyZ3VtZW50cy4gIEVycm9yIHJlcG9ydGVkIGJ5CiAgICAgICAgICBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6ICVlbmFibGVkb2MgYW5kICVkaXNhYmxlZG9jIGRpcmVjdGl2ZXMgY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICBpbnNpZGUgY2xhc3Mvc3RydWN0dXJlIGRlZmluaXRpb25zLiAgIEhvd2V2ZXIsIG5vIGNoZWNrCiAgICAgICAgICBpcyBtYWRlIHRvIHNlZSBpZiB0aGV5IGFyZSBiYWxhbmNlZCAoaS5lLiwgYSAlZGlzYWJsZWRvYwogICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIGRvZXMgbm90IGhhdmUgdG8gaGF2ZSBhIG1hdGNoaW5nCiAgICAgICAgICAlZW5hYmxlZG9jIGluIHRoZSBzYW1lIGNsYXNzKS4KCjgvOC85OSAgOiBLZXl3b3JkIGFyZ3VtZW50IGhhbmRsaW5nIGlzIG5vdyBzdXBwb3J0ZWQgaW4gdGhlIFB5dGhvbgogICAgICAgICAgbW9kdWxlLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW50IGZvbyhjaGFyICpiYXIsIGludCBzcGFtLCBkb3VibGUgeCk7CgogICAgICAgICAgQ2FuIGJlIGNhbGxlZCBmcm9tIFB5dGhvbiBhcwoKICAgICAgICAgICAgICAgZm9vKHggPSAzLjQsIGJhcj0iaGVsbG8iLCBzcGFtPTQyKQoKICAgICAgICAgIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIHJ1biBTV0lHIHdpdGggdGhlICcta2V5d29yZCcgY29tbWFuZAogICAgICAgICAgbGluZSBvcHRpb24uICAgIE1peGluZyBrZXl3b3JkIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgc2hvdWxkIHdvcmsgYXMgd2VsbC4gICBVbm5hbWVkIGFyZ3VtZW50cyBhcmUgYXNzaWduZWQgbmFtZXMKICAgICAgICAgIHN1Y2ggYXMgImFyZzEiLCAiYXJnMiIsIGV0Yy4uLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgRnVuY3Rpb25zIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIHN1Y2ggYXMKICAgICAgICAgIGJhcihpbnQgKk9VVFBVVCwgaW50ICpPVVRQVVQpIHdpbGwgbGlrZWx5IGNhdXNlIHByb2JsZW1hdGljCiAgICAgICAgICB3cmFwcGVyIGNvZGUgdG8gYmUgZ2VuZXJhdGVkLiAgIFRvIGZpeCB0aGlzLCAgdXNlIGRpZmZlcmVudAogICAgICAgICAgbmFtZXMgb3IgdXNlICVhcHBseSB0byBtYXAgdHlwZW1hcHMgdG8gYWx0ZXJuYXRlIG5hbWVzLgoKOC84Lzk5ICA6IEhhbmRsaW5nIG9mIHRoZSAndGhpcycgcG9pbnRlciBoYXMgYmVlbiBjaGFuZ2VkIGluIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBQcmV2aW91c2x5LCBkZXJlZmVyZW5jaW5nIG9mICcudGhpcycgb2NjdXJyZWQgaW4gdGhlCiAgICAgICAgICBQeXRob24gc2hhZG93IGNsYXNzIGl0c2VsZi4gICBOb3csIHRoaXMgc3RlcCBvY2N1cnMgaW4gdGhlIEMKICAgICAgICAgIHdyYXBwZXJzIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CgogICAgICAgICAgICAgICAgU1dJR19HZXRQdHJPYmooUHlPYmplY3QgKiwgdm9pZCAqKnB0ciwgY2hhciAqdHlwZSkKCiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBhY2NlcHQgZWl0aGVyIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwb2ludGVyCiAgICAgICAgICBvciBhIHNoYWRvdyBjbGFzcyBpbnN0YW5jZSB3aXRoIGEgJy50aGlzJyBhdHRyaWJ1dGUgb2YKICAgICAgICAgIGFwcHJvcHJpYXRlIHR5cGUuICBUaGlzIGNoYW5nZSBhbGxvd3MgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAxLiAgVGhlIHJlYWwgc2hhZG93IGNsYXNzIGluc3RhbmNlIGZvciBhbiBvYmplY3QgaXMKICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEMgd3JhcHBlcnMgd2hlcmUgaXQgY2FuIGJlIGV4YW1pbmVkL21vZGlmaWVkCiAgICAgICAgICAgICAgYnkgdHlwZW1hcHMuCgogICAgICAgICAgMi4gIEhhbmRsaW5nIG9mIGRlZmF1bHQva2V5d29yZCBhcmd1bWVudHMgaXMgbm93IGdyZWF0bHkKICAgICAgICAgICAgICBzaW1wbGlmaWVkLgoKICAgICAgICAgIDMuICBUaGUgUHl0aG9uIHdyYXBwZXIgY29kZSBpcyBtdWNoIG1vcmUgc2ltcGxlLgoKICAgICAgICAgIFBsdXMsIGl0IGVsaW1pbmF0ZWQgbW9yZSB0aGFuIDMwMCBsaW5lcyBvZiBDKysgY29kZSBpbiB0aGUKICAgICAgICAgIFB5dGhvbiBtb2R1bGUuCgogICAgICAgICAgKioqIENBVkVBVCA6IFRoaXMgcmVxdWlyZXMgdGhlIGFic3RyYWN0IG9iamVjdCBpbnRlcmZhY2UuCiAgICAgICAgICBJdCBzaG91bGQgd29yayB3aXRoIFB5dGhvbiAxLjQsIGJ1dCBwcm9iYWJseSBub3RoaW5nIG9sZGVyCiAgICAgICAgICB0aGFuIHRoYXQuCgoKOC84Lzk5ICA6IEZpeGVkIGhhbmRsaW5nIG9mICJjb25zdCIgYW5kIHBvaW50ZXJzIGluIGNsYXNzZXMuICBJbiBwYXJ0aWN1bGFyLAogICAgICAgICAgZGVjbGFyYXRpb25zIHN1Y2ggYXMKCiAgICAgICAgICAgY2xhc3MgZm9vIHsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnOwogICAgICAgICAgICAgY29uc3QgaW50ICAqaXB0cjsKICAgICAgICAgIH0KCiAgICAgICAgICBhcmUgaGFuZGxlZCBhcyBhc3NpZ25hYmxlIHZhcmlhYmxlcyBhcyBvcHBvc2VkIHRvIGNvbnN0YW50CiAgICAgICAgICB2YWx1ZXMgKHRoaXMgaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3IgaW4gQy9DKyspLiAgIE5vdGU6CiAgICAgICAgICBkZWNsYXJhdGlvbnMgc3VjaCBhcyAiY2hhciAqY29uc3QgbXNnIiBhcmUgc3RpbGwgdW5zdXBwb3J0ZWQuCiAgICAgICAgICBDb25zdGFudHMgZGVjbGFyZWQgYXQgdGhlIGdsb2JhbCBsZXZlbCB1c2luZyBjb25zdCBhcmUgYWxzbwogICAgICAgICAgYnJva2VuIChiZWNhdXNlIEkgaGF2ZSBhIG51bWJlciBvZiBpbnRlcmZhY2VzIHRoYXQgcmVseSB1cG9uCiAgICAgICAgICB0aGlzIGJlaGF2aW9yKS4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFRoaXMgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdAogICAgICAgICAgbWlzdGFrZW5seSB0cmVhdCAnY29uc3QgY2hhciAqJyB0eXBlcyBhcyBjb25zdGFudCB2YWx1ZXMuCgo4LzgvOTkgIDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBzdXBwb3J0IGJpdC1maWVsZHMuICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfa2V5d29yZCA6IDE7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2V4dGVybiAgOiAxOwogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19zdGF0aWMgIDogMTsKICAgICAgICAgIH0gZmxhZ3M7CgogICAgICAgICAgQml0LWZpZWxkcyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGludGVnZXIgdHlwZXMgYW5kIHRoZWlyCiAgICAgICAgICBhcmUgb3RoZXIgcmVzdHJpY3Rpb25zLiAgU1dJRyBwZXJmb3JtcyBubyBzdWNoIHR5cGUtY2hlY2tpbmcKICAgICAgICAgIChhbHRob3VnaCB0aGUgQyBjb21waWxlciB3aWxsIGNhdGNoIHByb2JsZW1zIHdoZW4gaXQgdHJpZXMgdG8KICAgICAgICAgIGNvbXBpbGUgdGhlIHdyYXBwZXIgY29kZSkuCgo4LzgvOTkgIDogUmVtb3ZlZCB0cmFpbGluZyBzcGFjZSBvZiAkYmFzZXR5cGUgc3Vic3RpdHV0aW9uIGluIHR5cGVtYXBzLgogICAgICAgICAgVGhpcyBpcyB0byBhbGxvdyB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICV0eXBlbWFwKHB5dGhvbiwgYXJnb3V0KSBzcGFtKiogT1VUUFVUewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIGNoYXIqIGEgPSAiJGJhc2V0eXBlX3AiOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgfQoKICAgICAgICAgIChQYXRjaCBzdWdnZXN0ZWQgYnkgTmF0aGFuIER1bmZpZWxkKS4KCjYvMjIvOTkgOiBNYWRlIGEgdmVyeSBzbGlnaHQgdHdlYWsgdG8gdGhlIFBlcmw1IHNoYWRvdyBjbGFzcwogICAgICAgICAgY29kZSB0aGF0IGFsbG93cyB0eXBlbWFwcyB0byBhbHRlciB0aGUgcmV0dXJuIHR5cGUKICAgICAgICAgIG9mIG9iamVjdHMgKHRvIHN1cHBvcnQgcG9seW1vcnBoaWMgdHlwZXMpLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IERyYWtlIERpZWRyaWNoLgoKNC84Lzk5ICA6IEZpeGVkIG51bGwgcG9pbnRlciBoYW5kbGluZyBidWcgaW4gUGVybCBtb2R1bGUuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBKdW5pbyBIYW1hbm8uCgozLzE3Lzk5IDogRml4ZWQgYnVnIGluIHBlcmw1cHRyLnN3ZyBmb3IgQWN0aXZlU3RhdGUgUGVybC4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEdyZWcgQW5kZXJzb24uCgoyLzI3Lzk5IDogRWxpbWluYXRlZCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBTd2lnIHJ1bnMgb24KICAgICAgICAgIGVtcHR5IGZpbGVzLgoKMi8yNy85OSA6IEFkZGVkIHBhdGNoIHRvIEd1aWxlIG1vZHVsZSB0byBlbGltaW5hdGUgdW51c2VkCiAgICAgICAgICB2YXJpYWJsZXMuICAgQ29udHJpYnV0ZWQgYnkgTWlrZSBTaW1vbnMuCgoyLzI3Lzk5IDogRml4ZWQgcHJvYmxlbSB3aXRoICVhZGRtZXRob2RzIHJldHVybmluZyByZWZlcmVuY2VzLgoKMi8yNy85OSA6IEZpeGVkIFJ1bnRpbWUvTWFrZWZpbGUuIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICBNaWtlIFJvbWJlcmcuCgoyLzI3Lzk5IDogSW5jb3Jwb3JhdGVkIHBhdGNoZXMgdG8gdGhlIHR5cGUtY2hlY2tlci4KCjIvMjcvOTkgOiBGaXhlZCBwcm9ibGVtIHdpdGggLWV4cG9ydGFsbCBzd2l0Y2ggYW5kIHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICBpbiBQZXJsNSBtb2R1bGUuICBQYXRjaCBjb250cmlidXRlZCBieSBEZW5uaXMgTWFyc2EuCgoyLzI3Lzk5IDogTW9kaWZpZWQgUGVybDUgbW9kdWxlIHRvIHJlY29nbml6ZSAndW5kZWYnIGFzIGEgTlVMTCBjaGFyICouCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBKdW5pbyBIYW1hbm8uCgoyLzI3Lzk5IDogRml4ZWQgdGhlIFBlcmw1IG1vZHVsZSB0byBzdXBwb3J0IHRoZSBuZXdlciB2ZXJzaW9ucyBvZgogICAgICAgICAgQWN0aXZlU3RhdGUgUGVybCBmb3IgV2luMzIuCgoyLzI3Lzk5IDogRml4ZWQgdGhlIGluY2x1ZGUgb3JkZXIgb2YgZmlsZXMgc3BlY2lmaWVkIHdpdGggdGhlCiAgICAgICAgICAtSSBvcHRpb24uCgoyLzUvOTgtIDogRGF2ZSBmaW5pc2hlcyBoaXMgZGlzc2VydGF0aW9uLCBnb2VzIGpvYiBodW50aW5nLCBtb3ZlcyB0bwoyLzUvOTkgICAgQ2hpY2FnbyBhbmQgZ2VuZXJhbGx5IHRocmFzaGVzIGFib3V0LgoKVmVyc2lvbiAxLjEgUGF0Y2ggNSAoRmVicnVhcnkgNSwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvNC85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIGRpZmZlcmVudCBwYWNrYWdlCiAgICAgICAgICBsb2NhdGlvbnMgYXJlIHNwZWNpZmllZCAoLS13aXRoLXRjbGluY2wsIGV0Yy4uLikuCgoyLzIvOTggIDogRml4ZWQgbmFtZS1jbGFzaCBidWcgcmVsYXRlZCB0byB0aGUgc3dpdGNoIHRvIEMgbWFjcm9zIGZvciBhY2Nlc3NvcgogICAgICAgICAgZnVuY3Rpb25zLiAgVGhlIG5ldyBzY2hlbWUgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igb2JqZWN0cwogICAgICAgICAgd2l0aCBtZW1iZXJzIHN1Y2ggYXMgJ29iaicsICd2YWwnLCBldGMuLi4gICBGaXhlZCB0aGUgYnVnIGJ5CiAgICAgICAgICBhcHBlbmRpbmcgdGhlIHdvcmQgJ3N3aWcnIHRvIG1hY3JvIGFyZ3VtZW50IG5hbWVzLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMi8yLzk4ICA6IFNsaWdodCBmaXggdG8gdGhlIFBlcmw1IG1vZHVsZSB0byBlbGltaW5hdGUgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgYWJvdXQgJ3Zhcm5hbWUgdXNlZCBvbmx5IG9uY2UgOiBwb3NzaWJsZSB0eXBvJy4gIEZpeAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgUnVkeSBBbGJhY2h0ZW4uCgoxLzkvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIFBlcmwgNSBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIGNvbnN0YW50cyBhbmQgc2hhZG93IGNsYXNzZXMuCgoxLzkvOTggIDogRml4ZWQgbGlua2luZyBidWcgd2l0aCBQeXRob24gMS41IGVtYmVkLmkgbGlicmFyeSBmaWxlLgoKVmVyc2lvbiAxLjEgUGF0Y2ggNCAoSmFudWFyeSA0LCAxOTk4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLzQvOTggIDogQ2hhbmdlZCBzdHJ1Y3R1cmVkIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgdG8gYmUgbW9yZSBmcmllbmRseQogICAgICAgICAgdG8gQm9ybGFuZCBDKysuCgoxLzQvOTggIDogQWRkZWQgdGhlIGZ1bmN0aW9uIE1ha2VmaWxlLndpbi5iYyBmb3IgY29tcGlsaW5nIHRoZSBleGFtcGxlcwogICAgICAgICAgdW5kZXIgQm9ybGFuZCA1LjIuCgoxLzQvOTggIDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGVybDUgbW9kdWxlIGFuZCBDKysgY29tcGlsYXRpb24uICBUaGUKICAgICAgICAgIDxtYXRoLmg+IGxpYnJhcnkgaXMgbm93IGluY2x1ZGVkIGJlZm9yZSBhbnkgUGVybCBoZWFkZXJzCiAgICAgICAgICBiZWNhdXNlIFBlcmwgdGhlIGV4dGVybiAiQyIgbGlua2FnZSBvZiBtYXRoLmggc2NyZXdzIGFsb3QKICAgICAgICAgIG9mIHRoaW5ncyB1cCAoZXNwZWNpYWxseSBvbiBXaW5kb3dzKS4KCjEvMi85OCAgOiBDaGFuZ2UgdG8gdGhlIFB5dGhvbiBtb2R1bGUgdGhhdCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29uc3RhbnRzCiAgICAgICAgICBjcmVhdGVkIGJ5IEMrKyBjbGFzc2VzLCBpbmhlcml0YW5jZSwgYW5kIHNoYWRvdyBjbGFzc2VzLiAgIFRoaXMKICAgICAgICAgIG1vZGlmaWNhdGlvbiBtYXkgaW50cm9kdWNlIGEgZmV3IHNsaWdodCBpbmNvbXBhdGliaWxpdGllcyBpZgogICAgICAgICAgeW91IGF0dGVtcHQgdG8gdXNlIHRoZSBub24tc2hhZG93IGNsYXNzIGludGVyZmFjZSB3aXRoIHNoYWRvdwogICAgICAgICAgY2xhc3NlcyBlbmFibGVkLiAgICBQYXRjaCBjb250cmlidXRlZCBieSBNaWtlIFJvbWJlcmcuCgoxLzIvOTggIDogU3VwcG9ydCBmb3IgVGNsIDguMCBuYW1lc3BhY2VzIGhhcyBiZWVuIGFkZGVkLiAgIFRoaXMgKnJlcGxhY2VzKgogICAgICAgICAgdGhlIG9yaWdpbmFsIFNXSUcgbWVjaGFuaXNtIHRoYXQgYXNzdW1lZCBbaW5jciBUY2xdIG5hbWVzcGFjZXMuCiAgICAgICAgICBUbyB1c2UgbmFtZXNwYWNlcywgc2ltcGx5IHJ1biBTV0lHIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zCgogICAgICAgICAgICAgc3dpZyAtdGNsIC1uYW1lc3BhY2UgIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gYSBuYW1lc3BhY2UgdGhhdCBtYXRjaGVzCiAgICAgICAgICAgICAgICAgICAgdGhlIG1vZHVsZSBuYW1lCgogICAgICAgICAgICAgc3dpZyAtdGNsIC1uYW1lc3BhY2UgLXByZWZpeCBiYXIgZm9vLmkKCiAgICAgICAgICAgICAgICAgICAgVGhpcyBwbGFjZXMgZXZlcnl0aGluZyBpbiB0aGUgbmFtZXNwYWNlICdiYXInCgogICAgICAgICAgVGhlIHVzZSBvZiBuYW1lc3BhY2VzIGlzIG5ldyBpbiBUY2wgOC4wLiAgSG93ZXZlciwgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgZ2VuZXJhdGVkIGJ5IFNXSUcgd2lsbCBzdGlsbCB3b3JrIHdpdGggYWxsIHZlcnNpb25zIG9mIFRjbCBuZXdlcgogICAgICAgICAgdGhhbiBhbmQgaW5jbHVkaW5nIFRjbCA3LjMvVGszLjYgZXZlbiBpZiB0aGUgLW5hbWVzcGFjZSBvcHRpb24gaXMKICAgICAgICAgIHVzZWQuCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgZXhpc3RpbmcgYXBwbGljYXRpb25zIHRoYXQgcmVsaWVkIG9uIHRoZQogICAgICAgICAgLXByZWZpeCBhbmQgLW5hbWVzcGFjZSBvcHRpb25zLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHRvIHRoZSBUY2wgd3JhcHBlciBjb2RlCgogICAgICAgICAgICAgICAgIFNXSUdfbmFtZSAgICAgIC0gTmFtZSBvZiB0aGUgU1dJRyBtb2R1bGUKICAgICAgICAgICAgICAgICBTV0lHX3ByZWZpeCAgICAtIFByZWZpeC9uYW1lc3BhY2UgYXBwZW5kZWQgdG8gY29tbWFuZCBuYW1lcwogICAgICAgICAgICAgICAgIFNXSUdfbmFtZXNwYWNlIC0gTmFtZSBvZiB0aGUgbmFtZXNwYWNlCgogICAgICAgICAgU1dJRyBsaWJyYXJ5IHdyaXRlcnMgY2FuIHVzZSB0aGVzZSB0byB0aGVpciBhZHZhbnRhZ2VzLgoKMS8yLzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBUY2w4IG1vZHVsZSByZWxhdGVkIHRvIHRoZSBjcmVhdGlvbiBvZgogICAgICAgICAgcG9pbnRlciBjb25zdGFudHMgKHRoZSBmdW5jdGlvbiBTV0lHX01ha2VQdHIgd2FzIG1pc3NpbmcgZnJvbQogICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSkuCgoxLzIvOTggIDogQWRkZWQgdGhlIGNvbnN0aGFzaC5pIGxpYnJhcnkgZmlsZSB0byB0aGUgVGNsIGFuZCBUY2w4IG1vZHVsZXMuCgoxLzEvOTggIDogQ2hhbmdlZCBhbmQgY2xlYW5lZCB1cCB0aGUgUHl0aG9uIHR5cGVtYXBzLmkgZmlsZS4gICBUaGUgZm9sbG93aW5nCiAgICAgICAgICBzaWduaWZpY2FudCBjaGFuZ2VzIHdlcmUgbWFkZSA6CgogICAgICAgICAgICAgICAgMS4gIFRoZSBPVVRQVVQgdHlwZW1hcCBub3cgcmV0dXJucyBQeXRob24gdHVwbGVzIGluc3RlYWQgb2YKICAgICAgICAgICAgICAgICAgICBsaXN0cy4gICBMaXN0cyBjYW4gYmUgcmV0dXJuZWQgYXMgYmVmb3JlIGJ5IHVzaW5nIHRoZQogICAgICAgICAgICAgICAgICAgIExfT1VUUFVUIHR5cGUuICAgIElmIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucwogICAgICAgICAgICAgICAgICAgIGlzIG5lZWRlZCwgcnVuIFNXSUcgd2l0aCB0aGUgLURPVVRQVVRfTElTVCBvcHRpb24uCgogICAgICAgICAgICAgICAgMi4gIFRoZSBCT1RIIHR5cGVtYXAgaGFzIGJlZW4gcmVuYW1lZCB0byBJTk9VVC4gIEZvciBiYWNrd2FyZHMKICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LCB0aGUgIkJPVEgiIG1ldGhvZCBzdGlsbCBleGlzdHMgaG93ZXZlci4KCiAgICAgICAgICAgICAgICAzLiAgT3V0cHV0IHR5cGVtYXBzIG5vdyBnZW5lcmF0ZSBsZXNzIGNvZGUgdGhhbiBiZWZvcmUuCgogICAgICAgICAgQ2hhbmdlcyB0byB0eXBlbWFwcy5pIG1heSBicmVhayBleGlzdGluZyBQeXRob24gc2NyaXB0cyB0aGF0IGFzc3VtZQogICAgICAgICAgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGEgbGlzdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMzEvOTc6IEZpeGVkIGxvbmcgb3ZlcmR1ZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZXN0aW5nIHNjcmlwdHMgYW5kIGNlcnRhaW4KICAgICAgICAgIG1ha2VmaWxlcyB0aGF0IHJlcXVpcmVkIHRoZSB1c2Ugb2YgdGhlIGJhc2ggc2hlbGwuICAgRXZlcnl0aGluZyBzaG91bGQKICAgICAgICAgIHdvcmsgcHJvcGVybHkgd2l0aCB0aGUgc3RhbmRhcmQgQm91cm5lIHNoZWxsIChzaCkgbm93LgoKMTIvMzEvOTc6IE1vZGlmaWVkIHR5cGVtYXBzIHRvIGFsbG93ICRiYXNldHlwZSBhcyBhIHZhbGlkIGxvY2FsIHZhcmlhYmxlLgogICAgICAgICAgVGhpcyBhbGxvd3MgZm9yIGFsbCBzb3J0cyBvZiBiaXphcnJlIGhhY2tpc2ggdHlwZW1hcHMgdGhhdAogICAgICAgICAgZG8gY29vbCB0aGluZ3MuICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRG9taW5pcXVlIER1bW9udC4KCjEyLzMxLzk3OiBTd2l0Y2hlZCBhY2Nlc3NvciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZvciBtZW1iZXIgZGF0YSB0bwogICAgICAgICAgQyBwcmVwcm9jZXNzb3IgbWFjcm9zIChleGNlcHQgaW4gY2FzZXMgaW52b2x2aW5nIHR5cGVtYXBzCiAgICAgICAgICBvciBjaGFyICopLgoKMTIvMzEvOTc6IEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gQysrIG1lbWJlciBkYXRhIGludm9sdmluZyByZWZlcmVuY2VzLgoKMTIvMzEvOTc6IENoYW5nZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciBDKysgbWVtYmVyIGZ1bmN0aW9ucyB0bwogICAgICAgICAgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gICBUaGlzIGNsZWFucyB1cCB0aGUgd3JhcHBlciBjb2RlCiAgICAgICAgICBhbmQgcmVzdWx0cyBpbiBmZXdlciBmdW5jdGlvbiBkZWZpbml0aW9ucy4KCjEyLzMxLzk3OiBDaGFuZ2VkIHRoZSBkZWZhdWx0IEMgY29uc3RydWN0b3IgdG8gdXNlIGNhbGxvYygpIGluc3RlYWQKICAgICAgICAgIG9mIG1hbGxvYygpCgoxMi8zMC85NzogQ2hhbmdlZCB0aGUgY3JlYXRpb24gb2YgY29uc3RhbnRzIGluIHRoZSBQZXJsNSBtb2R1bGUuCiAgICAgICAgICBGb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgdGhleSBzaG91bGQgd29yayBpbiBleGFjdGx5IHRoZQogICAgICAgICAgc2FtZSB3YXkgYXMgYmVmb3JlIGV4Y2VwdCB0aGF0IHRoZXkgbm93IHJlcXVpcmUgbXVjaCBsZXNzCiAgICAgICAgICB3cmFwcGVyIGNvZGUuICAgTW9kdWxlcyBjb250YWluaW5nIGxhcmdlIG51bWJlcnMgb2YKICAgICAgICAgIGNvbnN0YW50cyBtYXkgc2VlIGdyZWF0ZXIgdGhhbiBhIDUwJSByZWR1Y3Rpb24gaW4gd3JhcHBlcgogICAgICAgICAgY29kZSBzaXplLgoKMTIvMzAvOTc6IE1vZGlmaWVkIHRoZSBQeXRob24gbW9kdWxlIHRvIGJlIG1vcmUgaW50ZWxsaWdlbnQgYWJvdXQgdGhlCiAgICAgICAgICBjcmVhdGlvbiBvZiBjb25zdGFudHMuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgcmVkdW5kYW50CiAgICAgICAgICBnbG9iYWwgdmFyaWFibGVzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uCiAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgYmUgcmVkdWNlZC4gICAoTWFueSB0aGFua3MgdG8gSmltIEZ1bHRvbikuCgoxMi8yOS85NzogRml4ZWQgYSBidWcgaW4gQysrIGNvZGUgZ2VuZXJhdGlvbiByZWxhdGVkIHRvIG1lbWJlciBmdW5jdGlvbnMsCiAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cywgYW5kIHJlZmVyZW5jZXMuCgoxMi8yOS85NzogRml4ZWQgY29uZmlndXJlIHNjcmlwdCBhbmQgYSBmZXcgbWFrZWZpbGVzIHRvIHN1cHBvcnQgUHl0aG9uIDEuNQoKMTIvMjkvOTc6IEFkZGVkICdlbWJlZDE1LmknIGxpYnJhcnkgZmlsZS4gIFRoaXMgZmlsZSBzaG91bGQgYmUgdXNlZCB0bwogICAgICAgICAgc3RhdGljbHkgbGluayB2ZXJzaW9ucyBvZiBQeXRob24gMS41LiAgICBUbyBtYWtlIGl0IHRoZSBkZWZhdWx0LAogICAgICAgICAgc2ltcGx5IGNvcHkgJ3N3aWdfbGliL3B5dGhvbi9lbWJlZDE1LmknIHRvICdzd2lnX2xpYi9weXRob24vZW1iZWQuaScKClZlcnNpb24gMS4xIFBhdGNoIDMgKE5vdmVtYmVyIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aXRoIHNoYWRvdyBjbGFzc2VzIGFuZAogICAgICAgICAgc3RhdGljIGNsYXNzIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBjbGFzcyBpbnN0YW5jZXMuCiAgICAgICAgICBOb3RlIDogVGhlIGZpeCBmb3IgdGhpcyBidWcgcmVxdWlyZXMgYSBzbGlnaHQgcmVzdHJ1Y3R1cmluZyBvZgogICAgICAgICAgb2YgdGhlIC5wbSBmaWxlcyBjcmVhdGVkIGJ5IFNXSUcuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFRjbC9UY2w4IG1vZHVsZXMgcmVsYXRlZCB0byB2YXJpYWJsZSBsaW5raW5nCiAgICAgICAgICBvZiBjaGFyYWN0ZXIgYXJyYXlzLiAgSWYgeW91IGRlY2xhcmVkIGEgZ2xvYmFsIHZhcmlhYmxlICdjaGFyIGZvb1sxMF0nLAogICAgICAgICAgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgd291bGQgZWl0aGVyIGNhdXNlIGEgc2VnbWVudGF0aW9uIGZhdWx0CiAgICAgICAgICBpbW1lZGlhdGVseSB1cG9uIGxvYWRpbmcgb3Igd2VpcmQgbWVtb3J5IGNvcnJ1cHRpb24gZWxzZXdoZXJlLgogICAgICAgICAgVGhpcyBzaG91bGQgbm93IGJlIGZpeGVkIGFsdGhvdWdoIGNoYXJhY3RlciBhcnJheXMgY2FuIG9ubHkgYmUKICAgICAgICAgIHJlYWQtb25seS4KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSB0aGF0IGNhdXNlZCBpdCB0bwogICAgICAgICAgZmFpbCBpZiBmaWxlcyB3ZXJlIGltcG9ydGVkIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbgogICAgICAgICAgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCgoxMS8yMy85NzogRml4ZWQgaW5jb3JyZWN0IGRpYWdub3N0aWMgbWVzc2FnZSBpbiB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbgogICAgICAgICAgbW9kdWxlLgoKMTEvMjMvOTc6IENoYW5nZWQgdGhlIGJlaGF2aW9yIG9mIHRoZSAtbyBvcHRpb24gd2hlbiB1c2VkIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiBJZiAtbyB3YXMgdXNlZCB0byBzcGVjaWZ5IGJvdGggdGhlIHBhdGhuYW1lIGFuZCBmaWxlbmFtZQogICAgICAgICAgb2YgU1dJRydzIG91dHB1dCBzdWNoIGFzCgogICAgICAgICAgICAgICAgIHN3aWcgLW8gL2hvbWUvc3dpZy93cmFwcGVyLmMgLXNoYWRvdyAtcGVybDUgZm9vLmkKCiAgICAgICAgICBUaGUgd3JhcHBlciBjb2RlIHdvdWxkIGJlIHBsYWNlZCB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAtbywKICAgICAgICAgIGJ1dCB0aGUgLnBtIGZpbGUgYW5kIGRvY3VtZW50YXRpb24gd291bGQgYmUgcGxhY2VkIGluIHRoZQogICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIFNXSUcgd2FzIHJ1bi4gICBOb3csIHRoZXNlIGZpbGVzIGFyZSBwbGFjZWQKICAgICAgICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCB0aGUgLW8gb3B0aW9uLgogICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYWxzbyBuZWVkZWQgZm9yIHByb3BlciBvcGVyYXRpb24gb24gdGhlCiAgICAgICAgICBNYWNpbnRvc2guCgoxMS8yMy85NzogQWRkZWQgYSAndGhpcygpJyBtZXRob2QgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMuICAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZSBmcm9tIGEgc2hhZG93CiAgICAgICAgICBjbGFzcyB0aGF0IGlzIHJlcHJlc2VudGVkIGFzIGEgdGllZCBoYXNoLiAgIFRvIHVzZSBqdXN0CiAgICAgICAgICBpbnZva2UgYXMgYSBtZXRob2QgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgJGwgPSBuZXcgTGlzdDsgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgJHB0ciA9ICRsLT50aGlzKCk7ICAgIyBHZXQgdGhlIG5vcm1hbCBwb2ludGVyIHZhbHVlCgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2wgOCBwb2ludGVyLmkgbGlicmFyeSBmaWxlICh3aGljaCB3YXMgY29tcGxldGVseQogICAgICAgICAgYnJva2VuIGluIDEuMXAyKS4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgUGVybDUgdHlwZS1jaGVja2VyIHRvIGZpeCBhIGZldyBwcm9ibGVtcwogICAgICAgICAgd2l0aCBnbG9iYWwgdmFyaWFibGVzIG9mIHBvaW50ZXIgdHlwZXMgYW5kIHRvIGFsbG93CiAgICAgICAgICB0aWVkIGhhc2hlcyB0byBiZSB1c2VkIGludGVyY2hhbmdhYmx5IHdpdGggbm9ybWFsCiAgICAgICAgICBwb2ludGVyIHZhbHVlcy4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgdHlwZW1hcCBtZWNoYW5pc20gdG8gYWxsb3cgb3V0cHV0CiAgICAgICAgICB0eXBlbWFwcyBvZiB0eXBlICd2b2lkJy4gICBUaGVzZSB3ZXJlIGlnbm9yZWQgcHJldmlvdXNseSwKICAgICAgICAgIGJ1dCBub3cgaWYgeW91IHNwZWNpZnksCgogICAgICAgICAgICAgICAgJXR5cGVtYXAobGFuZyxvdXQpIHZvaWQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZvaWQgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgWW91IGNhbiBjaGFuZ2Ugb3IgYXNzaWduIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBmdW5jdGlvbi4KCjExLzIzLzk3OiBGaXhlZCBwcm9jZXNzaW5nIG9mICdib29sJyBkYXRhdHlwZXMgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCgoxMS8yMy85NzogRml4ZWQgbWlub3IgcGFyc2luZyBlcnJvciB3aXRoIEMrKyBpbml0aWFsaXplcnMuIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgoxMS8yMy85NzogRml4ZWQgdGhlIFRjbDggbW9kdWxlIHNvIHRoYXQgQyBmdW5jdGlvbnMgdGhhdCBjYWxsIGJhY2sgaW50bwogICAgICAgICAgVGNsIGRvbid0IGNvcnJ1cHQgdGhlIHJldHVybiByZXN1bHQgb2JqZWN0IChTV0lHIHdhcyBnYXRoZXJpbmcKICAgICAgICAgIHRoZSByZXN1bHQgb2JqZWN0IHRvbyBlYXJseSB3aGljaCBsZWFkcyB0byBwcm9ibGVtcyBpZiBzdWJzZXF1ZW50CiAgICAgICAgICBUY2wgY2FsbHMgYXJlIG1hZGUpLgoKMTEvMjMvOTc6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiB0aGUgUHl0aG9uIG1vZHVsZSB3aGVuIHR3byBvcgogICAgICAgICAgbW9yZSBvdXRwdXQgcGFyYW1ldGVycyB3ZXJlIHVzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50cyBvZiBhCiAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgdHlwZW1hcHMuaQogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqT1VUUFVULCBkb3VibGUgKk9VVFBVVCwgZG91YmxlIGEpOwoKICAgICAgICAgIFByZXZpb3VzbHksIGRvaW5nIHRoaXMgcmVzdWx0ZWQgaW4gdGhlIGNyZWF0aW9uIG9mIGFuCiAgICAgICAgICBleHRyYW5lb3VzIGNvbW1hIGluIHRoZSBvdXRwdXQsIHJlc3VsdGluZyBpbiBhIEMgc3ludGF4IGVycm9yLgoKMTEvMjIvOTc6IEZpeGVkIGEgYnVnIHdoZW4gdGVtcGxhdGUgaGFuZGxpbmcgdGhhdCB3YXMgc3RyaXBwaW5nIHdoaXRlc3BhY2UKICAgICAgICAgIGFyb3VuZCBuZXN0ZWQgdGVtcGxhdGVzLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgRm9vPEJhcjxkb3VibGU+ID4KCiAgICAgICAgICB3YXMgZ2V0dGluZyBtdW5nZWQgaW50byBGb288QmFyPj4gd2hpY2ggaXMgYSBzeW50YXggZXJyb3IgaW4KICAgICAgICAgIGluIHRoZSBDKysgY29tcGlsZXIuCgoxMS8yMi85NzogRml4ZWQgYnVncyBpbiB0aGUgQm9ybGFuZCBDKysgbWFrZWZpbGVzLgoKMTEvMjIvOTc6IEZpeGVkIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyB3aGVuIHByb2Nlc3NpbmcgaW50ZWdlcgogICAgICAgICAgYXJndW1lbnRzIGluIFRjbDggbW9kdWxlLgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBSdW50aW1lL01ha2VmaWxlIHJlbGF0ZWQgdG8gVGNsIDguCgoxMS8yMS85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgTm8gbG9uZ2VyIGdlbmVyYXRlcyBhIHBlcmwgc3ludGF4IGVycm9yLgoKMTEvOS85NyA6IENoYW5nZWQgYSBzdHJuY3B5KCkgdG8gc3RyY3B5KCkgaW4gdGhlIHBvaW50ZXIgdHlwZS1jaGVja2VyLgogICAgICAgICAgVGhpcyByZXN1bHRzIGluIGEgc3Vic3RhbnRpYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaW4KICAgICAgICAgIHR5cGUtY2hlY2tpbmcuCgoxMC8yOS85NzogRml4ZWQgYSBidWcgaW4gdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cyBhbmQKICAgICAgICAgIHVzZXItZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oVmVjdG9yIGEsIFZlY3RvciBiID0gZCk7CgogICAgICAgICAgc2hvdWxkIG5vdyB3b3JrIHByb3Blcmx5LgoKVmVyc2lvbiAxLjEgUGF0Y2ggMiAoU2VwdGVtYmVyIDQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS80Lzk3ICA6IEZpeGVkIHByb2JsZW0gd2l0aCBoYW5kbGluZyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGF0CiAgICAgICAgICB3YXMgaW50cm9kdWNlZCBieSBzb21lIGNoYW5nZXMgaW4gdGhlIEMrKyBtb2R1bGUuCgpWZXJzaW9uIDEuMSBQYXRjaCAxIChBdWd1c3QgMjcsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjgvMjYvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBhbmQgcnVuLXRpbWUgYnVncyB3aXRoIFRjbCA4LjAgZmluYWwuCgo4LzIxLzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIGFycmF5cyBhcHBlYXJpbmcgYXMgYXJndW1lbnRzCiAgICAgICAgICB0byBDKysgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBCYXIoaW50IGFbMjBdWzIwXSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHVzaW5nIGFycmF5cyB3aXRoIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGhvd2V2ZXIuCgo4LzIwLzk3IDogRml4ZWQgYSBidWcgd2l0aCBnZW5lcmF0aW5nIHRoZSBjb2RlIGZvciBhZGRlZCBtZXRob2RzCiAgICAgICAgICBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjgvMTkvOTcgOiBNb2RpZmllZCB0aGUgdHlwZW1hcHBlciB0byBzdWJzdGl0dXRlIHRoZSAnJGFyZycgdmFsdWUKICAgICAgICAgIHdoZW4gZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcy4gICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogKGRvdWJsZSB0ZW1wXyRhcmcpIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIGFwcGxpZWQgdG8gYSByZWFsIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKnJlc3VsdCk7CgogICAgICAgICAgdGhyZWUgbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgY3JlYXRlZCBhcyBmb2xsb3dzIDoKCiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYTsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9iOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX3Jlc3VsdDsKCiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBtdWx0aXBsZSB0eXBlbWFwcyB0aGF0IG5lZWQKICAgICAgICAgIHRvIGFjY2VzcyB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMuCgoKNy8yNy85NyA6IEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyB3aXRoIHRoZSAlYXBwbHkgZGlyZWN0aXZlIGFuZCBhcnJheXMuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRlY2xhcmF0aW9ucyBzaG91bGQgbm93IHdvcmsgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbQU5ZXSB7IFJlYWwgW0FOWV0gfTsKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbNF0geyBkb3VibGUgWzEwXSB9OwoKICAgICAgICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIGFwcGx5IGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIHsgUmVhbCB9OwoKICAgICAgICAgIHNob3VsZCBub3cgd29yay0tZXZlbiBpZiBhcnJheXMgaW52b2x2aW5nIGRvdWJsZXMgYW5kIFJlYWxzIGFyZQogICAgICAgICAgdXNlZCBsYXRlci4KCjcvMjcvOTcgOiBDaGFuZ2VkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAiQXJyYXkgWCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gWSIgdG8KICAgICAgICAgIG9ubHkgYXBwZWFyIGlmIHJ1bm5pbmcgU1dJRyBpbiB2ZXJib3NlIG1vZGUuCgo3LzI3Lzk3IDogQWRkZWQgdGhlIHZhcmlhYmxlcyAkcGFybW5hbWUgYW5kICRiYXNlbWFuZ2xlIHRvIHRoZSB0eXBlbWFwCiAgICAgICAgICBnZW5lcmF0b3IuICAgICRwYXJtbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHVzZWQKICAgICAgICAgIHdoZW4gdGhlIHR5cGVtYXAgd2FzIG1hdGNoZWQuICBJdCBtYXkgYmUgIiIgaWYgbm8gcGFyYW1ldGVyCiAgICAgICAgICB3YXMgdXNlZC4gICAkYmFzZW1hbmdsZSBpcyBhIG1hbmdsZWQgdmVyc2lvbiBvZiB0aGUgYmFzZQogICAgICAgICAgZGF0YXR5cGUuICAgIFNvbWV0aW1lcyB1c2VkIGZvciBhcnJheSBoYW5kbGluZy4KCjcvMjcvOTcgOiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiBvdXRwdXQgYXJndW1lbnRzIHdpdGggUHl0aG9uIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgT3JpZ2luYWxseSwgaWYgYSBmdW5jdGlvbiByZXR1cm5lZCBhbiBvYmplY3QgJ0ZvbycsIHRoZSBzaGFkb3cgY2xhc3MKICAgICAgICAgIG1lY2hhbmlzbSB3b3VsZCBjcmVhdGUgY29kZSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGb29QdHIoc2hhZG93Yy5yZXR1cm5fZm9vKCkpCiAgICAgICAgICAgICAgICAgICAgICB2YWwudGhpcyA9IDEKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0eXBlbWFwcyBhbGxvdyBhIHVzZXIgdG8gcmVkZWZpbmUKICAgICAgICAgIHRoZSBvdXRwdXQgYmVoYXZpb3Igb2YgYSBmdW5jdGlvbi0tYXMgYSByZXN1bHQsIHdlIGNhbiBubyBsb25nZXIKICAgICAgICAgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSByZXR1cm4gdHlwZSBiZWluZyBhIHBvaW50ZXIgb3IKICAgICAgICAgIGV2ZW4gYmVpbmcgYSBzaW5nbGUgdmFsdWUgZm9yIHRoYXQgbWF0dGVyIChpdCBjb3VsZCBiZSBhIGxpc3QsCiAgICAgICAgICB0dXBsZSwgZXRjLi4uKS4gICBJZiBTV0lHIGRldGVjdHMgdGhlIHVzZSBvZiBvdXRwdXQgdHlwZW1hcHMKICAgICAgICAgIChlaXRoZXIgIm91dCIgb3IgImFyZ291dCIpIGl0IHJldHVybnMgdGhlIHJlc3VsdCB1bm1vZGlmaWVkIGxpa2UKICAgICAgICAgIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzaGFkb3djLnJldHVybl9mb28oKQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvCiAgICAgICAgICB3aXRoIHRoZSByZXR1cm4gdmFsdWUgKGluY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YgY29udmVydGluZyBpdAogICAgICAgICAgaW50byBhIFB5dGhvbiBjbGFzcykuCgo3LzI2Lzk3IDogRml4ZWQgYSBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlcyBsaWtlICd1bnNpZ25lZCBsb25nIGludCcsCiAgICAgICAgICAndW5zaWduZWQgc2hvcnQgaW50JywgZXRjLi4uCgo3LzI0Lzk3IDogTWlub3IgYnVnIGZpeCB0byBUY2wgOCBtb2R1bGUgdG8gcGFyc2UgZW51bXMgcHJvcGVybHkuICBBbHNvCiAgICAgICAgICBmaXhlZCBhIG1lbW9yeSBjb3JydXB0aW9uIHByb2JsZW0gaW4gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgIChwYXRjaCBjb250cmlidXRlZCBieSBIZW5yeSBSb3dsZXkuCgo3LzI0Lzk3IDogQWRkZWQgUHl0aG9uLXR1cGxlIHR5cGVtYXBzIGNvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgo3LzI0Lzk3IDogSW5jb3Jwb3JhdGVkIHNvbWUgY2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZSBpbiBzdXBwb3J0IG9mCiAgICAgICAgICBNYXJrIEhhbW1vbmQncyBDT00gc3VwcG9ydC4gIEknbSBub3QgZW50aXJlbHkgc3VyZSB0aGV5CiAgICAgICAgICB3b3JrIHlldCBob3dldmVyLiAgTmVlZHMgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KCjcvMjQvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyB3aGVuIHN0cnVjdHVyZXMgaGFkIGFycmF5IG1lbWJlcnMKICAgICAgICAgIGFuZCB0eXBlbWFwcyB3ZXJlIHVzZWQuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcmluKSBkb3VibGUgWzIwXVsyMF0gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhIGRvdWJsZSBbMjBdWzIwXSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhWzIwXVsyMF07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIE9yaWdpbmFsbHksIHRoaXMgd291bGQgZ2VuZXJhdGUgYSBjb21waWxlci10eXBlIGVycm9yIHdoZW4KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2FzIGNvbXBpbGVkLiAgIE5vdywgYSBoZWxwZXIgZnVuY3Rpb24gbGlrZQogICAgICAgICAgdGhpcyBpcyBnZW5lcmF0ZWQgOgoKICAgICAgICAgICAgICAgIGRvdWJsZSAqRm9vX2Ffc2V0KEZvbyAqYSwgZG91YmxlIHZhbFsyMF1bMjBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gbWVtYmVyaW4gdHlwZW1hcCBoZXJlIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUgKikgdmFsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgb25lIGNhbiBhc3N1bWUgdGhhdCB0aGUgc291cmNlIHZhcmlhYmxlCiAgICAgICAgICBpcyBhbiBhcnJheSBvZiB0aGUgKnNhbWUqIHR5cGUgYXMgdGhlIHN0cnVjdHVyZSBtZW1iZXIuIFRoaXMKICAgICAgICAgIG1heSBicmVhayBzb21lIGNvZGVzIHRoYXQgbWFuYWdlZCB0byB3b3JrIGFyb3VuZCB0aGUgYXJyYXkgYnVnLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzEzLzk3IDogRml4ZWQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuIHVzaW5nIEMgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CiAgICAgICAgICBhcmUgcG9pbnRlcnMuICBXaGVuIHVzZWQgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMsCiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgd291bGQgYmUgaW52YWxpZC0tLWNhdXNpbmcgY29yZQogICAgICAgICAgZHVtcHMgYW5kIG90aGVyIHByb2JsZW1zLiAgU1dJRyBpbXBsZW1lbnRzIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgIHVzaW5nIFBlcmwgbWFnaWMgdmFyaWFibGVzLiAgQXMgaXQgdHVybnMgb3V0LCB0aGUgZXJyb3IKICAgICAgICAgIHdhcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcG9pbnRlci1leHRyYWN0aW9uIGNvZGUKICAgICAgICAgIHdhcyBzb21laG93IGJ5cGFzc2luZyB0aGUgcHJvY2VkdXJlIHVzZWQgdG8gcmVzb2x2ZSBtYWdpY2FsCiAgICAgICAgICB2YXJpYWJsZXMgKGhlbmNlLCBsZWF2aW5nIHRoZSB2YWx1ZSB1bmRlZmluZWQpLiAgVG8gZml4CiAgICAgICAgICB0aGUgcHJvYmxlbSwgU1dJRyBub3cgZXhwbGljaXRseSByZXNvbHZlcyBtYWdpYyBiZWZvcmUKICAgICAgICAgIGV4dHJhY3RpbmcgcG9pbnRlciB2YWx1ZXMuCgo3LzEyLzk3IDogRWxpbWluYXRlZCB0aGUgbGFzdCByZW1uYW50cyBvZiBmcmVlKCkgYW5kIG1hbGxvYygpIGZyb20KICAgICAgICAgIHRoZSBTV0lHIGNvbXBpbGVyLgoKNy8xMi85NyA6IEZpeGVkIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzIGFuZAogICAgICAgICAgdGVtcG9yYXJ5IHZhcmlhYmxlcyBvZiBhcnJheXMuICAgIEFsc28gbWFkZSBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgIFNXSUcgdG8gaGFuZGxlIHR5cGVtYXBzIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV0gKGRvdWJsZSB0ZW1wWyRkaW0wXSkgewoJCSAgICAgIC4uLiBzdG9yZSBkYXRhIGluIHRlbXBbJGRpbTBdIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3Qgb25seSBkb2VzIHRoaXMgdHlwZW1hcCBtYXRjaCBhbnkgZG91YmxlIFtdIGFycmF5LCBpdAogICAgICAgICAgY3JlYXRlcyBhIGxvY2FsIHZhcmlhYmxlIHdpdGggcHJlY2lzZWx5IHRoZSByaWdodCBkaW1lbnNpb25zLgogICAgICAgICAgKGllLiAkZGltMCBnZXRzIGZpbGxlZCBpbiB3aXRoIHRoZSByZWFsIG51bWJlciBvZiBkaW1lbnNpb25zKS4KICAgICAgICAgIE9mIGNvdXJzZSwgb2ZmIHRoZSByZWNvcmQsIHRoaXMgd2lsbCBiZSBhIHdheSB0byBhZGQgbW9yZQogICAgICAgICAgZnVuY3Rpb25hbGl0eSB0byB0aGUgdHlwZW1hcHMuaSBsaWJyYXJpZXMuCgo3LzkvOTcgIDogRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIFBlcmw1LCBzdGF0aWMgbGlua2luZywgYW5kIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFdoZW4gc3RhdGljYWxseSBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMgdG9nZXRoZXIsIHdyaXRlCiAgICAgICAgICBhIHRvcC1sZXZlbCBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgd2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICB1c2VkIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb28sIGJhciwgZ2xvYjsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdGhlIG1vZHVsZSBuYW1lcyBoYXZlIGFuIGV4dHJhICdjJwogICAgICAgICAgYXBwZW5kZWQgc28gaXQgc2hvdWxkIHJlYWQgYXMgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvb2MsIGJhcmMsIGdsb2JjOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcywgY29uc2lkZXIgdXNpbmcgdGhlIFNXSUcgcnVudGltZQogICAgICAgICAgbGlicmFyeS4KCjcvOC85NyAgOiBJbmNvcnBvcmF0ZWQgZml4ZWQgdmVyc2lvbnMgb2YgdGhlIEJvcmxhbmQgQysrIE1ha2VmaWxlcy4KCjcvOC85NyAgOiBGaXJzdCBjdXQgYXQgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBleGNlc3NpdmUgY29tcGlsZXIgd2FybmluZ3MuCiAgICAgICAgICBBcyBpdCB0dXJucyBvdXQsIGFsb3Qgb2Ygd2FybmluZ3MgZ28gYXdheSBpZiB5b3UganVzdCBtYWtlCiAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICBjbGllbnREYXRhID0gY2xpZW50RGF0YTsKCiAgICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS4gIE1vc3QgY29tcGlsZXJzIHNob3VsZCBqdXN0CiAgICAgICAgICBpZ25vcmUgdGhpcyBjb2RlIChhdCBsZWFzdCB3b3VsZCBjYW4gaG9wZSkuCgo3LzgvOTcgIDogRml4ZWQgYml6YXJyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggdHlwZW1hcHMgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgSW4gc29tZSBjYXNlcywgdHlwZW1hcHMgY29udGFpbmluZyBwcmludGYgZm9ybWF0dGluZyBzdHJpbmdzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcm91dCkgaW50ICogewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsNDIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgZ2VuZXJhdGUgY29tcGxldGVseSBib2d1cyBjb2RlIHdpdGggZ2FyYmFnZSByZXBsYWNpbmcKICAgICAgICAgIHRoZSAnJWQnLiAgIENhdXNlZCBieSBvbmUgZmF1bHR5IHVzZSBvZiBwcmludGYgKHdhc24ndCBhYmxlIHRvIGZpbmQKICAgICAgICAgIGFueSBvdGhlciBvY2N1cnJlbmNlcykuCgo3LzcvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aXRoIG5vbi1tZW1iZXIKICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGFyZSByZXR1cm5pbmcgbW9yZSB0aGFuIG9uZSB2YWx1ZS4KCjcvNy85NyAgOiBJbmNvcnBvcmF0ZWQgbW9kaWZpY2F0aW9ucyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEd1aWxlIDEuMi4KICAgICAgICAgIFN0aWxsIG5lZWQgdG8gdGVzdCBpdCBvdXQsIGJ1dCBpdCBpcyBydW1vcmVkIHRvIHdvcmsuCgo3LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gb3V0cHV0IGFyZ3VtZW50cyBhbmQgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gICAgSWYgYW4gb3V0cHV0IGFyZ3VtZW50IGlzIGRldGVjdGVkLCBTV0lHIGFzc3VtZXMKICAgICAgICAgIHRoYXQgdGhlIHJlc3VsdCBpcyBhIGxpc3QgYW5kIGhhbmRsZXMgaXQgYXBwcm9wcmlhdGVseS4KICAgICAgICAgIElmIHRoZSBub3JtYWwgcmV0dXJuIHR5cGUgb2YgYW4gZnVuY3Rpb24gaXMgYW4gb2JqZWN0LAogICAgICAgICAgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIHNoYWRvdyBjbGFzcyBhcyBiZWZvcmUsIGJ1dAogICAgICAgICAgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEKICAgICAgICAgIGxpc3QuICAqKiogTk9URSA6IFRoaXMgYmVoYXZpb3IgaGFzIGJlZW4gc3Vic2VxdWVudGx5IGNoYW5nZWQgKioqCgo2LzI5Lzk3IDogQ2hhbmdlZCBFWFBPUlQgdG8gU1dJR0VYUE9SVCBpbiBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICBTaG91bGQgcHJvdmlkZSBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MuCgo2LzI5Lzk3IDogTW9kaWZpZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHNvIHRoYXQgb3V0cHV0IGFyZ3VtZW50cwogICAgICAgICAgd29yayBjb3JyZWN0bHkgKHdoZW4gdHlwZW1hcHMgYXJlIHVzZWQpLgoKVmVyc2lvbiAxLjEgKEp1bmUgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8yNC85NyA6IEZpeGVkIE9iamVjdGl2ZS1DIGNvbnN0cnVjdG9yIGJ1ZyB3aGVuIHdvcmtpbmcgd2l0aCBQZXJsNQogICAgICAgICAgc2hhZG93IGNsYXNzZXMuCgo2LzIzLzk3IDogRml4ZWQgc29tZSBwYXJzaW5nIHByb2JsZW1zIHdpdGggT2JqZWN0aXZlLUMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBub3cgOgoKICAgICAgICAgICAgICAgLSBmb28gOiAoaW50KSBhIHdpdGg6IChpbnQpIGI7Cgo2LzIyLzk3IDogQWRkZWQgU1dJRyBSdW50aW1lIGxpYnJhcnkuICAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zCiAgICAgICAgICB0aGUgU1dJRyBwb2ludGVyIHR5cGUtY2hlY2tlciBhbmQgc3VwcG9ydCBmdW5jdGlvbnMKICAgICAgICAgIHRoYXQgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIGV2ZXJ5IG1vZHVsZS4gIEJ5IHVzaW5nCiAgICAgICAgICB0aGUgbGlicmFyeSwgaXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBTV0lHCiAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBtaW5vciBidWcgaW4gUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9mIG11bHRpcGxlIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBXaGVuIHVzZWQgd2l0aAogICAgICAgICAgUGVybDUgc2hhZG93IGNsYXNzZXMsIHRoaXMgZ2VuZXJhdGVzIGEgJ3JlcXVpcmUnIHN0YXRlbWVudAogICAgICAgICAgdG8gbG9hZCBpbiBleHRlcm5hbCBtb2R1bGVzLgoKNi8yMi85NyA6IEFkZGVkIC1zd2lnbGliIG9wdGlvbi4gIFRoaXMgcHJpbnRzIG91dCB0aGUgbG9jYXRpb24gb2YgdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkgYW5kIGV4aXRzLiAgVGhpcyBvcHRpb24gaXMgb25seSByZWFsbHkgdXNlZnVsIHRvCiAgICAgICAgICBjb25maWd1cmF0aW9uIHRvb2xzIHRoYXQgYXJlIGxvb2tpbmcgZm9yIFNXSUcgYW5kIGl0cyBsaWJyYXJ5CiAgICAgICAgICBsb2NhdGlvbiAoZS5nLiBhdXRvY29uZiwgY29uZmlndXJlLCBldGMuLi4pLgoKNi8yMS85NyA6IEZpeGVkIGV4cG9ydCBidWcgd2l0aCBQZXJsNS4wMDQgb24gV2luZG93cy1OVC4KCjYvMjAvOTcgOiBNaW5vciBjaGFuZ2UgdG8gY29kZSBnZW5lcmF0aW9uIG9mIGNsYXNzL3N0cnVjdHVyZSBtZW1iZXJzIGluCiAgICAgICAgICBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIHR5cGVtYXBzLiBTaG91bGQgaGF2ZSBubyBub3RpY2FibGUKICAgICAgICAgIGltcGFjdCBvbiBleGlzdGluZyBTV0lHIG1vZHVsZXMuCgo2LzE5Lzk3IDogQWRkZWQgLXQgb3B0aW9uLiBUaGlzIGFsbG93cyBTV0lHIHRvIGxvYWQgYSB0eXBlbWFwIGZpbGUgYmVmb3JlCiAgICAgICAgICBwcm9jZXNzaW5nIGFueSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHN3aWcgLXQgdHlwZW1hcHMuaSAtcHl0aG9uIGV4YW1wbGUuaQoKICAgICAgICAgIEF0IG1vc3QsIG9ubHkgb25lIHR5cGVtYXAgZmlsZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgbWFubmVyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xOC85NyA6IE5lZWQgYSBNYWtlZmlsZSBmYXN0PyBUeXBlCgogICAgICAgICAgICAgICAgIHN3aWcgWy10Y2wsIC1wZXJsNSwgLXB5dGhvbl0gLWNvIE1ha2VmaWxlCgogICAgICAgICAgYW5kIHlvdSB3aWxsIGdldCBhIE1ha2VmaWxlIHNwZWNpZmljIHRvIHRoYXQgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgWW91IGp1c3QgbmVlZCB0byBtb2RpZnkgaXQgZm9yIHlvdXIgYXBwbGljYXRpb24gYW5kIHlvdSdyZQogICAgICAgICAgcmVhZHkgdG8gcnVuLgoKNi8xOC85NyA6IENvbXBsZXRlZCB0aGUgLWNpIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGNoZWNrcyBhIGZpbGUgaW50byB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeS4gICBJdCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEKICAgICAgICAgIGxhbmd1YWdlIG9wdGlvbi4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGNsIC1jaSBmb29iYXIuaQoKICAgICAgICAgIENoZWNrcyB0aGUgZmlsZSBmb29iYXIuaSBpbnRvIHRoZSBUY2wgcGFydCBvZiB0aGUgbGlicmFyeS4KICAgICAgICAgIEluIG9yZGVyIHRvIGNoZWNrIGEgZmlsZSBpbnRvIHRoZSBnZW5lcmFsIGxpYnJhcnkgKGFjY2Vzc2libGUKICAgICAgICAgIHRvIGFsbCBsYW5ndWFnZXMgbW9kdWxlcyksIGRvIHRoZSBmb2xsb3dpbmcKCiAgICAgICAgICAgICAgICAgIHN3aWcgLWNpIC1vIC4uL2Zvb2Jhci5pIGZvb2Jhci5pCgogICAgICAgICAgKEFkbWl0dGVkbHkgdGhpcyBsb29rcyBhIGxpdHRsZSBzdHJhbmdlIGJ1dCBpcyB1bmF2b2lkYWJsZSkuCiAgICAgICAgICBUaGUgY2hlY2staW4gb3B0aW9uIGlzIHByaW1hcmlseSBkZXNpZ25lZCBmb3IgU1dJRyBtYWludGVuYW5jZQogICAgICAgICAgYW5kIGxpYnJhcnkgZGV2ZWxvcG1lbnQuIFRoZSBjb21tYW5kIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBkb2VzCiAgICAgICAgICBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIHRvIHRoZSBTV0lHIGxpYnJhcnkuICBUaGlyZCBwYXJ0eSBsaWJyYXJ5CiAgICAgICAgICBleHRlbnNpb25zIGNhbiBlYXNpbHkgaW5zdGFsbCB0aGVtc2VsdmVzIGJ5IHNpbXBseSBwcm92aWRpbmcKICAgICAgICAgIGEgc2hlbGwgc2NyaXB0IHRoYXQgdXNlcyAnc3dpZyAtY2knIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93IHdoZXJlIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgIGlzIGxvY2F0ZWQgaWYgeW91IHVzZSB0aGlzIG1lY2hhbmlzbS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTYvOTcgOiBGaXhlZCBhIGJ1ZyBpbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aGVuICVuYW1lKCkgd2FzIGFwcGxpZWQKICAgICAgICAgIHRvIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBVbmZvcnR1bmF0ZWx5LCBmaXhpbmcgdGhlIGJ1ZyByZXF1aXJlZAogICAgICAgICAgYSBjaGFuZ2UgaW4gdGhlIExhbmd1YWdlIEMgQVBJIGJ5IGFkZGluZyBhbiBleHRyYSBhcmd1bWVudCB0bwogICAgICAgICAgdGhlIExhbmd1YWdlOjpjcHBfY2xhc3NfZGVjbCgpIGZ1bmN0aW9uLiAgVGhpcyBtYXkgYnJlYWsKICAgICAgICAgIFNXSUcgQysrIGV4dGVuc2lvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvMTUvOTcgOiBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBubyBtb2R1bGUgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgICVtb2R1bGUgZGlyZWN0aXZlIG9yIC1tb2R1bGUgb3B0aW9uLgoKNi8xNS85NyA6IEZpeGVkIGxpbmUgbnVtYmVyIGJ1ZyB3aGVuIHJlcG9ydGluZyBlcnJvcnMgZm9yIHVuZGVmaW5lZAogICAgICAgICAgYmFzZSBjbGFzc2VzLgoKNi8xNS85NyA6IEFkZGVkIG5ldyAlcmVuYW1lIGRpcmVjdGl2ZS4gIFRoaXMgYWxsb3dzIHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uCiAgICAgICAgICBvZiBhIHJlbmFtaW5nLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lIE9sZE5hbWUgTmV3TmFtZTsKCiAgICAgICAgICAgICAgICAgLi4uLiBsYXRlciAuLi4KICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKICAgICAgICAgIFVubGlrZSAlbmFtZSwgJXJlbmFtZSB3aWxsIHJlbmFtZSBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgb2xkIG5hbWUuCiAgICAgICAgICBUaGlzIGFwcGxpZXMgdG8gZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGNsYXNzIG1lbWJlcnMgYW5kIHNvIGZvcnRoLgogICAgICAgICAgVGhlcmUgaXMgbm8gd2F5IHRvIGRpc2FibGUgJXJlbmFtZSBvbmNlIHNldCwgYnV0IHlvdSBjYW4gY2hhbmdlIHRoZQogICAgICAgICAgbmFtZSBieSByZWRlY2xhcmluZyBpdCB0byBzb21ldGhpbmcgZWxzZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTUvOTcgOiBJbXByb3ZlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBzbyB0aGF0IGl0CiAgICAgICAgICBjb3VsZCBiZSB1c2VkIHdpdGggY29uZGl0aW9uYWwgY29tcGlsYXRpb24gOgoKICAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1dJRwogICAgICAgICAgICAgICAgICAgICVuYW1lKE5ld05hbWUpCiAgICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCjYvMTUvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyByZXR1cm4gZGF0YXR5cGUuICBJbiB0aGlzIGNhc2UsCiAgICAgICAgICBTV0lHIGFzc3VtZXMgYSByZXR1cm4gdHlwZSBvZiAnaW50Jy4KCjYvMTEvOTcgOiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgaW4gdGhlIHBhcnNlci4gIEl0IHNob3VsZCBiZSBhIGxpdHRsZQogICAgICAgICAgbGVzcyBzZW5zaXRpdmUgdG8gZXJyb3JzIHRoYXQgb2NjdXIgaW5zaWRlIGNsYXNzIGRlZmluaXRpb25zCiAgICAgICAgICBub3cuICBBbHNvIHJlcG9ydHMgZXJyb3JzIGZvciBmdW5jdGlvbiBwb2ludGVycy4KCjYvMTEvOTcgOiBNYWRlICckJyBhIGxlZ2FsIHN5bWJvbCBpbiBpZGVudGlmaWVycy4gIFRoaXMgaXMgdG8gc3VwcG9ydAogICAgICAgICAgc29tZSBPYmplY3RpdmUtQyBsaWJyYXJpZXMuICBTb21lIGNvbXBpbGVycyAoc3VjaCBhcyBnY2MpIG1heSBhbHNvCiAgICAgICAgICBhbGxvdyBpZGVudGlmaWVycyB0byBjb250YWluIGEgJCBpbiBDL0MrKyBjb2RlIGFzIHdlbGwgKHRoaXMgaXMKICAgICAgICAgIGFuIG9ic2N1cmUgZmVhdHVyZSBvZiBDKS4gV2hlbiAnJCcgYXBwZWFycyBpbiBpZGVudGlmaWVyLCBTV0lHCiAgICAgICAgICByZW1hcHMgaXQgdG8gdGhlIHN0cmluZyAnX1NfJyB3aGVuIGNyZWF0aW5nIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGZ1bmN0aW9uLiBUaHVzIGEgZnVuY3Rpb24gJ2ZvbyRiYXInIHdvdWxkIGJlIGNhbGxlZCAnZm9vX1NfYmFyJy4KCjYvMTEvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHdpdGggX19yZXByX18gbWV0aG9kLiAgSWYKICAgICAgICAgIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLCBpdCB3YXMgaWdub3JlZCwgYnV0IG5vdyBpdCBzaG91bGQgd29yay4KCjYvOS85NyAgOiBGaXhlZCB0aGUgVGNsIDguMCBtb2R1bGUgdG8gd29yayB3aXRoIFRjbCA4LjBiMS4gICBTV0lHIGlzIG5vCiAgICAgICAgICBsb25nZXIgY29tcGF0aWJsZSB3aXRoICphbnkqIGFscGhhIHJlbGVhc2Ugb2YgVGNsIDguMC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi83Lzk3ICA6IFB1dCBhIG1heGltYWwgZXJyb3IgY291bnQgaW4gKGN1cnJlbnRseSBzZXQgdG8gMjApLiBTV0lHIHdpbGwgYmFpbCBvdXQKICAgICAgICAgIGlmIGl0IGdlbmVyYXRlcyBtb3JlIGVycm9ycyB0aGFuIHRoaXMgKHVzZWZ1bCBmb3IgcHJldmVudGluZyBTV0lHCiAgICAgICAgICBmcm9tIHByaW50aW5nIDQwMDAgc3ludGF4IGVycm9ycyB3aGVuIGl0IGdldHMgY29uZnVzZWQpLgoKNi83Lzk3ICA6IEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHBhcnNpbmcgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KCjYvNy85NyAgOiBNaW5vciBjaGFuZ2UgdG8gUGVybDUgbW9kdWxlLiAgQysrIHN0YXRpYyBmdW5jdGlvbnMgYXJlIG5vdwogICAgICAgICAgcHV0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlaXIgY2xhc3Mgd2hlbiB1c2luZyBzaGFkb3cgY2xhc3Nlcy4KCjYvNy85NyAgOiBDZW50cmFsaXplZCB0aGUgbmFtaW5nIG9mIGZ1bmN0aW9ucywgbWVtYmVycywgd3JhcHBlcnMgZXRjLi4uIEJ5CiAgICAgICAgICBjZW50cmFsaXppbmcgdGhlIG5hbWluZyBzY2hlbWUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlCiAgICAgICAgICBzb21lIG11bHRpLWZpbGUgb3B0aW1pemF0aW9ucy4gIEFsc28sIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bwogICAgICAgICAgY2hhbmdlIFNXSUcncyBuYW1pbmcgc2NoZW1lIChwZXJoYXBzIGEgbmV3IGZlYXR1cmUgdG8gYmUgYWRkZWQKICAgICAgICAgIGxhdGVyKS4KCjYvMi85NyAgOiBBZGRlZCAnYXJnaW5pdCcgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBpbml0aWFsIHZhbHVlcwogICAgICAgICAgdG8gZnVuY3Rpb24gYXJndW1lbnRzLiAgRG9pbmcgc28gbWFrZXMgaXQgc29tZXdoYXQgZWFzaWVyIHRvIGRldGVjdAogICAgICAgICAgaW1wcm9wZXIgYXJndW1lbnQgcGFzc2luZyB3aGVuIHdvcmtpbmcgd2l0aCBvdGhlciB0eXBlbWFwcy4KCjYvMi85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gcmVhZC1vbmx5IHZhcmlhYmxlcyB3ZXJlIGluaGVyaXRlZAogICAgICAgICAgaW50byBvdGhlciBjbGFzc2VzLiAgVW5kZXIgaW5oZXJpdGFuY2UsIHRoZSB2YXJpYWJsZXMgd291bGQKICAgICAgICAgIGJlY29tZSB3cml0YWJsZSwgYnV0IHRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZC4KCjUvMzAvOTcgOiBBbiBlbXB0eSAlbmFtZSgpIGRpcmVjdGl2ZSBpcyBubyBsb25nZXIgYWxsb3dlZCBvciBzdXBwb3J0ZWQuCiAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSB3YXMgb3JpZ2luYWxseSB1c2VkIHRvIHN0cmlwIHRoZSBwcmVmaXgKICAgICAgICAgIG9mZiBvZiBhIGNsYXNzIG9yIHN0cnVjdHVyZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbmV2ZXIgcmVhbGx5CiAgICAgICAgICBzZWVtZWQgdG8gd29yayByaWdodCBhbmQgaXQgY29tcGxpY2F0ZWQgdGhlIEMrKyBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgc2lnbmlmaWNhbnRseS4gICBBcyBmYXIgYXMgSSBjYW4gdGVsbCBubyBvbmUgdXNlcyBpdCwgc28gaXQKICAgICAgICAgIGlzIG5vdyBoaXN0b3J5LiAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzI4Lzk3IDogRml4ZWQgYSBwYXJzaW5nIGJ1ZyB3aXRoICNkZWZpbmUgYW5kIEMrKyBjb21tZW50cy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIG5vdyB3b3JrIHByb3Blcmx5IDoKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIENPTlNUICAgNCAgICAgLy8gQSBDb21tZW50Cgo1LzI4Lzk3IDogTWFkZSBzb21lIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgU1dJRyBTdHJpbmcgY2xhc3MuCiAgICAgICAgICAob25seSBhZmZlY3RzIHRoZSBTV0lHIGNvbXBpbGVyIGl0c2VsZikuCgo1LzI4Lzk3IDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBza2lwIHRlbXBsYXRlIGRlZmluaXRpb25zIGFuZCBpc3N1ZSBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuCgo1LzI4Lzk3IDogUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCB0eXBlcyBhZGRlZCAoaWUuIHRlbXBsYXRlcykuCiAgICAgICAgICBUeXBlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgU1dJRyBjb21waWxlcgoKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyh2ZWN0b3I8Y29tcGxleD4gKmEsIHZlY3Rvcjxkb3VibGU+ICpiKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIHRoZSBlbnRpcmUgbmFtZSAndmVjdG9yPGNvbXBsZXg+JyBiZWNvbWVzIHRoZSBuYW1lCiAgICAgICAgICBvZiB0aGUgZGF0YXR5cGUuICAgICAgRHVlIHRvIHNwYWNlIGxpbWl0YXRpb25zIGluIGRhdGF0eXBlCiAgICAgICAgICByZXByZXNlbnRhdGlvbnMsIHRoZSBuYW1lIHNob3VsZCBub3QgZXhjZWVkIDk2IGNoYXJhY3RlcnMuCgogICAgICAgICAgTm90ZSA6IFRoaXMgaXMgb25seSBwYXJ0IG9mIHdoYXQgaXMgbmVlZGVkIGZvciB0ZW1wbGF0ZSBzdXBwb3J0LgogICAgICAgICAgVGVtcGxhdGUgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IFNXSUcuCgogICAgICAgICAgVGhlIHRlbXBsYXRlIG5vdGF0aW9uIGFib3ZlIG1heSBhbHNvIGJlIHVzZWQgd2hlbiBzcGVjaWZ5aW5nCiAgICAgICAgICBPYmplY3RpdmUtQyBwcm90b2NvbCBsaXN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjQvOTcgOiBGaXJzdCBjdXQgYXQgT2JqZWN0aXZlLUMgc3VwcG9ydCBhZGRlZC4gICBBcyBpdCB0dXJucyBvdXQsIGFsbW9zdAogICAgICAgICAgZXZlcnl0aGluZyBjYW4gYmUgaGFuZGxlZCB3aXRoIG9ubHkgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyB0bwogICAgICAgICAgdGhlIEMrKyBtb2R1bGUuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzIzLzk3IDogRml4ZWQgcmVwZWF0ZWQgZGVmaW5pdGlvbiBidWcgaW4gbXVsdGlwbGUgaW5oZXJpdGFuY2UgaGFuZGxpbmcKICAgICAgICAgIHdoZW4gbXVsdGlwbGUgYmFzZSBjbGFzc2VzIHNoYXJlIGEgY29tbW9uIGJhc2UgY2xhc3MgKGllLgogICAgICAgICAgdGhlIGV2aWwgZGlhbW9uZCkuCgo1LzIxLzk3IDogRml4ZWQgcmF0aGVyIGVtYmFycmFzc2luZyB0eXBvIHRoYXQgd29ya2VkIGl0cyB3YXkgaW50byB0aGUKICAgICAgICAgIFRlc3RzL0J1aWxkIGRpcmVjdG9yeS4KCjUvMTkvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgbmF0aXZlIG1ldGhvZHMgYW5kCiAgICAgICAgICBzaGFkb3cgY2xhc3NlcyB3aXRoIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcy4KCjUvMTkvOTcgOiBNb2RpZmllZCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBzbGlnaHRseSBzbyB0aGF0IGl0IHdvdWxkIHdvcmsKICAgICAgICAgIHdpdGggcG9pbnRlcnMgYSBsaXR0bGUgYmV0dGVyLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgdW5zaWduZWQgbG9uZyB7IERXT1JEIH07CgogICAgICAgICAgQXBwbGllcyAqYWxsKiB0eXBlbWFwcyBhc3NvY2lhdGVkIHdpdGggInVuc2lnbmVkIGxvbmciIHRvCiAgICAgICAgICAiRFdPUkQiLiAgIFRoaXMgbm93IGluY2x1ZGVzIHBvaW50ZXJzIHRvIHRoZSB0d28gZGF0YXR5cGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGEgdHlwZW1hcCBhcHBsaWVkIHRvICJ1bnNpZ25lZCBsb25nICoqIiB3b3VsZAogICAgICAgICAgYWxzbyBiZSBhcHBsaWVkIHRvIGFueSBvY2N1cnJlbmNlIG9mICJEV09SRCAqKiIgYXMgd2VsbC4KCjUvMTkvOTcgOiBGaXhlZCBhbiBvd25lcnNoaXAgYXNzaWdubWVudCBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBjbGFzcyBtZW1iZXJzIHdlcmUgcmV0dXJuaW5nIG5ldyBvYmplY3RzIGJlbG9uZ2luZyB0bwogICAgICAgICAgZGlmZmVyZW50IGNsYXNzZXMuCgo1LzE3Lzk3IDogQWRkZWQgYSBmZXcgbW9yZSB0eXBlbWFwIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgICAgICRuYW1lICAgICAgICAgIC0gTmFtZSBvZiBmdW5jdGlvbi92YXJpYWJsZS9tZW1iZXIKICAgICAgICAgICAgICAgICAgJGJhc2V0eXBlICAgICAgLSBCYXNlIGRhdGF0eXBlICh0eXBlIHdpdGhvdXQgcG9pbnRlcnMpCiAgICAgICAgICAgICAgICAgICRhcmdudW0gICAgICAgIC0gQXJndW1lbnQgbnVtYmVyCgo1LzE2Lzk3IDogRml4ZWQgZW1iYXJyYXNzaW5nIHVuZGVyc2NvcmUgZXJyb3IgaW4gbG9jYWwgdmFyaWFibGUKICAgICAgICAgIGFsbG9jYXRvci4KCjUvMTYvOTcgOiBGaXhlZCBuYW1lc3BhY2UgY2xhc2ggYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMKICAgICAgICAgIHdoZW4gY3JlYXRpbmcgYXJyYXlzIGFzIG5ldyBsb2NhbCB2YXJpYWJsZXMuCgo1LzE1Lzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggaW5oZXJpdGFuY2Ugb2YgYWRkZWQgbWV0aG9kcyBhY3Jvc3MKICAgICAgICAgIG11bHRpcGxlIGZpbGVzLiAgIFNXSUcgbm93IHVzZXMgbmFtZXMgb2YgYmFzZSBjbGFzc2VzCiAgICAgICAgICB3aGVuIGdlbmVyYXRpbmcgc3VjaCBmdW5jdGlvbnMuCgo1LzE0Lzk3IDogRmluaXNoZWQgc3VwcG9ydCBmb3IgZGVmYXVsdCB0eXBlbWFwcy4gIFByaW1hcmlseSB1c2VkCiAgICAgICAgICBpbnRlcm5hbGx5LCB0aGV5IGNhbiBiZSB1c2VkIHRvIG1hdGNoIHRoZSBiYXNpYwogICAgICAgICAgYnVpbHQtaW4gZGF0YXR5cGVzIHVzZWQgaW5zaWRlIG9mIFNXSUcuICAgWW91IGNhbgogICAgICAgICAgc3BlY2lmeSB0aGVtIGluIGludGVyZmFjZSBmaWxlcyBhcyB3ZWxsIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSBhdG9pKCR0YXJnZXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgVW5saWtlIG5vcm1hbCB0eXBlbWFwcywgdGhpcyBkZWZhdWx0IG1hcCB3aWxsIGdldCBhcHBsaWVkCiAgICAgICAgICB0byAqYWxsKiBpbnRlZ2VyIGRhdGF0eXBlcyBlbmNvdW50ZXJlZCwgaW5jbHVkaW5nIHRob3NlCiAgICAgICAgICByZW5hbWVkIHdpdGggdHlwZWRlZiwgZXRjLi4uCgo1LzEzLzk3IDogRml4ZWQgc3Vic3RyaW5nIGJ1ZyBpbiB0eXBlIGNoZWNrZXIuCgo1LzEyLzk3IDogRml4ZWQgYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMgd2hlbiBkZWNsYXJpbmcgbG9jYWwKICAgICAgICAgIHZhcmlhYmxlcyBvZiBzdHJ1Y3R1cmVzLgoKVmVyc2lvbiAxLjEgQmV0YTYgKE1heSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo1LzkvOTcgIDogRml4ZWQgYml6YXJyZSBOVUxMIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmw1IG1vZHVsZS4KCjUvOC85NyAgOiBGaXhlZCBteXN0ZXJpb3VzIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHJ1bm5pbmcgU1dJRyBvbiBhbgogICAgICAgICAgZW1wdHkgZmlsZS4KCjUvNy85NyAgOiBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCBub3cgcmVwbGFjZSB0aGUgc3BlY2lhbCBzeW1ib2wgIiRjbGVhbnVwIgogICAgICAgICAgd2l0aCB0aGUgY2xlYW51cCBjb2RlIHNwZWNpZmllZCB3aXRoIHRoZSAiZnJlZWFyZyIgdHlwZW1hcC4KICAgICAgICAgIFRoaXMgY2hhbmdlIG5lZWRlZCB0byBwcm9wZXJseSBtYW5hZ2UgbWVtb3J5IGFuZCBleGNlcHRpb25zLgoKNS81Lzk3ICA6IEFkZGVkIHRoZSAndHlwZW1hcHMuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBjb250YWlucyBhCiAgICAgICAgICB2YXJpZXR5IG9mIGNvbW1vbiB0eXBlbWFwcyBmb3IgaW5wdXQgdmFsdWVzLCBwb2ludGVycywKICAgICAgICAgIGFuZCBzbyBvbi4KCjUvNS85NyAgOiBDaGFuZ2VkIGJlaGF2aW9yIG9mICJhcmdvdXQiIHR5cGVtYXAgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgIE9sZCB2ZXJzaW9ucyBhdXRvbWF0aWNhbGx5IHR1cm5lZCB0aGUgcmVzdWx0IGludG8gYQogICAgICAgICAgUHl0aG9uIGxpc3QuICBUaGUgbmV3IHZlcnNpb24gZG9lcyBub3RoaW5nLCBsZWF2aW5nIHRoZQogICAgICAgICAgaW1wbGVtZW50YXRpb24gdXAgdG8gdGhlIHVzZXIuICBUaGlzIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkKICAgICAgICAgIGJ1dCBtYXkgYnJlYWsgb2xkZXIgY29kZXMgdGhhdCByZWx5IG9uIHR5cGVtYXBzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24gb2YKICAgICAgICAgICJhcmdvdXQiIGFuZCAiaWdub3JlIiB0eXBlbWFwcy4KCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB0aGF0IHdvdWxkIGdlbmVyYXRlIGluY29ycmVjdCBjb2RlCiAgICAgICAgICBpZiBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSAiaWdub3JlZCIuCgo1LzQvOTcgIDogQWRkZWQgJWFwcGx5IGFuZCAlY2xlYXIgZGlyZWN0aXZlcy4gICBUaGVzZSBmb3JtIGEgaGlnaGVyIGxldmVsCiAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHR5cGVtYXAgbWVjaGFuaXNtLiAgSW4gYSBudXRzaGVsbCwgdGhleQogICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBwcm9jZXNzaW5nIG9mIHZhcmlvdXMgZGF0YXR5cGVzIHdpdGhvdXQKICAgICAgICAgIGV2ZXIgaGF2aW5nIHRvIHdyaXRlIGEgdHlwZW1hcC4gIFNlZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uCiAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLiAgKiogTkVXIEZFQVRVUkUgKioKCjUvNC85NyAgOiBBZGRlZCBhIGxvY2FsIHZhcmlhYmxlIGV4dGVuc2lvbiB0byB0aGUgdHlwZW1hcCBoYW5kbGVyLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSAqKGRvdWJsZSB0ZW1wKSB7CgkJICAgICAgICB0ZW1wID0gYXRvZigkc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiB0aGlzIGNhc2UsICd0ZW1wJyBpcyBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgZXhpc3RzCiAgICAgICAgICBpbiB0aGUgZW50aXJlIHdyYXBwZXIgZnVuY3Rpb24gKG5vdCBqdXN0IHRoZSB0eXBlbWFwCiAgICAgICAgICBjb2RlKS4gIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIGJldHRlciBzdXBwb3J0IGZvcgogICAgICAgICAgY2VydGFpbiB0eXBlcyBvZiBhcmd1bWVudCBoYW5kbGluZyBhbmQgYWxzbyBtYWtlcyBpdAogICAgICAgICAgcG9zc2libGUgdG8gd3JpdGUgdGhyZWFkLXNhZmUgdHlwZW1hcHMuICBBbnkgbnVtYmVyCiAgICAgICAgICBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIGRlY2xhcmVkIGJ5IHN1cHBseWluZyBhIGNvbW1hCiAgICAgICAgICBzZXBhcmF0ZWQgbGlzdC4gICBMb2NhbCB2YXJpYWJsZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUKICAgICAgICAgIHVuaXF1ZSwgZXZlbiBpZiB0aGUgc2FtZSB0eXBlbWFwIGlzIGFwcGxpZWQgbWFueSB0aW1lcwogICAgICAgICAgaW4gYSBnaXZlbiBmdW5jdGlvbi4KICAgICAgICAgICoqIE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFBlcmw0IG9yIEd1aWxlIG1vZHVsZXMuCgo1LzIvOTcgIDogRml4ZWQgcHJvY2Vzc2luZyBvZiAlaWZkZWYsICVlbmRpZiwgJWlmLCBldGMuLi4gIChUaGVzZSBhcmUKICAgICAgICAgIFNXSUcgZXF1aXZhbGVudHMgb2YgdGhlIEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgY2FuIHBhc3MgdGhyb3VnaCB0aGUgQyBwcmVwcm9jZXNzb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLgoKNS8yLzk3ICA6IEZpeGVkIG1ham9yIChidXQgc3VidGxlKSBidWcgaW4gdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlcgogICAgICAgICAgcmVsYXRlZCB0byBzZWFyY2hpbmcgYW5kIHR5cGUtY2hlY2tpbmcgZm9yIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgIFRvIG1ha2UgYSBsb25nIHN0b3J5IHNob3J0LCBpZiB5b3UgaGFkIHR3byBjbGFzc2VzIG5hbWVkCiAgICAgICAgICAiRm9vIiBhbmQgIkZvb09iamVjdCIgdGhlIHR5cGUgY2hlY2tlciB3b3VsZCBzb21ldGltZXMKICAgICAgICAgIGdldCBjb25mdXNlZCBhbmQgYmUgdW5hYmxlIHRvIGxvY2F0ZSAiRm9vIiBpbiBhbiBpbnRlcm5hbAogICAgICAgICAgdGFibGUuCgo1LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIGluIHRoZSAtY28gb3B0aW9uLgoKNC8yNC85NyA6IFBvaW50ZXIgbGlicmFyeSBhZGRlZCB0byB0aGUgU1dJRyBsaWJyYXJ5LgoKNC8xOS85NyA6IEFkZGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gICBUaGlzIGlzIGEgImhpbnQiIHRoYXQgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIHRlbGwgU1dJRyB0aGF0IGEgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC4gRm9yCiAgICAgICAgICBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgRm9vICpjcmVhdGVfZm9vKCk7CgogICAgICAgICAgVGhpcyB0ZWxscyBTV0lHIHRoYXQgY3JlYXRlX2ZvbygpIGlzIGNyZWF0aW5nIGEgbmV3IG9iamVjdAogICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgdG8gaXQuICAgTWFueSBsYW5ndWFnZSBtb2R1bGVzIG1heQogICAgICAgICAgY2hvb3NlIHRvIGlnbm9yZSB0aGUgaGludCwgYnV0IHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLAogICAgICAgICAgdGhlICVuZXcgaXMgdXNlZCB0byBoYW5kbGUgcHJvcGVyIG93bmVyc2hpcCBvZiBvYmplY3RzLgoKICAgICAgICAgICVuZXcgY2FuIGFsc28gYmUgdXNlZCB3aXRoIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmdzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBjaGFyICpjcmVhdGVfc3RyaW5nKCk7CgogICAgICAgICAgV2hlbiB1c2VkLCBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNsZWFudXAKICAgICAgICAgIHRoZSByZXR1cm5lZCBzdHJpbmctLWVsaW1pbmF0aW5nIG1lbW9yeSBsZWFrcy4KICAgICAgICAgICoqIE5FVyBGRUFUVVJFICoqCgo0LzE5Lzk3IDogQWRkZWQgYSBuZXcgdHlwZW1hcCAibmV3ZnJlZSIuICAgVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICAgICAgIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBtZXRob2QgYnkgd2hpY2gKICAgICAgICAgIGEgbmV3IG9iamVjdCByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGlzIGRlbGV0ZWQuCgo0LzE5Lzk3IDogVGhlIHN5bWJvbCAiX19jcGx1c3BsdXMiIGlzIG5vdyBkZWZpbmVkIGluIHRoZSBTV0lHIGludGVycHJldGVyCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgLWMrKyBvcHRpb24uCgo0LzE3Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgd2hlbiB1c2VkIGluc2lkZSB0aGUKICAgICAgICAgICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjQvMTUvOTcgOiBBZGRlZCBhIHNwZWNpYWwgdHlwZW1hcCBzeW1ib2wgUFJFVklPVVMgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgcmVzdG9yZSBhIHByZXZpb3VzIHR5cGVtYXAuIEZvciBleGFtcGxlIDoKCgkgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCAqID0gUFJFVklPVVM7CgogICAgICAgICAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiBsaWJyYXJ5IGZpbGVzLgoKNC8xMy85NyA6IEFkZGVkICVwcmFnbWEgZGlyZWN0aXZlIGZvciBQZXJsNSBtb2R1bGUuICAgVHdvIG5ldyBwcmFnbWFzIGFyZQogICAgICAgICAgYXZhaWxhYmxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgY29kZSA9ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJmaWxlLnBsIgoKICAgICAgICAgIEJvdGggaW5zZXJ0IGNvZGUgaW50byB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLiAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBjdXN0b21pemUgdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4KCjQvMTMvOTcgOiBTY2FubmVyIG1vZGlmaWVkIHRvIG9ubHkgcmVjb2duaXplIEMrKyBrZXl3b3JkcyB3aGVuIHRoZSAtYysrCiAgICAgICAgICBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLiAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBDIHByb2dyYW1zCiAgICAgICAgICB0aGF0IG1ha2UgdXNlIG9mIHRoZXNlIGtleXdvcmRzIGZvciBpZGVudGlmaWVycy4KICAgICAgICAgIFNXSUcgbWF5IG5lZWQgdG8gYmUgZXhwbGljaXRseSBydW4gd2l0aCB0aGUgLWMrKyBvcHRpb24gd2hlbgogICAgICAgICAgY29tcGlsaW5nIEMrKyBjb2RlICh0aGlzIHdhcyBhbGxvd2VkLCBidXQgbm90IHJlY29tbWVuZGVkIGluCiAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucykuICoqUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSoqCgo0LzExLzk3IDogRml4ZWQgYSByYXRoZXIgbmFzdHkgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byB1c2luZwogICAgICAgICAgdmFyaWFibGUgbGlua2luZyB3aXRoIGNvbXBsZXggZGF0YXR5cGVzIGFuZCBwb2ludGVycy4gICBPbiBVbml4LAogICAgICAgICAgY29kZSB3b3VsZCB3b3JrIChzb21laG93KSwgYnV0IHdvdWxkIGNhdXNlIGFuIGFjY2VzcyB2aW9sYXRpb24KICAgICAgICAgIHVuZGVyIFdpbmRvd3MtTlQuICBUaGUgZml4IHNob3VsZCBjb3JyZWN0IHRoZSBwcm9ibGVtLAogICAgICAgICAgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHByb2JsZW0gdXNpbmcgZ2xvYmFsIHZhcmlhYmxlcyBvZgogICAgICAgICAgY29tcGxleCBkYXRhdHlwZXMgaW4gY29uanVuY3Rpb24gd2l0aCBzaGFkb3cgY2xhc3Nlcy4gIEZvcnR1bmF0ZWx5LAogICAgICAgICAgdGhpcyBzb3J0IG9mIHRoaW5nIHNlZW1zIHRvIGJlIHJlbGF0aXZlbHkgcmFyZSAoY29uc2lkZXJpbmcKICAgICAgICAgIHRoYXQgdGhlIGJ1ZyBoYXMgYmVlbiBhcm91bmQgZm9yIG1vcmUgdGhhbiBhIHllYXIgLSB5aWtlcyEpLgoKNC8xMS85NyA6IEZpeGVkIGJpemFycmUgY29uc3RhbnQgZXZhbHVhdGlvbiBidWcgaW4gUGVybDUgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgdW5kZXIgV2luZG93cy1OVC4KCjQvOC85NyAgOiBCdWcgd2hlbiB1c2luZyBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgQysrIHJlZmVyZW5jZXMgZml4ZWQuCgo0LzgvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3MgaW4gUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzIHJlbGF0ZWQgdG8KICAgICAgICAgIHVzaW5nIGNsYXNzIHJlbmFtaW5nIChhcHBseWluZyB0aGUgJW5hbWUgZGlyZWN0aXZlIHRvIGEgY2xhc3MKICAgICAgICAgIGRlZmluaXRpb24pIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjQvNy85NyAgOiBGaXhlZCBtaW5vciBidWdzIGluIHN3aWdwdHIuc3dnLCB0Y2w4cHRyLnN3ZywgYW5kIHBlcmw1cHRyLnN3ZyB0bwogICAgICAgICAgcHJldmVudCBpbmZpbml0ZSBsb29wcyB3aGVuIHdlaXJkIGRhdGF0eXBlcyBhcmUgcGFzc2VkLgoKMy8yOS85NyA6ICdNYWtlZmlsZS53aW4nIGFkZGVkLiAgIFRoaXMgaXMgdXNlZCB0byBidWlsZCBtb3N0IG9mIHRoZSBleGFtcGxlcwogICAgICAgICAgaW4gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB1bmRlciBXaW5kb3dzIE5ULzk1LgoKMy8yNy85NyA6IEZpeGVzIHRvIFNXSUcncyBlcnJvciByZXR1cm4gY29kZXMuICAgU1dJRyBub3cgcmV0dXJucyBub24temVybwogICAgICAgICAgZXhpdCBjb2RlcyBmb3IgY2VydGFpbiBraW5kcyBvZiBlcnJvcnMgKHdoaWNoIG1ha2VzIGl0IG1vcmUKICAgICAgICAgIGZyaWVuZGx5IHRvIG1ha2VmaWxlcykuICAgICBBbiBvdmVyaGF1bCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgIGlzIG9uIHRoZSB0by1kbyBsaXN0IGFuZCB3aWxsIHByb2JhYmx5IHNob3cgdXAgaW4gYSBsYXRlciByZWxlYXNlLgoKMy8yNS85NyA6IEJ1ZyBmaXguICAiZnJlZWFyZyIgYW5kICJhcmdvdXQiIHR5cGVtYXBzIGhhdmUgYmVlbiBmaXhlZCBpbgogICAgICAgICAgdGhlIFBlcmw1IG1vZHVsZS4gIEluIHByZXZpb3VzIHZlcnNpb25zLCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gb3V0cHV0IHBhcmFtZXRlcnMgc2hhcmVkIHRoZSBzYW1lIG1lbW9yeSBzcGFjZS0tY2F1c2luZwogICAgICAgICAgYWxsIHNvcnRzIG9mIG5hc3R5IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIHBhc3MgcGVybCB2YWx1ZXMgYnkKICAgICAgICAgIHJlZmVyZW5jZS4gICBTV0lHIG5vdyBpbnRlcm5hbGx5IG1ha2VzIGEgImNvcHkiICh3aGljaCBpcyByZWFsbHkKICAgICAgICAgIGp1c3QgYSBwb2ludGVyKSBvZiBhZmZlY3RlZCBwYXJhbWV0ZXJzIGFuZCB1c2VzIHRoYXQuICAgVGhpcwogICAgICAgICAgaXMgZG9uZSB0cmFuc3BhcmVudGx5IHNvIHRoZXJlIGlzIG5vIG5vdGljYWJsZSBpbXBhY3Qgb24gYW55CiAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzLiAgIFRoaXMgY2hhbmdlIGlzIHByb2JhYmx5IG9ubHkgbm90aWNhYmxlCiAgICAgICAgICB0byBleHBlcnQgdXNlcnMuCgozLzI1Lzk3IDogQWRkZWQgdHlwZS1jaGVjayB0byB2ZXJib3NlIGFuZCBzdGF0IG1vZGUuICBTV0lHIHdpbGwgbm93IGdlbmVyYXRlIGEgbGlzdAogICAgICAgICAgb2YgYWxsIGRhdGF0eXBlcyB0aGF0IHdlcmUgdXNlZCBidXQgdW5kZWZpbmVkICh1c2VmdWwgZm9yIHRyYWNraW5nCiAgICAgICAgICBkb3duIHdlaXJkIGJ1Z3MpLiAgIFRoaXMgaXMgZW5hYmxlZCB3aXRoIHRoZSAtdiBvcHRpb24gKHdoaWNoCiAgICAgICAgICBpcyBub3cgb2ZmaWNpYWxseSBrbm93biBhcyAib3Zlcmx5IHZlcmJvc2UiIG1vZGUpIG9yIHRoZSAtc3RhdCBvcHRpb24uCgozLzI1Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2VyIHRvIG1ha2UgaW5jbHVkZSBndWFyZHMgd29yayBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgI2lmbmRlZiBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgI2RlZmluZSBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgJW1vZHVsZSBmb29iYXIuaQogICAgICAgICAgICAgICAgLi4uIGRlY2xhcmF0aW9ucyAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgoKMy8yNC85NyA6ICVjaGVja291dCBkaXJlY3RpdmUgYWRkZWQuICAgVGhpcyBhbGxvd3MgYW4gaW50ZXJmYWNlIGZpbGUgdG8KICAgICAgICAgIGV4dHJhY3QgZmlsZXMgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGFuZCBwbGFjZSB0aGVtIGluIHRoZQogICAgICAgICAgY3VycmVudCBkaXJlY3RvcnkuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHNjcmlwdHMgYW5kCiAgICAgICAgICBvdGhlciBoZWxwZXIgY29kZSB0aGF0IG1pZ2h0IGJlIGFzc29jaWF0ZWQgd2l0aCBsaWJyYXJ5IGZpbGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICVjaGVja291dCBhcnJheS50Y2wKCiAgICAgICAgICBXaWxsIGxvb2sgZm9yIGEgZmlsZSAiYXJyYXkudGNsIiBpbiB0aGUgbGlicmFyeSBhbmQgY29weSBpdAogICAgICAgICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgICBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSwgdGhpcyBkaXJlY3RpdmUgZG9lcyBub3RoaW5nIChpdCB3aWxsIG5vdCBvdmVyd3JpdGUgYW4KICAgICAgICAgIGV4aXN0aW5nIGZpbGUpLiAgVGhpcyBvbmx5IGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGZvciBub3cuCgozLzI0Lzk3IDogU1dJRyB3aWxsIG5vdyBsb29rIGluIHRoZSBTV0lHIExpYnJhcnkgZm9yIGEgZmlsZSBpZiBpdCBjYW4ndAogICAgICAgICAgZmluZCBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBBcyBhIHJlc3VsdCwgaXQgaXMgZWFzeSB0bwogICAgICAgICAgbWFrZSBtb2R1bGVzIGZyb20gU1dJRyBsaWJyYXJ5IGZpbGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgd2FudCB0byBtYWtlIGEgUHl0aG9uIG1vZHVsZSBmcm9tIHRoZSBTV0lHIHRpbWVycyBsaWJyYXJ5LCBqdXN0CiAgICAgICAgICB0eXBlIHRoaXMgaW4gYW55IGRpcmVjdG9yeSA6CgogICAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIHRpbWVycy5pCgogICAgICAgICAgWW91IHdpbGwgZ2V0IHRoZSBmaWxlcyB0aW1lcnNfd3JhcC5jIGFuZCB0aW1lcnNfd3JhcC5kb2MgaW4KICAgICAgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IHlvdSBjYW4gbm93IGNvbXBpbGUuICAgVGhlIGZpbGUKICAgICAgICAgIHJlbWFpbnMgaW4gdGhlIFNXSUcgbGlicmFyeSAoYWx0aG91Z2ggeW91IGNhbiBjaGVjayBpdCBvdXQKICAgICAgICAgIHVzaW5nIHRoZSAtY28gb3B0aW9uKS4gICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAtY28gb3B0aW9uIGFkZGVkIHRvIFNXSUcgdG8gYWxsb3cgZWFzeSBhY2Nlc3MgdG8gdGhlIFNXSUcgbGlicmFyeS4KICAgICAgICAgIFdoZW4gdXNlZCwgdGhpcyBpbnN0cnVjdHMgU1dJRyB0byBjaGVjayBvdXQgYSBsaWJyYXJ5IGZpbGUgYW5kCiAgICAgICAgICBwbGFjZSBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgdW5peCA+IHN3aWcgLWNvIGFycmF5LmkKICAgICAgICAgICAgICAgIGFycmF5LmkgY2hlY2tlZCBvdXQgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgICAgICB1bml4ID4KCiAgICAgICAgICBPbmNlIGluIHlvdXIgZGlyZWN0b3J5IHlvdSBjYW4gY3VzdG9taXplIHRoZSBmaWxlIHRvIHN1aXQgeW91cgogICAgICAgICAgcGFydGljdWxhciBwdXJwb3Nlcy4gIFRoZSBjaGVja291dCBvcHRpb24gbWFrZXMgaXQgZWFzeSB0bwogICAgICAgICAgZ3JhYiBsaWJyYXJ5IGZpbGVzIHdpdGhvdXQga25vd2luZyBhbnl0aGluZyBhYm91dCB0aGUgU1dJRwogICAgICAgICAgaW5zdGFsbGF0aW9uLCBidXQgaXQgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGFydAogICAgICAgICAgaW5jbHVkaW5nIHNjcmlwdHMsIEMgY29kZSwgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMgZmlsZXMKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBwdXQgYSBjb29sIHNjcmlwdAogICAgICAgICAgaW4gdGhlIGxpYnJhcnkgYW5kIGNoZWNrIGl0IG91dCB3aGVuZXZlciB5b3Ugd2FudGVkIHRvIHVzZSBpdC4KICAgICAgICAgICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAjcHJhZ21hIGV4cG9ydCBkaXJlY3RpdmVzIGFkZGVkIHRvIFRjbCBvdXRwdXQgZm9yIGNvbXBpbGluZwogICAgICAgICAgc2hhcmVkIGxpYnJhcmllcyBvbiB0aGUgTWFjLgoKMy8yNC85NyA6IE1pbm9yIGNoYW5nZXMgdG8gd2lzaC5pIGFuZCB0Y2xzaC5pIGxpYnJhcnkgZmlsZXMgdG8gcHJvdmlkZQogICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIE1hY2ludG9zaC4KCjMvMTkvOTcgOiBTV0lHJ3MgcG9saWN5IHRvd2FyZHMgTlVMTCBwb2ludGVycyBoYXMgYmVlbiByZWxheGVkLiAgVGhlCiAgICAgICAgICBwb2xpY3kgb2YgcmVxdWlyaW5nIGEgc3BlY2lhbCBjb21waWxlciBkaXJlY3RpdmUgLURBTExPV19OVUxMCiAgICAgICAgICB0byB1c2UgTlVMTCBwb2ludGVycyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgV2hpbGUgdGhpcyBtYXkKICAgICAgICAgIHNlZW0gInVuc2FmZSIsIGl0IHR1cm5zIG91dCB0aGF0IHlvdSBjYW4gdXNlIGEgImNoZWNrIgogICAgICAgICAgdHlwZW1hcCB0byBhY2hpZXZlIHNvbWUgc2FmZXR5LiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgTm9kZSAqIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0YXJnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiTlVMTCBQb2ludGVycyBub3QgYWxsb3dlZC4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHByZXZlbnRzIGFueSBOVUxMIHZhbHVlIG9mIGEgIk5vZGUgKiIgcG9pbnRlciB0byBiZQogICAgICAgICAgcGFzc2VkIHRvIGEgZnVuY3Rpb24uICAgKEkgdGhpbmsgdGhpcyBpcyBtdWNoIGNsZWFuZXIKICAgICAgICAgIHRoYW4gdGhlIG9sZCAtREFMTE9XX05VTEwgaGFjayBhbnl3YXlzKS4KCjMvMTkvOTcgOiBGaXhlZCBwb2ludGVyIGhhbmRsaW5nIGVycm9ycyBpbiBQZXJsNSBtb2R1bGUuICBNb2R1bGVzIG5vCiAgICAgICAgICBsb25nZXIgY29yZSBkdW1wIHdoZW4gYSBQZXJsIHJlZmVyZW5jZSBpcyBpbmFkdmVydGVudGx5CiAgICAgICAgICBwYXNzZWQgaW4gYXMgYSBDIHBvaW50ZXIuCgozLzE4Lzk3IDogQWRkZWQgYSAiY2hlY2siIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUKICAgICAgICAgIHZhbGlkaXR5IG9mIGZ1bmN0aW9uIGlucHV0IHZhbHVlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgaW50IHBvc2ludCB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiQXJndW1lbnQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciIpOwogICAgICAgICAgICAgICAgfQoKMy8xOC85NyA6IEFkZGVkIGFuICRhcmcgdmFyaWFibGUgdG8gVGNsIHR5cGVtYXBzLiAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyCiAgICAgICAgICB0byByZXR1cm4gYXJndW1lbnQgdmFsdWVzIGJ5ICJyZWZlcmVuY2UiLgoKMy8xOC85NyA6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIEMrKyByZWZlcmVuY2VzIGFuZAogICAgICAgICAgdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjMvMTgvOTcgOiBGaXhlZCBhIGZldyBnbGl0Y2hlcyBpbiB0aGUgdHlwZW1hcCBtb2R1bGUgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgICBjaGFpbmluZy4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgICAkaW4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0cyBwcmV4aXN0aW5nIHR5cGVtYXAKICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIGEgJWRcbiIsICR0YXJnZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gYWxsb3dlZCBmb3IgcXVpdGUgc29tZSB0aW1lLCBidXQgZGlkbid0IHdvcmsKICAgICAgICAgIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgd2FzIGRlZmluZWQuICBOb3csIGl0IHN0aWxsIGRvZXNuJ3QKICAgICAgICAgIHdvcmsgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCBpcyBkZWZpbmVkLCBidXQgaXQgaXNzdWVzIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4gICBUaGVyZSBpcyBzb21lIHN1cHBvcnQgdXNpbmcgZGVmYXVsdCB0eXBlbWFwcywKICAgICAgICAgIGJ1dCBub25lIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHRha2UgYWR2YW50YWdlIG9mIGl0LiAgVGhpcwogICAgICAgICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGF0IHRoaXMgdGltZS4KClZlcnNpb24gMS4xYjUgUGF0Y2ggMSAoTWFyY2ggMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzE2Lzk3IDogRml4ZWQgcmVmZXJlbmNlcyBidWcgd2l0aCBDKysgY29kZSBnZW5lcmF0aW9uLgoKMy8xNi85NyA6IEZpeGVkIGluaXRpYWxpemF0aW9uIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdAogICAgICAgICAgd2FzIGNhdXNpbmcgd2VpcmQgcHJvYmxlbXMuCgozLzE2Lzk3IDogRml4ZWQgZmF0YWwgYnVnIHdpdGggLWMgb3B0aW9uIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW52b2x2aW5nIHRoZSAldGV4dCBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBzb3J0aW5nLiBJbiB0aGUgb2xkIHN5c3RlbSwgJXRleHQgZW50cmllcyB3b3VsZCBmbG9hdCB0byB0aGUKICAgICAgICAgIHRvcCBvZiBhIHNlY3Rpb24gYmVjYXVzZSB0aGV5IHdlcmUgIm5hbWVsZXNzIi4gICBOb3cgdGhleSBhcmUKICAgICAgICAgIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBhbmQgd2lsbCBzdGF5IGluIHRoZSBwcm9wZXIKICAgICAgICAgIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBlbnRyeS4KClZlcnNpb24gMS4xYjUgKE1hcmNoIDEyLCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTEvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IFRjbC9UayA4LjBhMi4KICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgKioqIFNXSUcgbm8gbG9uZ2VyIHdvcmtzIHdpdGggVGNsL1RrIDguMGExLgoKMy8xMC85NyA6IEZpeGVkIGJ1ZyB3aXRoIGlnbm9yZWQgYXJndW1lbnRzIGFuZCBDKysgbWVtYmVyIGZ1bmN0aW9ucyBpbgogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUuCgozLzkvOTcgIDogUGFyc2luZyBidWdzIHdpdGggbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGFuZCBwcml2YXRlbHkKICAgICAgICAgIGRlY2xhcmVkIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBmaXhlZC4KCjMvOS85NyAgOiBGaXhlZCBhIGZldyBtaW5vciBjb2RlIGdlbmVyYXRpb24gYnVncyB3aXRoIEMrKyBjbGFzc2VzIGFuZAogICAgICAgICAgY29uc3RydWN0b3JzLiAgIEluIHNvbWUgY2FzZXMsIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlCiAgICAgICAgICB3b3VsZCBub3QgY29tcGlsZSBwcm9wZXJseS4gICBTV0lHIG5vdyBhdHRlbXB0cyB0byB1c2UKICAgICAgICAgIHRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZC4KCjMvOC85NyAgOiBBZGRlZCBhIC1sIG9wdGlvbiB0byBTV0lHIHRoYXQgYWxsb3dzIGFkZGl0aW9uYWwgU1dJRyBsaWJyYXJ5IGZpbGVzCiAgICAgICAgICB0byBiZSBncmFiYmVkIHdpdGhvdXQgaGF2aW5nIHRoZW0gc3BlY2lmaWVkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGtlZXAgdGhlIGludGVyZmFjZSBmaWxlIGNsZWFuIGFuZCBtb3ZlIGNlcnRhaW4KICAgICAgICAgIG9wdGlvbnMgaW50byBhIE1ha2VmaWxlLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgc3dpZyAtdGNsIGV4YW1wbGUuaSAgICAgICAgICAgICAgIyAgQnVpbGQgYSBub3JtYWwgVGNsIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXRjbCAtbHdpc2guaSBleGFtcGxlLmkgICAgICMgIEJ1aWxkIGl0IGFzIGEgd2lzaCBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBieSBpbmNsdWRpbmcgdGhlICd3aXNoLmknIGZpbGUuCgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiBleGFtcGxlLmkgICAgICAgICAgICMgQnVpbGQgYSBkeW5hbWljYWxseSBsb2FkZWQgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1sZW1iZWQuaSBleGFtcGxlLmkgIyBCdWlsZCBhIHN0YXRpYyBleHRlbnNpb24KCiAgICAgICAgICBUaGVzZSBraW5kcyBvZiBvcHRpb25zIGNvdWxkIHByZXZpb3VzbHkgYmUgYWNjb21wbGlzaGVkIHdpdGgKICAgICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1RBVElDCiAgICAgICAgICAgICAgICAgICAlaW5jbHVkZSBlbWJlZC5pCiAgICAgICAgICAgICAgICAgICAjZW5kaWYKCjMvOC85NyAgOiBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBHdWlsZSBtb2R1bGUgdG8gdXNlIHRoZSBuZXcgZ2ggaW50ZXJmYWNlCiAgICAgICAgICBpbiBGU0YgR3VpbGUgMS4wLiAgICBUaGUgb2xkZXIgZ3NjbSBpbnRlcmZhY2UgdXNlZCBpbiBDeWdudXMKICAgICAgICAgIEd1aWxlIHJlbGVhc2VzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgU1dJRy4KCjMvOC85NyAgOiBDbGVhbmVkIHVwIHRoZSBUY2wgTmV0c2NhcGUgcGx1Z2luIGV4YW1wbGUuICAgSXQgc2hvdWxkIHdvcmsgd2l0aAogICAgICAgICAgdmVyc2lvbiAxLjEgb2YgdGhlIHBsdWdpbiBub3cuCgozLzgvOTcgIDogQWRkZWQgYmV0dGVyIGFycmF5IHN1cHBvcnQgdG8gdGhlIHR5cGVtYXAgbW9kdWxlLiAgVGhlIGtleXdvcmQKICAgICAgICAgIEFOWSBjYW4gbm93IGJlIHVzZWQgdG8gbWF0Y2ggYW55IGFycmF5IGRpbWVuc2lvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHdpbGwgbWF0Y2ggYW55IHNpbmdsZS1kaW1lbnNpb25hbCBkb3VibGUgYXJyYXkuICAgVGhlIGFycmF5CiAgICAgICAgICBkaW1lbnNpb24gaXMgcGFzc2VkIGluIHRoZSB2YXJpYWJsZXMgJGRpbTAsICRkaW0xLCAuLi4gJGRpbTkuICBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKCQkgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldIHsKCQkJcHJpbnRmKCJSZWNlaXZlZCBhIGRvdWJsZVslZF1bJWRdWyVkXVxuIiwkZGltMCwkZGltMSwkZGltMik7CgkgICAgICAgICAgICB9CgogICAgICAgICAgQW55IHR5cGVtYXAgaW52b2x2aW5nIGEgc3BlY2lmaWMgYXJyYXkgZGltZW5zaW9uIHdpbGwgb3ZlcnJpZGUgYW55CiAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgQU5ZIHRhZy4gIFRodXMsIGEgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgWzVdWzRdW0FOWV0ge30KICAgICAgICAgIHdvdWxkIG92ZXJyaWRlIGEgZG91YmxlIFtBTlldW0FOWV1bQU5ZXS4gIEhvd2V2ZXIsIG92ZXJ1c2Ugb2YgdGhlIEFOWQogICAgICAgICAgdGFnIGluIGFycmF5cyBvZiBoaWdoLWRpbWVuc2lvbnMgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgZHVlIHRvCiAgICAgICAgICB0aGUgcGF0dGVybiBtYXRjaGluZyBydWxlIHVzZWQuIEZvciBleGFtcGxlLCB3aGljaCBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAgICB0eXBlbWFwcyBoYXMgcHJlY2VkZW5jZT8KCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldWzVdIHt9ICAgICAvLyBBdm9pZCB0aGlzIQogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbNV1bQU5ZXSB7fQoKMy83Lzk3ICA6IEZpeGVkIGEgbnVtYmVyIG9mIGJ1Z3MgcmVsYXRlZCB0byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBoYW5kbGluZy4KICAgICAgICAgIFR5cGVkZWZzIGludm9sdmluZyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbm93IHdvcmtzIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgTUFUUklYWzRdWzRdOwoKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBleHRlcm4gZG91YmxlIGZvbyhNQVRSSVggYSk7CgogICAgICAgICAgVHlwZWNhc3Rpbmcgb2YgcG9pbnRlcnMgaW50byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgaXMgbm93CiAgICAgICAgICBpbXBsZW1lbnRlZCBwcm9wZXJseSB3aGVuIG1ha2luZyBDL0MrKyBmdW5jdGlvbiBjYWxscy4KCjMvNi85NyAgOiBGaXhlZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgYnVnIGluIHRoZSBUY2wgT2JqZWN0LW9yaWVudGVkCiAgICAgICAgICBpbnRlcmZhY2UuICBXZWxsLCBhY3R1YWxseSwgZGlkbid0IGZpeCBpdCBidXQgaXNzdWVkIGEKICAgICAgICAgIFRjbCBlcnJvciBpbnN0ZWFkLiAgIFRoZSBidWcgd291bGQgbWFuaWZlc3QgaXRzZWxmIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdICAgICAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXSAgIyBNYWtlICRtIGludG8gYW4gb2JqZWN0IGFzc3VtaW5nICRsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGFpbnMgYSBwb2ludGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNpbmNlICRtID09ICRsLCAkbCBnZXRzIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChzaW5jZSBpdHMgdGhlIHNhbWUgY29tbWFuZCBuYW1lKQogICAgICAgICAgICAgICAgICUgJG0gaW5zZXJ0IEZvbwogICAgICAgICAgICAgICAgIFNlZ21lbnRhdGlvbiBmYXVsdCAgICAgICAjIE5vdGUgOiB0aGUgbGlzdCBubyBsb25nZXIgZXhpc3RzIQoKICAgICAgICAgIE5vdywgYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWRlZmluaW5nIHRoZSBjb21tYW5kLgogICAgICAgICAgQXMgaW4gOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XQogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdCiAgICAgICAgICAgICAgICAgT2JqZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMhCgogICAgICAgICAgVXNlIGNhdGNoe30gdG8gaWdub3JlIHRoZSBlcnJvci4KCjMvMy85NyAgOiBCZXR0ZXIgc3VwcG9ydCBmb3IgZW51bXMgYWRkZWQuICAgRGF0YXR5cGVzIG9mICdlbnVtIE15RW51bScKICAgICAgICAgIGFuZCB0eXBlZGVmcyBzdWNoIGFzICd0eXBlZGVmIGVudW0gTXlFbnVtIEZvbzsnIG5vdyB3b3JrLgoKMy8zLzk3ICA6IFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgIGludCBhLGI7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKGludCBpKSA6IGEoMCksIGIoaSksIEJhcihpLDApIHsgfTsKICAgICAgICAgICAgICAgfTsKCjMvMy85NyAgOiBNb2RpZmllZCBwYXJzZXIgdG8gaWdub3JlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSkgdGhyb3coWCxZKTsKCjMvMy85NyAgOiBBZGRlZCAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICVleHRlcm4KICAgICAgICAgIGV4Y2VwdCBpdCB0ZWxscyB0aGUgbGFuZ3VhZ2UgbW9kdWxlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgIGNvbWluZyBmcm9tIGEgc2VwYXJhdGUgbW9kdWxlLiAgIFRoaXMgaXMgdXN1YWxseSBvbmx5CiAgICAgICAgICBuZWVkZWQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMuCgozLzIvOTcgIDogQ2hhbmdlZCBwb2ludGVyIHR5cGUtY2hlY2tlciB0byBiZSBzaWduaWZpY2FudGx5IG1vcmUKICAgICAgICAgIGVmZmljaWVudCB3aGVuIHdvcmtpbmcgd2l0aCBkZXJpdmVkIGRhdGF0eXBlcy4gIFRoaXMKICAgICAgICAgIGhhcyBiZWVuIGFjY29tcGxpc2hlZCBieSBzdG9yaW5nIHR5cGUtbWFwcGluZ3MgaW4gc29ydGVkCiAgICAgICAgICBvcmRlciwgdXNpbmcgYmluYXJ5IHNlYXJjaCBzY2hlbWVzLCBhbmQgY2FjaGluZyByZWNlbnRseQogICAgICAgICAgdXNlZCBkYXRhdHlwZXMuICAgRm9yIFNXSUcgZ2VuZXJhdGVkIEMrKyBtb2R1bGVzIHRoYXQKICAgICAgICAgIG1ha2UgYSBsYXJnZSBudW1iZXIgb2YgQyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlcml2ZWQgdHlwZXMsCiAgICAgICAgICB0aGlzIGNvdWxkIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiBiZXR3ZWVuIDEwMCBhbmQgNTAwMDAgcGVyY2VudC4KICAgICAgICAgIEhvd2V2ZXIsIGR1ZSB0byB0aGUgcmVxdWlyZWQgc29ydGluZyBvcGVyYXRpb24sIG1vZHVsZQogICAgICAgICAgbG9hZGluZyB0aW1lIG1heSBpbmNyZWFzZWQgc2xpZ2h0bHkgd2hlbiB0aGVyZSBhcmUgbG90cyBvZgogICAgICAgICAgZGF0YXR5cGVzLgoKMy8yLzk3ICA6IEZpeGVkIHNvbWUgQysrIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggUHl0aG9uCiAgICAgICAgICBlbWJlZC5pIGxpYnJhcnkgZmlsZXMuCgoyLzI3Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byBDKysgY29kZSBnZW5lcmF0aW9uIHRvIHVzZSBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgd2hlbiByZXR1cm5pbmcgY29tcGxleCBkYXRhIHR5cGUgYnkgdmFsdWUuCgoyLzI2Lzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgd2l0aCAtYyBvcHRpb24uCgoyLzI2Lzk3IDogU2xpZ2h0IHR3ZWFrIG9mIHBhcnNlciB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtZXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIChBTEUsIFNUT1VULCBMQUdFUiwgfTsKCjIvMjUvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIGluIFRjbCBtb2R1bGUgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICVuYW1lKCkgZGlyZWN0aXZlIG9uIGEgY2xhc3NuYW1lLgoKMi8yNS85NyA6IEZpbmlzaGVkIGNvZGUtc2l6ZSBvcHRpbWl6YXRpb24gb2YgQysrIGNvZGUgZ2VuZXJhdGlvbiB3aXRoCiAgICAgICAgICBpbmhlcml0YW5jZSBvZiBhdHRyaWJ1dGVzLiAgICBJbmhlcml0ZWQgYXR0cmlidXRlcyBub3cKICAgICAgICAgIG9ubHkgZ2VuZXJhdGUgb25lIHNldCBvZiB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGFyZSByZS11c2VkCiAgICAgICAgICBpbiBhbnkgZGVyaXZlZCBjbGFzc2VzLiAgIFRoaXMgY291bGQgcHJvdmlkZSBiaWcgY29kZQogICAgICAgICAgc2l6ZSBpbXByb3ZlbWVudHMgaW4gc29tZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcy4KCjIvMjUvOTcgOiBQZXJsNSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBib3RoIHRoZSBVbml4IGFuZCBXaW5kb3dzCiAgICAgICAgICB2ZXJzaW9ucy4gIFRoZSB3aW5kb3dzIHZlcnNpb24gaGFzIGJlZW4gdGVzdGVkIHdpdGggdGhlCiAgICAgICAgICBBY3RpdmV3YXJlIHBvcnQgb2YgUGVybCA1LjAwMyBydW5uaW5nIHVuZGVyIFdpbmRvd3MgOTUuCiAgICAgICAgICBUaGUgQyBzb3VyY2UgZ2VuZXJhdGVkIGJ5IFNXSUcgc2hvdWxkIGNvbXBpbGUgd2l0aG91dAogICAgICAgICAgbW9kaWZpY2F0aW9uIHVuZGVyIGJvdGggdmVyc2lvbnMgb2YgUGVybCwgYnV0IGlzIG5vdwogICAgICAgICAgZXZlbiBtb3JlIGhpZGVvdXMgdGhhbiBiZWZvcmUuCgoyLzI1Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHNjb3BlIHJlc29sdXRpb24gb3BlcmF0aW9uIHRvCiAgICAgICAgICBhcHBlYXIgaW4gZXhwcmVzc2lvbnMgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGFzIGluIDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgYSA9ICBCYXI6OmRlZnZhbHVlKTsKCjIvMjUvOTcgOiBGaXhlZCBidWcgd2hlbiByZXNvbHZpbmcgc3ltYm9scyBpbnNpZGUgQysrIGNsYXNzZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIHtBTEUsIFNUT1VULCBMQUdFUn07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIHZvaWQgZGVmYXJnKFZhbHVlIHYgPSBTVE9VVCk7CgogICAgICAgICAgICAgIH07CgoyLzI0Lzk3IDogRml4ZWQgYnVnIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMi8yMy85NyA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgdW5kZXIgV2luZG93cwoKICAgICAgICAgICAgLSAgTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIG5vdyBwcm9wZXJseSBleHBvcnRlZC4KICAgICAgICAgICAgICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNjZXNzYXJ5IHRvIGV4cGxpY2l0bHkgZXhwb3J0IHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAgeW91cnNlbGYuCgogICAgICAgICAgICAtICBCaXphcnJlIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIKICAgICAgICAgICAgICAgY29kZSBhcyBBTlNJIEMgdW5kZXIgVmlzdWFsIEMrKyA0LnggZml4ZWQuCgogICAgICAgICAgICAtICBUZXN0ZWQgd2l0aCBib3RoIHRoZSBzdG9jayBQeXRob24tMS40IGRpc3RyaWJ1dGlvbiBhbmQgUHl0aG9ud2luCiAgICAgICAgICAgICAgIHJ1bm5pbmcgdW5kZXIgV2luOTUuCgoyLzE5Lzk3IDogRml4ZWQgdHlwZWRlZiBoYW5kbGluZyBidWcgaW4gUGVybDUgc2hhZG93IGNsYXNzZXMuCgoyLzE5Lzk3IDogQWRkZWQgZXhjZXB0aW9uIHN1cHBvcnQuICBUbyB1c2UgaXQsIGRvIHRoZSBmb2xsb3dpbmcgOgoKICAgICAgICAgICAgICAlZXhjZXB0KGxhbmcpIHsKICAgICAgICAgICAgICAgICAgLi4uIHRyeSBwYXJ0IG9mIHRoZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAuLi4gY2F0Y2ggcGFydCBvZiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICRmdW5jdGlvbiBpcyBhIFNXSUcgdmFyaWFibGUgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZQogICAgICAgICAgYWN0dWFsIEMvQysrIGZ1bmN0aW9uIGNhbGwgaW4gYSB3cmFwcGVyIGZ1bmN0aW9uLiAgVGh1cywKICAgICAgICAgIGEgcmVhbCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBtaWdodCBsb29rIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgJWV4Y2VwdChwZXJsNSkgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoY2hhciAqJiBzeikgewogICAgICAgICAgICAgICAgICAgIC4uLiBwcm9jZXNzIGFuIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgfSBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICBjcm9haygiVW5rbm93biBleGNlcHRpb24uIEJhaWxpbmcgb3V0Li4uIik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KCjIvMTkvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBtYW5hZ2luZyBnZW5lcmljIGNvZGUgZnJhZ21lbnRzIChuZWVkZWQKICAgICAgICAgIGZvciBleGNlcHRpb25zKS4KCjIvMTkvOTcgOiBGaXhlZCBzb21lIHJlYWxseSBvYnNjdXJlIHR5cGVtYXAgc2NvcGluZyBidWdzIGluIHRoZSBDKysKICAgICAgICAgIGhhbmRsZXIuCgoyLzE4Lzk3IDogQ2xlYW5lZCB1cCBwZXJsbWFpbi5pIGZpbGUgYnkgcmVtb3Zpbmcgc29tZSBwcm9ibGVtYXRpYywKICAgICAgICAgIGJ1dCBzZWVtaW5nbHkgdW5uZWNlc3NhcnkgZGVjbGFyYXRpb25zLgoKMi8xOC85NyA6IE9wdGltaXplZCBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb25zIHVuZGVyIGluaGVyaXRhbmNlLgogICAgICAgICAgU1dJRyBjYW4gbm93IHVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgZm9yIGEKICAgICAgICAgIGJhc2UgY2xhc3MgaW5zdGVhZCBvZiByZWdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yCiAgICAgICAgICB0aGUgc2FtZSBmdW5jdGlvbnMgaW4gYSBkZXJpdmVkIGNsYXNzLiAgICBUaGlzIGNvdWxkCiAgICAgICAgICBtYWtlIGEgZHJhc3RpYyByZWR1Y3Rpb24gaW4gd3JhcHBlciBjb2RlIHNpemUgZm9yIEMrKwogICAgICAgICAgYXBwbGljYXRpb25zIHdpdGggZGVlcCBpbmhlcml0YW5jZSBoaWVyYXJjaGllcyBhbmQKICAgICAgICAgIGxvdHMgb2YgZnVuY3Rpb25zLgoKMi8xOC85NyA6IEFkZGl0aW9uYWwgbWV0aG9kcyBzcGVjaWZpZWQgd2l0aCAlYWRkbWV0aG9kcyBjYW4gbm93CiAgICAgICAgICBiZSBpbmhlcml0ZWQgYWxvbmcgd2l0aCBub3JtYWwgQysrIG1lbWJlciBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogTWlub3IgaW50ZXJuYWwgZml4ZXMgdG8gbWFrZSBTV0lHJ3Mgc3RyaW5nIGhhbmRsaW5nIGEgbGl0dGxlCiAgICAgICAgICBzYWZlci4KCjIvMTYvOTcgOiBNb3ZlZCBzb21lIGNvZGUgZ2VuZXJhdGlvbiBvZiBUY2wgc2hhZG93IGNsYXNzZXMgdG8KICAgICAgICAgIGxpYnJhcnkgZmlsZXMuCgoyLzE2Lzk3IDogRml4ZWQgZG9jdW1lbnRhdGlvbiBlcnJvciBvZiAnLWNvbmZpZ3VyZScgbWV0aG9kIGluCiAgICAgICAgICBUY2wgbW9kdWxlcy4KCjIvMTYvOTcgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgc2xpZ2h0bHkgdG8gYWxsb3cgdHlwZW1hcHMKICAgICAgICAgIHRvIHVzZSBQZXJsIHJlZmVyZW5jZXMuCgoyLzEyLzk3IDogRml4ZWQgYXJndW1lbnQgY2hlY2tpbmcgYnVnIHRoYXQgd2FzIGludHJvZHVjZWQgYnkKICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzIChmdW5jdGlvbiBjYWxscyB3aXRoIHRvbyBtYW55CiAgICAgICAgICBhcmd1bWVudHMgd291bGQgc3RpbGwgYmUgZXhlY3V0ZWQpLiAgRnVuY3Rpb25zIG5vdwogICAgICAgICAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgYXMgQyB2ZXJzaW9uCiAgICAgICAgICAod2l0aCBwb3NzaWJpbGl0eSBvZiBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgc3RpbGwgc3VwcG9ydGVkKS4KCjIvMTIvOTcgOiBGaXhlZCBkZWZhdWx0IGFyZ3VtZW50IGJ1ZyBpbiBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgZ2VuZXJhdGluZyB3cmFwcGVyIGZ1bmN0aW9ucyBpbnZvbHZpbmcgZGVmYXVsdAogICAgICAgICAgYXJndW1lbnRzIG9mIGNvbXBsZXggZGF0YXR5cGVzLgoKMi8xMi85NyA6IEZpeGVkIHR5cGVtYXAgc2NvcGluZyBwcm9ibGVtcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIGdldCBhIGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBkb3VibGUgYmFyKGRvdWJsZSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gbmV3IGdldCBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgYXBwbHkgdGhlIHNlY29uZCB0eXBlbWFwIHRvIGFsbCBmdW5jdGlvbnMgaW4gRm9vCiAgICAgICAgICBkdWUgdG8gZGVsYXllZCBnZW5lcmF0aW9uIG9mIEMrKyB3cmFwcGVyIGNvZGUgKGNsZWFybHkgdGhpcwogICAgICAgICAgaXMgbm90IHRoZSBkZXNpcmVkIGVmZmVjdCkuICAgUHJvYmxlbSBoYXMgYmVlbiBmaXhlZCBieQogICAgICAgICAgYXNzaWduaW5nIHVuaXF1ZSBudW1lcmljYWwgaWRlbnRpZmllcnMgdG8gZXZlcnkgZGF0YXR5cGUgaW4KICAgICAgICAgIGFuIGludGVyZmFjZSBmaWxlIGFuZCByZWNvcmRpbmcgdGhlICJyYW5nZSBvZiBlZmZlY3QiIG9mIGVhY2gKICAgICAgICAgIHR5cGVtYXAuCgoyLzExLzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgImlnbm9yZSIgYW5kICJkZWZhdWx0IiB0eXBlbWFwcy4gIE9ubHkgdXNlCiAgICAgICAgICBpZiB5b3UgYWJzb2x1dGVseSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLgoKMi85Lzk3ICA6IEFkZGVkIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvcgogICAgICAgICAgQyBzdHJ1Y3RzIGFuZCBDKysgY2xhc3NlcyB0aGF0IGRvIG5vdCBzcGVjaWZ5IGFueSBzb3J0IG9mCiAgICAgICAgICBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLiAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgZW5hYmxlZCBieQogICAgICAgICAgcnVubmluZyBTV0lHIHdpdGggdGhlICctbWFrZV9kZWZhdWx0JyBvcHRpb24gb3IgYnkgaW5zZXJ0aW5nCiAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbnRvIGFuIGludGVyZmFjZSBmaWxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYSBtYWtlX2RlZmF1bHQKCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHByYWdtYSBkaXNhYmxlcyBhdXRvbWF0aWMgY29uc3RydWN0b3IgZ2VuZXJhdGlvbgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQKCjIvOS85NyAgOiBBZGRlZCAtbWFrZV9kZWZhdWx0IG9wdGlvbiBmb3IgcHJvZHVjaW5nIGRlZmF1bHQgY29uc3RydWN0b3JzCiAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgZm9yIGNsYXNzZXMgd2l0aG91dCB0aGVtLgoKMi85Lzk3ICA6IENoYW5nZWQgdGhlIHN5bnRheCBvZiB0aGUgU1dJRyAlcHJhZ21hIGRpcmVjdGl2ZSB0bwogICAgICAgICAgJXByYWdtYSBvcHRpb249dmFsdWUgb3IgJXByYWdtYShsYW5nKSBvcHRpb249dmFsdWUuCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYWtlcyB0aGUgc3ludGF4IGEgbGl0dGxlIG1vcmUgY29uc2lzdGVudAogICAgICAgICAgYmV0d2VlbiBnZW5lcmFsIHByYWdtYXMgYW5kIGxhbmd1YWdlLXNwZWNpZmljIHByYWdtYXMuCiAgICAgICAgICBUaGUgb2xkIHN5bnRheCBzdGlsbCB3b3JrcywgYnV0IHdpbGwgcHJvYmFibHkgYmUgcGhhc2VkCiAgICAgICAgICBvdXQgKGEgd2FybmluZyBtZXNzYWdlIGlzIGN1cnJlbnRseSBwcmludGVkKS4KCjIvOS85NyAgOiBJbXByb3ZlZCBUY2wgc3VwcG9ydCBvZiBnbG9iYWwgdmFyaWFibGVzIHRoYXQgYXJlIG9mCiAgICAgICAgICBzdHJ1Y3R1cmVzLCBjbGFzc2VzLCBhbmQgdW5pb25zLgoKMi85Lzk3ICA6IEZpeGVkIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtIGluIFB5dGhvbiAnZW1iZWQuaScgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIG1pc3NpbmcgcmV0dXJuIHZhbHVlIGluIHBlcmxtYWluLmkgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byByZXR1cm4gYW4gQXR0cmlidXRlRXJyb3Igd2hlbgogICAgICAgICAgdW5kZWZpbmVkIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2VkIChvbGRlciB2ZXJzaW9ucyByZXR1cm5lZAogICAgICAgICAgYSBOYW1lRXJyb3IpLgoKMi85Lzk3ICA6IEZpeGVkIGJ1ZyB3aGVuICVhZGRtZXRob2RzIGlzIHVzZWQgYWZ0ZXIgYSBjbGFzcyBkZWZpbml0aW9uIHdob3NlCiAgICAgICAgICBsYXN0IHNlY3Rpb24gaXMgcHJvdGVjdGVkIG9yIHByaXZhdGUuCgoyLzgvOTcgIDogTWFkZSBzbGlnaHQgY2hhbmdlcyBpbiBpbmNsdWRlIGZpbGUgcHJvY2Vzc2luZyB0byBzdXBwb3J0CiAgICAgICAgICB0aGUgTWFjaW50b3NoLgoKMi84Lzk3ICA6IEV4dGVuZGVkIHN3aWdtYWluLmN4eCB0byBwcm92aWRlIGEgcnVkaW1lbnRhcnkgTWFjaW50b3NoIGludGVyZmFjZS4KICAgICAgICAgIEl0J3MgYSByZWFsbHkgYmFkIGludGVyZmFjZSwgYnV0IHdvcmtzIHVudGlsIHNvbWV0aGluZyBiZXR0ZXIKICAgICAgICAgIGlzIHdyaXR0ZW4uCgoxLzI5Lzk3IDogRml4ZWQgdHlwZS1jYXN0aW5nIGJ1ZyBpbnRyb2R1Y2VkIGJ5IDEuMWI0IHdoZW4gc2V0dGluZy9nZXR0aW5nIHRoZQogICAgICAgICAgdmFsdWUgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbnZvbHZpbmcgY29tcGxleCBkYXRhIHR5cGVzLgoKMS8yOS85NyA6IFJlbW92ZWQgZXJyb25lb3VzIHdoaXRlIHNwYWNlIGJlZm9yZSBhbiAjZW5kaWYgaW4gdGhlIGNvZGUgZ2VuZXJhdGVkCiAgICAgICAgICBieSB0aGUgUHl0aG9uIG1vZHVsZSAod2FzIGNhdXNpbmcgZXJyb3JzIG9uIERFQyBBbHBoYSBjb21waWxlcnMpLgoKMS8yNi85NyA6IEZpeGVkIGVycm9ycyB3aGVuIHVzaW5nIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzIGluIFB5dGhvbiBzaGFkb3cKCSAgc2hhZG93IGNsYXNzZXMuCgoxLzIzLzk3IDogRml4ZWQgYnVnIHdpdGggbmVzdGVkICVleHRlcm4gZGVjbGFyYXRpb25zLgoKMS8yMS85NyA6IEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIGludm9sdmluZyBjb25zdCBkYXRhdHlwZXMuCgoxLzIxLzk3IDogU29tZXdoYXQgb2JzY3VyZSwgYnV0IHNlcmlvdXMgYnVnIHdpdGggaGF2aW5nIG11bHRpcGxlIGxldmVscwogICAgICAgICAgb2YgdHlwZWRlZnMgZml4ZWQuICBGb3IgZXhhbXBsZSA6CgoJCXR5cGVkZWYgY2hhciAqU3RyaW5nOwogICAgICAgICAgICAgICAgdHlwZWRlZiBTdHJpbmcgIE5hbWU7CgpWZXJzaW9uIDEuMSBCZXRhNCAoSmFudWFyeSAxNiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogU1dJRyAxLjFiMyBjcmFzaGVkIGFuZCBidXJuZWQgc2hvcnRseSBhZnRlciB0YWtlIG9mZiBkdWUKdG8gYSBmZXcgbWFqb3IgcnVuLXRpbWUgcHJvYmxlbXMgdGhhdCBzdXJmYWNlZCBhZnRlciByZWxlYXNlLgpUaGlzIHJlbGVhc2Ugc2hvdWxkIGZpeCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aG9zZSBwcm9ibGVtcy4KCjEvMTYvOTcgOiBGaXhlZCBtYWpvciBtZW1vcnkgbWFuYWdlbWVudCBidWcgb24gTGludXgKCjEvMTQvOTcgOiBGaXhlZCBidWcgaW4gZnVuY3Rpb25zIHJldHVybmluZyBjb25zdGFudCBDKysgcmVmZXJlbmNlcy4KCjEvMTQvOTcgOiBNb2RpZmllZCBDKysgbW9kdWxlIHRvIGhhbmRsZSBkYXRhdHlwZXMgYmV0dGVyLgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBhICpzaW5nbGUqIHNjb3BlIHJlc29sdXRpb24KICAgICAgICAgIG9wZXJhdG9yIGluIGRhdGF0eXBlcy4gIEllIDogRm9vOjpiYXIuICAgU1dJRyBkb2Vzbid0CiAgICAgICAgICB5ZXQgaGFuZGxlIG5lc3RlZCBjbGFzc2VzLCBzbyB0aGlzIHNob3VsZCBiZQogICAgICAgICAgc3VmZmljaWVudCBmb3Igbm93LgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyB0eXBlZGVmIGluc2lkZSBhIEMrKyBjbGFzcy4KCjEvMTQvOTcgOiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gZGF0YXR5cGVzIGRlZmluZWQgaW5zaWRlCiAgICAgICAgICBhIEMrKyBjbGFzcy4gIFNXSUcgd2FzIG5vdCBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZSwKICAgICAgICAgIGJ1dCBhIG5ldyBzY29waW5nIG1lY2hhbmlzbSBhbmQgbWV0aG9kIGZvciBoYW5kbGluZwogICAgICAgICAgZGF0YXR5cGVzIGluc2lkZSBhIEMrKyBjbGFzcyBoYXZlIGJlZW4gYWRkZWQuCgoxLzE0Lzk3IDogQ2hhbmdlZCBlbnVtZXJhdGlvbnMgdG8gdXNlIHRoZSB2YWx1ZSBuYW1lIGluc3RlYWQKICAgICAgICAgIG9mIGFueSB2YWx1ZXMgdGhhdCBtaWdodCBoYXZlIGFwcGVhcmVkIGluIHRoZSBpbnRlcmZhY2UKICAgICAgICAgIGZpbGUuICBUaGlzIG1ha2VzIHRoZSBjb2RlIGEgbGl0dGxlIG1vcmUgZnJpZW5kbHkgdG8KICAgICAgICAgIEMrKyBjb21waWxlcnMuCgoxLzE0Lzk3IDogUmVtb3ZlZCB0eXBlZGVmIGJ1ZyB0aGF0IG1hZGUgYWxsIGVudW1lcmF0aW9ucwogICAgICAgICAgZXF1aXZhbGVudCB0byBlYWNoIG90aGVyIGluIHRoZSB0eXBlIGNoZWNrZXIgKHNpbmNlCiAgICAgICAgICBpdCBnZW5lcmF0ZWQgYWxvdCBvZiB1bm5lY2Vzc2FyeSBjb2RlKS4KClZlcnNpb24gMS4xIEJldGEzIChKYW51YXJ5IDksIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogQSAqaHVnZSogbnVtYmVyIG9mIGNoYW5nZXMgcmVsYXRlZCB0byBvbmdvaW5nIG1vZGlmaWNhdGlvbnMuCgoxLiAgU3VwcG9ydCBmb3IgQysrIG11bHRpcGxlIGluaGVyaXRhbmNlIGFkZGVkLgoKMi4gIFR5cGVtYXBzIGFkZGVkLgoKMy4gIFNvbWUgc3VwcG9ydCBmb3IgbmVzdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhZGRlZC4KCjQuICBEZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nIGFkZGVkLgoKNS4gIC1jIG9wdGlvbiBhZGRlZCBmb3IgYnVpbGRpbmcgYmFyZSB3cmFwcGVyIGNvZGUgbW9kdWxlcy4KCjYuICBSZXdyb3RlIFBvaW50ZXIgdHlwZS1jaGVja2luZyB0byBzdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlCiAgICBjb3JyZWN0bHkuCgo3LiAgVGNsIDguMCBtb2R1bGUgYWRkZWQuCgo4LiAgUGVybDQgYW5kIEd1aWxlIG1vZHVsZXMgcmVzdXJyZWN0ZWQgZnJvbSB0aGUgZGVhZCAod2VsbCwgdGhleQogICAgYXQgbGVhc3Qgd29yayBhZ2FpbikuCgo5LiAgTmV3IE9iamVjdCBPcmllbnRlZCBUY2wgaW50ZXJmYWNlIGFkZGVkLgoKMTAuIEJ1ZyBmaXhlcyB0byBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjExLiBDbGVhbmVkIHVwIG1hbnkgb2YgdGhlIGludGVybmFsIG1vZHVsZXMgb2YgdGhlIHBhcnNlci4KCjEyLiBUb25zIG9mIGV4YW1wbGVzIGFuZCB0ZXN0aW5nIG1vZHVsZXMgYWRkZWQuCgoxMy4gRml4ZWQgYnVncyByZWxhdGVkIHRvIHVzZSBvZiAiY29uc3QiIHJldHVybiB2YWx1ZXMuCgoxNC4gRml4ZWQgYnVnIHdpdGggQysrIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjE1LiBDaGFuZ2VkIFNXSUcgY29uZmlndXJhdGlvbiBzY3JpcHQuCgpWZXJzaW9uIDEuMSBCZXRhMiAoRGVjZW1iZXIgMywgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgY2hhbmdlcwogICBpbnZvbHZlZCBhcmUgdG9vIG51bWVyb3VzIHRvIG1lbnRpb24uICBCYXNpY2FsbHksIHRha2UgZXZlcnl0aGluZwogICB5b3Uga25ldyBhYm91dCB0aGUgb2xkIHN5c3RlbSwgdGhyb3cgdGhlbSBvdXQsIGFuZCByZWFkIHRoZQogICBmaWxlIERvYy9kb2MucHMuCgoyLiBMaW1pdGVkIHN1cHBvcnQgZm9yICNpZiBkZWZpbmVkKCkgYWRkZWQuCgozLiBUeXBlIGNhc3RzIGFyZSBub3cgYWxsb3dlZCBpbiBjb25zdGFudCBleHByZXNzaW9ucy4gIGllCgogICAgICAgICAjZGVmaW5lICBBICAgKGludCkgMwoKNC4gQWRkZWQgc3VwcG9ydCBmb3IgdHlwZWRlZiBsaXN0cy4gIEZvciBleGFtcGxlIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgICAgIGRvdWJsZSB4LHksejsKICAgICAgICB9IFZlY3RvciwgKlZlY3RvclB0cjsKCjUuIE5ldyBTV0lHIGRpcmVjdGl2ZXMgKHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbiBzeXN0ZW0pCgoJJXN0eWxlCgklbG9jYWxzdHlsZQoJJXN1YnNlY3Rpb24KCSVzdWJzdWJzZWN0aW9uCgo2LiBSZW9yZ2FuaXplZCB0aGUgQysrIGhhbmRsaW5nIGFuZCBtYWRlIGl0IGEgbGl0dGxlIGVhc2llciB0bwogICB3b3JrIHdpdGggaW50ZXJuYWxseS4KCjcuICBGaXhlZCBwcm9ibGVtIHdpdGggaW5oZXJpdGluZyBkYXRhIG1lbWJlcnMgaW4gUHl0aG9uCiAgICBzaGFkb3cgY2xhc3Nlcy4KCjguICBGaXhlZCBzeW1ib2wgdGFibGUgcHJvYmxlbXMgd2l0aCBzaGFkb3cgY2xhc3NlcyBpbiBib3RoCiAgICBQeXRob24gYW5kIFBlcmwuCgo5LiAgRml4ZWQgYW5ub3lpbmcgc2VnbWVudGF0aW9uIGZhdWx0IGJ1ZyBpbiB3cmFwcGVyIGNvZGUKICAgIGdlbmVyYXRlZCBmb3IgUGVybDUuCgoxMC4gRml4ZWQgYnVnIHdpdGggJWFkZG1ldGhvZHMgZGlyZWN0aXZlLiAgTm93IGl0IGNhbiBiZSBwbGFjZWQKICAgIGFueXdoZXJlIGluIGEgY2xhc3MuCgoxMS4gTW9yZSB0ZXN0IGNhc2VzIGFkZGVkIHRvIHRoZSBTV0lHIHNlbGYtdGVzdC4gICBEb2N1bWVudGF0aW9uCiAgICB0ZXN0cyBhcmUgbm93IHBlcmZvcm1lZCBhbG9uZyB3aXRoIG90aGVyIHRoaW5ncy4KCjEyLiBSZW9yZ2FuaXplZCB0aGUgU1dJRyBsaWJyYXJ5IGEgbGl0dGxlIGJpdCBhbmQgc2V0IGl0IHVwIHRvCiAgICBzZWxmLWRvY3VtZW50IGl0c2VsZiB1c2luZyBTV0lHLgoKMTMuIExvdHMgYW5kIGxvdHMgb2YgbWlub3IgYnVnIGZpeGVzIChtb3N0bHkgb2JzY3VyZSwgYnV0IGJ1Z3MKICAgIG5vbmV0aGVsZXNzKS4KCgpWZXJzaW9uIDEuMSBCZXRhMSAoT2N0b2JlciAzMCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBBZGRlZCBuZXcgJWV4dGVybiBkaXJlY3RpdmUgZm9yIGhhbmRsaW5nIG11bHRpcGxlIGZpbGVzCgoyLiBQZXJsNSBzaGFkb3cgY2xhc3NlcyBhZGRlZAoKMy4gUmV3cm90ZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byB3b3JrIGJldHRlcgoKNC4gQWRkZWQgJ2Jvb2wnIGRhdGF0eXBlCgo1LiAleywlfSBibG9jayBpcyBub3cgb3B0aW9uYWwuCgo2LiBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgbW9kdWxlCgo3LiBSZXdyb3RlIGFsbCBvZiB0aGUgU1dJRyB0ZXN0cyB0byBiZSBtb3JlIGluZm9ybWF0aXZlCiAgIChhbmQgbGVzcyBzY2FyeSkuCgo4LiBSZXdyb3RlIHBhcmFtZXRlciBsaXN0IGhhbmRsaW5nIHRvIGJlIG1vcmUgbWVtb3J5CiAgIGVmZmljaWVudCBhbmQgZmxleGlibGUuCgo5LiBDaGFuZ2VkIHBhcnNlciB0byBpZ25vcmUgJ3N0YXRpYycgZGVjbGFyYXRpb25zLgoKMTAuIEluaXRpYWxpemVycyBhcmUgbm93IGlnbm9yZWQuICBGb3IgZXhhbXBsZSA6CgoJc3RydWN0IEZvb0JhciBhID0gezMsNCw1fTsKCjExLiBTb21ld2hhdCBiZXR0ZXIgcGFyc2luZyBvZiBhcnJheXMgKGFsdGhvdWdoIGl0J3MKICAgIHVzdWFsbHkganVzdCBhIGJldHRlciBlcnJvciBtZXNzYWdlIG5vdykuCgoxMi4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzLgoKClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMzEsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBGaXhlZCBtaW5vciBidWcgaW4gQysrIG1vZHVsZQoKMi4gRml4ZWQgbWlub3IgYnVnIGluIHBvaW50ZXIgdHlwZS1jaGVja2VyIHdoZW4gdXNpbmcKICAgLURBTExPV19OVUxMLgoKMy4gRml4ZWQgY29uZmlndXJlIHNjcmlwdCB0byB3b3JrIHdpdGggUHl0aG9uIDEuNGJldGEzCgo0LiBDaGFuZ2VkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aG91dAogICB5YWNjIG9yIGJpc29uLgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAyOCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBDaGFuZ2VkIHBhcnNlciB0byBzdXBwb3J0IG1vcmUgQy9DKysgZGF0YXR5cGVzICh3ZWxsLAogICAgbW9yZSB2YXJpYW50cykuICAgVHlwZXMgbGlrZSAidW5zaWduZWQiLCAic2hvcnQgaW50IiwKICAgICJsb25nIGludCIsIGV0Yy4uLiBub3cgd29yay4KCjIuICAidW5pb25zIiBhZGRlZCB0byBwYXJzZXIuCgozLiAgVXNlIG9mICJ0eXBlZGVmIiBhcyBpbiA6CgoJdHlwZWRlZiBzdHJ1Y3QgewoJICAgICBkb3VibGUgeCx5LHo7Cgl9IFZlY3RvcjsKCiAgICBOb3cgd29ya3MgY29ycmVjdGx5LiAgIFRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIGlzIHVzZWQgYXMKICAgIHRoZSBzdHJ1Y3R1cmUgbmFtZS4KCjQuICBDb25kaXRpb25hbCBjb21waWxhdGlvbiB3aXRoICNpZmRlZiwgI2Vsc2UsICNlbmRpZiwgZXRjLi4uCiAgICBhZGRlZC4KCjUuICBOZXcgJWRpc2FibGVkb2MsICVlbmFibGVkb2MgZGlyZWN0aXZlcyBhbGxvdyBkb2N1bWVudGF0aW9uCiAgICB0byBzZWxlY3RpdmVseSBiZSBkaXNhYmxlZCBmb3IgY2VydGFpbiBwYXJ0cyBvZiBhIHdyYXBwZXIKICAgIGZpbGUuCgo2LiAgTmV3IFB5dGhvbiBtb2R1bGUgc3VwcG9ydHMgYmV0dGVyIHZhcmlhYmxlIGxpbmtpbmcsIGNvbnN0YW50cywKICAgIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjcuICBQZXJsNSBtb2R1bGUgaW1wcm92ZWQgd2l0aCBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFhTCiAgICBhbmQgeHN1YnBwLiAgIFNXSUcgcG9pbnRlcnMgYW5kIG5vdyBjcmVhdGVkIHNvIHRoYXQgdGhleQogICAgYXJlIGNvbXBhdGlibGUgd2l0aCB4c3VicHAgcG9pbnRlcnMuCgo4LiAgU3VwcG9ydCBmb3IgW2luY3IgVGNsXSBuYW1lc3BhY2VzIGFkZGVkIHRvIFRjbCBtb2R1bGUuCgo5LiAgJXByYWdtYSBkaXJlY3RpdmUgYWRkZWQuCgoxMC4gJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGFkZGVkLgoKMTEuICVuYXRpdmUgZGlyZWN0aXZlIGFkZGVkIHRvIGFsbG93IHByZS1leGlzdGluZyB3cmFwcGVyIGZ1bmN0aW9ucwogICAgdG8gYmUgdXNlZC4KCjEyLiBXcm90ZSBjb25maWd1cmUgc2NyaXB0IGZvciBTV0lHIGluc3RhbGxhdGlvbi4KCjEzLiBGdW5jdGlvbiBwb2ludGVycyBub3cgYWxsb3dlZCB3aXRoIHR5cGVkZWYgc3RhdGVtZW50cy4KCjE0LiAldHlwZWRlZiBtb2RpZmllZCB0byBpbnNlcnQgYSBjb3JyZXNwb25kaW5nIEMgdHlwZWRlZiBpbnRvCiAgICB0aGUgb3V0cHV0IGZpbGUuCgoxNS4gRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIEMrKyByZWZlcmVuY2VzLgoKMTYuIE5ldyBTdHJpbmcgYW5kIFdyYXBwZXJGdW5jdGlvbiBjbGFzc2VzIGFkZCB0byBtYWtlIGdlbmVyYXRpbmcKICAgIHdyYXBwZXIgY29kZSBlYXNpZXIuCgoxNy4gRml4ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiBwcm9jZXNzaW5nIHRvIGVsaW1pbmF0ZSBjb3JlIGR1bXBzCiAgICBhbmQgdG8gYWxsb3cgaGVscCBtZXNzYWdlcy4KCjE4LiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMgdG8gYWxtb3N0IGFsbCBjb2RlIG1vZHVsZXMKCgpWZXJzaW9uIDEuMCBCZXRhIDMgKFBhdGNoIDEpIEp1bHkgMTcsIDE5OTYKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLjAgRmluYWwgaXMgbm90IHF1aXRlIHJlYWR5IHlldCwgYnV0IHRoaXMgcmVsZWFzZSBmaXhlcyBhCm51bWJlciBvZiBpbW1lZGlhdGUgcHJvYmxlbXMgOgoKMS4gIENvbXBpbGVyIGVycm9ycyB3aGVuIHVzaW5nIC1zdHJpY3QgMSB0eXBlIGNoZWNraW5nIGhhdmUgYmVlbiBmaXhlZC4KCjIuICBQb2ludGVyIHR5cGUgY2hlY2tlciBub3cgcmVjb2duaXplcyBwb2ludGVycyBvZiB0aGUgZm9ybQogICAgXzBfVHlwZSBjb3JyZWN0bHkuCgozLiAgQSBmZXcgbWlub3IgZml4ZXMgd2VyZSBtYWRlIGluIHRoZSBNYWtlZmlsZQoKVmVyc2lvbiAxLjAgQmV0YSAzIChKdW5lIDE0LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKVGhlcmUgYXJlIGxvdHMgb2YgY2hhbmdlcyBpbiB0aGlzIHJlbGVhc2UgOgoKMS4gIFNXSUcgaXMgbm93IGludm9rZWQgdXNpbmcgdGhlICJzd2lnIiBjb21tYW5kIGluc3RlYWQgb2YgIndyYXAiLgogICAgSGV5LCBzd2lnIHNvdW5kcyBjb29sZXIuCgoyLiAgVGhlIFNXSUdfTElCIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8gY2hhbmdlIHRoZQogICAgbG9jYXRpb24gd2hlcmUgU1dJRyBsb29rcyBmb3IgbGlicmFyeSBmaWxlcy4KCjMuICBDKysgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gICBZb3Ugc2hvdWxkIHVzZSB0aGUgLWMrKyBvcHRpb24KICAgIHRvIGVuYWJsZSBpdC4KCjQuICBUaGUgJWluaXQgZGlyZWN0aXZlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4KICAgICVtb2R1bGUgY29uc3RydWN0cyBhIHZhbGlkIG5hbWUgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICAgZm9yIHdoYXRldmVyIHRhcmdldCBsYW5ndWFnZSB5b3UncmUgdXNpbmcgKGFjdHVhbGx5IHRoaXMgbWFrZXMKICAgIFNXSUcgZmlsZXMgYSBsaXR0bGUgY2xlYW5lcikuICBUaGUgb2xkICVpbml0IGRpcmVjdGl2ZSBzdGlsbCB3b3Jrcy4KCjUuICBUaGUgc3ludGF4IG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgaGFzIGJlZW4gY2hhbmdlZC4gICBVc2Ugb2YgdGhlCiAgICBvbGQgb25lIHNob3VsZCBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IG1heSBzdGlsbCB3b3JrLgoKNi4gIFRvIHN1cHBvcnQgVGNsL1RrIG9uIG5vbi11bml4IHBsYXRmb3JtcywgU1dJRyBpbXBvcnRzIGEgZmlsZSBjYWxsZWQKICAgIHN3aWd0Y2wuY2ZnIGZyb20gdGhlICQoU1dJR19MSUIpL3RjbCBkaXJlY3RvcnkuICAgSSBkb24ndCBoYXZlIGFjY2VzcwogICAgdG8gYW4gTlQgbWFjaGluZSwgYnV0IHRoaXMgZmlsZSBpcyBzdXBwb3NlZGx5IGFsbG93cyBTV0lHIHRvCiAgICBwcm9kdWNlIHdyYXBwZXIgY29kZSB0aGF0IGNvbXBpbGVzIG9uIGJvdGggVU5JWCBhbmQgbm9uIFVOSVggbWFjaGluZXMuCiAgICBJZiB0aGlzIGRvZXNuJ3Qgd29yaywgeW91J2xsIGhhdmUgdG8gZWRpdCB0aGUgZmlsZSBzd2lndGNsLmNmZy4gUGxlYXNlCiAgICBsZXQgbWUga25vdyBpZiB0aGlzIGRvZXNuJ3Qgd29yayBzbyBJIGNhbiB1cGRhdGUgdGhlIGZpbGUgYXMKICAgIG5lY2Vzc2FyeS4KCjcuICBUaGUgU1dJRyBydW4tdGltZSB0eXBlY2hlY2tlciBoYXMgYmVlbiBpbXByb3ZlZC4gICAgWW91IGNhbiBhbHNvCiAgICBub3cgcmVkZWZpbmUgaG93IGl0IHdvcmtzIGJ5IHN1cHBseWluZyBhIGZpbGUgY2FsbGVkICJzd2lncHRyLmNmZyIKICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB5b3VyIFNXSUcgaW50ZXJmYWNlIGZpbGVzLiAgIEJ5IGRlZmF1bHQsCiAgICBTV0lHIHJlYWRzIHRoaXMgZmlsZSBmcm9tICQoU1dJR19MSUIpL2NvbmZpZy4KCjguICBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgOgoKCS0gIERvY3VtZW50YXRpb24gb3JkZXIgaXMgcHJpbnRlZCBpbiBpbnRlcmZhY2UgZmlsZSBvcmRlciBieQogICAgICAgICAgIGRlZmF1bHQuICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwdXR0aW5nIGFuICVhbHBoYQogICAgICAgICAgIGRpcmVjdGl2ZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgLSAgWW91IGNhbiBzdXBwbHkgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIHRleHQgdXNpbmcKCiAgICAgICAgICAgJXRleHQgJXsgcHV0IHlvdXIgdGV4dCBoZXJlICV9CgogICAgICAgIC0gIEEgZmV3IG1pbm9yIGJ1Z3Mgd2VyZSBmaXhlZC4KCjkuICBBIGZldyBpbXByb3ZlbWVudHMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGhhbmRsaW5nIG9mIGNvbW1hbmQgbGluZQogICAgb3B0aW9ucyAoYnV0IGl0J3Mgc3RpbGwgbm90IGZpbmlzaGVkKS4KCjEwLiAgTG90cyBvZiBtaW5vciBidWcgZml4ZXMgaW4gbW9zdCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyBoYXZlIGJlZW4KICAgICBtYWRlLgoKMTEuIEZpbGVuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB0byA4LjMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhIFNXSUcKICAgIHBvcnQgdG8gbm9uLXVuaXggcGxhdGZvcm1zICh3b3JrIGluIHByb2dyZXNzKS4KCjEyLiBDKysgZmlsZSBzdWZmaXggaXMgbm93IC5jeHggKGZvciBzYW1lIHJlYXNvbikuCgoxMy4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBncmFkZWQgc2lnbmlmaWNhbnRseSBhbmQgaXMgbm93CiAgICBhcm91bmQgMTAwIHBhZ2VzLiAgICBJIGFkZGVkIG5ldyBleGFtcGxlcyBhbmQgYSBzZWN0aW9uIG9uCiAgICBDKysuICBUaGUgZG9jdW1lbnRhdGlvbiBub3cgaW5jbHVkZXMgYSBUYWJsZSBvZiBDb250ZW50cy4KCjE0LiBUaGUgU1dJRyBFeGFtcGxlcyBkaXJlY3RvcnkgaXMgc3RpbGwgd29lZnVsbHkgc3BhcnNlLCBidXQgaXMKICAgIGdldHRpbmcgYmV0dGVyLgoKU3BlY2lhbCBub3RpY2UgYWJvdXQgQysrCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGlzIGlzIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIFNXSUcgdG8gc3VwcG9ydCBDKysgcGFyc2luZy4gIEN1cnJlbnRseQp0aGUgQysrIGlzIGZhciBmcm9tIGNvbXBsZXRlLCBidXQgc2VlbXMgdG8gd29yayBmb3Igc2ltcGxlIGNhc2VzLgpObyB3b3JrIGhhcyBiZWVuIGRvbmUgdG8gYWRkIHNwZWNpYWwgQysrIHByb2Nlc3NpbmcgdG8gYW55IG9mCnRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiAgIFNlZSB0aGUgdXNlciBtYW51YWwgZm9yIGRldGFpbHMgYWJvdXQgaG93CkMrKyBpcyBoYW5kbGVkLiAgIElmIHlvdSBmaW5kIHByb2JsZW1zIHdpdGggdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwKcGxlYXNlIGxldCBtZSBrbm93LiAgRXhwZWN0IG1ham9yIGltcHJvdmVtZW50cyBpbiB0aGlzIGFyZWEuCgpOb3RlIDogSSBoYXZlIG9ubHkgc3VjY2Vzc2Z1bGx5IHVzZWQgU1dJRyBhbmQgQysrIHdpdGggVGNsIGFuZApQeXRob24uCgpOb3RpY2UgYWJvdXQgVmVyc2lvbiAxLjBGaW5hbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVmVyc2lvbiAxLjBCMyBpcyB0aGUgbGFzdCBCZXRhIHJlbGVhc2UgYmVmb3JlIHZlcnNpb24gMS4wIEZpbmFsIGlzCnJlbGVhc2VkLiAgSSBoYXZlIGZyb3plbiB0aGUgbGlzdCBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAxLjAKYW5kIHdpbGwgb25seSBmaXggYnVncyBhcyB0aGV5IHNob3cgdXAuICBXb3JrIG9uIFNXSUcgdmVyc2lvbiAyLjAgaXMKYWxyZWFkeSBpbiBwcm9ncmVzcywgYnV0IGlzIGdvaW5nIHRvIHJlc3VsdCBpbiByYXRoZXIgc2lnbmlmaWNhbnQKY2hhbmdlcyB0byBTV0lHJ3MgaW50ZXJuYWwgc3RydWN0dXJlIChob3BlZnVsbHkgZm9yIHRoZSBiZXR0ZXIpLiAgTm8KYW50aWNpcGF0ZWQgZGF0ZSBmb3IgdmVyc2lvbiAyLjAgaXMgc2V0LCBidXQgaWYgeW91J3ZlIGdvdCBhbiBpZGVhLApsZXQgbWUga25vdy4KClZlcnNpb24gMS4wIEJldGEgMiAoQXByaWwgMjYsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIHJlbGVhc2UgaXMgaWRlbnRpY2FsIHRvIEJldGExIGV4Y2VwdCBhIGZldyBtaW5vciBidWdzIGFyZQpmaXhlZCBhbmQgdGhlIFNXSUcgbGlicmFyeSBoYXMgYmVlbiB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41L1RrIDQuMS4KQSB0Y2w3LjUgZXhhbXBsZXMgZGlyZWN0b3J5IGlzIG5vdyBpbmNsdWRlZC4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIE1ha2VmaWxlIHRoYXQgZGlkbid0IGluc3RhbGwgdGhlIGxpYnJhcmllcwogIGNvcnJlY3RseS4KCi0gU1dJRyBMaWJyYXJ5IGZpbGVzIGFyZSBub3cgdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNSBhbmQgVGsgNC4xLgoKLSBNaW5vciBidWcgZml4ZXMgaW4gb3RoZXIgbW9kdWxlcy4KCgpWZXJzaW9uIDEuMCBCZXRhIDEgIChBcHJpbCAxMCwgMTk5NikuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgaXMgdGhlIGZpcnN0ICJzZW1pLW9mZmljaWFsIiByZWxlYXNlIG9mIFNXSUcuICAgIEl0IGhhcyBhCm51bWJlciBvZiBzdWJzdGFudGlhbCBpbXByb3ZlbWVudHMgb3ZlciB0aGUgQWxwaGEgcmVsZWFzZS4gICBUaGVzZQpub3RlcyBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci0taG9wZSBJIHJlbWVtYmVyZWQgZXZlcnl0aGluZy4uLi4KCjEuICBUY2wvVGsKClNXSUcgaXMga25vd24gdG8gd29yayB3aXRoIFRjbDcuMywgVGszLjYgYW5kIGxhdGVyIHZlcnNpb25zLgpJJ3ZlIGFsc28gdGVzdGVkIFNXSUcgd2l0aCBleHBlY3QtNS4xOS4KCk5vcm1hbGx5IFNXSUcgZXhwZWN0cyB0byB1c2UgdGhlIGhlYWRlciBmaWxlcyAidGNsLmgiIGFuZCAidGsuaCIuCk5ld2VyIHZlcnNpb25zIG9mIFRjbC9UayB1c2UgdmVyc2lvbiBudW1iZXJzLiAgIFlvdSBjYW4gc3BlY2lmeSB0aGVzZQppbiBTV0lHIGFzIGZvbGxvd3MgOgoKICAgICAgICAlIHdyYXAgLWh0Y2wgdGNsNy40LmggLWh0ayB0azQuMC5oIGV4YW1wbGUuaQoKT2YgY291cnNlLCBJIHByZWZlciB0byBzaW1wbHkgc2V0IHVwIHN5bWJvbGljIGxpbmtzIGJldHdlZW4gInRjbC5oIiBhbmQKdGhlIG1vc3QgcmVjZW50IHN0YWJsZSB2ZXJzaW9uIG9uIHRoZSBtYWNoaW5lLgoKMi4gIFBlcmw0CgpUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGJhc2VkIG9uIFBlcmwtNC4wMzUuICBTV0lHJ3MgaW50ZXJmYWNlIHRvClBlcmw0IGlzIGJhc2VkIG9uIHRoZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGluIHRoZSAiUHJvZ3JhbW1pbmcgUGVybCIKYm9vayBieSBMYXJyeSBXYWxsLCBhbmQgZmlsZXMgbG9jYXRlZCBpbiB0aGUgInVzdWIiIGRpcmVjdG9yeSBvZiB0aGUKUGVybDQgZGlzdHJpYnV0aW9uLgoKSW4gb3JkZXIgdG8gY29tcGlsZSB3aXRoIFBlcmw0LCB5b3UnbGwgbmVlZCB0byBsaW5rIHdpdGggdGhlIHVwZXJsLm8KZmlsZSBmb3VuZCBpbiB0aGUgUGVybDQgc291cmNlIGRpcmVjdG9yeS4gIFlvdSBtYXkgd2FudCB0byBtb3ZlIHRoaXMKZmlsZSB0byBhIG1vcmUgY29udmVuaWVudCBsb2NhdGlvbi4KCjMuICBQZXJsNQoKVGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbiwgYnV0IGlzIGFsb3QgbGVzcwpidWdneSB0aGFuIHRoZSBhbHBoYSByZWxlYXNlLiAgICAgU1dJRyBvcGVyYXRlcyBpbmRlcGVuZGVudGx5IG9mCnRoZSBYUyBsYW5ndWFnZSBhbmQgeHN1YnBwIHN1cHBsaWVkIHdpdGggUGVybDUuICBDdXJyZW50bHkgU1dJRwpwcm9kdWNlcyB0aGUgbmVjZXNzYXJ5IEMgY29kZSBhbmQgLnBtIGZpbGUgbmVlZGVkIHRvIGR5bmFtaWNhbGx5CmxvYWQgYSBtb2R1bGUgaW50byBQZXJsNS4KClRvIHN1cHBvcnQgUGVybDUncyBub3Rpb24gb2YgbW9kdWxlcyBhbmQgcGFja2FnZXMgKGFzIHdpdGggeHN1YnBwKSwKeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyA6CgogICAgICAgICUgd3JhcCAtcGVybDUgLW1vZHVsZSBNeU1vZHVsZSAtcGFja2FnZSBNeVBhY2thZ2UgZXhhbXBsZS5pCgpOb3RlIDogSW4gb3JkZXIgZm9yIGR5bmFtaWMgbG9hZGluZyB0byBiZSBlZmZlY3RpdmUsIHlvdSBuZWVkIHRvIGJlCmNhcmVmdWwgYWJvdXQgbmFtaW5nLiAgICBGb3IgYSBtb2R1bGUgbmFtZWQgIk15TW9kdWxlIiwgeW91J2xsIG5lZWQgdG8KY3JlYXRlIGEgc2hhcmVkIG9iamVjdCBmaWxlIGNhbGxlZCAiTXlNb2R1bGUuc28iIHVzaW5nIHNvbWV0aGluZyBsaWtlCgogICAgICAgICUgbGQgLXNoYXJlZCBteV9vYmoubyAtbyBNeU1vZHVsZS5zbwoKVGhlIHVzZSBvZiB0aGUgJWluaXQgZGlyZWN0aXZlIG11c3QgbWF0Y2ggdGhlIG1vZHVsZSBuYW1lIHNpbmNlIFBlcmw1CmNhbGxzIGEgZnVuY3Rpb24gImJvb3RfTW9kdWxlTmFtZSIgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGluZ3MuClNlZSB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IGZvciBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBnZXQgdGhpbmdzCnRvIHdvcmsuCgo0LiAgUHl0aG9uMS4zCgpUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlIHN1cHBvcnRpbmcgUHl0aG9uLiAgICBUaGUgUHl0aG9uIHBvcnQgaXMKZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmV3cml0dGVuLiAgIFZhcmlhYmxlIGxpbmthZ2UgaXMgZG9uZSB0aHJvdWdoCmZ1bmN0aW9ucyB3aGljaCBpcyBzb3J0IG9mIGEga2x1ZGdlLiAgSSBhbHNvIHRoaW5rIGl0IHdvdWxkIGJlIG5pY2UKdG8gaW1wb3J0IFNXSUcgcG9pbnRlcnMgaW50byBQeXRob24gYXMgYSBuZXcgb2JqZWN0IChpbnN0ZWFkIG9mIHN0cmluZ3MpLgpPZiBjb3Vyc2UsIHRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrLgoKNS4gIEd1aWxlMwoKSWYgeW91IHJlYWxseSB3YW50IHRvIGxpdmUgb24gdGhlIGVkZ2UsIHBpY2sgdXAgYSBjb3B5IG9mIEd1aWxlLWlpaSBhbmQKcGxheSBhcm91bmQgd2l0aCB0aGlzLiAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC0tLWVzcGVjaWFsbHkgc2luY2UKSSdtIG5vdCBzdXJlIHdoYXQgdGhlIG9mZmljaWFsIHN0YXRlIG9mIEd1aWxlIGlzIHRoZXNlIGRheXMuICBUaGlzCmltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgc2hvdWxkIEkgc3VkZGVubHkgZmlndXJlIG91dCBiZXR0ZXIKd2F5cyB0byBkbyB0aGluZ3MuCgo2LiAgRXh0ZW5kaW5nIFNXSUcKClNXSUcgaXMgd3JpdHRlbiBpbiBDKysgYWx0aG91Z2ggSSB0ZW5kIHRvIHRoaW5rIG9mIHRoZSBjb2RlIGFzIG1vc3RseQpiZWluZyBBTlNJIEMgd2l0aCBhIGxpdHRsZSBpbmhlcml0YW5jZSB0aHJvd24gaW4uICAgRWFjaCB0YXJnZXQgbGFuZ3VhZ2UKaXMgaW1wbGVtZW50ZWQgYXMgYSBDKysgY2xhc3MgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIHRoZSBzeXN0ZW0uCklmIHlvdSB3YW50IHRvIGFkZCB5b3VyIG93biBtb2RpZmljYXRpb25zLCBzZWUgQXBwZW5kaXggQyBvZiB0aGUgdXNlcgptYW51YWwuICAgVGhlbiB0YWtlIGEgbG9vayBhdCB0aGUgInVzZXIiIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb21lCmNvZGUgZm9yIGJ1aWxkaW5nIHlvdXIgb3duIGV4dGVuaW9ucy4KCjcuIFRoZSBTV0lHIGxpYnJhcnkKClRoZSBTV0lHIGxpYnJhcnkgaXMgc3RpbGwgaW5jb21wbGV0ZS4gIFNvbWUgb2YgdGhlIGZpbGVzIG1lbnRpb25lZCBpbgp0aGUgdXNlciBtYW51YWwgYXJlIHVuYXZhaWxhYmxlLiAgICBUaGVzZSBmaWxlcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlCndoZW4gdGhleSBhcmUgcmVhZHkuICAgU3Vic2NyaWJlIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBmb3IgYW5ub3VuY2VtZW50cwphbmQgdXBkYXRlcy4KCjguIFNXSUcgRG9jdW1lbnRhdGlvbgoKSSBoYXZlIHNvbWV0aW1lcyBleHBlcmllbmNlZCBwcm9ibGVtcyB2aWV3aW5nIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gaW4Kc29tZSBwb3N0c2NyaXB0IHZpZXdlcnMuICAgSG93ZXZlciwgdGhlIGRvY3VtZW50YXRpb24gc2VlbXMgdG8gcHJpbnQKbm9ybWFsbHkuICAgIEknbSB3b3JraW5nIG9uIG1ha2luZyBtdWNoIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9ubGluZSwKYnV0IHRoaXMgdGFrZXMgdGltZS4KClZlcnNpb24gMC4xIEFscGhhIChGZWJydWFyeSA5LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBSdW4tdGltZSB0eXBlLWNoZWNraW5nIG9mIFNXSUcgcG9pbnRlcnMuICAgUG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZAogICAgYXMgc3RyaW5ncyB3aXRoIGJvdGggbnVtZXJpYyBhbmQgZW5jb2RlZCB0eXBlIGluZm9ybWF0aW9uLiAgICBUaGlzIG1ha2VzCiAgICBpdCBhIGxpdHRsZSBoYXJkZXIgdG8gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QgKGFuZCBpdCBlbGltaW5hdGVzCiAgICBzb21lIHNlZ21lbnRhdGlvbiBmYXVsdHMgYW5kIG90aGVyIG9kZGl0aWVzKS4KCjIuICBQeXRob24gMS4zIG5vdyBzdXBwb3J0ZWQuCgozLiAgI2RlZmluZSBhbmQgZW51bSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsIGNvbnN0YW50cy4KCjQuICBDb21wbGV0ZWx5IHJld3JvdGUgdGhlICVpbmNsdWRlIGRpcmVjdGl2ZSBhbmQgbWFkZSBpdCBhbG90IG1vcmUgcG93ZXJmdWwuCgo1LiAgUmVzdHJ1Y3R1cmVkIHRoZSBTV0lHIGxpYnJhcnkgdG8gbWFrZSBpdCB3b3JrIGJldHRlci4KCjYuICBWYXJpb3VzIGJ1ZyBmaXhlcyB0byBUY2wsIFBlcmw0LCBQZXJsNSwgYW5kIEd1aWxlIGltcGxlbWVudGF0aW9ucy4KCjcuICBCZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YgJXR5cGVkZWYgZGlyZWN0aXZlLgoKOC4gIE1hZGUgc29tZSBjaGFuZ2VzIHRvIFNXSUcncyBjbGFzcyBzdHJ1Y3R1cmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZXhwYW5kLgogICAgU1dJRyBpcyBub3cgYnVpbHQgaW50byBhIGxpYnJhcnkgZmlsZSB0aGF0IHlvdSBjYW4gdXNlIHRvIG1ha2UgeW91cgogICAgb3duIGV4dGVuaW9ucy4KCjkuICBNYWRlIGV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudGF0aW9uLgoKMTAuIE1pbm9yIGNoYW5nZXMgdG8gdGhlIFNXSUcgcGFyc2VyIHRvIG1ha2UgaXQgdXNlIGxlc3MgbWVtb3J5LgogICAgQWxzbyB0b29rIG91dCBzb21lIGV4dHJhbmVvdXMgcnVsZXMgdGhhdCB3ZXJlIHVuZG9jdW1lbnRlZCBhbmQKICAgIGRpZG4ndCB3b3JrIGluIHRoZSBmaXJzdCBwbGFjZS4KCjExLiBUaGUgU1dJRyBsaWJyYXJ5IGZpbGVzICJ0Y2xzaCIsICJ3aXNoIiwgImV4cGVjdCIsIGV0Yy4uLiBpbiB0aGUgZmlyc3QKICAgIHJlbGVhc2UgaGF2ZSBiZWVuIHJlc3RydWN0dXJlZCBhbmQgcmVuYW1lZCB0byAidGNsc2guaSIsICJ3aXNoLmkiLAogICAgYW5kIHNvIG9uLgo=