ICAgICAgKiBTdW1tYXJ5OiBQcm92aWRlIENhbm9uaWNhbCBYTUwgYW5kIEV4Y2x1c2l2ZSBYTUwgQ2Fub25pY2FsaXphdGlvbgogICAgICAqIERlc2NyaXB0aW9uOiB0aGUgYzE0biBtb2R1bGVzIHByb3ZpZGVzIGEKICAgICAgKgogICAgICAqICJDYW5vbmljYWwgWE1MIiBpbXBsZW1lbnRhdGlvbgogICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1jMTRuCiAgICAgICoKICAgICAgKiBhbmQgYW4KICAgICAgKgogICAgICAqICJFeGNsdXNpdmUgWE1MIENhbm9uaWNhbGl6YXRpb24iIGltcGxlbWVudGF0aW9uCiAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLWV4Yy1jMTRuCiAgICAgICoKICAgICAgKiBDb3B5OiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCiAgICAgICoKICAgICAgKiBBdXRob3I6IFBhdHJpY2sgTW9ubmVyYXQgPHBtQGRhdGFzcGhlcmUuY2g+LCBEQVRBU1BIRVJFIFMuQS4KCiAgICAgIC9pZiBub3QgZGVmaW5lZChYTUxfQzE0Tl9IX18pCiAgICAgIC9kZWZpbmUgWE1MX0MxNE5fSF9fCgogICAgICAvaW5jbHVkZSAibGlieG1scnBnL3htbHZlcnNpb24iCgogICAgICAvaWYgZGVmaW5lZChMSUJYTUxfQzE0Tl9FTkFCTEVEKQogICAgICAvaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCgogICAgICAvaW5jbHVkZSAibGlieG1scnBnL3htbFR5cGVzQyIKICAgICAgL2luY2x1ZGUgImxpYnhtbHJwZy90cmVlIgogICAgICAvaW5jbHVkZSAibGlieG1scnBnL3hwYXRoIgoKICAgICAgKiBYTUwgQ2Fub25pY2F6YXRpb24KICAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtYzE0bgogICAgICAqCiAgICAgICogRXhjbHVzaXZlIFhNTCBDYW5vbmljYXphdGlvbgogICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1leGMtYzE0bgogICAgICAqCiAgICAgICogQ2Fub25pY2FsIGZvcm0gb2YgYW4gWE1MIGRvY3VtZW50IGNvdWxkIGJlIGNyZWF0ZWQgaWYgYW5kIG9ubHkgaWYKICAgICAgKiAgYSkgZGVmYXVsdCBhdHRyaWJ1dGVzIChpZiBhbnkpIGFyZSBhZGRlZCB0byBhbGwgbm9kZXMKICAgICAgKiAgYikgYWxsIGNoYXJhY3RlciBhbmQgcGFyc2VkIGVudGl0eSByZWZlcmVuY2VzIGFyZSByZXNvbHZlZAogICAgICAqIEluIG9yZGVyIHRvIGFjaGl2ZSB0aGlzIGluIGxpYnhtbDIgdGhlIGRvY3VtZW50IE1VU1QgYmUgbG9hZGVkIHdpdGgKICAgICAgKiBmb2xsb3dpbmcgZ2xvYmFsIHNldGluZ3M6CiAgICAgICoKICAgICAgKiAgICB4bWxMb2FkRXh0RHRkRGVmYXVsdFZhbHVlID0gWE1MX0RFVEVDVF9JRFMg4yBYTUxfQ09NUExFVEVfQVRUUlM7CiAgICAgICogICAgeG1sU3Vic3RpdHV0ZUVudGl0aWVzRGVmYXVsdCgxKTsKICAgICAgKgogICAgICAqIG9yIGNvcnJlc3BvbmRpbmcgcGFyc2VyIGNvbnRleHQgc2V0dGluZzoKICAgICAgKiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7CiAgICAgICoKICAgICAgKiAgICAuLi4KICAgICAgKiAgICBjdHh0LT5sb2Fkc3Vic2V0ID0gWE1MX0RFVEVDVF9JRFMg4yBYTUxfQ09NUExFVEVfQVRUUlM7CiAgICAgICogICAgY3R4dC0+cmVwbGFjZUVudGl0aWVzID0gMTsKICAgICAgKiAgICAuLi4KCiAgICAgICogeG1sQzE0Tk1vZGU6CiAgICAgICoKICAgICAgKiBQcmVkZWZpbmVkIHZhbHVlcyBmb3IgQzE0TiBtb2RlcwoKICAgICBkIHhtbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUuLi4KICAgICBkIHhtbEMxNE5Nb2RlICAgICBzICAgICAgICAgICAgICAgICAgIGJhc2VkKCMjIyMjI3R5cGVkZWYjIyMjIyMpCiAgICAgZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHhtbENlbnVtKQogICAgIGQgIFhNTF9DMTROXzFfMCAgIGMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdpbmFsIEMxNE4gMS4wCiAgICAgZCAgWE1MX0MxNE5fRVhDTFVTSVZFXzFfMC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjbHVzaXZlIEMxNE4gMS4wCiAgICAgZCAgICAgICAgICAgICAgICAgYyAgICAgICAgICAgICAgICAgICAxCiAgICAgZCAgWE1MX0MxNE5fMV8xICAgYyAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzE0TiAxLjEgc3BlYwoKICAgICBkIHhtbEMxNE5Eb2NTYXZlVG8uLi4KICAgICBkICAgICAgICAgICAgICAgICBwciAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ3htbEMxNE5Eb2NTYXZlVG8nKQogICAgIGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh4bWxDaW50KQogICAgIGQgIGRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZSh4bWxEb2NQdHIpCiAgICAgZCAgbm9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbE5vZGVTZXRQdHIpCiAgICAgZCAgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbENpbnQpCiAgICAgZCAgaW5jbHVzaXZlX25zX3ByZWZpeGVzLi4uCiAgICAgZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBvcHRpb25zKCpvbWl0KSAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciAqKCopCiAgICAgZCAgd2l0aF9jb21tZW50cyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbENpbnQpCiAgICAgZCAgYnVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbE91dHB1dEJ1ZmZlclB0cikKCiAgICAgZCB4bWxDMTRORG9jRHVtcE1lbW9yeS4uLgogICAgIGQgICAgICAgICAgICAgICAgIHByICAgICAgICAgICAgICAgICAgZXh0cHJvYygneG1sQzE0TkRvY0R1bXBNZW1vcnknKQogICAgIGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh4bWxDaW50KQogICAgIGQgIGRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZSh4bWxEb2NQdHIpCiAgICAgZCAgbm9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbE5vZGVTZXRQdHIpCiAgICAgZCAgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbENpbnQpCiAgICAgZCAgaW5jbHVzaXZlX25zX3ByZWZpeGVzLi4uCiAgICAgZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBvcHRpb25zKCpvbWl0KSAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciAqKCopCiAgICAgZCAgd2l0aF9jb21tZW50cyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbENpbnQpCiAgICAgZCAgZG9jX3R4dF9wdHIgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciAqKCopCgogICAgIGQgeG1sQzE0TkRvY1NhdmUgIHByICAgICAgICAgICAgICAgICAgZXh0cHJvYygneG1sQzE0TkRvY1NhdmUnKQogICAgIGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh4bWxDaW50KQogICAgIGQgIGRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZSh4bWxEb2NQdHIpCiAgICAgZCAgbm9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbE5vZGVTZXRQdHIpCiAgICAgZCAgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbENpbnQpCiAgICAgZCAgaW5jbHVzaXZlX25zX3ByZWZpeGVzLi4uCiAgICAgZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBvcHRpb25zKCpvbWl0KSAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciAqKCopCiAgICAgZCAgd2l0aF9jb21tZW50cyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbENpbnQpCiAgICAgZCAgZmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgZCAgY29tcHJlc3Npb24gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbENpbnQpCgogICAgICAqIFRoaXMgaXMgdGhlIGNvcmUgQzE0TiBmdW5jdGlvbgoKICAgICAgKiB4bWxDMTROSXNWaXNpYmxlQ2FsbGJhY2s6CiAgICAgICogQHVzZXJfZGF0YTogdXNlciBkYXRhCiAgICAgICogQG5vZGU6IHRoZSBjdXJlbnQgbm9kZQogICAgICAqIEBwYXJlbnQ6IHRoZSBwYXJlbnQgbm9kZQogICAgICAqCiAgICAgICogU2lnbmF0dXJlIGZvciBhIEMxNE4gY2FsbGJhY2sgb24gdmlzaWJsZSBub2RlcwogICAgICAqCiAgICAgICogUmV0dXJucyAxIGlmIHRoZSBub2RlIHNob3VsZCBiZSBpbmNsdWRlZAoKICAgICBkIHhtbEMxNE5Jc1Zpc2libGVDYWxsYmFjay4uLgogICAgIGQgICAgICAgICAgICAgICAgIHMgICAgICAgICAgICAgICAqICAgYmFzZWQoIyMjIyMjdHlwZWRlZiMjIyMjIykKICAgICBkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NwdHIKCiAgICAgZCB4bWxDMTRORXhlY3V0ZSAgcHIgICAgICAgICAgICAgICAgICBleHRwcm9jKCd4bWxDMTRORXhlY3V0ZScpCiAgICAgZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHhtbENpbnQpCiAgICAgZCAgZG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbERvY1B0cikKICAgICBkICBpc192aXNpYmxlX2NhbGxiYWNrLi4uCiAgICAgZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbEMxNE5Jc1Zpc2libGVDYWxsYmFjaykKICAgICBkICB1c2VyX2RhdGEgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoKICAgICBkICBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoeG1sQ2ludCkKICAgICBkICBpbmNsdXNpdmVfbnNfcHJlZml4ZXMuLi4KICAgICBkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG9wdGlvbnMoKm9taXQpICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFyICooKikKICAgICBkICB3aXRoX2NvbW1lbnRzICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoeG1sQ2ludCkKICAgICBkICBidWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoeG1sT3V0cHV0QnVmZmVyUHRyKQoKICAgICAgL2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJYTUxfT1VUUFVUX0VOQUJMRAogICAgICAvZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlhNTF9DMTROX0VOQUJMRUQKICAgICAgL2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfQzE0Tl9IX18K