ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlLy5jZHRwcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvLmNkdHByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOTdmMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvLmNkdHByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZS1jZHQgdmVyc2lvbj0iMi4wIj8+Ci0KLTxjZHRwcm9qZWN0IGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLm1ha2UiPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+Ci08ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5QRSIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuTWFjaE8iIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiPgotPGF0dHJpYnV0ZSBrZXk9ImMrK2ZpbHQiIHZhbHVlPSJjKytmaWx0Ii8+Ci08L2V4dGVuc2lvbj4KLTxkYXRhPgotPGl0ZW0gaWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08L2l0ZW0+Ci08aXRlbSBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUucGF0aGVudHJ5Ij4KLTxwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIiLz4KLTxwYXRoZW50cnkga2luZD0ib3V0IiBwYXRoPSIiLz4KLTxwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkRJU0NPVkVSRURfU0NBTk5FUl9JTkZPIi8+Ci08L2l0ZW0+Ci08aXRlbSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZHRhcmdldHMiPgotPGJ1aWxkVGFyZ2V0cz4KLTx0YXJnZXQgbmFtZT0iYWxsIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiIHBhdGg9ImxpYnJhcnkvY2FyYm9uIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbWFjb3N4Lm1hazwvYnVpbGRBcmd1bWVudHM+Ci08YnVpbGRUYXJnZXQ+YWxsPC9idWlsZFRhcmdldD4KLTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci08dXNlRGVmYXVsdENvbW1hbmQ+ZmFsc2U8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08dGFyZ2V0IG5hbWU9ImNsZWFuIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiIHBhdGg9ImxpYnJhcnkvY2FyYm9uIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbWFjb3N4Lm1hazwvYnVpbGRBcmd1bWVudHM+Ci08YnVpbGRUYXJnZXQ+Y2xlYW48L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0iYWxsLW1pbmd3IiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiIHBhdGg9ImxpYnJhcnkvd2luMzIiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHM+LWYgbWFrZV9taW5ndy5tYWs8L2J1aWxkQXJndW1lbnRzPgotPGJ1aWxkVGFyZ2V0PmFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJjbGVhbiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIiBwYXRoPSJsaWJyYXJ5L3dpbjMyIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbWluZ3cubWFrPC9idWlsZEFyZ3VtZW50cz4KLTxidWlsZFRhcmdldD5jbGVhbjwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJsaW51eC1hbGwiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciIgcGF0aD0ibGlicmFyeS9tb3RpZiI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cz4tZiBtYWtlX2xpbnV4Lm1hayBKQVZBX0hPTUU9L3Vzci9qYXZhLzEuNSBERUZBVUxUX1dTPW1vdGlmPC9idWlsZEFyZ3VtZW50cz4KLTxidWlsZFRhcmdldD5hbGw8L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0iY2xlYW4iIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciIgcGF0aD0ibGlicmFyeS9tb3RpZiI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cz4tZiBtYWtlX2xpbnV4Lm1hazwvYnVpbGRBcmd1bWVudHM+Ci08YnVpbGRUYXJnZXQ+Y2xlYW48L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0ibGludXgtYWxsIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiIHBhdGg9ImxpYnJhcnkvZ3RrIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbGludXgubWFrIEpBVkFfSE9NRT0vdXNyL2phdmEvMS41PC9idWlsZEFyZ3VtZW50cz4KLTxidWlsZFRhcmdldD5hbGw8L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0iY2xlYW4iIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciIgcGF0aD0ibGlicmFyeS9ndGsiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHM+LWYgbWFrZV9saW51eC5tYWs8L2J1aWxkQXJndW1lbnRzPgotPGJ1aWxkVGFyZ2V0PmNsZWFuPC9idWlsZFRhcmdldD4KLTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci08dXNlRGVmYXVsdENvbW1hbmQ+ZmFsc2U8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08L2J1aWxkVGFyZ2V0cz4KLTwvaXRlbT4KLTwvZGF0YT4KLTwvY2R0cHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlLy5jcHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlLy5jcHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0Mzk1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS8uY3Byb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48P2ZpbGVWZXJzaW9uIDQuMC4wPz48Y3Byb2plY3Q+Ci0JPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIj4KLQkJPGNjb25maWd1cmF0aW9uIGlkPSJjb252ZXJ0ZWQuY29uZmlnLjE3OTcyODI4MTgiPgotCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KLQkJCQk8YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KLQkJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci0JCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgotCQkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotCQkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci0JCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLQkJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci0JCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLQkJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotCQkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci0JCQkJPC9wcm9maWxlPgotCQkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLQkJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci0JCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotCQkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci0JCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLQkJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KLQkJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci0JCQkJCQk8cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLQkJCQk8L3Byb2ZpbGU+Ci0JCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotCQkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KLQkJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci0JCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLQkJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgotCQkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLQkJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotCQkJCQkJPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotCQkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci0JCQkJPC9wcm9maWxlPgotCQkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLQkJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci0JCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotCQkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci0JCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLQkJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci0JCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLQkJCQkJCTxwYXJzZXIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotCQkJCTwvcHJvZmlsZT4KLQkJCTwvc3RvcmFnZU1vZHVsZT4KLQkJCTxzdG9yYWdlTW9kdWxlIGJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmRlZmF1bHRDb25maWdEYXRhUHJvdmlkZXIiIGlkPSJjb252ZXJ0ZWQuY29uZmlnLjE3OTcyODI4MTgiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iY29udmVydGVkQ29uZmlnIj4KLQkJCQk8ZXh0ZXJuYWxTZXR0aW5ncy8+Ci0JCQkJPGV4dGVuc2lvbnM+Ci0JCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLlBFIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+Ci0JCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVMRiIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPgotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5NYWNoTyIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPgotCQkJCTwvZXh0ZW5zaW9ucz4KLQkJCTwvc3RvcmFnZU1vZHVsZT4KLQkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5sYW5ndWFnZS5tYXBwaW5nIi8+Ci0JCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZXh0ZXJuYWxTZXR0aW5ncyIvPgotCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC51aS50ZXh0LmNvbW1lbnRPd25lclByb2plY3RNYXBwaW5ncyIvPgotCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhdGhlbnRyeSI+Ci0JCQkJPHBhdGhlbnRyeSBraW5kPSJtYWMiIG5hbWU9IkpOSUVYUE9SVCIgcGF0aD0iIiB2YWx1ZT0iIi8+Ci0JCQkJPHBhdGhlbnRyeSBpbmNsdWRlPSIvdXNyL1gxMVI2L2luY2x1ZGUiIGtpbmQ9ImluYyIgcGF0aD0iIiBzeXN0ZW09InRydWUiLz4KLQkJCQk8cGF0aGVudHJ5IGluY2x1ZGU9Ii9vcHQvZ25vbWUvaW5jbHVkZS9ndGstMi4wIiBraW5kPSJpbmMiIHBhdGg9IiIgc3lzdGVtPSJ0cnVlIi8+Ci0JCQkJPHBhdGhlbnRyeSBpbmNsdWRlPSIvb3B0L2dub21lL2luY2x1ZGUvZ2xpYi0yLjAiIGtpbmQ9ImluYyIgcGF0aD0iIiBzeXN0ZW09InRydWUiLz4KLQkJCQk8cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci0JCQkJPHBhdGhlbnRyeSBraW5kPSJvdXQiIHBhdGg9IiIvPgotCQkJCTxwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkRJU0NPVkVSRURfU0NBTk5FUl9JTkZPIi8+Ci0JCQk8L3N0b3JhZ2VNb2R1bGU+Ci0JCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZHRhcmdldHMiPgotCQkJCTxidWlsZFRhcmdldHM+Ci0JCQkJCTx0YXJnZXQgbmFtZT0ibGludXgtYWxsIiBwYXRoPSJsaWJyYXJ5L2d0ayIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLQkJCQkJCTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotCQkJCQkJPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbGludXgubWFrIERFRkFVTFRfT1NfQVJDSD14ODZfNjQgSkFWQV9IT01FPS91c3IvamF2YS9pYm0tMTUwPC9idWlsZEFyZ3VtZW50cz4KLQkJCQkJCTxidWlsZFRhcmdldD5hbGw8L2J1aWxkVGFyZ2V0PgotCQkJCQkJPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLQkJCQkJCTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci0JCQkJCQk8cnVuQWxsQnVpbGRlcnM+dHJ1ZTwvcnVuQWxsQnVpbGRlcnM+Ci0JCQkJCTwvdGFyZ2V0PgotCQkJCQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBwYXRoPSJsaWJyYXJ5L2d0ayIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLQkJCQkJCTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotCQkJCQkJPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbGludXgubWFrPC9idWlsZEFyZ3VtZW50cz4KLQkJCQkJCTxidWlsZFRhcmdldD5jbGVhbjwvYnVpbGRUYXJnZXQ+Ci0JCQkJCQk8c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotCQkJCQkJPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLQkJCQkJCTxydW5BbGxCdWlsZGVycz50cnVlPC9ydW5BbGxCdWlsZGVycz4KLQkJCQkJPC90YXJnZXQ+Ci0JCQkJCTx0YXJnZXQgbmFtZT0iYWxsIiBwYXRoPSJsaWJyYXJ5L2NhcmJvbiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLQkJCQkJCTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotCQkJCQkJPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbWFjb3N4Lm1hazwvYnVpbGRBcmd1bWVudHM+Ci0JCQkJCQk8YnVpbGRUYXJnZXQ+YWxsPC9idWlsZFRhcmdldD4KLQkJCQkJCTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci0JCQkJCQk8dXNlRGVmYXVsdENvbW1hbmQ+ZmFsc2U8L3VzZURlZmF1bHRDb21tYW5kPgotCQkJCQkJPHJ1bkFsbEJ1aWxkZXJzPnRydWU8L3J1bkFsbEJ1aWxkZXJzPgotCQkJCQk8L3RhcmdldD4KLQkJCQkJPHRhcmdldCBuYW1lPSJjbGVhbiIgcGF0aD0ibGlicmFyeS9jYXJib24iIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci0JCQkJCQk8YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLQkJCQkJCTxidWlsZEFyZ3VtZW50cz4tZiBtYWtlX21hY29zeC5tYWs8L2J1aWxkQXJndW1lbnRzPgotCQkJCQkJPGJ1aWxkVGFyZ2V0PmNsZWFuPC9idWlsZFRhcmdldD4KLQkJCQkJCTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci0JCQkJCQk8dXNlRGVmYXVsdENvbW1hbmQ+ZmFsc2U8L3VzZURlZmF1bHRDb21tYW5kPgotCQkJCQkJPHJ1bkFsbEJ1aWxkZXJzPnRydWU8L3J1bkFsbEJ1aWxkZXJzPgotCQkJCQk8L3RhcmdldD4KLQkJCQkJPHRhcmdldCBuYW1lPSJhbGwtbWluZ3ciIHBhdGg9ImxpYnJhcnkvd2luMzIiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci0JCQkJCQk8YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLQkJCQkJCTxidWlsZEFyZ3VtZW50cz4tZiBtYWtlX21pbmd3Lm1hayBKQVZBX0hPTUU9QzovRGV2L0phdmEvSUJNLTEuNi4wLTIwMDkwNTE5LVNSNTwvYnVpbGRBcmd1bWVudHM+Ci0JCQkJCQk8YnVpbGRUYXJnZXQ+YWxsPC9idWlsZFRhcmdldD4KLQkJCQkJCTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci0JCQkJCQk8dXNlRGVmYXVsdENvbW1hbmQ+ZmFsc2U8L3VzZURlZmF1bHRDb21tYW5kPgotCQkJCQkJPHJ1bkFsbEJ1aWxkZXJzPnRydWU8L3J1bkFsbEJ1aWxkZXJzPgotCQkJCQk8L3RhcmdldD4KLQkJCQkJPHRhcmdldCBuYW1lPSJjbGVhbiIgcGF0aD0ibGlicmFyeS93aW4zMiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLQkJCQkJCTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotCQkJCQkJPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbWluZ3cubWFrPC9idWlsZEFyZ3VtZW50cz4KLQkJCQkJCTxidWlsZFRhcmdldD5jbGVhbjwvYnVpbGRUYXJnZXQ+Ci0JCQkJCQk8c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotCQkJCQkJPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLQkJCQkJCTxydW5BbGxCdWlsZGVycz50cnVlPC9ydW5BbGxCdWlsZGVycz4KLQkJCQkJPC90YXJnZXQ+Ci0JCQkJCTx0YXJnZXQgbmFtZT0ibGludXgtYWxsIiBwYXRoPSJsaWJyYXJ5L21vdGlmIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiPgotCQkJCQkJPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci0JCQkJCQk8YnVpbGRBcmd1bWVudHM+LWYgbWFrZV9saW51eC5tYWsgSkFWQV9IT01FPS91c3IvamF2YS8xLjUgREVGQVVMVF9XUz1tb3RpZiBNT1RJRl9IT01FPS9lY2xpcHNlL21vdGlmMjE8L2J1aWxkQXJndW1lbnRzPgotCQkJCQkJPGJ1aWxkVGFyZ2V0PmFsbDwvYnVpbGRUYXJnZXQ+Ci0JCQkJCQk8c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotCQkJCQkJPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLQkJCQkJCTxydW5BbGxCdWlsZGVycz50cnVlPC9ydW5BbGxCdWlsZGVycz4KLQkJCQkJPC90YXJnZXQ+Ci0JCQkJCTx0YXJnZXQgbmFtZT0iY2xlYW4iIHBhdGg9ImxpYnJhcnkvbW90aWYiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci0JCQkJCQk8YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLQkJCQkJCTxidWlsZEFyZ3VtZW50cz4tZiBtYWtlX2xpbnV4Lm1hazwvYnVpbGRBcmd1bWVudHM+Ci0JCQkJCQk8YnVpbGRUYXJnZXQ+Y2xlYW48L2J1aWxkVGFyZ2V0PgotCQkJCQkJPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLQkJCQkJCTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci0JCQkJCQk8cnVuQWxsQnVpbGRlcnM+dHJ1ZTwvcnVuQWxsQnVpbGRlcnM+Ci0JCQkJCTwvdGFyZ2V0PgotCQkJCTwvYnVpbGRUYXJnZXRzPgotCQkJPC9zdG9yYWdlTW9kdWxlPgotCQk8L2Njb25maWd1cmF0aW9uPgotCTwvc3RvcmFnZU1vZHVsZT4KLTwvY3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZmIxZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS5nZGJfaGlzdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0MTlkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUubWFrZUJ1aWxkZXI8L25hbWU+Ci0JCQk8dHJpZ2dlcnM+Y2xlYW4sZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQuY29yZS5lcnJvck91dHB1dFBhcnNlcjwva2V5PgotCQkJCQk8dmFsdWU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuTWFrZUVycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLkdBU0Vycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLkdMREVycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLlZDRXJyb3JQYXJzZXI7PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5hcHBlbmRfZW52aXJvbm1lbnQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLmFyZ3VtZW50czwva2V5PgotCQkJCQk8dmFsdWU+PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC5jb21tYW5kPC9rZXk+Ci0JCQkJCTx2YWx1ZT5tYWtlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC5sb2NhdGlvbjwva2V5PgotCQkJCQk8dmFsdWU+XG9yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZVxsaWJyYXJ5XCR7c3lzdGVtX3Byb3BlcnR5Om9zZ2kud3N9PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuYXV0bzwva2V5PgotCQkJCQk8dmFsdWU+YWxsPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuY2xlYW48L2tleT4KLQkJCQkJPHZhbHVlPmNsZWFuPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuaW5jPC9rZXk+Ci0JCQkJCTx2YWx1ZT5hbGw8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUF1dG9CdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+ZmFsc2U8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUNsZWFuQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUZ1bGxCdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlZEluY3JlbWVudGFsQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVudmlyb25tZW50PC9rZXk+Ci0JCQkJCTx2YWx1ZT5ERUZBVUxUX1dTPSR7c3lzdGVtX3Byb3BlcnR5Om9zZ2kud3N9fERFRkFVTFRfT1M9JHtzeXN0ZW1fcHJvcGVydHk6b3NnaS5vc318REVGQVVMVF9PU19BUkNIPSR7c3lzdGVtX3Byb3BlcnR5Om9zZ2kuYXJjaH18WDExX0hPTUU9L3Vzci9YMTFSNnxQS0dfQ09ORklHX1BBVEg9L3Vzci9sb2NhbC9saWIvcGtnY29uZmlnOi91c3IvbG9jYWwvc2hhcmUvcGtnY29uZmlnOi91c3IvbGliNjQvcGtnY29uZmlnOi91c3Ivc2hhcmUvcGtnY29uZmlnOi9vcHQva2RlMy9saWI2NC9wa2djb25maWc6L29wdC9nbm9tZS9saWI2NC9wa2djb25maWc6L29wdC9nbm9tZS9saWI2NC9wa2djb25maWc6L29wdC9nbm9tZS9zaGFyZS9wa2djb25maWd8TU9USUZfSE9NRT0vdXNyL1gxMXw8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLnN0b3BPbkVycm9yPC9rZXk+Ci0JCQkJCTx2YWx1ZT5mYWxzZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUudXNlRGVmYXVsdEJ1aWxkQ21kPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLlNjYW5uZXJDb25maWdCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5jZHQuY29yZS5jbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5tYWtlTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5TY2FubmVyQ29uZmlnTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhZDhmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY2R0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotI1RodSBGZWIgMDQgMTM6MzM6NTggRVNUIDIwMTAKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90ZW1wbGF0ZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Jhc2VfY2xhdXNlPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9kZWNsYXJhdG9yX2xpc3Q9MTYKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2FjY2Vzc19zcGVjaWZpZXJfY29tcGFyZV90b190eXBlX2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdGVtcGxhdGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHByZXNzaW9uX2xpc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwcmVzc2lvbl9saXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90ZW1wbGF0ZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9pZGVudGlmaWVyX2luX2Z1bmN0aW9uX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZXhjZXB0aW9uX3NwZWNpZmljYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2V4Y2VwdGlvbl9zcGVjaWZpY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90ZW1wbGF0ZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Jhc2VfY2xhdXNlX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Jhc2VfdHlwZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2RlY2xhcmF0b3JfbGlzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2RlY2xhcmF0b3JfbGlzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTAKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bWVyYXRvcl9saXN0PTE2Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fbmFtZXNwYWNlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90ZW1wbGF0ZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90ZW1wbGF0ZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9leGNlcHRpb25fc3BlY2lmaWNhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Jhc2VfY2xhdXNlPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotaW5kZXhlci9pbmRleGVySWQ9b3JnLmVjbGlwc2UuY2R0LmNvcmUuZmFzdEluZGV4ZXIKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9iYXNlX3R5cGVzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90ZW1wbGF0ZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9kZWNsYXJhdGlvbl9jb21wYXJlX3RvX3RlbXBsYXRlX2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYWNjZXNzX3NwZWNpZmllcj10cnVlCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90ZW1wbGF0ZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbmFtZXNwYWNlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdGVtcGxhdGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3RlbXBsYXRlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2V4Y2VwdGlvbl9zcGVjaWZpY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3RlbXBsYXRlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbl9saXN0PTAKLWluZGV4ZXJJZD1vcmcuZWNsaXBzZS5jZHQuY29yZS5mYXN0SW5kZXhlcgotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90ZW1wbGF0ZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90ZW1wbGF0ZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuY2R0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9uYW1lc3BhY2VfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5jZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHM9ZG8gbm90IGluc2VydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTM4ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1RodSBGZWIgMDQgMTM6MzM6NTggRVNUIDIwMTAKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fRXF1aW5veApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NhcmJvbi9tYWNvc3gvcHBjL0VjbGlwc2UuYXBwL0NvbnRlbnRzL0luZm8ucGxpc3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY2FyYm9uL21hY29zeC9wcGMvRWNsaXBzZS5hcHAvQ29udGVudHMvSW5mby5wbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzMjVhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY2FyYm9uL21hY29zeC9wcGMvRWNsaXBzZS5hcHAvQ29udGVudHMvSW5mby5wbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KLTxwbGlzdCB2ZXJzaW9uPSIxLjAiPgotCi08ZGljdD4KLQk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgotCQk8c3RyaW5nPmVjbGlwc2U8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgotCQk8c3RyaW5nPkVjbGlwc2UgMy42IGZvciBNYWMgT1MgWCwgQ29weXJpZ2h0IElCTSBDb3JwLiBhbmQgb3RoZXJzIDIwMDIsIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+Ci0JCTxzdHJpbmc+RWNsaXBzZS5pY25zPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KLQkJPHN0cmluZz5vcmcuZWNsaXBzZS5lY2xpcHNlPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgotCQk8c3RyaW5nPjYuMDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+Ci0JCTxzdHJpbmc+RWNsaXBzZTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgotCQk8c3RyaW5nPkFQUEw8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+Ci0JCTxzdHJpbmc+My42PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgotCQk8c3RyaW5nPj8/Pz88L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgotCQk8c3RyaW5nPjMuNjwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgotCQk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlTG9jYWxpemF0aW9uczwva2V5PgotCQk8YXJyYXk+Ci0JCQk8c3RyaW5nPmFyPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmNzPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmRhPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmVsPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmVuPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmVzPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmRlPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmZpPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmZyPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmh1PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPml0PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPml3PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmphPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmtvPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPm5sPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPm5vPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnBsPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnB0X0JSPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnB0PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnJ1PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnN2PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnRyPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnpoX0hLPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnpoX1RXPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnpoPC9zdHJpbmc+Ci0JCTwvYXJyYXk+Ci0JCQotCTxrZXk+RWNsaXBzZTwva2V5PgotCQk8YXJyYXk+Ci0JCQk8IS0tIHRvIHVzZSBhIHNwZWNpZmljIEphdmEgdmVyc2lvbiAoaW5zdGVhZCBvZiB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0KSB1bmNvbW1lbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKLQkJCQk8c3RyaW5nPi12bTwvc3RyaW5nPjxzdHJpbmc+L1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9WZXJzaW9ucy8xLjQuMi9Db21tYW5kcy9qYXZhPC9zdHJpbmc+Ci0JCQkJPHN0cmluZz4tdm08L3N0cmluZz48c3RyaW5nPi9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvMS41LjAvQ29tbWFuZHMvamF2YTwvc3RyaW5nPgotCQkJLS0+Ci0JCQk8c3RyaW5nPi1rZXlyaW5nPC9zdHJpbmc+PHN0cmluZz5+Ly5lY2xpcHNlX2tleXJpbmc8L3N0cmluZz4KLQkJCTxzdHJpbmc+LXNob3dsb2NhdGlvbjwvc3RyaW5nPgotCQkJPCEtLSBXQVJOSU5HOgotCQkJCUlmIHlvdSB0cnkgdG8gYWRkIGEgc2luZ2xlIFZNIGFyZ3VtZW50ICgtdm1hcmdzKSBoZXJlLAotCQkJCSphbGwqIHZtYXJncyBzcGVjaWZpZWQgaW4gZWNsaXBzZS5pbmkgd2lsbCBiZSBpZ25vcmVkLgotCQkJCVdlIHJlY29tbWVuZCB0byBhZGQgYWxsIGFyZ3VtZW50cyBpbiBlY2xpcHNlLmluaQotCQkJIC0tPgotCQk8L2FycmF5PgotPC9kaWN0PgotCi08L3BsaXN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NhcmJvbi9tYWNvc3gvcHBjL0VjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TL2VjbGlwc2UuaW5pIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NhcmJvbi9tYWNvc3gvcHBjL0VjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TL2VjbGlwc2UuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWRjZDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jYXJib24vbWFjb3N4L3BwYy9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUy9lY2xpcHNlLmluaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLXNob3dzcGxhc2gKLW9yZy5lY2xpcHNlLnBsYXRmb3JtCi0tdm1hcmdzCi0tWGRvY2s6aWNvbj0uLi9SZXNvdXJjZXMvRWNsaXBzZS5pY25zCi0tWHN0YXJ0T25GaXJzdFRocmVhZAotLVhtczQwbQotLVhteDI1Nm0KLS1YWDpNYXhQZXJtU2l6ZT0yNTZtCi0tRG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uc21hbGxGb250cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jYXJib24vbWFjb3N4L3BwYy9FY2xpcHNlLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvRWNsaXBzZS5pY25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NhcmJvbi9tYWNvc3gvcHBjL0VjbGlwc2UuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9FY2xpcHNlLmljbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDk3NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NhcmJvbi9tYWNvc3gvcHBjL0VjbGlwc2UuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9FY2xpcHNlLmljbnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY2FyYm9uL21hY29zeC94ODYvRWNsaXBzZS5hcHAvQ29udGVudHMvSW5mby5wbGlzdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jYXJib24vbWFjb3N4L3g4Ni9FY2xpcHNlLmFwcC9Db250ZW50cy9JbmZvLnBsaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjQ3YjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jYXJib24vbWFjb3N4L3g4Ni9FY2xpcHNlLmFwcC9Db250ZW50cy9JbmZvLnBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgotPHBsaXN0IHZlcnNpb249IjEuMCI+Ci0KLTxkaWN0PgotCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+Ci0JCTxzdHJpbmc+ZWNsaXBzZTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+Ci0JCTxzdHJpbmc+RWNsaXBzZSAzLjYgZm9yIE1hYyBPUyBYLCBDb3B5cmlnaHQgSUJNIENvcnAuIGFuZCBvdGhlcnMgMjAwMiwgMjAxMC4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KLQkJPHN0cmluZz5FY2xpcHNlLmljbnM8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgotCQk8c3RyaW5nPm9yZy5lY2xpcHNlLmVjbGlwc2U8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+Ci0JCTxzdHJpbmc+Ni4wPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KLQkJPHN0cmluZz5FY2xpcHNlPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+Ci0JCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KLQkJPHN0cmluZz4zLjY8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+Ci0JCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+Ci0JCTxzdHJpbmc+My42PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+Ci0JCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVMb2NhbGl6YXRpb25zPC9rZXk+Ci0JCTxhcnJheT4KLQkJCTxzdHJpbmc+YXI8L3N0cmluZz4KLQkJCTxzdHJpbmc+Y3M8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZGE8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZWw8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZW48L3N0cmluZz4KLQkJCTxzdHJpbmc+ZXM8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZGU8L3N0cmluZz4KLQkJCTxzdHJpbmc+Zmk8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZnI8L3N0cmluZz4KLQkJCTxzdHJpbmc+aHU8L3N0cmluZz4KLQkJCTxzdHJpbmc+aXQ8L3N0cmluZz4KLQkJCTxzdHJpbmc+aXc8L3N0cmluZz4KLQkJCTxzdHJpbmc+amE8L3N0cmluZz4KLQkJCTxzdHJpbmc+a288L3N0cmluZz4KLQkJCTxzdHJpbmc+bmw8L3N0cmluZz4KLQkJCTxzdHJpbmc+bm88L3N0cmluZz4KLQkJCTxzdHJpbmc+cGw8L3N0cmluZz4KLQkJCTxzdHJpbmc+cHRfQlI8L3N0cmluZz4KLQkJCTxzdHJpbmc+cHQ8L3N0cmluZz4KLQkJCTxzdHJpbmc+cnU8L3N0cmluZz4KLQkJCTxzdHJpbmc+c3Y8L3N0cmluZz4KLQkJCTxzdHJpbmc+dHI8L3N0cmluZz4KLQkJCTxzdHJpbmc+emhfSEs8L3N0cmluZz4KLQkJCTxzdHJpbmc+emhfVFc8L3N0cmluZz4KLQkJCTxzdHJpbmc+emg8L3N0cmluZz4KLQkJPC9hcnJheT4KLQotCTxrZXk+RWNsaXBzZTwva2V5PgotCQk8YXJyYXk+Ci0JCQk8IS0tIHRvIHVzZSBhIHNwZWNpZmljIEphdmEgdmVyc2lvbiAoaW5zdGVhZCBvZiB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0KSB1bmNvbW1lbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKLQkJCQk8c3RyaW5nPi12bTwvc3RyaW5nPjxzdHJpbmc+L1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9WZXJzaW9ucy8xLjQuMi9Db21tYW5kcy9qYXZhPC9zdHJpbmc+Ci0JCQkJPHN0cmluZz4tdm08L3N0cmluZz48c3RyaW5nPi9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvMS41LjAvQ29tbWFuZHMvamF2YTwvc3RyaW5nPgotCQkJLS0+Ci0JCQk8c3RyaW5nPi1rZXlyaW5nPC9zdHJpbmc+PHN0cmluZz5+Ly5lY2xpcHNlX2tleXJpbmc8L3N0cmluZz4KLQkJCTxzdHJpbmc+LXNob3dsb2NhdGlvbjwvc3RyaW5nPgotCQkJPCEtLSBXQVJOSU5HOgotCQkJCUlmIHlvdSB0cnkgdG8gYWRkIGEgc2luZ2xlIFZNIGFyZ3VtZW50ICgtdm1hcmdzKSBoZXJlLAotCQkJCSphbGwqIHZtYXJncyBzcGVjaWZpZWQgaW4gZWNsaXBzZS5pbmkgd2lsbCBiZSBpZ25vcmVkLgotCQkJCVdlIHJlY29tbWVuZCB0byBhZGQgYWxsIGFyZ3VtZW50cyBpbiBlY2xpcHNlLmluaQotCQkJIC0tPgotCQk8L2FycmF5PgotPC9kaWN0PgotCi08L3BsaXN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NhcmJvbi9tYWNvc3gveDg2L0VjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TL2VjbGlwc2UuaW5pIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NhcmJvbi9tYWNvc3gveDg2L0VjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TL2VjbGlwc2UuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWRjZDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jYXJib24vbWFjb3N4L3g4Ni9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUy9lY2xpcHNlLmluaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLXNob3dzcGxhc2gKLW9yZy5lY2xpcHNlLnBsYXRmb3JtCi0tdm1hcmdzCi0tWGRvY2s6aWNvbj0uLi9SZXNvdXJjZXMvRWNsaXBzZS5pY25zCi0tWHN0YXJ0T25GaXJzdFRocmVhZAotLVhtczQwbQotLVhteDI1Nm0KLS1YWDpNYXhQZXJtU2l6ZT0yNTZtCi0tRG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uc21hbGxGb250cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jYXJib24vbWFjb3N4L3g4Ni9FY2xpcHNlLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvRWNsaXBzZS5pY25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NhcmJvbi9tYWNvc3gveDg2L0VjbGlwc2UuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9FY2xpcHNlLmljbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDk3NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NhcmJvbi9tYWNvc3gveDg2L0VjbGlwc2UuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9FY2xpcHNlLmljbnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY29jb2EvbWFjb3N4L3BwYy9FY2xpcHNlLmFwcC9Db250ZW50cy9JbmZvLnBsaXN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NvY29hL21hY29zeC9wcGMvRWNsaXBzZS5hcHAvQ29udGVudHMvSW5mby5wbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzMjVhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY29jb2EvbWFjb3N4L3BwYy9FY2xpcHNlLmFwcC9Db250ZW50cy9JbmZvLnBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgotPHBsaXN0IHZlcnNpb249IjEuMCI+Ci0KLTxkaWN0PgotCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+Ci0JCTxzdHJpbmc+ZWNsaXBzZTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+Ci0JCTxzdHJpbmc+RWNsaXBzZSAzLjYgZm9yIE1hYyBPUyBYLCBDb3B5cmlnaHQgSUJNIENvcnAuIGFuZCBvdGhlcnMgMjAwMiwgMjAxMC4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KLQkJPHN0cmluZz5FY2xpcHNlLmljbnM8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgotCQk8c3RyaW5nPm9yZy5lY2xpcHNlLmVjbGlwc2U8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+Ci0JCTxzdHJpbmc+Ni4wPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KLQkJPHN0cmluZz5FY2xpcHNlPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+Ci0JCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KLQkJPHN0cmluZz4zLjY8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+Ci0JCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+Ci0JCTxzdHJpbmc+My42PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+Ci0JCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVMb2NhbGl6YXRpb25zPC9rZXk+Ci0JCTxhcnJheT4KLQkJCTxzdHJpbmc+YXI8L3N0cmluZz4KLQkJCTxzdHJpbmc+Y3M8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZGE8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZWw8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZW48L3N0cmluZz4KLQkJCTxzdHJpbmc+ZXM8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZGU8L3N0cmluZz4KLQkJCTxzdHJpbmc+Zmk8L3N0cmluZz4KLQkJCTxzdHJpbmc+ZnI8L3N0cmluZz4KLQkJCTxzdHJpbmc+aHU8L3N0cmluZz4KLQkJCTxzdHJpbmc+aXQ8L3N0cmluZz4KLQkJCTxzdHJpbmc+aXc8L3N0cmluZz4KLQkJCTxzdHJpbmc+amE8L3N0cmluZz4KLQkJCTxzdHJpbmc+a288L3N0cmluZz4KLQkJCTxzdHJpbmc+bmw8L3N0cmluZz4KLQkJCTxzdHJpbmc+bm88L3N0cmluZz4KLQkJCTxzdHJpbmc+cGw8L3N0cmluZz4KLQkJCTxzdHJpbmc+cHRfQlI8L3N0cmluZz4KLQkJCTxzdHJpbmc+cHQ8L3N0cmluZz4KLQkJCTxzdHJpbmc+cnU8L3N0cmluZz4KLQkJCTxzdHJpbmc+c3Y8L3N0cmluZz4KLQkJCTxzdHJpbmc+dHI8L3N0cmluZz4KLQkJCTxzdHJpbmc+emhfSEs8L3N0cmluZz4KLQkJCTxzdHJpbmc+emhfVFc8L3N0cmluZz4KLQkJCTxzdHJpbmc+emg8L3N0cmluZz4KLQkJPC9hcnJheT4KLQkJCi0JPGtleT5FY2xpcHNlPC9rZXk+Ci0JCTxhcnJheT4KLQkJCTwhLS0gdG8gdXNlIGEgc3BlY2lmaWMgSmF2YSB2ZXJzaW9uIChpbnN0ZWFkIG9mIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQpIHVuY29tbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgotCQkJCTxzdHJpbmc+LXZtPC9zdHJpbmc+PHN0cmluZz4vU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL1ZlcnNpb25zLzEuNC4yL0NvbW1hbmRzL2phdmE8L3N0cmluZz4KLQkJCQk8c3RyaW5nPi12bTwvc3RyaW5nPjxzdHJpbmc+L1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9WZXJzaW9ucy8xLjUuMC9Db21tYW5kcy9qYXZhPC9zdHJpbmc+Ci0JCQktLT4KLQkJCTxzdHJpbmc+LWtleXJpbmc8L3N0cmluZz48c3RyaW5nPn4vLmVjbGlwc2Vfa2V5cmluZzwvc3RyaW5nPgotCQkJPHN0cmluZz4tc2hvd2xvY2F0aW9uPC9zdHJpbmc+Ci0JCQk8IS0tIFdBUk5JTkc6Ci0JCQkJSWYgeW91IHRyeSB0byBhZGQgYSBzaW5nbGUgVk0gYXJndW1lbnQgKC12bWFyZ3MpIGhlcmUsCi0JCQkJKmFsbCogdm1hcmdzIHNwZWNpZmllZCBpbiBlY2xpcHNlLmluaSB3aWxsIGJlIGlnbm9yZWQuCi0JCQkJV2UgcmVjb21tZW5kIHRvIGFkZCBhbGwgYXJndW1lbnRzIGluIGVjbGlwc2UuaW5pCi0JCQkgLS0+Ci0JCTwvYXJyYXk+Ci08L2RpY3Q+Ci0KLTwvcGxpc3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY29jb2EvbWFjb3N4L3BwYy9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUy9lY2xpcHNlLmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jb2NvYS9tYWNvc3gvcHBjL0VjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TL2VjbGlwc2UuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmZlYTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jb2NvYS9tYWNvc3gvcHBjL0VjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TL2VjbGlwc2UuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0tc2hvd3NwbGFzaAotb3JnLmVjbGlwc2UucGxhdGZvcm0KLS12bWFyZ3MKLS1YZG9jazppY29uPS4uL1Jlc291cmNlcy9FY2xpcHNlLmljbnMKLS1Yc3RhcnRPbkZpcnN0VGhyZWFkCi0tWG1zNDBtCi0tWG14MjU2bQotLVhYOk1heFBlcm1TaXplPTI1Nm0KLS1Eb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5zbWFsbEZvbnRzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY29jb2EvbWFjb3N4L3BwYy9FY2xpcHNlLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvRWNsaXBzZS5pY25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NvY29hL21hY29zeC9wcGMvRWNsaXBzZS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL0VjbGlwc2UuaWNucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwOTc2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY29jb2EvbWFjb3N4L3BwYy9FY2xpcHNlLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvRWNsaXBzZS5pY25zCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NvY29hL21hY29zeC94ODYvRWNsaXBzZS5hcHAvQ29udGVudHMvSW5mby5wbGlzdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jb2NvYS9tYWNvc3gveDg2L0VjbGlwc2UuYXBwL0NvbnRlbnRzL0luZm8ucGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzI1YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NvY29hL21hY29zeC94ODYvRWNsaXBzZS5hcHAvQ29udGVudHMvSW5mby5wbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KLTxwbGlzdCB2ZXJzaW9uPSIxLjAiPgotCi08ZGljdD4KLQk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgotCQk8c3RyaW5nPmVjbGlwc2U8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgotCQk8c3RyaW5nPkVjbGlwc2UgMy42IGZvciBNYWMgT1MgWCwgQ29weXJpZ2h0IElCTSBDb3JwLiBhbmQgb3RoZXJzIDIwMDIsIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+Ci0JCTxzdHJpbmc+RWNsaXBzZS5pY25zPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KLQkJPHN0cmluZz5vcmcuZWNsaXBzZS5lY2xpcHNlPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgotCQk8c3RyaW5nPjYuMDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+Ci0JCTxzdHJpbmc+RWNsaXBzZTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgotCQk8c3RyaW5nPkFQUEw8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+Ci0JCTxzdHJpbmc+My42PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgotCQk8c3RyaW5nPj8/Pz88L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgotCQk8c3RyaW5nPjMuNjwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgotCQk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlTG9jYWxpemF0aW9uczwva2V5PgotCQk8YXJyYXk+Ci0JCQk8c3RyaW5nPmFyPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmNzPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmRhPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmVsPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmVuPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmVzPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmRlPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmZpPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmZyPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmh1PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPml0PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPml3PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmphPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPmtvPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPm5sPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPm5vPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnBsPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnB0X0JSPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnB0PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnJ1PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnN2PC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnRyPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnpoX0hLPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnpoX1RXPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPnpoPC9zdHJpbmc+Ci0JCTwvYXJyYXk+Ci0JCQotCTxrZXk+RWNsaXBzZTwva2V5PgotCQk8YXJyYXk+Ci0JCQk8IS0tIHRvIHVzZSBhIHNwZWNpZmljIEphdmEgdmVyc2lvbiAoaW5zdGVhZCBvZiB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0KSB1bmNvbW1lbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKLQkJCQk8c3RyaW5nPi12bTwvc3RyaW5nPjxzdHJpbmc+L1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9WZXJzaW9ucy8xLjQuMi9Db21tYW5kcy9qYXZhPC9zdHJpbmc+Ci0JCQkJPHN0cmluZz4tdm08L3N0cmluZz48c3RyaW5nPi9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvMS41LjAvQ29tbWFuZHMvamF2YTwvc3RyaW5nPgotCQkJLS0+Ci0JCQk8c3RyaW5nPi1rZXlyaW5nPC9zdHJpbmc+PHN0cmluZz5+Ly5lY2xpcHNlX2tleXJpbmc8L3N0cmluZz4KLQkJCTxzdHJpbmc+LXNob3dsb2NhdGlvbjwvc3RyaW5nPgotCQkJPCEtLSBXQVJOSU5HOgotCQkJCUlmIHlvdSB0cnkgdG8gYWRkIGEgc2luZ2xlIFZNIGFyZ3VtZW50ICgtdm1hcmdzKSBoZXJlLAotCQkJCSphbGwqIHZtYXJncyBzcGVjaWZpZWQgaW4gZWNsaXBzZS5pbmkgd2lsbCBiZSBpZ25vcmVkLgotCQkJCVdlIHJlY29tbWVuZCB0byBhZGQgYWxsIGFyZ3VtZW50cyBpbiBlY2xpcHNlLmluaQotCQkJIC0tPgotCQk8L2FycmF5PgotPC9kaWN0PgotCi08L3BsaXN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NvY29hL21hY29zeC94ODYvRWNsaXBzZS5hcHAvQ29udGVudHMvTWFjT1MvZWNsaXBzZS5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY29jb2EvbWFjb3N4L3g4Ni9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUy9lY2xpcHNlLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmZWExOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY29jb2EvbWFjb3N4L3g4Ni9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUy9lY2xpcHNlLmluaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLXNob3dzcGxhc2gKLW9yZy5lY2xpcHNlLnBsYXRmb3JtCi0tdm1hcmdzCi0tWGRvY2s6aWNvbj0uLi9SZXNvdXJjZXMvRWNsaXBzZS5pY25zCi0tWHN0YXJ0T25GaXJzdFRocmVhZAotLVhtczQwbQotLVhteDI1Nm0KLS1YWDpNYXhQZXJtU2l6ZT0yNTZtCi0tRG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uc21hbGxGb250cwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NvY29hL21hY29zeC94ODYvRWNsaXBzZS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL0VjbGlwc2UuaWNucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jb2NvYS9tYWNvc3gveDg2L0VjbGlwc2UuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9FY2xpcHNlLmljbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDk3NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NvY29hL21hY29zeC94ODYvRWNsaXBzZS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL0VjbGlwc2UuaWNucworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jb2NvYS9tYWNvc3gveDg2XzY0L0VjbGlwc2UuYXBwL0NvbnRlbnRzL0luZm8ucGxpc3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY29jb2EvbWFjb3N4L3g4Nl82NC9FY2xpcHNlLmFwcC9Db250ZW50cy9JbmZvLnBsaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTMyNWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jb2NvYS9tYWNvc3gveDg2XzY0L0VjbGlwc2UuYXBwL0NvbnRlbnRzL0luZm8ucGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Ci08cGxpc3QgdmVyc2lvbj0iMS4wIj4KLQotPGRpY3Q+Ci0JPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KLQkJPHN0cmluZz5lY2xpcHNlPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KLQkJPHN0cmluZz5FY2xpcHNlIDMuNiBmb3IgTWFjIE9TIFgsIENvcHlyaWdodCBJQk0gQ29ycC4gYW5kIG90aGVycyAyMDAyLCAyMDEwLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgotCQk8c3RyaW5nPkVjbGlwc2UuaWNuczwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+Ci0JCTxzdHJpbmc+b3JnLmVjbGlwc2UuZWNsaXBzZTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KLQkJPHN0cmluZz42LjA8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgotCQk8c3RyaW5nPkVjbGlwc2U8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KLQkJPHN0cmluZz5BUFBMPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgotCQk8c3RyaW5nPjMuNjwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KLQkJPHN0cmluZz4/Pz8/PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KLQkJPHN0cmluZz4zLjY8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KLQkJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUxvY2FsaXphdGlvbnM8L2tleT4KLQkJPGFycmF5PgotCQkJPHN0cmluZz5hcjwvc3RyaW5nPgotCQkJPHN0cmluZz5jczwvc3RyaW5nPgotCQkJPHN0cmluZz5kYTwvc3RyaW5nPgotCQkJPHN0cmluZz5lbDwvc3RyaW5nPgotCQkJPHN0cmluZz5lbjwvc3RyaW5nPgotCQkJPHN0cmluZz5lczwvc3RyaW5nPgotCQkJPHN0cmluZz5kZTwvc3RyaW5nPgotCQkJPHN0cmluZz5maTwvc3RyaW5nPgotCQkJPHN0cmluZz5mcjwvc3RyaW5nPgotCQkJPHN0cmluZz5odTwvc3RyaW5nPgotCQkJPHN0cmluZz5pdDwvc3RyaW5nPgotCQkJPHN0cmluZz5pdzwvc3RyaW5nPgotCQkJPHN0cmluZz5qYTwvc3RyaW5nPgotCQkJPHN0cmluZz5rbzwvc3RyaW5nPgotCQkJPHN0cmluZz5ubDwvc3RyaW5nPgotCQkJPHN0cmluZz5ubzwvc3RyaW5nPgotCQkJPHN0cmluZz5wbDwvc3RyaW5nPgotCQkJPHN0cmluZz5wdF9CUjwvc3RyaW5nPgotCQkJPHN0cmluZz5wdDwvc3RyaW5nPgotCQkJPHN0cmluZz5ydTwvc3RyaW5nPgotCQkJPHN0cmluZz5zdjwvc3RyaW5nPgotCQkJPHN0cmluZz50cjwvc3RyaW5nPgotCQkJPHN0cmluZz56aF9ISzwvc3RyaW5nPgotCQkJPHN0cmluZz56aF9UVzwvc3RyaW5nPgotCQkJPHN0cmluZz56aDwvc3RyaW5nPgotCQk8L2FycmF5PgotCQkKLQk8a2V5PkVjbGlwc2U8L2tleT4KLQkJPGFycmF5PgotCQkJPCEtLSB0byB1c2UgYSBzcGVjaWZpYyBKYXZhIHZlcnNpb24gKGluc3RlYWQgb2YgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCkgdW5jb21tZW50IG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Ci0JCQkJPHN0cmluZz4tdm08L3N0cmluZz48c3RyaW5nPi9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvMS40LjIvQ29tbWFuZHMvamF2YTwvc3RyaW5nPgotCQkJCTxzdHJpbmc+LXZtPC9zdHJpbmc+PHN0cmluZz4vU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL1ZlcnNpb25zLzEuNS4wL0NvbW1hbmRzL2phdmE8L3N0cmluZz4KLQkJCS0tPgotCQkJPHN0cmluZz4ta2V5cmluZzwvc3RyaW5nPjxzdHJpbmc+fi8uZWNsaXBzZV9rZXlyaW5nPC9zdHJpbmc+Ci0JCQk8c3RyaW5nPi1zaG93bG9jYXRpb248L3N0cmluZz4KLQkJCTwhLS0gV0FSTklORzoKLQkJCQlJZiB5b3UgdHJ5IHRvIGFkZCBhIHNpbmdsZSBWTSBhcmd1bWVudCAoLXZtYXJncykgaGVyZSwKLQkJCQkqYWxsKiB2bWFyZ3Mgc3BlY2lmaWVkIGluIGVjbGlwc2UuaW5pIHdpbGwgYmUgaWdub3JlZC4KLQkJCQlXZSByZWNvbW1lbmQgdG8gYWRkIGFsbCBhcmd1bWVudHMgaW4gZWNsaXBzZS5pbmkKLQkJCSAtLT4KLQkJPC9hcnJheT4KLTwvZGljdD4KLQotPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jb2NvYS9tYWNvc3gveDg2XzY0L0VjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TL2VjbGlwc2UuaW5pIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NvY29hL21hY29zeC94ODZfNjQvRWNsaXBzZS5hcHAvQ29udGVudHMvTWFjT1MvZWNsaXBzZS5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZmVhMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2NvY29hL21hY29zeC94ODZfNjQvRWNsaXBzZS5hcHAvQ29udGVudHMvTWFjT1MvZWNsaXBzZS5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS1zaG93c3BsYXNoCi1vcmcuZWNsaXBzZS5wbGF0Zm9ybQotLXZtYXJncwotLVhkb2NrOmljb249Li4vUmVzb3VyY2VzL0VjbGlwc2UuaWNucwotLVhzdGFydE9uRmlyc3RUaHJlYWQKLS1YbXM0MG0KLS1YbXgyNTZtCi0tWFg6TWF4UGVybVNpemU9MjU2bQotLURvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLnNtYWxsRm9udHMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jb2NvYS9tYWNvc3gveDg2XzY0L0VjbGlwc2UuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9FY2xpcHNlLmljbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vY29jb2EvbWFjb3N4L3g4Nl82NC9FY2xpcHNlLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvRWNsaXBzZS5pY25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTA5NzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9jb2NvYS9tYWNvc3gveDg2XzY0L0VjbGlwc2UuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9FY2xpcHNlLmljbnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3BwYy9saWJjYWlyby1zd3Quc28gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3BwYy9saWJjYWlyby1zd3Quc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjE1ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9saW51eC9wcGMvbGliY2Fpcm8tc3d0LnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9saW51eC94ODYvaWNvbi54cG0gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3g4Ni9pY29uLnhwbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0MDRjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3g4Ni9pY29uLnhwbQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKiBYUE0gKi8KLXN0YXRpYyBjaGFyICpQcm9kdWN0SWNvbjQ4W10gPSB7Ci0vKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqLwotIjQ4IDQ4IDI1NyAyIiwKLSIgICBjIGJsYWNrIiwKLSIuICBjIGdyYXkxMDAiLAotIlggIGMgIzY5NUFFOCIsCi0ibyAgYyAjNDk0OTkxIiwKLSJPICBjICNDRTkyQkYiLAotIisgIGMgI0U3Q0FFMCIsCi0iQCAgYyAjQzg4Q0JCIiwKLSIjICBjICNDMjhBQkEiLAotIiQgIGMgI0VBRDdFOCIsCi0iJSAgYyAjQ0ZBOUNDIiwKLSImICBjICNEOUJDRDgiLAotIiogIGMgI0I2ODdCOSIsCi0iPSAgYyAjQzM5OUM3IiwKLSItICBjICNBNzdEQjUiLAotIjsgIGMgI0JEQTNDRCIsCi0iOiAgYyAjRDhDQUUzIiwKLSI+ICBjICNBODhEQzQiLAotIiwgIGMgIzkyNzVCMiIsCi0iPCAgYyAjODc2Q0FBIiwKLSIxICBjICM5QTgzQkEiLAotIjIgIGMgIzdCNjNBMyIsCi0iMyAgYyAjNjY1NDk1IiwKLSI0ICBjICM3MzVGQUQiLAotIjUgIGMgIzYyNTE5MiIsCi0iNiAgYyAjN0Y3MkE3IiwKLSI3ICBjICM2RDVFOUUiLAotIjggIGMgIzY0NTRBOSIsCi0iOSAgYyAjNzc2OUIxIiwKLSIwICBjICM0OTNFODIiLAotInEgIGMgIzdENzNCNiIsCi0idyAgYyAjNUI0RUFEIiwKLSJlICBjICM1NTQ5QkEiLAotInIgIGMgIzU2NDlCQSIsCi0idCAgYyAjNTY0QUJBIiwKLSJ5ICBjICM1NjQ5QjkiLAotInUgIGMgIzU1NDlCOCIsCi0iaSAgYyAjNEY0NEFDIiwKLSJwICBjICM1MzQ4QjQiLAotImEgIGMgIzUzNDhCMyIsCi0icyAgYyAjNTQ0OUI1IiwKLSJkICBjICM1MjQ3QjAiLAotImYgIGMgIzUyNDdBRiIsCi0iZyAgYyAjNTQ0OUIzIiwKLSJoICBjICNERURDRUUiLAotImogIGMgIzNFMzY5OCIsCi0iayAgYyAjNDMzQjlGIiwKLSJsICBjICMzMzJDNzciLAotInogIGMgIzQyM0E5QyIsCi0ieCAgYyAjNEE0MEE4IiwKLSJjICBjICM1NTRBQkEiLAotInYgIGMgIzU1NEFCOSIsCi0iYiAgYyAjNTQ0OUI3IiwKLSJuICBjICM1MjQ4QjEiLAotIm0gIGMgIzUxNDdBRSIsCi0iTSAgYyAjNEU0NUE5IiwKLSJOICBjICM0OTQxQTAiLAotIkIgIGMgIzUyNDhBRiIsCi0iViAgYyAjNTE0OEFFIiwKLSJDICBjICM1MDQ3QUMiLAotIlogIGMgIzRGNDZBQSIsCi0iQSAgYyAjNTE0OEFEIiwKLSJTICBjICM1MDQ3QUIiLAotIkQgIGMgIzUwNDhBQyIsCi0iRiAgYyAjNTA0N0E5IiwKLSJHICBjICM0RTQ2QTciLAotIkggIGMgIzRFNDVBNCIsCi0iSiAgYyAjNEQ0NUE0IiwKLSJLICBjICM0RjQ3QTgiLAotIkwgIGMgIzRFNDZBNSIsCi0iUCAgYyAjNEQ0NUEzIiwKLSJJICBjICMzQjM1N0QiLAotIlUgIGMgIzRFNDZBMyIsCi0iWSAgYyAjNTU0RDlGIiwKLSJUICBjICM0QTQzODkiLAotIlIgIGMgIzUxNEI5MCIsCi0iRSAgYyAjNjc2MEE1IiwKLSJXICBjICMxRDE4NkEiLAotIlEgIGMgIzI3MjI3RCIsCi0iISAgYyAjMjgyMzdEIiwKLSJ+ICBjICMyQjI2ODEiLAotIl4gIGMgIzMzMkM4OSIsCi0iLyAgYyAjM0IzNjhFIiwKLSIoICBjICM0NTQwOTciLAotIikgIGMgIzRENDZBNCIsCi0iXyAgYyAjNEM0NUExIiwKLSJgICBjICM0RDQ2QTIiLAotIicgIGMgIzRCNDVBMCIsCi0iXSAgYyAjNEQ0NkExIiwKLSJbICBjICM0QzQ1OUYiLAotInsgIGMgIzRCNDU5RSIsCi0ifSAgYyAjNEE0NDlDIiwKLSJ8ICBjICM0OTQ0OTgiLAotIiAuIGMgIzQ4NDM5NiIsCi0iLi4gYyAjNEE0NTk5IiwKLSJYLiBjICM0RjRBQTAiLAotIm8uIGMgIzY4NjNBQSIsCi0iTy4gYyAjMjExRDc2IiwKLSIrLiBjICMyNDIwNzUiLAotIkAuIGMgIzJEMkE3RiIsCi0iIy4gYyAjMkQyQTdCIiwKLSIkLiBjICMzRDM5OEYiLAotIiUuIGMgIzQ4NDQ5NiIsCi0iJi4gYyAjNDc0MzkzIiwKLSIqLiBjICM0NjQzOTEiLAotIj0uIGMgIzQ1NDI4RSIsCi0iLS4gYyAjNEQ0QTlDIiwKLSI7LiBjICM1NzU0QTMiLAotIjouIGMgIzVBNTg5NyIsCi0iPi4gYyAjNUY1RDk5IiwKLSIsLiBjICM4NTgyQzEiLAotIjwuIGMgIzk1OTJDOSIsCi0iMS4gYyAjQjhCNkRDIiwKLSIyLiBjICMwNzA1NTMiLAotIjMuIGMgIzA4MDc1NSIsCi0iNC4gYyAjMEEwOTU3IiwKLSI1LiBjICMwQzBCNTgiLAotIjYuIGMgIzBGMEQ1QyIsCi0iNy4gYyAjMTAwRjVDIiwKLSI4LiBjICMxMzExNjQiLAotIjkuIGMgIzE0MTM2MCIsCi0iMC4gYyAjMTQxMzVGIiwKLSJxLiBjICMxNzE1NjciLAotIncuIGMgIzE2MTU2MiIsCi0iZS4gYyAjMTYxNTYxIiwKLSJyLiBjICMxODE3NjQiLAotInQuIGMgIzFBMTk2NiIsCi0ieS4gYyAjMUMxQTY0IiwKLSJ1LiBjICMxRDFDNjgiLAotImkuIGMgIzFGMUU2QSIsCi0icC4gYyAjMjIyMTZDIiwKLSJhLiBjICMyNDIzNkYiLAotInMuIGMgIzI3MjU3MSIsCi0iZC4gYyAjMjcyNjcyIiwKLSJmLiBjICMyNzI2NzEiLAotImcuIGMgIzI5Mjg3NCIsCi0iaC4gYyAjMkEyOTc0IiwKLSJqLiBjICMyQzJCNzciLAotImsuIGMgIzJGMkU3QyIsCi0ibC4gYyAjMkUyRDc5IiwKLSJ6LiBjICMzNDMzN0UiLAotInguIGMgIzM5Mzc4NiIsCi0iYy4gYyAjMzczNjgxIiwKLSJ2LiBjICMzQTM5ODQiLAotImIuIGMgIzNBMzk4MyIsCi0ibi4gYyAjM0QzQjg2IiwKLSJtLiBjICM0MjQxOEMiLAotIk0uIGMgIzQyNDE4QiIsCi0iTi4gYyAjNDQ0MjhCIiwKLSJCLiBjICM0MzQxODkiLAotIlYuIGMgIzQ1NDQ4RSIsCi0iQy4gYyAjNDU0NDhEIiwKLSJaLiBjICM0MjQxODciLAotIkEuIGMgIzQzNDI4OCIsCi0iUy4gYyAjNDQ0Mjg3IiwKLSJELiBjICM0MjQxODUiLAotIkYuIGMgIzQxNDA4MyIsCi0iRy4gYyAjNDg0NzkwIiwKLSJILiBjICM0MzQyODYiLAotIkouIGMgIzRBNDk5MyIsCi0iSy4gYyAjNDY0NThBIiwKLSJMLiBjICM0RDRDOTUiLAotIlAuIGMgIzU0NTJBMCIsCi0iSS4gYyAjNTA0Rjk4IiwKLSJVLiBjICM1ODU3QTAiLAotIlkuIGMgIzUyNTA5MyIsCi0iVC4gYyAjNUI1OUEyIiwKLSJSLiBjICM1ODU3OUYiLAotIkUuIGMgIzYyNjFBOSIsCi0iVy4gYyAjNjQ2M0FDIiwKLSJRLiBjICM2QjZBQjIiLAotIiEuIGMgIzZCNkFCMSIsCi0ifi4gYyAjNzU3NEI4IiwKLSJeLiBjICM3RjdEQkQiLAotIi8uIGMgIzlDOUJDRiIsCi0iKC4gYyAjMEIwQjU4IiwKLSIpLiBjICMwRDBENUEiLAotIl8uIGMgIzExMTE1RSIsCi0iYC4gYyAjMTMxMzYwIiwKLSInLiBjICMyMTIxNkQiLAotIl0uIGMgIzI0MjQ2RiIsCi0iWy4gYyAjMkIyQzc3IiwKLSJ7LiBjICMyQjJCNzciLAotIn0uIGMgIzJDMkM3NyIsCi0ifC4gYyAjMkUyRTc5IiwKLSIgWCBjICMzMTMxN0MiLAotIi5YIGMgIzMxMzE3QiIsCi0iWFggYyAjMzQzNDdFIiwKLSJvWCBjICMzQzNDODYiLAotIk9YIGMgIzNGM0Y4OSIsCi0iK1ggYyAjNDE0MjhCIiwKLSJAWCBjICM0MjQyOEIiLAotIiNYIGMgIzQ3NDc5MCIsCi0iJFggYyAjNDE0MTg0IiwKLSIlWCBjICM0MDQwODEiLAotIiZYIGMgIzRBNEE5NCIsCi0iKlggYyAjNEE0QTkzIiwKLSI9WCBjICM0RDREOTYiLAotIi1YIGMgIzRGNEY5OCIsCi0iO1ggYyAjNTA1MDk4IiwKLSI6WCBjICM1MjUyOUIiLAotIj5YIGMgIzU1NTU5RSIsCi0iLFggYyAjNTU1NTlEIiwKLSI8WCBjICM1NzU4QTAiLAotIjFYIGMgIzU4NThBMCIsCi0iMlggYyAjNTc1ODlGIiwKLSIzWCBjICM1NzU3OUYiLAotIjRYIGMgIzVBNUFBMiIsCi0iNVggYyAjNUQ1REE1IiwKLSI2WCBjICM1RjVGQTciLAotIjdYIGMgIzYxNjJBQSIsCi0iOFggYyAjNjE2MUE5IiwKLSI5WCBjICM2MTYyQTkiLAotIjBYIGMgIzYyNjJBQSIsCi0icVggYyAjNjQ2NEFDIiwKLSJ3WCBjICM2MjYyQTkiLAotImVYIGMgIzY0NjRBQiIsCi0iclggYyAjNjY2NkFFIiwKLSJ0WCBjICM2NjY2QUQiLAotInlYIGMgIzY4NjhCMCIsCi0idVggYyAjNjk2OUFGIiwKLSJpWCBjICM2RDZEQjQiLAotInBYIGMgIzZGNkZCNSIsCi0iYVggYyAjNzM3M0JBIiwKLSJzWCBjICM3MTcxQjciLAotImRYIGMgIzc2NzZCQyIsCi0iZlggYyAjNzk3OUJGIiwKLSJnWCBjICM3Nzc3QjkiLAotImhYIGMgIzgwODBDMSIsCi0ialggYyAjOEM4Q0M1IiwKLSJrWCBjICM5MDkwQzkiLAotImxYIGMgIzk4OThDQiIsCi0ielggYyAjQTBBMENGIiwKLSJ4WCBjICNBNUE1RDMiLAotImNYIGMgI0FCQUJENiIsCi0idlggYyAjQzRDNEUzIiwKLSJiWCBjICNEMUQxRTkiLAotIm5YIGMgI0U1RTVGMyIsCi0ibVggYyAjOUZBMEQxIiwKLSJNWCBjICNCNkM1RTUiLAotIk5YIGMgIzhFQTZENiIsCi0iQlggYyAjOTBBN0Q3IiwKLSJWWCBjICM5MUE5RDciLAotIkNYIGMgIzk1QUJEOCIsCi0iWlggYyAjOTlBRkRBIiwKLSJBWCBjICM5REIyREMiLAotIlNYIGMgI0ExQjVERCIsCi0iRFggYyAjQTVCOERFIiwKLSJGWCBjICNBOUJCRTAiLAotIkdYIGMgI0FDQkRFMSIsCi0iSFggYyAjQjBDMUUzIiwKLSJKWCBjICNCNEM0RTQiLAotIktYIGMgI0I4QzdFNSIsCi0iTFggYyAjQkJDOUU2IiwKLSJQWCBjICNBRUMwRTIiLAotIklYIGMgI0IyQzNFMyIsCi0iVVggYyBncmF5MTAwIiwKLSJZWCBjIE5vbmUiLAotLyogcGl4ZWxzICovCi0iWVhYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFlYIiwKLSJYICVYJVglWEYuRi5GLkYuJFhELlouWi5aLkIuQi5CLk4uTi49Lj0uPS4qLiouKi4mLiYuIC4gLnwgLi4uLn0gfSB7IHsgXyBfIFAgUCBIIEcgRyBHIEsgUyBTIEMgbyAiLAotIlggJVglWCVYJVhGLkYuJFhELkQuWi5aLkIuQS5CLk4uTi5OLj0uPS49LiouKi4mLiYuJS4lLiUufCB8IC4ufSB7IHsgWyBfIF8gYCBVIEogTCBHIEsgRiBaIFMgQyBvICIsCi0iWCAlWCVYJVglWEYuRi5GLkQuRC5ILlouWi5BLkIuTi5OLk4uQy49Lj0uKi4qLiYuJi4gLiAuJS58IHwgLi59IH0geyBbIFsgXyBQIFAgSCBHIEcgSyBGIFMgUyBDIG8gIiwKLSJYICVYRi4lWEYuRi4kWEYuJFhaLlouWi5CLkEuSy5ZLjcgLCAtIC0gMSAxIF4uXi5+LmFYfi5xIDkgNlhZIHsgfSB7ICcgXyBdIFAgUCBIIEwgRyBLIEYgWiBTIEMgbyAiLAotIlggJVhGLkYuRi5GLkYuRC5ELlouWi5aLksuOi4xIDsgJSA7IDwuaFhmWGZYZFhhWGFYc1hwWGlYIS55WHJYby47LlguWyBfIF8gYCBIIEggRyBLIEsgRiBTIFMgQyBvICIsCi0iWCBGLkYuRi5GLkYuRC5ELkQuWi5ILlkuMSAmICYgMS5jWG1YLy5rWGZYZFhhWGFYc1hwWGlYUS55WHRYZVhFLjZYNVhQLlguXyBgIEogTCBHIEcgSyBGIFogUyBDIG8gIiwKLSJYIEQuJFhGLiRYRC5ELlouWi5TLj4uJSArIDogdlgxLjEuY1htWC8uZFhhWGFYc1hwWGlYUS51WHJYcVg4WDZYNVhULlIuUC5YLlAgKSBIIEcgSyBLIFMgUyBTIG0gbyAiLAotIlggRC4kWEQuRC5ELkQuRC5TLjYgJiAkIGggYlh2WHZYMS54WC8ua1hmWGFYc1hwWGlYUS55WHJYVy5FLjZYNVg0WFUuLFg6WEkuLS5gIEwgRyBHIEsgRiBaIEMgQyBvICIsCi0iWCBELkQuRC5ELkQuWi5ILjYgJiAkIGggaCBoIGJYdlgxLmNYbVhrWCwuZFhwWGlYUS55WHRYcVh3WDZYNVhULlUuLFg6WEkuPVgqWC4uYCBHIEsgSyBaIFMgUyBtIG8gIiwKLSJYIFouRC5aLkguWi5aLjcgJiAkIGggaCBuWGggYlh2WDEuY1htWGtYLC5nWGlYUS51WHJYVy5FLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi4gLlAgRyBGIFMgUyBDIG0gbyAiLAotIlggWi5aLlouSC5aLlIgJSArIDogYlhoIGggaCBiWHZYMS5jWC8ua1hoWH4uUS55WHJYcVg5WDZYNVg0WDJYLFg6WDtYPVgqWCNYVi5NLk9YKCBLIFogUyBTIEMgbSBvICIsCi0iWCBaLlouWi5BLkEuKiAmICYgdlh2WGJYYlhiWHZYdlgxLnhYbFhqWF4ucFh1WHJYZVh3WDZYNVg0WFUuLFg6WC1YTC4qWEcuVi5AWE9Yb1hiLiggWiBTIEMgQyBWIG8gIiwKLSJYIEIuQi5CLkEuMiAlICUgMS4xLnZYdlh2WHZYdlgxLmNYelg8LiwuZ1hpWHJYVy5FLjZYNVg0WFUuLFg6WEkuPVgqWCNYVi5AWE9Ybi5iLmMueC5OIFMgUyBDIG0gbyAiLAotIlggQi5CLkIuUy4qICUgOyB4WDEuMS4xLjEuMS5jWGNYelhsWGpYXi5wWHJYZVg3WDZYNVg0WFIuLFg6WC1YTC5KLiNYVi5AWE9Ybi5iLmMuWFggWCQuUyBDIEMgbSBvICIsCi0iWCBOLk4uTi4yIE8gPSAvLm1YeFhjWGNYY1hjWHhYelhsWGpYaFh+LnVYZVhFLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi5NLk9Ybi52LmMuei4gWHwuay5OIEQgViBmIG8gIiwKLSJYIE4uTi5OLi0gQCA+IGtYPC4vLi8ubVh6WHpYbFg8LmpYaFhnWHVYZVhFLjZYNVg0WDFYLFg6WEkuTC4qWCNYVi5tLk9Ybi5iLmMuei4gWGwuai5nLi8gQyBtIFYgbyAiLAotIlggTi5OLlIgQCAjICwuLC5qWGtYa1g8LmtYa1hqWCwuXi5+LnVYd1hFLjZYNVg0WDFYLFg6WEkuPVhKLiNYQy5NLk9Ybi52LmMuei4uWHwuai5nLmQuIy5NIG0gQiBvICIsCi0iWCA9Lk0uPCBAICogZlhmWGhYaFgsLiwuLC5oWF4uZ1hwWHVYcVg5WDZYNVg0WFUuLFg6WEkuTC4qWEcuVi4rWE9Ybi5iLmMuei4uWHwuWy5nLmQuYS5wLnogViBCIG8gIiwKLSJYID0uTi4tIEAgTlhOWEJYQlhCWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYRlhHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhCIGQgbyAiLAotIlggPS49LiogQCAxIGRYZFhhWGFYc1hwWGlYIS55WHJYZVh3WDZYNVg0WDxYLFg6WEkuPVgqWEcuVi5NLk9Ybi52LmMuWFguWHwuai5nLmQuYS5wLmkudS5ALmYgZCBvICIsCi0iWCAqLj0uIyBAIF4uZFhhWGFYc1hwWGlYUS55WHJYZVh3WDZYNVhULlUuLFg6WC1YTC4mWEcuQy5tLk9Yb1h2LmMuei4uWHwuai5nLmYuYS5wLmkudS50LisuZCBkIG8gIiwKLSJYICouKi5AIEAgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSlhKWEpYTVhLWEtYS1hMWExYTFhkIG4gbyAiLAotIlggJi4qLkAgQCBkWGFYc1hwWGlYUS55WHRYZVhFLjZYNVg0WFUuPlg6WEkuTC4qWEcuVi5tLk9Yb1h2LmMuei4gWHwuai5nLmQuYS4nLmkudS50LnIudy45LmQgbiBvICIsCi0iWCAmLiYuQCBAIH4uc1hwWGlYUS55WHRYVy5FLjZYNVg0WDFYLFg6WEkuPVgqWCNYQy5tLk9Ybi5iLmMuei4gWHwuWy5nLmYuYS5wLmkudS50LnIudy45LjAubiBhIG8gIiwKLSJYICYuJi5AIEAgTlhOWEJYQlhWWFZYVlhDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWElYSVhKWE1YTVhLWEtYS1hMWExYTFhuIG4gbyAiLAotIlggJS4gLiMgQCBxIGlYUS55WHJYVy4wWDZYNVg0WFUuPlg6WEkuTC4qWCNYVi5AWE9Ybi5iLmMuWFguWHwuey5nLmYuXS4nLmkudS50LnIudy4wLl8uNy5XIG4gYSBvICIsCi0iWCAlLiAuKiAjICwgUS55WHRYZVg3WDZYNVg0WFUuLFg6WC1YTC4qWCNYVi5AWE9Ybi5iLmMuWFggWGwuey5nLmQuYS5wLmkudS50LnIuZS4wLl8uNy4pLisuYSBhIG8gIiwKLSJYIHwgfCAtICMgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhBWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhhIGEgbyAiLAotIlggfCB8IDwgIyAtIHJYZVg5WDZYNVg0WFUuLFg6WC1YTC4qWCNYQy5AWE9Yb1hiLmMuei4gWHwuai5oLnMuYS4nLmkudS50LnIudy45Ll8uNy4pLjUuNC5qIGEgcCBvICIsCi0iWCB8IH0gWSAjICogOSA4WDZYNVg0WDNYLFg6WEkuPVgqWEcuVi5AWE9Ybi52LmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC5xLmkgZyBwIG8gIiwKLSJYIH0gfSB8IC0gIyAsIDZYNVg0WFIuLFg6WEkuPVgqWEcuVi5tLk9Yb1hiLmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLn4gYSBzIHMgbyAiLAotIlggfSB9IH0gNCAjIC0gRSA0WFUuPlg6WC1YPVhKLiNYVi5NLk9Yb1hiLmMuWFggWHwuey5oLmQuYS4nLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLjYueiBwIHMgcyBvICIsCi0iWCB7IHsgfSB9IC0gIyA8IFUuLFg6WEkuPVgqWEcuVi4rWE9Yb1hiLmMuei4gWHwufS5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuISBnIHAgcyBzIG8gIiwKLSJYIFsgeyAnIFsgNCAqIC0gRSA6WDtYTC5KLiNYVi5tLk9Yb1hiLmMuei4uWHwuai5oLmYuYS4nLmkudS50LnIudy45Ll8uNi4pLiguNC4zLjIuOC5rIHAgcyBzIHMgbyAiLAotIlggWyBbICcgXyBbICwgKiAsIDtYTC5KLiNYVi5AWE9Yb1h2LmMuei4uWHwuey5nLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5eIHMgcCBzIHMgcyBvICIsCi0iWCBfIF8gXyBfIFAgXSAtICogMiAqWCNYVi5tLk9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5RIHAgcyBzIHMgYiB1IG8gIiwKLSJYIGAgYCBgIGAgYCBgIDggLSAtIDcgVi5AWE9Yb1h2LmMuWFguWHwuai5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcCBzIHMgcyB1IHUgbyAiLAotIlggUCBQICkgUCBVIFUgKSA4IC0gLSA3IE9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcyBzIHMgcyBiIHUgdSBvICIsCi0iWCBMIEwgKSBIICkgTCBMIEwgOCAxIC0gNyBiLmMuei4gWHwuai5oLmYuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5RIHggcCBzIHMgcyBiIGIgdSBlIG8gIiwKLSJYIEwgRyBMIEcgRyBHIEcgRyBHIEcgLCAqIDIgVCAuWGwuai5oLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC4zLjIuOC5eIHAgcCBzIHMgcyBzIHUgdSBlIGUgbyAiLAotIlggRyBHIEcgRyBHIEcgRyBLIEsgTSBNIDQgLCAsIDMgSSBnLmQuYS5wLmkudS50LnIuZS5gLl8uNy4pLjUuNC4zLjcuISBrIHAgcyBwIHMgcyBzIHUgdSB1IGUgdiBvICIsCi0iWCBLIEcgSyBLIEsgSyBLIEsgWiBaIE0gRiBGIDQgLCA8IDMgSSBwLmkudS50LnIudy45Ll8uNy4pLjUuNC5XIH4geiBhIHAgcCBzIHMgYiBzIHUgdSB1IGUgZSBlIG8gIiwKLSJYIEYgWiBGIEYgRiBGIFogWiBGIEYgUyBTIFMgUyBTIHcgOSA8IDIgNSAwIGwgcC5lLjkueS5hLmwgXiBqIGkgYSBwIHAgcCBzIHMgYiBiIGIgdSBlIHYgeSByIGUgbyAiLAotIlggUyBaIFogUyBaIFMgWiBTIFMgUyBTIFMgQyBDIEMgQSBtIGQgViBmIG0gQiBtIEIgZCBkIG4gZCBhIGEgYSBwIHMgcCBzIHMgYiB1IHUgdSB1IGUgdiBlIHIgdCBvICIsCi0iWCBTIFMgUyBTIFMgUyBTIFMgUyBTIEMgQyBDIG0gbSBBIFYgViBCIEIgQiBkIGQgZCBuIG4gYSBhIGEgcCBwIHMgcCBzIHMgYiB1IHUgdSBlIGUgZSBjIHQgciB0IG8gIiwKLSJYIEMgQyBDIEMgQyBDIEMgQyBtIEMgQSBtIEEgbSBmIFYgZiBmIEIgZCBkIGQgbiBuIG4gYSBhIGEgYSBzIHMgcyBzIHMgdSBiIHUgdSB1IHUgdiB0IHQgciB0IHQgbyAiLAotIllYbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBZWCIKLX07CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3g4Ni9saWJjYWlyby1zd3Quc28gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3g4Ni9saWJjYWlyby1zd3Quc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NmY5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9saW51eC94ODYvbGliY2Fpcm8tc3d0LnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9saW51eC94ODZfNjQvaWNvbi54cG0gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3g4Nl82NC9pY29uLnhwbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0MDRjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3g4Nl82NC9pY29uLnhwbQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKiBYUE0gKi8KLXN0YXRpYyBjaGFyICpQcm9kdWN0SWNvbjQ4W10gPSB7Ci0vKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqLwotIjQ4IDQ4IDI1NyAyIiwKLSIgICBjIGJsYWNrIiwKLSIuICBjIGdyYXkxMDAiLAotIlggIGMgIzY5NUFFOCIsCi0ibyAgYyAjNDk0OTkxIiwKLSJPICBjICNDRTkyQkYiLAotIisgIGMgI0U3Q0FFMCIsCi0iQCAgYyAjQzg4Q0JCIiwKLSIjICBjICNDMjhBQkEiLAotIiQgIGMgI0VBRDdFOCIsCi0iJSAgYyAjQ0ZBOUNDIiwKLSImICBjICNEOUJDRDgiLAotIiogIGMgI0I2ODdCOSIsCi0iPSAgYyAjQzM5OUM3IiwKLSItICBjICNBNzdEQjUiLAotIjsgIGMgI0JEQTNDRCIsCi0iOiAgYyAjRDhDQUUzIiwKLSI+ICBjICNBODhEQzQiLAotIiwgIGMgIzkyNzVCMiIsCi0iPCAgYyAjODc2Q0FBIiwKLSIxICBjICM5QTgzQkEiLAotIjIgIGMgIzdCNjNBMyIsCi0iMyAgYyAjNjY1NDk1IiwKLSI0ICBjICM3MzVGQUQiLAotIjUgIGMgIzYyNTE5MiIsCi0iNiAgYyAjN0Y3MkE3IiwKLSI3ICBjICM2RDVFOUUiLAotIjggIGMgIzY0NTRBOSIsCi0iOSAgYyAjNzc2OUIxIiwKLSIwICBjICM0OTNFODIiLAotInEgIGMgIzdENzNCNiIsCi0idyAgYyAjNUI0RUFEIiwKLSJlICBjICM1NTQ5QkEiLAotInIgIGMgIzU2NDlCQSIsCi0idCAgYyAjNTY0QUJBIiwKLSJ5ICBjICM1NjQ5QjkiLAotInUgIGMgIzU1NDlCOCIsCi0iaSAgYyAjNEY0NEFDIiwKLSJwICBjICM1MzQ4QjQiLAotImEgIGMgIzUzNDhCMyIsCi0icyAgYyAjNTQ0OUI1IiwKLSJkICBjICM1MjQ3QjAiLAotImYgIGMgIzUyNDdBRiIsCi0iZyAgYyAjNTQ0OUIzIiwKLSJoICBjICNERURDRUUiLAotImogIGMgIzNFMzY5OCIsCi0iayAgYyAjNDMzQjlGIiwKLSJsICBjICMzMzJDNzciLAotInogIGMgIzQyM0E5QyIsCi0ieCAgYyAjNEE0MEE4IiwKLSJjICBjICM1NTRBQkEiLAotInYgIGMgIzU1NEFCOSIsCi0iYiAgYyAjNTQ0OUI3IiwKLSJuICBjICM1MjQ4QjEiLAotIm0gIGMgIzUxNDdBRSIsCi0iTSAgYyAjNEU0NUE5IiwKLSJOICBjICM0OTQxQTAiLAotIkIgIGMgIzUyNDhBRiIsCi0iViAgYyAjNTE0OEFFIiwKLSJDICBjICM1MDQ3QUMiLAotIlogIGMgIzRGNDZBQSIsCi0iQSAgYyAjNTE0OEFEIiwKLSJTICBjICM1MDQ3QUIiLAotIkQgIGMgIzUwNDhBQyIsCi0iRiAgYyAjNTA0N0E5IiwKLSJHICBjICM0RTQ2QTciLAotIkggIGMgIzRFNDVBNCIsCi0iSiAgYyAjNEQ0NUE0IiwKLSJLICBjICM0RjQ3QTgiLAotIkwgIGMgIzRFNDZBNSIsCi0iUCAgYyAjNEQ0NUEzIiwKLSJJICBjICMzQjM1N0QiLAotIlUgIGMgIzRFNDZBMyIsCi0iWSAgYyAjNTU0RDlGIiwKLSJUICBjICM0QTQzODkiLAotIlIgIGMgIzUxNEI5MCIsCi0iRSAgYyAjNjc2MEE1IiwKLSJXICBjICMxRDE4NkEiLAotIlEgIGMgIzI3MjI3RCIsCi0iISAgYyAjMjgyMzdEIiwKLSJ+ICBjICMyQjI2ODEiLAotIl4gIGMgIzMzMkM4OSIsCi0iLyAgYyAjM0IzNjhFIiwKLSIoICBjICM0NTQwOTciLAotIikgIGMgIzRENDZBNCIsCi0iXyAgYyAjNEM0NUExIiwKLSJgICBjICM0RDQ2QTIiLAotIicgIGMgIzRCNDVBMCIsCi0iXSAgYyAjNEQ0NkExIiwKLSJbICBjICM0QzQ1OUYiLAotInsgIGMgIzRCNDU5RSIsCi0ifSAgYyAjNEE0NDlDIiwKLSJ8ICBjICM0OTQ0OTgiLAotIiAuIGMgIzQ4NDM5NiIsCi0iLi4gYyAjNEE0NTk5IiwKLSJYLiBjICM0RjRBQTAiLAotIm8uIGMgIzY4NjNBQSIsCi0iTy4gYyAjMjExRDc2IiwKLSIrLiBjICMyNDIwNzUiLAotIkAuIGMgIzJEMkE3RiIsCi0iIy4gYyAjMkQyQTdCIiwKLSIkLiBjICMzRDM5OEYiLAotIiUuIGMgIzQ4NDQ5NiIsCi0iJi4gYyAjNDc0MzkzIiwKLSIqLiBjICM0NjQzOTEiLAotIj0uIGMgIzQ1NDI4RSIsCi0iLS4gYyAjNEQ0QTlDIiwKLSI7LiBjICM1NzU0QTMiLAotIjouIGMgIzVBNTg5NyIsCi0iPi4gYyAjNUY1RDk5IiwKLSIsLiBjICM4NTgyQzEiLAotIjwuIGMgIzk1OTJDOSIsCi0iMS4gYyAjQjhCNkRDIiwKLSIyLiBjICMwNzA1NTMiLAotIjMuIGMgIzA4MDc1NSIsCi0iNC4gYyAjMEEwOTU3IiwKLSI1LiBjICMwQzBCNTgiLAotIjYuIGMgIzBGMEQ1QyIsCi0iNy4gYyAjMTAwRjVDIiwKLSI4LiBjICMxMzExNjQiLAotIjkuIGMgIzE0MTM2MCIsCi0iMC4gYyAjMTQxMzVGIiwKLSJxLiBjICMxNzE1NjciLAotIncuIGMgIzE2MTU2MiIsCi0iZS4gYyAjMTYxNTYxIiwKLSJyLiBjICMxODE3NjQiLAotInQuIGMgIzFBMTk2NiIsCi0ieS4gYyAjMUMxQTY0IiwKLSJ1LiBjICMxRDFDNjgiLAotImkuIGMgIzFGMUU2QSIsCi0icC4gYyAjMjIyMTZDIiwKLSJhLiBjICMyNDIzNkYiLAotInMuIGMgIzI3MjU3MSIsCi0iZC4gYyAjMjcyNjcyIiwKLSJmLiBjICMyNzI2NzEiLAotImcuIGMgIzI5Mjg3NCIsCi0iaC4gYyAjMkEyOTc0IiwKLSJqLiBjICMyQzJCNzciLAotImsuIGMgIzJGMkU3QyIsCi0ibC4gYyAjMkUyRDc5IiwKLSJ6LiBjICMzNDMzN0UiLAotInguIGMgIzM5Mzc4NiIsCi0iYy4gYyAjMzczNjgxIiwKLSJ2LiBjICMzQTM5ODQiLAotImIuIGMgIzNBMzk4MyIsCi0ibi4gYyAjM0QzQjg2IiwKLSJtLiBjICM0MjQxOEMiLAotIk0uIGMgIzQyNDE4QiIsCi0iTi4gYyAjNDQ0MjhCIiwKLSJCLiBjICM0MzQxODkiLAotIlYuIGMgIzQ1NDQ4RSIsCi0iQy4gYyAjNDU0NDhEIiwKLSJaLiBjICM0MjQxODciLAotIkEuIGMgIzQzNDI4OCIsCi0iUy4gYyAjNDQ0Mjg3IiwKLSJELiBjICM0MjQxODUiLAotIkYuIGMgIzQxNDA4MyIsCi0iRy4gYyAjNDg0NzkwIiwKLSJILiBjICM0MzQyODYiLAotIkouIGMgIzRBNDk5MyIsCi0iSy4gYyAjNDY0NThBIiwKLSJMLiBjICM0RDRDOTUiLAotIlAuIGMgIzU0NTJBMCIsCi0iSS4gYyAjNTA0Rjk4IiwKLSJVLiBjICM1ODU3QTAiLAotIlkuIGMgIzUyNTA5MyIsCi0iVC4gYyAjNUI1OUEyIiwKLSJSLiBjICM1ODU3OUYiLAotIkUuIGMgIzYyNjFBOSIsCi0iVy4gYyAjNjQ2M0FDIiwKLSJRLiBjICM2QjZBQjIiLAotIiEuIGMgIzZCNkFCMSIsCi0ifi4gYyAjNzU3NEI4IiwKLSJeLiBjICM3RjdEQkQiLAotIi8uIGMgIzlDOUJDRiIsCi0iKC4gYyAjMEIwQjU4IiwKLSIpLiBjICMwRDBENUEiLAotIl8uIGMgIzExMTE1RSIsCi0iYC4gYyAjMTMxMzYwIiwKLSInLiBjICMyMTIxNkQiLAotIl0uIGMgIzI0MjQ2RiIsCi0iWy4gYyAjMkIyQzc3IiwKLSJ7LiBjICMyQjJCNzciLAotIn0uIGMgIzJDMkM3NyIsCi0ifC4gYyAjMkUyRTc5IiwKLSIgWCBjICMzMTMxN0MiLAotIi5YIGMgIzMxMzE3QiIsCi0iWFggYyAjMzQzNDdFIiwKLSJvWCBjICMzQzNDODYiLAotIk9YIGMgIzNGM0Y4OSIsCi0iK1ggYyAjNDE0MjhCIiwKLSJAWCBjICM0MjQyOEIiLAotIiNYIGMgIzQ3NDc5MCIsCi0iJFggYyAjNDE0MTg0IiwKLSIlWCBjICM0MDQwODEiLAotIiZYIGMgIzRBNEE5NCIsCi0iKlggYyAjNEE0QTkzIiwKLSI9WCBjICM0RDREOTYiLAotIi1YIGMgIzRGNEY5OCIsCi0iO1ggYyAjNTA1MDk4IiwKLSI6WCBjICM1MjUyOUIiLAotIj5YIGMgIzU1NTU5RSIsCi0iLFggYyAjNTU1NTlEIiwKLSI8WCBjICM1NzU4QTAiLAotIjFYIGMgIzU4NThBMCIsCi0iMlggYyAjNTc1ODlGIiwKLSIzWCBjICM1NzU3OUYiLAotIjRYIGMgIzVBNUFBMiIsCi0iNVggYyAjNUQ1REE1IiwKLSI2WCBjICM1RjVGQTciLAotIjdYIGMgIzYxNjJBQSIsCi0iOFggYyAjNjE2MUE5IiwKLSI5WCBjICM2MTYyQTkiLAotIjBYIGMgIzYyNjJBQSIsCi0icVggYyAjNjQ2NEFDIiwKLSJ3WCBjICM2MjYyQTkiLAotImVYIGMgIzY0NjRBQiIsCi0iclggYyAjNjY2NkFFIiwKLSJ0WCBjICM2NjY2QUQiLAotInlYIGMgIzY4NjhCMCIsCi0idVggYyAjNjk2OUFGIiwKLSJpWCBjICM2RDZEQjQiLAotInBYIGMgIzZGNkZCNSIsCi0iYVggYyAjNzM3M0JBIiwKLSJzWCBjICM3MTcxQjciLAotImRYIGMgIzc2NzZCQyIsCi0iZlggYyAjNzk3OUJGIiwKLSJnWCBjICM3Nzc3QjkiLAotImhYIGMgIzgwODBDMSIsCi0ialggYyAjOEM4Q0M1IiwKLSJrWCBjICM5MDkwQzkiLAotImxYIGMgIzk4OThDQiIsCi0ielggYyAjQTBBMENGIiwKLSJ4WCBjICNBNUE1RDMiLAotImNYIGMgI0FCQUJENiIsCi0idlggYyAjQzRDNEUzIiwKLSJiWCBjICNEMUQxRTkiLAotIm5YIGMgI0U1RTVGMyIsCi0ibVggYyAjOUZBMEQxIiwKLSJNWCBjICNCNkM1RTUiLAotIk5YIGMgIzhFQTZENiIsCi0iQlggYyAjOTBBN0Q3IiwKLSJWWCBjICM5MUE5RDciLAotIkNYIGMgIzk1QUJEOCIsCi0iWlggYyAjOTlBRkRBIiwKLSJBWCBjICM5REIyREMiLAotIlNYIGMgI0ExQjVERCIsCi0iRFggYyAjQTVCOERFIiwKLSJGWCBjICNBOUJCRTAiLAotIkdYIGMgI0FDQkRFMSIsCi0iSFggYyAjQjBDMUUzIiwKLSJKWCBjICNCNEM0RTQiLAotIktYIGMgI0I4QzdFNSIsCi0iTFggYyAjQkJDOUU2IiwKLSJQWCBjICNBRUMwRTIiLAotIklYIGMgI0IyQzNFMyIsCi0iVVggYyBncmF5MTAwIiwKLSJZWCBjIE5vbmUiLAotLyogcGl4ZWxzICovCi0iWVhYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFlYIiwKLSJYICVYJVglWEYuRi5GLkYuJFhELlouWi5aLkIuQi5CLk4uTi49Lj0uPS4qLiouKi4mLiYuIC4gLnwgLi4uLn0gfSB7IHsgXyBfIFAgUCBIIEcgRyBHIEsgUyBTIEMgbyAiLAotIlggJVglWCVYJVhGLkYuJFhELkQuWi5aLkIuQS5CLk4uTi5OLj0uPS49LiouKi4mLiYuJS4lLiUufCB8IC4ufSB7IHsgWyBfIF8gYCBVIEogTCBHIEsgRiBaIFMgQyBvICIsCi0iWCAlWCVYJVglWEYuRi5GLkQuRC5ILlouWi5BLkIuTi5OLk4uQy49Lj0uKi4qLiYuJi4gLiAuJS58IHwgLi59IH0geyBbIFsgXyBQIFAgSCBHIEcgSyBGIFMgUyBDIG8gIiwKLSJYICVYRi4lWEYuRi4kWEYuJFhaLlouWi5CLkEuSy5ZLjcgLCAtIC0gMSAxIF4uXi5+LmFYfi5xIDkgNlhZIHsgfSB7ICcgXyBdIFAgUCBIIEwgRyBLIEYgWiBTIEMgbyAiLAotIlggJVhGLkYuRi5GLkYuRC5ELlouWi5aLksuOi4xIDsgJSA7IDwuaFhmWGZYZFhhWGFYc1hwWGlYIS55WHJYby47LlguWyBfIF8gYCBIIEggRyBLIEsgRiBTIFMgQyBvICIsCi0iWCBGLkYuRi5GLkYuRC5ELkQuWi5ILlkuMSAmICYgMS5jWG1YLy5rWGZYZFhhWGFYc1hwWGlYUS55WHRYZVhFLjZYNVhQLlguXyBgIEogTCBHIEcgSyBGIFogUyBDIG8gIiwKLSJYIEQuJFhGLiRYRC5ELlouWi5TLj4uJSArIDogdlgxLjEuY1htWC8uZFhhWGFYc1hwWGlYUS51WHJYcVg4WDZYNVhULlIuUC5YLlAgKSBIIEcgSyBLIFMgUyBTIG0gbyAiLAotIlggRC4kWEQuRC5ELkQuRC5TLjYgJiAkIGggYlh2WHZYMS54WC8ua1hmWGFYc1hwWGlYUS55WHJYVy5FLjZYNVg0WFUuLFg6WEkuLS5gIEwgRyBHIEsgRiBaIEMgQyBvICIsCi0iWCBELkQuRC5ELkQuWi5ILjYgJiAkIGggaCBoIGJYdlgxLmNYbVhrWCwuZFhwWGlYUS55WHRYcVh3WDZYNVhULlUuLFg6WEkuPVgqWC4uYCBHIEsgSyBaIFMgUyBtIG8gIiwKLSJYIFouRC5aLkguWi5aLjcgJiAkIGggaCBuWGggYlh2WDEuY1htWGtYLC5nWGlYUS51WHJYVy5FLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi4gLlAgRyBGIFMgUyBDIG0gbyAiLAotIlggWi5aLlouSC5aLlIgJSArIDogYlhoIGggaCBiWHZYMS5jWC8ua1hoWH4uUS55WHJYcVg5WDZYNVg0WDJYLFg6WDtYPVgqWCNYVi5NLk9YKCBLIFogUyBTIEMgbSBvICIsCi0iWCBaLlouWi5BLkEuKiAmICYgdlh2WGJYYlhiWHZYdlgxLnhYbFhqWF4ucFh1WHJYZVh3WDZYNVg0WFUuLFg6WC1YTC4qWEcuVi5AWE9Yb1hiLiggWiBTIEMgQyBWIG8gIiwKLSJYIEIuQi5CLkEuMiAlICUgMS4xLnZYdlh2WHZYdlgxLmNYelg8LiwuZ1hpWHJYVy5FLjZYNVg0WFUuLFg6WEkuPVgqWCNYVi5AWE9Ybi5iLmMueC5OIFMgUyBDIG0gbyAiLAotIlggQi5CLkIuUy4qICUgOyB4WDEuMS4xLjEuMS5jWGNYelhsWGpYXi5wWHJYZVg3WDZYNVg0WFIuLFg6WC1YTC5KLiNYVi5AWE9Ybi5iLmMuWFggWCQuUyBDIEMgbSBvICIsCi0iWCBOLk4uTi4yIE8gPSAvLm1YeFhjWGNYY1hjWHhYelhsWGpYaFh+LnVYZVhFLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi5NLk9Ybi52LmMuei4gWHwuay5OIEQgViBmIG8gIiwKLSJYIE4uTi5OLi0gQCA+IGtYPC4vLi8ubVh6WHpYbFg8LmpYaFhnWHVYZVhFLjZYNVg0WDFYLFg6WEkuTC4qWCNYVi5tLk9Ybi5iLmMuei4gWGwuai5nLi8gQyBtIFYgbyAiLAotIlggTi5OLlIgQCAjICwuLC5qWGtYa1g8LmtYa1hqWCwuXi5+LnVYd1hFLjZYNVg0WDFYLFg6WEkuPVhKLiNYQy5NLk9Ybi52LmMuei4uWHwuai5nLmQuIy5NIG0gQiBvICIsCi0iWCA9Lk0uPCBAICogZlhmWGhYaFgsLiwuLC5oWF4uZ1hwWHVYcVg5WDZYNVg0WFUuLFg6WEkuTC4qWEcuVi4rWE9Ybi5iLmMuei4uWHwuWy5nLmQuYS5wLnogViBCIG8gIiwKLSJYID0uTi4tIEAgTlhOWEJYQlhCWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYRlhHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhCIGQgbyAiLAotIlggPS49LiogQCAxIGRYZFhhWGFYc1hwWGlYIS55WHJYZVh3WDZYNVg0WDxYLFg6WEkuPVgqWEcuVi5NLk9Ybi52LmMuWFguWHwuai5nLmQuYS5wLmkudS5ALmYgZCBvICIsCi0iWCAqLj0uIyBAIF4uZFhhWGFYc1hwWGlYUS55WHJYZVh3WDZYNVhULlUuLFg6WC1YTC4mWEcuQy5tLk9Yb1h2LmMuei4uWHwuai5nLmYuYS5wLmkudS50LisuZCBkIG8gIiwKLSJYICouKi5AIEAgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSlhKWEpYTVhLWEtYS1hMWExYTFhkIG4gbyAiLAotIlggJi4qLkAgQCBkWGFYc1hwWGlYUS55WHRYZVhFLjZYNVg0WFUuPlg6WEkuTC4qWEcuVi5tLk9Yb1h2LmMuei4gWHwuai5nLmQuYS4nLmkudS50LnIudy45LmQgbiBvICIsCi0iWCAmLiYuQCBAIH4uc1hwWGlYUS55WHRYVy5FLjZYNVg0WDFYLFg6WEkuPVgqWCNYQy5tLk9Ybi5iLmMuei4gWHwuWy5nLmYuYS5wLmkudS50LnIudy45LjAubiBhIG8gIiwKLSJYICYuJi5AIEAgTlhOWEJYQlhWWFZYVlhDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWElYSVhKWE1YTVhLWEtYS1hMWExYTFhuIG4gbyAiLAotIlggJS4gLiMgQCBxIGlYUS55WHJYVy4wWDZYNVg0WFUuPlg6WEkuTC4qWCNYVi5AWE9Ybi5iLmMuWFguWHwuey5nLmYuXS4nLmkudS50LnIudy4wLl8uNy5XIG4gYSBvICIsCi0iWCAlLiAuKiAjICwgUS55WHRYZVg3WDZYNVg0WFUuLFg6WC1YTC4qWCNYVi5AWE9Ybi5iLmMuWFggWGwuey5nLmQuYS5wLmkudS50LnIuZS4wLl8uNy4pLisuYSBhIG8gIiwKLSJYIHwgfCAtICMgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhBWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhhIGEgbyAiLAotIlggfCB8IDwgIyAtIHJYZVg5WDZYNVg0WFUuLFg6WC1YTC4qWCNYQy5AWE9Yb1hiLmMuei4gWHwuai5oLnMuYS4nLmkudS50LnIudy45Ll8uNy4pLjUuNC5qIGEgcCBvICIsCi0iWCB8IH0gWSAjICogOSA4WDZYNVg0WDNYLFg6WEkuPVgqWEcuVi5AWE9Ybi52LmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC5xLmkgZyBwIG8gIiwKLSJYIH0gfSB8IC0gIyAsIDZYNVg0WFIuLFg6WEkuPVgqWEcuVi5tLk9Yb1hiLmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLn4gYSBzIHMgbyAiLAotIlggfSB9IH0gNCAjIC0gRSA0WFUuPlg6WC1YPVhKLiNYVi5NLk9Yb1hiLmMuWFggWHwuey5oLmQuYS4nLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLjYueiBwIHMgcyBvICIsCi0iWCB7IHsgfSB9IC0gIyA8IFUuLFg6WEkuPVgqWEcuVi4rWE9Yb1hiLmMuei4gWHwufS5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuISBnIHAgcyBzIG8gIiwKLSJYIFsgeyAnIFsgNCAqIC0gRSA6WDtYTC5KLiNYVi5tLk9Yb1hiLmMuei4uWHwuai5oLmYuYS4nLmkudS50LnIudy45Ll8uNi4pLiguNC4zLjIuOC5rIHAgcyBzIHMgbyAiLAotIlggWyBbICcgXyBbICwgKiAsIDtYTC5KLiNYVi5AWE9Yb1h2LmMuei4uWHwuey5nLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5eIHMgcCBzIHMgcyBvICIsCi0iWCBfIF8gXyBfIFAgXSAtICogMiAqWCNYVi5tLk9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5RIHAgcyBzIHMgYiB1IG8gIiwKLSJYIGAgYCBgIGAgYCBgIDggLSAtIDcgVi5AWE9Yb1h2LmMuWFguWHwuai5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcCBzIHMgcyB1IHUgbyAiLAotIlggUCBQICkgUCBVIFUgKSA4IC0gLSA3IE9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcyBzIHMgcyBiIHUgdSBvICIsCi0iWCBMIEwgKSBIICkgTCBMIEwgOCAxIC0gNyBiLmMuei4gWHwuai5oLmYuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5RIHggcCBzIHMgcyBiIGIgdSBlIG8gIiwKLSJYIEwgRyBMIEcgRyBHIEcgRyBHIEcgLCAqIDIgVCAuWGwuai5oLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC4zLjIuOC5eIHAgcCBzIHMgcyBzIHUgdSBlIGUgbyAiLAotIlggRyBHIEcgRyBHIEcgRyBLIEsgTSBNIDQgLCAsIDMgSSBnLmQuYS5wLmkudS50LnIuZS5gLl8uNy4pLjUuNC4zLjcuISBrIHAgcyBwIHMgcyBzIHUgdSB1IGUgdiBvICIsCi0iWCBLIEcgSyBLIEsgSyBLIEsgWiBaIE0gRiBGIDQgLCA8IDMgSSBwLmkudS50LnIudy45Ll8uNy4pLjUuNC5XIH4geiBhIHAgcCBzIHMgYiBzIHUgdSB1IGUgZSBlIG8gIiwKLSJYIEYgWiBGIEYgRiBGIFogWiBGIEYgUyBTIFMgUyBTIHcgOSA8IDIgNSAwIGwgcC5lLjkueS5hLmwgXiBqIGkgYSBwIHAgcCBzIHMgYiBiIGIgdSBlIHYgeSByIGUgbyAiLAotIlggUyBaIFogUyBaIFMgWiBTIFMgUyBTIFMgQyBDIEMgQSBtIGQgViBmIG0gQiBtIEIgZCBkIG4gZCBhIGEgYSBwIHMgcCBzIHMgYiB1IHUgdSB1IGUgdiBlIHIgdCBvICIsCi0iWCBTIFMgUyBTIFMgUyBTIFMgUyBTIEMgQyBDIG0gbSBBIFYgViBCIEIgQiBkIGQgZCBuIG4gYSBhIGEgcCBwIHMgcCBzIHMgYiB1IHUgdSBlIGUgZSBjIHQgciB0IG8gIiwKLSJYIEMgQyBDIEMgQyBDIEMgQyBtIEMgQSBtIEEgbSBmIFYgZiBmIEIgZCBkIGQgbiBuIG4gYSBhIGEgYSBzIHMgcyBzIHMgdSBiIHUgdSB1IHUgdiB0IHQgciB0IHQgbyAiLAotIllYbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBZWCIKLX07CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3g4Nl82NC9saWJjYWlyby1zd3Quc28gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL2xpbnV4L3g4Nl82NC9saWJjYWlyby1zd3Quc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzQ0MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9saW51eC94ODZfNjQvbGliY2Fpcm8tc3d0LnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9zb2xhcmlzL3NwYXJjL0VjbGlwc2UubC5wbSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9ndGsvc29sYXJpcy9zcGFyYy9FY2xpcHNlLmwucG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NWQ3YzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9zb2xhcmlzL3NwYXJjL0VjbGlwc2UubC5wbQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKiBYUE0gKi8KLXN0YXRpYyBjaGFyICpQcm9kdWN0SWNvbjQ4W10gPSB7Ci0vKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqLwotIjQ4IDQ4IDI1NyAyIiwKLSIgICBjIGJsYWNrIiwKLSIuICBjIGdyYXkxMDAiLAotIlggIGMgIzY5Njk1QTVBRThFOCIsCi0ibyAgYyAjNDk0OTQ5NDk5MTkxIiwKLSJPICBjICNDRUNFOTI5MkJGQkYiLAotIisgIGMgI0U3RTdDQUNBRTBFMCIsCi0iQCAgYyAjQzhDODhDOENCQkJCIiwKLSIjICBjICNDMkMyOEE4QUJBQkEiLAotIiQgIGMgI0VBRUFEN0Q3RThFOCIsCi0iJSAgYyAjQ0ZDRkE5QTlDQ0NDIiwKLSImICBjICNEOUQ5QkNCQ0Q4RDgiLAotIiogIGMgI0I2QjY4Nzg3QjlCOSIsCi0iPSAgYyAjQzNDMzk5OTlDN0M3IiwKLSItICBjICNBN0E3N0Q3REI1QjUiLAotIjsgIGMgI0JEQkRBM0EzQ0RDRCIsCi0iOiAgYyAjRDhEOENBQ0FFM0UzIiwKLSI+ICBjICNBOEE4OEQ4REM0QzQiLAotIiwgIGMgIzkyOTI3NTc1QjJCMiIsCi0iPCAgYyAjODc4NzZDNkNBQUFBIiwKLSIxICBjICM5QTlBODM4M0JBQkEiLAotIjIgIGMgIzdCN0I2MzYzQTNBMyIsCi0iMyAgYyAjNjY2NjU0NTQ5NTk1IiwKLSI0ICBjICM3MzczNUY1RkFEQUQiLAotIjUgIGMgIzYyNjI1MTUxOTI5MiIsCi0iNiAgYyAjN0Y3RjcyNzJBN0E3IiwKLSI3ICBjICM2RDZENUU1RTlFOUUiLAotIjggIGMgIzY0NjQ1NDU0QTlBOSIsCi0iOSAgYyAjNzc3NzY5NjlCMUIxIiwKLSIwICBjICM0OTQ5M0UzRTgyODIiLAotInEgIGMgIzdEN0Q3MzczQjZCNiIsCi0idyAgYyAjNUI1QjRFNEVBREFEIiwKLSJlICBjICM1NTU1NDk0OUJBQkEiLAotInIgIGMgIzU2NTY0OTQ5QkFCQSIsCi0idCAgYyAjNTY1NjRBNEFCQUJBIiwKLSJ5ICBjICM1NjU2NDk0OUI5QjkiLAotInUgIGMgIzU1NTU0OTQ5QjhCOCIsCi0iaSAgYyAjNEY0RjQ0NDRBQ0FDIiwKLSJwICBjICM1MzUzNDg0OEI0QjQiLAotImEgIGMgIzUzNTM0ODQ4QjNCMyIsCi0icyAgYyAjNTQ1NDQ5NDlCNUI1IiwKLSJkICBjICM1MjUyNDc0N0IwQjAiLAotImYgIGMgIzUyNTI0NzQ3QUZBRiIsCi0iZyAgYyAjNTQ1NDQ5NDlCM0IzIiwKLSJoICBjICNERURFRENEQ0VFRUUiLAotImogIGMgIzNFM0UzNjM2OTg5OCIsCi0iayAgYyAjNDM0MzNCM0I5RjlGIiwKLSJsICBjICMzMzMzMkMyQzc3NzciLAotInogIGMgIzQyNDIzQTNBOUM5QyIsCi0ieCAgYyAjNEE0QTQwNDBBOEE4IiwKLSJjICBjICM1NTU1NEE0QUJBQkEiLAotInYgIGMgIzU1NTU0QTRBQjlCOSIsCi0iYiAgYyAjNTQ1NDQ5NDlCN0I3IiwKLSJuICBjICM1MjUyNDg0OEIxQjEiLAotIm0gIGMgIzUxNTE0NzQ3QUVBRSIsCi0iTSAgYyAjNEU0RTQ1NDVBOUE5IiwKLSJOICBjICM0OTQ5NDE0MUEwQTAiLAotIkIgIGMgIzUyNTI0ODQ4QUZBRiIsCi0iViAgYyAjNTE1MTQ4NDhBRUFFIiwKLSJDICBjICM1MDUwNDc0N0FDQUMiLAotIlogIGMgIzRGNEY0NjQ2QUFBQSIsCi0iQSAgYyAjNTE1MTQ4NDhBREFEIiwKLSJTICBjICM1MDUwNDc0N0FCQUIiLAotIkQgIGMgIzUwNTA0ODQ4QUNBQyIsCi0iRiAgYyAjNTA1MDQ3NDdBOUE5IiwKLSJHICBjICM0RTRFNDY0NkE3QTciLAotIkggIGMgIzRFNEU0NTQ1QTRBNCIsCi0iSiAgYyAjNEQ0RDQ1NDVBNEE0IiwKLSJLICBjICM0RjRGNDc0N0E4QTgiLAotIkwgIGMgIzRFNEU0NjQ2QTVBNSIsCi0iUCAgYyAjNEQ0RDQ1NDVBM0EzIiwKLSJJICBjICMzQjNCMzUzNTdEN0QiLAotIlUgIGMgIzRFNEU0NjQ2QTNBMyIsCi0iWSAgYyAjNTU1NTRENEQ5RjlGIiwKLSJUICBjICM0QTRBNDM0Mzg5ODkiLAotIlIgIGMgIzUxNTE0QjRCOTA5MCIsCi0iRSAgYyAjNjc2NzYwNjBBNUE1IiwKLSJXICBjICMxRDFEMTgxODZBNkEiLAotIlEgIGMgIzI3MjcyMjIyN0Q3RCIsCi0iISAgYyAjMjgyODIzMjM3RDdEIiwKLSJ+ICBjICMyQjJCMjYyNjgxODEiLAotIl4gIGMgIzMzMzMyQzJDODk4OSIsCi0iLyAgYyAjM0IzQjM2MzY4RThFIiwKLSIoICBjICM0NTQ1NDA0MDk3OTciLAotIikgIGMgIzRENEQ0NjQ2QTRBNCIsCi0iXyAgYyAjNEM0QzQ1NDVBMUExIiwKLSJgICBjICM0RDRENDY0NkEyQTIiLAotIicgIGMgIzRCNEI0NTQ1QTBBMCIsCi0iXSAgYyAjNEQ0RDQ2NDZBMUExIiwKLSJbICBjICM0QzRDNDU0NTlGOUYiLAotInsgIGMgIzRCNEI0NTQ1OUU5RSIsCi0ifSAgYyAjNEE0QTQ0NDQ5QzlDIiwKLSJ8ICBjICM0OTQ5NDQ0NDk4OTgiLAotIiAuIGMgIzQ4NDg0MzQzOTY5NiIsCi0iLi4gYyAjNEE0QTQ1NDU5OTk5IiwKLSJYLiBjICM0RjRGNEE0QUEwQTAiLAotIm8uIGMgIzY4Njg2MzYzQUFBQSIsCi0iTy4gYyAjMjEyMTFEMUQ3Njc2IiwKLSIrLiBjICMyNDI0MjAyMDc1NzUiLAotIkAuIGMgIzJEMkQyQTJBN0Y3RiIsCi0iIy4gYyAjMkQyRDJBMkE3QjdCIiwKLSIkLiBjICMzRDNEMzkzOThGOEYiLAotIiUuIGMgIzQ4NDg0NDQ0OTY5NiIsCi0iJi4gYyAjNDc0NzQzNDM5MzkzIiwKLSIqLiBjICM0NjQ2NDM0MzkxOTEiLAotIj0uIGMgIzQ1NDU0MjQyOEU4RSIsCi0iLS4gYyAjNEQ0RDRBNEE5QzlDIiwKLSI7LiBjICM1NzU3NTQ1NEEzQTMiLAotIjouIGMgIzVBNUE1ODU4OTc5NyIsCi0iPi4gYyAjNUY1RjVENUQ5OTk5IiwKLSIsLiBjICM4NTg1ODI4MkMxQzEiLAotIjwuIGMgIzk1OTU5MjkyQzlDOSIsCi0iMS4gYyAjQjhCOEI2QjZEQ0RDIiwKLSIyLiBjICMwNzA3MDUwNTUzNTMiLAotIjMuIGMgIzA4MDgwNzA3NTU1NSIsCi0iNC4gYyAjMEEwQTA5MDk1NzU3IiwKLSI1LiBjICMwQzBDMEIwQjU4NTgiLAotIjYuIGMgIzBGMEYwRDBENUM1QyIsCi0iNy4gYyAjMTAxMDBGMEY1QzVDIiwKLSI4LiBjICMxMzEzMTExMTY0NjQiLAotIjkuIGMgIzE0MTQxMzEzNjA2MCIsCi0iMC4gYyAjMTQxNDEzMTM1RjVGIiwKLSJxLiBjICMxNzE3MTUxNTY3NjciLAotIncuIGMgIzE2MTYxNTE1NjI2MiIsCi0iZS4gYyAjMTYxNjE1MTU2MTYxIiwKLSJyLiBjICMxODE4MTcxNzY0NjQiLAotInQuIGMgIzFBMUExOTE5NjY2NiIsCi0ieS4gYyAjMUMxQzFBMUE2NDY0IiwKLSJ1LiBjICMxRDFEMUMxQzY4NjgiLAotImkuIGMgIzFGMUYxRTFFNkE2QSIsCi0icC4gYyAjMjIyMjIxMjE2QzZDIiwKLSJhLiBjICMyNDI0MjMyMzZGNkYiLAotInMuIGMgIzI3MjcyNTI1NzE3MSIsCi0iZC4gYyAjMjcyNzI2MjY3MjcyIiwKLSJmLiBjICMyNzI3MjYyNjcxNzEiLAotImcuIGMgIzI5MjkyODI4NzQ3NCIsCi0iaC4gYyAjMkEyQTI5Mjk3NDc0IiwKLSJqLiBjICMyQzJDMkIyQjc3NzciLAotImsuIGMgIzJGMkYyRTJFN0M3QyIsCi0ibC4gYyAjMkUyRTJEMkQ3OTc5IiwKLSJ6LiBjICMzNDM0MzMzMzdFN0UiLAotInguIGMgIzM5MzkzNzM3ODY4NiIsCi0iYy4gYyAjMzczNzM2MzY4MTgxIiwKLSJ2LiBjICMzQTNBMzkzOTg0ODQiLAotImIuIGMgIzNBM0EzOTM5ODM4MyIsCi0ibi4gYyAjM0QzRDNCM0I4Njg2IiwKLSJtLiBjICM0MjQyNDE0MThDOEMiLAotIk0uIGMgIzQyNDI0MTQxOEI4QiIsCi0iTi4gYyAjNDQ0NDQyNDI4QjhCIiwKLSJCLiBjICM0MzQzNDE0MTg5ODkiLAotIlYuIGMgIzQ1NDU0NDQ0OEU4RSIsCi0iQy4gYyAjNDU0NTQ0NDQ4RDhEIiwKLSJaLiBjICM0MjQyNDE0MTg3ODciLAotIkEuIGMgIzQzNDM0MjQyODg4OCIsCi0iUy4gYyAjNDQ0NDQyNDI4Nzg3IiwKLSJELiBjICM0MjQyNDE0MTg1ODUiLAotIkYuIGMgIzQxNDE0MDQwODM4MyIsCi0iRy4gYyAjNDg0ODQ3NDc5MDkwIiwKLSJILiBjICM0MzQzNDI0Mjg2ODYiLAotIkouIGMgIzRBNEE0OTQ5OTM5MyIsCi0iSy4gYyAjNDY0NjQ1NDU4QThBIiwKLSJMLiBjICM0RDRENEM0Qzk1OTUiLAotIlAuIGMgIzU0NTQ1MjUyQTBBMCIsCi0iSS4gYyAjNTA1MDRGNEY5ODk4IiwKLSJVLiBjICM1ODU4NTc1N0EwQTAiLAotIlkuIGMgIzUyNTI1MDUwOTM5MyIsCi0iVC4gYyAjNUI1QjU5NTlBMkEyIiwKLSJSLiBjICM1ODU4NTc1NzlGOUYiLAotIkUuIGMgIzYyNjI2MTYxQTlBOSIsCi0iVy4gYyAjNjQ2NDYzNjNBQ0FDIiwKLSJRLiBjICM2QjZCNkE2QUIyQjIiLAotIiEuIGMgIzZCNkI2QTZBQjFCMSIsCi0ifi4gYyAjNzU3NTc0NzRCOEI4IiwKLSJeLiBjICM3RjdGN0Q3REJEQkQiLAotIi8uIGMgIzlDOUM5QjlCQ0ZDRiIsCi0iKC4gYyAjMEIwQjBCMEI1ODU4IiwKLSIpLiBjICMwRDBEMEQwRDVBNUEiLAotIl8uIGMgIzExMTExMTExNUU1RSIsCi0iYC4gYyAjMTMxMzEzMTM2MDYwIiwKLSInLiBjICMyMTIxMjEyMTZENkQiLAotIl0uIGMgIzI0MjQyNDI0NkY2RiIsCi0iWy4gYyAjMkIyQjJDMkM3Nzc3IiwKLSJ7LiBjICMyQjJCMkIyQjc3NzciLAotIn0uIGMgIzJDMkMyQzJDNzc3NyIsCi0ifC4gYyAjMkUyRTJFMkU3OTc5IiwKLSIgWCBjICMzMTMxMzEzMTdDN0MiLAotIi5YIGMgIzMxMzEzMTMxN0I3QiIsCi0iWFggYyAjMzQzNDM0MzQ3RTdFIiwKLSJvWCBjICMzQzNDM0MzQzg2ODYiLAotIk9YIGMgIzNGM0YzRjNGODk4OSIsCi0iK1ggYyAjNDE0MTQyNDI4QjhCIiwKLSJAWCBjICM0MjQyNDI0MjhCOEIiLAotIiNYIGMgIzQ3NDc0NzQ3OTA5MCIsCi0iJFggYyAjNDE0MTQxNDE4NDg0IiwKLSIlWCBjICM0MDQwNDA0MDgxODEiLAotIiZYIGMgIzRBNEE0QTRBOTQ5NCIsCi0iKlggYyAjNEE0QTRBNEE5MzkzIiwKLSI9WCBjICM0RDRENEQ0RDk2OTYiLAotIi1YIGMgIzRGNEY0RjRGOTg5OCIsCi0iO1ggYyAjNTA1MDUwNTA5ODk4IiwKLSI6WCBjICM1MjUyNTI1MjlCOUIiLAotIj5YIGMgIzU1NTU1NTU1OUU5RSIsCi0iLFggYyAjNTU1NTU1NTU5RDlEIiwKLSI8WCBjICM1NzU3NTg1OEEwQTAiLAotIjFYIGMgIzU4NTg1ODU4QTBBMCIsCi0iMlggYyAjNTc1NzU4NTg5RjlGIiwKLSIzWCBjICM1NzU3NTc1NzlGOUYiLAotIjRYIGMgIzVBNUE1QTVBQTJBMiIsCi0iNVggYyAjNUQ1RDVENURBNUE1IiwKLSI2WCBjICM1RjVGNUY1RkE3QTciLAotIjdYIGMgIzYxNjE2MjYyQUFBQSIsCi0iOFggYyAjNjE2MTYxNjFBOUE5IiwKLSI5WCBjICM2MTYxNjI2MkE5QTkiLAotIjBYIGMgIzYyNjI2MjYyQUFBQSIsCi0icVggYyAjNjQ2NDY0NjRBQ0FDIiwKLSJ3WCBjICM2MjYyNjI2MkE5QTkiLAotImVYIGMgIzY0NjQ2NDY0QUJBQiIsCi0iclggYyAjNjY2NjY2NjZBRUFFIiwKLSJ0WCBjICM2NjY2NjY2NkFEQUQiLAotInlYIGMgIzY4Njg2ODY4QjBCMCIsCi0idVggYyAjNjk2OTY5NjlBRkFGIiwKLSJpWCBjICM2RDZENkQ2REI0QjQiLAotInBYIGMgIzZGNkY2RjZGQjVCNSIsCi0iYVggYyAjNzM3MzczNzNCQUJBIiwKLSJzWCBjICM3MTcxNzE3MUI3QjciLAotImRYIGMgIzc2NzY3Njc2QkNCQyIsCi0iZlggYyAjNzk3OTc5NzlCRkJGIiwKLSJnWCBjICM3Nzc3Nzc3N0I5QjkiLAotImhYIGMgIzgwODA4MDgwQzFDMSIsCi0ialggYyAjOEM4QzhDOENDNUM1IiwKLSJrWCBjICM5MDkwOTA5MEM5QzkiLAotImxYIGMgIzk4OTg5ODk4Q0JDQiIsCi0ielggYyAjQTBBMEEwQTBDRkNGIiwKLSJ4WCBjICNBNUE1QTVBNUQzRDMiLAotImNYIGMgI0FCQUJBQkFCRDZENiIsCi0idlggYyAjQzRDNEM0QzRFM0UzIiwKLSJiWCBjICNEMUQxRDFEMUU5RTkiLAotIm5YIGMgI0U1RTVFNUU1RjNGMyIsCi0ibVggYyAjOUY5RkEwQTBEMUQxIiwKLSJNWCBjICNCNkI2QzVDNUU1RTUiLAotIk5YIGMgIzhFOEVBNkE2RDZENiIsCi0iQlggYyAjOTA5MEE3QTdEN0Q3IiwKLSJWWCBjICM5MTkxQTlBOUQ3RDciLAotIkNYIGMgIzk1OTVBQkFCRDhEOCIsCi0iWlggYyAjOTk5OUFGQUZEQURBIiwKLSJBWCBjICM5RDlEQjJCMkRDREMiLAotIlNYIGMgI0ExQTFCNUI1RERERCIsCi0iRFggYyAjQTVBNUI4QjhERURFIiwKLSJGWCBjICNBOUE5QkJCQkUwRTAiLAotIkdYIGMgI0FDQUNCREJERTFFMSIsCi0iSFggYyAjQjBCMEMxQzFFM0UzIiwKLSJKWCBjICNCNEI0QzRDNEU0RTQiLAotIktYIGMgI0I4QjhDN0M3RTVFNSIsCi0iTFggYyAjQkJCQkM5QzlFNkU2IiwKLSJQWCBjICNBRUFFQzBDMEUyRTIiLAotIklYIGMgI0IyQjJDM0MzRTNFMyIsCi0iVVggYyBncmF5MTAwIiwKLSJZWCBjIE5vbmUiLAotLyogcGl4ZWxzICovCi0iWVhYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFlYIiwKLSJYICVYJVglWEYuRi5GLkYuJFhELlouWi5aLkIuQi5CLk4uTi49Lj0uPS4qLiouKi4mLiYuIC4gLnwgLi4uLn0gfSB7IHsgXyBfIFAgUCBIIEcgRyBHIEsgUyBTIEMgbyAiLAotIlggJVglWCVYJVhGLkYuJFhELkQuWi5aLkIuQS5CLk4uTi5OLj0uPS49LiouKi4mLiYuJS4lLiUufCB8IC4ufSB7IHsgWyBfIF8gYCBVIEogTCBHIEsgRiBaIFMgQyBvICIsCi0iWCAlWCVYJVglWEYuRi5GLkQuRC5ILlouWi5BLkIuTi5OLk4uQy49Lj0uKi4qLiYuJi4gLiAuJS58IHwgLi59IH0geyBbIFsgXyBQIFAgSCBHIEcgSyBGIFMgUyBDIG8gIiwKLSJYICVYRi4lWEYuRi4kWEYuJFhaLlouWi5CLkEuSy5ZLjcgLCAtIC0gMSAxIF4uXi5+LmFYfi5xIDkgNlhZIHsgfSB7ICcgXyBdIFAgUCBIIEwgRyBLIEYgWiBTIEMgbyAiLAotIlggJVhGLkYuRi5GLkYuRC5ELlouWi5aLksuOi4xIDsgJSA7IDwuaFhmWGZYZFhhWGFYc1hwWGlYIS55WHJYby47LlguWyBfIF8gYCBIIEggRyBLIEsgRiBTIFMgQyBvICIsCi0iWCBGLkYuRi5GLkYuRC5ELkQuWi5ILlkuMSAmICYgMS5jWG1YLy5rWGZYZFhhWGFYc1hwWGlYUS55WHRYZVhFLjZYNVhQLlguXyBgIEogTCBHIEcgSyBGIFogUyBDIG8gIiwKLSJYIEQuJFhGLiRYRC5ELlouWi5TLj4uJSArIDogdlgxLjEuY1htWC8uZFhhWGFYc1hwWGlYUS51WHJYcVg4WDZYNVhULlIuUC5YLlAgKSBIIEcgSyBLIFMgUyBTIG0gbyAiLAotIlggRC4kWEQuRC5ELkQuRC5TLjYgJiAkIGggYlh2WHZYMS54WC8ua1hmWGFYc1hwWGlYUS55WHJYVy5FLjZYNVg0WFUuLFg6WEkuLS5gIEwgRyBHIEsgRiBaIEMgQyBvICIsCi0iWCBELkQuRC5ELkQuWi5ILjYgJiAkIGggaCBoIGJYdlgxLmNYbVhrWCwuZFhwWGlYUS55WHRYcVh3WDZYNVhULlUuLFg6WEkuPVgqWC4uYCBHIEsgSyBaIFMgUyBtIG8gIiwKLSJYIFouRC5aLkguWi5aLjcgJiAkIGggaCBuWGggYlh2WDEuY1htWGtYLC5nWGlYUS51WHJYVy5FLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi4gLlAgRyBGIFMgUyBDIG0gbyAiLAotIlggWi5aLlouSC5aLlIgJSArIDogYlhoIGggaCBiWHZYMS5jWC8ua1hoWH4uUS55WHJYcVg5WDZYNVg0WDJYLFg6WDtYPVgqWCNYVi5NLk9YKCBLIFogUyBTIEMgbSBvICIsCi0iWCBaLlouWi5BLkEuKiAmICYgdlh2WGJYYlhiWHZYdlgxLnhYbFhqWF4ucFh1WHJYZVh3WDZYNVg0WFUuLFg6WC1YTC4qWEcuVi5AWE9Yb1hiLiggWiBTIEMgQyBWIG8gIiwKLSJYIEIuQi5CLkEuMiAlICUgMS4xLnZYdlh2WHZYdlgxLmNYelg8LiwuZ1hpWHJYVy5FLjZYNVg0WFUuLFg6WEkuPVgqWCNYVi5AWE9Ybi5iLmMueC5OIFMgUyBDIG0gbyAiLAotIlggQi5CLkIuUy4qICUgOyB4WDEuMS4xLjEuMS5jWGNYelhsWGpYXi5wWHJYZVg3WDZYNVg0WFIuLFg6WC1YTC5KLiNYVi5AWE9Ybi5iLmMuWFggWCQuUyBDIEMgbSBvICIsCi0iWCBOLk4uTi4yIE8gPSAvLm1YeFhjWGNYY1hjWHhYelhsWGpYaFh+LnVYZVhFLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi5NLk9Ybi52LmMuei4gWHwuay5OIEQgViBmIG8gIiwKLSJYIE4uTi5OLi0gQCA+IGtYPC4vLi8ubVh6WHpYbFg8LmpYaFhnWHVYZVhFLjZYNVg0WDFYLFg6WEkuTC4qWCNYVi5tLk9Ybi5iLmMuei4gWGwuai5nLi8gQyBtIFYgbyAiLAotIlggTi5OLlIgQCAjICwuLC5qWGtYa1g8LmtYa1hqWCwuXi5+LnVYd1hFLjZYNVg0WDFYLFg6WEkuPVhKLiNYQy5NLk9Ybi52LmMuei4uWHwuai5nLmQuIy5NIG0gQiBvICIsCi0iWCA9Lk0uPCBAICogZlhmWGhYaFgsLiwuLC5oWF4uZ1hwWHVYcVg5WDZYNVg0WFUuLFg6WEkuTC4qWEcuVi4rWE9Ybi5iLmMuei4uWHwuWy5nLmQuYS5wLnogViBCIG8gIiwKLSJYID0uTi4tIEAgTlhOWEJYQlhCWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYRlhHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhCIGQgbyAiLAotIlggPS49LiogQCAxIGRYZFhhWGFYc1hwWGlYIS55WHJYZVh3WDZYNVg0WDxYLFg6WEkuPVgqWEcuVi5NLk9Ybi52LmMuWFguWHwuai5nLmQuYS5wLmkudS5ALmYgZCBvICIsCi0iWCAqLj0uIyBAIF4uZFhhWGFYc1hwWGlYUS55WHJYZVh3WDZYNVhULlUuLFg6WC1YTC4mWEcuQy5tLk9Yb1h2LmMuei4uWHwuai5nLmYuYS5wLmkudS50LisuZCBkIG8gIiwKLSJYICouKi5AIEAgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSlhKWEpYTVhLWEtYS1hMWExYTFhkIG4gbyAiLAotIlggJi4qLkAgQCBkWGFYc1hwWGlYUS55WHRYZVhFLjZYNVg0WFUuPlg6WEkuTC4qWEcuVi5tLk9Yb1h2LmMuei4gWHwuai5nLmQuYS4nLmkudS50LnIudy45LmQgbiBvICIsCi0iWCAmLiYuQCBAIH4uc1hwWGlYUS55WHRYVy5FLjZYNVg0WDFYLFg6WEkuPVgqWCNYQy5tLk9Ybi5iLmMuei4gWHwuWy5nLmYuYS5wLmkudS50LnIudy45LjAubiBhIG8gIiwKLSJYICYuJi5AIEAgTlhOWEJYQlhWWFZYVlhDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWElYSVhKWE1YTVhLWEtYS1hMWExYTFhuIG4gbyAiLAotIlggJS4gLiMgQCBxIGlYUS55WHJYVy4wWDZYNVg0WFUuPlg6WEkuTC4qWCNYVi5AWE9Ybi5iLmMuWFguWHwuey5nLmYuXS4nLmkudS50LnIudy4wLl8uNy5XIG4gYSBvICIsCi0iWCAlLiAuKiAjICwgUS55WHRYZVg3WDZYNVg0WFUuLFg6WC1YTC4qWCNYVi5AWE9Ybi5iLmMuWFggWGwuey5nLmQuYS5wLmkudS50LnIuZS4wLl8uNy4pLisuYSBhIG8gIiwKLSJYIHwgfCAtICMgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhBWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhhIGEgbyAiLAotIlggfCB8IDwgIyAtIHJYZVg5WDZYNVg0WFUuLFg6WC1YTC4qWCNYQy5AWE9Yb1hiLmMuei4gWHwuai5oLnMuYS4nLmkudS50LnIudy45Ll8uNy4pLjUuNC5qIGEgcCBvICIsCi0iWCB8IH0gWSAjICogOSA4WDZYNVg0WDNYLFg6WEkuPVgqWEcuVi5AWE9Ybi52LmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC5xLmkgZyBwIG8gIiwKLSJYIH0gfSB8IC0gIyAsIDZYNVg0WFIuLFg6WEkuPVgqWEcuVi5tLk9Yb1hiLmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLn4gYSBzIHMgbyAiLAotIlggfSB9IH0gNCAjIC0gRSA0WFUuPlg6WC1YPVhKLiNYVi5NLk9Yb1hiLmMuWFggWHwuey5oLmQuYS4nLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLjYueiBwIHMgcyBvICIsCi0iWCB7IHsgfSB9IC0gIyA8IFUuLFg6WEkuPVgqWEcuVi4rWE9Yb1hiLmMuei4gWHwufS5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuISBnIHAgcyBzIG8gIiwKLSJYIFsgeyAnIFsgNCAqIC0gRSA6WDtYTC5KLiNYVi5tLk9Yb1hiLmMuei4uWHwuai5oLmYuYS4nLmkudS50LnIudy45Ll8uNi4pLiguNC4zLjIuOC5rIHAgcyBzIHMgbyAiLAotIlggWyBbICcgXyBbICwgKiAsIDtYTC5KLiNYVi5AWE9Yb1h2LmMuei4uWHwuey5nLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5eIHMgcCBzIHMgcyBvICIsCi0iWCBfIF8gXyBfIFAgXSAtICogMiAqWCNYVi5tLk9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5RIHAgcyBzIHMgYiB1IG8gIiwKLSJYIGAgYCBgIGAgYCBgIDggLSAtIDcgVi5AWE9Yb1h2LmMuWFguWHwuai5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcCBzIHMgcyB1IHUgbyAiLAotIlggUCBQICkgUCBVIFUgKSA4IC0gLSA3IE9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcyBzIHMgcyBiIHUgdSBvICIsCi0iWCBMIEwgKSBIICkgTCBMIEwgOCAxIC0gNyBiLmMuei4gWHwuai5oLmYuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5RIHggcCBzIHMgcyBiIGIgdSBlIG8gIiwKLSJYIEwgRyBMIEcgRyBHIEcgRyBHIEcgLCAqIDIgVCAuWGwuai5oLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC4zLjIuOC5eIHAgcCBzIHMgcyBzIHUgdSBlIGUgbyAiLAotIlggRyBHIEcgRyBHIEcgRyBLIEsgTSBNIDQgLCAsIDMgSSBnLmQuYS5wLmkudS50LnIuZS5gLl8uNy4pLjUuNC4zLjcuISBrIHAgcyBwIHMgcyBzIHUgdSB1IGUgdiBvICIsCi0iWCBLIEcgSyBLIEsgSyBLIEsgWiBaIE0gRiBGIDQgLCA8IDMgSSBwLmkudS50LnIudy45Ll8uNy4pLjUuNC5XIH4geiBhIHAgcCBzIHMgYiBzIHUgdSB1IGUgZSBlIG8gIiwKLSJYIEYgWiBGIEYgRiBGIFogWiBGIEYgUyBTIFMgUyBTIHcgOSA8IDIgNSAwIGwgcC5lLjkueS5hLmwgXiBqIGkgYSBwIHAgcCBzIHMgYiBiIGIgdSBlIHYgeSByIGUgbyAiLAotIlggUyBaIFogUyBaIFMgWiBTIFMgUyBTIFMgQyBDIEMgQSBtIGQgViBmIG0gQiBtIEIgZCBkIG4gZCBhIGEgYSBwIHMgcCBzIHMgYiB1IHUgdSB1IGUgdiBlIHIgdCBvICIsCi0iWCBTIFMgUyBTIFMgUyBTIFMgUyBTIEMgQyBDIG0gbSBBIFYgViBCIEIgQiBkIGQgZCBuIG4gYSBhIGEgcCBwIHMgcCBzIHMgYiB1IHUgdSBlIGUgZSBjIHQgciB0IG8gIiwKLSJYIEMgQyBDIEMgQyBDIEMgQyBtIEMgQSBtIEEgbSBmIFYgZiBmIEIgZCBkIGQgbiBuIG4gYSBhIGEgYSBzIHMgcyBzIHMgdSBiIHUgdSB1IHUgdiB0IHQgciB0IHQgbyAiLAotIllYbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBZWCIKLX07CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL3NvbGFyaXMvc3BhcmMvRWNsaXBzZS5tLnBtIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9zb2xhcmlzL3NwYXJjL0VjbGlwc2UubS5wbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0YWEwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL3NvbGFyaXMvc3BhcmMvRWNsaXBzZS5tLnBtCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qIFhQTSAqLwotc3RhdGljIGNoYXIgKlByb2R1Y3RJY29uMzJbXSA9IHsKLS8qIGNvbHVtbnMgcm93cyBjb2xvcnMgY2hhcnMtcGVyLXBpeGVsICovCi0iMzIgMzIgMjU3IDIiLAotIiAgIGMgYmxhY2siLAotIi4gIGMgZ3JheTEwMCIsCi0iWCAgYyAjNjk2OTVBNUFFOEU4IiwKLSJvICBjICM0OTQ5NDk0OTkxOTEiLAotIk8gIGMgI0U4RThDQkNCRTBFMCIsCi0iKyAgYyAjREREREIzQjNEMkQyIiwKLSJAICBjICNGMEYwREREREVCRUIiLAotIiMgIGMgI0NEQ0Q5MTkxQkVCRSIsCi0iJCAgYyAjQzhDODhCOEJCQkJCIiwKLSIlICBjICNDQUNBOTg5OEMyQzIiLAotIiYgIGMgI0MzQzM4QThBQkJCQiIsCi0iKiAgYyAjQkFCQTg3ODdCOUI5IiwKLSI9ICBjICNEQ0RDQzRDNERFREUiLAotIi0gIGMgI0M1QzVBM0EzQ0FDQSIsCi0iOyAgYyAjQURBRDgxODFCOEI4IiwKLSI6ICBjICNBM0EzN0E3QUI1QjUiLAotIj4gIGMgI0UyRTJENkQ2RTlFOSIsCi0iLCAgYyAjQjNCMzlBOUFDNEM0IiwKLSI8ICBjICNFQkVCRTNFM0YwRjAiLAotIjEgIGMgI0M5QzlCNkI2RDZENiIsCi0iMiAgYyAjOTY5Njc2NzZCOEI4IiwKLSIzICBjICM4QzhDNzE3MUFCQUIiLAotIjQgIGMgI0E0QTQ5MjkyQkVCRSIsCi0iNSAgYyAjN0Q3RDY1NjVBNkE2IiwKLSI2ICBjICM4MzgzNkQ2REFCQUIiLAotIjcgIGMgIzlBOUE4Nzg3QzJDMiIsCi0iOCAgYyAjN0I3QjY0NjRCN0I3IiwKLSI5ICBjICM1RTVFNTA1MDkxOTEiLAotIjAgIGMgIzY0NjQ1NzU3OUE5QSIsCi0icSAgYyAjODU4NTdCN0JCRUJFIiwKLSJ3ICBjICM3QzdDNzM3M0I2QjYiLAotImUgIGMgIzYyNjI1MzUzRDVENSIsCi0iciAgYyAjNjE2MTUzNTNENEQ0IiwKLSJ0ICBjICM2MDYwNTI1MkQxRDEiLAotInkgIGMgIzVGNUY1MjUyRDBEMCIsCi0idSAgYyAjNUY1RjUxNTFDRkNGIiwKLSJpICBjICM2MDYwNTM1M0QyRDIiLAotInAgIGMgIzVGNUY1MjUyQ0ZDRiIsCi0iYSAgYyAjNUU1RTUxNTFDRENEIiwKLSJzICBjICM1QzVDNEY0RkM3QzciLAotImQgIGMgIzVGNUY1MjUyQ0RDRCIsCi0iZiAgYyAjNUU1RTUxNTFDQkNCIiwKLSJnICBjICM1QjVCNEY0RkM0QzQiLAotImggIGMgIzVBNUE0RTRFQzFDMSIsCi0iaiAgYyAjNzE3MTY5NjlCMEIwIiwKLSJrICBjICM0ODQ4M0UzRUFEQUQiLAotImwgIGMgIzVENUQ1MTUxQ0RDRCIsCi0ieiAgYyAjNUM1QzUwNTBDOUM5IiwKLSJ4ICBjICM1RDVENTE1MUNCQ0IiLAotImMgIGMgIzVDNUM1MDUwQzdDNyIsCi0idiAgYyAjNUI1QjRGNEZDNkM2IiwKLSJiICBjICM1QjVCNTA1MEM2QzYiLAotIm4gIGMgIzU5NTk0RTRFQzFDMSIsCi0ibSAgYyAjNTg1ODRENERCRkJGIiwKLSJNICBjICM1OTU5NEY0RkMyQzIiLAotIk4gIGMgIzVBNUE0RjRGQzJDMiIsCi0iQiAgYyAjNTg1ODRENERCQ0JDIiwKLSJWICBjICM1NzU3NEQ0REJDQkMiLAotIkMgIGMgIzU5NTk0RTRFQkVCRSIsCi0iWiAgYyAjNTg1ODRFNEVCREJEIiwKLSJBICBjICM1ODU4NEQ0REJCQkIiLAotIlMgIGMgIzU3NTc0RDREQkFCQSIsCi0iRCAgYyAjNTY1NjRENERCOUI5IiwKLSJGICBjICM1NjU2NEM0Q0I2QjYiLAotIkcgIGMgIzU1NTU0QzRDQjZCNiIsCi0iSCAgYyAjNTQ1NDRCNEJCNEI0IiwKLSJKICBjICM1NDU0NEI0QkIxQjEiLAotIksgIGMgIzUzNTM0QjRCQjFCMSIsCi0iTCAgYyAjNTI1MjRBNEFBRUFFIiwKLSJQICBjICM1MTUxNDk0OUFDQUMiLAotIkkgIGMgIzUxNTE0OTQ5QUJBQiIsCi0iVSAgYyAjNDc0NzQxNDE4Nzg3IiwKLSJZICBjICMzMjMyMkMyQzhGOEYiLAotIlQgIGMgIzJCMkIyNTI1Nzc3NyIsCi0iUiAgYyAjMzYzNjJGMkY5Njk2IiwKLSJFICBjICMyQjJCMjYyNjZFNkUiLAotIlcgIGMgIzRENEQ0NTQ1QUNBQyIsCi0iUSAgYyAjNTU1NTRENERCOEI4IiwKLSIhICBjICM1NDU0NEM0Q0I0QjQiLAotIn4gIGMgIzU0NTQ0QzRDQjNCMyIsCi0iXiAgYyAjNTE1MTRBNEFBQ0FDIiwKLSIvICBjICM1MTUxNEE0QUFCQUIiLAotIiggIGMgIzUwNTA0OTQ5QTlBOSIsCi0iKSAgYyAjNEY0RjQ5NDlBNkE2IiwKLSJfICBjICM0QzRDNDc0N0ExQTEiLAotImAgIGMgIzRFNEU0ODQ4QTNBMyIsCi0iJyAgYyAjNEQ0RDQ4NDhBMUExIiwKLSJdICBjICM0QjRCNDY0NjlDOUMiLAotIlsgIGMgIzRDNEM0NzQ3OUU5RSIsCi0ieyAgYyAjNTE1MTRDNENBNkE2IiwKLSJ9ICBjICNBOUE5QTZBNkQ1RDUiLAotInwgIGMgIzFFMUUxQTFBNjY2NiIsCi0iIC4gYyAjMjkyOTI1MjU4MTgxIiwKLSIuLiBjICMzRDNEMzkzOTkyOTIiLAotIlguIGMgIzRBNEE0NjQ2OUI5QiIsCi0iby4gYyAjNTM1MzRFNEVBQkFCIiwKLSJPLiBjICM0OTQ5NDU0NTk3OTciLAotIisuIGMgIzRBNEE0NjQ2OTk5OSIsCi0iQC4gYyAjNDc0NzQ0NDQ5NDk0IiwKLSIjLiBjICM0ODQ4NDU0NTk0OTQiLAotIiQuIGMgIzQ3NDc0NDQ0OTI5MiIsCi0iJS4gYyAjNDY0NjQzNDM5MDkwIiwKLSImLiBjICM0NjQ2NDI0MjhEOEQiLAotIiouIGMgIzU0NTQ1MDUwQTlBOSIsCi0iPS4gYyAjNDc0NzQ0NDQ4RjhGIiwKLSItLiBjICM0QzRDNDk0OTk5OTkiLAotIjsuIGMgIzU3NTc1NDU0QTZBNiIsCi0iOi4gYyAjNUI1QjU3NTdBQUFBIiwKLSI+LiBjICM1NDU0NTE1MTlCOUIiLAotIiwuIGMgIzVBNUE1NzU3OUM5QyIsCi0iPC4gYyAjNjU2NTYyNjJBN0E3IiwKLSIxLiBjICM2ODY4NjY2NkEyQTIiLAotIjIuIGMgI0NBQ0FDOUM5RTVFNSIsCi0iMy4gYyAjMDUwNTA0MDQ1MTUxIiwKLSI0LiBjICMwODA4MDcwNzU0NTQiLAotIjUuIGMgIzBBMEEwOTA5NTg1OCIsCi0iNi4gYyAjMEMwQzBBMEE1ODU4IiwKLSI3LiBjICMxMDEwMEUwRTYyNjIiLAotIjguIGMgIzBFMEUwRDBENUE1QSIsCi0iOS4gYyAjMTIxMjExMTE1RDVEIiwKLSIwLiBjICMxMzEzMTIxMjVENUQiLAotInEuIGMgIzE2MTYxNTE1NjE2MSIsCi0idy4gYyAjMTcxNzE2MTY2MTYxIiwKLSJlLiBjICMxQTFBMTkxOTY1NjUiLAotInIuIGMgIzIwMjAxRTFFNzA3MCIsCi0idC4gYyAjMUUxRTFEMUQ2OTY5IiwKLSJ5LiBjICMyQTJBMjkyOTc2NzYiLAotInUuIGMgIzJGMkYyRDJENzY3NiIsCi0iaS4gYyAjM0EzQTM5Mzk4Nzg3IiwKLSJwLiBjICMzQTNBMzkzOTgzODMiLAotImEuIGMgIzNGM0YzRTNFODg4OCIsCi0icy4gYyAjNDE0MTQwNDA4OTg5IiwKLSJkLiBjICM0NTQ1NDM0MzhEOEQiLAotImYuIGMgIzQ0NDQ0MjQyOEI4QiIsCi0iZy4gYyAjNDQ0NDQzNDM4QzhDIiwKLSJoLiBjICM0MzQzNDI0MjhBOEEiLAotImouIGMgIzQzNDM0MTQxODg4OCIsCi0iay4gYyAjNDM0MzQyNDI4OTg5IiwKLSJsLiBjICM0MjQyNDE0MTg3ODciLAotInouIGMgIzQzNDM0MjQyODc4NyIsCi0ieC4gYyAjNDI0MjQxNDE4NTg1IiwKLSJjLiBjICM0MTQxM0YzRjgxODEiLAotInYuIGMgIzQxNDE0MDQwODI4MiIsCi0iYi4gYyAjNDg0ODQ2NDY4RDhEIiwKLSJuLiBjICM0OTQ5NDg0ODkwOTAiLAotIm0uIGMgIzRCNEI0QTRBOTE5MSIsCi0iTS4gYyAjNEI0QjQ5NDk4RThFIiwKLSJOLiBjICM1MjUyNTE1MTlBOUEiLAotIkIuIGMgIzUyNTI1MTUxOTk5OSIsCi0iVi4gYyAjNTY1NjU0NTQ5QTlBIiwKLSJDLiBjICM1NDU0NTM1Mzk0OTQiLAotIlouIGMgIzYwNjA1RjVGQTdBNyIsCi0iQS4gYyAjNjQ2NDYzNjNBQkFCIiwKLSJTLiBjICM1QTVBNTk1OTk3OTciLAotIkQuIGMgIzY4Njg2NzY3QURBRCIsCi0iRi4gYyAjNkM2QzZCNkJCMkIyIiwKLSJHLiBjICM1RTVFNUQ1RDlBOUEiLAotIkguIGMgIzc2NzY3NTc1QkFCQSIsCi0iSi4gYyAjNzg3ODc3NzdCQkJCIiwKLSJLLiBjICM3Njc2NzQ3NEI1QjUiLAotIkwuIGMgIzdFN0U3RDdEQkFCQSIsCi0iUC4gYyAjQTVBNUE0QTREMkQyIiwKLSJJLiBjICMwNDA0MDQwNDUyNTIiLAotIlUuIGMgIzA3MDcwNzA3NTQ1NCIsCi0iWS4gYyAjMDcwNzA4MDg1MzUzIiwKLSJULiBjICMwODA4MDgwODU0NTQiLAotIlIuIGMgIzBBMEEwQjBCNTc1NyIsCi0iRS4gYyAjMEUwRTBFMEU1QTVBIiwKLSJXLiBjICMxMTExMTIxMjVFNUUiLAotIlEuIGMgIzExMTExMTExNUU1RSIsCi0iIS4gYyAjMTExMTExMTE1RDVEIiwKLSJ+LiBjICMxMTExMTIxMjVENUQiLAotIl4uIGMgIzE2MTYxNjE2Njg2OCIsCi0iLy4gYyAjMTUxNTE2MTY2MTYxIiwKLSIoLiBjICMxNTE1MTUxNTYxNjEiLAotIikuIGMgIzE5MTkxQTFBNjU2NSIsCi0iXy4gYyAjMTkxOTE5MTk2NTY1IiwKLSJgLiBjICMxQTFBMUExQTY0NjQiLAotIicuIGMgIzFEMUQxRTFFNjk2OSIsCi0iXS4gYyAjMUUxRTFFMUU2OTY5IiwKLSJbLiBjICMyMjIyMjIyMjZENkQiLAotInsuIGMgIzI3MjcyNzI3NzE3MSIsCi0ifS4gYyAjMkIyQjJDMkM3Njc2IiwKLSJ8LiBjICMyQjJCMkIyQjc2NzYiLAotIiBYIGMgIzJCMkIyQjJCNzU3NSIsCi0iLlggYyAjMzAzMDMwMzA3QTdBIiwKLSJYWCBjICMzMDMwMzAzMDc5NzkiLAotIm9YIGMgIzM1MzUzNTM1N0Y3RiIsCi0iT1ggYyAjMzkzOTM5Mzk4MzgzIiwKLSIrWCBjICMzQTNBM0EzQTgzODMiLAotIkBYIGMgIzNGM0YzRjNGODc4NyIsCi0iI1ggYyAjNDM0MzQzNDM4QzhDIiwKLSIkWCBjICM0MzQzNDQ0NDhDOEMiLAotIiVYIGMgIzQyNDI0MjQyODY4NiIsCi0iJlggYyAjNDE0MTQxNDE4NDg0IiwKLSIqWCBjICM0ODQ4NDg0ODkxOTEiLAotIj1YIGMgIzQ4NDg0OTQ5OTA5MCIsCi0iLVggYyAjNEQ0RDRENEQ5Njk2IiwKLSI7WCBjICM1MTUxNTE1MTlEOUQiLAotIjpYIGMgIzRENEQ0RDREOTU5NSIsCi0iPlggYyAjNTE1MTUyNTI5QTlBIiwKLSIsWCBjICM1MTUxNTI1Mjk5OTkiLAotIjxYIGMgIzUyNTI1MjUyOUE5QSIsCi0iMVggYyAjNTI1MjUyNTI5OTk5IiwKLSIyWCBjICM1NjU2NTc1NzlFOUUiLAotIjNYIGMgIzU3NTc1NzU3OUQ5RCIsCi0iNFggYyAjNUI1QjVCNUJBMkEyIiwKLSI1WCBjICM1RjVGNjA2MEE2QTYiLAotIjZYIGMgIzVGNUY1RjVGQTZBNiIsCi0iN1ggYyAjNjM2MzY0NjRBQUFBIiwKLSI4WCBjICM2NDY0NjQ2NEFBQUEiLAotIjlYIGMgIzY3Njc2NzY3QUVBRSIsCi0iMFggYyAjNjc2NzY4NjhBRUFFIiwKLSJxWCBjICM2ODY4Njg2OEFFQUUiLAotIndYIGMgIzZGNkY2RjZGQjVCNSIsCi0iZVggYyAjNkM2QzZDNkNCMUIxIiwKLSJyWCBjICM3MzczNzM3M0I4QjgiLAotInRYIGMgIzgyODI4MjgyQkVCRSIsCi0ieVggYyAjODY4Njg2ODZDMkMyIiwKLSJ1WCBjICM4OTg5ODk4OUM0QzQiLAotImlYIGMgIzk4OTg5ODk4Q0JDQiIsCi0icFggYyAjQTBBMEEwQTBDRkNGIiwKLSJhWCBjICNBOUE5QTlBOUQ1RDUiLAotInNYIGMgI0IwQjBCMEIwRDhEOCIsCi0iZFggYyAjQjhCOEI4QjhEREREIiwKLSJmWCBjICNCREJEQkRCREUwRTAiLAotImdYIGMgI0Q5RDlEOUQ5RURFRCIsCi0iaFggYyAjOTA5MDkxOTFDNkM2IiwKLSJqWCBjICM3MTcxODk4OUJDQkMiLAotImtYIGMgIzczNzM4QjhCQkZCRiIsCi0ibFggYyAjNzI3Mjg5ODlCQ0JDIiwKLSJ6WCBjICM3OTc5OTA5MEMzQzMiLAotInhYIGMgIzdFN0U5NTk1QzdDNyIsCi0iY1ggYyAjODE4MTk4OThDQUNBIiwKLSJ2WCBjICM4NDg0OUI5QkNDQ0MiLAotImJYIGMgIzhDOENBM0EzRDRENCIsCi0iblggYyAjNzE3MThBOEFCQ0JDIiwKLSJtWCBjICM3MzczOEI4QkJEQkQiLAotIk1YIGMgIzc1NzU4RDhEQkZCRiIsCi0iTlggYyAjNzQ3NDhDOENCRUJFIiwKLSJCWCBjICM3Njc2OEU4RUMwQzAiLAotIlZYIGMgIzdDN0M5NDk0QzZDNiIsCi0iQ1ggYyAjN0I3QjkzOTNDNEM0IiwKLSJaWCBjICM3RjdGOTc5N0M5QzkiLAotIkFYIGMgIzgyODI5QTlBQ0JDQiIsCi0iU1ggYyAjODU4NTlFOUVDRUNFIiwKLSJEWCBjICM4ODg4QTBBMEQxRDEiLAotIkZYIGMgIzg3ODc5RjlGRDBEMCIsCi0iR1ggYyAjOEI4QkE0QTRENEQ0IiwKLSJIWCBjICM4QjhCQTNBM0Q0RDQiLAotIkpYIGMgIzg5ODlBMUExRDJEMiIsCi0iS1ggYyAjOEQ4REE1QTVENkQ2IiwKLSJMWCBjICM4QjhCQTNBM0QzRDMiLAotIlBYIGMgIzhFOEVBNkE2RDZENiIsCi0iSVggYyAjOEQ4REE1QTVENUQ1IiwKLSJVWCBjIGdyYXkxMDAiLAotIllYIGMgTm9uZSIsCi0vKiBwaXhlbHMgKi8KLSJZWFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFlYIiwKLSJYIHYudi52LnYuJlhsLnouay4mLmQuJS4kLkAuTy4rLl0gWyBfIGAgKSAoIF4gTCBLICEgRyBEIFYgbSBtIG8gIiwKLSJYIGMuYy5jLnYuJlh4LnouZi5mLmQuJS4kLiMuTy4rLlguWyBfIGAgKSAoIC8gTCBLIEggRiBEIFYgQyBuIG8gIiwKLSJYIHYuYy52LnYueC54Lnouay5mLm4uVi4sLj4uLS4rLl0gWyBfIGAgKSAoIF4gTCBLIEggRyBEIFYgQyBoIG8gIiwKLSJYICZYdi4mWHgueC5sLmouTS4xLjQgLSAtICwgNyBxIEouSC5LLmogOi4qLlAgTCBLIEggRiBTIEIgQyBuIG8gIiwKLSJYIHguJlh4Lnguei5qLlMuLCA9ID0gMSB9IGlYdVhILnJYd1hGLnFYN1haLjsuby5KICEgRiBTIEIgbSBuIG8gIiwKLSJYIHgubC56LiVYei5HLjEgQCA+IDIuZFhhWGlYdVhyWHdYRi5xWDhYNVg0WDJYO1h7IEggRiBTIFYgQyBuIG8gIiwKLSJYIHouai5qLmouQy4xIEAgPCBnWDIuZlhhWHBYdVh3WGVYOVg3WDVYNFgyWE4uOlgqWF8gRCBTIFogbSBoIG8gIiwKLSJYIGsuay5oLmIuLCBPID4gZ1hnWDIuZFhhWGlYeVhGLkQuQS5aLjRYM1gxWDpYbi5nLmEuXyBWIEIgbSBOIG8gIiwKLSJYIGYuZi5mLjMgKyA9IDIuMi4yLmZYc1hwWGhYdFhELjhYWi40WDJYMVg6WCpYJFhAWHAuaS5XIEMgbiBOIG8gIiwKLSJYIGQuJi4lLiUgKyAxIGRYZFhkWHNYUC5pWHlYSy44WDVYNFgyWD5YOlgqWGcuYS4rWG9YLlguLm0gbiBOIG8gIiwKLSJYICUuPS41ICUgLSBQLn0gYVhQLnBYaVh5WEsuRC5aLjRYM1gxWC1Ybi4kWEBYK1hvWC5YIFh5LlcgaCBnIG8gIiwKLSJYICQuJC46ICMgUFhJWEdYR1hMWEpYRlhGWFNYdlhBWGNYWlh4WFZYQ1h6WHpYQlhNWGtYbVhuWGpYaCBnIG8gIiwKLSJYICMuQC4qICQgNyB5WHVYeVh0WEwuSy5ELjZYNFgyWDFYOlhvIGcuYS5PWG9YLlh8LnsuWy50LiAuZyB2IG8gIiwKLSJYIE8uIy4kICQgcSBILnJYd1hGLjBYQS42WDRYMlgxWDpYbyAkWGEucC5vWC5YfC57LlsuJy5gLnIuZyBiIG8gIiwKLSJYIFguKy4kICQgUFhLWGJYYlhMWEpYRFhGWFNYdlhBWGNYWlh4WENYQ1h6WEJYQlhNWE5YbVhsWGpYYiBjIG8gIiwKLSJYIF0gXSAkICQgSC53WEYuMFg3WDZYNFgyWDxYOlhvICNYYS4rWG9YLlh8LnsuWy5dLikuLy5+LlEuYyB6IG8gIiwKLSJYIFsgWyAmICYgdyBGLnFYN1haLjRYMlgsWDpYbyAjWGEuK1hvWC5YfS57LlsuJy5lLi8uOS5FLl4uYyB6IG8gIiwKLSJYICcgXyAqICYgUFhLWGJYSFhMWEpYRFhTWFNYdlhBWGNYWlh4WFZYQ1h6WHpYQlhNWE5Ya1hqWGpYeiB4IG8gIiwKLSJYIGAgYCA6ICYgMiA4WFouNFgyWEIuOlgqWGcuQFhwLm9YLlh8LnsuWy5dLikucS4hLkUuUi5VLlkgeiBmIG8gIiwKLSJYICkgKSA1ICYgOyA8LjRYMlg+WDpYbyAjWGEuK1hvWFhYfC57LlsudC5fLnEufi5FLlIuNC41LmsgeCBhIG8gIiwKLSJYICggKCBJIDsgKiA2IDJYPlg6WD1YJFhAWCtYb1guWHwuey5bLnQuZS4vLlcuRS5SLlkuMy4gLnogYSBhIG8gIiwKLSJYIEkgXiAvIDggKiA6IDAgOlgqWCNYQFgrWG9YLlh8LnsuWy4nLl8uKC5+LkUuUi5ULjMuNy5rIHggYSBwIG8gIiwKLSJYIEwgTCBMIF4gMiAqIDMgbS4kWGEucC5vWC5YfS57LlsudC4pLigufi5FLjYuVC4zLkkuUiB4IGEgYSB5IG8gIiwKLSJYIEogSyBLIEsgSyAyICogNSBzLk9Yb1guWH0uey5bLicuXy4oLjkuOC5SLjQuMy5JLlkgeCBsIGEgcCB0IG8gIiwKLSJYIH4gSCBIICEgISAhIDIgOyA1IFUgWFh9LnsuWy5dLmUuKC5XLkUuUi5VLjMuNy5SIHggbCB1IHUgeSB0IG8gIiwKLSJYIEcgRiBHIEcgRyBRIFEgOCA6IDMgOSB1LlsuXS5fLi8uUS5FLlIuVC42LiAuayB4IGEgYSB1IHQgdCB0IG8gIiwKLSJYIEQgUyBEIFMgRCBTIFMgUyBWIDggMiA2IDkgYy5FIHcuMC58IFQgWSBrIHogeiBhIGEgcCB0IHQgaSByIG8gIiwKLSJYIEEgViBCIFYgViBWIEIgQiBtIG0gbiBuIGggaCBnIGcgZyBjIHogeiB6IGwgbCBkIHAgeSB0IGkgciByIG8gIiwKLSJYIG0gQyBDIEMgQyBDIEMgQyBuIG4gbiBNIE4gZyBnIGIgYyB6IHogeCBhIGEgYSB1IHkgdCB0IHIgciBlIG8gIiwKLSJYIG4gbiBuIG4gbiBoIGggaCBOIE4gZyBnIHYgYiBzIHogeiB6IHggYSBwIHAgdSB0IHQgciByIHIgZSBlIG8gIiwKLSJZWG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIFlYIgotfTsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9ndGsvc29sYXJpcy9zcGFyYy9FY2xpcHNlLnMucG0gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL3NvbGFyaXMvc3BhcmMvRWNsaXBzZS5zLnBtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmI5Mzc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9ndGsvc29sYXJpcy9zcGFyYy9FY2xpcHNlLnMucG0KKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyogWFBNICovCi1zdGF0aWMgY2hhciAqUHJvZHVjdEljb24yNFtdID0gewotLyogY29sdW1ucyByb3dzIGNvbG9ycyBjaGFycy1wZXItcGl4ZWwgKi8KLSIyNCAyNCAyNTcgMiIsCi0iICAgYyBibGFjayIsCi0iLiAgYyBncmF5MTAwIiwKLSJYICBjICM2OTY5NUE1QUU4RTgiLAotIm8gIGMgIzQ5NDk0OTQ5OTE5MSIsCi0iTyAgYyAjRjFGMURGREZFQ0VDIiwKLSIrICBjICNEN0Q3QUNBQ0NEQ0QiLAotIkAgIGMgI0RGREZCQkJCRDZENiIsCi0iIyAgYyAjRTJFMkM0QzREQkRCIiwKLSIkICBjICNDRUNFOUM5Q0M0QzQiLAotIiUgIGMgI0M0QzQ4QjhCQkFCQSIsCi0iJiAgYyAjQzJDMjhBOEFCQUJBIiwKLSIqICBjICNDNEM0OEU4RUJDQkMiLAotIj0gIGMgI0JGQkY4QThBQjlCOSIsCi0iLSAgYyAjRUJFQkQ5RDlFOUU5IiwKLSI7ICBjICNCRkJGODg4OEI5QjkiLAotIjogIGMgI0Q4RDhCOUI5RDZENiIsCi0iPiAgYyAjQjlCOTg2ODZCOUI5IiwKLSIsICBjICNCOEI4ODk4OUI5QjkiLAotIjwgIGMgI0JCQkI5MzkzQkZCRiIsCi0iMSAgYyAjQTlBOTdCN0JCMkIyIiwKLSIyICBjICNFNEU0RDRENEU3RTciLAotIjMgIGMgI0M2QzZBRkFGQ0VDRSIsCi0iNCAgYyAjQTZBNjgwODBCNkI2IiwKLSI1ICBjICNBMkEyN0U3RUI0QjQiLAotIjYgIGMgIzlFOUU3RTdFQjFCMSIsCi0iNyAgYyAjQUJBQjkwOTBCQkJCIiwKLSI4ICBjICNCN0I3QTBBMEM1QzUiLAotIjkgIGMgIzlEOUQ3QzdDQjJCMiIsCi0iMCAgYyAjQUFBQThCOEJCRUJFIiwKLSJxICBjICNBQUFBOTA5MEJDQkMiLAotIncgIGMgIzhDOEM2QjZCQUJBQiIsCi0iZSAgYyAjOTA5MDcwNzBCMUIxIiwKLSJyICBjICNDNEM0QjNCM0Q3RDciLAotInQgIGMgI0NEQ0RCRkJGRERERCIsCi0ieSAgYyAjRUFFQUU0RTRGMUYxIiwKLSJ1ICBjICM4ODg4NkE2QUFEQUQiLAotImkgIGMgIzlFOUU4NTg1QzFDMSIsCi0icCAgYyAjODQ4NDZBNkFBRkFGIiwKLSJhICBjICM4MTgxNkI2QkFBQUEiLAotInMgIGMgI0Q3RDdDRkNGRTZFNiIsCi0iZCAgYyAjODE4MTY5NjlCMUIxIiwKLSJmICBjICM3ODc4NjM2M0E1QTUiLAotImcgIGMgIzZFNkU1RDVEOUM5QyIsCi0iaCAgYyAjNzE3MTYwNjA5RDlEIiwKLSJqICBjICM4MzgzNzQ3NEFBQUEiLAotImsgIGMgIzZBNkE1NzU3QTNBMyIsCi0ibCAgYyAjNkU2RTVFNUVBMEEwIiwKLSJ6ICBjICM1RTVFNTA1MDkyOTIiLAotInggIGMgIzg4ODg3QjdCQkNCQyIsCi0iYyAgYyAjNjg2ODU4NThBQkFCIiwKLSJ2ICBjICM1QTVBNEQ0REEyQTIiLAotImIgIGMgIzdEN0Q3MzczQjRCNCIsCi0ibiAgYyAjNUE1QTRFNEVBNkE2IiwKLSJtICBjICM1RjVGNTY1Njk1OTUiLAotIk0gIGMgIzU2NTY0QTRBQkJCQiIsCi0iTiAgYyAjNTY1NjQ5NDlCOUI5IiwKLSJCICBjICM1NTU1NDk0OUI4QjgiLAotIlYgIGMgIzUzNTM0ODQ4QjNCMyIsCi0iQyAgYyAjNTQ1NDQ5NDlCNEI0IiwKLSJaICBjICM1MjUyNDc0N0IwQjAiLAotIkEgIGMgIzUyNTI0NzQ3QUZBRiIsCi0iUyAgYyAjNUI1QjUzNTM5MzkzIiwKLSJEICBjICMzRTNFMzYzNjk3OTciLAotIkYgIGMgIzQ5NDk0MDQwQTZBNiIsCi0iRyAgYyAjNDg0ODQwNDBBNUE1IiwKLSJIICBjICM1NTU1NEE0QUJBQkEiLAotIkogIGMgIzU0NTQ0OTQ5QjdCNyIsCi0iSyAgYyAjNTM1MzQ5NDlCNEI0IiwKLSJMICBjICM1MTUxNDc0N0FGQUYiLAotIlAgIGMgIzUyNTI0ODQ4QjFCMSIsCi0iSSAgYyAjNTE1MTQ4NDhCMEIwIiwKLSJVICBjICM1MTUxNDg0OEFFQUUiLAotIlkgIGMgIzUxNTE0NzQ3QURBRCIsCi0iVCAgYyAjNTE1MTQ4NDhBREFEIiwKLSJSICBjICM0RjRGNDc0N0FCQUIiLAotIkUgIGMgIzUwNTA0NzQ3QUJBQiIsCi0iVyAgYyAjNTA1MDQ2NDZBOUE5IiwKLSJRICBjICM0RjRGNDY0NkE4QTgiLAotIiEgIGMgIzRFNEU0NjQ2QTdBNyIsCi0ifiAgYyAjNEU0RTQ1NDVBNEE0IiwKLSJeICBjICM0RDRENDU0NUE0QTQiLAotIi8gIGMgIzRFNEU0NjQ2QTVBNSIsCi0iKCAgYyAjNEQ0RDQ1NDVBMUExIiwKLSIpICBjICMzRDNEMzYzNjdFN0UiLAotIl8gIGMgIzRCNEI0NDQ0OUM5QyIsCi0iYCAgYyAjMkEyQTI1MjU3RjdGIiwKLSInICBjICMzRTNFMzczNzk4OTgiLAotIl0gIGMgIzQ3NDc0MDQwOUM5QyIsCi0iWyAgYyAjNEQ0RDQ2NDZBNEE0IiwKLSJ7ICBjICM0QzRDNDU0NUEyQTIiLAotIn0gIGMgIzRENEQ0NjQ2QTJBMiIsCi0ifCAgYyAjNEQ0RDQ2NDZBMUExIiwKLSIgLiBjICM0QjRCNDU0NTlGOUYiLAotIi4uIGMgIzRDNEM0NTQ1OUY5RiIsCi0iWC4gYyAjNEM0QzQ2NDY5RjlGIiwKLSJvLiBjICM0QjRCNDU0NTlEOUQiLAotIk8uIGMgIzQ5NDk0MzQzOTg5OCIsCi0iKy4gYyAjNDk0OTQ0NDQ5QTlBIiwKLSJALiBjICM0QTRBNDU0NTlBOUEiLAotIiMuIGMgIzQ5NDk0NDQ0OTg5OCIsCi0iJC4gYyAjNDg0ODQzNDM5Njk2IiwKLSIlLiBjICM0OTQ5NDQ0NDk3OTciLAotIiYuIGMgIzQ4NDg0MzQzOTU5NSIsCi0iKi4gYyAjNTE1MTRDNENBMUExIiwKLSI9LiBjICM2QjZCNjc2N0FFQUUiLAotIi0uIGMgIzk1OTU5MTkxQzlDOSIsCi0iOy4gYyAjMjMyMzFGMUY3Njc2IiwKLSI6LiBjICMyMTIxMUUxRTcwNzAiLAotIj4uIGMgIzI5MjkyNTI1N0Y3RiIsCi0iLC4gYyAjMjUyNTIxMjE3MDcwIiwKLSI8LiBjICMyNDI0MjEyMTZENkQiLAotIjEuIGMgIzJCMkIyNzI3ODA4MCIsCi0iMi4gYyAjMzkzOTM1MzU4QzhDIiwKLSIzLiBjICM0NDQ0NDA0MDk0OTQiLAotIjQuIGMgIzNCM0IzODM4ODI4MiIsCi0iNS4gYyAjNDc0NzQzNDM5NDk0IiwKLSI2LiBjICM0ODQ4NDQ0NDk1OTUiLAotIjcuIGMgIzQ3NDc0MzQzOTM5MyIsCi0iOC4gYyAjNDc0NzQ0NDQ5MzkzIiwKLSI5LiBjICM0NjQ2NDM0MzkxOTEiLAotIjAuIGMgIzQ1NDU0MjQyOEY4RiIsCi0icS4gYyAjNEE0QTQ3NDc5ODk4IiwKLSJ3LiBjICM0NjQ2NDM0MzhGOEYiLAotImUuIGMgIzQ1NDU0MjQyOEQ4RCIsCi0ici4gYyAjNDQ0NDQxNDE4QjhCIiwKLSJ0LiBjICM0ODQ4NDQ0NDkxOTEiLAotInkuIGMgIzQ0NDQ0MTQxODk4OSIsCi0idS4gYyAjNDk0OTQ2NDY5MDkwIiwKLSJpLiBjICM0QzRDNDg0ODkzOTMiLAotInAuIGMgIzUxNTE0RTRFOUU5RSIsCi0iYS4gYyAjNzM3MzcwNzBCNkI2IiwKLSJzLiBjICM3Nzc3NzQ3NEJCQkIiLAotImQuIGMgI0EwQTA5RTlFRDFEMSIsCi0iZi4gYyAjRDZENkQ1RDVFQkVCIiwKLSJnLiBjICMwRTBFMEQwRDVBNUEiLAotImguIGMgIzExMTEwRjBGNUU1RSIsCi0iai4gYyAjMTIxMjExMTE1RTVFIiwKLSJrLiBjICMxMzEzMTIxMjVGNUYiLAotImwuIGMgIzE3MTcxNjE2NjM2MyIsCi0iei4gYyAjMUQxRDFCMUI2ODY4IiwKLSJ4LiBjICMxRDFEMUMxQzY4NjgiLAotImMuIGMgIzIyMjIyMTIxNkU2RSIsCi0idi4gYyAjMjIyMjIxMjE2RDZEIiwKLSJiLiBjICMyODI4MjcyNzc0NzQiLAotIm4uIGMgIzI4MjgyNzI3NzM3MyIsCi0ibS4gYyAjMjkyOTI4Mjg3MzczIiwKLSJNLiBjICMyRjJGMkUyRTc5NzkiLAotIk4uIGMgIzM1MzUzNDM0N0Y3RiIsCi0iQi4gYyAjMzYzNjM1MzU4MTgxIiwKLSJWLiBjICMzQzNDM0IzQjg1ODUiLAotIkMuIGMgIzQyNDI0MTQxOEM4QyIsCi0iWi4gYyAjNDI0MjQxNDE4QjhCIiwKLSJBLiBjICM0NDQ0NDI0MjhCOEIiLAotIlMuIGMgIzQzNDM0MTQxODk4OSIsCi0iRC4gYyAjNDM0MzQyNDI4OTg5IiwKLSJGLiBjICM0MjQyNDE0MTg3ODciLAotIkcuIGMgIzQxNDE0MDQwODQ4NCIsCi0iSC4gYyAjNDc0NzQ1NDU4RDhEIiwKLSJKLiBjICM0MzQzNDI0Mjg3ODciLAotIksuIGMgIzQyNDI0MTQxODU4NSIsCi0iTC4gYyAjNDE0MTQwNDA4MjgyIiwKLSJQLiBjICM0OTQ5NDg0ODkxOTEiLAotIkkuIGMgIzRGNEY0RTRFOTc5NyIsCi0iVS4gYyAjNTk1OTU3NTdBNkE2IiwKLSJZLiBjICM1RjVGNUQ1REE0QTQiLAotIlQuIGMgIzZDNkM2QjZCQjNCMyIsCi0iUi4gYyAjN0M3QzdCN0JCOUI5IiwKLSJFLiBjICNBOEE4QTdBN0QzRDMiLAotIlcuIGMgIzBEMEQwRDBENUE1QSIsCi0iUS4gYyAjMUYxRjFGMUY2QzZDIiwKLSIhLiBjICMyMjIyMjIyMjZFNkUiLAotIn4uIGMgIzNCM0IzQjNCODU4NSIsCi0iXi4gYyAjNDE0MTQxNDE4QzhDIiwKLSIvLiBjICM0MTQxNDE0MThCOEIiLAotIiguIGMgIzQyNDI0MjQyOEI4QiIsCi0iKS4gYyAjNDg0ODQ4NDg5MjkyIiwKLSJfLiBjICM0MDQwNDA0MDgxODEiLAotImAuIGMgIzRFNEU0RTRFOTg5OCIsCi0iJy4gYyAjNTU1NTU1NTU5RTlFIiwKLSJdLiBjICM1NTU1NTU1NTlEOUQiLAotIlsuIGMgIzVCNUI1QjVCQTNBMyIsCi0iey4gYyAjNUM1QzVDNUNBM0EzIiwKLSJ9LiBjICM2MTYxNjE2MUE5QTkiLAotInwuIGMgIzY2NjY2NjY2QUVBRSIsCi0iIFggYyAjNjY2NjY2NjZBREFEIiwKLSIuWCBjICM2QjZCNkI2QkIyQjIiLAotIlhYIGMgIzcwNzA3MDcwQjdCNyIsCi0ib1ggYyAjNkE2QTZBNkFBREFEIiwKLSJPWCBjICM3NDc0NzQ3NEJCQkIiLAotIitYIGMgIzg5ODk4OTg5QzJDMiIsCi0iQFggYyAjOTA5MDkwOTBDOEM4IiwKLSIjWCBjICM4RjhGOEY4RkM2QzYiLAotIiRYIGMgIzkyOTI5MjkyQzZDNiIsCi0iJVggYyAjOUY5RjlGOUZDRkNGIiwKLSImWCBjICNBNUE1QTVBNUQyRDIiLAotIipYIGMgI0I1QjVCNUI1REJEQiIsCi0iPVggYyAjQjhCOEI4QjhERURFIiwKLSItWCBjICNCN0I3QjdCN0RDREMiLAotIjtYIGMgI0JCQkJCQkJCREVERSIsCi0iOlggYyAjQkRCREJEQkRERkRGIiwKLSI+WCBjICNDOUM5QzlDOUU1RTUiLAotIixYIGMgI0QxRDFEMUQxRUFFQSIsCi0iPFggYyAjN0M3QzdEN0RCQUJBIiwKLSIxWCBjICM4OTg5OEE4QUM3QzciLAotIjJYIGMgIzhGOEY5MDkwQzdDNyIsCi0iM1ggYyAjQTNBM0E0QTREM0QzIiwKLSI0WCBjICNBMkEyQjVCNURFREUiLAotIjVYIGMgI0FEQURCREJERTFFMSIsCi0iNlggYyAjQjlCOUM3QzdFNUU1IiwKLSI3WCBjICNCQUJBQzhDOEU2RTYiLAotIjhYIGMgIzhFOEVBNkE2RDZENiIsCi0iOVggYyAjOTA5MEE3QTdEN0Q3IiwKLSIwWCBjICM5MTkxQTlBOUQ3RDciLAotInFYIGMgIzkyOTJBOUE5RDhEOCIsCi0id1ggYyAjOTQ5NEFCQUJEOEQ4IiwKLSJlWCBjICM5ODk4QUVBRUQ5RDkiLAotInJYIGMgIzlCOUJCMEIwREFEQSIsCi0idFggYyAjOUU5RUIzQjNEQ0RDIiwKLSJ5WCBjICNBMUExQjVCNUREREQiLAotInVYIGMgI0E1QTVCOEI4REVERSIsCi0iaVggYyAjQThBOEJCQkJFMEUwIiwKLSJwWCBjICNBQ0FDQkVCRUUxRTEiLAotImFYIGMgI0FGQUZDMEMwRTNFMyIsCi0ic1ggYyAjQjNCM0MzQzNFNEU0IiwKLSJkWCBjICNCMkIyQzJDMkUzRTMiLAotImZYIGMgI0I1QjVDNUM1RTVFNSIsCi0iZ1ggYyAjQjhCOEM3QzdFNkU2IiwKLSJoWCBjICNCNkI2QzVDNUU0RTQiLAotImpYIGMgIzk3OTdBRUFFRDlEOSIsCi0ia1ggYyAjQTFBMUI2QjZEREREIiwKLSJsWCBjICNBOEE4QkJCQkRGREYiLAotInpYIGMgZ3JheTEwMCIsCi0ieFggYyBibGFjayIsCi0iY1ggYyBibGFjayIsCi0idlggYyBibGFjayIsCi0iYlggYyBibGFjayIsCi0iblggYyBibGFjayIsCi0ibVggYyBibGFjayIsCi0iTVggYyBibGFjayIsCi0iTlggYyBibGFjayIsCi0iQlggYyBibGFjayIsCi0iVlggYyBibGFjayIsCi0iQ1ggYyBibGFjayIsCi0iWlggYyBibGFjayIsCi0iQVggYyBibGFjayIsCi0iU1ggYyBibGFjayIsCi0iRFggYyBibGFjayIsCi0iRlggYyBibGFjayIsCi0iR1ggYyBibGFjayIsCi0iSFggYyBibGFjayIsCi0iSlggYyBibGFjayIsCi0iS1ggYyBibGFjayIsCi0iTFggYyBibGFjayIsCi0iUFggYyBibGFjayIsCi0iSVggYyBibGFjayIsCi0iVVggYyBibGFjayIsCi0iWVggYyBOb25lIiwKLS8qIHBpeGVscyAqLwotIllYWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBZWCIsCi0iWCBfLl8uTC5HLksuRi5ELkEuZS4wLjkuJi4kLiUuKy5fIC4ueyBeICEgVyBFIG8gIiwKLSJYIEwuTC5MLkcuRi5GLkQuci5lLjAuOS43LiYuTy5ALm8uIC57IH4gISBRIEUgbyAiLAotIlggTC5HLkcuSy5GLlMueS5yLmUudy45LjUuJC4rLkAuby4uLiggfiAhIFcgRSBvICIsCi0iWCBHLksuSy5GLkouRC5oIDYgMCBpIHggcy5hLj0uVS4qLi4ufSB+ICEgVyBFIG8gIiwKLSJYIEsuRi5GLkYuUyA3IDogciBkLjFYT1hYWC5YfC59LlsucC58IC8gISBXIEUgbyAiLAotIlggRi5GLkYubSAzIC0gcyA9WDNYQFhYWFQuIFh9LlsuXS5JLnEueyBRIEUgVCBvICIsCi0iWCBTLkQuSC44IE8geSAsWDtYJlgyWC5YfC59LlsuXS5JLlAuQy4zLlEgRSBZIG8gIiwKLSJYIEEuci5qICMgMiBmLj5YKlglWCtYfC59LlsuXS5JLlAuXi5+LkIuXSBFIFkgbyAiLAotIlggZS51LnEgQCB0IDpYLVhFLiRYPFh9LlsuXS5gLlAuWi5WLk4uTS4yLlkgTCBvICIsCi0iWCAwLmkuPCArIDhYOFhxWHdYZVhyWHRYNFh1WGxYcFhhWHNYZlhnWDdYWSBBIG8gIiwKLSJYIDkudC4qICQgLS4jWCtYUi5vWHsuJy5gLlAuKC5+Lk4uTS5tLmMuUS5UIFogbyAiLAotIlggOC43LjsgJSA4WDlYMFh3WGVYclh0WHlYdVhpWHBYYVhkWGZYZ1g3WEwgWiBvICIsCi0iWCA2LiYuMSAmIGIgIFh9LlsuJy5JLlAuLy5+Lk4uTS5uLiEueC5sLjouSSBQIG8gIiwKLSJYICMuIy53ID0gOFg5WHFYd1hqWHJYdFhrWHVYaVg1WGFYc1hoWDZYN1hQIFYgbyAiLAotIlggKy4rLmsgPiA1IFkuXS5JLikuLy5+Lk4uTS5iLnYueC5sLmsuaC4nIFYgQyBvICIsCi0iWCBvLm8uby51ICwgYSBJLikuWi5WLk4uTS5uLmMuei5sLmouVy5gIFAgViBDIG8gIiwKLSJYIC4uIC5YLnYgZSA0IGwgXi5WLk4uTS5tLiEueC5sLmouZy47LkYgViBDIEogbyAiLAotIlggKCB8ICggKCBuIHAgOSBnIDQuTS5uLmMueC5sLmouaC4+LkcgViBLIEMgSiBvICIsCi0iWCB+IFsgWyBeIC8gLyBjIGQgZiB6ICkgPC56LiwuMS5EIFAgViBDIEMgQiBCIG8gIiwKLSJYICEgUSAhIFEgUSBRIFEgVyBFIEUgWSBUIEEgWiBQIFYgViBLIEMgSiBCIEIgbyAiLAotIlggUSBXIFEgVyBSIFcgRSBFIFQgVCBUIEwgWiBQIFYgViBLIEogSiBKIEIgTiBvICIsCi0iWCBSIEUgRSBFIEUgRSBZIFkgVSBMIFogUCBQIFAgQyBWIEogSiBCIEIgSCBNIG8gIiwKLSJZWG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gWVgiCi19OwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9zb2xhcmlzL3NwYXJjL0VjbGlwc2UudC5wbSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9ndGsvc29sYXJpcy9zcGFyYy9FY2xpcHNlLnQucG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNmIyMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9zb2xhcmlzL3NwYXJjL0VjbGlwc2UudC5wbQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKiBYUE0gKi8KLXN0YXRpYyBjaGFyICpQcm9kdWN0SWNvbjE2W10gPSB7Ci0vKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqLwotIjE2IDE2IDI1NyAyIiwKLSIgICBjIGJsYWNrIiwKLSIuICBjIGdyYXkxMDAiLAotIlggIGMgI0UyRTJDMEMwRDlEOSIsCi0ibyAgYyAjRURFREQ5RDlFOEU4IiwKLSJPICBjICNENUQ1QUJBQkNEQ0QiLAotIisgIGMgI0UyRTJDM0MzRENEQyIsCi0iQCAgYyAjQzVDNThFOEVCQ0JDIiwKLSIjICBjICNENEQ0QUJBQkNEQ0QiLAotIiQgIGMgI0NBQ0E5RjlGQzZDNiIsCi0iJSAgYyAjRDZENkI0QjREM0QzIiwKLSImICBjICNDQUNBQTBBMEM4QzgiLAotIiogIGMgI0M2QzY5RDlEQzZDNiIsCi0iPSAgYyAjQzVDNTlGOUZDOEM4IiwKLSItICBjICNDQ0NDQUNBQ0NFQ0UiLAotIjsgIGMgI0NDQ0NCMEIwRDNEMyIsCi0iOiAgYyAjQTZBNjgzODNCM0IzIiwKLSI+ICBjICNCQUJBOUE5QUM2QzYiLAotIiwgIGMgI0I3Qjc5QTlBQzJDMiIsCi0iPCAgYyAjRTNFM0Q1RDVFOUU5IiwKLSIxICBjICNCMEIwOEU4RUMwQzAiLAotIjIgIGMgIzlGOUY4MDgwQjhCOCIsCi0iMyAgYyAjQUZBRjk4OThDMUMxIiwKLSI0ICBjICNEQkRCQ0ZDRkU1RTUiLAotIjUgIGMgIzk2OTY3ODc4QjJCMiIsCi0iNiAgYyAjOUE5QTdFN0VCQUJBIiwKLSI3ICBjICM4RThFNzg3OEFGQUYiLAotIjggIGMgIzkxOTE3RjdGQkRCRCIsCi0iOSAgYyAjRDNEM0NDQ0NFNEU0IiwKLSIwICBjICM1MzUzNDg0ODhCOEIiLAotInEgIGMgIzY5Njk1QTVBRThFOCIsCi0idyAgYyAjNTU1NTQ5NDlCOUI5IiwKLSJlICBjICM1NTU1NDk0OUI4QjgiLAotInIgIGMgIzU0NTQ0ODQ4QjZCNiIsCi0idCAgYyAjNTM1MzQ4NDhCNEI0IiwKLSJ5ICBjICM1NDU0NDg0OEI0QjQiLAotInUgIGMgIzUzNTM0ODQ4QjNCMyIsCi0iaSAgYyAjNTM1MzQ4NDhCMkIyIiwKLSJwICBjICM1MjUyNDc0N0FGQUYiLAotImEgIGMgIzUzNTM0ODQ4QjFCMSIsCi0icyAgYyAjNTQ1NDQ5NDlCOEI4IiwKLSJkICBjICM1NDU0NDk0OUI2QjYiLAotImYgIGMgIzUyNTI0ODQ4QjNCMyIsCi0iZyAgYyAjNTI1MjQ4NDhCMkIyIiwKLSJoICBjICM1MzUzNDk0OUIzQjMiLAotImogIGMgIzUyNTI0ODQ4QjFCMSIsCi0iayAgYyAjNTI1MjQ4NDhCMEIwIiwKLSJsICBjICM1MTUxNDc0N0FFQUUiLAotInogIGMgIzUyNTI0ODQ4QUZBRiIsCi0ieCAgYyAjNTE1MTQ4NDhBRUFFIiwKLSJjICBjICM1MTUxNDc0N0FEQUQiLAotInYgIGMgIzUxNTE0NzQ3QUNBQyIsCi0iYiAgYyAjNEY0RjQ2NDZBQUFBIiwKLSJuICBjICM1MTUxNDg0OEFEQUQiLAotIm0gIGMgIzUwNTA0NzQ3QUJBQiIsCi0iTSAgYyAjNTA1MDQ3NDdBQUFBIiwKLSJOICBjICM0RjRGNDY0NkE4QTgiLAotIkIgIGMgIzUwNTA0NzQ3QTlBOSIsCi0iViAgYyAjNEU0RTQ2NDZBN0E3IiwKLSJDICBjICM0RTRFNDY0NkE2QTYiLAotIlogIGMgIzRGNEY0NjQ2QTZBNiIsCi0iQSAgYyAjNEY0RjQ3NDdBN0E3IiwKLSJTICBjICM0RDRENDU0NUEzQTMiLAotIkQgIGMgIzRENEQ0NTQ1QTJBMiIsCi0iRiAgYyAjNEM0QzQ1NDU5RTlFIiwKLSJHICBjICM3NDc0NkU2RUIzQjMiLAotIkggIGMgIzJFMkUyOTI5ODM4MyIsCi0iSiAgYyAjMzgzODMyMzI5MDkwIiwKLSJLICBjICM0NjQ2NDA0MDk5OTkiLAotIkwgIGMgIzRENEQ0NjQ2QTJBMiIsCi0iUCAgYyAjNEU0RTQ3NDdBM0EzIiwKLSJJICBjICM0QjRCNDU0NTlGOUYiLAotIlUgIGMgIzRCNEI0NTQ1OUU5RSIsCi0iWSAgYyAjNEM0QzQ2NDY5RjlGIiwKLSJUICBjICM0QTRBNDQ0NDlCOUIiLAotIlIgIGMgIzRBNEE0NDQ0OUE5QSIsCi0iRSAgYyAjNDk0OTQzNDM5Nzk3IiwKLSJXICBjICM0OTQ5NDQ0NDk3OTciLAotIlEgIGMgIzQ4NDg0MzQzOTQ5NCIsCi0iISAgYyAjNzg3ODc0NzRCOEI4IiwKLSJ+ICBjICMyNzI3MjQyNDc4NzgiLAotIl4gIGMgIzJEMkQyQTJBNzU3NSIsCi0iLyAgYyAjNDg0ODQ0NDQ5Nzk3IiwKLSIoICBjICM0NzQ3NDM0MzkzOTMiLAotIikgIGMgIzQ1NDU0MjQyOTA5MCIsCi0iXyAgYyAjNEI0QjQ4NDg5QTlBIiwKLSJgICBjICM0NjQ2NDM0MzhGOEYiLAotIicgIGMgIzQ2NDY0MzQzOEU4RSIsCi0iXSAgYyAjNDU0NTQyNDI4QzhDIiwKLSJbICBjICM1MTUxNEQ0REEwQTAiLAotInsgIGMgIzVDNUM1OTU5QTVBNSIsCi0ifSAgYyAjNTM1MzUwNTA5MDkwIiwKLSJ8ICBjICNDOEM4QzdDN0UzRTMiLAotIiAuIGMgIzEyMTIxMTExNUQ1RCIsCi0iLi4gYyAjMUExQTE5MTk2NTY1IiwKLSJYLiBjICMyNDI0MjIyMjZENkQiLAotIm8uIGMgIzNGM0YzRTNFODg4OCIsCi0iTy4gYyAjNDQ0NDQyNDI4RDhEIiwKLSIrLiBjICM0NDQ0NDI0Mjg5ODkiLAotIkAuIGMgIzQyNDI0MTQxODc4NyIsCi0iIy4gYyAjNDU0NTQzNDM4QThBIiwKLSIkLiBjICM0MzQzNDI0Mjg4ODgiLAotIiUuIGMgIzQyNDI0MTQxODY4NiIsCi0iJi4gYyAjNDE0MTQwNDA4NDg0IiwKLSIqLiBjICM0MTQxNDA0MDgzODMiLAotIj0uIGMgIzQyNDI0MDQwODM4MyIsCi0iLS4gYyAjNDE0MTQwNDA4MjgyIiwKLSI7LiBjICM0NzQ3NDY0NjhEOEQiLAotIjouIGMgIzQ2NDY0NDQ0ODk4OSIsCi0iPi4gYyAjNTI1MjUxNTE5OTk5IiwKLSIsLiBjICM2NDY0NjM2M0FBQUEiLAotIjwuIGMgIzYxNjE1RjVGQTJBMiIsCi0iMS4gYyAjNkU2RTZDNkNCMkIyIiwKLSIyLiBjICNBNUE1QTRBNEQzRDMiLAotIjMuIGMgI0IwQjBBRkFGRDZENiIsCi0iNC4gYyAjMTExMTEyMTI1RDVEIiwKLSI1LiBjICMxOTE5MUExQTY1NjUiLAotIjYuIGMgIzFFMUUxRTFFNkM2QyIsCi0iNy4gYyAjMjIyMjIyMjI2RDZEIiwKLSI4LiBjICMyQjJCMkIyQjc2NzYiLAotIjkuIGMgIzJCMkIyQjJCNzU3NSIsCi0iMC4gYyAjMkIyQjJDMkM3NTc1IiwKLSJxLiBjICMzNDM0MzUzNTdGN0YiLAotIncuIGMgIzM0MzQzNTM1N0U3RSIsCi0iZS4gYyAjMzUzNTM1MzU3RjdGIiwKLSJyLiBjICMzRTNFM0UzRTg4ODgiLAotInQuIGMgIzNFM0UzRTNFODc4NyIsCi0ieS4gYyAjNDE0MTQxNDE4NDg0IiwKLSJ1LiBjICM0MDQwNDA0MDgyODIiLAotImkuIGMgIzQ4NDg0OTQ5OTE5MSIsCi0icC4gYyAjNDk0OTQ5NDk5MTkxIiwKLSJhLiBjICM0ODQ4NDg0ODkwOTAiLAotInMuIGMgIzQ4NDg0OTQ5OTA5MCIsCi0iZC4gYyAjNDA0MDQwNDA4MDgwIiwKLSJmLiBjICM1MjUyNTI1MjlBOUEiLAotImcuIGMgIzUyNTI1MjUyOTk5OSIsCi0iaC4gYyAjNUI1QjVCNUJBM0EzIiwKLSJqLiBjICM1QjVCNUI1QkEyQTIiLAotImsuIGMgIzY0NjQ2NDY0QUJBQiIsCi0ibC4gYyAjNjM2MzY0NjRBQUFBIiwKLSJ6LiBjICM2QjZCNkM2Q0IyQjIiLAotInguIGMgIzcyNzI3MzczQjlCOSIsCi0iYy4gYyAjNzE3MTcxNzFBNEE0IiwKLSJ2LiBjICM3ODc4Nzg3OEFCQUIiLAotImIuIGMgIzdGN0Y3RjdGQjFCMSIsCi0ibi4gYyAjOEM4QzhDOENCRUJFIiwKLSJtLiBjICNBNUE1QTVBNUQyRDIiLAotIk0uIGMgI0M5QzlDOUM5RTVFNSIsCi0iTi4gYyAjODU4NTg2ODZCN0I3IiwKLSJCLiBjICM5MTkxOTI5MkM0QzQiLAotIlYuIGMgIzcxNzE4OTg5QkNCQyIsCi0iQy4gYyAjNzM3MzhCOEJCRUJFIiwKLSJaLiBjICM3NTc1OEQ4REMwQzAiLAotIkEuIGMgIzc4Nzg5MDkwQzNDMyIsCi0iUy4gYyAjN0E3QTkyOTJDNUM1IiwKLSJELiBjICM3MTcxOEE4QUJEQkQiLAotIkYuIGMgIzc2NzY4RThFQzBDMCIsCi0iRy4gYyAjNzg3ODkwOTBDMkMyIiwKLSJILiBjICM3QjdCOTM5M0M1QzUiLAotIkouIGMgIzdEN0Q5NTk1QzdDNyIsCi0iSy4gYyAjODA4MDk5OTlDQUNBIiwKLSJMLiBjICM3RTdFOTY5NkM3QzciLAotIlAuIGMgIzgzODM5QjlCQ0RDRCIsCi0iSS4gYyAjODM4MzlCOUJDQ0NDIiwKLSJVLiBjICM4Njg2OUU5RUNGQ0YiLAotIlkuIGMgIzg4ODhBMUExRDFEMSIsCi0iVC4gYyAjOEE4QUEyQTJEM0QzIiwKLSJSLiBjICM4OTg5QTFBMUQxRDEiLAotIkUuIGMgIzhCOEJBM0EzRDNEMyIsCi0iVy4gYyBncmF5MTAwIiwKLSJRLiBjIGJsYWNrIiwKLSIhLiBjIGJsYWNrIiwKLSJ+LiBjIGJsYWNrIiwKLSJeLiBjIGJsYWNrIiwKLSIvLiBjIGJsYWNrIiwKLSIoLiBjIGJsYWNrIiwKLSIpLiBjIGJsYWNrIiwKLSJfLiBjIGJsYWNrIiwKLSJgLiBjIGJsYWNrIiwKLSInLiBjIGJsYWNrIiwKLSJdLiBjIGJsYWNrIiwKLSJbLiBjIGJsYWNrIiwKLSJ7LiBjIGJsYWNrIiwKLSJ9LiBjIGJsYWNrIiwKLSJ8LiBjIGJsYWNrIiwKLSIgWCBjIGJsYWNrIiwKLSIuWCBjIGJsYWNrIiwKLSJYWCBjIGJsYWNrIiwKLSJvWCBjIGJsYWNrIiwKLSJPWCBjIGJsYWNrIiwKLSIrWCBjIGJsYWNrIiwKLSJAWCBjIGJsYWNrIiwKLSIjWCBjIGJsYWNrIiwKLSIkWCBjIGJsYWNrIiwKLSIlWCBjIGJsYWNrIiwKLSImWCBjIGJsYWNrIiwKLSIqWCBjIGJsYWNrIiwKLSI9WCBjIGJsYWNrIiwKLSItWCBjIGJsYWNrIiwKLSI7WCBjIGJsYWNrIiwKLSI6WCBjIGJsYWNrIiwKLSI+WCBjIGJsYWNrIiwKLSIsWCBjIGJsYWNrIiwKLSI8WCBjIGJsYWNrIiwKLSIxWCBjIGJsYWNrIiwKLSIyWCBjIGJsYWNrIiwKLSIzWCBjIGJsYWNrIiwKLSI0WCBjIGJsYWNrIiwKLSI1WCBjIGJsYWNrIiwKLSI2WCBjIGJsYWNrIiwKLSI3WCBjIGJsYWNrIiwKLSI4WCBjIGJsYWNrIiwKLSI5WCBjIGJsYWNrIiwKLSIwWCBjIGJsYWNrIiwKLSJxWCBjIGJsYWNrIiwKLSJ3WCBjIGJsYWNrIiwKLSJlWCBjIGJsYWNrIiwKLSJyWCBjIGJsYWNrIiwKLSJ0WCBjIGJsYWNrIiwKLSJ5WCBjIGJsYWNrIiwKLSJ1WCBjIGJsYWNrIiwKLSJpWCBjIGJsYWNrIiwKLSJwWCBjIGJsYWNrIiwKLSJhWCBjIGJsYWNrIiwKLSJzWCBjIGJsYWNrIiwKLSJkWCBjIGJsYWNrIiwKLSJmWCBjIGJsYWNrIiwKLSJnWCBjIGJsYWNrIiwKLSJoWCBjIGJsYWNrIiwKLSJqWCBjIGJsYWNrIiwKLSJrWCBjIGJsYWNrIiwKLSJsWCBjIGJsYWNrIiwKLSJ6WCBjIGJsYWNrIiwKLSJ4WCBjIGJsYWNrIiwKLSJjWCBjIGJsYWNrIiwKLSJ2WCBjIGJsYWNrIiwKLSJiWCBjIGJsYWNrIiwKLSJuWCBjIGJsYWNrIiwKLSJtWCBjIGJsYWNrIiwKLSJNWCBjIGJsYWNrIiwKLSJOWCBjIGJsYWNrIiwKLSJCWCBjIGJsYWNrIiwKLSJWWCBjIGJsYWNrIiwKLSJDWCBjIGJsYWNrIiwKLSJaWCBjIGJsYWNrIiwKLSJBWCBjIGJsYWNrIiwKLSJTWCBjIGJsYWNrIiwKLSJEWCBjIGJsYWNrIiwKLSJGWCBjIGJsYWNrIiwKLSJHWCBjIGJsYWNrIiwKLSJIWCBjIGJsYWNrIiwKLSJKWCBjIGJsYWNrIiwKLSJLWCBjIGJsYWNrIiwKLSJMWCBjIGJsYWNrIiwKLSJQWCBjIGJsYWNrIiwKLSJJWCBjIGJsYWNrIiwKLSJVWCBjIGJsYWNrIiwKLSJZWCBjIE5vbmUiLAotLyogcGl4ZWxzICovCi0iWVhxIHEgcSBxIHEgcSBxIHEgcSBxIHEgcSBxIHEgWVgiLAotInEgZC4tLnkuJS4rLk8uYCAoIEUgUiBVIEQgQyBCIHAuIiwKLSJxIHUuKi4mLiQuIy5dICkgUSBXIFQgRiBMIFYgTSBwLiIsCi0icSA9LnkufSAsICUgOyA4ICEgMS57IFsgUyBaIGIgcC4iLAotInEgQC46Li0gbyA0IDIueC56Liwuai4+Ll8gQSBtIHAuIiwKLSJxICsuOiBYIDwgTS5tLnoubC5qLmcucy5yLksgdiBwLiIsCi0icSAnICQgKyA5IHwgMy5CLm4uTi5iLnYuYy48Lm4gcC4iLAotInEgYCBPIFQuWS5VLlAuSy5MLlMuRy5GLkMuRC5sIHAuIiwKLSJxICggIyBAIEcgay5oLmcuaS50LmUuOS43LjYueiBwLiIsCi0icSAvICogRS5SLlUuSS5LLkouSC5BLlouQy5WLmEgcC4iLAotInEgVCAyICYgNSBmLmEuby5xLjguNy4uLjQuSiB1IHAuIiwKLSJxIEkgWSAxID0gNyA7LncuMC43LjUuIC5IIGYgeSBwLiIsCi0icSBMIEQgUCA2ID4gMyAwIF4gWC5+IEogaSB0IGQgcC4iLAotInEgQyBDIFYgQSBOIE0gbSBuIHAgayBnIHkgciBlIHAuIiwKLSJxIE0gYiBNIG0gbSBjIHggcCBqIGggeSBkIHMgdyBwLiIsCi0iWVhwLnAucC5wLnAucC5wLnAucC5wLnAucC5wLnAuWVgiCi19OwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9zb2xhcmlzL3g4Ni9FY2xpcHNlLmwucG0gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL3NvbGFyaXMveDg2L0VjbGlwc2UubC5wbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1ZDdjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL3NvbGFyaXMveDg2L0VjbGlwc2UubC5wbQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKiBYUE0gKi8KLXN0YXRpYyBjaGFyICpQcm9kdWN0SWNvbjQ4W10gPSB7Ci0vKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqLwotIjQ4IDQ4IDI1NyAyIiwKLSIgICBjIGJsYWNrIiwKLSIuICBjIGdyYXkxMDAiLAotIlggIGMgIzY5Njk1QTVBRThFOCIsCi0ibyAgYyAjNDk0OTQ5NDk5MTkxIiwKLSJPICBjICNDRUNFOTI5MkJGQkYiLAotIisgIGMgI0U3RTdDQUNBRTBFMCIsCi0iQCAgYyAjQzhDODhDOENCQkJCIiwKLSIjICBjICNDMkMyOEE4QUJBQkEiLAotIiQgIGMgI0VBRUFEN0Q3RThFOCIsCi0iJSAgYyAjQ0ZDRkE5QTlDQ0NDIiwKLSImICBjICNEOUQ5QkNCQ0Q4RDgiLAotIiogIGMgI0I2QjY4Nzg3QjlCOSIsCi0iPSAgYyAjQzNDMzk5OTlDN0M3IiwKLSItICBjICNBN0E3N0Q3REI1QjUiLAotIjsgIGMgI0JEQkRBM0EzQ0RDRCIsCi0iOiAgYyAjRDhEOENBQ0FFM0UzIiwKLSI+ICBjICNBOEE4OEQ4REM0QzQiLAotIiwgIGMgIzkyOTI3NTc1QjJCMiIsCi0iPCAgYyAjODc4NzZDNkNBQUFBIiwKLSIxICBjICM5QTlBODM4M0JBQkEiLAotIjIgIGMgIzdCN0I2MzYzQTNBMyIsCi0iMyAgYyAjNjY2NjU0NTQ5NTk1IiwKLSI0ICBjICM3MzczNUY1RkFEQUQiLAotIjUgIGMgIzYyNjI1MTUxOTI5MiIsCi0iNiAgYyAjN0Y3RjcyNzJBN0E3IiwKLSI3ICBjICM2RDZENUU1RTlFOUUiLAotIjggIGMgIzY0NjQ1NDU0QTlBOSIsCi0iOSAgYyAjNzc3NzY5NjlCMUIxIiwKLSIwICBjICM0OTQ5M0UzRTgyODIiLAotInEgIGMgIzdEN0Q3MzczQjZCNiIsCi0idyAgYyAjNUI1QjRFNEVBREFEIiwKLSJlICBjICM1NTU1NDk0OUJBQkEiLAotInIgIGMgIzU2NTY0OTQ5QkFCQSIsCi0idCAgYyAjNTY1NjRBNEFCQUJBIiwKLSJ5ICBjICM1NjU2NDk0OUI5QjkiLAotInUgIGMgIzU1NTU0OTQ5QjhCOCIsCi0iaSAgYyAjNEY0RjQ0NDRBQ0FDIiwKLSJwICBjICM1MzUzNDg0OEI0QjQiLAotImEgIGMgIzUzNTM0ODQ4QjNCMyIsCi0icyAgYyAjNTQ1NDQ5NDlCNUI1IiwKLSJkICBjICM1MjUyNDc0N0IwQjAiLAotImYgIGMgIzUyNTI0NzQ3QUZBRiIsCi0iZyAgYyAjNTQ1NDQ5NDlCM0IzIiwKLSJoICBjICNERURFRENEQ0VFRUUiLAotImogIGMgIzNFM0UzNjM2OTg5OCIsCi0iayAgYyAjNDM0MzNCM0I5RjlGIiwKLSJsICBjICMzMzMzMkMyQzc3NzciLAotInogIGMgIzQyNDIzQTNBOUM5QyIsCi0ieCAgYyAjNEE0QTQwNDBBOEE4IiwKLSJjICBjICM1NTU1NEE0QUJBQkEiLAotInYgIGMgIzU1NTU0QTRBQjlCOSIsCi0iYiAgYyAjNTQ1NDQ5NDlCN0I3IiwKLSJuICBjICM1MjUyNDg0OEIxQjEiLAotIm0gIGMgIzUxNTE0NzQ3QUVBRSIsCi0iTSAgYyAjNEU0RTQ1NDVBOUE5IiwKLSJOICBjICM0OTQ5NDE0MUEwQTAiLAotIkIgIGMgIzUyNTI0ODQ4QUZBRiIsCi0iViAgYyAjNTE1MTQ4NDhBRUFFIiwKLSJDICBjICM1MDUwNDc0N0FDQUMiLAotIlogIGMgIzRGNEY0NjQ2QUFBQSIsCi0iQSAgYyAjNTE1MTQ4NDhBREFEIiwKLSJTICBjICM1MDUwNDc0N0FCQUIiLAotIkQgIGMgIzUwNTA0ODQ4QUNBQyIsCi0iRiAgYyAjNTA1MDQ3NDdBOUE5IiwKLSJHICBjICM0RTRFNDY0NkE3QTciLAotIkggIGMgIzRFNEU0NTQ1QTRBNCIsCi0iSiAgYyAjNEQ0RDQ1NDVBNEE0IiwKLSJLICBjICM0RjRGNDc0N0E4QTgiLAotIkwgIGMgIzRFNEU0NjQ2QTVBNSIsCi0iUCAgYyAjNEQ0RDQ1NDVBM0EzIiwKLSJJICBjICMzQjNCMzUzNTdEN0QiLAotIlUgIGMgIzRFNEU0NjQ2QTNBMyIsCi0iWSAgYyAjNTU1NTRENEQ5RjlGIiwKLSJUICBjICM0QTRBNDM0Mzg5ODkiLAotIlIgIGMgIzUxNTE0QjRCOTA5MCIsCi0iRSAgYyAjNjc2NzYwNjBBNUE1IiwKLSJXICBjICMxRDFEMTgxODZBNkEiLAotIlEgIGMgIzI3MjcyMjIyN0Q3RCIsCi0iISAgYyAjMjgyODIzMjM3RDdEIiwKLSJ+ICBjICMyQjJCMjYyNjgxODEiLAotIl4gIGMgIzMzMzMyQzJDODk4OSIsCi0iLyAgYyAjM0IzQjM2MzY4RThFIiwKLSIoICBjICM0NTQ1NDA0MDk3OTciLAotIikgIGMgIzRENEQ0NjQ2QTRBNCIsCi0iXyAgYyAjNEM0QzQ1NDVBMUExIiwKLSJgICBjICM0RDRENDY0NkEyQTIiLAotIicgIGMgIzRCNEI0NTQ1QTBBMCIsCi0iXSAgYyAjNEQ0RDQ2NDZBMUExIiwKLSJbICBjICM0QzRDNDU0NTlGOUYiLAotInsgIGMgIzRCNEI0NTQ1OUU5RSIsCi0ifSAgYyAjNEE0QTQ0NDQ5QzlDIiwKLSJ8ICBjICM0OTQ5NDQ0NDk4OTgiLAotIiAuIGMgIzQ4NDg0MzQzOTY5NiIsCi0iLi4gYyAjNEE0QTQ1NDU5OTk5IiwKLSJYLiBjICM0RjRGNEE0QUEwQTAiLAotIm8uIGMgIzY4Njg2MzYzQUFBQSIsCi0iTy4gYyAjMjEyMTFEMUQ3Njc2IiwKLSIrLiBjICMyNDI0MjAyMDc1NzUiLAotIkAuIGMgIzJEMkQyQTJBN0Y3RiIsCi0iIy4gYyAjMkQyRDJBMkE3QjdCIiwKLSIkLiBjICMzRDNEMzkzOThGOEYiLAotIiUuIGMgIzQ4NDg0NDQ0OTY5NiIsCi0iJi4gYyAjNDc0NzQzNDM5MzkzIiwKLSIqLiBjICM0NjQ2NDM0MzkxOTEiLAotIj0uIGMgIzQ1NDU0MjQyOEU4RSIsCi0iLS4gYyAjNEQ0RDRBNEE5QzlDIiwKLSI7LiBjICM1NzU3NTQ1NEEzQTMiLAotIjouIGMgIzVBNUE1ODU4OTc5NyIsCi0iPi4gYyAjNUY1RjVENUQ5OTk5IiwKLSIsLiBjICM4NTg1ODI4MkMxQzEiLAotIjwuIGMgIzk1OTU5MjkyQzlDOSIsCi0iMS4gYyAjQjhCOEI2QjZEQ0RDIiwKLSIyLiBjICMwNzA3MDUwNTUzNTMiLAotIjMuIGMgIzA4MDgwNzA3NTU1NSIsCi0iNC4gYyAjMEEwQTA5MDk1NzU3IiwKLSI1LiBjICMwQzBDMEIwQjU4NTgiLAotIjYuIGMgIzBGMEYwRDBENUM1QyIsCi0iNy4gYyAjMTAxMDBGMEY1QzVDIiwKLSI4LiBjICMxMzEzMTExMTY0NjQiLAotIjkuIGMgIzE0MTQxMzEzNjA2MCIsCi0iMC4gYyAjMTQxNDEzMTM1RjVGIiwKLSJxLiBjICMxNzE3MTUxNTY3NjciLAotIncuIGMgIzE2MTYxNTE1NjI2MiIsCi0iZS4gYyAjMTYxNjE1MTU2MTYxIiwKLSJyLiBjICMxODE4MTcxNzY0NjQiLAotInQuIGMgIzFBMUExOTE5NjY2NiIsCi0ieS4gYyAjMUMxQzFBMUE2NDY0IiwKLSJ1LiBjICMxRDFEMUMxQzY4NjgiLAotImkuIGMgIzFGMUYxRTFFNkE2QSIsCi0icC4gYyAjMjIyMjIxMjE2QzZDIiwKLSJhLiBjICMyNDI0MjMyMzZGNkYiLAotInMuIGMgIzI3MjcyNTI1NzE3MSIsCi0iZC4gYyAjMjcyNzI2MjY3MjcyIiwKLSJmLiBjICMyNzI3MjYyNjcxNzEiLAotImcuIGMgIzI5MjkyODI4NzQ3NCIsCi0iaC4gYyAjMkEyQTI5Mjk3NDc0IiwKLSJqLiBjICMyQzJDMkIyQjc3NzciLAotImsuIGMgIzJGMkYyRTJFN0M3QyIsCi0ibC4gYyAjMkUyRTJEMkQ3OTc5IiwKLSJ6LiBjICMzNDM0MzMzMzdFN0UiLAotInguIGMgIzM5MzkzNzM3ODY4NiIsCi0iYy4gYyAjMzczNzM2MzY4MTgxIiwKLSJ2LiBjICMzQTNBMzkzOTg0ODQiLAotImIuIGMgIzNBM0EzOTM5ODM4MyIsCi0ibi4gYyAjM0QzRDNCM0I4Njg2IiwKLSJtLiBjICM0MjQyNDE0MThDOEMiLAotIk0uIGMgIzQyNDI0MTQxOEI4QiIsCi0iTi4gYyAjNDQ0NDQyNDI4QjhCIiwKLSJCLiBjICM0MzQzNDE0MTg5ODkiLAotIlYuIGMgIzQ1NDU0NDQ0OEU4RSIsCi0iQy4gYyAjNDU0NTQ0NDQ4RDhEIiwKLSJaLiBjICM0MjQyNDE0MTg3ODciLAotIkEuIGMgIzQzNDM0MjQyODg4OCIsCi0iUy4gYyAjNDQ0NDQyNDI4Nzg3IiwKLSJELiBjICM0MjQyNDE0MTg1ODUiLAotIkYuIGMgIzQxNDE0MDQwODM4MyIsCi0iRy4gYyAjNDg0ODQ3NDc5MDkwIiwKLSJILiBjICM0MzQzNDI0Mjg2ODYiLAotIkouIGMgIzRBNEE0OTQ5OTM5MyIsCi0iSy4gYyAjNDY0NjQ1NDU4QThBIiwKLSJMLiBjICM0RDRENEM0Qzk1OTUiLAotIlAuIGMgIzU0NTQ1MjUyQTBBMCIsCi0iSS4gYyAjNTA1MDRGNEY5ODk4IiwKLSJVLiBjICM1ODU4NTc1N0EwQTAiLAotIlkuIGMgIzUyNTI1MDUwOTM5MyIsCi0iVC4gYyAjNUI1QjU5NTlBMkEyIiwKLSJSLiBjICM1ODU4NTc1NzlGOUYiLAotIkUuIGMgIzYyNjI2MTYxQTlBOSIsCi0iVy4gYyAjNjQ2NDYzNjNBQ0FDIiwKLSJRLiBjICM2QjZCNkE2QUIyQjIiLAotIiEuIGMgIzZCNkI2QTZBQjFCMSIsCi0ifi4gYyAjNzU3NTc0NzRCOEI4IiwKLSJeLiBjICM3RjdGN0Q3REJEQkQiLAotIi8uIGMgIzlDOUM5QjlCQ0ZDRiIsCi0iKC4gYyAjMEIwQjBCMEI1ODU4IiwKLSIpLiBjICMwRDBEMEQwRDVBNUEiLAotIl8uIGMgIzExMTExMTExNUU1RSIsCi0iYC4gYyAjMTMxMzEzMTM2MDYwIiwKLSInLiBjICMyMTIxMjEyMTZENkQiLAotIl0uIGMgIzI0MjQyNDI0NkY2RiIsCi0iWy4gYyAjMkIyQjJDMkM3Nzc3IiwKLSJ7LiBjICMyQjJCMkIyQjc3NzciLAotIn0uIGMgIzJDMkMyQzJDNzc3NyIsCi0ifC4gYyAjMkUyRTJFMkU3OTc5IiwKLSIgWCBjICMzMTMxMzEzMTdDN0MiLAotIi5YIGMgIzMxMzEzMTMxN0I3QiIsCi0iWFggYyAjMzQzNDM0MzQ3RTdFIiwKLSJvWCBjICMzQzNDM0MzQzg2ODYiLAotIk9YIGMgIzNGM0YzRjNGODk4OSIsCi0iK1ggYyAjNDE0MTQyNDI4QjhCIiwKLSJAWCBjICM0MjQyNDI0MjhCOEIiLAotIiNYIGMgIzQ3NDc0NzQ3OTA5MCIsCi0iJFggYyAjNDE0MTQxNDE4NDg0IiwKLSIlWCBjICM0MDQwNDA0MDgxODEiLAotIiZYIGMgIzRBNEE0QTRBOTQ5NCIsCi0iKlggYyAjNEE0QTRBNEE5MzkzIiwKLSI9WCBjICM0RDRENEQ0RDk2OTYiLAotIi1YIGMgIzRGNEY0RjRGOTg5OCIsCi0iO1ggYyAjNTA1MDUwNTA5ODk4IiwKLSI6WCBjICM1MjUyNTI1MjlCOUIiLAotIj5YIGMgIzU1NTU1NTU1OUU5RSIsCi0iLFggYyAjNTU1NTU1NTU5RDlEIiwKLSI8WCBjICM1NzU3NTg1OEEwQTAiLAotIjFYIGMgIzU4NTg1ODU4QTBBMCIsCi0iMlggYyAjNTc1NzU4NTg5RjlGIiwKLSIzWCBjICM1NzU3NTc1NzlGOUYiLAotIjRYIGMgIzVBNUE1QTVBQTJBMiIsCi0iNVggYyAjNUQ1RDVENURBNUE1IiwKLSI2WCBjICM1RjVGNUY1RkE3QTciLAotIjdYIGMgIzYxNjE2MjYyQUFBQSIsCi0iOFggYyAjNjE2MTYxNjFBOUE5IiwKLSI5WCBjICM2MTYxNjI2MkE5QTkiLAotIjBYIGMgIzYyNjI2MjYyQUFBQSIsCi0icVggYyAjNjQ2NDY0NjRBQ0FDIiwKLSJ3WCBjICM2MjYyNjI2MkE5QTkiLAotImVYIGMgIzY0NjQ2NDY0QUJBQiIsCi0iclggYyAjNjY2NjY2NjZBRUFFIiwKLSJ0WCBjICM2NjY2NjY2NkFEQUQiLAotInlYIGMgIzY4Njg2ODY4QjBCMCIsCi0idVggYyAjNjk2OTY5NjlBRkFGIiwKLSJpWCBjICM2RDZENkQ2REI0QjQiLAotInBYIGMgIzZGNkY2RjZGQjVCNSIsCi0iYVggYyAjNzM3MzczNzNCQUJBIiwKLSJzWCBjICM3MTcxNzE3MUI3QjciLAotImRYIGMgIzc2NzY3Njc2QkNCQyIsCi0iZlggYyAjNzk3OTc5NzlCRkJGIiwKLSJnWCBjICM3Nzc3Nzc3N0I5QjkiLAotImhYIGMgIzgwODA4MDgwQzFDMSIsCi0ialggYyAjOEM4QzhDOENDNUM1IiwKLSJrWCBjICM5MDkwOTA5MEM5QzkiLAotImxYIGMgIzk4OTg5ODk4Q0JDQiIsCi0ielggYyAjQTBBMEEwQTBDRkNGIiwKLSJ4WCBjICNBNUE1QTVBNUQzRDMiLAotImNYIGMgI0FCQUJBQkFCRDZENiIsCi0idlggYyAjQzRDNEM0QzRFM0UzIiwKLSJiWCBjICNEMUQxRDFEMUU5RTkiLAotIm5YIGMgI0U1RTVFNUU1RjNGMyIsCi0ibVggYyAjOUY5RkEwQTBEMUQxIiwKLSJNWCBjICNCNkI2QzVDNUU1RTUiLAotIk5YIGMgIzhFOEVBNkE2RDZENiIsCi0iQlggYyAjOTA5MEE3QTdEN0Q3IiwKLSJWWCBjICM5MTkxQTlBOUQ3RDciLAotIkNYIGMgIzk1OTVBQkFCRDhEOCIsCi0iWlggYyAjOTk5OUFGQUZEQURBIiwKLSJBWCBjICM5RDlEQjJCMkRDREMiLAotIlNYIGMgI0ExQTFCNUI1RERERCIsCi0iRFggYyAjQTVBNUI4QjhERURFIiwKLSJGWCBjICNBOUE5QkJCQkUwRTAiLAotIkdYIGMgI0FDQUNCREJERTFFMSIsCi0iSFggYyAjQjBCMEMxQzFFM0UzIiwKLSJKWCBjICNCNEI0QzRDNEU0RTQiLAotIktYIGMgI0I4QjhDN0M3RTVFNSIsCi0iTFggYyAjQkJCQkM5QzlFNkU2IiwKLSJQWCBjICNBRUFFQzBDMEUyRTIiLAotIklYIGMgI0IyQjJDM0MzRTNFMyIsCi0iVVggYyBncmF5MTAwIiwKLSJZWCBjIE5vbmUiLAotLyogcGl4ZWxzICovCi0iWVhYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFlYIiwKLSJYICVYJVglWEYuRi5GLkYuJFhELlouWi5aLkIuQi5CLk4uTi49Lj0uPS4qLiouKi4mLiYuIC4gLnwgLi4uLn0gfSB7IHsgXyBfIFAgUCBIIEcgRyBHIEsgUyBTIEMgbyAiLAotIlggJVglWCVYJVhGLkYuJFhELkQuWi5aLkIuQS5CLk4uTi5OLj0uPS49LiouKi4mLiYuJS4lLiUufCB8IC4ufSB7IHsgWyBfIF8gYCBVIEogTCBHIEsgRiBaIFMgQyBvICIsCi0iWCAlWCVYJVglWEYuRi5GLkQuRC5ILlouWi5BLkIuTi5OLk4uQy49Lj0uKi4qLiYuJi4gLiAuJS58IHwgLi59IH0geyBbIFsgXyBQIFAgSCBHIEcgSyBGIFMgUyBDIG8gIiwKLSJYICVYRi4lWEYuRi4kWEYuJFhaLlouWi5CLkEuSy5ZLjcgLCAtIC0gMSAxIF4uXi5+LmFYfi5xIDkgNlhZIHsgfSB7ICcgXyBdIFAgUCBIIEwgRyBLIEYgWiBTIEMgbyAiLAotIlggJVhGLkYuRi5GLkYuRC5ELlouWi5aLksuOi4xIDsgJSA7IDwuaFhmWGZYZFhhWGFYc1hwWGlYIS55WHJYby47LlguWyBfIF8gYCBIIEggRyBLIEsgRiBTIFMgQyBvICIsCi0iWCBGLkYuRi5GLkYuRC5ELkQuWi5ILlkuMSAmICYgMS5jWG1YLy5rWGZYZFhhWGFYc1hwWGlYUS55WHRYZVhFLjZYNVhQLlguXyBgIEogTCBHIEcgSyBGIFogUyBDIG8gIiwKLSJYIEQuJFhGLiRYRC5ELlouWi5TLj4uJSArIDogdlgxLjEuY1htWC8uZFhhWGFYc1hwWGlYUS51WHJYcVg4WDZYNVhULlIuUC5YLlAgKSBIIEcgSyBLIFMgUyBTIG0gbyAiLAotIlggRC4kWEQuRC5ELkQuRC5TLjYgJiAkIGggYlh2WHZYMS54WC8ua1hmWGFYc1hwWGlYUS55WHJYVy5FLjZYNVg0WFUuLFg6WEkuLS5gIEwgRyBHIEsgRiBaIEMgQyBvICIsCi0iWCBELkQuRC5ELkQuWi5ILjYgJiAkIGggaCBoIGJYdlgxLmNYbVhrWCwuZFhwWGlYUS55WHRYcVh3WDZYNVhULlUuLFg6WEkuPVgqWC4uYCBHIEsgSyBaIFMgUyBtIG8gIiwKLSJYIFouRC5aLkguWi5aLjcgJiAkIGggaCBuWGggYlh2WDEuY1htWGtYLC5nWGlYUS51WHJYVy5FLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi4gLlAgRyBGIFMgUyBDIG0gbyAiLAotIlggWi5aLlouSC5aLlIgJSArIDogYlhoIGggaCBiWHZYMS5jWC8ua1hoWH4uUS55WHJYcVg5WDZYNVg0WDJYLFg6WDtYPVgqWCNYVi5NLk9YKCBLIFogUyBTIEMgbSBvICIsCi0iWCBaLlouWi5BLkEuKiAmICYgdlh2WGJYYlhiWHZYdlgxLnhYbFhqWF4ucFh1WHJYZVh3WDZYNVg0WFUuLFg6WC1YTC4qWEcuVi5AWE9Yb1hiLiggWiBTIEMgQyBWIG8gIiwKLSJYIEIuQi5CLkEuMiAlICUgMS4xLnZYdlh2WHZYdlgxLmNYelg8LiwuZ1hpWHJYVy5FLjZYNVg0WFUuLFg6WEkuPVgqWCNYVi5AWE9Ybi5iLmMueC5OIFMgUyBDIG0gbyAiLAotIlggQi5CLkIuUy4qICUgOyB4WDEuMS4xLjEuMS5jWGNYelhsWGpYXi5wWHJYZVg3WDZYNVg0WFIuLFg6WC1YTC5KLiNYVi5AWE9Ybi5iLmMuWFggWCQuUyBDIEMgbSBvICIsCi0iWCBOLk4uTi4yIE8gPSAvLm1YeFhjWGNYY1hjWHhYelhsWGpYaFh+LnVYZVhFLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi5NLk9Ybi52LmMuei4gWHwuay5OIEQgViBmIG8gIiwKLSJYIE4uTi5OLi0gQCA+IGtYPC4vLi8ubVh6WHpYbFg8LmpYaFhnWHVYZVhFLjZYNVg0WDFYLFg6WEkuTC4qWCNYVi5tLk9Ybi5iLmMuei4gWGwuai5nLi8gQyBtIFYgbyAiLAotIlggTi5OLlIgQCAjICwuLC5qWGtYa1g8LmtYa1hqWCwuXi5+LnVYd1hFLjZYNVg0WDFYLFg6WEkuPVhKLiNYQy5NLk9Ybi52LmMuei4uWHwuai5nLmQuIy5NIG0gQiBvICIsCi0iWCA9Lk0uPCBAICogZlhmWGhYaFgsLiwuLC5oWF4uZ1hwWHVYcVg5WDZYNVg0WFUuLFg6WEkuTC4qWEcuVi4rWE9Ybi5iLmMuei4uWHwuWy5nLmQuYS5wLnogViBCIG8gIiwKLSJYID0uTi4tIEAgTlhOWEJYQlhCWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYRlhHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhCIGQgbyAiLAotIlggPS49LiogQCAxIGRYZFhhWGFYc1hwWGlYIS55WHJYZVh3WDZYNVg0WDxYLFg6WEkuPVgqWEcuVi5NLk9Ybi52LmMuWFguWHwuai5nLmQuYS5wLmkudS5ALmYgZCBvICIsCi0iWCAqLj0uIyBAIF4uZFhhWGFYc1hwWGlYUS55WHJYZVh3WDZYNVhULlUuLFg6WC1YTC4mWEcuQy5tLk9Yb1h2LmMuei4uWHwuai5nLmYuYS5wLmkudS50LisuZCBkIG8gIiwKLSJYICouKi5AIEAgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSlhKWEpYTVhLWEtYS1hMWExYTFhkIG4gbyAiLAotIlggJi4qLkAgQCBkWGFYc1hwWGlYUS55WHRYZVhFLjZYNVg0WFUuPlg6WEkuTC4qWEcuVi5tLk9Yb1h2LmMuei4gWHwuai5nLmQuYS4nLmkudS50LnIudy45LmQgbiBvICIsCi0iWCAmLiYuQCBAIH4uc1hwWGlYUS55WHRYVy5FLjZYNVg0WDFYLFg6WEkuPVgqWCNYQy5tLk9Ybi5iLmMuei4gWHwuWy5nLmYuYS5wLmkudS50LnIudy45LjAubiBhIG8gIiwKLSJYICYuJi5AIEAgTlhOWEJYQlhWWFZYVlhDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWElYSVhKWE1YTVhLWEtYS1hMWExYTFhuIG4gbyAiLAotIlggJS4gLiMgQCBxIGlYUS55WHJYVy4wWDZYNVg0WFUuPlg6WEkuTC4qWCNYVi5AWE9Ybi5iLmMuWFguWHwuey5nLmYuXS4nLmkudS50LnIudy4wLl8uNy5XIG4gYSBvICIsCi0iWCAlLiAuKiAjICwgUS55WHRYZVg3WDZYNVg0WFUuLFg6WC1YTC4qWCNYVi5AWE9Ybi5iLmMuWFggWGwuey5nLmQuYS5wLmkudS50LnIuZS4wLl8uNy4pLisuYSBhIG8gIiwKLSJYIHwgfCAtICMgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhBWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhhIGEgbyAiLAotIlggfCB8IDwgIyAtIHJYZVg5WDZYNVg0WFUuLFg6WC1YTC4qWCNYQy5AWE9Yb1hiLmMuei4gWHwuai5oLnMuYS4nLmkudS50LnIudy45Ll8uNy4pLjUuNC5qIGEgcCBvICIsCi0iWCB8IH0gWSAjICogOSA4WDZYNVg0WDNYLFg6WEkuPVgqWEcuVi5AWE9Ybi52LmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC5xLmkgZyBwIG8gIiwKLSJYIH0gfSB8IC0gIyAsIDZYNVg0WFIuLFg6WEkuPVgqWEcuVi5tLk9Yb1hiLmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLn4gYSBzIHMgbyAiLAotIlggfSB9IH0gNCAjIC0gRSA0WFUuPlg6WC1YPVhKLiNYVi5NLk9Yb1hiLmMuWFggWHwuey5oLmQuYS4nLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLjYueiBwIHMgcyBvICIsCi0iWCB7IHsgfSB9IC0gIyA8IFUuLFg6WEkuPVgqWEcuVi4rWE9Yb1hiLmMuei4gWHwufS5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuISBnIHAgcyBzIG8gIiwKLSJYIFsgeyAnIFsgNCAqIC0gRSA6WDtYTC5KLiNYVi5tLk9Yb1hiLmMuei4uWHwuai5oLmYuYS4nLmkudS50LnIudy45Ll8uNi4pLiguNC4zLjIuOC5rIHAgcyBzIHMgbyAiLAotIlggWyBbICcgXyBbICwgKiAsIDtYTC5KLiNYVi5AWE9Yb1h2LmMuei4uWHwuey5nLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5eIHMgcCBzIHMgcyBvICIsCi0iWCBfIF8gXyBfIFAgXSAtICogMiAqWCNYVi5tLk9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5RIHAgcyBzIHMgYiB1IG8gIiwKLSJYIGAgYCBgIGAgYCBgIDggLSAtIDcgVi5AWE9Yb1h2LmMuWFguWHwuai5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcCBzIHMgcyB1IHUgbyAiLAotIlggUCBQICkgUCBVIFUgKSA4IC0gLSA3IE9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcyBzIHMgcyBiIHUgdSBvICIsCi0iWCBMIEwgKSBIICkgTCBMIEwgOCAxIC0gNyBiLmMuei4gWHwuai5oLmYuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5RIHggcCBzIHMgcyBiIGIgdSBlIG8gIiwKLSJYIEwgRyBMIEcgRyBHIEcgRyBHIEcgLCAqIDIgVCAuWGwuai5oLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC4zLjIuOC5eIHAgcCBzIHMgcyBzIHUgdSBlIGUgbyAiLAotIlggRyBHIEcgRyBHIEcgRyBLIEsgTSBNIDQgLCAsIDMgSSBnLmQuYS5wLmkudS50LnIuZS5gLl8uNy4pLjUuNC4zLjcuISBrIHAgcyBwIHMgcyBzIHUgdSB1IGUgdiBvICIsCi0iWCBLIEcgSyBLIEsgSyBLIEsgWiBaIE0gRiBGIDQgLCA8IDMgSSBwLmkudS50LnIudy45Ll8uNy4pLjUuNC5XIH4geiBhIHAgcCBzIHMgYiBzIHUgdSB1IGUgZSBlIG8gIiwKLSJYIEYgWiBGIEYgRiBGIFogWiBGIEYgUyBTIFMgUyBTIHcgOSA8IDIgNSAwIGwgcC5lLjkueS5hLmwgXiBqIGkgYSBwIHAgcCBzIHMgYiBiIGIgdSBlIHYgeSByIGUgbyAiLAotIlggUyBaIFogUyBaIFMgWiBTIFMgUyBTIFMgQyBDIEMgQSBtIGQgViBmIG0gQiBtIEIgZCBkIG4gZCBhIGEgYSBwIHMgcCBzIHMgYiB1IHUgdSB1IGUgdiBlIHIgdCBvICIsCi0iWCBTIFMgUyBTIFMgUyBTIFMgUyBTIEMgQyBDIG0gbSBBIFYgViBCIEIgQiBkIGQgZCBuIG4gYSBhIGEgcCBwIHMgcCBzIHMgYiB1IHUgdSBlIGUgZSBjIHQgciB0IG8gIiwKLSJYIEMgQyBDIEMgQyBDIEMgQyBtIEMgQSBtIEEgbSBmIFYgZiBmIEIgZCBkIGQgbiBuIG4gYSBhIGEgYSBzIHMgcyBzIHMgdSBiIHUgdSB1IHUgdiB0IHQgciB0IHQgbyAiLAotIllYbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBZWCIKLX07CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL3NvbGFyaXMveDg2L0VjbGlwc2UubS5wbSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9ndGsvc29sYXJpcy94ODYvRWNsaXBzZS5tLnBtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRhYTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9ndGsvc29sYXJpcy94ODYvRWNsaXBzZS5tLnBtCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qIFhQTSAqLwotc3RhdGljIGNoYXIgKlByb2R1Y3RJY29uMzJbXSA9IHsKLS8qIGNvbHVtbnMgcm93cyBjb2xvcnMgY2hhcnMtcGVyLXBpeGVsICovCi0iMzIgMzIgMjU3IDIiLAotIiAgIGMgYmxhY2siLAotIi4gIGMgZ3JheTEwMCIsCi0iWCAgYyAjNjk2OTVBNUFFOEU4IiwKLSJvICBjICM0OTQ5NDk0OTkxOTEiLAotIk8gIGMgI0U4RThDQkNCRTBFMCIsCi0iKyAgYyAjREREREIzQjNEMkQyIiwKLSJAICBjICNGMEYwREREREVCRUIiLAotIiMgIGMgI0NEQ0Q5MTkxQkVCRSIsCi0iJCAgYyAjQzhDODhCOEJCQkJCIiwKLSIlICBjICNDQUNBOTg5OEMyQzIiLAotIiYgIGMgI0MzQzM4QThBQkJCQiIsCi0iKiAgYyAjQkFCQTg3ODdCOUI5IiwKLSI9ICBjICNEQ0RDQzRDNERFREUiLAotIi0gIGMgI0M1QzVBM0EzQ0FDQSIsCi0iOyAgYyAjQURBRDgxODFCOEI4IiwKLSI6ICBjICNBM0EzN0E3QUI1QjUiLAotIj4gIGMgI0UyRTJENkQ2RTlFOSIsCi0iLCAgYyAjQjNCMzlBOUFDNEM0IiwKLSI8ICBjICNFQkVCRTNFM0YwRjAiLAotIjEgIGMgI0M5QzlCNkI2RDZENiIsCi0iMiAgYyAjOTY5Njc2NzZCOEI4IiwKLSIzICBjICM4QzhDNzE3MUFCQUIiLAotIjQgIGMgI0E0QTQ5MjkyQkVCRSIsCi0iNSAgYyAjN0Q3RDY1NjVBNkE2IiwKLSI2ICBjICM4MzgzNkQ2REFCQUIiLAotIjcgIGMgIzlBOUE4Nzg3QzJDMiIsCi0iOCAgYyAjN0I3QjY0NjRCN0I3IiwKLSI5ICBjICM1RTVFNTA1MDkxOTEiLAotIjAgIGMgIzY0NjQ1NzU3OUE5QSIsCi0icSAgYyAjODU4NTdCN0JCRUJFIiwKLSJ3ICBjICM3QzdDNzM3M0I2QjYiLAotImUgIGMgIzYyNjI1MzUzRDVENSIsCi0iciAgYyAjNjE2MTUzNTNENEQ0IiwKLSJ0ICBjICM2MDYwNTI1MkQxRDEiLAotInkgIGMgIzVGNUY1MjUyRDBEMCIsCi0idSAgYyAjNUY1RjUxNTFDRkNGIiwKLSJpICBjICM2MDYwNTM1M0QyRDIiLAotInAgIGMgIzVGNUY1MjUyQ0ZDRiIsCi0iYSAgYyAjNUU1RTUxNTFDRENEIiwKLSJzICBjICM1QzVDNEY0RkM3QzciLAotImQgIGMgIzVGNUY1MjUyQ0RDRCIsCi0iZiAgYyAjNUU1RTUxNTFDQkNCIiwKLSJnICBjICM1QjVCNEY0RkM0QzQiLAotImggIGMgIzVBNUE0RTRFQzFDMSIsCi0iaiAgYyAjNzE3MTY5NjlCMEIwIiwKLSJrICBjICM0ODQ4M0UzRUFEQUQiLAotImwgIGMgIzVENUQ1MTUxQ0RDRCIsCi0ieiAgYyAjNUM1QzUwNTBDOUM5IiwKLSJ4ICBjICM1RDVENTE1MUNCQ0IiLAotImMgIGMgIzVDNUM1MDUwQzdDNyIsCi0idiAgYyAjNUI1QjRGNEZDNkM2IiwKLSJiICBjICM1QjVCNTA1MEM2QzYiLAotIm4gIGMgIzU5NTk0RTRFQzFDMSIsCi0ibSAgYyAjNTg1ODRENERCRkJGIiwKLSJNICBjICM1OTU5NEY0RkMyQzIiLAotIk4gIGMgIzVBNUE0RjRGQzJDMiIsCi0iQiAgYyAjNTg1ODRENERCQ0JDIiwKLSJWICBjICM1NzU3NEQ0REJDQkMiLAotIkMgIGMgIzU5NTk0RTRFQkVCRSIsCi0iWiAgYyAjNTg1ODRFNEVCREJEIiwKLSJBICBjICM1ODU4NEQ0REJCQkIiLAotIlMgIGMgIzU3NTc0RDREQkFCQSIsCi0iRCAgYyAjNTY1NjRENERCOUI5IiwKLSJGICBjICM1NjU2NEM0Q0I2QjYiLAotIkcgIGMgIzU1NTU0QzRDQjZCNiIsCi0iSCAgYyAjNTQ1NDRCNEJCNEI0IiwKLSJKICBjICM1NDU0NEI0QkIxQjEiLAotIksgIGMgIzUzNTM0QjRCQjFCMSIsCi0iTCAgYyAjNTI1MjRBNEFBRUFFIiwKLSJQICBjICM1MTUxNDk0OUFDQUMiLAotIkkgIGMgIzUxNTE0OTQ5QUJBQiIsCi0iVSAgYyAjNDc0NzQxNDE4Nzg3IiwKLSJZICBjICMzMjMyMkMyQzhGOEYiLAotIlQgIGMgIzJCMkIyNTI1Nzc3NyIsCi0iUiAgYyAjMzYzNjJGMkY5Njk2IiwKLSJFICBjICMyQjJCMjYyNjZFNkUiLAotIlcgIGMgIzRENEQ0NTQ1QUNBQyIsCi0iUSAgYyAjNTU1NTRENERCOEI4IiwKLSIhICBjICM1NDU0NEM0Q0I0QjQiLAotIn4gIGMgIzU0NTQ0QzRDQjNCMyIsCi0iXiAgYyAjNTE1MTRBNEFBQ0FDIiwKLSIvICBjICM1MTUxNEE0QUFCQUIiLAotIiggIGMgIzUwNTA0OTQ5QTlBOSIsCi0iKSAgYyAjNEY0RjQ5NDlBNkE2IiwKLSJfICBjICM0QzRDNDc0N0ExQTEiLAotImAgIGMgIzRFNEU0ODQ4QTNBMyIsCi0iJyAgYyAjNEQ0RDQ4NDhBMUExIiwKLSJdICBjICM0QjRCNDY0NjlDOUMiLAotIlsgIGMgIzRDNEM0NzQ3OUU5RSIsCi0ieyAgYyAjNTE1MTRDNENBNkE2IiwKLSJ9ICBjICNBOUE5QTZBNkQ1RDUiLAotInwgIGMgIzFFMUUxQTFBNjY2NiIsCi0iIC4gYyAjMjkyOTI1MjU4MTgxIiwKLSIuLiBjICMzRDNEMzkzOTkyOTIiLAotIlguIGMgIzRBNEE0NjQ2OUI5QiIsCi0iby4gYyAjNTM1MzRFNEVBQkFCIiwKLSJPLiBjICM0OTQ5NDU0NTk3OTciLAotIisuIGMgIzRBNEE0NjQ2OTk5OSIsCi0iQC4gYyAjNDc0NzQ0NDQ5NDk0IiwKLSIjLiBjICM0ODQ4NDU0NTk0OTQiLAotIiQuIGMgIzQ3NDc0NDQ0OTI5MiIsCi0iJS4gYyAjNDY0NjQzNDM5MDkwIiwKLSImLiBjICM0NjQ2NDI0MjhEOEQiLAotIiouIGMgIzU0NTQ1MDUwQTlBOSIsCi0iPS4gYyAjNDc0NzQ0NDQ4RjhGIiwKLSItLiBjICM0QzRDNDk0OTk5OTkiLAotIjsuIGMgIzU3NTc1NDU0QTZBNiIsCi0iOi4gYyAjNUI1QjU3NTdBQUFBIiwKLSI+LiBjICM1NDU0NTE1MTlCOUIiLAotIiwuIGMgIzVBNUE1NzU3OUM5QyIsCi0iPC4gYyAjNjU2NTYyNjJBN0E3IiwKLSIxLiBjICM2ODY4NjY2NkEyQTIiLAotIjIuIGMgI0NBQ0FDOUM5RTVFNSIsCi0iMy4gYyAjMDUwNTA0MDQ1MTUxIiwKLSI0LiBjICMwODA4MDcwNzU0NTQiLAotIjUuIGMgIzBBMEEwOTA5NTg1OCIsCi0iNi4gYyAjMEMwQzBBMEE1ODU4IiwKLSI3LiBjICMxMDEwMEUwRTYyNjIiLAotIjguIGMgIzBFMEUwRDBENUE1QSIsCi0iOS4gYyAjMTIxMjExMTE1RDVEIiwKLSIwLiBjICMxMzEzMTIxMjVENUQiLAotInEuIGMgIzE2MTYxNTE1NjE2MSIsCi0idy4gYyAjMTcxNzE2MTY2MTYxIiwKLSJlLiBjICMxQTFBMTkxOTY1NjUiLAotInIuIGMgIzIwMjAxRTFFNzA3MCIsCi0idC4gYyAjMUUxRTFEMUQ2OTY5IiwKLSJ5LiBjICMyQTJBMjkyOTc2NzYiLAotInUuIGMgIzJGMkYyRDJENzY3NiIsCi0iaS4gYyAjM0EzQTM5Mzk4Nzg3IiwKLSJwLiBjICMzQTNBMzkzOTgzODMiLAotImEuIGMgIzNGM0YzRTNFODg4OCIsCi0icy4gYyAjNDE0MTQwNDA4OTg5IiwKLSJkLiBjICM0NTQ1NDM0MzhEOEQiLAotImYuIGMgIzQ0NDQ0MjQyOEI4QiIsCi0iZy4gYyAjNDQ0NDQzNDM4QzhDIiwKLSJoLiBjICM0MzQzNDI0MjhBOEEiLAotImouIGMgIzQzNDM0MTQxODg4OCIsCi0iay4gYyAjNDM0MzQyNDI4OTg5IiwKLSJsLiBjICM0MjQyNDE0MTg3ODciLAotInouIGMgIzQzNDM0MjQyODc4NyIsCi0ieC4gYyAjNDI0MjQxNDE4NTg1IiwKLSJjLiBjICM0MTQxM0YzRjgxODEiLAotInYuIGMgIzQxNDE0MDQwODI4MiIsCi0iYi4gYyAjNDg0ODQ2NDY4RDhEIiwKLSJuLiBjICM0OTQ5NDg0ODkwOTAiLAotIm0uIGMgIzRCNEI0QTRBOTE5MSIsCi0iTS4gYyAjNEI0QjQ5NDk4RThFIiwKLSJOLiBjICM1MjUyNTE1MTlBOUEiLAotIkIuIGMgIzUyNTI1MTUxOTk5OSIsCi0iVi4gYyAjNTY1NjU0NTQ5QTlBIiwKLSJDLiBjICM1NDU0NTM1Mzk0OTQiLAotIlouIGMgIzYwNjA1RjVGQTdBNyIsCi0iQS4gYyAjNjQ2NDYzNjNBQkFCIiwKLSJTLiBjICM1QTVBNTk1OTk3OTciLAotIkQuIGMgIzY4Njg2NzY3QURBRCIsCi0iRi4gYyAjNkM2QzZCNkJCMkIyIiwKLSJHLiBjICM1RTVFNUQ1RDlBOUEiLAotIkguIGMgIzc2NzY3NTc1QkFCQSIsCi0iSi4gYyAjNzg3ODc3NzdCQkJCIiwKLSJLLiBjICM3Njc2NzQ3NEI1QjUiLAotIkwuIGMgIzdFN0U3RDdEQkFCQSIsCi0iUC4gYyAjQTVBNUE0QTREMkQyIiwKLSJJLiBjICMwNDA0MDQwNDUyNTIiLAotIlUuIGMgIzA3MDcwNzA3NTQ1NCIsCi0iWS4gYyAjMDcwNzA4MDg1MzUzIiwKLSJULiBjICMwODA4MDgwODU0NTQiLAotIlIuIGMgIzBBMEEwQjBCNTc1NyIsCi0iRS4gYyAjMEUwRTBFMEU1QTVBIiwKLSJXLiBjICMxMTExMTIxMjVFNUUiLAotIlEuIGMgIzExMTExMTExNUU1RSIsCi0iIS4gYyAjMTExMTExMTE1RDVEIiwKLSJ+LiBjICMxMTExMTIxMjVENUQiLAotIl4uIGMgIzE2MTYxNjE2Njg2OCIsCi0iLy4gYyAjMTUxNTE2MTY2MTYxIiwKLSIoLiBjICMxNTE1MTUxNTYxNjEiLAotIikuIGMgIzE5MTkxQTFBNjU2NSIsCi0iXy4gYyAjMTkxOTE5MTk2NTY1IiwKLSJgLiBjICMxQTFBMUExQTY0NjQiLAotIicuIGMgIzFEMUQxRTFFNjk2OSIsCi0iXS4gYyAjMUUxRTFFMUU2OTY5IiwKLSJbLiBjICMyMjIyMjIyMjZENkQiLAotInsuIGMgIzI3MjcyNzI3NzE3MSIsCi0ifS4gYyAjMkIyQjJDMkM3Njc2IiwKLSJ8LiBjICMyQjJCMkIyQjc2NzYiLAotIiBYIGMgIzJCMkIyQjJCNzU3NSIsCi0iLlggYyAjMzAzMDMwMzA3QTdBIiwKLSJYWCBjICMzMDMwMzAzMDc5NzkiLAotIm9YIGMgIzM1MzUzNTM1N0Y3RiIsCi0iT1ggYyAjMzkzOTM5Mzk4MzgzIiwKLSIrWCBjICMzQTNBM0EzQTgzODMiLAotIkBYIGMgIzNGM0YzRjNGODc4NyIsCi0iI1ggYyAjNDM0MzQzNDM4QzhDIiwKLSIkWCBjICM0MzQzNDQ0NDhDOEMiLAotIiVYIGMgIzQyNDI0MjQyODY4NiIsCi0iJlggYyAjNDE0MTQxNDE4NDg0IiwKLSIqWCBjICM0ODQ4NDg0ODkxOTEiLAotIj1YIGMgIzQ4NDg0OTQ5OTA5MCIsCi0iLVggYyAjNEQ0RDRENEQ5Njk2IiwKLSI7WCBjICM1MTUxNTE1MTlEOUQiLAotIjpYIGMgIzRENEQ0RDREOTU5NSIsCi0iPlggYyAjNTE1MTUyNTI5QTlBIiwKLSIsWCBjICM1MTUxNTI1Mjk5OTkiLAotIjxYIGMgIzUyNTI1MjUyOUE5QSIsCi0iMVggYyAjNTI1MjUyNTI5OTk5IiwKLSIyWCBjICM1NjU2NTc1NzlFOUUiLAotIjNYIGMgIzU3NTc1NzU3OUQ5RCIsCi0iNFggYyAjNUI1QjVCNUJBMkEyIiwKLSI1WCBjICM1RjVGNjA2MEE2QTYiLAotIjZYIGMgIzVGNUY1RjVGQTZBNiIsCi0iN1ggYyAjNjM2MzY0NjRBQUFBIiwKLSI4WCBjICM2NDY0NjQ2NEFBQUEiLAotIjlYIGMgIzY3Njc2NzY3QUVBRSIsCi0iMFggYyAjNjc2NzY4NjhBRUFFIiwKLSJxWCBjICM2ODY4Njg2OEFFQUUiLAotIndYIGMgIzZGNkY2RjZGQjVCNSIsCi0iZVggYyAjNkM2QzZDNkNCMUIxIiwKLSJyWCBjICM3MzczNzM3M0I4QjgiLAotInRYIGMgIzgyODI4MjgyQkVCRSIsCi0ieVggYyAjODY4Njg2ODZDMkMyIiwKLSJ1WCBjICM4OTg5ODk4OUM0QzQiLAotImlYIGMgIzk4OTg5ODk4Q0JDQiIsCi0icFggYyAjQTBBMEEwQTBDRkNGIiwKLSJhWCBjICNBOUE5QTlBOUQ1RDUiLAotInNYIGMgI0IwQjBCMEIwRDhEOCIsCi0iZFggYyAjQjhCOEI4QjhEREREIiwKLSJmWCBjICNCREJEQkRCREUwRTAiLAotImdYIGMgI0Q5RDlEOUQ5RURFRCIsCi0iaFggYyAjOTA5MDkxOTFDNkM2IiwKLSJqWCBjICM3MTcxODk4OUJDQkMiLAotImtYIGMgIzczNzM4QjhCQkZCRiIsCi0ibFggYyAjNzI3Mjg5ODlCQ0JDIiwKLSJ6WCBjICM3OTc5OTA5MEMzQzMiLAotInhYIGMgIzdFN0U5NTk1QzdDNyIsCi0iY1ggYyAjODE4MTk4OThDQUNBIiwKLSJ2WCBjICM4NDg0OUI5QkNDQ0MiLAotImJYIGMgIzhDOENBM0EzRDRENCIsCi0iblggYyAjNzE3MThBOEFCQ0JDIiwKLSJtWCBjICM3MzczOEI4QkJEQkQiLAotIk1YIGMgIzc1NzU4RDhEQkZCRiIsCi0iTlggYyAjNzQ3NDhDOENCRUJFIiwKLSJCWCBjICM3Njc2OEU4RUMwQzAiLAotIlZYIGMgIzdDN0M5NDk0QzZDNiIsCi0iQ1ggYyAjN0I3QjkzOTNDNEM0IiwKLSJaWCBjICM3RjdGOTc5N0M5QzkiLAotIkFYIGMgIzgyODI5QTlBQ0JDQiIsCi0iU1ggYyAjODU4NTlFOUVDRUNFIiwKLSJEWCBjICM4ODg4QTBBMEQxRDEiLAotIkZYIGMgIzg3ODc5RjlGRDBEMCIsCi0iR1ggYyAjOEI4QkE0QTRENEQ0IiwKLSJIWCBjICM4QjhCQTNBM0Q0RDQiLAotIkpYIGMgIzg5ODlBMUExRDJEMiIsCi0iS1ggYyAjOEQ4REE1QTVENkQ2IiwKLSJMWCBjICM4QjhCQTNBM0QzRDMiLAotIlBYIGMgIzhFOEVBNkE2RDZENiIsCi0iSVggYyAjOEQ4REE1QTVENUQ1IiwKLSJVWCBjIGdyYXkxMDAiLAotIllYIGMgTm9uZSIsCi0vKiBwaXhlbHMgKi8KLSJZWFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFlYIiwKLSJYIHYudi52LnYuJlhsLnouay4mLmQuJS4kLkAuTy4rLl0gWyBfIGAgKSAoIF4gTCBLICEgRyBEIFYgbSBtIG8gIiwKLSJYIGMuYy5jLnYuJlh4LnouZi5mLmQuJS4kLiMuTy4rLlguWyBfIGAgKSAoIC8gTCBLIEggRiBEIFYgQyBuIG8gIiwKLSJYIHYuYy52LnYueC54Lnouay5mLm4uVi4sLj4uLS4rLl0gWyBfIGAgKSAoIF4gTCBLIEggRyBEIFYgQyBoIG8gIiwKLSJYICZYdi4mWHgueC5sLmouTS4xLjQgLSAtICwgNyBxIEouSC5LLmogOi4qLlAgTCBLIEggRiBTIEIgQyBuIG8gIiwKLSJYIHguJlh4Lnguei5qLlMuLCA9ID0gMSB9IGlYdVhILnJYd1hGLnFYN1haLjsuby5KICEgRiBTIEIgbSBuIG8gIiwKLSJYIHgubC56LiVYei5HLjEgQCA+IDIuZFhhWGlYdVhyWHdYRi5xWDhYNVg0WDJYO1h7IEggRiBTIFYgQyBuIG8gIiwKLSJYIHouai5qLmouQy4xIEAgPCBnWDIuZlhhWHBYdVh3WGVYOVg3WDVYNFgyWE4uOlgqWF8gRCBTIFogbSBoIG8gIiwKLSJYIGsuay5oLmIuLCBPID4gZ1hnWDIuZFhhWGlYeVhGLkQuQS5aLjRYM1gxWDpYbi5nLmEuXyBWIEIgbSBOIG8gIiwKLSJYIGYuZi5mLjMgKyA9IDIuMi4yLmZYc1hwWGhYdFhELjhYWi40WDJYMVg6WCpYJFhAWHAuaS5XIEMgbiBOIG8gIiwKLSJYIGQuJi4lLiUgKyAxIGRYZFhkWHNYUC5pWHlYSy44WDVYNFgyWD5YOlgqWGcuYS4rWG9YLlguLm0gbiBOIG8gIiwKLSJYICUuPS41ICUgLSBQLn0gYVhQLnBYaVh5WEsuRC5aLjRYM1gxWC1Ybi4kWEBYK1hvWC5YIFh5LlcgaCBnIG8gIiwKLSJYICQuJC46ICMgUFhJWEdYR1hMWEpYRlhGWFNYdlhBWGNYWlh4WFZYQ1h6WHpYQlhNWGtYbVhuWGpYaCBnIG8gIiwKLSJYICMuQC4qICQgNyB5WHVYeVh0WEwuSy5ELjZYNFgyWDFYOlhvIGcuYS5PWG9YLlh8LnsuWy50LiAuZyB2IG8gIiwKLSJYIE8uIy4kICQgcSBILnJYd1hGLjBYQS42WDRYMlgxWDpYbyAkWGEucC5vWC5YfC57LlsuJy5gLnIuZyBiIG8gIiwKLSJYIFguKy4kICQgUFhLWGJYYlhMWEpYRFhGWFNYdlhBWGNYWlh4WENYQ1h6WEJYQlhNWE5YbVhsWGpYYiBjIG8gIiwKLSJYIF0gXSAkICQgSC53WEYuMFg3WDZYNFgyWDxYOlhvICNYYS4rWG9YLlh8LnsuWy5dLikuLy5+LlEuYyB6IG8gIiwKLSJYIFsgWyAmICYgdyBGLnFYN1haLjRYMlgsWDpYbyAjWGEuK1hvWC5YfS57LlsuJy5lLi8uOS5FLl4uYyB6IG8gIiwKLSJYICcgXyAqICYgUFhLWGJYSFhMWEpYRFhTWFNYdlhBWGNYWlh4WFZYQ1h6WHpYQlhNWE5Ya1hqWGpYeiB4IG8gIiwKLSJYIGAgYCA6ICYgMiA4WFouNFgyWEIuOlgqWGcuQFhwLm9YLlh8LnsuWy5dLikucS4hLkUuUi5VLlkgeiBmIG8gIiwKLSJYICkgKSA1ICYgOyA8LjRYMlg+WDpYbyAjWGEuK1hvWFhYfC57LlsudC5fLnEufi5FLlIuNC41LmsgeCBhIG8gIiwKLSJYICggKCBJIDsgKiA2IDJYPlg6WD1YJFhAWCtYb1guWHwuey5bLnQuZS4vLlcuRS5SLlkuMy4gLnogYSBhIG8gIiwKLSJYIEkgXiAvIDggKiA6IDAgOlgqWCNYQFgrWG9YLlh8LnsuWy4nLl8uKC5+LkUuUi5ULjMuNy5rIHggYSBwIG8gIiwKLSJYIEwgTCBMIF4gMiAqIDMgbS4kWGEucC5vWC5YfS57LlsudC4pLigufi5FLjYuVC4zLkkuUiB4IGEgYSB5IG8gIiwKLSJYIEogSyBLIEsgSyAyICogNSBzLk9Yb1guWH0uey5bLicuXy4oLjkuOC5SLjQuMy5JLlkgeCBsIGEgcCB0IG8gIiwKLSJYIH4gSCBIICEgISAhIDIgOyA1IFUgWFh9LnsuWy5dLmUuKC5XLkUuUi5VLjMuNy5SIHggbCB1IHUgeSB0IG8gIiwKLSJYIEcgRiBHIEcgRyBRIFEgOCA6IDMgOSB1LlsuXS5fLi8uUS5FLlIuVC42LiAuayB4IGEgYSB1IHQgdCB0IG8gIiwKLSJYIEQgUyBEIFMgRCBTIFMgUyBWIDggMiA2IDkgYy5FIHcuMC58IFQgWSBrIHogeiBhIGEgcCB0IHQgaSByIG8gIiwKLSJYIEEgViBCIFYgViBWIEIgQiBtIG0gbiBuIGggaCBnIGcgZyBjIHogeiB6IGwgbCBkIHAgeSB0IGkgciByIG8gIiwKLSJYIG0gQyBDIEMgQyBDIEMgQyBuIG4gbiBNIE4gZyBnIGIgYyB6IHogeCBhIGEgYSB1IHkgdCB0IHIgciBlIG8gIiwKLSJYIG4gbiBuIG4gbiBoIGggaCBOIE4gZyBnIHYgYiBzIHogeiB6IHggYSBwIHAgdSB0IHQgciByIHIgZSBlIG8gIiwKLSJZWG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIFlYIgotfTsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9ndGsvc29sYXJpcy94ODYvRWNsaXBzZS5zLnBtIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9zb2xhcmlzL3g4Ni9FY2xpcHNlLnMucG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYjkzNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9zb2xhcmlzL3g4Ni9FY2xpcHNlLnMucG0KKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyogWFBNICovCi1zdGF0aWMgY2hhciAqUHJvZHVjdEljb24yNFtdID0gewotLyogY29sdW1ucyByb3dzIGNvbG9ycyBjaGFycy1wZXItcGl4ZWwgKi8KLSIyNCAyNCAyNTcgMiIsCi0iICAgYyBibGFjayIsCi0iLiAgYyBncmF5MTAwIiwKLSJYICBjICM2OTY5NUE1QUU4RTgiLAotIm8gIGMgIzQ5NDk0OTQ5OTE5MSIsCi0iTyAgYyAjRjFGMURGREZFQ0VDIiwKLSIrICBjICNEN0Q3QUNBQ0NEQ0QiLAotIkAgIGMgI0RGREZCQkJCRDZENiIsCi0iIyAgYyAjRTJFMkM0QzREQkRCIiwKLSIkICBjICNDRUNFOUM5Q0M0QzQiLAotIiUgIGMgI0M0QzQ4QjhCQkFCQSIsCi0iJiAgYyAjQzJDMjhBOEFCQUJBIiwKLSIqICBjICNDNEM0OEU4RUJDQkMiLAotIj0gIGMgI0JGQkY4QThBQjlCOSIsCi0iLSAgYyAjRUJFQkQ5RDlFOUU5IiwKLSI7ICBjICNCRkJGODg4OEI5QjkiLAotIjogIGMgI0Q4RDhCOUI5RDZENiIsCi0iPiAgYyAjQjlCOTg2ODZCOUI5IiwKLSIsICBjICNCOEI4ODk4OUI5QjkiLAotIjwgIGMgI0JCQkI5MzkzQkZCRiIsCi0iMSAgYyAjQTlBOTdCN0JCMkIyIiwKLSIyICBjICNFNEU0RDRENEU3RTciLAotIjMgIGMgI0M2QzZBRkFGQ0VDRSIsCi0iNCAgYyAjQTZBNjgwODBCNkI2IiwKLSI1ICBjICNBMkEyN0U3RUI0QjQiLAotIjYgIGMgIzlFOUU3RTdFQjFCMSIsCi0iNyAgYyAjQUJBQjkwOTBCQkJCIiwKLSI4ICBjICNCN0I3QTBBMEM1QzUiLAotIjkgIGMgIzlEOUQ3QzdDQjJCMiIsCi0iMCAgYyAjQUFBQThCOEJCRUJFIiwKLSJxICBjICNBQUFBOTA5MEJDQkMiLAotIncgIGMgIzhDOEM2QjZCQUJBQiIsCi0iZSAgYyAjOTA5MDcwNzBCMUIxIiwKLSJyICBjICNDNEM0QjNCM0Q3RDciLAotInQgIGMgI0NEQ0RCRkJGRERERCIsCi0ieSAgYyAjRUFFQUU0RTRGMUYxIiwKLSJ1ICBjICM4ODg4NkE2QUFEQUQiLAotImkgIGMgIzlFOUU4NTg1QzFDMSIsCi0icCAgYyAjODQ4NDZBNkFBRkFGIiwKLSJhICBjICM4MTgxNkI2QkFBQUEiLAotInMgIGMgI0Q3RDdDRkNGRTZFNiIsCi0iZCAgYyAjODE4MTY5NjlCMUIxIiwKLSJmICBjICM3ODc4NjM2M0E1QTUiLAotImcgIGMgIzZFNkU1RDVEOUM5QyIsCi0iaCAgYyAjNzE3MTYwNjA5RDlEIiwKLSJqICBjICM4MzgzNzQ3NEFBQUEiLAotImsgIGMgIzZBNkE1NzU3QTNBMyIsCi0ibCAgYyAjNkU2RTVFNUVBMEEwIiwKLSJ6ICBjICM1RTVFNTA1MDkyOTIiLAotInggIGMgIzg4ODg3QjdCQkNCQyIsCi0iYyAgYyAjNjg2ODU4NThBQkFCIiwKLSJ2ICBjICM1QTVBNEQ0REEyQTIiLAotImIgIGMgIzdEN0Q3MzczQjRCNCIsCi0ibiAgYyAjNUE1QTRFNEVBNkE2IiwKLSJtICBjICM1RjVGNTY1Njk1OTUiLAotIk0gIGMgIzU2NTY0QTRBQkJCQiIsCi0iTiAgYyAjNTY1NjQ5NDlCOUI5IiwKLSJCICBjICM1NTU1NDk0OUI4QjgiLAotIlYgIGMgIzUzNTM0ODQ4QjNCMyIsCi0iQyAgYyAjNTQ1NDQ5NDlCNEI0IiwKLSJaICBjICM1MjUyNDc0N0IwQjAiLAotIkEgIGMgIzUyNTI0NzQ3QUZBRiIsCi0iUyAgYyAjNUI1QjUzNTM5MzkzIiwKLSJEICBjICMzRTNFMzYzNjk3OTciLAotIkYgIGMgIzQ5NDk0MDQwQTZBNiIsCi0iRyAgYyAjNDg0ODQwNDBBNUE1IiwKLSJIICBjICM1NTU1NEE0QUJBQkEiLAotIkogIGMgIzU0NTQ0OTQ5QjdCNyIsCi0iSyAgYyAjNTM1MzQ5NDlCNEI0IiwKLSJMICBjICM1MTUxNDc0N0FGQUYiLAotIlAgIGMgIzUyNTI0ODQ4QjFCMSIsCi0iSSAgYyAjNTE1MTQ4NDhCMEIwIiwKLSJVICBjICM1MTUxNDg0OEFFQUUiLAotIlkgIGMgIzUxNTE0NzQ3QURBRCIsCi0iVCAgYyAjNTE1MTQ4NDhBREFEIiwKLSJSICBjICM0RjRGNDc0N0FCQUIiLAotIkUgIGMgIzUwNTA0NzQ3QUJBQiIsCi0iVyAgYyAjNTA1MDQ2NDZBOUE5IiwKLSJRICBjICM0RjRGNDY0NkE4QTgiLAotIiEgIGMgIzRFNEU0NjQ2QTdBNyIsCi0ifiAgYyAjNEU0RTQ1NDVBNEE0IiwKLSJeICBjICM0RDRENDU0NUE0QTQiLAotIi8gIGMgIzRFNEU0NjQ2QTVBNSIsCi0iKCAgYyAjNEQ0RDQ1NDVBMUExIiwKLSIpICBjICMzRDNEMzYzNjdFN0UiLAotIl8gIGMgIzRCNEI0NDQ0OUM5QyIsCi0iYCAgYyAjMkEyQTI1MjU3RjdGIiwKLSInICBjICMzRTNFMzczNzk4OTgiLAotIl0gIGMgIzQ3NDc0MDQwOUM5QyIsCi0iWyAgYyAjNEQ0RDQ2NDZBNEE0IiwKLSJ7ICBjICM0QzRDNDU0NUEyQTIiLAotIn0gIGMgIzRENEQ0NjQ2QTJBMiIsCi0ifCAgYyAjNEQ0RDQ2NDZBMUExIiwKLSIgLiBjICM0QjRCNDU0NTlGOUYiLAotIi4uIGMgIzRDNEM0NTQ1OUY5RiIsCi0iWC4gYyAjNEM0QzQ2NDY5RjlGIiwKLSJvLiBjICM0QjRCNDU0NTlEOUQiLAotIk8uIGMgIzQ5NDk0MzQzOTg5OCIsCi0iKy4gYyAjNDk0OTQ0NDQ5QTlBIiwKLSJALiBjICM0QTRBNDU0NTlBOUEiLAotIiMuIGMgIzQ5NDk0NDQ0OTg5OCIsCi0iJC4gYyAjNDg0ODQzNDM5Njk2IiwKLSIlLiBjICM0OTQ5NDQ0NDk3OTciLAotIiYuIGMgIzQ4NDg0MzQzOTU5NSIsCi0iKi4gYyAjNTE1MTRDNENBMUExIiwKLSI9LiBjICM2QjZCNjc2N0FFQUUiLAotIi0uIGMgIzk1OTU5MTkxQzlDOSIsCi0iOy4gYyAjMjMyMzFGMUY3Njc2IiwKLSI6LiBjICMyMTIxMUUxRTcwNzAiLAotIj4uIGMgIzI5MjkyNTI1N0Y3RiIsCi0iLC4gYyAjMjUyNTIxMjE3MDcwIiwKLSI8LiBjICMyNDI0MjEyMTZENkQiLAotIjEuIGMgIzJCMkIyNzI3ODA4MCIsCi0iMi4gYyAjMzkzOTM1MzU4QzhDIiwKLSIzLiBjICM0NDQ0NDA0MDk0OTQiLAotIjQuIGMgIzNCM0IzODM4ODI4MiIsCi0iNS4gYyAjNDc0NzQzNDM5NDk0IiwKLSI2LiBjICM0ODQ4NDQ0NDk1OTUiLAotIjcuIGMgIzQ3NDc0MzQzOTM5MyIsCi0iOC4gYyAjNDc0NzQ0NDQ5MzkzIiwKLSI5LiBjICM0NjQ2NDM0MzkxOTEiLAotIjAuIGMgIzQ1NDU0MjQyOEY4RiIsCi0icS4gYyAjNEE0QTQ3NDc5ODk4IiwKLSJ3LiBjICM0NjQ2NDM0MzhGOEYiLAotImUuIGMgIzQ1NDU0MjQyOEQ4RCIsCi0ici4gYyAjNDQ0NDQxNDE4QjhCIiwKLSJ0LiBjICM0ODQ4NDQ0NDkxOTEiLAotInkuIGMgIzQ0NDQ0MTQxODk4OSIsCi0idS4gYyAjNDk0OTQ2NDY5MDkwIiwKLSJpLiBjICM0QzRDNDg0ODkzOTMiLAotInAuIGMgIzUxNTE0RTRFOUU5RSIsCi0iYS4gYyAjNzM3MzcwNzBCNkI2IiwKLSJzLiBjICM3Nzc3NzQ3NEJCQkIiLAotImQuIGMgI0EwQTA5RTlFRDFEMSIsCi0iZi4gYyAjRDZENkQ1RDVFQkVCIiwKLSJnLiBjICMwRTBFMEQwRDVBNUEiLAotImguIGMgIzExMTEwRjBGNUU1RSIsCi0iai4gYyAjMTIxMjExMTE1RTVFIiwKLSJrLiBjICMxMzEzMTIxMjVGNUYiLAotImwuIGMgIzE3MTcxNjE2NjM2MyIsCi0iei4gYyAjMUQxRDFCMUI2ODY4IiwKLSJ4LiBjICMxRDFEMUMxQzY4NjgiLAotImMuIGMgIzIyMjIyMTIxNkU2RSIsCi0idi4gYyAjMjIyMjIxMjE2RDZEIiwKLSJiLiBjICMyODI4MjcyNzc0NzQiLAotIm4uIGMgIzI4MjgyNzI3NzM3MyIsCi0ibS4gYyAjMjkyOTI4Mjg3MzczIiwKLSJNLiBjICMyRjJGMkUyRTc5NzkiLAotIk4uIGMgIzM1MzUzNDM0N0Y3RiIsCi0iQi4gYyAjMzYzNjM1MzU4MTgxIiwKLSJWLiBjICMzQzNDM0IzQjg1ODUiLAotIkMuIGMgIzQyNDI0MTQxOEM4QyIsCi0iWi4gYyAjNDI0MjQxNDE4QjhCIiwKLSJBLiBjICM0NDQ0NDI0MjhCOEIiLAotIlMuIGMgIzQzNDM0MTQxODk4OSIsCi0iRC4gYyAjNDM0MzQyNDI4OTg5IiwKLSJGLiBjICM0MjQyNDE0MTg3ODciLAotIkcuIGMgIzQxNDE0MDQwODQ4NCIsCi0iSC4gYyAjNDc0NzQ1NDU4RDhEIiwKLSJKLiBjICM0MzQzNDI0Mjg3ODciLAotIksuIGMgIzQyNDI0MTQxODU4NSIsCi0iTC4gYyAjNDE0MTQwNDA4MjgyIiwKLSJQLiBjICM0OTQ5NDg0ODkxOTEiLAotIkkuIGMgIzRGNEY0RTRFOTc5NyIsCi0iVS4gYyAjNTk1OTU3NTdBNkE2IiwKLSJZLiBjICM1RjVGNUQ1REE0QTQiLAotIlQuIGMgIzZDNkM2QjZCQjNCMyIsCi0iUi4gYyAjN0M3QzdCN0JCOUI5IiwKLSJFLiBjICNBOEE4QTdBN0QzRDMiLAotIlcuIGMgIzBEMEQwRDBENUE1QSIsCi0iUS4gYyAjMUYxRjFGMUY2QzZDIiwKLSIhLiBjICMyMjIyMjIyMjZFNkUiLAotIn4uIGMgIzNCM0IzQjNCODU4NSIsCi0iXi4gYyAjNDE0MTQxNDE4QzhDIiwKLSIvLiBjICM0MTQxNDE0MThCOEIiLAotIiguIGMgIzQyNDI0MjQyOEI4QiIsCi0iKS4gYyAjNDg0ODQ4NDg5MjkyIiwKLSJfLiBjICM0MDQwNDA0MDgxODEiLAotImAuIGMgIzRFNEU0RTRFOTg5OCIsCi0iJy4gYyAjNTU1NTU1NTU5RTlFIiwKLSJdLiBjICM1NTU1NTU1NTlEOUQiLAotIlsuIGMgIzVCNUI1QjVCQTNBMyIsCi0iey4gYyAjNUM1QzVDNUNBM0EzIiwKLSJ9LiBjICM2MTYxNjE2MUE5QTkiLAotInwuIGMgIzY2NjY2NjY2QUVBRSIsCi0iIFggYyAjNjY2NjY2NjZBREFEIiwKLSIuWCBjICM2QjZCNkI2QkIyQjIiLAotIlhYIGMgIzcwNzA3MDcwQjdCNyIsCi0ib1ggYyAjNkE2QTZBNkFBREFEIiwKLSJPWCBjICM3NDc0NzQ3NEJCQkIiLAotIitYIGMgIzg5ODk4OTg5QzJDMiIsCi0iQFggYyAjOTA5MDkwOTBDOEM4IiwKLSIjWCBjICM4RjhGOEY4RkM2QzYiLAotIiRYIGMgIzkyOTI5MjkyQzZDNiIsCi0iJVggYyAjOUY5RjlGOUZDRkNGIiwKLSImWCBjICNBNUE1QTVBNUQyRDIiLAotIipYIGMgI0I1QjVCNUI1REJEQiIsCi0iPVggYyAjQjhCOEI4QjhERURFIiwKLSItWCBjICNCN0I3QjdCN0RDREMiLAotIjtYIGMgI0JCQkJCQkJCREVERSIsCi0iOlggYyAjQkRCREJEQkRERkRGIiwKLSI+WCBjICNDOUM5QzlDOUU1RTUiLAotIixYIGMgI0QxRDFEMUQxRUFFQSIsCi0iPFggYyAjN0M3QzdEN0RCQUJBIiwKLSIxWCBjICM4OTg5OEE4QUM3QzciLAotIjJYIGMgIzhGOEY5MDkwQzdDNyIsCi0iM1ggYyAjQTNBM0E0QTREM0QzIiwKLSI0WCBjICNBMkEyQjVCNURFREUiLAotIjVYIGMgI0FEQURCREJERTFFMSIsCi0iNlggYyAjQjlCOUM3QzdFNUU1IiwKLSI3WCBjICNCQUJBQzhDOEU2RTYiLAotIjhYIGMgIzhFOEVBNkE2RDZENiIsCi0iOVggYyAjOTA5MEE3QTdEN0Q3IiwKLSIwWCBjICM5MTkxQTlBOUQ3RDciLAotInFYIGMgIzkyOTJBOUE5RDhEOCIsCi0id1ggYyAjOTQ5NEFCQUJEOEQ4IiwKLSJlWCBjICM5ODk4QUVBRUQ5RDkiLAotInJYIGMgIzlCOUJCMEIwREFEQSIsCi0idFggYyAjOUU5RUIzQjNEQ0RDIiwKLSJ5WCBjICNBMUExQjVCNUREREQiLAotInVYIGMgI0E1QTVCOEI4REVERSIsCi0iaVggYyAjQThBOEJCQkJFMEUwIiwKLSJwWCBjICNBQ0FDQkVCRUUxRTEiLAotImFYIGMgI0FGQUZDMEMwRTNFMyIsCi0ic1ggYyAjQjNCM0MzQzNFNEU0IiwKLSJkWCBjICNCMkIyQzJDMkUzRTMiLAotImZYIGMgI0I1QjVDNUM1RTVFNSIsCi0iZ1ggYyAjQjhCOEM3QzdFNkU2IiwKLSJoWCBjICNCNkI2QzVDNUU0RTQiLAotImpYIGMgIzk3OTdBRUFFRDlEOSIsCi0ia1ggYyAjQTFBMUI2QjZEREREIiwKLSJsWCBjICNBOEE4QkJCQkRGREYiLAotInpYIGMgZ3JheTEwMCIsCi0ieFggYyBibGFjayIsCi0iY1ggYyBibGFjayIsCi0idlggYyBibGFjayIsCi0iYlggYyBibGFjayIsCi0iblggYyBibGFjayIsCi0ibVggYyBibGFjayIsCi0iTVggYyBibGFjayIsCi0iTlggYyBibGFjayIsCi0iQlggYyBibGFjayIsCi0iVlggYyBibGFjayIsCi0iQ1ggYyBibGFjayIsCi0iWlggYyBibGFjayIsCi0iQVggYyBibGFjayIsCi0iU1ggYyBibGFjayIsCi0iRFggYyBibGFjayIsCi0iRlggYyBibGFjayIsCi0iR1ggYyBibGFjayIsCi0iSFggYyBibGFjayIsCi0iSlggYyBibGFjayIsCi0iS1ggYyBibGFjayIsCi0iTFggYyBibGFjayIsCi0iUFggYyBibGFjayIsCi0iSVggYyBibGFjayIsCi0iVVggYyBibGFjayIsCi0iWVggYyBOb25lIiwKLS8qIHBpeGVscyAqLwotIllYWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBZWCIsCi0iWCBfLl8uTC5HLksuRi5ELkEuZS4wLjkuJi4kLiUuKy5fIC4ueyBeICEgVyBFIG8gIiwKLSJYIEwuTC5MLkcuRi5GLkQuci5lLjAuOS43LiYuTy5ALm8uIC57IH4gISBRIEUgbyAiLAotIlggTC5HLkcuSy5GLlMueS5yLmUudy45LjUuJC4rLkAuby4uLiggfiAhIFcgRSBvICIsCi0iWCBHLksuSy5GLkouRC5oIDYgMCBpIHggcy5hLj0uVS4qLi4ufSB+ICEgVyBFIG8gIiwKLSJYIEsuRi5GLkYuUyA3IDogciBkLjFYT1hYWC5YfC59LlsucC58IC8gISBXIEUgbyAiLAotIlggRi5GLkYubSAzIC0gcyA9WDNYQFhYWFQuIFh9LlsuXS5JLnEueyBRIEUgVCBvICIsCi0iWCBTLkQuSC44IE8geSAsWDtYJlgyWC5YfC59LlsuXS5JLlAuQy4zLlEgRSBZIG8gIiwKLSJYIEEuci5qICMgMiBmLj5YKlglWCtYfC59LlsuXS5JLlAuXi5+LkIuXSBFIFkgbyAiLAotIlggZS51LnEgQCB0IDpYLVhFLiRYPFh9LlsuXS5gLlAuWi5WLk4uTS4yLlkgTCBvICIsCi0iWCAwLmkuPCArIDhYOFhxWHdYZVhyWHRYNFh1WGxYcFhhWHNYZlhnWDdYWSBBIG8gIiwKLSJYIDkudC4qICQgLS4jWCtYUi5vWHsuJy5gLlAuKC5+Lk4uTS5tLmMuUS5UIFogbyAiLAotIlggOC43LjsgJSA4WDlYMFh3WGVYclh0WHlYdVhpWHBYYVhkWGZYZ1g3WEwgWiBvICIsCi0iWCA2LiYuMSAmIGIgIFh9LlsuJy5JLlAuLy5+Lk4uTS5uLiEueC5sLjouSSBQIG8gIiwKLSJYICMuIy53ID0gOFg5WHFYd1hqWHJYdFhrWHVYaVg1WGFYc1hoWDZYN1hQIFYgbyAiLAotIlggKy4rLmsgPiA1IFkuXS5JLikuLy5+Lk4uTS5iLnYueC5sLmsuaC4nIFYgQyBvICIsCi0iWCBvLm8uby51ICwgYSBJLikuWi5WLk4uTS5uLmMuei5sLmouVy5gIFAgViBDIG8gIiwKLSJYIC4uIC5YLnYgZSA0IGwgXi5WLk4uTS5tLiEueC5sLmouZy47LkYgViBDIEogbyAiLAotIlggKCB8ICggKCBuIHAgOSBnIDQuTS5uLmMueC5sLmouaC4+LkcgViBLIEMgSiBvICIsCi0iWCB+IFsgWyBeIC8gLyBjIGQgZiB6ICkgPC56LiwuMS5EIFAgViBDIEMgQiBCIG8gIiwKLSJYICEgUSAhIFEgUSBRIFEgVyBFIEUgWSBUIEEgWiBQIFYgViBLIEMgSiBCIEIgbyAiLAotIlggUSBXIFEgVyBSIFcgRSBFIFQgVCBUIEwgWiBQIFYgViBLIEogSiBKIEIgTiBvICIsCi0iWCBSIEUgRSBFIEUgRSBZIFkgVSBMIFogUCBQIFAgQyBWIEogSiBCIEIgSCBNIG8gIiwKLSJZWG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gWVgiCi19OwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL2d0ay9zb2xhcmlzL3g4Ni9FY2xpcHNlLnQucG0gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL3NvbGFyaXMveDg2L0VjbGlwc2UudC5wbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2YjIxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vZ3RrL3NvbGFyaXMveDg2L0VjbGlwc2UudC5wbQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKiBYUE0gKi8KLXN0YXRpYyBjaGFyICpQcm9kdWN0SWNvbjE2W10gPSB7Ci0vKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqLwotIjE2IDE2IDI1NyAyIiwKLSIgICBjIGJsYWNrIiwKLSIuICBjIGdyYXkxMDAiLAotIlggIGMgI0UyRTJDMEMwRDlEOSIsCi0ibyAgYyAjRURFREQ5RDlFOEU4IiwKLSJPICBjICNENUQ1QUJBQkNEQ0QiLAotIisgIGMgI0UyRTJDM0MzRENEQyIsCi0iQCAgYyAjQzVDNThFOEVCQ0JDIiwKLSIjICBjICNENEQ0QUJBQkNEQ0QiLAotIiQgIGMgI0NBQ0E5RjlGQzZDNiIsCi0iJSAgYyAjRDZENkI0QjREM0QzIiwKLSImICBjICNDQUNBQTBBMEM4QzgiLAotIiogIGMgI0M2QzY5RDlEQzZDNiIsCi0iPSAgYyAjQzVDNTlGOUZDOEM4IiwKLSItICBjICNDQ0NDQUNBQ0NFQ0UiLAotIjsgIGMgI0NDQ0NCMEIwRDNEMyIsCi0iOiAgYyAjQTZBNjgzODNCM0IzIiwKLSI+ICBjICNCQUJBOUE5QUM2QzYiLAotIiwgIGMgI0I3Qjc5QTlBQzJDMiIsCi0iPCAgYyAjRTNFM0Q1RDVFOUU5IiwKLSIxICBjICNCMEIwOEU4RUMwQzAiLAotIjIgIGMgIzlGOUY4MDgwQjhCOCIsCi0iMyAgYyAjQUZBRjk4OThDMUMxIiwKLSI0ICBjICNEQkRCQ0ZDRkU1RTUiLAotIjUgIGMgIzk2OTY3ODc4QjJCMiIsCi0iNiAgYyAjOUE5QTdFN0VCQUJBIiwKLSI3ICBjICM4RThFNzg3OEFGQUYiLAotIjggIGMgIzkxOTE3RjdGQkRCRCIsCi0iOSAgYyAjRDNEM0NDQ0NFNEU0IiwKLSIwICBjICM1MzUzNDg0ODhCOEIiLAotInEgIGMgIzY5Njk1QTVBRThFOCIsCi0idyAgYyAjNTU1NTQ5NDlCOUI5IiwKLSJlICBjICM1NTU1NDk0OUI4QjgiLAotInIgIGMgIzU0NTQ0ODQ4QjZCNiIsCi0idCAgYyAjNTM1MzQ4NDhCNEI0IiwKLSJ5ICBjICM1NDU0NDg0OEI0QjQiLAotInUgIGMgIzUzNTM0ODQ4QjNCMyIsCi0iaSAgYyAjNTM1MzQ4NDhCMkIyIiwKLSJwICBjICM1MjUyNDc0N0FGQUYiLAotImEgIGMgIzUzNTM0ODQ4QjFCMSIsCi0icyAgYyAjNTQ1NDQ5NDlCOEI4IiwKLSJkICBjICM1NDU0NDk0OUI2QjYiLAotImYgIGMgIzUyNTI0ODQ4QjNCMyIsCi0iZyAgYyAjNTI1MjQ4NDhCMkIyIiwKLSJoICBjICM1MzUzNDk0OUIzQjMiLAotImogIGMgIzUyNTI0ODQ4QjFCMSIsCi0iayAgYyAjNTI1MjQ4NDhCMEIwIiwKLSJsICBjICM1MTUxNDc0N0FFQUUiLAotInogIGMgIzUyNTI0ODQ4QUZBRiIsCi0ieCAgYyAjNTE1MTQ4NDhBRUFFIiwKLSJjICBjICM1MTUxNDc0N0FEQUQiLAotInYgIGMgIzUxNTE0NzQ3QUNBQyIsCi0iYiAgYyAjNEY0RjQ2NDZBQUFBIiwKLSJuICBjICM1MTUxNDg0OEFEQUQiLAotIm0gIGMgIzUwNTA0NzQ3QUJBQiIsCi0iTSAgYyAjNTA1MDQ3NDdBQUFBIiwKLSJOICBjICM0RjRGNDY0NkE4QTgiLAotIkIgIGMgIzUwNTA0NzQ3QTlBOSIsCi0iViAgYyAjNEU0RTQ2NDZBN0E3IiwKLSJDICBjICM0RTRFNDY0NkE2QTYiLAotIlogIGMgIzRGNEY0NjQ2QTZBNiIsCi0iQSAgYyAjNEY0RjQ3NDdBN0E3IiwKLSJTICBjICM0RDRENDU0NUEzQTMiLAotIkQgIGMgIzRENEQ0NTQ1QTJBMiIsCi0iRiAgYyAjNEM0QzQ1NDU5RTlFIiwKLSJHICBjICM3NDc0NkU2RUIzQjMiLAotIkggIGMgIzJFMkUyOTI5ODM4MyIsCi0iSiAgYyAjMzgzODMyMzI5MDkwIiwKLSJLICBjICM0NjQ2NDA0MDk5OTkiLAotIkwgIGMgIzRENEQ0NjQ2QTJBMiIsCi0iUCAgYyAjNEU0RTQ3NDdBM0EzIiwKLSJJICBjICM0QjRCNDU0NTlGOUYiLAotIlUgIGMgIzRCNEI0NTQ1OUU5RSIsCi0iWSAgYyAjNEM0QzQ2NDY5RjlGIiwKLSJUICBjICM0QTRBNDQ0NDlCOUIiLAotIlIgIGMgIzRBNEE0NDQ0OUE5QSIsCi0iRSAgYyAjNDk0OTQzNDM5Nzk3IiwKLSJXICBjICM0OTQ5NDQ0NDk3OTciLAotIlEgIGMgIzQ4NDg0MzQzOTQ5NCIsCi0iISAgYyAjNzg3ODc0NzRCOEI4IiwKLSJ+ICBjICMyNzI3MjQyNDc4NzgiLAotIl4gIGMgIzJEMkQyQTJBNzU3NSIsCi0iLyAgYyAjNDg0ODQ0NDQ5Nzk3IiwKLSIoICBjICM0NzQ3NDM0MzkzOTMiLAotIikgIGMgIzQ1NDU0MjQyOTA5MCIsCi0iXyAgYyAjNEI0QjQ4NDg5QTlBIiwKLSJgICBjICM0NjQ2NDM0MzhGOEYiLAotIicgIGMgIzQ2NDY0MzQzOEU4RSIsCi0iXSAgYyAjNDU0NTQyNDI4QzhDIiwKLSJbICBjICM1MTUxNEQ0REEwQTAiLAotInsgIGMgIzVDNUM1OTU5QTVBNSIsCi0ifSAgYyAjNTM1MzUwNTA5MDkwIiwKLSJ8ICBjICNDOEM4QzdDN0UzRTMiLAotIiAuIGMgIzEyMTIxMTExNUQ1RCIsCi0iLi4gYyAjMUExQTE5MTk2NTY1IiwKLSJYLiBjICMyNDI0MjIyMjZENkQiLAotIm8uIGMgIzNGM0YzRTNFODg4OCIsCi0iTy4gYyAjNDQ0NDQyNDI4RDhEIiwKLSIrLiBjICM0NDQ0NDI0Mjg5ODkiLAotIkAuIGMgIzQyNDI0MTQxODc4NyIsCi0iIy4gYyAjNDU0NTQzNDM4QThBIiwKLSIkLiBjICM0MzQzNDI0Mjg4ODgiLAotIiUuIGMgIzQyNDI0MTQxODY4NiIsCi0iJi4gYyAjNDE0MTQwNDA4NDg0IiwKLSIqLiBjICM0MTQxNDA0MDgzODMiLAotIj0uIGMgIzQyNDI0MDQwODM4MyIsCi0iLS4gYyAjNDE0MTQwNDA4MjgyIiwKLSI7LiBjICM0NzQ3NDY0NjhEOEQiLAotIjouIGMgIzQ2NDY0NDQ0ODk4OSIsCi0iPi4gYyAjNTI1MjUxNTE5OTk5IiwKLSIsLiBjICM2NDY0NjM2M0FBQUEiLAotIjwuIGMgIzYxNjE1RjVGQTJBMiIsCi0iMS4gYyAjNkU2RTZDNkNCMkIyIiwKLSIyLiBjICNBNUE1QTRBNEQzRDMiLAotIjMuIGMgI0IwQjBBRkFGRDZENiIsCi0iNC4gYyAjMTExMTEyMTI1RDVEIiwKLSI1LiBjICMxOTE5MUExQTY1NjUiLAotIjYuIGMgIzFFMUUxRTFFNkM2QyIsCi0iNy4gYyAjMjIyMjIyMjI2RDZEIiwKLSI4LiBjICMyQjJCMkIyQjc2NzYiLAotIjkuIGMgIzJCMkIyQjJCNzU3NSIsCi0iMC4gYyAjMkIyQjJDMkM3NTc1IiwKLSJxLiBjICMzNDM0MzUzNTdGN0YiLAotIncuIGMgIzM0MzQzNTM1N0U3RSIsCi0iZS4gYyAjMzUzNTM1MzU3RjdGIiwKLSJyLiBjICMzRTNFM0UzRTg4ODgiLAotInQuIGMgIzNFM0UzRTNFODc4NyIsCi0ieS4gYyAjNDE0MTQxNDE4NDg0IiwKLSJ1LiBjICM0MDQwNDA0MDgyODIiLAotImkuIGMgIzQ4NDg0OTQ5OTE5MSIsCi0icC4gYyAjNDk0OTQ5NDk5MTkxIiwKLSJhLiBjICM0ODQ4NDg0ODkwOTAiLAotInMuIGMgIzQ4NDg0OTQ5OTA5MCIsCi0iZC4gYyAjNDA0MDQwNDA4MDgwIiwKLSJmLiBjICM1MjUyNTI1MjlBOUEiLAotImcuIGMgIzUyNTI1MjUyOTk5OSIsCi0iaC4gYyAjNUI1QjVCNUJBM0EzIiwKLSJqLiBjICM1QjVCNUI1QkEyQTIiLAotImsuIGMgIzY0NjQ2NDY0QUJBQiIsCi0ibC4gYyAjNjM2MzY0NjRBQUFBIiwKLSJ6LiBjICM2QjZCNkM2Q0IyQjIiLAotInguIGMgIzcyNzI3MzczQjlCOSIsCi0iYy4gYyAjNzE3MTcxNzFBNEE0IiwKLSJ2LiBjICM3ODc4Nzg3OEFCQUIiLAotImIuIGMgIzdGN0Y3RjdGQjFCMSIsCi0ibi4gYyAjOEM4QzhDOENCRUJFIiwKLSJtLiBjICNBNUE1QTVBNUQyRDIiLAotIk0uIGMgI0M5QzlDOUM5RTVFNSIsCi0iTi4gYyAjODU4NTg2ODZCN0I3IiwKLSJCLiBjICM5MTkxOTI5MkM0QzQiLAotIlYuIGMgIzcxNzE4OTg5QkNCQyIsCi0iQy4gYyAjNzM3MzhCOEJCRUJFIiwKLSJaLiBjICM3NTc1OEQ4REMwQzAiLAotIkEuIGMgIzc4Nzg5MDkwQzNDMyIsCi0iUy4gYyAjN0E3QTkyOTJDNUM1IiwKLSJELiBjICM3MTcxOEE4QUJEQkQiLAotIkYuIGMgIzc2NzY4RThFQzBDMCIsCi0iRy4gYyAjNzg3ODkwOTBDMkMyIiwKLSJILiBjICM3QjdCOTM5M0M1QzUiLAotIkouIGMgIzdEN0Q5NTk1QzdDNyIsCi0iSy4gYyAjODA4MDk5OTlDQUNBIiwKLSJMLiBjICM3RTdFOTY5NkM3QzciLAotIlAuIGMgIzgzODM5QjlCQ0RDRCIsCi0iSS4gYyAjODM4MzlCOUJDQ0NDIiwKLSJVLiBjICM4Njg2OUU5RUNGQ0YiLAotIlkuIGMgIzg4ODhBMUExRDFEMSIsCi0iVC4gYyAjOEE4QUEyQTJEM0QzIiwKLSJSLiBjICM4OTg5QTFBMUQxRDEiLAotIkUuIGMgIzhCOEJBM0EzRDNEMyIsCi0iVy4gYyBncmF5MTAwIiwKLSJRLiBjIGJsYWNrIiwKLSIhLiBjIGJsYWNrIiwKLSJ+LiBjIGJsYWNrIiwKLSJeLiBjIGJsYWNrIiwKLSIvLiBjIGJsYWNrIiwKLSIoLiBjIGJsYWNrIiwKLSIpLiBjIGJsYWNrIiwKLSJfLiBjIGJsYWNrIiwKLSJgLiBjIGJsYWNrIiwKLSInLiBjIGJsYWNrIiwKLSJdLiBjIGJsYWNrIiwKLSJbLiBjIGJsYWNrIiwKLSJ7LiBjIGJsYWNrIiwKLSJ9LiBjIGJsYWNrIiwKLSJ8LiBjIGJsYWNrIiwKLSIgWCBjIGJsYWNrIiwKLSIuWCBjIGJsYWNrIiwKLSJYWCBjIGJsYWNrIiwKLSJvWCBjIGJsYWNrIiwKLSJPWCBjIGJsYWNrIiwKLSIrWCBjIGJsYWNrIiwKLSJAWCBjIGJsYWNrIiwKLSIjWCBjIGJsYWNrIiwKLSIkWCBjIGJsYWNrIiwKLSIlWCBjIGJsYWNrIiwKLSImWCBjIGJsYWNrIiwKLSIqWCBjIGJsYWNrIiwKLSI9WCBjIGJsYWNrIiwKLSItWCBjIGJsYWNrIiwKLSI7WCBjIGJsYWNrIiwKLSI6WCBjIGJsYWNrIiwKLSI+WCBjIGJsYWNrIiwKLSIsWCBjIGJsYWNrIiwKLSI8WCBjIGJsYWNrIiwKLSIxWCBjIGJsYWNrIiwKLSIyWCBjIGJsYWNrIiwKLSIzWCBjIGJsYWNrIiwKLSI0WCBjIGJsYWNrIiwKLSI1WCBjIGJsYWNrIiwKLSI2WCBjIGJsYWNrIiwKLSI3WCBjIGJsYWNrIiwKLSI4WCBjIGJsYWNrIiwKLSI5WCBjIGJsYWNrIiwKLSIwWCBjIGJsYWNrIiwKLSJxWCBjIGJsYWNrIiwKLSJ3WCBjIGJsYWNrIiwKLSJlWCBjIGJsYWNrIiwKLSJyWCBjIGJsYWNrIiwKLSJ0WCBjIGJsYWNrIiwKLSJ5WCBjIGJsYWNrIiwKLSJ1WCBjIGJsYWNrIiwKLSJpWCBjIGJsYWNrIiwKLSJwWCBjIGJsYWNrIiwKLSJhWCBjIGJsYWNrIiwKLSJzWCBjIGJsYWNrIiwKLSJkWCBjIGJsYWNrIiwKLSJmWCBjIGJsYWNrIiwKLSJnWCBjIGJsYWNrIiwKLSJoWCBjIGJsYWNrIiwKLSJqWCBjIGJsYWNrIiwKLSJrWCBjIGJsYWNrIiwKLSJsWCBjIGJsYWNrIiwKLSJ6WCBjIGJsYWNrIiwKLSJ4WCBjIGJsYWNrIiwKLSJjWCBjIGJsYWNrIiwKLSJ2WCBjIGJsYWNrIiwKLSJiWCBjIGJsYWNrIiwKLSJuWCBjIGJsYWNrIiwKLSJtWCBjIGJsYWNrIiwKLSJNWCBjIGJsYWNrIiwKLSJOWCBjIGJsYWNrIiwKLSJCWCBjIGJsYWNrIiwKLSJWWCBjIGJsYWNrIiwKLSJDWCBjIGJsYWNrIiwKLSJaWCBjIGJsYWNrIiwKLSJBWCBjIGJsYWNrIiwKLSJTWCBjIGJsYWNrIiwKLSJEWCBjIGJsYWNrIiwKLSJGWCBjIGJsYWNrIiwKLSJHWCBjIGJsYWNrIiwKLSJIWCBjIGJsYWNrIiwKLSJKWCBjIGJsYWNrIiwKLSJLWCBjIGJsYWNrIiwKLSJMWCBjIGJsYWNrIiwKLSJQWCBjIGJsYWNrIiwKLSJJWCBjIGJsYWNrIiwKLSJVWCBjIGJsYWNrIiwKLSJZWCBjIE5vbmUiLAotLyogcGl4ZWxzICovCi0iWVhxIHEgcSBxIHEgcSBxIHEgcSBxIHEgcSBxIHEgWVgiLAotInEgZC4tLnkuJS4rLk8uYCAoIEUgUiBVIEQgQyBCIHAuIiwKLSJxIHUuKi4mLiQuIy5dICkgUSBXIFQgRiBMIFYgTSBwLiIsCi0icSA9LnkufSAsICUgOyA4ICEgMS57IFsgUyBaIGIgcC4iLAotInEgQC46Li0gbyA0IDIueC56Liwuai4+Ll8gQSBtIHAuIiwKLSJxICsuOiBYIDwgTS5tLnoubC5qLmcucy5yLksgdiBwLiIsCi0icSAnICQgKyA5IHwgMy5CLm4uTi5iLnYuYy48Lm4gcC4iLAotInEgYCBPIFQuWS5VLlAuSy5MLlMuRy5GLkMuRC5sIHAuIiwKLSJxICggIyBAIEcgay5oLmcuaS50LmUuOS43LjYueiBwLiIsCi0icSAvICogRS5SLlUuSS5LLkouSC5BLlouQy5WLmEgcC4iLAotInEgVCAyICYgNSBmLmEuby5xLjguNy4uLjQuSiB1IHAuIiwKLSJxIEkgWSAxID0gNyA7LncuMC43LjUuIC5IIGYgeSBwLiIsCi0icSBMIEQgUCA2ID4gMyAwIF4gWC5+IEogaSB0IGQgcC4iLAotInEgQyBDIFYgQSBOIE0gbSBuIHAgayBnIHkgciBlIHAuIiwKLSJxIE0gYiBNIG0gbSBjIHggcCBqIGggeSBkIHMgdyBwLiIsCi0iWVhwLnAucC5wLnAucC5wLnAucC5wLnAucC5wLnAuWVgiCi19OwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL21vdGlmL2xpbnV4L3g4Ni9pY29uLnhwbSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2Jpbi9tb3RpZi9saW51eC94ODYvaWNvbi54cG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDA0YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL21vdGlmL2xpbnV4L3g4Ni9pY29uLnhwbQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKiBYUE0gKi8KLXN0YXRpYyBjaGFyICpQcm9kdWN0SWNvbjQ4W10gPSB7Ci0vKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqLwotIjQ4IDQ4IDI1NyAyIiwKLSIgICBjIGJsYWNrIiwKLSIuICBjIGdyYXkxMDAiLAotIlggIGMgIzY5NUFFOCIsCi0ibyAgYyAjNDk0OTkxIiwKLSJPICBjICNDRTkyQkYiLAotIisgIGMgI0U3Q0FFMCIsCi0iQCAgYyAjQzg4Q0JCIiwKLSIjICBjICNDMjhBQkEiLAotIiQgIGMgI0VBRDdFOCIsCi0iJSAgYyAjQ0ZBOUNDIiwKLSImICBjICNEOUJDRDgiLAotIiogIGMgI0I2ODdCOSIsCi0iPSAgYyAjQzM5OUM3IiwKLSItICBjICNBNzdEQjUiLAotIjsgIGMgI0JEQTNDRCIsCi0iOiAgYyAjRDhDQUUzIiwKLSI+ICBjICNBODhEQzQiLAotIiwgIGMgIzkyNzVCMiIsCi0iPCAgYyAjODc2Q0FBIiwKLSIxICBjICM5QTgzQkEiLAotIjIgIGMgIzdCNjNBMyIsCi0iMyAgYyAjNjY1NDk1IiwKLSI0ICBjICM3MzVGQUQiLAotIjUgIGMgIzYyNTE5MiIsCi0iNiAgYyAjN0Y3MkE3IiwKLSI3ICBjICM2RDVFOUUiLAotIjggIGMgIzY0NTRBOSIsCi0iOSAgYyAjNzc2OUIxIiwKLSIwICBjICM0OTNFODIiLAotInEgIGMgIzdENzNCNiIsCi0idyAgYyAjNUI0RUFEIiwKLSJlICBjICM1NTQ5QkEiLAotInIgIGMgIzU2NDlCQSIsCi0idCAgYyAjNTY0QUJBIiwKLSJ5ICBjICM1NjQ5QjkiLAotInUgIGMgIzU1NDlCOCIsCi0iaSAgYyAjNEY0NEFDIiwKLSJwICBjICM1MzQ4QjQiLAotImEgIGMgIzUzNDhCMyIsCi0icyAgYyAjNTQ0OUI1IiwKLSJkICBjICM1MjQ3QjAiLAotImYgIGMgIzUyNDdBRiIsCi0iZyAgYyAjNTQ0OUIzIiwKLSJoICBjICNERURDRUUiLAotImogIGMgIzNFMzY5OCIsCi0iayAgYyAjNDMzQjlGIiwKLSJsICBjICMzMzJDNzciLAotInogIGMgIzQyM0E5QyIsCi0ieCAgYyAjNEE0MEE4IiwKLSJjICBjICM1NTRBQkEiLAotInYgIGMgIzU1NEFCOSIsCi0iYiAgYyAjNTQ0OUI3IiwKLSJuICBjICM1MjQ4QjEiLAotIm0gIGMgIzUxNDdBRSIsCi0iTSAgYyAjNEU0NUE5IiwKLSJOICBjICM0OTQxQTAiLAotIkIgIGMgIzUyNDhBRiIsCi0iViAgYyAjNTE0OEFFIiwKLSJDICBjICM1MDQ3QUMiLAotIlogIGMgIzRGNDZBQSIsCi0iQSAgYyAjNTE0OEFEIiwKLSJTICBjICM1MDQ3QUIiLAotIkQgIGMgIzUwNDhBQyIsCi0iRiAgYyAjNTA0N0E5IiwKLSJHICBjICM0RTQ2QTciLAotIkggIGMgIzRFNDVBNCIsCi0iSiAgYyAjNEQ0NUE0IiwKLSJLICBjICM0RjQ3QTgiLAotIkwgIGMgIzRFNDZBNSIsCi0iUCAgYyAjNEQ0NUEzIiwKLSJJICBjICMzQjM1N0QiLAotIlUgIGMgIzRFNDZBMyIsCi0iWSAgYyAjNTU0RDlGIiwKLSJUICBjICM0QTQzODkiLAotIlIgIGMgIzUxNEI5MCIsCi0iRSAgYyAjNjc2MEE1IiwKLSJXICBjICMxRDE4NkEiLAotIlEgIGMgIzI3MjI3RCIsCi0iISAgYyAjMjgyMzdEIiwKLSJ+ICBjICMyQjI2ODEiLAotIl4gIGMgIzMzMkM4OSIsCi0iLyAgYyAjM0IzNjhFIiwKLSIoICBjICM0NTQwOTciLAotIikgIGMgIzRENDZBNCIsCi0iXyAgYyAjNEM0NUExIiwKLSJgICBjICM0RDQ2QTIiLAotIicgIGMgIzRCNDVBMCIsCi0iXSAgYyAjNEQ0NkExIiwKLSJbICBjICM0QzQ1OUYiLAotInsgIGMgIzRCNDU5RSIsCi0ifSAgYyAjNEE0NDlDIiwKLSJ8ICBjICM0OTQ0OTgiLAotIiAuIGMgIzQ4NDM5NiIsCi0iLi4gYyAjNEE0NTk5IiwKLSJYLiBjICM0RjRBQTAiLAotIm8uIGMgIzY4NjNBQSIsCi0iTy4gYyAjMjExRDc2IiwKLSIrLiBjICMyNDIwNzUiLAotIkAuIGMgIzJEMkE3RiIsCi0iIy4gYyAjMkQyQTdCIiwKLSIkLiBjICMzRDM5OEYiLAotIiUuIGMgIzQ4NDQ5NiIsCi0iJi4gYyAjNDc0MzkzIiwKLSIqLiBjICM0NjQzOTEiLAotIj0uIGMgIzQ1NDI4RSIsCi0iLS4gYyAjNEQ0QTlDIiwKLSI7LiBjICM1NzU0QTMiLAotIjouIGMgIzVBNTg5NyIsCi0iPi4gYyAjNUY1RDk5IiwKLSIsLiBjICM4NTgyQzEiLAotIjwuIGMgIzk1OTJDOSIsCi0iMS4gYyAjQjhCNkRDIiwKLSIyLiBjICMwNzA1NTMiLAotIjMuIGMgIzA4MDc1NSIsCi0iNC4gYyAjMEEwOTU3IiwKLSI1LiBjICMwQzBCNTgiLAotIjYuIGMgIzBGMEQ1QyIsCi0iNy4gYyAjMTAwRjVDIiwKLSI4LiBjICMxMzExNjQiLAotIjkuIGMgIzE0MTM2MCIsCi0iMC4gYyAjMTQxMzVGIiwKLSJxLiBjICMxNzE1NjciLAotIncuIGMgIzE2MTU2MiIsCi0iZS4gYyAjMTYxNTYxIiwKLSJyLiBjICMxODE3NjQiLAotInQuIGMgIzFBMTk2NiIsCi0ieS4gYyAjMUMxQTY0IiwKLSJ1LiBjICMxRDFDNjgiLAotImkuIGMgIzFGMUU2QSIsCi0icC4gYyAjMjIyMTZDIiwKLSJhLiBjICMyNDIzNkYiLAotInMuIGMgIzI3MjU3MSIsCi0iZC4gYyAjMjcyNjcyIiwKLSJmLiBjICMyNzI2NzEiLAotImcuIGMgIzI5Mjg3NCIsCi0iaC4gYyAjMkEyOTc0IiwKLSJqLiBjICMyQzJCNzciLAotImsuIGMgIzJGMkU3QyIsCi0ibC4gYyAjMkUyRDc5IiwKLSJ6LiBjICMzNDMzN0UiLAotInguIGMgIzM5Mzc4NiIsCi0iYy4gYyAjMzczNjgxIiwKLSJ2LiBjICMzQTM5ODQiLAotImIuIGMgIzNBMzk4MyIsCi0ibi4gYyAjM0QzQjg2IiwKLSJtLiBjICM0MjQxOEMiLAotIk0uIGMgIzQyNDE4QiIsCi0iTi4gYyAjNDQ0MjhCIiwKLSJCLiBjICM0MzQxODkiLAotIlYuIGMgIzQ1NDQ4RSIsCi0iQy4gYyAjNDU0NDhEIiwKLSJaLiBjICM0MjQxODciLAotIkEuIGMgIzQzNDI4OCIsCi0iUy4gYyAjNDQ0Mjg3IiwKLSJELiBjICM0MjQxODUiLAotIkYuIGMgIzQxNDA4MyIsCi0iRy4gYyAjNDg0NzkwIiwKLSJILiBjICM0MzQyODYiLAotIkouIGMgIzRBNDk5MyIsCi0iSy4gYyAjNDY0NThBIiwKLSJMLiBjICM0RDRDOTUiLAotIlAuIGMgIzU0NTJBMCIsCi0iSS4gYyAjNTA0Rjk4IiwKLSJVLiBjICM1ODU3QTAiLAotIlkuIGMgIzUyNTA5MyIsCi0iVC4gYyAjNUI1OUEyIiwKLSJSLiBjICM1ODU3OUYiLAotIkUuIGMgIzYyNjFBOSIsCi0iVy4gYyAjNjQ2M0FDIiwKLSJRLiBjICM2QjZBQjIiLAotIiEuIGMgIzZCNkFCMSIsCi0ifi4gYyAjNzU3NEI4IiwKLSJeLiBjICM3RjdEQkQiLAotIi8uIGMgIzlDOUJDRiIsCi0iKC4gYyAjMEIwQjU4IiwKLSIpLiBjICMwRDBENUEiLAotIl8uIGMgIzExMTE1RSIsCi0iYC4gYyAjMTMxMzYwIiwKLSInLiBjICMyMTIxNkQiLAotIl0uIGMgIzI0MjQ2RiIsCi0iWy4gYyAjMkIyQzc3IiwKLSJ7LiBjICMyQjJCNzciLAotIn0uIGMgIzJDMkM3NyIsCi0ifC4gYyAjMkUyRTc5IiwKLSIgWCBjICMzMTMxN0MiLAotIi5YIGMgIzMxMzE3QiIsCi0iWFggYyAjMzQzNDdFIiwKLSJvWCBjICMzQzNDODYiLAotIk9YIGMgIzNGM0Y4OSIsCi0iK1ggYyAjNDE0MjhCIiwKLSJAWCBjICM0MjQyOEIiLAotIiNYIGMgIzQ3NDc5MCIsCi0iJFggYyAjNDE0MTg0IiwKLSIlWCBjICM0MDQwODEiLAotIiZYIGMgIzRBNEE5NCIsCi0iKlggYyAjNEE0QTkzIiwKLSI9WCBjICM0RDREOTYiLAotIi1YIGMgIzRGNEY5OCIsCi0iO1ggYyAjNTA1MDk4IiwKLSI6WCBjICM1MjUyOUIiLAotIj5YIGMgIzU1NTU5RSIsCi0iLFggYyAjNTU1NTlEIiwKLSI8WCBjICM1NzU4QTAiLAotIjFYIGMgIzU4NThBMCIsCi0iMlggYyAjNTc1ODlGIiwKLSIzWCBjICM1NzU3OUYiLAotIjRYIGMgIzVBNUFBMiIsCi0iNVggYyAjNUQ1REE1IiwKLSI2WCBjICM1RjVGQTciLAotIjdYIGMgIzYxNjJBQSIsCi0iOFggYyAjNjE2MUE5IiwKLSI5WCBjICM2MTYyQTkiLAotIjBYIGMgIzYyNjJBQSIsCi0icVggYyAjNjQ2NEFDIiwKLSJ3WCBjICM2MjYyQTkiLAotImVYIGMgIzY0NjRBQiIsCi0iclggYyAjNjY2NkFFIiwKLSJ0WCBjICM2NjY2QUQiLAotInlYIGMgIzY4NjhCMCIsCi0idVggYyAjNjk2OUFGIiwKLSJpWCBjICM2RDZEQjQiLAotInBYIGMgIzZGNkZCNSIsCi0iYVggYyAjNzM3M0JBIiwKLSJzWCBjICM3MTcxQjciLAotImRYIGMgIzc2NzZCQyIsCi0iZlggYyAjNzk3OUJGIiwKLSJnWCBjICM3Nzc3QjkiLAotImhYIGMgIzgwODBDMSIsCi0ialggYyAjOEM4Q0M1IiwKLSJrWCBjICM5MDkwQzkiLAotImxYIGMgIzk4OThDQiIsCi0ielggYyAjQTBBMENGIiwKLSJ4WCBjICNBNUE1RDMiLAotImNYIGMgI0FCQUJENiIsCi0idlggYyAjQzRDNEUzIiwKLSJiWCBjICNEMUQxRTkiLAotIm5YIGMgI0U1RTVGMyIsCi0ibVggYyAjOUZBMEQxIiwKLSJNWCBjICNCNkM1RTUiLAotIk5YIGMgIzhFQTZENiIsCi0iQlggYyAjOTBBN0Q3IiwKLSJWWCBjICM5MUE5RDciLAotIkNYIGMgIzk1QUJEOCIsCi0iWlggYyAjOTlBRkRBIiwKLSJBWCBjICM5REIyREMiLAotIlNYIGMgI0ExQjVERCIsCi0iRFggYyAjQTVCOERFIiwKLSJGWCBjICNBOUJCRTAiLAotIkdYIGMgI0FDQkRFMSIsCi0iSFggYyAjQjBDMUUzIiwKLSJKWCBjICNCNEM0RTQiLAotIktYIGMgI0I4QzdFNSIsCi0iTFggYyAjQkJDOUU2IiwKLSJQWCBjICNBRUMwRTIiLAotIklYIGMgI0IyQzNFMyIsCi0iVVggYyBncmF5MTAwIiwKLSJZWCBjIE5vbmUiLAotLyogcGl4ZWxzICovCi0iWVhYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFlYIiwKLSJYICVYJVglWEYuRi5GLkYuJFhELlouWi5aLkIuQi5CLk4uTi49Lj0uPS4qLiouKi4mLiYuIC4gLnwgLi4uLn0gfSB7IHsgXyBfIFAgUCBIIEcgRyBHIEsgUyBTIEMgbyAiLAotIlggJVglWCVYJVhGLkYuJFhELkQuWi5aLkIuQS5CLk4uTi5OLj0uPS49LiouKi4mLiYuJS4lLiUufCB8IC4ufSB7IHsgWyBfIF8gYCBVIEogTCBHIEsgRiBaIFMgQyBvICIsCi0iWCAlWCVYJVglWEYuRi5GLkQuRC5ILlouWi5BLkIuTi5OLk4uQy49Lj0uKi4qLiYuJi4gLiAuJS58IHwgLi59IH0geyBbIFsgXyBQIFAgSCBHIEcgSyBGIFMgUyBDIG8gIiwKLSJYICVYRi4lWEYuRi4kWEYuJFhaLlouWi5CLkEuSy5ZLjcgLCAtIC0gMSAxIF4uXi5+LmFYfi5xIDkgNlhZIHsgfSB7ICcgXyBdIFAgUCBIIEwgRyBLIEYgWiBTIEMgbyAiLAotIlggJVhGLkYuRi5GLkYuRC5ELlouWi5aLksuOi4xIDsgJSA7IDwuaFhmWGZYZFhhWGFYc1hwWGlYIS55WHJYby47LlguWyBfIF8gYCBIIEggRyBLIEsgRiBTIFMgQyBvICIsCi0iWCBGLkYuRi5GLkYuRC5ELkQuWi5ILlkuMSAmICYgMS5jWG1YLy5rWGZYZFhhWGFYc1hwWGlYUS55WHRYZVhFLjZYNVhQLlguXyBgIEogTCBHIEcgSyBGIFogUyBDIG8gIiwKLSJYIEQuJFhGLiRYRC5ELlouWi5TLj4uJSArIDogdlgxLjEuY1htWC8uZFhhWGFYc1hwWGlYUS51WHJYcVg4WDZYNVhULlIuUC5YLlAgKSBIIEcgSyBLIFMgUyBTIG0gbyAiLAotIlggRC4kWEQuRC5ELkQuRC5TLjYgJiAkIGggYlh2WHZYMS54WC8ua1hmWGFYc1hwWGlYUS55WHJYVy5FLjZYNVg0WFUuLFg6WEkuLS5gIEwgRyBHIEsgRiBaIEMgQyBvICIsCi0iWCBELkQuRC5ELkQuWi5ILjYgJiAkIGggaCBoIGJYdlgxLmNYbVhrWCwuZFhwWGlYUS55WHRYcVh3WDZYNVhULlUuLFg6WEkuPVgqWC4uYCBHIEsgSyBaIFMgUyBtIG8gIiwKLSJYIFouRC5aLkguWi5aLjcgJiAkIGggaCBuWGggYlh2WDEuY1htWGtYLC5nWGlYUS51WHJYVy5FLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi4gLlAgRyBGIFMgUyBDIG0gbyAiLAotIlggWi5aLlouSC5aLlIgJSArIDogYlhoIGggaCBiWHZYMS5jWC8ua1hoWH4uUS55WHJYcVg5WDZYNVg0WDJYLFg6WDtYPVgqWCNYVi5NLk9YKCBLIFogUyBTIEMgbSBvICIsCi0iWCBaLlouWi5BLkEuKiAmICYgdlh2WGJYYlhiWHZYdlgxLnhYbFhqWF4ucFh1WHJYZVh3WDZYNVg0WFUuLFg6WC1YTC4qWEcuVi5AWE9Yb1hiLiggWiBTIEMgQyBWIG8gIiwKLSJYIEIuQi5CLkEuMiAlICUgMS4xLnZYdlh2WHZYdlgxLmNYelg8LiwuZ1hpWHJYVy5FLjZYNVg0WFUuLFg6WEkuPVgqWCNYVi5AWE9Ybi5iLmMueC5OIFMgUyBDIG0gbyAiLAotIlggQi5CLkIuUy4qICUgOyB4WDEuMS4xLjEuMS5jWGNYelhsWGpYXi5wWHJYZVg3WDZYNVg0WFIuLFg6WC1YTC5KLiNYVi5AWE9Ybi5iLmMuWFggWCQuUyBDIEMgbSBvICIsCi0iWCBOLk4uTi4yIE8gPSAvLm1YeFhjWGNYY1hjWHhYelhsWGpYaFh+LnVYZVhFLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi5NLk9Ybi52LmMuei4gWHwuay5OIEQgViBmIG8gIiwKLSJYIE4uTi5OLi0gQCA+IGtYPC4vLi8ubVh6WHpYbFg8LmpYaFhnWHVYZVhFLjZYNVg0WDFYLFg6WEkuTC4qWCNYVi5tLk9Ybi5iLmMuei4gWGwuai5nLi8gQyBtIFYgbyAiLAotIlggTi5OLlIgQCAjICwuLC5qWGtYa1g8LmtYa1hqWCwuXi5+LnVYd1hFLjZYNVg0WDFYLFg6WEkuPVhKLiNYQy5NLk9Ybi52LmMuei4uWHwuai5nLmQuIy5NIG0gQiBvICIsCi0iWCA9Lk0uPCBAICogZlhmWGhYaFgsLiwuLC5oWF4uZ1hwWHVYcVg5WDZYNVg0WFUuLFg6WEkuTC4qWEcuVi4rWE9Ybi5iLmMuei4uWHwuWy5nLmQuYS5wLnogViBCIG8gIiwKLSJYID0uTi4tIEAgTlhOWEJYQlhCWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYRlhHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhCIGQgbyAiLAotIlggPS49LiogQCAxIGRYZFhhWGFYc1hwWGlYIS55WHJYZVh3WDZYNVg0WDxYLFg6WEkuPVgqWEcuVi5NLk9Ybi52LmMuWFguWHwuai5nLmQuYS5wLmkudS5ALmYgZCBvICIsCi0iWCAqLj0uIyBAIF4uZFhhWGFYc1hwWGlYUS55WHJYZVh3WDZYNVhULlUuLFg6WC1YTC4mWEcuQy5tLk9Yb1h2LmMuei4uWHwuai5nLmYuYS5wLmkudS50LisuZCBkIG8gIiwKLSJYICouKi5AIEAgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSlhKWEpYTVhLWEtYS1hMWExYTFhkIG4gbyAiLAotIlggJi4qLkAgQCBkWGFYc1hwWGlYUS55WHRYZVhFLjZYNVg0WFUuPlg6WEkuTC4qWEcuVi5tLk9Yb1h2LmMuei4gWHwuai5nLmQuYS4nLmkudS50LnIudy45LmQgbiBvICIsCi0iWCAmLiYuQCBAIH4uc1hwWGlYUS55WHRYVy5FLjZYNVg0WDFYLFg6WEkuPVgqWCNYQy5tLk9Ybi5iLmMuei4gWHwuWy5nLmYuYS5wLmkudS50LnIudy45LjAubiBhIG8gIiwKLSJYICYuJi5AIEAgTlhOWEJYQlhWWFZYVlhDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWElYSVhKWE1YTVhLWEtYS1hMWExYTFhuIG4gbyAiLAotIlggJS4gLiMgQCBxIGlYUS55WHJYVy4wWDZYNVg0WFUuPlg6WEkuTC4qWCNYVi5AWE9Ybi5iLmMuWFguWHwuey5nLmYuXS4nLmkudS50LnIudy4wLl8uNy5XIG4gYSBvICIsCi0iWCAlLiAuKiAjICwgUS55WHRYZVg3WDZYNVg0WFUuLFg6WC1YTC4qWCNYVi5AWE9Ybi5iLmMuWFggWGwuey5nLmQuYS5wLmkudS50LnIuZS4wLl8uNy4pLisuYSBhIG8gIiwKLSJYIHwgfCAtICMgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhBWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhhIGEgbyAiLAotIlggfCB8IDwgIyAtIHJYZVg5WDZYNVg0WFUuLFg6WC1YTC4qWCNYQy5AWE9Yb1hiLmMuei4gWHwuai5oLnMuYS4nLmkudS50LnIudy45Ll8uNy4pLjUuNC5qIGEgcCBvICIsCi0iWCB8IH0gWSAjICogOSA4WDZYNVg0WDNYLFg6WEkuPVgqWEcuVi5AWE9Ybi52LmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC5xLmkgZyBwIG8gIiwKLSJYIH0gfSB8IC0gIyAsIDZYNVg0WFIuLFg6WEkuPVgqWEcuVi5tLk9Yb1hiLmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLn4gYSBzIHMgbyAiLAotIlggfSB9IH0gNCAjIC0gRSA0WFUuPlg6WC1YPVhKLiNYVi5NLk9Yb1hiLmMuWFggWHwuey5oLmQuYS4nLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLjYueiBwIHMgcyBvICIsCi0iWCB7IHsgfSB9IC0gIyA8IFUuLFg6WEkuPVgqWEcuVi4rWE9Yb1hiLmMuei4gWHwufS5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuISBnIHAgcyBzIG8gIiwKLSJYIFsgeyAnIFsgNCAqIC0gRSA6WDtYTC5KLiNYVi5tLk9Yb1hiLmMuei4uWHwuai5oLmYuYS4nLmkudS50LnIudy45Ll8uNi4pLiguNC4zLjIuOC5rIHAgcyBzIHMgbyAiLAotIlggWyBbICcgXyBbICwgKiAsIDtYTC5KLiNYVi5AWE9Yb1h2LmMuei4uWHwuey5nLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5eIHMgcCBzIHMgcyBvICIsCi0iWCBfIF8gXyBfIFAgXSAtICogMiAqWCNYVi5tLk9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5RIHAgcyBzIHMgYiB1IG8gIiwKLSJYIGAgYCBgIGAgYCBgIDggLSAtIDcgVi5AWE9Yb1h2LmMuWFguWHwuai5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcCBzIHMgcyB1IHUgbyAiLAotIlggUCBQICkgUCBVIFUgKSA4IC0gLSA3IE9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcyBzIHMgcyBiIHUgdSBvICIsCi0iWCBMIEwgKSBIICkgTCBMIEwgOCAxIC0gNyBiLmMuei4gWHwuai5oLmYuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5RIHggcCBzIHMgcyBiIGIgdSBlIG8gIiwKLSJYIEwgRyBMIEcgRyBHIEcgRyBHIEcgLCAqIDIgVCAuWGwuai5oLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC4zLjIuOC5eIHAgcCBzIHMgcyBzIHUgdSBlIGUgbyAiLAotIlggRyBHIEcgRyBHIEcgRyBLIEsgTSBNIDQgLCAsIDMgSSBnLmQuYS5wLmkudS50LnIuZS5gLl8uNy4pLjUuNC4zLjcuISBrIHAgcyBwIHMgcyBzIHUgdSB1IGUgdiBvICIsCi0iWCBLIEcgSyBLIEsgSyBLIEsgWiBaIE0gRiBGIDQgLCA8IDMgSSBwLmkudS50LnIudy45Ll8uNy4pLjUuNC5XIH4geiBhIHAgcCBzIHMgYiBzIHUgdSB1IGUgZSBlIG8gIiwKLSJYIEYgWiBGIEYgRiBGIFogWiBGIEYgUyBTIFMgUyBTIHcgOSA8IDIgNSAwIGwgcC5lLjkueS5hLmwgXiBqIGkgYSBwIHAgcCBzIHMgYiBiIGIgdSBlIHYgeSByIGUgbyAiLAotIlggUyBaIFogUyBaIFMgWiBTIFMgUyBTIFMgQyBDIEMgQSBtIGQgViBmIG0gQiBtIEIgZCBkIG4gZCBhIGEgYSBwIHMgcCBzIHMgYiB1IHUgdSB1IGUgdiBlIHIgdCBvICIsCi0iWCBTIFMgUyBTIFMgUyBTIFMgUyBTIEMgQyBDIG0gbSBBIFYgViBCIEIgQiBkIGQgZCBuIG4gYSBhIGEgcCBwIHMgcCBzIHMgYiB1IHUgdSBlIGUgZSBjIHQgciB0IG8gIiwKLSJYIEMgQyBDIEMgQyBDIEMgQyBtIEMgQSBtIEEgbSBmIFYgZiBmIEIgZCBkIGQgbiBuIG4gYSBhIGEgYSBzIHMgcyBzIHMgdSBiIHUgdSB1IHUgdiB0IHQgciB0IHQgbyAiLAotIllYbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBZWCIKLX07CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vbW90aWYvbGludXgveDg2L2xpYlhtLnNvLjIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9iaW4vbW90aWYvbGludXgveDg2L2xpYlhtLnNvLjIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjODI3YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYmluL21vdGlmL2xpbnV4L3g4Ni9saWJYbS5zby4yCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTZiZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNjdXN0b20gPSB0cnVlCi1wMi5ncm91cC5pZCA9IG9yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZQotY3VzdG9tQnVpbGRDYWxsYmFja3M9Y3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCi1iaW4uaW5jbHVkZXMgPSBiaW4vLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIHRhcmdldC5idWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBndGtfcm9vdC8sXAotICAgICAgICAgICAgICAgbW90aWZfcm9vdC8sXAotICAgICAgICAgICAgICAgdGFyZ2V0LmJ1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgY29udHJpYnV0ZWQvCi0KLSNCdWcgMTM5MDY2IExhdW5jaGVyIGZlYXR1cmUgc2hvdWxkIG5vdCBjb250YWluIGljb25zIGFuZCBzcGxhc2ggc2NyZWVuCi1iaW4uZXhjbHVkZXM9YmluLyoqL0VjbGlwc2UuaWNucyxiaW4vKiovaWNvbi54cG0sYmluLyoqLyoucG0sYmluLyoqL3NwbGFzaC5ibXAKLSMgSWYgd2UgbmVlZCB0byByZWdlbmVyYXRlIHRoZSBidWlsZC54bWwsIHRoaXMgbGluZSBtdXN0IGJlIGluY2x1ZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGdhdGhlci5iaW4ucGFydHMgdGFyZ2V0LgotIwk8bW92ZSBmaWxlPSIke2ZlYXR1cmUuYmFzZX0vZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0ubGF1bmNoZXJzXzMuMS4wL3RhcmdldC5idWlsZC5wcm9wZXJ0aWVzIiB0b2ZpbGU9IiR7ZmVhdHVyZS5iYXNlfS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5sYXVuY2hlcnNfMy4xLjAvYnVpbGQucHJvcGVydGllcyIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvY29udHJpYnV0ZWQvbW90aWYvc29sYXJpcy9zcGFyYy9FY2xpcHNlLmwucG0gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9jb250cmlidXRlZC9tb3RpZi9zb2xhcmlzL3NwYXJjL0VjbGlwc2UubC5wbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1ZDdjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9jb250cmlidXRlZC9tb3RpZi9zb2xhcmlzL3NwYXJjL0VjbGlwc2UubC5wbQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKiBYUE0gKi8KLXN0YXRpYyBjaGFyICpQcm9kdWN0SWNvbjQ4W10gPSB7Ci0vKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqLwotIjQ4IDQ4IDI1NyAyIiwKLSIgICBjIGJsYWNrIiwKLSIuICBjIGdyYXkxMDAiLAotIlggIGMgIzY5Njk1QTVBRThFOCIsCi0ibyAgYyAjNDk0OTQ5NDk5MTkxIiwKLSJPICBjICNDRUNFOTI5MkJGQkYiLAotIisgIGMgI0U3RTdDQUNBRTBFMCIsCi0iQCAgYyAjQzhDODhDOENCQkJCIiwKLSIjICBjICNDMkMyOEE4QUJBQkEiLAotIiQgIGMgI0VBRUFEN0Q3RThFOCIsCi0iJSAgYyAjQ0ZDRkE5QTlDQ0NDIiwKLSImICBjICNEOUQ5QkNCQ0Q4RDgiLAotIiogIGMgI0I2QjY4Nzg3QjlCOSIsCi0iPSAgYyAjQzNDMzk5OTlDN0M3IiwKLSItICBjICNBN0E3N0Q3REI1QjUiLAotIjsgIGMgI0JEQkRBM0EzQ0RDRCIsCi0iOiAgYyAjRDhEOENBQ0FFM0UzIiwKLSI+ICBjICNBOEE4OEQ4REM0QzQiLAotIiwgIGMgIzkyOTI3NTc1QjJCMiIsCi0iPCAgYyAjODc4NzZDNkNBQUFBIiwKLSIxICBjICM5QTlBODM4M0JBQkEiLAotIjIgIGMgIzdCN0I2MzYzQTNBMyIsCi0iMyAgYyAjNjY2NjU0NTQ5NTk1IiwKLSI0ICBjICM3MzczNUY1RkFEQUQiLAotIjUgIGMgIzYyNjI1MTUxOTI5MiIsCi0iNiAgYyAjN0Y3RjcyNzJBN0E3IiwKLSI3ICBjICM2RDZENUU1RTlFOUUiLAotIjggIGMgIzY0NjQ1NDU0QTlBOSIsCi0iOSAgYyAjNzc3NzY5NjlCMUIxIiwKLSIwICBjICM0OTQ5M0UzRTgyODIiLAotInEgIGMgIzdEN0Q3MzczQjZCNiIsCi0idyAgYyAjNUI1QjRFNEVBREFEIiwKLSJlICBjICM1NTU1NDk0OUJBQkEiLAotInIgIGMgIzU2NTY0OTQ5QkFCQSIsCi0idCAgYyAjNTY1NjRBNEFCQUJBIiwKLSJ5ICBjICM1NjU2NDk0OUI5QjkiLAotInUgIGMgIzU1NTU0OTQ5QjhCOCIsCi0iaSAgYyAjNEY0RjQ0NDRBQ0FDIiwKLSJwICBjICM1MzUzNDg0OEI0QjQiLAotImEgIGMgIzUzNTM0ODQ4QjNCMyIsCi0icyAgYyAjNTQ1NDQ5NDlCNUI1IiwKLSJkICBjICM1MjUyNDc0N0IwQjAiLAotImYgIGMgIzUyNTI0NzQ3QUZBRiIsCi0iZyAgYyAjNTQ1NDQ5NDlCM0IzIiwKLSJoICBjICNERURFRENEQ0VFRUUiLAotImogIGMgIzNFM0UzNjM2OTg5OCIsCi0iayAgYyAjNDM0MzNCM0I5RjlGIiwKLSJsICBjICMzMzMzMkMyQzc3NzciLAotInogIGMgIzQyNDIzQTNBOUM5QyIsCi0ieCAgYyAjNEE0QTQwNDBBOEE4IiwKLSJjICBjICM1NTU1NEE0QUJBQkEiLAotInYgIGMgIzU1NTU0QTRBQjlCOSIsCi0iYiAgYyAjNTQ1NDQ5NDlCN0I3IiwKLSJuICBjICM1MjUyNDg0OEIxQjEiLAotIm0gIGMgIzUxNTE0NzQ3QUVBRSIsCi0iTSAgYyAjNEU0RTQ1NDVBOUE5IiwKLSJOICBjICM0OTQ5NDE0MUEwQTAiLAotIkIgIGMgIzUyNTI0ODQ4QUZBRiIsCi0iViAgYyAjNTE1MTQ4NDhBRUFFIiwKLSJDICBjICM1MDUwNDc0N0FDQUMiLAotIlogIGMgIzRGNEY0NjQ2QUFBQSIsCi0iQSAgYyAjNTE1MTQ4NDhBREFEIiwKLSJTICBjICM1MDUwNDc0N0FCQUIiLAotIkQgIGMgIzUwNTA0ODQ4QUNBQyIsCi0iRiAgYyAjNTA1MDQ3NDdBOUE5IiwKLSJHICBjICM0RTRFNDY0NkE3QTciLAotIkggIGMgIzRFNEU0NTQ1QTRBNCIsCi0iSiAgYyAjNEQ0RDQ1NDVBNEE0IiwKLSJLICBjICM0RjRGNDc0N0E4QTgiLAotIkwgIGMgIzRFNEU0NjQ2QTVBNSIsCi0iUCAgYyAjNEQ0RDQ1NDVBM0EzIiwKLSJJICBjICMzQjNCMzUzNTdEN0QiLAotIlUgIGMgIzRFNEU0NjQ2QTNBMyIsCi0iWSAgYyAjNTU1NTRENEQ5RjlGIiwKLSJUICBjICM0QTRBNDM0Mzg5ODkiLAotIlIgIGMgIzUxNTE0QjRCOTA5MCIsCi0iRSAgYyAjNjc2NzYwNjBBNUE1IiwKLSJXICBjICMxRDFEMTgxODZBNkEiLAotIlEgIGMgIzI3MjcyMjIyN0Q3RCIsCi0iISAgYyAjMjgyODIzMjM3RDdEIiwKLSJ+ICBjICMyQjJCMjYyNjgxODEiLAotIl4gIGMgIzMzMzMyQzJDODk4OSIsCi0iLyAgYyAjM0IzQjM2MzY4RThFIiwKLSIoICBjICM0NTQ1NDA0MDk3OTciLAotIikgIGMgIzRENEQ0NjQ2QTRBNCIsCi0iXyAgYyAjNEM0QzQ1NDVBMUExIiwKLSJgICBjICM0RDRENDY0NkEyQTIiLAotIicgIGMgIzRCNEI0NTQ1QTBBMCIsCi0iXSAgYyAjNEQ0RDQ2NDZBMUExIiwKLSJbICBjICM0QzRDNDU0NTlGOUYiLAotInsgIGMgIzRCNEI0NTQ1OUU5RSIsCi0ifSAgYyAjNEE0QTQ0NDQ5QzlDIiwKLSJ8ICBjICM0OTQ5NDQ0NDk4OTgiLAotIiAuIGMgIzQ4NDg0MzQzOTY5NiIsCi0iLi4gYyAjNEE0QTQ1NDU5OTk5IiwKLSJYLiBjICM0RjRGNEE0QUEwQTAiLAotIm8uIGMgIzY4Njg2MzYzQUFBQSIsCi0iTy4gYyAjMjEyMTFEMUQ3Njc2IiwKLSIrLiBjICMyNDI0MjAyMDc1NzUiLAotIkAuIGMgIzJEMkQyQTJBN0Y3RiIsCi0iIy4gYyAjMkQyRDJBMkE3QjdCIiwKLSIkLiBjICMzRDNEMzkzOThGOEYiLAotIiUuIGMgIzQ4NDg0NDQ0OTY5NiIsCi0iJi4gYyAjNDc0NzQzNDM5MzkzIiwKLSIqLiBjICM0NjQ2NDM0MzkxOTEiLAotIj0uIGMgIzQ1NDU0MjQyOEU4RSIsCi0iLS4gYyAjNEQ0RDRBNEE5QzlDIiwKLSI7LiBjICM1NzU3NTQ1NEEzQTMiLAotIjouIGMgIzVBNUE1ODU4OTc5NyIsCi0iPi4gYyAjNUY1RjVENUQ5OTk5IiwKLSIsLiBjICM4NTg1ODI4MkMxQzEiLAotIjwuIGMgIzk1OTU5MjkyQzlDOSIsCi0iMS4gYyAjQjhCOEI2QjZEQ0RDIiwKLSIyLiBjICMwNzA3MDUwNTUzNTMiLAotIjMuIGMgIzA4MDgwNzA3NTU1NSIsCi0iNC4gYyAjMEEwQTA5MDk1NzU3IiwKLSI1LiBjICMwQzBDMEIwQjU4NTgiLAotIjYuIGMgIzBGMEYwRDBENUM1QyIsCi0iNy4gYyAjMTAxMDBGMEY1QzVDIiwKLSI4LiBjICMxMzEzMTExMTY0NjQiLAotIjkuIGMgIzE0MTQxMzEzNjA2MCIsCi0iMC4gYyAjMTQxNDEzMTM1RjVGIiwKLSJxLiBjICMxNzE3MTUxNTY3NjciLAotIncuIGMgIzE2MTYxNTE1NjI2MiIsCi0iZS4gYyAjMTYxNjE1MTU2MTYxIiwKLSJyLiBjICMxODE4MTcxNzY0NjQiLAotInQuIGMgIzFBMUExOTE5NjY2NiIsCi0ieS4gYyAjMUMxQzFBMUE2NDY0IiwKLSJ1LiBjICMxRDFEMUMxQzY4NjgiLAotImkuIGMgIzFGMUYxRTFFNkE2QSIsCi0icC4gYyAjMjIyMjIxMjE2QzZDIiwKLSJhLiBjICMyNDI0MjMyMzZGNkYiLAotInMuIGMgIzI3MjcyNTI1NzE3MSIsCi0iZC4gYyAjMjcyNzI2MjY3MjcyIiwKLSJmLiBjICMyNzI3MjYyNjcxNzEiLAotImcuIGMgIzI5MjkyODI4NzQ3NCIsCi0iaC4gYyAjMkEyQTI5Mjk3NDc0IiwKLSJqLiBjICMyQzJDMkIyQjc3NzciLAotImsuIGMgIzJGMkYyRTJFN0M3QyIsCi0ibC4gYyAjMkUyRTJEMkQ3OTc5IiwKLSJ6LiBjICMzNDM0MzMzMzdFN0UiLAotInguIGMgIzM5MzkzNzM3ODY4NiIsCi0iYy4gYyAjMzczNzM2MzY4MTgxIiwKLSJ2LiBjICMzQTNBMzkzOTg0ODQiLAotImIuIGMgIzNBM0EzOTM5ODM4MyIsCi0ibi4gYyAjM0QzRDNCM0I4Njg2IiwKLSJtLiBjICM0MjQyNDE0MThDOEMiLAotIk0uIGMgIzQyNDI0MTQxOEI4QiIsCi0iTi4gYyAjNDQ0NDQyNDI4QjhCIiwKLSJCLiBjICM0MzQzNDE0MTg5ODkiLAotIlYuIGMgIzQ1NDU0NDQ0OEU4RSIsCi0iQy4gYyAjNDU0NTQ0NDQ4RDhEIiwKLSJaLiBjICM0MjQyNDE0MTg3ODciLAotIkEuIGMgIzQzNDM0MjQyODg4OCIsCi0iUy4gYyAjNDQ0NDQyNDI4Nzg3IiwKLSJELiBjICM0MjQyNDE0MTg1ODUiLAotIkYuIGMgIzQxNDE0MDQwODM4MyIsCi0iRy4gYyAjNDg0ODQ3NDc5MDkwIiwKLSJILiBjICM0MzQzNDI0Mjg2ODYiLAotIkouIGMgIzRBNEE0OTQ5OTM5MyIsCi0iSy4gYyAjNDY0NjQ1NDU4QThBIiwKLSJMLiBjICM0RDRENEM0Qzk1OTUiLAotIlAuIGMgIzU0NTQ1MjUyQTBBMCIsCi0iSS4gYyAjNTA1MDRGNEY5ODk4IiwKLSJVLiBjICM1ODU4NTc1N0EwQTAiLAotIlkuIGMgIzUyNTI1MDUwOTM5MyIsCi0iVC4gYyAjNUI1QjU5NTlBMkEyIiwKLSJSLiBjICM1ODU4NTc1NzlGOUYiLAotIkUuIGMgIzYyNjI2MTYxQTlBOSIsCi0iVy4gYyAjNjQ2NDYzNjNBQ0FDIiwKLSJRLiBjICM2QjZCNkE2QUIyQjIiLAotIiEuIGMgIzZCNkI2QTZBQjFCMSIsCi0ifi4gYyAjNzU3NTc0NzRCOEI4IiwKLSJeLiBjICM3RjdGN0Q3REJEQkQiLAotIi8uIGMgIzlDOUM5QjlCQ0ZDRiIsCi0iKC4gYyAjMEIwQjBCMEI1ODU4IiwKLSIpLiBjICMwRDBEMEQwRDVBNUEiLAotIl8uIGMgIzExMTExMTExNUU1RSIsCi0iYC4gYyAjMTMxMzEzMTM2MDYwIiwKLSInLiBjICMyMTIxMjEyMTZENkQiLAotIl0uIGMgIzI0MjQyNDI0NkY2RiIsCi0iWy4gYyAjMkIyQjJDMkM3Nzc3IiwKLSJ7LiBjICMyQjJCMkIyQjc3NzciLAotIn0uIGMgIzJDMkMyQzJDNzc3NyIsCi0ifC4gYyAjMkUyRTJFMkU3OTc5IiwKLSIgWCBjICMzMTMxMzEzMTdDN0MiLAotIi5YIGMgIzMxMzEzMTMxN0I3QiIsCi0iWFggYyAjMzQzNDM0MzQ3RTdFIiwKLSJvWCBjICMzQzNDM0MzQzg2ODYiLAotIk9YIGMgIzNGM0YzRjNGODk4OSIsCi0iK1ggYyAjNDE0MTQyNDI4QjhCIiwKLSJAWCBjICM0MjQyNDI0MjhCOEIiLAotIiNYIGMgIzQ3NDc0NzQ3OTA5MCIsCi0iJFggYyAjNDE0MTQxNDE4NDg0IiwKLSIlWCBjICM0MDQwNDA0MDgxODEiLAotIiZYIGMgIzRBNEE0QTRBOTQ5NCIsCi0iKlggYyAjNEE0QTRBNEE5MzkzIiwKLSI9WCBjICM0RDRENEQ0RDk2OTYiLAotIi1YIGMgIzRGNEY0RjRGOTg5OCIsCi0iO1ggYyAjNTA1MDUwNTA5ODk4IiwKLSI6WCBjICM1MjUyNTI1MjlCOUIiLAotIj5YIGMgIzU1NTU1NTU1OUU5RSIsCi0iLFggYyAjNTU1NTU1NTU5RDlEIiwKLSI8WCBjICM1NzU3NTg1OEEwQTAiLAotIjFYIGMgIzU4NTg1ODU4QTBBMCIsCi0iMlggYyAjNTc1NzU4NTg5RjlGIiwKLSIzWCBjICM1NzU3NTc1NzlGOUYiLAotIjRYIGMgIzVBNUE1QTVBQTJBMiIsCi0iNVggYyAjNUQ1RDVENURBNUE1IiwKLSI2WCBjICM1RjVGNUY1RkE3QTciLAotIjdYIGMgIzYxNjE2MjYyQUFBQSIsCi0iOFggYyAjNjE2MTYxNjFBOUE5IiwKLSI5WCBjICM2MTYxNjI2MkE5QTkiLAotIjBYIGMgIzYyNjI2MjYyQUFBQSIsCi0icVggYyAjNjQ2NDY0NjRBQ0FDIiwKLSJ3WCBjICM2MjYyNjI2MkE5QTkiLAotImVYIGMgIzY0NjQ2NDY0QUJBQiIsCi0iclggYyAjNjY2NjY2NjZBRUFFIiwKLSJ0WCBjICM2NjY2NjY2NkFEQUQiLAotInlYIGMgIzY4Njg2ODY4QjBCMCIsCi0idVggYyAjNjk2OTY5NjlBRkFGIiwKLSJpWCBjICM2RDZENkQ2REI0QjQiLAotInBYIGMgIzZGNkY2RjZGQjVCNSIsCi0iYVggYyAjNzM3MzczNzNCQUJBIiwKLSJzWCBjICM3MTcxNzE3MUI3QjciLAotImRYIGMgIzc2NzY3Njc2QkNCQyIsCi0iZlggYyAjNzk3OTc5NzlCRkJGIiwKLSJnWCBjICM3Nzc3Nzc3N0I5QjkiLAotImhYIGMgIzgwODA4MDgwQzFDMSIsCi0ialggYyAjOEM4QzhDOENDNUM1IiwKLSJrWCBjICM5MDkwOTA5MEM5QzkiLAotImxYIGMgIzk4OTg5ODk4Q0JDQiIsCi0ielggYyAjQTBBMEEwQTBDRkNGIiwKLSJ4WCBjICNBNUE1QTVBNUQzRDMiLAotImNYIGMgI0FCQUJBQkFCRDZENiIsCi0idlggYyAjQzRDNEM0QzRFM0UzIiwKLSJiWCBjICNEMUQxRDFEMUU5RTkiLAotIm5YIGMgI0U1RTVFNUU1RjNGMyIsCi0ibVggYyAjOUY5RkEwQTBEMUQxIiwKLSJNWCBjICNCNkI2QzVDNUU1RTUiLAotIk5YIGMgIzhFOEVBNkE2RDZENiIsCi0iQlggYyAjOTA5MEE3QTdEN0Q3IiwKLSJWWCBjICM5MTkxQTlBOUQ3RDciLAotIkNYIGMgIzk1OTVBQkFCRDhEOCIsCi0iWlggYyAjOTk5OUFGQUZEQURBIiwKLSJBWCBjICM5RDlEQjJCMkRDREMiLAotIlNYIGMgI0ExQTFCNUI1RERERCIsCi0iRFggYyAjQTVBNUI4QjhERURFIiwKLSJGWCBjICNBOUE5QkJCQkUwRTAiLAotIkdYIGMgI0FDQUNCREJERTFFMSIsCi0iSFggYyAjQjBCMEMxQzFFM0UzIiwKLSJKWCBjICNCNEI0QzRDNEU0RTQiLAotIktYIGMgI0I4QjhDN0M3RTVFNSIsCi0iTFggYyAjQkJCQkM5QzlFNkU2IiwKLSJQWCBjICNBRUFFQzBDMEUyRTIiLAotIklYIGMgI0IyQjJDM0MzRTNFMyIsCi0iVVggYyBncmF5MTAwIiwKLSJZWCBjIE5vbmUiLAotLyogcGl4ZWxzICovCi0iWVhYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFlYIiwKLSJYICVYJVglWEYuRi5GLkYuJFhELlouWi5aLkIuQi5CLk4uTi49Lj0uPS4qLiouKi4mLiYuIC4gLnwgLi4uLn0gfSB7IHsgXyBfIFAgUCBIIEcgRyBHIEsgUyBTIEMgbyAiLAotIlggJVglWCVYJVhGLkYuJFhELkQuWi5aLkIuQS5CLk4uTi5OLj0uPS49LiouKi4mLiYuJS4lLiUufCB8IC4ufSB7IHsgWyBfIF8gYCBVIEogTCBHIEsgRiBaIFMgQyBvICIsCi0iWCAlWCVYJVglWEYuRi5GLkQuRC5ILlouWi5BLkIuTi5OLk4uQy49Lj0uKi4qLiYuJi4gLiAuJS58IHwgLi59IH0geyBbIFsgXyBQIFAgSCBHIEcgSyBGIFMgUyBDIG8gIiwKLSJYICVYRi4lWEYuRi4kWEYuJFhaLlouWi5CLkEuSy5ZLjcgLCAtIC0gMSAxIF4uXi5+LmFYfi5xIDkgNlhZIHsgfSB7ICcgXyBdIFAgUCBIIEwgRyBLIEYgWiBTIEMgbyAiLAotIlggJVhGLkYuRi5GLkYuRC5ELlouWi5aLksuOi4xIDsgJSA7IDwuaFhmWGZYZFhhWGFYc1hwWGlYIS55WHJYby47LlguWyBfIF8gYCBIIEggRyBLIEsgRiBTIFMgQyBvICIsCi0iWCBGLkYuRi5GLkYuRC5ELkQuWi5ILlkuMSAmICYgMS5jWG1YLy5rWGZYZFhhWGFYc1hwWGlYUS55WHRYZVhFLjZYNVhQLlguXyBgIEogTCBHIEcgSyBGIFogUyBDIG8gIiwKLSJYIEQuJFhGLiRYRC5ELlouWi5TLj4uJSArIDogdlgxLjEuY1htWC8uZFhhWGFYc1hwWGlYUS51WHJYcVg4WDZYNVhULlIuUC5YLlAgKSBIIEcgSyBLIFMgUyBTIG0gbyAiLAotIlggRC4kWEQuRC5ELkQuRC5TLjYgJiAkIGggYlh2WHZYMS54WC8ua1hmWGFYc1hwWGlYUS55WHJYVy5FLjZYNVg0WFUuLFg6WEkuLS5gIEwgRyBHIEsgRiBaIEMgQyBvICIsCi0iWCBELkQuRC5ELkQuWi5ILjYgJiAkIGggaCBoIGJYdlgxLmNYbVhrWCwuZFhwWGlYUS55WHRYcVh3WDZYNVhULlUuLFg6WEkuPVgqWC4uYCBHIEsgSyBaIFMgUyBtIG8gIiwKLSJYIFouRC5aLkguWi5aLjcgJiAkIGggaCBuWGggYlh2WDEuY1htWGtYLC5nWGlYUS51WHJYVy5FLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi4gLlAgRyBGIFMgUyBDIG0gbyAiLAotIlggWi5aLlouSC5aLlIgJSArIDogYlhoIGggaCBiWHZYMS5jWC8ua1hoWH4uUS55WHJYcVg5WDZYNVg0WDJYLFg6WDtYPVgqWCNYVi5NLk9YKCBLIFogUyBTIEMgbSBvICIsCi0iWCBaLlouWi5BLkEuKiAmICYgdlh2WGJYYlhiWHZYdlgxLnhYbFhqWF4ucFh1WHJYZVh3WDZYNVg0WFUuLFg6WC1YTC4qWEcuVi5AWE9Yb1hiLiggWiBTIEMgQyBWIG8gIiwKLSJYIEIuQi5CLkEuMiAlICUgMS4xLnZYdlh2WHZYdlgxLmNYelg8LiwuZ1hpWHJYVy5FLjZYNVg0WFUuLFg6WEkuPVgqWCNYVi5AWE9Ybi5iLmMueC5OIFMgUyBDIG0gbyAiLAotIlggQi5CLkIuUy4qICUgOyB4WDEuMS4xLjEuMS5jWGNYelhsWGpYXi5wWHJYZVg3WDZYNVg0WFIuLFg6WC1YTC5KLiNYVi5AWE9Ybi5iLmMuWFggWCQuUyBDIEMgbSBvICIsCi0iWCBOLk4uTi4yIE8gPSAvLm1YeFhjWGNYY1hjWHhYelhsWGpYaFh+LnVYZVhFLjZYNVg0WFUuLFg6WC1YTC5KLiNYVi5NLk9Ybi52LmMuei4gWHwuay5OIEQgViBmIG8gIiwKLSJYIE4uTi5OLi0gQCA+IGtYPC4vLi8ubVh6WHpYbFg8LmpYaFhnWHVYZVhFLjZYNVg0WDFYLFg6WEkuTC4qWCNYVi5tLk9Ybi5iLmMuei4gWGwuai5nLi8gQyBtIFYgbyAiLAotIlggTi5OLlIgQCAjICwuLC5qWGtYa1g8LmtYa1hqWCwuXi5+LnVYd1hFLjZYNVg0WDFYLFg6WEkuPVhKLiNYQy5NLk9Ybi52LmMuei4uWHwuai5nLmQuIy5NIG0gQiBvICIsCi0iWCA9Lk0uPCBAICogZlhmWGhYaFgsLiwuLC5oWF4uZ1hwWHVYcVg5WDZYNVg0WFUuLFg6WEkuTC4qWEcuVi4rWE9Ybi5iLmMuei4uWHwuWy5nLmQuYS5wLnogViBCIG8gIiwKLSJYID0uTi4tIEAgTlhOWEJYQlhCWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYRlhHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhCIGQgbyAiLAotIlggPS49LiogQCAxIGRYZFhhWGFYc1hwWGlYIS55WHJYZVh3WDZYNVg0WDxYLFg6WEkuPVgqWEcuVi5NLk9Ybi52LmMuWFguWHwuai5nLmQuYS5wLmkudS5ALmYgZCBvICIsCi0iWCAqLj0uIyBAIF4uZFhhWGFYc1hwWGlYUS55WHJYZVh3WDZYNVhULlUuLFg6WC1YTC4mWEcuQy5tLk9Yb1h2LmMuei4uWHwuai5nLmYuYS5wLmkudS50LisuZCBkIG8gIiwKLSJYICouKi5AIEAgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhaWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSlhKWEpYTVhLWEtYS1hMWExYTFhkIG4gbyAiLAotIlggJi4qLkAgQCBkWGFYc1hwWGlYUS55WHRYZVhFLjZYNVg0WFUuPlg6WEkuTC4qWEcuVi5tLk9Yb1h2LmMuei4gWHwuai5nLmQuYS4nLmkudS50LnIudy45LmQgbiBvICIsCi0iWCAmLiYuQCBAIH4uc1hwWGlYUS55WHRYVy5FLjZYNVg0WDFYLFg6WEkuPVgqWCNYQy5tLk9Ybi5iLmMuei4gWHwuWy5nLmYuYS5wLmkudS50LnIudy45LjAubiBhIG8gIiwKLSJYICYuJi5AIEAgTlhOWEJYQlhWWFZYVlhDWENYQ1haWFpYWlhaWEFYQVhTWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWElYSVhKWE1YTVhLWEtYS1hMWExYTFhuIG4gbyAiLAotIlggJS4gLiMgQCBxIGlYUS55WHJYVy4wWDZYNVg0WFUuPlg6WEkuTC4qWCNYVi5AWE9Ybi5iLmMuWFguWHwuey5nLmYuXS4nLmkudS50LnIudy4wLl8uNy5XIG4gYSBvICIsCi0iWCAlLiAuKiAjICwgUS55WHRYZVg3WDZYNVg0WFUuLFg6WC1YTC4qWCNYVi5AWE9Ybi5iLmMuWFggWGwuey5nLmQuYS5wLmkudS50LnIuZS4wLl8uNy4pLisuYSBhIG8gIiwKLSJYIHwgfCAtICMgTlhOWE5YQlhWWFZYQ1hDWENYQ1haWFpYWlhBWEFYQVhBWFNYU1hEWERYRFhGWEZYR1hHWFBYUFhIWEhYSVhKWE1YTVhNWEtYS1hMWExYTFhhIGEgbyAiLAotIlggfCB8IDwgIyAtIHJYZVg5WDZYNVg0WFUuLFg6WC1YTC4qWCNYQy5AWE9Yb1hiLmMuei4gWHwuai5oLnMuYS4nLmkudS50LnIudy45Ll8uNy4pLjUuNC5qIGEgcCBvICIsCi0iWCB8IH0gWSAjICogOSA4WDZYNVg0WDNYLFg6WEkuPVgqWEcuVi5AWE9Ybi52LmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC5xLmkgZyBwIG8gIiwKLSJYIH0gfSB8IC0gIyAsIDZYNVg0WFIuLFg6WEkuPVgqWEcuVi5tLk9Yb1hiLmMuWFggWHwuai5nLmYuYS5wLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLn4gYSBzIHMgbyAiLAotIlggfSB9IH0gNCAjIC0gRSA0WFUuPlg6WC1YPVhKLiNYVi5NLk9Yb1hiLmMuWFggWHwuey5oLmQuYS4nLmkudS50LnIuZS45Ll8uNy4pLjUuNC4zLjYueiBwIHMgcyBvICIsCi0iWCB7IHsgfSB9IC0gIyA8IFUuLFg6WEkuPVgqWEcuVi4rWE9Yb1hiLmMuei4gWHwufS5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuISBnIHAgcyBzIG8gIiwKLSJYIFsgeyAnIFsgNCAqIC0gRSA6WDtYTC5KLiNYVi5tLk9Yb1hiLmMuei4uWHwuai5oLmYuYS4nLmkudS50LnIudy45Ll8uNi4pLiguNC4zLjIuOC5rIHAgcyBzIHMgbyAiLAotIlggWyBbICcgXyBbICwgKiAsIDtYTC5KLiNYVi5AWE9Yb1h2LmMuei4uWHwuey5nLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5eIHMgcCBzIHMgcyBvICIsCi0iWCBfIF8gXyBfIFAgXSAtICogMiAqWCNYVi5tLk9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy5gLl8uNy4pLiguNC4zLjIuMi5RIHAgcyBzIHMgYiB1IG8gIiwKLSJYIGAgYCBgIGAgYCBgIDggLSAtIDcgVi5AWE9Yb1h2LmMuWFguWHwuai5nLmQuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcCBzIHMgcyB1IHUgbyAiLAotIlggUCBQICkgUCBVIFUgKSA4IC0gLSA3IE9Ybi52LmMuWFggWHwuai5oLmYuYS5wLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5PLnggcyBzIHMgcyBiIHUgdSBvICIsCi0iWCBMIEwgKSBIICkgTCBMIEwgOCAxIC0gNyBiLmMuei4gWHwuai5oLmYuYS4nLmkudS50LnIudy4wLl8uNy4pLjUuNC4zLjIuMi5RIHggcCBzIHMgcyBiIGIgdSBlIG8gIiwKLSJYIEwgRyBMIEcgRyBHIEcgRyBHIEcgLCAqIDIgVCAuWGwuai5oLmYuYS5wLmkudS50LnIuZS4wLl8uNy4pLjUuNC4zLjIuOC5eIHAgcCBzIHMgcyBzIHUgdSBlIGUgbyAiLAotIlggRyBHIEcgRyBHIEcgRyBLIEsgTSBNIDQgLCAsIDMgSSBnLmQuYS5wLmkudS50LnIuZS5gLl8uNy4pLjUuNC4zLjcuISBrIHAgcyBwIHMgcyBzIHUgdSB1IGUgdiBvICIsCi0iWCBLIEcgSyBLIEsgSyBLIEsgWiBaIE0gRiBGIDQgLCA8IDMgSSBwLmkudS50LnIudy45Ll8uNy4pLjUuNC5XIH4geiBhIHAgcCBzIHMgYiBzIHUgdSB1IGUgZSBlIG8gIiwKLSJYIEYgWiBGIEYgRiBGIFogWiBGIEYgUyBTIFMgUyBTIHcgOSA8IDIgNSAwIGwgcC5lLjkueS5hLmwgXiBqIGkgYSBwIHAgcCBzIHMgYiBiIGIgdSBlIHYgeSByIGUgbyAiLAotIlggUyBaIFogUyBaIFMgWiBTIFMgUyBTIFMgQyBDIEMgQSBtIGQgViBmIG0gQiBtIEIgZCBkIG4gZCBhIGEgYSBwIHMgcCBzIHMgYiB1IHUgdSB1IGUgdiBlIHIgdCBvICIsCi0iWCBTIFMgUyBTIFMgUyBTIFMgUyBTIEMgQyBDIG0gbSBBIFYgViBCIEIgQiBkIGQgZCBuIG4gYSBhIGEgcCBwIHMgcCBzIHMgYiB1IHUgdSBlIGUgZSBjIHQgciB0IG8gIiwKLSJYIEMgQyBDIEMgQyBDIEMgQyBtIEMgQSBtIEEgbSBmIFYgZiBmIEIgZCBkIGQgbiBuIG4gYSBhIGEgYSBzIHMgcyBzIHMgdSBiIHUgdSB1IHUgdiB0IHQgciB0IHQgbyAiLAotIllYbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBZWCIKLX07CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9jb250cmlidXRlZC9tb3RpZi9zb2xhcmlzL3NwYXJjL0VjbGlwc2UubS5wbSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2NvbnRyaWJ1dGVkL21vdGlmL3NvbGFyaXMvc3BhcmMvRWNsaXBzZS5tLnBtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRhYTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2NvbnRyaWJ1dGVkL21vdGlmL3NvbGFyaXMvc3BhcmMvRWNsaXBzZS5tLnBtCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qIFhQTSAqLwotc3RhdGljIGNoYXIgKlByb2R1Y3RJY29uMzJbXSA9IHsKLS8qIGNvbHVtbnMgcm93cyBjb2xvcnMgY2hhcnMtcGVyLXBpeGVsICovCi0iMzIgMzIgMjU3IDIiLAotIiAgIGMgYmxhY2siLAotIi4gIGMgZ3JheTEwMCIsCi0iWCAgYyAjNjk2OTVBNUFFOEU4IiwKLSJvICBjICM0OTQ5NDk0OTkxOTEiLAotIk8gIGMgI0U4RThDQkNCRTBFMCIsCi0iKyAgYyAjREREREIzQjNEMkQyIiwKLSJAICBjICNGMEYwREREREVCRUIiLAotIiMgIGMgI0NEQ0Q5MTkxQkVCRSIsCi0iJCAgYyAjQzhDODhCOEJCQkJCIiwKLSIlICBjICNDQUNBOTg5OEMyQzIiLAotIiYgIGMgI0MzQzM4QThBQkJCQiIsCi0iKiAgYyAjQkFCQTg3ODdCOUI5IiwKLSI9ICBjICNEQ0RDQzRDNERFREUiLAotIi0gIGMgI0M1QzVBM0EzQ0FDQSIsCi0iOyAgYyAjQURBRDgxODFCOEI4IiwKLSI6ICBjICNBM0EzN0E3QUI1QjUiLAotIj4gIGMgI0UyRTJENkQ2RTlFOSIsCi0iLCAgYyAjQjNCMzlBOUFDNEM0IiwKLSI8ICBjICNFQkVCRTNFM0YwRjAiLAotIjEgIGMgI0M5QzlCNkI2RDZENiIsCi0iMiAgYyAjOTY5Njc2NzZCOEI4IiwKLSIzICBjICM4QzhDNzE3MUFCQUIiLAotIjQgIGMgI0E0QTQ5MjkyQkVCRSIsCi0iNSAgYyAjN0Q3RDY1NjVBNkE2IiwKLSI2ICBjICM4MzgzNkQ2REFCQUIiLAotIjcgIGMgIzlBOUE4Nzg3QzJDMiIsCi0iOCAgYyAjN0I3QjY0NjRCN0I3IiwKLSI5ICBjICM1RTVFNTA1MDkxOTEiLAotIjAgIGMgIzY0NjQ1NzU3OUE5QSIsCi0icSAgYyAjODU4NTdCN0JCRUJFIiwKLSJ3ICBjICM3QzdDNzM3M0I2QjYiLAotImUgIGMgIzYyNjI1MzUzRDVENSIsCi0iciAgYyAjNjE2MTUzNTNENEQ0IiwKLSJ0ICBjICM2MDYwNTI1MkQxRDEiLAotInkgIGMgIzVGNUY1MjUyRDBEMCIsCi0idSAgYyAjNUY1RjUxNTFDRkNGIiwKLSJpICBjICM2MDYwNTM1M0QyRDIiLAotInAgIGMgIzVGNUY1MjUyQ0ZDRiIsCi0iYSAgYyAjNUU1RTUxNTFDRENEIiwKLSJzICBjICM1QzVDNEY0RkM3QzciLAotImQgIGMgIzVGNUY1MjUyQ0RDRCIsCi0iZiAgYyAjNUU1RTUxNTFDQkNCIiwKLSJnICBjICM1QjVCNEY0RkM0QzQiLAotImggIGMgIzVBNUE0RTRFQzFDMSIsCi0iaiAgYyAjNzE3MTY5NjlCMEIwIiwKLSJrICBjICM0ODQ4M0UzRUFEQUQiLAotImwgIGMgIzVENUQ1MTUxQ0RDRCIsCi0ieiAgYyAjNUM1QzUwNTBDOUM5IiwKLSJ4ICBjICM1RDVENTE1MUNCQ0IiLAotImMgIGMgIzVDNUM1MDUwQzdDNyIsCi0idiAgYyAjNUI1QjRGNEZDNkM2IiwKLSJiICBjICM1QjVCNTA1MEM2QzYiLAotIm4gIGMgIzU5NTk0RTRFQzFDMSIsCi0ibSAgYyAjNTg1ODRENERCRkJGIiwKLSJNICBjICM1OTU5NEY0RkMyQzIiLAotIk4gIGMgIzVBNUE0RjRGQzJDMiIsCi0iQiAgYyAjNTg1ODRENERCQ0JDIiwKLSJWICBjICM1NzU3NEQ0REJDQkMiLAotIkMgIGMgIzU5NTk0RTRFQkVCRSIsCi0iWiAgYyAjNTg1ODRFNEVCREJEIiwKLSJBICBjICM1ODU4NEQ0REJCQkIiLAotIlMgIGMgIzU3NTc0RDREQkFCQSIsCi0iRCAgYyAjNTY1NjRENERCOUI5IiwKLSJGICBjICM1NjU2NEM0Q0I2QjYiLAotIkcgIGMgIzU1NTU0QzRDQjZCNiIsCi0iSCAgYyAjNTQ1NDRCNEJCNEI0IiwKLSJKICBjICM1NDU0NEI0QkIxQjEiLAotIksgIGMgIzUzNTM0QjRCQjFCMSIsCi0iTCAgYyAjNTI1MjRBNEFBRUFFIiwKLSJQICBjICM1MTUxNDk0OUFDQUMiLAotIkkgIGMgIzUxNTE0OTQ5QUJBQiIsCi0iVSAgYyAjNDc0NzQxNDE4Nzg3IiwKLSJZICBjICMzMjMyMkMyQzhGOEYiLAotIlQgIGMgIzJCMkIyNTI1Nzc3NyIsCi0iUiAgYyAjMzYzNjJGMkY5Njk2IiwKLSJFICBjICMyQjJCMjYyNjZFNkUiLAotIlcgIGMgIzRENEQ0NTQ1QUNBQyIsCi0iUSAgYyAjNTU1NTRENERCOEI4IiwKLSIhICBjICM1NDU0NEM0Q0I0QjQiLAotIn4gIGMgIzU0NTQ0QzRDQjNCMyIsCi0iXiAgYyAjNTE1MTRBNEFBQ0FDIiwKLSIvICBjICM1MTUxNEE0QUFCQUIiLAotIiggIGMgIzUwNTA0OTQ5QTlBOSIsCi0iKSAgYyAjNEY0RjQ5NDlBNkE2IiwKLSJfICBjICM0QzRDNDc0N0ExQTEiLAotImAgIGMgIzRFNEU0ODQ4QTNBMyIsCi0iJyAgYyAjNEQ0RDQ4NDhBMUExIiwKLSJdICBjICM0QjRCNDY0NjlDOUMiLAotIlsgIGMgIzRDNEM0NzQ3OUU5RSIsCi0ieyAgYyAjNTE1MTRDNENBNkE2IiwKLSJ9ICBjICNBOUE5QTZBNkQ1RDUiLAotInwgIGMgIzFFMUUxQTFBNjY2NiIsCi0iIC4gYyAjMjkyOTI1MjU4MTgxIiwKLSIuLiBjICMzRDNEMzkzOTkyOTIiLAotIlguIGMgIzRBNEE0NjQ2OUI5QiIsCi0iby4gYyAjNTM1MzRFNEVBQkFCIiwKLSJPLiBjICM0OTQ5NDU0NTk3OTciLAotIisuIGMgIzRBNEE0NjQ2OTk5OSIsCi0iQC4gYyAjNDc0NzQ0NDQ5NDk0IiwKLSIjLiBjICM0ODQ4NDU0NTk0OTQiLAotIiQuIGMgIzQ3NDc0NDQ0OTI5MiIsCi0iJS4gYyAjNDY0NjQzNDM5MDkwIiwKLSImLiBjICM0NjQ2NDI0MjhEOEQiLAotIiouIGMgIzU0NTQ1MDUwQTlBOSIsCi0iPS4gYyAjNDc0NzQ0NDQ4RjhGIiwKLSItLiBjICM0QzRDNDk0OTk5OTkiLAotIjsuIGMgIzU3NTc1NDU0QTZBNiIsCi0iOi4gYyAjNUI1QjU3NTdBQUFBIiwKLSI+LiBjICM1NDU0NTE1MTlCOUIiLAotIiwuIGMgIzVBNUE1NzU3OUM5QyIsCi0iPC4gYyAjNjU2NTYyNjJBN0E3IiwKLSIxLiBjICM2ODY4NjY2NkEyQTIiLAotIjIuIGMgI0NBQ0FDOUM5RTVFNSIsCi0iMy4gYyAjMDUwNTA0MDQ1MTUxIiwKLSI0LiBjICMwODA4MDcwNzU0NTQiLAotIjUuIGMgIzBBMEEwOTA5NTg1OCIsCi0iNi4gYyAjMEMwQzBBMEE1ODU4IiwKLSI3LiBjICMxMDEwMEUwRTYyNjIiLAotIjguIGMgIzBFMEUwRDBENUE1QSIsCi0iOS4gYyAjMTIxMjExMTE1RDVEIiwKLSIwLiBjICMxMzEzMTIxMjVENUQiLAotInEuIGMgIzE2MTYxNTE1NjE2MSIsCi0idy4gYyAjMTcxNzE2MTY2MTYxIiwKLSJlLiBjICMxQTFBMTkxOTY1NjUiLAotInIuIGMgIzIwMjAxRTFFNzA3MCIsCi0idC4gYyAjMUUxRTFEMUQ2OTY5IiwKLSJ5LiBjICMyQTJBMjkyOTc2NzYiLAotInUuIGMgIzJGMkYyRDJENzY3NiIsCi0iaS4gYyAjM0EzQTM5Mzk4Nzg3IiwKLSJwLiBjICMzQTNBMzkzOTgzODMiLAotImEuIGMgIzNGM0YzRTNFODg4OCIsCi0icy4gYyAjNDE0MTQwNDA4OTg5IiwKLSJkLiBjICM0NTQ1NDM0MzhEOEQiLAotImYuIGMgIzQ0NDQ0MjQyOEI4QiIsCi0iZy4gYyAjNDQ0NDQzNDM4QzhDIiwKLSJoLiBjICM0MzQzNDI0MjhBOEEiLAotImouIGMgIzQzNDM0MTQxODg4OCIsCi0iay4gYyAjNDM0MzQyNDI4OTg5IiwKLSJsLiBjICM0MjQyNDE0MTg3ODciLAotInouIGMgIzQzNDM0MjQyODc4NyIsCi0ieC4gYyAjNDI0MjQxNDE4NTg1IiwKLSJjLiBjICM0MTQxM0YzRjgxODEiLAotInYuIGMgIzQxNDE0MDQwODI4MiIsCi0iYi4gYyAjNDg0ODQ2NDY4RDhEIiwKLSJuLiBjICM0OTQ5NDg0ODkwOTAiLAotIm0uIGMgIzRCNEI0QTRBOTE5MSIsCi0iTS4gYyAjNEI0QjQ5NDk4RThFIiwKLSJOLiBjICM1MjUyNTE1MTlBOUEiLAotIkIuIGMgIzUyNTI1MTUxOTk5OSIsCi0iVi4gYyAjNTY1NjU0NTQ5QTlBIiwKLSJDLiBjICM1NDU0NTM1Mzk0OTQiLAotIlouIGMgIzYwNjA1RjVGQTdBNyIsCi0iQS4gYyAjNjQ2NDYzNjNBQkFCIiwKLSJTLiBjICM1QTVBNTk1OTk3OTciLAotIkQuIGMgIzY4Njg2NzY3QURBRCIsCi0iRi4gYyAjNkM2QzZCNkJCMkIyIiwKLSJHLiBjICM1RTVFNUQ1RDlBOUEiLAotIkguIGMgIzc2NzY3NTc1QkFCQSIsCi0iSi4gYyAjNzg3ODc3NzdCQkJCIiwKLSJLLiBjICM3Njc2NzQ3NEI1QjUiLAotIkwuIGMgIzdFN0U3RDdEQkFCQSIsCi0iUC4gYyAjQTVBNUE0QTREMkQyIiwKLSJJLiBjICMwNDA0MDQwNDUyNTIiLAotIlUuIGMgIzA3MDcwNzA3NTQ1NCIsCi0iWS4gYyAjMDcwNzA4MDg1MzUzIiwKLSJULiBjICMwODA4MDgwODU0NTQiLAotIlIuIGMgIzBBMEEwQjBCNTc1NyIsCi0iRS4gYyAjMEUwRTBFMEU1QTVBIiwKLSJXLiBjICMxMTExMTIxMjVFNUUiLAotIlEuIGMgIzExMTExMTExNUU1RSIsCi0iIS4gYyAjMTExMTExMTE1RDVEIiwKLSJ+LiBjICMxMTExMTIxMjVENUQiLAotIl4uIGMgIzE2MTYxNjE2Njg2OCIsCi0iLy4gYyAjMTUxNTE2MTY2MTYxIiwKLSIoLiBjICMxNTE1MTUxNTYxNjEiLAotIikuIGMgIzE5MTkxQTFBNjU2NSIsCi0iXy4gYyAjMTkxOTE5MTk2NTY1IiwKLSJgLiBjICMxQTFBMUExQTY0NjQiLAotIicuIGMgIzFEMUQxRTFFNjk2OSIsCi0iXS4gYyAjMUUxRTFFMUU2OTY5IiwKLSJbLiBjICMyMjIyMjIyMjZENkQiLAotInsuIGMgIzI3MjcyNzI3NzE3MSIsCi0ifS4gYyAjMkIyQjJDMkM3Njc2IiwKLSJ8LiBjICMyQjJCMkIyQjc2NzYiLAotIiBYIGMgIzJCMkIyQjJCNzU3NSIsCi0iLlggYyAjMzAzMDMwMzA3QTdBIiwKLSJYWCBjICMzMDMwMzAzMDc5NzkiLAotIm9YIGMgIzM1MzUzNTM1N0Y3RiIsCi0iT1ggYyAjMzkzOTM5Mzk4MzgzIiwKLSIrWCBjICMzQTNBM0EzQTgzODMiLAotIkBYIGMgIzNGM0YzRjNGODc4NyIsCi0iI1ggYyAjNDM0MzQzNDM4QzhDIiwKLSIkWCBjICM0MzQzNDQ0NDhDOEMiLAotIiVYIGMgIzQyNDI0MjQyODY4NiIsCi0iJlggYyAjNDE0MTQxNDE4NDg0IiwKLSIqWCBjICM0ODQ4NDg0ODkxOTEiLAotIj1YIGMgIzQ4NDg0OTQ5OTA5MCIsCi0iLVggYyAjNEQ0RDRENEQ5Njk2IiwKLSI7WCBjICM1MTUxNTE1MTlEOUQiLAotIjpYIGMgIzRENEQ0RDREOTU5NSIsCi0iPlggYyAjNTE1MTUyNTI5QTlBIiwKLSIsWCBjICM1MTUxNTI1Mjk5OTkiLAotIjxYIGMgIzUyNTI1MjUyOUE5QSIsCi0iMVggYyAjNTI1MjUyNTI5OTk5IiwKLSIyWCBjICM1NjU2NTc1NzlFOUUiLAotIjNYIGMgIzU3NTc1NzU3OUQ5RCIsCi0iNFggYyAjNUI1QjVCNUJBMkEyIiwKLSI1WCBjICM1RjVGNjA2MEE2QTYiLAotIjZYIGMgIzVGNUY1RjVGQTZBNiIsCi0iN1ggYyAjNjM2MzY0NjRBQUFBIiwKLSI4WCBjICM2NDY0NjQ2NEFBQUEiLAotIjlYIGMgIzY3Njc2NzY3QUVBRSIsCi0iMFggYyAjNjc2NzY4NjhBRUFFIiwKLSJxWCBjICM2ODY4Njg2OEFFQUUiLAotIndYIGMgIzZGNkY2RjZGQjVCNSIsCi0iZVggYyAjNkM2QzZDNkNCMUIxIiwKLSJyWCBjICM3MzczNzM3M0I4QjgiLAotInRYIGMgIzgyODI4MjgyQkVCRSIsCi0ieVggYyAjODY4Njg2ODZDMkMyIiwKLSJ1WCBjICM4OTg5ODk4OUM0QzQiLAotImlYIGMgIzk4OTg5ODk4Q0JDQiIsCi0icFggYyAjQTBBMEEwQTBDRkNGIiwKLSJhWCBjICNBOUE5QTlBOUQ1RDUiLAotInNYIGMgI0IwQjBCMEIwRDhEOCIsCi0iZFggYyAjQjhCOEI4QjhEREREIiwKLSJmWCBjICNCREJEQkRCREUwRTAiLAotImdYIGMgI0Q5RDlEOUQ5RURFRCIsCi0iaFggYyAjOTA5MDkxOTFDNkM2IiwKLSJqWCBjICM3MTcxODk4OUJDQkMiLAotImtYIGMgIzczNzM4QjhCQkZCRiIsCi0ibFggYyAjNzI3Mjg5ODlCQ0JDIiwKLSJ6WCBjICM3OTc5OTA5MEMzQzMiLAotInhYIGMgIzdFN0U5NTk1QzdDNyIsCi0iY1ggYyAjODE4MTk4OThDQUNBIiwKLSJ2WCBjICM4NDg0OUI5QkNDQ0MiLAotImJYIGMgIzhDOENBM0EzRDRENCIsCi0iblggYyAjNzE3MThBOEFCQ0JDIiwKLSJtWCBjICM3MzczOEI4QkJEQkQiLAotIk1YIGMgIzc1NzU4RDhEQkZCRiIsCi0iTlggYyAjNzQ3NDhDOENCRUJFIiwKLSJCWCBjICM3Njc2OEU4RUMwQzAiLAotIlZYIGMgIzdDN0M5NDk0QzZDNiIsCi0iQ1ggYyAjN0I3QjkzOTNDNEM0IiwKLSJaWCBjICM3RjdGOTc5N0M5QzkiLAotIkFYIGMgIzgyODI5QTlBQ0JDQiIsCi0iU1ggYyAjODU4NTlFOUVDRUNFIiwKLSJEWCBjICM4ODg4QTBBMEQxRDEiLAotIkZYIGMgIzg3ODc5RjlGRDBEMCIsCi0iR1ggYyAjOEI4QkE0QTRENEQ0IiwKLSJIWCBjICM4QjhCQTNBM0Q0RDQiLAotIkpYIGMgIzg5ODlBMUExRDJEMiIsCi0iS1ggYyAjOEQ4REE1QTVENkQ2IiwKLSJMWCBjICM4QjhCQTNBM0QzRDMiLAotIlBYIGMgIzhFOEVBNkE2RDZENiIsCi0iSVggYyAjOEQ4REE1QTVENUQ1IiwKLSJVWCBjIGdyYXkxMDAiLAotIllYIGMgTm9uZSIsCi0vKiBwaXhlbHMgKi8KLSJZWFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFlYIiwKLSJYIHYudi52LnYuJlhsLnouay4mLmQuJS4kLkAuTy4rLl0gWyBfIGAgKSAoIF4gTCBLICEgRyBEIFYgbSBtIG8gIiwKLSJYIGMuYy5jLnYuJlh4LnouZi5mLmQuJS4kLiMuTy4rLlguWyBfIGAgKSAoIC8gTCBLIEggRiBEIFYgQyBuIG8gIiwKLSJYIHYuYy52LnYueC54Lnouay5mLm4uVi4sLj4uLS4rLl0gWyBfIGAgKSAoIF4gTCBLIEggRyBEIFYgQyBoIG8gIiwKLSJYICZYdi4mWHgueC5sLmouTS4xLjQgLSAtICwgNyBxIEouSC5LLmogOi4qLlAgTCBLIEggRiBTIEIgQyBuIG8gIiwKLSJYIHguJlh4Lnguei5qLlMuLCA9ID0gMSB9IGlYdVhILnJYd1hGLnFYN1haLjsuby5KICEgRiBTIEIgbSBuIG8gIiwKLSJYIHgubC56LiVYei5HLjEgQCA+IDIuZFhhWGlYdVhyWHdYRi5xWDhYNVg0WDJYO1h7IEggRiBTIFYgQyBuIG8gIiwKLSJYIHouai5qLmouQy4xIEAgPCBnWDIuZlhhWHBYdVh3WGVYOVg3WDVYNFgyWE4uOlgqWF8gRCBTIFogbSBoIG8gIiwKLSJYIGsuay5oLmIuLCBPID4gZ1hnWDIuZFhhWGlYeVhGLkQuQS5aLjRYM1gxWDpYbi5nLmEuXyBWIEIgbSBOIG8gIiwKLSJYIGYuZi5mLjMgKyA9IDIuMi4yLmZYc1hwWGhYdFhELjhYWi40WDJYMVg6WCpYJFhAWHAuaS5XIEMgbiBOIG8gIiwKLSJYIGQuJi4lLiUgKyAxIGRYZFhkWHNYUC5pWHlYSy44WDVYNFgyWD5YOlgqWGcuYS4rWG9YLlguLm0gbiBOIG8gIiwKLSJYICUuPS41ICUgLSBQLn0gYVhQLnBYaVh5WEsuRC5aLjRYM1gxWC1Ybi4kWEBYK1hvWC5YIFh5LlcgaCBnIG8gIiwKLSJYICQuJC46ICMgUFhJWEdYR1hMWEpYRlhGWFNYdlhBWGNYWlh4WFZYQ1h6WHpYQlhNWGtYbVhuWGpYaCBnIG8gIiwKLSJYICMuQC4qICQgNyB5WHVYeVh0WEwuSy5ELjZYNFgyWDFYOlhvIGcuYS5PWG9YLlh8LnsuWy50LiAuZyB2IG8gIiwKLSJYIE8uIy4kICQgcSBILnJYd1hGLjBYQS42WDRYMlgxWDpYbyAkWGEucC5vWC5YfC57LlsuJy5gLnIuZyBiIG8gIiwKLSJYIFguKy4kICQgUFhLWGJYYlhMWEpYRFhGWFNYdlhBWGNYWlh4WENYQ1h6WEJYQlhNWE5YbVhsWGpYYiBjIG8gIiwKLSJYIF0gXSAkICQgSC53WEYuMFg3WDZYNFgyWDxYOlhvICNYYS4rWG9YLlh8LnsuWy5dLikuLy5+LlEuYyB6IG8gIiwKLSJYIFsgWyAmICYgdyBGLnFYN1haLjRYMlgsWDpYbyAjWGEuK1hvWC5YfS57LlsuJy5lLi8uOS5FLl4uYyB6IG8gIiwKLSJYICcgXyAqICYgUFhLWGJYSFhMWEpYRFhTWFNYdlhBWGNYWlh4WFZYQ1h6WHpYQlhNWE5Ya1hqWGpYeiB4IG8gIiwKLSJYIGAgYCA6ICYgMiA4WFouNFgyWEIuOlgqWGcuQFhwLm9YLlh8LnsuWy5dLikucS4hLkUuUi5VLlkgeiBmIG8gIiwKLSJYICkgKSA1ICYgOyA8LjRYMlg+WDpYbyAjWGEuK1hvWFhYfC57LlsudC5fLnEufi5FLlIuNC41LmsgeCBhIG8gIiwKLSJYICggKCBJIDsgKiA2IDJYPlg6WD1YJFhAWCtYb1guWHwuey5bLnQuZS4vLlcuRS5SLlkuMy4gLnogYSBhIG8gIiwKLSJYIEkgXiAvIDggKiA6IDAgOlgqWCNYQFgrWG9YLlh8LnsuWy4nLl8uKC5+LkUuUi5ULjMuNy5rIHggYSBwIG8gIiwKLSJYIEwgTCBMIF4gMiAqIDMgbS4kWGEucC5vWC5YfS57LlsudC4pLigufi5FLjYuVC4zLkkuUiB4IGEgYSB5IG8gIiwKLSJYIEogSyBLIEsgSyAyICogNSBzLk9Yb1guWH0uey5bLicuXy4oLjkuOC5SLjQuMy5JLlkgeCBsIGEgcCB0IG8gIiwKLSJYIH4gSCBIICEgISAhIDIgOyA1IFUgWFh9LnsuWy5dLmUuKC5XLkUuUi5VLjMuNy5SIHggbCB1IHUgeSB0IG8gIiwKLSJYIEcgRiBHIEcgRyBRIFEgOCA6IDMgOSB1LlsuXS5fLi8uUS5FLlIuVC42LiAuayB4IGEgYSB1IHQgdCB0IG8gIiwKLSJYIEQgUyBEIFMgRCBTIFMgUyBWIDggMiA2IDkgYy5FIHcuMC58IFQgWSBrIHogeiBhIGEgcCB0IHQgaSByIG8gIiwKLSJYIEEgViBCIFYgViBWIEIgQiBtIG0gbiBuIGggaCBnIGcgZyBjIHogeiB6IGwgbCBkIHAgeSB0IGkgciByIG8gIiwKLSJYIG0gQyBDIEMgQyBDIEMgQyBuIG4gbiBNIE4gZyBnIGIgYyB6IHogeCBhIGEgYSB1IHkgdCB0IHIgciBlIG8gIiwKLSJYIG4gbiBuIG4gbiBoIGggaCBOIE4gZyBnIHYgYiBzIHogeiB6IHggYSBwIHAgdSB0IHQgciByIHIgZSBlIG8gIiwKLSJZWG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIFlYIgotfTsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2NvbnRyaWJ1dGVkL21vdGlmL3NvbGFyaXMvc3BhcmMvRWNsaXBzZS5zLnBtIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvY29udHJpYnV0ZWQvbW90aWYvc29sYXJpcy9zcGFyYy9FY2xpcHNlLnMucG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYjkzNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvY29udHJpYnV0ZWQvbW90aWYvc29sYXJpcy9zcGFyYy9FY2xpcHNlLnMucG0KKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyogWFBNICovCi1zdGF0aWMgY2hhciAqUHJvZHVjdEljb24yNFtdID0gewotLyogY29sdW1ucyByb3dzIGNvbG9ycyBjaGFycy1wZXItcGl4ZWwgKi8KLSIyNCAyNCAyNTcgMiIsCi0iICAgYyBibGFjayIsCi0iLiAgYyBncmF5MTAwIiwKLSJYICBjICM2OTY5NUE1QUU4RTgiLAotIm8gIGMgIzQ5NDk0OTQ5OTE5MSIsCi0iTyAgYyAjRjFGMURGREZFQ0VDIiwKLSIrICBjICNEN0Q3QUNBQ0NEQ0QiLAotIkAgIGMgI0RGREZCQkJCRDZENiIsCi0iIyAgYyAjRTJFMkM0QzREQkRCIiwKLSIkICBjICNDRUNFOUM5Q0M0QzQiLAotIiUgIGMgI0M0QzQ4QjhCQkFCQSIsCi0iJiAgYyAjQzJDMjhBOEFCQUJBIiwKLSIqICBjICNDNEM0OEU4RUJDQkMiLAotIj0gIGMgI0JGQkY4QThBQjlCOSIsCi0iLSAgYyAjRUJFQkQ5RDlFOUU5IiwKLSI7ICBjICNCRkJGODg4OEI5QjkiLAotIjogIGMgI0Q4RDhCOUI5RDZENiIsCi0iPiAgYyAjQjlCOTg2ODZCOUI5IiwKLSIsICBjICNCOEI4ODk4OUI5QjkiLAotIjwgIGMgI0JCQkI5MzkzQkZCRiIsCi0iMSAgYyAjQTlBOTdCN0JCMkIyIiwKLSIyICBjICNFNEU0RDRENEU3RTciLAotIjMgIGMgI0M2QzZBRkFGQ0VDRSIsCi0iNCAgYyAjQTZBNjgwODBCNkI2IiwKLSI1ICBjICNBMkEyN0U3RUI0QjQiLAotIjYgIGMgIzlFOUU3RTdFQjFCMSIsCi0iNyAgYyAjQUJBQjkwOTBCQkJCIiwKLSI4ICBjICNCN0I3QTBBMEM1QzUiLAotIjkgIGMgIzlEOUQ3QzdDQjJCMiIsCi0iMCAgYyAjQUFBQThCOEJCRUJFIiwKLSJxICBjICNBQUFBOTA5MEJDQkMiLAotIncgIGMgIzhDOEM2QjZCQUJBQiIsCi0iZSAgYyAjOTA5MDcwNzBCMUIxIiwKLSJyICBjICNDNEM0QjNCM0Q3RDciLAotInQgIGMgI0NEQ0RCRkJGRERERCIsCi0ieSAgYyAjRUFFQUU0RTRGMUYxIiwKLSJ1ICBjICM4ODg4NkE2QUFEQUQiLAotImkgIGMgIzlFOUU4NTg1QzFDMSIsCi0icCAgYyAjODQ4NDZBNkFBRkFGIiwKLSJhICBjICM4MTgxNkI2QkFBQUEiLAotInMgIGMgI0Q3RDdDRkNGRTZFNiIsCi0iZCAgYyAjODE4MTY5NjlCMUIxIiwKLSJmICBjICM3ODc4NjM2M0E1QTUiLAotImcgIGMgIzZFNkU1RDVEOUM5QyIsCi0iaCAgYyAjNzE3MTYwNjA5RDlEIiwKLSJqICBjICM4MzgzNzQ3NEFBQUEiLAotImsgIGMgIzZBNkE1NzU3QTNBMyIsCi0ibCAgYyAjNkU2RTVFNUVBMEEwIiwKLSJ6ICBjICM1RTVFNTA1MDkyOTIiLAotInggIGMgIzg4ODg3QjdCQkNCQyIsCi0iYyAgYyAjNjg2ODU4NThBQkFCIiwKLSJ2ICBjICM1QTVBNEQ0REEyQTIiLAotImIgIGMgIzdEN0Q3MzczQjRCNCIsCi0ibiAgYyAjNUE1QTRFNEVBNkE2IiwKLSJtICBjICM1RjVGNTY1Njk1OTUiLAotIk0gIGMgIzU2NTY0QTRBQkJCQiIsCi0iTiAgYyAjNTY1NjQ5NDlCOUI5IiwKLSJCICBjICM1NTU1NDk0OUI4QjgiLAotIlYgIGMgIzUzNTM0ODQ4QjNCMyIsCi0iQyAgYyAjNTQ1NDQ5NDlCNEI0IiwKLSJaICBjICM1MjUyNDc0N0IwQjAiLAotIkEgIGMgIzUyNTI0NzQ3QUZBRiIsCi0iUyAgYyAjNUI1QjUzNTM5MzkzIiwKLSJEICBjICMzRTNFMzYzNjk3OTciLAotIkYgIGMgIzQ5NDk0MDQwQTZBNiIsCi0iRyAgYyAjNDg0ODQwNDBBNUE1IiwKLSJIICBjICM1NTU1NEE0QUJBQkEiLAotIkogIGMgIzU0NTQ0OTQ5QjdCNyIsCi0iSyAgYyAjNTM1MzQ5NDlCNEI0IiwKLSJMICBjICM1MTUxNDc0N0FGQUYiLAotIlAgIGMgIzUyNTI0ODQ4QjFCMSIsCi0iSSAgYyAjNTE1MTQ4NDhCMEIwIiwKLSJVICBjICM1MTUxNDg0OEFFQUUiLAotIlkgIGMgIzUxNTE0NzQ3QURBRCIsCi0iVCAgYyAjNTE1MTQ4NDhBREFEIiwKLSJSICBjICM0RjRGNDc0N0FCQUIiLAotIkUgIGMgIzUwNTA0NzQ3QUJBQiIsCi0iVyAgYyAjNTA1MDQ2NDZBOUE5IiwKLSJRICBjICM0RjRGNDY0NkE4QTgiLAotIiEgIGMgIzRFNEU0NjQ2QTdBNyIsCi0ifiAgYyAjNEU0RTQ1NDVBNEE0IiwKLSJeICBjICM0RDRENDU0NUE0QTQiLAotIi8gIGMgIzRFNEU0NjQ2QTVBNSIsCi0iKCAgYyAjNEQ0RDQ1NDVBMUExIiwKLSIpICBjICMzRDNEMzYzNjdFN0UiLAotIl8gIGMgIzRCNEI0NDQ0OUM5QyIsCi0iYCAgYyAjMkEyQTI1MjU3RjdGIiwKLSInICBjICMzRTNFMzczNzk4OTgiLAotIl0gIGMgIzQ3NDc0MDQwOUM5QyIsCi0iWyAgYyAjNEQ0RDQ2NDZBNEE0IiwKLSJ7ICBjICM0QzRDNDU0NUEyQTIiLAotIn0gIGMgIzRENEQ0NjQ2QTJBMiIsCi0ifCAgYyAjNEQ0RDQ2NDZBMUExIiwKLSIgLiBjICM0QjRCNDU0NTlGOUYiLAotIi4uIGMgIzRDNEM0NTQ1OUY5RiIsCi0iWC4gYyAjNEM0QzQ2NDY5RjlGIiwKLSJvLiBjICM0QjRCNDU0NTlEOUQiLAotIk8uIGMgIzQ5NDk0MzQzOTg5OCIsCi0iKy4gYyAjNDk0OTQ0NDQ5QTlBIiwKLSJALiBjICM0QTRBNDU0NTlBOUEiLAotIiMuIGMgIzQ5NDk0NDQ0OTg5OCIsCi0iJC4gYyAjNDg0ODQzNDM5Njk2IiwKLSIlLiBjICM0OTQ5NDQ0NDk3OTciLAotIiYuIGMgIzQ4NDg0MzQzOTU5NSIsCi0iKi4gYyAjNTE1MTRDNENBMUExIiwKLSI9LiBjICM2QjZCNjc2N0FFQUUiLAotIi0uIGMgIzk1OTU5MTkxQzlDOSIsCi0iOy4gYyAjMjMyMzFGMUY3Njc2IiwKLSI6LiBjICMyMTIxMUUxRTcwNzAiLAotIj4uIGMgIzI5MjkyNTI1N0Y3RiIsCi0iLC4gYyAjMjUyNTIxMjE3MDcwIiwKLSI8LiBjICMyNDI0MjEyMTZENkQiLAotIjEuIGMgIzJCMkIyNzI3ODA4MCIsCi0iMi4gYyAjMzkzOTM1MzU4QzhDIiwKLSIzLiBjICM0NDQ0NDA0MDk0OTQiLAotIjQuIGMgIzNCM0IzODM4ODI4MiIsCi0iNS4gYyAjNDc0NzQzNDM5NDk0IiwKLSI2LiBjICM0ODQ4NDQ0NDk1OTUiLAotIjcuIGMgIzQ3NDc0MzQzOTM5MyIsCi0iOC4gYyAjNDc0NzQ0NDQ5MzkzIiwKLSI5LiBjICM0NjQ2NDM0MzkxOTEiLAotIjAuIGMgIzQ1NDU0MjQyOEY4RiIsCi0icS4gYyAjNEE0QTQ3NDc5ODk4IiwKLSJ3LiBjICM0NjQ2NDM0MzhGOEYiLAotImUuIGMgIzQ1NDU0MjQyOEQ4RCIsCi0ici4gYyAjNDQ0NDQxNDE4QjhCIiwKLSJ0LiBjICM0ODQ4NDQ0NDkxOTEiLAotInkuIGMgIzQ0NDQ0MTQxODk4OSIsCi0idS4gYyAjNDk0OTQ2NDY5MDkwIiwKLSJpLiBjICM0QzRDNDg0ODkzOTMiLAotInAuIGMgIzUxNTE0RTRFOUU5RSIsCi0iYS4gYyAjNzM3MzcwNzBCNkI2IiwKLSJzLiBjICM3Nzc3NzQ3NEJCQkIiLAotImQuIGMgI0EwQTA5RTlFRDFEMSIsCi0iZi4gYyAjRDZENkQ1RDVFQkVCIiwKLSJnLiBjICMwRTBFMEQwRDVBNUEiLAotImguIGMgIzExMTEwRjBGNUU1RSIsCi0iai4gYyAjMTIxMjExMTE1RTVFIiwKLSJrLiBjICMxMzEzMTIxMjVGNUYiLAotImwuIGMgIzE3MTcxNjE2NjM2MyIsCi0iei4gYyAjMUQxRDFCMUI2ODY4IiwKLSJ4LiBjICMxRDFEMUMxQzY4NjgiLAotImMuIGMgIzIyMjIyMTIxNkU2RSIsCi0idi4gYyAjMjIyMjIxMjE2RDZEIiwKLSJiLiBjICMyODI4MjcyNzc0NzQiLAotIm4uIGMgIzI4MjgyNzI3NzM3MyIsCi0ibS4gYyAjMjkyOTI4Mjg3MzczIiwKLSJNLiBjICMyRjJGMkUyRTc5NzkiLAotIk4uIGMgIzM1MzUzNDM0N0Y3RiIsCi0iQi4gYyAjMzYzNjM1MzU4MTgxIiwKLSJWLiBjICMzQzNDM0IzQjg1ODUiLAotIkMuIGMgIzQyNDI0MTQxOEM4QyIsCi0iWi4gYyAjNDI0MjQxNDE4QjhCIiwKLSJBLiBjICM0NDQ0NDI0MjhCOEIiLAotIlMuIGMgIzQzNDM0MTQxODk4OSIsCi0iRC4gYyAjNDM0MzQyNDI4OTg5IiwKLSJGLiBjICM0MjQyNDE0MTg3ODciLAotIkcuIGMgIzQxNDE0MDQwODQ4NCIsCi0iSC4gYyAjNDc0NzQ1NDU4RDhEIiwKLSJKLiBjICM0MzQzNDI0Mjg3ODciLAotIksuIGMgIzQyNDI0MTQxODU4NSIsCi0iTC4gYyAjNDE0MTQwNDA4MjgyIiwKLSJQLiBjICM0OTQ5NDg0ODkxOTEiLAotIkkuIGMgIzRGNEY0RTRFOTc5NyIsCi0iVS4gYyAjNTk1OTU3NTdBNkE2IiwKLSJZLiBjICM1RjVGNUQ1REE0QTQiLAotIlQuIGMgIzZDNkM2QjZCQjNCMyIsCi0iUi4gYyAjN0M3QzdCN0JCOUI5IiwKLSJFLiBjICNBOEE4QTdBN0QzRDMiLAotIlcuIGMgIzBEMEQwRDBENUE1QSIsCi0iUS4gYyAjMUYxRjFGMUY2QzZDIiwKLSIhLiBjICMyMjIyMjIyMjZFNkUiLAotIn4uIGMgIzNCM0IzQjNCODU4NSIsCi0iXi4gYyAjNDE0MTQxNDE4QzhDIiwKLSIvLiBjICM0MTQxNDE0MThCOEIiLAotIiguIGMgIzQyNDI0MjQyOEI4QiIsCi0iKS4gYyAjNDg0ODQ4NDg5MjkyIiwKLSJfLiBjICM0MDQwNDA0MDgxODEiLAotImAuIGMgIzRFNEU0RTRFOTg5OCIsCi0iJy4gYyAjNTU1NTU1NTU5RTlFIiwKLSJdLiBjICM1NTU1NTU1NTlEOUQiLAotIlsuIGMgIzVCNUI1QjVCQTNBMyIsCi0iey4gYyAjNUM1QzVDNUNBM0EzIiwKLSJ9LiBjICM2MTYxNjE2MUE5QTkiLAotInwuIGMgIzY2NjY2NjY2QUVBRSIsCi0iIFggYyAjNjY2NjY2NjZBREFEIiwKLSIuWCBjICM2QjZCNkI2QkIyQjIiLAotIlhYIGMgIzcwNzA3MDcwQjdCNyIsCi0ib1ggYyAjNkE2QTZBNkFBREFEIiwKLSJPWCBjICM3NDc0NzQ3NEJCQkIiLAotIitYIGMgIzg5ODk4OTg5QzJDMiIsCi0iQFggYyAjOTA5MDkwOTBDOEM4IiwKLSIjWCBjICM4RjhGOEY4RkM2QzYiLAotIiRYIGMgIzkyOTI5MjkyQzZDNiIsCi0iJVggYyAjOUY5RjlGOUZDRkNGIiwKLSImWCBjICNBNUE1QTVBNUQyRDIiLAotIipYIGMgI0I1QjVCNUI1REJEQiIsCi0iPVggYyAjQjhCOEI4QjhERURFIiwKLSItWCBjICNCN0I3QjdCN0RDREMiLAotIjtYIGMgI0JCQkJCQkJCREVERSIsCi0iOlggYyAjQkRCREJEQkRERkRGIiwKLSI+WCBjICNDOUM5QzlDOUU1RTUiLAotIixYIGMgI0QxRDFEMUQxRUFFQSIsCi0iPFggYyAjN0M3QzdEN0RCQUJBIiwKLSIxWCBjICM4OTg5OEE4QUM3QzciLAotIjJYIGMgIzhGOEY5MDkwQzdDNyIsCi0iM1ggYyAjQTNBM0E0QTREM0QzIiwKLSI0WCBjICNBMkEyQjVCNURFREUiLAotIjVYIGMgI0FEQURCREJERTFFMSIsCi0iNlggYyAjQjlCOUM3QzdFNUU1IiwKLSI3WCBjICNCQUJBQzhDOEU2RTYiLAotIjhYIGMgIzhFOEVBNkE2RDZENiIsCi0iOVggYyAjOTA5MEE3QTdEN0Q3IiwKLSIwWCBjICM5MTkxQTlBOUQ3RDciLAotInFYIGMgIzkyOTJBOUE5RDhEOCIsCi0id1ggYyAjOTQ5NEFCQUJEOEQ4IiwKLSJlWCBjICM5ODk4QUVBRUQ5RDkiLAotInJYIGMgIzlCOUJCMEIwREFEQSIsCi0idFggYyAjOUU5RUIzQjNEQ0RDIiwKLSJ5WCBjICNBMUExQjVCNUREREQiLAotInVYIGMgI0E1QTVCOEI4REVERSIsCi0iaVggYyAjQThBOEJCQkJFMEUwIiwKLSJwWCBjICNBQ0FDQkVCRUUxRTEiLAotImFYIGMgI0FGQUZDMEMwRTNFMyIsCi0ic1ggYyAjQjNCM0MzQzNFNEU0IiwKLSJkWCBjICNCMkIyQzJDMkUzRTMiLAotImZYIGMgI0I1QjVDNUM1RTVFNSIsCi0iZ1ggYyAjQjhCOEM3QzdFNkU2IiwKLSJoWCBjICNCNkI2QzVDNUU0RTQiLAotImpYIGMgIzk3OTdBRUFFRDlEOSIsCi0ia1ggYyAjQTFBMUI2QjZEREREIiwKLSJsWCBjICNBOEE4QkJCQkRGREYiLAotInpYIGMgZ3JheTEwMCIsCi0ieFggYyBibGFjayIsCi0iY1ggYyBibGFjayIsCi0idlggYyBibGFjayIsCi0iYlggYyBibGFjayIsCi0iblggYyBibGFjayIsCi0ibVggYyBibGFjayIsCi0iTVggYyBibGFjayIsCi0iTlggYyBibGFjayIsCi0iQlggYyBibGFjayIsCi0iVlggYyBibGFjayIsCi0iQ1ggYyBibGFjayIsCi0iWlggYyBibGFjayIsCi0iQVggYyBibGFjayIsCi0iU1ggYyBibGFjayIsCi0iRFggYyBibGFjayIsCi0iRlggYyBibGFjayIsCi0iR1ggYyBibGFjayIsCi0iSFggYyBibGFjayIsCi0iSlggYyBibGFjayIsCi0iS1ggYyBibGFjayIsCi0iTFggYyBibGFjayIsCi0iUFggYyBibGFjayIsCi0iSVggYyBibGFjayIsCi0iVVggYyBibGFjayIsCi0iWVggYyBOb25lIiwKLS8qIHBpeGVscyAqLwotIllYWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBZWCIsCi0iWCBfLl8uTC5HLksuRi5ELkEuZS4wLjkuJi4kLiUuKy5fIC4ueyBeICEgVyBFIG8gIiwKLSJYIEwuTC5MLkcuRi5GLkQuci5lLjAuOS43LiYuTy5ALm8uIC57IH4gISBRIEUgbyAiLAotIlggTC5HLkcuSy5GLlMueS5yLmUudy45LjUuJC4rLkAuby4uLiggfiAhIFcgRSBvICIsCi0iWCBHLksuSy5GLkouRC5oIDYgMCBpIHggcy5hLj0uVS4qLi4ufSB+ICEgVyBFIG8gIiwKLSJYIEsuRi5GLkYuUyA3IDogciBkLjFYT1hYWC5YfC59LlsucC58IC8gISBXIEUgbyAiLAotIlggRi5GLkYubSAzIC0gcyA9WDNYQFhYWFQuIFh9LlsuXS5JLnEueyBRIEUgVCBvICIsCi0iWCBTLkQuSC44IE8geSAsWDtYJlgyWC5YfC59LlsuXS5JLlAuQy4zLlEgRSBZIG8gIiwKLSJYIEEuci5qICMgMiBmLj5YKlglWCtYfC59LlsuXS5JLlAuXi5+LkIuXSBFIFkgbyAiLAotIlggZS51LnEgQCB0IDpYLVhFLiRYPFh9LlsuXS5gLlAuWi5WLk4uTS4yLlkgTCBvICIsCi0iWCAwLmkuPCArIDhYOFhxWHdYZVhyWHRYNFh1WGxYcFhhWHNYZlhnWDdYWSBBIG8gIiwKLSJYIDkudC4qICQgLS4jWCtYUi5vWHsuJy5gLlAuKC5+Lk4uTS5tLmMuUS5UIFogbyAiLAotIlggOC43LjsgJSA4WDlYMFh3WGVYclh0WHlYdVhpWHBYYVhkWGZYZ1g3WEwgWiBvICIsCi0iWCA2LiYuMSAmIGIgIFh9LlsuJy5JLlAuLy5+Lk4uTS5uLiEueC5sLjouSSBQIG8gIiwKLSJYICMuIy53ID0gOFg5WHFYd1hqWHJYdFhrWHVYaVg1WGFYc1hoWDZYN1hQIFYgbyAiLAotIlggKy4rLmsgPiA1IFkuXS5JLikuLy5+Lk4uTS5iLnYueC5sLmsuaC4nIFYgQyBvICIsCi0iWCBvLm8uby51ICwgYSBJLikuWi5WLk4uTS5uLmMuei5sLmouVy5gIFAgViBDIG8gIiwKLSJYIC4uIC5YLnYgZSA0IGwgXi5WLk4uTS5tLiEueC5sLmouZy47LkYgViBDIEogbyAiLAotIlggKCB8ICggKCBuIHAgOSBnIDQuTS5uLmMueC5sLmouaC4+LkcgViBLIEMgSiBvICIsCi0iWCB+IFsgWyBeIC8gLyBjIGQgZiB6ICkgPC56LiwuMS5EIFAgViBDIEMgQiBCIG8gIiwKLSJYICEgUSAhIFEgUSBRIFEgVyBFIEUgWSBUIEEgWiBQIFYgViBLIEMgSiBCIEIgbyAiLAotIlggUSBXIFEgVyBSIFcgRSBFIFQgVCBUIEwgWiBQIFYgViBLIEogSiBKIEIgTiBvICIsCi0iWCBSIEUgRSBFIEUgRSBZIFkgVSBMIFogUCBQIFAgQyBWIEogSiBCIEIgSCBNIG8gIiwKLSJZWG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gWVgiCi19OwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvY29udHJpYnV0ZWQvbW90aWYvc29sYXJpcy9zcGFyYy9FY2xpcHNlLnQucG0gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9jb250cmlidXRlZC9tb3RpZi9zb2xhcmlzL3NwYXJjL0VjbGlwc2UudC5wbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2YjIxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9jb250cmlidXRlZC9tb3RpZi9zb2xhcmlzL3NwYXJjL0VjbGlwc2UudC5wbQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKiBYUE0gKi8KLXN0YXRpYyBjaGFyICpQcm9kdWN0SWNvbjE2W10gPSB7Ci0vKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqLwotIjE2IDE2IDI1NyAyIiwKLSIgICBjIGJsYWNrIiwKLSIuICBjIGdyYXkxMDAiLAotIlggIGMgI0UyRTJDMEMwRDlEOSIsCi0ibyAgYyAjRURFREQ5RDlFOEU4IiwKLSJPICBjICNENUQ1QUJBQkNEQ0QiLAotIisgIGMgI0UyRTJDM0MzRENEQyIsCi0iQCAgYyAjQzVDNThFOEVCQ0JDIiwKLSIjICBjICNENEQ0QUJBQkNEQ0QiLAotIiQgIGMgI0NBQ0E5RjlGQzZDNiIsCi0iJSAgYyAjRDZENkI0QjREM0QzIiwKLSImICBjICNDQUNBQTBBMEM4QzgiLAotIiogIGMgI0M2QzY5RDlEQzZDNiIsCi0iPSAgYyAjQzVDNTlGOUZDOEM4IiwKLSItICBjICNDQ0NDQUNBQ0NFQ0UiLAotIjsgIGMgI0NDQ0NCMEIwRDNEMyIsCi0iOiAgYyAjQTZBNjgzODNCM0IzIiwKLSI+ICBjICNCQUJBOUE5QUM2QzYiLAotIiwgIGMgI0I3Qjc5QTlBQzJDMiIsCi0iPCAgYyAjRTNFM0Q1RDVFOUU5IiwKLSIxICBjICNCMEIwOEU4RUMwQzAiLAotIjIgIGMgIzlGOUY4MDgwQjhCOCIsCi0iMyAgYyAjQUZBRjk4OThDMUMxIiwKLSI0ICBjICNEQkRCQ0ZDRkU1RTUiLAotIjUgIGMgIzk2OTY3ODc4QjJCMiIsCi0iNiAgYyAjOUE5QTdFN0VCQUJBIiwKLSI3ICBjICM4RThFNzg3OEFGQUYiLAotIjggIGMgIzkxOTE3RjdGQkRCRCIsCi0iOSAgYyAjRDNEM0NDQ0NFNEU0IiwKLSIwICBjICM1MzUzNDg0ODhCOEIiLAotInEgIGMgIzY5Njk1QTVBRThFOCIsCi0idyAgYyAjNTU1NTQ5NDlCOUI5IiwKLSJlICBjICM1NTU1NDk0OUI4QjgiLAotInIgIGMgIzU0NTQ0ODQ4QjZCNiIsCi0idCAgYyAjNTM1MzQ4NDhCNEI0IiwKLSJ5ICBjICM1NDU0NDg0OEI0QjQiLAotInUgIGMgIzUzNTM0ODQ4QjNCMyIsCi0iaSAgYyAjNTM1MzQ4NDhCMkIyIiwKLSJwICBjICM1MjUyNDc0N0FGQUYiLAotImEgIGMgIzUzNTM0ODQ4QjFCMSIsCi0icyAgYyAjNTQ1NDQ5NDlCOEI4IiwKLSJkICBjICM1NDU0NDk0OUI2QjYiLAotImYgIGMgIzUyNTI0ODQ4QjNCMyIsCi0iZyAgYyAjNTI1MjQ4NDhCMkIyIiwKLSJoICBjICM1MzUzNDk0OUIzQjMiLAotImogIGMgIzUyNTI0ODQ4QjFCMSIsCi0iayAgYyAjNTI1MjQ4NDhCMEIwIiwKLSJsICBjICM1MTUxNDc0N0FFQUUiLAotInogIGMgIzUyNTI0ODQ4QUZBRiIsCi0ieCAgYyAjNTE1MTQ4NDhBRUFFIiwKLSJjICBjICM1MTUxNDc0N0FEQUQiLAotInYgIGMgIzUxNTE0NzQ3QUNBQyIsCi0iYiAgYyAjNEY0RjQ2NDZBQUFBIiwKLSJuICBjICM1MTUxNDg0OEFEQUQiLAotIm0gIGMgIzUwNTA0NzQ3QUJBQiIsCi0iTSAgYyAjNTA1MDQ3NDdBQUFBIiwKLSJOICBjICM0RjRGNDY0NkE4QTgiLAotIkIgIGMgIzUwNTA0NzQ3QTlBOSIsCi0iViAgYyAjNEU0RTQ2NDZBN0E3IiwKLSJDICBjICM0RTRFNDY0NkE2QTYiLAotIlogIGMgIzRGNEY0NjQ2QTZBNiIsCi0iQSAgYyAjNEY0RjQ3NDdBN0E3IiwKLSJTICBjICM0RDRENDU0NUEzQTMiLAotIkQgIGMgIzRENEQ0NTQ1QTJBMiIsCi0iRiAgYyAjNEM0QzQ1NDU5RTlFIiwKLSJHICBjICM3NDc0NkU2RUIzQjMiLAotIkggIGMgIzJFMkUyOTI5ODM4MyIsCi0iSiAgYyAjMzgzODMyMzI5MDkwIiwKLSJLICBjICM0NjQ2NDA0MDk5OTkiLAotIkwgIGMgIzRENEQ0NjQ2QTJBMiIsCi0iUCAgYyAjNEU0RTQ3NDdBM0EzIiwKLSJJICBjICM0QjRCNDU0NTlGOUYiLAotIlUgIGMgIzRCNEI0NTQ1OUU5RSIsCi0iWSAgYyAjNEM0QzQ2NDY5RjlGIiwKLSJUICBjICM0QTRBNDQ0NDlCOUIiLAotIlIgIGMgIzRBNEE0NDQ0OUE5QSIsCi0iRSAgYyAjNDk0OTQzNDM5Nzk3IiwKLSJXICBjICM0OTQ5NDQ0NDk3OTciLAotIlEgIGMgIzQ4NDg0MzQzOTQ5NCIsCi0iISAgYyAjNzg3ODc0NzRCOEI4IiwKLSJ+ICBjICMyNzI3MjQyNDc4NzgiLAotIl4gIGMgIzJEMkQyQTJBNzU3NSIsCi0iLyAgYyAjNDg0ODQ0NDQ5Nzk3IiwKLSIoICBjICM0NzQ3NDM0MzkzOTMiLAotIikgIGMgIzQ1NDU0MjQyOTA5MCIsCi0iXyAgYyAjNEI0QjQ4NDg5QTlBIiwKLSJgICBjICM0NjQ2NDM0MzhGOEYiLAotIicgIGMgIzQ2NDY0MzQzOEU4RSIsCi0iXSAgYyAjNDU0NTQyNDI4QzhDIiwKLSJbICBjICM1MTUxNEQ0REEwQTAiLAotInsgIGMgIzVDNUM1OTU5QTVBNSIsCi0ifSAgYyAjNTM1MzUwNTA5MDkwIiwKLSJ8ICBjICNDOEM4QzdDN0UzRTMiLAotIiAuIGMgIzEyMTIxMTExNUQ1RCIsCi0iLi4gYyAjMUExQTE5MTk2NTY1IiwKLSJYLiBjICMyNDI0MjIyMjZENkQiLAotIm8uIGMgIzNGM0YzRTNFODg4OCIsCi0iTy4gYyAjNDQ0NDQyNDI4RDhEIiwKLSIrLiBjICM0NDQ0NDI0Mjg5ODkiLAotIkAuIGMgIzQyNDI0MTQxODc4NyIsCi0iIy4gYyAjNDU0NTQzNDM4QThBIiwKLSIkLiBjICM0MzQzNDI0Mjg4ODgiLAotIiUuIGMgIzQyNDI0MTQxODY4NiIsCi0iJi4gYyAjNDE0MTQwNDA4NDg0IiwKLSIqLiBjICM0MTQxNDA0MDgzODMiLAotIj0uIGMgIzQyNDI0MDQwODM4MyIsCi0iLS4gYyAjNDE0MTQwNDA4MjgyIiwKLSI7LiBjICM0NzQ3NDY0NjhEOEQiLAotIjouIGMgIzQ2NDY0NDQ0ODk4OSIsCi0iPi4gYyAjNTI1MjUxNTE5OTk5IiwKLSIsLiBjICM2NDY0NjM2M0FBQUEiLAotIjwuIGMgIzYxNjE1RjVGQTJBMiIsCi0iMS4gYyAjNkU2RTZDNkNCMkIyIiwKLSIyLiBjICNBNUE1QTRBNEQzRDMiLAotIjMuIGMgI0IwQjBBRkFGRDZENiIsCi0iNC4gYyAjMTExMTEyMTI1RDVEIiwKLSI1LiBjICMxOTE5MUExQTY1NjUiLAotIjYuIGMgIzFFMUUxRTFFNkM2QyIsCi0iNy4gYyAjMjIyMjIyMjI2RDZEIiwKLSI4LiBjICMyQjJCMkIyQjc2NzYiLAotIjkuIGMgIzJCMkIyQjJCNzU3NSIsCi0iMC4gYyAjMkIyQjJDMkM3NTc1IiwKLSJxLiBjICMzNDM0MzUzNTdGN0YiLAotIncuIGMgIzM0MzQzNTM1N0U3RSIsCi0iZS4gYyAjMzUzNTM1MzU3RjdGIiwKLSJyLiBjICMzRTNFM0UzRTg4ODgiLAotInQuIGMgIzNFM0UzRTNFODc4NyIsCi0ieS4gYyAjNDE0MTQxNDE4NDg0IiwKLSJ1LiBjICM0MDQwNDA0MDgyODIiLAotImkuIGMgIzQ4NDg0OTQ5OTE5MSIsCi0icC4gYyAjNDk0OTQ5NDk5MTkxIiwKLSJhLiBjICM0ODQ4NDg0ODkwOTAiLAotInMuIGMgIzQ4NDg0OTQ5OTA5MCIsCi0iZC4gYyAjNDA0MDQwNDA4MDgwIiwKLSJmLiBjICM1MjUyNTI1MjlBOUEiLAotImcuIGMgIzUyNTI1MjUyOTk5OSIsCi0iaC4gYyAjNUI1QjVCNUJBM0EzIiwKLSJqLiBjICM1QjVCNUI1QkEyQTIiLAotImsuIGMgIzY0NjQ2NDY0QUJBQiIsCi0ibC4gYyAjNjM2MzY0NjRBQUFBIiwKLSJ6LiBjICM2QjZCNkM2Q0IyQjIiLAotInguIGMgIzcyNzI3MzczQjlCOSIsCi0iYy4gYyAjNzE3MTcxNzFBNEE0IiwKLSJ2LiBjICM3ODc4Nzg3OEFCQUIiLAotImIuIGMgIzdGN0Y3RjdGQjFCMSIsCi0ibi4gYyAjOEM4QzhDOENCRUJFIiwKLSJtLiBjICNBNUE1QTVBNUQyRDIiLAotIk0uIGMgI0M5QzlDOUM5RTVFNSIsCi0iTi4gYyAjODU4NTg2ODZCN0I3IiwKLSJCLiBjICM5MTkxOTI5MkM0QzQiLAotIlYuIGMgIzcxNzE4OTg5QkNCQyIsCi0iQy4gYyAjNzM3MzhCOEJCRUJFIiwKLSJaLiBjICM3NTc1OEQ4REMwQzAiLAotIkEuIGMgIzc4Nzg5MDkwQzNDMyIsCi0iUy4gYyAjN0E3QTkyOTJDNUM1IiwKLSJELiBjICM3MTcxOEE4QUJEQkQiLAotIkYuIGMgIzc2NzY4RThFQzBDMCIsCi0iRy4gYyAjNzg3ODkwOTBDMkMyIiwKLSJILiBjICM3QjdCOTM5M0M1QzUiLAotIkouIGMgIzdEN0Q5NTk1QzdDNyIsCi0iSy4gYyAjODA4MDk5OTlDQUNBIiwKLSJMLiBjICM3RTdFOTY5NkM3QzciLAotIlAuIGMgIzgzODM5QjlCQ0RDRCIsCi0iSS4gYyAjODM4MzlCOUJDQ0NDIiwKLSJVLiBjICM4Njg2OUU5RUNGQ0YiLAotIlkuIGMgIzg4ODhBMUExRDFEMSIsCi0iVC4gYyAjOEE4QUEyQTJEM0QzIiwKLSJSLiBjICM4OTg5QTFBMUQxRDEiLAotIkUuIGMgIzhCOEJBM0EzRDNEMyIsCi0iVy4gYyBncmF5MTAwIiwKLSJRLiBjIGJsYWNrIiwKLSIhLiBjIGJsYWNrIiwKLSJ+LiBjIGJsYWNrIiwKLSJeLiBjIGJsYWNrIiwKLSIvLiBjIGJsYWNrIiwKLSIoLiBjIGJsYWNrIiwKLSIpLiBjIGJsYWNrIiwKLSJfLiBjIGJsYWNrIiwKLSJgLiBjIGJsYWNrIiwKLSInLiBjIGJsYWNrIiwKLSJdLiBjIGJsYWNrIiwKLSJbLiBjIGJsYWNrIiwKLSJ7LiBjIGJsYWNrIiwKLSJ9LiBjIGJsYWNrIiwKLSJ8LiBjIGJsYWNrIiwKLSIgWCBjIGJsYWNrIiwKLSIuWCBjIGJsYWNrIiwKLSJYWCBjIGJsYWNrIiwKLSJvWCBjIGJsYWNrIiwKLSJPWCBjIGJsYWNrIiwKLSIrWCBjIGJsYWNrIiwKLSJAWCBjIGJsYWNrIiwKLSIjWCBjIGJsYWNrIiwKLSIkWCBjIGJsYWNrIiwKLSIlWCBjIGJsYWNrIiwKLSImWCBjIGJsYWNrIiwKLSIqWCBjIGJsYWNrIiwKLSI9WCBjIGJsYWNrIiwKLSItWCBjIGJsYWNrIiwKLSI7WCBjIGJsYWNrIiwKLSI6WCBjIGJsYWNrIiwKLSI+WCBjIGJsYWNrIiwKLSIsWCBjIGJsYWNrIiwKLSI8WCBjIGJsYWNrIiwKLSIxWCBjIGJsYWNrIiwKLSIyWCBjIGJsYWNrIiwKLSIzWCBjIGJsYWNrIiwKLSI0WCBjIGJsYWNrIiwKLSI1WCBjIGJsYWNrIiwKLSI2WCBjIGJsYWNrIiwKLSI3WCBjIGJsYWNrIiwKLSI4WCBjIGJsYWNrIiwKLSI5WCBjIGJsYWNrIiwKLSIwWCBjIGJsYWNrIiwKLSJxWCBjIGJsYWNrIiwKLSJ3WCBjIGJsYWNrIiwKLSJlWCBjIGJsYWNrIiwKLSJyWCBjIGJsYWNrIiwKLSJ0WCBjIGJsYWNrIiwKLSJ5WCBjIGJsYWNrIiwKLSJ1WCBjIGJsYWNrIiwKLSJpWCBjIGJsYWNrIiwKLSJwWCBjIGJsYWNrIiwKLSJhWCBjIGJsYWNrIiwKLSJzWCBjIGJsYWNrIiwKLSJkWCBjIGJsYWNrIiwKLSJmWCBjIGJsYWNrIiwKLSJnWCBjIGJsYWNrIiwKLSJoWCBjIGJsYWNrIiwKLSJqWCBjIGJsYWNrIiwKLSJrWCBjIGJsYWNrIiwKLSJsWCBjIGJsYWNrIiwKLSJ6WCBjIGJsYWNrIiwKLSJ4WCBjIGJsYWNrIiwKLSJjWCBjIGJsYWNrIiwKLSJ2WCBjIGJsYWNrIiwKLSJiWCBjIGJsYWNrIiwKLSJuWCBjIGJsYWNrIiwKLSJtWCBjIGJsYWNrIiwKLSJNWCBjIGJsYWNrIiwKLSJOWCBjIGJsYWNrIiwKLSJCWCBjIGJsYWNrIiwKLSJWWCBjIGJsYWNrIiwKLSJDWCBjIGJsYWNrIiwKLSJaWCBjIGJsYWNrIiwKLSJBWCBjIGJsYWNrIiwKLSJTWCBjIGJsYWNrIiwKLSJEWCBjIGJsYWNrIiwKLSJGWCBjIGJsYWNrIiwKLSJHWCBjIGJsYWNrIiwKLSJIWCBjIGJsYWNrIiwKLSJKWCBjIGJsYWNrIiwKLSJLWCBjIGJsYWNrIiwKLSJMWCBjIGJsYWNrIiwKLSJQWCBjIGJsYWNrIiwKLSJJWCBjIGJsYWNrIiwKLSJVWCBjIGJsYWNrIiwKLSJZWCBjIE5vbmUiLAotLyogcGl4ZWxzICovCi0iWVhxIHEgcSBxIHEgcSBxIHEgcSBxIHEgcSBxIHEgWVgiLAotInEgZC4tLnkuJS4rLk8uYCAoIEUgUiBVIEQgQyBCIHAuIiwKLSJxIHUuKi4mLiQuIy5dICkgUSBXIFQgRiBMIFYgTSBwLiIsCi0icSA9LnkufSAsICUgOyA4ICEgMS57IFsgUyBaIGIgcC4iLAotInEgQC46Li0gbyA0IDIueC56Liwuai4+Ll8gQSBtIHAuIiwKLSJxICsuOiBYIDwgTS5tLnoubC5qLmcucy5yLksgdiBwLiIsCi0icSAnICQgKyA5IHwgMy5CLm4uTi5iLnYuYy48Lm4gcC4iLAotInEgYCBPIFQuWS5VLlAuSy5MLlMuRy5GLkMuRC5sIHAuIiwKLSJxICggIyBAIEcgay5oLmcuaS50LmUuOS43LjYueiBwLiIsCi0icSAvICogRS5SLlUuSS5LLkouSC5BLlouQy5WLmEgcC4iLAotInEgVCAyICYgNSBmLmEuby5xLjguNy4uLjQuSiB1IHAuIiwKLSJxIEkgWSAxID0gNyA7LncuMC43LjUuIC5IIGYgeSBwLiIsCi0icSBMIEQgUCA2ID4gMyAwIF4gWC5+IEogaSB0IGQgcC4iLAotInEgQyBDIFYgQSBOIE0gbSBuIHAgayBnIHkgciBlIHAuIiwKLSJxIE0gYiBNIG0gbSBjIHggcCBqIGggeSBkIHMgdyBwLiIsCi0iWVhwLnAucC5wLnAucC5wLnAucC5wLnAucC5wLnAuWVgiCi19OwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVkMWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQ3VzdG9tIHRhcmdldHMgY2FsbGVkIGZyb20gYSBwcm9qZWN0J3MgZ2VuZXJhdGVkIGJ1aWxkLnhtbCAgICAgICAgICAgIC0tPgotPCEtLSBTZXQgY3VzdG9tQnVpbGRDYWxsYmFja3M9PHBhdGgvdG8vdGhpcy9maWxlPiBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMuLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IlRoaXMgZmlsZSBtdXN0IGJlIGNhbGxlZCB3aXRoIGV4cGxpY2l0IHRhcmdldHMiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuamFycyI+CQotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5iaW4ucGFydHMiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBiYXNlLmRpciAtIHJvb3Qgb2YgdGhlIHByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQkJPG1vdmUgZmlsZT0iJHtmZWF0dXJlLmRpcmVjdG9yeX0vdGFyZ2V0LmJ1aWxkLnByb3BlcnRpZXMiIHRvZmlsZT0iJHtmZWF0dXJlLmRpcmVjdG9yeX0vYnVpbGQucHJvcGVydGllcyIvPgotCQk8bW92ZSBmaWxlPSIke2ZlYXR1cmUuZGlyZWN0b3J5fS90YXJnZXQuYnVpbGQueG1sIiB0b2ZpbGU9IiR7ZmVhdHVyZS5kaXJlY3Rvcnl9L2J1aWxkLnhtbCIvPgotCQkKLQkJPCEtLSByZW1vdmUgZW1wdHkgZGlyZWN0b3JpZXMuICBJIGNvdWxkbid0IGdldCBpbmNsdWRlRW1wdHlEaXJzIHRvIHdvcmsgLS0+Ci0JCTwhLS0gb24gdGhlIG1vdmUgb3IgZGVsZXRlLCBzbyBjb3B5LCBkZWxldGUgYW5kIG1vdmUgYmFjayAgICAgICAgICAgICAgIC0tPgotCQk8Y29weSBpbmNsdWRlRW1wdHlEaXJzPSJmYWxzZSIgdG9kaXI9IiR7ZmVhdHVyZS5kaXJlY3Rvcnl9L3RlbXBCaW4iID4KLQkJCTxmaWxlc2V0IGRpcj0iJHtmZWF0dXJlLmRpcmVjdG9yeX0vYmluIiAvPgotCQk8L2NvcHk+Ci0JCTxkZWxldGUgZGlyPSIke2ZlYXR1cmUuZGlyZWN0b3J5fS9iaW4iIC8+Ci0JCTxtb3ZlICB0b2Rpcj0iJHtmZWF0dXJlLmRpcmVjdG9yeX0vYmluIiA+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZmVhdHVyZS5kaXJlY3Rvcnl9L3RlbXBCaW4iIC8+Ci0JCTwvbW92ZT4KLQkJCi0JCTwhLS0gcmVuYW1lIGVjbGlwc2UgbGF1bmNoZXJzIHRvICJsYXVuY2hlciIgLS0+Ci0JCTxtb3ZlIHRvZGlyPSIke2ZlYXR1cmUuZGlyZWN0b3J5fS9iaW4iIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2ZlYXR1cmUuZGlyZWN0b3J5fS9iaW4iIC8+Ci0JCQk8cmVnZXhwbWFwcGVyIGZyb209Il4oLipbL1xcXSllY2xpcHNlKC5leGUpPyQiIHRvPSJcMWxhdW5jaGVyXDIiLz4KLQkJPC9tb3ZlPgotCQk8bW92ZSB0b2Rpcj0iJHtmZWF0dXJlLmRpcmVjdG9yeX0vY29udHJpYnV0ZWQiIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2ZlYXR1cmUuZGlyZWN0b3J5fS9jb250cmlidXRlZCIgLz4KLQkJCTxyZWdleHBtYXBwZXIgZnJvbT0iXiguKlsvXFxdKWVjbGlwc2UoLmV4ZSk/JCIgdG89IlwxbGF1bmNoZXJcMiIvPgotCQk8L21vdmU+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5sb2dzIj4gICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5sb2dzIj4gICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5jbGVhbiI+ICAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBwbHVnaW4uZGVzdGluYXRpb24gLSBmaW5hbCBkZXN0aW5hdGlvbiBvZiB0aGUgYnVpbGQgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0ZW1wLmZvbGRlciAtIHRlbXBvcmFyeSBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5jbGVhbiI+ICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2VwbC12MTAuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdiNDRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSBMYXVuY2hlcnMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1QbGF0Zm9ybSBzcGVjaWZpYyBsYXVuY2hlcnMuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYnkgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4NjE3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy40LjEwMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjIgotICAgICAgICAgb3M9InNvbGFyaXMiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ic3BhcmMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotICAgICAgICAgCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2IgotICAgICAgICAgb3M9InNvbGFyaXMiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLSAgICAgICAgICAgIAotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMiCi0gICAgICAgICBvcz0ic29sYXJpcyIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9InNwYXJjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY2FyYm9uLm1hY29zeCIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICB3cz0iY2FyYm9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4IgotICAgICAgICAgb3M9Im1hY29zeCIKLSAgICAgICAgIHdzPSJjb2NvYSIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0gICAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4IgotICAgICAgICAgb3M9Im1hY29zeCIKLSAgICAgICAgIHdzPSJjb2NvYSIKLSAgICAgICAgIGFyY2g9InBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0gICAgICAgICAKLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0IgotICAgICAgICAgb3M9Im1hY29zeCIKLSAgICAgICAgIHdzPSJjb2NvYSIKLSAgICAgICAgIGFyY2g9Ing4Nl82NCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGMiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0icHBjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYzY0IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InBwYzY0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2XzY0IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4Nl82NCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmFpeC5wcGMiCi0gICAgICAgICBvcz0iYWl4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0icHBjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLSAgICAgICAgIAotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguaWE2NF8zMiIKLSAgICAgICAgIG9zPSJocHV4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0iaWE2NF8zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NCIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4Nl82NCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJpYTY0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud3BmLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3cGYiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzMzkwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InMzOTB4IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9ndGtfcm9vdC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZ3RrX3Jvb3QvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmZmQ5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9ndGtfcm9vdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+RmVicnVhcnkgMjIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIEVjbGlwc2UgbGF1bmNoZXIuICBSZWZlciBiZWxvdyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi48L3A+Ci0KLTxoND5DYWlybyBmb3IgTGludXg8L2g0PgotCi08cD5SZWZlciB0byB0aGUgZmlsZSA8YSBocmVmPSJhYm91dF9maWxlcy9hYm91dF9jYWlyby5odG1sIj5hYm91dF9jYWlyby5odG1sPC9hPiBmb3IgbGljZW5zaW5nIGRldGFpbHMgYWJvdXQgJnF1b3Q7Q2Fpcm8gZm9yIExpbnV4JnF1b3Q7LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZ3RrX3Jvb3QvYWJvdXRfZmlsZXMvYWJvdXRfY2Fpcm8uaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2d0a19yb290L2Fib3V0X2ZpbGVzL2Fib3V0X2NhaXJvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzIzMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZ3RrX3Jvb3QvYWJvdXRfZmlsZXMvYWJvdXRfY2Fpcm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXJjaCAyNywgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaGFzIGluY2x1ZGVkIHRoZSBmb2xsb3dpbmcgcGFja2FnZSBmb3IgeW91ciBjb252ZW5pZW5jZTo8L3A+IAotCi08aDQ+Q2Fpcm8gMS4wLjIgZm9yIExpbnV4PC9oND4KLQotPHA+Q2Fpcm8gZm9yIExpbnV4ICgmcXVvdDtDYWlybyZxdW90OykgaXMgZGV2ZWxvcGVkIGJ5IFRoZSBDYWlybyBQcm9qZWN0ICg8YSBocmVmPSJodHRwOi8vd3d3LmNhaXJvZ3JhcGhpY3Mub3JnIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5jYWlyb2dyYXBoaWNzLm9yZzwvYT4pOjwvcD4KLQotPHA+Q2Fpcm8gaXMgZGVsaXZlcmVkIGluIHRoZSBmb2xsb3dpbmcgZmlsZSAoJnF1b3Q7Q2Fpcm8gTGlicmFyeSZxdW90Oyk6PC9wPgotPHVsPgotICAgIDxsaT5saWJjYWlyby1zd3Quc288L2xpPgotPC91bD4KLQotPHA+d2hpY2ggd2FzIGNvbXBpbGVkIGZyb20gQ2Fpcm8gc291cmNlIGNvZGUgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuY2Fpcm9ncmFwaGljcy5vcmcvc25hcHNob3RzIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5jYWlyb2dyYXBoaWNzLm9yZy9zbmFwc2hvdHM8L2E+LjwvcD4KLQotPHA+WW91ciB1c2Ugb2YgdGhlIENhaXJvIGNvZGUgaW4gYmluYXJ5IGZvcm0gaXMgc3ViamVjdCB0bwotdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKCZxdW90O01QTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIE1QTCBpcyBwcm92aWRlZCAoPGEgaHJlZj0ibXBsLXYxMS50eHQiIHRhcmdldD0iYmxhbmsiPm1wbC12MTEudHh0PC9hPikKLWFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwuPC9hPgotCi08aDQ+cGl4bWFuIDAuMS42PC9oND4KLQotPHA+cGl4bWFuICgmcXVvdDtwaXhtYW4mcXVvdDspIGlzIHBhY2thZ2VkIHdpdGhpbiB0aGUgQ2Fpcm8gTGlicmFyeSBhbmQgd2FzIGNvbXBpbGVkIGZyb20gc291cmNlIGNvZGUgYXZhaWxhYmxlIGF0Ci08YSBocmVmPSJodHRwOi8vd3d3LmNhaXJvZ3JhcGhpY3Mub3JnL3NuYXBzaG90cyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cuY2Fpcm9ncmFwaGljcy5vcmcvc25hcHNob3RzPC9hPi4KLXBpeG1hbiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOjwvcD4KLQotPHVsPgotCTxsaT5saWJwaXhyZWdpb248L2xpPgotCTxsaT5saWJpYzwvbGk+Ci0JPGxpPnNsaW08L2xpPgotPC91bD4KLQotWW91ciB1c2Ugb2YgcGl4bWFuIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlcyBpbiA8YSBocmVmPSJwaXhtYW4tbGljZW5zZXMudHh0IiB0YXJnZXQ9ImJsYW5rIj5waXhtYW4tbGljZW5zZXMudHh0PC9hPi48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhlIENhaXJvIExpYnJhcnkgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgcGFja2FnZSBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSBpdHMgdXNlLiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIGNvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2d0a19yb290L2Fib3V0X2ZpbGVzL21wbC12MTEudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZ3RrX3Jvb3QvYWJvdXRfZmlsZXMvbXBsLXYxMS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MTQxNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZ3RrX3Jvb3QvYWJvdXRfZmlsZXMvbXBsLXYxMS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICBNT1pJTExBIFBVQkxJQyBMSUNFTlNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMS4xCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLQotCi0xLiBEZWZpbml0aW9ucy4KLQotICAgICAxLjAuMS4gIkNvbW1lcmNpYWwgVXNlIiBtZWFucyBkaXN0cmlidXRpb24gb3Igb3RoZXJ3aXNlIG1ha2luZyB0aGUKLSAgICAgQ292ZXJlZCBDb2RlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgotCi0gICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8KLSAgICAgdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbAotICAgICBDb2RlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciwgYW5kIHRoZSBNb2RpZmljYXRpb25zCi0gICAgIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotCi0gICAgIDEuMy4gIkNvdmVyZWQgQ29kZSIgbWVhbnMgdGhlIE9yaWdpbmFsIENvZGUgb3IgTW9kaWZpY2F0aW9ucyBvciB0aGUKLSAgICAgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgYW5kIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZQotICAgICBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KLQotICAgICAxLjQuICJFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20iIG1lYW5zIGEgbWVjaGFuaXNtIGdlbmVyYWxseQotICAgICBhY2NlcHRlZCBpbiB0aGUgc29mdHdhcmUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGZvciB0aGUgZWxlY3Ryb25pYwotICAgICB0cmFuc2ZlciBvZiBkYXRhLgotCi0gICAgIDEuNS4gIkV4ZWN1dGFibGUiIG1lYW5zIENvdmVyZWQgQ29kZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZQotICAgICBDb2RlLgotCi0gICAgIDEuNi4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgaWRlbnRpZmllZAotICAgICBhcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0Ci0gICAgIEEuCi0KLSAgICAgMS43LiAiTGFyZ2VyIFdvcmsiIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIENvZGUgb3IKLSAgICAgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICAgMS44LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4KLQotICAgICAxLjguMS4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtCi0gICAgIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvcgotICAgICBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgotCi0gICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIGFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZQotICAgICBzdWJzdGFuY2Ugb3Igc3RydWN0dXJlIG9mIGVpdGhlciB0aGUgT3JpZ2luYWwgQ29kZSBvciBhbnkgcHJldmlvdXMKLSAgICAgTW9kaWZpY2F0aW9ucy4gV2hlbiBDb3ZlcmVkIENvZGUgaXMgcmVsZWFzZWQgYXMgYSBzZXJpZXMgb2YgZmlsZXMsIGEKLSAgICAgTW9kaWZpY2F0aW9uIGlzOgotICAgICAgICAgIEEuIEFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZSBjb250ZW50cyBvZiBhIGZpbGUKLSAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIENvZGUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4KLQotICAgICAgICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yCi0gICAgICAgICAgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4KLQotICAgICAxLjEwLiAiT3JpZ2luYWwgQ29kZSIgbWVhbnMgU291cmNlIENvZGUgb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZQotICAgICB3aGljaCBpcyBkZXNjcmliZWQgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0IEEgYXMKLSAgICAgT3JpZ2luYWwgQ29kZSwgYW5kIHdoaWNoLCBhdCB0aGUgdGltZSBvZiBpdHMgcmVsZWFzZSB1bmRlciB0aGlzCi0gICAgIExpY2Vuc2UgaXMgbm90IGFscmVhZHkgQ292ZXJlZCBDb2RlIGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAxLjEwLjEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IKLSAgICAgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCAgbWV0aG9kLCBwcm9jZXNzLAotICAgICBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCi0KLSAgICAgMS4xMS4gIlNvdXJjZSBDb2RlIiBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIENvdmVyZWQgQ29kZSBmb3IKLSAgICAgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQsIGluY2x1ZGluZyBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cwotICAgICBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKLSAgICAgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiBhbiBFeGVjdXRhYmxlLCBvciBzb3VyY2UgY29kZQotICAgICBkaWZmZXJlbnRpYWwgY29tcGFyaXNvbnMgYWdhaW5zdCBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW5vdGhlcgotICAgICB3ZWxsIGtub3duLCBhdmFpbGFibGUgQ292ZXJlZCBDb2RlIG9mIHRoZSBDb250cmlidXRvcidzIGNob2ljZS4gVGhlCi0gICAgIFNvdXJjZSBDb2RlIGNhbiBiZSBpbiBhIGNvbXByZXNzZWQgb3IgYXJjaGl2YWwgZm9ybSwgcHJvdmlkZWQgdGhlCi0gICAgIGFwcHJvcHJpYXRlIGRlY29tcHJlc3Npb24gb3IgZGUtYXJjaGl2aW5nIHNvZnR3YXJlIGlzIHdpZGVseSBhdmFpbGFibGUKLSAgICAgZm9yIG5vIGNoYXJnZS4KLQotICAgICAxLjEyLiAiWW91IiAob3IgIllvdXIiKSAgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eQotICAgICBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMKLSAgICAgTGljZW5zZSBvciBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpc3N1ZWQgdW5kZXIgU2VjdGlvbiA2LjEuCi0gICAgIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMKLSAgICAgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZgotICAgICB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsCi0gICAgIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieQotICAgICBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQKLSAgICAgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoCi0gICAgIGVudGl0eS4KLQotMi4gU291cmNlIENvZGUgTGljZW5zZS4KLQotICAgICAyLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4KLSAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLAotICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci0gICAgIGNsYWltczoKLSAgICAgICAgICAoYSkgIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yCi0gICAgICAgICAgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyIHRvIHVzZSwgcmVwcm9kdWNlLAotICAgICAgICAgIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwKLSAgICAgICAgICBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKSB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yCi0gICAgICAgICAgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLQotICAgICAgICAgIChiKSB1bmRlciBQYXRlbnRzIENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3IKLSAgICAgICAgICBzZWxsaW5nIG9mIE9yaWdpbmFsIENvZGUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwKLSAgICAgICAgICBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUKLSAgICAgICAgICBPcmlnaW5hbCBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4KLQotICAgICAgICAgIChjKSB0aGUgbGljZW5zZXMgZ3JhbnRlZCBpbiB0aGlzIFNlY3Rpb24gMi4xKGEpIGFuZCAoYikgYXJlCi0gICAgICAgICAgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0IGRpc3RyaWJ1dGVzCi0gICAgICAgICAgT3JpZ2luYWwgQ29kZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMKLSAgICAgICAgICBncmFudGVkOiAxKSBmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgQ29kZTsgMikKLSAgICAgICAgICBzZXBhcmF0ZSBmcm9tIHRoZSBPcmlnaW5hbCBDb2RlOyAgb3IgMykgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkCi0gICAgICAgICAgYnk6IGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgb3IgaWkpIHRoZQotICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KLQotICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotICAgICBTdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3IKLSAgICAgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZQotCi0gICAgICAgICAgKGEpICB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcgotICAgICAgICAgIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwKLSAgICAgICAgICBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zCi0gICAgICAgICAgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSBlaXRoZXIgb24gYW4KLSAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgQ29kZQotICAgICAgICAgIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotCi0gICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvcgotICAgICAgICAgIHNlbGxpbmcgb2YgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZQotICAgICAgICAgIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucwotICAgICAgICAgIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlCi0gICAgICAgICAgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAxKSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAotICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kIDIpIHRoZSBjb21iaW5hdGlvbiBvZgotICAgICAgICAgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yCi0gICAgICAgICAgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuCi0KLSAgICAgICAgICAoYykgdGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZCAyLjIoYikgYXJlCi0gICAgICAgICAgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IG1ha2VzIENvbW1lcmNpYWwgVXNlIG9mCi0gICAgICAgICAgdGhlIENvdmVyZWQgQ29kZS4KLQotICAgICAgICAgIChkKSAgICBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzCi0gICAgICAgICAgZ3JhbnRlZDogMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUKLSAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uOyAyKSAgc2VwYXJhdGUgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsKLSAgICAgICAgICAzKSAgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiBpKSB0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mCi0gICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbiBvciBpaSkgIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUKLSAgICAgICAgICBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgIChleGNlcHQgYXMgcGFydCBvZiB0aGUKLSAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciA0KSB1bmRlciBQYXRlbnQgQ2xhaW1zCi0gICAgICAgICAgaW5mcmluZ2VkIGJ5IENvdmVyZWQgQ29kZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkKLSAgICAgICAgICB0aGF0IENvbnRyaWJ1dG9yLgotCi0zLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0KLSAgICAgMy4xLiBBcHBsaWNhdGlvbiBvZiBMaWNlbnNlLgotICAgICBUaGUgTW9kaWZpY2F0aW9ucyB3aGljaCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZQotICAgICBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gICAgIFNlY3Rpb24gMi4yLiBUaGUgU291cmNlIENvZGUgdmVyc2lvbiBvZiBDb3ZlcmVkIENvZGUgbWF5IGJlCi0gICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciBhIGZ1dHVyZSB2ZXJzaW9uCi0gICAgIG9mIHRoaXMgTGljZW5zZSByZWxlYXNlZCB1bmRlciBTZWN0aW9uIDYuMSwgYW5kIFlvdSBtdXN0IGluY2x1ZGUgYQotICAgICBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIFlvdQotICAgICBkaXN0cmlidXRlLiBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBTb3VyY2UgQ29kZQotICAgICB2ZXJzaW9uIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMKLSAgICAgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cycgcmlnaHRzIGhlcmV1bmRlci4gSG93ZXZlciwgWW91IG1heSBpbmNsdWRlCi0gICAgIGFuIGFkZGl0aW9uYWwgZG9jdW1lbnQgb2ZmZXJpbmcgdGhlIGFkZGl0aW9uYWwgcmlnaHRzIGRlc2NyaWJlZCBpbgotICAgICBTZWN0aW9uIDMuNS4KLQotICAgICAzLjIuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KLSAgICAgQW55IE1vZGlmaWNhdGlvbiB3aGljaCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIG11c3QgYmUKLSAgICAgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCi0gICAgIGVpdGhlciBvbiB0aGUgc2FtZSBtZWRpYSBhcyBhbiBFeGVjdXRhYmxlIHZlcnNpb24gb3IgdmlhIGFuIGFjY2VwdGVkCi0gICAgIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSB0byBhbnlvbmUgdG8gd2hvbSB5b3UgbWFkZSBhbgotICAgICBFeGVjdXRhYmxlIHZlcnNpb24gYXZhaWxhYmxlOyBhbmQgaWYgbWFkZSBhdmFpbGFibGUgdmlhIEVsZWN0cm9uaWMKLSAgICAgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSwgbXVzdCByZW1haW4gYXZhaWxhYmxlIGZvciBhdCBsZWFzdCB0d2VsdmUgKDEyKQotICAgICBtb250aHMgYWZ0ZXIgdGhlIGRhdGUgaXQgaW5pdGlhbGx5IGJlY2FtZSBhdmFpbGFibGUsIG9yIGF0IGxlYXN0IHNpeAotICAgICAoNikgbW9udGhzIGFmdGVyIGEgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoYXQgcGFydGljdWxhciBNb2RpZmljYXRpb24KLSAgICAgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8gc3VjaCByZWNpcGllbnRzLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvcgotICAgICBlbnN1cmluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGV2ZW4gaWYgdGhlCi0gICAgIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSBpcyBtYWludGFpbmVkIGJ5IGEgdGhpcmQgcGFydHkuCi0KLSAgICAgMy4zLiBEZXNjcmlwdGlvbiBvZiBNb2RpZmljYXRpb25zLgotICAgICBZb3UgbXVzdCBjYXVzZSBhbGwgQ292ZXJlZCBDb2RlIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIHRvIGNvbnRhaW4gYQotICAgICBmaWxlIGRvY3VtZW50aW5nIHRoZSBjaGFuZ2VzIFlvdSBtYWRlIHRvIGNyZWF0ZSB0aGF0IENvdmVyZWQgQ29kZSBhbmQKLSAgICAgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gWW91IG11c3QgaW5jbHVkZSBhIHByb21pbmVudCBzdGF0ZW1lbnQgdGhhdAotICAgICB0aGUgTW9kaWZpY2F0aW9uIGlzIGRlcml2ZWQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGZyb20gT3JpZ2luYWwKLSAgICAgQ29kZSBwcm92aWRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGluY2x1ZGluZyB0aGUgbmFtZSBvZiB0aGUKLSAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaW4gKGEpIHRoZSBTb3VyY2UgQ29kZSwgYW5kIChiKSBpbiBhbnkgbm90aWNlIGluIGFuCi0gICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBvciByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4gd2hpY2ggWW91IGRlc2NyaWJlIHRoZQotICAgICBvcmlnaW4gb3Igb3duZXJzaGlwIG9mIHRoZSBDb3ZlcmVkIENvZGUuCi0KLSAgICAgMy40LiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTWF0dGVycwotICAgICAgICAgIChhKSBUaGlyZCBQYXJ0eSBDbGFpbXMuCi0gICAgICAgICAgSWYgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSB0aGF0IGEgbGljZW5zZSB1bmRlciBhIHRoaXJkIHBhcnR5J3MKLSAgICAgICAgICBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGlzIHJlcXVpcmVkIHRvIGV4ZXJjaXNlIHRoZSByaWdodHMKLSAgICAgICAgICBncmFudGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiwKLSAgICAgICAgICBDb250cmlidXRvciBtdXN0IGluY2x1ZGUgYSB0ZXh0IGZpbGUgd2l0aCB0aGUgU291cmNlIENvZGUKLSAgICAgICAgICBkaXN0cmlidXRpb24gdGl0bGVkICJMRUdBTCIgd2hpY2ggZGVzY3JpYmVzIHRoZSBjbGFpbSBhbmQgdGhlCi0gICAgICAgICAgcGFydHkgbWFraW5nIHRoZSBjbGFpbSBpbiBzdWZmaWNpZW50IGRldGFpbCB0aGF0IGEgcmVjaXBpZW50IHdpbGwKLSAgICAgICAgICBrbm93IHdob20gdG8gY29udGFjdC4gSWYgQ29udHJpYnV0b3Igb2J0YWlucyBzdWNoIGtub3dsZWRnZSBhZnRlcgotICAgICAgICAgIHRoZSBNb2RpZmljYXRpb24gaXMgbWFkZSBhdmFpbGFibGUgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4yLAotICAgICAgICAgIENvbnRyaWJ1dG9yIHNoYWxsIHByb21wdGx5IG1vZGlmeSB0aGUgTEVHQUwgZmlsZSBpbiBhbGwgY29waWVzCi0gICAgICAgICAgQ29udHJpYnV0b3IgbWFrZXMgYXZhaWxhYmxlIHRoZXJlYWZ0ZXIgYW5kIHNoYWxsIHRha2Ugb3RoZXIgc3RlcHMKLSAgICAgICAgICAoc3VjaCBhcyBub3RpZnlpbmcgYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0cyBvciBuZXdzZ3JvdXBzKQotICAgICAgICAgIHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBpbmZvcm0gdGhvc2Ugd2hvIHJlY2VpdmVkIHRoZSBDb3ZlcmVkCi0gICAgICAgICAgQ29kZSB0aGF0IG5ldyBrbm93bGVkZ2UgaGFzIGJlZW4gb2J0YWluZWQuCi0KLSAgICAgICAgICAoYikgQ29udHJpYnV0b3IgQVBJcy4KLSAgICAgICAgICBJZiBDb250cmlidXRvcidzIE1vZGlmaWNhdGlvbnMgaW5jbHVkZSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZwotICAgICAgICAgIGludGVyZmFjZSBhbmQgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSBvZiBwYXRlbnQgbGljZW5zZXMgd2hpY2gKLSAgICAgICAgICBhcmUgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHRoYXQgQVBJLCBDb250cmlidXRvciBtdXN0Ci0gICAgICAgICAgYWxzbyBpbmNsdWRlIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIExFR0FMIGZpbGUuCi0KLSAgICAgICAgICAgICAgIChjKSAgICBSZXByZXNlbnRhdGlvbnMuCi0gICAgICAgICAgQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0LCBleGNlcHQgYXMgZGlzY2xvc2VkIHB1cnN1YW50IHRvCi0gICAgICAgICAgU2VjdGlvbiAzLjQoYSkgYWJvdmUsIENvbnRyaWJ1dG9yIGJlbGlldmVzIHRoYXQgQ29udHJpYnV0b3IncwotICAgICAgICAgIE1vZGlmaWNhdGlvbnMgYXJlIENvbnRyaWJ1dG9yJ3Mgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yCi0gICAgICAgICAgQ29udHJpYnV0b3IgaGFzIHN1ZmZpY2llbnQgcmlnaHRzIHRvIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkKLSAgICAgICAgICB0aGlzIExpY2Vuc2UuCi0KLSAgICAgMy41LiBSZXF1aXJlZCBOb3RpY2VzLgotICAgICBZb3UgbXVzdCBkdXBsaWNhdGUgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEgaW4gZWFjaCBmaWxlIG9mIHRoZSBTb3VyY2UKLSAgICAgQ29kZS4gIElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgc3VjaCBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIFNvdXJjZQotICAgICBDb2RlIGZpbGUgZHVlIHRvIGl0cyBzdHJ1Y3R1cmUsIHRoZW4gWW91IG11c3QgaW5jbHVkZSBzdWNoIG5vdGljZSBpbiBhCi0gICAgIGxvY2F0aW9uIChzdWNoIGFzIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHVzZXIgd291bGQgYmUgbGlrZWx5Ci0gICAgIHRvIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuICBJZiBZb3UgY3JlYXRlZCBvbmUgb3IgbW9yZSBNb2RpZmljYXRpb24ocykKLSAgICAgWW91IG1heSBhZGQgeW91ciBuYW1lIGFzIGEgQ29udHJpYnV0b3IgdG8gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4KLSAgICAgRXhoaWJpdCBBLiAgWW91IG11c3QgYWxzbyBkdXBsaWNhdGUgdGhpcyBMaWNlbnNlIGluIGFueSBkb2N1bWVudGF0aW9uCi0gICAgIGZvciB0aGUgU291cmNlIENvZGUgd2hlcmUgWW91IGRlc2NyaWJlIHJlY2lwaWVudHMnIHJpZ2h0cyBvciBvd25lcnNoaXAKLSAgICAgcmlnaHRzIHJlbGF0aW5nIHRvIENvdmVyZWQgQ29kZS4gIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8KLSAgICAgY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkKLSAgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIENvZGUuIEhvd2V2ZXIsIFlvdQotICAgICBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsCi0gICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGFuCi0gICAgIGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMKLSAgICAgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZQotICAgICBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LAotICAgICBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLQotICAgICAzLjYuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgotICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgQ292ZXJlZCBDb2RlIGluIEV4ZWN1dGFibGUgZm9ybSBvbmx5IGlmIHRoZQotICAgICByZXF1aXJlbWVudHMgb2YgU2VjdGlvbiAzLjEtMy41IGhhdmUgYmVlbiBtZXQgZm9yIHRoYXQgQ292ZXJlZCBDb2RlLAotICAgICBhbmQgaWYgWW91IGluY2x1ZGUgYSBub3RpY2Ugc3RhdGluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mCi0gICAgIHRoZSBDb3ZlcmVkIENvZGUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsCi0gICAgIGluY2x1ZGluZyBhIGRlc2NyaXB0aW9uIG9mIGhvdyBhbmQgd2hlcmUgWW91IGhhdmUgZnVsZmlsbGVkIHRoZQotICAgICBvYmxpZ2F0aW9ucyBvZiBTZWN0aW9uIDMuMi4gVGhlIG5vdGljZSBtdXN0IGJlIGNvbnNwaWN1b3VzbHkgaW5jbHVkZWQKLSAgICAgaW4gYW55IG5vdGljZSBpbiBhbiBFeGVjdXRhYmxlIHZlcnNpb24sIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBvcgotICAgICBjb2xsYXRlcmFsIGluIHdoaWNoIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgcmVsYXRpbmcgdG8gdGhlCi0gICAgIENvdmVyZWQgQ29kZS4gWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gb2YgQ292ZXJlZAotICAgICBDb2RlIG9yIG93bmVyc2hpcCByaWdodHMgdW5kZXIgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkKLSAgICAgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbgotICAgICBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlCi0gICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnQncwotICAgICByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzCi0gICAgIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gdW5kZXIgYSBkaWZmZXJlbnQKLSAgICAgbGljZW5zZSBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyCi0gICAgIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsCi0gICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZQotICAgICBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkKLSAgICAgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2gKLSAgICAgdGVybXMgWW91IG9mZmVyLgotCi0gICAgIDMuNy4gTGFyZ2VyIFdvcmtzLgotICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIENvZGUgd2l0aCBvdGhlciBjb2RlCi0gICAgIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIKLSAgICAgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZQotICAgICByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIENvZGUuCi0KLTQuIEluYWJpbGl0eSB0byBDb21wbHkgRHVlIHRvIFN0YXR1dGUgb3IgUmVndWxhdGlvbi4KLQotICAgICBJZiBpdCBpcyBpbXBvc3NpYmxlIGZvciBZb3UgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSB0ZXJtcyBvZiB0aGlzCi0gICAgIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvIHNvbWUgb3IgYWxsIG9mIHRoZSBDb3ZlcmVkIENvZGUgZHVlIHRvCi0gICAgIHN0YXR1dGUsIGp1ZGljaWFsIG9yZGVyLCBvciByZWd1bGF0aW9uIHRoZW4gWW91IG11c3Q6IChhKSBjb21wbHkgd2l0aAotICAgICB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZTsgYW5kIChiKQotICAgICBkZXNjcmliZSB0aGUgbGltaXRhdGlvbnMgYW5kIHRoZSBjb2RlIHRoZXkgYWZmZWN0LiBTdWNoIGRlc2NyaXB0aW9uCi0gICAgIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIExFR0FMIGZpbGUgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy40IGFuZCBtdXN0Ci0gICAgIGJlIGluY2x1ZGVkIHdpdGggYWxsIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIFNvdXJjZSBDb2RlLiBFeGNlcHQgdG8gdGhlCi0gICAgIGV4dGVudCBwcm9oaWJpdGVkIGJ5IHN0YXR1dGUgb3IgcmVndWxhdGlvbiwgc3VjaCBkZXNjcmlwdGlvbiBtdXN0IGJlCi0gICAgIHN1ZmZpY2llbnRseSBkZXRhaWxlZCBmb3IgYSByZWNpcGllbnQgb2Ygb3JkaW5hcnkgc2tpbGwgdG8gYmUgYWJsZSB0bwotICAgICB1bmRlcnN0YW5kIGl0LgotCi01LiBBcHBsaWNhdGlvbiBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICAgVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gY29kZSB0byB3aGljaCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGFzCi0gICAgIGF0dGFjaGVkIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGFuZCB0byByZWxhdGVkIENvdmVyZWQgQ29kZS4KLQotNi4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCi0KLSAgICAgNi4xLiBOZXcgVmVyc2lvbnMuCi0gICAgIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uICgiTmV0c2NhcGUiKSBtYXkgcHVibGlzaCByZXZpc2VkCi0gICAgIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbgotICAgICB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuCi0KLSAgICAgNi4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgotICAgICBPbmNlIENvdmVyZWQgQ29kZSBoYXMgYmVlbiBwdWJsaXNoZWQgdW5kZXIgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlCi0gICAgIExpY2Vuc2UsIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhhdAotICAgICB2ZXJzaW9uLiBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSBzdWNoIENvdmVyZWQgQ29kZSB1bmRlciB0aGUgdGVybXMKLSAgICAgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgTmV0c2NhcGUuIE5vIG9uZQotICAgICBvdGhlciB0aGFuIE5ldHNjYXBlIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoZSB0ZXJtcyBhcHBsaWNhYmxlIHRvCi0gICAgIENvdmVyZWQgQ29kZSBjcmVhdGVkIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgICA2LjMuIERlcml2YXRpdmUgV29ya3MuCi0gICAgIElmIFlvdSBjcmVhdGUgb3IgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgKHdoaWNoIHlvdSBtYXkKLSAgICAgb25seSBkbyBpbiBvcmRlciB0byBhcHBseSBpdCB0byBjb2RlIHdoaWNoIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZQotICAgICBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UpLCBZb3UgbXVzdCAoYSkgcmVuYW1lIFlvdXIgbGljZW5zZSBzbyB0aGF0Ci0gICAgIHRoZSBwaHJhc2VzICJNb3ppbGxhIiwgIk1PWklMTEFQTCIsICJNT1pQTCIsICJOZXRzY2FwZSIsCi0gICAgICJNUEwiLCAiTlBMIiBvciBhbnkgY29uZnVzaW5nbHkgc2ltaWxhciBwaHJhc2UgZG8gbm90IGFwcGVhciBpbiB5b3VyCi0gICAgIGxpY2Vuc2UgKGV4Y2VwdCB0byBub3RlIHRoYXQgeW91ciBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpCi0gICAgIGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCBZb3VyIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UKLSAgICAgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgYW5kCi0gICAgIE5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlLiAoRmlsbGluZyBpbiB0aGUgbmFtZSBvZiB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIsIE9yaWdpbmFsIENvZGUgb3IgQ29udHJpYnV0b3IgaW4gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4KLSAgICAgRXhoaWJpdCBBIHNoYWxsIG5vdCBvZiB0aGVtc2VsdmVzIGJlIGRlZW1lZCB0byBiZSBtb2RpZmljYXRpb25zIG9mCi0gICAgIHRoaXMgTGljZW5zZS4pCi0KLTcuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0KLSAgICAgQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywKLSAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GCi0gICAgIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4KLSAgICAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBDT0RFCi0gICAgIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsCi0gICAgIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUKLSAgICAgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUgotICAgICBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRgotICAgICBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCi0KLTguIFRFUk1JTkFUSU9OLgotCi0gICAgIDguMS4gIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZQotICAgICBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlCi0gICAgIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIEFsbAotICAgICBzdWJsaWNlbnNlcyB0byB0aGUgQ292ZXJlZCBDb2RlIHdoaWNoIGFyZSBwcm9wZXJseSBncmFudGVkIHNoYWxsCi0gICAgIHN1cnZpdmUgYW55IHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIKLSAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UKLSAgICAgc2hhbGwgc3Vydml2ZS4KLQotICAgICA4LjIuICBJZiBZb3UgaW5pdGlhdGUgbGl0aWdhdGlvbiBieSBhc3NlcnRpbmcgYSBwYXRlbnQgaW5mcmluZ2VtZW50Ci0gICAgIGNsYWltIChleGNsdWRpbmcgZGVjbGF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIKLSAgICAgb3IgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbQotICAgICBZb3UgZmlsZSBzdWNoIGFjdGlvbiBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKSAgYWxsZWdpbmcgdGhhdDoKLQotICAgICAoYSkgIHN1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKLSAgICAgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgYnkgc3VjaAotICAgICBQYXJ0aWNpcGFudCB0byBZb3UgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlCi0gICAgIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHksCi0gICAgIHVubGVzcyBpZiB3aXRoaW4gNjAgZGF5cyBhZnRlciByZWNlaXB0IG9mIG5vdGljZSBZb3UgZWl0aGVyOiAoaSkKLSAgICAgYWdyZWUgaW4gd3JpdGluZyB0byBwYXkgUGFydGljaXBhbnQgYSBtdXR1YWxseSBhZ3JlZWFibGUgcmVhc29uYWJsZQotICAgICByb3lhbHR5IGZvciBZb3VyIHBhc3QgYW5kIGZ1dHVyZSB1c2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHN1Y2gKLSAgICAgUGFydGljaXBhbnQsIG9yIChpaSkgd2l0aGRyYXcgWW91ciBsaXRpZ2F0aW9uIGNsYWltIHdpdGggcmVzcGVjdCB0bwotICAgICB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQuICBJZiB3aXRoaW4gNjAgZGF5cwotICAgICBvZiBub3RpY2UsIGEgcmVhc29uYWJsZSByb3lhbHR5IGFuZCBwYXltZW50IGFycmFuZ2VtZW50IGFyZSBub3QKLSAgICAgbXV0dWFsbHkgYWdyZWVkIHVwb24gaW4gd3JpdGluZyBieSB0aGUgcGFydGllcyBvciB0aGUgbGl0aWdhdGlvbiBjbGFpbQotICAgICBpcyBub3Qgd2l0aGRyYXduLCB0aGUgcmlnaHRzIGdyYW50ZWQgYnkgUGFydGljaXBhbnQgdG8gWW91IHVuZGVyCi0gICAgIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIGF0IHRoZSBleHBpcmF0aW9uIG9mCi0gICAgIHRoZSA2MCBkYXkgbm90aWNlIHBlcmlvZCBzcGVjaWZpZWQgYWJvdmUuCi0KLSAgICAgKGIpICBhbnkgc29mdHdhcmUsIGhhcmR3YXJlLCBvciBkZXZpY2UsIG90aGVyIHRoYW4gc3VjaCBQYXJ0aWNpcGFudCdzCi0gICAgIENvbnRyaWJ1dG9yIFZlcnNpb24sIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4KLSAgICAgYW55IHJpZ2h0cyBncmFudGVkIHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDIuMShiKQotICAgICBhbmQgMi4yKGIpIGFyZSByZXZva2VkIGVmZmVjdGl2ZSBhcyBvZiB0aGUgZGF0ZSBZb3UgZmlyc3QgbWFkZSwgdXNlZCwKLSAgICAgc29sZCwgZGlzdHJpYnV0ZWQsIG9yIGhhZCBtYWRlLCBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAotICAgICBQYXJ0aWNpcGFudC4KLQotICAgICA4LjMuICBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSBhZ2FpbnN0IFBhcnRpY2lwYW50Ci0gICAgIGFsbGVnaW5nIHRoYXQgc3VjaCBQYXJ0aWNpcGFudCdzIENvbnRyaWJ1dG9yIFZlcnNpb24gZGlyZWN0bHkgb3IKLSAgICAgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCB3aGVyZSBzdWNoIGNsYWltIGlzIHJlc29sdmVkIChzdWNoIGFzCi0gICAgIGJ5IGxpY2Vuc2Ugb3Igc2V0dGxlbWVudCkgcHJpb3IgdG8gdGhlIGluaXRpYXRpb24gb2YgcGF0ZW50Ci0gICAgIGluZnJpbmdlbWVudCBsaXRpZ2F0aW9uLCB0aGVuIHRoZSByZWFzb25hYmxlIHZhbHVlIG9mIHRoZSBsaWNlbnNlcwotICAgICBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiBzaGFsbCBiZSB0YWtlbgotICAgICBpbnRvIGFjY291bnQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvciB2YWx1ZSBvZiBhbnkgcGF5bWVudCBvcgotICAgICBsaWNlbnNlLgotCi0gICAgIDguNC4gIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA4LjEgb3IgOC4yIGFib3ZlLAotICAgICBhbGwgZW5kIHVzZXIgbGljZW5zZSBhZ3JlZW1lbnRzIChleGNsdWRpbmcgZGlzdHJpYnV0b3JzIGFuZCByZXNlbGxlcnMpCi0gICAgIHdoaWNoIGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIKLSAgICAgcHJpb3IgdG8gdGVybWluYXRpb24gc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLQotOS4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0KLSAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQKLSAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTAotICAgICBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgQ09ERSwKLSAgICAgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUgotICAgICBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKLSAgICAgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NTIE9GIEdPT0RXSUxMLAotICAgICBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUgotICAgICBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOCi0gICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRgotICAgICBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZCi0gICAgIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcKLSAgICAgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUKLSAgICAgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPCi0gICAgIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgotCi0xMC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KLQotICAgICBUaGUgQ292ZXJlZCBDb2RlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluCi0gICAgIDQ4IEMuRi5SLiAyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiAiY29tbWVyY2lhbCBjb21wdXRlcgotICAgICBzb2Z0d2FyZSIgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24sIiBhcyBzdWNoCi0gICAgIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDgKLSAgICAgQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLAotICAgICBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgQ29kZSB3aXRoIG9ubHkgdGhvc2UKLSAgICAgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uCi0KLTExLiBNSVNDRUxMQU5FT1VTLgotCi0gICAgIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0Ci0gICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUKLSAgICAgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50Ci0gICAgIG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkKLSAgICAgQ2FsaWZvcm5pYSBsYXcgcHJvdmlzaW9ucyAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmCi0gICAgIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIGl0cyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4KLSAgICAgV2l0aCByZXNwZWN0IHRvIGRpc3B1dGVzIGluIHdoaWNoIGF0IGxlYXN0IG9uZSBwYXJ0eSBpcyBhIGNpdGl6ZW4gb2YsCi0gICAgIG9yIGFuIGVudGl0eSBjaGFydGVyZWQgb3IgcmVnaXN0ZXJlZCB0byBkbyBidXNpbmVzcyBpbiB0aGUgVW5pdGVkCi0gICAgIFN0YXRlcyBvZiBBbWVyaWNhLCBhbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUKLSAgICAgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4KLSAgICAgRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksCi0gICAgIENhbGlmb3JuaWEsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZwotICAgICB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQKLSAgICAgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbgotICAgICBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLgotICAgICBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdAotICAgICBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcwotICAgICBMaWNlbnNlLgotCi0xMi4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotICAgICBBcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzCi0gICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwKLSAgICAgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBZb3UgYWdyZWUgdG8KLSAgICAgd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8gZGlzdHJpYnV0ZSBzdWNoCi0gICAgIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZyBoZXJlaW4gaXMgaW50ZW5kZWQgb3IKLSAgICAgc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbiBvZiBsaWFiaWxpdHkuCi0KLTEzLiBNVUxUSVBMRS1MSUNFTlNFRCBDT0RFLgotCi0gICAgIEluaXRpYWwgRGV2ZWxvcGVyIG1heSBkZXNpZ25hdGUgcG9ydGlvbnMgb2YgdGhlIENvdmVyZWQgQ29kZSBhcwotICAgICAiTXVsdGlwbGUtTGljZW5zZWQiLiAgIk11bHRpcGxlLUxpY2Vuc2VkIiBtZWFucyB0aGF0IHRoZSBJbml0aWFsCi0gICAgIERldmVsb3BlciBwZXJtaXRzIHlvdSB0byB1dGlsaXplIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgdW5kZXIKLSAgICAgWW91ciBjaG9pY2Ugb2YgdGhlIE5QTCBvciB0aGUgYWx0ZXJuYXRpdmUgbGljZW5zZXMsIGlmIGFueSwgc3BlY2lmaWVkCi0gICAgIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBpbiB0aGUgZmlsZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBLgotCi1FWEhJQklUIEEgLU1vemlsbGEgUHVibGljIExpY2Vuc2UuCi0KLSAgICAgYGBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCi0gICAgIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KLSAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0KLSAgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgotICAgICBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICAgICBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKLSAgICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18uCi0KLSAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fXy4KLSAgICAgUG9ydGlvbnMgY3JlYXRlZCBieSBfX19fX19fX19fX19fX19fX19fX19fIGFyZSBDb3B5cmlnaHQgKEMpIF9fX19fXwotICAgICBfX19fX19fX19fX19fX19fX19fX19fXy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotICAgICBDb250cmlidXRvcihzKTogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18uCi0KLSAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKLSAgICAgb2YgdGhlIF9fX19fIGxpY2Vuc2UgKHRoZSAgIltfX19dIExpY2Vuc2UiKSwgaW4gd2hpY2ggY2FzZSB0aGUKLSAgICAgcHJvdmlzaW9ucyBvZiBbX19fX19fXSBMaWNlbnNlIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UKLSAgICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5Ci0gICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgW19fX19dIExpY2Vuc2UgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCi0gICAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQotICAgICBkZWxldGluZyAgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZAotICAgICBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBbX19fXSBMaWNlbnNlLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKLSAgICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQotICAgICB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgW19fX10gTGljZW5zZS4iCi0KLSAgICAgW05PVEU6IFRoZSB0ZXh0IG9mIHRoaXMgRXhoaWJpdCBBIG1heSBkaWZmZXIgc2xpZ2h0bHkgZnJvbSB0aGUgdGV4dCBvZgotICAgICB0aGUgbm90aWNlcyBpbiB0aGUgU291cmNlIENvZGUgZmlsZXMgb2YgdGhlIE9yaWdpbmFsIENvZGUuIFlvdSBzaG91bGQKLSAgICAgdXNlIHRoZSB0ZXh0IG9mIHRoaXMgRXhoaWJpdCBBIHJhdGhlciB0aGFuIHRoZSB0ZXh0IGZvdW5kIGluIHRoZQotICAgICBPcmlnaW5hbCBDb2RlIFNvdXJjZSBDb2RlIGZvciBZb3VyIE1vZGlmaWNhdGlvbnMuXQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9ndGtfcm9vdC9hYm91dF9maWxlcy9waXhtYW4tbGljZW5zZXMudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvZ3RrX3Jvb3QvYWJvdXRfZmlsZXMvcGl4bWFuLWxpY2Vuc2VzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4ZGNhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9ndGtfcm9vdC9hYm91dF9maWxlcy9waXhtYW4tbGljZW5zZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotbGlicGl4cmVnaW9uCi0KLUNvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLWRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci10aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLWNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLWRvY3VtZW50YXRpb24uCi0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi1hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCi1DT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi1FeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKLXVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncwotaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgotCi0KLUNvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgotCi0gICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKLWRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCi1wcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCi1zdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCi11c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKLXNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAotCi1ESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKLUFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAotRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKLUFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKLVdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKLUFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLVNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1saWJpYwotCi1Db3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci1jb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi1kb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCi1hZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLXNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCi1yZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKLWlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0KLUtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi1JTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi1FVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLURBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLVRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLVBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNsaW0KLQotc2xpbSBpcyBDb3B5cmlnaHQgqSAyMDAzIFJpY2hhcmQgSGVuZGVyc29uCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKLWFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi1wcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgUmljaGFyZCBIZW5kZXJzb24gbm90IGJlCi11c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKLXNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFJpY2hhcmQgSGVuZGVyc29uCi1tYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCi1hbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKLXdhcnJhbnR5LgotCi1SSUNIQVJEIEhFTkRFUlNPTiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLUlOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLUVWRU5UIFNIQUxMIFJJQ0hBUkQgSEVOREVSU09OIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi1VU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLU9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLVBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvY2FyYm9uLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGZkYWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvY2FyYm9uLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSoubwotZWNsaXBzZQotKi5zbwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9jYXJib24vYnVpbGQuc2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9idWlsZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzMTc2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLSMhL2Jpbi9zaAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIwotIyBVc2FnZTogc2ggYnVpbGQuc2ggWzxvcHRpb25hbCBzd2l0Y2hlcz5dIFtjbGVhbl0KLSMKLSMgICB3aGVyZSB0aGUgb3B0aW9uYWwgc3dpdGNoZXMgYXJlOgotIyAgICAgICAtb3V0cHV0IDxQUk9HUkFNX09VVFBVVD4gIC0gZXhlY3V0YWJsZSBmaWxlbmFtZSAoImVjbGlwc2UiKQotIyAgICAgICAtb3MgICAgIDxERUZBVUxUX09TPiAgICAgIC0gZGVmYXVsdCBFY2xpcHNlICItb3MiIHZhbHVlCi0jICAgICAgIC1hcmNoICAgPERFRkFVTFRfT1NfQVJDSD4gLSBkZWZhdWx0IEVjbGlwc2UgIi1hcmNoIiB2YWx1ZQotIyAgICAgICAtd3MgICAgIDxERUZBVUxUX1dTPiAgICAgIC0gZGVmYXVsdCBFY2xpcHNlICItd3MiIHZhbHVlCi0jCi0jCi0jICAgIFRoaXMgc2NyaXB0IGNhbiBhbHNvIGJlIGludm9rZWQgd2l0aCB0aGUgImNsZWFuIiBhcmd1bWVudC4KLQotY2QgYGRpcm5hbWUgJDBgCi0KLSMgRGVmaW5lIGRlZmF1bHQgdmFsdWVzIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgbWFrZWZpbGVzLgotcHJvZ3JhbU91dHB1dD0iZWNsaXBzZSIKLWRlZmF1bHRPUz0ibWFjb3N4IgotZGVmYXVsdE9TQXJjaD0ieDg2IgotZGVmYXVsdFdTPSJjYXJib24iCi1tYWtlZmlsZT0ibWFrZV9jYXJib24ubWFrIgotaWYgWyAiJE9TIiA9ICIiIF07ICB0aGVuCi0gICAgT1M9YHVuYW1lIC1zYAotZmkKLQotIyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVzLgotZXh0cmFBcmdzPSIiCi13aGlsZSBbICIkMSIgIT0gIiIgXTsgZG8KLSAgICBpZiBbICIkMSIgPSAiLW9zIiBdICYmIFsgIiQyIiAhPSAiIiBdOyB0aGVuCi0gICAgICAgIGRlZmF1bHRPUz0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLWFyY2giIF0gJiYgWyAiJDIiICE9ICIiIF07IHRoZW4KLSAgICAgICAgZGVmYXVsdE9TQXJjaD0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLXdzIiBdICYmIFsgIiQyIiAhPSAiIiBdOyB0aGVuCi0gICAgICAgIGRlZmF1bHRXUz0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLW91dHB1dCIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotICAgICAgICBwcm9ncmFtT3V0cHV0PSIkMiIKLSAgICAgICAgc2hpZnQKLSAgICBlbHNlCi0gICAgICAgIGV4dHJhQXJncz0iJGV4dHJhQXJncyAkMSIKLSAgICBmaQotICAgIHNoaWZ0Ci1kb25lCi0KLSMgU2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZWVkZWQgYnkgdGhlIG1ha2VmaWxlcy4KLVBST0dSQU1fT1VUUFVUPSIkcHJvZ3JhbU91dHB1dCIKLURFRkFVTFRfT1M9IiRkZWZhdWx0T1MiCi1ERUZBVUxUX09TX0FSQ0g9IiRkZWZhdWx0T1NBcmNoIgotREVGQVVMVF9XUz0iJGRlZmF1bHRXUyIKLVBQQ19PVVRQVVRfRElSPSIuLi8uLi9iaW4vJGRlZmF1bHRXUy8kZGVmYXVsdE9TL3BwYy9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUyIKLVg4Nl9PVVRQVVRfRElSPSIuLi8uLi9iaW4vJGRlZmF1bHRXUy8kZGVmYXVsdE9TL3g4Ni9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUyIKLVg4Nl82NF9PVVRQVVRfRElSPSIuLi8uLi9iaW4vJGRlZmF1bHRXUy8kZGVmYXVsdE9TL3g4Nl82NC9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUyIKLQotaWYgWyAiJERFRkFVTFRfV1MiID09ICJjb2NvYSIgXTsgdGhlbgotCW1ha2VmaWxlPSJtYWtlX2NvY29hLm1hayIKLQlleHBvcnQgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPTEwLjQKLWVsc2UKLQlleHBvcnQgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPTEwLjMJCi1maQotCi1pZiBbICIkREVGQVVMVF9PU19BUkNIIiA9PSAieDg2XzY0IiBdOyB0aGVuCi0JZWNobyAiYnVpbGQgeDg2XzY0IgotCUFSQ0hTPSItYXJjaCB4ODZfNjQiCi0JUFJPR1JBTV9PVVRQVVRfRElSPSRYODZfNjRfT1VUUFVUX0RJUgotCURFRkFVTFRfT1NfQVJDSD0ieDg2XzY0IgotZWxzZQotCWVjaG8gImJ1aWxkIHg4NiBhbmQgcHBjIgotCUFSQ0hTPSItYXJjaCBpMzg2IC1hcmNoIHBwYyIKLQlQUk9HUkFNX09VVFBVVF9ESVI9JFg4Nl9PVVRQVVRfRElSCi1maQotIAotZXhwb3J0IFBQQ19PVVRQVVRfRElSIFg4Nl9PVVRQVVRfRElSIFg4Nl82NF9PVVRQVVRfRElSIFBST0dSQU1fT1VUUFVUIERFRkFVTFRfT1MgREVGQVVMVF9PU19BUkNIIERFRkFVTFRfV1MgQVJDSFMgUFJPR1JBTV9PVVRQVVRfRElSCi0KLSMgSWYgdGhlIE9TIGlzIHN1cHBvcnRlZCAoYSBtYWtlZmlsZSBleGlzdHMpCi1pZiBbICIkbWFrZWZpbGUiICE9ICIiIF07IHRoZW4KLQlpZiBbICIkZXh0cmFBcmdzIiAhPSAiIiBdOyB0aGVuCi0JCW1ha2UgLWYgJG1ha2VmaWxlICRleHRyYUFyZ3MKLQllbHNlCi0JCWVjaG8gIkJ1aWxkaW5nICRPUyBsYXVuY2hlci4gRGVmYXVsdHM6IC1vcyAkREVGQVVMVF9PUyAtYXJjaCAkREVGQVVMVF9PU19BUkNIIC13cyAkREVGQVVMVF9XUyIKLQkJbWFrZSAtZiAkbWFrZWZpbGUgY2xlYW4KLQkJbWFrZSAtZiAkbWFrZWZpbGUgYWxsCi0JCW1ha2UgLWYgJG1ha2VmaWxlIGluc3RhbGwKLQlmaQotZWxzZQotCWVjaG8gIlVua25vd24gT1MgKCRPUykgLS0gYnVpbGQgYWJvcnRlZCIKLWZpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9idWlsZC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzA4YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9jYXJib24vYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHByb2plY3QgZGVmYXVsdD0iYnVpbGRfZWNsaXBzZSIgYmFzZWRpcj0iLiI+Ci0KLTx0YXJnZXQgbmFtZT0iYnVpbGRfZWNsaXBzZSI+Ci0JPGV4ZWMgZGlyPSIuIiBleGVjdXRhYmxlPSJzaCI+Ci0JCTxhcmcgbGluZT0iJHtiYXNlZGlyfS9idWlsZC5zaCIvPgotCQk8YXJnIGxpbmU9Imluc3RhbGwiLz4KLQk8L2V4ZWM+Ci0JPGVjbGlwc2UucmVmcmVzaExvY2FsIHJlc291cmNlPSJwbGF0Zm9ybS1sYXVuY2hlciIgZGVwdGg9ImluZmluaXRlIiAvPgkJCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JPHRzdGFtcC8+Ci0JPGV4ZWMgZGlyPSIuIiBleGVjdXRhYmxlPSJzaCI+Ci0JCTxhcmcgbGluZT0iJHtiYXNlZGlyfS9idWlsZC5zaCIvPgotCQk8YXJnIGxpbmU9ImNsZWFuIi8+Ci0JPC9leGVjPgotPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9lY2xpcHNlQ2FyYm9uLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9lY2xpcHNlQ2FyYm9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzM5OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9jYXJib24vZWNsaXBzZUNhcmJvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJICBBbmRyZSBXZWluYW5kIChPVEkgTGFicykKLSAqICAgIERhdmlkIEdyZWVuIC0gT3BlbkpESyBic2QgcG9ydCBpbnRlZ3JhdGlvbgotICovCi0gCi0vKiBNYWNPUyBYIENhcmJvbiBzcGVjaWZpYyBsb2dpYyBmb3IgZGlzcGxheWluZyB0aGUgc3BsYXNoIHNjcmVlbi4gKi8KLQotI2luY2x1ZGUgImVjbGlwc2VPUy5oIgotI2luY2x1ZGUgImVjbGlwc2VDb21tb24uaCIKLSNpbmNsdWRlICJlY2xpcHNlSk5JLmgiCi0jaW5jbHVkZSAiZWNsaXBzZVV0aWwuaCIKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2lmZGVmIENPQ09BCi0jaW5jbHVkZSA8Q29jb2EvQ29jb2EuaD4KLSNlbHNlCi0jaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgotI2luY2x1ZGUgIk5nQ29tbW9uLmgiCi0jaW5jbHVkZSAiTmdJbWFnZURhdGEuaCIKLSNpbmNsdWRlICJOZ1dpbkJNUEZpbGVGb3JtYXQuaCIKLSNlbmRpZgotI2luY2x1ZGUgPG1hY2gtby9keWxkLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jZGVmaW5lIHN0YXJ0dXBKYXJOYW1lICJzdGFydHVwLmphciIKLSNkZWZpbmUgTEFVTkNIRVIgIi1sYXVuY2hlciIKLSNkZWZpbmUgU1BMQVNIX0xBVU5DSEVSICIvUmVzb3VyY2VzL1NwbGFzaC5hcHAvQ29udGVudHMvIgotCi0jZGVmaW5lIERFQlVHIDAKLQotc3RhdGljIF9UQ0hBUiogbm9Gb3JraW5nTXNnID0gX1RfRUNMSVBTRSgiSW50ZXJuYWwgRXJyb3IsIGZvcmtpbmcgdGhlIGp2bSBpcyBub3Qgc3VwcG9ydGVkIG9uIE1hY09TLlxuIik7Ci0KLWNoYXIgKmZpbmRDb21tYW5kKGNoYXIgKmNvbW1hbmQpOwotCi0vKiBHbG9iYWwgVmFyaWFibGVzICovCi1jaGFyKiAgZGVmYXVsdFZNICAgICA9ICJqYXZhIjsKLWNoYXIqICB2bUxpYnJhcnkJID0gIkphdmFWTSI7Ci1jaGFyKiAgc2hpcHBlZFZNRGlyICA9ICJqcmUvYmluLyI7Ci0KLXN0YXRpYyB2b2lkIGFkanVzdExpYnJhcnlQYXRoKGNoYXIgKiB2bUxpYnJhcnkpOwotc3RhdGljIGNoYXIgKiBmaW5kTGliKGNoYXIgKiBjb21tYW5kKTsKLQotI2lmZGVmIGkzODYKLSNkZWZpbmUgSkFWQV9BUkNIICJpMzg2IgotI2VsaWYgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCi0jZGVmaW5lIEpBVkFfQVJDSCAicHBjIgotI2VsaWYgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKLSNkZWZpbmUgSkFWQV9BUkNIICJhbWQ2NCIKLSNlbHNlCi0jZGVmaW5lIEpBVkFfQVJDSCBERUZBVUxUX09TX0FSQ0gKLSNlbmRpZgotCi0jZGVmaW5lIExJQl9QQVRIX1ZBUiBfVF9FQ0xJUFNFKCJMRF9MSUJSQVJZX1BBVEgiKQotI2RlZmluZSBEWUxEX0ZBTExCQUNLX1ZBUiBfVF9FQ0xJUFNFKCJEWUxEX0ZBTExCQUNLX0xJQlJBUllfUEFUSCIpCi0KLSNkZWZpbmUgTUFYX0xPQ0FUSU9OX0xFTkdUSCA0MCAvKiBub25lIG9mIHRoZSBqdm1Mb2NhdGlvbnMgc3RyaW5ncyBzaG91bGQgYmUgbG9uZ2VyIHRoYW4gdGhpcyAqLwotI2RlZmluZSBNQVhfSlZNTElCX0xFTkdUSCAgIDE1IC8qIG5vbmUgb2YgdGhlIGp2bUxpYnMgc3RyaW5ncyBzaG91bGQgYmUgbG9uZ2VyIHRoYW4gdGhpcyAqLwotc3RhdGljIGNvbnN0IGNoYXIqIGp2bUxvY2F0aW9uc1tdID0geyAiLi4vbGliLyIgSkFWQV9BUkNIICIvY2xpZW50IiwKLQkJCQkJCQkJCSAgIi4uL2xpYi8iIEpBVkFfQVJDSCAiL3NlcnZlciIsICIuLi9qcmUvbGliLyIgSkFWQV9BUkNIICIvY2xpZW50IiwKLQkJCQkJCQkJCSAgIi4uL2pyZS9saWIvIiBKQVZBX0FSQ0ggIi9zZXJ2ZXIiLCBOVUxMIH07Ci1zdGF0aWMgY29uc3QgY2hhcioganZtTGlic1tdID0geyAibGlianZtLmR5bGliIiwgImxpYmp2bS5qbmlsaWIiLCAibGlianZtLnNvIiwgTlVMTCB9OwotCi0vKiBEZWZpbmUgdGhlIHdpbmRvdyBzeXN0ZW0gYXJndW1lbnRzIGZvciB0aGUgdmFyaW91cyBKYXZhIFZNcy4gKi8KLXN0YXRpYyBjaGFyKiAgYXJnVk1fSkFWQVtdID0geyAiLVhzdGFydE9uRmlyc3RUaHJlYWQiLCBOVUxMIH07Ci0KLS8qIHRocmVhZCBzdHVmZiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCV9UQ0hBUiAqIGxpYlBhdGg7Ci0JX1RDSEFSICoqIHZtQXJnczsKLQlfVENIQVIgKiogcHJvZ0FyZ3M7Ci0JX1RDSEFSICogamFyRmlsZTsKLQlKYXZhUmVzdWx0cyogcmVzdWx0OwotfSBTdGFydFZNQXJnczsKLQotI2lmZGVmIENPQ09BCi1zdGF0aWMgTlNXaW5kb3cqIHdpbmRvdyA9IG5pbDsKLUBpbnRlcmZhY2UgS2V5V2luZG93IDogTlNXaW5kb3cgeyB9Ci0tIChCT09MKWNhbkJlY29tZUtleVdpbmRvdzsKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEtleVdpbmRvdwotLSAoQk9PTCljYW5CZWNvbWVLZXlXaW5kb3cgewotCXJldHVybiBZRVM7Ci19Ci0KLS0gKHZvaWQpY2xvc2UgewotCVtzdXBlciBjbG9zZV07Ci0Jd2luZG93ID0gbmlsOwotfQotCi1AZW5kCi0KLUBpbnRlcmZhY2UgQXBwbGVFdmVudERlbGVnYXRlIDogTlNPYmplY3QKLS0gKHZvaWQpaGFuZGxlT3BlbkRvY3VtZW50czooTlNBcHBsZUV2ZW50RGVzY3JpcHRvciAqKWV2ZW50IHdpdGhSZXBseUV2ZW50OiAoTlNBcHBsZUV2ZW50RGVzY3JpcHRvciAqKXJlcGx5RXZlbnQ7Ci1AZW5kCi1AaW1wbGVtZW50YXRpb24gQXBwbGVFdmVudERlbGVnYXRlCi0JTlNUaW1lciAqdGltZXI7Ci0JTlNNdXRhYmxlQXJyYXkgKmZpbGVzOwotCQotLSAodm9pZCloYW5kbGVPcGVuRG9jdW1lbnRzOihOU0FwcGxlRXZlbnREZXNjcmlwdG9yICopZXZlbnQgd2l0aFJlcGx5RXZlbnQ6IChOU0FwcGxlRXZlbnREZXNjcmlwdG9yICopcmVwbHlFdmVudCB7Ci0JTlNBdXRvcmVsZWFzZVBvb2wqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLSAgICBpbnQgY291bnQgPSBbZXZlbnQgbnVtYmVyT2ZJdGVtc107Ci0gICAgaW50IGluZGV4ID0gMTsKLSAgICAKLSAJaWYgKCFmaWxlcykgewotCQlmaWxlcyA9IFtOU011dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eTpjb3VudF07Ci0JCVtmaWxlcyByZXRhaW5dOwotCX0KLQkJCi0JZm9yIChpbmRleCA9IDE7IGluZGV4PD1jb3VudDsgaW5kZXgrKykgewotCQlOU0FwcGxlRXZlbnREZXNjcmlwdG9yICpkZXNjID0gW2V2ZW50IGRlc2NyaXB0b3JBdEluZGV4OmluZGV4XTsKLQkJaWYgKGRlc2MpIHsKLQkJCWRlc2MgPSBbZGVzYyBjb2VyY2VUb0Rlc2NyaXB0b3JUeXBlOnR5cGVGU1JlZl07Ci0JCQlDRlVSTFJlZiB1cmwgPSBDRlVSTENyZWF0ZUZyb21GU1JlZihrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBbW2Rlc2MgZGF0YV0gYnl0ZXNdKTsKLQkJCWlmICh1cmwpIHsKLQkJCQlOU1N0cmluZyAqcGF0aE5hbWUgPSAoTlNTdHJpbmcgKilDRlVSTENvcHlGaWxlU3lzdGVtUGF0aCh1cmwsIGtDRlVSTFBPU0lYUGF0aFN0eWxlKTsKLQkJCQlbZmlsZXMgYWRkT2JqZWN0OnBhdGhOYW1lXTsKLQkJCQlbcGF0aE5hbWUgcmVsZWFzZV07Ci0JCQkJQ0ZSZWxlYXNlKHVybCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JaWYgKCF0aW1lcikgewotCQl0aW1lciA9IFtOU1RpbWVyIHNjaGVkdWxlZFRpbWVyV2l0aFRpbWVJbnRlcnZhbDogMS4wCi0JCQkJCQkJCQkJCQkgdGFyZ2V0OiBzZWxmCi0JCQkJCQkJCQkJCSAgIHNlbGVjdG9yOiBAc2VsZWN0b3IoaGFuZGxlVGltZXI6KQotCQkJCQkJCQkJCQkgICB1c2VySW5mbzogbmlsCi0JCQkJCQkJCQkJCQlyZXBlYXRzOiBZRVNdOwotCX0KLQlbcG9vbCByZWxlYXNlXTsKLX0KLS0gKHZvaWQpIGhhbmRsZVRpbWVyOiAoTlNUaW1lciAqKSB0aW1lciB7Ci0JTlNPYmplY3QgKmRlbGVnYXRlID0gW1tOU0FwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXSBkZWxlZ2F0ZV07Ci0JaWYgKGRlbGVnYXRlICE9IE5VTEwgJiYgW2RlbGVnYXRlIHJlc3BvbmRzVG9TZWxlY3RvcjogQHNlbGVjdG9yKGFwcGxpY2F0aW9uOm9wZW5GaWxlczopXSkgewotCQlbZGVsZWdhdGUgcGVyZm9ybVNlbGVjdG9yOkBzZWxlY3RvcihhcHBsaWNhdGlvbjpvcGVuRmlsZXM6KQl3aXRoT2JqZWN0OltOU0FwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXSB3aXRoT2JqZWN0OmZpbGVzXTsKLQkJW2ZpbGVzIHJlbGVhc2VdOwotCQlbdGltZXIgaW52YWxpZGF0ZV07Ci0JfQotfQotQGVuZAotI2VuZGlmCi0KLXN0YXRpYyBDRlJ1bkxvb3BSZWYgbG9vcFJlZiA9IE5VTEw7Ci1zdGF0aWMgdm9pZCAqIHN0YXJ0VGhyZWFkKHZvaWQgKiBpbml0KTsgCi1zdGF0aWMgdm9pZCBydW5FdmVudExvb3AoQ0ZSdW5Mb29wUmVmIHJlZik7Ci1zdGF0aWMgdm9pZCBkdW1teUNhbGxiYWNrKHZvaWQgKiBpbmZvKSB7fQotI2lmbmRlZiBDT0NPQQotc3RhdGljIENGTXV0YWJsZUFycmF5UmVmIGZpbGVzOwotc3RhdGljIEV2ZW50SGFuZGxlclJlZiBhcHBIYW5kbGVyOwotc3RhdGljIGludCBTV1RfQ0xBU1MgPSAnU1dULSc7Ci1zdGF0aWMgaW50IFNXVF9PUEVOX0ZJTEVfS0lORCA9IDE7Ci1zdGF0aWMgaW50IFNXVF9PUEVOX0ZJTEVfUEFSQU0gPSAnb2RvYyc7Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci0JcmV0dXJuIC0xOwotfQotCi12b2lkIGluc3RhbGxBcHBsZUV2ZW50SGFuZGxlcigpOwotCi1pbnQgcmV1c2VXb3JrYmVuY2goX1RDSEFSKiogZmlsZVBhdGgsIGludCB0aW1lb3V0KSB7Ci0JaW5zdGFsbEFwcGxlRXZlbnRIYW5kbGVyKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT0NPQQotCi0vKiBTaG93IHRoZSBTcGxhc2ggV2luZG93Ci0gKgotICogQ3JlYXRlIHRoZSBzcGxhc2ggd2luZG93LCBsb2FkIHRoZSBiaXRtYXAgYW5kIGRpc3BsYXkgdGhlIHNwbGFzaCB3aW5kb3cuCi0gKi8KLWludCBzaG93U3BsYXNoKCBjb25zdCBfVENIQVIqIGZlYXR1cmVJbWFnZSApCi17Ci0JaWYgKHdpbmRvdyAhPSBOVUxMKQotCQlyZXR1cm4gMDsgLyphbHJlYWR5IHNob3dpbmcgKi8KLQlpZiAoZmVhdHVyZUltYWdlID09IE5VTEwpCi0JCXJldHVybiBFTk9FTlQ7Ci0JCi0JaW50IHJlc3VsdCA9IEVOT0VOVDsKLQlOU0F1dG9yZWxlYXNlUG9vbCogcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOwotCVtOU0FwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKLQlOU0ltYWdlKiBpbWFnZSA9IFtbTlNJbWFnZSBhbGxvY10gaW5pdEJ5UmVmZXJlbmNpbmdGaWxlOiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6IGZlYXR1cmVJbWFnZV1dOwotCWlmIChpbWFnZSAhPSBOVUxMKSB7Ci0JCU5TSW1hZ2VSZXAqIGltYWdlUmVwID0gW2ltYWdlIGJlc3RSZXByZXNlbnRhdGlvbkZvckRldmljZTogW1tOU1NjcmVlbiBtYWluU2NyZWVuXSBkZXZpY2VEZXNjcmlwdGlvbl1dOwotCQlOU1JlY3QgcmVjdCA9IHt7MCwgMH0sIHtbaW1hZ2VSZXAgcGl4ZWxzV2lkZV0sIFtpbWFnZVJlcCBwaXhlbHNIaWdoXX19OwotCQlbaW1hZ2Ugc2V0U2l6ZTogTlNNYWtlU2l6ZShbaW1hZ2VSZXAgcGl4ZWxzV2lkZV0sIFtpbWFnZVJlcCBwaXhlbHNIaWdoXSldOwotCQlbaW1hZ2UgYXV0b3JlbGVhc2VdOwotCQl3aW5kb3cgPSBbW0tleVdpbmRvdyBhbGxvY10gaW5pdFdpdGhDb250ZW50UmVjdDogcmVjdCBzdHlsZU1hc2s6IE5TQm9yZGVybGVzc1dpbmRvd01hc2sgYmFja2luZzogTlNCYWNraW5nU3RvcmVCdWZmZXJlZCBkZWZlcjogMF07Ci0JCWlmICh3aW5kb3cgIT0gbmlsKSB7Ci0JCQlbd2luZG93IGNlbnRlcl07Ci0JCQlbd2luZG93IHNldEJhY2tncm91bmRDb2xvcjogW05TQ29sb3IgY29sb3JXaXRoUGF0dGVybkltYWdlOiBpbWFnZV1dOwotCQkJW3dpbmRvdyBtYWtlS2V5QW5kT3JkZXJGcm9udDogbmlsXTsKLQkJCWRpc3BhdGNoTWVzc2FnZXMoKTsKLQkJCXJlc3VsdCA9IDA7CQkKLQkJfQotCX0KLQlbcG9vbCByZWxlYXNlXTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIHRha2VEb3duU3BsYXNoKCkgewotCWlmICh3aW5kb3cgIT0gMCkgewotCQlOU0F1dG9yZWxlYXNlUG9vbCogcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOwotCQlbd2luZG93IGNsb3NlXTsKLQkJd2luZG93ID0gbmlsOwotCQlbcG9vbCByZWxlYXNlXTsKLQl9Ci19CQotCi12b2lkIGRpc3BhdGNoTWVzc2FnZXMoKSB7Ci0JTlNBdXRvcmVsZWFzZVBvb2wqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLQlOU0V2ZW50KiBldmVudDsKLQlOU0FwcGxpY2F0aW9uKiBhcHBsaWNhdGlvbiA9IFtOU0FwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKLQl3aGlsZSAoKGV2ZW50ID0gW2FwcGxpY2F0aW9uIG5leHRFdmVudE1hdGNoaW5nTWFzazogMCB1bnRpbERhdGU6IG5pbCBpbk1vZGU6IE5TRGVmYXVsdFJ1bkxvb3BNb2RlIGRlcXVldWU6IFRSVUVdKSAhPSBuaWwpIHsKLQkJW2FwcGxpY2F0aW9uIHNlbmRFdmVudDogZXZlbnRdOwotCX0KLQlbcG9vbCByZWxlYXNlXTsJCi19Ci0KLSNlbHNlCi1zdGF0aWMgV2luZG93UmVmIHdpbmRvdzsKLXN0YXRpYyBDb250cm9sUmVmIHBhbmUgPSBOVUxMOwotc3RhdGljIENHSW1hZ2VSZWYgaW1hZ2UgPSBOVUxMOwotc3RhdGljIENHSW1hZ2VSZWYgbG9hZEJNUEltYWdlKGNvbnN0IGNoYXIgKmltYWdlKTsKLQotdHlwZWRlZiBDR0ltYWdlU291cmNlUmVmICgqQ0dJbWFnZVNvdXJjZUNyZWF0ZVdpdGhVUkxfRlVOQykgKENGVVJMUmVmLCBDRkRpY3Rpb25hcnlSZWYpOwotdHlwZWRlZiBDR0ltYWdlUmVmICgqQ0dJbWFnZVNvdXJjZUNyZWF0ZUltYWdlQXRJbmRleF9GVU5DKShDR0ltYWdlU291cmNlUmVmLCBzaXplX3QsIENGRGljdGlvbmFyeVJlZik7Ci1zdGF0aWMgQ0dJbWFnZVNvdXJjZUNyZWF0ZVdpdGhVUkxfRlVOQyBjcmVhdGVXaXRoVVJMID0gTlVMTDsKLXN0YXRpYyBDR0ltYWdlU291cmNlQ3JlYXRlSW1hZ2VBdEluZGV4X0ZVTkMgY3JlYXRlQXRJbmRleCA9IE5VTEw7Ci0KLXN0YXRpYyBwYXNjYWwgT1NFcnIgb3BlbkRvY3VtZW50c1Byb2MoY29uc3QgQXBwbGVFdmVudCAqdGhlQXBwbGVFdmVudCwgQXBwbGVFdmVudCAqcmVwbHksIGxvbmcgaGFuZGxlclJlZmNvbik7Ci0KLXN0YXRpYyBPU1N0YXR1cyBkcmF3UHJvYyAoRXZlbnRIYW5kbGVyQ2FsbFJlZiBldmVudEhhbmRsZXJDYWxsUmVmLCBFdmVudFJlZiBldmVudFJlZiwgdm9pZCAqIGRhdGEpIHsKLQlpbnQgcmVzdWx0ID0gQ2FsbE5leHRFdmVudEhhbmRsZXIoZXZlbnRIYW5kbGVyQ2FsbFJlZiwgZXZlbnRSZWYpOwotCWlmIChpbWFnZSkgewotCQlDb250cm9sUmVmIGNvbnRyb2w7Ci0JCUNHQ29udGV4dFJlZiBjb250ZXh0OwotCQkKLQkJR2V0RXZlbnRQYXJhbWV0ZXIoZXZlbnRSZWYsIGtFdmVudFBhcmFtRGlyZWN0T2JqZWN0LCB0eXBlQ29udHJvbFJlZiwgTlVMTCwgNCwgTlVMTCwgJmNvbnRyb2wpOwotCQlHZXRFdmVudFBhcmFtZXRlcihldmVudFJlZiwga0V2ZW50UGFyYW1DR0NvbnRleHRSZWYsIHR5cGVDR0NvbnRleHRSZWYsIE5VTEwsIDQsIE5VTEwsICZjb250ZXh0KTsKLQkJCi0JCUhJUmVjdCByZWN0OwotCQlISVZpZXdHZXRCb3VuZHMoY29udHJvbCwgJnJlY3QpOwotCQlISVZpZXdEcmF3Q0dJbWFnZShjb250ZXh0LCAmcmVjdCwgaW1hZ2UpOwotCX0gCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIE9TU3RhdHVzIGRpc3Bvc2VQcm9jIChFdmVudEhhbmRsZXJDYWxsUmVmIGV2ZW50SGFuZGxlckNhbGxSZWYsIEV2ZW50UmVmIGV2ZW50UmVmLCB2b2lkICogZGF0YSkgewotCXdpbmRvdyA9IE5VTEw7Ci0JcmV0dXJuIGV2ZW50Tm90SGFuZGxlZEVycjsKLX0KLQotdm9pZCBsb2FkSW1hZ2VGbnMoKQotewotCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotCXN0YXRpYyBDRkJ1bmRsZVJlZiBidW5kbGUgPSBOVUxMOwotCQotCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJaWYgKCFidW5kbGUpIGJ1bmRsZSA9IENGQnVuZGxlR2V0QnVuZGxlV2l0aElkZW50aWZpZXIoQ0ZTVFIoImNvbS5hcHBsZS5DYXJib24iKSk7Ci0JCWlmIChidW5kbGUpIGNyZWF0ZUF0SW5kZXggPSAoQ0dJbWFnZVNvdXJjZUNyZWF0ZUltYWdlQXRJbmRleF9GVU5DKUNGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZShidW5kbGUsIENGU1RSKCJDR0ltYWdlU291cmNlQ3JlYXRlSW1hZ2VBdEluZGV4IikpOwotCQlpZiAoYnVuZGxlKSBjcmVhdGVXaXRoVVJMID0gKENHSW1hZ2VTb3VyY2VDcmVhdGVXaXRoVVJMX0ZVTkMpQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lKGJ1bmRsZSwgQ0ZTVFIoIkNHSW1hZ2VTb3VyY2VDcmVhdGVXaXRoVVJMIikpOwotCQlpbml0aWFsaXplZCA9IDE7Ci0JfQotfQotCi1zdGF0aWMgT1NTdGF0dXMgYXBwbGVFdmVudFByb2MoRXZlbnRIYW5kbGVyQ2FsbFJlZiBpbkNhbGxlciwgRXZlbnRSZWYgdGhlRXZlbnQsIHZvaWQqIGluUmVmY29uKSB7Ci0JRXZlbnRSZWNvcmQgZXZlbnRSZWNvcmQ7Ci0JQm9vbGVhbiByZWxlYXNlID0gZmFsc2U7Ci0JRXZlbnRRdWV1ZVJlZiBxdWV1ZTsKLQkKLQlxdWV1ZSA9IEdldEN1cnJlbnRFdmVudFF1ZXVlKCk7Ci0JaWYgKElzRXZlbnRJblF1ZXVlIChxdWV1ZSwgdGhlRXZlbnQpKSB7Ci0JCVJldGFpbkV2ZW50ICh0aGVFdmVudCk7Ci0JCXJlbGVhc2UgPSB0cnVlOwotCQlSZW1vdmVFdmVudEZyb21RdWV1ZSAocXVldWUsIHRoZUV2ZW50KTsKLQl9Ci0JQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZCAodGhlRXZlbnQsICZldmVudFJlY29yZCk7Ci0JQUVQcm9jZXNzQXBwbGVFdmVudCAoJmV2ZW50UmVjb3JkKTsKLQlpZiAocmVsZWFzZSkgUmVsZWFzZUV2ZW50ICh0aGVFdmVudCk7Ci0JcmV0dXJuIG5vRXJyOwotfQotCi1zdGF0aWMgdm9pZCB0aW1lclByb2MoRXZlbnRMb29wVGltZXJSZWYgdGltZXIsIHZvaWQgKnVzZXJEYXRhKSB7Ci0JRXZlbnRUYXJnZXRSZWYgdGFyZ2V0ID0gR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCgpOwotCUNGSW5kZXggY291bnQgPSBDRkFycmF5R2V0Q291bnQgIChmaWxlcyk7Ci0JaW50IGk7Ci0JZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgewotCQlDRlN0cmluZ1JlZiBmaWxlID0gKENGU3RyaW5nUmVmKSBDRkFycmF5R2V0VmFsdWVBdEluZGV4KGZpbGVzLCBpKTsKLQkJRXZlbnRSZWYgZXZlbnQgPSBOVUxMOwotCQlDcmVhdGVFdmVudCAoTlVMTCwgU1dUX0NMQVNTLCBTV1RfT1BFTl9GSUxFX0tJTkQsIDAsIGtFdmVudEF0dHJpYnV0ZU5vbmUsICZldmVudCk7Ci0JCVNldEV2ZW50UGFyYW1ldGVyIChldmVudCwgU1dUX09QRU5fRklMRV9QQVJBTSwgdHlwZUNGU3RyaW5nUmVmLCBzaXplb2YoZmlsZSksICZmaWxlKTsKLQkJT1NTdGF0dXMgc3RhdHVzID0gU2VuZEV2ZW50VG9FdmVudFRhcmdldChldmVudCwgdGFyZ2V0KTsKLQkJUmVsZWFzZUV2ZW50KGV2ZW50KTsKLQkJaWYgKHN0YXR1cyA9PSBldmVudE5vdEhhbmRsZWRFcnIpIHJldHVybjsKLQl9Ci0JQ0ZSZWxlYXNlKGZpbGVzKTsKLQlSZW1vdmVFdmVudExvb3BUaW1lcih0aW1lcik7Ci0JUmVtb3ZlRXZlbnRIYW5kbGVyKGFwcEhhbmRsZXIpOwotCUFFUmVtb3ZlRXZlbnRIYW5kbGVyKGtDb3JlRXZlbnRDbGFzcywga0FFT3BlbkRvY3VtZW50cywgTmV3QUVFdmVudEhhbmRsZXJVUFAob3BlbkRvY3VtZW50c1Byb2MpLCBmYWxzZSk7Ci19Ci0gCi1zdGF0aWMgcGFzY2FsIE9TRXJyIG9wZW5Eb2N1bWVudHNQcm9jKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFwcGxlRXZlbnQsIEFwcGxlRXZlbnQgKnJlcGx5LCBsb25nIGhhbmRsZXJSZWZjb24pIHsKLSAgICBBRURlc2NMaXN0ICBkb2NMaXN0OwotICAgIEZTUmVmICAgICAgIHRoZUZTUmVmOwotICAgIGxvbmcgICAgICAgIGluZGV4OwotICAgIGxvbmcgICAgICAgIGNvdW50ID0gMDsKLSAgICAKLSAgICBBRUdldFBhcmFtRGVzYyh0aGVBcHBsZUV2ZW50LCBrZXlEaXJlY3RPYmplY3QsIHR5cGVBRUxpc3QsICZkb2NMaXN0KTsKLQlBRUNvdW50SXRlbXMoJmRvY0xpc3QsICZjb3VudCk7Ci0JZm9yKGluZGV4ID0gMTsgaW5kZXggPD0gY291bnQ7IGluZGV4KyspIHsKLSAgICAgICAgQUVHZXROdGhQdHIoJmRvY0xpc3QsIGluZGV4LCB0eXBlRlNSZWYsIE5VTEwsIE5VTEwsICZ0aGVGU1JlZiwgc2l6ZW9mKEZTUmVmKSwgTlVMTCk7Ci0JCUNGVVJMUmVmIHVybCA9IENGVVJMQ3JlYXRlRnJvbUZTUmVmKGtDRkFsbG9jYXRvckRlZmF1bHQsICZ0aGVGU1JlZik7Ci0JCUNGU3RyaW5nUmVmIHBhdGhOYW1lID0gQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgodXJsLCBrQ0ZVUkxQT1NJWFBhdGhTdHlsZSk7Ci0JCWlmICghZmlsZXMpIHsKLQkJCWZpbGVzID0gQ0ZBcnJheUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgY291bnQsICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpOwkJCi0gICAgICAgICAgICBJbnN0YWxsRXZlbnRMb29wVGltZXIoR2V0TWFpbkV2ZW50TG9vcCgpLCAxLCAxLCBOZXdFdmVudExvb3BUaW1lclVQUCh0aW1lclByb2MpLCBOVUxMLCBOVUxMKTsgCi0JCX0KLQkJQ0ZBcnJheUFwcGVuZFZhbHVlKGZpbGVzLCBwYXRoTmFtZSk7Ci0JCUNGUmVsZWFzZShwYXRoTmFtZSk7Ci0JCUNGUmVsZWFzZSh1cmwpOwotICAgIH0KLSAgICBBRURpc3Bvc2VEZXNjKCZkb2NMaXN0KTsKLSAgICByZXR1cm4gbm9FcnI7Ci19Ci0KLS8qIFNob3cgdGhlIFNwbGFzaCBXaW5kb3cKLSAqCi0gKiBDcmVhdGUgdGhlIHNwbGFzaCB3aW5kb3csIGxvYWQgdGhlIGJpdG1hcCBhbmQgZGlzcGxheSB0aGUgc3BsYXNoIHdpbmRvdy4KLSAqLwotaW50IHNob3dTcGxhc2goIGNvbnN0IF9UQ0hBUiogZmVhdHVyZUltYWdlICkKLXsKLQlSZWN0IHdSZWN0OwotCWludCB3LCBoLCBkZXZpY2VXaWR0aCwgZGV2aWNlSGVpZ2h0OwotCWludCBhdHRyaWJ1dGVzOwotCUV2ZW50VHlwZVNwZWMgZHJhdyA9IHtrRXZlbnRDbGFzc0NvbnRyb2wsIGtFdmVudENvbnRyb2xEcmF3fTsKLQlFdmVudFR5cGVTcGVjIGRpc3Bvc2UgPSB7a0V2ZW50Q2xhc3NXaW5kb3csIGtFdmVudFdpbmRvd0Rpc3Bvc2V9OwotCUNvbnRyb2xSZWYgcm9vdDsKLQkKLQlpZih3aW5kb3cgIT0gTlVMTCkKLQkJcmV0dXJuIDA7IC8qYWxyZWFkeSBzaG93aW5nICovCi0JaWYgKGZlYXR1cmVJbWFnZSA9PSBOVUxMKQotCQlyZXR1cm4gRU5PRU5UOwotCQotCWxvYWRJbWFnZUZucygpOwotCWlmIChjcmVhdGVXaXRoVVJMICYmIGNyZWF0ZUF0SW5kZXgpIHsKLQkJQ0ZTdHJpbmdSZWYgaW1hZ2VTdHJpbmcgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKGtDRkFsbG9jYXRvckRlZmF1bHQsIGZlYXR1cmVJbWFnZSwga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKLQkJaWYoaW1hZ2VTdHJpbmcgIT0gTlVMTCkgewotCQkJQ0ZVUkxSZWYgdXJsID0gQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgoa0NGQWxsb2NhdG9yRGVmYXVsdCwgaW1hZ2VTdHJpbmcsIGtDRlVSTFBPU0lYUGF0aFN0eWxlLCBmYWxzZSk7Ci0JCQlpZih1cmwgIT0gTlVMTCkgewotCQkJCUNHSW1hZ2VTb3VyY2VSZWYgaW1hZ2VTb3VyY2UgPSBjcmVhdGVXaXRoVVJMKHVybCwgTlVMTCk7Ci0JCQkJaWYoaW1hZ2VTb3VyY2UgIT0gTlVMTCkgewotCQkJCQlpbWFnZSA9IGNyZWF0ZUF0SW5kZXgoaW1hZ2VTb3VyY2UsIDAsIE5VTEwpOwotCQkJCX0KLQkJCQlDRlJlbGVhc2UodXJsKTsKLQkJCX0KLQkJfQotCQlDRlJlbGVhc2UoaW1hZ2VTdHJpbmcpOwkJCi0JfSBlbHNlIHsKLQkJaW1hZ2UgPSBsb2FkQk1QSW1hZ2UoZmVhdHVyZUltYWdlKTsKLQl9Ci0JCi0JLypJZiB0aGUgc3BsYXNoIGltYWdlIGRhdGEgY291bGQgbm90IGJlIGxvYWRlZCwgcmV0dXJuIGFuIGVycm9yLiovIAotCWlmIChpbWFnZSA9PSBOVUxMKQotCQlyZXR1cm4gRU5PRU5UOwotCQkKLQl3ID0gQ0dJbWFnZUdldFdpZHRoKGltYWdlKTsKLQloID0gQ0dJbWFnZUdldEhlaWdodChpbWFnZSk7Ci0KLQlHZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcyhHZXRNYWluRGV2aWNlKCksICZ3UmVjdCk7Ci0KLQlkZXZpY2VXaWR0aD0gd1JlY3QucmlnaHQgLSB3UmVjdC5sZWZ0OwotCWRldmljZUhlaWdodD0gd1JlY3QuYm90dG9tIC0gd1JlY3QudG9wOwotCi0Jd1JlY3QubGVmdCs9IChkZXZpY2VXaWR0aC13KS8yOwotCXdSZWN0LnRvcCs9IChkZXZpY2VIZWlnaHQtaCkvMzsKLQl3UmVjdC5yaWdodD0gd1JlY3QubGVmdCArIHc7Ci0Jd1JlY3QuYm90dG9tPSB3UmVjdC50b3AgKyBoOwotCQotCWF0dHJpYnV0ZXMgPSBrV2luZG93U3RhbmRhcmRIYW5kbGVyQXR0cmlidXRlIHwga1dpbmRvd0NvbXBvc2l0aW5nQXR0cmlidXRlOwotCWF0dHJpYnV0ZXMgJj0gR2V0QXZhaWxhYmxlV2luZG93QXR0cmlidXRlcyhrU2hlZXRXaW5kb3dDbGFzcyk7Ci0JQ3JlYXRlTmV3V2luZG93KGtTaGVldFdpbmRvd0NsYXNzLCBhdHRyaWJ1dGVzLCAmd1JlY3QsICZ3aW5kb3cpOwotCWlmICh3aW5kb3cgIT0gTlVMTCkgewotCQlHZXRSb290Q29udHJvbCh3aW5kb3csICZyb290KTsKLQkJd1JlY3QubGVmdCA9IHdSZWN0LnRvcCA9IDA7CQotCQl3UmVjdC5yaWdodCA9IHc7Ci0JCXdSZWN0LmJvdHRvbSA9IGg7Ci0JCUNyZWF0ZVVzZXJQYW5lQ29udHJvbCh3aW5kb3csICZ3UmVjdCwga0NvbnRyb2xTdXBwb3J0c0VtYmVkZGluZyB8IGtDb250cm9sU3VwcG9ydHNGb2N1cyB8IGtDb250cm9sR2V0c0ZvY3VzT25DbGljaywgJnBhbmUpOwotCQlISVZpZXdBZGRTdWJ2aWV3KHJvb3QsIHBhbmUpOwkKLQotCQlJbnN0YWxsRXZlbnRIYW5kbGVyKEdldENvbnRyb2xFdmVudFRhcmdldChwYW5lKSwgKEV2ZW50SGFuZGxlclVQUClkcmF3UHJvYywgMSwgJmRyYXcsIE5VTEwsIE5VTEwpOwotCQlJbnN0YWxsRXZlbnRIYW5kbGVyKEdldFdpbmRvd0V2ZW50VGFyZ2V0KHdpbmRvdyksIChFdmVudEhhbmRsZXJVUFApZGlzcG9zZVByb2MsIDEsICZkaXNwb3NlLCBOVUxMLCBOVUxMKTsKLQkJU2hvd1dpbmRvdyh3aW5kb3cpOwotCQlkaXNwYXRjaE1lc3NhZ2VzKCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgdGFrZURvd25TcGxhc2goKSB7Ci0JaWYoIHdpbmRvdyAhPSAwKSB7Ci0JCURpc3Bvc2VXaW5kb3cod2luZG93KTsKLQkJd2luZG93ID0gTlVMTDsKLQl9Ci0JaWYoaW1hZ2UpewotCQlDR0ltYWdlUmVsZWFzZShpbWFnZSk7Ci0JCWltYWdlID0gTlVMTDsKLQl9CQotfQkKLQotdm9pZCBkaXNwYXRjaE1lc3NhZ2VzKCkgewotCUV2ZW50UmVmIGV2ZW50OwotCUV2ZW50VGFyZ2V0UmVmIHRhcmdldDsKLQkKLQl0YXJnZXQgPSBHZXRFdmVudERpc3BhdGNoZXJUYXJnZXQoKTsKLQl3aGlsZSggUmVjZWl2ZU5leHRFdmVudCgwLCBOVUxMLCBrRXZlbnREdXJhdGlvbk5vV2FpdCwgdHJ1ZSwgJmV2ZW50KSA9PSBub0VyciApIHsKLQkJU2VuZEV2ZW50VG9FdmVudFRhcmdldChldmVudCwgdGFyZ2V0KTsKLQkJUmVsZWFzZUV2ZW50KGV2ZW50KTsKLQl9Ci19Ci0jZW5kaWYJCi0KLXZvaWQgaW5zdGFsbEFwcGxlRXZlbnRIYW5kbGVyKCkgewotI2lmZGVmIENPQ09BCi0JTlNBdXRvcmVsZWFzZVBvb2wqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLQlBcHBsZUV2ZW50RGVsZWdhdGUgKmFwcGxlRXZlbnREZWxlZ2F0ZSA9IFtbQXBwbGVFdmVudERlbGVnYXRlIGFsbG9jXSBpbml0XTsKLQlbTlNBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07Ci0JTlNBcHBsZUV2ZW50TWFuYWdlciAqbWFuYWdlciA9IFtOU0FwcGxlRXZlbnRNYW5hZ2VyIHNoYXJlZEFwcGxlRXZlbnRNYW5hZ2VyXTsKLQlbbWFuYWdlciBzZXRFdmVudEhhbmRsZXI6YXBwbGVFdmVudERlbGVnYXRlIAotCQkJCSBhbmRTZWxlY3RvcjpAc2VsZWN0b3IoaGFuZGxlT3BlbkRvY3VtZW50czp3aXRoUmVwbHlFdmVudDopIAotCQkJICAgZm9yRXZlbnRDbGFzczprQ29yZUV2ZW50Q2xhc3MgCi0JCQkJICBhbmRFdmVudElEOmtBRU9wZW5Eb2N1bWVudHNdOwotLy8JW2FwcGxlRXZlbnREZWxlZ2F0ZSByZWxlYXNlXTsKLQlbcG9vbCByZWxlYXNlXTsKLSNlbHNlCQotCUV2ZW50VHlwZVNwZWMga0V2ZW50c1tdID0geyB7a0V2ZW50Q2xhc3NBcHBsZUV2ZW50LCBrRXZlbnRBcHBsZUV2ZW50fSB9OwotCUluc3RhbGxBcHBsaWNhdGlvbkV2ZW50SGFuZGxlcihOZXdFdmVudEhhbmRsZXJVUFAoYXBwbGVFdmVudFByb2MpLCBHZXRFdmVudFR5cGVDb3VudChrRXZlbnRzKSwga0V2ZW50cywgMCwgJmFwcEhhbmRsZXIpOwotCUFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQ29yZUV2ZW50Q2xhc3MsIGtBRU9wZW5Eb2N1bWVudHMsIE5ld0FFRXZlbnRIYW5kbGVyVVBQKG9wZW5Eb2N1bWVudHNQcm9jKSwgMCwgZmFsc2UpOwotI2VuZGlmCi19Ci0KLWpsb25nIGdldFNwbGFzaEhhbmRsZSgpIHsKLQlyZXR1cm4gKGpsb25nKXdpbmRvdzsKLX0KLQotLyogR2V0IHRoZSB3aW5kb3cgc3lzdGVtIHNwZWNpZmljIFZNIGFyZ3VtZW50cyAqLwotY2hhcioqIGdldEFyZ1ZNKCBjaGFyKiB2bSApIAotewotCWNoYXIqKiByZXN1bHQ7Ci0KLQkvKiBVc2UgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGZvciBhIHN0YW5kYXJkIEphdmEgVk0gKi8KLQlyZXN1bHQgPSBhcmdWTV9KQVZBOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotY2hhciAqIGZpbmRWTUxpYnJhcnkoIGNoYXIqIGNvbW1hbmQgKSB7Ci0JY2hhciAqc3RhcnQsICplbmQ7Ci0JY2hhciAqdmVyc2lvbjsKLQlpbnQgbGVuZ3RoOwotCQotCS8qY2hlY2sgZmlyc3QgdG8gc2VlIGlmIGNvbW1hbmQgYWxyZWFkeSBwb2ludHMgdG8gdGhlIGxpYnJhcnkgKi8KLQlpZiAoc3RyY21wKGNvbW1hbmQsIEpBVkFfRlJBTUVXT1JLKSA9PSAwKSB7Ci0JCXJldHVybiBKQVZBX0ZSQU1FV09SSzsKLQl9Ci0JCQotCS8qIHNlbGVjdCBhIHZlcnNpb24gdG8gdXNlIGJhc2VkIG9uIHRoZSBjb21tYW5kICovCQotCXN0YXJ0ID0gc3Ryc3RyKGNvbW1hbmQsICIvVmVyc2lvbnMvIik7Ci0JaWYgKHN0YXJ0ICE9IE5VTEwpewotCQlzdGFydCArPSAxMDsKLQkJZW5kID0gc3RyY2hyKCBzdGFydCwgZGlyU2VwYXJhdG9yKTsKLQkJaWYgKGVuZCAhPSBOVUxMICYmIGVuZCA+IHN0YXJ0KSB7Ci0JCQlsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCXZlcnNpb24gPSBtYWxsb2MobGVuZ3RoICsgMSk7Ci0JCQlzdHJuY3B5KHZlcnNpb24sIHN0YXJ0LCBsZW5ndGgpOwotCQkJdmVyc2lvbltsZW5ndGhdID0gMDsKLQkJCQotCQkJLypvbmx5IHNldCBhIHZlcnNpb24gaWYgaXQgc3RhcnRzIHdpdGggYSBudW1iZXIgKi8KLQkJCWlmKHN0cnRvbCh2ZXJzaW9uLCBOVUxMLCAxMCkgIT0gMCB8fCB2ZXJzaW9uWzBdID09ICcwJykgewotCQkJCXNldGVudigiSkFWQV9KVk1fVkVSU0lPTiIsIHZlcnNpb24sIDEpOwotCQkJfQotCQkJCi0JCQlmcmVlKHZlcnNpb24pOwotCQl9IAotCX0gZWxzZSBpZiAoc3Ryc3RyKGNvbW1hbmQsICIvSmF2YVZNLmZyYW1ld29yay8iKSA9PSBOVUxMKSB7Ci0JCWNoYXIgKiBsaWIgPSBmaW5kTGliKGNvbW1hbmQpOwotCQlpZiAobGliICE9IE5VTEwpIHsKLQkJCWFkanVzdExpYnJhcnlQYXRoKGxpYik7Ci0JCQlyZXR1cm4gbGliOwotCQl9Ci0JfQotCXJldHVybiBKQVZBX0ZSQU1FV09SSzsKLX0KLQotc3RhdGljIGNoYXIgKiBmaW5kTGliKGNoYXIgKiBjb21tYW5kKSB7Ci0JaW50IGksIHE7Ci0JaW50IHBhdGhMZW5ndGg7Ci0Jc3RydWN0IHN0YXQgc3RhdHM7Ci0JY2hhciAqIHBhdGg7IC8qIHBhdGggdG8gcmVzdWx0aW5nIGp2bSBzaGFyZWQgbGlicmFyeSAqLwotCWNoYXIgKiBsb2NhdGlvbjsgLyogcG9pbnRzIHRvIGJlZ2luaW5nIG9mIGp2bUxvY2F0aW9ucyBzZWN0aW9uIG9mIHBhdGggKi8KLQotCWlmIChjb21tYW5kICE9IE5VTEwpIHsKLQkJLypjaGVjayBmaXJzdCB0byBzZWUgaWYgY29tbWFuZCBhbHJlYWR5IHBvaW50cyB0byB0aGUgbGlicmFyeSAqLwotCQlpZiAoaXNWTUxpYnJhcnkoY29tbWFuZCkpIHsKLQkJCWlmIChzdGF0KGNvbW1hbmQsICZzdGF0cykgPT0gMCAmJiAoc3RhdHMuc3RfbW9kZSAmIFNfSUZSRUcpICE9IDApIHsgLyogZm91bmQgaXQgKi8KLQkJCQlyZXR1cm4gc3RyZHVwKGNvbW1hbmQpOwotCQkJfQotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQlsb2NhdGlvbiA9IHN0cnJjaHIoY29tbWFuZCwgZGlyU2VwYXJhdG9yKSArIDE7Ci0JCXBhdGhMZW5ndGggPSBsb2NhdGlvbiAtIGNvbW1hbmQ7Ci0JCXBhdGggPSBtYWxsb2MoKHBhdGhMZW5ndGggKyBNQVhfTE9DQVRJT05fTEVOR1RIICsgMSArIE1BWF9KVk1MSUJfTEVOR1RICSsgMSkgKiBzaXplb2YoY2hhcikpOwotCQlzdHJuY3B5KHBhdGgsIGNvbW1hbmQsIHBhdGhMZW5ndGgpOwotCQlsb2NhdGlvbiA9ICZwYXRoW3BhdGhMZW5ndGhdOwotCi0JCS8qCi0JCSAqIFdlIGFyZSB0cnlpbmcgYmFzZS9qdm1Mb2NhdGlvbnNbKl0vdm1MaWJyYXJ5Ci0JCSAqIHdoZXJlIGJhc2UgaXMgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBnaXZlbiBqYXZhIGNvbW1hbmQsIG5vcm1hbGx5IGpyZS9iaW4KLQkJICovCi0JCWZvciAocSA9IDA7IGp2bUxpYnNbcV0gIT0gTlVMTDsgKytxKSB7Ci0JCQljb25zdCBjaGFyICpqdm1MaWIgPSBqdm1MaWJzW3FdOwotCQkJaSA9IC0xOwotCQkJd2hpbGUgKGp2bUxvY2F0aW9uc1srK2ldICE9IE5VTEwpIHsKLQkJCQlzcHJpbnRmKGxvY2F0aW9uLCAiJXMlYyVzIiwganZtTG9jYXRpb25zW2ldLCBkaXJTZXBhcmF0b3IsIGp2bUxpYik7Ci0JCQkJLypmcHJpbnRmKHN0ZGVyciwiY2hlY2tpbmcgcGF0aDogJXNcbiIscGF0aCk7Ki8KLQkJCQlpZiAoc3RhdChwYXRoLCAmc3RhdHMpID09IDAgJiYgKHN0YXRzLnN0X21vZGUgJiBTX0lGUkVHKSAhPSAwKSAKLQkJCQl7IC8qIGZvdW5kIGl0ICovCi0JCQkJCXJldHVybiBwYXRoOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogYWRqdXN0IHRoZSBMRF9MSUJSQVJZX1BBVEggZm9yIHRoZSB2bUxpYnJhcnkgKi8KLXN0YXRpYyB2b2lkIGFkanVzdExpYnJhcnlQYXRoKGNoYXIgKiB2bUxpYnJhcnkpIHsKLQljaGFyICogYzsKLQljaGFyICogbGRQYXRoLCAqZHlsaWJQYXRoOwotCWNoYXIgKiBuZXdQYXRoOwotCWludCBpOwotCWludCBudW1QYXRocyA9IDA7Ci0JaW50IGxlbmd0aCA9IDA7Ci0JaW50IG5lZWRBZGp1c3QgPSAwLCBuZWVkRHlsaWJBZGp1c3QgPSAwOwotCi0JY2hhciAqKiBwYXRocyA9IGdldFZNTGlicmFyeVNlYXJjaFBhdGgodm1MaWJyYXJ5KTsKLQotCWxkUGF0aCA9IChjaGFyKikgZ2V0ZW52KExJQl9QQVRIX1ZBUik7Ci0JaWYgKCFsZFBhdGgpIHsKLQkJbGRQYXRoID0gX1RfRUNMSVBTRSgiIik7Ci0JCW5lZWRBZGp1c3QgPSAxOwotCX0gZWxzZSB7Ci0JCW5lZWRBZGp1c3QgPSAhY29udGFpbnNQYXRocyhsZFBhdGgsIHBhdGhzKTsKLQl9Ci0KLQlkeWxpYlBhdGggPSAoY2hhciopIGdldGVudihEWUxEX0ZBTExCQUNLX1ZBUik7Ci0JaWYgKCFkeWxpYlBhdGgpIHsKLQkJZHlsaWJQYXRoID0gX1RfRUNMSVBTRSgiIik7Ci0JCW5lZWREeWxpYkFkanVzdCA9IDE7Ci0JfSBlbHNlIHsKLQkJbmVlZER5bGliQWRqdXN0ID0gIWNvbnRhaW5zUGF0aHMoZHlsaWJQYXRoLCBwYXRocyk7Ci0JfQotCi0JaWYgKCFuZWVkQWRqdXN0ICYmICFuZWVkRHlsaWJBZGp1c3QpIHsKLQkJZm9yIChpID0gMDsgcGF0aHNbaV0gIT0gTlVMTDsgaSsrKQotCQkJZnJlZShwYXRoc1tpXSk7Ci0JCWZyZWUocGF0aHMpOwotCQlyZXR1cm47Ci0JfQotCi0JYyA9IGNvbmNhdFN0cmluZ3MocGF0aHMpOwotCQotCS8qIHNldCB0aGUgdmFsdWUgZm9yIExEX0xJQlJBUllfUEFUSCAqLwotCWxlbmd0aCA9IHN0cmxlbihsZFBhdGgpOwotCW5ld1BhdGggPSBtYWxsb2MoKF90Y3NsZW4oYykgKyBsZW5ndGggKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLQlfc3RwcmludGYobmV3UGF0aCwgX1RfRUNMSVBTRSgiJXMlcyIpLCBjLCBsZFBhdGgpOwotCXNldGVudihMSUJfUEFUSF9WQVIsIG5ld1BhdGgsIDEpOwotCWZyZWUobmV3UGF0aCk7Ci0JCi0JLyogc2V0IHRoZSB2YWx1ZSBmb3IgRFlMRF9GQUxMQkFDS19MSUJSQVJZX1BBVEggKi8KLQlsZW5ndGggPSBzdHJsZW4oZHlsaWJQYXRoKTsKLQluZXdQYXRoID0gIG1hbGxvYygoX3Rjc2xlbihjKSArIGxlbmd0aCArIDEpICogc2l6ZW9mKF9UQ0hBUikpOwotCV9zdHByaW50ZihuZXdQYXRoLCBfVF9FQ0xJUFNFKCIlcyVzIiksIGMsIGR5bGliUGF0aCk7Ci0Jc2V0ZW52KERZTERfRkFMTEJBQ0tfVkFSLCBuZXdQYXRoLCAxKTsKLQlmcmVlKG5ld1BhdGgpOwotCWZyZWUoYyk7Ci0JCi0JZm9yIChpID0gMDsgaSA8IG51bVBhdGhzOyBpKyspCi0JCWZyZWUocGF0aHNbaV0pOwotCWZyZWUocGF0aHMpOwotCi0JLyogbm93IHdlIG11c3QgcmVzdGFydCBmb3IgdGhpcyB0byB0YWtlIGFmZmVjdCovCi0JcmVzdGFydExhdW5jaGVyKGluaXRpYWxBcmd2WzBdLCBpbml0aWFsQXJndik7Ci19Ci0KLXZvaWQgcmVzdGFydExhdW5jaGVyKGNoYXIqIHByb2dyYW0sIGNoYXIqIGFyZ3NbXSkgewotCXBpZF90IHBpZD0gZm9yaygpOwotCWlmIChwaWQgPT0gMCkgewotCQkvKiBDaGlsZCBwcm9jZXNzIC4uLiBzdGFydCB0aGUgSlZNICovCi0JCWV4ZWN2KHByb2dyYW0gIT0gTlVMTCA/IHByb2dyYW0gOiBhcmdzWzBdLCBhcmdzKTsKLQotCQkvKiBUaGUgSlZNIHdvdWxkIG5vdCBzdGFydCAuLi4gcmV0dXJuIGVycm9yIGNvZGUgdG8gcGFyZW50IHByb2Nlc3MuICovCi0JCV9leGl0KGVycm5vKTsKLQl9IGVsc2UgewotCQlleGl0KDApOwotCX0KLX0KLQotSmF2YVJlc3VsdHMqIGxhdW5jaEphdmFWTSggX1RDSEFSKiBhcmdzW10gKQotewotCS8qZm9yIG5vdyBhbHdheXMgZG8gSk5JIG9uIE1hYywgc2hvdWxkIG5vdCBjb21lIGluIGhlcmUgKi8KLQlKYXZhUmVzdWx0cyAqIHJlc3VsdHMgPSBtYWxsb2Moc2l6ZW9mKEphdmFSZXN1bHRzKSk7Ci0JcmVzdWx0cy0+bGF1bmNoUmVzdWx0ID0gLTE7Ci0JcmVzdWx0cy0+cnVuUmVzdWx0ID0gMDsKLQlyZXN1bHRzLT5lcnJvck1lc3NhZ2UgPSBfdGNzZHVwKG5vRm9ya2luZ01zZyk7Ci0JcmV0dXJuIHJlc3VsdHM7Ci19Ci0KLUphdmFSZXN1bHRzKiBzdGFydEphdmFWTSggX1RDSEFSKiBsaWJQYXRoLCBfVENIQVIqIHZtQXJnc1tdLCBfVENIQVIqIHByb2dBcmdzW10sIF9UQ0hBUiogamFyRmlsZSApCi17Ci0JaWYgKHNlY29uZFRocmVhZCA9PSAwKSB7Ci0JCS8qIFNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IHRlbGxzIHRoZSBBV1QgKGlmIHN0YXJ0ZWQpIHdlIHN0YXJ0ZWQgdGhlIEpWTSBvbiB0aGUgbWFpbiB0aHJlYWQuICovCi0JCWNoYXIgZmlyc3RUaHJlYWRFbnZWYXJpYWJsZVs4MF07Ci0JCXNwcmludGYoZmlyc3RUaHJlYWRFbnZWYXJpYWJsZSwgIkpBVkFfU1RBUlRFRF9PTl9GSVJTVF9USFJFQURfJWQiLCBnZXRwaWQoKSk7Ci0JCXNldGVudihmaXJzdFRocmVhZEVudlZhcmlhYmxlLCAiMSIsIDEpOwotCQlyZXR1cm4gc3RhcnRKYXZhSk5JKGxpYlBhdGgsIHZtQXJncywgcHJvZ0FyZ3MsIGphckZpbGUpOwotCX0KLQotCS8qIGVsc2UsIC0tbGF1bmNoZXIuc2Vjb25kVGhyZWFkIHdhcyBzcGVjaWZpZWQsIGNyZWF0ZSBhIG5ldyB0aHJlYWQgYW5kIHJ1biB0aGUgCi0JICogdm0gb24gaXQuICBUaGlzIG1haW4gdGhyZWFkIHdpbGwgcnVuIHRoZSBDRlJ1bkxvb3AgCi0JICovCi0JcHRocmVhZF90IHRocmVhZDsKLQlzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0gezAsIDB9OwotCWludCBzdGFja1NpemUgPSAwOwotCWlmIChnZXRybGltaXQoUkxJTUlUX1NUQUNLLCAmbGltaXQpID09IDApIHsKLQkJaWYgKGxpbWl0LnJsaW1fY3VyICE9IDApIHsKLQkJCXN0YWNrU2l6ZSA9IGxpbWl0LnJsaW1fY3VyOwotCQl9Ci0JfQotCQotCS8qIGluaXRpYWxpemUgdGhyZWFkIGF0dHJpYnV0ZXMgKi8KLQlwdGhyZWFkX2F0dHJfdCBhdHRyaWJ1dGVzOwotCXB0aHJlYWRfYXR0cl9pbml0KCZhdHRyaWJ1dGVzKTsKLQlwdGhyZWFkX2F0dHJfc2V0c2NvcGUoJmF0dHJpYnV0ZXMsIFBUSFJFQURfU0NPUEVfU1lTVEVNKTsKLQlwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHJpYnV0ZXMsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKLQlpZiAoc3RhY2tTaXplICE9IDApCi0JCXB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJpYnV0ZXMsIHN0YWNrU2l6ZSk7Ci0JCi0JLyogYXJndW1lbnRzIHRvIHN0YXJ0IHRoZSB2bSAqLwotCVN0YXJ0Vk1BcmdzIGFyZ3M7Ci0JYXJncy5saWJQYXRoID0gbGliUGF0aDsKLQlhcmdzLnZtQXJncyA9IHZtQXJnczsKLQlhcmdzLnByb2dBcmdzID0gcHJvZ0FyZ3M7Ci0JYXJncy5qYXJGaWxlID0gamFyRmlsZTsKLQlhcmdzLnJlc3VsdCA9IDA7Ci0JCi0JbG9vcFJlZiA9IENGUnVuTG9vcEdldEN1cnJlbnQoKTsKLQkKLQkvKiBjcmVhdGUgdGhlIHRocmVhZCAqLwotCXB0aHJlYWRfY3JlYXRlKCAmdGhyZWFkLCAmYXR0cmlidXRlcywgJnN0YXJ0VGhyZWFkLCAmYXJncyk7Ci0JcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHJpYnV0ZXMpOwotCQkKLQlydW5FdmVudExvb3AobG9vcFJlZik7Ci0JCi0JcmV0dXJuIGFyZ3MucmVzdWx0OwotfQotCi12b2lkICogc3RhcnRUaHJlYWQodm9pZCAqIGluaXQpIHsKLQlTdGFydFZNQXJncyAqYXJncyA9IChTdGFydFZNQXJncyAqKSBpbml0OwotCWFyZ3MtPnJlc3VsdCA9IHN0YXJ0SmF2YUpOSShhcmdzLT5saWJQYXRoLCBhcmdzLT52bUFyZ3MsIGFyZ3MtPnByb2dBcmdzLCBhcmdzLT5qYXJGaWxlKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBydW5FdmVudExvb3AoQ0ZSdW5Mb29wUmVmIHJlZikgewotCUNGUnVuTG9vcFNvdXJjZUNvbnRleHQgc291cmNlQ29udGV4dCA9IHsgLnZlcnNpb24gPSAwLCAuaW5mbyA9IE5VTEwsIC5yZXRhaW4gPSBOVUxMLCAucmVsZWFzZSA9IE5VTEwsCi0JCQkJCQkJCQkJCSAuY29weURlc2NyaXB0aW9uID0gTlVMTCwgLmVxdWFsID0gTlVMTCwgLmhhc2ggPSBOVUxMLCAKLQkJCQkJCQkJCQkJIC5zY2hlZHVsZSA9IE5VTEwsIC5jYW5jZWwgPSBOVUxMLCAucGVyZm9ybSA9ICZkdW1teUNhbGxiYWNrIH07Ci0JCi0JQ0ZSdW5Mb29wU291cmNlUmVmIHNvdXJjZVJlZiA9IENGUnVuTG9vcFNvdXJjZUNyZWF0ZShOVUxMLCAwLCAmc291cmNlQ29udGV4dCk7Ci0JQ0ZSdW5Mb29wQWRkU291cmNlKHJlZiwgc291cmNlUmVmLCAga0NGUnVuTG9vcENvbW1vbk1vZGVzKTsKLQkKLQlDRlJ1bkxvb3BSdW4oKTsKLQlDRlJlbGVhc2Uoc291cmNlUmVmKTsKLX0KLQotI2lmbmRlZiBDT0NPQQotdm9pZCBkaXNwb3NlRGF0YSh2b2lkICppbmZvLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgCi17Ci0JRGlzcG9zZVB0cihkYXRhKTsKLX0KLQotLyoqCi0gKiBsb2FkQk1QSW1hZ2UKLSAqIENyZWF0ZSBhIFF1aWNrRHJhdyBQaXhNYXAgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBCTVAgZmlsZS4KLSAqCi0gKiBibXBQYXRobmFtZTogYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSB0byB0aGUgYm1wIGZpbGUKLSAqCi0gKiByZXR1cm5lZCB2YWx1ZTogdGhlIFBpeE1hcEhhbmRsZSBuZXdseSBjcmVhdGVkIGlmIHN1Y2Nlc3NmdWwuIDAgb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgQ0dJbWFnZVJlZiBsb2FkQk1QSW1hZ2UgKGNvbnN0IGNoYXIgKmJtcFBhdGhuYW1lKSB7IAotCW5nX3N0cmVhbV90IGluOwotCW5nX2JpdG1hcF9pbWFnZV90IGltYWdlOwotCW5nX2Vycl90IGVycj0gRVJSX09LOwotCUNHSW1hZ2VSZWYgcmVmOwotCVVCWVRFMSogZGF0YSA9IE5VTEw7Ci0KLQlOZ0luaXQoKTsKLQotCWlmIChOZ1N0cmVhbUluaXQoJmluLCAoY2hhciopIGJtcFBhdGhuYW1lKSAhPSBFUlJfT0spIHsKLQkJTmdFcnJvcihFUlJfTkcsICJFcnJvciBjYW4ndCBvcGVuIEJNUCBmaWxlIik7Ci0JCXJldHVybiAwOwotCX0KLQotCU5nQml0bWFwSW1hZ2VJbml0KCZpbWFnZSk7Ci0JZXJyPSBOZ0JtcERlY29kZXJSZWFkSW1hZ2UgKCZpbiwgJmltYWdlKTsKLQlOZ1N0cmVhbUNsb3NlKCZpbik7Ci0KLQlpZiAoZXJyICE9IEVSUl9PSykgewotCQlOZ0JpdG1hcEltYWdlRnJlZSgmaW1hZ2UpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlVQllURTQgc3JjRGVwdGg9IE5nQml0bWFwSW1hZ2VCaXRDb3VudCgmaW1hZ2UpOwotCWlmIChzcmNEZXB0aCAhPSAyNCkgewkvKiBXZSBvbmx5IHN1cHBvcnQgaW1hZ2UgZGVwdGggb2YgMjQgYml0cyAqLwotCQlOZ0JpdG1hcEltYWdlRnJlZSgmaW1hZ2UpOwotCQlOZ0Vycm9yIChFUlJfTkcsICJFcnJvciB1bnN1cHBvcnRlZCBkZXB0aCAtIG9ubHkgc3VwcG9ydCAyNCBiaXQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCWludCB3aWR0aD0gKGludClOZ0JpdG1hcEltYWdlV2lkdGgoJmltYWdlKTsKLQlpbnQgaGVpZ2h0PSAoaW50KU5nQml0bWFwSW1hZ2VIZWlnaHQoJmltYWdlKTsKLQlpbnQgcm93Qnl0ZXM9IHdpZHRoICogNDsKLQlpbnQgYWxwaGFpbmZvID0ga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QgfCAoTmdJc01TQigpID8gMCA6IGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlKTsKLQlkYXRhID0gKFVCWVRFMSopTmV3UHRyKHJvd0J5dGVzICogaGVpZ2h0KTsKLQlDR0RhdGFQcm92aWRlclJlZiBwcm92aWRlciA9IENHRGF0YVByb3ZpZGVyQ3JlYXRlV2l0aERhdGEoMCwgZGF0YSwgcm93Qnl0ZXMgKiBoZWlnaHQsIChDR0RhdGFQcm92aWRlclJlbGVhc2VEYXRhQ2FsbGJhY2spZGlzcG9zZURhdGEpOwotCQotCXJlZiA9IENHSW1hZ2VDcmVhdGUod2lkdGgsIGhlaWdodCwgOCwgMzIsIHdpZHRoICogNCwgQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCksIGFscGhhaW5mbywgcHJvdmlkZXIsIE5VTEwsIDEsIDApOwotCUNHRGF0YVByb3ZpZGVyUmVsZWFzZShwcm92aWRlcik7Ci0KLQkvKiAyNCBiaXQgc291cmNlIHRvIGRpcmVjdCBzY3JlZW4gZGVzdGluYXRpb24gKi8KLQlOZ0JpdG1hcEltYWdlQmxpdERpcmVjdFRvRGlyZWN0KE5nQml0bWFwSW1hZ2VJbWFnZURhdGEoJmltYWdlKSwgTmdCaXRtYXBJbWFnZUJ5dGVzUGVyUm93KCZpbWFnZSksIHdpZHRoLCBoZWlnaHQsCi0JCWRhdGEsIDMyLCByb3dCeXRlcywgTmdJc01TQigpLCAweGZmMDAwMCwgMHgwMGZmMDAsIDB4MDAwMGZmKTsKLQotCU5nQml0bWFwSW1hZ2VGcmVlKCZpbWFnZSk7Ci0KLQlyZXR1cm4gcmVmOwotfQotI2VuZGlmCi0KLSNkZWZpbmUgRE9DS19JQ09OX1BSRUZJWCAiLVhkb2NrOmljb249IgotI2RlZmluZSBET0NLX05BTUVfUFJFRklYICItWGRvY2s6bmFtZT0iCi0jZGVmaW5lIEFQUF9JQ09OX1BBVFRFUk4gIkFQUF9JQ09OXyVkIgotI2RlZmluZSBBUFBfTkFNRV9QQVRURVJOICJBUFBfTkFNRV8lZCIKLQotdm9pZCBwcm9jZXNzVk1BcmdzKGNoYXIgKip2bWFyZ3NbXSApCi17Ci0JaW50IGkgPSAtMTsKLQlpbnQgcGlkID0gMCwgcGlkTGVuZ3RoID0gMSwgdGVtcCA9IDA7Ci0JY2hhciAqIG5hbWUgPSBOVUxMLCAqaWNvbiA9IE5VTEw7Ci0JY2hhciAqIGM7Ci0JCi0JaWYoICp2bWFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuOwotCQotCXdoaWxlKCAoKnZtYXJncylbKytpXSAhPSBOVUxMICkgewotCQkvKi1YZG9jazppY29uIC0+IEFQUF9JQ09OXzxwaWQ+Ki8KLQkJaWYoX3Rjc25jbXAoKCp2bWFyZ3MpW2ldLCBET0NLX0lDT05fUFJFRklYLCBfdGNzbGVuKERPQ0tfSUNPTl9QUkVGSVgpKSA9PSAwKSB7Ci0JCQlpY29uID0gKCp2bWFyZ3MpW2ldICsgX3Rjc2xlbihET0NLX0lDT05fUFJFRklYKTsKLQkJfSAKLQkJLyotWGRvY2s6bmFtZSAtPiBBUFBfTkFNRV88cGlkPiovCi0JCWVsc2UgaWYoX3Rjc25jbXAoKCp2bWFyZ3MpW2ldLCBET0NLX05BTUVfUFJFRklYLCBfdGNzbGVuKERPQ0tfTkFNRV9QUkVGSVgpKSA9PSAwKSB7Ci0JCQluYW1lID0gKCp2bWFyZ3MpW2ldICsgX3Rjc2xlbihET0NLX05BTUVfUFJFRklYKTsKLQkJfQotCQlpZiAobmFtZSAhPSBOVUxMICYmIGljb24gIT0gTlVMTCkgCi0JCQlicmVhazsKLQl9Ci0JCi0JaWYgKG5hbWUgPT0gTlVMTCAmJiBpY29uID09IE5VTEwpCi0JCXJldHVybjsJLyogZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLwotCQotCXRlbXAgPSBwaWQgPSBnZXRwaWQoKTsKLQkvKiBob3cgbWFueSBkaWdpdHMgaW4gcGlkPyAqLwotCXdoaWxlICh0ZW1wID4gOSkgewotCQlwaWRMZW5ndGgrKzsKLQkJdGVtcCAvPSAxMDsKLQl9Ci0JCi0JaWYgKG5hbWUgIT0gTlVMTCkgewotCQljID0gbWFsbG9jKCAoX3Rjc2xlbihBUFBfTkFNRV9QQVRURVJOKSArIHBpZExlbmd0aCArIDEpICogc2l6ZW9mKGNoYXIqKSk7Ci0JCV9zdHByaW50ZiggYywgQVBQX05BTUVfUEFUVEVSTiwgcGlkICk7Ci0JCXNldGVudihjLCBuYW1lLCAxKTsKLQl9Ci0JCi0JaWYgKGljb24gIT0gTlVMTCkgewotCQljID0gbWFsbG9jKCAoX3Rjc2xlbihpY29uKSArIF90Y3NsZW4oQVBQX0lDT05fUEFUVEVSTikgKyBwaWRMZW5ndGggKyAxKSAqIHNpemVvZihjaGFyKikpOwotCQlfc3RwcmludGYoIGMsIEFQUF9JQ09OX1BBVFRFUk4sIHBpZCApOwotCQlzZXRlbnYoYywgaWNvbiwgMSk7Ci0JfQotfQotCi1pbnQgaXNTdW5WTSggX1RDSEFSICogamF2YVZNLCBfVENIQVIgKiBqbmlMaWIgKSB7Ci0JX1RDSEFSICp2bSA9IChqbmlMaWIgIT0gTlVMTCkgPyBqbmlMaWIgOiBqYXZhVk07Ci0JcmV0dXJuIChzdHJuY21wKHZtLCBKQVZBX0ZSQU1FV09SSywgc3RybGVuKEpBVkFfRlJBTUVXT1JLKSkgPT0gMCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9lY2xpcHNlQ2FyYm9uQ29tbW9uLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9lY2xpcHNlQ2FyYm9uQ29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZTk3MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9jYXJib24vZWNsaXBzZUNhcmJvbkNvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEFuZHJldyBOaWVmZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2luY2x1ZGUgImVjbGlwc2VDb21tb24uaCIKLSNpbmNsdWRlICJlY2xpcHNlT1MuaCIKLQotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2lmZGVmIENPQ09BCi0jaW5jbHVkZSA8Q29jb2EvQ29jb2EuaD4KLSNlbHNlCi0jaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bWFjaC1vL2R5bGQuaD4KLQotY2hhciAgIGRpclNlcGFyYXRvciAgPSAnLyc7Ci1jaGFyICAgcGF0aFNlcGFyYXRvciA9ICc6JzsKLQotc3RhdGljIENGQnVuZGxlUmVmIGphdmFWTUJ1bmRsZSA9IE5VTEw7Ci0KLWludCBpbml0aWFsaXplZCA9IDA7Ci0KLXN0YXRpYyB2b2lkIGluaXQoKSB7Ci0JaWYgKCFpbml0aWFsaXplZCkgewotCQlQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKLQkJaWYgKEdldEN1cnJlbnRQcm9jZXNzKCZwc24pID09IG5vRXJyKSB7Ci0JCQlUcmFuc2Zvcm1Qcm9jZXNzVHlwZSgmcHNuLCBrUHJvY2Vzc1RyYW5zZm9ybVRvRm9yZWdyb3VuZEFwcGxpY2F0aW9uKTsKLQkJCVNldEZyb250UHJvY2VzcygmcHNuKTsKLQkJfQotI2lmZGVmIENPQ09BCi0JCVtOU0FwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKLSNlbHNlCi0JCUNsZWFyTWVudUJhcigpOwotI2VuZGlmCi0JCWluaXRpYWxpemVkPSB0cnVlOwotCX0KLX0KLQotCi0vKiBJbml0aWFsaXplIFdpbmRvdyBTeXN0ZW0KLSAqCi0gKiBJbml0aWFsaXplIENhcmJvbi4KLSAqLwotaW50IGluaXRXaW5kb3dTeXN0ZW0oIGludCogcEFyZ2MsIGNoYXIqIGFyZ3ZbXSwgaW50IHNob3dTcGxhc2ggKQotewotCWNoYXIgKmhvbWVEaXIgPSBnZXRQcm9ncmFtRGlyKCk7Ci0JLypkZWJ1ZygiaW5zdGFsbCBkaXI6ICVzXG4iLCBob21lRGlyKTsqLwotCWlmIChob21lRGlyICE9IE5VTEwpCi0JCWNoZGlyKGhvbWVEaXIpOwotICAgIAotCWlmIChzaG93U3BsYXNoKQotCQlpbml0KCk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIERpc3BsYXkgYSBNZXNzYWdlICovCi12b2lkIGRpc3BsYXlNZXNzYWdlKGNoYXIgKnRpdGxlLCBjaGFyICptZXNzYWdlKQotewotCUNGU3RyaW5nUmVmIGluRXJyb3IsIGluRGVzY3JpcHRpb249IE5VTEw7Ci0KLQkvKiB0cnkgdG8gYnJlYWsgdGhlIG1lc3NhZ2UgaW50byBhIGZpcnN0IHNlbnRlbmNlIGFuZCB0aGUgcmVzdCAqLwotCWNoYXIgKnBvcz0gc3Ryc3RyKG1lc3NhZ2UsICIuICIpOwotCWlmIChwb3MgIT0gTlVMTCkgewkKLQkJY2hhciAqdG8sICpmcm9tLCAqYnVmZmVyPSBjYWxsb2MocG9zLW1lc3NhZ2UrMiwgc2l6ZW9mKGNoYXIpKTsKLQkJLyogY29weSBhbmQgcmVwbGFjZSBsaW5lIHNlcGFyYXRvcnMgd2l0aCBibGFua3MgKi8KLQkJZm9yICh0bz0gYnVmZmVyLCBmcm9tPSBtZXNzYWdlOyBmcm9tIDw9IHBvczsgZnJvbSsrLCB0bysrKSB7Ci0JCQljaGFyIGM9ICpmcm9tOwotCQkJaWYgKGMgPT0gJ1xuJykgYz0gJyAnOwotCQkJKnRvPSBjOwotCQl9Ci0JCWluRXJyb3I9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoa0NGQWxsb2NhdG9yRGVmYXVsdCwgYnVmZmVyLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotCQlmcmVlKGJ1ZmZlcik7Ci0JCWluRGVzY3JpcHRpb249IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoa0NGQWxsb2NhdG9yRGVmYXVsdCwgcG9zKzIsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7Ci0JfSBlbHNlIHsKLQkJaW5FcnJvcj0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyhrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBtZXNzYWdlLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotCX0KLQkKLQlpbml0KCk7Ci0JCi0jaWZkZWYgQ09DT0EKLQlOU0F1dG9yZWxlYXNlUG9vbCogcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOwotCU5TQWxlcnQqIGFsZXJ0ID0gW05TQWxlcnQgYWxlcnRXaXRoTWVzc2FnZVRleHQ6IChOU1N0cmluZyopKGluRGVzY3JpcHRpb24gIT0gbmlsID8gaW5FcnJvciA6IG5pbCkgZGVmYXVsdEJ1dHRvbjogbmlsIGFsdGVybmF0ZUJ1dHRvbjogbmlsIG90aGVyQnV0dG9uOiBuaWwgaW5mb3JtYXRpdmVUZXh0V2l0aEZvcm1hdDogKE5TU3RyaW5nKikoaW5EZXNjcmlwdGlvbiAhPSBuaWwgPyBpbkRlc2NyaXB0aW9uIDogaW5FcnJvcildOwotCVtbYWxlcnQgd2luZG93XSBzZXRUaXRsZTogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOiB0aXRsZV1dOwotCVthbGVydCBzZXRBbGVydFN0eWxlOiBOU0NyaXRpY2FsQWxlcnRTdHlsZV07Ci0JW2FsZXJ0IHJ1bk1vZGFsXTsKLQlbcG9vbCByZWxlYXNlXTsKLSNlbHNlCi0JRGlhbG9nUmVmIG91dEFsZXJ0OwotCU9TU3RhdHVzIHN0YXR1cz0gQ3JlYXRlU3RhbmRhcmRBbGVydChrQWxlcnRTdG9wQWxlcnQsIGluRXJyb3IsIGluRGVzY3JpcHRpb24sIE5VTEwsICZvdXRBbGVydCk7Ci0JaWYgKHN0YXR1cyA9PSBub0VycikgewotCQlEaWFsb2dJdGVtSW5kZXggb3V0SXRlbUhpdDsKLQkJUnVuU3RhbmRhcmRBbGVydChvdXRBbGVydCwgTlVMTCwgJm91dEl0ZW1IaXQpOwotCX0gZWxzZSB7Ci0JCS8qZGVidWcoIiVzOiBkaXNwbGF5TWVzc2FnZTogJXNcbiIsIHRpdGxlLCBtZXNzYWdlKTsqLwotCX0KLSNlbmRpZgotCUNGUmVsZWFzZShpbkVycm9yKTsKLQlpZiAoaW5EZXNjcmlwdGlvbiAhPSBOVUxMKQotCQlDRlJlbGVhc2UoaW5EZXNjcmlwdGlvbik7Ci19Ci0KLS8qIExvYWQgdGhlIHNwZWNpZmllZCBzaGFyZWQgbGlicmFyeQotICovCi12b2lkICogbG9hZExpYnJhcnkoIGNoYXIgKiBsaWJyYXJ5ICl7Ci0JaWYgKHN0cmNtcChsaWJyYXJ5LCBKQVZBX0ZSQU1FV09SSykgPT0gMCkgewotCQlDRlVSTFJlZiB1cmwgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oa0NGQWxsb2NhdG9yRGVmYXVsdCwgKGNvbnN0IFVJbnQ4ICopSkFWQV9GUkFNRVdPUkssIHN0cmxlbihKQVZBX0ZSQU1FV09SSyksIHRydWUpOwotCQlqYXZhVk1CdW5kbGUgPSBDRkJ1bmRsZUNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCB1cmwpOwotCQlDRlJlbGVhc2UodXJsKTsKLQkJcmV0dXJuICh2b2lkKikgJmphdmFWTUJ1bmRsZTsKLQl9IGVsc2UgewotCQl2b2lkICogcmVzdWx0PSBkbG9wZW4obGlicmFyeSwgUlRMRF9OT1cpOwotCQlpZihyZXN1bHQgPT0gMCkgCi0JCQlwcmludGYoIiVzXG4iLGRsZXJyb3IoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQotCi0vKiBVbmxvYWQgdGhlIHNoYXJlZCBsaWJyYXJ5Ci0gKi8KLXZvaWQgdW5sb2FkTGlicmFyeSggdm9pZCAqIGhhbmRsZSApewotCWlmIChoYW5kbGUgPT0gJmphdmFWTUJ1bmRsZSkKLQkJQ0ZSZWxlYXNlKGphdmFWTUJ1bmRsZSk7Ci0JZWxzZQotCQlkbGNsb3NlKGhhbmRsZSk7Ci19Ci0gCi0vKiBGaW5kIHRoZSBnaXZlbiBzeW1ib2wgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5Ci0gKi8KLXZvaWQgKiBmaW5kU3ltYm9sKCB2b2lkICogaGFuZGxlLCBjaGFyICogc3ltYm9sICl7Ci0JaWYoaGFuZGxlID09ICZqYXZhVk1CdW5kbGUpIHsKLQkJQ0ZTdHJpbmdSZWYgc3RyaW5nID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyhrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBzeW1ib2wsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkpOwotCQl2b2lkICogcHRyID0gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lKGphdmFWTUJ1bmRsZSwgc3RyaW5nKTsKLQkJQ0ZSZWxlYXNlKHN0cmluZyk7Ci0JCXJldHVybiBwdHI7Ci0JfSBlbHNlCi0JCXJldHVybiBkbHN5bShoYW5kbGUsIHN5bWJvbCk7Ci19Ci0KLWNoYXIgKiByZXNvbHZlU3ltbGlua3MoIGNoYXIgKiBwYXRoICkgewotCWNoYXIgKiByZXN1bHQgPSAwOwotCUNGVVJMUmVmIHVybCwgcmVzb2x2ZWQ7Ci0JQ0ZTdHJpbmdSZWYgc3RyaW5nOwotCUZTUmVmIGZzUmVmOwotCUJvb2xlYW4gaXNGb2xkZXIsIHdhc0FsaWFzZWQ7Ci0JCi0JaWYocGF0aCA9PSBOVUxMKQotCQlyZXR1cm4gcGF0aDsKLQkJCi0Jc3RyaW5nID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyhrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBwYXRoLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotCXVybCA9IENGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoKGtDRkFsbG9jYXRvckRlZmF1bHQsIHN0cmluZywga0NGVVJMUE9TSVhQYXRoU3R5bGUsIGZhbHNlKTsKLQlDRlJlbGVhc2Uoc3RyaW5nKTsKLQlpZih1cmwgPT0gTlVMTCkKLQkJcmV0dXJuIHBhdGg7Ci0JCi0JaWYoQ0ZVUkxHZXRGU1JlZih1cmwsICZmc1JlZikpIHsKLQkJaWYoIEZTUmVzb2x2ZUFsaWFzRmlsZSgmZnNSZWYsIHRydWUsICZpc0ZvbGRlciwgJndhc0FsaWFzZWQpID09IG5vRXJyKSB7Ci0JCQlyZXNvbHZlZCA9IENGVVJMQ3JlYXRlRnJvbUZTUmVmKGtDRkFsbG9jYXRvckRlZmF1bHQsICZmc1JlZik7Ci0JCQlpZihyZXNvbHZlZCAhPSBOVUxMKSB7Ci0JCQkJc3RyaW5nID0gQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgocmVzb2x2ZWQsIGtDRlVSTFBPU0lYUGF0aFN0eWxlKTsKLQkJCQlDRkluZGV4IGxlbmd0aCA9IENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyhDRlN0cmluZ0dldExlbmd0aChzdHJpbmcpLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotCQkJCWNoYXIgKnMgPSBtYWxsb2MobGVuZ3RoKTsKLQkJCQlpZiAoQ0ZTdHJpbmdHZXRDU3RyaW5nKHN0cmluZywgcywgbGVuZ3RoLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpKSB7Ci0JCQkJCXJlc3VsdCA9IHM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZnJlZShzKTsKLQkJCQl9Ci0JCQkJQ0ZSZWxlYXNlKHN0cmluZyk7Ci0JCQkJQ0ZSZWxlYXNlKHJlc29sdmVkKTsKLQkJCX0KLQkJfQotCX0JCi0JQ0ZSZWxlYXNlKHVybCk7IAotCXJldHVybiByZXN1bHQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9jYXJib24vZWNsaXBzZUNhcmJvbk1haW4uYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvY2FyYm9uL2VjbGlwc2VDYXJib25NYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjYyZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9jYXJib24vZWNsaXBzZUNhcmJvbk1haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoJICBBbmRyZXcgTmllZmVyCi0gKi8KLQotI2luY2x1ZGUgImVjbGlwc2VDb21tb24uaCIKLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgotI2luY2x1ZGUgPG1hY2gtby9keWxkLmg+Ci0KLQotI2RlZmluZSBBUFBfUEFDS0FHRV9QQVRURVJOICIuYXBwL0NvbnRlbnRzL01hY09TLyIKLSNkZWZpbmUgQVBQX1BBQ0tBR0UgIkFQUF9QQUNLQUdFIgotI2RlZmluZSBKQVZBUk9PVCAiSkFWQVJPT1QiCi0KLXN0YXRpYyB2b2lkIGRlYnVnKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLXN0YXRpYyB2b2lkIGR1bXBBcmdzKGNoYXIgKnRhZywgaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSk7Ci1zdGF0aWMgY2hhciAqYXBwZW5kKGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqcyk7Ci1zdGF0aWMgY2hhciAqYXBwZW5kYyhjaGFyICpidWZmZXIsIGNoYXIgYyk7Ci1zdGF0aWMgY2hhciAqZXhwYW5kU2hlbGwoY2hhciAqYXJnLCBjb25zdCBjaGFyICphcHBQYWNrYWdlLCBjb25zdCBjaGFyICpqYXZhUm9vdCk7Ci1zdGF0aWMgY2hhciAqbXlfc3RyY2FzZXN0cihjb25zdCBjaGFyICpiaWcsIGNvbnN0IGNoYXIgKmxpdHRsZSk7Ci0KLXN0YXRpYyBGSUxFICpmZ0NvbnNvbGVMb2c7Ci1zdGF0aWMgY2hhciAqZmdBcHBQYWNrYWdlUGF0aDsKLXN0YXRpYyBpbnQgZmdQaWQ7Ci0KLWV4dGVybiBpbnQgb3JpZ2luYWxfbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKTsKLWludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgewotCi0JU0ludDMyIHN5c3RlbVZlcnNpb249IDA7Ci0JaWYgKEdlc3RhbHQoZ2VzdGFsdFN5c3RlbVZlcnNpb24sICZzeXN0ZW1WZXJzaW9uKSA9PSBub0VycikgewotCQlzeXN0ZW1WZXJzaW9uICY9IDB4ZmZmZjsKLSNpZmRlZiBDT0NPQQotCQlpZiAoc3lzdGVtVmVyc2lvbiA8IDB4MTA1MCkgewotCQkJZGlzcGxheU1lc3NhZ2UoIkVycm9yIiwgIlRoaXMgYXBwbGljYXRpb24gcmVxdWlyZXMgTWFjIE9TIFggMTAuNSAoTGVvcGFyZCkgb3IgZ3JlYXRlci4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0jZWxzZQotCQlpZiAoc3lzdGVtVmVyc2lvbiA8IDB4MTAyMCkgewotCQkJZGlzcGxheU1lc3NhZ2UoIkVycm9yIiwgIlRoaXMgYXBwbGljYXRpb24gcmVxdWlyZXMgSmFndWFyIChNYWMgT1MgWCA+PSAxMC4yKSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLSNlbmRpZgotCX0KLQotCWZnQ29uc29sZUxvZz0gZm9wZW4oIi9kZXYvY29uc29sZSIsICJ3Iik7Ci0JZmdQaWQ9IGdldHBpZCgpOwotCi0JZHVtcEFyZ3MoInN0YXJ0IiwgYXJnYywgYXJndik7Ci0JaWYgKCAoYXJnYyA+IDEgJiYgc3RybmNtcChhcmd2WzFdLCAiLXBzbl8iLCA1KSA9PSAwKSB8fCBhcmdjID09IDEpIHsKLQkJLyogZmluZCBwYXRoIHRvIGFwcGxpY2F0aW9uIGJ1bmRsZSAoaWdub3JpbmcgY2FzZSkgKi8KLQkJY2hhciAqcG9zPSBteV9zdHJjYXNlc3RyKGFyZ3ZbMF0sIEFQUF9QQUNLQUdFX1BBVFRFUk4pOwotCQlpZiAocG9zICE9IE5VTEwpIHsKLQkJCWludCBsPSBwb3MtYXJndlswXSArIDQ7CS8vIHJlc2VydmUgc3BhY2UgZm9yICIuYXBwIgotCQkJZmdBcHBQYWNrYWdlUGF0aD0gbWFsbG9jKGwrMSk7Ci0JCQlzdHJuY3B5KGZnQXBwUGFja2FnZVBhdGgsIGFyZ3ZbMF0sIGwpOwotCQkJZmdBcHBQYWNrYWdlUGF0aFtsXT0gJ1wwJzsJLy8gdGVybWluYXRlIHJlc3VsdAotCQl9Ci0JCQotCQkvKiBHZXQgdGhlIG1haW4gYnVuZGxlIGZvciB0aGUgYXBwICovCi0JCUNGQnVuZGxlUmVmIG1haW5CdW5kbGU9IENGQnVuZGxlR2V0TWFpbkJ1bmRsZSgpOwotCQlpZiAobWFpbkJ1bmRsZSAhPSBOVUxMKSB7Ci0JCQotCQkJLyogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSBpbmZvIHBsaXN0LiovCi0JCQlDRkRpY3Rpb25hcnlSZWYgYnVuZGxlSW5mb0RpY3Q9IENGQnVuZGxlR2V0SW5mb0RpY3Rpb25hcnkobWFpbkJ1bmRsZSk7Ci0JCQkJCQkKLQkJCS8qIElmIHdlIHN1Y2NlZWRlZCwgbG9vayBmb3Igb3VyIHByb3BlcnR5LiAqLwotCQkJaWYgKGJ1bmRsZUluZm9EaWN0ICE9IE5VTEwpIHsKLQkJCQlDRkFycmF5UmVmIGFyPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShidW5kbGVJbmZvRGljdCwgQ0ZTVFIoIkVjbGlwc2UiKSk7Ci0JCQkJaWYgKGFyKSB7Ci0JCQkJCUNGSW5kZXggc2l6ZT0gQ0ZBcnJheUdldENvdW50KGFyKTsKLQkJCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJCQlpbnQgaTsKLQkJCQkJCWNoYXIgKipvbGRfYXJndj0gYXJndjsKLQkJCQkJCWFyZ3Y9IChjaGFyKiopIGNhbGxvYyhzaXplKzIsIHNpemVvZihjaGFyKikpOwotCQkJCQkJYXJnYz0gMDsKLQkJCQkJCWFyZ3ZbYXJnYysrXT0gb2xkX2FyZ3ZbMF07Ci0JCQkJCQlmb3IgKGk9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQlDRlN0cmluZ1JlZiBzcj0gKENGU3RyaW5nUmVmKSBDRkFycmF5R2V0VmFsdWVBdEluZGV4IChhciwgaSk7Ci0JCQkJCQkJQ0ZJbmRleCBhcmdTdHJpbmdTaXplPSBDRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcoQ0ZTdHJpbmdHZXRMZW5ndGgoc3IpLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotCQkJCQkJCWNoYXIgKnM9IG1hbGxvYyhhcmdTdHJpbmdTaXplKTsKLQkJCQkJCQlpZiAoQ0ZTdHJpbmdHZXRDU3RyaW5nKHNyLCBzLCBhcmdTdHJpbmdTaXplLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpKSB7Ci0JCQkJCQkJCWFyZ3ZbYXJnYysrXT0gZXhwYW5kU2hlbGwocywgZmdBcHBQYWNrYWdlUGF0aCwgTlVMTCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJZnByaW50ZihmZ0NvbnNvbGVMb2csICJjYW4ndCBleHRyYWN0IGJ5dGVzXG4iKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy9mcmVlKHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZnByaW50ZihmZ0NvbnNvbGVMb2csICJubyBFY2xpcHNlIGRpY3QgZm91bmRcbiIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZnByaW50ZihmZ0NvbnNvbGVMb2csICJubyBidW5kbGUgZGljdCBmb3VuZFxuIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmcHJpbnRmKGZnQ29uc29sZUxvZywgIm5vIGJ1bmRsZSBmb3VuZFxuIik7Ci0JCX0KLQl9Ci0JaW50IGV4aXRjb2RlPSBvcmlnaW5hbF9tYWluKGFyZ2MsIGFyZ3YpOwotCWRlYnVnKCI8PDw8IGV4aXQoJWQpXG4iLCBleGl0Y29kZSk7Ci0JZmNsb3NlKGZnQ29uc29sZUxvZyk7Ci0JcmV0dXJuIGV4aXRjb2RlOwotfQotCi1zdGF0aWMgdm9pZCBkZWJ1Zyhjb25zdCBjaGFyICpmbXQsIC4uLikgewotI2lmIERFQlVHCi0JdmFfbGlzdCBhcDsKLQl2YV9zdGFydChhcCwgZm10KTsKLQlmcHJpbnRmKGZnQ29uc29sZUxvZywgIiUwNWQ6ICIsIGZnUGlkKTsKLQl2ZnByaW50ZihmZ0NvbnNvbGVMb2csIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgZHVtcEFyZ3MoY2hhciAqdGFnLCBpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0jaWYgREVCVUcKLQlpbnQgaTsKLQlpZiAoYXJnYyA8IDApIHsKLQkJYXJnYz0gMDsKLQkJZm9yIChpPSAwOyBhcmd2W2ldICE9IE5VTEw7IGkrKykKLQkJCSBhcmdjKys7Ci0JfQotCWRlYnVnKCI+Pj4+ICVzOiIsIHRhZyk7Ci0JZm9yIChpPSAwOyBpIDwgYXJnYyAmJiBhcmd2W2ldICE9IE5VTEw7IGkrKykKLQkJZnByaW50ZihmZ0NvbnNvbGVMb2csICIgPCVzPiIsIGFyZ3ZbaV0pOwotCWZwcmludGYoZmdDb25zb2xlTG9nLCAiXG4iKTsKLSNlbmRpZgotfQotCi0vKgotICogRXhwYW5kICRBUFBfUEFDS0FHRSwgJEpBVkFfSE9NRSwgYW5kIGRvZXMgdGlsZGUgZXhwYW5zaW9uLgotIAotCUEgd29yZCBiZWdpbm5pbmcgd2l0aCBhbiB1bnF1b3RlZCB0aWxkZSBjaGFyYWN0ZXIgKH4pIGlzCi0Jc3ViamVjdCB0byB0aWxkZSBleHBhbnNpb24uIEFsbCB0aGUgY2hhcmFjdGVycyB1cCB0byBhCi0Jc2xhc2ggKC8pIG9yIHRoZSBlbmQgb2YgdGhlIHdvcmQgYXJlIHRyZWF0ZWQgYXMgYSB1c2VybmFtZQotCWFuZCBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LiBJZiB0aGUKLQl1c2VybmFtZSBpcyBtaXNzaW5nIChhcyBpbiB+L2Zvb2JhciksIHRoZSB0aWxkZSBpcwotCXJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBIT01FIHZhcmlhYmxlICh0aGUgY3VycmVudAotCXVzZXIncyBob21lIGRpcmVjdG9yeSkuCi0gKi8KLXN0YXRpYyBjaGFyICpleHBhbmRTaGVsbChjaGFyICphcmcsIGNvbnN0IGNoYXIgKmFwcFBhY2thZ2UsIGNvbnN0IGNoYXIgKmphdmFSb290KSB7Ci0JCi0JaWYgKGluZGV4KGFyZywgJ34nKSA9PSBOVUxMICYmIGluZGV4KGFyZywgJyQnKSA9PSBOVUxMKQotCQlyZXR1cm4gYXJnOwotCQotCWNoYXIgKmJ1ZmZlcj0gc3RyZHVwKCIiKTsKLQljaGFyIGMsIGxhc3RDaGFyPSAnICc7Ci0JY29uc3QgY2hhciAqY3A9IGFyZzsKLQl3aGlsZSAoKGMgPSAqY3ArKykgIT0gMCkgewotCQlpZiAoaXNzcGFjZShsYXN0Q2hhcikgJiYgYyA9PSAnficpIHsKLQkJCWNoYXIgbmFtZVsxMDBdLCAqZGlyPSBOVUxMOwotCQkJaW50IGo9IDA7Ci0JCQlmb3IgKDsgKGMgPSAqY3ApICE9IDA7IGNwKyspIHsKLQkJCQlpZiAoISBpc2FsbnVtKGMpKQotCQkJCQlicmVhazsKLQkJCQluYW1lW2orK109IGM7Ci0JCQkJbGFzdENoYXI9IGM7Ci0JCQl9Ci0JCQluYW1lW2pdPSAnXDAnOwotCQkJaWYgKGogPiAwKSB7Ci0JCQkJc3RydWN0IHBhc3N3ZCAqcHc9IGdldHB3bmFtKG5hbWUpOwotCQkJCWlmIChwdyAhPSBOVUxMKQotCQkJCQlkaXI9IHB3LT5wd19kaXI7Ci0JCQl9IGVsc2UgewotCQkJCWRpcj0gZ2V0ZW52KCJIT01FIik7Ci0JCQl9Ci0JCQlpZiAoZGlyICE9IE5VTEwpCi0JCQkJYnVmZmVyPSBhcHBlbmQoYnVmZmVyLCBkaXIpOwotCQkJCQotCQl9IGVsc2UgaWYgKGMgPT0gJyQnKSB7Ci0JCQlpbnQgbD0gc3RybGVuKEFQUF9QQUNLQUdFKTsKLQkJCWlmIChhcHBQYWNrYWdlICE9IE5VTEwgJiYgc3RybmNtcChjcCwgQVBQX1BBQ0tBR0UsIGwpID09IDApIHsKLQkJCQljcCs9IGw7Ci0JCQkJYnVmZmVyPSBhcHBlbmQoYnVmZmVyLCBhcHBQYWNrYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGw9IHN0cmxlbihKQVZBUk9PVCk7Ci0JCQkJaWYgKGphdmFSb290ICE9IE5VTEwgJiYgc3RybmNtcChjcCwgSkFWQVJPT1QsIGwpID09IDApIHsKLQkJCQkJY3ArPSBsOwotCQkJCQlidWZmZXI9IGFwcGVuZChidWZmZXIsIGphdmFSb290KTsKLQkJCQl9IGVsc2UgewotCQkJCQlidWZmZXI9IGFwcGVuZGMoYnVmZmVyLCBjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZQotCQkJYnVmZmVyPSBhcHBlbmRjKGJ1ZmZlciwgYyk7Ci0JCWxhc3RDaGFyPSBjOwotCX0KLQlyZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY2hhciAqbXlfc3RyY2FzZXN0cihjb25zdCBjaGFyICpiaWcsIGNvbnN0IGNoYXIgKmxpdHRsZSkgewotICAgIGNoYXIgKmNwLCAqcywgKnQ7Ci0gICAgZm9yIChjcD0gKGNoYXIqKSBiaWc7ICpjcDsgY3ArKykgewotICAgICAgICBmb3IgKHM9IGNwLCB0PSAoY2hhciopIGxpdHRsZTsgKnMgJiYgKnQ7IHMrKywgdCsrKQotICAgICAgICAgICAgaWYgKHRvdXBwZXIoKnMpICE9IHRvdXBwZXIoKnQpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoKnQgPT0gJ1wwJykKLSAgICAgICAgICAgIHJldHVybiBjcDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjaGFyICphcHBlbmQoY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpzKSB7Ci0JaW50IGJsPSBzdHJsZW4oYnVmZmVyKTsKLQlpbnQgc2w9IHN0cmxlbihzKTsKLQlidWZmZXI9IHJlYWxsb2MoYnVmZmVyLCBibCtzbCsxKTsKLQlzdHJjcHkoJmJ1ZmZlcltibF0sIHMpOwotCXJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjaGFyICphcHBlbmRjKGNoYXIgKmJ1ZmZlciwgY2hhciBjKSB7Ci0JaW50IGJsPSBzdHJsZW4oYnVmZmVyKTsKLQlidWZmZXI9IHJlYWxsb2MoYnVmZmVyLCBibCsyKTsKLQlidWZmZXJbYmwrK109IGM7Ci0JYnVmZmVyW2JsXT0gJ1wwJzsKLQlyZXR1cm4gYnVmZmVyOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvY2FyYm9uL2VjbGlwc2VNYWluLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9lY2xpcHNlTWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDU0MjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvY2FyYm9uL2VjbGlwc2VNYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCSAgQW5kcmUgV2VpbmFuZCAoT1RJIExhYnMpCi0gKi8KLSAKLSNkZWZpbmUgbWFpbiBvcmlnaW5hbF9tYWluCi0KLSNpbmNsdWRlICIuLi9lY2xpcHNlTWFpbi5jIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9jYXJib24vbWFrZV9jYXJib24ubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9jYXJib24vbWFrZV9jYXJib24ubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTJkMjllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvY2FyYm9uL21ha2VfY2FyYm9uLm1haworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAgCi0jIENvbnRyaWJ1dG9yczogCi0jICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotaW5jbHVkZSAuLi9tYWtlX3ZlcnNpb24ubWFrCi0jIE1ha2VmaWxlIGZvciBjcmVhdGluZyB0aGUgQ2FyYm9uIGVjbGlwc2UgbGF1bmNoZXIgcHJvZ3JhbS4KLQotIyBUaGlzIG1ha2VmaWxlIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0OgotIwotIyBQUk9HUkFNX09VVFBVVCAgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBleGVjdXRhYmxlCi0jIERFRkFVTFRfT1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLW9zIiBzd2l0Y2gKLSMgREVGQVVMVF9PU19BUkNIIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItYXJjaCIgc3dpdGNoCi0jIERFRkFVTFRfV1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLXdzIiBzd2l0Y2gKLQotI2RlZmF1bHQgdmFsdWUgZm9yIFBST0dSQU1fT1VUUFVUCi1pZmVxICgkKFBST0dSQU1fT1VUUFVUKSwpCi0gIFBST0dSQU1fT1VUUFVUPWVjbGlwc2UKLWVuZGlmCi1QUk9HUkFNX0xJQlJBUlk9ZWNsaXBzZV8kKExJQl9WRVJTSU9OKS5zbwotCi0jIERlZmluZSB0aGUgb2JqZWN0IG1vZHVsZXMgdG8gYmUgY29tcGlsZWQgYW5kIGZsYWdzLgotTUFJTl9PQkpTID0gZWNsaXBzZU1haW4ubyBlY2xpcHNlQ2FyYm9uTWFpbi5vCi1DT01NT05fT0JKUyA9IGVjbGlwc2VDb25maWcubyBlY2xpcHNlQ29tbW9uLm8gZWNsaXBzZUNhcmJvbkNvbW1vbi5vCi1ETExfT0JKUwk9IGVjbGlwc2UubyBlY2xpcHNlQ2FyYm9uLm8gZWNsaXBzZVV0aWwubyBlY2xpcHNlSk5JLm8gZWNsaXBzZVNobS5vIE5nSW1hZ2VEYXRhLm8gTmdXaW5CTVBGaWxlRm9ybWF0Lm8gTmdDb21tb24ubwotCi1FWEVDID0gJChQUk9HUkFNX09VVFBVVCkKLURMTCA9ICQoUFJPR1JBTV9MSUJSQVJZKQotTElCUyA9IC1mcmFtZXdvcmsgQ2FyYm9uCi1BUkNIUyA9IC1hcmNoIGkzODYgLWFyY2ggcHBjCi1DRkxBR1MgPSAtTyAtcyBcCi0JLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuMyBcCi0JLVdhbGwgXAotCSQoQVJDSFMpIFwKLQktRE1BQ09TWCBcCi0JLURERUZBVUxUX09TPSJcIiQoREVGQVVMVF9PUylcIiIgXAotCS1EREVGQVVMVF9PU19BUkNIPSJcIiQoREVGQVVMVF9PU19BUkNIKVwiIiBcCi0JLURERUZBVUxUX1dTPSJcIiQoREVGQVVMVF9XUylcIiIgXAotCS1JLi4gLUkuLi9tb3RpZiAtSS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvSGVhZGVycwotCi1hbGw6ICQoRVhFQykgJChETEwpCi0KLWVjbGlwc2UubzogLi4vZWNsaXBzZS5jIC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlSk5JLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZS5jIC1vICRACi0KLWVjbGlwc2VDYXJib25NYWluLm8gOiBlY2xpcHNlQ2FyYm9uTWFpbi5jCi0JJChDQykgJChDRkxBR1MpIC1jIGVjbGlwc2VDYXJib25NYWluLmMgLW8gJEAKLQotZWNsaXBzZU1haW4ubzogLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmggZWNsaXBzZU1haW4uYyAuLi9lY2xpcHNlTWFpbi5jIAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyBlY2xpcHNlTWFpbi5jIC1vICRACi0JCi1lY2xpcHNlSk5JLm86IC4uL2VjbGlwc2VKTkkuYyAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZUpOSS5oCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2VKTkkuYyAtbyAkQAotCi1lY2xpcHNlVXRpbC5vOiAuLi9lY2xpcHNlVXRpbC5jIC4uL2VjbGlwc2VVdGlsLmggLi4vZWNsaXBzZU9TLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZVV0aWwuYyAtbyAkQAotCQotZWNsaXBzZUNvbmZpZy5vOiAuLi9lY2xpcHNlQ29uZmlnLmMgLi4vZWNsaXBzZUNvbmZpZy5oIC4uL2VjbGlwc2VPUy5oCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2VDb25maWcuYyAtbyAkQAotCi1lY2xpcHNlQ29tbW9uLm86IC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VDb21tb24uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlQ29tbW9uLmMgLW8gJEAKLQotZWNsaXBzZVNobS5vOiAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlU2htLmMKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZVNobS5jIC1vICRACi0KLU5nQ29tbW9uLm86IC4uL21vdGlmL05nQ29tbW9uLmMKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vbW90aWYvTmdDb21tb24uYyAtbyAkQAotCi1OZ1dpbkJNUEZpbGVGb3JtYXQubzogLi4vbW90aWYvTmdXaW5CTVBGaWxlRm9ybWF0LmMKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vbW90aWYvTmdXaW5CTVBGaWxlRm9ybWF0LmMgLW8gJEAKLQotTmdJbWFnZURhdGEubzogLi4vbW90aWYvTmdJbWFnZURhdGEuYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9tb3RpZi9OZ0ltYWdlRGF0YS5jIC1vICRACi0KLSQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKQotCSQoQ0MpIC1vICQoRVhFQykgJChBUkNIUykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoTElCUykKLQotJChETEwpOiAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKQotCSQoQ0MpIC1idW5kbGUgLW8gJChETEwpICQoQVJDSFMpICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpICQoTElCUykKLQotaW5zdGFsbDogYWxsCi0JY3AgJChFWEVDKSAkKFBQQ19PVVRQVVRfRElSKQotCWNwICQoRVhFQykgJChYODZfT1VUUFVUX0RJUikKLQlybSAtZiAkKEVYRUMpICQoT0JKUykKLQotY2xlYW46Ci0Jcm0gLWYgJChFWEVDKSAkKERMTCkgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoRExMX09CSlMpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2NhcmJvbi9tYWtlX2NvY29hLm1hayBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvY2FyYm9uL21ha2VfY29jb2EubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjhjMzRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvY2FyYm9uL21ha2VfY29jb2EubWFrCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgICAKLSMgQ29udHJpYnV0b3JzOiAKLSMgICAgIEtldmluIENvcm5lbGwgKFJhdGlvbmFsIFNvZnR3YXJlIENvcnBvcmF0aW9uKQotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1pbmNsdWRlIC4uL21ha2VfdmVyc2lvbi5tYWsKLSMgTWFrZWZpbGUgZm9yIGNyZWF0aW5nIHRoZSBDYXJib24gZWNsaXBzZSBsYXVuY2hlciBwcm9ncmFtLgotCi0jIFRoaXMgbWFrZWZpbGUgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQ6Ci0jCi0jIFBST0dSQU1fT1VUUFVUICAtIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGV4ZWN1dGFibGUKLSMgREVGQVVMVF9PUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItb3MiIHN3aXRjaAotIyBERUZBVUxUX09TX0FSQ0ggLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1hcmNoIiBzd2l0Y2gKLSMgREVGQVVMVF9XUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItd3MiIHN3aXRjaAotCi0jZGVmYXVsdCB2YWx1ZSBmb3IgUFJPR1JBTV9PVVRQVVQKLWlmZXEgKCQoUFJPR1JBTV9PVVRQVVQpLCkKLSAgUFJPR1JBTV9PVVRQVVQ9ZWNsaXBzZQotZW5kaWYKLVBST0dSQU1fTElCUkFSWT1lY2xpcHNlXyQoTElCX1ZFUlNJT04pLnNvCi0KLSMgRGVmaW5lIHRoZSBvYmplY3QgbW9kdWxlcyB0byBiZSBjb21waWxlZCBhbmQgZmxhZ3MuCi1NQUlOX09CSlMgPSBlY2xpcHNlTWFpbi5vIGVjbGlwc2VDYXJib25NYWluLm8KLUNPTU1PTl9PQkpTID0gZWNsaXBzZUNvbmZpZy5vIGVjbGlwc2VDb21tb24ubyBlY2xpcHNlQ2FyYm9uQ29tbW9uLm8KLURMTF9PQkpTCT0gZWNsaXBzZS5vIGVjbGlwc2VDYXJib24ubyBlY2xpcHNlVXRpbC5vIGVjbGlwc2VKTkkubyBlY2xpcHNlU2htLm8gCi0jTmdJbWFnZURhdGEubyBOZ1dpbkJNUEZpbGVGb3JtYXQubyBOZ0NvbW1vbi5vCi0KLUVYRUMgPSAkKFBST0dSQU1fT1VUUFVUKQotRExMID0gJChQUk9HUkFNX0xJQlJBUlkpCi1MSUJTID0gLWZyYW1ld29yayBDb2NvYQotCi1pZmVxICgkKEFSQ0hTKSwpCi1BUkNIUyA9IC1hcmNoIGkzODYgLWFyY2ggcHBjCi1lbmRpZgotCi1DRkxBR1MgPSAtTyAtcyBcCi0JLVdhbGwgXAotCS1EQ09DT0EgLXhvYmplY3RpdmUtYyBcCi0JJChBUkNIUykgXAotCS1ETUFDT1NYIFwKLQktRERFRkFVTFRfT1M9IlwiJChERUZBVUxUX09TKVwiIiBcCi0JLURERUZBVUxUX09TX0FSQ0g9IlwiJChERUZBVUxUX09TX0FSQ0gpXCIiIFwKLQktRERFRkFVTFRfV1M9IlwiJChERUZBVUxUX1dTKVwiIiBcCi0JLUkuLiAtSS4uL21vdGlmIC1JL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9IZWFkZXJzCi0KLWFsbDogJChFWEVDKSAkKERMTCkKLQotZWNsaXBzZS5vOiAuLi9lY2xpcHNlLmMgLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZUNvbW1vbi5oIC4uL2VjbGlwc2VKTkkuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlLmMgLW8gJEAKLQotZWNsaXBzZUNhcmJvbk1haW4ubyA6IGVjbGlwc2VDYXJib25NYWluLmMKLQkkKENDKSAkKENGTEFHUykgLWMgZWNsaXBzZUNhcmJvbk1haW4uYyAtbyAkQAotCi1lY2xpcHNlTWFpbi5vOiAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VDb21tb24uaCBlY2xpcHNlTWFpbi5jIC4uL2VjbGlwc2VNYWluLmMgCi0JJChDQykgJChDRkxBR1MpIC1jIGVjbGlwc2VNYWluLmMgLW8gJEAKLQkKLWVjbGlwc2VKTkkubzogLi4vZWNsaXBzZUpOSS5jIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlSk5JLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZUpOSS5jIC1vICRACi0KLWVjbGlwc2VVdGlsLm86IC4uL2VjbGlwc2VVdGlsLmMgLi4vZWNsaXBzZVV0aWwuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlVXRpbC5jIC1vICRACi0JCi1lY2xpcHNlQ29uZmlnLm86IC4uL2VjbGlwc2VDb25maWcuYyAuLi9lY2xpcHNlQ29uZmlnLmggLi4vZWNsaXBzZU9TLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZUNvbmZpZy5jIC1vICRACi0KLWVjbGlwc2VDb21tb24ubzogLi4vZWNsaXBzZUNvbW1vbi5oIC4uL2VjbGlwc2VVbmljb2RlLmggLi4vZWNsaXBzZUNvbW1vbi5jCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2VDb21tb24uYyAtbyAkQAotCi1lY2xpcHNlU2htLm86IC4uL2VjbGlwc2VTaG0uaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VTaG0uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlU2htLmMgLW8gJEAKLQotTmdDb21tb24ubzogLi4vbW90aWYvTmdDb21tb24uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9tb3RpZi9OZ0NvbW1vbi5jIC1vICRACi0KLU5nV2luQk1QRmlsZUZvcm1hdC5vOiAuLi9tb3RpZi9OZ1dpbkJNUEZpbGVGb3JtYXQuYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9tb3RpZi9OZ1dpbkJNUEZpbGVGb3JtYXQuYyAtbyAkQAotCi1OZ0ltYWdlRGF0YS5vOiAuLi9tb3RpZi9OZ0ltYWdlRGF0YS5jCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL21vdGlmL05nSW1hZ2VEYXRhLmMgLW8gJEAKLQotJChFWEVDKTogJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpCi0JJChDQykgLW8gJChFWEVDKSAkKEFSQ0hTKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCi0kKERMTCk6ICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpCi0JJChDQykgLWJ1bmRsZSAtbyAkKERMTCkgJChBUkNIUykgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCi1pbnN0YWxsOiBhbGwKLQljcCAtdiAkKEVYRUMpICQoUFJPR1JBTV9PVVRQVVRfRElSKQotCXJtIC1mICQoRVhFQykgJChPQkpTKQotCi1jbGVhbjoKLQlybSAtZiAkKEVYRUMpICQoRExMKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChETExfT0JKUykKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZS5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYzY5M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEtldmluIENvcm5lbGwgKFJhdGlvbmFsIFNvZnR3YXJlIENvcnBvcmF0aW9uKQotICoJICAgTWFya3VzIFNjaG9ybiAoV2luZCBSaXZlciBTeXN0ZW1zKSwgYnVnIDE5MzM0MAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEVjbGlwc2UgUHJvZ3JhbSBMYXVuY2hlcgotICoKLSAqIFRoaXMgZmlsZSBmb3JtcyB0aGUgYmFzZSBvZiB0aGUgZWNsaXBzZV8qLmRsbC9zby4gIFRoaXMgZGxsIGlzIGxvYWRlZCBieSBlY2xpcHNlLmV4ZQotICogdG8gc3RhcnQgYSBKYXZhIFZNLCBvciBhbHRlcm5hdGl2ZWx5IGl0IGlzIGxvYWRlZCBmcm9tIEphdmEgdG8gc2hvdyB0aGUgc3BsYXNoCi0gKiBzY3JlZW4gb3Igd3JpdGUgdG8gdGhlIHNoYXJlZCBtZW1vcnkuICBTZWUgZWNsaXBzZUpOSS5jIGZvciBkZXNjcmlwdGlvbnMgb2YgdGhlIG1ldGhvZHMKLSAqIGV4cG9zZWQgdG8gdGhlIEphdmEgcHJvZ3JhbSB1c2luZyBKTkkuCi0gKiAKLSAqIFRvIGRpc3BsYXkgYSBzcGxhc2ggc2NyZWVuIGJlZm9yZSBzdGFydGluZyB0aGUgamF2YSB2bSwgdGhlIGxhdW5jaGVyIHNob3VsZCBiZSBzdGFydGVkIAotICogd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIHNwbGFzaCBiaXRtYXAgdG8gdXNlOgotICogLXNob3dzcGxhc2ggPHBhdGgvdG8vc3BsYXNoLmJtcD4KLSAqIE90aGVyd2lzZSwgd2hlbiB0aGUgSmF2YSBwcm9ncmFtIHN0YXJ0cywgaXQgc2hvdWxkIGRldGVybWluZSB0aGUgbG9jYXRpb24gb2YKLSAqIHRoZSBzcGxhc2ggYml0bWFwIHRvIGJlIHVzZWQgYW5kIHVzZSB0aGUgSk5JIG1ldGhvZCBzaG93X3NwbGFzaC4gCi0gKiAKLSAqIFdoZW4gdGhlIEphdmEgcHJvZ3JhbSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZSwgdGhlIHNwbGFzaCB3aW5kb3cKLSAqIGlzIGJyb3VnaHQgZG93biBieSBjYWxsaW5nIHRoZSBKTkkgbWV0aG9kIHRha2Vkb3duX3NwbGFzaC4KLSAqCi0gKiBUaGUgSmF2YSBwcm9ncmFtIGNhbiBhbHNvIGNhbGwgdGhlIGdldF9zcGxhc2hfaGFuZGxlIG1ldGhvZCB0byBnZXQgdGhlIGhhbmRsZSB0byB0aGUgc3BsYXNoIAotICogd2luZG93LiAgVGhpcyBjYW4gYmUgcGFzc2VkIHRvIFNXVCB0byBjcmVhdGUgU1dUIHdpZGdldHMgaW4gdGhlIHNwbGFzaCBzY3JlZW4uCi0gKiAKLSAqIFRoZSBKYXZhIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSB0d28gb3RoZXIgYXJndW1lbnRzOgotICogICAgLWV4aXRkYXRhIDxzaGFyZWQgbWVtb3J5IGlkPgotICoKLSAqIFRoZSBqYXZhIHByb2dyYW0gY2FuIGNhbGwgc2V0X2V4aXRfZGF0YSB3aXRoIHRoaXMgc2hhcmVkLW1lbW9yeS1pZAotICogdG8gcHJvdmlkZSBzcGVjaWZpYyBleGl0IGRhdGEgdG8gdGhlIGxhdW5jaGVyLiAKLSAqCi0gKiBUaGUgZXhpdCBkYXRhIHNpemUgbXVzdCBub3QgZXhjZWVkIE1BWF9TSEFSRURfTEVOR1RIIHdoaWNoIGlzCi0gKiAxNktiLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGV4aXQgZGF0YSBpcyBkZXBlbmRlbnQgb24gdGhlIAotICogZXhpdCB2YWx1ZSBvZiB0aGUgamF2YSBhcHBsaWNhdGlvbi4KLSAqCi0gKiBUaGUgbWFpbiBsYXVuY2hlciByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgZXhpdCBjb2RlcyBmcm9tIHRoZQotICogSmF2YSBhcHBsaWNhdGlvbjoKLSAqCi0gKiAgICAwICAgIC0gRXhpdCBub3JtYWxseS4KLSAqICAgIFJFU1RBUlRfTEFTVF9FQyA9IDIzCi0gKiAgICAgICAtIHJlc3RhcnQgdGhlIGphdmEgVk0gYWdhaW4gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhlIHByZXZpb3VzIG9uZS4KLSAqICAgIFJFU1RBUlRfTkVXX0VDICA9IDI0Ci0gKiAgICAgICAtIHJlc3RhcnQgdGhlIGphdmEgVk0gYWdhaW4gd2l0aCB0aGUgYXJndW1lbnRzIHRha2VuIGZyb20gdGhlIGV4aXQgZGF0YS4KLSAqICAgICAgIFRoZSBleGl0IGRhdGEgZm9ybWF0IGlzIGEgbGlzdCBvZiBhcmd1bWVudHMgc2VwYXJhdGVkIGJ5ICdcbicuIFRoZSBKYXZhCi0gKiAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgYnVpbGQgdGhpcyBsaXN0IHVzaW5nIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGl0IG9uCi0gKiAgICAgICBzdGFydHVwLiBTZWUgYmVsb3cuCi0gKgotICogQWRkaXRpb25hbGx5LCBpZiB0aGUgSmF2YSBhcHBsaWNhdGlvbiBleGl0cyB3aXRoIGFuIGV4aXQgY29kZSBvdGhlciB0aGFuIHRoZQotICogb25lcyBhYm92ZSwgdGhlIG1haW4gbGF1bmNoZXIgd2lsbCBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGUgY29udGVudHMKLSAqIG9mIHRoZSBleGl0IGRhdGEuIElmIHRoZSBleGl0IGRhdGEgaXMgZW1wdHksIGEgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIGlzCi0gKiBkaXNwbGF5ZWQuIFRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2Ugc2hvd3MgdGhlIGV4aXQgY29kZSBhbmQgdGhlIGFyZ3VtZW50cwotICogcGFzc2VkIHRvIHRoZSBKYXZhIGFwcGxpY2F0aW9uLgotICoKLSAqIFRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBieSB0aGUgdXNlciB0byB0aGUgbGF1bmNoZXIgYXJlOgotICogIC12bSA8amF2YVZNPiAgICAgICAgICAgICAgIHRoZSBKYXZhIFZNIHRvIGJlIHVzZWQKLSAqICAtb3MgPG9wU3lzPiAgICAgICAgICAgICAgICB0aGUgb3BlcmF0aW5nIHN5c3RlbSBiZWluZyBydW4gb24KLSAqICAtYXJjaCA8b3NBcmNoPiAgICAgICAgICAgICB0aGUgaGFyZHdhcmUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBPUzogeDg2LCBzcGFyYywgaHA5MDAwCi0gKiAgLXdzIDxndWk+ICAgICAgICAgICAgICAgICAgdGhlIHdpbmRvdyBzeXN0ZW0gdG8gYmUgdXNlZDogd2luMzIsIG1vdGlmLCBndGssIC4uLgotICogIC1ub3NwbGFzaCAgICAgICAgICAgICAgICAgIGRvIG5vdCBkaXNwbGF5IHRoZSBzcGxhc2ggc2NyZWVuLiBUaGUgamF2YSBhcHBsaWNhdGlvbiB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHJlY2VpdmUgdGhlIC1zaG93c3BsYXNoIGNvbW1hbmQuCi0gKiAgLXNob3dzcGxhc2ggPGJpdG1hcD4JICAgc2hvdyB0aGUgZ2l2ZW4gYml0bWFwIGluIHRoZSBzcGxhc2ggc2NyZWVuLgotICogIC1uYW1lIDxuYW1lPiAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIG5hbWUgZGlzcGxheWVkIGluIGVycm9yIG1lc3NhZ2UgZGlhbG9ncyBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxhc2ggc2NyZWVuIHdpbmRvdy4gRGVmYXVsdCB2YWx1ZSBpcyBjb21wdXRlZCBmcm9tIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgLSB3aXRoIHRoZSBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwb3NzaWJsZS4gZS5nLiBlY2xpcHNlLmV4ZSBkZWZhdWx0cyB0byB0aGUgbmFtZSBFY2xpcHNlLgotICogIC1zdGFydHVwIDxzdGFydHVwLmphcj4gICAgIHRoZSBzdGFydHVwIGphciB0byBleGVjdXRlLiBUaGUgYXJndW1lbnQgaXMgZmlyc3QgYXNzdW1lZCB0byBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBwYXRoIG9mIHRoZSBsYXVuY2hlci4gSWYgc3VjaCBhIGZpbGUgZG9lcyBub3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCwgdGhlIGFyZ3VtZW50IGlzIHRoZW4gdHJlYXRlZCBhcyBhbiBhYnNvbHV0ZSBwYXRoLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGZpbmQgdGhlIHBsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlciBqYXIKLSAqIAkJCQkJCQkgICB3aXRoIHRoZSBoaWdoZXN0IHZlcnNpb24gbnVtYmVyLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBqYXIgbXVzdCBjb250YWluIGFuIG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuTWFpbiBjbGFzcy4KLSAqIAkJCQkJCQkgICAodW5sZXNzIEpOSSBpbnZvY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkLCB0aGVuIHRoZSBqYXIgb25seSBuZWVkcyB0byBiZQotICogCQkJCQkJCSAgIGFuIGV4ZWN1dGFibGUgamFyKQotICogLWxpYnJhcnkJCQkJCSAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWNsaXBzZSBsYXVuY2hlciBzaGFyZWQgbGlicmFyeSAodGhpcyBsaWJyYXJ5KSB0byB1c2UKLSAqIAkJCQkJCQkgICBCeSBkZWZhdWx0LCB0aGUgbGF1bmNoZXIgZXhlIChzZWUgZWNsaXBzZU1haW4uYykgZmluZHMKLSAqICA8dXNlckFyZ3M+ICAgICAgICAgICAgICAgICBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkIGFsb25nIHRvIHRoZSBKYXZhIGFwcGxpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZSwgLWRhdGEgPHBhdGg+LCAtZGVidWcsIC1jb25zb2xlLCAtY29uc29sZUxvZywgZXRjKSAKLSAqICAtdm1hcmdzIDx1c2VyVk1hcmdzPiAuLi4gICBhIGxpc3Qgb2YgYXJndW1lbnRzIGZvciB0aGUgVk0gaXRzZWxmCi0gKgotICogVGhlIC12bWFyZ3Mgb3B0aW9uIGFuZCBhbGwgdXNlciBzcGVjaWZpZWQgVk0gYXJndW1lbnRzIG11c3QgYXBwZWFyCi0gKiBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGxpbmUsIGFmdGVyIGFsbCBhcmd1bWVudHMgdGhhdCBhcmUKLSAqIGJlaW5nIHBhc3NlZCB0byBKYXZhIGFwcGxpY2F0aW9uLiAKLSAqCi0gKiBUaGUgYXJndW1lbnQgb3JkZXIgZm9yIHRoZSBuZXcgSmF2YSBWTSBwcm9jZXNzIGlzIGFzIGZvbGxvd3M6Ci0gKgotICogPGphdmFWTT4gPGFsbCBWTSBhcmdzPgotICogICAgIC1vcyA8dXNlciBvciBkZWZhdWx0IE9TIHZhbHVlPgotICogICAgIC13cyA8dXNlciBvciBkZWZhdWx0IFdTIHZhbHVlPgotICogICAgIC1hcmNoIDx1c2VyIG9yIGRlZmF1bHQgQVJDSCB2YWx1ZT4KLSAqICAgICAtbGF1bmNoZXIgPGFic29sdXRlIGxhdW5jaGVyIG5hbWU+Ci0gKiAgICAgLW5hbWUgPGFwcGxpY2F0aW9uIG5hbWU+Ci0gKiAJICAgLWxpYnJhcnkgPGVjbGlwc2UgbGlicmFyeSBsb2NhdGlvbj4KLSAqIAkgICAtc3RhcnR1cCA8c3RhcnR1cC5qYXIgbG9jYXRpb24+Ci0gKiAgICAgWy1zaG93c3BsYXNoXQotICogICAgIFstZXhpdGRhdGEgPHNoYXJlZCBtZW1vcnkgaWQ+XQotICogICAgIDx1c2VyQXJncz4KLSAqICAgICAtdm0gPGphdmFWTT4KLSAqICAgICAtdm1hcmdzIDxhbGwgVk0gYXJncz4KLSAqCi0gKiB3aGVyZToKLSAqICAgPGFsbCBWTSBhcmdzPiA9Ci0gKiAgICAgWzxkZWZhdWx0Vk1hcmdzIHwgPHVzZXJWTWFyZ3M+XQotICogICAgIC1qYXIKLSAqICAgICA8c3RhcnR1cCBqYXIgZnVsbCBwYXRoPgotICoJCi0gKiBUaGUgc3RhcnR1cCBqYXIgbXVzdCBiZSBhbiBleGVjdXRhYmxlIGphci4KLSAqIAotICoKLSAqIFNlZSAiTWFpbi5qYXZhIiBmb3IgYSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEphdmEKLSAqIGFwcGxpY2F0aW9uLgotICoKLSAqIENvbmZpZ3VyYXRpb24gZmlsZQotICogICBUaGUgbGF1bmNoZXIgZ2V0cyBhcmd1bWVudHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFuZC9vciBmcm9tIGEgY29uZmlndXJhdGlvbiBmaWxlLgotICogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBtdXN0IGhhdmUgdGhlIHNhbWUgbmFtZSBhbmQgbG9jYXRpb24gYXMgdGhlIGxhdW5jaGVyIGV4ZWN1dGFibGUKLSAqIGFuZCB0aGUgZXh0ZW5zaW9uIC5pbmkuIEZvciBleGFtcGxlLCB0aGUgZWNsaXBzZS5pbmkgY29uZmlndXJhdGlvbiBmaWxlIG11c3QgYmUKLSAqIGluIHRoZSBzYW1lIGZvbGRlciBhcyB0aGUgZWNsaXBzZS5leGUgb3IgZWNsaXBzZSBleGVjdXRhYmxlLgotICogICBUaGUgZm9ybWF0IG9mIHRoZSBpbmkgZmlsZSBtYXRjaGVzIHRoYXQgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgLSBvbmUKLSAqIGFyZ3VtZW50IHBlciBsaW5lLgotICogICBJbiBnZW5lcmFsLCB0aGUgc2V0dGluZ3Mgb2YgdGhlIGNvbmZpZyBmaWxlIGFyZSBleHBlY3RlZCB0byBiZSBvdmVycmlkZW4gYnkgdGhlCi0gKiBjb21tYW5kIGxpbmUuCi0gKiAgIC0gbGF1bmNoZXIgYXJndW1lbnRzICgtb3MsIC1hcmNoLi4uKSBzZXQgaW4gdGhlIGNvbmZpZyBmaWxlIGFyZSBvdmVycmlkZW4gYnkgdGhlIGNvbW1hbmQgbGluZQotICogICAtIHRoZSAtdm1hcmdzIGZyb20gdGhlIGNvbW1hbmQgbGluZSByZXBsYWNlcyBpbiBpdHMgZW50aXJldHkgdGhlIC12bWFyZ3MgZnJvbSB0aGUgY29uZmlnIGZpbGUuCi0gKiAgIC0gdXNlciBhcmd1bWVudHMgZnJvbSB0aGUgY29uZmlnIGZpbGUgYXJlIHByZXBlbmRlZCB0byB0aGUgdXNlciBhcmd1bWVudHMgZGVmaW5lZCBpbiB0aGUKLSAqICAgICBjb25maWcgZmlsZS4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGphdmEgYmVoYXZpb3VyIGluIHRoZSBmb2xsb3dpbmcgY2FzZToKLSAqICAgICBqYXZhIC1EdGVzdD0ib25lIiAtRHRlc3Q9InR3byIgLi4uICA6IHRlc3QgaXMgc2V0IHRvIHRoZSB2YWx1ZSAidHdvIgotICovCi0KLSNpbmNsdWRlICJlY2xpcHNlT1MuaCIKLSNpbmNsdWRlICJlY2xpcHNlVXRpbC5oIgotI2luY2x1ZGUgImVjbGlwc2VTaG0uaCIKLSNpbmNsdWRlICJlY2xpcHNlSk5JLmgiCi0jaW5jbHVkZSAiZWNsaXBzZUNvbmZpZy5oIgotI2luY2x1ZGUgImVjbGlwc2VDb21tb24uaCIKLQotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxkaXJlY3QuaD4KLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2RlZmluZSBNQVhfUEFUSF9MRU5HVEggICAyMDAwCi0jZGVmaW5lIE1BWF9TSEFSRURfTEVOR1RIICAgKDE2ICogMTAyNCkKLQotLyogR2xvYmFsIERhdGEgKi8KLXN0YXRpYyBfVENIQVIqICBwcm9ncmFtICAgICA9IE5VTEw7ICAgICAgIC8qIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHByb2dyYW0gKi8KLXN0YXRpYyBfVENIQVIqICBwcm9ncmFtRGlyICA9IE5VTEw7ICAgICAgIC8qIGRpcmVjdG9yeSB3aGVyZSBwcm9ncmFtIHJlc2lkZXMgKi8KLXN0YXRpYyBfVENIQVIqICBqYXZhVk0gICAgICA9IE5VTEw7ICAgICAgIC8qIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIEphdmEgVk0gdG8gcnVuICovCi1zdGF0aWMgX1RDSEFSKiAgam5pTGliCQk9IE5VTEw7CQkgIC8qIGZ1bGwgcGF0aCBvZiBhIGphdmEgdm0gbGlicmFyeSBmb3IgSk5JIGludm9jYXRpb24gKi8KLXN0YXRpYyBfVENIQVIqICBqYXJGaWxlICAgICA9IE5VTEw7CQkgIC8qIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHN0YXJ0dXAgamFyIGZpbGUgdG8gcnVuICovCi1zdGF0aWMgX1RDSEFSKiAgc2hhcmVkSUQgICAgPSBOVUxMOyAgICAgICAvKiBJRCBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgKi8KLXN0YXRpYyBfVENIQVIqICBvZmZpY2lhbE5hbWUgID0gTlVMTDsKLQotX1RDSEFSKiAgZXhpdERhdGEgICAgPSBOVUxMOwkJICAvKiBleGl0IGRhdGEgc2V0IGZyb20gSmF2YSAqLwotaW50CQkgaW5pdGlhbEFyZ2M7Ci1fVENIQVIqKiBpbml0aWFsQXJndiA9IE5VTEw7Ci0KLSAJCi0vKiBEZWZpbmUgdGhlIHNwZWNpYWwgZXhpdCBjb2RlcyByZXR1cm5lZCBmcm9tIEVjbGlwc2UuICovCi0jZGVmaW5lIFJFU1RBUlRfTEFTVF9FQyAgICAyMwotI2RlZmluZSBSRVNUQVJUX05FV19FQyAgICAgMjQKLQotLyogY29uc3RhbnRzIGZvciBsYXVuY2ggbW9kZSAqLwotI2RlZmluZSBMQVVOQ0hfSk5JIDEKLSNkZWZpbmUgTEFVTkNIX0VYRSAyCi0KLSNkZWZpbmUgREVGQVVMVF9FRSBfVF9FQ0xJUFNFKCJkZWZhdWx0LmVlIikKLQotLyogRGVmaW5lIGVycm9yIG1lc3NhZ2VzLiAobm9uLU5MUykgKi8KLXN0YXRpYyBfVENIQVIqIGV4aXRNc2cgPSBfVF9FQ0xJUFNFKCJKVk0gdGVybWluYXRlZC4gRXhpdCBjb2RlPSVkXG4lcyIpOwotc3RhdGljIF9UQ0hBUiogamF2YUZhaWx1cmVNc2cgPSBfVF9FQ0xJUFNFKCJJbnRlcm5hbCBFcnJvciwgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIHRoZSBKVk0uIik7Ci1zdGF0aWMgX1RDSEFSKiByZXR1cm5Db2RlTXNnID0gX1RfRUNMSVBTRSgiSmF2YSB3YXMgc3RhcnRlZCBidXQgcmV0dXJuZWQgZXhpdCBjb2RlPSVkXG4lcyIpOwotc3RhdGljIF9UQ0hBUiogZ29WTU1zZyA9IF9UX0VDTElQU0UoIlN0YXJ0IFZNOiAlc1xuIik7Ci1zdGF0aWMgX1RDSEFSKiBwYXRoTXNnID0gX1RfRUNMSVBTRSgiJXMgaW4geW91ciBjdXJyZW50IFBBVEgiKTsKLXN0YXRpYyBfVENIQVIqIHNoYXJlTXNnID0gX1RfRUNMSVBTRSgiTm8gZXhpdCBkYXRhIGF2YWlsYWJsZS4iKTsKLXN0YXRpYyBfVENIQVIqIG5vVk1Nc2cgPQotX1RfRUNMSVBTRSgiQSBKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQgKEpSRSkgb3IgSmF2YSBEZXZlbG9wbWVudCBLaXQgKEpESylcblwKLW11c3QgYmUgYXZhaWxhYmxlIGluIG9yZGVyIHRvIHJ1biAlcy4gTm8gSmF2YSB2aXJ0dWFsIG1hY2hpbmVcblwKLXdhcyBmb3VuZCBhZnRlciBzZWFyY2hpbmcgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi0lcyIpOwotc3RhdGljIF9UQ0hBUiogc3RhcnR1cE1zZyA9Ci1fVF9FQ0xJUFNFKCJUaGUgJXMgZXhlY3V0YWJsZSBsYXVuY2hlciB3YXMgdW5hYmxlIHRvIGxvY2F0ZSBpdHMgXG5cCi1jb21wYW5pb24gbGF1bmNoZXIgamFyLiIpOwotCi1zdGF0aWMgX1RDSEFSKiBob21lTXNnID0KLV9UX0VDTElQU0UoIlRoZSAlcyBleGVjdXRhYmxlIGxhdW5jaGVyIHdhcyB1bmFibGUgdG8gbG9jYXRlIGl0cyBcblwKLWhvbWUgZGlyZWN0b3J5LiIpOwotCi0jZGVmaW5lIE9MRF9TVEFSVFVQIAkJX1RfRUNMSVBTRSgic3RhcnR1cC5qYXIiKQotI2RlZmluZSBDTEFTU1BBVEhfUFJFRklYICAgICAgICBfVF9FQ0xJUFNFKCItRGphdmEuY2xhc3MucGF0aD0iKQotCi0vKiBEZWZpbmUgY29uc3RhbnRzIGZvciB0aGUgb3B0aW9ucyByZWNvZ25pemVkIGJ5IHRoZSBsYXVuY2hlci4gKi8KLSNkZWZpbmUgQ09OU09MRSAgICAgIF9UX0VDTElQU0UoIi1jb25zb2xlIikKLSNkZWZpbmUgQ09OU09MRUxPRyAgIF9UX0VDTElQU0UoIi1jb25zb2xlTG9nIikKLSNkZWZpbmUgREVCVUcgICAgICAgIF9UX0VDTElQU0UoIi1kZWJ1ZyIpCi0jZGVmaW5lIE9TICAgICAgICAgICBfVF9FQ0xJUFNFKCItb3MiKQotI2RlZmluZSBPU0FSQ0ggICAgICAgX1RfRUNMSVBTRSgiLWFyY2giKQotI2RlZmluZSBOT1NQTEFTSCAgICAgX1RfRUNMSVBTRSgiLW5vc3BsYXNoIikKLSNkZWZpbmUgTEFVTkNIRVIgICAgIF9UX0VDTElQU0UoIi1sYXVuY2hlciIpCi0jZGVmaW5lIFNIT1dTUExBU0ggICBfVF9FQ0xJUFNFKCItc2hvd3NwbGFzaCIpCi0jZGVmaW5lIEVYSVREQVRBICAgICBfVF9FQ0xJUFNFKCItZXhpdGRhdGEiKQotI2RlZmluZSBTVEFSVFVQICAgICAgX1RfRUNMSVBTRSgiLXN0YXJ0dXAiKQotI2RlZmluZSBWTSAgICAgICAgICAgX1RfRUNMSVBTRSgiLXZtIikKLSNkZWZpbmUgV1MgICAgICAgICAgIF9UX0VDTElQU0UoIi13cyIpCi0jZGVmaW5lIE5BTUUgICAgICAgICBfVF9FQ0xJUFNFKCItbmFtZSIpCi0jZGVmaW5lIFZNQVJHUyAgICAgICBfVF9FQ0xJUFNFKCItdm1hcmdzIikJCQkJCS8qIHNwZWNpYWwgb3B0aW9uIHByb2Nlc3NpbmcgcmVxdWlyZWQgKi8KLSNkZWZpbmUgQ1AJCQkgX1RfRUNMSVBTRSgiLWNwIikKLSNkZWZpbmUgQ0xBU1NQQVRIICAgIF9UX0VDTElQU0UoIi1jbGFzc3BhdGgiKQotI2RlZmluZSBKQVIgCQkgX1RfRUNMSVBTRSgiLWphciIpCi0KLSNkZWZpbmUgT1BFTkZJTEUJICBfVF9FQ0xJUFNFKCItLWxhdW5jaGVyLm9wZW5GaWxlIikKLSNkZWZpbmUgREVGQVVMVEFDVElPTiBfVF9FQ0xJUFNFKCItLWxhdW5jaGVyLmRlZmF1bHRBY3Rpb24iKQotI2RlZmluZSBUSU1FT1VUCQkgIF9UX0VDTElQU0UoIi0tbGF1bmNoZXIudGltZW91dCIpCi0jZGVmaW5lIExJQlJBUlkJCSAgX1RfRUNMSVBTRSgiLS1sYXVuY2hlci5saWJyYXJ5IikKLSNkZWZpbmUgU1VQUkVTU0VSUk9SUyBfVF9FQ0xJUFNFKCItLWxhdW5jaGVyLnN1cHByZXNzRXJyb3JzIikKLSNkZWZpbmUgSU5JCQkJICBfVF9FQ0xJUFNFKCItLWxhdW5jaGVyLmluaSIpCi0jZGVmaW5lIFNFQ09ORF9USFJFQUQgX1RfRUNMSVBTRSgiLS1sYXVuY2hlci5zZWNvbmRUaHJlYWQiKQotI2RlZmluZSBQRVJNX0dFTgkgIF9UX0VDTElQU0UoIi0tbGF1bmNoZXIuWFhNYXhQZXJtU2l6ZSIpCi0KLSNkZWZpbmUgWFhQRVJNR0VOCSAgX1RfRUNMSVBTRSgiLVhYOk1heFBlcm1TaXplPSIpCi0jZGVmaW5lIEFDVElPTl9PUEVORklMRSBfVF9FQ0xJUFNFKCJvcGVuRmlsZSIpCi0KLS8qIGNvbnN0YW50cyBmb3IgZWUgb3B0aW9ucyBmaWxlICovCi0jZGVmaW5lIEVFX0VYRUNVVEFCTEUgCQkJX1RfRUNMSVBTRSgiLURlZS5leGVjdXRhYmxlPSIpCi0jZGVmaW5lIEVFX0NPTlNPTEUgCV9UX0VDTElQU0UoIi1EZWUuZXhlY3V0YWJsZS5jb25zb2xlPSIpCi0jZGVmaW5lIEVFX1ZNX0xJQlJBUlkJCQlfVF9FQ0xJUFNFKCItRGVlLnZtLmxpYnJhcnk9IikKLSNkZWZpbmUgRUVfTElCUkFSWV9QQVRICQkJX1RfRUNMSVBTRSgiLURlZS5saWJyYXJ5LnBhdGg9IikKLSNkZWZpbmUgRUVfSE9NRQkJCQkJX1RfRUNMSVBTRSgiLURlZS5ob21lPSIpCi0jZGVmaW5lIEVFX0ZJTEVOQU1FCQkJCV9UX0VDTElQU0UoIi1EZWUuZmlsZW5hbWU9IikKLSNkZWZpbmUgRUVfSE9NRV9WQVIJCQkJX1RfRUNMSVBTRSgiJHtlZS5ob21lfSIpCi0KLS8qIERlZmluZSB0aGUgdmFyaWFibGVzIHRvIHJlY2VpdmUgdGhlIG9wdGlvbiB2YWx1ZXMuICovCi1zdGF0aWMgaW50ICAgICBuZWVkQ29uc29sZSAgID0gMDsJCQkJLyogVHJ1ZTogdXNlciB3YW50cyBhIGNvbnNvbGUJKi8KLXN0YXRpYyBpbnQgICAgIGRlYnVnICAgICAgICAgPSAwOwkJCQkvKiBUcnVlOiBvdXRwdXQgZGVidWdnaW5nIGluZm8JKi8KLXN0YXRpYyBpbnQgICAgIG5vU3BsYXNoICAgICAgPSAwOwkJCQkvKiBUcnVlOiBkbyBub3Qgc2hvdyBzcGxhc2ggd2luCSovCi1zdGF0aWMgaW50CSAgIHN1cHByZXNzRXJyb3JzID0gMDsJCQkJLyogVHJ1ZTogZG8gbm90IGRpc3BsYXkgZXJyb3JzIGRpYWxvZ3MgKi8KLSAgICAgICBpbnQgICAgIHNlY29uZFRocmVhZCAgPSAwOwkJCQkvKiBUcnVlOiBzdGFydCB0aGUgVk0gb24gYSBzZWNvbmQgdGhyZWFkICovCi0gICAgICAgCi1zdGF0aWMgX1RDSEFSKiAgc2hvd1NwbGFzaEFyZyA9IE5VTEw7CQkJLyogc2hvd3NwbGFzaCBkYXRhIChtYWluIGxhdW5jaGVyIHdpbmRvdykgKi8KLXN0YXRpYyBfVENIQVIqICBzcGxhc2hCaXRtYXAgID0gTlVMTDsJCQkvKiB0aGUgYWN0dWFsIHNwbGFzaCBiaXRtYXAgKi8KLXN0YXRpYyBfVENIQVIgKiBzdGFydHVwQXJnICAgID0gTlVMTDsJCQkvKiBwYXRoIG9mIHRoZSBzdGFydHVwLmphciB0aGUgdXNlciB3YW50cyB0byBydW4gcmVsYXRpdmUgdG8gdGhlIHByb2dyYW0gcGF0aCAqLwotc3RhdGljIF9UQ0hBUiogIHZtTmFtZSAgICAgICAgPSBOVUxMOyAgICAgCQkvKiBKYXZhIFZNIHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gcnVuICovCi1zdGF0aWMgX1RDSEFSKiAgbmFtZSAgICAgICAgICA9IE5VTEw7CQkJLyogcHJvZ3JhbSBuYW1lICovCQotc3RhdGljIF9UQ0hBUiogIHBlcm1HZW4gIAkgID0gTlVMTDsJCQkvKiBwZXJtIGdlbiBzaXplIGZvciBzdW4gKi8KLXN0YXRpYyBfVENIQVIqKiAgZmlsZVBhdGgJICA9IE5VTEw7CQkJLyogbGlzdCBvZiBmaWxlcyB0byBvcGVuICovCi1zdGF0aWMgX1RDSEFSKiAgdGltZW91dFN0cmluZyA9IE5VTEw7CQkJLyogdGltZW91dCB2YWx1ZSBmb3Igb3BlbmluZyBhIGZpbGUgKi8KLXN0YXRpYyBfVENIQVIqICBkZWZhdWx0QWN0aW9uID0gTlVMTDsJCQkvKiBkZWZhdWx0IGFjdGlvbiBmb3Igbm9uICctJyBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovIAotCi0vKiB2YXJpYWJsZXMgZm9yIGVlIG9wdGlvbnMgKi8KLXN0YXRpYyBfVENIQVIqIGVlRXhlY3V0YWJsZSA9IE5VTEw7Ci1zdGF0aWMgX1RDSEFSKiBlZUNvbnNvbGUgPSBOVUxMOwotc3RhdGljIF9UQ0hBUiogZWVMaWJyYXJ5ID0gTlVMTDsKLQotX1RDSEFSKiBlZUxpYlBhdGggPSBOVUxMOwkJCS8qIHRoaXMgb25lIGlzIGdsb2JhbCBzbyBvdGhlcnMgY2FuIHNlZSBpdCAqLwotX1RDSEFSKiAgZWNsaXBzZUxpYnJhcnkgPSBOVUxMOwkvKiB0aGUgc2hhcmVkIGxpYnJhcnkgKi8KLQotLyogRGVmaW5lIGEgdGFibGUgZm9yIHByb2Nlc3NpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMuICovCi10eXBlZGVmIHN0cnVjdAotewotCV9UQ0hBUiogIG5hbWU7CQkvKiB0aGUgb3B0aW9uIHJlY29nbml6ZWQgYnkgdGhlIGxhdW5jaGVyICovCi0Jdm9pZCogIHZhbHVlOwkJLyogdGhlIHZhcmlhYmxlIHdoZXJlIHRoZSBvcHRpb24gdmFsdWUgaXMgc2F2ZWQgKi8KLQkJCQkJCS8qIHZhbHVlIGlzIGEgX1RDSEFSKiogb3IgaW50KiBkZXBlbmRpbmcgb24gaWYgVkFMVUVfSVNfRkxBRyBpcyBzZXQgKi8KLQlpbnQgICAgZmxhZzsJCS8qIGZsYWdzICovCi0JaW50ICAgIHJlbW92ZTsJCS8qIHRoZSBudW1iZXIgb2YgYXJnbWVudHMgdG8gcmVtb3ZlIGZyb20gdGhlIGxpc3QsIC0xIGNhbiBiZSB1c2VkIHdpdGggVkFMVUVfSVNfTElTVCAqLwotfSBPcHRpb247Ci0KLS8qIGZsYWdzIGZvciB0aGUgT3B0aW9uIHN0cnVjdCAqLwotI2RlZmluZSBWQUxVRV9JU19GTEFHIAkxICAgLyogdmFsdWUgaXMgYW4gaW50KiwgaWYgbm90IHNldCwgdmFsdWUgaXMgYSBfVENIQVIqKiBvciBfVENIQVIqKiogKFZBTFVFX0lTX0xJU1QpICovCi0jZGVmaW5lIE9QVElPTkFMX1ZBTFVFICAyICAJLyogdmFsdWUgaXMgb3B0aW9uYWwsIGlmIG5leHQgYXJnIGRvZXMgbm90IHN0YXJ0IHdpdGggJy0nLCAqLwotCQkJCQkJCS8qIGRvbid0IGFzc2lnbiBpdCBhbmQgb25seSByZW1vdmUgKHJlbW92ZSAtIDEpIGFyZ3VtZW50cyAgKi8KLSNkZWZpbmUgQURKVVNUX1BBVEgJCTQgIAkvKiB2YWx1ZSBpcyBhIHBhdGgsIGRvIHByb2Nlc3Npbmcgb24gcmVsYXRpdmUgcGF0aHMgdG8gdHJ5IGFuZCBtYWtlIHRoZW0gYWJzb2x1dGUgKi8KLSNkZWZpbmUgVkFMVUVfSVNfTElTVAk4ICAJLyogdmFsdWUgaXMgYSBwb2ludGVyIHRvIGEgdG9rZW5pemVkIF9UQ0hBUiogc3RyaW5nIGZvciBFRSBmaWxlcywgb3IgYSBfVENIQVIqKiBsaXN0IGZvciB0aGUgY29tbWFuZCBsaW5lICovCi0KLXN0YXRpYyBPcHRpb24gb3B0aW9uc1tdID0gewotICAgIHsgQ09OU09MRSwJCSZuZWVkQ29uc29sZSwJVkFMVUVfSVNfRkxBRywJMCB9LAotICAgIHsgQ09OU09MRUxPRywJJm5lZWRDb25zb2xlLAlWQUxVRV9JU19GTEFHLAkwIH0sCi0gICAgeyBERUJVRywJCSZkZWJ1ZywJCQlWQUxVRV9JU19GTEFHLAkwIH0sCi0gICAgeyBOT1NQTEFTSCwgICAgICZub1NwbGFzaCwgICAgICBWQUxVRV9JU19GTEFHLAkxIH0sCi0gICAgeyBTVVBSRVNTRVJST1JTLCAmc3VwcHJlc3NFcnJvcnMsIFZBTFVFX0lTX0ZMQUcsIDF9LAotICAgIHsgU0VDT05EX1RIUkVBRCwgJnNlY29uZFRocmVhZCwgVkFMVUVfSVNfRkxBRywgIDEgfSwKLSAgICB7IExJQlJBUlksCQlOVUxMLAkJCTAsCQkJMiB9LCAvKiBsaWJyYXJ5IHdhcyBwYXJzZWQgYnkgZXhlLCBqdXN0IHJlbW92ZSBpdCAqLwotICAgIHsgSU5JLAkJCU5VTEwsIAkJCTAsCQkJMiB9LCAvKiBzYW1lIHdpdGggaW5pICovCi0gICAgeyBPUywJCQkmb3NBcmcsCQkJMCwJCQkyIH0sCi0gICAgeyBPU0FSQ0gsCQkmb3NBcmNoQXJnLAkJMCwJCQkyIH0sCi0gICAgeyBTSE9XU1BMQVNILCAgICZzaG93U3BsYXNoQXJnLAlPUFRJT05BTF9WQUxVRSwJMiB9LAotICAgIHsgU1RBUlRVUCwJCSZzdGFydHVwQXJnLAkwLAkJCTIgfSwKLSAgICB7IFZNLCAgICAgICAgICAgJnZtTmFtZSwJCTAsCQkJMiB9LAotICAgIHsgTkFNRSwgICAgICAgICAmbmFtZSwJCQkwLAkJCTIgfSwKLSAgICB7IFBFUk1fR0VOLAkJJnBlcm1HZW4sCQkwLAkJCTIgfSwKLSAgICB7IE9QRU5GSUxFLAkJJmZpbGVQYXRoLAkJQURKVVNUX1BBVEggfCBWQUxVRV9JU19MSVNULCAtMSB9LAotICAgIHsgVElNRU9VVCwJCSZ0aW1lb3V0U3RyaW5nLCAwLCAgICAgICAgICAyIH0sCi0gICAgeyBERUZBVUxUQUNUSU9OLCZkZWZhdWx0QWN0aW9uLCAwLAkJCTIgfSwKLSAgICB7IFdTLAkJCSZ3c0FyZywJCQkwLAkJCTIgfSB9Owotc3RhdGljIGludCBvcHRpb25zU2l6ZSA9IChzaXplb2Yob3B0aW9ucykgLyBzaXplb2Yob3B0aW9uc1swXSkpOwotCi1zdGF0aWMgT3B0aW9uIGVlT3B0aW9uc1tdID0gewotCXsgRUVfRVhFQ1VUQUJMRSwJJmVlRXhlY3V0YWJsZSwgCUFESlVTVF9QQVRILCAwIH0sCi0JeyBFRV9DT05TT0xFLAkgCSZlZUNvbnNvbGUsCQlBREpVU1RfUEFUSCwgMCB9LAotCXsgRUVfVk1fTElCUkFSWSwgCSZlZUxpYnJhcnksCQlBREpVU1RfUEFUSCwgMCB9LAotCXsgRUVfTElCUkFSWV9QQVRILAkmZWVMaWJQYXRoLCAJQURKVVNUX1BBVEggfCBWQUxVRV9JU19MSVNULCAwIH0KLX07Ci1zdGF0aWMgaW50IGVlT3B0aW9uc1NpemUgPSAoc2l6ZW9mKGVlT3B0aW9ucykgLyBzaXplb2YoZWVPcHRpb25zWzBdKSk7Ci0KLS8qIERlZmluZSB0aGUgcmVxdWlyZWQgVk0gYXJndW1lbnRzIChhbGwgcGxhdGZvcm1zKS4gKi8KLXN0YXRpYyBfVENIQVIqICBjcCA9IE5VTEw7Ci1zdGF0aWMgX1RDSEFSKiAgY3BWYWx1ZSA9IE5VTEw7CQkJCQkKLXN0YXRpYyBfVENIQVIqKiByZXFWTWFyZ1tdID0geyAmY3AsICZjcFZhbHVlLCBOVUxMIH07CS8qIHJlcXVpcmVkIFZNIGFyZ3MgKi8KLXN0YXRpYyBfVENIQVIqKiB1c2VyVk1hcmcgID0gTlVMTDsJICAgICAJCQkJLyogdXNlciBzcGVjaWZpYyBhcmdzIGZvciB0aGUgSmF2YSBWTSAgKi8KLXN0YXRpYyBfVENIQVIqKiBlZVZNYXJnID0gTlVMTDsJCQkJCQkJLyogdm0gYXJncyBzcGVjaWZpZWQgaW4gZWUgZmlsZSAqLwotc3RhdGljIGludCBuRUVhcmdzID0gMDsKLQotLyogTG9jYWwgbWV0aG9kcyAqLwotc3RhdGljIHZvaWQgICAgIHBhcnNlQXJncyggaW50KiBhcmdjLCBfVENIQVIqIGFyZ3ZbXSApOwotc3RhdGljIHZvaWQgCXByb2Nlc3NEZWZhdWx0QWN0aW9uKGludCBhcmdjLCBfVENIQVIqIGFyZ3ZbXSk7Ci1zdGF0aWMgdm9pZCAgICAgZ2V0Vk1Db21tYW5kKCBpbnQgbGF1bmNoTW9kZSwgaW50IGFyZ2MsIF9UQ0hBUiogYXJndltdLCBfVENIQVIgKip2bUFyZ3ZbXSwgX1RDSEFSICoqcHJvZ0FyZ3ZbXSApOwotc3RhdGljIGludCAJCWRldGVybWluZVZNKF9UQ0hBUioqIG1zZyk7Ci1zdGF0aWMgaW50IAkJdm1FRVByb3BzKF9UQ0hBUiogZWVGaWxlLCBfVENIQVIqKiBtc2cpOwotc3RhdGljIGludCAJCXByb2Nlc3NFRVByb3BzKF9UQ0hBUiogZWVGaWxlKTsKLXN0YXRpYyBfVENIQVIqKiBidWlsZExhdW5jaENvbW1hbmQoIF9UQ0hBUiogcHJvZ3JhbSwgX1RDSEFSKiogdm1BcmdzLCBfVENIQVIqKiBwcm9nQXJncyApOwotc3RhdGljIF9UQ0hBUioqIHBhcnNlQXJnTGlzdCggX1RDSEFSICpkYXRhICk7Ci1zdGF0aWMgX1RDSEFSKiAgZm9ybWF0Vm1Db21tYW5kTXNnKCBfVENIQVIqIGFyZ3NbXSwgX1RDSEFSKiB2bUFyZ3NbXSwgX1RDSEFSKiBwcm9nQXJnc1tdICk7Ci1zdGF0aWMgX1RDSEFSKiAgZ2V0RGVmYXVsdE9mZmljaWFsTmFtZSgpOwotc3RhdGljIF9UQ0hBUiogIGZpbmRTdGFydHVwSmFyKCk7Ci1zdGF0aWMgX1RDSEFSKiAgZmluZFNwbGFzaChfVENIQVIqIHNwbGFzaEFyZyk7Ci1zdGF0aWMgX1RDSEFSKiogZ2V0UmVsYXVuY2hDb21tYW5kKCBfVENIQVIgKip2bUNvbW1hbmQgKTsKLXN0YXRpYyBjb25zdCBfVENIQVIqIGdldFZNQXJjaCgpOwotCi0jaWZkZWYgX1dJTjMyCi1zdGF0aWMgdm9pZCAgICAgY3JlYXRlQ29uc29sZSgpOwotc3RhdGljIGludCAJCWlzQ29uc29sZUxhdW5jaGVyKCk7Ci0jZW5kaWYKLXN0YXRpYyBpbnQgICAgICBjb25zb2xlTGF1bmNoZXIgPSAwOwotCi0vKiBSZWNvcmQgdGhlIGFyZ3VtZW50cyB0aGF0IHdlcmUgdXNlZCB0byBzdGFydCB0aGUgb3JpZ2luYWwgZXhlY3V0YWJsZSAqLwotSk5JRVhQT1JUIHZvaWQgc2V0SW5pdGlhbEFyZ3MoaW50IGFyZ2MsIF9UQ0hBUioqIGFyZ3YsIF9UQ0hBUiogbGliKSB7Ci0JaW5pdGlhbEFyZ2MgPSBhcmdjOwotCWluaXRpYWxBcmd2ID0gYXJndjsKLQllY2xpcHNlTGlicmFyeSA9IGxpYjsKLX0KLQotLyogdGhpcyBtZXRob2QgbXVzdCBtYXRjaCB0aGUgUnVuTWV0aG9kIHR5cGVkZWYgaW4gZWNsaXBzZU1haW4uYyAqLwotLyogdm1BcmdzIG11c3QgYmUgTlVMTCB0ZXJtaW5hdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotSk5JRVhQT1JUIGludCBydW4oaW50IGFyZ2MsIF9UQ0hBUiogYXJndltdLCBfVENIQVIqIHZtQXJnc1tdKQotewotICAgIF9UQ0hBUioqICB2bUNvbW1hbmQgPSBOVUxMOwotICAgIF9UQ0hBUioqICB2bUNvbW1hbmRBcmdzID0gTlVMTDsKLSAgICBfVENIQVIqKiAgcHJvZ0NvbW1hbmRBcmdzID0gTlVMTDsKLSAgICBfVENIQVIqKiAgcmVsYXVuY2hDb21tYW5kID0gTlVMTDsKLSAgICBfVENIQVIqICAgZXJyb3JNc2cgPSBOVUxMLCAqbXNnID0gTlVMTDsKLSAgICBKYXZhUmVzdWx0cyogamF2YVJlc3VsdHMgPSBOVUxMOwotICAgIGludCAJICBsYXVuY2hNb2RlOwotICAgIGludCAJICBydW5uaW5nID0gMTsKLQkgCi0JLyogYXJnWzBdIHNob3VsZCBiZSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGlzIHByb2dyYW0uICovCi0gICAgcHJvZ3JhbSA9IF90Y3NkdXAoIGFyZ3ZbMF0gKTsKLQkKLSAgICAvKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIChsb29raW5nIGZvciB0aGUgVk0gdG8gdXNlKS4gKi8KLSAgICAvKiBPdmVycmlkZSBjb25maWd1cmF0aW9uIGZpbGUgYXJndW1lbnRzICovCi0gICAgcGFyc2VBcmdzKCAmYXJnYywgYXJndiApOwotCi0JLyogSW5pdGlhbGl6ZSBvZmZpY2lhbCBwcm9ncmFtIG5hbWUgKi8KLSAgIAlvZmZpY2lhbE5hbWUgPSBuYW1lICE9IE5VTEwgPyBfdGNzZHVwKCBuYW1lICkgOiBnZXREZWZhdWx0T2ZmaWNpYWxOYW1lKCk7Ci0gICAgCi0gICAJaWYgKGRlZmF1bHRBY3Rpb24gIT0gTlVMTCkgewotICAgCQlwcm9jZXNzRGVmYXVsdEFjdGlvbihpbml0aWFsQXJnYywgaW5pdGlhbEFyZ3YpOwotICAgCX0KLSAgIAkKLSAgIAkvKiB0cnkgdG8gb3BlbiB0aGUgc3BlY2lmaWVkIGZpbGUgaW4gYW4gYWxyZWFkeSBydW5uaW5nIGVjbGlwc2UgKi8KLSAgIAkvKiBvbiBNYWMgd2UgYXJlIG9ubHkgcmVnaXN0ZXJpbmcgYW4gZXZlbnQgaGFuZGxlciBoZXJlLCBhbHdheXMgZG8gdGhpcyAqLwotI2lmbmRlZiBNQUNPU1gKLQlpZiAoZmlsZVBhdGggIT0gTlVMTCAmJiBmaWxlUGF0aFswXSAhPSBOVUxMKQotI2VuZGlmCi0JewotCQlpbnQgdGltZW91dCA9IDYwOwotCQlpZiAodGltZW91dFN0cmluZyAhPSBOVUxMKQotCQkJX3N0c2NhbmYodGltZW91dFN0cmluZywgX1RfRUNMSVBTRSgiJWQiKSwgJnRpbWVvdXQpOwotCQlpZiAocmV1c2VXb3JrYmVuY2goZmlsZVBhdGgsIHRpbWVvdXQpID4gMCkKLQkJCXJldHVybiAwOwotCX0KLQotI2lmZGVmIE1BQ09TWAotICAgCS8qIE1vc3QgcGxhdGZvcm1zLCB3ZSB3aWxsIGluaXRpYWxpemUgdGhlIHdpbmRvdyBzeXN0ZW0gbGF0ZXIgYmVmb3JlIHRyeWluZyB0byBkbyBhbnkKLSAgIAkgKiBncmFwaGljcy4gIE9uIE1hYywgd2UgbmVlZCBpdCBpbml0aWFsaXplZCB0byBnZXQgdGhlIGRvY2sgaWNvbiBwcm9wZXJseSwgc28gYWx3YXlzIGRvIAotICAgCSAqIGl0IG5vdy4KLSAgIAkgKi8KLSAgICBpbml0V2luZG93U3lzdGVtKCAmYXJnYywgYXJndiwgIW5vU3BsYXNoICk7Ci0jZWxpZiBfV0lOMzIKLSAgICAvKiB0aGlzIG11c3QgYmUgYmVmb3JlIGRvaW5nIGFueSBjb25zb2xlIHN0dWZmLCBwbGF0Zm9ybXMgb3RoZXIgdGhhbiB3aW4zMiBsZWF2ZSB0aGlzIHNldCB0byAwICovCi0gICAgY29uc29sZUxhdW5jaGVyID0gaXNDb25zb2xlTGF1bmNoZXIoKTsKLSNlbmRpZgotICAgIAotICAgIC8qIEZpbmQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgRWNsaXBzZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4gKi8KLSAgICBwcm9ncmFtRGlyID0gZ2V0UHJvZ3JhbURpcigpOwotICAgIGlmIChwcm9ncmFtRGlyID09IE5VTEwpCi0gICAgewotICAgICAgICBlcnJvck1zZyA9IG1hbGxvYyggKF90Y3NsZW4oaG9tZU1zZykgKyBfdGNzbGVuKG9mZmljaWFsTmFtZSkgKyAxMCkgKiBzaXplb2YoX1RDSEFSKSApOwotICAgICAgICBfc3RwcmludGYoIGVycm9yTXNnLCBob21lTXNnLCBvZmZpY2lhbE5hbWUgKTsKLSAgICAgICAgaWYgKCFzdXBwcmVzc0Vycm9ycykKLSAgICAgICAgCWRpc3BsYXlNZXNzYWdlKCBvZmZpY2lhbE5hbWUsIGVycm9yTXNnICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgCV9mdHByaW50ZihzdGRlcnIsIF9UX0VDTElQU0UoIiVzOlxuJXNcbiIpLCBvZmZpY2lhbE5hbWUsIGVycm9yTXNnKTsgCi0gICAgICAgIGZyZWUoIGVycm9yTXNnICk7Ci0gICAgCWV4aXQoIDEgKTsKLSAgICB9Ci0KLSAgICAvKiBwbGF0Zm9ybSBzcGVjaWZpYyBwcm9jZXNzaW5nIG9mIHVzZXIncyB2bWFyZ3MgKi8KLSAgICBwcm9jZXNzVk1BcmdzKCZ2bUFyZ3MpOwotICAgIGxhdW5jaE1vZGUgPSBkZXRlcm1pbmVWTSgmbXNnKTsKLSAgICBpZiAobGF1bmNoTW9kZSA9PSAtMSkgewotICAgIAkvKiBwcm9ibGVtICovCi0gICAgCWVycm9yTXNnID0gbWFsbG9jKChfdGNzbGVuKG5vVk1Nc2cpICsgX3Rjc2xlbihvZmZpY2lhbE5hbWUpICsgX3Rjc2xlbihtc2cpICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0gICAgCV9zdHByaW50ZiggZXJyb3JNc2csIG5vVk1Nc2csIG9mZmljaWFsTmFtZSwgbXNnICk7Ci0gICAgCWlmICghc3VwcHJlc3NFcnJvcnMpCi0gICAgCQlkaXNwbGF5TWVzc2FnZSggb2ZmaWNpYWxOYW1lLCBlcnJvck1zZyApOwotICAgIAllbHNlCi0gICAgCQlfZnRwcmludGYoc3RkZXJyLCBfVF9FQ0xJUFNFKCIlczpcbiVzXG4iKSwgb2ZmaWNpYWxOYW1lLCBlcnJvck1zZyk7Ci0gICAgCWZyZWUoIGVycm9yTXNnICk7Ci0gICAgCWZyZWUoIG1zZyApOwotICAgIAlleGl0KDEpOwotCX0JCi0JCi0JLyogRmluZCB0aGUgc3RhcnR1cC5qYXIgKi8KLQlqYXJGaWxlID0gZmluZFN0YXJ0dXBKYXIoKTsKLQlpZihqYXJGaWxlID09IE5VTEwpIHsKLQkJZXJyb3JNc2cgPSBtYWxsb2MoIChfdGNzbGVuKHN0YXJ0dXBNc2cpICsgX3Rjc2xlbihvZmZpY2lhbE5hbWUpICsgMTApICogc2l6ZW9mKF9UQ0hBUikgKTsKLSAgICAgICAgX3N0cHJpbnRmKCBlcnJvck1zZywgc3RhcnR1cE1zZywgb2ZmaWNpYWxOYW1lICk7Ci0gICAgICAgIGlmICghc3VwcHJlc3NFcnJvcnMpCi0gICAgCQlkaXNwbGF5TWVzc2FnZSggb2ZmaWNpYWxOYW1lLCBlcnJvck1zZyApOwotICAgIAllbHNlCi0gICAgCQlfZnRwcmludGYoc3RkZXJyLCBfVF9FQ0xJUFNFKCIlczpcbiVzXG4iKSwgb2ZmaWNpYWxOYW1lLCBlcnJvck1zZyk7Ci0gICAgICAgIGZyZWUoIGVycm9yTXNnICk7Ci0gICAgCWV4aXQoIDEgKTsKLQl9Ci0KLSNpZmRlZiBfV0lOMzIKLQlpZiggbGF1bmNoTW9kZSA9PSBMQVVOQ0hfSk5JICYmIChkZWJ1ZyB8fCBuZWVkQ29uc29sZSkgKSB7Ci0JCWNyZWF0ZUNvbnNvbGUoKTsKLQl9Ci0jZW5kaWYKLQotICAgIC8qIElmIHRoZSBzaG93c3BsYXNoIG9wdGlvbiB3YXMgZ2l2ZW4gYW5kIHdlIGFyZSB1c2luZyBKTkkgKi8KLSAgICBpZiAoIW5vU3BsYXNoICYmIHNob3dTcGxhc2hBcmcgJiYgbGF1bmNoTW9kZSA9PSBMQVVOQ0hfSk5JKQotICAgIHsKLSAgICAJc3BsYXNoQml0bWFwID0gZmluZFNwbGFzaChzaG93U3BsYXNoQXJnKTsKLSAgICAJaWYgKHNwbGFzaEJpdG1hcCAhPSBOVUxMKSB7Ci0JICAgIAlzaG93U3BsYXNoKHNwbGFzaEJpdG1hcCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgLyogbm90IHVzaW5nIEpOSSBsYXVuY2hpbmcsIG5lZWQgc29tZSBzaGFyZWQgZGF0YSAqLwotICAgIGlmIChsYXVuY2hNb2RlID09IExBVU5DSF9FWEUgJiYgY3JlYXRlU2hhcmVkRGF0YSggJnNoYXJlZElELCBNQVhfU0hBUkVEX0xFTkdUSCApKSB7Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAJaWYgKCFzdXBwcmVzc0Vycm9ycykgCi0gICAgICAgIAkJZGlzcGxheU1lc3NhZ2UoIG9mZmljaWFsTmFtZSwgc2hhcmVNc2cgKTsKLSAgICAgICAgCWVsc2UKLSAgICAgICAgICAgCQlfZnRwcmludGYoc3RkZXJyLCBfVF9FQ0xJUFNFKCIlczpcbiVzXG4iKSwgb2ZmaWNpYWxOYW1lLCBzaGFyZU1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JLyogdGhlIHN0YXJ0dXAgamFyRmlsZSBnb2VzIG9uIHRoZSBjbGFzc3BhdGggKi8KLSAgICBpZiAobGF1bmNoTW9kZSA9PSBMQVVOQ0hfSk5JKSB7Ci0gICAgCS8qIEpOSSBsYXVuY2hpbmcsIGNsYXNzcGF0aCBpcyBzZXQgdXNpbmcgLURqYXZhLmNsYXNzLnBhdGggKi8KLQkJY3AgPSBtYWxsb2MoKF90Y3NsZW4oQ0xBU1NQQVRIX1BSRUZJWCkgKyBfdGNzbGVuKGphckZpbGUpICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0JCWNwID0gX3Rjc2NweShjcCwgQ0xBU1NQQVRIX1BSRUZJWCk7Ci0JCV90Y3NjYXQoY3AsIGphckZpbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgCS8qIGV4ZWMgamF2YSwgamFyIGlzIHNwZWNpZmllZCB3aXRoIC1qYXIgKi8KLSAgICAJY3AgPSBKQVI7Ci0gICAgCWNwVmFsdWUgPSBtYWxsb2MoKF90Y3NsZW4oamFyRmlsZSkgKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLSAgICAJX3Rjc2NweShjcFZhbHVlLCBqYXJGaWxlKTsKLSAgICB9Ci0JCi0gICAgLyogR2V0IHRoZSBjb21tYW5kIHRvIHN0YXJ0IHRoZSBKYXZhIFZNLiAqLwotICAgIHVzZXJWTWFyZyA9IHZtQXJnczsKLSAgICBnZXRWTUNvbW1hbmQoIGxhdW5jaE1vZGUsIGFyZ2MsIGFyZ3YsICZ2bUNvbW1hbmRBcmdzLCAmcHJvZ0NvbW1hbmRBcmdzICk7Ci0JCi0gICAgaWYgKGxhdW5jaE1vZGUgPT0gTEFVTkNIX0VYRSkgewotICAgIAl2bUNvbW1hbmQgPSBidWlsZExhdW5jaENvbW1hbmQoamF2YVZNLCB2bUNvbW1hbmRBcmdzLCBwcm9nQ29tbWFuZEFyZ3MpOwotICAgIH0KLSAgICAKLSAgICAvKiBXaGlsZSB0aGUgSmF2YSBWTSBzaG91bGQgYmUgcmVzdGFydGVkICovCi0gICAgd2hpbGUocnVubmluZykKLSAgICB7Ci0JCW1zZyA9IGZvcm1hdFZtQ29tbWFuZE1zZyggdm1Db21tYW5kLCB2bUNvbW1hbmRBcmdzLCBwcm9nQ29tbWFuZEFyZ3MgKTsKLQkJaWYgKGRlYnVnKSBfdHByaW50ZiggZ29WTU1zZywgbXNnICk7Ci0KLQkJaWYobGF1bmNoTW9kZSA9PSBMQVVOQ0hfSk5JKSB7Ci0JCQlqYXZhUmVzdWx0cyA9IHN0YXJ0SmF2YVZNKGpuaUxpYiwgdm1Db21tYW5kQXJncywgcHJvZ0NvbW1hbmRBcmdzLCBqYXJGaWxlKTsKLQkJfSBlbHNlIHsKLQkJCWphdmFSZXN1bHRzID0gbGF1bmNoSmF2YVZNKHZtQ29tbWFuZCk7Ci0JCX0KLQkJCi0JCWlmIChqYXZhUmVzdWx0cyA9PSBOVUxMKSB7Ci0JCQkvKiBzaG91bGRuJ3QgaGFwcGVuLCBidXQganVzdCBpbiBjYXNlICovCi0JCQlqYXZhUmVzdWx0cyA9IG1hbGxvYyhzaXplb2YoSmF2YVJlc3VsdHMpKTsKLQkJCWphdmFSZXN1bHRzLT5sYXVuY2hSZXN1bHQgPSAtMTE7Ci0JCQlqYXZhUmVzdWx0cy0+cnVuUmVzdWx0ID0gMDsKLQkJCWphdmFSZXN1bHRzLT5lcnJvck1lc3NhZ2UgPSBfdGNzZHVwKGphdmFGYWlsdXJlTXNnKTsKLQkJfQotCQkKLQkgICAgc3dpdGNoKCBqYXZhUmVzdWx0cy0+bGF1bmNoUmVzdWx0ICsgamF2YVJlc3VsdHMtPnJ1blJlc3VsdCApIHsKLQkgICAgICAgIGNhc2UgMDogLyogbm9ybWFsIGV4aXQgKi8KLQkgICAgICAgIAlydW5uaW5nID0gMDsKLQkgICAgICAgICAgICBicmVhazsKLQkgICAgICAgIGNhc2UgUkVTVEFSVF9MQVNUX0VDOgotCSAgICAgICAgCWlmIChsYXVuY2hNb2RlID09IExBVU5DSF9KTkkpIHsKLQkJICAgICAgICAJLyogY29weSBmb3IgcmVsYXVuY2gsICsxIHRvIGVuc3VyZSBOVUxMIHRlcm1pbmF0ZWQgKi8KLQkJICAgICAgICAJcmVsYXVuY2hDb21tYW5kID0gbWFsbG9jKChpbml0aWFsQXJnYyArIDEpICogc2l6ZW9mKF9UQ0hBUiopKTsKLQkJICAgICAgICAJbWVtY3B5KHJlbGF1bmNoQ29tbWFuZCwgaW5pdGlhbEFyZ3YsIChpbml0aWFsQXJnYyArIDEpICogc2l6ZW9mKF9UQ0hBUiopKTsKLQkJICAgICAgICAJcmVsYXVuY2hDb21tYW5kW2luaXRpYWxBcmdjXSA9IDA7Ci0JCSAgICAgICAgCXJlbGF1bmNoQ29tbWFuZFswXSA9IHByb2dyYW07Ci0JCSAgICAgICAgCXJ1bm5pbmcgPSAwOwotCSAgICAgICAgCX0KLQkgICAgICAgIAlicmVhazsKLQkgICAgICAgIAkKLQkgICAgICAgIGNhc2UgUkVTVEFSVF9ORVdfRUM6Ci0JICAgICAgICAJaWYobGF1bmNoTW9kZSA9PSBMQVVOQ0hfRVhFKSB7Ci0JICAgICAgICAJCWlmIChleGl0RGF0YSAhPSBOVUxMKSBmcmVlKGV4aXREYXRhKTsKLQkgICAgICAgIAkJaWYgKGdldFNoYXJlZERhdGEoIHNoYXJlZElELCAmZXhpdERhdGEgKSAhPSAwKQotCSAgICAgICAgCQkJZXhpdERhdGEgPSBOVUxMOwotCSAgICAgICAgCX0KLQkgICAgICAgICAgICBpZiAoZXhpdERhdGEgIT0gMCkgewotCSAgICAgICAgICAgIAlpZiAodm1Db21tYW5kICE9IE5VTEwpIGZyZWUoIHZtQ29tbWFuZCApOwotCSAgICAgICAgICAgICAgICB2bUNvbW1hbmQgPSBwYXJzZUFyZ0xpc3QoIGV4aXREYXRhICk7Ci0JICAgICAgICAgICAgICAgIGlmIChsYXVuY2hNb2RlID09IExBVU5DSF9KTkkpIHsKLQkgICAgICAgICAgICAgICAgCXJlbGF1bmNoQ29tbWFuZCA9IGdldFJlbGF1bmNoQ29tbWFuZCh2bUNvbW1hbmQpOwotCSAgICAgICAgICAgICAgICAJcnVubmluZyA9IDA7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgIAlydW5uaW5nID0gMDsKLQkgICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7Ci0JICAgICAgICAgICAgICAgIAlpZiAoIXN1cHByZXNzRXJyb3JzKSAKLSAgICAgICAgCSAgICAgICAgCQlkaXNwbGF5TWVzc2FnZSggb2ZmaWNpYWxOYW1lLCBzaGFyZU1zZyApOwotICAgICAgICAJICAgICAgICAJZWxzZQotICAgICAgICAJICAgICAgICAgICAJCV9mdHByaW50ZihzdGRlcnIsIF9UX0VDTElQU0UoIiVzOlxuJXNcbiIpLCBvZmZpY2lhbE5hbWUsIHNoYXJlTXNnKTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBicmVhazsKLQkJCWRlZmF1bHQ6IHsKLQkJCQlfVENIQVIgKnRpdGxlID0gX3Rjc2R1cChvZmZpY2lhbE5hbWUpOwotCSAgICAgICAgICAgIHJ1bm5pbmcgPSAwOwotCSAgICAgICAgICAgIGVycm9yTXNnID0gTlVMTDsKLQkgICAgICAgICAgICBpZiAobGF1bmNoTW9kZSA9PSBMQVVOQ0hfRVhFKSB7Ci0JICAgICAgICAgICAgCWlmIChleGl0RGF0YSAhPSBOVUxMKSBmcmVlKGV4aXREYXRhKTsKLQkgICAgICAgIAkJaWYgKGdldFNoYXJlZERhdGEoIHNoYXJlZElELCAmZXhpdERhdGEgKSAhPSAwKQotCSAgICAgICAgCQkJZXhpdERhdGEgPSBOVUxMOwotCSAgICAgICAgCX0KLQkgICAgICAgICAgICBpZiAoZXhpdERhdGEgIT0gMCkgewotCSAgICAgICAgICAgIAllcnJvck1zZyA9IGV4aXREYXRhOwotCSAgICAgICAgICAgIAlleGl0RGF0YSA9IE5VTEw7Ci0JICAgICAgICAgICAgICAgIGlmIChfdGNzbGVuKCBlcnJvck1zZyApID4gMCkgewotCSAgICAgICAgICAgICAgICAgICAgX1RDSEFSICpzdHI7Ci0JICAgICAgICAgICAgICAgIAlpZiAoX3Rjc25jbXAoZXJyb3JNc2csIF9UX0VDTElQU0UoIjx0aXRsZT4iKSwgX3Rjc2xlbihfVF9FQ0xJUFNFKCI8dGl0bGU+IikpKSA9PSAwKSB7Ci0JCQkJCQkJc3RyID0gX3Rjc3N0cihlcnJvck1zZywgX1RfRUNMSVBTRSgiPC90aXRsZT4iKSk7Ci0JCQkJCQkJaWYgKHN0ciAhPSBOVUxMKSB7Ci0JCQkJCQkJCWZyZWUoIHRpdGxlICk7Ci0JCQkJCQkJCXN0clswXSA9IF9UX0VDTElQU0UoJ1wwJyk7Ci0JCQkJCQkJCXRpdGxlID0gX3Rjc2R1cCggZXJyb3JNc2cgKyBfdGNzbGVuKF9UX0VDTElQU0UoIjx0aXRsZT4iKSkgKTsKLQkJCQkJCQkJc3RyID0gX3Rjc2R1cCggc3RyICsgX3Rjc2xlbihfVF9FQ0xJUFNFKCI8L3RpdGxlPiIpKSApOwotCQkJCQkJCQlmcmVlKCBlcnJvck1zZyApOwotCQkJCQkJCQllcnJvck1zZyA9IHN0cjsKLQkJCQkJCQl9Ci0JICAgICAgICAgICAgICAgIAl9Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgIAkgaWYgKGRlYnVnKSB7Ci0JICAgICAgICAgICAgICAgIAlpZiAoIXN1cHByZXNzRXJyb3JzKSAKLSAgICAgICAgCSAgICAgICAgCQlkaXNwbGF5TWVzc2FnZSggdGl0bGUsIHNoYXJlTXNnICk7Ci0gICAgICAgIAkgICAgICAgIAllbHNlCi0gICAgICAgIAkgICAgICAgICAgIAkJX2Z0cHJpbnRmKHN0ZGVyciwgX1RfRUNMSVBTRSgiJXM6XG4lc1xuIiksIHRpdGxlLCBzaGFyZU1zZyk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKGVycm9yTXNnID09IE5VTEwpIHsKLQkgICAgICAgICAgICAJaWYgKGphdmFSZXN1bHRzLT5ydW5SZXN1bHQpIHsKLQkgICAgICAgICAgICAJCS8qIGphdmEgd2FzIHN0YXJ0ZWQgb2ssIGJ1dCByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUgKi8KLQkgICAgICAgICAgICAJCWVycm9yTXNnID0gbWFsbG9jKCAoX3Rjc2xlbihyZXR1cm5Db2RlTXNnKSArIF90Y3NsZW4obXNnKSArIDEwKSAqc2l6ZW9mKF9UQ0hBUikpOwotCSAgICAgICAgICAgIAkJX3N0cHJpbnRmKGVycm9yTXNnLCByZXR1cm5Db2RlTXNnLGphdmFSZXN1bHRzLT5ydW5SZXN1bHQsIG1zZyk7Ci0JICAgICAgICAgICAgCX0gZWxzZSBpZiAoamF2YVJlc3VsdHMtPmVycm9yTWVzc2FnZSAhPSBOVUxMKXsKLQkgICAgICAgICAgICAJCS8qIGVsc2Ugd2UgaGFkIGEgcHJvYmxlbSBsYXVuY2hpbmcgamF2YSwgdXNlIGN1c3RvbSBlcnJvciBtZXNzYWdlICovCi0JICAgICAgICAgICAgCQllcnJvck1zZyA9IGphdmFSZXN1bHRzLT5lcnJvck1lc3NhZ2U7Ci0JICAgICAgICAgICAgCX0gZWxzZSB7Ci0JICAgICAgICAgICAgCQkvKiBubyBjdXN0b20gbWVzc2FnZSwgdXNlIGdlbmVyaWMgbWVzc2FnZSAqLwotCQkJCQkJZXJyb3JNc2cgPSBtYWxsb2MoIChfdGNzbGVuKGV4aXRNc2cpICsgX3Rjc2xlbihtc2cpICsgMTApICogc2l6ZW9mKF9UQ0hBUikgKTsKLQkJCQkJCV9zdHByaW50ZiggZXJyb3JNc2csIGV4aXRNc2csIGphdmFSZXN1bHRzLT5sYXVuY2hSZXN1bHQsIG1zZyApOwotCSAgICAgICAgICAgIAl9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIGlmIChfdGNzbGVuKGVycm9yTXNnKSA+IDApIHsKLQkJICAgICAgICAgICAgaWYgKCFzdXBwcmVzc0Vycm9ycykKLQkJICAgICAgICAgICAgCWRpc3BsYXlNZXNzYWdlKCB0aXRsZSwgZXJyb3JNc2cgKTsKLQkJICAgICAgICAgICAgZWxzZSAKLQkJICAgICAgICAgICAgCV9mdHByaW50ZihzdGRlcnIsIF9UX0VDTElQU0UoIiVzOlxuJXNcbiIpLCB0aXRsZSwgZXJyb3JNc2cpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBmcmVlKCBlcnJvck1zZyApOwotCSAgICAgICAgICAgIGZyZWUoIHRpdGxlICk7Ci0JICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICB9Ci0JICAgIH0KLQkgICAgZnJlZSggbXNnICk7Ci0gICAgfQotCi0gICAgaWYocmVsYXVuY2hDb21tYW5kICE9IE5VTEwpCi0gICAgCXJlc3RhcnRMYXVuY2hlcihOVUxMLCByZWxhdW5jaENvbW1hbmQpOwotICAgIAkKLSAgICBpZiAobGF1bmNoTW9kZSA9PSBMQVVOQ0hfSk5JKQotICAgIAljbGVhbnVwVk0oamF2YVJlc3VsdHMtPmxhdW5jaFJlc3VsdCA/IGphdmFSZXN1bHRzLT5sYXVuY2hSZXN1bHQgOiBqYXZhUmVzdWx0cy0+cnVuUmVzdWx0KTsKLSAgICAKLSAgICBpZiAoc2hhcmVkSUQgIT0gTlVMTCkgewotICAgIAlkZXN0cm95U2hhcmVkRGF0YSggc2hhcmVkSUQgKTsKLSAgICAJZnJlZSggc2hhcmVkSUQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyogQ2xlYW51cCB0aW1lLiAqLwotICAgIGZyZWUoIHZtQ29tbWFuZEFyZ3MgKTsKLSAgICBmcmVlKCBwcm9nQ29tbWFuZEFyZ3MgKTsKLSAgICBmcmVlKCBqYXJGaWxlICk7Ci0gICAgZnJlZSggcHJvZ3JhbURpciApOwotICAgIGZyZWUoIHByb2dyYW0gKTsKLSAgICBmcmVlKCBvZmZpY2lhbE5hbWUgKTsKLSAgICBpZiAoIHZtQ29tbWFuZCAhPSBOVUxMICkJIGZyZWUoIHZtQ29tbWFuZCApOwotICAgIGlmICggbGF1bmNoTW9kZSA9PSBMQVVOQ0hfSk5JICkgZnJlZSggY3AgKTsKLSAgICBpZiAoIGNwVmFsdWUgIT0gTlVMTCkJCSBmcmVlKCBjcFZhbHVlICk7Ci0gICAgaWYgKCBleGl0RGF0YSAhPSBOVUxMICkJCSBmcmVlKCBleGl0RGF0YSApOwotICAgIGlmICggc3BsYXNoQml0bWFwICE9IE5VTEwgKSAgZnJlZSggc3BsYXNoQml0bWFwICk7Ci0KLSAgICBpZiAoamF2YVJlc3VsdHMgPT0gTlVMTCkKLSAgICAJcmV0dXJuIC0xOwotICAgIAotICAgIC8qIHJldXNlIHRoZSBydW5uaW5nIHZhcmlhYmxlIGZvciBjb252ZW5pZW5jZSAqLwotICAgIHJ1bm5pbmcgPSBqYXZhUmVzdWx0cy0+bGF1bmNoUmVzdWx0ICE9IDAgPyBqYXZhUmVzdWx0cy0+bGF1bmNoUmVzdWx0IDogamF2YVJlc3VsdHMtPnJ1blJlc3VsdDsKLSAgICBmcmVlKGphdmFSZXN1bHRzKTsKLSAgICByZXR1cm4gcnVubmluZzsKLX0KLQotc3RhdGljIF9UQ0hBUioqIGJ1aWxkTGF1bmNoQ29tbWFuZCggX1RDSEFSKiBwcm9ncmFtLCBfVENIQVIqKiB2bUFyZ3MsIF9UQ0hBUioqIHByb2dBcmdzICkgewotCWludCBuVk0gPSAtMSwgblByb2cgPSAtMTsKLQlfVENIQVIqKiByZXN1bHQ7Ci0JCi0Jd2hpbGUodm1BcmdzWysrblZNXSAhPSBOVUxMKSB7fQotCXdoaWxlKHByb2dBcmdzWysrblByb2ddICE9IE5VTEwpIHt9Ci0JCi0JcmVzdWx0ID0gbWFsbG9jKChuVk0gKyBuUHJvZyArIDIpICogc2l6ZW9mKF9UQ0hBUiopKTsKLQltZW1zZXQocmVzdWx0LCAwLCAoblZNICsgblByb2cgKyAyKSAqIHNpemVvZihfVENIQVIqKSk7Ci0JcmVzdWx0WzBdID0gcHJvZ3JhbTsKLQltZW1jcHkocmVzdWx0ICsgMSwgdm1BcmdzLCBuVk0gKiBzaXplb2YoX1RDSEFSKikpOwotCW1lbWNweShyZXN1bHQgKyAxICsgblZNLCBwcm9nQXJncywgblByb2cgKiBzaXplb2YoX1RDSEFSKikpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NEZWZhdWx0QWN0aW9uKGludCBhcmdjLCBfVENIQVIqIGFyZ3ZbXSkgewotCS8qIHNjYW4gdGhlIGFyZyBsaXN0LCBubyBkZWZhdWx0IGlmIGFueSBzdGFydCB3aXRoICctJyAqLwotCWludCBpID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCWlmIChhcmd2W2ldWzBdID09IF9UX0VDTElQU0UoJy0nKSkKLQkJCXJldHVybjsKLQl9Ci0JLyogYXJndlswXSBpcyB0aGUgcHJvZ3JhbSAoZWNsaXBzZSksICB3ZSBwcm9jZXNzIHRoZSBkZWZhdWx0IGFjdGlvbnMgYnkgaW5zZXJ0aW5nCi0JICogdGhlIGFwcHJvcHJpYXRlIC1hcmd1bWVudCBhdCBhcmd2WzFdCi0JICovCi0JaWYgKGFyZ2MgPD0gMSkKLQkJcmV0dXJuOwotCi0JaWYgKF90Y3NpY21wKGRlZmF1bHRBY3Rpb24sIEFDVElPTl9PUEVORklMRSkgPT0gMCkgewotCQlpbnQgbmV3QXJnYyA9IGFyZ2MgKyAxOwotCQlfVENIQVIgKiogbmV3QXJndiA9IG1hbGxvYygobmV3QXJnYyArIDEpICogc2l6ZW9mKF9UQ0hBUiopKTsKLQkJbmV3QXJndlswXSA9IGFyZ3ZbMF07Ci0JCW5ld0FyZ3ZbMV0gPSBPUEVORklMRTsKLQkJbWVtY3B5KCZuZXdBcmd2WzJdLCAmYXJndlsxXSwgYXJnYyAqIHNpemVvZihfVENIQVIqKSk7Ci0JCXBhcnNlQXJncygmbmV3QXJnYywgbmV3QXJndik7Ci0JCWZyZWUobmV3QXJndik7Ci0JfQotfQotCi0vKgotICogUGFyc2UgYXJndW1lbnRzIG9mIHRoZSBjb21tYW5kLgotICovCi1zdGF0aWMgdm9pZCBwYXJzZUFyZ3MoaW50KiBwQXJnYywgX1RDSEFSKiBhcmd2W10pIHsKLQlPcHRpb24qIG9wdGlvbjsKLQlpbnQgcmVtQXJnczsKLQlpbnQgaW5kZXg7Ci0JaW50IGk7Ci0JX1RDSEFSICogYzsKLQotCS8qIEZvciBlYWNoIHVzZXIgZGVmaW5lZCBhcmd1bWVudCAoZXhjbHVkaW5nIHRoZSBwcm9ncmFtKSAqLwotCWZvciAoaW5kZXggPSAxOyBpbmRleCA8ICpwQXJnYzsgaW5kZXgrKykgewotCQlyZW1BcmdzID0gMDsKLQotCQkvKiBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGlzIGEgb3B0aW9uIHN1cHBvcnRlZCBieSB0aGUgbGF1bmNoZXIgKi8KLQkJb3B0aW9uID0gTlVMTDsKLQkJZm9yIChpID0gMDsgb3B0aW9uID09IE5VTEwgJiYgaSA8IG9wdGlvbnNTaXplOyBpKyspIHsKLQkJCWlmIChfdGNzaWNtcChhcmd2W2luZGV4XSwgb3B0aW9uc1tpXS5uYW1lKSA9PSAwKSB7Ci0JCQkJb3B0aW9uID0gJm9wdGlvbnNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBJZiB0aGUgb3B0aW9uIGlzIHJlY29nbml6ZWQgYnkgdGhlIGxhdW5jaGVyICovCi0JCWlmIChvcHRpb24gIT0gTlVMTCkgewotCQkJaW50IG9wdGlvbmFsID0gMDsKLQkJCWMgPSBvcHRpb24tPm5hbWU7Ci0JCQkvKiBJZiB0aGUgb3B0aW9uIHJlcXVpcmVzIGEgdmFsdWUgYW5kIHRoZXJlIGlzIG9uZSwgZXh0cmFjdCB0aGUgdmFsdWUuICovCi0JCQlpZiAob3B0aW9uLT52YWx1ZSAhPSBOVUxMKSB7Ci0JCQkJaWYgKG9wdGlvbi0+ZmxhZyAmIFZBTFVFX0lTX0ZMQUcpCi0JCQkJCSooKGludCAqKSBvcHRpb24tPnZhbHVlKSA9IDE7Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBjb3VudCA9IDE7Ci0JCQkJCWlmIChvcHRpb24tPmZsYWcgJiBWQUxVRV9JU19MSVNUKSB7Ci0JCQkJCQkvKiBjb3VudCBob3cgbWFueSBhcmdzLCB0aGlzIGlzIHRoZSAtYXJndW1lbnQgaXRzZWxmICsgZm9sbG93aW5nIHRoZSBub24nLScgYXJncyAqLwotCQkJCQkJd2hpbGUoY291bnQgKyBpbmRleCA8ICpwQXJnYyAmJiBhcmd2W2NvdW50ICsgaW5kZXhdWzBdICE9IF9UX0VDTElQU0UoJy0nKSkKLQkJCQkJCQljb3VudCsrOwotCQkJCQkJCi0JCQkJCQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgX1RDSEFSKiBsaXN0IGFuZCBpbml0aWFsaXplIGl0IHdpdGggTlVMTHMqLwotCQkJCQkJKigodm9pZCoqKSBvcHRpb24tPnZhbHVlKSA9IG1hbGxvYyhjb3VudCAqIHNpemVvZihfVENIQVIgKikpOwotCQkJCQkJbWVtc2V0KCooKHZvaWQgKiopIG9wdGlvbi0+dmFsdWUpLCAwLCBjb3VudCAqIHNpemVvZihfVENIQVIgKikpOwotCQkJCQkJCi0JCQkJCQlpZiAob3B0aW9uLT5yZW1vdmUgIT0gMCkKLQkJCQkJCQlvcHRpb24tPnJlbW92ZSA9IGNvdW50OwotCQkJCQl9Ci0KLQkJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJCWlmICgoaW5kZXggKyBpICsgMSkgPCAqcEFyZ2MpIHsKLQkJCQkJCQlfVENIQVIgKiBuZXh0ID0gYXJndltpbmRleCArIGkgKyAxXTsKLQkJCQkJCQlpZiAob3B0aW9uLT5mbGFnICYgQURKVVNUX1BBVEgpCi0JCQkJCQkJCW5leHQgPSBjaGVja1BhdGgobmV4dCwgZ2V0UHJvZ3JhbURpcigpLCAwKTsKLQkJCQkJCQlpZiAobmV4dFswXSAhPSBfVF9FQ0xJUFNFKCctJykpIHsKLQkJCQkJCQkJaWYgKG9wdGlvbi0+ZmxhZyAmIFZBTFVFX0lTX0xJU1QpCi0JCQkJCQkJCQkoKigoX1RDSEFSKioqKSBvcHRpb24tPnZhbHVlKSlbaV0gPSBuZXh0OwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkqKChfVENIQVIqKikgb3B0aW9uLT52YWx1ZSkgPSBuZXh0OwotCQkJCQkJCX0gZWxzZSBpZiAob3B0aW9uLT5mbGFnICYgT1BUSU9OQUxfVkFMVUUpewotCQkJCQkJCQkvKiB2YWx1ZSB3YXMgb3B0aW9uYWwsIGFuZCB0aGUgbmV4dCBhcmcgc3RhcnRzIHdpdGggJy0nICovCi0JCQkJCQkJCW9wdGlvbmFsID0gMTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIElmIHRoZSBvcHRpb24gcmVxdWlyZXMgYSBmbGFnIHRvIGJlIHNldCwgc2V0IGl0LiAqLwotCQkJcmVtQXJncyA9IG9wdGlvbi0+cmVtb3ZlIC0gb3B0aW9uYWw7Ci0JCX0KLQotCQkvKiBSZW1vdmUgYW55IG1hdGNoZWQgYXJndW1lbnRzIGZyb20gdGhlIGxpc3QuICovCi0JCWlmIChyZW1BcmdzID4gMCkgewotCQkJZm9yIChpID0gKGluZGV4ICsgcmVtQXJncyk7IGkgPD0gKnBBcmdjOyBpKyspIHsKLQkJCQlhcmd2W2kgLSByZW1BcmdzXSA9IGFyZ3ZbaV07Ci0JCQl9Ci0JCQlpbmRleC0tOwotCQkJKnBBcmdjIC09IHJlbUFyZ3M7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBQYXJzZSB0aGUgZGF0YSBpbnRvIGEgbGlzdCBvZiBhcmd1bWVudHMgc2VwYXJhdGVkIGJ5IFxuLgotICovCi1zdGF0aWMgX1RDSEFSKiogcGFyc2VBcmdMaXN0KCBfVENIQVIqIGRhdGEgKSB7Ci0gICAgaW50IHRvdGFsQXJncyA9IDAsIGRzdCA9IDA7Ci0gICAgc2l6ZV90IGxlbmd0aDsKLSAgICBfVENIQVIgKmNoMSwgKmNoMiwgKipleGVjQXJnOwotICAgIGxlbmd0aCA9IF90Y3NsZW4oIGRhdGEgKTsKLSAgICBjaDEgPSBjaDIgPSBkYXRhOwotICAgIHdoaWxlICgoY2gyID0gX3Rjc2NociggY2gxLCBfVF9FQ0xJUFNFKCdcbicpICkpICE9IE5VTEwpIHsKLSAgICAJdG90YWxBcmdzKys7Ci0gICAgCWNoMSA9IGNoMiArIDE7Ci0gICAgfQotICAgIGlmIChjaDEgIT0gZGF0YSArIGxlbmd0aCkgdG90YWxBcmdzKys7Ci0gICAgZXhlY0FyZyA9IG1hbGxvYyggKHRvdGFsQXJncyArIDEpICogc2l6ZW9mKCBfVENIQVIqICkgKTsKLSAgICBjaDEgPSBjaDIgPSBkYXRhOwotICAgIHdoaWxlICgoY2gyID0gX3Rjc2NociggY2gxLCBfVF9FQ0xJUFNFKCdcbicpICkpICE9IE5VTEwpIHsKLSAgICAJZXhlY0FyZ1sgZHN0KysgXSA9IGNoMTsKLSAgICAJY2gyWyAwIF0gPSBfVF9FQ0xJUFNFKCdcMCcpOwotICAgIAljaDEgPSBjaDIgKyAxOwotICAgIH0KLSAgICBpZiAoY2gxICE9IGRhdGEgKyBsZW5ndGgpIGV4ZWNBcmdbIGRzdCsrIF0gPSBjaDE7Ci0gICAgZXhlY0FyZ1sgZHN0KysgXSA9IE5VTEw7Ci0gICAgcmV0dXJuIGV4ZWNBcmc7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkanVzdFZNQXJncyggX1RDSEFSICpqYXZhVk0sIF9UQ0hBUiAqam5pTGliLCBfVENIQVIgKip2bUFyZ3ZbXSApIHsKLQkvKiBTdW4gVk1zIG5lZWQgc29tZSBleHRyYSBwZXJtIGdlbiBzcGFjZSAqLwotCWlmIChwZXJtR2VuICE9IE5VTEwgJiYgaXNTdW5WTShqYXZhVk0sIGpuaUxpYikpIHsKLQkJaW50IHNwZWNpZmllZCA9IDAsIGkgPSAtMTsKLQkJCi0JCS8qIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhbHJlYWR5IHNwZWNpZmllZCAqLwotCQl3aGlsZSAoICgqdm1Bcmd2KVsrK2ldICE9IE5VTEwpIHsKLQkJCS8qIHdlIGFyZSBhbHNvIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgYXJncyBoZXJlICovCi0JCQlpZiAoIXNwZWNpZmllZCAmJiBfdGNzbmNtcCgoKnZtQXJndilbaV0sIFhYUEVSTUdFTiwgX3Rjc2xlbihYWFBFUk1HRU4pKSA9PSAwKSB7Ci0JCQkJc3BlY2lmaWVkID0gMTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCFzcGVjaWZpZWQpIHsKLQkJCV9UQ0hBUiAqKiBvbGRBcmdzID0gKnZtQXJndjsKLQkJCV9UQ0hBUiAqbmV3QXJnID0gbWFsbG9jKChfdGNzbGVuKFhYUEVSTUdFTikgKyBfdGNzbGVuKHBlcm1HZW4pICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0JCQlfc3RwcmludGYobmV3QXJnLCBfVF9FQ0xJUFNFKCIlcyVzIiksIFhYUEVSTUdFTiwgcGVybUdlbik7Ci0JCQkKLQkJCSp2bUFyZ3YgPSBtYWxsb2MoKGkgKyAyKSAqIHNpemVvZihfVENIQVIgKikpOwotCQkJbWVtY3B5KCp2bUFyZ3YsIG9sZEFyZ3MsIGkgKiBzaXplb2YoX1RDSEFSICopKTsKLQkJCSgqdm1Bcmd2KVtpXSA9IG5ld0FyZzsKLQkJCSgqdm1Bcmd2KVtpICsgMV0gPSAwOwotCQl9Ci0JfQotfQotLyoKLSAqIEdldCB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHN0YXJ0IHRoZSBKYXZhIFZNLgotICoKLSAqIE1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBhc3N1bWVkIHRvIGJlCi0gKiBkZWFsbG9jYXRlZCB3aGVuIHRoZSBwcm9ncmFtIHRlcm1pbmF0ZXMuCi0gKgotICogU29tZSBvZiB0aGUgYXJndW1lbnRzIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gd2VyZQotICogcGFzc2VkIGRpcmVjdGx5IGZyb20gdGhlIG1haW4oIGFyZ3YgKSBhcnJheSBzbyB0aGV5Ci0gKiBzaG91bGQgbm90IGJlIGRlYWxsb2NhdGVkLgotICogCi0gKiBBcmd1bWVudHMgYXJlIHNwbGl0IGludG8gMjogdm0gYXJndW1lbnRzIGFuZCBwcm9ncmFtIGFyZ3VtZW50cwotICovCi1zdGF0aWMgdm9pZCBnZXRWTUNvbW1hbmQoIGludCBsYXVuY2hNb2RlLCBpbnQgYXJnYywgX1RDSEFSKiBhcmd2W10sIF9UQ0hBUiAqKnZtQXJndltdLCBfVENIQVIgKipwcm9nQXJndltdICkKLXsKLQlfVENIQVIqKiB2bUFyZzsKLSAgICBpbnQgICAgIG5SZXFWTWFyZyA9IDA7Ci0gICAgaW50ICAgICBuVk1hcmcgPSAwOwotICAgIGludCAgICAgdG90YWxWTUFyZ3M7Ci0gICAgaW50CQl0b3RhbFByb2dBcmdzOwotICAgIGludCAgICAgc3JjOwotICAgIGludCAgICAgZHN0OwotCi0JLyogSWYgdGhlIHVzZXIgc3BlY2lmaWVkICItdm1hcmdzIiwgYWRkIHRoZW0gaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBWTSBhcmdzLiAqLwotCXZtQXJnID0gKHVzZXJWTWFyZyAhPSBOVUxMKSA/IHVzZXJWTWFyZyA6IGdldEFyZ1ZNKCAobGF1bmNoTW9kZSA9PSBMQVVOQ0hfSk5JKSA/IGpuaUxpYiA6IGphdmFWTSApOyAKLSAJCi0JYWRqdXN0Vk1BcmdzKGphdmFWTSwgam5pTGliLCAmdm1BcmcpOwotCQotIAkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBWTSBhcmd1bWVudHMuICovCi0gCXdoaWxlICh2bUFyZ1sgblZNYXJnIF0gIT0gTlVMTCkKLSAJCW5WTWFyZysrOwotCi0gCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIFZNIGFyZ3VtZW50cy4gKi8KLSAJd2hpbGUgKHJlcVZNYXJnWyBuUmVxVk1hcmcgXSAhPSBOVUxMKQotIAkJblJlcVZNYXJnKys7Ci0KLQkvKiBWTSBhcmd1bWVudCBsaXN0ICovCi0JdG90YWxWTUFyZ3MgPSBuVk1hcmcgKyBuUmVxVk1hcmcgKyBuRUVhcmdzICsgMTsKLQkqdm1Bcmd2ID0gbWFsbG9jKCB0b3RhbFZNQXJncyAqIHNpemVvZihfVENIQVIqKSApOwotCQotCWRzdCA9IDA7Ci0JZm9yIChzcmMgPSAwOyBzcmMgPCBuVk1hcmc7IHNyYysrKXsKLQkJLyppZiB0aGUgdXNlciBzcGVjaWZpZWQgYSBjbGFzc3BhdGgsIHNraXAgaXQgKi8KLQkJaWYoX3Rjc2NtcCh2bUFyZ1tzcmNdLCBjcCkgPT0gMCl7Ci0JCQlzcmMrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0gICAgCSgqdm1Bcmd2KVsgZHN0KysgXSA9IHZtQXJnWyBzcmMgXTsKLQl9Ci0KLQlpZiAoZWVWTWFyZyAhPSBOVUxMKQotCQlmb3IgKHNyYyA9IDA7IHNyYyA8IG5FRWFyZ3M7IHNyYysrKQotCQkJKCp2bUFyZ3YpWyBkc3QrKyBdID0gZWVWTWFyZ1sgc3JjIF07Ci0JCi0JLyogRm9yIGVhY2ggcmVxdWlyZWQgVk0gYXJnICovCi0JZm9yIChzcmMgPSAwOyBzcmMgPCBuUmVxVk1hcmc7IHNyYysrKQotCQlpZiggKihyZXFWTWFyZ1tzcmNdKSAhPSBOVUxMKQotCQkJKCp2bUFyZ3YpWyBkc3QrKyBdID0gKihyZXFWTWFyZ1sgc3JjIF0pOwotCQotCQotCSgqdm1Bcmd2KVtkc3RdID0gTlVMTDsKLQkKLQkvKiBQcm9ncmFtIGFyZ3VtZW50cyAqLwotICAgIC8qICBPUyA8b3M+ICsgV1MgPHdzPiArIEFSQ0ggPGFyY2g+ICsgTEFVTkNIRVIgPGxhdW5jaGVyPiArIE5BTUUgPG9mZmljaWFsTmFtZT4gKwotICAgICAqICArIExJQlJBUlkgPGxpYnJhcnk+ICsgU0hPV1NQTEFTSCA8Y21kPiArIEVYSVREQVRBIDxjbWQ+ICsgU1RBUlRVUCA8amFyPiArIGFyZ3ZbXSArIFZNICsgPHZtPiArIAotICAgICAqIFZNQVJHUyArIHZtQXJnICsgcmVxdWlyZWRWTWFyZ3MKLSAgICAgKiAgKyBOVUxMKQotICAgICAqLwotICAgIHRvdGFsUHJvZ0FyZ3MgID0gMiArIDIgKyAyICsgMiArIDIgKyAyICsgMiArIDIgKyAyICsgYXJnYyArIDIgKyAxICsgblZNYXJnICsgbkVFYXJncyArIG5SZXFWTWFyZyArIDE7Ci0JKnByb2dBcmd2ID0gbWFsbG9jKCB0b3RhbFByb2dBcmdzICogc2l6ZW9mKCBfVENIQVIqICkgKTsKLSAgICBkc3QgPSAwOwotICAgIAotICAgIC8qIEFwcGVuZCB0aGUgcmVxdWlyZWQgb3B0aW9ucy4gKi8KLSAgICAoKnByb2dBcmd2KVsgZHN0KysgXSA9IE9TOwotICAgICgqcHJvZ0FyZ3YpWyBkc3QrKyBdID0gb3NBcmc7Ci0gICAgKCpwcm9nQXJndilbIGRzdCsrIF0gPSBXUzsKLSAgICAoKnByb2dBcmd2KVsgZHN0KysgXSA9IHdzQXJnOwotICAgIGlmIChfdGNzbGVuKG9zQXJjaEFyZykgPiAwKSB7Ci0gICAgICAgICgqcHJvZ0FyZ3YpWyBkc3QrKyBdID0gT1NBUkNIOwotICAgICAgICAoKnByb2dBcmd2KVsgZHN0KysgXSA9IG9zQXJjaEFyZzsKLSAgICB9Ci0KLQkvKiBBcHBlbmQgdGhlIHNob3cgc3BsYXNoIHdpbmRvdyBjb21tYW5kLCBpZiBkZWZpbmVkLiAqLwotICAgIGlmICghbm9TcGxhc2gpCi0gICAgewotICAgICAgICAoKnByb2dBcmd2KVsgZHN0KysgXSA9IFNIT1dTUExBU0g7Ci0gICAgICAgIGlmKHNwbGFzaEJpdG1hcCAhPSBOVUxMKQotICAgICAgICAJKCpwcm9nQXJndilbIGRzdCsrIF0gPSBzcGxhc2hCaXRtYXA7Ci0gICAgfQotICAgIAotCS8qIEFwcGVuZCB0aGUgbGF1bmNoZXIgY29tbWFuZCAqLwotCSgqcHJvZ0FyZ3YpWyBkc3QrKyBdID0gTEFVTkNIRVI7Ci0JKCpwcm9nQXJndilbIGRzdCsrIF0gPSBwcm9ncmFtOwotCi0JLyogQXBwZW5kIHRoZSBuYW1lIGNvbW1hbmQgKi8KLQkoKnByb2dBcmd2KVsgZHN0KysgXSA9IE5BTUU7Ci0JKCpwcm9nQXJndilbIGRzdCsrIF0gPSAJb2ZmaWNpYWxOYW1lOwotCQotCS8qIEFuZCB0aGUgc2hhcmVkIGxpYnJhcnkgKi8KLQlpZiAoZWNsaXBzZUxpYnJhcnkgIT0gTlVMTCkgewotCQkoKnByb2dBcmd2KVsgZHN0KysgXSA9IExJQlJBUlk7Ci0JCSgqcHJvZ0FyZ3YpWyBkc3QrKyBdID0gZWNsaXBzZUxpYnJhcnk7Ci0JfQotCQotCS8qIHRoZSBzdGFydHVwIGphciAqLwotCSgqcHJvZ0FyZ3YpWyBkc3QrKyBdID0gU1RBUlRVUDsKLQkoKnByb2dBcmd2KVsgZHN0KysgXSA9IGphckZpbGU7Ci0gICAgCi0JLyogQXBwZW5kIHRoZSBleGl0IGRhdGEgY29tbWFuZC4gKi8KLQlpZiAoc2hhcmVkSUQpIHsKLQkJKCpwcm9nQXJndilbIGRzdCsrIF0gPSBFWElUREFUQTsKLQkJKCpwcm9nQXJndilbIGRzdCsrIF0gPSBzaGFyZWRJRDsKLQl9Ci0KLQkvKiBBcHBlbmQgdGhlIHJlbWFpbmluZyB1c2VyIGRlZmluZWQgYXJndW1lbnRzLiAqLwotICAgIGZvciAoc3JjID0gMTsgc3JjIDwgYXJnYzsgc3JjKyspCi0gICAgewotICAgICAgICAoKnByb2dBcmd2KVsgZHN0KysgXSA9IGFyZ3ZbIHNyYyBdOwotICAgIH0KLQotICAgIC8qIEFwcGVuZCBWTSBhbmQgVk1BUkdTIHRvIGJlIGFibGUgdG8gcmVsYXVuY2ggdXNpbmcgZXhpdCBkYXRhLiAqLwotCSgqcHJvZ0FyZ3YpWyBkc3QrKyBdID0gVk07Ci0JaWYoam5pTGliICE9IE5VTEwpCi0JCSgqcHJvZ0FyZ3YpWyBkc3QrKyBdID0gam5pTGliOwotCWVsc2UKLQkJKCpwcm9nQXJndilbIGRzdCsrIF0gPSBqYXZhVk07Ci0gICAgKCpwcm9nQXJndilbIGRzdCsrIF0gPSBWTUFSR1M7Ci0gICAgCi0JZm9yIChzcmMgPSAwOyBzcmMgPCBuVk1hcmc7IHNyYysrKQotICAgIAkoKnByb2dBcmd2KVsgZHN0KysgXSA9IHZtQXJnWyBzcmMgXTsKLQkKLQlpZiAoZWVWTWFyZyAhPSBOVUxMKQotCQlmb3IgKHNyYyA9IDA7IHNyYyA8IG5FRWFyZ3M7IHNyYysrKQotCQkJKCpwcm9nQXJndilbIGRzdCsrIF0gPSBlZVZNYXJnWyBzcmMgXTsKLQkKLSAgICAvKiBGb3IgZWFjaCByZXF1aXJlZCBWTSBhcmcgKi8KLSAgICBmb3IgKHNyYyA9IDA7IHNyYyA8IG5SZXFWTWFyZzsgc3JjKyspCi0gICAgCWlmICgqKHJlcVZNYXJnW3NyY10pICE9IE5VTEwpCi0gICAgCQkoKnByb2dBcmd2KVsgZHN0KysgXSA9ICoocmVxVk1hcmdbIHNyYyBdKTsKLQotICAgICgqcHJvZ0FyZ3YpWyBkc3QrKyBdID0gTlVMTDsKLQotIH0KLQotIC8qIEZvcm1hdCB0aGUgSlZNIHN0YXJ0IGNvbW1hbmQgZm9yIGVycm9yIG1lc3NhZ2VzCi0gICoKLSAgKiBUaGlzIG1ldGhvZCBmb3JtYXRzIGEgc3RyaW5nIHdpdGggdGhlIEpWTSBzdGFydCBjb21tYW5kIChhbmQgYWxsIGFyZ3VtZW50cykKLSAgKiB0aGF0IGNhbiBiZSB1c2VkIGluIGRpc3BsYXlpbmcgZXJyb3IgbWVzc2FnZXMuIFRoZSBzdHJpbmcgcmV0dXJuZWQgZnJvbSB0aGlzCi0gICogbWV0aG9kIGlzIHByb2JhYmx5IG5vdCBOTFMgY29tcGxpYW50IGFuZCBtdXN0IGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0gICogCi0gICogVGhlIGFyZ3VtZW50cyBpbiB0aGUgbWVzc2FnZSBhcmUgZWl0aGVyIGFyZ3MgKGlmIG5vdCBudWxsKSBvciB0aGUgY29tYmluYXRpb24gCi0gICogb2Ygdm1BcmdzICsgcHJvZ0FyZ3MKLSAgKi8KLXN0YXRpYyBfVENIQVIqICBmb3JtYXRWbUNvbW1hbmRNc2coIF9UQ0hBUiogYXJnc1tdLCBfVENIQVIqIHZtQXJnc1tdLCBfVENIQVIqIHByb2dBcmdzW10gKQotewotCWludCAgIGluZGV4OwotICAgIHNpemVfdCBsZW5ndGggPSAwOwotICAgIF9UQ0hBUioqIGxpc3Q7Ci0gICAgX1RDSEFSKiBjaDsKLSAgICBfVENIQVIqIG1lc3NhZ2U7Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBidWZmZXIuICovCi0JaWYoYXJncyAhPSBOVUxMKSBsaXN0ID0gYXJnczsKLQllbHNlICAgICAgICAgICAgIGxpc3QgPSB2bUFyZ3M7Ci0Jd2hpbGUobGlzdCAhPSBOVUxMKSB7Ci0JCWZvciAoaW5kZXggPSAwOyBsaXN0W2luZGV4XSAhPSBOVUxMOyBpbmRleCsrKQotCQl7Ci0JCQlsZW5ndGggKz0gX3Rjc2xlbihsaXN0W2luZGV4XSkgKyAxOwotCQl9Ci0JCWlmKGxpc3QgPT0gdm1BcmdzKSBsaXN0ID0gcHJvZ0FyZ3M7Ci0JCWVsc2UgCQkJICAgbGlzdCA9IE5VTEw7Ci0JfQotCW1lc3NhZ2UgPSBtYWxsb2MoIChsZW5ndGggKyA1KSAqIHNpemVvZihfVENIQVIpICk7Ci0JCi0JLyogRm9ybWF0IHRoZSBtZXNzYWdlIHN1Y2ggdGhhdCBvcHRpb25zIChhcmdzIHN0YXJ0aW5nIHdpdGggJy0nKSBiZWdpbgotCSAgIG9uIGEgbmV3IGxpbmUuIE90aGVyd2lzZSwgdGhlIE1vdGlmIE1lc3NhZ2VCb3ggZG9lcyBub3QgYXV0b21hdGljYWxseSB3cmFwCi0JICAgdGhlIG1lc3NhZ2VzIGFuZCB0aGUgbWVzc2FnZSB3aW5kb3cgY2FuIGV4dGVuZCBiZXlvbmQgYm90aCBzaWRlcyBvZiB0aGUgZGlzcGxheS4gKi8KLQljaCA9IG1lc3NhZ2U7Ci0JaWYoYXJncyAhPSBOVUxMKSBsaXN0ID0gYXJnczsKLQllbHNlICAgICAgICAgICAgIGxpc3QgPSB2bUFyZ3M7Ci0Jd2hpbGUobGlzdCAhPSBOVUxMKSB7Ci0JCWZvciAoaW5kZXggPSAwOyBsaXN0W2luZGV4XSAhPSBOVUxMOyBpbmRleCsrKQotCQl7Ci0JCQlpZiAoY2ggIT0gbWVzc2FnZSAmJiBsaXN0W2luZGV4XVswXSA9PSBfVF9FQ0xJUFNFKCctJykgJiYgKihjaC0xKSA9PSBfVF9FQ0xJUFNFKCcgJykpCi0JCQkJKihjaC0xKSA9IF9UX0VDTElQU0UoJ1xuJyk7Ci0JCQlfdGNzY3B5KCBjaCwgbGlzdFtpbmRleF0gKTsKLQkJCWNoICs9IF90Y3NsZW4oIGxpc3RbaW5kZXhdICk7Ci0JCQkqY2grKyA9IF9UX0VDTElQU0UoJyAnKTsKLQkJfQotCQlpZihsaXN0ID09IHZtQXJncykgbGlzdCA9IHByb2dBcmdzOwotCQllbHNlIAkJCSAgIGxpc3QgPSBOVUxMOwotCX0KLQkqY2ggPSBfVF9FQ0xJUFNFKCdcMCcpOwotCi0JcmV0dXJuIG1lc3NhZ2U7Ci19Ci0KLV9UQ0hBUiogZ2V0T2ZmaWNpYWxOYW1lKCkgewotCXJldHVybiBvZmZpY2lhbE5hbWU7Ci19Ci0KLXZvaWQgc2V0T2ZmaWNpYWxOYW1lKF9UQ0hBUiogbmFtZSkgewotCW9mZmljaWFsTmFtZSA9IG5hbWU7Ci19Ci0KLV9UQ0hBUiogZ2V0UHJvZ3JhbVBhdGgoKSB7Ci0JcmV0dXJuIHByb2dyYW07Ci19Ci0KLXZvaWQgc2V0UHJvZ3JhbVBhdGgoX1RDSEFSKiBwYXRoKSB7Ci0JcHJvZ3JhbSA9IHBhdGg7Ci19Ci0KLS8qCi0gKiBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgb2ZmaWNpYWwgYXBwbGljYXRpb24gbmFtZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gbmFtZSB0aGF0IGFwcGVhcnMgaW4gYSB2YXJpZXR5IG9mCi0gKiBwbGFjZXMgc3VjaCBhczogdGl0bGUgb2YgbWVzc2FnZSBkaWFsb2csIHRpdGxlIG9mIHNwbGFzaCBzY3JlZW4gd2luZG93Ci0gKiB0aGF0IHNob3dzIHVwIGluIFdpbmRvd3MgdGFzayBiYXIuCi0gKiBJdCBpcyBjb21wdXRlZCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBsYXVuY2hlciBleGVjdXRhYmxlIGFuZAotICogYnkgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBsZXR0ZXIuIGUuZy4gImM6L2lkZS9lY2xpcHNlLmV4ZSIgcHJvdmlkZXMKLSAqIGEgZGVmYXVsdCBuYW1lIG9mICJFY2xpcHNlIi4KLSAqLwotc3RhdGljIF9UQ0hBUiogZ2V0RGVmYXVsdE9mZmljaWFsTmFtZSgpCi17Ci0JX1RDSEFSICpjaCA9IE5VTEw7Ci0JCi0JLyogU2tpcCB0aGUgZGlyZWN0b3J5IHBhcnQgKi8KLQljaCA9IGxhc3REaXJTZXBhcmF0b3IoIHByb2dyYW0gKTsKLQlpZiAoY2ggPT0gTlVMTCkgY2ggPSBwcm9ncmFtOwotCWVsc2UgY2grKzsKLQkKLQljaCA9IF90Y3NkdXAoIGNoICk7Ci0jaWZkZWYgX1dJTjMyCi0JewotCQkvKiBTZWFyY2ggZm9yIHRoZSBleHRlbnNpb24gLmV4ZSBhbmQgY3V0IGl0ICovCi0JCV9UQ0hBUiAqZXh0ZW5zaW9uID0gX3Rjc3JjaHIoY2gsIF9UX0VDTElQU0UoJy4nKSk7Ci0JCWlmIChleHRlbnNpb24gIT0gTlVMTCkgCi0JCXsKLQkJCSpleHRlbnNpb24gPSBfVF9FQ0xJUFNFKCdcMCcpOwotCQl9Ci0JfQotI2VuZGlmCi0JLyogVXBwZXIgY2FzZSB0aGUgZmlyc3QgY2hhcmFjdGVyICovCi0jaWZuZGVmIExJTlVYCi0JewotCQkqY2ggPSBfdG90dXBwZXIoKmNoKTsKLQl9Ci0jZWxzZQotCXsKLQkJaWYgKCpjaCA+PSAnYScgJiYgKmNoIDw9ICd6JykKLQkJewotCQkJKmNoIC09IDMyOwotCQl9Ci0JfQotI2VuZGlmCi0JcmV0dXJuIGNoOwotfQotCi0vKiBEZXRlcm1pbmUgdGhlIFByb2dyYW0gRGlyZWN0b3J5Ci0gKgotICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHByb2dyYW0gZXhlY3V0YWJsZSByZXNpZGVzIGFuZAotICogZGV0ZXJtaW5lcyB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLSAqLwotX1RDSEFSKiBnZXRQcm9ncmFtRGlyKCApCi17Ci0JX1RDSEFSKiAgY2g7Ci0JX1RDSEFSKiAgcHJvZ3JhbURpcjsKLQlpZiAocHJvZ3JhbSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLSAgICBwcm9ncmFtRGlyID0gbWFsbG9jKCAoX3Rjc2xlbiggcHJvZ3JhbSApICsgMSkgKiBzaXplb2YoX1RDSEFSKSApOwotICAgIF90Y3NjcHkoIHByb2dyYW1EaXIsIHByb2dyYW0gKTsKLSAgICBjaCA9IGxhc3REaXJTZXBhcmF0b3IoIHByb2dyYW1EaXIgKTsKLQlpZiAoY2ggIT0gTlVMTCkKLSAgICB7Ci0gICAgCSooY2grMSkgPSBfVF9FQ0xJUFNFKCdcMCcpOwotICAgCQlyZXR1cm4gcHJvZ3JhbURpcjsKLSAgICB9Ci0KLSAgICBmcmVlKCBwcm9ncmFtRGlyICk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBfVENIQVIqIGZpbmRTcGxhc2goX1RDSEFSKiBzcGxhc2hBcmcpIHsKLQlzdHJ1Y3QgX3N0YXQgc3RhdHM7Ci0JX1RDSEFSICpjaDsKLQlfVENIQVIgKnBhdGgsICpwcmVmaXg7Ci0Jc2l6ZV90IGxlbmd0aDsKLQkKLQlpZiAoc3BsYXNoQXJnID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCQotCXNwbGFzaEFyZyA9IF90Y3NkdXAoc3BsYXNoQXJnKTsKLQlsZW5ndGggPSBfdGNzbGVuKHNwbGFzaEFyZyk7Ci0JLyogX3RzdGF0IGRvZXNuJ3Qgc2VlbSB0byBsaWtlIGRpclNlcGFyYXRvcnMgb24gdGhlIGVuZCAqLwotCXdoaWxlIChJU19ESVJfU0VQQVJBVE9SKHNwbGFzaEFyZ1tsZW5ndGggLSAxXSkpIHsKLQkJc3BsYXNoQXJnWy0tbGVuZ3RoXSA9IDA7Ci0JfQotCQotCS8qIGRvZXMgc3BsYXNoQXJnIGV4aXN0ICovCi0JaWYgKF90c3RhdChzcGxhc2hBcmcsICZzdGF0cykgPT0gMCkgewotCQkvKiBwb2ludGluZyB0byBhIGZpbGUgKi8KLQkJaWYgKHN0YXRzLnN0X21vZGUgJiBTX0lGUkVHKSB7IAotCQkJLyogZmlsZSwgdXNlIGl0Ki8KLQkJCXJldHVybiBzcGxhc2hBcmc7Ci0JCX0gZWxzZSBpZiAoc3RhdHMuc3RfbW9kZSAmIFNfSUZESVIpIHsgCi0JCQkvKmRpcmVjdG9yeSwgbG9vayBmb3Igc3BsYXNoLmJtcCovCi0JCQljaCA9IG1hbGxvYyggKGxlbmd0aCArIDEyKSAqIHNpemVvZihfVENIQVIpKTsKLQkJCV9zdHByaW50ZiggY2gsIF9UX0VDTElQU0UoIiVzJWMlcyIpLCBzcGxhc2hBcmcsIGRpclNlcGFyYXRvciwgX1RfRUNMSVBTRSgic3BsYXNoLmJtcCIpICk7Ci0JCQlpZiAoX3RzdGF0KGNoLCAmc3RhdHMpID09IDAgJiYgc3RhdHMuc3RfbW9kZSAmIFNfSUZSRUcpIHsKLQkJCQlmcmVlKHNwbGFzaEFyZyk7Ci0JCQkJcmV0dXJuIGNoOwotCQkJfQotCQkJZnJlZShjaCk7Ci0JCX0KLQkJZnJlZShzcGxhc2hBcmcpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JLyogZG9lc24ndCBleGlzdCwgc2VwYXJhdGUgaW50byBwYXRoICYgcHJlZml4IGFuZCBsb29rIGZvciBhIC9wYXRoL3ByZWZpeF88dmVyc2lvbj4gKi8KLQljaCA9IGxhc3REaXJTZXBhcmF0b3IoIHNwbGFzaEFyZyApOwotCWlmIChjaCAhPSBOVUxMKSB7Ci0JCWlmIChJU19BQlNPTFVURShzcGxhc2hBcmcpKQotCQl7CS8qYWJzb2x1dGUgcGF0aCovCi0JCQlwYXRoID0gX3Rjc2R1cChzcGxhc2hBcmcpOwotCQkJcGF0aFtjaCAtIHNwbGFzaEFyZ10gPSAwOwotCQl9IGVsc2UgewotCQkJLyogcmVsYXRpdmUgcGF0aCwgcHJlcGVuZCB3aXRoIHByb2dyYW1EaXIgKi8KLQkJCXBhdGggPSBtYWxsb2MoIChfdGNzbGVuKHByb2dyYW1EaXIpICsgY2ggLSBzcGxhc2hBcmcgKyAyKSAqIHNpemVvZihfVENIQVIpKTsKLQkJCSpjaCA9IDA7Ci0JCQlfc3RwcmludGYocGF0aCwgX1RfRUNMSVBTRSgiJXMlYyVzIiksIHByb2dyYW1EaXIsIGRpclNlcGFyYXRvciwgc3BsYXNoQXJnKTsKLQkJCSpjaCA9IGRpclNlcGFyYXRvcjsKLQkJfQotCQlwcmVmaXggPSBfdGNzZHVwKGNoICsgMSk7Ci0JfSBlbHNlIHsKLQkJLyogTm8gc2VwYXJhdG9yLCB0cmVhdCBzcGxhc2hBcmcgYXMgdGhlIHByZWZpeCBhbmQgbG9vayBpbiB0aGUgcGx1Z2lucyBkaXIgKi8KLQkJcGF0aCA9IG1hbGxvYyggKF90Y3NsZW4ocHJvZ3JhbURpcikgKyA5KSAqIHNpemVvZihfVENIQVIpKTsKLQkJX3N0cHJpbnRmKHBhdGgsIF9UX0VDTElQU0UoIiVzJWMlcyIpLCBwcm9ncmFtRGlyLCBkaXJTZXBhcmF0b3IsIF9UX0VDTElQU0UoInBsdWdpbnMiKSk7Ci0JCXByZWZpeCA9IF90Y3NkdXAoc3BsYXNoQXJnKTsKLQl9Ci0JCi0JY2ggPSBmaW5kRmlsZShwYXRoLCBwcmVmaXgpOwotCWZyZWUocGF0aCk7Ci0JZnJlZShwcmVmaXgpOwotCWZyZWUoc3BsYXNoQXJnKTsKLQlpZiAoY2ggIT0gTlVMTCkgewotCQlwYXRoID0gbWFsbG9jKChfdGNzbGVuKGNoKSArIDEyKSAqIHNpemVvZihfVENIQVIpKTsKLQkJX3N0cHJpbnRmKCBwYXRoLCBfVF9FQ0xJUFNFKCIlcyVjJXMiKSwgY2gsIGRpclNlcGFyYXRvciwgX1RfRUNMSVBTRSgic3BsYXNoLmJtcCIpICk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIF9UQ0hBUiogZmluZFN0YXJ0dXBKYXIoKXsKLQlfVENIQVIgKiBmaWxlLCAqY2g7Ci0JX1RDSEFSICogcGx1Z2luc1BhdGg7Ci0Jc3RydWN0IF9zdGF0IHN0YXRzOwotCXNpemVfdCBwYXRoTGVuZ3RoLCBwcm9nTGVuZ3RoOwotCQotCWlmKCBzdGFydHVwQXJnICE9IE5VTEwgKSB7Ci0JCS8qIHN0YXJ0dXAgamFyIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAqLwotCQljaCA9IF90Y3NkdXAoc3RhcnR1cEFyZyk7Ci0JCS8qIGNoZWNrIHBhdGggd2lsbCBjaGVjayByZWxhdGl2ZSBwYXRocyBhZ2FpbnN0IHByb2dyYW1EaXIgYW5kIHdvcmtpbmdEaXIgKi8KLQkJZmlsZSA9IGNoZWNrUGF0aChjaCwgcHJvZ3JhbURpciwgMCk7Ci0JCWlmKGZpbGUgIT0gY2gpCi0JCQlmcmVlKGNoKTsKLQkJLyogY2hlY2sgZXhpc3RlbmNlICovCi0JCWlmIChfdHN0YXQoIGZpbGUsICZzdGF0cyApICE9IDApIHsKLQkJCWZyZWUoZmlsZSk7Ci0JCQlmaWxlID0gTlVMTDsKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcm9nTGVuZ3RoID0gcGF0aExlbmd0aCA9IF90Y3NsZW4ocHJvZ3JhbURpcik7Ci0jaWZkZWYgTUFDT1NYCi0JcGF0aExlbmd0aCArPSA5OwotI2VuZGlmCi0JcGx1Z2luc1BhdGggPSBtYWxsb2MoIChwYXRoTGVuZ3RoICsgMSArIDcgKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLQlfdGNzY3B5KHBsdWdpbnNQYXRoLCBwcm9ncmFtRGlyKTsKLQlpZighSVNfRElSX1NFUEFSQVRPUihwbHVnaW5zUGF0aFtwcm9nTGVuZ3RoIC0gMV0pKSB7Ci0JCXBsdWdpbnNQYXRoW3Byb2dMZW5ndGhdID0gZGlyU2VwYXJhdG9yOwotCQlwbHVnaW5zUGF0aFtwcm9nTGVuZ3RoICsgMV0gPSAwOwotCX0KLSNpZmRlZiBNQUNPU1gKLQlfdGNzY2F0KHBsdWdpbnNQYXRoLCBfVF9FQ0xJUFNFKCIuLi8uLi8uLi8iKSk7Ci0jZW5kaWYKLQlfdGNzY2F0KHBsdWdpbnNQYXRoLCBfVF9FQ0xJUFNFKCJwbHVnaW5zIikpOwotCQotCS8qIGVxdWlub3ggc3RhcnR1cCBqYXI/ICovCQotCWZpbGUgPSBmaW5kRmlsZShwbHVnaW5zUGF0aCwgREVGQVVMVF9FUVVJTk9YX1NUQVJUVVApOwotCWlmKGZpbGUgIT0gTlVMTCkKLQkJcmV0dXJuIGZpbGU7Ci0JCi0JLyogb2xkIHN0YXJ0dXAuamFyPyAqLwotCWNoID0gT0xEX1NUQVJUVVA7Ci0JZmlsZSA9IGNoZWNrUGF0aChjaCwgcHJvZ3JhbURpciwgMCk7Ci0JaWYgKF90c3RhdCggZmlsZSwgJnN0YXRzICkgPT0gMCkKLQkJcmV0dXJuIChmaWxlID09IGNoKSA/IF90Y3NkdXAoY2gpIDogZmlsZTsKLQkJCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIAotICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2bUNvbW1hbmQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcmVsYXVuY2hpbmcKLSAqIAotICogVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBjb21tYW5kIGFycmF5IG11c3QgYmUgZnJlZWQKLSAqLwotc3RhdGljIF9UQ0hBUiAqKiBnZXRSZWxhdW5jaENvbW1hbmQoIF9UQ0hBUiAqKnZtQ29tbWFuZCAgKQotewotCWludCBpID0gLTEsIHJlcSA9IDAsIGJlZ2luID0gLTE7Ci0JaW50IGlkeCA9IDA7Ci0JX1RDSEFSICoqIHJlbGF1bmNoOwotCQotCWlmICh2bUNvbW1hbmQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0Jd2hpbGUodm1Db21tYW5kWysraV0gIT0gTlVMTCl7Ci0JCWlmICggYmVnaW4gPT0gLTEgJiYgX3Rjc2ljbXAoIHZtQ29tbWFuZFtpXSwgKnJlcVZNYXJnW3JlcV0gKSA9PSAwKSB7Ci0JCQlpZihyZXFWTWFyZ1srK3JlcV0gPT0gTlVMTCB8fCAqcmVxVk1hcmdbcmVxXSA9PSBOVUxMKXsKLQkJCQliZWdpbiA9IGkgKyAxOwotCQkJfQotCQl9Ci0JfQotCQotCXJlbGF1bmNoID0gbWFsbG9jKCgxICsgaSArIDEpICogc2l6ZW9mKF9UQ0hBUiAqKSk7Ci0JcmVsYXVuY2hbaWR4KytdID0gcHJvZ3JhbTsKLQlpZihiZWdpbiA9PSAtMSkgewotCQliZWdpbiA9IDE7Ci0JfQotCWZvciAoaSA9IGJlZ2luOyB2bUNvbW1hbmRbaV0gIT0gTlVMTDsgaSsrKXsKLQkJaWYgKF90Y3NpY21wKHZtQ29tbWFuZFtpXSwgU0hPV1NQTEFTSCkgPT0gMCkgewotCQkJLyogcmVtb3ZlIGlmIHRoZSBuZXh0IGFyZ3VtZW50IGlzIG5vdCB0aGUgYml0bWFwIHRvIHNob3cgKi8KLQkJCWlmKHZtQ29tbWFuZFtpICsgMV0gIT0gTlVMTCAmJiB2bUNvbW1hbmRbaSArIDFdWzBdID09IF9UX0VDTElQU0UoJy0nKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9IGVsc2UgaWYoX3Rjc25jbXAodm1Db21tYW5kW2ldLCBDTEFTU1BBVEhfUFJFRklYLCBfdGNzbGVuKENMQVNTUEFUSF9QUkVGSVgpKSA9PSAwKSB7Ci0JCQkvKiBza2lwIC1EamF2YS5jbGFzcy5wYXRoPS4uLiAqLwotCQkJY29udGludWU7Ci0JCX0KLQkJcmVsYXVuY2hbaWR4KytdID0gdm1Db21tYW5kW2ldOwotCX0KLQlpZihfdGNzaWNtcChyZWxhdW5jaFtpZHggLSAxXSwgVk1BUkdTKSA9PSAwKSAKLQkJcmVsYXVuY2hbaWR4IC0gMV0gPSBOVUxMOwotCXJlbGF1bmNoW2lkeF0gPSBOVUxMOwotCXJldHVybiByZWxhdW5jaDsKLX0KLQotI2lmZGVmIF9XSU4zMgotc3RhdGljIHZvaWQgY3JlYXRlQ29uc29sZSgpIHsKLSNpZm5kZWYgV0lONjQKLSNkZWZpbmUgaW50cHRyX3QgbG9uZwotI2VuZGlmCi0JaW50cHRyX3Qgc3RkSGFuZGxlOwotCWludCBjb25IYW5kbGU7Ci0JRklMRSAqZnA7Ci0JCi0JQWxsb2NDb25zb2xlKCk7Ci0JCi0JLyogcmVkaXJlY3Qgc3Rkb3V0ICovCi0Jc3RkSGFuZGxlID0gKGludHB0cl90KSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOwotCWNvbkhhbmRsZSA9IF9vcGVuX29zZmhhbmRsZShzdGRIYW5kbGUsIF9PX1RFWFQpOwotCWlmIChjb25IYW5kbGUgIT0gLTEpIHsKLQkJZnAgPSBfZmRvcGVuKGNvbkhhbmRsZSwgInciKTsKLQkJKnN0ZG91dCA9ICpmcDsKLQl9Ci0JCi0JLyogcmVkaXJlY3Qgc3RkaW4gKi8KLQlzdGRIYW5kbGUgPSAoaW50cHRyX3QpIEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKLQljb25IYW5kbGUgPSBfb3Blbl9vc2ZoYW5kbGUoc3RkSGFuZGxlLCBfT19URVhUKTsKLQlpZiAoY29uSGFuZGxlICE9IC0xKSB7Ci0JCWZwID0gX2Zkb3Blbihjb25IYW5kbGUsICJyIik7Ci0JCSpzdGRpbiA9ICpmcDsKLQl9Ci0JCi0JLyogc3RkZXJyICovCi0Jc3RkSGFuZGxlID0gKGludHB0cl90KSBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7Ci0JY29uSGFuZGxlID0gX29wZW5fb3NmaGFuZGxlKHN0ZEhhbmRsZSwgX09fVEVYVCk7Ci0JaWYgKGNvbkhhbmRsZSAhPSAtMSkgewotCQlmcCA9IF9mZG9wZW4oY29uSGFuZGxlLCAiciIpOwotCQkqc3RkZXJyID0gKmZwOwotCX0KLX0KLQotLyogRGV0ZXJtaW5lIGlmIHRoZSBsYXVuY2hlciB3YXMgdGhlIGVjbGlwc2VjLmV4ZSBvciBub3QgYmFzZWQgb24gd2hldGhlciB3ZSBoYXZlIGFuIGF0dGFjaGVkIGNvbnNvbGUuCi0gKiBUaGlzIHdpbGwgb25seSBiZSBjb3JyZWN0IGlmIGNhbGxlZCBiZWZvcmUgY3JlYXRlQ29uc29sZS4KLSAqLwotc3RhdGljIGludCBpc0NvbnNvbGVMYXVuY2hlcigpIHsKLQlIV05EIChXSU5BUEkgKkdldENvbnNvbGVXaW5kb3cpKCk7Ci0Jdm9pZCAqIGhhbmRsZSA9IGxvYWRMaWJyYXJ5KF9UX0VDTElQU0UoIktlcm5lbDMyLmRsbCIpKTsKLQlpZiAoaGFuZGxlICE9IE5VTEwpIHsKLQkJaWYgKCAoR2V0Q29uc29sZVdpbmRvdyA9IGZpbmRTeW1ib2woaGFuZGxlLCBfVF9FQ0xJUFNFKCJHZXRDb25zb2xlV2luZG93IikpKSAhPSBOVUxMKSB7Ci0JCQlyZXR1cm4gR2V0Q29uc29sZVdpbmRvdygpICE9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogU2V0IHRoZSB2bSB0byB1c2UgYmFzZWQgb24gdGhlIGdpdmVuIC5lZSBmaWxlLgotICovCi1zdGF0aWMgaW50IHZtRUVQcm9wcyhfVENIQVIgKiBlZUZpbGUsIF9UQ0hBUiAqKiBtc2cpIHsKLQlpZiAocHJvY2Vzc0VFUHJvcHMoZWVGaWxlKSAhPSAwKSB7Ci0JCSptc2cgPSBfdGNzZHVwKGVlRmlsZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGVlTGlicmFyeSAhPSBOVUxMKSB7Ci0JCWpuaUxpYiA9IGZpbmRWTUxpYnJhcnkoZWVMaWJyYXJ5KTsKLQkJaWYgKGpuaUxpYiAhPSBOVUxMKQotCQkJcmV0dXJuIExBVU5DSF9KTkk7Ci0JfQotCQkKLQlpZiAoZWVDb25zb2xlICE9IE5VTEwgJiYgKGRlYnVnIHx8IG5lZWRDb25zb2xlIHx8IGNvbnNvbGVMYXVuY2hlcikgKSB7Ci0JCWphdmFWTSA9IGZpbmRTeW1saW5rQ29tbWFuZChlZUNvbnNvbGUsIDApOwotCQlpZiAoamF2YVZNICE9IE5VTEwpCi0JCQlyZXR1cm4gTEFVTkNIX0VYRTsKLQl9Ci0JCi0JaWYgKGVlRXhlY3V0YWJsZSAhPSBOVUxMKSB7Ci0JCWphdmFWTSA9IGZpbmRTeW1saW5rQ29tbWFuZChlZUV4ZWN1dGFibGUsIDApOwotCQlpZiAoamF2YVZNICE9IE5VTEwpCi0JCQlyZXR1cm4gTEFVTkNIX0VYRTsKLQl9Ci0JCi0JKm1zZyA9IF90Y3NkdXAoZWVGaWxlKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBkZXRlcm1pbmUgdGhlIHZtIHRvIHVzZS4KLSAqIHJldHVybiBMQVVOQ0hfSk5JIGZvciBsYXVuY2hpbmcgd2l0aCBKTkkgaW52b2NhdGlvbiBBUEkuIGpuaUxpYiBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeQotICogcmV0dXJoIExBVU5DSF9FWEUgZm9yIGV4ZWNpbmcgamF2YSwgamF2YVZNIGNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZSBleGUKLSAqIHJldHVybiAtMSBpZiBwcm9ibGVtIGZpbmRpbmcgdm0sIHRoZSBwYXNzZWQgaW4gbXNnIHBvaW50cyB0byB0aGUgcGxhY2VzIHdlIGxvb2tlZC4gIENhbGxlciBzaG91bGQgZnJlZQotICogdGhpcyBtZW1vcnkuCi0gKi8KLXN0YXRpYyBpbnQgZGV0ZXJtaW5lVk0oX1RDSEFSKiogbXNnKSB7Ci0JX1RDSEFSKiBjaCAgPSBOVUxMOwotCV9UQ0hBUiogcmVzdWx0ID0gTlVMTDsKLQlfVENIQVIqIHZtU2VhcmNoUGF0aCA9IE5VTEw7Ci0JX1RDSEFSKiBkZWZhdWx0SmF2YSA9IGRlZmF1bHRWTTsgLyogZGVmYXVsdCBleGUgdG8gbG9vayBmb3IgKi8KLQlpbnQgdHlwZSA9IDA7Ci0JCi0jaWZkZWYgX1dJTjMyCi0JaWYgKGRlYnVnIHx8IG5lZWRDb25zb2xlIHx8IGNvbnNvbGVMYXVuY2hlcikKLQkJZGVmYXVsdEphdmEgPSBjb25zb2xlVk07IC8qIHdpbmRvd3Mgd2lsbCB3YW50IGphdmEuZXhlIGZvciB0aGUgY29uc29sZSwgbm90IGphdmF3LmV4ZSAqLwotI2VuZGlmCi0JCi0JLyogdm1OYW1lIGlzIHBhc3NlZCBpbiBvbiBjb21tYW5kIGxpbmUgd2l0aCAtdm0gKi8KLSAgICBpZiAodm1OYW1lICE9IE5VTEwpIHsKLSAgICAJc2l6ZV90IGxlbmd0aCA9IF90Y3NsZW4odm1OYW1lKTsKLSAgICAJLyogcmVtb3ZlIHRoZSB0cmFpbGluZyBzZXBhcmF0b3IgKi8KLSAgICAJaWYgKHZtTmFtZVtsZW5ndGggLSAxXSA9PSBfVF9FQ0xJUFNFKCcvJykgfHwgdm1OYW1lW2xlbmd0aCAtIDFdID09IF9UX0VDTElQU0UoJ1xcJykpIHsKLSAgICAJCXZtTmFtZVtsZW5ndGggLSAxXSA9IDA7Ci0gICAgCX0KLSAgICAJCi0gICAgCXZtTmFtZSA9IGNoZWNrUGF0aCh2bU5hbWUsIHByb2dyYW1EaXIsIDApOwotICAgIAl0eXBlID0gY2hlY2tQcm92aWRlZFZNVHlwZSh2bU5hbWUpOwotICAgIAlzd2l0Y2ggKHR5cGUpIHsKLSAgICAJY2FzZSBWTV9ESVJFQ1RPUlk6Ci0gICAgCQkvKiB2bU5hbWUgaXMgYSBkaXJlY3RvcnksIGxvb2sgZm9yIGRlZmF1bHQuZWUgKi8KLSAgICAJCWNoID0gbWFsbG9jKChfdGNzbGVuKHZtTmFtZSkgKyAxICsgX3Rjc2xlbihERUZBVUxUX0VFKSArIDEpICogc2l6ZW9mKF9UQ0hBUikpOwotICAgIAkJX3N0cHJpbnRmKCBjaCwgX1RfRUNMSVBTRSgiJXMlYyVzIiksIHZtTmFtZSwgZGlyU2VwYXJhdG9yLCBERUZBVUxUX0VFICk7Ci0gICAgCQkKLSAgICAJCXJlc3VsdCA9IGZpbmRDb21tYW5kKGNoKTsKLSAgICAJCWZyZWUoY2gpOwotICAgIAkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgCQkJLyogTm8gZGVmYXVsdC5lZSBmaWxlLCBsb29rIGZvciBkZWZhdWx0IFZNICovCi0gICAgCQkJY2ggPSBtYWxsb2MoKF90Y3NsZW4odm1OYW1lKSArIDEgKyBfdGNzbGVuKGRlZmF1bHRKYXZhKSArIDEpICogc2l6ZW9mKF9UQ0hBUikpOwotICAgIAkJCV9zdHByaW50ZiggY2gsIF9UX0VDTElQU0UoIiVzJWMlcyIpLCB2bU5hbWUsIGRpclNlcGFyYXRvciwgZGVmYXVsdEphdmEgKTsKLSAgICAJCQlqYXZhVk0gPSBmaW5kU3ltbGlua0NvbW1hbmQoY2gsIDApOwotICAgIAkJCWZyZWUoY2gpOwotICAgIAkJCWlmIChqYXZhVk0gPT0gTlVMTCkgewotICAgIAkJCQkvKiBObyB2bSBleGVjdXRhYmxlLCBsb29rIGZvciBsaWJyYXJ5ICovCi0gICAgCQkJCWNoID0gbWFsbG9jKChfdGNzbGVuKHZtTmFtZSkgKyAxICsgX3Rjc2xlbih2bUxpYnJhcnkpICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0gICAgCQkJCV9zdHByaW50ZiggY2gsIF9UX0VDTElQU0UoIiVzJWMlcyIpLCB2bU5hbWUsIGRpclNlcGFyYXRvciwgdm1MaWJyYXJ5ICk7Ci0gICAgCQkJCWpuaUxpYiA9IGZpbmRWTUxpYnJhcnkoY2gpOwotICAgIAkJCQlpZiAoam5pTGliICE9IGNoKQotICAgIAkJCQkJZnJlZShjaCk7Ci0gICAgCQkJCWlmIChqbmlMaWIgIT0gTlVMTCkgewotICAgIAkJCQkJcmV0dXJuIExBVU5DSF9KTkk7Ci0gICAgCQkJCX0KLSAgICAJCQkJLyogZm91bmQgbm90aGluZywgcmV0dXJuIGVycm9yICovCi0gICAgCQkJCSptc2cgPSBtYWxsb2MoICgzICogKF90Y3NsZW4odm1OYW1lKSArIDIpICsgX3Rjc2xlbihERUZBVUxUX0VFKSArIF90Y3NsZW4oZGVmYXVsdEphdmEpICsgX3Rjc2xlbih2bUxpYnJhcnkpICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0gICAgCQkJCV9zdHByaW50ZiggKm1zZywgX1RfRUNMSVBTRSgiJXMlYyVzXG4lcyVjJXNcbiVzJWMlcyIpLCB2bU5hbWUsIGRpclNlcGFyYXRvciwgREVGQVVMVF9FRSwgCi0gICAgCQkJCQkJCQkJCQkJCQkJCQkgICB2bU5hbWUsIGRpclNlcGFyYXRvciwgZGVmYXVsdEphdmEsCi0gICAgCQkJCQkJCQkJCQkJCQkJCQkgICB2bU5hbWUsIGRpclNlcGFyYXRvciwgdm1MaWJyYXJ5KTsKLSAgICAJCQkJcmV0dXJuIC0xOwotICAgIAkJCX0KLSAgICAJCQlicmVhazsKLSAgICAJCX0KLSAgICAJCQotICAgIAkJLyogZWxzZSBkZWZhdWx0LmVlIGRvZXMgZXhpc3QgKi8KLSAgICAJCXZtTmFtZSA9IHJlc3VsdDsKLSAgICAJCS8qIGZhbGwgdGhyb3VnaCB0byBWTV9FRV9QUk9QUyovCi0gICAgCWNhc2UgVk1fRUVfUFJPUFM6Ci0gICAgCQlyZXR1cm4gdm1FRVByb3BzKHZtTmFtZSwgbXNnKTsKLSAgICAJCQotICAgIAljYXNlIFZNX0xJQlJBUlk6Ci0gICAgCQljaCA9IGZpbmRDb21tYW5kKHZtTmFtZSk7Ci0gICAgCQlpZihjaCAhPSBOVUxMKSB7Ci0gICAgCQkJam5pTGliID0gZmluZFZNTGlicmFyeShjaCk7Ci0gICAgCQkJaWYgKGNoICE9IGpuaUxpYikKLSAgICAJCQkJZnJlZShjaCk7Ci0gICAgCQkJcmV0dXJuIExBVU5DSF9KTkk7Ci0gICAgCQl9Ci0gICAgCQkvKiBmaWxlIGRpZG4ndCBleGlzdCwgZXJyb3IgKi8KLSAgICAJCWlmIChmaXJzdERpclNlcGFyYXRvciggdm1OYW1lICkgPT0gTlVMTCkgewotICAgIAkJCS8qIGlmIHZtTmFtZSBkb2Vzbid0IGNvbnRhaW4gYSBkaXJTZXBhcmF0b3IsIHdlIGxvb2tlZCBvbiB0aGUgcGF0aCAqLwotICAgIAkJCSptc2cgPSBtYWxsb2MoKF90Y3NsZW4ocGF0aE1zZykgKyBfdGNzbGVuKHZtTmFtZSkpICogc2l6ZW9mKF9UQ0hBUikpOwotICAgIAkJCV9zdHByaW50ZiggKm1zZywgcGF0aE1zZyx2bU5hbWUgKTsKLSAgICAJCX0gZWxzZSB7Ci0gICAgCQkJKm1zZyA9IF90Y3NkdXAodm1OYW1lKTsKLSAgICAJCX0KLSAgICAJCXJldHVybiAtMTsKLSAgICAJCQotICAgIAlkZWZhdWx0OgotICAgIAkJLypvdGhlcndpc2UsIGFzc3VtZSBleGVjdXRhYmxlICovCi0gICAgCQlqYXZhVk0gPSBmaW5kU3ltbGlua0NvbW1hbmQodm1OYW1lLCAwKTsKLSAgICAJCWlmKGphdmFWTSAhPSBOVUxMKSB7Ci0jaWZkZWYgTUFDT1NYCi0gICAgCQkJLyogcmlnaHQgbm93LCB3ZSBhcmUgYWx3YXlzIGRvaW5nIEpOSSBvbiBNYWMgKi8KLSAgICAJCQlicmVhazsgCi0jZWxzZQotICAgIAkJCXJldHVybiBMQVVOQ0hfRVhFOwotI2VuZGlmCi0gICAgCQl9Ci0gICAgCQkvKiBmaWxlIGRpZG4ndCBleGlzdCwgZXJyb3IgKi8KLSAgICAJCWlmIChmaXJzdERpclNlcGFyYXRvciggdm1OYW1lICkgPT0gTlVMTCkgewotICAgIAkJCS8qIGlmIHZtTmFtZSBkb2Vzbid0IGNvbnRhaW4gYSBkaXJTZXBhcmF0b3IsIHdlIGxvb2tlZCBvbiB0aGUgcGF0aCAqLwotICAgIAkJCSptc2cgPSBtYWxsb2MoKF90Y3NsZW4ocGF0aE1zZykgKyBfdGNzbGVuKHZtTmFtZSkpICogc2l6ZW9mKF9UQ0hBUikpOwotICAgIAkJCV9zdHByaW50ZiggKm1zZywgcGF0aE1zZywgdm1OYW1lICk7Ci0gICAgCQl9IGVsc2UgewotICAgIAkJCSptc2cgPSBfdGNzZHVwKHZtTmFtZSk7Ci0gICAgCQl9Ci0gICAJCQlyZXR1cm4gLTE7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgaWYgKHZtTmFtZSA9PSBOVUxMKSB7Ci0gICAgCS8qIG5vIHZtIHNwZWNpZmllZCwgVHJ5IHRvIGZpbmQgdGhlIFZNIHNoaXBwZWQgd2l0aCBlY2xpcHNlLiAqLwotICAgIAkKLSAgICAJLyogbG9vayBmaXJzdCBmb3IgZGVmYXVsdC5lZSAqLwotICAgIAljaCA9IG1hbGxvYyggKF90Y3NsZW4oIHByb2dyYW1EaXIgKSArIF90Y3NsZW4oIHNoaXBwZWRWTURpciApICsgX3Rjc2xlbiggREVGQVVMVF9FRSApICsgMSkgKiBzaXplb2YoX1RDSEFSKSApOwotCQlfc3RwcmludGYoIGNoLCBfVF9FQ0xJUFNFKCIlcyVzJXMiKSwgcHJvZ3JhbURpciwgc2hpcHBlZFZNRGlyLCBERUZBVUxUX0VFICk7Ci0JCXJlc3VsdCA9IGZpbmRDb21tYW5kKGNoKTsKLQkJZnJlZShjaCk7Ci0gICAgCWlmIChyZXN1bHQgIT0gTlVMTCkgewotICAgIAkJdHlwZSA9IHZtRUVQcm9wcyhyZXN1bHQsIG1zZyk7Ci0gICAgCQlmcmVlKHJlc3VsdCk7Ci0gICAgCQlyZXR1cm4gdHlwZTsKLSAgICAJfQotICAgIAkKLSAgICAJLyogdGhlbiBsb29rIGZvciBqYXZhKHcpLmV4ZSAqLwotICAgICAgICBjaCA9IG1hbGxvYyggKF90Y3NsZW4oIHByb2dyYW1EaXIgKSArIF90Y3NsZW4oIHNoaXBwZWRWTURpciApICsgX3Rjc2xlbiggZGVmYXVsdEphdmEgKSArIDEwKSAqIHNpemVvZihfVENIQVIpICk7Ci0gICAgICAgIF9zdHByaW50ZiggY2gsIF9UX0VDTElQU0UoIiVzJXMlcyIpLCBwcm9ncmFtRGlyLCBzaGlwcGVkVk1EaXIsIGRlZmF1bHRKYXZhICk7Ci0gICAgICAgIHZtU2VhcmNoUGF0aCA9IF90Y3NkdXAoY2gpOwotIAotICAgICAgICBqYXZhVk0gPSBmaW5kU3ltbGlua0NvbW1hbmQoIGNoLCAwICk7Ci0gICAgICAgIGZyZWUoY2gpOwotICAgIH0KLSAgICAKLSAgICBpZiAoamF2YVZNID09IE5VTEwpIHsKLSAgICAJLyogdm0gbm90IGZvdW5kIHlldCwgbG9vayBmb3Igb25lIG9uIHRoZSBzZWFyY2ggcGF0aCwgYnV0IGRvbid0IHJlc29sdmUgc3ltbGlua3MgKi8KLSAgICAJamF2YVZNID0gZmluZFN5bWxpbmtDb21tYW5kKGRlZmF1bHRKYXZhLCAwKTsKLSAgICAJaWYgKGphdmFWTSA9PSBOVUxMKSB7Ci0gICAgCQkvKiBjYW4ndCBmaW5kIHZtLCBlcnJvciAqLwotICAgIAkJY2ggPSBtYWxsb2MoIChfdGNzbGVuKHBhdGhNc2cpICsgX3Rjc2xlbihkZWZhdWx0SmF2YSkgKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLSAgICAJCV9zdHByaW50ZihjaCwgcGF0aE1zZywgZGVmYXVsdEphdmEpOwotICAgIAkJCi0gICAgCQlpZih2bVNlYXJjaFBhdGggIT0gTlVMTCkgewotICAgIAkJCSptc2cgPSBtYWxsb2MoKF90Y3NsZW4oY2gpICsgMSArIF90Y3NsZW4odm1TZWFyY2hQYXRoKSArIDEpICogc2l6ZW9mKF9UQ0hBUikpOwotICAgIAkJCV9zdHByaW50ZigqbXNnLCBfVF9FQ0xJUFNFKCIlc1xuJXMiKSwgdm1TZWFyY2hQYXRoLCBjaCk7Ci0gICAgCQkJZnJlZShjaCk7Ci0gICAgCQl9IGVsc2UgewotICAgIAkJCSptc2cgPSBjaDsKLSAgICAJCX0KLSAgICAJCXJldHVybiAtMTsKLSAgICAJfQotICAgIH0KLQotICAgIGlmICh2bVNlYXJjaFBhdGggIT0gTlVMTCkKLSAgICAJZnJlZSh2bVNlYXJjaFBhdGgpOwotICAgIAotI2lmbmRlZiBERUZBVUxUX0pBVkFfRVhFQwotCS8qIHJlc29sdmUgc3ltbGlua3MgZm9yIGZpbmRpbmcgdGhlIGxpYnJhcnkgKi8KLQljaCA9IHJlc29sdmVTeW1saW5rcyhqYXZhVk0pOwotICAgIGpuaUxpYiA9IGZpbmRWTUxpYnJhcnkoY2gpOwotICAgIGlmIChjaCAhPSBqbmlMaWIgJiYgY2ggIT0gamF2YVZNKQotCQlmcmVlKGNoKTsKLSAgICBpZiAoam5pTGliICE9IE5VTEwpIAotICAgIAlyZXR1cm4gTEFVTkNIX0pOSTsKLSNlbmRpZgotICAgIAotICAgIHJldHVybiBMQVVOQ0hfRVhFOwotfQotCi1zdGF0aWMgaW50IHByb2Nlc3NFRVByb3BzKF9UQ0hBUiogZWVGaWxlKSAKLXsKLQlfVENIQVIgKiogYXJndjsKLQlfVENIQVIgKiBjMSwgKiBjMjsKLQlfVENIQVIgKiBlZURpcjsKLQlpbnQgYXJnYzsKLQlpbnQgaW5kZXgsIGk7Ci0JaW50IG1hdGNoZXMgPSAwOwotCU9wdGlvbiAqb3B0aW9uOwotCQotCWlmKHJlYWRDb25maWdGaWxlKGVlRmlsZSwgJmFyZ2MsICZhcmd2KSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0KLQluRUVhcmdzID0gYXJnYzsKLQllZVZNYXJnID0gYXJndjsKLQkKLQllZURpciA9IF90Y3NkdXAoZWVGaWxlKTsKLQljMSA9IGxhc3REaXJTZXBhcmF0b3IoIGVlRGlyICk7Ci0Jd2hpbGUgKGMxICE9IE5VTEwpCi0gICAgewotICAgIAkqYzEgPSBfVF9FQ0xJUFNFKCdcMCcpOwotICAgIAljMS0tOyAvKiBJU19ESVJfU0VQQVJBVE9SIGV2YWx1dGVzIGMgdHdpY2UsIGRlY3JlbWVudCBvdXQgaGVyZSAqLwotICAgIAlpZiAoIUlTX0RJUl9TRVBBUkFUT1IoKmMxKSkKLSAgICAJCWMxID0gTlVMTDsKLSAgICB9Ci0JCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYXJnYzsgaW5kZXgrKyl7Ci0gICAgCS8qIHJlcGxhY2UgJHtlZS5ob21lfSB3aXRoIGVlRGlyLCBsb29wIGluIGNhc2UgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwZXIgYXJndW1lbnQgKi8KLSAgICAJd2hpbGUoIChjMSA9IF90Y3NzdHIoYXJndltpbmRleF0sIEVFX0hPTUVfVkFSKSkgIT0gTlVMTCkKLSAgICAJewotICAgIAkJLyogdGhlIHNwYWNlIG5lZWRlZCBmb3IgYzEgaXMgaW5jbHVkZWQgaW4gX3Rjc2xlbihhcmd2W2luZGV4XSkgKi8KLSAgICAJCWMyID0gbWFsbG9jKCAoX3Rjc2xlbihhcmd2W2luZGV4XSkgKyBfdGNzbGVuKGVlRGlyKSArIDEpICogc2l6ZW9mKF9UQ0hBUikpOwotICAgIAkJKmMxID0gX1RfRUNMSVBTRSgnXDAnKTsKLSAgICAJCV9zdHByaW50ZihjMiwgX1RfRUNMSVBTRSgiJXMlcyVzIiksIGFyZ3ZbaW5kZXhdLCBlZURpciwgYzEgKyAxMCk7IC8qICR7ZWUuaG9tZX0gaXMgMTAgY2hhcmFjdGVycyAqLwotICAgIAkJZnJlZShhcmd2W2luZGV4XSk7Ci0gICAgCQlhcmd2W2luZGV4XSA9IGMyOwotICAgIAl9Ci0gICAgCQotICAgIAkvKiBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGlzIGEgb3B0aW9uIHN1cHBvcnRlZCBieSB0aGUgbGF1bmNoZXIgKi8KLSAgICAgICAgb3B0aW9uID0gTlVMTDsKLSAgICAgICAgZm9yIChpID0gMDsgb3B0aW9uID09IE5VTEwgJiYgaSA8IGVlT3B0aW9uc1NpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAJaWYgKF90Y3NuY21wKCBhcmd2W2luZGV4XSwgZWVPcHRpb25zW2ldLm5hbWUsIF90Y3NsZW4oZWVPcHRpb25zW2ldLm5hbWUpICkgPT0gMCkgewotICAgICAgICAJICAgIG9wdGlvbiA9ICZlZU9wdGlvbnNbaV07Ci0gICAgICAgIAkgICAgYnJlYWs7Ci0gICAgICAgIAl9Ci0gICAgICAgCX0KLSAgICAgICAgaWYob3B0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgCSsrbWF0Y2hlczsJCi0gICAgICAgIAlpZiAob3B0aW9uLT5mbGFnICYgVkFMVUVfSVNfRkxBRykKLSAgICAgICAgCQkqKChpbnQqKW9wdGlvbi0+dmFsdWUpID0gMTsKLSAgICAgICAgCWVsc2UgewotICAgICAgICAJCWMxID0gbWFsbG9jKCAoX3Rjc2xlbihhcmd2W2luZGV4XSkgLSBfdGNzbGVuKG9wdGlvbi0+bmFtZSkgKyAxKSAqc2l6ZW9mKF9UQ0hBUikpOwotICAgICAgICAgICAgCV90Y3NjcHkoYzEsIGFyZ3ZbaW5kZXhdICsgX3Rjc2xlbihvcHRpb24tPm5hbWUpKTsKLSAgICAgICAgCQlpZiAob3B0aW9uLT5mbGFnICYgQURKVVNUX1BBVEggJiYgb3B0aW9uLT5mbGFnICYgVkFMVUVfSVNfTElTVCkgewotICAgICAgICAJCQljMiA9IGNoZWNrUGF0aExpc3QoYzEsIGVlRGlyLCAxKTsKLSAgICAgICAJCQkJZnJlZShjMSk7Ci0gICAgCQkJCWMxID0gYzI7Ci0gICAgICAgIAkJfSBlbHNlIGlmIChvcHRpb24tPmZsYWcgJiBBREpVU1RfUEFUSCkgewotICAgICAgICAJCQljMiA9IGNoZWNrUGF0aChjMSwgZWVEaXIsIDEpOwotICAgICAgICAJCQlpZiAoYzIgIT0gYzEpIHsKLSAgICAgICAgCQkJCWZyZWUoYzEpOwotICAgICAgICAJCQkJYzEgPSBjMjsKLSAgICAgICAgCQkJfQotICAgICAgICAJCX0KLSAgICAJCQkqKChfVENIQVIqKilvcHRpb24tPnZhbHVlKSA9IGMxOwotICAgICAgICAJfQotICAgICAgICAJaWYobWF0Y2hlcyA9PSBlZU9wdGlvbnNTaXplKQotICAgICAgICAJCWJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIHNldCBlZS5ob21lLCBlZS5maWxlbmFtZSB2YXJpYWJsZXMsIGFuZCBOVUxMICovCi0gICAgYXJndiA9IHJlYWxsb2MoYXJndiwgKG5FRWFyZ3MgKyAzKSAqIHNpemVvZihfVENIQVIqKSk7Ci0gICAgCi0gICAgYzEgPSBtYWxsb2MoIChfdGNzbGVuKEVFX0hPTUUpICsgX3Rjc2xlbihlZURpcikgKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLSAgICBfc3RwcmludGYoYzEsIF9UX0VDTElQU0UoIiVzJXMiKSwgRUVfSE9NRSwgZWVEaXIpOwotICAgIGFyZ3ZbbkVFYXJncysrXSA9IGMxOwotICAgIAotICAgIGMxID0gbWFsbG9jKCAoX3Rjc2xlbihFRV9GSUxFTkFNRSkgKyBfdGNzbGVuKGVlRmlsZSkgKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLSAgICBfc3RwcmludGYoYzEsIF9UX0VDTElQU0UoIiVzJXMiKSwgRUVfRklMRU5BTUUsIGVlRmlsZSk7Ci0gICAgYXJndltuRUVhcmdzKytdID0gYzE7Ci0gICAgCi0gICAgYXJndltuRUVhcmdzXSA9IE5VTEw7Ci0gICAgCi0gICAgZnJlZShlZURpcik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIHJldHVybnMgYW4gYXJyYXkgb2YgcGF0aHMgdGhhdCBzaG91bGQgYmUgcGxhY2Ugb24gdGhlIHNlYXJjaCBwYXRoIGZvciBsb2FkaW5nCi0gKiB0aGUgdm0gc2hhcmVkIGxpYnJhcmllcy4KLSAqIEVhY2ggZW50cnkgaXMgdGVybWluYXRlZCB3aXRoIHRoZSBwbGF0Zm9ybSBwYXRoIHNlcGFyYXRvci4KLSAqIEVudHJpZXMgYXJlIGVpdGhlciBmcm9tIHRoZSBlZS5saWJyYXJ5LnBhdGggb3IgY2FsY3VsYXRlZCBmcm9tIHRoZSBwYXRoIHRvIHRoZQotICogdm0gc2hhcmVkIGxpYnJhcnkgaXRzZWxmLgotICovCi1fVENIQVIgKiogZ2V0Vk1MaWJyYXJ5U2VhcmNoUGF0aChfVENIQVIgKiB2bUxpYnJhcnkpIHsKLQlfVENIQVIgKiogcGF0aHMgPSBOVUxMOwotCV9UQ0hBUiAqIGJ1ZmZlciA9IE5VTEw7Ci0JX1RDSEFSICogcGF0aCwgKiBlbnRyeSwgKmM7Ci0JX1RDSEFSIHNlcGFyYXRvcjsKLQlpbnQgbnVtUGF0aHMgPSAzOwotCWludCBpOwotCXN0cnVjdCBfc3RhdCBzdGF0czsKLQkKLQlidWZmZXIgPSAoZWVMaWJQYXRoICE9IE5VTEwpID8gX3Rjc2R1cChlZUxpYlBhdGgpIDogX3Rjc2R1cCh2bUxpYnJhcnkpOwkKLSNpZmRlZiBXSU4zMgotCS8qIE9uIHdpbmRvd3Mgd2Ugc29tZXRpbWVzIGdldCAnLycgaW5zdGVhZCBvZiAnXCcsIGp1c3QgYWx3YXlzIHVzZSAnLycgICovCi0JaSA9IC0xOwotCXdoaWxlIChidWZmZXJbKytpXSAhPSAwKSB7Ci0JCWlmIChidWZmZXJbaV0gPT0gX1RfRUNMSVBTRSgnXFwnKSkgCi0JCQlidWZmZXJbaV0gPSBfVF9FQ0xJUFNFKCcvJyk7Ci0JfQotI2VuZGlmCi0JCi0Jc2VwYXJhdG9yID0gKGVlTGliUGF0aCAhPSBOVUxMKSA/IHBhdGhTZXBhcmF0b3IgOiBfVF9FQ0xJUFNFKCcvJyk7Ci0JCi0JaWYgKGVlTGliUGF0aCAhPSBOVUxMKSB7Ci0JCS8qIGNvdW50IG51bWJlciBvZiBwYXRoIGVsZW1lbnRzICovCi0JCW51bVBhdGhzID0gMTsKLQkJYyA9IGVlTGliUGF0aDsKLQkJd2hpbGUoIChjID0gX3Rjc2NocihjLCBwYXRoU2VwYXJhdG9yKSkgIT0gTlVMTCkgewotCQkJbnVtUGF0aHMrKzsKLQkJCWMrKzsKLQkJfQotCX0gCi0JCQotCXBhdGhzID0gbWFsbG9jKChudW1QYXRocyArIDEpICogc2l6ZW9mKF9UQ0hBUiopKTsKLQlwYXRoc1tudW1QYXRoc10gPSBOVUxMOwotCQkKLQkvKiBXZSBhcmUgZWl0aGVyIHNwbGl0dGluZyBlZUxpYlBhdGggKGVnIHBhdGgxOnBhdGgyKSwgb3Igd2UgYXJlIGV4dHJhY3RpbmcKLQkgKiBmcm9tIGxpYlBhdGggd2hlcmUgd2Ugd2FudCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpYnJhcnkgYW5kIHRoZQotCSAqIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhhdCwgYW5kIGFsc28gZ3JhbmRwYXJlbnQvbGliL2FyY2ggKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtUGF0aHM7IGkrKykgewotCQljID0gX3Rjc3JjaHIoYnVmZmVyLCBzZXBhcmF0b3IpOwotCQlpZiAoYyAhPSAwKSB7Ci0JCQkqYysrID0gMDsKLQkJCWlmIChlZUxpYlBhdGggIT0gTlVMTCkgeyAKLQkJCQlwYXRoID0gYzsJCS8qIHdlIHdhbnQgZnJvbSBjIHRvIHRoZSBlbmQgKi8KLQkJCX0gZWxzZSB7IAotCQkJCXBhdGggPSBidWZmZXI7IAkvKiB3ZSB3YW50IGZyb20gdGhlIHN0YXJ0IHRvIGMgKi8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChlZUxpYlBhdGggIT0gTlVMTCkgewotCQkJCXBhdGggPSBidWZmZXI7Ci0JCQl9IGVsc2UgewotCQkJCXBhdGhzW2ldID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocGF0aCAhPSBOVUxMKSB7Ci0JCQllbnRyeSA9IHJlc29sdmVTeW1saW5rcyhwYXRoKTsgLyogdGhpcyBtYXkgYmUgYSBuZXcgc3RyaW5nICovCi0JCQlpZiAoZWVMaWJQYXRoID09IE5VTEwgJiYgaSA9PSAyKSB7Ci0JCQkJLyogdHJ5aW5nIGdyYW5kcGFyZW50L2xpYi9hcmNoICovCi0JCQkJY29uc3QgX1RDSEFSICogYXJjaCA9IGdldFZNQXJjaCgpOwotCQkJCXBhdGhzW2ldID0gbWFsbG9jKChfdGNzbGVuKGVudHJ5KSArIDcgKyBfdGNzbGVuKGFyY2gpKSAqIHNpemVvZihfVENIQVIpKTsKLQkJCQlfc3RwcmludGYocGF0aHNbaV0sIF9UX0VDTElQU0UoIiVzL2xpYi8lcyIpLCBlbnRyeSwgYXJjaCk7Ci0JCQkJLyogb25seSBhZGQgaWYgdGhlIHBhdGggYWN0dWFsbHkgZXhpc3RzICovCi0JCQkJaWYgKF90c3RhdChwYXRoc1tpXSwgJnN0YXRzKSA9PSAwKSB7Ci0JCQkJCV9UQ0hBUiBzZXBhcmF0b3JTdHJpbmdbXSA9IHsgcGF0aFNlcGFyYXRvciwgMCB9OwotCQkJCQlfdGNzY2F0KHBhdGhzW2ldLCBzZXBhcmF0b3JTdHJpbmcpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZyZWUocGF0aHNbaV0pOwotCQkJCQlwYXRoc1tpXSA9IE5VTEw7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwYXRoc1tpXSA9IG1hbGxvYygoX3Rjc2xlbihlbnRyeSkgKyAyKSAqIHNpemVvZihfVENIQVIpKTsKLQkJCQlfc3RwcmludGYoIHBhdGhzW2ldLCBfVF9FQ0xJUFNFKCIlcyVjIiksIGVudHJ5LCBwYXRoU2VwYXJhdG9yICk7Ci0JCQl9Ci0JCQlpZiAoZW50cnkgIT0gcGF0aCkKLQkJCQlmcmVlKGVudHJ5KTsKLQkJCXBhdGggPSBOVUxMOwotCQl9Ci0JfQotCQotCWZyZWUoYnVmZmVyKTsKLQlyZXR1cm4gcGF0aHM7Ci19Ci0KLS8qIHRyYW5zbGF0ZSB0aGUgb3NBcmNoQXJnIGludG8gdGhlIHZhbHVlIHRoYXQgd2UgZXhwZWN0IHRoZSBqcmUgdG8gdXNlICovCi1jb25zdCBfVENIQVIqIGdldFZNQXJjaCgpIHsKLQlpZiAoX3Rjc2NtcChvc0FyY2hBcmcsIF9UX0VDTElQU0UoIng4Nl82NCIpKSA9PSAwKQotCQlyZXR1cm4gX1RfRUNMSVBTRSgiYW1kNjQiKTsKLQllbHNlIGlmIChfdGNzY21wKG9zQXJjaEFyZywgX1RfRUNMSVBTRSgieDg2IikpID09IDApCi0JCXJldHVybiBfVF9FQ0xJUFNFKCJpMzg2Iik7Ci0JZWxzZQotCQlyZXR1cm4gb3NBcmNoQXJnOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlQ29tbW9uLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VDb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjMWE3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VDb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDU3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBBbmRyZXcgTmllZmVyCi0gKiBNYXJ0aW4gT2Jlcmh1YmVyIChXaW5kIFJpdmVyKSAtIFsxNzY4MDVdIFN1cHBvcnQgU29sYXJpczkgYnkgYWRkaW5nIHNldGVudigpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSNpbmNsdWRlICJlY2xpcHNlQ29tbW9uLmgiCi0jaW5jbHVkZSAiZWNsaXBzZVVuaWNvZGUuaCIKLQotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotLyogR2xvYmFsIFZhcmlhYmxlcyAqLwotX1RDSEFSKiBvc0FyZyAgICAgICAgPSBfVF9FQ0xJUFNFKERFRkFVTFRfT1MpOwotI2lmZGVmIE1BQ09TWAotCS8qIG9uIHRoZSBtYWMgd2UgaGF2ZSBhIHVuaXZlcnNhbCBiaW5hcnksIGRlY2lkZSBwcGMgdnMgeDg2IGJhc2VkIG9uIGVuZGlhbm5lc3MgKi8KLQkjaWZkZWYgX19CSUdfRU5ESUFOX18KLQkJX1RDSEFSKiBvc0FyY2hBcmcgICAgPSBfVF9FQ0xJUFNFKCJwcGMiKTsKLQkjZWxzZQotCQlfVENIQVIqIG9zQXJjaEFyZyAgICA9IF9UX0VDTElQU0UoREVGQVVMVF9PU19BUkNIKTsKLQkjZW5kaWYKLSNlbHNlCi1fVENIQVIqIG9zQXJjaEFyZyAgICA9IF9UX0VDTElQU0UoREVGQVVMVF9PU19BUkNIKTsKLSNlbmRpZgotX1RDSEFSKiB3c0FyZyAgICAgICAgPSBfVF9FQ0xJUFNFKERFRkFVTFRfV1MpOwkvKiB0aGUgU1dUIHN1cHBvcnRlZCBHVUkgdG8gYmUgdXNlZCAqLwotCi0vKiBMb2NhbCBWYXJpYWJsZXMgKi8KLXN0YXRpYyBfVENIQVIqIGZpbHRlclByZWZpeCA9IE5VTEw7ICAvKiBwcmVmaXggZm9yIHRoZSBmaW5kIGZpbGVzIGZpbHRlciAqLwotc3RhdGljIHNpemVfdCAgcHJlZml4TGVuZ3RoID0gMDsKLQotc3RhdGljIGludCBpc0ZvbGRlcihjb25zdCBfVENIQVIqIHBhdGgsIGNvbnN0IF9UQ0hBUiogZW50cnkpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHNlZ21lbnRbM107Ci0JX1RDSEFSICogcXVhbGlmaWVyOwotfSBWZXJzaW9uOwotCi1zdGF0aWMgdm9pZCBmcmVlVmVyc2lvbihWZXJzaW9uICp2ZXJzaW9uKQotewotCWlmKHZlcnNpb24tPnF1YWxpZmllcikKLQkJZnJlZSh2ZXJzaW9uLT5xdWFsaWZpZXIpOwotCWZyZWUodmVyc2lvbik7Ci19Ci0KLXN0YXRpYyBWZXJzaW9uKiBwYXJzZVZlcnNpb24oY29uc3QgX1RDSEFSICogc3RyKSB7Ci0JX1RDSEFSICpjb3B5OwotCV9UQ0hBUiAqYzEsICpjMiA9IE5VTEw7Ci0JaW50IGkgPSAwOwotCQotCVZlcnNpb24gKnZlcnNpb24gPSBtYWxsb2Moc2l6ZW9mKFZlcnNpb24pKTsKLQltZW1zZXQodmVyc2lvbiwgMCwgc2l6ZW9mKFZlcnNpb24pKTsKLQkKLQljMSA9IGNvcHkgPSBfdGNzZHVwKHN0cik7Ci0Jd2hpbGUgKGMxICYmICpjMSAhPSAwKQotCXsKLQkJaWYgKGkgPCAzKSB7Ci0JCQl2ZXJzaW9uLT5zZWdtZW50W2ldID0gKGludClfdGNzdG9sKGMxLCAmYzIsIDEwKTsKLQkJCS8qIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBub3QgJy4nLCB0aGVuIHdlIGNvdWxkbid0Ci0JCQkgKiBwYXJzZSBhcyBhIGludCwgdGhlIHJlbWFpbmRlciBpcyBub3QgdmFsaWQgKG9yIHdlIGFyZSBhdCB0aGUgZW5kKSovCi0JCQlpZiAoKmMyICYmICpjMiAhPSBfVF9FQ0xJUFNFKCcuJykpCi0JCQkJYnJlYWs7Ci0JCQljMisrOyAvKiBpbmNyZW1lbnQgcGFzdCB0aGUgLiAqLwotCQl9IGVsc2UgewotCQkJYzIgPSBfdGNzY2hyKGMxLCBfVF9FQ0xJUFNFKCcuJykpOwotCQkJaWYoYzIgIT0gTlVMTCkgewotCQkJCSpjMiA9IDA7Ci0JCQkJdmVyc2lvbi0+cXVhbGlmaWVyID0gX3Rjc2R1cChjMSk7Ci0JCQkJKmMyID0gX1RfRUNMSVBTRSgnLicpOyAvKiBwdXQgdGhlIGRvdCBiYWNrICovCi0JCQl9IGVsc2UgewotCQkJCWlmKF90Y3NpY21wKGMxLCBfVF9FQ0xJUFNFKCJqYXIiKSkgPT0gMCkKLQkJCQkJdmVyc2lvbi0+cXVhbGlmaWVyID0gMDsKLQkJCQllbHNlCi0JCQkJCXZlcnNpb24tPnF1YWxpZmllciA9IF90Y3NkdXAoYzEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYzEgPSBjMjsKLQkJaSsrOwotCX0KLQlmcmVlKGNvcHkpOwotCXJldHVybiB2ZXJzaW9uOwotfQotCi1zdGF0aWMgaW50IGNvbXBhcmVWZXJzaW9ucyhjb25zdCBfVENIQVIqIHN0cjEsIGNvbnN0IF9UQ0hBUiogc3RyMikgewotCWludCByZXN1bHQgPSAwLCBpID0gMDsKLQlWZXJzaW9uICp2MSA9IHBhcnNlVmVyc2lvbihzdHIxKTsKLQlWZXJzaW9uICp2MiA9IHBhcnNlVmVyc2lvbihzdHIyKTsKLQkKLQl3aGlsZSAocmVzdWx0ID09IDAgJiYgaSA8IDMpIHsKLQkJcmVzdWx0ID0gdjEtPnNlZ21lbnRbaV0gLSB2Mi0+c2VnbWVudFtpXTsKLQkJaSsrOwotCX0KLQlpZihyZXN1bHQgPT0gMCkgewotCQlfVENIQVIgKiBxMSA9IHYxLT5xdWFsaWZpZXIgPyB2MS0+cXVhbGlmaWVyIDogX1RfRUNMSVBTRSgiIik7Ci0JCV9UQ0hBUiAqIHEyID0gdjItPnF1YWxpZmllciA/IHYyLT5xdWFsaWZpZXIgOiBfVF9FQ0xJUFNFKCIiKTsKLQkJcmVzdWx0ID0gIF90Y3NjbXAocTEsIHEyKTsKLQl9Ci0JCi0JZnJlZVZlcnNpb24odjEpOwotCWZyZWVWZXJzaW9uKHYyKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnQgYSB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBvbmUKLSAqIENhbGxlciBtdXN0IGZyZWUgdGhlIG51bGwgdGVybWluYXRlZCBzdHJpbmcgcmV0dXJuZWQuCi0gKi8KLWNoYXIgKnRvTmFycm93KGNvbnN0IF9UQ0hBUiogc3JjKQotewotI2lmZGVmIFVOSUNPREUKLQlpbnQgYnl0ZUNvdW50ID0gV2lkZUNoYXJUb011bHRpQnl0ZSAoQ1BfQUNQLCAwLCAod2NoYXJfdCAqKXNyYywgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotCWNoYXIgKmRlc3QgPSBtYWxsb2MoYnl0ZUNvdW50KzEpOwotCWRlc3RbYnl0ZUNvdW50XSA9IDA7Ci0JV2lkZUNoYXJUb011bHRpQnl0ZSAoQ1BfQUNQLCAwLCAod2NoYXJfdCAqKXNyYywgLTEsIGRlc3QsIGJ5dGVDb3VudCwgTlVMTCwgTlVMTCk7Ci0JcmV0dXJuIGRlc3Q7Ci0jZWxzZQotCXJldHVybiAoY2hhciopX3Rjc2R1cChzcmMpOwotI2VuZGlmCi19Ci0KLQotLyoqCi0gKiBTZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gKiBTb2xhcmlzIHZlcnNpb25zIDw9IFNvbGFyaXMgOSBkaWQgbm90IGtub3cgc2V0ZW52IGluIGxpYmMsCi0gKiBzbyBlbXVsYXRlIGl0IGhlcmUuCi0gKi8KLSNpZiBkZWZpbmVkKFNPTEFSSVMpIHx8IGRlZmluZWQoSFBVWCkKLWludCBzZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgcmVwbGFjZSkKLXsKLQlpbnQgbmFtZWxlbiwgdmFsdWVsZW4sIHJjOwotCWNoYXIgKnZhcjsKLQlpZiAocmVwbGFjZSA9PSAwKSB7Ci0JCWNvbnN0IGNoYXIgKm9sZHZhbCA9IGdldGVudihuYW1lKTsKLQkJaWYgKG9sZHZhbCAhPSBOVUxMKSB7Ci0JCQlyZXR1cm4gMDsKLQkgICAgfQotCX0KLQluYW1lbGVuID0gc3RybGVuKG5hbWUpOwotCXZhbHVlbGVuID0gc3RybGVuKHZhbHVlKTsKLQl2YXIgPSBtYWxsb2MoIChuYW1lbGVuICsgdmFsdWVsZW4gKyAyKSAqIHNpemVvZihjaGFyKSApOwotCWlmICh2YXIgPT0gTlVMTCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIFVzZSBzdHJuY3B5IGFzIHByb3RlY3Rpb24sIGluIGNhc2UgYSB0aHJlYWQgbW9kaWZpZXMgdmFyCi0JICogYWZ0ZXIgd2Ugb2J0YWluZWQgaXRzIGxlbmd0aCAqLwotCXN0cm5jcHkodmFyLCBuYW1lLCBuYW1lbGVuKTsKLQl2YXJbbmFtZWxlbl0gPSAnPSc7Ci0Jc3RybmNweSggJnZhcltuYW1lbGVuICsgMV0sIHZhbHVlLCB2YWx1ZWxlbik7Ci0JdmFyW25hbWVsZW4gKyB2YWx1ZWxlbiArIDFdID0gJ1wwJzsKLQlyYyA9IHB1dGVudih2YXIpOwotCWlmIChyYyAhPSAwKSByYyA9IC0xOyAvKnB1dGVudiByZXR1cm5zIG5vbi16ZXJvIG9uIGVycm9yOyBzZXRlbnYgLTEqLwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotIAkKLSAvKgotICogRmluZCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUgdG8gd2hlcmUgYSBjb21tYW5kIHJlc2lkZXMuCi0gKgotICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24gbXVzdCBiZSBmcmVlZC4KLSAqLwotI2RlZmluZSBFWFRSQSAyMAotX1RDSEFSKiBmaW5kQ29tbWFuZCggX1RDSEFSKiBjb21tYW5kICkKLXsKLQlyZXR1cm4gZmluZFN5bWxpbmtDb21tYW5kKCBjb21tYW5kLCAxICk7Ci19Ci0KLV9UQ0hBUiogZmluZFN5bWxpbmtDb21tYW5kKCBfVENIQVIqIGNvbW1hbmQsIGludCByZXNvbHZlICkKLXsKLSAgICBfVENIQVIqICBjbWRQYXRoOwotICAgIHNpemVfdCAgIGxlbmd0aDsKLSAgICBfVENIQVIqICBjaDsKLSAgICBfVENIQVIqICBkaXI7Ci0gICAgX1RDSEFSKiAgcGF0aDsKLSAgICBzdHJ1Y3QgX3N0YXQgc3RhdHM7Ci0KLSAgICAvKiBJZiB0aGUgY29tbWFuZCB3YXMgYW4gYWJvbHV0ZSBwYXRobmFtZSwgdXNlIGl0IGFzIGlzLiAqLwotICAgIGlmIChJU19BQlNPTFVURShjb21tYW5kKSkKLSAgICB7Ci0gICAgICAgIGxlbmd0aCA9IF90Y3NsZW4oIGNvbW1hbmQgKTsKLSAgICAgICAgY21kUGF0aCA9IG1hbGxvYyggKGxlbmd0aCArIEVYVFJBKSAqIHNpemVvZihfVENIQVIpICk7IC8qIGFkZCBleHRyYSBzcGFjZSBmb3IgYSBwb3NzaWJsZSAiLmV4ZSIgZXh0ZW5zaW9uICovCi0gICAgICAgIF90Y3NjcHkoIGNtZFBhdGgsIGNvbW1hbmQgKTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBJZiB0aGUgY29tbWFuZCBzdHJpbmcgY29udGFpbnMgYSBwYXRoIHNlcGFyYXRvciAqLwotICAgICAgICBpZiAoZmlyc3REaXJTZXBhcmF0b3IoIGNvbW1hbmQgKSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJdCBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gKi8KLSAgICAgICAgICAgIGxlbmd0aCA9IE1BWF9QQVRIX0xFTkdUSCArIEVYVFJBICsgX3Rjc2xlbiggY29tbWFuZCApOwotICAgICAgICAgICAgY21kUGF0aCA9IG1hbGxvYyggbGVuZ3RoICogc2l6ZW9mIChfVENIQVIpKTsKLSAgICAgICAgICAgIF90Z2V0Y3dkKCBjbWRQYXRoLCBsZW5ndGggKTsKLSAgICAgICAgICAgIGxlbmd0aCA9IF90Y3NsZW4oY21kUGF0aCk7Ci0gICAgICAgICAgICBpZiAoIUlTX0RJUl9TRVBBUkFUT1IoY21kUGF0aFsgbGVuZ3RoIC0gMSBdKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbWRQYXRoWyBsZW5ndGggXSA9IGRpclNlcGFyYXRvcjsKLSAgICAgICAgICAgICAgICBjbWRQYXRoWyBsZW5ndGgrMSBdID0gX1RfRUNMSVBTRSgnXDAnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF90Y3NjYXQoIGNtZFBhdGgsIGNvbW1hbmQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGVsc2UgdGhlIGNvbW1hbmQgbXVzdCBiZSBpbiB0aGUgUEFUSCBzb21ld2hlcmUgKi8KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgdGhlIGRpcmVjdG9yeSBQQVRIIHdoZXJlIGV4ZWN1dGFibGVzIHJlc2lkZS4gKi8KLSAgICAgICAgICAgIHBhdGggPSBfdGdldGVudiggX1RfRUNMSVBTRSgiUEFUSCIpICk7Ci0jaWZkZWYgX1dJTjMyCi0gICAgICAgICAgICAvKiBvbiB3aW5kb3dzLCBwcmVwZW5kIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLwotICAgICAgICAgICAgaWYgKHBhdGggPT0gTlVMTCkKLSAgICAgICAgICAgIAlwYXRoID0gX1RfRUNMSVBTRSgiIik7Ci0gICAgICAgICAgICBjaCA9IG1hbGxvYygoX3Rjc2xlbihwYXRoKSArIE1BWF9QQVRIX0xFTkdUSCArIDIpICogc2l6ZW9mKF9UQ0hBUikpOwotICAgICAgICAgICAgX3RnZXRjd2QoIGNoLCBNQVhfUEFUSF9MRU5HVEggKTsKLSAgICAgICAgICAgIGxlbmd0aCA9IF90Y3NsZW4oY2gpOwotICAgICAgICAgICAgY2hbbGVuZ3RoXSA9IHBhdGhTZXBhcmF0b3I7Ci0gICAgICAgICAgICBfdGNzY3B5KCZjaFtsZW5ndGggKyAxXSwgcGF0aCk7Ci0gICAgICAgICAgICBwYXRoID0gY2g7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICghcGF0aCkKLSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICBsZW5ndGggPSBfdGNzbGVuKCBwYXRoICkgKyBfdGNzbGVuKCBjb21tYW5kICkgKyBNQVhfUEFUSF9MRU5HVEg7Ci0JICAgICAgICAgICAgY21kUGF0aCA9IG1hbGxvYyggbGVuZ3RoICogc2l6ZW9mKF9UQ0hBUikpOwotCQotCSAgICAgICAgICAgIC8qIEZvcmVhY2ggZGlyZWN0b3J5IGluIHRoZSBQQVRIICovCi0JICAgICAgICAgICAgZGlyID0gcGF0aDsKLQkgICAgICAgICAgICB3aGlsZSAoZGlyICE9IE5VTEwgJiYgKmRpciAhPSBfVF9FQ0xJUFNFKCdcMCcpKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgY2ggPSBfdGNzY2hyKCBkaXIsIHBhdGhTZXBhcmF0b3IgKTsKLQkgICAgICAgICAgICAgICAgaWYgKGNoID09IE5VTEwpCi0JICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgIF90Y3NjcHkoIGNtZFBhdGgsIGRpciApOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIGVsc2UKLQkgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gY2ggLSBkaXI7Ci0JICAgICAgICAgICAgICAgICAgICBfdGNzbmNweSggY21kUGF0aCwgZGlyLCBsZW5ndGggKTsKLQkgICAgICAgICAgICAgICAgICAgIGNtZFBhdGhbIGxlbmd0aCBdID0gX1RfRUNMSVBTRSgnXDAnKTsKLQkgICAgICAgICAgICAgICAgICAgIGNoKys7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgZGlyID0gY2g7IC8qIGFkdmFuY2UgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLwotCi0jaWZkZWYgX1dJTjMyCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBxdW90ZXMgKi8KLQkgICAgICAgICAgICAgICAgaWYgKF90Y3NjaHIoIGNtZFBhdGgsIF9UX0VDTElQU0UoJyInKSApICE9IE5VTEwpCi0JICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMCwgaiA9IDA7Ci0JICAgICAgICAgICAgICAgICAgICBfVENIQVIgYzsKLQkgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IF90Y3NsZW4oIGNtZFBhdGggKTsKLQkgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNtZFBhdGhbIGkrKyBdOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09IF9UX0VDTElQU0UoJyInKSkgY29udGludWU7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgY21kUGF0aFsgaisrIF0gPSBjOwotCSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgY21kUGF0aFsgaiBdID0gX1RfRUNMSVBTRSgnXDAnKTsKLQkgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0JICAgICAgICAgICAgICAgIC8qIERldGVybWluZSBpZiB0aGUgZXhlY3V0YWJsZSByZXNpZGVzIGluIHRoaXMgZGlyZWN0b3J5LiAqLwotCSAgICAgICAgICAgICAgICBpZiAoY21kUGF0aFswXSA9PSBfVF9FQ0xJUFNFKCcuJykgJiYKLQkgICAgICAgICAgICAgICAgICAgKF90Y3NsZW4oY21kUGF0aCkgPT0gMSB8fCAoX3Rjc2xlbihjbWRQYXRoKSA9PSAyICYmIElTX0RJUl9TRVBBUkFUT1IoY21kUGF0aFsxXSkpKSkKLQkgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAJX3RnZXRjd2QoIGNtZFBhdGgsIE1BWF9QQVRIX0xFTkdUSCApOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIGxlbmd0aCA9IF90Y3NsZW4oY21kUGF0aCk7Ci0JICAgICAgICAgICAgICAgIGlmICghSVNfRElSX1NFUEFSQVRPUihjbWRQYXRoWyBsZW5ndGggLSAxIF0pKQotCSAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICBjbWRQYXRoWyBsZW5ndGggXSA9IGRpclNlcGFyYXRvcjsKLQkgICAgICAgICAgICAgICAgICAgIGNtZFBhdGhbIGxlbmd0aCsxIF0gPSBfVF9FQ0xJUFNFKCdcMCcpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIF90Y3NjYXQoIGNtZFBhdGgsIGNvbW1hbmQgKTsKLQkKLQkgICAgICAgICAgICAgICAgLyogSWYgdGhlIGZpbGUgaXMgbm90IGEgZGlyZWN0b3J5IGFuZCBjYW4gYmUgZXhlY3V0ZWQgKi8KLQkgICAgICAgICAgICAgICAgaWYgKF90c3RhdCggY21kUGF0aCwgJnN0YXRzICkgPT0gMCAmJiAoc3RhdHMuc3RfbW9kZSAmIFNfSUZSRUcpICE9IDApCi0JICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgIC8qIFN0b3Agc2VhcmNoaW5nICovCi0JICAgICAgICAgICAgICAgICAgICBkaXIgPSBOVUxMOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgX1dJTjMyCi0JLyogSWYgdGhlIGNvbW1hbmQgZG9lcyBub3QgZXhpc3QgKi8KLSAgICBpZiAoX3RzdGF0KCBjbWRQYXRoLCAmc3RhdHMgKSAhPSAwIHx8IChzdGF0cy5zdF9tb2RlICYgU19JRlJFRykgPT0gMCkKLSAgICB7Ci0gICAgCS8qIElmIHRoZSBjb21tYW5kIGRvZXMgbm90IGVuZCB3aXRoIC5leGUsIGFwcGVuZCBpdCBhbiB0cnkgYWdhaW4uICovCi0gICAgCWxlbmd0aCA9IF90Y3NsZW4oIGNtZFBhdGggKTsKLSAgICAJaWYgKGxlbmd0aCA+IDQgJiYgX3Rjc2ljbXAoICZjbWRQYXRoWyBsZW5ndGggLSA0IF0sIF9UX0VDTElQU0UoIi5leGUiKSApICE9IDApCi0gICAgCSAgICBfdGNzY2F0KCBjbWRQYXRoLCBfVF9FQ0xJUFNFKCIuZXhlIikgKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIFZlcmlmeSB0aGUgcmVzdWx0aW5nIGNvbW1hbmQgYWN0dWFsbHkgZXhpc3RzLiAqLwotICAgIGlmIChfdHN0YXQoIGNtZFBhdGgsICZzdGF0cyApICE9IDAgfHwgKHN0YXRzLnN0X21vZGUgJiBTX0lGUkVHKSA9PSAwKQotICAgIHsKLSAgICAgICAgZnJlZSggY21kUGF0aCApOwotICAgICAgICBjbWRQYXRoID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGNtZFBhdGg7Ci0gICAgfQotCi0JaWYgKHJlc29sdmUpIHsKLQkJY2ggPSByZXNvbHZlU3ltbGlua3MoY21kUGF0aCk7Ci0JCWlmIChjaCAhPSBjbWRQYXRoKSB7Ci0JCQlmcmVlKGNtZFBhdGgpOwotCQkJY21kUGF0aCA9IGNoOwotCQl9Ci0JfQotCXJldHVybiBjbWRQYXRoOwotfQotCi0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChNQUNPU1gpCi1jaGFyICogcmVzb2x2ZVN5bWxpbmtzKCBjaGFyICogcGF0aCApIHsKLQljaGFyICogY2gsICpidWZmZXI7Ci0JaWYocGF0aCA9PSBOVUxMKQotCQlyZXR1cm4gcGF0aDsKLQkvKiByZXNvbHZlIHN5bWxpbmtzICovCi0JY2ggPSBwYXRoOwotCWJ1ZmZlciA9IG1hbGxvYyhQQVRIX01BWCk7Ci0gICAgcGF0aCA9IHJlYWxwYXRoKHBhdGgsIGJ1ZmZlcik7Ci0gICAgaWYgKHBhdGggIT0gYnVmZmVyKQotICAgIAlmcmVlKGJ1ZmZlcik7Ci0gICAgaWYgKHBhdGggPT0gTlVMTCkKLSAgICAJcmV0dXJuIGNoOyAvKiBmYWlsZWQgdG8gcmVzb2x2ZSB0aGUgbGlua3MsIHJldHVybiBvcmlnaW5hbCBwYXRoICovCi0gICAgcmV0dXJuIHBhdGg7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIF9XSU4zMgotc3RhdGljIGludCBmaWx0ZXIoX1RDSEFSKiBjYW5kaWRhdGUsIGludCBpc0ZvbGRlcikgewotI2Vsc2UKLSNpZmRlZiBNQUNPU1gKLXN0YXRpYyBpbnQgZmlsdGVyKHN0cnVjdCBkaXJlbnQgKmRpciwgaW50IGlzRm9sZGVyKSB7Ci0jZWxzZQotc3RhdGljIGludCBmaWx0ZXIoY29uc3Qgc3RydWN0IGRpcmVudCAqZGlyLCBpbnQgaXNGb2xkZXIpIHsKLSNlbmRpZgotCWNoYXIgKiBjYW5kaWRhdGUgPSAoY2hhciAqKWRpci0+ZF9uYW1lOwotI2VuZGlmCi0JX1RDSEFSICpsYXN0RG90LCAqbGFzdFVuZGVyc2NvcmU7Ci0JaW50IHJlc3VsdDsKLQkKLQlpZihfdGNzbGVuKGNhbmRpZGF0ZSkgPD0gcHJlZml4TGVuZ3RoKQotCQlyZXR1cm4gMDsKLQlpZiAoX3Rjc25jbXAoY2FuZGlkYXRlLCBmaWx0ZXJQcmVmaXgsIHByZWZpeExlbmd0aCkgIT0gMCB8fAljYW5kaWRhdGVbcHJlZml4TGVuZ3RoXSAhPSBfVF9FQ0xJUFNFKCdfJykpCi0JCXJldHVybiAwOwotCQotCWNhbmRpZGF0ZSA9IF90Y3NkdXAoY2FuZGlkYXRlKTsKLQkKLQkvKiByZW1vdmUgdHJhaWxpbmcgLmphciBhbmQgLnppcCBleHRlbnNpb25zLCBsZWF2ZSBvdGhlciBleHRlbnNpb25zIGJlY2F1c2Ugd2UgbmVlZCB0aGUgJy4nICAqLwotCWxhc3REb3QgPSBfdGNzcmNocihjYW5kaWRhdGUsIF9UX0VDTElQU0UoJy4nKSk7Ci0JaWYgKCFpc0ZvbGRlciAmJiBsYXN0RG90ICE9IE5VTEwgJiYgKF90Y3NjbXAobGFzdERvdCwgX1RfRUNMSVBTRSgiLmphciIpKSA9PSAwIHx8IF90Y3NjbXAobGFzdERvdCwgX1RfRUNMSVBTRSgiLnppcCIpKSA9PSAwKSkgewotCQkqbGFzdERvdCA9IDA7Ci0JCWxhc3REb3QgPSBfdGNzcmNocihjYW5kaWRhdGUsIF9UX0VDTElQU0UoJy4nKSk7Ci0JfQotCQotCWlmIChsYXN0RG90IDwgJmNhbmRpZGF0ZVtwcmVmaXhMZW5ndGhdKSB7Ci0JCWZyZWUoY2FuZGlkYXRlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCWxhc3RVbmRlcnNjb3JlID0gX3Rjc3JjaHIoY2FuZGlkYXRlLCBfVF9FQ0xJUFNFKCdfJykpOwotCQotCS8qIGdldCBwYXN0IGFsbCB0aGUgJ18nIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHF1YWxpZmllciAqLwotCXdoaWxlKGxhc3RVbmRlcnNjb3JlID4gbGFzdERvdCkgewotCQkqbGFzdFVuZGVyc2NvcmUgPSAwOwotCQlsYXN0VW5kZXJzY29yZSA9IF90Y3NyY2hyKGNhbmRpZGF0ZSwgX1RfRUNMSVBTRSgnXycpKTsgCi0JfQotCS8qIGlzIHRoaXMgdGhlIHVuZGVyc2NvcmUgYXQgdGhlIGVuZCBvZiB0aGUgcHJlZml4PyAqLwotCXJlc3VsdCA9IChsYXN0VW5kZXJzY29yZSA9PSAmY2FuZGlkYXRlW3ByZWZpeExlbmd0aF0pOwotCWZyZWUoY2FuZGlkYXRlKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0gLyogCi0gKiBMb29rcyBmb3IgZmlsZXMgb2YgdGhlIGZvcm0gL3BhdGgvcHJlZml4X3ZlcnNpb24uPGV4dGVuc2lvbj4gYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aCB0bwotICogdGhlIGZpbGUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlcgotICovIAotX1RDSEFSKiBmaW5kRmlsZSggX1RDSEFSKiBwYXRoLCBfVENIQVIqIHByZWZpeCkKLXsKLQlzdHJ1Y3QgX3N0YXQgc3RhdHM7Ci0Jc2l6ZV90IHBhdGhMZW5ndGg7Ci0JX1RDSEFSKiBjYW5kaWRhdGUgPSBOVUxMOwotCV9UQ0hBUiogcmVzdWx0ID0gTlVMTDsKLQkKLSNpZmRlZiBfV0lOMzIKLQlfVENIQVIqIGZpbGVOYW1lID0gTlVMTDsKLQlXSU4zMl9GSU5EX0RBVEEgZGF0YTsKLQlIQU5ETEUgaGFuZGxlOwotI2Vsc2UJCi0JRElSICpkaXIgPSBOVUxMOwotCXN0cnVjdCBkaXJlbnQgKiBlbnRyeSA9IE5VTEw7Ci0jZW5kaWYKLQkKLQlwYXRoID0gX3Rjc2R1cChwYXRoKTsKLQlwYXRoTGVuZ3RoID0gX3Rjc2xlbihwYXRoKTsKLQkKLQkvKiBzdHJpcCBkaXJTZXBhcmF0b3JzIG9mZiB0aGUgZW5kICovCi0Jd2hpbGUgKElTX0RJUl9TRVBBUkFUT1IocGF0aFtwYXRoTGVuZ3RoIC0gMV0pKSB7Ci0JCXBhdGhbLS1wYXRoTGVuZ3RoXSA9IDA7Ci0JfQotCQotCS8qIGRvZXMgcGF0aCBleGlzdD8gKi8KLQlpZiggX3RzdGF0KHBhdGgsICZzdGF0cykgIT0gMCApIHsKLQkJZnJlZShwYXRoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWZpbHRlclByZWZpeCA9IHByZWZpeDsKLQlwcmVmaXhMZW5ndGggPSBfdGNzbGVuKHByZWZpeCk7Ci0jaWZkZWYgX1dJTjMyCi0JZmlsZU5hbWUgPSBtYWxsb2MoIChfdGNzbGVuKHBhdGgpICsgMSArIF90Y3NsZW4ocHJlZml4KSArIDMpICogc2l6ZW9mKF9UQ0hBUikpOwotCV9zdHByaW50ZihmaWxlTmFtZSwgX1RfRUNMSVBTRSgiJXMlYyVzXyoiKSwgcGF0aCwgZGlyU2VwYXJhdG9yLCBwcmVmaXgpOwotCQotCWhhbmRsZSA9IEZpbmRGaXJzdEZpbGUoZmlsZU5hbWUsICZkYXRhKTsKLQlpZihoYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJaWYgKGZpbHRlcihkYXRhLmNGaWxlTmFtZSwgaXNGb2xkZXIocGF0aCwgZGF0YS5jRmlsZU5hbWUpKSkKLQkJCWNhbmRpZGF0ZSA9IF90Y3NkdXAoZGF0YS5jRmlsZU5hbWUpOwotCQl3aGlsZShGaW5kTmV4dEZpbGUoaGFuZGxlLCAmZGF0YSkgIT0gMCkgewotCQkJaWYgKGZpbHRlcihkYXRhLmNGaWxlTmFtZSwgaXNGb2xkZXIocGF0aCwgZGF0YS5jRmlsZU5hbWUpKSkgewotCQkJCWlmIChjYW5kaWRhdGUgPT0gTlVMTCkgewotCQkJCQljYW5kaWRhdGUgPSBfdGNzZHVwKGRhdGEuY0ZpbGVOYW1lKTsKLQkJCQl9IGVsc2UgaWYoIGNvbXBhcmVWZXJzaW9ucyhjYW5kaWRhdGUgKyBwcmVmaXhMZW5ndGggKyAxLCBkYXRhLmNGaWxlTmFtZSArIHByZWZpeExlbmd0aCArIDEpIDwgMCkgewotCQkJCQkvKiBjb21wYXJlLCB0YWtlIHRoZSBoaWdoZXN0IHZlcnNpb24gKi8KLQkJCQkJZnJlZShjYW5kaWRhdGUpOwotCQkJCQljYW5kaWRhdGUgPSBfdGNzZHVwKGRhdGEuY0ZpbGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJRmluZENsb3NlKGhhbmRsZSk7Ci0JfQotI2Vsc2UKLQlpZiAoKGRpciA9IG9wZW5kaXIocGF0aCkpID09IE5VTEwpIHsKLQkJZnJlZShwYXRoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgewotCQlpZiAoZmlsdGVyKGVudHJ5LCBpc0ZvbGRlcihwYXRoLCBlbnRyeS0+ZF9uYW1lKSkpIHsKLQkJCWlmIChjYW5kaWRhdGUgPT0gTlVMTCkgewotCQkJCWNhbmRpZGF0ZSA9IF90Y3NkdXAoZW50cnktPmRfbmFtZSk7Ci0JCQl9IGVsc2UgaWYgKGNvbXBhcmVWZXJzaW9ucyhjYW5kaWRhdGUgKyBwcmVmaXhMZW5ndGggKyAxLCBlbnRyeS0+ZF9uYW1lICsgcHJlZml4TGVuZ3RoICsgMSkgPCAwKSB7Ci0JCQkJZnJlZShjYW5kaWRhdGUpOwotCQkJCWNhbmRpZGF0ZSA9IF90Y3NkdXAoZW50cnktPmRfbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JY2xvc2VkaXIoZGlyKTsKLSNlbmRpZgotCi0JaWYoY2FuZGlkYXRlICE9IE5VTEwpIHsKLQkJcmVzdWx0ID0gbWFsbG9jKChwYXRoTGVuZ3RoICsgMSArIF90Y3NsZW4oY2FuZGlkYXRlKSArIDEpICogc2l6ZW9mKF9UQ0hBUikpOwotCQlfdGNzY3B5KHJlc3VsdCwgcGF0aCk7Ci0JCXJlc3VsdFtwYXRoTGVuZ3RoXSA9IGRpclNlcGFyYXRvcjsKLQkJcmVzdWx0W3BhdGhMZW5ndGggKyAxXSA9IDA7Ci0JCV90Y3NjYXQocmVzdWx0LCBjYW5kaWRhdGUpOwotCQlmcmVlKGNhbmRpZGF0ZSk7Ci0JfQotCWZyZWUocGF0aCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IGlzRm9sZGVyKGNvbnN0IF9UQ0hBUiogcGF0aCwgY29uc3QgX1RDSEFSKiBlbnRyeSkgewotCWludCByZXN1bHQgPSAwOwotCXN0cnVjdCBfc3RhdCBzdGF0czsKLQlfVENIQVIgKiBmdWxsUGF0aCA9IG1hbGxvYygoX3Rjc2xlbihwYXRoKSArIF90Y3NsZW4oZW50cnkpICsgMikgKiBzaXplb2YoX1RDSEFSKSk7Ci0JX3N0cHJpbnRmKGZ1bGxQYXRoLCBfVF9FQ0xJUFNFKCIlcyVjJXMiKSwgcGF0aCwgZGlyU2VwYXJhdG9yLCBlbnRyeSk7Ci0JCi0JcmVzdWx0ID0gX3RzdGF0KGZ1bGxQYXRoLCAmc3RhdHMpOwotCWZyZWUoZnVsbFBhdGgpOwotCXJldHVybiAocmVzdWx0ID09IDAgJiYgKHN0YXRzLnN0X21vZGUgJiBTX0lGRElSKSAhPSAwKTsKLX0KLQotLyoKLSAqIElmIHBhdGggaXMgcmVsYXRpdmUsIGF0dGVtcHQgdG8gbWFrZSBpdCBhYnNvbHV0ZSBieSAKLSAqIDEpIGNoZWNrIHJlbGF0aXZlIHRvIHdvcmtpbmcgZGlyZWN0b3J5Ci0gKiAyKSBjaGVjayByZWxhdGl2ZSB0byBwcm92aWRlZCBwcm9ncmFtRGlyCi0gKiBJZiByZXZlcnNlT3JkZXIsIHRoZW4gY2hlY2sgdGhlIHByb2dyYW1EaXIgYmVmb3JlIHRoZSB3b3JraW5nIGRpcgotICovCi1fVENIQVIqIGNoZWNrUGF0aCggX1RDSEFSKiBwYXRoLCBfVENIQVIqIHByb2dyYW1EaXIsIGludCByZXZlcnNlT3JkZXIgKSAKLXsKLQlpbnQgY3dkTGVuZ3RoID0gTUFYX1BBVEhfTEVOR1RIOwotCWludCBpOwotCV9UQ0hBUiAqIHdvcmtpbmdEaXIsICogYnVmZmVyLCAqIHJlc3VsdCA9IE5VTEw7Ci0JX1RDSEFSICogcGF0aHNbMl07Ci0Jc3RydWN0IF9zdGF0IHN0YXRzOwotCQotCS8qIElmIHRoZSBjb21tYW5kIHdhcyBhbiBhYm9sdXRlIHBhdGhuYW1lLCB1c2UgaXQgYXMgaXMuICovCi0gICAgaWYgKElTX0FCU09MVVRFKHBhdGgpKSB7Ci0gICAgCXJldHVybiBwYXRoOwotICAgIH0KLSAgICAKLSAgICAvKiBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KLSAgICB3b3JraW5nRGlyID0gbWFsbG9jKGN3ZExlbmd0aCAqIHNpemVvZihfVENIQVIpKTsKLSAgICB3aGlsZSAoIF90Z2V0Y3dkKCB3b3JraW5nRGlyLCBjd2RMZW5ndGggKSA9PSBOVUxMICl7Ci0gICAgCWlmIChlcnJubyA9PSBFUkFOR0UpIHsKLSAgICAJCS8qIEVSQU5HRSA6IHRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCwgYWxsb2NhdGUgbW9yZSBtZW1vcnkgKi8KLQkJCWN3ZExlbmd0aCAqPSAyOwotCQkJd29ya2luZ0RpciA9IHJlYWxsb2Mod29ya2luZ0RpciwgY3dkTGVuZ3RoICogc2l6ZW9mKF9UQ0hBUikpOwotCQkJY29udGludWU7Ci0gICAgCX0gZWxzZSB7Ci0gICAgCQkvKiBzb21lIG90aGVyIGVycm9yIG9jY3VycmVkLCBwZXJoYXBzIEVOT0VOVCAoZGlyZWN0b3J5IGhhcyBiZWVuIHVubGlua2VkKSAqLwotICAgIAkJLyogdGhlIGNvbnRlbnRzIG9mIHdvcmtpbmdEaXIgYXJlIHVuZGVmaW5lZCwgc2V0IGl0IHRvIGVtcHR5LCB3ZSB3aWxsIGVuZCB1cCB0ZXN0aW5nIGFnYWluc3Qgcm9vdCAqLwotICAgIAkJd29ya2luZ0RpclswXSA9IF9UX0VDTElQU0UoJ1wwJyk7Ci0gICAgCQlicmVhazsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICBwYXRoc1swXSA9IHJldmVyc2VPcmRlciA/IHByb2dyYW1EaXIgOiB3b3JraW5nRGlyOwotICAgIHBhdGhzWzFdID0gcmV2ZXJzZU9yZGVyID8gd29ya2luZ0RpciA6IHByb2dyYW1EaXI7Ci0gICAgCi0gICAgLyoganVzdCBtYWtlIGEgYnVmZmVyIGJpZyBlbm91Z2ggdG8gaG9sZCBldmVyeXRoaW5nICovCi0gICAgYnVmZmVyID0gbWFsbG9jKChfdGNzbGVuKHBhdGhzWzBdKSArIF90Y3NsZW4ocGF0aHNbMV0pICsgX3Rjc2xlbihwYXRoKSArIDIpICogc2l6ZW9mKF9UQ0hBUikpOwotICAgIGZvciAoIGkgPSAwOyBpIDwgMjsgaSsrICkgewotICAgIAlpZiAoX3Rjc2xlbihwYXRoc1tpXSkgPT0gMCkKLSAgICAJCWNvbnRpbnVlOwotICAgIAlfc3RwcmludGYoYnVmZmVyLCBfVF9FQ0xJUFNFKCIlcyVjJXMiKSwgcGF0aHNbaV0sIGRpclNlcGFyYXRvciwgcGF0aCk7Ci0gICAgCWlmIChfdHN0YXQoYnVmZmVyLCAmc3RhdHMpID09IDApIHsKLSAgICAJCXJlc3VsdCA9IF90Y3NkdXAoYnVmZmVyKTsKLSAgICAJCWJyZWFrOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIGZyZWUoYnVmZmVyKTsKLSAgICBmcmVlKHdvcmtpbmdEaXIpOwotICAgIAotICAgIC8qIGlmIHdlIGZvdW5kIHNvbWV0aGluZywgcmV0dXJuIGl0LCBvdGhlcndpc2UsIHJldHVybiB0aGUgb3JpZ2luYWwgKi8KLSAgICByZXR1cm4gcmVzdWx0ICE9IE5VTEwgPyByZXN1bHQgOiBwYXRoOwotfQotCi1fVENIQVIgKiBsYXN0RGlyU2VwYXJhdG9yKF9UQ0hBUiogc3RyKSB7Ci0jaWZuZGVmIF9XSU4zMgotCXJldHVybiBfdGNzcmNocihzdHIsIGRpclNlcGFyYXRvcik7Ci0jZWxzZQotCWludCBpID0gLTE7Ci0JX1RDSEFSICogYyA9IE5VTEw7Ci0Jd2hpbGUgKHN0clsrK2ldICE9IDApIHsKLQkJaWYgKHN0cltpXSA9PSBfVF9FQ0xJUFNFKCdcXCcpIHx8IHN0cltpXSA9PSBfVF9FQ0xJUFNFKCcvJykpCi0JCQljID0gJnN0cltpXTsKLQl9Ci0JcmV0dXJuIGM7Ci0jZW5kaWYKLX0KLQotX1RDSEFSICogZmlyc3REaXJTZXBhcmF0b3IoX1RDSEFSKiBzdHIpIHsKLSNpZmRlZiBfV0lOMzIKLQlyZXR1cm4gX3Rjc3Bicmsoc3RyLCBfVF9FQ0xJUFNFKCJcXC8iKSk7Ci0jZWxzZQotCXJldHVybiBfdGNzY2hyKHN0ciwgZGlyU2VwYXJhdG9yKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlQ29tbW9uLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VDb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1ZjkwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBBbmRyZXcgTmllZmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSNpZm5kZWYgRUNMSVBTRV9DT01NT05fSAotI2RlZmluZSBFQ0xJUFNFX0NPTU1PTl9ICi0KLSNpbmNsdWRlICJlY2xpcHNlVW5pY29kZS5oIgotCi0vKiBWYXJpYWJsZXMgYW5kIE1ldGhvZHMgdGhhdCB3aWxsIGJlIG5lZWRlZCBieSBib3RoIHRoZSBleGVjdXRhYmxlIGFuZCB0aGUgbGlicmFyeSAqLwotCi0jZGVmaW5lIE1BWF9QQVRIX0xFTkdUSCAgIDIwMDAKLQotI2lmZGVmIFVOSUNPREUKLSNkZWZpbmUgcnVuIHJ1blcKLSNkZWZpbmUgc2V0SW5pdGlhbEFyZ3Mgc2V0SW5pdGlhbEFyZ3NXCi0jZGVmaW5lIFJVTl9NRVRIT0QJCSBfVF9FQ0xJUFNFKCJydW5XIikKLSNkZWZpbmUgU0VUX0lOSVRJQUxfQVJHUyBfVF9FQ0xJUFNFKCJzZXRJbml0aWFsQXJnc1ciKQotI2Vsc2UKLSNkZWZpbmUgUlVOX01FVEhPRCAJCSBfVF9FQ0xJUFNFKCJydW4iKQotI2RlZmluZSBTRVRfSU5JVElBTF9BUkdTIF9UX0VDTElQU0UoInNldEluaXRpYWxBcmdzIikKLSNlbmRpZgotCi0jZGVmaW5lIERFRkFVTFRfRVFVSU5PWF9TVEFSVFVQIF9UX0VDTElQU0UoIm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIiKQotCi0jaWZkZWYgX1dJTjMyCi0jZGVmaW5lIElTX0FCU09MVVRFKHBhdGgpIChwYXRoWzBdID09IF9UX0VDTElQU0UoJy8nKSB8fCBwYXRoWzBdID09IF9UX0VDTElQU0UoJ1xcJykgfHwgKHBhdGhbMF0gIT0gMCAmJiBwYXRoWzFdID09IF9UX0VDTElQU0UoJzonKSkpCi0jZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoYykgKGMgPT0gX1RfRUNMSVBTRSgnLycpIHx8IGMgPT0gX1RfRUNMSVBTRSgnXFwnKSkKLSNlbHNlCi0jZGVmaW5lIElTX0FCU09MVVRFKHBhdGgpIChwYXRoWzBdID09IGRpclNlcGFyYXRvcikKLSNkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjKSAoYyA9PSBkaXJTZXBhcmF0b3IpCi0jZW5kaWYKLQotZXh0ZXJuIF9UQ0hBUiogIG9zQXJnOwotZXh0ZXJuIF9UQ0hBUiogIG9zQXJjaEFyZzsKLWV4dGVybiBfVENIQVIqICB3c0FyZzsKLQotZXh0ZXJuIF9UQ0hBUiAgIGRpclNlcGFyYXRvcjsgICAgICAgICAvKiAnLycgb3IgJ1xcJyAqLwotZXh0ZXJuIF9UQ0hBUiAgIHBhdGhTZXBhcmF0b3I7ICAgICAgICAvKiBzZXBhcmF0b3IgdXNlZCBpbiBQQVRIIHZhcmlhYmxlICovCi1leHRlcm4gX1RDSEFSKiBlY2xpcHNlTGlicmFyeTsJCS8qIHBhdGggdGhlIHRoZSBlY2xpcHNlXzx2ZXI+LnNvIHNoYXJlZCBsaWJyYXJ5ICovCi0KLWV4dGVybiBjaGFyICp0b05hcnJvdyhjb25zdCBfVENIQVIqIHNyYyk7Ci0KLSAvKgotICogRmluZCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUgdG8gd2hlcmUgYSBjb21tYW5kIHJlc2lkZXMuCi0gKgotICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24gbXVzdCBiZSBmcmVlZC4KLSAqIFN5bWxpbmtzIGFyZSByZXNvbHZlZAotICovCi1leHRlcm4gX1RDSEFSKiBmaW5kQ29tbWFuZCggX1RDSEFSKiBjb21tYW5kICk7Ci0KLS8qCi0gKiBTYW1lIGFzIGZpbmRDb21tYW5kIGJ1dCBvcHRpb25hbGx5IHJlc29sdmUgc3ltbGlua3MKLSAqLwotZXh0ZXJuIF9UQ0hBUiogZmluZFN5bWxpbmtDb21tYW5kKCBfVENIQVIqIGNvbW1hbmQsIGludCByZXNvbHZlICk7Ci0KLWV4dGVybiBfVENIQVIqIGZpbmRGaWxlKCBfVENIQVIqIHBhdGgsIF9UQ0hBUiogcHJlZml4KTsKLQotZXh0ZXJuIF9UQ0hBUiogZ2V0UHJvZ3JhbURpcigpOwotCi1leHRlcm4gX1RDSEFSKiBnZXRPZmZpY2lhbE5hbWUoKTsKLQotZXh0ZXJuIHZvaWQgc2V0T2ZmaWNpYWxOYW1lKF9UQ0hBUiAqIG5hbWUpOwotCi1leHRlcm4gX1RDSEFSKiBnZXRQcm9ncmFtUGF0aCgpOwotCi1leHRlcm4gdm9pZCBzZXRQcm9ncmFtUGF0aChfVENIQVIqIG5hbWUpOwotCi1leHRlcm4gX1RDSEFSKiByZXNvbHZlU3ltbGlua3MoIF9UQ0hBUiogcGF0aCApOwotCi0vKiogRGlzcGxheSBhIE1lc3NhZ2UKLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSB1c2VyIGJlZm9yZSBleGl0aW5nLgotICogVGhlIG1ldGhvZCBzaG91bGQgbm90IHJldHVybiB1bnRpbCB0aGUgdXNlciBoYXMgYWNrbm93bGVkZ2VkCi0gKiB0aGUgbWVzc2FnZS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHdpbmRvdwotICogc3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkLiBUaGUgcHJvZ3JhbSBzaG91bGQgZXhpdCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICovCi1leHRlcm4gdm9pZCBkaXNwbGF5TWVzc2FnZSggX1RDSEFSKiB0aXRsZSwgX1RDSEFSKiBtZXNzYWdlICk7Ci0KLS8qIExvYWQgdGhlIHNwZWNpZmllZCBzaGFyZWQgbGlicmFyeQotICovCi1leHRlcm4gdm9pZCAqIGxvYWRMaWJyYXJ5KCBfVENIQVIgKiBsaWJyYXJ5ICk7Ci0KLS8qIFVubG9hZCB0aGUgc2hhcmVkIGxpYnJhcnkKLSAqLwotZXh0ZXJuIHZvaWQgdW5sb2FkTGlicmFyeSggdm9pZCAqIGhhbmRsZSApOwotIAotLyogRmluZCB0aGUgZ2l2ZW4gc3ltYm9sIGluIHRoZSBzaGFyZWQgbGlicmFyeQotICovCi1leHRlcm4gdm9pZCAqIGZpbmRTeW1ib2woIHZvaWQgKiBoYW5kbGUsIF9UQ0hBUiAqIHN5bWJvbCApOwotCi0vKiBjaGVjayB0aGUgZ2l2ZW4gcGF0aCBhbmQgYXR0ZW1wdCB0byBtYWtlIGl0IGFic29sdXRlIGlmIGl0IGlzIHJlbGF0aXZlICovCi1leHRlcm4gX1RDSEFSKiBjaGVja1BhdGgoIF9UQ0hBUiogcGF0aCwgX1RDSEFSKiBwcm9ncmFtRGlyLCBpbnQgcmV2ZXJzZU9yZGVyICk7Ci0KLWV4dGVybiBfVENIQVIgKiBsYXN0RGlyU2VwYXJhdG9yKF9UQ0hBUiogc3RyKTsKLQotZXh0ZXJuIF9UQ0hBUiAqIGZpcnN0RGlyU2VwYXJhdG9yKF9UQ0hBUiogc3RyKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlQ29uZmlnLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VDb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4OGM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VDb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCSAgIE1hcnRpbiBPYmVyaHViZXIgKFdpbmQgUml2ZXIpIC0gWzMxNjk3NV0gbWVtb3J5IGxlYWsgb24gZmFpbHVyZSByZWFkaW5nIC5pbmkgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJlY2xpcHNlT1MuaCIKLSNpbmNsdWRlICJlY2xpcHNlQ29uZmlnLmgiCi0KLSNpZmRlZiBfV0lOMzIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIF9fTUlOR1czMl9fCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2Vsc2UgLyogVW5peCBsaWtlIHBsYXRmb3JtcyAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2VuZGlmCi0KLWludCByZWFkSW5pRmlsZShfVENIQVIqIHByb2dyYW0sIGludCAqYXJnYywgX1RDSEFSICoqKmFyZ3YpIAotewotCV9UQ0hBUiogY29uZmlnX2ZpbGUgPSBOVUxMOwotCWludCByZXN1bHQ7Ci0JCi0JaWYgKHByb2dyYW0gPT0gTlVMTCB8fCBhcmdjID09IE5VTEwgfHwgYXJndiA9PSBOVUxMKSByZXR1cm4gLTE7Ci0KLQkvKiBHZXQgYSBjb3B5IHdpdGggcm9vbSBmb3IgLmluaSBhdCB0aGUgZW5kICovCi0JY29uZmlnX2ZpbGUgPSBtYWxsb2MoIChfdGNzbGVuKHByb2dyYW0pICsgNSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0JX3Rjc2NweShjb25maWdfZmlsZSwgcHJvZ3JhbSk7Ci0JCi0jaWZkZWYgX1dJTjMyCi0JewotCQkvKiBTZWFyY2ggZm9yIHRoZSBleHRlbnNpb24gLmV4ZSBhbmQgcmVwbGFjZSBpdCB3aXRoIC5pbmkgKi8KLQkJX1RDSEFSICpleHRlbnNpb24gPSBfdGNzcmNocihjb25maWdfZmlsZSwgX1RfRUNMSVBTRSgnLicpKTsKLQkJaWYgKGV4dGVuc2lvbiA9PSBOVUxMKQotCQl7Ci0JCQkvKiBkb2VzIG5vdCBlbmQgd2l0aCBhbiBleHRlbnNpb24sIGp1c3QgYXBwZW5kIC5pbmkgKi8KLQkJCWV4dGVuc2lvbiA9IGNvbmZpZ19maWxlICsgX3Rjc2xlbihjb25maWdfZmlsZSk7Ci0JCX0KLQkJX3Rjc2NweShleHRlbnNpb24sIF9UX0VDTElQU0UoIi5pbmkiKSk7Ci0jaWZkZWYgX1dJTjMyX0NPTlNPTEUKLQkJewotCQkJLyogV2UgYXJlIHRoZSBjb25zb2xlIHZlcnNpb24sIGlmIHRoZSBpbmkgZmlsZSBkb2VzIG5vdCBleGlzdCwgdHJ5Ci0JCQkgKiByZW1vdmluZyB0aGUgJ2MnIGZyb20gdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbSBuYW1lICovCi0JCQlzdHJ1Y3QgX3N0YXQgc3RhdHM7IAotCQkJaWYgKF90c3RhdCggY29uZmlnX2ZpbGUsICZzdGF0cyApICE9IDAgJiYgKihleHRlbnNpb24gLSAxKSA9PSBfVCgnYycpKSB7Ci0JCQkJX3Rjc2NweShleHRlbnNpb24gLSAxLCBleHRlbnNpb24pOwotCQkJfQotCQl9Ci0jZW5kaWYKLQl9Ci0jZWxzZQotCS8qIEFwcGVuZCB0aGUgZXh0ZW5zaW9uICovCi0Jc3RyY2F0KGNvbmZpZ19maWxlLCAiLmluaSIpOwotI2VuZGlmCi0JCi0JcmVzdWx0ID0gcmVhZENvbmZpZ0ZpbGUoY29uZmlnX2ZpbGUsIGFyZ2MsIGFyZ3YpOwotCWZyZWUoY29uZmlnX2ZpbGUpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCByZWFkQ29uZmlnRmlsZSggX1RDSEFSICogY29uZmlnX2ZpbGUsIGludCAqYXJnYywgX1RDSEFSICoqKmFyZ3YgKQotewotCV9UQ0hBUiAqIGJ1ZmZlcjsKLQlfVENIQVIgKiBhcmd1bWVudDsKLQlfVENIQVIgKiBhcmc7Ci0JRklMRSAqZmlsZSA9IE5VTEw7Ci0JaW50IG1heEFyZ3MgPSAxMjg7Ci0JaW50IGluZGV4OwotCXNpemVfdCBidWZmZXJTaXplID0gMTAyNDsKLQlzaXplX3QgbGVuZ3RoOwotCQotCQotCS8qIE9wZW4gdGhlIGNvbmZpZyBmaWxlIGFzIGEgdGV4dCBmaWxlIAotCSAqIE5vdGUgdGhhdCBjYXJyaWFnZSByZXR1cm4tbGluZWZlZWQgY29tYmluYXRpb24gXHJcbiBhcmUgYXV0b21hdGljYWxseQotCSAqIHRyYW5zbGF0ZWQgaW50byBzaW5nbGUgbGluZWZlZWRzIG9uIGlucHV0IGluIHRoZSB0ICh0cmFuc2xhdGVkKSBtb2RlCi0JICogb24gd2luZG93cywgb24gb3RoZXIgcGxhdGZvcm1zIHdlIHdpbGwgc3RyaXAgdGhlIFxyIGFzIHdoaXRlc3BhY2UuCi0JICovCQotCWZpbGUgPSBfdGZvcGVuKGNvbmZpZ19maWxlLCBfVF9FQ0xJUFNFKCJydCIpKTsJCi0JaWYgKGZpbGUgPT0gTlVMTCkgcmV0dXJuIC0zOwotCi0JLyogYWxsb2NhdGUgYnVmZmVycyAqLwotCWJ1ZmZlciA9ICAoX1RDSEFSKiltYWxsb2MoYnVmZmVyU2l6ZSAqIHNpemVvZihfVENIQVIpKTsKLQlhcmd1bWVudCA9IChfVENIQVIqKW1hbGxvYyhidWZmZXJTaXplICogc2l6ZW9mKF9UQ0hBUikpOwotCSphcmd2ID0gKF9UQ0hBUiAqKiltYWxsb2MoKDEgKyBtYXhBcmdzKSAqIHNpemVvZihfVENIQVIqKSk7Ci0JCi0JaW5kZXggPSAwOwotCQotCS8qIFBhcnNlIGV2ZXJ5IGxpbmUgKi8JCi0Jd2hpbGUgKF9mZ2V0dHMoYnVmZmVyLCBidWZmZXJTaXplLCBmaWxlKSAhPSBOVUxMKQotCXsKLQkJLyogZGlkIHdlIGZpbGwgdGhlIGJ1ZmZlciB3aXRob3V0IHJlYWNoaW5nIHRoZSBlbmQgb2YgYSBsaW5lPyAqLwotCQl3aGlsZSAoYnVmZmVyW2J1ZmZlclNpemUgLSAyXSAhPSBfVF9FQ0xJUFNFKCdcbicpICYmIF90Y3NsZW4oYnVmZmVyKSA9PSAoYnVmZmVyU2l6ZSAtIDEpKSB7Ci0JCQlidWZmZXJTaXplICs9IDEwMjQ7Ci0JCQlidWZmZXIgPSAoX1RDSEFSKilyZWFsbG9jKGJ1ZmZlciwgYnVmZmVyU2l6ZSAqIHNpemVvZihfVENIQVIpKTsKLQkJCWFyZ3VtZW50ID0gIChfVENIQVIqKXJlYWxsb2MoYXJndW1lbnQsIGJ1ZmZlclNpemUgKiBzaXplb2YoX1RDSEFSKSk7Ci0JCQlidWZmZXJbYnVmZmVyU2l6ZSAtIDJdID0gMDsKLQkJCQotCQkJLyogcmVhZCB0aGUgbmV4dCBjaHVuayB0byBvdmVyd3JpdGUgdGhlIFwwIGxlZnQgYnkgdGhlIGxhc3QgcmVhZCAqLwotCQkJaWYoX2ZnZXR0cyhidWZmZXIgKyBidWZmZXJTaXplIC0gMTAyNSwgMTAyNSwgZmlsZSkgPT0gTlVMTCkKLQkJCQlicmVhazsKLQkJfQotCQkKLQkJLyogRXh0cmFjdCB0aGUgc3RyaW5nIHByaW9yIHRvIHRoZSBmaXJzdCBuZXdsaW5lIGNoYXJhY3Rlci4KLQkJICogV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBcclxuIGNvbWJpbmF0aW9ucyBzaW5jZSB0aGUgZmlsZQotCQkgKiBpcyBvcGVuZWQgaW4gdHJhbnNsYXRlZCBtb2RlLgotCQkgKi8KLQkJaWYgKF9zdHNjYW5mKGJ1ZmZlciwgX1RfRUNMSVBTRSgiJVteXG5dIiksIGFyZ3VtZW50KSA9PSAxKQotCQl7Ci0JCQkvKiB3YXRjaCBmb3IgY29tbWVudHMgKi8KLQkJCWlmKGFyZ3VtZW50WzBdID09IF9UX0VDTElQU0UoJyMnKSkKLQkJCQljb250aW51ZTsKLQotCQkJYXJnID0gX3Rjc2R1cChhcmd1bWVudCk7Ci0JCQlsZW5ndGggPSBfdGNzbGVuKGFyZyk7Ci0JCQkKLQkJCS8qIGJhc2ljIHdoaXRlc3BhY2UgdHJpbW1pbmcgKi8KLQkJCXdoaWxlIChsZW5ndGggPiAwICYmIChhcmdbbGVuZ3RoIC0gMV0gPT0gX1RfRUNMSVBTRSgnICcpICB8fCAKLQkJCQkJICAgICAgICAgICAgICBhcmdbbGVuZ3RoIC0gMV0gPT0gX1RfRUNMSVBTRSgnXHQnKSB8fCAKLQkJCQkJICAgICAgICAgICAgICBhcmdbbGVuZ3RoIC0gMV0gPT0gX1RfRUNMSVBTRSgnXHInKSkpIAotCQkJewotCQkJCWFyZ1stLWxlbmd0aF0gPSAwOwotCQkJfQotCQkJLyogaWdub3JlIGVtcHR5IGxpbmVzICovCi0JCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCQlmcmVlKGFyZyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCSgqYXJndilbaW5kZXhdID0gYXJnOwotCQkJaW5kZXgrKzsKLQkJCQotCQkJLyogR3JvdyB0aGUgYXJyYXkgb2YgVENIQVIqLiBFbnN1cmUgb25lIG1vcmUgZW50cnkgaXMKLQkJCSAqIGF2YWlsYWJsZSBmb3IgdGhlIGZpbmFsIE5VTEwgZW50cnkKLQkJCSAqLwotCQkJaWYgKGluZGV4ID09IG1heEFyZ3MgLSAxKQotCQkJewotCQkJCW1heEFyZ3MgKz0gMTI4OwotCQkJCSphcmd2ID0gKF9UQ0hBUiAqKilyZWFsbG9jKCphcmd2LCBtYXhBcmdzICogc2l6ZW9mKF9UQ0hBUiopKTsKLQkJCX0KLQkJfQotCX0KLQkoKmFyZ3YpW2luZGV4XSA9IE5VTEw7Ci0JKmFyZ2MgPSBpbmRleDsKLQkKLQlmY2xvc2UoZmlsZSk7Ci0JZnJlZShidWZmZXIpOwotCWZyZWUoYXJndW1lbnQpOwotCXJldHVybiAwOwotfQotCi12b2lkIGZyZWVDb25maWcoX1RDSEFSICoqYXJndikgCi17Ci0JaW50IGluZGV4ID0gMDsKLQlpZiAoYXJndiA9PSBOVUxMKSByZXR1cm47Ci0Jd2hpbGUgKGFyZ3ZbaW5kZXhdICE9IE5VTEwpCi0JewotCQlmcmVlKGFyZ3ZbaW5kZXhdKTsKLQkJaW5kZXgrKzsKLQl9Ci0JZnJlZShhcmd2KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZUNvbmZpZy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlQ29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTViZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlQ29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEVDTElQU0VfQ09ORklHX0gKLSNkZWZpbmUgRUNMSVBTRV9DT05GSUdfSAotCi0vKiBDb25maWd1cmF0aW9uIGZpbGUgcmVhZGluZyB1dGlsaXRpZXMgKi8KLQotLyoqCi0gKiBSZWFkcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIHByb2dyYW0gYXJndW1lbnQuCi0gKiBlLmcgaWYgdGhlIHByb2dyYW0gYXJndW1lbnQgY29udGFpbnMgImM6L2ZvbGRlci9lY2xpcHNlLmV4ZSIKLSAqIHRoZW4gdGhlIGNvbmZpZyBmaWxlICJjOi9mb2xkZXIvZWNsaXBzZS5pbmkiIHdpbGwgYmUgcGFyc2VkLgotICogT24gYSBVbml4IGxpa2UgcGxhdGZvcm0sIGZvciBhIHByb2dyYW0gYXJndW1lbnQgIi91c3IvZWNsaXBzZS9lY2xpcHNlIgotICogc2hvdWxkIGNvcnJlc3BvbmQgYSBjb25maWd1cmF0aW9uIGZpbGUgIi91c3IvZWNsaXBzZS9lY2xpcHNlLmluaSIKLSAqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIGNhbGwgcmVhZENvbmZpZ0ZpbGUgdG8gcmVhZCB0aGUgYWN0dWFsIGluaSBmaWxlCi0gKgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3MuCi0gKi8KLWV4dGVybiBpbnQgcmVhZEluaUZpbGUoX1RDSEFSKiBwcm9ncmFtLCBpbnQgKmFyZ2MsIF9UQ0hBUiAqKiphcmd2KTsKLQotLyoqCi0gKiBSZWFkcyB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlIAotICogVGhlIGFyZ3VtZW50IGFyZ3YgcmVmZXJzIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGFycmF5IG9mIHN0cmluZ3MuCi0gKiBUaGUgZmlyc3QgZW50cnkgaXMgdGhlIHByb2dyYW0gbmFtZSB0byBtaW1pYyB0aGUgZXhwZWN0YXRpb25zCi0gKiBmcm9tIGEgdHlwaWNhbCBhcmd2IGxpc3QuCi0gKiBUaGUgbGFzdCBlbnRyeSBvZiB0aGF0IGFycmF5IGlzIE5VTEwuIAotICogRWFjaCBub24gTlVMTCBlbnRyeSBpbiB0aGF0IGFycmF5IG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciAKLSAqIGFzIHdlbGwgYXMgdGhlIGFycmF5IGl0c2VsZiwgdXNpbmcgZnJlZUNvbmZpZygpLgotICogVGhlIGFyZ3VtZW50IGFyZ2MgY29udGFpbnMgdGhlIG51bWJlciBvZiBzdHJpbmcgYWxsb2NhdGVkLgotICoKLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzLgotICovCi1leHRlcm4gaW50IHJlYWRDb25maWdGaWxlKCBfVENIQVIgKiBjb25maWdfZmlsZSwgaW50ICphcmdjLCBfVENIQVIgKioqYXJndiApOwotLyoqCi0gKiBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHJlYWRDb25maWdGaWxlKCkuCi0gKi8KLWV4dGVybiB2b2lkIGZyZWVDb25maWcoX1RDSEFSICoqYXJncyk7Ci0KLSNlbmRpZiAvKiBFQ0xJUFNFX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VKTkkuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZUpOSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVjNjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZUpOSS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCSAgIEFuZHJldyBOaWVmZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2luY2x1ZGUgImVjbGlwc2VKTkkuaCIKLSNpbmNsdWRlICJlY2xpcHNlQ29tbW9uLmgiCi0jaW5jbHVkZSAiZWNsaXBzZU9TLmgiCi0jaW5jbHVkZSAiZWNsaXBzZVNobS5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLQotc3RhdGljIF9UQ0hBUiogZmFpbGVkVG9Mb2FkTGlicmFyeSA9IF9UX0VDTElQU0UoIkZhaWxlZCB0byBsb2FkIHRoZSBKTkkgc2hhcmVkIGxpYnJhcnkgXCIlc1wiLlxuIik7Ci1zdGF0aWMgX1RDSEFSKiBjcmVhdGVWTVN5bWJvbE5vdEZvdW5kID0gX1RfRUNMSVBTRSgiVGhlIEpWTSBzaGFyZWQgbGlicmFyeSBcIiVzXCJcbmRvZXMgbm90IGNvbnRhaW4gdGhlIEpOSV9DcmVhdGVKYXZhVk0gc3ltYm9sLlxuIik7Ci1zdGF0aWMgX1RDSEFSKiBmYWlsZWRDcmVhdGVWTSA9IF9UX0VDTElQU0UoIkZhaWxlZCB0byBjcmVhdGUgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLlxuIik7Ci1zdGF0aWMgX1RDSEFSKiBpbnRlcm5hbEV4cGVjdGVkVk1BcmdzID0gX1RfRUNMSVBTRSgiSW50ZXJuYWwgRXJyb3IsIHRoZSBKVk0gYXJndW1lbnQgbGlzdCBpcyBlbXB0eS5cbiIpOwotc3RhdGljIF9UQ0hBUiogbWFpbkNsYXNzTm90Rm91bmQgPSBfVF9FQ0xJUFNFKCJGYWlsZWQgdG8gZmluZCBhIE1haW4gQ2xhc3MgaW4gXCIlc1wiLlxuIik7Ci0KLXN0YXRpYyBKTklOYXRpdmVNZXRob2QgbmF0aXZlc1tdID0ge3siX3VwZGF0ZV9zcGxhc2giLCAiKClWIiwgKHZvaWQgKikmdXBkYXRlX3NwbGFzaH0sCi0JCQkJCQkJCQl7Il9nZXRfc3BsYXNoX2hhbmRsZSIsICIoKUoiLCAodm9pZCAqKSZnZXRfc3BsYXNoX2hhbmRsZX0sCi0JCQkJCQkJCQl7Il9zZXRfZXhpdF9kYXRhIiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopJnNldF9leGl0X2RhdGF9LAotCQkJCQkJCQkJeyJfc2V0X2xhdW5jaGVyX2luZm8iLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKikmc2V0X2xhdW5jaGVyX2luZm99LAotCQkJCQkJCQkJeyJfc2hvd19zcGxhc2giLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKikmc2hvd19zcGxhc2h9LAotCQkJCQkJCQkJeyJfdGFrZWRvd25fc3BsYXNoIiwgIigpViIsICh2b2lkICopJnRha2Vkb3duX3NwbGFzaH19OwotCi0vKiBsb2NhbCBtZXRob2RzICovCi1zdGF0aWMganN0cmluZyBuZXdKYXZhU3RyaW5nKEpOSUVudiAqZW52LCBfVENIQVIgKiBzdHIpOwotc3RhdGljIHZvaWQgcmVnaXN0ZXJOYXRpdmVzKEpOSUVudiAqZW52KTsKLXN0YXRpYyBpbnQgc2hvdWxkU2h1dGRvd24oSk5JRW52ICplbnYpOwotc3RhdGljIHZvaWQgSk5JX1JlbGVhc2VTdHJpbmdDaGFycyhKTklFbnYgKmVudiwganN0cmluZyBzLCBjb25zdCBfVENIQVIqIGRhdGEpOwotc3RhdGljIGNvbnN0IF9UQ0hBUiogSk5JX0dldFN0cmluZ0NoYXJzKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0cik7Ci1zdGF0aWMgY2hhciAqIGdldE1haW5DbGFzcyhKTklFbnYgKmVudiwgX1RDSEFSICogamFyRmlsZSk7Ci1zdGF0aWMgdm9pZCBzZXRMaWJyYXJ5TG9jYXRpb24oSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqKTsKLQotc3RhdGljIEphdmFWTSAqIGp2bSA9IDA7Ci1zdGF0aWMgSk5JRW52ICplbnYgPSAwOwotCi0vKiBjYWNoZSBTdHJpbmcgY2xhc3MgYW5kIG1ldGhvZHMgdG8gYXZvaWQgbG9va2luZyB0aGVtIHVwIGFsbCB0aGUgdGltZSAqLwotc3RhdGljIGpjbGFzcyBzdHJpbmdfY2xhc3MgPSBOVUxMOwotI2lmICFkZWZpbmVkKFVOSUNPREUpICYmICFkZWZpbmVkKE1BQ09TWCkKLXN0YXRpYyBqbWV0aG9kSUQgc3RyaW5nX2dldEJ5dGVzTWV0aG9kID0gTlVMTDsKLXN0YXRpYyBqbWV0aG9kSUQgc3RyaW5nX2N0b3IgPSBOVUxMOwotI2VuZGlmCi0KLS8qIEpOSSBDYWxsYmFjayBtZXRob2RzICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIHNldF9leGl0X2RhdGEoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwganN0cmluZyBpZCwganN0cmluZyBzKXsKLQljb25zdCBfVENIQVIqIGRhdGEgPSBOVUxMOwotCWNvbnN0IF9UQ0hBUiogc2hhcmVkSWQgPSBOVUxMOwotCXNpemVfdCBsZW5ndGg7Ci0JIAotCWlmKHMgIT0gTlVMTCkgewotCQlsZW5ndGggPSAoKmVudiktPkdldFN0cmluZ0xlbmd0aChlbnYsIHMpOwotCQlpZighKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSB7Ci0JCQlkYXRhID0gSk5JX0dldFN0cmluZ0NoYXJzKGVudiwgcyk7Ci0JCQlpZiAoZGF0YSAhPSBOVUxMKSB7Ci0JCQkJaWYoaWQgIT0gTlVMTCkgewotCQkJCQlzaGFyZWRJZCA9IEpOSV9HZXRTdHJpbmdDaGFycyhlbnYsIGlkKTsKLQkJCQkJaWYoc2hhcmVkSWQgIT0gTlVMTCkgewotCQkJCQkJc2V0U2hhcmVkRGF0YShzaGFyZWRJZCwgZGF0YSk7Ci0JCQkJCQlKTklfUmVsZWFzZVN0cmluZ0NoYXJzKGVudiwgaWQsIHNoYXJlZElkKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWV4aXREYXRhID0gbWFsbG9jKChsZW5ndGggKyAxKSAqIHNpemVvZihfVENIQVIqKSk7Ci0JCQkJCV90Y3NuY3B5KCBleGl0RGF0YSwgZGF0YSwgbGVuZ3RoKTsKLQkJCQkJZXhpdERhdGFbbGVuZ3RoXSA9IF9UX0VDTElQU0UoJ1wwJyk7Ci0JCQkJfQotCQkJCUpOSV9SZWxlYXNlU3RyaW5nQ2hhcnMoZW52LCBzLCBkYXRhKTsKLQkJCX0KLQkJfQotCQlpZihkYXRhID09IE5VTEwgJiYgc2hhcmVkSWQgPT0gTlVMTCkgewotCQkJKCplbnYpLT5FeGNlcHRpb25EZXNjcmliZShlbnYpOwotCQkJKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotCQl9Ci0JfQotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIHNldF9sYXVuY2hlcl9pbmZvKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosIGpzdHJpbmcgbGF1bmNoZXIsIGpzdHJpbmcgbmFtZSl7Ci0JY29uc3QgX1RDSEFSKiBsYXVuY2hlclBhdGggPSBOVUxMOwotCWNvbnN0IF9UQ0hBUiogbGF1bmNoZXJOYW1lID0gTlVMTDsKLQkKLQlpZiAobGF1bmNoZXIgIT0gTlVMTCkgewotCQlsYXVuY2hlclBhdGggPSBKTklfR2V0U3RyaW5nQ2hhcnMoZW52LCBsYXVuY2hlcik7Ci0JCWlmIChsYXVuY2hlclBhdGggIT0gTlVMTCkgewotCQkJc2V0UHJvZ3JhbVBhdGgoX3Rjc2R1cChsYXVuY2hlclBhdGgpKTsKLQkJCUpOSV9SZWxlYXNlU3RyaW5nQ2hhcnMoZW52LCBsYXVuY2hlciwgbGF1bmNoZXJQYXRoKTsKLQkJfQotCX0KLQkKLQlpZiAobmFtZSAhPSBOVUxMKSB7Ci0JCWxhdW5jaGVyTmFtZSA9IEpOSV9HZXRTdHJpbmdDaGFycyhlbnYsIG5hbWUpOwotCQlpZiAobGF1bmNoZXJOYW1lICE9IE5VTEwpIHsKLQkJCXNldE9mZmljaWFsTmFtZShfdGNzZHVwKGxhdW5jaGVyTmFtZSkpOwotCQkJSk5JX1JlbGVhc2VTdHJpbmdDaGFycyhlbnYsIG5hbWUsIGxhdW5jaGVyTmFtZSk7Ci0JCX0KLQl9Ci19Ci0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCB1cGRhdGVfc3BsYXNoKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopewotCWRpc3BhdGNoTWVzc2FnZXMoKTsKLX0KLQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgZ2V0X3NwbGFzaF9oYW5kbGUoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iail7Ci0JcmV0dXJuIGdldFNwbGFzaEhhbmRsZSgpOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIHNob3dfc3BsYXNoKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosIGpzdHJpbmcgcyl7Ci0JY29uc3QgX1RDSEFSKiBkYXRhID0gTlVMTDsKLQkKLQlzZXRMaWJyYXJ5TG9jYXRpb24oZW52LCBvYmopOwotCQotCWlmKHMgIT0gTlVMTCkgewotCQlkYXRhID0gSk5JX0dldFN0cmluZ0NoYXJzKGVudiwgcyk7Ci0JCWlmKGRhdGEgIT0gTlVMTCkgewotCQkJc2hvd1NwbGFzaChkYXRhKTsKLQkJCUpOSV9SZWxlYXNlU3RyaW5nQ2hhcnMoZW52LCBzLCBkYXRhKTsKLQkJfSBlbHNlIHsKLQkJCSgqZW52KS0+RXhjZXB0aW9uRGVzY3JpYmUoZW52KTsKLQkJCSgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKLQkJfQotCX0KLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCB0YWtlZG93bl9zcGxhc2goSk5JRW52ICogZW52LCBqb2JqZWN0IG9iail7Ci0JdGFrZURvd25TcGxhc2goKTsKLX0KLQotLyoKLSAqIE9uIEFJWCB3ZSBuZWVkIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWNsaXBzZSBzaGFyZWQgbGlicmFyeSBzbyB0aGF0IHdlCi0gKiBjYW4gZmluZCB0aGUgbGliZWNsaXBzZS1tb3RpZi5zbyBsaWJyYXJ5LiAgUmVhY2ggaW50byB0aGUgSk5JQnJpZGdlCi0gKiBvYmplY3QgdG8gZ2V0IHRoZSAibGlicmFyeSIgZmllbGQuCi0gKi8KLXN0YXRpYyB2b2lkIHNldExpYnJhcnlMb2NhdGlvbihKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKSB7Ci0JamNsYXNzIGJyaWRnZSA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgIm9yZy9lY2xpcHNlL2VxdWlub3gvbGF1bmNoZXIvSk5JQnJpZGdlIik7Ci0JaWYgKGJyaWRnZSAhPSBOVUxMKSB7Ci0JCWpmaWVsZElEIGxpYnJhcnlGaWVsZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGJyaWRnZSwgImxpYnJhcnkiLCAiTGphdmEvbGFuZy9TdHJpbmc7Iik7Ci0JCWlmIChsaWJyYXJ5RmllbGQgIT0gTlVMTCkgewotCQkJanN0cmluZyBzdHJpbmdPYmplY3QgPSAoanN0cmluZykgKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIG9iaiwgbGlicmFyeUZpZWxkKTsKLQkJCWlmIChzdHJpbmdPYmplY3QgIT0gTlVMTCkgewotCQkJCWNvbnN0IF9UQ0hBUiAqIHN0ciA9IEpOSV9HZXRTdHJpbmdDaGFycyhlbnYsIHN0cmluZ09iamVjdCk7Ci0JCQkJZWNsaXBzZUxpYnJhcnkgPSBfdGNzZHVwKHN0cik7Ci0JCQkJSk5JX1JlbGVhc2VTdHJpbmdDaGFycyhlbnYsIHN0cmluZ09iamVjdCwgc3RyKTsKLQkJCX0KLQkJfQotCX0KLQlpZiggKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpICE9IDAgKXsKLQkJKCplbnYpLT5FeGNlcHRpb25EZXNjcmliZShlbnYpOwotCQkoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlck5hdGl2ZXMoSk5JRW52ICplbnYpIHsKLQlqY2xhc3MgYnJpZGdlID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAib3JnL2VjbGlwc2UvZXF1aW5veC9sYXVuY2hlci9KTklCcmlkZ2UiKTsKLQlpZihicmlkZ2UgIT0gTlVMTCkgewotCQlpbnQgbnVtTmF0aXZlcyA9IHNpemVvZihuYXRpdmVzKSAvIHNpemVvZihuYXRpdmVzWzBdKTsKLQkJKCplbnYpLT5SZWdpc3Rlck5hdGl2ZXMoZW52LCBicmlkZ2UsIG5hdGl2ZXMsIG51bU5hdGl2ZXMpOwkKLQl9Ci0JaWYoICgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSAhPSAwICl7Ci0JCSgqZW52KS0+RXhjZXB0aW9uRGVzY3JpYmUoZW52KTsKLQkJKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotCX0KLX0KLQotCi0vKiBHZXQgYSBfVENIQVIqIGZyb20gYSBqc3RyaW5nLCBzdHJpbmcgc2hvdWxkIGJlIHJlbGVhc2VkIGxhdGVyIHdpdGggSk5JX1JlbGVhc2VTdHJpbmdDaGFycyAqLwotc3RhdGljIGNvbnN0IF9UQ0hBUiAqIEpOSV9HZXRTdHJpbmdDaGFycyhKTklFbnYgKmVudiwganN0cmluZyBzdHIpIHsKLQljb25zdCBfVENIQVIgKiByZXN1bHQgPSBOVUxMOwotI2lmZGVmIFVOSUNPREUKLQkvKiBHZXRTdHJpbmdDaGFycyBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkLCBtYWtlIGEgY29weSAqLwotCWNvbnN0IF9UQ0hBUiAqIHN0cmluZ0NoYXJzID0gKCplbnYpLT5HZXRTdHJpbmdDaGFycyhlbnYsIHN0ciwgMCk7Ci0JaW50IGxlbmd0aCA9ICgqZW52KS0+R2V0U3RyaW5nTGVuZ3RoKGVudiwgc3RyKTsKLQlfVENIQVIgKiBjb3B5ID0gbWFsbG9jKCAobGVuZ3RoICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0JX3Rjc25jcHkoY29weSwgc3RyaW5nQ2hhcnMsIGxlbmd0aCk7Ci0JY29weVtsZW5ndGhdID0gX1RfRUNMSVBTRSgnXDAnKTsKLQkoKmVudiktPlJlbGVhc2VTdHJpbmdDaGFycyhlbnYsIHN0ciwgc3RyaW5nQ2hhcnMpOwotCXJlc3VsdCA9IGNvcHk7Ci0jZWxpZiBNQUNPU1gKLQkvKiBVc2UgVVRGIG9uIHRoZSBNYWMgKi8KLQlyZXN1bHQgPSAoKmVudiktPkdldFN0cmluZ1VURkNoYXJzKGVudiwgc3RyLCAwKTsKLSNlbHNlCi0JLyogT3RoZXIgcGxhdGZvcm1zLCB1c2UgamF2YSdzIGRlZmF1bHQgZW5jb2RpbmcgKi8gCi0JX1RDSEFSKiBidWZmZXIgPSBOVUxMOwotCWlmIChzdHJpbmdfY2xhc3MgPT0gTlVMTCkKLQkJc3RyaW5nX2NsYXNzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9sYW5nL1N0cmluZyIpOwotCWlmIChzdHJpbmdfY2xhc3MgIT0gTlVMTCkgewotCQlpZiAoc3RyaW5nX2dldEJ5dGVzTWV0aG9kID09IE5VTEwpCi0JCQlzdHJpbmdfZ2V0Qnl0ZXNNZXRob2QgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgc3RyaW5nX2NsYXNzLCAiZ2V0Qnl0ZXMiLCAiKClbQiIpOwotCQlpZiAoc3RyaW5nX2dldEJ5dGVzTWV0aG9kICE9IE5VTEwpIHsKLQkJCWpieXRlQXJyYXkgYnl0ZXMgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBzdHIsIHN0cmluZ19nZXRCeXRlc01ldGhvZCk7Ci0JCQlpZiAoISgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewotCQkJCWpzaXplIGxlbmd0aCA9ICgqZW52KS0+R2V0QXJyYXlMZW5ndGgoZW52LCBieXRlcyk7Ci0JCQkJYnVmZmVyID0gbWFsbG9jKCAobGVuZ3RoICsgMSkgKiBzaXplb2YoX1RDSEFSKikpOwotCQkJCSgqZW52KS0+R2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgYnl0ZXMsIDAsIGxlbmd0aCwgKGpieXRlKilidWZmZXIpOwotCQkJCWJ1ZmZlcltsZW5ndGhdID0gMDsKLQkJCX0KLQkJCSgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBieXRlcyk7Ci0JCX0KLQl9Ci0JaWYoYnVmZmVyID09IE5VTEwpIHsKLQkJKCplbnYpLT5FeGNlcHRpb25EZXNjcmliZShlbnYpOwotCQkoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7Ci0JfQotCXJlc3VsdCA9IGJ1ZmZlcjsKLSNlbmRpZgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFJlbGVhc2UgdGhlIHN0cmluZyB0aGF0IHdhcyBvYnRhaW5lZCB1c2luZyBKTklfR2V0U3RyaW5nQ2hhcnMgKi8KLXN0YXRpYyB2b2lkIEpOSV9SZWxlYXNlU3RyaW5nQ2hhcnMoSk5JRW52ICplbnYsIGpzdHJpbmcgcywgY29uc3QgX1RDSEFSKiBkYXRhKSB7Ci0jaWZkZWYgVU5JQ09ERQotCWZyZWUoKF9UQ0hBUiopZGF0YSk7Ci0jZWxpZiBNQUNPU1gKLQkoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIHMsIGRhdGEpOwotI2Vsc2UKLQlmcmVlKChfVENIQVIqKWRhdGEpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBqc3RyaW5nIG5ld0phdmFTdHJpbmcoSk5JRW52ICplbnYsIF9UQ0hBUiAqIHN0cikKLXsKLQlqc3RyaW5nIG5ld1N0cmluZyA9IE5VTEw7Ci0jaWZkZWYgVU5JQ09ERQotCXNpemVfdCBsZW5ndGggPSBfdGNzbGVuKHN0cik7Ci0JbmV3U3RyaW5nID0gKCplbnYpLT5OZXdTdHJpbmcoZW52LCBzdHIsIGxlbmd0aCk7Ci0jZWxpZiBNQUNPU1gKLQluZXdTdHJpbmcgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIHN0cik7Ci0jZWxzZQotCXNpemVfdCBsZW5ndGggPSBfdGNzbGVuKHN0cik7Ci0JamJ5dGVBcnJheSBieXRlcyA9ICgqZW52KS0+TmV3Qnl0ZUFycmF5KGVudiwgbGVuZ3RoKTsKLQlpZihieXRlcyAhPSBOVUxMKSB7Ci0JCSgqZW52KS0+U2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgYnl0ZXMsIDAsIGxlbmd0aCwgKGpieXRlICopc3RyKTsKLQkJaWYgKCEoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKLQkJCWlmIChzdHJpbmdfY2xhc3MgPT0gTlVMTCkKLQkJCQlzdHJpbmdfY2xhc3MgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvU3RyaW5nIik7Ci0JCQlpZihzdHJpbmdfY2xhc3MgIT0gTlVMTCkgewotCQkJCWlmIChzdHJpbmdfY3RvciA9PSBOVUxMKQotCQkJCQlzdHJpbmdfY3RvciA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBzdHJpbmdfY2xhc3MsICI8aW5pdD4iLCAgIihbQilWIik7Ci0JCQkJaWYoc3RyaW5nX2N0b3IgIT0gTlVMTCkgewotCQkJCQluZXdTdHJpbmcgPSAoKmVudiktPk5ld09iamVjdChlbnYsIHN0cmluZ19jbGFzcywgc3RyaW5nX2N0b3IsIGJ5dGVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGJ5dGVzKTsKLQl9Ci0jZW5kaWYKLQlpZihuZXdTdHJpbmcgPT0gTlVMTCkgewotCQkoKmVudiktPkV4Y2VwdGlvbkRlc2NyaWJlKGVudik7Ci0JCSgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKLQl9Ci0JcmV0dXJuIG5ld1N0cmluZzsKLX0KLQotc3RhdGljIGpvYmplY3RBcnJheSBjcmVhdGVSdW5BcmdzKCBKTklFbnYgKmVudiwgX1RDSEFSICogYXJnc1tdICkgewotCWludCBpbmRleCA9IDAsIGxlbmd0aCA9IC0xOwotCWpvYmplY3RBcnJheSBzdHJpbmdBcnJheSA9IE5VTEw7Ci0JanN0cmluZyBzdHJpbmc7Ci0JCi0JLypjb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGZpcnN0Ki8KLQl3aGlsZShhcmdzWysrbGVuZ3RoXSAhPSBOVUxMKTsKLQkKLQlpZiAoc3RyaW5nX2NsYXNzID09IE5VTEwpCi0JCXN0cmluZ19jbGFzcyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbGFuZy9TdHJpbmciKTsKLQlpZihzdHJpbmdfY2xhc3MgIT0gTlVMTCkgewotCQlzdHJpbmdBcnJheSA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCBsZW5ndGgsIHN0cmluZ19jbGFzcywgMCk7Ci0JCWlmKHN0cmluZ0FycmF5ICE9IE5VTEwpIHsKLQkJCWZvciggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewotCQkJCXN0cmluZyA9IG5ld0phdmFTdHJpbmcoZW52LCBhcmdzW2luZGV4XSk7Ci0JCQkJaWYoc3RyaW5nICE9IE5VTEwpIHsKLQkJCQkJKCplbnYpLT5TZXRPYmplY3RBcnJheUVsZW1lbnQoZW52LCBzdHJpbmdBcnJheSwgaW5kZXgsIHN0cmluZyk7IAotCQkJCQkoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgc3RyaW5nKTsKLQkJCQl9IGVsc2UgewotCQkJCQkoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgc3RyaW5nQXJyYXkpOwotCQkJCQkoKmVudiktPkV4Y2VwdGlvbkRlc2NyaWJlKGVudik7Ci0JCQkJCSgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSAKLQlpZihzdHJpbmdBcnJheSA9PSBOVUxMKSB7Ci0JCSgqZW52KS0+RXhjZXB0aW9uRGVzY3JpYmUoZW52KTsKLQkJKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotCX0KLQlyZXR1cm4gc3RyaW5nQXJyYXk7Ci19Ci0JCQkJCSAKLUphdmFSZXN1bHRzICogc3RhcnRKYXZhSk5JKCBfVENIQVIqIGxpYlBhdGgsIF9UQ0hBUiogdm1BcmdzW10sIF9UQ0hBUiogcHJvZ0FyZ3NbXSwgX1RDSEFSKiBqYXJGaWxlICkKLXsKLQlpbnQgaTsKLQlpbnQgbnVtVk1BcmdzID0gLTE7Ci0Jdm9pZCAqIGpuaUxpYnJhcnk7Ci0JSk5JX2NyZWF0ZUphdmFWTSBjcmVhdGVKYXZhVk07Ci0JSmF2YVZNSW5pdEFyZ3MgaW5pdF9hcmdzOwotCUphdmFWTU9wdGlvbiAqIG9wdGlvbnM7Ci0JY2hhciAqIG1haW5DbGFzc05hbWUgPSBOVUxMOwotCUphdmFSZXN1bHRzICogcmVzdWx0cyA9IE5VTEw7Ci0JCi0JLyogSk5JIHJlZmxlY3Rpb24gKi8KLQlqY2xhc3MgbWFpbkNsYXNzID0gTlVMTDsJCQkvKiBUaGUgTWFpbiBjbGFzcyB0byBsb2FkICovCi0Jam1ldGhvZElEIG1haW5Db25zdHJ1Y3RvciA9IE5VTEw7CS8qIE1haW4ncyBkZWZhdWx0IGNvbnN0cnVjdG9yIE1haW4oKSAqLwotCWpvYmplY3QgbWFpbk9iamVjdCA9IE5VTEw7CQkJLyogQW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgbWFpbiBjbGFzcyAqLwotCWptZXRob2RJRCBydW5NZXRob2QgPSBOVUxMOwkJCS8qIE1haW4ucnVuKFN0cmluZ1tdKSAqLwotCWpvYmplY3RBcnJheSBtZXRob2RBcmdzID0gTlVMTDsJCS8qIEFyZ3VtZW50cyB0byBwYXNzIHRvIHJ1biAqLwotCQotCXJlc3VsdHMgPSBtYWxsb2Moc2l6ZW9mKEphdmFSZXN1bHRzKSk7Ci0JbWVtc2V0KHJlc3VsdHMsIDAsIHNpemVvZihKYXZhUmVzdWx0cykpOwotCQotCWpuaUxpYnJhcnkgPSBsb2FkTGlicmFyeShsaWJQYXRoKTsKLQlpZihqbmlMaWJyYXJ5ID09IE5VTEwpIHsKLQkJcmVzdWx0cy0+bGF1bmNoUmVzdWx0ID0gLTE7Ci0JCXJlc3VsdHMtPmVycm9yTWVzc2FnZSA9IG1hbGxvYygoX3Rjc2xlbihmYWlsZWRUb0xvYWRMaWJyYXJ5KSArIF90Y3NsZW4obGliUGF0aCkgKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLQkJX3N0cHJpbnRmKHJlc3VsdHMtPmVycm9yTWVzc2FnZSwgZmFpbGVkVG9Mb2FkTGlicmFyeSwgbGliUGF0aCk7Ci0JCXJldHVybiByZXN1bHRzOyAvKmVycm9yKi8KLQl9Ci0KLQljcmVhdGVKYXZhVk0gPSAoSk5JX2NyZWF0ZUphdmFWTSlmaW5kU3ltYm9sKGpuaUxpYnJhcnksIF9UX0VDTElQU0UoIkpOSV9DcmVhdGVKYXZhVk0iKSk7Ci0JaWYoY3JlYXRlSmF2YVZNID09IE5VTEwpIHsKLQkJcmVzdWx0cy0+bGF1bmNoUmVzdWx0ID0gLTI7Ci0JCXJlc3VsdHMtPmVycm9yTWVzc2FnZSA9IG1hbGxvYygoX3Rjc2xlbihjcmVhdGVWTVN5bWJvbE5vdEZvdW5kKSArIF90Y3NsZW4obGliUGF0aCkgKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLQkJX3N0cHJpbnRmKHJlc3VsdHMtPmVycm9yTWVzc2FnZSwgY3JlYXRlVk1TeW1ib2xOb3RGb3VuZCwgbGliUGF0aCk7Ci0JCXJldHVybiByZXN1bHRzOyAvKmVycm9yKi8KLQl9Ci0JCi0JLyogY291bnQgdGhlIHZtIGFyZ3MgKi8KLQl3aGlsZSh2bUFyZ3NbKytudW1WTUFyZ3NdICE9IE5VTEwpIHt9Ci0JCi0JaWYobnVtVk1BcmdzIDw9IDApIHsKLQkJLyplcnJvciwgd2UgZXhwZWN0IGF0IGxlYXN0IHRoZSByZXF1aXJlZCB2bSBhcmcgKi8KLQkJcmVzdWx0cy0+bGF1bmNoUmVzdWx0ID0gLTM7Ci0JCXJlc3VsdHMtPmVycm9yTWVzc2FnZSA9IF90Y3NkdXAoaW50ZXJuYWxFeHBlY3RlZFZNQXJncyk7Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQkKLQlvcHRpb25zID0gbWFsbG9jKG51bVZNQXJncyAqIHNpemVvZihKYXZhVk1PcHRpb24pKTsKLQlmb3IoaSA9IDA7IGkgPCBudW1WTUFyZ3M7IGkrKyl7Ci0JCW9wdGlvbnNbaV0ub3B0aW9uU3RyaW5nID0gdG9OYXJyb3codm1BcmdzW2ldKTsKLQkJb3B0aW9uc1tpXS5leHRyYUluZm8gPSAwOwotCX0KLQkJCi0jaWZkZWYgTUFDT1NYCi0JaW5pdF9hcmdzLnZlcnNpb24gPSBKTklfVkVSU0lPTl8xXzQ7Ci0jZWxzZQkJCi0JaW5pdF9hcmdzLnZlcnNpb24gPSBKTklfVkVSU0lPTl8xXzI7Ci0jZW5kaWYKLQlpbml0X2FyZ3Mub3B0aW9ucyA9IG9wdGlvbnM7Ci0JaW5pdF9hcmdzLm5PcHRpb25zID0gbnVtVk1BcmdzOwotCWluaXRfYXJncy5pZ25vcmVVbnJlY29nbml6ZWQgPSBKTklfVFJVRTsKLQkKLQlpZiggY3JlYXRlSmF2YVZNKCZqdm0sICZlbnYsICZpbml0X2FyZ3MpID09IDAgKSB7Ci0JCXJlZ2lzdGVyTmF0aXZlcyhlbnYpOwotCQkKLQkJbWFpbkNsYXNzTmFtZSA9IGdldE1haW5DbGFzcyhlbnYsIGphckZpbGUpOwotCQlpZiAobWFpbkNsYXNzTmFtZSAhPSBOVUxMKSB7Ci0JCQltYWluQ2xhc3MgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsIG1haW5DbGFzc05hbWUpOwotCQkJZnJlZShtYWluQ2xhc3NOYW1lKTsKLQkJfQotCQkKLQkJaWYgKG1haW5DbGFzcyA9PSBOVUxMKSB7Ci0JCQlpZiAoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSB7Ci0JCQkJKCplbnYpLT5FeGNlcHRpb25EZXNjcmliZShlbnYpOwotCQkJCSgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKLQkJCX0KLQkJCW1haW5DbGFzcyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgIm9yZy9lY2xpcHNlL2VxdWlub3gvbGF1bmNoZXIvTWFpbiIpOwotCQl9CQotCi0JCWlmKG1haW5DbGFzcyAhPSBOVUxMKSB7Ci0JCQlyZXN1bHRzLT5sYXVuY2hSZXN1bHQgPSAtNjsgLyogdGhpcyB3aWxsIGJlIHJlc2V0IHRvIDAgYmVsb3cgb24gc3VjY2VzcyAqLwotCQkJbWFpbkNvbnN0cnVjdG9yID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIG1haW5DbGFzcywgIjxpbml0PiIsICIoKVYiKTsKLQkJCWlmKG1haW5Db25zdHJ1Y3RvciAhPSBOVUxMKSB7Ci0JCQkJbWFpbk9iamVjdCA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgbWFpbkNsYXNzLCBtYWluQ29uc3RydWN0b3IpOwotCQkJCWlmKG1haW5PYmplY3QgIT0gTlVMTCkgewotCQkJCQlydW5NZXRob2QgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgbWFpbkNsYXNzLCAicnVuIiwgIihbTGphdmEvbGFuZy9TdHJpbmc7KUkiKTsKLQkJCQkJaWYocnVuTWV0aG9kICE9IE5VTEwpIHsKLQkJCQkJCW1ldGhvZEFyZ3MgPSBjcmVhdGVSdW5BcmdzKGVudiwgcHJvZ0FyZ3MpOwotCQkJCQkJaWYobWV0aG9kQXJncyAhPSBOVUxMKSB7Ci0JCQkJCQkJcmVzdWx0cy0+bGF1bmNoUmVzdWx0ID0gMDsKLQkJCQkJCQlyZXN1bHRzLT5ydW5SZXN1bHQgPSAoKmVudiktPkNhbGxJbnRNZXRob2QoZW52LCBtYWluT2JqZWN0LCBydW5NZXRob2QsIG1ldGhvZEFyZ3MpOwotCQkJCQkJCSgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBtZXRob2RBcmdzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgbWFpbk9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzdWx0cy0+bGF1bmNoUmVzdWx0ID0gLTU7Ci0JCQlyZXN1bHRzLT5lcnJvck1lc3NhZ2UgPSBtYWxsb2MoKF90Y3NsZW4obWFpbkNsYXNzTm90Rm91bmQpICsgX3Rjc2xlbihqYXJGaWxlKSArIDEpICogc2l6ZW9mKF9UQ0hBUikpOwotCQkJX3N0cHJpbnRmKHJlc3VsdHMtPmVycm9yTWVzc2FnZSwgbWFpbkNsYXNzTm90Rm91bmQsIGphckZpbGUpOwotCQl9Ci0JCWlmKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSl7Ci0JCQkoKmVudiktPkV4Y2VwdGlvbkRlc2NyaWJlKGVudik7Ci0JCQkoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7Ci0JCX0KLQkJCi0JfSBlbHNlIHsKLQkJcmVzdWx0cy0+bGF1bmNoUmVzdWx0ID0gLTQ7Ci0JCXJlc3VsdHMtPmVycm9yTWVzc2FnZSA9IF90Y3NkdXAoZmFpbGVkQ3JlYXRlVk0pOwotCX0KLQotCS8qIHRvTmFycm93IGFsbG9jYXRlZCBuZXcgc3RyaW5ncywgZnJlZSB0aGVtICovCi0JZm9yKGkgPSAwOyBpIDwgbnVtVk1BcmdzOyBpKyspewotCQlmcmVlKCBvcHRpb25zW2ldLm9wdGlvblN0cmluZyApOwotCX0KLQlmcmVlKG9wdGlvbnMpOwotCXJldHVybiByZXN1bHRzOwotfQotCi1zdGF0aWMgY2hhciAqIGdldE1haW5DbGFzcyhKTklFbnYgKmVudiwgX1RDSEFSICogamFyRmlsZSkgewotCWpjbGFzcyBqYXJGaWxlQ2xhc3MgPSBOVUxMLCBtYW5pZmVzdENsYXNzID0gTlVMTCwgYXR0cmlidXRlc0NsYXNzID0gTlVMTDsKLQlqbWV0aG9kSUQgamFyRmlsZUNvbnN0cnVjdG9yID0gTlVMTCwgZ2V0TWFuaWZlc3RNZXRob2QgPSBOVUxMLCBnZXRNYWluQXR0cmlidXRlc01ldGhvZCA9IE5VTEwsIGNsb3NlSmFyTWV0aG9kID0gTlVMTCwgZ2V0VmFsdWVNZXRob2QgPSBOVUxMOwotCWpvYmplY3QgamFyRmlsZU9iamVjdCwgbWFuaWZlc3QsIGF0dHJpYnV0ZXM7Ci0JanN0cmluZyBtYWluQ2xhc3NTdHJpbmcgPSBOVUxMOwotCWpzdHJpbmcgamFyRmlsZVN0cmluZywgaGVhZGVyU3RyaW5nOwotCWNvbnN0IF9UQ0hBUiAqbWFpbkNsYXNzOwotCQotCS8qIGdldCB0aGUgY2xhc3NlcyB3ZSBuZWVkICovCi0JamFyRmlsZUNsYXNzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS91dGlsL2phci9KYXJGaWxlIik7Ci0JaWYgKGphckZpbGVDbGFzcyAhPSBOVUxMKSB7Ci0JCW1hbmlmZXN0Q2xhc3MgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL3V0aWwvamFyL01hbmlmZXN0Iik7Ci0JCWlmIChtYW5pZmVzdENsYXNzICE9IE5VTEwpIHsKLQkJCWF0dHJpYnV0ZXNDbGFzcyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvdXRpbC9qYXIvQXR0cmlidXRlcyIpOwotCQl9Ci0JfQotCWlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKLQkJKCplbnYpLT5FeGNlcHRpb25EZXNjcmliZShlbnYpOwotCQkoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7Ci0JfQotCWlmIChhdHRyaWJ1dGVzQ2xhc3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JLyogZmluZCB0aGUgbWV0aG9kcyAqLwotCWphckZpbGVDb25zdHJ1Y3RvciA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBqYXJGaWxlQ2xhc3MsICI8aW5pdD4iLCAiKExqYXZhL2xhbmcvU3RyaW5nO1opViIpOwotCWlmKGphckZpbGVDb25zdHJ1Y3RvciAhPSBOVUxMKSB7Ci0JCWdldE1hbmlmZXN0TWV0aG9kID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGphckZpbGVDbGFzcywgImdldE1hbmlmZXN0IiwgIigpTGphdmEvdXRpbC9qYXIvTWFuaWZlc3Q7Iik7Ci0JCWlmKGdldE1hbmlmZXN0TWV0aG9kICE9IE5VTEwpIHsKLQkJCWNsb3NlSmFyTWV0aG9kID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGphckZpbGVDbGFzcywgImNsb3NlIiwgIigpViIpOwotCQkJaWYgKGNsb3NlSmFyTWV0aG9kICE9IE5VTEwpIHsKLQkJCQlnZXRNYWluQXR0cmlidXRlc01ldGhvZCA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBtYW5pZmVzdENsYXNzLCAiZ2V0TWFpbkF0dHJpYnV0ZXMiLCAiKClMamF2YS91dGlsL2phci9BdHRyaWJ1dGVzOyIpOwotCQkJCWlmIChnZXRNYWluQXR0cmlidXRlc01ldGhvZCAhPSBOVUxMKSB7Ci0JCQkJCWdldFZhbHVlTWV0aG9kID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGF0dHJpYnV0ZXNDbGFzcywgImdldFZhbHVlIiwgIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7Iik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKLQkJKCplbnYpLT5FeGNlcHRpb25EZXNjcmliZShlbnYpOwotCQkoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7Ci0JfQotCWlmIChnZXRWYWx1ZU1ldGhvZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkKLQkvKiBqYXJGaWxlU3RyaW5nID0gbmV3IFN0cmluZyhqYXJGaWxlKTsgKi8KLQlqYXJGaWxlU3RyaW5nID0gbmV3SmF2YVN0cmluZyhlbnYsIGphckZpbGUpOwotCSAvKiBoZWFkZXJTdHJpbmcgPSBuZXcgU3RyaW5nKCJNYWluLUNsYXNzIik7ICovCi0JIGhlYWRlclN0cmluZyA9IG5ld0phdmFTdHJpbmcoZW52LCBfVF9FQ0xJUFNFKCJNYWluLUNsYXNzIikpOwotCWlmIChqYXJGaWxlU3RyaW5nICE9IE5VTEwgJiYgaGVhZGVyU3RyaW5nICE9IE5VTEwpIHsKLQkJLyogamFyZmlsZU9iamVjdCA9IG5ldyBKYXJGaWxlKGphckZpbGVTdHJpbmcsIGZhbHNlKTsgKi8KLQkJamFyRmlsZU9iamVjdCA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgamFyRmlsZUNsYXNzLCBqYXJGaWxlQ29uc3RydWN0b3IsIGphckZpbGVTdHJpbmcsIEpOSV9GQUxTRSk7Ci0JCWlmIChqYXJGaWxlT2JqZWN0ICE9IE5VTEwpIHsgCi0JCQkvKiBtYW5pZmVzdCA9IGphckZpbGVPYmplY3QuZ2V0TWFuaWZlc3QoKTsgKi8KLQkJCSBtYW5pZmVzdCA9ICgqZW52KS0+Q2FsbE9iamVjdE1ldGhvZChlbnYsIGphckZpbGVPYmplY3QsIGdldE1hbmlmZXN0TWV0aG9kKTsKLQkJCSBpZiAobWFuaWZlc3QgIT0gTlVMTCkgewotCQkJCSAvKmphckZpbGVPYmplY3QuY2xvc2UoKSAqLwotCQkJCSAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgamFyRmlsZU9iamVjdCwgY2xvc2VKYXJNZXRob2QpOwotCQkJCSBpZiAoISgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewotCQkJCQkgLyogYXR0cmlidXRlcyA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7ICovCi0JCQkJCSBhdHRyaWJ1dGVzID0gKCplbnYpLT5DYWxsT2JqZWN0TWV0aG9kKGVudiwgbWFuaWZlc3QsIGdldE1haW5BdHRyaWJ1dGVzTWV0aG9kKTsKLQkJCQkJIGlmIChhdHRyaWJ1dGVzICE9IE5VTEwpIHsKLQkJCQkJCSAvKiBtYWluQ2xhc3NTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGhlYWRlclN0cmluZyk7ICovCi0JCQkJCQkgbWFpbkNsYXNzU3RyaW5nID0gKCplbnYpLT5DYWxsT2JqZWN0TWV0aG9kKGVudiwgYXR0cmlidXRlcywgZ2V0VmFsdWVNZXRob2QsIGhlYWRlclN0cmluZyk7Ci0JCQkJCSB9Ci0JCQkJIH0KLQkJCSB9Ci0JCQkgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGphckZpbGVPYmplY3QpOwotCQl9Ci0JfQotCQotCWlmIChqYXJGaWxlU3RyaW5nICE9IE5VTEwpCi0JCSgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqYXJGaWxlU3RyaW5nKTsKLQlpZiAoaGVhZGVyU3RyaW5nICE9IE5VTEwpCi0JCSgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBoZWFkZXJTdHJpbmcpOwotCQotCWlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKLQkJKCplbnYpLT5FeGNlcHRpb25EZXNjcmliZShlbnYpOwotCQkoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7Ci0JfQotCQotCWlmIChtYWluQ2xhc3NTdHJpbmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JbWFpbkNsYXNzID0gSk5JX0dldFN0cmluZ0NoYXJzKGVudiwgbWFpbkNsYXNzU3RyaW5nKTsKLQlpZihtYWluQ2xhc3MgIT0gTlVMTCkgewotCQlpbnQgaSA9IC0xOwotCQljaGFyICpyZXN1bHQgPSB0b05hcnJvdyhtYWluQ2xhc3MpOwotCQlKTklfUmVsZWFzZVN0cmluZ0NoYXJzKGVudiwgbWFpbkNsYXNzU3RyaW5nLCBtYWluQ2xhc3MpOwotCQkKLQkJLyogcmVwbGFjZSBhbGwgdGhlICcuJyB3aXRoICcvJyAqLwotCQl3aGlsZShyZXN1bHRbKytpXSAhPSAnXDAnKSB7Ci0JCQlpZihyZXN1bHRbaV0gPT0gJy4nKQotCQkJCXJlc3VsdFtpXSA9ICcvJzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBjbGVhbnVwVk0oaW50IGV4aXRDb2RlKSB7Ci0JSk5JRW52ICogbG9jYWxFbnYgPSBlbnY7Ci0JaWYgKGp2bSA9PSAwKQotCQlyZXR1cm47Ci0JCi0JaWYgKHNlY29uZFRocmVhZCkKLQkJKCpqdm0pLT5BdHRhY2hDdXJyZW50VGhyZWFkKGp2bSwgKHZvaWQqKikmbG9jYWxFbnYsIE5VTEwpOwotCWVsc2UKLQkJbG9jYWxFbnYgPSBlbnY7Ci0JaWYgKGxvY2FsRW52ID09IDApCi0JCXJldHVybjsKLQkKLQkvKiB3ZSBjYWxsIFN5c3RlbS5leGl0KCkgdW5sZXNzIG9zZ2kubm9TaHV0ZG93biBpcyBzZXQgKi8KLQlpZiAoc2hvdWxkU2h1dGRvd24oZW52KSkgewotCQlqY2xhc3Mgc3lzdGVtQ2xhc3MgPSBOVUxMOwotCQlqbWV0aG9kSUQgZXhpdE1ldGhvZCA9IE5VTEw7Ci0JCXN5c3RlbUNsYXNzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9sYW5nL1N5c3RlbSIpOwotCQlpZiAoc3lzdGVtQ2xhc3MgIT0gTlVMTCkgewotCQkJZXhpdE1ldGhvZCA9ICgqZW52KS0+R2V0U3RhdGljTWV0aG9kSUQoZW52LCBzeXN0ZW1DbGFzcywgImV4aXQiLCAiKEkpViIpOwotCQkJaWYgKGV4aXRNZXRob2QgIT0gTlVMTCkgewotCQkJCSgqZW52KS0+Q2FsbFN0YXRpY1ZvaWRNZXRob2QoZW52LCBzeXN0ZW1DbGFzcywgZXhpdE1ldGhvZCwgZXhpdENvZGUpOwotCQkJfQotCQl9Ci0JCWlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKLQkJCSgqZW52KS0+RXhjZXB0aW9uRGVzY3JpYmUoZW52KTsKLQkJCSgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKLQkJfQotCX0KLQkoKmp2bSktPkRlc3Ryb3lKYXZhVk0oanZtKTsKLX0KLQotc3RhdGljIGludCBzaG91bGRTaHV0ZG93bihKTklFbnYgKiBlbnYpIHsKLQlqY2xhc3MgYm9vbGVhbkNsYXNzID0gTlVMTDsKLQlqbWV0aG9kSUQgbWV0aG9kID0gTlVMTDsKLQlqc3RyaW5nIGFyZyA9IE5VTEw7Ci0JamJvb2xlYW4gcmVzdWx0ID0gMDsKLQkKLQlib29sZWFuQ2xhc3MgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvQm9vbGVhbiIpOwotCWlmIChib29sZWFuQ2xhc3MgIT0gTlVMTCkgewotCQltZXRob2QgPSAoKmVudiktPkdldFN0YXRpY01ldGhvZElEKGVudiwgYm9vbGVhbkNsYXNzLCAiZ2V0Qm9vbGVhbiIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiKTsKLQkJaWYgKG1ldGhvZCAhPSBOVUxMKSB7Ci0JCQlhcmcgPSBuZXdKYXZhU3RyaW5nKGVudiwgX1RfRUNMSVBTRSgib3NnaS5ub1NodXRkb3duIikpOwotCQkJcmVzdWx0ID0gKCplbnYpLT5DYWxsU3RhdGljQm9vbGVhbk1ldGhvZChlbnYsIGJvb2xlYW5DbGFzcywgbWV0aG9kLCBhcmcpOwotCQkJKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGFyZyk7Ci0JCX0KLQl9Ci0JaWYgKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewotCQkoKmVudiktPkV4Y2VwdGlvbkRlc2NyaWJlKGVudik7Ci0JCSgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKLQl9Ci0JcmV0dXJuIChyZXN1bHQgPT0gMCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlSk5JLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VKTkkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmNGI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VKTkkuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEVDTElQU0VfSk5JX0gKLSNkZWZpbmUgRUNMSVBTRV9KTklfSAotCi0jaW5jbHVkZSAiZWNsaXBzZVVuaWNvZGUuaCIKLSNpbmNsdWRlIDxqbmkuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBsYXVuY2hSZXN1bHQ7Ci0JaW50IHJ1blJlc3VsdDsKLQlfVENIQVIgKiBlcnJvck1lc3NhZ2U7Ci19IEphdmFSZXN1bHRzOwotCi10eXBlZGVmIGppbnQgKEpOSUNBTEwgKkpOSV9jcmVhdGVKYXZhVk0pKEphdmFWTSAqKnB2bSwgSk5JRW52ICoqZW52LCB2b2lkICphcmdzKTsKLQotLyogSk5JIENhbGxiYWNrIG1ldGhvZHMgKi8KLS8qIFVzZSBuYW1lIG1hbmdsaW5nIHNpbmNlIHdlIG1heSBiZSBsaW5raW5nIHRoZXNlIGZyb20gamF2YSB3aXRoIFN5c3RlbS5Mb2FkTGlicmFyeSAqLwotI2RlZmluZSBzZXRfZXhpdF9kYXRhIAkJSmF2YV9vcmdfZWNsaXBzZV9lcXVpbm94X2xhdW5jaGVyX0pOSUJyaWRnZV9fMXNldF8xZXhpdF8xZGF0YQotI2RlZmluZSBzZXRfbGF1bmNoZXJfaW5mbwlKYXZhX29yZ19lY2xpcHNlX2VxdWlub3hfbGF1bmNoZXJfSk5JQnJpZGdlX18xc2V0XzFsYXVuY2hlcl8xaW5mbwotI2RlZmluZSB1cGRhdGVfc3BsYXNoIAkJSmF2YV9vcmdfZWNsaXBzZV9lcXVpbm94X2xhdW5jaGVyX0pOSUJyaWRnZV9fMXVwZGF0ZV8xc3BsYXNoCi0jZGVmaW5lIHNob3dfc3BsYXNoCQkJSmF2YV9vcmdfZWNsaXBzZV9lcXVpbm94X2xhdW5jaGVyX0pOSUJyaWRnZV9fMXNob3dfMXNwbGFzaAotI2RlZmluZSBnZXRfc3BsYXNoX2hhbmRsZSAJSmF2YV9vcmdfZWNsaXBzZV9lcXVpbm94X2xhdW5jaGVyX0pOSUJyaWRnZV9fMWdldF8xc3BsYXNoXzFoYW5kbGUKLSNkZWZpbmUgdGFrZWRvd25fc3BsYXNoIAlKYXZhX29yZ19lY2xpcHNlX2VxdWlub3hfbGF1bmNoZXJfSk5JQnJpZGdlX18xdGFrZWRvd25fMXNwbGFzaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKgotICogb3JnX2VjbGlwc2VfZXF1aW5veF9sYXVuY2hlcl9KTklCcmlkZ2UjX3NldF9leGl0X2RhdGEKLSAqIFNpZ25hdHVyZTogKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgc2V0X2V4aXRfZGF0YShKTklFbnYgKiwgam9iamVjdCwganN0cmluZywganN0cmluZyk7Ci0KLS8qCi0gKiBvcmdfZWNsaXBzZV9lcXVpbm94X2xhdW5jaGVyX0pOSUJyaWRnZSNfc2V0X2xhdW5jaGVyX2luZm8KLSAqIFNpZ25hdHVyZTogKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgc2V0X2xhdW5jaGVyX2luZm8oSk5JRW52ICosIGpvYmplY3QsIGpzdHJpbmcsIGpzdHJpbmcpOwotCi0vKgotICogb3JnX2VjbGlwc2VfZXF1aW5veF9sYXVuY2hlcl9KTklCcmlkZ2UjX3VwZGF0ZV9zcGxhc2gKLSAqIFNpZ25hdHVyZTogKClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgdXBkYXRlX3NwbGFzaChKTklFbnYgKiwgam9iamVjdCk7Ci0KLS8qCi0gKiBvcmdfZWNsaXBzZV9lcXVpbm94X2xhdW5jaGVyX0pOSUJyaWRnZSNfZ2V0X3NwbGFzaF9oYW5kbGUKLSAqIFNpZ25hdHVyZTogKClKCi0gKi8KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIGdldF9zcGxhc2hfaGFuZGxlKEpOSUVudiAqLCBqb2JqZWN0KTsKLQotLyoKLSAqIG9yZ19lY2xpcHNlX2VxdWlub3hfbGF1bmNoZXJfSk5JQnJpZGdlI19zaG93X3NwbGFzaAotICogU2lnbmF0dXJlOiAoTGphdmEvbGFuZy9TdHJpbmc7KVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBzaG93X3NwbGFzaChKTklFbnYgKiwgam9iamVjdCwganN0cmluZyk7Ci0KLS8qCi0gKiBvcmdfZWNsaXBzZV9lcXVpbm94X2xhdW5jaGVyX0pOSUJyaWRnZSNfdGFrZWRvd25fc3BsYXNoCi0gKiBTaWduYXR1cmU6ICgpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIHRha2Vkb3duX3NwbGFzaChKTklFbnYgKiwgam9iamVjdCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLS8qIFN0YXJ0IHRoZSBKYXZhIFZNIGFuZCBXYWl0IEZvciBJdCB0byBUZXJtaW5hdGUKLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgdGhlIEphdmEgVk0gYW5kIGZvcgotICogZGV0ZWN0aW5nIGl0cyB0ZXJtaW5hdGlvbi4gVGhlIHJlc3VsdGluZyBKVk0gZXhpdCBjb2RlIHNob3VsZAotICogYmUgcmV0dXJuZWQgdG8gdGhlIG1haW4gbGF1bmNoZXIsIHdoaWNoIHdpbGwgZGlzcGxheSBhIG1lc3NhZ2UgaWYKLSAqIHRoZSB0ZXJtaW5hdGlvbiB3YXMgbm90IG5vcm1hbC4KLSAqLwotZXh0ZXJuIEphdmFSZXN1bHRzKiBzdGFydEphdmFKTkkoIF9UQ0hBUiogbGliUGF0aCwgX1RDSEFSKiB2bUFyZ3NbXSwgX1RDSEFSKiBwcm9nQXJnc1tdLCBfVENIQVIqIGphckZpbGUgKTsKLQotZXh0ZXJuIHZvaWQgY2xlYW51cFZNKCBpbnQgKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlTWFpbi5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlTWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTljMTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZU1haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBBbmRyZXcgTmllZmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSNpbmNsdWRlICJlY2xpcHNlVW5pY29kZS5oIgotI2luY2x1ZGUgImVjbGlwc2VDb21tb24uaCIKLSNpbmNsdWRlICJlY2xpcHNlQ29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotc3RhdGljIF9UQ0hBUiogbGlicmFyeU1zZyA9Ci1fVF9FQ0xJUFNFKCJUaGUgJXMgZXhlY3V0YWJsZSBsYXVuY2hlciB3YXMgdW5hYmxlIHRvIGxvY2F0ZSBpdHMgXG5cCi1jb21wYW5pb24gc2hhcmVkIGxpYnJhcnkuIik7Ci0KLXN0YXRpYyBfVENIQVIqIGVudHJ5TXNnID0KLV9UX0VDTElQU0UoIlRoZXJlIHdhcyBhIHByb2JsZW0gbG9hZGluZyB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIFxuXAotZmluZGluZyB0aGUgZW50cnkgcG9pbnQuIik7Ci0KLSNkZWZpbmUgTkFNRSAgICAgICAgIF9UX0VDTElQU0UoIi1uYW1lIikKLSNkZWZpbmUgVk1BUkdTICAgICAgIF9UX0VDTElQU0UoIi12bWFyZ3MiKQkJLyogc3BlY2lhbCBvcHRpb24gcHJvY2Vzc2luZyByZXF1aXJlZCAqLwotLyogTmV3IGFyZ3VtZW50cyBoYXZlIHRoZSBmb3JtIC0tbGF1bmNoZXIuPGFyZz4gdG8gYXZvaWQgY29sbGlzaW9ucyAqLwotI2RlZmluZSBMSUJSQVJZCQkgIF9UX0VDTElQU0UoIi0tbGF1bmNoZXIubGlicmFyeSIpCi0jZGVmaW5lIFNVUFJFU1NFUlJPUlMgX1RfRUNMSVBTRSgiLS1sYXVuY2hlci5zdXBwcmVzc0Vycm9ycyIpCi0jZGVmaW5lIElOSQkJCSAgX1RfRUNMSVBTRSgiLS1sYXVuY2hlci5pbmkiKQotCi0vKiB0aGlzIHR5cGVkZWYgbXVzdCBtYXRjaCB0aGUgcnVuIG1ldGhvZCBpbiBlY2xpcHNlLmMgKi8KLXR5cGVkZWYgaW50ICgqUnVuTWV0aG9kKShpbnQgYXJnYywgX1RDSEFSKiBhcmd2W10sIF9UQ0hBUiogdm1BcmdzW10pOwotdHlwZWRlZiB2b2lkICgqU2V0SW5pdGlhbEFyZ3MpKGludCBhcmdjLCBfVENIQVIqYXJndltdLCBfVENIQVIqIGxpYnJhcnkpOwotCi1zdGF0aWMgX1RDSEFSKiAgbmFtZSAgICAgICAgICA9IE5VTEw7CQkJLyogcHJvZ3JhbSBuYW1lICovCi1zdGF0aWMgX1RDSEFSKiogdXNlclZNYXJnICAgICA9IE5VTEw7ICAgICAJCS8qIHVzZXIgc3BlY2lmaWMgYXJncyBmb3IgdGhlIEphdmEgVk0gICovCi1zdGF0aWMgX1RDSEFSKiAgcHJvZ3JhbURpcgkgID0gTlVMTDsJCQkvKiBkaXJlY3Rvcnkgd2hlcmUgcHJvZ3JhbSByZXNpZGVzICovCi1zdGF0aWMgX1RDSEFSKiAgb2ZmaWNpYWxOYW1lICA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgc3VwcHJlc3NFcnJvcnMgPSAwOwkJCQkvKiBzdXByZXNzIGVycm9yIGRpYWxvZ3MgKi8KLQotc3RhdGljIGludCAJIAljcmVhdGVVc2VyQXJncyhpbnQgY29uZmlnQXJnYywgX1RDSEFSICoqY29uZmlnQXJndiwgaW50ICphcmdjLCBfVENIQVIgKioqYXJndik7Ci1zdGF0aWMgdm9pZCAgCXBhcnNlQXJncyggaW50KiBhcmdjLCBfVENIQVIqIGFyZ3ZbXSApOwotc3RhdGljIF9UQ0hBUiogCWdldERlZmF1bHRPZmZpY2lhbE5hbWUoX1RDSEFSKiBwcm9ncmFtKTsKLXN0YXRpYyBfVENIQVIqICBmaW5kUHJvZ3JhbShfVENIQVIqIGFyZ3ZbXSk7Ci1zdGF0aWMgX1RDSEFSKiAgZmluZExpYnJhcnkoX1RDSEFSKiBsaWJyYXJ5LCBfVENIQVIqIHByb2dyYW0pOwotc3RhdGljIF9UQ0hBUiogIGNoZWNrRm9ySW5pKGludCBhcmdjLCBfVENIQVIqIGFyZ3ZbXSk7Ci0gCi1zdGF0aWMgaW50IGluaXRpYWxBcmdjOwotc3RhdGljIF9UQ0hBUioqIGluaXRpYWxBcmd2OwotCi1fVENIQVIqIGVjbGlwc2VMaWJyYXJ5OyAvKiBwYXRoIHRvIHRoZSBlY2xpcHNlIHNoYXJlZCBsaWJyYXJ5ICovCi0KLSNpZmRlZiBVTklDT0RFCi1leHRlcm4gaW50IG1haW4oaW50LCBjaGFyKiopOwotaW50IG1haW5XKGludCwgd2NoYXJfdCoqKTsKLWludCB3bWFpbiggaW50IGFyZ2MsIHdjaGFyX3QqKiBhcmd2ICkgewotCXJldHVybiBtYWluVyhhcmdjLCBhcmd2KTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotCS8qCi0JKiBSdW4gdGhlIFVOSUNPREUgdmVyc2lvbiwgY29udmVydCB0aGUgYXJndW1lbnRzIGZyb20gTUJDUyB0byBVTklDT0RFCi0JKi8KLQlpbnQgaSwgcmVzdWx0OwotCXdjaGFyX3QgKipuZXdBcmd2ID0gbWFsbG9jKGFyZ2MgKiBzaXplb2Yod2NoYXJfdCAqKSk7Ci0JZm9yIChpPTA7IGk8YXJnYzsgaSsrKSB7Ci0JCWNoYXIgKm9sZEFyZyA9IGFyZ3ZbaV07Ci0JCWludCBudW1DaGFycyA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBvbGRBcmcsIC0xLCBOVUxMLCAwKTsKLQkJd2NoYXJfdCAqbmV3QXJnICA9IG1hbGxvYygobnVtQ2hhcnMgKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7Ci0JCW5ld0FyZ1tudW1DaGFyc10gPSAwOwotCQlNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgb2xkQXJnLCAtMSwgbmV3QXJnLCBudW1DaGFycyk7Ci0JCW5ld0FyZ3ZbaV0gPSBuZXdBcmc7Ci0JfQotCXJlc3VsdCA9IG1haW5XKGFyZ2MsIG5ld0FyZ3YpOwotCWZvciAoaT0wOyBpPGFyZ2M7IGkrKykgewotCQlmcmVlKG5ld0FyZ3ZbaV0pOwotCX0KLQlmcmVlKG5ld0FyZ3YpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNkZWZpbmUgbWFpbiBtYWluVwotI2VuZGlmIC8qIFVOSUNPREUgKi8KLQotaW50IG1haW4oIGludCBhcmdjLCBfVENIQVIqIGFyZ3ZbXSApCi17Ci0JX1RDSEFSKiAgZXJyb3JNc2c7Ci0JX1RDSEFSKiAgcHJvZ3JhbTsKLQlfVENIQVIqICBpbmlGaWxlOwotCV9UQ0hBUiogIGNoOwotCV9UQ0hBUioqIGNvbmZpZ0FyZ3YgPSBOVUxMOwotCWludCAJIGNvbmZpZ0FyZ2MgPSAwOwotCWludCAgICAgIGV4aXRDb2RlID0gMDsKLQlpbnQgICAgICByZXQgPSAwOwotCXZvaWQgKgkgaGFuZGxlID0gMDsKLQlSdW5NZXRob2QgCQlydW5NZXRob2Q7Ci0JU2V0SW5pdGlhbEFyZ3MgIHNldEFyZ3M7Ci0JCi0Jc2V0bG9jYWxlKExDX0FMTCwgIiIpOwotCQotCWluaXRpYWxBcmdjID0gYXJnYzsKLQlpbml0aWFsQXJndiA9IG1hbGxvYygoYXJnYyArIDEpICogc2l6ZW9mKF9UQ0hBUiopKTsKLQltZW1jcHkoaW5pdGlhbEFyZ3YsIGFyZ3YsIChhcmdjICsgMSkgKiBzaXplb2YoX1RDSEFSKikpOwotCQotCS8qIAotCSAqIFN0cmlwIG9mZiBhbnkgZXh0cm9uZW91cyA8Q1I+IGZyb20gdGhlIGxhc3QgYXJndW1lbnQuIElmIGEgc2hlbGwgc2NyaXB0Ci0JICogb24gTGludXggaXMgY3JlYXRlZCBpbiBET1MgZm9ybWF0IChsaW5lcyBlbmQgd2l0aCA8Q1I+PExGPiksIHRoZSBDLXNoZWxsCi0JICogZG9lcyBub3Qgc3RyaXAgb2ZmIHRoZSA8Q1I+IGFuZCBoZW5jZSB0aGUgYXJndW1lbnQgaXMgYm9ndXMgYW5kIG1heSAKLQkgKiBub3QgYmUgcmVjb2duaXplZCBieSB0aGUgbGF1bmNoZXIgb3IgZWNsaXBzZSBpdHNlbGYuCi0JICovCi0JIGNoID0gX3Rjc2NociggYXJndlsgYXJnYyAtIDEgXSwgX1RfRUNMSVBTRSgnXHInKSApOwotCSBpZiAoY2ggIT0gTlVMTCkKLQkgewotCSAgICAgKmNoID0gX1RfRUNMSVBTRSgnXDAnKTsKLQkgfQotCSAKLQkgLyogRGV0ZXJtaW5lIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoaXMgcHJvZ3JhbS4gKi8KLQkgcHJvZ3JhbSA9IGZpbmRQcm9ncmFtKGFyZ3YpOwotICAgIAotICAgIC8qIFBhcnNlIGNvbmZpZ3VyYXRpb24gZmlsZSBhcmd1bWVudHMgKi8KLSAgICBpbmlGaWxlID0gY2hlY2tGb3JJbmkoYXJnYywgYXJndik7Ci0gICAgaWYgKGluaUZpbGUgIT0gTlVMTCkKLSAgICAJcmV0ID0gcmVhZENvbmZpZ0ZpbGUoaW5pRmlsZSwgJmNvbmZpZ0FyZ2MsICZjb25maWdBcmd2KTsKLSAgICBlbHNlCi0gICAgCXJldCA9IHJlYWRJbmlGaWxlKHByb2dyYW0sICZjb25maWdBcmdjLCAmY29uZmlnQXJndik7Ci0JaWYgKHJldCA9PSAwKQotCXsKLQkJcGFyc2VBcmdzICgmY29uZmlnQXJnYywgY29uZmlnQXJndik7Ci0JfQotCQotCS8qIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgICAgICAgICAgICovCi0gICAgLyogT3ZlcnJpZGVzIGNvbmZpZ3VyYXRpb24gZmlsZSBhcmd1bWVudHMgKi8KLSAgICBwYXJzZUFyZ3MoICZhcmdjLCBhcmd2ICk7Ci0gICAgCi0gICAgLyogU3BlY2lhbCBjYXNlIC0gdXNlciBhcmd1bWVudHMgc3BlY2lmaWVkIGluIHRoZSBjb25maWcgZmlsZQotCSAqIGFyZSBhcHBlbmRlZCB0byB0aGUgdXNlciBhcmd1bWVudHMgcGFzc2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLQkgKi8KLQlpZiAoY29uZmlnQXJnYyA+IDApCi0JewkKLQkJY3JlYXRlVXNlckFyZ3MoY29uZmlnQXJnYywgY29uZmlnQXJndiwgJmFyZ2MsICZhcmd2KTsKLQl9Ci0JCi0JLyogSW5pdGlhbGl6ZSBvZmZpY2lhbCBwcm9ncmFtIG5hbWUgKi8KLQlvZmZpY2lhbE5hbWUgPSBuYW1lICE9IE5VTEwgPyBfdGNzZHVwKCBuYW1lICkgOiBnZXREZWZhdWx0T2ZmaWNpYWxOYW1lKHByb2dyYW0pOwotCQotCS8qIEZpbmQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgRWNsaXBzZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4gKi8KLSAgICBwcm9ncmFtRGlyID0gZ2V0UHJvZ3JhbURpcihwcm9ncmFtKTsKLQotCS8qIEZpbmQgdGhlIGVjbGlwc2UgbGlicmFyeSAqLwotICAgIGVjbGlwc2VMaWJyYXJ5ID0gZmluZExpYnJhcnkoZWNsaXBzZUxpYnJhcnksIHByb2dyYW0pOwotCQkKLQlpZihlY2xpcHNlTGlicmFyeSAhPSBOVUxMKQotCQloYW5kbGUgPSBsb2FkTGlicmFyeShlY2xpcHNlTGlicmFyeSk7Ci0JaWYoaGFuZGxlID09IE5VTEwpIHsKLQkJZXJyb3JNc2cgPSBtYWxsb2MoIChfdGNzbGVuKGxpYnJhcnlNc2cpICsgX3Rjc2xlbihvZmZpY2lhbE5hbWUpICsgMTApICogc2l6ZW9mKF9UQ0hBUikgKTsKLSAgICAgICAgX3N0cHJpbnRmKCBlcnJvck1zZywgbGlicmFyeU1zZywgb2ZmaWNpYWxOYW1lICk7Ci0gICAgICAgIGlmICghc3VwcHJlc3NFcnJvcnMpCi0gICAgICAgIAlkaXNwbGF5TWVzc2FnZSggb2ZmaWNpYWxOYW1lLCBlcnJvck1zZyApOwotICAgICAgICBlbHNlCi0gICAgICAgIAlfZnRwcmludGYoc3RkZXJyLCBfVF9FQ0xJUFNFKCIlczpcbiVzXG4iKSwgb2ZmaWNpYWxOYW1lLCBlcnJvck1zZyk7Ci0gICAgICAgIGZyZWUoIGVycm9yTXNnICk7Ci0gICAgCWV4aXQoIDEgKTsKLQl9Ci0KLQlzZXRBcmdzID0gKFNldEluaXRpYWxBcmdzKWZpbmRTeW1ib2woaGFuZGxlLCBTRVRfSU5JVElBTF9BUkdTKTsKLQlpZihzZXRBcmdzICE9IE5VTEwpCi0JCXNldEFyZ3MoaW5pdGlhbEFyZ2MsIGluaXRpYWxBcmd2LCBlY2xpcHNlTGlicmFyeSk7Ci0JZWxzZSB7Ci0JCWlmKCFzdXBwcmVzc0Vycm9ycykKLQkJCWRpc3BsYXlNZXNzYWdlKG9mZmljaWFsTmFtZSwgZW50cnlNc2cpOwotCQllbHNlIAotCQkJX2Z0cHJpbnRmKHN0ZGVyciwgX1RfRUNMSVBTRSgiJXM6XG4lc1xuIiksIG9mZmljaWFsTmFtZSwgZW50cnlNc2cpOwotCQlleGl0KDEpOwotCX0KLQkKLQlydW5NZXRob2QgPSAoUnVuTWV0aG9kKWZpbmRTeW1ib2woaGFuZGxlLCBSVU5fTUVUSE9EKTsKLQlpZihydW5NZXRob2QgIT0gTlVMTCkKLQkJZXhpdENvZGUgPSBydW5NZXRob2QoYXJnYywgYXJndiwgdXNlclZNYXJnKTsKLQllbHNlIHsgCi0JCWlmKCFzdXBwcmVzc0Vycm9ycykKLQkJCWRpc3BsYXlNZXNzYWdlKG9mZmljaWFsTmFtZSwgZW50cnlNc2cpOwotCQllbHNlIAotCQkJX2Z0cHJpbnRmKHN0ZGVyciwgX1RfRUNMSVBTRSgiJXM6XG4lc1xuIiksIG9mZmljaWFsTmFtZSwgZW50cnlNc2cpOwotCQlleGl0KDEpOwotCX0KLQl1bmxvYWRMaWJyYXJ5KGhhbmRsZSk7Ci0JCi0JZnJlZSggZWNsaXBzZUxpYnJhcnkgKTsKLSAgICBmcmVlKCBwcm9ncmFtRGlyICk7Ci0gICAgZnJlZSggcHJvZ3JhbSApOwotICAgIGZyZWUoIG9mZmljaWFsTmFtZSApOwotICAgIAotCXJldHVybiBleGl0Q29kZTsKLX0KLQotX1RDSEFSKiBnZXRQcm9ncmFtUGF0aCgpIHsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIF9UQ0hBUiogZmluZFByb2dyYW0oX1RDSEFSKiBhcmd2W10pIHsKLQlfVENIQVIgKiBwcm9ncmFtOwotI2lmZGVmIF9XSU4zMgotCSAvKiB3aW5kb3dzLCBtYWtlIHN1cmUgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSAuZXhlICovCi0JX1RDSEFSICogY2g7Ci0JaW50IGxlbmd0aCA9IF90Y3NsZW4oYXJndlswXSk7Ci0JY2ggPSBtYWxsb2MoIChsZW5ndGggKyA1KSAqIHNpemVvZihfVENIQVIpKTsKLQlfdGNzY3B5KGNoLCBhcmd2WzBdKTsKLQkgCi0JaWYgKGxlbmd0aCA8PSA0IHx8IF90Y3NpY21wKCAmY2hbIGxlbmd0aCAtIDQgXSwgX1RfRUNMSVBTRSgiLmV4ZSIpICkgIT0gMCkKLQkJX3Rjc2NhdChjaCwgX1RfRUNMSVBTRSgiLmV4ZSIpKTsKLQkKLQlwcm9ncmFtID0gZmluZENvbW1hbmQoY2gpOwotCWlmIChjaCAhPSBwcm9ncmFtKQotCQlmcmVlKGNoKTsKLSNlbHNlCi0JcHJvZ3JhbSA9IGZpbmRDb21tYW5kKCBhcmd2WzBdICk7Ci0jZW5kaWYKLSAgICBpZiAocHJvZ3JhbSA9PSBOVUxMKQotICAgIHsKLSNpZmRlZiBfV0lOMzIKLSAgICAJcHJvZ3JhbSA9IG1hbGxvYyggTUFYX1BBVEhfTEVOR1RIICsgMSApOwotICAgIAlHZXRNb2R1bGVGaWxlTmFtZSggTlVMTCwgcHJvZ3JhbSwgTUFYX1BBVEhfTEVOR1RIICk7Ci0gICAgCWFyZ3ZbMF0gPSBwcm9ncmFtOwotI2Vsc2UKLSAgICAJcHJvZ3JhbSA9IG1hbGxvYyggKHN0cmxlbiggYXJndlswXSApICsgMSkgKiBzaXplb2YoX1RDSEFSKSApOwotICAgIAlzdHJjcHkoIHByb2dyYW0sIGFyZ3ZbMF0gKTsKLSNlbmRpZgotICAgIH0gZWxzZSBpZiAoX3Rjc2NtcChhcmd2WzBdLCBwcm9ncmFtKSAhPSAwKSB7Ci0gICAgCWFyZ3ZbMF0gPSBwcm9ncmFtOwotICAgIH0KLSAgICByZXR1cm4gcHJvZ3JhbTsKLX0KLQotLyoKLSAqIFBhcnNlIGFyZ3VtZW50cyBvZiB0aGUgY29tbWFuZC4KLSAqLwotc3RhdGljIHZvaWQgcGFyc2VBcmdzKCBpbnQqIHBBcmdjLCBfVENIQVIqIGFyZ3ZbXSApCi17Ci0gICAgaW50ICAgICBpbmRleDsKLQotICAgIC8qIEVuc3VyZSB0aGUgbGlzdCBvZiB1c2VyIGFyZ3VtZW50IGlzIE5VTEwgdGVybWluYXRlZC4gKi8KLSAgICBhcmd2WyAqcEFyZ2MgXSA9IE5VTEw7Ci0KLQkvKiBGb3IgZWFjaCB1c2VyIGRlZmluZWQgYXJndW1lbnQgKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAqcEFyZ2M7IGluZGV4KyspewotICAgICAgICBpZihfdGNzaWNtcChhcmd2W2luZGV4XSwgVk1BUkdTKSA9PSAwKSB7Ci0gICAgICAgIAl1c2VyVk1hcmcgPSAmYXJndlsgaW5kZXgrMSBdOwotICAgICAgICAgICAgYXJndlsgaW5kZXggXSA9IE5VTEw7Ci0gICAgICAgICAgICAqcEFyZ2MgPSBpbmRleDsKLSAgICAgICAgfSBlbHNlIGlmKF90Y3NpY21wKGFyZ3ZbaW5kZXhdLCBOQU1FKSA9PSAwKSB7Ci0gICAgICAgIAluYW1lID0gYXJndlsrK2luZGV4XTsKLSAgICAgICAgfSBlbHNlIGlmKF90Y3NpY21wKGFyZ3ZbaW5kZXhdLCBMSUJSQVJZKSA9PSAwKSB7Ci0gICAgICAgIAllY2xpcHNlTGlicmFyeSA9IGFyZ3ZbKytpbmRleF07Ci0gICAgICAgIH0gZWxzZSBpZihfdGNzaWNtcChhcmd2W2luZGV4XSwgU1VQUkVTU0VSUk9SUykgPT0gMCkgewotICAgICAgICAJc3VwcHJlc3NFcnJvcnMgPSAxOwotICAgICAgICB9IAotICAgIH0KLX0KLQotLyogV2UgbmVlZCB0byBsb29rIGZvciAtLWxhdW5jaGVyLmluaSBiZWZvcmUgcGFyc2luZyB0aGUgb3RoZXIgYXJncyAqLwotc3RhdGljIF9UQ0hBUiogY2hlY2tGb3JJbmkoaW50IGFyZ2MsIF9UQ0hBUiogYXJndltdKSAKLXsKLQlpbnQgaW5kZXg7Ci0JZm9yKGluZGV4ID0gMDsgaW5kZXggPCAoYXJnYyAtIDEpOyBpbmRleCsrKSB7Ci0JCWlmKF90Y3NpY21wKGFyZ3ZbaW5kZXhdLCBJTkkpID09IDApIHsKLSAgICAgICAgCXJldHVybiBhcmd2WysraW5kZXhdOwotICAgICAgICB9IAotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIG5ldyBhcnJheSBjb250YWluaW5nIHVzZXIgYXJndW1lbnRzIGZyb20gdGhlIGNvbmZpZyBmaWxlIGZpcnN0IGFuZAotICogZnJvbSB0aGUgY29tbWFuZCBsaW5lIHNlY29uZC4KLSAqIEFsbG9jYXRlIGFuIGFycmF5IGxhcmdlIGVub3VnaCB0byBob3N0IGFsbCB0aGUgc3RyaW5ncyBwYXNzZWQgaW4gZnJvbQotICogdGhlIGFyZ3VtZW50IGNvbmZpZ0FyZ3YgYW5kIGFyZ3YuIFRoYXQgYXJyYXkgaXMgcGFzc2VkIGJhY2sgdG8gdGhlCi0gKiBhcmd2IGFyZ3VtZW50LiBUaGF0IGFycmF5IG11c3QgYmUgZnJlZWQgd2l0aCB0aGUgcmVndWxhciBmcmVlKCkuCi0gKiBOb3RlIHRoYXQgYm90aCBhcmcgbGlzdHMgYXJlIGV4cGVjdGVkIHRvIGNvbnRhaW4gdGhlIGFyZ3VtZW50IDAgZnJvbSB0aGUgQwotICogbWFpbiBtZXRob2QuIFRoYXQgYXJndW1lbnQgY29udGFpbnMgdGhlIHBhdGgvZXhlY3V0YWJsZSBuYW1lLiBJdCBpcwotICogb25seSBjb3BpZWQgb25jZSBpbiB0aGUgcmVzdWx0aW5nIGxpc3QuCi0gKgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3MuCi0gKi8KLXN0YXRpYyBpbnQgY3JlYXRlVXNlckFyZ3MoaW50IGNvbmZpZ0FyZ2MsIF9UQ0hBUiAqKmNvbmZpZ0FyZ3YsIGludCAqYXJnYywgX1RDSEFSICoqKmFyZ3YpCi17Ci0JX1RDSEFSKiogbmV3QXJyYXkgPSAoX1RDSEFSICoqKW1hbGxvYygoY29uZmlnQXJnYyArICphcmdjICsgMSkgKiBzaXplb2YoX1RDSEFSICopKTsKLQotCW5ld0FycmF5WzBdID0gKCphcmd2KVswXTsJLyogdXNlIHRoZSBvcmlnaW5hbCBhcmd2WzBdICovCi0JbWVtY3B5KG5ld0FycmF5ICsgMSwgY29uZmlnQXJndiwgY29uZmlnQXJnYyAqIHNpemVvZihfVENIQVIgKikpOwkKLQkKLQkvKiBTa2lwIHRoZSBhcmd1bWVudCB6ZXJvIChwcm9ncmFtIHBhdGggYW5kIG5hbWUpICovCi0JbWVtY3B5KG5ld0FycmF5ICsgMSArIGNvbmZpZ0FyZ2MsICphcmd2ICsgMSwgKCphcmdjIC0gMSkgKiBzaXplb2YoX1RDSEFSICopKTsKLQotCS8qIE51bGwgdGVybWluYXRlIHRoZSBuZXcgbGlzdCBvZiBhcmd1bWVudHMgYW5kIHJldHVybiBpdC4gKi8JIAotCSphcmd2ID0gbmV3QXJyYXk7Ci0JKmFyZ2MgKz0gY29uZmlnQXJnYzsKLQkoKmFyZ3YpWyphcmdjXSA9IE5VTEw7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgUHJvZ3JhbSBEaXJlY3RvcnkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgcHJvZ3JhbSBleGVjdXRhYmxlIHJlc2lkZXMgYW5kCi0gKiBkZXRlcm1pbmVzIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotICovCi1fVENIQVIqIGdldFByb2dyYW1EaXIoX1RDSEFSKiBwcm9ncmFtKQotewotCV9UQ0hBUiogIGNoOwotCQotCWlmKHByb2dyYW1EaXIgIT0gTlVMTCkKLQkJcmV0dXJuIHByb2dyYW1EaXI7Ci0KLSAgICBwcm9ncmFtRGlyID0gbWFsbG9jKCAoX3Rjc2xlbiggcHJvZ3JhbSApICsgMSkgKiBzaXplb2YoX1RDSEFSKSApOwotICAgIF90Y3NjcHkoIHByb2dyYW1EaXIsIHByb2dyYW0gKTsKLSAgICBjaCA9IGxhc3REaXJTZXBhcmF0b3IoIHByb2dyYW1EaXIgKTsKLQlpZiAoY2ggIT0gTlVMTCkKLSAgICB7Ci0gICAgCSooY2grMSkgPSBfVF9FQ0xJUFNFKCdcMCcpOwotICAgCQlyZXR1cm4gcHJvZ3JhbURpcjsKLSAgICB9Ci0KLQkvKiBDYW4ndCBmaWd1cmUgb3V0IGZyb20gdGhlIHByb2dyYW0gKi8KLQlmcmVlKHByb2dyYW1EaXIpOwotCXByb2dyYW1EaXIgPSBOVUxMOwotCXJldHVybiBOVUxMOwotfQotCi1fVENIQVIqIGdldE9mZmljaWFsTmFtZSgpIHsKLQlyZXR1cm4gb2ZmaWNpYWxOYW1lOwotfQotCi0vKgotICogRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IG9mZmljaWFsIGFwcGxpY2F0aW9uIG5hbWUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIG5hbWUgdGhhdCBhcHBlYXJzIGluIGEgdmFyaWV0eSBvZgotICogcGxhY2VzIHN1Y2ggYXM6IHRpdGxlIG9mIG1lc3NhZ2UgZGlhbG9nLCB0aXRsZSBvZiBzcGxhc2ggc2NyZWVuIHdpbmRvdwotICogdGhhdCBzaG93cyB1cCBpbiBXaW5kb3dzIHRhc2sgYmFyLgotICogSXQgaXMgY29tcHV0ZWQgZnJvbSB0aGUgbmFtZSBvZiB0aGUgbGF1bmNoZXIgZXhlY3V0YWJsZSBhbmQKLSAqIGJ5IGNhcGl0YWxpemluZyB0aGUgZmlyc3QgbGV0dGVyLiBlLmcuICJjOi9pZGUvZWNsaXBzZS5leGUiIHByb3ZpZGVzCi0gKiBhIGRlZmF1bHQgbmFtZSBvZiAiRWNsaXBzZSIuCi0gKi8KLXN0YXRpYyBfVENIQVIqIGdldERlZmF1bHRPZmZpY2lhbE5hbWUoX1RDSEFSKiBwcm9ncmFtKQotewotCV9UQ0hBUiAqY2ggPSBOVUxMOwotCQotCS8qIFNraXAgdGhlIGRpcmVjdG9yeSBwYXJ0ICovCi0JY2ggPSBsYXN0RGlyU2VwYXJhdG9yKCBwcm9ncmFtICk7Ci0JaWYgKGNoID09IE5VTEwpIGNoID0gcHJvZ3JhbTsKLQllbHNlIGNoKys7Ci0JCi0JY2ggPSBfdGNzZHVwKCBjaCApOwotI2lmZGVmIF9XSU4zMgotCXsKLQkJLyogU2VhcmNoIGZvciB0aGUgZXh0ZW5zaW9uIC5leGUgYW5kIGN1dCBpdCAqLwotCQlfVENIQVIgKmV4dGVuc2lvbiA9IF90Y3NyY2hyKGNoLCBfVF9FQ0xJUFNFKCcuJykpOwotCQlpZiAoZXh0ZW5zaW9uICE9IE5VTEwpIAotCQl7Ci0JCQkqZXh0ZW5zaW9uID0gX1RfRUNMSVBTRSgnXDAnKTsKLQkJfQotCX0KLSNlbmRpZgotCS8qIFVwcGVyIGNhc2UgdGhlIGZpcnN0IGNoYXJhY3RlciAqLwotI2lmbmRlZiBMSU5VWAotCXsKLQkJKmNoID0gX3RvdHVwcGVyKCpjaCk7Ci0JfQotI2Vsc2UKLQl7Ci0JCWlmICgqY2ggPj0gJ2EnICYmICpjaCA8PSAneicpCi0JCXsKLQkJCSpjaCAtPSAzMjsKLQkJfQotCX0KLSNlbmRpZgotCXJldHVybiBjaDsKLX0KLQotc3RhdGljIF9UQ0hBUiogZmluZExpYnJhcnkoX1RDSEFSKiBsaWJyYXJ5LCBfVENIQVIqIHByb2dyYW0pIAotewotCV9UQ0hBUiogYzsKLQlfVENIQVIqIHBhdGg7Ci0JX1RDSEFSKiBmcmFnbWVudDsKLQlfVENIQVIqIHJlc3VsdDsKLQlfVENIQVIqIGRvdCA9IF9UX0VDTElQU0UoIi4iKTsKLQlzaXplX3QgcHJvZ0xlbmd0aCwgcGF0aExlbmd0aDsKLQlzaXplX3QgZnJhZ21lbnRMZW5ndGg7Ci0Jc3RydWN0IF9zdGF0IHN0YXRzOwotCQotCWlmIChsaWJyYXJ5ICE9IE5VTEwpIHsKLQkJcGF0aCA9IGNoZWNrUGF0aChsaWJyYXJ5LCBwcm9ncmFtRGlyLCAwKTsKLQkJaWYgKF90c3RhdChwYXRoLCAmc3RhdHMpID09IDAgJiYgKHN0YXRzLnN0X21vZGUgJiBTX0lGRElSKSAhPSAwKSAKLSAgICAgICAgewotICAgICAgICAgICAgLyogZGlyZWN0b3J5LCBmaW5kIHRoZSBoaWdoZXN0IHZlcnNpb24gZWNsaXBzZV8qIGxpYnJhcnkgKi8KLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRGaWxlKHBhdGgsIF9UX0VDTElQU0UoImVjbGlwc2UiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAkvKiBmaWxlLCByZXR1cm4gaXQgKi8KLSAgICAgICAgCXJlc3VsdCA9IF90Y3NkdXAocGF0aCk7Ci0gICAgICAgIH0KLQotCQlpZiAocGF0aCAhPSBsaWJyYXJ5KQotCQkJZnJlZShwYXRoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyogYnVpbGQgdGhlIGVxdWlub3gubGF1bmNoZXIgZnJhZ21lbnQgbmFtZSAqLwotCWZyYWdtZW50TGVuZ3RoID0gX3Rjc2xlbihERUZBVUxUX0VRVUlOT1hfU1RBUlRVUCkgKyAxICsgX3Rjc2xlbih3c0FyZykgKyAxICsgX3Rjc2xlbihvc0FyZykgKyAxICsgX3Rjc2xlbihvc0FyY2hBcmcpICsgMTsKLQlmcmFnbWVudCA9IG1hbGxvYyhmcmFnbWVudExlbmd0aCAqIHNpemVvZihfVENIQVIpKTsKLQlfdGNzY3B5KGZyYWdtZW50LCBERUZBVUxUX0VRVUlOT1hfU1RBUlRVUCk7Ci0JX3Rjc2NhdChmcmFnbWVudCwgZG90KTsKLQlfdGNzY2F0KGZyYWdtZW50LCB3c0FyZyk7Ci0JX3Rjc2NhdChmcmFnbWVudCwgZG90KTsKLQlfdGNzY2F0KGZyYWdtZW50LCBvc0FyZyk7Ci0JLy8hKGZyYWdtZW50T1MuZXF1YWxzKENvbnN0YW50cy5PU19NQUNPU1gpICYmICFDb25zdGFudHMuQVJDSF9YODZfNjQuZXF1YWxzKGZyYWdtZW50QXJjaCkpCi0jaWYgIShkZWZpbmVkKE1BQ09TWCkgJiYgIWRlZmluZWQoX194ODZfNjRfXykpIAotCS8qIFRoZSBNYWMgZnJhZ21lbnQgY292ZXJzIGJvdGggYXJjaHMgYW5kIGRvZXMgbm90IGhhdmUgdGhhdCBsYXN0IHNlZ21lbnQgKi8KLQlfdGNzY2F0KGZyYWdtZW50LCBkb3QpOwotCV90Y3NjYXQoZnJhZ21lbnQsIG9zQXJjaEFyZyk7Ci0jZW5kaWYJCi0JcHJvZ0xlbmd0aCA9IHBhdGhMZW5ndGggPSBfdGNzbGVuKHByb2dyYW1EaXIpOwotI2lmZGVmIE1BQ09TWAotCXBhdGhMZW5ndGggKz0gOTsKLSNlbmRpZgotCXBhdGggPSBtYWxsb2MoIChwYXRoTGVuZ3RoICsgMSArIDcgKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLQlfdGNzY3B5KHBhdGgsIHByb2dyYW1EaXIpOwotCWlmICghSVNfRElSX1NFUEFSQVRPUihwYXRoW3Byb2dMZW5ndGggLSAxXSkpIHsKLQkJcGF0aFtwcm9nTGVuZ3RoXSA9IGRpclNlcGFyYXRvcjsKLQkJcGF0aFtwcm9nTGVuZ3RoICsgMV0gPSAwOwotCX0KLSNpZmRlZiBNQUNPU1gKLQlfdGNzY2F0KHBhdGgsIF9UX0VDTElQU0UoIi4uLy4uLy4uLyIpKTsKLSNlbmRpZgotCV90Y3NjYXQocGF0aCwgX1RfRUNMSVBTRSgicGx1Z2lucyIpKTsKLQkKLQljID0gZmluZEZpbGUocGF0aCwgZnJhZ21lbnQpOwotCWZyZWUoZnJhZ21lbnQpOwotCWlmIChjID09IE5VTEwpCi0JCXJldHVybiBjOwotCWZyYWdtZW50ID0gYzsKLQkKLQlyZXN1bHQgPSBmaW5kRmlsZShmcmFnbWVudCwgX1RfRUNMSVBTRSgiZWNsaXBzZSIpKTsKLQkKLQlmcmVlKGZyYWdtZW50KTsKLQlmcmVlKHBhdGgpOwotCQotCXJldHVybiByZXN1bHQ7IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlTW96aWxsYS5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlTW96aWxsYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQzMGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZU1vemlsbGEuYworKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFY2xpcHNlIE1vemlsbGEgVXRpbGl0eSBNZXRob2RzICovCi0KLSNpZmRlZiBNT1pJTExBX0ZJWAotCi0jaW5jbHVkZSAiZWNsaXBzZU1vemlsbGEuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLQotLyogRmlsdGVyIGZ1bmN0aW9uIHVzZWQgYnkgZml4RW52Rm9yTW96aWxsYSgpIGZvciBmaW5kaW5nIGRpcmVjdG9yaWVzCi0gKiB3aXRoIGEgZGVzaXJlZCBwcmVmaXguCi0gKi8KLWludCBmaWx0ZXIoY29uc3Qgc3RydWN0IGRpcmVudCAqZGlyKQotewotCWNoYXIqIHByZWZpeGVzW10gPSB7Ci0JCSJ4dWxydW5uZXItIiwKLQkJIm1vemlsbGEtc2VhbW9ua2V5LSIsCi0JCSJzZWFtb25rZXktIiwKLQkJIm1vemlsbGEtIiwKLQkJIm1vemlsbGEtZmlyZWZveC0iLAotCQkiZmlyZWZveC0iLAotCQlOVUxMCi0JfTsKLQlpbnQgWFVMUlVOTkVSX0lOREVYID0gMDsKLSNpZiBkZWZpbmVkKF9fYW1kNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCi0JY2hhciogcm9vdCA9ICIvdXNyL2xpYjY0LyI7Ci0jZWxzZQotCWNoYXIqIHJvb3QgPSAiL3Vzci9saWIvIjsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoU09MQVJJUykKLQkvKgotCSAqIFRoZSBzb2xhcmlzIGNvbXBpbGVyIGRvZXMgbm90IGRvIHN0YXRpYyBsaW5raW5nLCBzbyBqdXN0IGNoZWNrCi0JICogZm9yIGEgY29tbW9uIGxpYiB0byBlbnN1cmUgdGhhdCB0aGUgaW5zdGFsbCBzZWVtcyB2YWxpZC4KLQkgKi8KLQljaGFyKiB0ZXN0bGliID0gIi9saWJ4cGNvbS5zbyI7Ci0jZWxzZQotCS8qIEVuc3VyZSB0aGF0IHRoZSBpbnN0YWxsIGlzIGR5bmFtaWNhbGx5LWxpbmtlZCBhbmQgaXMgYnVpbHQgd2l0aCBHVEsyICovCi0JY2hhciogdGVzdGxpYiA9ICIvY29tcG9uZW50cy9saWJ3aWRnZXRfZ3RrMi5zbyI7Ci0jZW5kaWYKLQotCXN0cnVjdCBzdGF0IGJ1ZjsKLQlpbnQgaW5kZXggPSAwOwotCWNoYXIqIGRpcm5hbWUgPSAoY2hhciAqKWRpci0+ZF9uYW1lOwotCi0JY2hhciogcHJlZml4ID0gcHJlZml4ZXMgW2luZGV4XTsKLQl3aGlsZSAocHJlZml4ICE9IE5VTEwpCi0JewotCQlpbnQgcHJlZml4TGVuZ3RoID0gc3RybGVuKHByZWZpeCk7Ci0JCWlmIChzdHJuY21wKGRpcm5hbWUsIHByZWZpeCwgcHJlZml4TGVuZ3RoKSA9PSAwKQotCQl7Ci0JCQlpZiAoaW5kZXggPT0gWFVMUlVOTkVSX0lOREVYKSByZXR1cm4gMTsJLyogaW5jbHVkZSBpbiBzY2FuZGlyIHJlc3VsdCAqLwotCi0JCQkvKiBDaGVjayBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgcHJlZml4IGlzIGEgbnVtZXJpYyBkaWdpdC4KLQkJCSAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBzdWZmaXggcmVwcmVzZW50cyBhIHZlcnNpb24gbnVtYmVyIGxpa2UKLQkJCSAqICJtb3ppbGxhLTEuNy4zIiwgYW5kIG5vdCBhIGRpZmZlcmVudCBwcm9kdWN0IGxpa2UgIm1vemlsbGEtdGh1bmRlcmJpcmQiLgotCQkJICovCi0JCQlpbnQgZGlyTGVuZ3RoID0gc3RybGVuKGRpcm5hbWUpOwotCQkJaWYgKCcwJyA8PSBkaXJuYW1lW3ByZWZpeExlbmd0aF0gJiYgZGlybmFtZVtwcmVmaXhMZW5ndGhdIDw9ICc5JykgewotCQkJCS8qIElmIGEgeHVscnVubmVyIGluc3RhbGwgaXMgZm91bmQgdGhlbiBzdWNjZXNzIGlzIGltbWVkaWF0ZSBzaW5jZQotCQkJCSAqIHh1bHJ1bm5lciBhbHdheXMgcHJvdmlkZXMgYW4gZW1iZWRkYWJsZSBHUkUuCi0JCQkJICovCQkJCQotCQkJCWlmIChpbmRleCA9PSBYVUxSVU5ORVJfSU5ERVgpIHJldHVybiAxOwkvKiBpbmNsdWRlIGluIHNjYW5kaXIgcmVzdWx0ICovCi0JCQkJCi0JCQkJY2hhciogdGVzdHBhdGggPSBtYWxsb2MgKHN0cmxlbihyb290KSArIGRpckxlbmd0aCArIHN0cmxlbih0ZXN0bGliKSArIDEpOwotCQkJCXN0cmNweSh0ZXN0cGF0aCwgcm9vdCk7Ci0JCQkJc3RyY2F0KHRlc3RwYXRoLCBkaXJuYW1lKTsKLQkJCQlzdHJjYXQodGVzdHBhdGgsIHRlc3RsaWIpOwotCQkJCWludCBzdWNjZXNzID0gc3RhdCh0ZXN0cGF0aCwgJmJ1ZikgPT0gMDsKLQkJCQlmcmVlKHRlc3RwYXRoKTsKLQkJCQlpZiAoc3VjY2VzcykKLQkJCQl7Ci0JCQkJCXJldHVybiAxOwkvKiBpbmNsdWRlIGluIHNjYW5kaXIgcmVzdWx0ICovCi0JCQkJfQotCQkJfQotCQl9Ci0JCXByZWZpeCA9IHByZWZpeGVzIFsrK2luZGV4XTsKLQl9Ci0JcmV0dXJuIDA7CS8qIGV4Y2x1ZGUgZnJvbSBzY2FuZGlyIHJlc3VsdCAqLwotfQotCi0jaWYgZGVmaW5lZCAoU09MQVJJUykKLS8qCi0gKiBBIHJlcGxhY2VtZW50IGZvciAKLSAqIAkJCXNjYW5kaXIoY29uc3QgY2hhciAqZGlyLCBzdHJ1Y3QgZGlyZW50ICoqKm5hbWVsaXN0LCBmaWx0ZXIsIGFscGhhc29ydCk7Ci0gKiBiZWNhdXNlIHNjYW5kaXIgJiBhbHBoYXNvcnQgZG9uJ3QgZXhpc3Qgb24gU29sYXJpcyA5LgotICogUmV0dXJuIHRoZSBkaXJlbnQtPmRfbmFtZSB0aGF0IHdhcyBzb3J0ZWQgdGhlIGhpZ2hlc3QgYWNjb3JkaW5nIHRvIHN0cmNvbGwsIAotICogICAgICAgICAgICBvciBOVUxMIG9uIGVycm9yIG9yIGlmIG5vIGVudHJpZXMgbWF0Y2hlZCB0aGUgZmlsdGVyLgotICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgcmV0dXJuZWQgc3RyaW5nCi0gKi8KLWNoYXIgKiBzY2FuKGNvbnN0IGNoYXIgKiBwYXRoKSB7Ci0JRElSICpkaXIgPSBOVUxMOwotCXN0cnVjdCBkaXJlbnQgKiBlbnRyeSA9IE5VTEw7Ci0JY2hhciAqIGNhbmRpZGF0ZSA9IE5VTEw7Ci0JCi0JaWYgKChkaXIgPSBvcGVuZGlyKHBhdGgpKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKLQkJaWYgKGZpbHRlcihlbnRyeSkpIHsKLQkJCWlmIChjYW5kaWRhdGUgPT0gTlVMTCkgewotCQkJCWNhbmRpZGF0ZSA9IHN0cmR1cChlbnRyeS0+ZF9uYW1lKTsKLQkJCX0gZWxzZSBpZiAoc3RyY29sbChjYW5kaWRhdGUsIGVudHJ5LT5kX25hbWUpIDwgMCkgewotCQkJCWZyZWUoY2FuZGlkYXRlKTsKLQkJCQljYW5kaWRhdGUgPSBzdHJkdXAoZW50cnktPmRfbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JY2xvc2VkaXIoZGlyKTsKLQkKLQlyZXR1cm4gY2FuZGlkYXRlOwotfQotI2VuZGlmCi0KLS8qIFNldCB0aGUgZW52aXJvbm1uZW50IHJlcXVpcmVkIGJ5IHRoZSBTV1QgQnJvd3NlciB3aWRnZXQgdG8gYmluZCB0byBNb3ppbGxhLiAKLSAqIFRoZSBTV1QgQnJvd3NlciB3aWRnZXQgcmVsaWVzIG9uIE1vemlsbGEgb24gTGludXguIFRoZSBMRF9MSUJSQVJZX1BBVEgKLSAqIGFuZCB0aGUgTW96aWxsYSBlbnZpcm9ubWVudCB2YXJpYWJsZSBNT1pJTExBX0ZJVkVfSE9NRSBtdXN0IHBvaW50Ci0gKiB0byB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBNb3ppbGxhLgotICogCi0gKiAxLiBVc2UgdGhlIGxvY2F0aW9uIHNldCBieSBNT1pJTExBX0ZJVkVfSE9NRSBpZiBpdCBpcyBkZWZpbmVkCi0gKiAyLiBQYXJzZSB0aGUgZmlsZSAvZXRjL2dyZS5jb25mIGlmIGl0IGlzIGRlZmluZWQuIFRoaXMgZmlsZSBpcwotICogICAgc2V0IGJ5IHRoZSBSZWR0SGF0IFJQTSBtYW5hZ2VyLgotICogMy4gVHJ5IHNvbWUgY29tbW9uIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMuCi0gKi8KLXZvaWQgZml4RW52Rm9yTW96aWxsYSgpIHsKLQlzdGF0aWMgaW50IGZpeGVkID0gMDsKLQlpZiAoZml4ZWQpIHJldHVybjsgCi0JewotCQljaGFyICpsZFBhdGggPSAoY2hhciopZ2V0ZW52KCJMRF9MSUJSQVJZX1BBVEgiKTsKLQkJY2hhciAqbW96aWxsYUZpdmVIb21lID0gKGNoYXIqKWdldGVudigiTU9aSUxMQV9GSVZFX0hPTUUiKTsKLQkJY2hhciAqZ3JlUGF0aCA9IE5VTEw7IC8qIEdlY2tvIFJ1bnRpbWUgRW52aXJvbm1lbnQgTG9jYXRpb24gKi8KLQkJZml4ZWQgPSAxOwotCQkvKiBBbHdheXMgZHVwIHRoZSBzdHJpbmcgc28gd2UgY2FuIGZyZWUgbGF0ZXIgKi8KLQkJaWYgKGxkUGF0aCAhPSBOVUxMKSBsZFBhdGggPSBzdHJkdXAobGRQYXRoKTsKLQkJZWxzZSBsZFBhdGggPSBzdHJkdXAoIiIpOwotCQkKLQkJLyogTU9aSUxMQV9GSVZFX0hPTUUgKGlmIGRlZmluZWQpIHBvaW50cyB0byB0aGUgTW96aWxsYQotCQkgKiBpbnN0YWxsIGRpcmVjdG9yeS4gRG9uJ3QgbG9vayBhbnkgZnVydGhlciBpZiBpdCBpcyBzZXQuCi0JCSAqLwotCQlpZiAobW96aWxsYUZpdmVIb21lICE9IE5VTEwpIAotCQl7Ci0JCQlncmVQYXRoID0gc3RyZHVwKG1vemlsbGFGaXZlSG9tZSk7Ci0JCX0KLQotCQkvKiBUaGUgZmlsZSBncmUuY29uZiAoaWYgYXZhaWxhYmxlKSBwb2ludHMgdG8gdGhlCi0JCSAqIE1vemlsbGEgaW5zdGFsbCBkaXJlY3RvcnkuIERvbid0IGxvb2sgYW55IGZ1cnRoZXIgaWYgCi0JCSAqIGl0IGlzIHNldC4KLQkJICovCi0JCWlmIChncmVQYXRoID09IE5VTEwpCi0JCXsKLQkJCXN0cnVjdCBzdGF0IGJ1ZjsKLQkJCUZJTEUgKmZpbGUgPSBOVUxMOwotI2lmIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19wb3dlcnBjNjRfXykKLQkJCWlmIChzdGF0KCIvZXRjL2dyZTY0LmNvbmYiLCAmYnVmKSA9PSAwKQotCQkJewotCQkJCWZpbGUgPSBmb3BlbigiL2V0Yy9ncmU2NC5jb25mIiwgInIiKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXQoIi9ldGMvZ3JlLmQvZ3JlNjQuY29uZiIsICZidWYpID09IDApCi0JCQl7Ci0JCQkJZmlsZSA9IGZvcGVuKCIvZXRjL2dyZS5kL2dyZTY0LmNvbmYiLCAiciIpOwotCQkJfSBlbHNlCi0jZW5kaWYKLQkJCWlmIChzdGF0KCIvZXRjL2dyZS5jb25mIiwgJmJ1ZikgPT0gMCkKLQkJCXsKLQkJCQlmaWxlID0gZm9wZW4oIi9ldGMvZ3JlLmNvbmYiLCAiciIpOwotCQkJfQotCQkJZWxzZSBpZiAoc3RhdCgiL2V0Yy9ncmUuZC9ncmUuY29uZiIsICZidWYpID09IDApCi0JCQl7Ci0JCQkJZmlsZSA9IGZvcGVuKCIvZXRjL2dyZS5kL2dyZS5jb25mIiwgInIiKTsKLQkJCX0KLQkJCWlmIChmaWxlICE9IE5VTEwpCi0JCQl7Ci0JCQkJY2hhciBidWZmZXJbMTAyNF07Ci0JCQkJY2hhciBwYXRoWzEwMjRdOwotCQkJCXdoaWxlIChmZ2V0cyhidWZmZXIsIDEwMjQsIGZpbGUpICE9IE5VTEwpCi0JCQkJewotCQkJCQlpZiAoc3NjYW5mKGJ1ZmZlciwgIkdSRV9QQVRIPSVzIiwgcGF0aCkgPT0gMSkKLQkJCQkJewotCQkJCQkJZ3JlUGF0aCA9IHN0cmR1cChwYXRoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZjbG9zZShmaWxlKTsKLQkJCX0KLQkJfQotCi0JCS8qIFRyeSBzb21lIGNvbW1vbiBpbnN0YWxsYXRpb24gbG9jYXRpb25zLiAqLwotCQlpZiAoZ3JlUGF0aCA9PSBOVUxMKQotCQl7Ci0JCQkvKiB0cnkgeHVscnVubmVyLSosIG1vemlsbGEtKiwgZmlyZWZveC0qIGRpcmVjdG9yaWVzIGluIC91c3IvbGliLyAqLwotI2lmIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19wb3dlcnBjNjRfXykKLQkJCWNoYXIqIGRpciA9ICIvdXNyL2xpYjY0LyI7Ci0jZWxzZQotCQkJY2hhciogZGlyID0gIi91c3IvbGliLyI7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChTT0xBUklTKQotCQkJY2hhciAqIG5hbWUgPSBzY2FuKGRpcik7Ci0JCQlpZiAobmFtZSAhPSBOVUxMKSB7Ci0jZWxzZQotCQkJc3RydWN0IGRpcmVudCAqKm5hbWVsaXN0OwotCQkJaW50IGk7Ci0JCQlpbnQgY291bnQgPSBzY2FuZGlyKGRpciwgJm5hbWVsaXN0LCBmaWx0ZXIsIGFscGhhc29ydCk7Ci0JCQlpZiAoY291bnQgPiAwKQotCQkJewotCQkJCS8qIGNvdW50LTEgaXMgdXNlZCBiZWxvdyBpbiBhbiBhdHRlbXB0IHRvIGdldCB0aGUgbWF0Y2hlZCBkaXJlY3RvcnkKLQkJCQkgKiB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBudW1iZXIuCi0JCQkJICovCi0JCQkJY2hhciogbmFtZSA9IG5hbWVsaXN0IFtjb3VudCAtIDFdLT5kX25hbWU7Ci0jZW5kaWYKLQkJCQlncmVQYXRoID0gbWFsbG9jIChzdHJsZW4oZGlyKSArIHN0cmxlbihuYW1lKSArIDEpOwotCQkJCXN0cmNweShncmVQYXRoLCBkaXIpOwotCQkJCXN0cmNhdChncmVQYXRoLCBuYW1lKTsKLSNpZiBkZWZpbmVkIChTT0xBUklTKQotCQkJCWZyZWUobmFtZSk7Ci0jZWxzZQotCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCWZyZWUobmFtZWxpc3QgW2ldKTsKLQkJCQl9Ci0JCQkJZnJlZShuYW1lbGlzdCk7Ci0jZW5kaWYKLQkJCX0KLQotCQkJaWYgKGdyZVBhdGggPT0gTlVMTCkKLQkJCXsKLQkJCQkvKiBzb21lIG90aGVyIHR5cGljYWwgaW5zdGFsbGF0aW9uIGxvY2F0aW9ucyAqLwotCQkJCWNoYXIqIGRpcnNbXSA9IHsKLSNpZiBkZWZpbmVkKF9fYW1kNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCi0JCQkJCSIvdXNyL2xpYjY0L3h1bHJ1bm5lci8iLAotCQkJCQkiL3Vzci9saWI2NC9tb3ppbGxhLWZpcmVmb3gvIiwKLQkJCQkJIi91c3IvbGliNjQvZmlyZWZveC8iLAotCQkJCQkiL3Vzci9saWI2NC9tb3ppbGxhLXNlYW1vbmtleS8iLAotCQkJCQkiL3Vzci9saWI2NC9zZWFtb25rZXkvIiwKLQkJCQkJIi91c3IvbGliNjQvbW96aWxsYS8iLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU09MQVJJUykKLQkJCQkJIi91c3Ivc2Z3L2xpYi94dWxydW5uZXIvIiwKLQkJCQkJIi91c3Ivc2Z3L2xpYi9tb3ppbGxhLWZpcmVmb3gvIiwKLQkJCQkJIi91c3Ivc2Z3L2xpYi9maXJlZm94LyIsCi0JCQkJCSIvdXNyL3Nmdy9saWIvbW96aWxsYS8iLAotCQkJCQkiL3Vzci9zZncvbGliL21vemlsbGEtc2VhbW9ua2V5LyIsCi0JCQkJCSIvdXNyL3Nmdy9saWIvc2VhbW9ua2V5LyIsCi0jZW5kaWYKLQkJCQkJIi91c3IvbGliL3h1bHJ1bm5lci8iLAotCQkJCQkiL3Vzci9saWIvbW96aWxsYS1maXJlZm94LyIsCi0JCQkJCSIvdXNyL2xpYi9maXJlZm94LyIsCi0JCQkJCSIvdXNyL2xpYi9tb3ppbGxhLXNlYW1vbmtleS8iLAotCQkJCQkiL3Vzci9saWIvc2VhbW9ua2V5LyIsCi0JCQkJCSIvdXNyL2xpYi9tb3ppbGxhLyIsCi0JCQkJCSIvdXNyL2xvY2FsL3h1bHJ1bm5lci8iLAotCQkJCQkiL29wdC94dWxydW5uZXIvIiwKLQkJCQkJIi91c3IvbG9jYWwvbW96aWxsYS1maXJlZm94LyIsCi0JCQkJCSIvdXNyL2xvY2FsL2ZpcmVmb3gvIiwKLQkJCQkJIi9vcHQvbW96aWxsYS1maXJlZm94LyIsCi0JCQkJCSIvb3B0L2ZpcmVmb3gvIiwKLQkJCQkJIi91c3IvbG9jYWwvbW96aWxsYS1zZWFtb25rZXkvIiwKLQkJCQkJIi91c3IvbG9jYWwvc2VhbW9ua2V5LyIsCi0JCQkJCSIvb3B0L21vemlsbGEtc2VhbW9ua2V5LyIsCi0JCQkJCSIvb3B0L3NlYW1vbmtleS8iLAotCQkJCQkiL3Vzci9sb2NhbC9tb3ppbGxhLyIsCi0JCQkJCSIvb3B0L21vemlsbGEvIiwKLQkJCQkJTlVMTAotCQkJCX07Ci0KLSNpZiBkZWZpbmVkIChTT0xBUklTKQotCQkJCS8qCi0JCQkJICogVGhlIHNvbGFyaXMgY29tcGlsZXIgZG9lcyBub3QgZG8gc3RhdGljIGxpbmtpbmcsIHNvIGp1c3QgY2hlY2sKLQkJCQkgKiBmb3IgYSBjb21tb24gbGliIHRvIGVuc3VyZSB0aGF0IHRoZSBpbnN0YWxsIHNlZW1zIHZhbGlkLgotCQkJCSAqLwotCQkJCWNoYXIqIHRlc3RsaWIgPSAibGlieHBjb20uc28iOwotI2Vsc2UKLQkJCQkvKiBFbnN1cmUgdGhhdCB0aGUgaW5zdGFsbCBpcyBkeW5hbWljYWxseS1saW5rZWQgYW5kIGlzIGJ1aWx0IHdpdGggR1RLMiAqLwotCQkJCWNoYXIqIHRlc3RsaWIgPSAiY29tcG9uZW50cy9saWJ3aWRnZXRfZ3RrMi5zbyI7Ci0jZW5kaWYKLQotCQkJCXN0cnVjdCBzdGF0IGJ1ZjsKLQkJCQlpbnQgaW5kZXggPSAwOwotCi0JCQkJY2hhciogZGlyID0gZGlycyBbaW5kZXgrK107Ci0JCQkJd2hpbGUgKGRpciAhPSBOVUxMKQotCQkJCXsKLQkJCQkJY2hhciogdGVzdHBhdGggPSBtYWxsb2MgKHN0cmxlbihkaXIpICsgc3RybGVuKHRlc3RsaWIpICsgMSk7Ci0JCQkJCXN0cmNweSh0ZXN0cGF0aCwgZGlyKTsKLQkJCQkJc3RyY2F0KHRlc3RwYXRoLCB0ZXN0bGliKTsKLQkJCQkJaW50IHN1Y2Nlc3MgPSBzdGF0KHRlc3RwYXRoLCAmYnVmKSA9PSAwOwotCQkJCQlmcmVlKHRlc3RwYXRoKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpCi0JCQkJCXsKLQkJCQkJCWdyZVBhdGggPSBzdHJkdXAoZGlyKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWRpciA9IGRpcnMgW2luZGV4KytdOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChncmVQYXRoICE9IE5VTEwpCi0JCXsKLQkJCWxkUGF0aCA9IChjaGFyKilyZWFsbG9jKGxkUGF0aCwgc3RybGVuKGxkUGF0aCkgKyBzdHJsZW4oZ3JlUGF0aCkgKyAyKTsKLQkJCWlmIChzdHJsZW4obGRQYXRoKSA+IDApIHN0cmNhdChsZFBhdGgsICI6Iik7Ci0JCQlzdHJjYXQobGRQYXRoLCBncmVQYXRoKTsKLQkJCXNldGVudigiTERfTElCUkFSWV9QQVRIIiwgbGRQYXRoLCAxKTsKLQkJCQotCQkJaWYgKG1vemlsbGFGaXZlSG9tZSA9PSBOVUxMKSBzZXRlbnYoIk1PWklMTEFfRklWRV9IT01FIiwgZ3JlUGF0aCwgMSk7Ci0JCQlmcmVlKGdyZVBhdGgpOwotCQl9Ci0JCWZyZWUobGRQYXRoKTsKLQl9Ci19Ci0jZW5kaWYgLyogTU9aSUxMQV9GSVggKi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZU1vemlsbGEuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZU1vemlsbGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiNGYwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VNb3ppbGxhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgRUNMSVBTRV9NT1pJTExBX0gKLSNkZWZpbmUgRUNMSVBTRV9NT1pJTExBX0gKLQotLyogRWNsaXBzZSBNb3ppbGxhIFV0aWxpdHkgTWV0aG9kcyAqLwotCi0jaWZkZWYgTU9aSUxMQV9GSVgKLWV4dGVybiB2b2lkIGZpeEVudkZvck1vemlsbGEoKTsKLSNlbmRpZiAvKiBNT1pJTExBX0ZJWCAqLwotCi0jZW5kaWYgLyogRUNMSVBTRV9NT1pJTExBX0ggKi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZU5peC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlTml4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTA4ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlTml4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgY29tbW9uIGJldHdlZW4gR1RLICYgTW90aWYgKi8KLSNpbmNsdWRlICJlY2xpcHNlT1MuaCIKLSNpbmNsdWRlICJlY2xpcHNlQ29tbW9uLmgiCi0jaW5jbHVkZSAiZWNsaXBzZU1vemlsbGEuaCIKLSNpbmNsdWRlICJlY2xpcHNlVXRpbC5oIgotI2luY2x1ZGUgImVjbGlwc2VKTkkuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaWZkZWYgaTM4NgotI2RlZmluZSBKQVZBX0FSQ0ggImkzODYiCi0jZWxpZiBkZWZpbmVkKF9fcHBjX18pIHx8IGRlZmluZWQoX19wb3dlcnBjNjRfXykKLSNkZWZpbmUgSkFWQV9BUkNIICJwcGMiIAotI2VsaWYgZGVmaW5lZChTT0xBUklTKQotI2RlZmluZSBKQVZBX0FSQ0ggInNwYXJjIgotI2VsaWYgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgCi0jZGVmaW5lIEpBVkFfQVJDSCAiYW1kNjQiCi0jZWxzZQotI2RlZmluZSBKQVZBX0FSQ0ggREVGQVVMVF9PU19BUkNICi0jZW5kaWYKLQotI2lmZGVmIEFJWAotI2RlZmluZSBMSUJfUEFUSF9WQVIgX1RfRUNMSVBTRSgiTElCUEFUSCIpCi0jZWxzZQotI2RlZmluZSBMSUJfUEFUSF9WQVIgX1RfRUNMSVBTRSgiTERfTElCUkFSWV9QQVRIIikKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9MT0NBVElPTl9MRU5HVEggNDAgLyogbm9uZSBvZiB0aGUganZtTG9jYXRpb25zIHN0cmluZ3Mgc2hvdWxkIGJlIGxvbmdlciB0aGFuIHRoaXMgKi8gCi1zdGF0aWMgY29uc3QgY2hhcioganZtTG9jYXRpb25zIFtdID0geyAiajl2bSIsICIuLi9qcmUvYmluL2o5dm0iLAotCQkJCQkJCQkJICAgImNsYXNzaWMiLCAiLi4vanJlL2Jpbi9jbGFzc2ljIiwKLQkJCQkJCQkJCSAgICIuLi9saWIvIiBKQVZBX0FSQ0ggIi9jbGllbnQiLCAgCi0JCQkJCQkJCQkgICAiLi4vbGliLyIgSkFWQV9BUkNIICIvc2VydmVyIiwKLQkJCQkJCQkJCSAgICIuLi9saWIvIiBKQVZBX0FSQ0ggIi9qcm9ja2l0IiwKLQkJCQkJCQkJCSAgICIuLi9qcmUvbGliLyIgSkFWQV9BUkNIICIvY2xpZW50IiwKLQkJCQkJCQkJCSAgICIuLi9qcmUvbGliLyIgSkFWQV9BUkNIICIvc2VydmVyIiwKLQkJCQkJCQkJCSAgICIuLi9qcmUvbGliLyIgSkFWQV9BUkNIICIvanJvY2tpdCIsCi0JCQkJCQkJCQkgICAiLi4vbGliL2p2bS9qcmUvbGliLyIgSkFWQV9BUkNIICIvY2xpZW50IiwKLQkJCQkJCQkJIAkgICBOVUxMIH07Ci0KLXN0YXRpYyB2b2lkIGFkanVzdExpYnJhcnlQYXRoKCBjaGFyICogdm1MaWJyYXJ5ICk7Ci1zdGF0aWMgY2hhciAqIGZpbmRMaWIoY2hhciAqIGNvbW1hbmQpOwotI2lmZGVmIE5FVFNDQVBFX0ZJWAotZXh0ZXJuIHZvaWQgICBmaXhFbnZGb3JOZXRzY2FwZSgpOwotI2VuZGlmIC8qIE5FVFNDQVBFX0ZJWCAqLwotCi1jaGFyICogZmluZFZNTGlicmFyeSggY2hhciogY29tbWFuZCApIHsKLQljaGFyICogbGliID0gZmluZExpYihjb21tYW5kKTsKLQlpZiggbGliICE9IE5VTEwgKSB7Ci0JCWFkanVzdExpYnJhcnlQYXRoKGxpYik7Ci0JfQotCXJldHVybiBsaWI7Ci19Ci0KLXN0YXRpYyBjaGFyICogZmluZExpYihjaGFyICogY29tbWFuZCkgewotCWludCBpOwotCWludCBwYXRoTGVuZ3RoOwkKLQlzdHJ1Y3Qgc3RhdCBzdGF0czsKLQljaGFyICogcGF0aDsJCQkJLyogcGF0aCB0byByZXN1bHRpbmcganZtIHNoYXJlZCBsaWJyYXJ5ICovCi0JY2hhciAqIGxvY2F0aW9uOwkJCS8qIHBvaW50cyB0byBiZWdpbmluZyBvZiBqdm1Mb2NhdGlvbnMgc2VjdGlvbiBvZiBwYXRoICovCi0JCi0JaWYgKGNvbW1hbmQgIT0gTlVMTCkgewotCQkvKmNoZWNrIGZpcnN0IHRvIHNlZSBpZiBjb21tYW5kIGFscmVhZHkgcG9pbnRzIHRvIHRoZSBsaWJyYXJ5ICovCi0JCWlmIChpc1ZNTGlicmFyeShjb21tYW5kKSkgewotCQkJaWYgKHN0YXQoIGNvbW1hbmQsICZzdGF0cyApID09IDAgJiYgKHN0YXRzLnN0X21vZGUgJiBTX0lGUkVHKSAhPSAwKQotCQkJewkvKiBmb3VuZCBpdCAqLwotCQkJCXJldHVybiBzdHJkdXAoY29tbWFuZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkKLQkJbG9jYXRpb24gPSBzdHJyY2hyKCBjb21tYW5kLCBkaXJTZXBhcmF0b3IgKSArIDE7Ci0JCXBhdGhMZW5ndGggPSBsb2NhdGlvbiAtIGNvbW1hbmQ7Ci0JCXBhdGggPSBtYWxsb2MoKHBhdGhMZW5ndGggKyBNQVhfTE9DQVRJT05fTEVOR1RIICsgMSArIHN0cmxlbih2bUxpYnJhcnkpICsgMSkgKiBzaXplb2YoY2hhcikpOwotCQlzdHJuY3B5KHBhdGgsIGNvbW1hbmQsIHBhdGhMZW5ndGgpOwotCQlsb2NhdGlvbiA9ICZwYXRoW3BhdGhMZW5ndGhdOwotCQkgCi0JCS8qIAotCQkgKiBXZSBhcmUgdHJ5aW5nIGJhc2UvanZtTG9jYXRpb25zWypdL3ZtTGlicmFyeQotCQkgKiB3aGVyZSBiYXNlIGlzIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZ2l2ZW4gamF2YSBjb21tYW5kLCBub3JtYWxseSBqcmUvYmluCi0JCSAqLwotCQlpID0gLTE7Ci0JCXdoaWxlKGp2bUxvY2F0aW9uc1srK2ldICE9IE5VTEwpIHsKLQkJCXNwcmludGYobG9jYXRpb24sICIlcyVjJXMiLCBqdm1Mb2NhdGlvbnNbaV0sIGRpclNlcGFyYXRvciwgdm1MaWJyYXJ5KTsKLQkJCWlmIChzdGF0KCBwYXRoLCAmc3RhdHMgKSA9PSAwICYmIChzdGF0cy5zdF9tb2RlICYgU19JRlJFRykgIT0gMCkKLQkJCXsJLyogZm91bmQgaXQgKi8KLQkJCQlyZXR1cm4gcGF0aDsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogYWRqdXN0IHRoZSBMRF9MSUJSQVJZX1BBVEggZm9yIHRoZSB2bUxpYnJhcnkgKi8KLXN0YXRpYyB2b2lkIGFkanVzdExpYnJhcnlQYXRoKCBjaGFyICogdm1MaWJyYXJ5ICkgewotCWNoYXIgKiBjOwotCWNoYXIgKiBsZFBhdGg7Ci0JY2hhciAqIG5ld1BhdGg7Ci0JaW50IGk7Ci0JaW50IG51bVBhdGhzID0gMDsKLQlpbnQgbGVuZ3RoID0gMDsKLQlpbnQgbmVlZEFkanVzdCA9IDA7Ci0JCi0JY2hhciAqKiBwYXRocyA9IE5VTEw7Ci0jaWZkZWYgTU9aSUxMQV9GSVgKLQlmaXhFbnZGb3JNb3ppbGxhKCk7Ci0jZW5kaWYgLyogTU9aSUxMQV9GSVggKi8KLSNpZmRlZiBORVRTQ0FQRV9GSVgKLQlmaXhFbnZGb3JOZXRzY2FwZSgpOwotI2VuZGlmIC8qIE5FVFNDQVBFX0ZJWCAqLwotCQotCXBhdGhzID0gZ2V0Vk1MaWJyYXJ5U2VhcmNoUGF0aCh2bUxpYnJhcnkpOwotIAotCWxkUGF0aCA9IChjaGFyKilnZXRlbnYoTElCX1BBVEhfVkFSKTsKLQlpZiAoIWxkUGF0aCkgewotCQlsZFBhdGggPSBfVF9FQ0xJUFNFKCIiKTsKLQkJbmVlZEFkanVzdCA9IDE7Ci0JfSBlbHNlIHsKLQkJbmVlZEFkanVzdCA9ICFjb250YWluc1BhdGhzKGxkUGF0aCwgcGF0aHMpOwotCX0KLQlpZiAoIW5lZWRBZGp1c3QpIHsKLQkJZm9yIChpID0gMDsgcGF0aHNbaV0gIT0gTlVMTDsgaSsrKQotCQkJZnJlZShwYXRoc1tpXSk7Ci0JCWZyZWUocGF0aHMpOwotCQlyZXR1cm47Ci0JfQotCQotCS8qIHNldCB0aGUgdmFsdWUgZm9yIExEX0xJQlJBUllfUEFUSCAqLwotCWxlbmd0aCA9IHN0cmxlbihsZFBhdGgpOwotCWMgPSBjb25jYXRTdHJpbmdzKHBhdGhzKTsKLQluZXdQYXRoID0gbWFsbG9jKChfdGNzbGVuKGMpICsgbGVuZ3RoICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0JX3N0cHJpbnRmKG5ld1BhdGgsIF9UX0VDTElQU0UoIiVzJXMiKSwgYywgbGRQYXRoKTsKLQkKLQlzZXRlbnYoIExJQl9QQVRIX1ZBUiwgbmV3UGF0aCwgMSk7Ci0JZnJlZShuZXdQYXRoKTsKLQlmcmVlKGMpOwotCQotCWZvciAoaSA9IDA7IGkgPCBudW1QYXRoczsgaSsrKQotCQlmcmVlKHBhdGhzW2ldKTsKLQlmcmVlKHBhdGhzKTsKLQotCS8qIG5vdyB3ZSBtdXN0IHJlc3RhcnQgZm9yIHRoaXMgdG8gdGFrZSBhZmZlY3QgKi8KLQlyZXN0YXJ0TGF1bmNoZXIoaW5pdGlhbEFyZ3ZbMF0sIGluaXRpYWxBcmd2KTsKLX0KLQotdm9pZCByZXN0YXJ0TGF1bmNoZXIoIGNoYXIqIHByb2dyYW0sIGNoYXIqIGFyZ3NbXSApIAotewotCS8qIGp1c3QgcmVzdGFydCBpbi1wbGFjZSAqLwotCWV4ZWN2cCggcHJvZ3JhbSAhPSBOVUxMID8gcHJvZ3JhbSA6IGFyZ3NbMF0sIGFyZ3MpOwotfQotCi12b2lkIHByb2Nlc3NWTUFyZ3MoX1RDSEFSICoqdm1hcmdzW10gKSB7Ci0JLyogbm90aGluZyB5ZXQgKi8KLX0KLQotSmF2YVJlc3VsdHMqIHN0YXJ0SmF2YVZNKCBfVENIQVIqIGxpYlBhdGgsIF9UQ0hBUiogdm1BcmdzW10sIF9UQ0hBUiogcHJvZ0FyZ3NbXSwgX1RDSEFSKiBqYXJGaWxlICkKLXsKLQlyZXR1cm4gc3RhcnRKYXZhSk5JKGxpYlBhdGgsIHZtQXJncywgcHJvZ0FyZ3MsIGphckZpbGUpOwotfQotCi1pbnQgaXNTdW5WTSggX1RDSEFSICogamF2YVZNLCBfVENIQVIgKiBqbmlMaWIgKSB7Ci0JaW50IGRlc2NyaXB0b3JzWzJdOwotCWludCByZXN1bHQgPSAwOwotCWludCBwaWQgPSAtMTsKLQkKLQlpZiAoamF2YVZNID09IE5VTEwpCi0JCXJldHVybiAwOwotCQotCS8qIGNyZWF0ZSBwaXBlLCBbMF0gaXMgcmVhZCBlbmQsIFsxXSBpcyB3cml0ZSBlbmQgKi8KLQlpZiAocGlwZShkZXNjcmlwdG9ycykgIT0gMCkKLQkJcmV0dXJuIDA7IC8qIGVycm9yICovCi0JCi0JcGlkID0gZm9yaygpOwotCWlmIChwaWQgPT0gMCApIHsKLQkJLyogY2hpbGQsIGNvbm5lY3Qgc3Rkb3V0ICYgc3RkZXJyIHRvIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSovCi0JCWR1cDIoZGVzY3JpcHRvcnNbMV0sIFNUREVSUl9GSUxFTk8pOwotCQlkdXAyKGRlc2NyaXB0b3JzWzFdLCBTVERPVVRfRklMRU5PKTsKLQkJCi0JCS8qIGNsb3NlIGRlc2NyaXB0b3JzICovCi0JCWNsb3NlKGRlc2NyaXB0b3JzWzBdKTsKLQkJY2xvc2UoZGVzY3JpcHRvcnNbMV0pOwotCQkKLQkJewotCQkJLyogZXhlYyBqYXZhIC12ZXJzaW9uICovCi0JCQlfVENIQVIgKmFyZ3MgW10gPSB7IGphdmFWTSwgX1RfRUNMSVBTRSgiLXZlcnNpb24iKSwgTlVMTCB9OwotCQkJZXhlY3YoYXJnc1swXSwgYXJncyk7Ci0JCQkvKiBpZiB3ZSBtYWtlIGl0IGhlcmUsIHRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCBleGVjLCBqdXN0IGV4aXQgKi8KLQkJCWV4aXQoMCk7Ci0JCX0KLQl9IGVsc2UgaWYgKHBpZCA+IDApewotCQkvKiBwYXJlbnQgKi8KLQkJRklMRSAqIHN0cmVhbSA9IE5VTEw7Ci0JCWludCBzdGF0dXMgPSAwOwotCQljbG9zZShkZXNjcmlwdG9yc1sxXSk7Ci0JCXN0cmVhbSA9IGZkb3BlbiggZGVzY3JpcHRvcnNbMF0sICJyIik7Ci0JCWlmIChzdHJlYW0gIT0gTlVMTCkgewotCQkJX1RDSEFSIGJ1ZmZlclsyNTZdOwotCQkJd2hpbGUgKCBmZ2V0cyhidWZmZXIsIDI1Niwgc3RyZWFtKSAhPSBOVUxMKSB7Ci0JCQkJaWYgKF90Y3NzdHIoYnVmZmVyLCBfVF9FQ0xJUFNFKCJKYXZhIEhvdFNwb3QoVE0pIikpIHx8IF90Y3NzdHIoYnVmZmVyLCBfVF9FQ0xJUFNFKCJPcGVuSkRLIikpKSB7Ci0JCQkJCXJlc3VsdCA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoX3Rjc3N0cihidWZmZXIsIF9UX0VDTElQU0UoIklCTSIpKSAhPSBOVUxMKSB7Ci0JCQkJCXJlc3VsdCA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWZjbG9zZShzdHJlYW0pOwotCQkJY2xvc2UoZGVzY3JpcHRvcnNbMF0pOwotCQl9Ci0JCXdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKLQl9IGVsc2UgewotCQkvKiBmYWlsZWQgdG8gZm9yayAqLwotCQljbG9zZShkZXNjcmlwdG9yc1swXSk7Ci0JCWNsb3NlKGRlc2NyaXB0b3JzWzFdKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZU9TLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VPUy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTliYWQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZU9TLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEVDTElQU0VfT1NfSAotI2RlZmluZSBFQ0xJUFNFX09TX0gKLQotI2luY2x1ZGUgImVjbGlwc2VKTkkuaCIKLSNpbmNsdWRlICJlY2xpcHNlVW5pY29kZS5oIgotCi0jaWZkZWYgTUFDT1NYCi0jZGVmaW5lIEpBVkFfRlJBTUVXT1JLICIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrIgotI2VuZGlmCi0KLS8qIE9wZXJhdGluZyBTeXN0ZW0gRGVwZW5kZW50IEluZm9ybWF0aW9uICovCi0KLS8qKiogU2VlIGVjbGlwc2UuYyBmb3IgaW5mb3JtYXRpb24gb24gdGhlIGxhdW5jaGVyIHJ1bnRpbWUgYXJjaGl0ZWN0dXJlICoqKi8KLQotLyogR2xvYmFsIFZhcmlhYmxlcyAqLwotZXh0ZXJuIF9UQ0hBUiogIGRlZmF1bHRWTTsgICAJCQkvKiBuYW1lIG9mIFZNIHRvIHVzZSBub3JtYWxseSAgICAgICovCi0jaWZkZWYgX1dJTjMyCi1leHRlcm4gX1RDSEFSKiAgY29uc29sZVZNOwkJCQkvKiB3aW5kb3dzIG5lZWRzIGEgZGlmZmVyZW50IHZtIGV4ZWN1dGFibGUgZm9yIHRoZSBjb25zb2xlICovCi0jZW5kaWYKLWV4dGVybiBfVENIQVIqICBzaGlwcGVkVk1EaXI7CQkJLyogVk0gYmluIGRpcmVjdG9yeSB3aXRoIHNlcGFyYXRvciAqLwotZXh0ZXJuIF9UQ0hBUiogIGV4aXREYXRhOwkJICAJCS8qIGV4aXQgZGF0YSBzZXQgZnJvbSBKYXZhICovCi1leHRlcm4gX1RDSEFSKiAgdm1MaWJyYXJ5OwkJCQkvKiBuYW1lIG9mIHRoZSBWTSBzaGFyZWQgbGlicmFyeSAqLwotZXh0ZXJuIGludAkJaW5pdGlhbEFyZ2M7CQkJLyogYXJnYyBvcmlnaW5hbGx5IHVzZWQgdG8gc3RhcnQgbGF1bmNoZXIgKi8KLWV4dGVybiBfVENIQVIqKglpbml0aWFsQXJndjsJCQkvKiBhcmd2IG9yaWdpbmFsbHkgdXNlZCB0byBzdGFydCBsYXVuY2hlciAqLwotZXh0ZXJuIF9UQ0hBUiogIGVlTGliUGF0aDsJCQkJLyogbGlicmFyeSBwYXRoIHNwZWNpZmllZCBpbiBhIC5lZSBmaWxlICovCi1leHRlcm4gaW50CQlzZWNvbmRUaHJlYWQ7CQkJLyogd2hldGhlciBvciBub3QgdG8gc3RhcnQgdGhlIHZtIG9uIGEgc2Vjb25kIHRocmVhZCAqLwotCi0vKiBPUyBTcGVjaWZpYyBGdW5jdGlvbnMgKi8KLQotLyoqIERpc3BsYXkgYSBNZXNzYWdlCi0gKgotICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGRpc3BsYXkgYSBtZXNzYWdlIHRvIHRoZSB1c2VyLgotICogVGhlIG1ldGhvZCBzaG91bGQgbm90IHJldHVybiB1bnRpbCB0aGUgdXNlciBoYXMgYWNrbm93bGVkZ2VkCi0gKiB0aGUgbWVzc2FnZS4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUgd2luZG93Ci0gKiBzeXN0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gKi8KLWV4dGVybiB2b2lkIGRpc3BsYXlNZXNzYWdlKCBfVENIQVIqIHRpdGxlLCBfVENIQVIqIG1lc3NhZ2UgKTsKLQotCi0vKiogSW5pdGlhbGl6ZSB0aGUgV2luZG93IFN5c3RlbQotICoKLSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBoYXZlIGJlZW4KLSAqIHBhcnNlZC4gSXRzIHB1cnBvc2UgaXMgdG8gaW5pdGlhbGl6ZSB0aGUgY29ycmVzcG9uZGluZyB3aW5kb3cgc3lzdGVtLgotICoKLSAqIFRoZSBzaG93U3BsYXNoIGZsYWcgaW5kaWNhdGVzIHRoZSBzcGxhc2ggd2luZG93IHdpbGwgYmUgZGlzcGxheWVkIGJ5Ci0gKiB0aGlzIHByb2Nlc3MgKGUuZy4sIHZhbHVlIHdpbGwgYmUgemVybyBmb3IgdGhlIG1haW4gbGF1bmNoZXIpLgotICovCi1leHRlcm4gaW50IGluaXRXaW5kb3dTeXN0ZW0oIGludCogYXJnYywgX1RDSEFSKiBhcmd2W10sIGludCBzaG93U3BsYXNoICk7Ci0KLQotLyoqIFNob3cgdGhlIFNwbGFzaCBXaW5kb3cKLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gZGlzcGxheSB0aGUgYWN0dWFsIHNwbGFzaCB3aW5kb3cuIEl0IHdpbGwgb25seQotICogYmUgY2FsbGVkIGJ5IHRoZSBzcGxhc2ggd2luZG93IHByb2Nlc3MgYW5kIG5vdCB0aGUgbWFpbiBsYXVuY2hlciBwcm9jZXNzLgotICogVGhlIHNwbGFzaCBJRCBwYXNzZWQgY29ycmVzcG9uZHMgdG8gdGhlIHN0cmluZyByZXR1cm5lZCBmcm9tIGluaXRXaW5kb3dTeXN0ZW0oKS4KLSAqIElmIHBvc3NpYmxlLCB0aGlzIElEIHNob3VsZCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHNvbWUgcGllY2Ugb2YgZGF0YSBiYWNrCi0gKiB0byB0aGUgbWFpbiBsYXVuY2hlciBwcm9ncmFtIGZvciB0d28gcmVhc29uczoKLSAqIDEpIHRvIGRldGVjdCB3aGVuIHRoZSBzcGxhc2ggd2luZG93IHByb2Nlc3MgdGVybWluYXRlcwotICogMikgdG8gdGVybWluYXRlIHRoZSBzcGxhc2ggd2luZG93IHByb2Nlc3Mgc2hvdWxkIHRoZSBKVk0gdGVybWluYXRlIGJlZm9yZSBpdAotICogICAgY29tcGxldGVzIGl0cyBpbml0aWFsaXphdGlvbi4KLSAqCi0gKiBUd28gcGFyYW1ldGVycyBhcmUgcGFzc2VkOiB0aGUgaW5zdGFsbCBob21lIGRpcmVjdG9yeSBhbmQgYSBzcGVjaWZpYyBiaXRtYXAgaW1hZ2UKLSAqIGZpbGUgZm9yIGEgZmVhdHVyZS4gVGhlIGZlYXR1cmUncyBpbWFnZSBmaWxlIGlzIHRyaWVkIGZpcnN0IGFuZCBpZiBpdCBjYW5ub3QgYmUKLSAqIGRpc3BsYXllZCwgdGhlIGltYWdlcyBmcm9tIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBhcmUgdXNlZC4KLSAqCi0gKiBSZXR1cm4gKGV4aXQgY29kZSk6Ci0gKiAwICAgICAgICAtIHN1Y2Nlc3MKLSAqIG5vbi16ZXJvIC0gY291bGQgbm90IGZpbmQgYSBzcGxhc2ggaW1hZ2UgdG8gZGlzcGxheQotICovCi1leHRlcm4gaW50IHNob3dTcGxhc2goIGNvbnN0IF9UQ0hBUiogZmVhdHVyZUltYWdlICk7Ci0KLS8qKiBHZXQgTGlzdCBvZiBKYXZhIFZNIEFyZ3VtZW50cwotICoKLSAqIEEgZ2l2ZW4gSmF2YSBWTSBtaWdodCByZXF1aXJlIGEgc3BlY2lhbCBzZXQgb2YgYXJndW1lbnRzIGluIG9yZGVyIHRvCi0gKiBvcHRpbWl6ZSBpdHMgcGVyZm9ybWFuY2UuIFRoaXMgbWV0aG9kIHJldHVybnMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkKLSAqIG9mIHN0cmluZ3MsIHdoZXJlIGVhY2ggc3RyaW5nIGlzIGEgc2VwYXJhdGUgVk0gYXJndW1lbnQuCi0gKi8KLWV4dGVybiBfVENIQVIqKiBnZXRBcmdWTSggX1RDSEFSICp2bSApOwotCi0vKiBGaW5kIHRoZSB2bSBzaGFyZWQgbGlicmFyeSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGphdmEgZXhlY3V0YWJsZSAqLwotZXh0ZXJuIF9UQ0hBUiAqIGZpbmRWTUxpYnJhcnkoIF9UQ0hBUiAqIGNvbW1hbmQgKTsKLQotZXh0ZXJuIHZvaWQgZGlzcGF0Y2hNZXNzYWdlcygpOwotCi1leHRlcm4gamxvbmcgZ2V0U3BsYXNoSGFuZGxlKCk7Ci0KLWV4dGVybiB2b2lkIHRha2VEb3duU3BsYXNoKCk7Ci0KLWV4dGVybiB2b2lkIHJlc3RhcnRMYXVuY2hlciggX1RDSEFSKiBwcm9ncmFtLCBfVENIQVIqIGFyZ3NbXSApOwotCi0vKiBsYXVuY2ggdGhlIHZtIGluIGEgc2VwYXJhdGUgcHJvY2VzcyBhbmQgd2FpdCBmb3IgaXQgdG8gZmluaXNoICovCi1leHRlcm4gSmF2YVJlc3VsdHMqIGxhdW5jaEphdmFWTSggX1RDSEFSKiBhcmdzW10gKTsKLQotLyogbGF1bmNoIHRoZSB2bSBpbiB0aGlzIHByb2Nlc3MgdXNpbmcgSk5JIGludm9jYXRpb24gKi8KLWV4dGVybiBKYXZhUmVzdWx0cyogc3RhcnRKYXZhVk0oIF9UQ0hBUiogbGliUGF0aCwgX1RDSEFSKiB2bUFyZ3NbXSwgX1RDSEFSKiBwcm9nQXJnc1tdLCBfVENIQVIqIGphckZpbGUgKTsKLQotLyogZG8gYW55IHBsYXRmb3JtIHNwZWNpZmljIHByb2Nlc3Npbmcgb2YgdGhlIHVzZXIgdm1hcmdzICovCi1leHRlcm4gdm9pZCBwcm9jZXNzVk1BcmdzKF9UQ0hBUiAqKnZtYXJnc1tdICk7Ci0KLS8qIGlzIHRoaXMgYSBTdW4gVk0sIHJldHVybnMgMCBpZiB3ZSBkb24ndCBrbm93ICovCi1leHRlcm4gaW50IGlzU3VuVk0oIF9UQ0hBUiAqIGphdmFWTSwgX1RDSEFSICogam5pTGliICk7Ci0KLS8qIGFuIGFycmF5IG9mIHBhdGhzIHRoYXQgd2lsbCBuZWVkIHRvIGJlIG9uIHRoZSBzZWFyY2ggcGF0aCB0byBsb2FkIHRoZSB2bSBzaGFyZWQgbGlicmFyeSAqLwotZXh0ZXJuIF9UQ0hBUiAqKiBnZXRWTUxpYnJhcnlTZWFyY2hQYXRoKF9UQ0hBUiAqIHZtTGlicmFyeSk7Ci0KLWV4dGVybiBpbnQgcmV1c2VXb3JrYmVuY2goX1RDSEFSKiogZmlsZVBhdGgsIGludCB0aW1lb3V0KTsKLQotI2VuZGlmIC8qIEVDTElQU0VfT1NfSCAqLwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VTaG0uYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZVNobS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTM0ZmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZVNobS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFNpbGVuaW8gUXVhcnRpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImVjbGlwc2VPUy5oIgotI2luY2x1ZGUgImVjbGlwc2VTaG0uaCIKLQotc3RhdGljIF9UQ0hBUiogRUNMSVBTRV9VTklUSUFMSVpFRCA9IF9UX0VDTElQU0UoIkVDTElQU0VfVU5JTklUSUFMSVpFRCIpOwotCi0jaWZkZWYgX1dJTjMyCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgX19NSU5HVzMyX18KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi1pbnQgY3JlYXRlU2hhcmVkRGF0YShfVENIQVIqKiBpZCwgaW50IHNpemUpIHsKLQlIQU5ETEUgbWFwSGFuZGxlID0gQ3JlYXRlRmlsZU1hcHBpbmcoSU5WQUxJRF9IQU5ETEVfVkFMVUUsIE5VTEwsIFBBR0VfUkVBRFdSSVRFLCAwLCBzaXplLCBOVUxMKTsKLQlpZiAobWFwSGFuZGxlID09IDApIHJldHVybiAtMTsKLQlpZiAoaWQgIT0gTlVMTCkgewotCQkqaWQgPSBtYWxsb2MoMTggKiBzaXplb2YoX1RDSEFSKSk7Ci0jaWZkZWYgV0lONjQKLQkJX3N0cHJpbnRmKCppZCwgX1RfRUNMSVBTRSgiJWx4XyVseCIpLCBHZXRDdXJyZW50UHJvY2Vzc0lkKCksIChEV09SRExPTkcpIG1hcEhhbmRsZSk7Ci0jZWxzZQotCQlfc3RwcmludGYoKmlkLCBfVF9FQ0xJUFNFKCIlbHhfJWx4IiksIEdldEN1cnJlbnRQcm9jZXNzSWQoKSwgKERXT1JEKSBtYXBIYW5kbGUpOwotI2VuZGlmCi0JfQotCS8qIHNldCB0aGUgc2hhcmVkIGRhdGEgdG8gInVuaW5pdGlhbGl6ZWQiICovCi0Jc2V0U2hhcmVkRGF0YSgqaWQsIEVDTElQU0VfVU5JVElBTElaRUQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldFNobUlEKGNvbnN0IF9UQ0hBUiogaWQsIExQRFdPUkQgcHJvY2Vzc0lELCBMUEhBTkRMRSBoYW5kbGUpIHsKLQlpZiAoaWQgIT0gTlVMTCAmJiBfdGNzbGVuKGlkKSA+IDApIHsKLQkJRFdPUkQgaTE7Ci0jaWZkZWYgV0lONjQKLQkJRFdPUkRMT05HIGkyOwotI2Vsc2UKLQkJRFdPUkQgaTI7Ci0jZW5kaWYKLQkJaWYgKF9zdHNjYW5mKGlkLCBfVF9FQ0xJUFNFKCIlbHhfJWx4IiksICZpMSwgJmkyKSAhPSAyKSByZXR1cm4gLTE7Ci0JCSpwcm9jZXNzSUQgPSAoRFdPUkQpaTE7Ci0JCSpoYW5kbGUgPSAoSEFORExFKWkyOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1pbnQgZGVzdHJveVNoYXJlZERhdGEoX1RDSEFSKiBpZCkgewotCURXT1JEIHByb2Nlc3NJRDsKLQlIQU5ETEUgaGFuZGxlOwotCWlmIChnZXRTaG1JRChpZCwgJnByb2Nlc3NJRCwgJmhhbmRsZSkgPT0gLTEpIHJldHVybiAtMTsKLQlpZiAoIUNsb3NlSGFuZGxlKGhhbmRsZSkpIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGdldFNoYXJlZERhdGEoX1RDSEFSKiBpZCwgX1RDSEFSKiogZGF0YSkgewotCV9UQ0hBUiAqc2hhcmVkRGF0YSwgKm5ld0RhdGEgPSBOVUxMOwotCURXT1JEIHByb2Nlc3NJRDsKLQlIQU5ETEUgaGFuZGxlLCBtYXBIYW5kbGUgPSBOVUxMLCBwcm9jZXNzSGFuZGxlOwotCWlmIChnZXRTaG1JRChpZCwgJnByb2Nlc3NJRCwgJmhhbmRsZSkgPT0gLTEpIHJldHVybiAtMTsKLQlpZiAocHJvY2Vzc0lEID09IEdldEN1cnJlbnRQcm9jZXNzSWQoKSkgewotCQltYXBIYW5kbGUgPSBoYW5kbGU7Ci0JfSBlbHNlIHsKLQkJcHJvY2Vzc0hhbmRsZSA9IE9wZW5Qcm9jZXNzKFBST0NFU1NfQUxMX0FDQ0VTUywgRkFMU0UsIHByb2Nlc3NJRCk7Ci0JCWlmIChwcm9jZXNzSGFuZGxlID09IE5VTEwpIHJldHVybiAtMTsKLQkJRHVwbGljYXRlSGFuZGxlKHByb2Nlc3NIYW5kbGUsIGhhbmRsZSwgR2V0Q3VycmVudFByb2Nlc3MoKSwgJm1hcEhhbmRsZSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTLCBGQUxTRSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKLQkJQ2xvc2VIYW5kbGUocHJvY2Vzc0hhbmRsZSk7Ci0JfQotCWlmIChtYXBIYW5kbGUgPT0gTlVMTCkgcmV0dXJuIC0xOwotCXNoYXJlZERhdGEgPSBNYXBWaWV3T2ZGaWxlKGhhbmRsZSwgRklMRV9NQVBfV1JJVEUsIDAsIDAsIDApOwotCWlmIChzaGFyZWREYXRhID09IE5VTEwpIHJldHVybiAtMTsKLQlpZiAoX3Rjc2NtcChzaGFyZWREYXRhLCBFQ0xJUFNFX1VOSVRJQUxJWkVEKT09IDApIHJldHVybiAwOwotCWlmIChkYXRhICE9IE5VTEwpIHsKLQkJc2l6ZV90IGxlbmd0aCA9IChfdGNzbGVuKHNoYXJlZERhdGEpICsgMSkgKiBzaXplb2YoX1RDSEFSKTsKLQkJbmV3RGF0YSA9IG1hbGxvYyhsZW5ndGgpOwotCQltZW1jcHkobmV3RGF0YSwgc2hhcmVkRGF0YSwgbGVuZ3RoKTsKLQl9Ci0JaWYgKCFVbm1hcFZpZXdPZkZpbGUoc2hhcmVkRGF0YSkpIHsKLQkJZnJlZShuZXdEYXRhKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoaGFuZGxlICE9IG1hcEhhbmRsZSkgewotCQlDbG9zZUhhbmRsZShtYXBIYW5kbGUpOwotCX0KLQkqZGF0YSA9IG5ld0RhdGE7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzZXRTaGFyZWREYXRhKGNvbnN0IF9UQ0hBUiogaWQsIGNvbnN0IF9UQ0hBUiogZGF0YSkgewotCV9UQ0hBUiogc2hhcmVkRGF0YTsKLQlEV09SRCBwcm9jZXNzSUQ7Ci0JSEFORExFIGhhbmRsZSwgbWFwSGFuZGxlID0gTlVMTCwgcHJvY2Vzc0hhbmRsZTsKLQlpZiAoZ2V0U2htSUQoaWQsICZwcm9jZXNzSUQsICZoYW5kbGUpID09IC0xKSByZXR1cm4gLTE7Ci0JaWYgKHByb2Nlc3NJRCA9PSBHZXRDdXJyZW50UHJvY2Vzc0lkKCkpIHsKLQkJbWFwSGFuZGxlID0gaGFuZGxlOwotCX0gZWxzZSB7Ci0JCXByb2Nlc3NIYW5kbGUgPSBPcGVuUHJvY2VzcyhQUk9DRVNTX0FMTF9BQ0NFU1MsIEZBTFNFLCBwcm9jZXNzSUQpOwotCQlpZiAocHJvY2Vzc0hhbmRsZSA9PSBOVUxMKSByZXR1cm4gLTE7Ci0JCUR1cGxpY2F0ZUhhbmRsZShwcm9jZXNzSGFuZGxlLCBoYW5kbGUsIEdldEN1cnJlbnRQcm9jZXNzKCksICZtYXBIYW5kbGUsIERVUExJQ0FURV9TQU1FX0FDQ0VTUywgRkFMU0UsIERVUExJQ0FURV9TQU1FX0FDQ0VTUyk7Ci0JCUNsb3NlSGFuZGxlKHByb2Nlc3NIYW5kbGUpOwotCX0KLQlpZiAobWFwSGFuZGxlID09IE5VTEwpIHJldHVybiAtMTsKLQlzaGFyZWREYXRhID0gTWFwVmlld09mRmlsZShtYXBIYW5kbGUsIEZJTEVfTUFQX1dSSVRFLCAwLCAwLCAwKTsKLQlpZiAoc2hhcmVkRGF0YSA9PSBOVUxMKSByZXR1cm4gLTE7Ci0JaWYgKGRhdGEgIT0gTlVMTCkgewotCQlzaXplX3QgbGVuZ3RoID0gKF90Y3NsZW4oZGF0YSkgKyAxKSAqIHNpemVvZihfVENIQVIpOwotCQltZW1jcHkoc2hhcmVkRGF0YSwgZGF0YSwgbGVuZ3RoKTsKLQl9IGVsc2UgewotCQltZW1zZXQoc2hhcmVkRGF0YSwgMCwgc2l6ZW9mKF9UQ0hBUikpOwotCX0KLQlpZiAoIVVubWFwVmlld09mRmlsZShzaGFyZWREYXRhKSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChoYW5kbGUgIT0gbWFwSGFuZGxlKSB7Ci0JCUNsb3NlSGFuZGxlKG1hcEhhbmRsZSk7Ci0JfQotCXJldHVybiAwOwotfQotCi0jZWxpZiBQSE9UT04KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgY3JlYXRlU2hhcmVkRGF0YShjaGFyKiogaWQsIGludCBzaXplKSB7Ci0JaW50IGZkOwotCWNoYXIqIGxvY2F0aW9uID0gIi90bXAvZWNsaXBzZV8leCI7Ci0JY2hhciogbmFtZSA9IG1hbGxvYyhzdHJsZW4obG9jYXRpb24pICsgOSk7Ci0Jc3ByaW50ZihuYW1lLCBsb2NhdGlvbiwgZ2V0cGlkKCkpOwotCWlmICgoZmQgPSBzaG1fb3BlbihuYW1lLCBPX1JEV1IgfCBPX0NSRUFULCAwNjY2ICkpID09IC0xKSByZXR1cm4gLTE7Ci0gICAgaWYgKGZ0cnVuY2F0ZShmZCwgc2l6ZSkgPT0gLTEgKSB7Ci0gICAgCXNobV91bmxpbmsobmFtZSk7Ci0gICAgCXJldHVybiAtMTsKLSAgICB9Ci0gICAgY2xvc2UoIGZkICk7Ci0JaWYgKGlkICE9IE5VTEwpIHsKLQkJKmlkID0gbmFtZTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBkZXN0cm95U2hhcmVkRGF0YShjaGFyKiBpZCkgewotCXJldHVybiBzaG1fdW5saW5rKGlkKTsKLX0KLQotaW50IGdldFNoYXJlZERhdGEoY2hhciogaWQsIGNoYXIqKiBkYXRhKSB7Ci0JaW50IGZkLCBsZW5ndGgsIHNpemU7Ci0JY2hhciAqc2hhcmVkRGF0YSwgKm5ld0RhdGEgPSBOVUxMOwotCWlmICgoZmQgPSBzaG1fb3BlbihpZCwgT19SRFdSLCAwNjY2ICkpID09IC0xKSByZXR1cm4gLTE7Ci0Jc2l6ZSA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7Ci0gICAgc2hhcmVkRGF0YSA9IG1tYXAoIDAsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwICk7Ci0gICAgaWYgKHNoYXJlZERhdGEgIT0gTUFQX0ZBSUxFRCkgewotCQlpZiAoZGF0YSAhPSBOVUxMKSB7Ci0JCQlsZW5ndGggPSBzdHJsZW4oc2hhcmVkRGF0YSkgKyAxOwotCQkJbmV3RGF0YSA9IG1hbGxvYyhsZW5ndGgpOwotCQkJbWVtY3B5KG5ld0RhdGEsIHNoYXJlZERhdGEsIGxlbmd0aCk7Ci0JCX0KLQkJbXVubWFwKHNoYXJlZERhdGEsIHNpemUpOwotCX0KLSAgICBjbG9zZShmZCk7Ci0JKmRhdGEgPSBuZXdEYXRhOwotCXJldHVybiBuZXdEYXRhID09IE5VTEwgPyAtMSA6IDA7Ci19Ci0KLWludCBzZXRTaGFyZWREYXRhKGNoYXIqIGlkLCBjaGFyKiBkYXRhKSB7Ci0JaW50IGZkLCBsZW5ndGgsIHNpemU7Ci0JY2hhciAqc2hhcmVkRGF0YTsKLQlpZiAoKGZkID0gc2htX29wZW4oaWQsIE9fUkRXUiwgMDY2NiApKSA9PSAtMSkgcmV0dXJuIC0xOwotCXNpemUgPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpOwotICAgIHNoYXJlZERhdGEgPSBtbWFwKCAwLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCApOwotICAgIGlmIChzaGFyZWREYXRhICE9IE1BUF9GQUlMRUQpIHsKLQkJaWYgKGRhdGEgIT0gTlVMTCkgewotCQkJbGVuZ3RoID0gc3RybGVuKGRhdGEpICsgMTsKLQkJCW1lbWNweShzaGFyZWREYXRhLCBkYXRhLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJbWVtc2V0KHNoYXJlZERhdGEsIDAsIHNpemVvZihjaGFyKSk7Ci0JCX0KLQkJbXVubWFwKHNoYXJlZERhdGEsIHNpemUpOwotCX0KLSAgICBjbG9zZShmZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbHNlIC8qIFVuaXggbGlrZSBwbGF0Zm9ybXMgKi8KLQotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1pbnQgY3JlYXRlU2hhcmVkRGF0YShjaGFyKiogaWQsIGludCBzaXplKSB7Ci0JaW50IHNobWlkOwotCWtleV90IGtleSA9IGdldHBpZCgpOwotCWlmICgoc2htaWQgPSBzaG1nZXQoa2V5LCBzaXplLCBJUENfQ1JFQVQgfCAwNjY2KSkgPCAwKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGlkICE9IE5VTEwpIHsKLQkJKmlkID0gbWFsbG9jKDkgKiBzaXplb2YoY2hhcikpOwotCQlzcHJpbnRmKCppZCwgIiV4Iiwgc2htaWQpOwotCX0KLQlzZXRTaGFyZWREYXRhKCppZCwgRUNMSVBTRV9VTklUSUFMSVpFRCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0U2htSUQoY29uc3QgY2hhciogaWQpIHsKLQlpbnQgc2htaWQgPSAtMTsKLQkvKiBEZXRlcm1pbmUgdGhlIHNoYXJlZCBtZW1vcnkgaWQuICovCi0JaWYgKGlkICE9IE5VTEwgJiYgc3RybGVuKGlkKSA+IDApIHsKLQkJc3NjYW5mKGlkLCAiJXgiLCAmc2htaWQpOwotCX0KLQlyZXR1cm4gc2htaWQ7Ci19Ci0KLWludCBkZXN0cm95U2hhcmVkRGF0YShjaGFyKiBpZCkgewotCWludCBzaG1pZCA9IGdldFNobUlEKGlkKTsKLQlpZiAoc2htaWQgPT0gLTEpIHJldHVybiAtMTsKLQlyZXR1cm4gc2htY3RsKHNobWlkLCBJUENfUk1JRCwgTlVMTCk7Ci19Ci0KLWludCBnZXRTaGFyZWREYXRhKCBjaGFyKiBpZCwgY2hhcioqIGRhdGEgKSB7Ci0JY2hhciAqc2hhcmVkRGF0YSwgKm5ld0RhdGEgPSBOVUxMOwotCWludCBsZW5ndGg7Ci0JaW50IHNobWlkID0gZ2V0U2htSUQoaWQpOwotCWlmIChzaG1pZCA9PSAtMSkgcmV0dXJuIC0xOwotIAlzaGFyZWREYXRhID0gc2htYXQoc2htaWQsICh2b2lkICopMCwgMCk7Ci0gICAgaWYgKHNoYXJlZERhdGEgPT0gKGNoYXIgKikoLTEpKSByZXR1cm4gLTE7Ci0gICAgaWYgKF90Y3NjbXAoc2hhcmVkRGF0YSwgRUNMSVBTRV9VTklUSUFMSVpFRCkgPT0gMCkgcmV0dXJuIDA7Ci0gICAgbGVuZ3RoID0gc3RybGVuKHNoYXJlZERhdGEpICsgMTsKLSAgICBuZXdEYXRhID0gbWFsbG9jKGxlbmd0aCk7Ci0gICAgbWVtY3B5KG5ld0RhdGEsIHNoYXJlZERhdGEsIGxlbmd0aCk7Ci0JaWYgKHNobWR0KHNoYXJlZERhdGEpICE9IDApIHsKLQkJZnJlZShuZXdEYXRhKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqZGF0YSA9IG5ld0RhdGE7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzZXRTaGFyZWREYXRhKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBkYXRhKSB7Ci0JY2hhciogc2hhcmVkRGF0YTsKLQlpbnQgbGVuZ3RoOwotCWludCBzaG1pZCA9IGdldFNobUlEKGlkKTsKLQlpZiAoc2htaWQgPT0gLTEpIHJldHVybiAtMTsKLSAJc2hhcmVkRGF0YSA9IHNobWF0KHNobWlkLCAodm9pZCAqKTAsIDApOwotCWlmIChzaGFyZWREYXRhID09IChjaGFyICopKC0xKSkgcmV0dXJuIC0xOwotCWlmIChkYXRhICE9IE5VTEwpIHsKLQkJbGVuZ3RoID0gc3RybGVuKGRhdGEpICsgMTsKLQkJbWVtY3B5KHNoYXJlZERhdGEsIGRhdGEsIGxlbmd0aCk7Ci0JfSBlbHNlIHsKLQkJbWVtc2V0KHNoYXJlZERhdGEsIDAsIHNpemVvZihjaGFyKSk7Ci0JfQotCWlmIChzaG1kdChzaGFyZWREYXRhKSAhPSAwKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBVbml4IGxpa2UgcGxhdGZvcm1zICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VTaG0uaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZVNobS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTBkNzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZVNobS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgU2lsZW5pbyBRdWFydGkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEVDTElQU0VfU0hNX0gKLSNkZWZpbmUgRUNMSVBTRV9TSE1fSAotCi0vKiBTaGFyZWQgbWVtb3J5IHV0aWxpdGllcyAqLwotCi0vKioKLSAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgc2hhcmVkIG1lbW9yeSBzZWdtZW50Ci0gKiB3aXRoIHRoZSBzcGVjaWZpZWQgc2l6ZSBpbiBieXRlcy4gVGhlIGlkIGZvciB0aGUKLSAqIHNoYXJlZCBtZW1vcnkgc2VnbWVudCBpcyBzdG9yZWQgaW4gdGhlIGlkIGFyZ3VtZW50Ci0gKiBhbmQgY2FuIGJlIHVzZWQgZnJvbSBhbnkgcHJvY2Vzcy4gSXQgbXVzdCBiZSBmcmVlZAotICogd2l0aCBmcmVlKCkuCi0gKgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3MuCi0gKi8KLWV4dGVybiBpbnQgY3JlYXRlU2hhcmVkRGF0YShfVENIQVIqKiBpZCwgaW50IHNpemUpOwotCi0vKioKLSAqIERlc3Ryb3kgdGhlIHNoYXJlZCBtZW1vcnkgc2VnbWVudCBzcGVjaWZpZWQgYnkgdGhlCi0gKiBpZCBhcmd1bWVudC4gVGhlIGlkIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgcmV0dXJuCi0gKiBieSBjcmVhdGVTaGFyZWREYXRhKCkuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKLSAqIGJ5IHRoZSBzYW1lIHByb2Nlc3MgdGhhdCBjcmVhdGVkIHRoZSBzZWdtZW50LgotICoKLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzLgotICovCi1leHRlcm4gaW50IGRlc3Ryb3lTaGFyZWREYXRhKF9UQ0hBUiogaWQpOwotCi0vKioKLSAqIEdldHMgYSBjb3B5IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgc3BlY2lmaWVkCi0gKiBieSB0aGUgaWQgYXJndW1lbnQuIFRoZSBjb3B5IGlzIHN0b3JlZCBpbiB0aGUgZGF0YQotICogYXJndW1lbnQgYXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGFuZCBtdXN0IGJlCi0gKiBmcmVlZCBieSBmcmVlKCkuCi0gKgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3MuCi0gKi8KLWV4dGVybiBpbnQgZ2V0U2hhcmVkRGF0YShfVENIQVIqIGlkLCBfVENIQVIqKiBkYXRhKTsKLQotLyoqCi0gKiBTZXRzIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgc3BlY2lmaWVkIGJ5IHRoZSBpZAotICogYXJndW1lbnQgd2l0aCBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgc3BlY2lmaWVkIGJ5Ci0gKiBkYXRhLgotICoKLSAqIFJldHVybnMgMCBpZiBzdWNlc3MuCi0gKi8KLWV4dGVybiBpbnQgc2V0U2hhcmVkRGF0YShjb25zdCBfVENIQVIqIGlkLCBjb25zdCBfVENIQVIqIGRhdGEpOwotCi0jZW5kaWYgLyogRUNMSVBTRV9TSE1fSCAqLwotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZVVuaWNvZGUuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZVVuaWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2YTM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VVbmljb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgU2lsZW5pbyBRdWFydGkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEVDTElQU0VfVU5JQ09ERV9ICi0jZGVmaW5lIEVDTElQU0VfVU5JQ09ERV9ICi0KLSNpZmRlZiBfV0lOMzIKLQotI2lmZGVmIFVOSUNPREUKLSNkZWZpbmUgX1VOSUNPREUKLSNlbmRpZgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDx0Y2hhci5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBfX01JTkdXMzJfXwotIyBpZmRlZiBVTklDT0RFCi0jICBpZm5kZWYgX1RDSEFSCi0jICAgZGVmaW5lIF9UQ0hBUiBUQ0hBUgotIyAgZW5kaWYgLyogX1RDSEFSICovCi0jICBpZm5kZWYgX3RnZXRjd2QKLSMgICBkZWZpbmUgX3RnZXRjd2QgX3dnZXRjd2QKLSMgIGVuZGlmIC8qIF90Z2V0Y3dkICovCi0jICBpZm5kZWYgX3RzdGF0Ci0jICAgZGVmaW5lIF90c3RhdCBfd3N0YXQKLSMgIGVuZGlmIC8qIF90c3RhdCAqLwotIyAgaWZuZGVmIF90b3BlbmRpcgotIyAgIGRlZmluZSBfdG9wZW5kaXIgX3dvcGVuZGlyCi0jICBlbmRpZiAvKiBfdG9wZW5kaXIgKi8KLSMgIGlmbmRlZiBfdHJlYWRkaXIKLSMgICBkZWZpbmUgX3RyZWFkZGlyIF93cmVhZGRpcgotIyAgZW5kaWYgLyogX3RyZWFkZGlyICovCi0jICBpZm5kZWYgX3RjbG9zZWRpcgotIyAgIGRlZmluZSBfdGNsb3NlZGlyIF93Y2xvc2VkaXIKLSMgIGVuZGlmIC8qIF90Y2xvc2VkaXIgKi8KLSMgIGlmbmRlZiBfdERJUgotIyAgIGRlZmluZSBfdERJUiBfV0RJUgotIyAgZW5kaWYgLyogX3RESVIgKi8KLSMgZWxzZSAvKiBVTklDT0RFICovCi0jICBpZm5kZWYgX1RDSEFSCi0jICAgZGVmaW5lIF9UQ0hBUiBjaGFyCi0jICBlbmRpZiAvKiBfVENIQVIgKi8KLSMgIGlmbmRlZiBfdGdldGN3ZAotIyAgIGRlZmluZSBfdGdldGN3ZCBnZXRjd2QKLSMgIGVuZGlmIC8qIF90Z2V0Y3dkICovCi0jICBpZm5kZWYgX3RzdGF0Ci0jICAgZGVmaW5lIF90c3RhdCBfc3RhdAotIyAgZW5kaWYgLyogX3RzdGF0ICovCi0jICBpZm5kZWYgX3RvcGVuZGlyCi0jZXJyb3IgbWVzc2FnZSEKLSMgICBkZWZpbmUgX3RvcGVuZGlyIG9wZW5kaXIKLSMgIGVuZGlmIC8qIF90b3BlbmRpciAqLwotIyAgaWZuZGVmIF90cmVhZGRpcgotIyAgIGRlZmluZSBfdHJlYWRkaXIgcmVhZGRpcgotIyAgZW5kaWYgLyogX3RyZWFkZGlyICovCi0jICBpZm5kZWYgX3RjbG9zZWRpcgotIyAgIGRlZmluZSBfdGNsb3NlZGlyIGNsb3NlZGlyCi0jICBlbmRpZiAvKiBfdGNsb3NlZGlyICovCi0jICBpZm5kZWYgX3RESVIKLSMgICBkZWZpbmUgX3RESVIgRElSCi0jICBlbmRpZiAvKiBfdERJUiAqLwotIyBlbmRpZiAvKiBVTklDT0RFICovCi0jZW5kaWYgLyogX19NSU5HVzMyX18gKi8KLQotI2RlZmluZSBfVF9FQ0xJUFNFIF9UCi0KLSNlbHNlIC8qIFBsYXRmb3JtcyBvdGhlciB0aGFuIFdpbmRvd3MgKi8KLQotI2RlZmluZSBfVENIQVIgY2hhcgotI2RlZmluZSBfVF9FQ0xJUFNFKHMpIHMKLSNkZWZpbmUgX2ZnZXR0cyBmZ2V0cwotI2RlZmluZSBfc3RhdCBzdGF0Ci0jZGVmaW5lIF9zdHByaW50ZiBzcHJpbnRmCi0jZGVmaW5lIF9mdHByaW50ZiBmcHJpbnRmCi0jZGVmaW5lIF9zdHNjYW5mIHNzY2FuZgotI2RlZmluZSBfdGNzY2F0IHN0cmNhdAotI2RlZmluZSBfdGNzY2hyIHN0cmNocgotI2RlZmluZSBfdGNzcGJyayBzdHJwYnJrCi0jZGVmaW5lIF90Y3NjbXAgc3RyY21wCi0jZGVmaW5lIF90Y3NjcHkgc3RyY3B5Ci0jZGVmaW5lIF90Y3NkdXAgc3RyZHVwCi0jZGVmaW5lIF90Y3NpY21wIHN0cmNhc2VjbXAKLSNkZWZpbmUgX3Rjc2xlbiBzdHJsZW4KLSNkZWZpbmUgX3Rjc25jcHkgc3RybmNweQotI2RlZmluZSBfdGNzcmNociBzdHJyY2hyCi0jZGVmaW5lIF90Zm9wZW4gZm9wZW4KLSNkZWZpbmUgX3RnZXRjd2QgZ2V0Y3dkCi0jZGVmaW5lIF90Z2V0ZW52IGdldGVudgotI2RlZmluZSBfdGNzdG9sIHN0cnRvbAotI2lmbmRlZiBMSU5VWAotI2RlZmluZSBfdG90dXBwZXIgdG91cHBlcgotI2VuZGlmIC8qIExJTlVYICovCi0jZGVmaW5lIF90cHJpbnRmIHByaW50ZgotI2RlZmluZSBfdHN0YXQgc3RhdAotI2RlZmluZSBfdGNzbmNtcCBzdHJuY21wCi0jZGVmaW5lIF90Y3NzdHIgc3Ryc3RyIAotI2RlZmluZSBfdG9wZW5kaXIgb3BlbmRpcgotI2RlZmluZSBfdHJlYWRkaXIgcmVhZGRpcgotI2RlZmluZSBfdGNsb3NlZGlyIGNsb3NlZGlyCi0jZGVmaW5lIF90RElSIERJUgotI2VuZGlmIC8qIF9XSU4zMiAqLwotCi0jZW5kaWYgLyogRUNMSVBTRV9VTklDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZVV0aWwuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZWNsaXBzZVV0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkN2I2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VVdGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRWNsaXBzZSBMYXVuY2hlciBVdGlsaXR5IE1ldGhvZHMgKi8KLQotI2luY2x1ZGUgImVjbGlwc2VPUy5oIgotI2luY2x1ZGUgImVjbGlwc2VDb21tb24uaCIKLSNpbmNsdWRlICJlY2xpcHNlVXRpbC5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2Vsc2UKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBNQVhfTElORV9MRU5HVEggMjU2Ci0KLS8qIElzIHRoZSBnaXZlbiBWTSBKOSAqLwotaW50IGlzSjlWTSggX1RDSEFSKiB2bSApCi17Ci0JX1RDSEFSICogY2ggPSBOVUxMLCAqY2gyID0gTlVMTDsKLQlpbnQgcmVzID0gMDsKLQkKLQlpZiAodm0gPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JCi0JY2ggPSBsYXN0RGlyU2VwYXJhdG9yKCB2bSApOwotCWlmIChpc1ZNTGlicmFyeSh2bSkpIHsKLQkJLyogYSBsaWJyYXJ5LCBjYWxsIGl0IGo5IGlmIHRoZSBwYXJlbnQgZGlyIGlzIGo5dm0gKi8KLQkJaWYoY2ggPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQljaFswXSA9IDA7Ci0JCWNoMiA9IGxhc3REaXJTZXBhcmF0b3Iodm0pOwotCQlpZihjaDIgIT0gTlVMTCkgewotCQkJcmVzID0gKF90Y3NpY21wKGNoMiArIDEsIF9UX0VDTElQU0UoImo5dm0iKSkgPT0gMCk7Ci0JCX0KLQkJY2hbMF0gPSBkaXJTZXBhcmF0b3I7Ci0JCXJldHVybiByZXM7Ci0JfSBlbHNlIHsKLQkJaWYgKGNoID09IE5VTEwpCi0JCSAgICBjaCA9IHZtOwotCQllbHNlCi0JCSAgICBjaCsrOwotCQlyZXR1cm4gKF90Y3NpY21wKCBjaCwgX1RfRUNMSVBTRSgiajkiKSApID09IDApOwotCX0KLX0KLQotaW50IGNoZWNrUHJvdmlkZWRWTVR5cGUoIF9UQ0hBUiogdm0gKSAKLXsKLQlfVENIQVIqIGNoID0gTlVMTDsKLQlzdHJ1Y3QgX3N0YXQgc3RhdHM7Ci0JCi0JaWYgKHZtID09IE5VTEwpIHJldHVybiBWTV9OT1RISU5HOwotCQotCWlmIChfdHN0YXQodm0sICZzdGF0cykgPT0gMCAmJiAoc3RhdHMuc3RfbW9kZSAmIFNfSUZESVIpICE9IDApIHsKLQkJLyogZGlyZWN0b3J5ICovCi0JCXJldHVybiBWTV9ESVJFQ1RPUlk7Ci0JfQotCi0JY2ggPSBfdGNzcmNociggdm0sIF9UX0VDTElQU0UoJy4nKSApOwotCWlmKGNoID09IE5VTEwpCi0JCXJldHVybiBWTV9PVEhFUjsKLQkKLSNpZmRlZiBfV0lOMzIKLQlpZiAoX3Rjc2ljbXAoY2gsIF9UX0VDTElQU0UoIi5kbGwiKSkgPT0gMCkKLSNlbHNlCi0JaWYgKChfdGNzaWNtcChjaCwgX1RfRUNMSVBTRSgiLnNvIikpID09IDApIHx8IChfdGNzaWNtcChjaCwgX1RfRUNMSVBTRSgiLmpuaWxpYiIpKSA9PSAwKSB8fCAoX3Rjc2ljbXAoY2gsIF9UX0VDTElQU0UoIi5keWxpYiIpKSA9PSAwKSkKLSNlbmRpZgotCXsKLQkJcmV0dXJuIFZNX0xJQlJBUlk7Ci0JfQotCQotCWlmIChfdGNzaWNtcChjaCwgX1RfRUNMSVBTRSgiLmVlIikpID09IDApCi0JCXJldHVybiBWTV9FRV9QUk9QUzsKLQkKLQlyZXR1cm4gVk1fT1RIRVI7Ci19Ci0KLS8qCi0gKiBwYXRoTGlzdCBpcyBhIHBhdGhTZXBhcmF0b3Igc2VwYXJhdGVkIGxpc3Qgb2YgcGF0aHMsIHJ1biBlYWNoIHRocm91Z2gKLSAqIGNoZWNrUGF0aCBhbmQgcmVjb21iaW5lIHRoZSByZXN1bHRzLgotICogTmV3IG1lbW9yeSBpcyBhbHdheXMgYWxsb2NhdGVkIGZvciB0aGUgcmVzdWx0Ci0gKi8KLV9UQ0hBUiAqIGNoZWNrUGF0aExpc3QoIF9UQ0hBUiogcGF0aExpc3QsIF9UQ0hBUiogcHJvZ3JhbURpciwgaW50IHJldmVyc2VPcmRlcikgewotCV9UQ0hBUiAqIGMxLCAqYzI7Ci0JX1RDSEFSICogY2hlY2tlZCwgKnJlc3VsdDsKLQlzaXplX3QgY2hlY2tlZExlbmd0aCA9IDAsIHJlc3VsdExlbmd0aCA9IDA7Ci0Jc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IF90Y3NsZW4ocGF0aExpc3QpOwotCQotCXJlc3VsdCA9IG1hbGxvYyhidWZmZXJMZW5ndGggKiBzaXplb2YoX1RDSEFSKSk7Ci0JYzEgPSBwYXRoTGlzdDsKLSAgICB3aGlsZSAoYzEgIT0gTlVMTCAmJiAqYzEgIT0gX1RfRUNMSVBTRSgnXDAnKSkKLSAgICB7Ci0gICAgCWMyID0gX3Rjc2NocihjMSwgcGF0aFNlcGFyYXRvcik7Ci0JCWlmIChjMiAhPSBOVUxMKQotCQkJKmMyID0gMDsKLQkJCi0JCWNoZWNrZWQgPSBjaGVja1BhdGgoYzEsIHByb2dyYW1EaXIsIHJldmVyc2VPcmRlcik7Ci0JCWNoZWNrZWRMZW5ndGggPSBfdGNzbGVuKGNoZWNrZWQpOwotCQlpZiAocmVzdWx0TGVuZ3RoICsgY2hlY2tlZExlbmd0aCArIDE+IGJ1ZmZlckxlbmd0aCkgewotCQkJYnVmZmVyTGVuZ3RoICs9IGNoZWNrZWRMZW5ndGggKyAxOwotCQkJcmVzdWx0ID0gcmVhbGxvYyhyZXN1bHQsIGJ1ZmZlckxlbmd0aCAqIHNpemVvZihfVENIQVIpKTsKLQkJfQotCQkKLQkJaWYocmVzdWx0TGVuZ3RoID4gMCkgewotCQkJcmVzdWx0W3Jlc3VsdExlbmd0aCsrXSA9IHBhdGhTZXBhcmF0b3I7Ci0JCQlyZXN1bHRbcmVzdWx0TGVuZ3RoXSA9IF9UX0VDTElQU0UoJ1wwJyk7Ci0JCX0KLQkJX3Rjc2NweShyZXN1bHQgKyByZXN1bHRMZW5ndGgsIGNoZWNrZWQpOwotCQlyZXN1bHRMZW5ndGggKz0gY2hlY2tlZExlbmd0aDsKLQkJCi0JCWlmKGNoZWNrZWQgIT0gYzEpCi0JCQlmcmVlKGNoZWNrZWQpOwotCQlpZihjMiAhPSBOVUxMKQotCQkJKihjMisrKSA9IHBhdGhTZXBhcmF0b3I7Ci0JCWMxID0gYzI7Ci0JfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLV9UQ0hBUiAqIGNvbmNhdFN0cmluZ3MoX1RDSEFSKipzdHJzKSB7Ci0JcmV0dXJuIGNvbmNhdFBhdGhzKHN0cnMsIDApOwotfQotCi1fVENIQVIgKiBjb25jYXRQYXRocyhfVENIQVIqKiBzdHJzLCBfVENIQVIgc2VwYXJhdG9yKSB7Ci0JX1RDSEFSIHNlcGFyYXRvclN0cmluZ1tdID0geyBzZXBhcmF0b3IsIDAgfTsKLQlfVENIQVIgKiByZXN1bHQ7Ci0JaW50IGkgPSAtMTsKLQlzaXplX3QgbGVuZ3RoID0gMDsKLQkvKiBmaXJzdCBjb3VudCBob3cgbGFyZ2UgYSBidWZmZXIgd2UgbmVlZCAqLwotCXdoaWxlIChzdHJzWysraV0gIT0gTlVMTCkgewotCQlsZW5ndGggKz0gX3Rjc2xlbihzdHJzW2ldKSArIChzZXBhcmF0b3IgIT0gMCA/IDEgOiAwKTsKLQl9Ci0KLQlyZXN1bHQgPSBtYWxsb2MoKGxlbmd0aCArIDEpICogc2l6ZW9mKF9UQ0hBUikpOwotCXJlc3VsdFswXSA9IDA7Ci0JaSA9IC0xOwotCXdoaWxlIChzdHJzWysraV0gIT0gTlVMTCkgewotCQlyZXN1bHQgPSBfdGNzY2F0KHJlc3VsdCwgc3Ryc1tpXSk7Ci0JCWlmIChzZXBhcmF0b3IgIT0gMCkKLQkJCXJlc3VsdCA9IF90Y3NjYXQocmVzdWx0LCBzZXBhcmF0b3JTdHJpbmcpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogYnVmZmVyIGNvbnRhaW5zIGEgcGF0aFNlcGFyYXRvciBzZXBhcmF0ZWQgbGlzdCBvZiBwYXRocywgY2hlY2sgCi0gKiB0aGF0IGl0IGNvbnRhaW5zIGFsbCB0aGUgcGF0aHMgZ2l2ZW4uICBFYWNoIHBhdGggaXMgZXhwZWN0ZWQgdG8gYmUKLSAqIHRlcm1pbmF0ZWQgd2l0aCBhIHBhdGhTZXBhcmF0b3IgY2hhcmFjdGVyLgotICovCi1pbnQgY29udGFpbnNQYXRocyhfVENIQVIgKiBzdHIsIF9UQ0hBUioqIHBhdGhzKSB7Ci0JX1RDSEFSICogYnVmZmVyOwotCV9UQ0hBUiAqIGM7Ci0JaW50IGk7Ci0JCi0JLyogdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCBhIHBhdGhTZXBhcmF0b3IgKi8KLQlidWZmZXIgPSBtYWxsb2MoKF90Y3NsZW4oc3RyKSArIDIpICogc2l6ZW9mKF9UQ0hBUikpOwotCV9zdHByaW50ZihidWZmZXIsIF9UX0VDTElQU0UoIiVzJWMiKSwgc3RyLCBwYXRoU2VwYXJhdG9yKTsKLQkKLQlmb3IgKGkgPSAwOyBwYXRoc1tpXSAhPSBOVUxMOyBpKyspIHsKLQkJYyA9IF90Y3NzdHIoYnVmZmVyLCBwYXRoc1tpXSk7Ci0JCWlmICggYyA9PSBOVUxMIHx8ICEoYyA9PSBidWZmZXIgfHwgKihjIC0gMSkgPT0gcGF0aFNlcGFyYXRvcikpCi0JCXsKLQkJCS8qIGVudHJ5IG5vdCBmb3VuZCAqLwotCQkJZnJlZShidWZmZXIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZnJlZShidWZmZXIpOwotCXJldHVybiAxOwotfQotCi1pbnQgaXNWTUxpYnJhcnkoIF9UQ0hBUiogdm0gKQotewotCV9UQ0hBUiAqY2ggPSBOVUxMOwotCWlmICh2bSA9PSBOVUxMKSByZXR1cm4gMDsKLQljaCA9IF90Y3NyY2hyKCB2bSwgJy4nICk7Ci0JaWYoY2ggPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0jaWZkZWYgX1dJTjMyCi0JcmV0dXJuIChfdGNzaWNtcChjaCwgX1RfRUNMSVBTRSgiLmRsbCIpKSA9PSAwKTsKLSNlbHNlCi0JcmV0dXJuIChfdGNzaWNtcChjaCwgX1RfRUNMSVBTRSgiLnNvIikpID09IDApIHx8IChfdGNzaWNtcChjaCwgX1RfRUNMSVBTRSgiLmpuaWxpYiIpKSA9PSAwKSB8fCAoX3Rjc2ljbXAoY2gsIF9UX0VDTElQU0UoIi5keWxpYiIpKSA9PSAwKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgQUlYCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qIFJldHVybiB0aGUgSlZNIHZlcnNpb24gaW4gdGhlIGZvcm1hdCB4LngueCAKLSAqLwotY2hhciogZ2V0Vk1WZXJzaW9uKCBjaGFyICp2bVBhdGggKQotewotICAgIGNoYXIgICBjbWRbTUFYX0xJTkVfTEVOR1RIXTsKLSAgICBjaGFyICAgbGluZVN0cmluZ1tNQVhfTElORV9MRU5HVEhdOwotICAgIGNoYXIqICBmaXJzdENoYXI7Ci0gICAgY2hhciAgIGZpbGVOYW1lW01BWF9MSU5FX0xFTkdUSF07Ci0gICAgdGltZV90IGN1clRpbWU7Ci0gICAgRklMRSogIGZwOwotICAgIGludCAgICBudW1DaGFycyA9IDA7Ci0gICAgY2hhciogIHZlcnNpb24gID0gTlVMTDsKLQotCS8qIERlZmluZSBhIHVuaXF1ZSBmaWxlbmFtZSBmb3IgdGhlIGphdmEgb3V0cHV0LiAqLwotICAgICh2b2lkKSB0aW1lKCZjdXJUaW1lKTsKLSAgICAodm9pZCkgc3ByaW50ZihmaWxlTmFtZSwgIi90bXAvdG1wJWxkLnR4dCIsIGN1clRpbWUpOwotCi0gICAgLyogV3JpdGUgamF2YSAtdmVyc2lvbiBvdXRwdXQgdG8gYSB0ZW1wIGZpbGUgKi8KLSAgICAodm9pZCkgc3ByaW50ZihjbWQsIiVzIC12ZXJzaW9uIDI+ICVzIiwgdm1QYXRoLCBmaWxlTmFtZSk7Ci0gICAgKHZvaWQpIHN5c3RlbShjbWQpOyAKLQotICAgIGZwID0gZm9wZW4oZmlsZU5hbWUsICJyIik7Ci0gICAgaWYgKGZwICE9IE5VTEwpCi0gICAgewotICAgIAkvKiBSZWFkIGphdmEgLXZlcnNpb24gb3V0cHV0IGZyb20gYSB0ZW1wIGZpbGUgKi8KLSAgICAJaWYgKGZnZXRzKGxpbmVTdHJpbmcsIE1BWF9MSU5FX0xFTkdUSCwgZnApID09IE5VTEwpCi0gICAgCQlsaW5lU3RyaW5nWzBdID0gJ1wwJzsKLSAgICAJZmNsb3NlKGZwKTsKLSAgICAJdW5saW5rKGZpbGVOYW1lKTsKLQotICAgIAkvKiBFeHRyYWN0IHZlcnNpb24gbnVtYmVyICovCi0gICAgCWZpcnN0Q2hhciA9IChjaGFyICopIChzdHJjaHIobGluZVN0cmluZywgJyInKSArIDEpOwotICAgIAlpZiAoZmlyc3RDaGFyICE9IE5VTEwpCi0gICAgCQludW1DaGFycyA9IChpbnQpICAoc3RycmNocihsaW5lU3RyaW5nLCAnIicpIC0gZmlyc3RDaGFyKTsKLSAgICAJCi0gICAgCS8qIEFsbG9jYXRlIGEgYnVmZmVyIGFuZCBjb3B5IHRoZSB2ZXJzaW9uIHN0cmluZyBpbnRvIGl0LiAqLwotICAgIAlpZiAobnVtQ2hhcnMgPiAwKQotICAgIAl7Ci0gICAgCQl2ZXJzaW9uID0gbWFsbG9jKCBudW1DaGFycyArIDEgKTsKLSAgICAJCXN0cm5jcHkodmVyc2lvbiwgZmlyc3RDaGFyLCBudW1DaGFycyk7Ci0JCQl2ZXJzaW9uW251bUNoYXJzXSA9ICdcMCc7Ci0JCX0KLQl9ICAKLQotICAgIHJldHVybiB2ZXJzaW9uOwotfQotCi0vKiBDb21wYXJlIEpWTSBWZXJzaW9ucyBvZiB0aGUgZm9ybSAieC54LnguLi4iCi0gKiAgICAgCi0gKiAgICBSZXR1cm5zIC0xIGlmIHZlcjEgPCB2ZXIyCi0gKiAgICBSZXR1cm5zICAwIGlmIHZlcjEgPSB2ZXIyIAotICogICAgUmV0dXJucyAgMSBpZiB2ZXIxID4gdmVyMgotICovICAgICAKLWludCB2ZXJzaW9uQ21wKGNoYXIgKnZlcjEsIGNoYXIgKnZlcjIpCi17Ci0gICAgY2hhciogIGRvdDE7Ci0gICAgY2hhciogIGRvdDI7Ci0gICAgaW50ICAgIG51bTE7Ci0gICAgaW50ICAgIG51bTI7Ci0KLSAgICBkb3QxID0gc3RyY2hyKHZlcjEsICcuJyk7Ci0gICAgZG90MiA9IHN0cmNocih2ZXIyLCAnLicpOwotCi0gICAgbnVtMSA9IGF0b2kodmVyMSk7Ci0gICAgbnVtMiA9IGF0b2kodmVyMik7Ci0KLSAgICBpZiAobnVtMSA+IG51bTIpCi0gICAgCXJldHVybiAxOwotICAgIAkKLQlpZiAobnVtMSA8IG51bTIpCi0JCXJldHVybiAtMTsKLQkKLQlpZiAoZG90MSAmJiAhZG90MikgICAvKiB4LnkgPiB4ICovCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgaWYgKCFkb3QxICYmIGRvdDIpICAgLyogeCA8IHgueSAqLwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgCi0gICAgaWYgKCFkb3QxICYmICFkb3QyKSAgLyogeCA9PSB4ICovCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIHZlcnNpb25DbXAoKGNoYXIqKShkb3QxICsgMSksIChjaGFyKikoZG90MiArIDEpICk7Ci19Ci0jZW5kaWYgLyogQUlYICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VVdGlsLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2VjbGlwc2VVdGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGFiYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9lY2xpcHNlVXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEVDTElQU0VfVVRJTF9ICi0jZGVmaW5lIEVDTElQU0VfVVRJTF9ICi0KLS8qIGNvbnN0YW50cyBmb3IgY2hlY2tQcm92aWRlZFZNVHlwZSAqLwotI2RlZmluZSBWTV9OT1RISU5HCQkwCQkvKiBOVUxMIHdhcyBnaXZlbiBhcyBpbnB1dCAqLwotI2RlZmluZSBWTV9PVEhFUgkJMQkJLyogZG9uJ3Qga25vdywgY291bGQgYmUgZXhlY3V0YWJsZSBvciBjb3VsZCBiZSBub3RoaW5nICovCi0jZGVmaW5lIFZNX0RJUkVDVE9SWQkyCQkvKiBpdCBpcyBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBWTV9MSUJSQVJZCQkzCQkvKiBpdCBpcyBhIGxpYnJhcnkgKGlzVm1MaWJyYXJ5IHdvdWxkIHJldHVybiB0cnVlKSAqLwotI2RlZmluZSBWTV9FRV9QUk9QUwkJNAkJLyogaXQgaXMgYSB2bSAuZWUgcHJvcGVydGllcyBmaWxlICovCi0KLS8qIEVjbGlwc2UgTGF1bmNoZXIgVXRpbGl0eSBNZXRob2RzICovCi0KLS8qIElzIHRoZSBnaXZlbiBKYXZhIFZNIEo5ICovCi1leHRlcm4gaW50IGlzSjlWTSggX1RDSEFSKiB2bSApOwotCi0vKiBJcyB0aGUgZ2l2ZW4gZmlsZSBhIHNoYXJlZCBsaWJyYXJ5PyAqLwotZXh0ZXJuIGludCBpc1ZNTGlicmFyeSggX1RDSEFSKiB2bSApOwotCi0vKiBkZXRlcm1pbmUgd2hhdCB0aGUgcHJvdmlkZWQgLXZtIGFyZ3VtZW50IGlzIHJlZmVycmluZyB0byAqLyAKLWV4dGVybiBpbnQgY2hlY2tQcm92aWRlZFZNVHlwZSggX1RDSEFSKiB2bSApOwotCi0vKiB0YWtlIGEgbGlzdCBvZiBwYXRoIHNlcGFyYXRlZCB3aXRoIHBhdGhTZXBhcmF0b3IgYW5kIHJ1biB0aGVtIHRocm91Z2ggY2hlY2tQYXRoICovCi1leHRlcm4gX1RDSEFSICogY2hlY2tQYXRoTGlzdCggX1RDSEFSKiBwYXRoTGlzdCwgX1RDSEFSKiBwcm9ncmFtRGlyLCBpbnQgcmV2ZXJzZU9yZGVyKTsKLQotLyogdGFrZSBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBzdHJpbmdzIGFuZCBjb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyIGludG8gb25lIHN0cmluZyAqLwotZXh0ZXJuIF9UQ0hBUiAqIGNvbmNhdFN0cmluZ3MoX1RDSEFSKiogc3Rycyk7Ci0KLS8qIHRha2UgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncyBhbmQgY29uY2F0ZW5hdGUgdGhlbSB0b2dldGhlciB1c2luZyB0aGUgZ2l2ZSBwYXRoU2VwYXJhdG9yICovCi1leHRlcm4gX1RDSEFSKiBjb25jYXRQYXRocyhfVENIQVIqKiBwYXRocywgX1RDSEFSIHBhdGhTZXBhcmF0b3IpOwotCi0vKiBjaGVjayB0aGF0IHRoZSBidWZmZXIgY29udGFpbnMgYWxsIHRoZSBnaXZlbiBwYXRocyAqLwotZXh0ZXJuIGludCBjb250YWluc1BhdGhzKF9UQ0hBUiAqIHN0ciwgX1RDSEFSKiogcGF0aHMpOwotCi0jaWZkZWYgQUlYIAotLyogR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBWTSAqLwotZXh0ZXJuIGNoYXIqIGdldFZNVmVyc2lvbiggY2hhciogdm0gKTsKLQotLyogQ29tcGFyZSBKVk0gVmVyc2lvbnMgKi8KLWV4dGVybiBpbnQgdmVyc2lvbkNtcCggY2hhciogdmVyMSwgY2hhciogdmVyMiApOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBFQ0xJUFNFX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9ndGsvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGZkNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9ndGsvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotKi5vCi1lY2xpcHNlCi1lY2xpcHNlXyouc28KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL2J1aWxkLnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9ndGsvYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNjA2ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9ndGsvYnVpbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotIyEvYmluL3NoCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSMgTWFydGluIE9iZXJodWJlciAoV2luZCBSaXZlcikgLSBbMTc2ODA1XSBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggZ2NjIGFuZCBkZWJ1ZwotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMKLSMgVXNhZ2U6IHNoIGJ1aWxkLnNoIFs8b3B0aW9uYWwgc3dpdGNoZXM+XSBbY2xlYW5dCi0jCi0jICAgd2hlcmUgdGhlIG9wdGlvbmFsIHN3aXRjaGVzIGFyZToKLSMgICAgICAgLW91dHB1dCA8UFJPR1JBTV9PVVRQVVQ+ICAtIGV4ZWN1dGFibGUgZmlsZW5hbWUgKCJlY2xpcHNlIikKLSMgICAgICAgLW9zICAgICA8REVGQVVMVF9PUz4gICAgICAtIGRlZmF1bHQgRWNsaXBzZSAiLW9zIiB2YWx1ZQotIyAgICAgICAtYXJjaCAgIDxERUZBVUxUX09TX0FSQ0g+IC0gZGVmYXVsdCBFY2xpcHNlICItYXJjaCIgdmFsdWUKLSMgICAgICAgLXdzICAgICA8REVGQVVMVF9XUz4gICAgICAtIGRlZmF1bHQgRWNsaXBzZSAiLXdzIiB2YWx1ZQotIyAgICAgICAtamF2YSA8SkFWQV9IT01FPiAgLSBqYXZhIGluc3RhbGwgZm9yIGpuaSBoZWFkZXJzCi0jCi0jICAgQWxsIG90aGVyIGFyZ3VtZW50cyBhcmUgZGlyZWN0bHkgcGFzc2VkIHRvIHRoZSAibWFrZSIgcHJvZ3JhbS4KLSMgICBUaGlzIHNjcmlwdCBjYW4gYWxzbyBiZSBpbnZva2VkIHdpdGggdGhlICJjbGVhbiIgYXJndW1lbnQuCi0jCi0jICAgRXhhbXBsZXM6Ci0jICAgc2ggYnVpbGQuc2ggY2xlYW4KLSMgICBzaCBidWlsZC5zaCAtamF2YSAvdXNyL2oyc2UgT1BURkxBRz0tZyBQSUNGTEFHPS1mcGljCi0KLWNkIGBkaXJuYW1lICQwYAotCi0jIERlZmluZSBkZWZhdWx0IHZhbHVlcyBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG1ha2VmaWxlcy4KLXByb2dyYW1PdXRwdXQ9ImVjbGlwc2UiCi1kZWZhdWx0T1M9IiIKLWRlZmF1bHRPU0FyY2g9IiIKLWRlZmF1bHRXUz0iZ3RrIgotZGVmYXVsdEphdmE9REVGQVVMVF9KQVZBX0pOSQotamF2YUhvbWU9IiIKLW1ha2VmaWxlPSIiCi1pZiBbICIkT1MiID0gIiIgXTsgIHRoZW4KLSAgICBPUz1gdW5hbWUgLXNgCi1maQotaWYgWyAiJE1PREVMIiA9ICIiIF07ICB0aGVuCi0gICAgTU9ERUw9YHVuYW1lIC1tYAotZmkKLWlmIFsgIiR7Q0N9IiA9ICIiIF07IHRoZW4KLQlDQz1jYwotCWV4cG9ydCBDQwotZmkKLQotY2FzZSAkT1MgaW4KLQkiTGludXgiKQotCQltYWtlZmlsZT0ibWFrZV9saW51eC5tYWsiCi0JCWRlZmF1bHRPUz0ibGludXgiCi0JCWNhc2UgJE1PREVMIGluCi0JCQkieDg2XzY0IikKLQkJCQlkZWZhdWx0T1NBcmNoPSJ4ODZfNjQiCi0JCQkJZGVmYXVsdEphdmE9REVGQVVMVF9KQVZBX0VYRUMKLQkJCQlbIC1kIC91c3IvamF2YTY0LzEuNSBdICYmIGphdmFIb21lPSIvdXNyL2phdmE2NC8xLjUiCi0JCQkJT1VUUFVUX0RJUj0iLi4vLi4vYmluLyRkZWZhdWx0V1MvJGRlZmF1bHRPUy8kZGVmYXVsdE9TQXJjaCIKLQkJCQk7OwotCQkJaT84NikKLQkJCQlkZWZhdWx0T1NBcmNoPSJ4ODYiCi0JCQkJT1VUUFVUX0RJUj0iLi4vLi4vYmluLyRkZWZhdWx0V1MvJGRlZmF1bHRPUy8kZGVmYXVsdE9TQXJjaCIKLQkJCQk7OwotCQkJInBwYyIpCi0JCQkJZGVmYXVsdE9TQXJjaD0icHBjIgotCQkJCWRlZmF1bHRKYXZhPURFRkFVTFRfSkFWQV9FWEVDCi0JCQkJT1VUUFVUX0RJUj0iLi4vLi4vYmluLyRkZWZhdWx0V1MvJGRlZmF1bHRPUy8kZGVmYXVsdE9TQXJjaCIKLQkJCQk7OwotCQkJInBwYzY0IikKLQkJCQlkZWZhdWx0T1NBcmNoPSJwcGM2NCIKLQkJCQlkZWZhdWx0SmF2YT1ERUZBVUxUX0pBVkFfRVhFQwotCQkJCU9VVFBVVF9ESVI9Ii4uLy4uL2Jpbi8kZGVmYXVsdFdTLyRkZWZhdWx0T1MvJGRlZmF1bHRPU0FyY2giCi0JCQkJOzsKLQkJCSJzMzkwIikKLQkJCQlkZWZhdWx0T1NBcmNoPSJzMzkwIgotCQkJCWRlZmF1bHRKYXZhPURFRkFVTFRfSkFWQV9FWEVDCi0JCQkJT1VUUFVUX0RJUj0iLi4vLi4vY29udHJpYnV0ZWQvJGRlZmF1bHRXUy8kZGVmYXVsdE9TLyRkZWZhdWx0T1NBcmNoIgotCQkJCTs7Ci0JCQkiczM5MHgiKQotCQkJCWRlZmF1bHRPU0FyY2g9InMzOTB4IgotCQkJCWRlZmF1bHRKYXZhPURFRkFVTFRfSkFWQV9FWEVDCi0JCQkJT1VUUFVUX0RJUj0iLi4vLi4vY29udHJpYnV0ZWQvJGRlZmF1bHRXUy8kZGVmYXVsdE9TLyRkZWZhdWx0T1NBcmNoIgotCQkJCTs7Ci0JCQkiaWE2NCIpCi0JCQkJZGVmYXVsdE9TQXJjaD0iaWE2NCIKLQkJCQlkZWZhdWx0SmF2YT1ERUZBVUxUX0pBVkFfRVhFQwotCQkJCU9VVFBVVF9ESVI9Ii4uLy4uL2Jpbi8kZGVmYXVsdFdTLyRkZWZhdWx0T1MvJGRlZmF1bHRPU0FyY2giCi0JCQkJOzsKLQkJCSopCi0JCQkJZWNobyAiKioqIFVua25vd24gTU9ERUwgPCR7TU9ERUx9PiIKLQkJCQk7OwotCQllc2FjCi0JCTs7Ci0JIlN1bk9TIikKLQkJbWFrZWZpbGU9Im1ha2Vfc29sYXJpcy5tYWsiCi0JCWRlZmF1bHRPUz0ic29sYXJpcyIKLQkJWyAtZCAvdXNyL2pkay9qZGsxLjUuMF8wMSBdICYmIGphdmFIb21lPSIvdXNyL2pkay9qZGsxLjUuMF8wMSIKLQkJT1VUUFVUX0RJUj0iLi4vLi4vYmluLyRkZWZhdWx0V1MvJGRlZmF1bHRPUy8kZGVmYXVsdE9TQXJjaCIKLQkJI1BBVEg9L3Vzci9jY3MvYmluOi9vcHQvU1VOV3Nwcm8vYmluOiRQQVRICi0JCVBBVEg9L3Vzci9jY3MvYmluOi9leHBvcnQvaG9tZS9TVU5Xc3Byby9iaW46JFBBVEgKLQkJZXhwb3J0IFBBVEgKLQkJaWYgWyAiJFBST0MiID0gIiIgXTsgIHRoZW4KLQkJICAgIFBST0M9YHVuYW1lIC1wYAotCQlmaQotCQljYXNlICR7UFJPQ30gaW4KLQkJCSJpMzg2IikKLQkJCQlkZWZhdWx0T1NBcmNoPSJ4ODYiCi0JCQkJQ0M9Y2MKLQkJCQk7OwotCQkJInNwYXJjIikKLQkJCQlkZWZhdWx0T1NBcmNoPSJzcGFyYyIKLQkJCQlDQz1jYwotCQkJCTs7Ci0JCQkqKQotCQkJCWVjaG8gIioqKiBVbmtub3duIHByb2Nlc3NvciB0eXBlIDwke1BST0N9PiIKLQkJCQk7OwotCQllc2FjCi0JCTs7Ci0JKikKLQllY2hvICJVbmtub3duIE9TIC0tIGJ1aWxkIGFib3J0ZWQiCi0JOzsKLWVzYWMKLWV4cG9ydCBDQwotIyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVzLgotZXh0cmFBcmdzPSIiCi13aGlsZSBbICIkMSIgIT0gIiIgXTsgZG8KLSAgICBpZiBbICIkMSIgPSAiLW9zIiBdICYmIFsgIiQyIiAhPSAiIiBdOyB0aGVuCi0gICAgICAgIGRlZmF1bHRPUz0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLWFyY2giIF0gJiYgWyAiJDIiICE9ICIiIF07IHRoZW4KLSAgICAgICAgZGVmYXVsdE9TQXJjaD0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLXdzIiBdICYmIFsgIiQyIiAhPSAiIiBdOyB0aGVuCi0gICAgICAgIGRlZmF1bHRXUz0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLW91dHB1dCIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotICAgICAgICBwcm9ncmFtT3V0cHV0PSIkMiIKLSAgICAgICAgc2hpZnQKLSAgICBlbGlmIFsgIiQxIiA9ICItamF2YSIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotICAgICAgICBqYXZhSG9tZT0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxzZQotICAgICAgICBleHRyYUFyZ3M9IiRleHRyYUFyZ3MgJDEiCi0gICAgZmkKLSAgICBzaGlmdAotZG9uZQotCi0jIFNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbmVlZGVkIGJ5IHRoZSBtYWtlZmlsZXMuCi1QUk9HUkFNX09VVFBVVD0iJHByb2dyYW1PdXRwdXQiCi1ERUZBVUxUX09TPSIkZGVmYXVsdE9TIgotREVGQVVMVF9PU19BUkNIPSIkZGVmYXVsdE9TQXJjaCIKLURFRkFVTFRfV1M9IiRkZWZhdWx0V1MiCi1ERUZBVUxUX0pBVkE9JGRlZmF1bHRKYXZhCi0KLWlmIFsgLW4gICRqYXZhSG9tZSBdOyB0aGVuCi0JSkFWQV9IT01FPSRqYXZhSG9tZQotCWV4cG9ydCBKQVZBX0hPTUUKLWZpCi0KLWlmIFsgIiRkZWZhdWx0T1NBcmNoIiA9ICJwcGM2NCIgXTsgIHRoZW4KLQlNX0FSQ0g9LW02NAotCWV4cG9ydCBNX0FSQ0gKLWVsaWYgWyAiJGRlZmF1bHRPU0FyY2giID0gInMzOTAiIF07ICB0aGVuCi0JTV9BUkNIPS1tMzEKLQlleHBvcnQgTV9BUkNICi1maQotCi1MSUJSQVJZX0RJUj0iLi4vLi4vLi4vb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci4kZGVmYXVsdFdTLiRkZWZhdWx0T1MuJGRlZmF1bHRPU0FyY2giCi1PVVRQVVRfRElSPSIuLi8uLi9iaW4vJGRlZmF1bHRXUy8kZGVmYXVsdE9TLyRkZWZhdWx0T1NBcmNoIgotCi1leHBvcnQgT1VUUFVUX0RJUiBQUk9HUkFNX09VVFBVVCBERUZBVUxUX09TIERFRkFVTFRfT1NfQVJDSCBERUZBVUxUX1dTIERFRkFVTFRfSkFWQSBMSUJSQVJZX0RJUgotCi0jIElmIHRoZSBPUyBpcyBzdXBwb3J0ZWQgKGEgbWFrZWZpbGUgZXhpc3RzKQotaWYgWyAiJG1ha2VmaWxlIiAhPSAiIiBdOyB0aGVuCi0JaWYgWyAiJGV4dHJhQXJncyIgIT0gIiIgXTsgdGhlbgotCQltYWtlIC1mICRtYWtlZmlsZSAkZXh0cmFBcmdzCi0JZWxzZQotCQllY2hvICJCdWlsZGluZyAkT1MgbGF1bmNoZXIuIERlZmF1bHRzOiAtb3MgJERFRkFVTFRfT1MgLWFyY2ggJERFRkFVTFRfT1NfQVJDSCAtd3MgJERFRkFVTFRfV1MiCi0JCW1ha2UgLWYgJG1ha2VmaWxlIGNsZWFuCi0JCWNhc2UgeCRDQyBpbgotCQkgIHgqZ2NjKikgbWFrZSAtZiAkbWFrZWZpbGUgYWxsIFBJQ0ZMQUc9LWZwaWMgOzsKLQkJICAqKSAgICAgIG1ha2UgLWYgJG1ha2VmaWxlIGFsbCA7OwotCQllc2FjCi0JZmkKLWVsc2UKLQllY2hvICJVbmtub3duIE9TICRPUyAtLSBidWlsZCBhYm9ydGVkIgotZmkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL2J1aWxkLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhMDVjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2d0ay9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08cHJvamVjdCBkZWZhdWx0PSJidWlsZF9lY2xpcHNlIiBiYXNlZGlyPSIuIj4KLQotPHRhcmdldCBuYW1lPSJidWlsZF9lY2xpcHNlIj4KLQk8ZXhlYyBkaXI9Ii4iIGV4ZWN1dGFibGU9InNoIj4KLQkJPGFyZyBsaW5lPSIke2Jhc2VkaXJ9L2J1aWxkLnNoIi8+Ci0JCTxhcmcgbGluZT0iaW5zdGFsbCIvPgotCTwvZXhlYz4KLQk8ZWNsaXBzZS5yZWZyZXNoTG9jYWwgcmVzb3VyY2U9InBsYXRmb3JtLWxhdW5jaGVyIiBkZXB0aD0iaW5maW5pdGUiIC8+CQkKLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImJ1aWxkX2VjbGlwc2VfcHBjIj4KLQk8ZXhlYyBkaXI9Ii4iIGV4ZWN1dGFibGU9InNoIj4KLQkJPGVudiBrZXk9Ik1PREVMIiB2YWx1ZT0icHBjIi8+Ci0JCTxhcmcgbGluZT0iJHtiYXNlZGlyfS9idWlsZC5zaCIvPgotCQk8YXJnIGxpbmU9Imluc3RhbGwiLz4KLQk8L2V4ZWM+Ci0JPGVjbGlwc2UucmVmcmVzaExvY2FsIHJlc291cmNlPSJwbGF0Zm9ybS1sYXVuY2hlciIgZGVwdGg9ImluZmluaXRlIiAvPgkJCi08L3RhcmdldD4KLQkKLTx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCTx0c3RhbXAvPgotCTxleGVjIGRpcj0iLiIgZXhlY3V0YWJsZT0ic2giPgotCQk8YXJnIGxpbmU9IiR7YmFzZWRpcn0vYnVpbGQuc2giLz4KLQkJPGFyZyBsaW5lPSJjbGVhbiIvPgotCTwvZXhlYz4KLTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9ndGsvZWNsaXBzZUd0ay5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9ndGsvZWNsaXBzZUd0ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzUyYWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL2VjbGlwc2VHdGsuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSAqICAgICBUb20gVHJvbWV5IChSZWQgSGF0LCBJbmMuKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJlY2xpcHNlTW96aWxsYS5oIgotI2luY2x1ZGUgImVjbGlwc2VDb21tb24uaCIKLSNpbmNsdWRlICJlY2xpcHNlT1MuaCIKLSNpbmNsdWRlICJlY2xpcHNlVXRpbC5oIgotI2luY2x1ZGUgImVjbGlwc2VHdGsuaCIKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2lmZGVmIFNPTEFSSVMKLSNpbmNsdWRlIDxzeXMvZmlsaW8uaD4KLSNlbmRpZgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi0vKiBHbG9iYWwgVmFyaWFibGVzICovCi1jaGFyKiAgZGVmYXVsdFZNICAgICA9ICJqYXZhIjsKLWNoYXIqICB2bUxpYnJhcnkgCSA9ICJsaWJqdm0uc28iOwotY2hhciogIHNoaXBwZWRWTURpciAgPSAianJlL2Jpbi8iOwotCi0vKiBEZWZpbmUgdGhlIHNwZWNpYWwgYXJndW1lbnRzIGZvciB0aGUgdmFyaW91cyBKYXZhIFZNcy4gKi8KLXN0YXRpYyBjaGFyKiAgYXJnVk1fSkFWQVtdICAgICAgICA9IHsgTlVMTCB9OwotCi0vKiBEZWZpbmUgbG9jYWwgdmFyaWFibGVzIC4gKi8KLXN0YXRpYyBsb25nCQkJc3BsYXNoSGFuZGxlID0gMDsKLXN0YXRpYyBHdGtXaWRnZXQqICAgc2hlbGxIYW5kbGUgPSAwOwotc3RhdGljIEdka1BpeGJ1ZioJcGl4YnVmID0gMDsKLXN0YXRpYyBHdGtXaWRnZXQqICAgaW1hZ2UgPSAwOwotCi1zdGF0aWMgc2VtX3QqIG11dGV4Owotc3RhdGljIEF0b20gYXBwV2luZG93QXRvbSwgbGF1bmNoZXJXaW5kb3dBdG9tOwotc3RhdGljIF9UQ0hBUioqIG9wZW5GaWxlUGF0aCA9IE5VTEw7IC8qIHRoZSBmaWxlcyB3ZSB3YW50IHRvIG9wZW4gKi8KLXN0YXRpYyBpbnQgb3BlbkZpbGVUaW1lb3V0ID0gNjA7IC8qIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHRpbWVvdXQgKi8KLQotc3RhdGljIHN0cnVjdCBzaWdhY3Rpb24gcXVpdEFjdGlvbjsKLXN0YXRpYyBzdHJ1Y3Qgc2lnYWN0aW9uIGludEFjdGlvbjsKLQotLyogTG9jYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBjYXRjaF9zaWduYWwoaW50IHNpZykgewotCS8vY2F0Y2ggc2lnbmFscywgZnJlZSB0aGUgbG9jaywgcmVpbnN0YWxsIHRoZSBvcmlnaW5hbAotCS8vc2lnbmFsIGhhbmRsZXJzIGFuZCByZXJhaXNlIHRoZSBzaWduYWwuCi0Jc2VtX3Bvc3QobXV0ZXgpOwotCXNlbV9jbG9zZShtdXRleCk7Ci0Jc2lnYWN0aW9uKFNJR0lOVCwgJmludEFjdGlvbiwgTlVMTCk7Ci0Jc2lnYWN0aW9uKFNJR1FVSVQsICZpbnRBY3Rpb24sIE5VTEwpOwotCXJhaXNlKHNpZyk7Ci19Ci0KLXR5cGVkZWYgaW50ICgqTG9ja0Z1bmMpKCk7Ci1pbnQgZXhlY3V0ZVdpdGhMb2NrKGNoYXIgKm5hbWUsIExvY2tGdW5jIGZ1bmMpIHsKLQlpbnQgcmVzdWx0ID0gLTE7Ci0JaW50IGxvY2sgPSAtMTsKLQlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdGlvbjsKLQotCW11dGV4ID0gc2VtX29wZW4obmFtZSwgT19DUkVBVCB8IE9fRVhDTCwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPLCAxKTsKLQlpZiAobXV0ZXggPT0gU0VNX0ZBSUxFRCkgewotCQkvL2NyZWF0ZSBmYWlsZWQuIFByb2JhYmx5IGxvY2sgaXMgYWxyZWFkeSBjcmVhdGVkIHNvIHRyeSBvcGVuaW5nIHRoZSBleGlzdGluZyBsb2NrLgotCQltdXRleCA9IHNlbV9vcGVuKG5hbWUsIDApOwotCX0KLQlpZiAobXV0ZXggPT0gU0VNX0ZBSUxFRCkKLQkJcmV0dXJuIC0xOyAvL3RoaXMgaXMgYW4gZXJyb3IuCi0KLQkvLyBpbnN0YWxsIHNpZ25hbCBoYW5kbGVyIHRvIGZyZWUgdGhlIGxvY2sgaWYgc29tZXRoaW5nIGJhZCBoYXBwZW5zLgotCS8vIHNlbV90IGlzIG5vdCBmcmVlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYSBwcm9jZXNzIGVuZHMuCi0JYWN0aW9uLnNhX2hhbmRsZXIgPSBjYXRjaF9zaWduYWw7Ci0Jc2lnYWN0aW9uKFNJR0lOVCwgJmFjdGlvbiwgJmludEFjdGlvbik7Ci0Jc2lnYWN0aW9uKFNJR1FVSVQsICZhY3Rpb24sICZxdWl0QWN0aW9uKTsKLQotCXdoaWxlICgobG9jayA9IHNlbV90cnl3YWl0KG11dGV4KSkgIT0gMCkgewotCQlpZiAoZXJybm8gPT0gRUFHQUlOKSB7Ci0JCQkvL2NvdWxkbid0IGFjcXVpcmUgbG9jaywgc2xlZXAgYSBiaXQgYW5kIHRyeSBhZ2FpbgotCQkJc2xlZXAoMSk7Ci0JCQlpZiAoLS1vcGVuRmlsZVRpbWVvdXQgPiAwKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWlmIChsb2NrID09IDApCi0JCXJlc3VsdCA9IGZ1bmMoKTsKLQotCXNlbV9wb3N0KG11dGV4KTsKLQlzZW1fY2xvc2UobXV0ZXgpOwotCi0JLy9yZWluc3RhbGwgdGhlIG9yaWdpbmFsIHNpZ25hbCBoYW5kbGVycwotCXNpZ2FjdGlvbihTSUdJTlQsICZpbnRBY3Rpb24sIE5VTEwpOwotCXNpZ2FjdGlvbihTSUdRVUlULCAmcXVpdEFjdGlvbiwgTlVMTCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgbG9nX2hhbmRsZXIoY29uc3QgZ2NoYXIqIGRvbWFpbiwgR0xvZ0xldmVsRmxhZ3MgZmxhZ3MsCWNvbnN0IGdjaGFyKiBtc2csIGdwb2ludGVyIGRhdGEpIHsKLQkvKiBub3RoaW5nICovCi19Ci0KLS8qIENyZWF0ZSBhICJTV1RfV2luZG93XyIgKyBBUFBfTkFNRSBzdHJpbmcgd2l0aCBvcHRpb25hbCBzdWZmaXguCi0gKiBDYWxsZXIgc2hvdWxkIGZyZWUgdGhlIG1lbW9yeSB3aGVuIGZpbmlzaGVkICovCi1zdGF0aWMgY2hhciAqIGNyZWF0ZVNXVFdpbmRvd1N0cmluZyhjaGFyICogc3VmZml4LCBpbnQgc2VtYXBob3JlKSB7Ci0jaWZkZWYgU09MQVJJUwotCS8qIHNvbGFyaXMgcmVxdWlyZXMgc2VtYXBob3JlIG5hbWVzIHRvIHN0YXJ0IHdpdGggJy8nICovCi0JY2hhciAqIHByZWZpeCA9IHNlbWFwaG9yZSAhPSAwID8gX1RfRUNMSVBTRSgiL1NXVF9XaW5kb3dfIikgOiBfVF9FQ0xJUFNFKCJTV1RfV2luZG93XyIpOwotI2Vsc2UKLQljaGFyICogcHJlZml4ID0gX1RfRUNMSVBTRSgiU1dUX1dpbmRvd18iKTsKLSNlbmRpZgotCQotCWNoYXIgKiByZXN1bHQgPSBtYWxsb2MoKF90Y3NsZW4ocHJlZml4KSArIF90Y3NsZW4oZ2V0T2ZmaWNpYWxOYW1lKCkpICsgKHN1ZmZpeCAhPSBOVUxMID8gX3Rjc2xlbihzdWZmaXgpIDogMCkgKyAxKSAqIHNpemVvZihjaGFyKSk7Ci0JaWYgKHN1ZmZpeCAhPSBOVUxMKQotCQlfc3RwcmludGYocmVzdWx0LCBfVF9FQ0xJUFNFKCIlcyVzJXMiKSwgcHJlZml4LCBnZXRPZmZpY2lhbE5hbWUoKSwgc3VmZml4KTsKLQllbHNlCi0JCV9zdHByaW50ZihyZXN1bHQsIF9UX0VDTElQU0UoIiVzJXMiKSwgcHJlZml4LCBnZXRPZmZpY2lhbE5hbWUoKSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBzZXRBcHBXaW5kb3dQcm9wZXJ0eUZuKCkgewotCVdpbmRvdyBhcHBXaW5kb3c7Ci0JQXRvbSBwcm9wQXRvbTsKLQlfVENIQVIgKnByb3BWYWw7Ci0KLQkvL0xvb2sgZm9yIHRoZSBTV1Qgd2luZG93LiBJZiBpdCdzIHRoZXJlLCBzZXQgYSBwcm9wZXJ0eSBvbiBpdC4KLQlhcHBXaW5kb3cgPSBndGsuWEdldFNlbGVjdGlvbk93bmVyKGd0a19HREtfRElTUExBWSwgYXBwV2luZG93QXRvbSk7Ci0JaWYgKGFwcFdpbmRvdykgewotCQlwcm9wQXRvbSA9IGd0ay5YSW50ZXJuQXRvbShndGtfR0RLX0RJU1BMQVksICJvcmcuZWNsaXBzZS5zd3QuZmlsZVBhdGgubWVzc2FnZSIsIEZBTFNFKTsKLQkJLy9hcHBlbmQgYSBjb2xvbiBkZWxpbWl0ZXIgaW4gY2FzZSBtb3JlIHRoYW4gb25lIGZpbGUgZ2V0cyBhcHBlbmRlZCB0byB0aGUgYXBwIHdpbmRvd3MgcHJvcGVydHkuCi0JCXByb3BWYWwgPSBjb25jYXRQYXRocyhvcGVuRmlsZVBhdGgsIF9UX0VDTElQU0UoJzonKSk7Ci0JCWd0ay5YQ2hhbmdlUHJvcGVydHkoZ3RrX0dES19ESVNQTEFZLCBhcHBXaW5kb3csIHByb3BBdG9tLCBwcm9wQXRvbSwgOCwgUHJvcE1vZGVBcHBlbmQsICh1bnNpZ25lZCBjaGFyICopcHJvcFZhbCwgX3Rjc2xlbihwcm9wVmFsKSk7Ci0JCWZyZWUocHJvcFZhbCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogc2V0IHRoZSBBcHBsaWNhdGlvbiB3aW5kb3cgcHJvcGVydHkgYnkgZXhlY3V0aW5nIF9zZXRXaW5kb3dQcm9wZXJ0eUZuIHdpdGhpbiBhIHNlbWFwaG9yZSAqLwotaW50IHNldEFwcFdpbmRvd1Byb3BlcnR5KCkgewotCWludCByZXN1bHQ7Ci0JY2hhciAqIG11dGV4TmFtZSA9IGNyZWF0ZVNXVFdpbmRvd1N0cmluZyhOVUxMLCAxKTsKLQlyZXN1bHQgPSBleGVjdXRlV2l0aExvY2sobXV0ZXhOYW1lLCBzZXRBcHBXaW5kb3dQcm9wZXJ0eUZuKTsKLQlndGsuWFN5bmMoZ3RrX0dES19ESVNQTEFZLCBGYWxzZSk7Ci0JZnJlZShtdXRleE5hbWUpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgc2V0QXBwV2luZG93UHJvcGVydHkgKi8KLXN0YXRpYyBnYm9vbGVhbiBzZXRBcHBXaW5kb3dUaW1lclByb2MoZ3BvaW50ZXIgZGF0YSkgewotCS8vdHJ5IHRvIHNldCB0aGUgYXBwIHdpbmRvdyBwcm9wZXJ0eS4gSWYgdW5zdWNjZXNzZnVsIHJldHVybiB0cnVlIHRvIHJlc2NoZWR1bGUgdGhlIHRpbWVyLgotCW9wZW5GaWxlVGltZW91dC0tOwotCXJldHVybiAhc2V0QXBwV2luZG93UHJvcGVydHkoKSAmJiBvcGVuRmlsZVRpbWVvdXQgPiAwOwotfQotCi1pbnQgY3JlYXRlTGF1bmNoZXJXaW5kb3coKSB7Ci0JV2luZG93IHdpbmRvdywgbGF1bmNoZXJXaW5kb3c7Ci0JLy9jaGVjayBpZiBhIGxhdW5jaGVyIHdpbmRvdyBleGlzdHMuIElmIG5vbmUgZXhpc3RzLCB3ZSBrbm93IHdlIGFyZSB0aGUgZmlyc3QgYW5kIHdlIHNob3VsZCBiZSBsYXVuY2hpbmcgdGhlIGFwcC4KLQl3aW5kb3cgPSBndGsuWEdldFNlbGVjdGlvbk93bmVyKGd0a19HREtfRElTUExBWSwgbGF1bmNoZXJXaW5kb3dBdG9tKTsKLQlpZiAod2luZG93ID09IDApIHsKLQkJLy9jcmVhdGUgYSBsYXVuY2hlciB3aW5kb3cgdGhhdCBvdGhlciBwcm9jZXNzZXMgY2FuIGZpbmQuCi0JCWxhdW5jaGVyV2luZG93ID0gZ3RrLlhDcmVhdGVXaW5kb3coZ3RrX0dES19ESVNQTEFZLCBndGsuWFJvb3RXaW5kb3coZ3RrX0dES19ESVNQTEFZLCBndGsuWERlZmF1bHRTY3JlZW4oZ3RrX0dES19ESVNQTEFZKSksIC0xMCwgLTEwLCAxLAotCQkJCTEsIDAsIDAsIElucHV0T25seSwgQ29weUZyb21QYXJlbnQsICh1bnNpZ25lZCBsb25nKSAwLCAoWFNldFdpbmRvd0F0dHJpYnV0ZXMgKikgTlVMTCk7Ci0JCS8vZm9yIHNvbWUgcmVhc29uIFNldCBhbmQgR2V0IGFyZSBib3RoIG5lY2Vzc2FyeS4gU2V0IGFsb25lIGRvZXMgbm90aGluZy4KLQkJZ3RrLlhTZXRTZWxlY3Rpb25Pd25lcihndGtfR0RLX0RJU1BMQVksIGxhdW5jaGVyV2luZG93QXRvbSwgbGF1bmNoZXJXaW5kb3csIEN1cnJlbnRUaW1lKTsKLQkJZ3RrLlhHZXRTZWxlY3Rpb25Pd25lcihndGtfR0RLX0RJU1BMQVksIGxhdW5jaGVyV2luZG93QXRvbSk7Ci0JCS8vYWRkIGEgdGltZW91dCB0byBzZXQgdGhlIHByb3BlcnR5IG9uIHRoZSBhcHBzIHdpbmRvdyBvbmNlIHRoZSBhcHAgaXMgbGF1bmNoZWQuCi0JCWd0ay5nX3RpbWVvdXRfYWRkKDEwMDAsIHNldEFwcFdpbmRvd1RpbWVyUHJvYywgMCk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotaW50IHJldXNlV29ya2JlbmNoKF9UQ0hBUioqIGZpbGVQYXRoLCBpbnQgdGltZW91dCkgewotCWNoYXIgKmFwcE5hbWUsICpsYXVuY2hlck5hbWU7Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlpZiAoaW5pdFdpbmRvd1N5c3RlbSgmaW5pdGlhbEFyZ2MsIGluaXRpYWxBcmd2LCAxKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0KLQlvcGVuRmlsZVRpbWVvdXQgPSB0aW1lb3V0OwotCW9wZW5GaWxlUGF0aCA9IGZpbGVQYXRoOwotCQotCS8vQXBwIG5hbWUgaXMgZGVmaW5lZCBpbiBTV1QgYXMgd2VsbC4gVmFsdWVzIG11c3QgYmUgY29uc2lzdGVudC4KLQlhcHBOYW1lID0gY3JlYXRlU1dUV2luZG93U3RyaW5nKE5VTEwsIDApOwotCWFwcFdpbmRvd0F0b20gPSBndGsuWEludGVybkF0b20oZ3RrX0dES19ESVNQTEFZLCBhcHBOYW1lLCBGQUxTRSk7Ci0JZnJlZShhcHBOYW1lKTsKLQotCS8vY2hlY2sgaWYgYXBwIGlzIGFscmVhZHkgcnVubmluZy4gSnVzdCBzZXQgcHJvcGVydHkgaWYgaXQgaXMuCi0JaWYgKHNldEFwcFdpbmRvd1Byb3BlcnR5KCkgPiAwKQotCQlyZXR1cm4gMTsKLQotCS8qIGFwcCBpcyBub3QgcnVubmluZywgY3JlYXRlIGEgbGF1bmNoZXIgd2luZG93IHRvIGFjdCBhcyBhIG11dGV4IHNvIHdlIGRvbid0IG5lZWQgdG8ga2VlcCB0aGUgc2VtYXBob3JlIGxvY2tlZCAqLwotCWxhdW5jaGVyTmFtZSA9IGNyZWF0ZVNXVFdpbmRvd1N0cmluZyhfVF9FQ0xJUFNFKCJfTGF1bmNoZXIiKSwgMSk7Ci0JbGF1bmNoZXJXaW5kb3dBdG9tID0gZ3RrLlhJbnRlcm5BdG9tKGd0a19HREtfRElTUExBWSwgbGF1bmNoZXJOYW1lLCBGQUxTRSk7Ci0JcmVzdWx0ID0gZXhlY3V0ZVdpdGhMb2NrKGxhdW5jaGVyTmFtZSwgY3JlYXRlTGF1bmNoZXJXaW5kb3cpOwotCWZyZWUobGF1bmNoZXJOYW1lKTsKLQotCWlmIChyZXN1bHQgPT0gMSkgewotCQkvL1RoZSBhcHAgaXMgYWxyZWFkeSBiZWluZyBsYXVuY2hlZCBpbiBhbm90aGVyIHByb2Nlc3MuICBTZXQgdGhlIHByb3BlcnR5IG9uIHRoYXQgYXBwIHdpbmRvdyBhbmQgZXhpdAotCQl3aGlsZSAob3BlbkZpbGVUaW1lb3V0ID4gMCkgewotCQkJaWYgKHNldEFwcFdpbmRvd1Byb3BlcnR5KCkgPiAwKQotCQkJCXJldHVybiAxOyAvL3N1Y2Nlc3MKLQkJCWVsc2UgewotCQkJCW9wZW5GaWxlVGltZW91dC0tOwotCQkJCXNsZWVwKDEpOwotCQkJfQotCQl9Ci0JCS8vdGltZWQgb3V0IHRyeWluZyB0byBzZXQgdGhlIGFwcCBwcm9wZXJ0eQotCQlyZXN1bHQgPSAwOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKiBDcmVhdGUgYW5kIERpc3BsYXkgdGhlIFNwbGFzaCBXaW5kb3cgKi8KLWludCBzaG93U3BsYXNoKCBjb25zdCBjaGFyKiBmZWF0dXJlSW1hZ2UgKQotewotCUd0a0FkanVzdG1lbnQqIHZhZGosICpoYWRqOwotCWludCB3aWR0aCwgaGVpZ2h0OwotCWd1aW50IGhhbmRsZXJJZDsKLQlHdGtXaWRnZXQqIHZib3hIYW5kbGUsICogc2Nyb2xsZWRIYW5kbGUsICogaGFuZGxlOwotCi0JaWYgKHNwbGFzaEhhbmRsZSAhPSAwKQotCQlyZXR1cm4gMDsgLyogYWxyZWFkeSBzaG93aW5nIHNwbGFzaCAqLwotCWlmIChmZWF0dXJlSW1hZ2UgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCQotCWlmIChpbml0aWFsQXJndiA9PSBOVUxMKQotCQlpbml0aWFsQXJnYyA9IDA7Ci0JCi0JaWYoIGluaXRXaW5kb3dTeXN0ZW0oJmluaXRpYWxBcmdjLCBpbml0aWFsQXJndiwgMSkgIT0gMCkKLQkJcmV0dXJuIC0xOwotCQotCXNoZWxsSGFuZGxlID0gZ3RrLmd0a193aW5kb3dfbmV3KEdUS19XSU5ET1dfVE9QTEVWRUwpOwotCWd0ay5ndGtfd2luZG93X3NldF9kZWNvcmF0ZWQoKEd0a1dpbmRvdyopKHNoZWxsSGFuZGxlKSwgRkFMU0UpOwotCWd0ay5ndGtfc2lnbmFsX2Nvbm5lY3QoKEd0a09iamVjdCopc2hlbGxIYW5kbGUsICJkZXN0cm95IiwgKEd0a1NpZ25hbEZ1bmMpKGd0ay5ndGtfd2lkZ2V0X2Rlc3Ryb3llZCksICZzaGVsbEhhbmRsZSk7Ci0JdmJveEhhbmRsZSA9IGd0ay5ndGtfdmJveF9uZXcoRkFMU0UsIDApOwotCWlmKHZib3hIYW5kbGUgPT0gMCkKLQkJcmV0dXJuIC0xOwotCQkKLQl2YWRqID0gKEd0a0FkanVzdG1lbnQqKWd0ay5ndGtfYWRqdXN0bWVudF9uZXcoMCwgMCwgMTAwLCAxLCAxMCwgMTApOwotCWhhZGogPSAoR3RrQWRqdXN0bWVudCopZ3RrLmd0a19hZGp1c3RtZW50X25ldygwLCAwLCAxMDAsIDEsIDEwLCAxMCk7Ci0JaWYgKHZhZGogPT0gMCB8fCBoYWRqID09IDApIAotCQlyZXR1cm4gLTE7Ci0JCQotCXNjcm9sbGVkSGFuZGxlID0gZ3RrLmd0a19zY3JvbGxlZF93aW5kb3dfbmV3KGhhZGosIHZhZGopOwotCQotCWd0ay5ndGtfY29udGFpbmVyX2FkZCgoR3RrQ29udGFpbmVyKikodmJveEhhbmRsZSksIHNjcm9sbGVkSGFuZGxlKTsKLQlndGsuZ3RrX2JveF9zZXRfY2hpbGRfcGFja2luZygoR3RrQm94KikodmJveEhhbmRsZSksIHNjcm9sbGVkSGFuZGxlLCBUUlVFLCBUUlVFLCAwLCBHVEtfUEFDS19FTkQpOwotCWd0ay5ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wb2xpY3koKEd0a1Njcm9sbGVkV2luZG93Kikoc2Nyb2xsZWRIYW5kbGUpLCBHVEtfUE9MSUNZX05FVkVSLCBHVEtfUE9MSUNZX05FVkVSKTsKLQotCWhhbmRsZSA9IGd0ay5ndGtfZml4ZWRfbmV3KCk7Ci0JZ3RrLmd0a19maXhlZF9zZXRfaGFzX3dpbmRvdygoR3RrRml4ZWQqKShoYW5kbGUpLCBUUlVFKTsKLQkoKEd0a09iamVjdCopaGFuZGxlKS0+ZmxhZ3MgfD0gR1RLX0NBTl9GT0NVUzsJLypHVEtfV0lER0VUX1NFVF9GTEFHUyhoYW5kbGUsIEdUS19DQU5fRk9DVVMpOyovCi0JCi0JLyogYXZvaWQgZ3RrX3Njcm9sbGVkX3dpbmRvd19hZGQgd2FybmluZyAqLwotCWhhbmRsZXJJZCA9IGd0ay5nX2xvZ19zZXRfaGFuZGxlcigiR3RrIiwgR19MT0dfTEVWRUxfV0FSTklORywgJmxvZ19oYW5kbGVyLCBOVUxMKTsKLQlndGsuZ3RrX2NvbnRhaW5lcl9hZGQoKEd0a0NvbnRhaW5lciopKHNjcm9sbGVkSGFuZGxlKSwgaGFuZGxlKTsKLQlndGsuZ19sb2dfcmVtb3ZlX2hhbmRsZXIoIkd0ayIsIGhhbmRsZXJJZCk7Ci0JCi0JZ3RrLmd0a19jb250YWluZXJfYWRkKChHdGtDb250YWluZXIqKShzaGVsbEhhbmRsZSksIHZib3hIYW5kbGUpOwotCQotCXBpeGJ1ZiA9IGd0ay5nZGtfcGl4YnVmX25ld19mcm9tX2ZpbGUoZmVhdHVyZUltYWdlLCBOVUxMKTsKLQlpbWFnZSA9IGd0ay5ndGtfaW1hZ2VfbmV3X2Zyb21fcGl4YnVmKHBpeGJ1Zik7Ci0JZ3RrLmd0a19zaWduYWxfY29ubmVjdCgoR3RrT2JqZWN0KikoaW1hZ2UpLCAiZGVzdHJveSIsIChHdGtTaWduYWxGdW5jKShndGsuZ3RrX3dpZGdldF9kZXN0cm95ZWQpLCAmaW1hZ2UpOwotCWd0ay5ndGtfY29udGFpbmVyX2FkZCgoR3RrQ29udGFpbmVyKikoaGFuZGxlKSwgaW1hZ2UpOwotCQotCXdpZHRoICA9IGd0ay5nZGtfcGl4YnVmX2dldF93aWR0aChwaXhidWYpOwotCWhlaWdodCA9IGd0ay5nZGtfcGl4YnVmX2dldF9oZWlnaHQocGl4YnVmKTsKLQlndGsuZ3RrX3dpbmRvd19zZXRfcG9zaXRpb24oKEd0a1dpbmRvdyopKHNoZWxsSGFuZGxlKSwgR1RLX1dJTl9QT1NfQ0VOVEVSKTsKLQlpZiAoZ2V0T2ZmaWNpYWxOYW1lKCkgIT0gTlVMTCkKLQkJZ3RrLmd0a193aW5kb3dfc2V0X3RpdGxlKChHdGtXaW5kb3cqKShzaGVsbEhhbmRsZSksIGdldE9mZmljaWFsTmFtZSgpKTsKLQlndGsuZ3RrX3dpbmRvd19yZXNpemUoKEd0a1dpbmRvdyopKHNoZWxsSGFuZGxlKSwgd2lkdGgsIGhlaWdodCk7Ci0JZ3RrLmd0a193aWRnZXRfc2hvd19hbGwoKEd0a1dpZGdldCopKHNoZWxsSGFuZGxlKSk7Ci0Jc3BsYXNoSGFuZGxlID0gKGxvbmcpc2hlbGxIYW5kbGU7Ci0JZGlzcGF0Y2hNZXNzYWdlcygpOwotCXJldHVybiAwOwotfQotCi12b2lkIGRpc3BhdGNoTWVzc2FnZXMoKSB7Ci0JaWYgKGd0ay5nX21haW5fY29udGV4dF9pdGVyYXRpb24gIT0gMCkKLQkJd2hpbGUoZ3RrLmdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbigwLDApICE9IDApIHt9Ci19Ci0KLWpsb25nIGdldFNwbGFzaEhhbmRsZSgpIHsKLQlyZXR1cm4gc3BsYXNoSGFuZGxlOwotfQotCi12b2lkIHRha2VEb3duU3BsYXNoKCkgewotCWlmKHNoZWxsSGFuZGxlICE9IDApIHsKLQkJZ3RrLmd0a193aWRnZXRfZGVzdHJveShzaGVsbEhhbmRsZSk7Ci0JCWlmIChpbWFnZSAhPSBOVUxMKSB7Ci0JCQlndGsuZ3RrX3dpZGdldF9kZXN0cm95KGltYWdlKTsKLQkJCWd0ay5nX29iamVjdF91bnJlZihwaXhidWYpOwotCQl9Ci0JCWRpc3BhdGNoTWVzc2FnZXMoKTsKLQkJc3BsYXNoSGFuZGxlID0gMDsKLQkJc2hlbGxIYW5kbGUgPSBOVUxMOwotCX0KLX0KLQotLyogR2V0IHRoZSB3aW5kb3cgc3lzdGVtIHNwZWNpZmljIFZNIGFyZ3VtZW50cyAqLwotY2hhcioqIGdldEFyZ1ZNKCBjaGFyKiB2bSApIAotewotICAgIGNoYXIqKiByZXN1bHQ7Ci0KLS8qICAgIGlmIChpc0o5Vk0oIHZtICkpIAotICAgICAgICByZXR1cm4gYXJnVk1fSjk7Ki8KLSAgICAKLSAgICAvKiBVc2UgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGZvciBhIHN0YW5kYXJkIEphdmEgVk0gKi8KLSAgICByZXN1bHQgPSBhcmdWTV9KQVZBOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUphdmFSZXN1bHRzKiBsYXVuY2hKYXZhVk0oIGNoYXIqIGFyZ3NbXSApCi17Ci0JSmF2YVJlc3VsdHMqIGp2bVJlc3VsdHMgPSBOVUxMOwotICAJcGlkX3QgICBqdm1Qcm9jZXNzOwotICAJaW50ICAgICBleGl0Q29kZTsKLSAgCQotI2lmZGVmIE1PWklMTEFfRklYCi0JZml4RW52Rm9yTW96aWxsYSgpOwotI2VuZGlmIC8qIE1PWklMTEFfRklYICovCi0JCi0JanZtUHJvY2VzcyA9IGZvcmsoKTsKLSAgCWlmIChqdm1Qcm9jZXNzID09IDApIAotICAgIHsKLSAgICAJLyogQ2hpbGQgcHJvY2VzcyAuLi4gc3RhcnQgdGhlIEpWTSAqLwotICAgICAgCWV4ZWN2KGFyZ3NbMF0sIGFyZ3MpOwotCi0gICAgICAJLyogVGhlIEpWTSB3b3VsZCBub3Qgc3RhcnQgLi4uIHJldHVybiBlcnJvciBjb2RlIHRvIHBhcmVudCBwcm9jZXNzLiAqLwotICAgICAgCS8qIFRPRE8sIGhvdyB0byBkaXN0aW5ndWlzaCB0aGlzIGFzIGEgbGF1bmNoIHByb2JsZW0gdG8gdGhlIG90aGVyIHByb2Nlc3M/ICovCi0gICAgICAJX2V4aXQoZXJybm8pOwotICAgIH0KLQotICAJanZtUmVzdWx0cyA9IG1hbGxvYyhzaXplb2YoSmF2YVJlc3VsdHMpKTsKLSAgCW1lbXNldChqdm1SZXN1bHRzLCAwLCBzaXplb2YoSmF2YVJlc3VsdHMpKTsKLSAgCQotCS8qIElmIHRoZSBKVk0gaXMgc3RpbGwgcnVubmluZywgd2FpdCBmb3IgaXQgdG8gdGVybWluYXRlLiAqLwotCWlmIChqdm1Qcm9jZXNzICE9IDApCi0JewotCQl3YWl0cGlkKGp2bVByb2Nlc3MsICZleGl0Q29kZSwgMCk7Ci0gICAgICAJaWYgKFdJRkVYSVRFRChleGl0Q29kZSkpCi0gICAgICAJCS8qIFRPRE8sIHRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIHJ1blJlc3VsdCBpZiB3ZSBjb3VsZCBkaXN0aW5ndWlzaCB0aGUgbGF1bmNoIHByb2JsZW0gYWJvdmUgKi8KLQkJCWp2bVJlc3VsdHMtPmxhdW5jaFJlc3VsdCA9IFdFWElUU1RBVFVTKGV4aXRDb2RlKTsKLSAgICB9Ci0KLQlyZXR1cm4ganZtUmVzdWx0czsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL2VjbGlwc2VHdGsuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL2VjbGlwc2VHdGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmZjdmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2d0ay9lY2xpcHNlR3RrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBFQ0xJUFNFX0dUS19ICi0jZGVmaW5lIEVDTElQU0VfR1RLX0gKLQotI2luY2x1ZGUgPGd0ay9ndGsuaD4KLSNpbmNsdWRlIDxnZGstcGl4YnVmL2dkay1waXhidWYuaD4KLSNpbmNsdWRlIDxnZGsvZ2RreC5oPgotCi1zdHJ1Y3QgR1RLX1BUUlMgeyAKLQlzaG9ydCBub3RfaW5pdGlhbGl6ZWQ7Ci0JR3RrT2JqZWN0KgkoKmd0a19hZGp1c3RtZW50X25ldykJCShnZG91YmxlLCBnZG91YmxlLCBnZG91YmxlLCBnZG91YmxlLCBnZG91YmxlLCBnZG91YmxlKTsKLQl2b2lkCQkoKmd0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmcpKEd0a0JveCosIEd0a1dpZGdldCosIGdib29sZWFuLCBnYm9vbGVhbiwgZ3VpbnQsIEd0a1BhY2tUeXBlKTsKLQl2b2lkCQkoKmd0a19jb250YWluZXJfYWRkKQkJKEd0a0NvbnRhaW5lciosIEd0a1dpZGdldCopOwotCWdpbnQJCSgqZ3RrX2RpYWxvZ19ydW4pCQkJKEd0a0RpYWxvZyAqKTsKLQlHdGtXaWRnZXQqCSgqZ3RrX2ZpeGVkX25ldykJCQkoKTsKLQl2b2lkCQkoKmd0a19maXhlZF9zZXRfaGFzX3dpbmRvdykJKEd0a0ZpeGVkICosIGdib29sZWFuKTsKLQlHdGtXaWRnZXQqCSgqZ3RrX2ltYWdlX25ld19mcm9tX3BpeGJ1ZikoR2RrUGl4YnVmKik7Ci0JZ2Jvb2xlYW4JKCpndGtfaW5pdF9jaGVjaykJCQkoaW50KiwgY2hhcioqKik7Ci0JR3RrV2lkZ2V0KgkoKmd0a19tZXNzYWdlX2RpYWxvZ19uZXcpCShHdGtXaW5kb3cqLCBHdGtEaWFsb2dGbGFncywgR3RrTWVzc2FnZVR5cGUsIEd0a0J1dHRvbnNUeXBlLCBjb25zdCBnY2hhciosIC4uLik7Ci0Jdm9pZAkJKCpndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wb2xpY3kpKEd0a1Njcm9sbGVkV2luZG93KiwgR3RrUG9saWN5VHlwZSwgR3RrUG9saWN5VHlwZSk7Ci0JR3RrV2lkZ2V0KgkoKmd0a19zY3JvbGxlZF93aW5kb3dfbmV3KQkoR3RrQWRqdXN0bWVudCosIEd0a0FkanVzdG1lbnQqKTsKLQlnY2hhcioJCSgqZ3RrX3NldF9sb2NhbGUpCQkJKCk7Ci0JZ3Vsb25nIAkJKCpndGtfc2lnbmFsX2Nvbm5lY3RfZnVsbCkJKEd0a09iamVjdCosIGNvbnN0IGdjaGFyKiwgR3RrU2lnbmFsRnVuYywgR3RrQ2FsbGJhY2tNYXJzaGFsLCBncG9pbnRlciwgR3RrRGVzdHJveU5vdGlmeSwgZ2ludCwgZ2ludCk7Ci0JR3RrV2lkZ2V0KgkoKmd0a192Ym94X25ldykJCQkJKGdib29sZWFuLCBnaW50KTsKLQl2b2lkCQkoKmd0a193aWRnZXRfZGVzdHJveSkJCShHdGtXaWRnZXQqKTsKLQl2b2lkCQkoKmd0a193aWRnZXRfZGVzdHJveWVkKQkJKEd0a1dpZGdldCosIEd0a1dpZGdldCoqKTsKLQl2b2lkCQkoKmd0a193aWRnZXRfc2hvd19hbGwpCQkoR3RrV2lkZ2V0Kik7Ci0JR3RrV2lkZ2V0KgkoKmd0a193aW5kb3dfbmV3KQkJCShHdGtXaW5kb3dUeXBlKTsKLQl2b2lkCQkoKmd0a193aW5kb3dfcmVzaXplKQkJKEd0a1dpbmRvdyosIGdpbnQsIGdpbnQpOwotCXZvaWQJCSgqZ3RrX3dpbmRvd19zZXRfdGl0bGUpCQkoR3RrV2luZG93KiwgY29uc3QgZ2NoYXIqKTsKLQl2b2lkCQkoKmd0a193aW5kb3dfc2V0X2RlY29yYXRlZCkJKEd0a1dpbmRvdyosIGdib29sZWFuKTsKLQl2b2lkCQkoKmd0a193aW5kb3dfc2V0X3Bvc2l0aW9uKQkoR3RrV2luZG93KiwgR3RrV2luZG93UG9zaXRpb24pOwotCSBndWludAkJKCpnX2xvZ19zZXRfaGFuZGxlcikJCShjb25zdCBnY2hhciosIEdMb2dMZXZlbEZsYWdzLCBHTG9nRnVuYywgZ3BvaW50ZXIpOwotCXZvaWQJCSgqZ19sb2dfcmVtb3ZlX2hhbmRsZXIpCQkoY29uc3QgZ2NoYXIqLCBndWludCk7Ci0JZ2Jvb2xlYW4JKCpnX21haW5fY29udGV4dF9pdGVyYXRpb24pCShHTWFpbkNvbnRleHQqLCBnYm9vbGVhbik7Ci0Jdm9pZAkJKCpnX29iamVjdF91bnJlZikJCQkoZ3BvaW50ZXIpOwotCUdPYmplY3QqCSgqZ19vYmplY3RfbmV3KQkJCQkoR1R5cGUsIGNvbnN0IGdjaGFyKiwgLi4uKTsKLQlndWludCAgICAgICAoKmdfdGltZW91dF9hZGQpCQkJKGd1aW50LCBHU291cmNlRnVuYywgZ3BvaW50ZXIpOwotCi0jaWZkZWYgU09MQVJJUwotCUdTdHJpbmcqIAkoKmdfc3RyaW5nX2luc2VydF9jKSAJCShHU3RyaW5nICosIGdzc2l6ZSwgZ2NoYXIpOwotI2VuZGlmCQotCQkKLQlHZGtQaXhidWYqCSgqZ2RrX3BpeGJ1Zl9uZXdfZnJvbV9maWxlKQkoY29uc3QgY2hhciosIEdFcnJvciAqKik7Ci0JaW50CQkJKCpnZGtfcGl4YnVmX2dldF93aWR0aCkJCShjb25zdCBHZGtQaXhidWYqKTsKLQlpbnQJCQkoKmdka19waXhidWZfZ2V0X2hlaWdodCkJKGNvbnN0IEdka1BpeGJ1ZiopOwotCXZvaWQJCSgqZ2RrX3NldF9wcm9ncmFtX2NsYXNzKQkoY29uc3QgY2hhciopOwotCQotCVdpbmRvdyAJCSgqWEdldFNlbGVjdGlvbk93bmVyKQkJKERpc3BsYXkqLCBBdG9tKTsKLQl2b2lkCQkoKlhTZXRTZWxlY3Rpb25Pd25lcikJCShEaXNwbGF5KiwgQXRvbSwgV2luZG93LCBUaW1lKTsKLQl2b2lkIAkJKCpYQ2hhbmdlUHJvcGVydHkpCQkJKERpc3BsYXkqLCBXaW5kb3csIEF0b20sIEF0b20sIGludCwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci0JV2luZG93IAkJKCpYQ3JlYXRlV2luZG93KQkJCShEaXNwbGF5KiwgV2luZG93LCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50LCB1bnNpZ25lZCBpbnQsIFZpc3VhbCosIHVuc2lnbmVkIGxvbmcsIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKik7Ci0Jdm9pZAkJKCpYU3luYykJCQkJCShEaXNwbGF5KiwgQm9vbCk7Ci0JaW50CQkJKCpYRGVmYXVsdFNjcmVlbikJCQkoRGlzcGxheSopOwotCVdpbmRvdwkJKCpYUm9vdFdpbmRvdykJCQkJKERpc3BsYXkqLCBpbnQpOwotCUF0b20gCQkJKCpYSW50ZXJuQXRvbSkJCQkJCShEaXNwbGF5KiwgX1hjb25zdCBjaGFyKiwgQm9vbAkpOwotCURpc3BsYXkgICAgICAgICAgKipnZGtfZGlzcGxheTsKLX07Ci0KLSNkZWZpbmUgZ3RrX0dES19ESVNQTEFZICooZ3RrLmdka19kaXNwbGF5KQotZXh0ZXJuIHN0cnVjdCBHVEtfUFRSUyBndGs7Ci0KLSNkZWZpbmUgRk5fVEFCTEVfRU5UUlkoZm4pIHsgKHZvaWQqKikmIGd0ay5mbiwgI2ZuIH0gCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9pZCAqKiBmblB0cjsKLQljaGFyICogZm5OYW1lOwotfSBGTl9UQUJMRTsKLQotLyogbG9hZCB0aGUgZ3RrIGxpYnJhcmllcyBhbmQgaW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLWV4dGVybiBpbnQgbG9hZEd0aygpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL2VjbGlwc2VHdGtDb21tb24uYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL2VjbGlwc2VHdGtDb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlY2ExMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2d0ay9lY2xpcHNlR3RrQ29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQW5kcmV3IE5pZWZlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAiZWNsaXBzZUNvbW1vbi5oIgotI2luY2x1ZGUgImVjbGlwc2VPUy5oIgotI2luY2x1ZGUgImVjbGlwc2VHdGsuaCIKLQotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBFQ0xJUFNFX0lDT04gIDQwMQotCi1jaGFyICAgZGlyU2VwYXJhdG9yICA9ICcvJzsKLWNoYXIgICBwYXRoU2VwYXJhdG9yID0gJzonOwotCi0vKiBEZWZpbmUgbG9jYWwgdmFyaWFibGVzIGZvciB0aGUgbWFpbiB3aW5kb3cuICovCi1zdGF0aWMgaW50ICAgICAgICAgIHNhdmVBcmdjICAgPSAwOwkJLyogYXJndW1lbnRzIGFmdGVyIHRoZXkgd2VyZSBwYXJzZWQsIGZvciB3aW5kb3cgc3lzdGVtICovCi1zdGF0aWMgY2hhcioqICAgICAgIHNhdmVBcmd2ICAgPSAwOwotCi1nYm9vbGVhbiAgICAgZ3RrSW5pdGlhbGl6ZWQgPSBGQUxTRTsKLQotI2lmZGVmIFNPTEFSSVMKLS8qIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIGFwcGVhcnMgaW5saW5lIGluIGdsaWIvZ3N0cmluZy5oIG9uIFNvbGFyaXMsCi0gICBzbyBwcm92aWRlIGEgZGVmaW5pdGlvbiBoZXJlIGFuZCBob29rIGl0IHVwCi0gICAqLwotR1N0cmluZyogZ19zdHJpbmdfaW5zZXJ0X2MgKEdTdHJpbmcgKnN0cmluZywgZ3NzaXplIHBvcywgZ2NoYXIgYykgewotCS8qIHNlZSBidWcgMjY0NjE1LCB3ZSBjYW4gZ2V0IGhlcmUgd2l0aG91dCBoYXZpbmcgaW5pdGlhbGl6ZWQgdGhlIGd0ayBwb2ludGVycyAqLwotCWlmIChndGsubm90X2luaXRpYWxpemVkKQotCQlsb2FkR3RrKCk7Ci0JcmV0dXJuIGd0ay5nX3N0cmluZ19pbnNlcnRfYyhzdHJpbmcsIHBvcywgYyk7Ci19Ci0jZW5kaWYKLQotLyogRGlzcGxheSBhIE1lc3NhZ2UgKi8KLXZvaWQgZGlzcGxheU1lc3NhZ2UoY2hhciogdGl0bGUsIGNoYXIqIG1lc3NhZ2UpCi17Ci0JR3RrV2lkZ2V0KiBkaWFsb2c7Ci0JCi0gICAgLyogSWYgR1RLIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQsIGRvIGl0IG5vdy4gKi8KLSAgICBpZiAoaW5pdFdpbmRvd1N5c3RlbSggJnNhdmVBcmdjLCBzYXZlQXJndiwgMSApICE9IDApCi0gICAgCXJldHVybjsKLQotICAJZGlhbG9nID0gZ3RrLmd0a19tZXNzYWdlX2RpYWxvZ19uZXcoTlVMTCwgR1RLX0RJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5ULAotCQkJCSAgIAkJCQkJR1RLX01FU1NBR0VfRVJST1IsIEdUS19CVVRUT05TX0NMT1NFLAotCQkJCSAgIAkJCQkJIiVzIiwgbWVzc2FnZSk7Ci0gIAlndGsuZ3RrX3dpbmRvd19zZXRfdGl0bGUoKEd0a1dpbmRvdyopZGlhbG9nLCB0aXRsZSk7Ci0gIAlndGsuZ3RrX2RpYWxvZ19ydW4oKEd0a0RpYWxvZyopZGlhbG9nKTsKLSAgCWd0ay5ndGtfd2lkZ2V0X2Rlc3Ryb3koZGlhbG9nKTsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgV2luZG93IFN5c3RlbSAqLwotaW50IGluaXRXaW5kb3dTeXN0ZW0oaW50KiBwQXJnYywgY2hhciogYXJndltdLCBpbnQgc2hvd1NwbGFzaCkKLXsKLQlpbnQgZGVmYXVsdEFyZ2MgPSAxOwotCWNoYXIgKiBkZWZhdWx0QXJndiBbXSA9IHsgIiIsIDAgfTsKLQkKLSAgICBpZihndGtJbml0aWFsaXplZCkKLSAgICAJcmV0dXJuIDA7Ci0gICAgCi0gICAgLyogbG9hZCB0aGUgR1RLIGxpYnJhcmllcyBhbmQgaW5pdGlhbGl6ZSBmdW5jdGlvbiBwb2ludGVycyAqLwotICAgIGlmIChsb2FkR3RrKCkgIT0gMCkKLSAgICAJcmV0dXJuIC0xOwotICAgIAotICAgIGlmIChnZXRPZmZpY2lhbE5hbWUoKSAhPSBOVUxMKSAKLSAgICAJZGVmYXVsdEFyZ3ZbMF0gPSBnZXRPZmZpY2lhbE5hbWUoKTsKLSAgICAKLQlpZiAoYXJndiA9PSBOVUxMKSB7Ci0JCS8qIGd0a19pbml0X2NoZWNrIG9uIFNvbGFyaXMgOSBkb2Vzbid0IGxpa2UgTlVMTCBvciBlbXB0eSBhcmd2ICovCi0JCXBBcmdjID0gJmRlZmF1bHRBcmdjOwotCQlhcmd2ID0gZGVmYXVsdEFyZ3Y7Ci0JfQotCQotICAgIC8qIFNhdmUgdGhlIGFyZ3VtZW50cyBpbiBjYXNlIGRpc3BsYXlNZXNzYWdlKCkgaXMgY2FsbGVkIGluIHRoZSBtYWluIGxhdW5jaGVyLiAqLyAKLSAgICBpZiAoc2F2ZUFyZ3YgPT0gMCkKLSAgICB7Ci0gICAgCXNhdmVBcmdjID0gKnBBcmdjOwotICAgIAlzYXZlQXJndiA9ICBhcmd2OwotICAgIH0gIAotCi0JLyogSW5pdGlhbGl6ZSBHVEsuICovCi0gICAgZ3RrLmd0a19zZXRfbG9jYWxlKCk7Ci0gICAgZ3RrLmd0a19pbml0X2NoZWNrKHBBcmdjLCAmYXJndik7Ci0JLypfZ2RrX3NldF9wcm9ncmFtX2NsYXNzKGdldE9mZmljaWFsTmFtZSgpKTsqLwotCWd0a0luaXRpYWxpemVkID0gVFJVRTsKLQlyZXR1cm4gMDsKLX0KLQotLyogTG9hZCB0aGUgc3BlY2lmaWVkIHNoYXJlZCBsaWJyYXJ5Ci0gKi8KLXZvaWQgKiBsb2FkTGlicmFyeSggY2hhciAqIGxpYnJhcnkgKXsKLQl2b2lkICogcmVzdWx0PSBkbG9wZW4obGlicmFyeSwgUlRMRF9MQVpZKTsKLQlpZihyZXN1bHQgPT0gMCkgCi0JCXByaW50ZigiJXNcbiIsZGxlcnJvcigpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKiBVbmxvYWQgdGhlIHNoYXJlZCBsaWJyYXJ5Ci0gKi8KLXZvaWQgdW5sb2FkTGlicmFyeSggdm9pZCAqIGhhbmRsZSApewotCWRsY2xvc2UoaGFuZGxlKTsKLX0KLSAKLS8qIEZpbmQgdGhlIGdpdmVuIHN5bWJvbCBpbiB0aGUgc2hhcmVkIGxpYnJhcnkKLSAqLwotdm9pZCAqIGZpbmRTeW1ib2woIHZvaWQgKiBoYW5kbGUsIGNoYXIgKiBzeW1ib2wgKXsKLQlyZXR1cm4gZGxzeW0oaGFuZGxlLCBzeW1ib2wpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2d0ay9lY2xpcHNlR3RrSW5pdC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9ndGsvZWNsaXBzZUd0a0luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2MTczOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2d0ay9lY2xpcHNlR3RrSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJlY2xpcHNlR3RrLmgiCi0jaW5jbHVkZSAiZWNsaXBzZUNvbW1vbi5oIgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLXN0cnVjdCBHVEtfUFRSUyBndGsgPSB7IDEgfTsgLyogaW5pdGlhbGl6ZSB0aGUgZmlyc3QgZmllbGQgIm5vdF9pbml0aWFsaXplZCIgc28gd2UgY2FuIHRlbGwgd2hlbiB3ZSd2ZSBsb2FkZWQgdGhlIHBvaW50ZXJzICovCi0KLS8qIHRhYmxlcyB0byBoZWxwIGluaXRpYWxpemUgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0vKiBmdW5jdGlvbnMgZnJvbSBsaWJndGsteDExLTIuMCAqLwotc3RhdGljIEZOX1RBQkxFIGd0a0Z1bmN0aW9uc1tdID0geyAJRk5fVEFCTEVfRU5UUlkoZ3RrX2FkanVzdG1lbnRfbmV3KSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKGd0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmcpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ3RrX2NvbnRhaW5lcl9hZGQpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ3RrX2RpYWxvZ19ydW4pLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ3RrX2ZpeGVkX25ldyksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShndGtfZml4ZWRfc2V0X2hhc193aW5kb3cpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ3RrX2ltYWdlX25ld19mcm9tX3BpeGJ1ZiksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShndGtfaW5pdF9jaGVjayksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShndGtfbWVzc2FnZV9kaWFsb2dfbmV3KSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKGd0a19zY3JvbGxlZF93aW5kb3dfc2V0X3BvbGljeSksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShndGtfc2Nyb2xsZWRfd2luZG93X25ldyksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShndGtfc2V0X2xvY2FsZSksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShndGtfc2lnbmFsX2Nvbm5lY3RfZnVsbCksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShndGtfdmJveF9uZXcpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ3RrX3dpZGdldF9kZXN0cm95KSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKGd0a193aWRnZXRfZGVzdHJveWVkKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKGd0a193aWRnZXRfc2hvd19hbGwpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ3RrX3dpbmRvd19uZXcpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ3RrX3dpbmRvd19yZXNpemUpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ3RrX3dpbmRvd19zZXRfdGl0bGUpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ3RrX3dpbmRvd19zZXRfZGVjb3JhdGVkKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKGd0a193aW5kb3dfc2V0X3Bvc2l0aW9uKSwKLQkJCQkJCQkJCXsgTlVMTCwgTlVMTCB9Ci0JCQkJCQkJCSB9OwotLyogZnVuY3Rpb25zIGZyb20gbGliZ2RrLXgxMS0yLjAgKi8KLXN0YXRpYyBGTl9UQUJMRSBnZGtGdW5jdGlvbnNbXSA9IHsJRk5fVEFCTEVfRU5UUlkoZ2RrX3NldF9wcm9ncmFtX2NsYXNzKSwgCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShnZGtfZGlzcGxheSksIC8qIG5vdCBhIGZ1bmN0aW9uICovCi0JCQkJCQkJCQl7IE5VTEwsIE5VTEwgfSAKLQkJCQkJCSAgCQkgfTsKLS8qIGZ1bmN0aW9ucyBmcm9tIGxpYmdka19waXhidWYtMi4wICovCi1zdGF0aWMgRk5fVEFCTEUgcGl4RnVuY3Rpb25zW10gPSB7IAlGTl9UQUJMRV9FTlRSWShnZGtfcGl4YnVmX25ld19mcm9tX2ZpbGUpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ2RrX3BpeGJ1Zl9nZXRfd2lkdGgpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ2RrX3BpeGJ1Zl9nZXRfaGVpZ2h0KSwKLQkJCQkJCQkJCXsgTlVMTCwgTlVMTCB9Ci0JCQkJCQkgIAkJIH07Ci0vKiBmdW5jdGlvbnMgZnJvbSBsaWJnb2JqZWN0LTIuMCAqLwotc3RhdGljIEZOX1RBQkxFIGdvYmpGdW5jdGlvbnNbXSA9IHsJRk5fVEFCTEVfRU5UUlkoZ19sb2dfc2V0X2hhbmRsZXIpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ19sb2dfcmVtb3ZlX2hhbmRsZXIpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoZ19tYWluX2NvbnRleHRfaXRlcmF0aW9uKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKGdfb2JqZWN0X3VucmVmKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKGdfdGltZW91dF9hZGQpLAotI2lmZGVmIFNPTEFSSVMKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKGdfc3RyaW5nX2luc2VydF9jKSwKLSNlbmRpZgotCQkJCQkJCQkJeyBOVUxMLCBOVUxMIH0KLQkJCQkJCSAgIAkJICB9OwotCi0vKiBmdW5jdGlvbnMgZnJvbSBsaWJYMTEgKi8KLXN0YXRpYyBGTl9UQUJMRSB4MTFGdW5jdGlvbnNbXSA9IHsJRk5fVEFCTEVfRU5UUlkoWEdldFNlbGVjdGlvbk93bmVyKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFhTZXRTZWxlY3Rpb25Pd25lciksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYQ3JlYXRlV2luZG93KSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFhDaGFuZ2VQcm9wZXJ0eSksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYU3luYyksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYUm9vdFdpbmRvdyksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYRGVmYXVsdFNjcmVlbiksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYSW50ZXJuQXRvbSksCi0JCQkJCQkJCQl7IE5VTEwsIE5VTEwgfSAKLQkJCQkJCQkJfTsKLQotCi1zdGF0aWMgaW50IGxvYWRHdGtTeW1ib2xzKCB2b2lkICogbGlicmFyeSwgRk5fVEFCTEUgKiB0YWJsZSkgewotCWludCBpID0gMDsKLQl2b2lkICogZm47Ci0JZm9yIChpID0gMDsgdGFibGVbaV0uZm5OYW1lICE9IE5VTEw7IGkrKykgewotCQlmbiA9IGZpbmRTeW1ib2wobGlicmFyeSwgdGFibGVbaV0uZm5OYW1lKTsKLQkJaWYgKGZuICE9IDApCi0JCQkqKHRhYmxlW2ldLmZuUHRyKSA9IGZuOwotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgbG9hZEd0aygpIHsKLQl2b2lkICogb2JqTGliID0gZGxvcGVuKEdPQkpfTElCLCBSVExEX0xBWlkpOwotCXZvaWQgKiBnZGtMaWIgPSBkbG9wZW4oR0RLX0xJQiwgUlRMRF9MQVpZKTsKLQl2b2lkICogcGl4TGliID0gZGxvcGVuKFBJWEJVRl9MSUIsIFJUTERfTEFaWSk7Ci0Jdm9pZCAqIGd0a0xpYiA9IGRsb3BlbihHVEtfTElCLCBSVExEX0xBWlkpOwotCXZvaWQgKiB4MTFMaWIgPSBkbG9wZW4oWDExX0xJQiwgUlRMRF9MQVpZKTsKLQkKLQkvKiBpbml0aWFsaXplIHB0ciBzdHJ1Y3QgdG8gMCdzICovCi0JbWVtc2V0KCZndGssIDAsIHNpemVvZihzdHJ1Y3QgR1RLX1BUUlMpKTsKLQkKLQlpZiAoIGd0a0xpYiA9PSBOVUxMIHx8IGxvYWRHdGtTeW1ib2xzKGd0a0xpYiwgZ3RrRnVuY3Rpb25zKSAgIT0gMCkgcmV0dXJuIC0xOwotCWlmICggZ2RrTGliID09IE5VTEwgfHwgbG9hZEd0a1N5bWJvbHMoZ2RrTGliLCBnZGtGdW5jdGlvbnMpICAhPSAwKSByZXR1cm4gLTE7Ci0JaWYgKCBwaXhMaWIgPT0gTlVMTCB8fCBsb2FkR3RrU3ltYm9scyhwaXhMaWIsIHBpeEZ1bmN0aW9ucykgICE9IDApIHJldHVybiAtMTsKLQlpZiAoIG9iakxpYiA9PSBOVUxMIHx8IGxvYWRHdGtTeW1ib2xzKG9iakxpYiwgZ29iakZ1bmN0aW9ucykgIT0gMCkgcmV0dXJuIC0xOwotCWlmICggeDExTGliID09IE5VTEwgfHwgbG9hZEd0a1N5bWJvbHMoeDExTGliLCB4MTFGdW5jdGlvbnMpICE9IDApIHJldHVybiAtMTsKLQkKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9ndGsvbWFrZV9saW51eC5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNDBjZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9ndGsvbWFrZV9saW51eC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jICAgICBUb20gVHJvbWV5IChSZWQgSGF0LCBJbmMuKQotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWluY2x1ZGUgLi4vbWFrZV92ZXJzaW9uLm1hawotIyBNYWtlZmlsZSBmb3IgY3JlYXRpbmcgdGhlIEdUSyBlY2xpcHNlIGxhdW5jaGVyIHByb2dyYW0uCi0jCi0jIFRoaXMgbWFrZWZpbGUgZXhwZWN0cyB0aGUgdXRpbGl0eSAicGtnLWNvbmZpZyIgdG8gYmUgaW4gdGhlIFBBVEguCi0KLSMgVGhpcyBtYWtlZmlsZSBleHBlY3RzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldDoKLSMKLSMgUFJPR1JBTV9PVVRQVVQgIC0gdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZXhlY3V0YWJsZQotIyBERUZBVUxUX09TICAgICAgLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1vcyIgc3dpdGNoCi0jIERFRkFVTFRfT1NfQVJDSCAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLWFyY2giIHN3aXRjaAotIyBERUZBVUxUX1dTICAgICAgLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi13cyIgc3dpdGNoCi0jIEpBVkFfSE9NRSAgICAgIC0gSkFWQV9IT01FIGZvciBqbmkgaGVhZGVycyAgICAgIAotI2RlZmF1bHQgdmFsdWUgZm9yIFBST0dSQU1fT1VUUFVUCi1pZmVxICgkKFBST0dSQU1fT1VUUFVUKSwpCi0gIFBST0dSQU1fT1VUUFVUPWVjbGlwc2UKLWVuZGlmCi0KLVBST0dSQU1fTElCUkFSWT0kKFBST0dSQU1fT1VUUFVUKV8kKExJQl9WRVJTSU9OKS5zbwotCi1pZmVxICgkKERFRkFVTFRfSkFWQSksKQotICBERUZBVUxUX0pBVkE9REVGQVVMVF9KQVZBX0pOSQotZW5kaWYKLQotIyBEZWZpbmUgdGhlIG9iamVjdCBtb2R1bGVzIHRvIGJlIGNvbXBpbGVkIGFuZCBmbGFncy4KLUNDPz1nY2MKLU1BSU5fT0JKUyA9IGVjbGlwc2VNYWluLm8KLUNPTU1PTl9PQkpTID0gZWNsaXBzZUNvbmZpZy5vIGVjbGlwc2VDb21tb24ubyBlY2xpcHNlR3RrQ29tbW9uLm8gZWNsaXBzZUd0a0luaXQubwotRExMX09CSlMJPSBlY2xpcHNlLm8gZWNsaXBzZUd0ay5vIGVjbGlwc2VVdGlsLm8gZWNsaXBzZUpOSS5vIGVjbGlwc2VNb3ppbGxhLm8gZWNsaXBzZVNobS5vIGVjbGlwc2VOaXgubwotCi1FWEVDID0gJChQUk9HUkFNX09VVFBVVCkKLURMTCA9ICQoUFJPR1JBTV9MSUJSQVJZKQotI0xJQlMgPSBgcGtnLWNvbmZpZyAtLWxpYnMtb25seS1MIGd0aystMi4wYCAtbGd0ay14MTEtMi4wIC1sZ2RrX3BpeGJ1Zi0yLjAgLWxnb2JqZWN0LTIuMCAtbGdkay14MTEtMi4wIC1scHRocmVhZCAtbGRsIC1sWDExCi1MSUJTID0gLWxwdGhyZWFkIC1sZGwKLUdUS19MSUJTID0gLURHVEtfTElCPSJcImxpYmd0ay14MTEtMi4wLnNvLjBcIiIgLURHREtfTElCPSJcImxpYmdkay14MTEtMi4wLnNvLjBcIiIgLURQSVhCVUZfTElCPSJcImxpYmdka19waXhidWYtMi4wLnNvLjBcIiIgLURHT0JKX0xJQj0iXCJsaWJnb2JqZWN0LTIuMC5zby4wXCIiIC1EWDExX0xJQj0iXCJsaWJYMTEuc28uNlwiIgotTEZMQUdTID0gJHtNX0FSQ0h9IC1zaGFyZWQgLWZwaWMgLVdsLC0tZXhwb3J0LWR5bmFtaWMgCi1DRkxBR1MgPSAke01fQVJDSH0gLWcgLXMgLVdhbGxcCi0JLWZwaWMgXAotCS1ETElOVVggXAotCS1ETU9aSUxMQV9GSVggXAotCS1EREVGQVVMVF9PUz0iXCIkKERFRkFVTFRfT1MpXCIiIFwKLQktRERFRkFVTFRfT1NfQVJDSD0iXCIkKERFRkFVTFRfT1NfQVJDSClcIiIgXAotCS1EREVGQVVMVF9XUz0iXCIkKERFRkFVTFRfV1MpXCIiIFwKLQktRCQoREVGQVVMVF9KQVZBKSBcCi0JJChHVEtfTElCUykgXAotCS1JLiBcCi0JLUkuLiBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZSAtSSQoSkFWQV9IT01FKS9pbmNsdWRlL2xpbnV4IFwKLQlgcGtnLWNvbmZpZyAtLWNmbGFncyBndGsrLTIuMGAKLQotYWxsOiAkKEVYRUMpICQoRExMKQotCi1lY2xpcHNlLm86IC4uL2VjbGlwc2UuYyAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZUpOSS5oCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2UuYyAtbyBlY2xpcHNlLm8KLQotZWNsaXBzZU1haW4ubzogLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU1haW4uYyAKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZU1haW4uYyAtbyBlY2xpcHNlTWFpbi5vCi0JCi1lY2xpcHNlQ29tbW9uLm86IC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VDb21tb24uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlQ29tbW9uLmMKLQotZWNsaXBzZUd0a0NvbW1vbi5vOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU9TLmggZWNsaXBzZUd0ay5oIGVjbGlwc2VHdGtDb21tb24uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyBlY2xpcHNlR3RrQ29tbW9uLmMgLW8gZWNsaXBzZUd0a0NvbW1vbi5vCi0JCi1lY2xpcHNlR3RrSW5pdC5vOiAuLi9lY2xpcHNlQ29tbW9uLmggZWNsaXBzZUd0ay5oIGVjbGlwc2VHdGtJbml0LmMKLQkkKENDKSAkKENGTEFHUykgLWMgZWNsaXBzZUd0a0luaXQuYyAtbyBlY2xpcHNlR3RrSW5pdC5vCi0JCi1lY2xpcHNlVXRpbC5vOiAuLi9lY2xpcHNlVXRpbC5jIC4uL2VjbGlwc2VVdGlsLmggLi4vZWNsaXBzZU9TLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZVV0aWwuYyAtbyBlY2xpcHNlVXRpbC5vCi0KLWVjbGlwc2VKTkkubzogLi4vZWNsaXBzZUpOSS5jIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlSk5JLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZUpOSS5jIC1vIGVjbGlwc2VKTkkubwotCQotZWNsaXBzZUNvbmZpZy5vOiAuLi9lY2xpcHNlQ29uZmlnLmMgLi4vZWNsaXBzZUNvbmZpZy5oIC4uL2VjbGlwc2VPUy5oCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2VDb25maWcuYyAtbyBlY2xpcHNlQ29uZmlnLm8KLQkKLWVjbGlwc2VNb3ppbGxhLm86IC4uL2VjbGlwc2VNb3ppbGxhLmMgLi4vZWNsaXBzZU1vemlsbGEuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlTW96aWxsYS5jIC1vIGVjbGlwc2VNb3ppbGxhLm8KLQotZWNsaXBzZVNobS5vOiAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlU2htLmMKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZVNobS5jIC1vIGVjbGlwc2VTaG0ubwotCi1lY2xpcHNlTml4Lm86IC4uL2VjbGlwc2VOaXguYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlTml4LmMgLW8gZWNsaXBzZU5peC5vCi0KLSQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKQotCSQoQ0MpICR7TV9BUkNIfSAtbyAkKEVYRUMpICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKExJQlMpCi0JCi0kKERMTCk6ICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpCi0JJChDQykgJChMRkxBR1MpIC1vICQoRExMKSAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKExJQlMpCi0KLWluc3RhbGw6IGFsbAotCWNwICQoRVhFQykgJChPVVRQVVRfRElSKQotCWNwICQoRExMKSAkKExJQlJBUllfRElSKQotCXJtIC1mICQoRVhFQykgJChETEwpICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKERMTF9PQkpTKQotCi1jbGVhbjoKLQlybSAtZiAkKEVYRUMpICQoRExMKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChETExfT0JKUykKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL21ha2Vfc29sYXJpcy5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L2d0ay9tYWtlX3NvbGFyaXMubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjliM2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvZ3RrL21ha2Vfc29sYXJpcy5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jICAgICBUb20gVHJvbWV5IChSZWQgSGF0LCBJbmMuKQotIyBNYXJ0aW4gT2Jlcmh1YmVyIChXaW5kIFJpdmVyKSAtIFsxNzY4MDVdIFN1cHBvcnQgYnVpbGRpbmcgd2l0aCBnY2MgYW5kIGRlYnVnCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotaW5jbHVkZSAuLi9tYWtlX3ZlcnNpb24ubWFrCi0jIE1ha2VmaWxlIGZvciBjcmVhdGluZyB0aGUgR1RLIGVjbGlwc2UgbGF1bmNoZXIgcHJvZ3JhbS4KLSMKLSMgVGhpcyBtYWtlZmlsZSBleHBlY3RzIHRoZSB1dGlsaXR5ICJwa2ctY29uZmlnIiB0byBiZSBpbiB0aGUgUEFUSC4KLQotIyBUaGlzIG1ha2VmaWxlIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0OgotIwotIyBQUk9HUkFNX09VVFBVVCAgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBleGVjdXRhYmxlCi0jIERFRkFVTFRfT1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLW9zIiBzd2l0Y2gKLSMgREVGQVVMVF9PU19BUkNIIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItYXJjaCIgc3dpdGNoCi0jIERFRkFVTFRfV1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLXdzIiBzd2l0Y2gKLSMgSkFWQV9IT01FICAgICAgICAtIEpBVkFfSE9NRSBmb3IgSk5JIGhlYWRlcnMKLQotI2lmZXEgKCQoUFJPR1JBTV9PVVRQVVQpLCkKLSAgUFJPR1JBTV9PVVRQVVQ9ZWNsaXBzZQotI2VuZGlmCi0KLVBST0dSQU1fTElCUkFSWT0kKFBST0dSQU1fT1VUUFVUKV8kKExJQl9WRVJTSU9OKS5zbwotCi0jIERlZmluZSB0aGUgb2JqZWN0IG1vZHVsZXMgdG8gYmUgY29tcGlsZWQgYW5kIGZsYWdzLgotTUFJTl9PQkpTID0gZWNsaXBzZU1haW4ubwotQ09NTU9OX09CSlMgPSBlY2xpcHNlQ29uZmlnLm8gZWNsaXBzZUNvbW1vbi5vIGVjbGlwc2VHdGtDb21tb24ubyBlY2xpcHNlR3RrSW5pdC5vCi1ETExfT0JKUwk9IGVjbGlwc2UubyBlY2xpcHNlR3RrLm8gZWNsaXBzZVV0aWwubyBlY2xpcHNlSk5JLm8gZWNsaXBzZU1vemlsbGEubyBlY2xpcHNlU2htLm8gZWNsaXBzZU5peC5vCi1QSUNGTEFHID0gLUsgUElDCi0jIE9wdGltaXplIGFuZCByZW1vdmUgYWxsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBieSBkZWZhdWx0Ci1PUFRGTEFHID0gLU8gLXMKLSMgT1BURkxBRyA9IC1nCi0KLUVYRUMgPSAkKFBST0dSQU1fT1VUUFVUKQotRExMID0gJChQUk9HUkFNX0xJQlJBUlkpCi0jTElCUyA9IGBwa2ctY29uZmlnIC0tbGlicy1vbmx5LUwgZ3RrKy0yLjBgIC1sZ3RrLXgxMS0yLjAgLWxnZGtfcGl4YnVmLTIuMCAtbGdvYmplY3QtMi4wIC1sZ2RrLXgxMS0yLjAgLWxnbGliLTIuMCAtbHRocmVhZCAtbGRsIC1sYwotTElCUyA9IC1sdGhyZWFkIC1sZGwgLWxjIC1scnQKLUdUS19MSUJTID0gLURHVEtfTElCPSJcImxpYmd0ay14MTEtMi4wLnNvLjBcIiIgLURHREtfTElCPSJcImxpYmdkay14MTEtMi4wLnNvLjBcIiIgLURQSVhCVUZfTElCPSJcImxpYmdka19waXhidWYtMi4wLnNvLjBcIiIgLURHT0JKX0xJQj0iXCJsaWJnb2JqZWN0LTIuMC5zby4wXCIiIC1EWDExX0xJQj0iXCJsaWJYMTEuc28uNFwiIgotTEZMQUdTID0gLUcKLUNGTEFHUyA9ICQoT1BURkxBRykgXAotCS1EU09MQVJJUyBcCi0JJChQSUNGTEFHKSBcCi0JLURNT1pJTExBX0ZJWCBcCi0JLURERUZBVUxUX09TPSJcIiQoREVGQVVMVF9PUylcIiIgXAotCS1EREVGQVVMVF9PU19BUkNIPSJcIiQoREVGQVVMVF9PU19BUkNIKVwiIiBcCi0JLURERUZBVUxUX1dTPSJcIiQoREVGQVVMVF9XUylcIiIgXAotCSQoR1RLX0xJQlMpIFwKLQktSS4gXAotCS1JLi4gXAotCS1JJChKQVZBX0hPTUUpL2luY2x1ZGUgLUkkKEpBVkFfSE9NRSkvaW5jbHVkZS9zb2xhcmlzIFwKLQlgcGtnLWNvbmZpZyAtLWNmbGFncyBndGsrLTIuMGAKLQotYWxsOiAkKEVYRUMpICQoRExMKQotCi1lY2xpcHNlLm86IC4uL2VjbGlwc2UuYyAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZUpOSS5oCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2UuYyAtbyBlY2xpcHNlLm8KLQotZWNsaXBzZU1haW4ubzogLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU1haW4uYyAKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZU1haW4uYyAtbyBlY2xpcHNlTWFpbi5vCi0JCi1lY2xpcHNlQ29tbW9uLm86IC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VDb21tb24uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlQ29tbW9uLmMKLQotZWNsaXBzZUd0a0NvbW1vbi5vOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU9TLmggZWNsaXBzZUd0ay5oIGVjbGlwc2VHdGtDb21tb24uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyBlY2xpcHNlR3RrQ29tbW9uLmMgLW8gZWNsaXBzZUd0a0NvbW1vbi5vCi0KLWVjbGlwc2VHdGtJbml0Lm86IC4uL2VjbGlwc2VDb21tb24uaCBlY2xpcHNlR3RrLmggZWNsaXBzZUd0a0luaXQuYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyBlY2xpcHNlR3RrSW5pdC5jIC1vIGVjbGlwc2VHdGtJbml0Lm8KLQkKLWVjbGlwc2VVdGlsLm86IC4uL2VjbGlwc2VVdGlsLmMgLi4vZWNsaXBzZVV0aWwuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlVXRpbC5jIC1vIGVjbGlwc2VVdGlsLm8KLQotZWNsaXBzZUpOSS5vOiAuLi9lY2xpcHNlSk5JLmMgLi4vZWNsaXBzZUNvbW1vbi5oIC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VKTkkuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlSk5JLmMgLW8gZWNsaXBzZUpOSS5vCi0KLWVjbGlwc2VDb25maWcubzogLi4vZWNsaXBzZUNvbmZpZy5jIC4uL2VjbGlwc2VDb25maWcuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlQ29uZmlnLmMgLW8gZWNsaXBzZUNvbmZpZy5vCi0KLWVjbGlwc2VNb3ppbGxhLm86IC4uL2VjbGlwc2VNb3ppbGxhLmMgLi4vZWNsaXBzZU1vemlsbGEuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlTW96aWxsYS5jIC1vIGVjbGlwc2VNb3ppbGxhLm8KLQotZWNsaXBzZVNobS5vOiAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlU2htLmMKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZVNobS5jIC1vIGVjbGlwc2VTaG0ubwotCQotZWNsaXBzZU5peC5vOiAuLi9lY2xpcHNlTml4LmMKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZU5peC5jIC1vIGVjbGlwc2VOaXgubwotCQotJChFWEVDKTogJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpCi0JJChDQykgLW8gJChFWEVDKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCi0kKERMTCk6ICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpCi0JJChDQykgJChMRkxBR1MpIC1vICQoRExMKSAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKExJQlMpCi0KLWluc3RhbGw6IGFsbAotCWNwICQoRVhFQykgJChPVVRQVVRfRElSKQotCWNwICQoRExMKSAkKExJQlJBUllfRElSKQotCXJtIC1mICQoRVhFQykgJChETEwpICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKERMTF9PQkpTKQotCi1jbGVhbjoKLQlybSAtZiAkKEVYRUMpICQoRExMKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChETExfT0JKUykKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbWFrZV92ZXJzaW9uLm1hayBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbWFrZV92ZXJzaW9uLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM4OGVmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21ha2VfdmVyc2lvbi5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbWFqX3Zlcj0xCi1taW5fdmVyPTQwMAotTElCX1ZFUlNJT04gPSAkKG1hal92ZXIpJChtaW5fdmVyKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRiM2RiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotKi5vCi1lY2xpcHNlCi1lY2xpcHNlXyouc28KLWxpYmVjbGlwc2UtbW90aWYuc28KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvTmdDb21tb24uYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvTmdDb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllY2RmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL05nQ29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIk5nQ29tbW9uLmgiCi0KLS8qIE5vbi16ZXJvID0gYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmUgKi8KLXN0YXRpYyBCWVRFNCBob3N0SXNNU0IgPSAwOwotCi0vKiBTdG9yZSBsYXN0IGVycm9yIG1zZyAqLwotI2RlZmluZSBNQVhfTVNHX1NJWkUgMTAwCi1jaGFyIGVycm9yTXNnW01BWF9NU0dfU0laRV07Ci0KLS8qIExpYnJhcnkgaW5pdGlhbGl6YXRpb24gKi8KLXZvaWQgTmdJbml0KCkKLXsKLQlCWVRFNCByZXN1bHQgPSAoQllURTQpICdBJzsKLQkKLQkvKiBkZXRlcm1pbmUgdGhlIGJ5dGUgb3JkZXJpbmcgb2YgdGhlIGhvc3QgbWFjaGluZSAqLwotCWhvc3RJc01TQiA9IChCWVRFNCkgKCooKGNoYXIgKikgJnJlc3VsdCkgIT0gJ0EnKTsKLQkKLQllcnJvck1zZ1swXSA9IDA7Ci19Ci0KLS8qKgotICogTWVtb3J5IGFsbG9jYXRpb24gcm91dGluZQotICovCi12b2lkICpOZ01hbGxvYyAoVUJZVEU0IHNpemUpIAotewotCXJldHVybiBtYWxsb2MgKHNpemUpOwotfQotCi0vKioKLSAqIE1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmUKLSAqLwotdm9pZCBOZ0ZyZWUgKHZvaWQgKm1lbWJsb2NrKSAKLXsKLQlpZiAobWVtYmxvY2sgIT0gTlVMTCkKLQkJZnJlZSAobWVtYmxvY2spOwotfQotCi12b2lkIE5nTWVtU2V0ICh2b2lkICpkZXN0LCBVQllURTEgYywgQllURTQgY291bnQpCi17Ci0JbWVtc2V0IChkZXN0LCBjLCBjb3VudCk7Ci19Ci0KLXZvaWQgTmdNZW1DcHkgKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgQllURTQgY291bnQpCi17Ci0JbWVtY3B5IChkZXN0LCBzcmMsIGNvdW50KTsKLX0KLQotLyoqCi0gKiBFcnJvciBSZXBvcnRpbmcKLSAqLwotCi1uZ19lcnJfdCBOZ0Vycm9yIChuZ19lcnJfdCBlcnJvcl90eXBlLCBjaGFyKiBtc2cpIHsKLQlpZiAobXNnICE9IE5VTEwpCi0JewotCQkvKiBTdG9yZSBhIGNvcHkgb2YgdGhlIGxhc3QgZXJyb3IgbXNnIC0gdHJ1bmNhdGUgaWYgbmVjZXNzYXJ5ICovCi0JCXNpemVfdCBzaXplID0gc3RybGVuIChtc2cpOwotCQlpZiAoc2l6ZSA+PSBNQVhfTVNHX1NJWkUpIHNpemUgPSBNQVhfTVNHX1NJWkUgLSAxOwotCQlOZ01lbUNweSAoZXJyb3JNc2csIG1zZywgc2l6ZSk7Ci0JCWVycm9yTXNnW3NpemVdID0gMDsKLQl9CQotCXJldHVybiBlcnJvcl90eXBlOwotfQotCi1jb25zdCBjaGFyICpOZ0dldExhc3RFcnJvck1zZygpCi17Ci0JcmV0dXJuIGVycm9yTXNnOwotfQotCi0vKioKLSAqIFN0cmVhbSBtYW5pcHVsYXRpb24gcm91dGluZXMKLSAqLwotbmdfZXJyX3QgTmdTdHJlYW1Jbml0IChuZ19zdHJlYW1fdCAqc3RyZWFtLCBjaGFyICpmdWxsbmFtZSkKLXsKLQlzdHJlYW0tPmZpbGUgPSBmb3BlbiAoZnVsbG5hbWUsICJyYiIpOwotCXN0cmVhbS0+c2l6ZSA9IDA7Ci0Jc3RyZWFtLT5wb3MgPSAwOwotCWlmIChzdHJlYW0tPmZpbGUgPT0gTlVMTCkgcmV0dXJuIE5nRXJyb3IgKEVSUl9ORywgIkNhbid0IG9wZW4gZmlsZSIpOwotCXJldHVybiBFUlJfT0s7Ci19Ci0KLXZvaWQgTmdTdHJlYW1DbG9zZSAobmdfc3RyZWFtX3QgKnN0cmVhbSkKLXsKLQlpZiAoc3RyZWFtLT5maWxlICE9IE5VTEwpCi0JewotCQlmY2xvc2UgKHN0cmVhbS0+ZmlsZSk7Ci0JCXN0cmVhbS0+ZmlsZSA9IE5VTEw7Ci0JfQotCXN0cmVhbS0+c2l6ZSA9IC0xOwotfQotCi1jaGFyIE5nU3RyZWFtRW9mIChuZ19zdHJlYW1fdCAqc3RyZWFtKSAKLXsKLQlyZXR1cm4gc3RyZWFtLT5zaXplID09IC0xOwotfQotCi1CWVRFNCBOZ1N0cmVhbUdldFBvc2l0aW9uIChuZ19zdHJlYW1fdCAqc3RyZWFtKQotewotCXJldHVybiBzdHJlYW0tPnBvczsKLX0KLQotQllURTQgTmdTdHJlYW1Ta2lwIChuZ19zdHJlYW1fdCAqc3RyZWFtLCBCWVRFNCBuYnIpCi17Ci0JaWYgKHN0cmVhbS0+c2l6ZSA9PSAtMSkgcmV0dXJuIDA7Ci0JaWYgKGZzZWVrIChzdHJlYW0tPmZpbGUsIG5iciwgU0VFS19DVVIpKQotCXsKLQkJTmdTdHJlYW1DbG9zZSAoc3RyZWFtKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXN0cmVhbS0+cG9zICs9IG5icjsKLQlyZXR1cm4gbmJyOwotfQotCi1CWVRFNCBOZ1N0cmVhbVJlYWQgKG5nX3N0cmVhbV90ICpzdHJlYW0sIGNoYXIgKmJ1ZmZlciwgQllURTQgbmJyKQotewotCXNpemVfdCBjbnQ7Ci0JaWYgKHN0cmVhbS0+c2l6ZSA9PSAtMSkgcmV0dXJuIDA7Ci0JY250ID0gZnJlYWQgKGJ1ZmZlciwgc2l6ZW9mIChjaGFyKSwgbmJyLCBzdHJlYW0tPmZpbGUpOwotCWlmIChjbnQgIT0gbmJyKQotCXsKLQkJTmdTdHJlYW1DbG9zZSAoc3RyZWFtKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXN0cmVhbS0+cG9zICs9IG5icjsKLQlyZXR1cm4gbmJyOwotfQotCi1CWVRFMSBOZ0lzTVNCKCkKLXsKLQlyZXR1cm4gaG9zdElzTVNCICE9IDA7Ci19Ci0KLVVCWVRFMiBTeXN0ZW1Ub0xpdHRsZUVuZGlhblVCWVRFMiAoVUJZVEUyIHZhbHVlKQotewotCXJldHVybiBob3N0SXNNU0IgPyAoKHZhbHVlJjB4RkYpIDw8IDgpfCgodmFsdWUmMHhGRjAwKT4+OCkgOiB2YWx1ZTsKLX0KLQotVUJZVEU0IFN5c3RlbVRvTGl0dGxlRW5kaWFuVUJZVEU0IChVQllURTQgdmFsdWUpCi17Ci0JcmV0dXJuIGhvc3RJc01TQiA/ICgodmFsdWUmMHhGRjAwMDAwMEwpPj4yNCl8KCh2YWx1ZSYweEZGMDAwMEwpPj44KSB8ICgodmFsdWUmMHhGRjAwTCk8PDgpIHwgKCh2YWx1ZSYweEZGTCk8PDI0KSA6IHZhbHVlOwotfQotCi1VQllURTIgU3lzdGVtVG9CaWdFbmRpYW5VQllURTIgKFVCWVRFMiB2YWx1ZSkKLXsKLQlyZXR1cm4gaG9zdElzTVNCID8gdmFsdWUgOiAoKHZhbHVlJjB4RkYpIDw8IDgpfCgodmFsdWUmMHhGRjAwKT4+OCk7Ci19Ci0KLVVCWVRFMiBMaXR0bGVFbmRpYW5Ub1N5c3RlbVVCWVRFMiAoVUJZVEUyIHZhbHVlKQotewotCXJldHVybiBob3N0SXNNU0IgPyAoKHZhbHVlJjB4RkYpIDw8IDgpfCgodmFsdWUmMHhGRjAwKT4+OCkgOiB2YWx1ZTsKLX0KLQotVUJZVEU0IExpdHRsZUVuZGlhblRvU3lzdGVtVUJZVEU0IChVQllURTQgdmFsdWUpCi17Ci0JcmV0dXJuIGhvc3RJc01TQiA/ICgodmFsdWUmMHhGRjAwMDAwMEwpPj4yNCl8KCh2YWx1ZSYweEZGMDAwMEwpPj44KSB8ICgodmFsdWUmMHhGRjAwTCk8PDgpIHwgKCh2YWx1ZSYweEZGTCk8PDI0KSA6IHZhbHVlOwotfQotCi1VQllURTIgQmlnRW5kaWFuVG9TeXN0ZW1VQllURTIgKFVCWVRFMiB2YWx1ZSkKLXsKLQlyZXR1cm4gaG9zdElzTVNCID8gdmFsdWUgOiAoKHZhbHVlJjB4RkYpIDw8IDgpfCgodmFsdWUmMHhGRjAwKT4+OCk7Ci19Ci0KLVVCWVRFNCBCaWdFbmRpYW5Ub1N5c3RlbVVCWVRFNCAoVUJZVEU0IHZhbHVlKQotewotCXJldHVybiBob3N0SXNNU0IgPyB2YWx1ZSA6ICgodmFsdWUmMHhGRjAwMDAwMEwpPj4yNCl8KCh2YWx1ZSYweEZGMDAwMEwpPj44KXwoKHZhbHVlJjB4RkYwMEwpPDw4KSB8ICgodmFsdWUmMHhGRkwpPDwyNCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL05nQ29tbW9uLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL05nQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzI1ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9OZ0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX05HX0NPTU1PTl9ICi0jZGVmaW5lIF9fTkdfQ09NTU9OX0gKLQotI2luY2x1ZGUgPG1lbW9yeS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXR5cGVkZWYgY2hhciBCWVRFMTsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVQllURTE7Ci10eXBlZGVmIHNob3J0IEJZVEUyOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVQllURTI7Ci10eXBlZGVmIGxvbmcgQllURTQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJZVEU0OwotCi0vKiBlcnJvciByZXBvcnRpbmcgKi8KLSNkZWZpbmUgRVJSX09LIDEKLSNkZWZpbmUgRVJSX1NVQlNDUklQVF9PVVRfT0ZfUkFOR0UgLTEKLSNkZWZpbmUgRVJSX0lOVkFMSURfQklUX0NPVU5UIC0yCi0jZGVmaW5lIEVSUl9ORyAtNAotCi10eXBlZGVmIEJZVEU0IG5nX2Vycl90OwotbmdfZXJyX3QgTmdFcnJvciAobmdfZXJyX3QgZXJyb3JfdHlwZSwgY2hhciogbXNnKTsKLWNvbnN0IGNoYXIgKk5nR2V0TGFzdEVycm9yTXNnKCk7Ci0KLS8qKgotICogTmdJbml0Ci0gKiBNdXN0IGJlIGNhbGxlZCBwcmlvciB0byB1c2luZyB0aGUgaW1hZ2UgZGVjb2RlcnMgCi0gKi8KLXZvaWQgTmdJbml0KCk7Ci0KLS8qIG1lbW9yeSBtYW5hZ2VtZW50ICovCi12b2lkICpOZ01hbGxvYyAoVUJZVEU0IHNpemUpOwotdm9pZCBOZ0ZyZWUgKHZvaWQgKm1lbWJsb2NrKTsKLXZvaWQgTmdNZW1TZXQgKHZvaWQgKmRlc3QsIFVCWVRFMSBjLCBCWVRFNCBjb3VudCk7Ci12b2lkIE5nTWVtQ3B5ICh2b2lkICpkZXN0LCB2b2lkICpzcmMsIEJZVEU0IGNvdW50KTsKLQotLyogc3RyZWFtIGFwaSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCUZJTEUgKmZpbGU7Ci0JQllURTQgc2l6ZTsKLQlCWVRFNCBwb3M7Ci19IG5nX3N0cmVhbV90OwotCi0vKioKLSAqIEluaXQgYSBzdHJlYW0gZ2l2ZW4gdGhlIHBhdGggYW5kIG5hbWUgb2YgYSBmaWxlCi0gKiBOb3RlLiAgTmdTdHJlYW1DbG9zZSBzaG91bGQgYmUgY2FsbGVkIHRvIHJlbGVhc2UKLSAqIHRoZSByZWxhdGVkIE9TIHJlc291cmNlLgotICovCi1uZ19lcnJfdCBOZ1N0cmVhbUluaXQgKG5nX3N0cmVhbV90ICpzdHJlYW0sIGNoYXIgKmZ1bGxuYW1lKTsKLQotLyoqCi0gKiBDbG9zZSBhbnkgT1MgcmVzb3VyY2UgbWFuYWdlZCB0aGUgZ2l2ZW4gc3RyZWFtLgotICogSW4gcGFydGljdWxhciwgY2xvc2UgdGhlIGZpbGUgaWYgdGhlIHN0cmVhbSBpcyB1c2luZyBvbmUuCi0gKi8KLXZvaWQgTmdTdHJlYW1DbG9zZSAobmdfc3RyZWFtX3QgKnN0cmVhbSk7Ci0KLWNoYXIgTmdTdHJlYW1Fb2YgKG5nX3N0cmVhbV90ICpzdHJlYW0pOwotCi1CWVRFNCBOZ1N0cmVhbUdldFBvc2l0aW9uIChuZ19zdHJlYW1fdCAqc3RyZWFtKTsKLS8qKgotICogU2tpcHMgbmJyIGJ5dGVzLgotICogUmV0dXJuIG5iciBpZiBhbGwgYnl0ZXMgd2VyZSBza2lwcGVkLgotICogSWYgbmJyIGJ5dGVzIGNhbid0IGJlIHNraXBwZWQsIHRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gKiAoTmdTdHJlYW1Fb2YgcmV0dXJucyAxKS4gMCBpcyByZXR1cm5lZC4KLSAqLwotQllURTQgTmdTdHJlYW1Ta2lwIChuZ19zdHJlYW1fdCAqc3RyZWFtLCBCWVRFNCBuYnIpOwotLyoqCi0gKiBDb3BpZXMgbmJyIGJ5dGVzIHRvIGJ1ZmZlciBmcm9tIHN0cmVhbS4KLSAqIFJldHVybnMgbmJyIGlmIGFsbCBieXRlcyB3ZXJlIGNvcGllZC4KLSAqIElmIG5iciBieXRlcyBjYW4ndCBiZSByZWFkLCBubyBieXRlcyBhcmUgY29waWVkLiBUaGUgc3RyZWFtCi0gKiBpcyBjbG9zZWQgKE5nU3RyZWFtRW9mIHJldHVybnMgMSkuIDAgaXMgcmV0dXJuZWQuCi0gKi8KLUJZVEU0IE5nU3RyZWFtUmVhZCAobmdfc3RyZWFtX3QgKnN0cmVhbSwgY2hhciAqYnVmZmVyLCBCWVRFNCBuYnIpOwotCi0vKiBsaXR0bGUvYmlnIGVuZGlhbiBjb252ZXJzaW9uICovCi1CWVRFMSBOZ0lzTVNCKCk7Ci1VQllURTIgU3lzdGVtVG9MaXR0bGVFbmRpYW5VQllURTIgKFVCWVRFMik7Ci1VQllURTQgU3lzdGVtVG9MaXR0bGVFbmRpYW5VQllURTQgKFVCWVRFNCk7Ci1VQllURTIgU3lzdGVtVG9CaWdFbmRpYW5VQllURTIgKFVCWVRFMik7Ci1VQllURTIgTGl0dGxlRW5kaWFuVG9TeXN0ZW1VQllURTIgKFVCWVRFMik7Ci1VQllURTQgTGl0dGxlRW5kaWFuVG9TeXN0ZW1VQllURTQgKFVCWVRFNCk7Ci1VQllURTIgQmlnRW5kaWFuVG9TeXN0ZW1VQllURTIgKFVCWVRFMik7Ci1VQllURTQgQmlnRW5kaWFuVG9TeXN0ZW1VQllURTQgKFVCWVRFNCk7Ci0KLSNlbmRpZiAvKiBOR19DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9OZ0ltYWdlLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL05nSW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyYWJmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL05nSW1hZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTmdDb21tb24uaCIKLSNpbmNsdWRlICJOZ0ltYWdlRGF0YS5oIgotI2luY2x1ZGUgIk5nSW1hZ2UuaCIKLSNpbmNsdWRlICJOZ1dpbkJNUEZpbGVGb3JtYXQuaCIKLSNpbmNsdWRlIDxkbGZjbi5oPgotCi1zdHJ1Y3QgTkdfUFRSUyBuZzsKLQotI2RlZmluZSBGTl9UQUJMRV9FTlRSWShmbikgeyAodm9pZCoqKSZuZy5mbiwgI2ZuIH0gCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9pZCAqKiBmblB0cjsKLQljaGFyICogZm5OYW1lOwotfSBGTl9UQUJMRTsKLXN0YXRpYyBGTl9UQUJMRSB4MTFGdW5jdGlvbnNbXSA9IHsJRk5fVEFCTEVfRU5UUlkoWENyZWF0ZUdDKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFhDcmVhdGVJbWFnZSksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYQ3JlYXRlUGl4bWFwKSwJCSAgICAgICAgCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYRGVmYXVsdENvbG9ybWFwKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFhEZWZhdWx0RGVwdGhPZlNjcmVlbiksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYRGVmYXVsdFJvb3RXaW5kb3cpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWERlZmF1bHRTY3JlZW4pLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWERlZmF1bHRTY3JlZW5PZkRpc3BsYXkpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWERlZmF1bHRWaXN1YWwpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWEZyZWVHQyksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYRnJlZVBpeG1hcCksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYUHV0SW1hZ2UpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWFF1ZXJ5Q29sb3IpLAotCQkJCQkJCQkJeyBOVUxMLCBOVUxMIH0KLQkJCQkJCQkJfTsKLQotc3RhdGljIEZOX1RBQkxFIHh0RnVuY3Rpb25zW10gPSB7CUZOX1RBQkxFX0VOVFJZKFh0TWFsbG9jKSwge05VTEwsIE5VTEx9IH07Ci0KLWludCBOR0ltYWdlSW5pdCgpIHsKLQlpbnQgaSA9IDA7Ci0Jdm9pZCAqIGZuOwotI2lmZGVmIEFJWAotCXZvaWQgKiB4MTFMaWIgPSBkbG9wZW4oWDExX0xJQiwgUlRMRF9MQVpZIHwgUlRMRF9NRU1CRVIpOwotCXZvaWQgKiB4dExpYiA9IGRsb3BlbihYVF9MSUIsIFJUTERfTEFaWSB8IFJUTERfTUVNQkVSKTsKLSNlbHNlCi0Jdm9pZCAqIHgxMUxpYiA9IGRsb3BlbihYMTFfTElCLCBSVExEX0xBWlkpOwotCXZvaWQgKiB4dExpYiA9IGRsb3BlbihYVF9MSUIsIFJUTERfTEFaWSk7Ci0jZW5kaWYJCQotCS8qIGluaXRpYWxpemUgcHRyIHN0cnVjdCB0byAwJ3MgKi8KLQltZW1zZXQoJm5nLCAwLCBzaXplb2Yoc3RydWN0IE5HX1BUUlMpKTsKLQkKLQotCWlmICh4MTFMaWIgPT0gTlVMTCB8fCB4dExpYiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JCi0JZm9yIChpID0gMDsgeDExRnVuY3Rpb25zW2ldLmZuTmFtZSAhPSBOVUxMOyBpKyspIHsKLQkJZm4gPSBkbHN5bSh4MTFMaWIsIHgxMUZ1bmN0aW9uc1tpXS5mbk5hbWUpOwotCQlpZiAoZm4gIT0gMCkKLQkJCSooeDExRnVuY3Rpb25zW2ldLmZuUHRyKSA9IGZuOwotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCQotCWZvciAoaSA9IDA7IHh0RnVuY3Rpb25zW2ldLmZuTmFtZSAhPSBOVUxMOyBpKyspIHsKLQkJZm4gPSBkbHN5bSh4dExpYiwgeHRGdW5jdGlvbnNbaV0uZm5OYW1lKTsKLQkJaWYgKGZuICE9IDApCi0JCQkqKHh0RnVuY3Rpb25zW2ldLmZuUHRyKSA9IGZuOwotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG5iciBvZiBlbnRyaWVzIGluIHRoZSBkZWZhdWx0IGNvbG9yIHBhbGV0dGUKLSAqLwotaW50IGdldE5ickNvbG9yc1hQYWxldHRlKERpc3BsYXkgKnhEaXNwbGF5KQotewotCVZpc3VhbCAqdmlzdWFsID0gbmcuWERlZmF1bHRWaXN1YWwgKHhEaXNwbGF5LCBuZy5YRGVmYXVsdFNjcmVlbih4RGlzcGxheSkpOwotCXJldHVybiB2aXN1YWwtPm1hcF9lbnRyaWVzOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgUkdCIGNvZGVzIG9mIHRoZSBkZWZhdWx0IHBhbGV0dGUKLSAqIHBhbGV0dGU6IGJ1ZmZlciBvZiBzaXplIG51bUNvbG9ycyAqIDMsIGhvbGRpbmcgdGhlIFJHQiB2YWx1ZXMKLSAqLwotbmdfZXJyX3QgZ2V0WFBhbGV0dGUgKERpc3BsYXkgKnhEaXNwbGF5LCBpbnQgbnVtQ29sb3JzLCBjaGFyKiBwYWxldHRlKQotewotCVhDb2xvciBjb2xvcjsKLQlpbnQgaTsKLQlpbnQgaW5kZXggPSAwOwotCWludCBjb2xvcm1hcCA9IG5nLlhEZWZhdWx0Q29sb3JtYXAgKHhEaXNwbGF5LCBuZy5YRGVmYXVsdFNjcmVlbih4RGlzcGxheSkpOwotCWZvciAoaSA9IDA7IGkgPCBudW1Db2xvcnM7IGkrKykKLQl7Ci0JCWNvbG9yLnBpeGVsID0gaTsKLQkJbmcuWFF1ZXJ5Q29sb3IgKHhEaXNwbGF5LCBjb2xvcm1hcCwgJmNvbG9yKTsKLQkJcGFsZXR0ZVtpbmRleCsrXSA9ICgoY29sb3IucmVkID4+IDgpICYgMHhGRik7Ci0JCXBhbGV0dGVbaW5kZXgrK10gPSAoKGNvbG9yLmdyZWVuID4+IDgpICYgMHhGRik7Ci0JCXBhbGV0dGVbaW5kZXgrK10gPSAoKGNvbG9yLmJsdWUgPj4gOCkgJiAweEZGKTsKLQl9Ci0JcmV0dXJuIEVSUl9PSzsKLX0KLQotLyoqCi0gKiBQdXQgYSBkZXZpY2UtaW5kZXBlbmRlbnQgaW1hZ2Ugb2YgYW55IGRlcHRoIGludG8gYSBkcmF3YWJsZSBvZiB0aGUgc2FtZSBzaXplLCAKLSAqLwotbmdfZXJyX3QgcHV0SW1hZ2UobmdfYml0bWFwX2ltYWdlX3QgKmltYWdlLCBpbnQgc3JjWCwgaW50IHNyY1ksIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IGRlc3RYLCBpbnQgZGVzdFksIAotCURpc3BsYXkgKnhEaXNwbGF5LCBWaXN1YWwgKnZpc3VhbCwgaW50IHNjcmVlbkRlcHRoLCAKLQlpbnQgZHJhd2FibGUpIAotewotCi0JWEltYWdlICp4SW1hZ2VQdHI7Ci0JaW50IGJ1ZlNpemU7Ci0JaW50IGRlc3RSZWRNYXNrID0gMCwgZGVzdEdyZWVuTWFzayA9IDAsIGRlc3RCbHVlTWFzayA9IDA7Ci0JQllURTEgc2NyZWVuRGlyZWN0OwotCVVCWVRFMSAqc3JjRGF0YSA9IE5nQml0bWFwSW1hZ2VJbWFnZURhdGEoaW1hZ2UpOwotCVVCWVRFNCBzcmNEZXB0aCA9IE5nQml0bWFwSW1hZ2VCaXRDb3VudChpbWFnZSk7Ci0JQllURTQgc2JwcCwgZGJwcDsKLQlHQyB0ZW1wR0M7Ci0JaW50IG51bUNvbG9ycyA9IDA7Ci0JCi0JLyogV2Ugb25seSBzdXBwb3J0IGltYWdlIGRlcHRoIG9mIDI0IGJpdHMgKi8KLQlpZiAoc3JjRGVwdGggIT0gMjQpIHJldHVybiBOZ0Vycm9yIChFUlJfTkcsICJFcnJvciB1bnN1cHBvcnRlZCBkZXB0aCAtIG9ubHkgc3VwcG9ydCAyNCBiaXQiKTsKLQlpZiAoc2NyZWVuRGVwdGggPD0gOCkgCi0JewotCQludW1Db2xvcnMgPSBnZXROYnJDb2xvcnNYUGFsZXR0ZSAoeERpc3BsYXkpOwotCQlpZiAobnVtQ29sb3JzID09IDApCi0JCQlyZXR1cm4gTmdFcnJvciAoRVJSX05HLCAiRXJyb3IgcHNldWRvLWNvbG9yIG1vZGUgZGV0ZWN0ZWQsIG5vIGNvbG9ycyBhdmFpbGFibGUiKTsKLQkJbnVtQ29sb3JzID0gMSA8PCBuZy5YRGVmYXVsdERlcHRoT2ZTY3JlZW4gKG5nLlhEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5ICh4RGlzcGxheSkpOwotCQlzY3JlZW5EaXJlY3QgPSAwOwotCX0gZWxzZQotCXsKLQkJZGVzdFJlZE1hc2sgPSB2aXN1YWwtPnJlZF9tYXNrOwotCQlkZXN0R3JlZW5NYXNrID0gdmlzdWFsLT5ncmVlbl9tYXNrOwotCQlkZXN0Qmx1ZU1hc2sgPSB2aXN1YWwtPmJsdWVfbWFzazsKLQkJc2NyZWVuRGlyZWN0ID0gMTsKLQl9Ci0JCi0JeEltYWdlUHRyID0gbmcuWENyZWF0ZUltYWdlKHhEaXNwbGF5LCB2aXN1YWwsIHNjcmVlbkRlcHRoLCBaUGl4bWFwLCAwLCAwLCBzcmNXaWR0aCwgc3JjSGVpZ2h0LCAzMiwgMCk7Ci0JaWYgKHhJbWFnZVB0ciA9PSBOVUxMKSByZXR1cm4gTmdFcnJvciAoRVJSX05HLCAiRXJyb3IgWENyZWF0ZUltYWdlIGZhaWxlZCIpOwotCWJ1ZlNpemUgPSB4SW1hZ2VQdHItPmJ5dGVzX3Blcl9saW5lICogc3JjSGVpZ2h0OwotCi0JeEltYWdlUHRyLT5kYXRhID0gKGNoYXIqKSBuZy5YdE1hbGxvYyAoYnVmU2l6ZSk7Ci0Jc2JwcCA9IE5nQml0bWFwSW1hZ2VCeXRlc1BlclJvdyhpbWFnZSk7Ci0JZGJwcCA9IHhJbWFnZVB0ci0+Ynl0ZXNfcGVyX2xpbmU7Ci0JCi0JaWYgKHNjcmVlbkRpcmVjdCkKLQl7Ci0JCS8qIDI0IGJpdCBzb3VyY2UgdG8gZGlyZWN0IHNjcmVlbiBkZXN0aW5hdGlvbiAqLwotCQlOZ0JpdG1hcEltYWdlQmxpdERpcmVjdFRvRGlyZWN0KHNyY0RhdGEsIHNicHAsIHNyY1dpZHRoLCBzcmNIZWlnaHQsCi0JCQkoVUJZVEUxKil4SW1hZ2VQdHItPmRhdGEsIHhJbWFnZVB0ci0+Yml0c19wZXJfcGl4ZWwsIGRicHAsIHhJbWFnZVB0ci0+Ynl0ZV9vcmRlciwKLQkJCWRlc3RSZWRNYXNrLCBkZXN0R3JlZW5NYXNrLCBkZXN0Qmx1ZU1hc2spOwotCX0gZWxzZQotCXsKLQkJLyogMjQgYml0IHNvdXJjZSB0byBwYWxldHRlIHNjcmVlbiBkZXN0aW5hdGlvbiAqLwotCQljaGFyICpwYWxldHRlID0gKGNoYXIqKSBOZ01hbGxvYyAobnVtQ29sb3JzICogMyk7Ci0JCWdldFhQYWxldHRlICh4RGlzcGxheSwgbnVtQ29sb3JzLCBwYWxldHRlKTsKLQkJTmdCaXRtYXBJbWFnZUJsaXREaXJlY3RUb1BhbGV0dGUoc3JjRGF0YSwgc2JwcCwgc3JjV2lkdGgsIHNyY0hlaWdodCwKLQkJCShVQllURTEqKXhJbWFnZVB0ci0+ZGF0YSwgeEltYWdlUHRyLT5iaXRzX3Blcl9waXhlbCwgZGJwcCwgeEltYWdlUHRyLT5ieXRlX29yZGVyLAotCQkJKFVCWVRFMSopcGFsZXR0ZSwgbnVtQ29sb3JzKTsKLQkJTmdGcmVlIChwYWxldHRlKTsKLQl9Ci0JCi0JdGVtcEdDID0gbmcuWENyZWF0ZUdDICh4RGlzcGxheSwgZHJhd2FibGUsIDAsIE5VTEwpOwkKLQluZy5YUHV0SW1hZ2UoeERpc3BsYXksIGRyYXdhYmxlLCB0ZW1wR0MsIHhJbWFnZVB0ciwgMCwgMCwgMCwgMCwgc3JjV2lkdGgsIHNyY0hlaWdodCk7Ci0JCi0JWERlc3Ryb3lJbWFnZSAoeEltYWdlUHRyKTsKLQluZy5YRnJlZUdDICh4RGlzcGxheSwgdGVtcEdDKTsKLQlyZXR1cm4gRVJSX09LOwotfQotCi1uZ19lcnJfdCBpbml0KG5nX2JpdG1hcF9pbWFnZV90ICppbWFnZSwgRGlzcGxheSAqeERpc3BsYXksIGludCBzY3JlZW5EZXB0aCwgaW50IGRyYXdhYmxlLCBQaXhtYXAgKnBpeG1hcCkgCi17Ci0JbmdfZXJyX3QgZXJyOwotCWludCB3aWR0aCA9IChpbnQpTmdCaXRtYXBJbWFnZVdpZHRoKGltYWdlKTsKLQlpbnQgaGVpZ2h0ID0gKGludClOZ0JpdG1hcEltYWdlSGVpZ2h0KGltYWdlKTsKLQkKLQlWaXN1YWwgKnZpc3VhbCA9IG5nLlhEZWZhdWx0VmlzdWFsKHhEaXNwbGF5LCBuZy5YRGVmYXVsdFNjcmVlbih4RGlzcGxheSkpOwotCSpwaXhtYXAgPSBuZy5YQ3JlYXRlUGl4bWFwKHhEaXNwbGF5LCBkcmF3YWJsZSwgd2lkdGgsIGhlaWdodCwgc2NyZWVuRGVwdGgpOwotCWlmICgqcGl4bWFwID09IDApIAotCXsKLQkJcmV0dXJuIE5nRXJyb3IgKEVSUl9ORywgIkVycm9yIFhDcmVhdGVQaXhtYXAgZmFpbGVkIik7Ci0JfQotCWVyciA9IHB1dEltYWdlKGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCB4RGlzcGxheSwgdmlzdWFsLCBzY3JlZW5EZXB0aCwgKnBpeG1hcCk7Ci0JaWYgKGVyciAhPSBFUlJfT0spIAotCXsKLQkJbmcuWEZyZWVQaXhtYXAgKHhEaXNwbGF5LCAqcGl4bWFwKTsKLQkJcmV0dXJuIE5nRXJyb3IgKGVyciwgIkVycm9yIHB1dEltYWdlIGZhaWxlZCIpOwotCX0KLQkKLQlyZXR1cm4gRVJSX09LOwotfQotCi0vKioKLSAqIGxvYWRCTVBJbWFnZQotICogQ3JlYXRlIGEgcGl4bWFwIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gQk1QIGZpbGUsIGZvciB0aGUgc3BlY2lmaWVkIGRpc3BsYXkgYW5kIHNjcmVlbi4KLSAqCi0gKiBkaXNwbGF5OiBjb25uZWN0aW9uIHRvIFggc2VydmVyCi0gKiBzY3JlZW46IHRoZSBzY3JlZW4gdG8gY3JlYXRlIHRoZSBwaXhtYXAgZm9yCi0gKiBibXBQYXRobmFtZTogYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSB0byB0aGUgYm1wIGZpbGUKLSAqCi0gKiByZXR1cm5lZCB2YWx1ZTogdGhlIHBpeG1hcCBuZXdseSBjcmVhdGVkIGlmIHN1Y2Nlc3NmdWwuIDAgb3RoZXJ3aXNlLgotICovCi1QaXhtYXAgbG9hZEJNUEltYWdlIChEaXNwbGF5ICpkaXNwbGF5LCBTY3JlZW4gKnNjcmVlbiwgY2hhciAqYm1wUGF0aG5hbWUpIHsKLQlXaW5kb3cgZHJhd2FibGU7Ci0Jbmdfc3RyZWFtX3QgaW47Ci0JbmdfYml0bWFwX2ltYWdlX3QgaW1hZ2U7Ci0JbmdfZXJyX3QgZXJyID0gRVJSX09LOwotCWludCBzY3JlZW5EZXB0aDsKLQlQaXhtYXAgcGl4bWFwOwotCi0JLyogdGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IFggZnVuY3Rpb25zIGFyZSB1c2VkICovCi0JTkdJbWFnZUluaXQoKTsKLQlOZ0luaXQoKTsKLQkKLQlkcmF3YWJsZSA9IG5nLlhEZWZhdWx0Um9vdFdpbmRvdyAoZGlzcGxheSk7Ci0Jc2NyZWVuRGVwdGggPSBuZy5YRGVmYXVsdERlcHRoT2ZTY3JlZW4gKHNjcmVlbik7Ci0JCi0JaWYgKE5nU3RyZWFtSW5pdCAoJmluLCBibXBQYXRobmFtZSkgIT0gRVJSX09LKQotCXsKLQkJTmdFcnJvciAoRVJSX05HLCAiRXJyb3IgY2FuJ3Qgb3BlbiBCTVAgZmlsZSIpOwotCQlyZXR1cm4gMDsKLQl9CQotCU5nQml0bWFwSW1hZ2VJbml0ICgmaW1hZ2UpOwotCWVyciA9IE5nQm1wRGVjb2RlclJlYWRJbWFnZSAoJmluLCAmaW1hZ2UpOwotCU5nU3RyZWFtQ2xvc2UgKCZpbik7Ci0JCi0JaWYgKGVyciAhPSBFUlJfT0spCi0JewotCQlOZ0JpdG1hcEltYWdlRnJlZSAoJmltYWdlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQkKLQllcnIgPSBpbml0ICgmaW1hZ2UsIGRpc3BsYXksIHNjcmVlbkRlcHRoLCBkcmF3YWJsZSwgJnBpeG1hcCk7Ci0JTmdCaXRtYXBJbWFnZUZyZWUgKCZpbWFnZSk7Ci0JCi0JcmV0dXJuIGVyciA9PSBFUlJfT0sgPyBwaXhtYXAgOiAwOwotfQotCi1jb25zdCBjaGFyICpnZXRCTVBFcnJvck1lc3NhZ2UgKCkKLXsKLQlyZXR1cm4gTmdHZXRMYXN0RXJyb3JNc2cgKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL05nSW1hZ2UuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvTmdJbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM3MTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvTmdJbWFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX05HX0lNQUdFX0gKLSNkZWZpbmUgX19OR19JTUFHRV9ICi0KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotI2luY2x1ZGUgPFgxMS9Yb3MuaD4KLSNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+Ci0KLXN0cnVjdCBOR19QVFJTIHsKLQlHQyAJCQkoKlhDcmVhdGVHQykJCQkoRGlzcGxheSosIERyYXdhYmxlLCB1bnNpZ25lZCBsb25nLCBYR0NWYWx1ZXMqKTsKLQlYSW1hZ2UgKgkoKlhDcmVhdGVJbWFnZSkJCQkoRGlzcGxheSosIFZpc3VhbCosIHVuc2lnbmVkIGludCwgaW50LCBpbnQsIGNoYXIqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50LCBpbnQpOwotCVBpeG1hcCAJCSgqWENyZWF0ZVBpeG1hcCkJCShEaXNwbGF5KiwgRHJhd2FibGUsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwkJICAgICAgICAKLQlDb2xvcm1hcCAJKCpYRGVmYXVsdENvbG9ybWFwKQkJKERpc3BsYXkqLCBpbnQpOwotCWludCAJCSgqWERlZmF1bHREZXB0aE9mU2NyZWVuKShTY3JlZW4qKTsKLQlXaW5kb3cgCQkoKlhEZWZhdWx0Um9vdFdpbmRvdykJKERpc3BsYXkqKTsKLQlpbnQgCQkoKlhEZWZhdWx0U2NyZWVuKQkJKERpc3BsYXkqKTsKLQlTY3JlZW4gKgkoKlhEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5KShEaXNwbGF5Kik7Ci0JVmlzdWFsICoJKCpYRGVmYXVsdFZpc3VhbCkJCShEaXNwbGF5KiwgaW50KTsKLQlpbnQgCQkoKlhGcmVlR0MpCQkJCShEaXNwbGF5KiwgR0MpOwotCWludCAJCSgqWEZyZWVQaXhtYXApCQkJKERpc3BsYXkqLCBQaXhtYXApOwotCWludCAJCSgqWFB1dEltYWdlKQkJCShEaXNwbGF5KiwgRHJhd2FibGUsIEdDLCBYSW1hZ2UqLCBpbnQsIGludCwgaW50LCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKLQlpbnQgCQkoKlhRdWVyeUNvbG9yKQkJCShEaXNwbGF5KiwgQ29sb3JtYXAsIFhDb2xvciopOwotCWNoYXIgKgkJKCpYdE1hbGxvYykJCQkJKENhcmRpbmFsKTsKLX07Ci0KLS8qKgotICogbG9hZEJNUEltYWdlCi0gKiBDcmVhdGUgYSBwaXhtYXAgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBCTVAgZmlsZSwgZm9yIHRoZSBzcGVjaWZpZWQgZGlzcGxheSBhbmQgc2NyZWVuLgotICoKLSAqIGRpc3BsYXk6IGNvbm5lY3Rpb24gdG8gWCBzZXJ2ZXIKLSAqIHNjcmVlbjogdGhlIHNjcmVlbiB0byBjcmVhdGUgdGhlIHBpeG1hcCBmb3IKLSAqIGJtcFBhdGhuYW1lOiBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIHRvIHRoZSBibXAgZmlsZQotICoKLSAqIHJldHVybmVkIHZhbHVlOiB0aGUgcGl4bWFwIG5ld2x5IGNyZWF0ZWQgaWYgc3VjY2Vzc2Z1bC4gMCBvdGhlcndpc2UuCi0gKi8KLVBpeG1hcCBsb2FkQk1QSW1hZ2UgKERpc3BsYXkgKmRpc3BsYXksIFNjcmVlbiAqc2NyZWVuLCBjaGFyICpibXBQYXRobmFtZSk7Ci0KLS8qKgotICogUmV0dXJuIGVycm9yIG1lc3NhZ2UgZGVzY3JpYmluZyB3aHkgdGhlIEJNUCBmaWxlIGNvdWxkIG5vdCBiZSBkaXNwbGF5ZWQKLSAqLwotY29uc3QgY2hhciAqZ2V0Qk1QRXJyb3JNZXNzYWdlKCk7Ci0KLSNlbmRpZiAvKiBOR19JTUFHRV9IICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL05nSW1hZ2VEYXRhLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL05nSW1hZ2VEYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOWYxZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9OZ0ltYWdlRGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOZ0ltYWdlRGF0YS5oIgotCi1zdGF0aWMgVUJZVEU0IFJvdW5kUm93IChVQllURTQgd2lkdGgpCi17Ci0gIFVCWVRFNCByZXN1bHQgPSAod2lkdGggKyBSb3dSb3VuZGluZyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgJiB+KFJvd1JvdW5kaW5nIC0gMSkgOwotICByZXR1cm4gcmVzdWx0IDsKLX0KLQotdm9pZCBOZ0JpdG1hcEltYWdlSW5pdCAobmdfYml0bWFwX2ltYWdlX3QgKmltYWdlKQotewotCU5nQml0bWFwSW1hZ2VDbGVhckRhdGEgKGltYWdlKTsKLX0KLQotdm9pZCBOZ0JpdG1hcEltYWdlRnJlZSAobmdfYml0bWFwX2ltYWdlX3QgKmltYWdlKQotewotCU5nRnJlZSAoaW1hZ2UtPmNvbG9yX21hcCk7Ci0JTmdGcmVlIChpbWFnZS0+aW1hZ2VfZGF0YSk7Ci0JTmdGcmVlIChpbWFnZS0+YWxwaGFfZGF0YSk7Ci19Ci0KLXZvaWQgTmdCaXRtYXBJbWFnZUNsZWFyRGF0YSAobmdfYml0bWFwX2ltYWdlX3QgKmltYWdlKQotewotCWltYWdlLT5iaXRfY291bnQgPSAwOwotCWltYWdlLT5pbWFnZV93aWR0aCA9IDA7Ci0JaW1hZ2UtPmltYWdlX2hlaWdodCA9IDA7Ci0JaW1hZ2UtPmNvbG9yX2NvdW50ID0gMDsKLQlpbWFnZS0+Y29sb3JfbWFwID0gTlVMTDsKLQlpbWFnZS0+aW1hZ2VfZGF0YSA9IE5VTEw7Ci0JaW1hZ2UtPmFscGhhX2RhdGEgPSBOVUxMOwotCWltYWdlLT50cmFuc3BhcmVudF9waXhlbCA9IC0xOwotfQotCi12b2lkIE5nQml0bWFwSW1hZ2VTZXRTaXplKG5nX2JpdG1hcF9pbWFnZV90ICppbWFnZSwKLQkJCQkJCSAgIFVCWVRFNCBjb2xvcl9jb3VudCwKLQkJCQkJCSAgIFVCWVRFNCBiaXRzLAotCQkJCQkJICAgVUJZVEU0IHdpZHRoLAotCQkJCQkJICAgVUJZVEU0IGhlaWdodCkKLXsKLQlOZ0ZyZWUgKGltYWdlLT5jb2xvcl9tYXApOwotCU5nRnJlZSAoaW1hZ2UtPmltYWdlX2RhdGEpOwotCU5nQml0bWFwSW1hZ2VDbGVhckRhdGEgKGltYWdlKTsKLQotCXN3aXRjaCAoYml0cykKLQl7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQljYXNlIDQ6Ci0JCWNhc2UgODoKLQkJewotCQkJVUJZVEU0IGJpdHNpemU7Ci0JCQlVQllURTQgYnl0ZWNvdW50OwotCi0JCQlpbWFnZS0+Yml0X2NvdW50ID0gYml0czsKLQkJCWltYWdlLT5jb2xvcl9jb3VudCA9IGNvbG9yX2NvdW50OwotCQkJaW1hZ2UtPmltYWdlX3dpZHRoID0gd2lkdGg7Ci0JCQlpbWFnZS0+aW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OwotCQotCQkJaW1hZ2UtPmNvbG9yX21hcCA9IChuZ19jb2xvcl9tYXBfZW50cnlfdCAqKSBOZ01hbGxvYyAoc2l6ZW9mKG5nX2NvbG9yX21hcF9lbnRyeV90KSAqIGltYWdlLT5jb2xvcl9jb3VudCk7Ci0JCQlOZ01lbVNldCAoaW1hZ2UtPmNvbG9yX21hcCwgMCwgc2l6ZW9mIChuZ19jb2xvcl9tYXBfZW50cnlfdCkgKiBpbWFnZS0+Y29sb3JfY291bnQpOwotCQkJYml0c2l6ZSA9IGltYWdlLT5iaXRfY291bnQgKiBpbWFnZS0+aW1hZ2Vfd2lkdGg7Ci0JCQlpbWFnZS0+cm93X3dpZHRoID0gUm91bmRSb3cgKChiaXRzaXplICsgNykvOCk7Ci0JCQlieXRlY291bnQgPSBpbWFnZS0+cm93X3dpZHRoICogaW1hZ2UtPmltYWdlX2hlaWdodDsKLQkJCWltYWdlLT5pbWFnZV9kYXRhID0gKFVCWVRFMSAqKSBOZ01hbGxvYyAoYnl0ZWNvdW50KTsKLQkJCU5nTWVtU2V0IChpbWFnZS0+aW1hZ2VfZGF0YSwgMCwgKEJZVEU0KWJ5dGVjb3VudCk7Ci0JCX0KLQkJYnJlYWsgOwotCQljYXNlIDE2OgotCQl7Ci0JCQlpbWFnZS0+Yml0X2NvdW50ID0gYml0czsKLQkJCWltYWdlLT5jb2xvcl9jb3VudCA9IGNvbG9yX2NvdW50OwotCQkJaW1hZ2UtPmltYWdlX3dpZHRoID0gd2lkdGg7Ci0JCQlpbWFnZS0+aW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OwotCQkJaW1hZ2UtPnJvd193aWR0aCA9IFJvdW5kUm93ICgyICogaW1hZ2UtPmltYWdlX3dpZHRoKTsKLQkJCWltYWdlLT5pbWFnZV9kYXRhID0gKFVCWVRFMSAqKSBOZ01hbGxvYyAoaW1hZ2UtPnJvd193aWR0aCAqIGltYWdlLT5pbWFnZV9oZWlnaHQpOwotCQkJTmdNZW1TZXQgKGltYWdlLT5pbWFnZV9kYXRhLCAwLCBpbWFnZS0+cm93X3dpZHRoICogaW1hZ2UtPmltYWdlX2hlaWdodCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgMjQ6Ci0JCXsKLQkJCWltYWdlLT5iaXRfY291bnQgPSBiaXRzOwotCQkJaW1hZ2UtPmNvbG9yX2NvdW50ID0gY29sb3JfY291bnQ7Ci0JCQlpbWFnZS0+aW1hZ2Vfd2lkdGggPSB3aWR0aDsKLQkJCWltYWdlLT5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7Ci0JCQlpbWFnZS0+cm93X3dpZHRoID0gUm91bmRSb3cgKDMgKiBpbWFnZS0+aW1hZ2Vfd2lkdGgpOwotCQkJaW1hZ2UtPmltYWdlX2RhdGEgPSAoVUJZVEUxICopIE5nTWFsbG9jIChpbWFnZS0+cm93X3dpZHRoICogaW1hZ2UtPmltYWdlX2hlaWdodCk7Ci0JCQlOZ01lbVNldCAoaW1hZ2UtPmltYWdlX2RhdGEsIDAsIGltYWdlLT5yb3dfd2lkdGggKiBpbWFnZS0+aW1hZ2VfaGVpZ2h0KTsKLQkJfQotCQlicmVhazsKLQkJY2FzZSAzMjoKLQkJewotCQkJaW1hZ2UtPmJpdF9jb3VudCA9IGJpdHM7Ci0JCQlpbWFnZS0+Y29sb3JfY291bnQgPSBjb2xvcl9jb3VudDsKLQkJCWltYWdlLT5pbWFnZV93aWR0aCA9IHdpZHRoOwotCQkJaW1hZ2UtPmltYWdlX2hlaWdodCA9IGhlaWdodDsKLQkJCWltYWdlLT5yb3dfd2lkdGggPSBSb3VuZFJvdyAoNCAqIGltYWdlLT5pbWFnZV93aWR0aCk7Ci0JCQlpbWFnZS0+aW1hZ2VfZGF0YSA9IChVQllURTEgKikgTmdNYWxsb2MgKGltYWdlLT5yb3dfd2lkdGggKiBpbWFnZS0+aW1hZ2VfaGVpZ2h0KTsKLQkJCU5nTWVtU2V0IChpbWFnZS0+aW1hZ2VfZGF0YSwgMCwgaW1hZ2UtPnJvd193aWR0aCAqIGltYWdlLT5pbWFnZV9oZWlnaHQpOwotCQl9Ci0JCWJyZWFrIDsKLQkJZGVmYXVsdDoKLQkJTmdFcnJvciAoRVJSX0lOVkFMSURfQklUX0NPVU5ULCBOVUxMKTsKLQl9Ci19Ci0KLW5nX2NvbG9yX21hcF9lbnRyeV90ICpOZ0JpdG1hcEltYWdlQ29sb3JNYXAgKG5nX2JpdG1hcF9pbWFnZV90ICppbWFnZSwgVUJZVEU0IGluZGV4KQotewotCWlmIChpbmRleCA+PSBpbWFnZS0+Y29sb3JfY291bnQpCi0JewotCQlOZ0Vycm9yIChFUlJfU1VCU0NSSVBUX09VVF9PRl9SQU5HRSwgIkVycm9yIE5nQml0bWFwSW1hZ2VDb2xvck1hcCBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuICZpbWFnZS0+Y29sb3JfbWFwIFtpbmRleF0gOwotfQotCi0vKiBibGl0IGNvbnN0YW50cyAqLwotI2RlZmluZSBUWVBFX0lOREVYXzFfTVNCIDEKLSNkZWZpbmUgVFlQRV9JTkRFWF8xX0xTQiAyCi0jZGVmaW5lIFRZUEVfSU5ERVhfMiAzCi0jZGVmaW5lIFRZUEVfSU5ERVhfNCA0Ci0jZGVmaW5lIFRZUEVfSU5ERVhfOCA1Ci0jZGVmaW5lIFRZUEVfR0VORVJJQ18yNCA2Ci0jZGVmaW5lIFRZUEVfR0VORVJJQ184IDcKLSNkZWZpbmUgVFlQRV9HRU5FUklDXzE2X01TQiA4Ci0jZGVmaW5lIFRZUEVfR0VORVJJQ18xNl9MU0IgOQotI2RlZmluZSBUWVBFX0dFTkVSSUNfMzJfTVNCIDEwCi0jZGVmaW5lIFRZUEVfR0VORVJJQ18zMl9MU0IgMTEKLQotLyoqCi0gKiBDb21wdXRlcyB0aGUgcmVxdWlyZWQgY2hhbm5lbCBzaGlmdCBmcm9tIGEgbWFzay4KLSAqLwotVUJZVEU0IGdldENoYW5uZWxTaGlmdChVQllURTQgbWFzaykKLXsKLQlVQllURTQgaTsKLQlpZiAobWFzayA9PSAwKSByZXR1cm4gMDsKLQlmb3IgKGkgPSAwOyAoKG1hc2sgJiAxKSA9PSAwKSAmJiAoaSA8IDMyKTsgKytpKQotCXsKLQkJbWFzayA+Pj0gMTsKLQl9Ci0JcmV0dXJuIGk7Ci19Ci0KLS8qKgotICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgd2lkdGggKGRlcHRoKSBmcm9tIGEgbWFzay4KLSAqLwotVUJZVEU0IGdldENoYW5uZWxXaWR0aChVQllURTQgbWFzaywgVUJZVEU0IHNoaWZ0KQotewotCVVCWVRFNCBpOwotCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCW1hc2sgPj49IHNoaWZ0OwotCWZvciAoaSA9IHNoaWZ0OyAoKG1hc2sgJiAxKSAhPSAwKSAmJiAoaSA8IDMyKTsgKytpKSAKLQl7Ci0JCW1hc2sgPj49IDE7Ci0JfQotCXJldHVybiBpIC0gc2hpZnQ7Ci19Ci0KLS8qKgotICogQmxpdHMgYSBkaXJlY3QgcGFsZXR0ZSBpbWFnZSBpbnRvIGEgZGlyZWN0IHBhbGV0dGUgaW1hZ2UuCi0gKiAKLSAqIHNyY0RhdGEgdGhlIHNvdXJjZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgaW1hZ2UgZGF0YQotICogc3JjU3RyaWRlIHRoZSBzb3VyY2UgbnVtYmVyIG9mIGJ5dGVzIHBlciBsaW5lCi0gKiBzcmNXaWR0aCB0aGUgd2lkdGggb2YgdGhlIHNvdXJjZSBibGl0IHJlZ2lvbgotICogc3JjSGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHNvdXJjZSBibGl0IHJlZ2lvbgotICogZGVzdERhdGEgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0gKiBkZXN0RGVwdGggdGhlIGRlc3RpbmF0aW9uIGRlcHRoOiBvbmUgb2YgOCwgMTYsIDI0LCAzMgotICogZGVzdFN0cmlkZSB0aGUgZGVzdGluYXRpb24gbnVtYmVyIG9mIGJ5dGVzIHBlciBsaW5lCi0gKiBkZXN0T3JkZXIgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgb3JkZXJpbmc6IDAgZm9yIExTQiwgMSBvdGhlcndpc2UKLSAqICAgICAgICBpZ25vcmVkIGlmIGRlc3REZXB0aCBpcyBub3QgMTYgb3IgMzIKLSAqIGRlc3RSZWRNYXNrIHRoZSBkZXN0aW5hdGlvbiByZWQgY2hhbm5lbCBtYXNrCi0gKiBkZXN0R3JlZW5NYXNrIHRoZSBkZXN0aW5hdGlvbiBncmVlbiBjaGFubmVsIG1hc2sKLSAqIGRlc3RCbHVlTWFzayB0aGUgZGVzdGluYXRpb24gYmx1ZSBjaGFubmVsIG1hc2sKLSAqCi0gKiBJdCBpcyBhc3N1bWVkIHRoYXQuCi0gKiBzcmNEZXB0aDogMjQgLSBCR1Igb3JkZXJpbmcgKEJNUCBmb3JtYXQpCi0gKiBubyBhbHBoYQotICogc3JjWDogMAotICogc3JjWTogMAotICogZGVzdFg6IDAKLSAqIGRlc3RZOiAwCi0gKiBkZXN0V2lkdGg6IHNhbWUgYXMgc3JjV2lkdGgKLSAqIGRlc3RIZWlnaHQ6IHNhbWUgYXMgc3JjSGVpZ2h0IAotICovCi12b2lkIE5nQml0bWFwSW1hZ2VCbGl0RGlyZWN0VG9EaXJlY3QoCi0JVUJZVEUxICpzcmNEYXRhLCBCWVRFNCBzcmNTdHJpZGUsCi0JQllURTQgc3JjV2lkdGgsIEJZVEU0IHNyY0hlaWdodCwKLQlVQllURTEgKmRlc3REYXRhLCBCWVRFNCBkZXN0RGVwdGgsIEJZVEU0IGRlc3RTdHJpZGUsIEJZVEU0IGRlc3RPcmRlciwKLQlVQllURTQgZGVzdFJlZE1hc2ssIFVCWVRFNCBkZXN0R3JlZW5NYXNrLCBVQllURTQgZGVzdEJsdWVNYXNrKQotewotCUJZVEU0IHNyY1ggPSAwLCBzcmNZID0gMCwgZGVzdFggPSAwLCBkZXN0WSA9IDAsIGRlc3RXaWR0aCA9IHNyY1dpZHRoLCBkZXN0SGVpZ2h0ID0gc3JjSGVpZ2h0OwotCQotCUJZVEU0IHNicHAsIHN0eXBlLCBzcHIsIGRicHAsIGR0eXBlLCBkcHIsIGRwcnhpLCBkcHJ5aSwgZHAsIHNwLCBkeSwgZHg7Ci0JQllURTQgZGVzdFJlZFNoaWZ0LCBkZXN0UmVkV2lkdGg7Ci0JQllURTQgZGVzdFJlZFByZVNoaWZ0LCBkZXN0R3JlZW5TaGlmdCwgZGVzdEdyZWVuV2lkdGgsIGRlc3RHcmVlblByZVNoaWZ0OwotCUJZVEU0IGRlc3RCbHVlU2hpZnQsIGRlc3RCbHVlV2lkdGgsIGRlc3RCbHVlUHJlU2hpZnQ7Ci0JVUJZVEUxIHIsIGcsIGI7Ci0JVUJZVEU0IGRhdGE7Ci0JCi0JLyoqKiBQcmVwYXJlIHNvdXJjZS1yZWxhdGVkIGRhdGEgKioqLwotCXNicHAgPSAzOwotCXN0eXBlID0gVFlQRV9HRU5FUklDXzI0OwotCi0Jc3ByID0gc3JjWSAqIHNyY1N0cmlkZSArIHNyY1ggKiBzYnBwOwotCi0JLyoqKiBQcmVwYXJlIGRlc3RpbmF0aW9uLXJlbGF0ZWQgZGF0YSAqKiovCi0Jc3dpdGNoIChkZXN0RGVwdGgpCi0JewotCQljYXNlIDg6Ci0JCQlkYnBwID0gMTsKLQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzg7Ci0JCQlicmVhazsKLQkJY2FzZSAxNjoKLQkJCWRicHAgPSAyOwotCQkJZHR5cGUgPSAoZGVzdE9yZGVyICE9IDApID8gVFlQRV9HRU5FUklDXzE2X01TQiA6IFRZUEVfR0VORVJJQ18xNl9MU0I7Ci0JCQlicmVhazsKLQkJY2FzZSAyNDoKLQkJCWRicHAgPSAzOwotCQkJZHR5cGUgPSBUWVBFX0dFTkVSSUNfMjQ7Ci0JCQlicmVhazsKLQkJY2FzZSAzMjoKLQkJCWRicHAgPSA0OwotCQkJZHR5cGUgPSAoZGVzdE9yZGVyICE9IDApID8gVFlQRV9HRU5FUklDXzMyX01TQiA6IFRZUEVfR0VORVJJQ18zMl9MU0I7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybjsKLQl9CQkJCi0JCi0JZHByID0gZGVzdFkgKiBkZXN0U3RyaWRlICsgZGVzdFggKiBkYnBwOwotCWRwcnhpID0gZGJwcDsKLQlkcHJ5aSA9IGRlc3RTdHJpZGU7Ci0KLQkvKioqIEJsaXQgKioqLwotCWRwID0gZHByOwotCXNwID0gc3ByOwotCi0JLyoqKiBDb21wcmVoZW5zaXZlIGJsaXQgKGFwcGx5IHRyYW5zZm9ybWF0aW9ucykgKioqLwotCWRlc3RSZWRTaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0UmVkTWFzayk7Ci0JZGVzdFJlZFdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RSZWRNYXNrLCBkZXN0UmVkU2hpZnQpOwotCWRlc3RSZWRQcmVTaGlmdCA9IDggLSBkZXN0UmVkV2lkdGg7Ci0JZGVzdEdyZWVuU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdEdyZWVuTWFzayk7Ci0JZGVzdEdyZWVuV2lkdGggPSBnZXRDaGFubmVsV2lkdGgoZGVzdEdyZWVuTWFzaywgZGVzdEdyZWVuU2hpZnQpOwotCWRlc3RHcmVlblByZVNoaWZ0ID0gOCAtIGRlc3RHcmVlbldpZHRoOwotCWRlc3RCbHVlU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdEJsdWVNYXNrKTsKLQlkZXN0Qmx1ZVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RCbHVlTWFzaywgZGVzdEJsdWVTaGlmdCk7Ci0JZGVzdEJsdWVQcmVTaGlmdCA9IDggLSBkZXN0Qmx1ZVdpZHRoOwotCi0JciA9IDA7IGcgPSAwOyBiID0gMDsKLQlmb3IgKGR5ID0gZGVzdEhlaWdodDsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSBzcmNTdHJpZGUsIGRwID0gZHByICs9IGRwcnlpKQotCXsKLQkJZm9yIChkeCA9IGRlc3RXaWR0aDsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSkgCi0JCXsKLQkJCS8qKiogUkVBRCBORVhUIFBJWEVMIEFTU1VNSU5HIEJHUiBvcmRlcmluZyAoQk1QIGZvcm1hdCkgKioqLwotCQkJYiA9IHNyY0RhdGFbc3BdOwotCQkJZyA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCXIgPSBzcmNEYXRhW3NwICsgMl07Ci0JCQlzcCArPSAzOwotCQkJLyoqKiBXUklURSBORVhUIFBJWEVMICoqKi8KLQkJCWRhdGEgPSAKLQkJCQkociA+PiBkZXN0UmVkUHJlU2hpZnQgPDwgZGVzdFJlZFNoaWZ0KSB8Ci0JCQkJKGcgPj4gZGVzdEdyZWVuUHJlU2hpZnQgPDwgZGVzdEdyZWVuU2hpZnQpIHwKLQkJCQkoYiA+PiBkZXN0Qmx1ZVByZVNoaWZ0IDw8IGRlc3RCbHVlU2hpZnQpOwotCQkJc3dpdGNoIChkdHlwZSkKLQkJCXsKLQkJCQljYXNlIFRZUEVfR0VORVJJQ184OgotCQkJCXsKLQkJCQkJZGVzdERhdGFbZHBdID0gKFVCWVRFMSkgZGF0YTsKLQkJCQl9IGJyZWFrOwotCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjoKLQkJCQl7Ci0JCQkJCWRlc3REYXRhW2RwXSA9IChVQllURTEpIChkYXRhID4+IDgpOwotCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKFVCWVRFMSkgKGRhdGEgJiAweGZmKTsKLQkJCQl9IGJyZWFrOwotCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogCi0JCQkJewotCQkJCQlkZXN0RGF0YVtkcF0gPSAoVUJZVEUxKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKFVCWVRFMSkgKGRhdGEgPj4gOCk7Ci0JCQkJfSBicmVhazsKLQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogCi0JCQkJewotCQkJCQlkZXN0RGF0YVtkcF0gPSAoVUJZVEUxKSAoZGF0YSA+PiAxNik7Ci0JCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoVUJZVEUxKSAoZGF0YSA+PiA4KTsKLQkJCQkJZGVzdERhdGFbZHAgKyAyXSA9IChVQllURTEpIChkYXRhICYgMHhmZik7Ci0JCQkJfSBicmVhazsKLQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9NU0I6IAotCQkJCXsKLQkJCQkJZGVzdERhdGFbZHBdID0gKFVCWVRFMSkgKGRhdGEgPj4gMjQpOwotCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKFVCWVRFMSkgKGRhdGEgPj4gMTYpOwotCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKFVCWVRFMSkgKGRhdGEgPj4gOCk7Ci0JCQkJCWRlc3REYXRhW2RwICsgM10gPSAoVUJZVEUxKSAoZGF0YSAmIDB4ZmYpOwotCQkJCX0gYnJlYWs7Ci0JCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTFNCOiAKLQkJCQl7Ci0JCQkJCWRlc3REYXRhW2RwXSA9IChVQllURTEpIChkYXRhICYgMHhmZik7Ci0JCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoVUJZVEUxKSAoZGF0YSA+PiA4KTsKLQkJCQkJZGVzdERhdGFbZHAgKyAyXSA9IChVQllURTEpIChkYXRhID4+IDE2KTsKLQkJCQkJZGVzdERhdGFbZHAgKyAzXSA9IChVQllURTEpIChkYXRhID4+IDI0KTsKLQkJCQl9IGJyZWFrOwotCQkJfQotCQl9Ci0JfQkJCQotfQotCi0vKioKLSAqIENyZWF0ZSBhIHNpbXBsZSBoYXNoIHRhYmxlIHVzZWQgd2hlbiBjb252ZXJ0aW5nIGRpcmVjdCBjb2xvcnMgdG8gdmFsdWVzIGluIGEgcGFsZXR0ZQotICogRWFjaCBidWNrZXQgc3RvcmVzIHRoZSBSR0IgY29kZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHBhbGV0dGUgaW5kZXguCi0gKiBUaGUga2V5IGlzIG1hZGUgZnJvbSB0aGUgUkdCIHZhbHVlcy4KLSAqIEl0IGlzIHVzZWQgYXMgYSBjYWNoZS4gTmV3IGVudHJpZXMgY29sbGlkaW5nIHdpdGggb2xkZXIgb25lcyBzaW1wbHkKLSAqIHJlcGxhY2UgdGhlbS4KLSAqLwotbmdfcGFsZXR0ZV9idWNrZXRfdCAqTmdSR0JJbmRleENyZWF0ZSAoKQotewotCW5nX3BhbGV0dGVfYnVja2V0X3QgKnRhYmxlID0gKG5nX3BhbGV0dGVfYnVja2V0X3QgKilOZ01hbGxvYyAoUkdCSW5kZXhUYWJsZVNpemUgKiBzaXplb2YgKG5nX3BhbGV0dGVfYnVja2V0X3QpKTsKLQlOZ01lbVNldCAodGFibGUsIDAsIFJHQkluZGV4VGFibGVTaXplICogc2l6ZW9mIChuZ19wYWxldHRlX2J1Y2tldF90KSk7Ci0JcmV0dXJuIHRhYmxlOwotfQotCi12b2lkIE5nUkdCSW5kZXhGcmVlIChuZ19wYWxldHRlX2J1Y2tldF90ICp0YWJsZSkKLXsKLQlOZ0ZyZWUgKHRhYmxlKTsKLX0KLQotdm9pZCBOZ1JHQkluZGV4U2V0IChuZ19wYWxldHRlX2J1Y2tldF90ICp0YWJsZSwgVUJZVEUxIHIsIFVCWVRFMSBnLCBVQllURTEgYiwgVUJZVEUxIGluZGV4KQotewotCWludCBpID0gKHIgKiBnICogYikgJSBSR0JJbmRleFRhYmxlU2l6ZTsKLQl0YWJsZVtpXS5ibHVlID0gYjsKLQl0YWJsZVtpXS5ncmVlbiA9IGc7Ci0JdGFibGVbaV0ucmVkID0gcjsKLQl0YWJsZVtpXS5pbmRleCA9IGluZGV4OwotCXRhYmxlW2ldLmlzU2V0ID0gMTsKLX0KLQotaW50IE5nUkdCSW5kZXhHZXQgKG5nX3BhbGV0dGVfYnVja2V0X3QgKnRhYmxlLCBVQllURTEgciwgVUJZVEUxIGcsIFVCWVRFMSBiKQotewotCWludCBpID0gKHIgKiBnICogYikgJSBSR0JJbmRleFRhYmxlU2l6ZTsKLQlpZiAodGFibGVbaV0uaXNTZXQgJiYgdGFibGVbaV0uYmx1ZSA9PSBiICYmIHRhYmxlW2ldLmdyZWVuID09IGcgJiYgdGFibGVbaV0ucmVkID09IHIpCi0JCXJldHVybiB0YWJsZVtpXS5pbmRleDsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qKgotICogQmxpdHMgYSBkaXJlY3QgcGFsZXR0ZSBpbWFnZSBpbnRvIGFuIGluZGV4IHBhbGV0dGUgaW1hZ2UuCi0gKiAKLSAqIHNyY0RhdGEgdGhlIHNvdXJjZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgaW1hZ2UgZGF0YQotICogc3JjU3RyaWRlIHRoZSBzb3VyY2UgbnVtYmVyIG9mIGJ5dGVzIHBlciBsaW5lCi0gKiBzcmNYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLSAqIHNyY1kgdGhlIHRvcC1sZWZ0IHktY29vcmQgb2YgdGhlIHNvdXJjZSBibGl0IHJlZ2lvbgotICogc3JjV2lkdGggdGhlIHdpZHRoIG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLSAqIHNyY0hlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLSAqIGRlc3REYXRhIHRoZSBkZXN0aW5hdGlvbiBieXRlIGFycmF5IGNvbnRhaW5pbmcgaW1hZ2UgZGF0YQotICogZGVzdERlcHRoIHRoZSBkZXN0aW5hdGlvbiBkZXB0aDogb25lIG9mIDEsIDIsIDQsIDgKLSAqIGRlc3RTdHJpZGUgdGhlIGRlc3RpbmF0aW9uIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotICogZGVzdE9yZGVyIHRoZSBkZXN0aW5hdGlvbiBieXRlIG9yZGVyaW5nOiAwIGlmIExTQiwgMSBvdGhlcndpc2U7Ci0gKiAgICAgICAgaWdub3JlZCBpZiBkZXN0RGVwdGggaXMgbm90IDEKLSAqIGRlc3RYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotICogZGVzdFkgdGhlIHRvcC1sZWZ0IHktY29vcmQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0gKiBkZXN0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotICogZGVzdEhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotICogZGVzdENvbG9ycyB0aGUgZGVzdGluYXRpb24gcGFsZXR0ZSByZWQgZ3JlZW4gYmx1ZSBjb21wb25lbnQgaW50ZW5zaXRpZXMKLSAqIGRlc3ROdW1Db2xvcnMgdGhlIG51bWJlciBvZiBjb2xvcnMgaW4gZGVzdENvbG9ycwotICogCi0gKiBJdCBpcyBhc3N1bWVkIHRoYXQuCi0gKiBzcmNEZXB0aDogMjQgLSBCR1Igb3JkZXJpbmcgKEJNUCBmb3JtYXQpCi0gKiBubyBhbHBoYQotICogc3JjWDogMAotICogc3JjWTogMAotICogZGVzdFg6IDAKLSAqIGRlc3RZOiAwCi0gKiBkZXN0V2lkdGg6IHNhbWUgYXMgc3JjV2lkdGgKLSAqIGRlc3RIZWlnaHQ6IHNhbWUgYXMgc3JjSGVpZ2h0Ci0gKi8KLQotdm9pZCBOZ0JpdG1hcEltYWdlQmxpdERpcmVjdFRvUGFsZXR0ZSgKLQlVQllURTEgKnNyY0RhdGEsIEJZVEU0IHNyY1N0cmlkZSwKLQlCWVRFNCBzcmNXaWR0aCwgQllURTQgc3JjSGVpZ2h0LAotCVVCWVRFMSAqZGVzdERhdGEsIEJZVEU0IGRlc3REZXB0aCwgQllURTQgZGVzdFN0cmlkZSwgQllURTQgZGVzdE9yZGVyLAotCVVCWVRFMSAqZGVzdENvbG9ycywgaW50IGRlc3ROdW1Db2xvcnMpCi17CQotCUJZVEU0IHNyY1ggPSAwLCBzcmNZID0gMCwgZGVzdFggPSAwLCBkZXN0WSA9IDAsIGRlc3RXaWR0aCA9IHNyY1dpZHRoLCBkZXN0SGVpZ2h0ID0gc3JjSGVpZ2h0OwotCUJZVEU0IHNicHAsIHNwciwgZHR5cGUsIGRwciwgZHAsIHNwLCBkZXN0UGFsZXR0ZVNpemUsIGR5LCBkeCwgaiwgZHIsIGRnLCBkYiwgZGlzdGFuY2UsIG1pbkRpc3RhbmNlOwotCi0JVUJZVEUxIHIgPSAwLCBnID0gMCwgYiA9IDAsIGluZGV4ID0gMDsKLQlpbnQgc3RvcmVkSW5kZXg7Ci0JbmdfcGFsZXR0ZV9idWNrZXRfdCAqUkdCSW5kZXhUYWJsZTsKLQkJCi0JLyoqKiBQcmVwYXJlIHNvdXJjZS1yZWxhdGVkIGRhdGEgKioqLwotCXNicHAgPSAzOwotCXNwciA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYICogc2JwcDsKLQotCS8qKiogUHJlcGFyZSBkZXN0aW5hdGlvbi1yZWxhdGVkIGRhdGEgKioqLwotCXN3aXRjaCAoZGVzdERlcHRoKQotCXsKLQkJY2FzZSA4OgotCQkJZHR5cGUgPSBUWVBFX0lOREVYXzg7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJZGVzdFN0cmlkZSA8PD0gMTsKLQkJCWR0eXBlID0gVFlQRV9JTkRFWF80OwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWRlc3RTdHJpZGUgPDw9IDI7Ci0JCQlkdHlwZSA9IFRZUEVfSU5ERVhfMjsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlkZXN0U3RyaWRlIDw8PSAzOwotCQkJZHR5cGUgPSAoZGVzdE9yZGVyICE9IDApID8gVFlQRV9JTkRFWF8xX01TQiA6IFRZUEVfSU5ERVhfMV9MU0I7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybjsKLQl9CQkJCi0JZHByID0gZGVzdFkgKiBkZXN0U3RyaWRlICsgZGVzdFg7Ci0KLQlkcCA9IGRwcjsKLQlzcCA9IHNwcjsKLQlkZXN0UGFsZXR0ZVNpemUgPSBkZXN0TnVtQ29sb3JzOwotCi0JUkdCSW5kZXhUYWJsZSA9IE5nUkdCSW5kZXhDcmVhdGUgKCk7Ci0JZm9yIChkeSA9IGRlc3RIZWlnaHQ7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gc3JjU3RyaWRlLCBkcCA9IGRwciArPSBkZXN0U3RyaWRlKQotCQl7Ci0JCWZvciAoZHggPSBkZXN0V2lkdGg7IGR4ID4gMDsgLS1keCwgZHAgKz0gMSkKLQkJewotCQkJLyoqKiBSRUFEIE5FWFQgUElYRUwgQVNTVU1JTkcgQkdSIG9yZGVyaW5nIChCTVAgZm9ybWF0KSAqKiovCi0JCQliID0gc3JjRGF0YVtzcF07Ci0JCQlnID0gc3JjRGF0YVtzcCsxXTsKLQkJCXIgPSBzcmNEYXRhW3NwKzJdOwotCQkJc3AgKz0gMzsKLQotCQkJLyoqKiBNQVAgQ09MT1IgVE8gVEhFIFBBTEVUVEUgKioqLwotCQkJc3RvcmVkSW5kZXggPSBOZ1JHQkluZGV4R2V0IChSR0JJbmRleFRhYmxlLCByLCBnLCBiKTsKLQkJCWlmIChzdG9yZWRJbmRleCA+PSAwKQotCQkJewotCQkJCWluZGV4ID0gKFVCWVRFMSkgc3RvcmVkSW5kZXg7Ci0JCQl9IGVsc2UKLQkJCXsKLQkJCQlmb3IgKGogPSAwLCBtaW5EaXN0YW5jZSA9IDB4N2ZmZmZmZmY7IGogPCBkZXN0UGFsZXR0ZVNpemU7ICsraikKLQkJCQl7Ci0JCQkJCWRyID0gKGRlc3RDb2xvcnNbaiozXSAmIDB4ZmYpIC0gcjsKLQkJCQkJZGcgPSAoZGVzdENvbG9yc1tqKjMrMV0gJiAweGZmKSAtIGc7Ci0JCQkJCWRiID0gKGRlc3RDb2xvcnNbaiozKzJdICYgMHhmZikgLSBiOwotCQkJCQlkaXN0YW5jZSA9IGRyICogZHIgKyBkZyAqIGRnICsgZGIgKiBkYjsKLQkJCQkJaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpCi0JCQkJCXsKLQkJCQkJCWluZGV4ID0gKFVCWVRFMSlqOwotCQkJCQkJaWYgKGRpc3RhbmNlID09IDApIGJyZWFrOwotCQkJCQkJbWluRGlzdGFuY2UgPSBkaXN0YW5jZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlOZ1JHQkluZGV4U2V0IChSR0JJbmRleFRhYmxlLCByLCBnLCBiLCBpbmRleCk7Ci0JCQl9Ci0KLQkJCS8qKiogV1JJVEUgTkVYVCBQSVhFTCAqKiovCi0JCQlzd2l0Y2ggKGR0eXBlKSB7Ci0JCQkJY2FzZSBUWVBFX0lOREVYXzg6Ci0JCQkJCWRlc3REYXRhW2RwXSA9IChVQllURTEpIGluZGV4OwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRZUEVfSU5ERVhfNDoKLQkJCQkJaWYgKChkcCAmIDEpICE9IDApIGRlc3REYXRhW2RwID4+IDFdID0gKChkZXN0RGF0YVtkcCA+PiAxXSAmIDB4ZjApIHwgaW5kZXgpOwotCQkJCQllbHNlIGRlc3REYXRhW2RwID4+IDFdID0gKChkZXN0RGF0YVtkcCA+PiAxXSAmIDB4MGYpIHwgKGluZGV4IDw8IDQpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUWVBFX0lOREVYXzI6IAotCQkJCXsKLQkJCQkJaW50IHNoaWZ0ID0gNiAtIChkcCAmIDMpICogMjsKLQkJCQkJZGVzdERhdGFbZHAgPj4gMl0gPSAoKGRlc3REYXRhW2RwID4+IDJdICYgfigweDAzIDw8IHNoaWZ0KSkgfCAoaW5kZXggPDwgc2hpZnQpKTsKLQkJCQl9IGJyZWFrOwkJCQkJCi0JCQkJY2FzZSBUWVBFX0lOREVYXzFfTVNCOgotCQkJCXsKLQkJCQkJaW50IHNoaWZ0ID0gNyAtIChkcCAmIDcpOwotCQkJCQlkZXN0RGF0YVtkcCA+PiAzXSA9ICgoZGVzdERhdGFbZHAgPj4gM10gJiB+KDB4MDEgPDwgc2hpZnQpKSB8IChpbmRleCA8PCBzaGlmdCkpOwotCQkJCX0gYnJlYWs7Ci0JCQkJY2FzZSBUWVBFX0lOREVYXzFfTFNCOiAKLQkJCQl7Ci0JCQkJCWludCBzaGlmdCA9IGRwICYgNzsKLQkJCQkJZGVzdERhdGFbZHAgPj4gM10gPSAoKGRlc3REYXRhW2RwID4+IDNdICYgfigweDAxIDw8IHNoaWZ0KSkgfCAoaW5kZXggPDwgc2hpZnQpKTsKLQkJCQl9IGJyZWFrOwkJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JTmdSR0JJbmRleEZyZWUgKFJHQkluZGV4VGFibGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9OZ0ltYWdlRGF0YS5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9OZ0ltYWdlRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjNjOTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvTmdJbWFnZURhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fTkdfSU1BR0VEQVRBX0gKLSNkZWZpbmUgX19OR19JTUFHRURBVEFfSAotCi0vKioKLSAqIFR5cGUgbmdfYml0bWFwX2ltYWdlX3QgKEMgdmVyc2lvbiBvZiBTV1QgSW1hZ2VEYXRhKQotICogCi0gKiBVbmxpa2UgSW1hZ2VEYXRhLCBuZ19iaXRtYXBfaW1hZ2VfdCBhbmQgYWxsIGl0cyBhcGkgYXJlICdpbnRlcm5hbCcuCi0gKiBUaGUgYXBpIG1hcmtlZCAncHVibGljJyBpcyBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBjYW4gYmUgdXNlZAotICogYnkgdGhlIHJlc3Qgb2YgdGhlIG5hdGl2ZSBncmFwaGljIGxpYnJhcnkuCi0gKi8KLQotI2luY2x1ZGUgIk5nQ29tbW9uLmgiCi0KLXR5cGVkZWYgc3RydWN0IG5nX2JpdG1hcF9pbWFnZV90IG5nX2JpdG1hcF9pbWFnZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUJZVEUxIGJsdWU7Ci0JVUJZVEUxIGdyZWVuOwotCVVCWVRFMSByZWQ7Ci19IG5nX2NvbG9yX21hcF9lbnRyeV90OwotCi0vKiBJbWFnZURhdGEgaW4gU1dUIGV4cGVjdHMgUkdCIG5vdCBCR1IgKi8KLWVudW0geyBSZWRPZmZzZXQ9MCwgR3JlZW5PZmZzZXQ9MSwgQmx1ZU9mZnNldD0yIH07Ci0KLXN0cnVjdCBuZ19iaXRtYXBfaW1hZ2VfdCB7Ci0JLyogV2lkdGggaW4gYnl0ZXMgb2YgZWFjaCByb3cgKi8KLQlVQllURTQgcm93X3dpZHRoOwotCS8qIE51bWJlciBvZiBiaXRzIHBlciBwaXhlbCAoZGVwdGgpIDEsIDIsIDQsIDgsIDE2IG9yIDI0ICovCi0JVUJZVEU0IGJpdF9jb3VudDsKLQlVQllURTQgaW1hZ2Vfd2lkdGg7Ci0JVUJZVEU0IGltYWdlX2hlaWdodDsKLQkvKiBpbWFnZSBkYXRhCi0JICogMjQtYml0IGltYWdlcywgMyBieXRlcyBwZXIgcGl4ZWwgcmVwcmVzZW50aW5nIFJHQiB2YWx1ZXMKLQkgKiAzMiBiaXQgaW1hZ2VzLCA0IGJ5dGVzIHBlciBwaXhlbCByZXByZXNlbnRpbmcgUkdCIHZhbHVlcyArIG9uZSB3YXN0ZWQgYnl0ZQotCSAqIDE2IGJpdCBpbWFnZXMsIDIgYnl0ZXMgcGVyIHBpeGVsCi0JICogcmVzdCAoMSwgMiwgNCwgOCk6IGluZGV4IGludG8gY29sb3IgbWFwCi0JICovCi0JVUJZVEUxICppbWFnZV9kYXRhOwotCS8qIGFscGhhIGRhdGEgKGVpdGhlciBOVUxMIG9yIG9mIHNpemUgaW1hZ2Vfd2lkdGgqaW1hZ2VfaGVpZ2h0KSAqLwotCVVCWVRFMSAqYWxwaGFfZGF0YTsKLQkvKiB0cmFuc3BhcmVudCBwaXhlbCAtIGRlZmF1bHQgaXMgLTEgd2hpY2ggbWVhbnMgbm8gdHJhbnNwYXJlbnQgcGl4ZWwgKi8KLQlCWVRFNCB0cmFuc3BhcmVudF9waXhlbDsKLQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBjb2xvciBtYXAgKi8KLQlVQllURTQgY29sb3JfY291bnQ7Ci0JbmdfY29sb3JfbWFwX2VudHJ5X3QgKmNvbG9yX21hcDsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFB1YmxpYyBBUEkgbmdfYml0bWFwX2ltYWdlX3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogSW5pdCBhbiBpbWFnZQotICovCi12b2lkIE5nQml0bWFwSW1hZ2VJbml0IChuZ19iaXRtYXBfaW1hZ2VfdCAqKTsKLQotLyoqCi0gKiBEaXNwb3NlIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoZSBpbWFnZS4KLSAqLwotdm9pZCBOZ0JpdG1hcEltYWdlRnJlZSAobmdfYml0bWFwX2ltYWdlX3QgKik7Ci0KLS8qKgotICogQWNjZXNzIHN0YXJ0IG9mIGltYWdlIGRhdGEKLSAqIHJldHVybjogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFVCWVRFMSBvZiBzaXplIGltYWdlX3JvdyAqIGltYWdlX3dpZHRoCi0gKiBzaWduYXR1cmU6IFVCWVRFMSAqTmdCaXRtYXBJbWFnZUltYWdlRGF0YSAobmdfYml0bWFwX2ltYWdlX3QgKmltYWdlKQotICovCi0jZGVmaW5lIE5nQml0bWFwSW1hZ2VJbWFnZURhdGEoaW1hZ2UpICgoaW1hZ2UpLT5pbWFnZV9kYXRhKQotCi0vKioKLSAqIHNpZ25hdHVyZTogVUJZVEU0IE5nQml0bWFwSW1hZ2VXaWR0aCAobmdfYml0bWFwX2ltYWdlX3QgKmltYWdlKQotICovCi0jZGVmaW5lIE5nQml0bWFwSW1hZ2VXaWR0aChpbWFnZSkgKChpbWFnZSktPmltYWdlX3dpZHRoKQotCi0vKioKLSAqIHNpZ25hdHVyZTogVUJZVEU0IE5nQml0bWFwSW1hZ2VIZWlnaHQgKG5nX2JpdG1hcF9pbWFnZV90ICppbWFnZSkKLSAqLwotI2RlZmluZSBOZ0JpdG1hcEltYWdlSGVpZ2h0KGltYWdlKSAoKGltYWdlKS0+aW1hZ2VfaGVpZ2h0KQotCi0vKioKLSAqIHNpZ25hdHVyZTogVUJZVEU0IE5nQml0bWFwSW1hZ2VCaXRDb3VudCAobmdfYml0bWFwX2ltYWdlX3QgKmltYWdlKQotICovCi0jZGVmaW5lIE5nQml0bWFwSW1hZ2VCaXRDb3VudChpbWFnZSkgKChpbWFnZSktPmJpdF9jb3VudCkKLQotLyoqCi0gKiBzaWduYXR1cmU6IFVCWVRFNCBOZ0JpdG1hcEltYWdlQ29sb3JDb3VudCAobmdfYml0bWFwX2ltYWdlX3QgKmltYWdlKQotICovCi0jZGVmaW5lIE5nQml0bWFwSW1hZ2VDb2xvckNvdW50KGltYWdlKSAoKGltYWdlKS0+Y29sb3JfY291bnQpCi0KLS8qKgotICogQWNjZXNzIGEgcm93IG9mIHRoZSBpbWFnZQotICogcm93OiBhIHZhbHVlIHdoaWNoIG11c3QgYmUgYmV0d2VlbiAwIGFuZCBpbWFnZV9oZWlnaHQtMQotICogcmV0dXJuOiBhIHBvaW50ZXIgdG8gdGhlIGRlc2lyZWQgcm93LCB3aGljaCBpcyBhbiBhcnJheSBvZiBzaXplIHJvd193aWR0aAotICogc2lnbmF0dXJlOiBVQllURTEgKk5nQml0bWFwSW1hZ2VHZXRSb3cgKG5nX2JpdG1hcF9pbWFnZV90ICppbWFnZSwgVUJZVEU0IHJvdykKLSAqLwotI2RlZmluZSBOZ0JpdG1hcEltYWdlR2V0Um93KGltYWdlLCByb3cpICgmaW1hZ2UtPmltYWdlX2RhdGFbcm93ICogaW1hZ2UtPnJvd193aWR0aF0pCi0KLS8qKgotICogc2lnbmF0dXJlOiBVQllURTQgTmdCaXRtYXBJbWFnZUJ5dGVzUGVyUm93IChuZ19iaXRtYXBfaW1hZ2VfdCAqaW1hZ2UpCi0gKi8KLSNkZWZpbmUgTmdCaXRtYXBJbWFnZUJ5dGVzUGVyUm93KGltYWdlKSAoKGltYWdlKS0+cm93X3dpZHRoKQotCi0vKioKLSAqIFJldHJpZXZlIGFuIGVudHJ5IGZyb20gdGhlIGNvbG9yIG1hcAotICogaW5kZXg6IGEgdmFsdWUgd2hpY2ggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIGNvbG9yX2NvdW50LTEKLSAqLwotbmdfY29sb3JfbWFwX2VudHJ5X3QgKk5nQml0bWFwSW1hZ2VDb2xvck1hcCAobmdfYml0bWFwX2ltYWdlX3QgKiwgVUJZVEU0IGluZGV4KTsKLQotLyoqCi0gKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSB0cmFuc3BhcmVudCBwaXhlbAotICogc2lnbmF0dXJlOiBCWVRFNCBOZ0JpdG1hcEltYWdlR2V0VHJhbnNwYXJlbnQgKG5nX2JpdG1hcF9pbWFnZV90ICppbWFnZSkKLSAqLwotI2RlZmluZSBOZ0JpdG1hcEltYWdlR2V0VHJhbnNwYXJlbnQoaW1hZ2UpICgoaW1hZ2UpLT50cmFuc3BhcmVudF9waXhlbCkKLQotLyoqCi0gKiBHZXQgdGhlIGFscGhhIGRhdGEKLSAqIHNpZ25hdHVyZTogVUJZVEUxICpOZ0JpdG1hcEltYWdlR2V0QWxwaGEgKG5nX2JpdG1hcF9pbWFnZV90KiBpbWFnZSkKLSAqLwotI2RlZmluZSBOZ0JpdG1hcEltYWdlR2V0QWxwaGEoaW1hZ2UpICgoaW1hZ2UpLT5hbHBoYV9kYXRhKQotCi12b2lkIE5nQml0bWFwSW1hZ2VCbGl0RGlyZWN0VG9EaXJlY3QoCi0JVUJZVEUxICpzcmNEYXRhLCBCWVRFNCBzcmNTdHJpZGUsCi0JQllURTQgc3JjV2lkdGgsIEJZVEU0IHNyY0hlaWdodCwKLQlVQllURTEgKmRlc3REYXRhLCBCWVRFNCBkZXN0RGVwdGgsIEJZVEU0IGRlc3RTdHJpZGUsIEJZVEU0IGRlc3RPcmRlciwKLQlVQllURTQgZGVzdFJlZE1hc2ssIFVCWVRFNCBkZXN0R3JlZW5NYXNrLCBVQllURTQgZGVzdEJsdWVNYXNrKTsKLQotLyogU2l6ZSBvZiBoYXNoIHRhYmxlIHVzZWQgaW4gTmdCaXRtYXBJbWFnZUJsaXREaXJlY3RUb1BhbGV0dGUgKi8KLSNkZWZpbmUgUkdCSW5kZXhUYWJsZVNpemUgMTAzCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlVQllURTEgaXNTZXQ7Ci0JVUJZVEUxIGJsdWU7Ci0JVUJZVEUxIGdyZWVuOwotCVVCWVRFMSByZWQ7Ci0JVUJZVEUxIGluZGV4OwotfSBuZ19wYWxldHRlX2J1Y2tldF90OwotCQotdm9pZCBOZ0JpdG1hcEltYWdlQmxpdERpcmVjdFRvUGFsZXR0ZSgKLQlVQllURTEgKnNyY0RhdGEsIEJZVEU0IHNyY1N0cmlkZSwKLQlCWVRFNCBzcmNXaWR0aCwgQllURTQgc3JjSGVpZ2h0LAotCVVCWVRFMSAqZGVzdERhdGEsIEJZVEU0IGRlc3REZXB0aCwgQllURTQgZGVzdFN0cmlkZSwgQllURTQgZGVzdE9yZGVyLAotCVVCWVRFMSAqZGVzdENvbG9ycywgaW50IGRlc3ROdW1Db2xvcnMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQcml2YXRlIEFQSSBuZ19iaXRtYXBfaW1hZ2VfdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJvdW5kIGVhY2ggcm93IHRvICovCi0jZGVmaW5lIFJvd1JvdW5kaW5nIDQKLQotdm9pZCBOZ0JpdG1hcEltYWdlSW5pdGlhbGl6ZSAobmdfYml0bWFwX2ltYWdlX3QgKik7Ci12b2lkIE5nQml0bWFwSW1hZ2VDbGVhckRhdGEgKG5nX2JpdG1hcF9pbWFnZV90ICopOwotCi12b2lkIE5nQml0bWFwSW1hZ2VTZXRTaXplKG5nX2JpdG1hcF9pbWFnZV90ICosCi0JCQkJCQkgICBVQllURTQgY29sb3JfY291bnQsCi0JCQkJCQkgICBVQllURTQgYml0cywKLQkJCQkJCSAgIFVCWVRFNCB3aWR0aCwKLQkJCQkJCSAgIFVCWVRFNCBoZWlnaHQpOwotCi0jZW5kaWYgLyogTkdfSU1BR0VEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvTmdXaW5CTVBGaWxlRm9ybWF0LmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL05nV2luQk1QRmlsZUZvcm1hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhiNzdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvTmdXaW5CTVBGaWxlRm9ybWF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5nQ29tbW9uLmgiCi0jaW5jbHVkZSAiTmdXaW5CTVBGaWxlRm9ybWF0LmgiCi0KLSNkZWZpbmUgQk1QSGVhZGVyRml4ZWRTaXplIDQwCi0KLUJZVEU0IGRlY29tcHJlc3NSTEU0RGF0YShCWVRFMSAqc3JjLCBCWVRFNCBudW1CeXRlcywgQllURTQgc3RyaWRlLCBCWVRFMSAqZGVzdCwgQllURTQgZGVzdFNpemUpCi17Ci0JQllURTQgc3AgPSAwOwotCUJZVEU0IHNlID0gbnVtQnl0ZXM7Ci0JQllURTQgZHAgPSAwOwotCUJZVEU0IGRlID0gZGVzdFNpemU7Ci0JQllURTQgeCA9IDAsIHkgPSAwOwotCUJZVEU0IGk7Ci0Jd2hpbGUgKHNwIDwgc2UpCi0JewotCQlpbnQgbGVuID0gc3JjW3NwXSAmIDB4RkY7Ci0JCXNwKys7Ci0JCWlmIChsZW4gPT0gMCkgCi0JCXsKLQkJCWxlbiA9IHNyY1tzcF0gJiAweEZGOwotCQkJc3ArKzsKLQkJCXN3aXRjaCAobGVuKSAKLQkJCXsKLQkJCQljYXNlIDA6IC8qIGVuZCBvZiBsaW5lICovCi0JCQkJCXkrKzsKLQkJCQkJeCA9IDA7Ci0JCQkJCWRwID0geSAqIHN0cmlkZTsKLQkJCQkJaWYgKGRwID49IGRlKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6IC8qIGVuZCBvZiBiaXRtYXAgKi8KLQkJCQkJcmV0dXJuIDE7Ci0JCQkJY2FzZSAyOiAvKiBkZWx0YSAqLwotCQkJCQl4ICs9IHNyY1tzcF0gJiAweEZGOwotCQkJCQlzcCsrOwotCQkJCQl5ICs9IHNyY1tzcF0gJiAweEZGOwotCQkJCQlzcCsrOwotCQkJCQlkcCA9IHkgKiBzdHJpZGUgKyB4IC8gMjsKLQkJCQkJaWYgKGRwID49IGRlKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OiAvKiBhYnNvbHV0ZSBtb2RlIHJ1biAqLwotCQkJCQlpZiAoKGxlbiAmIDEpICE9IDApIC8qIG9kZCBydW4gbGVuZ3RocyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLwotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl4ICs9IGxlbjsKLQkJCQkJbGVuID0gbGVuIC8gMjsKLQkJCQkJaWYgKGxlbiA+IChzZSAtIHNwKSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJaWYgKGxlbiA+IChkZSAtIGRwKSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSAKLQkJCQkJewotCQkJCQkJZGVzdFtkcF0gPSBzcmNbc3BdOwotCQkJCQkJZHArKzsKLQkJCQkJCXNwKys7Ci0JCQkJCX0KLQkJCQkJaWYgKChzcCAmIDEpICE9IDApCi0JCQkJCQlzcCsrOyAvKiB3b3JkIGFsaWduIHNwPyAqLwotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIAotCQl7Ci0JCQlCWVRFMSB0aGVCeXRlOwotCQkJaWYgKChsZW4gJiAxKSAhPSAwKQotCQkJCXJldHVybiAtMTsKLQkJCXggKz0gbGVuOwotCQkJbGVuID0gbGVuIC8gMjsKLQkJCXRoZUJ5dGUgPSBzcmNbc3BdOwotCQkJc3ArKzsKLQkJCWlmIChsZW4gPiAoZGUgLSBkcCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSAKLQkJCXsKLQkJCQlkZXN0W2RwXSA9IHRoZUJ5dGU7Ci0JCQkJZHArKzsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLQotQllURTQgZGVjb21wcmVzc1JMRThEYXRhKEJZVEUxICpzcmMsIEJZVEU0IG51bUJ5dGVzLCBCWVRFNCBzdHJpZGUsIEJZVEUxICpkZXN0LCBCWVRFNCBkZXN0U2l6ZSkKLXsKLQlCWVRFNCBzcCA9IDA7Ci0JQllURTQgc2UgPSBudW1CeXRlczsKLQlCWVRFNCBkcCA9IDA7Ci0JQllURTQgZGUgPSBkZXN0U2l6ZTsKLQlCWVRFNCB4ID0gMCwgeSA9IDA7Ci0JQllURTQgaTsKLQl3aGlsZSAoc3AgPCBzZSkgewotCQlpbnQgbGVuID0gc3JjW3NwXSAmIDB4RkY7Ci0JCXNwKys7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJbGVuID0gc3JjW3NwXSAmIDB4RkY7Ci0JCQlzcCsrOwotCQkJc3dpdGNoIChsZW4pCi0JCQl7Ci0JCQkJY2FzZSAwOiAvKiBlbmQgb2YgbGluZSAqLwotCQkJCQl5Kys7Ci0JCQkJCXggPSAwOwotCQkJCQlkcCA9IHkgKiBzdHJpZGU7Ci0JCQkJCWlmIChkcCA+PSBkZSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOiAvKiBlbmQgb2YgYml0bWFwICovCi0JCQkJCXJldHVybiAxOwotCQkJCWNhc2UgMjogLyogZGVsdGEgKi8KLQkJCQkJeCArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJeSArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJZHAgPSB5ICogc3RyaWRlICsgeDsKLQkJCQkJaWYgKGRwID49IGRlKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OiAvKiBhYnNvbHV0ZSBtb2RlIHJ1biAqLwotCQkJCQlpZiAobGVuID4gKHNlIC0gc3ApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlpZiAobGVuID4gKGRlIC0gZHApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJCXsKLQkJCQkJCWRlc3RbZHBdID0gc3JjW3NwXTsKLQkJCQkJCWRwKys7Ci0JCQkJCQlzcCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoc3AgJiAxKSAhPSAwKQotCQkJCQkJc3ArKzsgLyogd29yZCBhbGlnbiBzcD8gKi8KLQkJCQkJeCArPSBsZW47Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgCi0JCXsKLQkJCUJZVEUxIHRoZUJ5dGUgPSBzcmNbc3BdOwotCQkJc3ArKzsKLQkJCWlmIChsZW4gPiAoZGUgLSBkcCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJewotCQkJCWRlc3RbZHBdID0gdGhlQnl0ZTsKLQkJCQlkcCsrOwotCQkJfQotCQkJeCArPSBsZW47Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLW5nX2Vycl90IGRlY29tcHJlc3NEYXRhIChCWVRFMSAqc3JjLCBCWVRFNCBudW1CeXRlcywgQllURTEgKmRlc3QsIEJZVEU0IGRlc3RTaXplLCBCWVRFNCBzdHJpZGUsIEJZVEU0IGNtcCkKLXsKLQlpZiAoY21wID09IDEpCi0JewotCQkvKiBCTVBfUkxFOF9DT01QUkVTU0lPTiAqLwotCQlpZiAoZGVjb21wcmVzc1JMRThEYXRhIChzcmMsIG51bUJ5dGVzLCBzdHJpZGUsIGRlc3QsIGRlc3RTaXplKSA8PSAwKQotCQkJcmV0dXJuIE5nRXJyb3IgKEVSUl9ORywgIkVycm9yIGRlY29tcHJlc3NSTEU4RGF0YSBmYWlsZWQiKTsKLQl9IGVsc2UgaWYgKGNtcCA9PSAyKQotCXsKLQkJLyogQk1QX1JMRTRfQ09NUFJFU1NJT04gKi8KLQkJaWYgKGRlY29tcHJlc3NSTEU0RGF0YSAoc3JjLCBudW1CeXRlcywgc3RyaWRlLCBkZXN0LCBkZXN0U2l6ZSkgPD0gMCkKLQkJCXJldHVybiBOZ0Vycm9yIChFUlJfTkcsICJFcnJvciBkZWNvbXByZXNzUkxFNERhdGEgZmFpbGVkIik7Ci0JfSBlbHNlIAotCXsKLQkJcmV0dXJuIE5nRXJyb3IgKEVSUl9ORywgIkVycm9yIGRlY29tcHJlc3NEYXRhIGZhaWxlZCAtIHVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIik7Ci0JfQotCXJldHVybiBFUlJfT0s7Ci19Ci0KLXZvaWQgZmxpcFNjYW5MaW5lcyhCWVRFMSAqZGF0YSwgQllURTQgbnVtQnl0ZXMsIGludCBzdHJpZGUsIGludCBoZWlnaHQpCi17Ci0JQllURTQgaTEgPSAwOwotCUJZVEU0IGkyID0gKGhlaWdodCAtIDEpICogc3RyaWRlOwotCUJZVEU0IGksIGluZGV4OwotCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyBpKyspCi0JewotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzdHJpZGU7IGluZGV4KyspCi0JCXsKLQkJCUJZVEUxIGIgPSBkYXRhW2luZGV4ICsgaTFdOwotCQkJZGF0YVtpbmRleCArIGkxXSA9IGRhdGFbaW5kZXggKyBpMl07Ci0JCQlkYXRhW2luZGV4ICsgaTJdID0gYjsKLQkJfQotCQlpMSArPSBzdHJpZGU7Ci0JCWkyIC09IHN0cmlkZTsKLQl9Ci19Ci0KLS8qKgotICogQm1wRGVjb2RlclJlYWRJbWFnZQotICogCi0gKiBEZWNvZGUgdGhlIGNvbnRlbnQgb2YgYSBibXAgZmlsZS4gCi0gKgotICogaW4gICAgOiB0aGUgaW5wdXQgc3RyZWFtCi0gKiBpbWFnZSA6IGEgcG9pbnRlciB0byBhIG5nX2JpdG1hcF9pbWFnZV90Ci0gKgotICogcmV0dXJuOiBFUlJfT0sgaWYgdGhlIGltYWdlIHdhcyBjb3JyZWN0bHkgYnVpbHQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCi0gKgkJICAgRVJSX05HIG90aGVyd2lzZS4KLSAqLwotbmdfZXJyX3QgTmdCbXBEZWNvZGVyUmVhZEltYWdlIChuZ19zdHJlYW1fdCAqaW4sIG5nX2JpdG1hcF9pbWFnZV90ICppbWFnZSkKLXsKLQlCWVRFNCAqZmlsZUhlYWRlciA9IChCWVRFNCopIE5nTWFsbG9jICg1ICogc2l6ZW9mKEJZVEU0KSk7Ci0JQllURTEgKmluZm9IZWFkZXIsICpkYXRhOwotCUJZVEU0IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGF0YVNpemUsIGNtcCwgcG9zOwkKLQlCWVRFMiBkZXB0aDsKLQlCWVRFMiBkMDsKLQkKLQlOZ1N0cmVhbVJlYWQgKGluLCAoY2hhciAqKSAmZDAsIHNpemVvZihCWVRFMikpOwotCWZpbGVIZWFkZXJbMF0gPSAoQllURTQpTGl0dGxlRW5kaWFuVG9TeXN0ZW1VQllURTIoZDApOwotCU5nU3RyZWFtUmVhZCAoaW4sIChjaGFyICopICZmaWxlSGVhZGVyWzFdLCBzaXplb2YoQllURTQpKTsKLQlmaWxlSGVhZGVyWzFdID0gTGl0dGxlRW5kaWFuVG9TeXN0ZW1VQllURTQoZmlsZUhlYWRlclsxXSk7Ci0JTmdTdHJlYW1SZWFkIChpbiwgKGNoYXIgKikgJmQwLCBzaXplb2YoQllURTIpKTsKLQlmaWxlSGVhZGVyWzJdID0gKEJZVEU0KUxpdHRsZUVuZGlhblRvU3lzdGVtVUJZVEUyKGQwKTsKLQlOZ1N0cmVhbVJlYWQgKGluLCAoY2hhciAqKSAmZDAsIHNpemVvZihCWVRFMikpOwotCWZpbGVIZWFkZXJbM10gPSAoQllURTQpTGl0dGxlRW5kaWFuVG9TeXN0ZW1VQllURTIoZDApOwotCU5nU3RyZWFtUmVhZCAoaW4sIChjaGFyICopICZmaWxlSGVhZGVyWzRdLCBzaXplb2YoQllURTQpKTsKLQlmaWxlSGVhZGVyWzRdID0gTGl0dGxlRW5kaWFuVG9TeXN0ZW1VQllURTQoZmlsZUhlYWRlcls0XSk7Ci0JCi0JaWYgKE5nU3RyZWFtRW9mIChpbikpCi0JewotCQlOZ0ZyZWUgKGZpbGVIZWFkZXIpOwotCQlyZXR1cm4gTmdFcnJvciAoRVJSX05HLCAiRXJyb3IgaW52YWxpZCBoZWFkZXIgZmlsZSIpOwotCX0KLQlpZiAoZmlsZUhlYWRlclswXSAhPSAweDRENDIpCi0JewotCQlOZ0ZyZWUgKGZpbGVIZWFkZXIpOwotCQlyZXR1cm4gTmdFcnJvciAoRVJSX05HLCAiRXJyb3Igbm90IGEgQk1QIGZpbGUiKTsKLQl9Ci0JCi0JaW5mb0hlYWRlciA9IChCWVRFMSopIE5nTWFsbG9jIChCTVBIZWFkZXJGaXhlZFNpemUgKiBzaXplb2YgKEJZVEUxKSk7CQotCU5nU3RyZWFtUmVhZCAoaW4sIGluZm9IZWFkZXIsIEJNUEhlYWRlckZpeGVkU2l6ZSAqIHNpemVvZiAoQllURTEpKTsKLQkKLQlpZiAoTmdTdHJlYW1Fb2YgKGluKSkKLQl7Ci0JCU5nRnJlZSAoZmlsZUhlYWRlcik7Ci0JCU5nRnJlZSAoaW5mb0hlYWRlcik7Ci0JCXJldHVybiBOZ0Vycm9yIChFUlJfTkcsICJFcnJvciBpbnZhbGlkIGluZm8gaGVhZGVyIik7Ci0JfQotCQotCU5nTWVtQ3B5ICgmd2lkdGgsICZpbmZvSGVhZGVyWzRdLCBzaXplb2YgKEJZVEU0KSk7Ci0Jd2lkdGggPSBMaXR0bGVFbmRpYW5Ub1N5c3RlbVVCWVRFNCh3aWR0aCk7Ci0KLQlOZ01lbUNweSAoJmhlaWdodCwgJmluZm9IZWFkZXJbOF0sIHNpemVvZiAoQllURTQpKTsKLQloZWlnaHQgPSBMaXR0bGVFbmRpYW5Ub1N5c3RlbVVCWVRFNChoZWlnaHQpOwotCQotCU5nTWVtQ3B5ICgmZGVwdGgsICZpbmZvSGVhZGVyWzE0XSwgc2l6ZW9mIChCWVRFMikpOwotCWRlcHRoID0gTGl0dGxlRW5kaWFuVG9TeXN0ZW1VQllURTIoZGVwdGgpOwotCi0Jc3RyaWRlID0gKHdpZHRoICogZGVwdGggKyA3KSAvIDg7Ci0Jc3RyaWRlID0gKHN0cmlkZSArIDMpIC8gNCAqIDQ7IC8qIFJvdW5kIHVwIHRvIDQgYnl0ZSBtdWx0aXBsZSAqLwotCi0JaWYgKGRlcHRoIDw9IDgpCi0JewotCQlCWVRFNCBpLCBpbmRleDsKLQkJQllURTEgKmNvbG9yczsKLQkJQllURTQgbnVtQ29sb3JzOwotCQlOZ01lbUNweSAoJm51bUNvbG9ycywgJmluZm9IZWFkZXJbMzJdLCBzaXplb2YgKEJZVEU0KSk7Ci0JCW51bUNvbG9ycyA9IExpdHRsZUVuZGlhblRvU3lzdGVtVUJZVEU0KG51bUNvbG9ycyk7Ci0JCWlmIChudW1Db2xvcnMgPT0gMCkKLQkJewotCQkJQllURTIgdmFsdWU7Ci0JCQlOZ01lbUNweSAoJnZhbHVlLCAmaW5mb0hlYWRlclsxNF0sIHNpemVvZiAoQllURTIpKTsKLQkJCXZhbHVlID0gTGl0dGxlRW5kaWFuVG9TeXN0ZW1VQllURTIodmFsdWUpOwotCQkJbnVtQ29sb3JzID0gMSA8PCB2YWx1ZTsKLQkJfSBlbHNlCi0JCXsKLQkJCWlmIChudW1Db2xvcnMgPiAyNTYpCi0JCQkJbnVtQ29sb3JzID0gMjU2OwotCQl9Ci0JCWNvbG9ycyA9IChCWVRFMSopIE5nTWFsbG9jIChudW1Db2xvcnMgKiA0KTsKLQkJTmdTdHJlYW1SZWFkIChpbiwgY29sb3JzLCBudW1Db2xvcnMgKiA0KTsKLQkJCi0JCWlmIChOZ1N0cmVhbUVvZiAoaW4pKQotCQl7Ci0JCQlOZ0ZyZWUgKGZpbGVIZWFkZXIpOwotCQkJTmdGcmVlIChpbmZvSGVhZGVyKTsKLQkJCU5nRnJlZSAoY29sb3JzKTsKLQkJCXJldHVybiBOZ0Vycm9yIChFUlJfTkcsICJFcnJvciBpbnZhbGlkIHBhbGV0dGUgaW5mbyIpOwotCQl9IAotCQkKLQkJaW5kZXggPSAwOwotCQkKLQkJTmdCaXRtYXBJbWFnZVNldFNpemUoaW1hZ2UsIChVQllURTQpbnVtQ29sb3JzLCAoVUJZVEU0KWRlcHRoLAotCQkJKFVCWVRFNCl3aWR0aCwgKFVCWVRFNCloZWlnaHQpOwotCQkJCi0JCWZvciAoaSA9IDA7IGkgPCBudW1Db2xvcnM7IGkrKykKLQkJewotCQkJbmdfY29sb3JfbWFwX2VudHJ5X3QgKmNvbG9yX21hcCA9IE5nQml0bWFwSW1hZ2VDb2xvck1hcCAoaW1hZ2UsIGkpOwotCQkJY29sb3JfbWFwLT5ibHVlID0gY29sb3JzW2luZGV4KytdOwotCQkJY29sb3JfbWFwLT5ncmVlbiA9IGNvbG9yc1tpbmRleCsrXTsKLQkJCWNvbG9yX21hcC0+cmVkID0gY29sb3JzW2luZGV4KytdOwotCQkJaW5kZXgrKzsKLQkJfQotCQkKLQkJTmdGcmVlIChjb2xvcnMpOwotCX0gZWxzZQotCXsKLQkJLyogZGlyZWN0IC0gMTYgYW5kIDI0IGJpdHMgKi8KLQkJTmdCaXRtYXBJbWFnZVNldFNpemUoaW1hZ2UsIDAsIChVQllURTQpZGVwdGgsCi0JCQkoVUJZVEU0KXdpZHRoLCAoVUJZVEU0KWhlaWdodCk7Ci0JfQotCQotCXBvcyA9IE5nU3RyZWFtR2V0UG9zaXRpb24gKGluKTsKLQlpZiAocG9zIDwgZmlsZUhlYWRlcls0XSkKLQl7Ci0JCU5nU3RyZWFtU2tpcCAoaW4sIGZpbGVIZWFkZXJbNF0gLSBwb3MpOwotCX0KLQkKLQlkYXRhU2l6ZSA9IGhlaWdodCAqIHN0cmlkZTsKLQkKLQlkYXRhID0gKEJZVEUxKilOZ0JpdG1hcEltYWdlSW1hZ2VEYXRhKGltYWdlKTsKLQlOZ01lbUNweSAoJmNtcCwgJmluZm9IZWFkZXJbMTZdLCBzaXplb2YgKEJZVEU0KSk7Ci0JY21wID0gTGl0dGxlRW5kaWFuVG9TeXN0ZW1VQllURTQoY21wKTsKLQlpZiAoY21wID09IDApCi0JewotCQkvKiBCTVBfTk9fQ09NUFJFU1NJT04gKi8KLQkJQllURTQgY250OwotCQljbnQgPSBOZ1N0cmVhbVJlYWQgKGluLCBkYXRhLCBkYXRhU2l6ZSk7Ci0JCWlmIChjbnQgIT0gZGF0YVNpemUpCi0JCXsKLQkJCU5nRnJlZSAoZmlsZUhlYWRlcik7Ci0JCQlOZ0ZyZWUgKGluZm9IZWFkZXIpOwotCQkJcmV0dXJuIE5nRXJyb3IgKEVSUl9ORywgIkVycm9yIGZhaWxlZCByZWFkaW5nIHVuY29tcHJlc3NlZCBkYXRhIik7Ci0JCX0KLQl9IGVsc2UKLQl7Ci0JCUJZVEU0IGNvbXByZXNzZWRTaXplOwotCQlCWVRFMSAqY29tcHJlc3NlZDsKLQkJQllURTQgY250OwotCQluZ19lcnJfdCByZXM7Ci0JCU5nTWVtQ3B5ICgmY29tcHJlc3NlZFNpemUsICZpbmZvSGVhZGVyWzIwXSwgc2l6ZW9mIChCWVRFNCkpOwotCQljb21wcmVzc2VkU2l6ZSA9IExpdHRsZUVuZGlhblRvU3lzdGVtVUJZVEU0KGNvbXByZXNzZWRTaXplKTsKLQkJY29tcHJlc3NlZCA9IChCWVRFMSopIE5nTWFsbG9jIChjb21wcmVzc2VkU2l6ZSAqIHNpemVvZiAoQllURTEpKTsKLQkJY250ID0gTmdTdHJlYW1SZWFkIChpbiwgY29tcHJlc3NlZCwgY29tcHJlc3NlZFNpemUpOwotCQlpZiAoY250ICE9IGNvbXByZXNzZWRTaXplKQotCQl7Ci0JCQlOZ0ZyZWUgKGZpbGVIZWFkZXIpOwotCQkJTmdGcmVlIChpbmZvSGVhZGVyKTsKLQkJCU5nRnJlZSAoY29tcHJlc3NlZCk7Ci0JCQlyZXR1cm4gTmdFcnJvciAoRVJSX05HLCAiRXJyb3IgZmFpbGVkIHJlYWRpbmcgY29tcHJlc3NlZCBkYXRhIik7Ci0JCX0KLQkJcmVzID0gZGVjb21wcmVzc0RhdGEgKGNvbXByZXNzZWQsIGNvbXByZXNzZWRTaXplLCBkYXRhLCBkYXRhU2l6ZSwgc3RyaWRlLCBjbXApOwotCQlpZiAocmVzICE9IEVSUl9PSykKLQkJewotCQkJTmdGcmVlIChmaWxlSGVhZGVyKTsKLQkJCU5nRnJlZSAoaW5mb0hlYWRlcik7Ci0JCQlOZ0ZyZWUgKGNvbXByZXNzZWQpOwotCQkJcmV0dXJuIE5nRXJyb3IgKHJlcywgIkVycm9yIGZhaWxlZCBkYXRhIGRlY29tcHJlc3Npb24iKTsJCQkKLQkJfQotCQkJCQotCQlOZ0ZyZWUgKGNvbXByZXNzZWQpOwotCX0KLQkJCi0JZmxpcFNjYW5MaW5lcyhkYXRhLCBkYXRhU2l6ZSwgc3RyaWRlLCBoZWlnaHQpOwotCQotCU5nRnJlZSAoZmlsZUhlYWRlcik7Ci0JTmdGcmVlIChpbmZvSGVhZGVyKTsKLQlyZXR1cm4gRVJSX09LOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9OZ1dpbkJNUEZpbGVGb3JtYXQuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvTmdXaW5CTVBGaWxlRm9ybWF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjAxMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9OZ1dpbkJNUEZpbGVGb3JtYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19OR19XSU5CTVBGSUxFRk9STUFUX0gKLSNkZWZpbmUgX19OR19XSU5CTVBGSUxFRk9STUFUX0gKLQotLyoqCi0gKiBCTVAgRGVjb2RlcgotICovCi0jaW5jbHVkZSAiTmdDb21tb24uaCIKLSNpbmNsdWRlICJOZ0ltYWdlRGF0YS5oIgotCi0vKioKLSAqIEJtcERlY29kZXJSZWFkSW1hZ2UKLSAqIAotICogRGVjb2RlIHRoZSBjb250ZW50IG9mIGEgYm1wIGZpbGUuIAotICoKLSAqIGluICAgIDogdGhlIGlucHV0IHN0cmVhbQotICogaW1hZ2UgOiBhIHBvaW50ZXIgdG8gYSBuZ19iaXRtYXBfaW1hZ2VfdAotICoKLSAqIHJldHVybjogRVJSX09LIGlmIHRoZSBpbWFnZSB3YXMgY29ycmVjdGx5IGJ1aWx0IGZyb20gdGhlIGlucHV0IHN0cmVhbQotICoJCSAgIEVSUl9ORyBvdGhlcndpc2UuCi0gKi8KLW5nX2Vycl90IE5nQm1wRGVjb2RlclJlYWRJbWFnZSAobmdfc3RyZWFtX3QgKmluLCBuZ19iaXRtYXBfaW1hZ2VfdCAqaW1hZ2UpOwotCi0jZW5kaWYgLyogX19OR19XSU5CTVBGSUxFRk9STUFUX0ggKi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvYnVpbGQuc2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMwOTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvYnVpbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyEvYmluL3NoCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSMgICAgIFN1bWl0IFNhcmthciAoSGV3bGV0dC1QYWNrYXJkKQotIyBNYXJ0aW4gT2Jlcmh1YmVyIChXaW5kIFJpdmVyKSAtIFsxODU3MzRdIFN1cHBvcnQgYnVpbGRpbmcgd2l0aCBnY2MgYW5kIGRlYnVnCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIwotIyBVc2FnZTogc2ggYnVpbGQuc2ggWzxvcHRpb25hbCBzd2l0Y2hlcz5dIFtjbGVhbl0KLSMKLSMgICB3aGVyZSB0aGUgb3B0aW9uYWwgc3dpdGNoZXMgYXJlOgotIyAgICAgICAtb3V0cHV0IDxQUk9HUkFNX09VVFBVVD4gIC0gZXhlY3V0YWJsZSBmaWxlbmFtZSAoImVjbGlwc2UiKQotIyAgICAgICAtb3MgICAgIDxERUZBVUxUX09TPiAgICAgIC0gZGVmYXVsdCBFY2xpcHNlICItb3MiIHZhbHVlCi0jICAgICAgIC1hcmNoICAgPERFRkFVTFRfT1NfQVJDSD4gLSBkZWZhdWx0IEVjbGlwc2UgIi1hcmNoIiB2YWx1ZQotIyAgICAgICAtd3MgICAgIDxERUZBVUxUX1dTPiAgICAgIC0gZGVmYXVsdCBFY2xpcHNlICItd3MiIHZhbHVlCi0jCQktamF2YSAgIDxKQVZBX0hPTUU+CQkgIC0gamF2YSBpbnNndGFsbCBmb3Igam5pIGhlYWRlcnMKLSMKLSMgICBBbGwgb3RoZXIgYXJndW1lbnRzIGFyZSBkaXJlY3RseSBwYXNzZWQgdG8gdGhlICJtYWtlIiBwcm9ncmFtLgotIyAgIFRoaXMgc2NyaXB0IGNhbiBhbHNvIGJlIGludm9rZWQgd2l0aCB0aGUgImNsZWFuIiBhcmd1bWVudC4KLSMKLSMgICBFeGFtcGxlczoKLSMgICBzaCBidWlsZC5zaCBjbGVhbgotIyAgIHNoIGJ1aWxkLnNoIC1qYXZhIC91c3IvajJzZSBPUFRGTEFHPS1nIFBJQ0ZMQUc9LWZwaWMKLQotY2QgYGRpcm5hbWUgJDBgCi0KLSMgRGVmaW5lIGRlZmF1bHQgdmFsdWVzIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgbWFrZWZpbGVzLgotcHJvZ3JhbU91dHB1dD0iZWNsaXBzZSIKLWRlZmF1bHRPUz0iIgotZGVmYXVsdE9TQXJjaD0iIgotZGVmYXVsdFdTPSJtb3RpZiIKLWRlZmF1bHRKYXZhPURFRkFVTFRfSkFWQV9KTkkKLW1ha2VmaWxlPSIiCi1qYXZhSG9tZT0iIgotb3V0cHV0Um9vdD0iLi4vLi4vYmluIgotaWYgWyAiJE9TIiA9ICIiIF07ICB0aGVuCi0gICAgT1M9YHVuYW1lIC1zYAotZmkKLWlmIFsgIiRNT0RFTCIgPSAiIiBdOyAgdGhlbgotICAgIE1PREVMPWB1bmFtZSAtbWAKLWZpCi0KLWNhc2UgJE9TIGluCi0JIkFJWCIpCi0JCW1ha2VmaWxlPSJtYWtlX2FpeC5tYWsiCi0JCWRlZmF1bHRPUz0iYWl4IgotCQlkZWZhdWx0T1NBcmNoPSJwcGMiCi0JCWRlZmF1bHRXUz0ibW90aWYiCi0JCU1PVElGX0hPTUU9L3VzcgotCQlPVVRQVVRfRElSPSIuLi8uLi9iaW4vJGRlZmF1bHRXUy8kZGVmYXVsdE9TLyRkZWZhdWx0T1NBcmNoIgotCQk7OwotCSJMaW51eCIpCi0JCW1ha2VmaWxlPSJtYWtlX2xpbnV4Lm1hayIKLQkJZGVmYXVsdE9TPSJsaW51eCIKLQkJZGVmYXVsdE9TQXJjaD0ieDg2IgotCQlkZWZhdWx0V1M9Im1vdGlmIgotCQlYMTFfSE9NRT0vdXNyL1gxMVI2Ci0JCU1PVElGX0hPTUU9fi9tb3RpZjIxCi0JCU9VVFBVVF9ESVI9Ii4uLy4uL2Jpbi8kZGVmYXVsdFdTLyRkZWZhdWx0T1MvJGRlZmF1bHRPU0FyY2giCi0JCTs7Ci0JIlN1bk9TIikKLSMJCVBBVEg9L3Vzci9jY3MvYmluOi9vcHQvU1VOV3Nwcm8vYmluOiRQQVRICi0JCVBBVEg9L3Vzci9jY3MvYmluOi9leHBvcnQvaG9tZS9TVU5Xc3Byby9iaW46JFBBVEgKLQkJamF2YUhvbWU9Ii91c3IvamRrL2pkazEuNS4wXzAxIgotCQlvdXRwdXRSb290PSIuLi8uLi9jb250cmlidXRlZCIKLQkJZXhwb3J0IFBBVEgKLQkJbWFrZWZpbGU9Im1ha2Vfc29sYXJpcy5tYWsiCi0JCWRlZmF1bHRPUz0ic29sYXJpcyIKLQkJZGVmYXVsdE9TQXJjaD0ic3BhcmMiCi0JCWRlZmF1bHRXUz0ibW90aWYiCi0JCU9TPSJTb2xhcmlzIgotCQlYMTFfSE9NRT0vdXNyL29wZW53aW4KLQkJTU9USUZfSE9NRT0vdXNyL2R0Ci0JCU9VVFBVVF9ESVI9Ii4uLy4uL2Jpbi8kZGVmYXVsdFdTLyRkZWZhdWx0T1MvJGRlZmF1bHRPU0FyY2giCi0JCTs7Ci0JIkhQLVVYIikKLQkJWDExX0hPTUU9L3VzcgotCQlNT1RJRl9IT01FPS91c3IKLQkJY2FzZSAkTU9ERUwgaW4KLQkJCSJpYTY0IikKLQkJCQltYWtlZmlsZT0ibWFrZV9ocHV4X2lhNjRfMzIubWFrIgotCQkJCWRlZmF1bHRPUz0iaHB1eCIKLQkJCQlkZWZhdWx0T1NBcmNoPSJpYTY0XzMyIgotCQkJCWRlZmF1bHRXUz0ibW90aWYiCi0JCQkJT1VUUFVUX0RJUj0iLi4vLi4vYmluLyRkZWZhdWx0V1MvJGRlZmF1bHRPUy8kZGVmYXVsdE9TQXJjaCIKLQkJCQlqYXZhSG9tZT0iL29wdC9qYXZhMS41IgotCQkJCWRlZmF1bHRKYXZhPURFRkFVTFRfSkFWQV9FWEVDCi0JCQkJUEFUSD0vb3B0L2hwLWdjYy9iaW46JFBBVEgKLQkJCQlleHBvcnQgUEFUSAotCQkJCTs7Ci0gICAgICAgIAkqKQotCQkJCW1ha2VmaWxlPSJtYWtlX2hwdXhfUEFfUklTQy5tYWsiCi0JCQkJZGVmYXVsdE9TPSJocHV4IgotCQkJCWRlZmF1bHRPU0FyY2g9IlBBX1JJU0MiCi0JCQkJZGVmYXVsdFdTPSJtb3RpZiIKLQkJCQlPVVRQVVRfRElSPSIuLi8uLi9iaW4vJGRlZmF1bHRXUy8kZGVmYXVsdE9TLyRkZWZhdWx0T1NBcmNoIgotCQkJCTs7Ci0JCWVzYWMKLSAgICAgICAgOzsKLQkqKQotCQllY2hvICJVbmtub3duIE9TIC0tIGJ1aWxkIGFib3J0ZWQiCi0JCTs7Ci1lc2FjCi0KLSMgUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlcy4KLWV4dHJhQXJncz0iIgotd2hpbGUgWyAiJDEiICE9ICIiIF07IGRvCi0gICAgaWYgWyAiJDEiID0gIi1vcyIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotICAgICAgICBkZWZhdWx0T1M9IiQyIgotICAgICAgICBzaGlmdAotICAgIGVsaWYgWyAiJDEiID0gIi1hcmNoIiBdICYmIFsgIiQyIiAhPSAiIiBdOyB0aGVuCi0gICAgICAgIGRlZmF1bHRPU0FyY2g9IiQyIgotICAgICAgICBzaGlmdAotICAgIGVsaWYgWyAiJDEiID0gIi13cyIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotICAgICAgICBkZWZhdWx0V1M9IiQyIgotICAgICAgICBzaGlmdAotICAgIGVsaWYgWyAiJDEiID0gIi1vdXRwdXQiIF0gJiYgWyAiJDIiICE9ICIiIF07IHRoZW4KLSAgICAgICAgcHJvZ3JhbU91dHB1dD0iJDIiCi0gICAgICAgIHNoaWZ0Ci0JZWxpZiBbICIkMSIgPSAiLWphdmEiIF0gJiYgWyAiJDIiICE9ICIiIF07IHRoZW4KLSAgICAgICAgamF2YUhvbWU9IiQyIgotICAgICAgICBzaGlmdAotICAgIGVsc2UKLSAgICAgICAgZXh0cmFBcmdzPSIkZXh0cmFBcmdzICQxIgotICAgIGZpCi0gICAgc2hpZnQKLWRvbmUKLQotIyBTZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5lZWRlZCBieSB0aGUgbWFrZWZpbGVzLgotUFJPR1JBTV9PVVRQVVQ9IiRwcm9ncmFtT3V0cHV0IgotREVGQVVMVF9PUz0iJGRlZmF1bHRPUyIKLURFRkFVTFRfT1NfQVJDSD0iJGRlZmF1bHRPU0FyY2giCi1ERUZBVUxUX1dTPSIkZGVmYXVsdFdTIgotSkFWQV9IT01FPSRqYXZhSG9tZQotREVGQVVMVF9KQVZBPSRkZWZhdWx0SmF2YQotCi1MSUJSQVJZX0RJUj0iLi4vLi4vLi4vb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci4kZGVmYXVsdFdTLiRkZWZhdWx0T1MuJGRlZmF1bHRPU0FyY2giCi1PVVRQVVRfRElSPSIkb3V0cHV0Um9vdC8kZGVmYXVsdFdTLyRkZWZhdWx0T1MvJGRlZmF1bHRPU0FyY2giCi0KLWV4cG9ydCBPVVRQVVRfRElSIFBST0dSQU1fT1VUUFVUIERFRkFVTFRfT1MgREVGQVVMVF9PU19BUkNIIERFRkFVTFRfV1MgWDExX0hPTUUgTU9USUZfSE9NRSBKQVZBX0hPTUUgREVGQVVMVF9KQVZBIExJQlJBUllfRElSCi0KLSMgSWYgdGhlIE9TIGlzIHN1cHBvcnRlZCAoYSBtYWtlZmlsZSBleGlzdHMpCi1pZiBbICIkbWFrZWZpbGUiICE9ICIiIF07IHRoZW4KLQlpZiBbICIkZXh0cmFBcmdzIiAhPSAiIiBdOyB0aGVuCi0JCW1ha2UgLWYgJG1ha2VmaWxlICRleHRyYUFyZ3MKLQllbHNlCi0JCWVjaG8gIkJ1aWxkaW5nICRPUyBsYXVuY2hlci4gRGVmYXVsdHM6IC1vcyAkREVGQVVMVF9PUyAtYXJjaCAkREVGQVVMVF9PU19BUkNIIC13cyAkREVGQVVMVF9XUyIKLQkJbWFrZSAtZiAkbWFrZWZpbGUgY2xlYW4KLQkJY2FzZSB4JENDIGluCi0JCSAgeCpnY2MqKSBtYWtlIC1mICRtYWtlZmlsZSBhbGwgUElDRkxBRz0tZnBpYyA7OwotCQkgICopICAgICAgbWFrZSAtZiAkbWFrZWZpbGUgYWxsIDs7Ci0JCWVzYWMKLQlmaQotZWxzZQotCWVjaG8gIlVua25vd24gT1MgKCRPUykgLS0gYnVpbGQgYWJvcnRlZCIKLWZpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL2J1aWxkLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDMwOGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHByb2plY3QgZGVmYXVsdD0iYnVpbGRfZWNsaXBzZSIgYmFzZWRpcj0iLiI+Ci0KLTx0YXJnZXQgbmFtZT0iYnVpbGRfZWNsaXBzZSI+Ci0JPGV4ZWMgZGlyPSIuIiBleGVjdXRhYmxlPSJzaCI+Ci0JCTxhcmcgbGluZT0iJHtiYXNlZGlyfS9idWlsZC5zaCIvPgotCQk8YXJnIGxpbmU9Imluc3RhbGwiLz4KLQk8L2V4ZWM+Ci0JPGVjbGlwc2UucmVmcmVzaExvY2FsIHJlc291cmNlPSJwbGF0Zm9ybS1sYXVuY2hlciIgZGVwdGg9ImluZmluaXRlIiAvPgkJCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JPHRzdGFtcC8+Ci0JPGV4ZWMgZGlyPSIuIiBleGVjdXRhYmxlPSJzaCI+Ci0JCTxhcmcgbGluZT0iJHtiYXNlZGlyfS9idWlsZC5zaCIvPgotCQk8YXJnIGxpbmU9ImNsZWFuIi8+Ci0JPC9leGVjPgotPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL2VjbGlwc2VNb3RpZi5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9lY2xpcHNlTW90aWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1ZjhmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL2VjbGlwc2VNb3RpZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEtldmluIENvcm5lbGwgKFJhdGlvbmFsIFNvZnR3YXJlIENvcnBvcmF0aW9uKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gCi0vKiBVTklYL01vdGlmIHNwZWNpZmljIGxvZ2ljIGZvciBkaXNwbGF5aW5nIHRoZSBzcGxhc2ggc2NyZWVuLiAqLwotI2luY2x1ZGUgImVjbGlwc2VDb21tb24uaCIKLSNpbmNsdWRlICJlY2xpcHNlTW96aWxsYS5oIgotI2luY2x1ZGUgImVjbGlwc2VNb3RpZi5oIgotI2luY2x1ZGUgImVjbGlwc2VPUy5oIgotI2luY2x1ZGUgImVjbGlwc2VVdGlsLmgiCi0jaW5jbHVkZSAiTmdJbWFnZS5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2lmZGVmIFNPTEFSSVMKLSNpbmNsdWRlIDxzeXMvZmlsaW8uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyogR2xvYmFsIFZhcmlhYmxlcyAqLwotY2hhciogIGRlZmF1bHRWTSAgICAgPSAiamF2YSI7Ci1jaGFyKiAgdm1MaWJyYXJ5IAkgPSAibGlianZtLnNvIjsKLWNoYXIqICBzaGlwcGVkVk1EaXIgID0gImpyZS9iaW4vIjsKLQotLyogRGVmaW5lIHRoZSBzcGVjaWFsIGFyZ3VtZW50cyBmb3IgdGhlIHZhcmlvdXMgSmF2YSBWTXMuICovCi1zdGF0aWMgY2hhciogIGFyZ1ZNX0pBVkFbXSAgICAgICAgPSB7IE5VTEwgfTsKLSNpZiBBSVgKLXN0YXRpYyBjaGFyKiAgYXJnVk1fSkFWQV9BSVgxMzFbXSA9IHsgIi1YcXVpY2tzdGFydCIsIE5VTEwgfTsKLSNlbmRpZgotc3RhdGljIGNoYXIqICBhcmdWTV9KOVtdICAgICAgICAgID0geyAiLWppdCIsICItbWNhOjEwMjQiLCAiLW1jbzoxMDI0IiwgIi1tbjoyNTYiLCAiLW1vOjQwOTYiLCAKLQkJCQkJCQkJCSAgIi1tb2k6MTYzODQiLCAiLW14OjI2MjE0NCIsICItbXM6MTYiLCAiLW1yOjE2IiwgTlVMTCB9OwotCQkJCQkJCQkgCSAgIAotLyogRGVmaW5lIGxvY2FsIHZhcmlhYmxlcyBmb3IgdGhlIG1haW4gd2luZG93LiAqLwotZXh0ZXJuIFh0QXBwQ29udGV4dCBhcHBDb250ZXh0OwotZXh0ZXJuIFdpZGdldCAgICAgICB0b3BXaW5kb3c7Ci0KLXN0YXRpYyBwaWRfdCAgIGp2bVByb2Nlc3MgPSAwOwotc3RhdGljIGludCAgICAganZtRXhpdENvZGU7Ci0KLS8qIERlZmluZSBsb2NhbCB2YXJpYWJsZXMgZm9yIGhhbmRsaW5nIHRoZSBzcGxhc2ggd2luZG93IGFuZCBpdHMgaW1hZ2UuICovCi1zdGF0aWMgV2lkZ2V0IHNoZWxsSGFuZGxlID0gMDsKLQotZXh0ZXJuIHZvaWQgICBjZW50cmVTaGVsbCggV2lkZ2V0IHdpZGdldCwgV2lkZ2V0IGV4cG9zZSApOwotCi0jaWZkZWYgTkVUU0NBUEVfRklYCi12b2lkICAgZml4RW52Rm9yTmV0c2NhcGUoKTsKLSNlbmRpZiAvKiBORVRTQ0FQRV9GSVggKi8KLQotdm9pZCB0YWtlRG93blNwbGFzaENCKCBXaWRnZXQgc2hlbGwsIFh0UG9pbnRlciBhcHBfZGF0YSwgWHRQb2ludGVyIHdpZGdldF9kYXRhICkgewotICBzaGVsbEhhbmRsZSA9IE5VTEw7Ci19Ci0KLS8qIFNob3cgdGhlIFNwbGFzaCBXaW5kb3cKLSAqCi0gKiBDcmVhdGUgdGhlIHNwbGFzaCB3aW5kb3csIGxvYWQgdGhlIHBpeG1hcCBhbmQgZGlzcGxheSB0aGUgc3BsYXNoIHdpbmRvdy4KLSAqLwotaW50IHNob3dTcGxhc2goIGNvbnN0IGNoYXIqIGZlYXR1cmVJbWFnZSApCi17Ci0JaW50IHgsIHk7Ci0JdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBib3JkZXI7Ci0JQXJnTGlzdCBhcmdzOwotCXVuc2lnbmVkIGludCBuQXJnczsKLQlQaXhtYXAgIHNwbGFzaFBpeG1hcCA9IDA7Ci0JV2luZG93ICByb290OwotCURpc3BsYXkgKnhEaXNwbGF5OwotCVNjcmVlbiogc2NyZWVuOwotCVdpZGdldCBzY3JvbGxlZEhhbmRsZSwgZHJhd2luZ0hhbmRsZSwgaW1hZ2U7Ci0JCi0JaWYgKHNoZWxsSGFuZGxlICE9IDApCi0JCXJldHVybiAwOyAvKiBhbHJlYWR5IHNob3dpbmcgc3BsYXNoICovCi0JCi0JaWYgKGluaXRpYWxBcmd2ID09IE5VTEwpIAotCQlpbml0aWFsQXJnYyA9IDA7Ci0KLQlpZiAoaW5pdFdpbmRvd1N5c3RlbSgmaW5pdGlhbEFyZ2MsIGluaXRpYWxBcmd2LCAxKSAhPSAwKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl4RGlzcGxheSA9IG1vdGlmX1h0RGlzcGxheSh0b3BXaW5kb3cpOwotICAgIHNjcmVlbiA9IG1vdGlmLlhEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5KCB4RGlzcGxheSApOwotICAgIGlmIChmZWF0dXJlSW1hZ2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgCXNwbGFzaFBpeG1hcCA9IGxvYWRCTVBJbWFnZSh4RGlzcGxheSwgc2NyZWVuLCAoY2hhciopZmVhdHVyZUltYWdlKTsKLSAgICB9Ci0gICAgICAgIC8qIElmIHRoZSBzcGxhc2ggaW1hZ2UgY291bGQgbm90IGJlIGZvdW5kLCByZXR1cm4gYW4gZXJyb3IuICovCi0gICAgaWYgKHNwbGFzaFBpeG1hcCA9PSAwKQotICAgIAlyZXR1cm4gRU5PRU5UOwotICAgIAotICAgIG1vdGlmLlhHZXRHZW9tZXRyeSAoeERpc3BsYXksIHNwbGFzaFBpeG1hcCwgJnJvb3QsICZ4LCAmeSwgJndpZHRoLCAmaGVpZ2h0LCAmYm9yZGVyLCAmZGVwdGgpOwotICAgIAotICAgIC8qIG1ha2Ugc3VyZSB3ZSBuZXZlciBwYXNzIG1vcmUgdGhhbiAyMCBhcmdzICovCi0gICAgYXJncyA9IG1hbGxvYygxMCAqIHNpemVvZihBcmcpKTsKLSAgICAKLSAgICBuQXJncyA9IDA7Ci0gICAgLyogTm90ZSB0aGF0IFh0U2V0QXJnIGlzIGEgbWFjcm8sIGFuZCB0aGUgMXN0IGFyZ3VtZW50IHdpbGwgYmUgZXZhbHVhdGVkIHR3aWNlCi0gICAgICogc28gaW5jcmVtZW50IG5BcmdzIG9uIGl0cyBvd24gKi8KLQltb3RpZl9YdFNldEFyZyhhcmdzW25BcmdzXSwgWG1ObXdtRGVjb3JhdGlvbnMsIDApOwluQXJncysrOwotICAgIG1vdGlmX1h0U2V0QXJnKGFyZ3NbbkFyZ3NdLCBYbU50aXRsZSwgZ2V0T2ZmaWNpYWxOYW1lKCkpOwluQXJncysrOwotICAgIG1vdGlmX1h0U2V0QXJnKGFyZ3NbbkFyZ3NdLCBYbU53aWR0aCwgd2lkdGgpOwkJCW5BcmdzKys7Ci0gICAgbW90aWZfWHRTZXRBcmcoYXJnc1tuQXJnc10sIFhtTmhlaWdodCwgaGVpZ2h0KTsJCW5BcmdzKys7Ci0Jc2hlbGxIYW5kbGUgPSBtb3RpZi5YdEFwcENyZWF0ZVNoZWxsKGdldE9mZmljaWFsTmFtZSgpLCAiIiwgKm1vdGlmLmFwcGxpY2F0aW9uU2hlbGxXaWRnZXRDbGFzcywgeERpc3BsYXksIGFyZ3MsIG5BcmdzKTsJCQkJCQkJCSAgIAotCW1vdGlmLlh0QWRkQ2FsbGJhY2soc2hlbGxIYW5kbGUsIFhtTmRlc3Ryb3lDYWxsYmFjaywgKFh0Q2FsbGJhY2tQcm9jKSB0YWtlRG93blNwbGFzaENCLCBOVUxMKTsKLQkKLQluQXJncyA9IDA7Ci0JbW90aWZfWHRTZXRBcmcoYXJnc1tuQXJncysrXSwgWG1OYW5jZXN0b3JTZW5zaXRpdmUsIDEpOwotCXNjcm9sbGVkSGFuZGxlID0gbW90aWYuWG1DcmVhdGVNYWluV2luZG93KHNoZWxsSGFuZGxlLCBOVUxMLCBhcmdzLCBuQXJncyk7Ci0JaWYoc2Nyb2xsZWRIYW5kbGUgPT0gMCkKLQkJcmV0dXJuIC0xOwotCW1vdGlmLlh0TWFuYWdlQ2hpbGQoc2Nyb2xsZWRIYW5kbGUpOwotCQotCW5BcmdzID0gMDsKLQltb3RpZl9YdFNldEFyZyhhcmdzW25BcmdzXSwgWG1OYW5jZXN0b3JTZW5zaXRpdmUsIDEpOwkJCW5BcmdzKys7Ci0gICAgbW90aWZfWHRTZXRBcmcoYXJnc1tuQXJnc10sIFhtTmJvcmRlcldpZHRoLCAwKTsJCQkJCW5BcmdzKys7Ci0gICAgLyptb3RpZl9YdFNldEFyZyhhcmdzW25BcmdzXSwgWG1OYmFja2dyb3VuZCwgMHhGRjAwRkYpOwkJCW5BcmdzKys7ICovCi0gICAgbW90aWZfWHRTZXRBcmcoYXJnc1tuQXJnc10sIFhtTm1hcmdpbldpZHRoLCAwKTsJCQkJCW5BcmdzKys7Ci0gICAgbW90aWZfWHRTZXRBcmcoYXJnc1tuQXJnc10sIFhtTm1hcmdpbkhlaWdodCwgMCk7CQkJCW5BcmdzKys7Ci0gICAgbW90aWZfWHRTZXRBcmcoYXJnc1tuQXJnc10sIFhtTnJlc2l6ZVBvbGljeSwgWG1SRVNJWkVfTk9ORSk7CW5BcmdzKys7Ci0gICAgbW90aWZfWHRTZXRBcmcoYXJnc1tuQXJnc10sIFhtTnRyYXZlcnNhbE9uLCAxKTsJCQkJCW5BcmdzKys7Ci0JZHJhd2luZ0hhbmRsZSA9IG1vdGlmLlhtQ3JlYXRlRHJhd2luZ0FyZWEoc2Nyb2xsZWRIYW5kbGUsIE5VTEwsIGFyZ3MsIG5BcmdzKTsKLQlpZihkcmF3aW5nSGFuZGxlID09IDApCi0JCXJldHVybiAtMTsKLQltb3RpZi5YdE1hbmFnZUNoaWxkKGRyYXdpbmdIYW5kbGUpOwotCQotCW5BcmdzID0gMDsKLQltb3RpZl9YdFNldEFyZyhhcmdzW25BcmdzXSwgWG1ObGFiZWxUeXBlLCBYbVBJWE1BUCk7CQluQXJncysrOwotICAgIG1vdGlmX1h0U2V0QXJnKGFyZ3NbbkFyZ3NdLCBYbU5sYWJlbFBpeG1hcCwgc3BsYXNoUGl4bWFwKTsJbkFyZ3MrKzsKLSAgICBtb3RpZl9YdFNldEFyZyhhcmdzW25BcmdzXSwgWG1Od2lkdGgsIHdpZHRoKTsJCQkJbkFyZ3MrKzsKLSAgICBtb3RpZl9YdFNldEFyZyhhcmdzW25BcmdzXSwgWG1OaGVpZ2h0LCBoZWlnaHQpOwkJCQluQXJncysrOwotICAgIG1vdGlmX1h0U2V0QXJnKGFyZ3NbbkFyZ3NdLCBYbU5tYXJnaW5XaWR0aCwgMCk7CQkJCW5BcmdzKys7Ci0gICAgbW90aWZfWHRTZXRBcmcoYXJnc1tuQXJnc10sIFhtTm1hcmdpbkhlaWdodCwgMCk7CQkJbkFyZ3MrKzsKLSAgICBpbWFnZSA9IG1vdGlmLlhtQ3JlYXRlTGFiZWxHYWRnZXQgKCBkcmF3aW5nSGFuZGxlLCAiIiwgYXJncywgbkFyZ3MgKTsKLSAgICBtb3RpZi5YdE1hbmFnZUNoaWxkKCBpbWFnZSApOwotCQotCW1vdGlmLlh0UmVhbGl6ZVdpZGdldChzaGVsbEhhbmRsZSk7Ci0JbW90aWYuWHRTZXRNYXBwZWRXaGVuTWFuYWdlZChzaGVsbEhhbmRsZSwgMSk7Ci0KLQlpZihtb3RpZl9YdElzVG9wTGV2ZWxTaGVsbChzaGVsbEhhbmRsZSkpCi0JCW1vdGlmX1h0TWFwV2lkZ2V0KHNoZWxsSGFuZGxlKTsKLQllbHNlCi0JCW1vdGlmLlh0UG9wdXAoc2hlbGxIYW5kbGUsIFh0R3JhYk5vbmUpOwotCQkKLQkvKiBDZW50cmUgdGhlIHNwbGFzaCBzY3JlZW4gYW5kIGRpc3BsYXkgaXQuICovCi0gICAgY2VudHJlU2hlbGwoIHNoZWxsSGFuZGxlLCBkcmF3aW5nSGFuZGxlICk7Ci0gICAgZGlzcGF0Y2hNZXNzYWdlcygpOwotICAgIAotICAgIGZyZWUoYXJncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIEdldCB0aGUgd2luZG93IHN5c3RlbSBzcGVjaWZpYyBWTSBhcmd1bWVudHMgKi8KLWNoYXIqKiBnZXRBcmdWTSggY2hhciogdm0gKSAKLXsKLSAgICBjaGFyKiogcmVzdWx0OwotICAgCi0jaWZkZWYgQUlYCi0gICAgY2hhciogIHZlcnNpb247Ci0jZW5kaWYKLQotICAgIGlmIChpc0o5Vk0oIHZtICkpIAotICAgICAgICByZXR1cm4gYXJnVk1fSjk7Ci0gICAgCi0gICAgLyogVXNlIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgYSBzdGFuZGFyZCBKYXZhIFZNICovCi0gICAgcmVzdWx0ID0gYXJnVk1fSkFWQTsKLSAgICAKLSNpZmRlZiBBSVgKLQkvKiBEZXRlcm1pbmUgd2hldGhlciBKYXZhIHZlcnNpb24gaXMgMS4zLjEgb3IgbGF0ZXIgKi8KLQl2ZXJzaW9uID0gZ2V0Vk1WZXJzaW9uKCB2bSApOwotCWlmICh2ZXJzaW9uICE9IE5VTEwpIAotCXsKLQkgICAgaWYgKHZlcnNpb25DbXAodmVyc2lvbiwgIjEuMy4xIikgPj0gMCkKLQkgICAgICAgIHJlc3VsdCA9IGFyZ1ZNX0pBVkFfQUlYMTMxOwotCSAgICBmcmVlKHZlcnNpb24pOwotCX0KLSNlbmRpZgotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1qbG9uZyBnZXRTcGxhc2hIYW5kbGUoKSB7Ci0JcmV0dXJuIChqbG9uZylzaGVsbEhhbmRsZTsKLX0KLQotdm9pZCBkaXNwYXRjaE1lc3NhZ2VzKCkgewotCVh0SW5wdXRNYXNrIG1hc2s7Ci0JaWYgKGFwcENvbnRleHQgIT0gTlVMTCAmJiBtb3RpZi5YdEFwcFBlbmRpbmcgIT0gMCkgewotCQkvKiBQcm9jZXNzIGFueSBvdXRzdGFuZGluZyBtZXNzYWdlcyAqLwotCSAJd2hpbGUgKChtYXNrID0gbW90aWYuWHRBcHBQZW5kaW5nKGFwcENvbnRleHQpKSAhPSAwKSB7Ci0JIAkJbW90aWYuWHRBcHBQcm9jZXNzRXZlbnQoYXBwQ29udGV4dCwgbWFzayk7Ci0JIAl9Ci0JfQotfQotCi12b2lkIHRha2VEb3duU3BsYXNoKCkKLXsKLSAgICBpZiAoc2hlbGxIYW5kbGUgIT0gMCkgCi0gICAgewotICAgICAgICBtb3RpZi5YdERlc3Ryb3lXaWRnZXQoIHNoZWxsSGFuZGxlICk7Ci0gICAgICAgIC8qWEZsdXNoKCBYdERpc3BsYXkoIHNoZWxsSGFuZGxlICkgKTsqLwotICAgICAgICBzaGVsbEhhbmRsZSA9IE5VTEw7Ci0gICAgfQotfQotCi0jaWZkZWYgTkVUU0NBUEVfRklYCi1leHRlcm4gY2hhciogZmluZENvbW1hbmQoIGNoYXIqKTsKLXN0YXRpYyBjb25zdCBjaGFyKiAgWEZJTEVTRUFSQ0hQQVRIID0gIlhGSUxFU0VBUkNIUEFUSCI7Ci0KLXZvaWQgICBmaXhFbnZGb3JOZXRzY2FwZSgpCi17Ci0JY2hhciogIG5ldHNjYXBlUGF0aCAgICAgPSBOVUxMOwotCWNoYXIqICBuZXRzY2FwZVJlc291cmNlID0gTlVMTDsKLQljaGFyKiAgY2g7Ci0JY2hhciogIGVudlZhbHVlOwotCXN0cnVjdCBzdGF0ICAgc3RhdHM7Ci0KLQkvKiBJZiBuZXRzY2FwZSBhcHBlYXJzIHRvIGJlIGluc3RhbGxlZCAqLwotCW5ldHNjYXBlUGF0aCA9IGZpbmRDb21tYW5kKCJuZXRzY2FwZSIpOwotCWlmIChuZXRzY2FwZVBhdGggIT0gTlVMTCkKLQl7Ci0JCS8qIExvb2sgZm9yIHRoZSByZXNvdXJjZSBmaWxlIE5ldHNjYXBlLmFkIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyAibmV0c2NhcGUiLiAqLwotCQluZXRzY2FwZVJlc291cmNlID0gbWFsbG9jKCBzdHJsZW4obmV0c2NhcGVQYXRoKSArIDUwICk7Ci0JCXN0cmNweSggbmV0c2NhcGVSZXNvdXJjZSwgbmV0c2NhcGVQYXRoICk7Ci0JCWNoID0gc3RycmNociggbmV0c2NhcGVSZXNvdXJjZSwgKGludCkgZGlyU2VwYXJhdG9yICk7Ci0JCWNoID0oY2ggPT0gTlVMTCA/IG5ldHNjYXBlUmVzb3VyY2UgOiAoY2grMSkpOwotCQlzdHJjcHkoIGNoLCAiTmV0c2NhcGUuYWQiICk7Ci0JCQotCQkvKiBJZiBpdCBkb2VzIG5vdCBleGlzdCB0aGVyZSwgdHJ5ICIvb3B0L25ldHNjYXBlL05ldHNjYXBlLmFkIi4gKi8KLSAgICAgICAgaWYgKHN0YXQoIG5ldHNjYXBlUmVzb3VyY2UsICZzdGF0cyApICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgCXN0cmNweSggbmV0c2NhcGVSZXNvdXJjZSwgIi9vcHQvbmV0c2NhcGUvTmV0c2NhcGUuYWQiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qIElmIHRoZSByZXNvdXJjZSBmaWxlIGV4aXN0cyAqLwotICAgICAgICBpZiAoc3RhdCggbmV0c2NhcGVSZXNvdXJjZSwgJnN0YXRzICkgPT0gMCAmJiAoc3RhdHMuc3RfbW9kZSAmIFNfSUZSRUcpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgCS8qIEVpdGhlciBkZWZpbmUgWEZJTEVTRUFSQ0hQQVRIIG9yIGFwcGVuZCB0aGUgTmV0c2NhcGUgcmVzb3VyY2UgZmlsZS4gKi8KLSAgICAgICAgCWVudlZhbHVlID0gZ2V0ZW52KCBYRklMRVNFQVJDSFBBVEggKTsKLSAgICAgICAgCWlmIChlbnZWYWx1ZSA9PSBOVUxMKQotICAgICAgICAJewotICAgICAgICAJCWNoID0gbWFsbG9jKCBzdHJsZW4oWEZJTEVTRUFSQ0hQQVRIKSArIHN0cmxlbihuZXRzY2FwZVJlc291cmNlKSArIDUgKTsKLSAgICAgICAgCQlzcHJpbnRmKCBjaCwgIiVzPSVzIiwgWEZJTEVTRUFSQ0hQQVRILCBuZXRzY2FwZVJlc291cmNlICk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAllbHNlCi0gICAgICAgIAl7Ci0gICAgICAgIAkJY2ggPSBtYWxsb2MoIHN0cmxlbihYRklMRVNFQVJDSFBBVEgpICsgc3RybGVuKG5ldHNjYXBlUmVzb3VyY2UpICsgCi0gICAgICAgIAkJCQkJIHN0cmxlbihlbnZWYWx1ZSkgKyA1ICk7Ci0gICAgICAgIAkJc3ByaW50ZiggY2gsICIlcz0lczolcyIsIFhGSUxFU0VBUkNIUEFUSCwgZW52VmFsdWUsIG5ldHNjYXBlUmVzb3VyY2UgKTsKLSAgICAgICAgCX0KLSAgICAgICAgCXB1dGVudiggY2ggKTsKLSAgICAgICAgCWZyZWUoIGNoICk7Ci0gICAgICAgIH0KLQkJCi0JCS8qIENsZWFuIHVwLiAqLwotCQlmcmVlKCBuZXRzY2FwZVBhdGggKTsKLQkJZnJlZSggbmV0c2NhcGVSZXNvdXJjZSApOwotCX0KLX0KLSNlbmRpZiAvKiBORVRTQ0FQRV9GSVggKi8KLQotSmF2YVJlc3VsdHMqIGxhdW5jaEphdmFWTSggY2hhciogYXJnc1tdICkgCi17Ci0JSmF2YVJlc3VsdHMqIGp2bVJlc3VsdHMgPSBOVUxMOwotICAgIGludCAgICBleGl0Q29kZTsKLQotI2lmZGVmIE5FVFNDQVBFX0ZJWAotCWZpeEVudkZvck5ldHNjYXBlKCk7Ci0jZW5kaWYgLyogTkVUU0NBUEVfRklYICovCi0jaWZkZWYgTU9aSUxMQV9GSVgKLQlmaXhFbnZGb3JNb3ppbGxhKCk7Ci0jZW5kaWYgLyogTU9aSUxMQV9GSVggKi8KLQotI2lmZGVmIExJTlVYCi0JewotCQkvKiBwdXQgdGhlIHJvb3Qgb2YgZWNsaXBzZSBvbiB0aGUgTERfTElCUkFSWV9QQVRIICovCi0JCWNoYXIgKiBsZFBhdGggPSAoY2hhciopZ2V0ZW52KF9UX0VDTElQU0UoIkxEX0xJQlJBUllfUEFUSCIpKTsKLQkJaWYgKGxkUGF0aCA9PSBOVUxMKQotCQkJbGRQYXRoID0gX1RfRUNMSVBTRSgiIik7Ci0JCWNoYXIgKiByb290ID0gZ2V0UHJvZ3JhbURpcigpOwotCQlpZiAocm9vdCAhPSBOVUxMKSB7Ci0JCQljaGFyICogbmV3UGF0aCA9IG1hbGxvYygoc3RybGVuKHJvb3QpICsgc3RybGVuKGxkUGF0aCkgKyAyKSAqIHNpemVvZihjaGFyKSk7Ci0JCQlzcHJpbnRmKG5ld1BhdGgsICIlcyVjJXMiLCByb290LCBwYXRoU2VwYXJhdG9yLCBsZFBhdGgpOwotCQkJc2V0ZW52KCJMRF9MSUJSQVJZX1BBVEgiLCBuZXdQYXRoLCAxKTsKLQkJCWZyZWUobmV3UGF0aCk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQkKLQkvKiBDcmVhdGUgYSBjaGlsZCBwcm9jZXNzIGZvciB0aGUgSlZNLiAqLwkKLQlqdm1Qcm9jZXNzID0gZm9yaygpOwotCWlmIChqdm1Qcm9jZXNzID09IDApIAotCXsKLQkJLyogQ2hpbGQgcHJvY2VzcyAuLi4gc3RhcnQgdGhlIEpWTSAqLwotCQlleGVjdiggYXJnc1swXSwgYXJncyApOwotCQkKLQkJLyogVGhlIEpWTSB3b3VsZCBub3Qgc3RhcnQgLi4uIHJldHVybiBlcnJvciBjb2RlIHRvIHBhcmVudCBwcm9jZXNzLiAqLwotCQkvKiBUT0RPLCBob3cgdG8gZGlzdGluZ3Vpc2ggdGhpcyBhcyBhIGxhdW5jaCBwcm9ibGVtIHRvIHRoZSBvdGhlciBwcm9jZXNzPyAqLwotCQlqdm1FeGl0Q29kZSA9IGVycm5vOwotICAgICAgICBleGl0KCBqdm1FeGl0Q29kZSApOwotCX0KLQkKLQlqdm1SZXN1bHRzID0gbWFsbG9jKHNpemVvZihKYXZhUmVzdWx0cykpOwotCW1lbXNldChqdm1SZXN1bHRzLCAwLCBzaXplb2YoSmF2YVJlc3VsdHMpKTsKLQkKLQkvKiBJZiB0aGUgSlZNIGlzIHN0aWxsIHJ1bm5pbmcsIHdhaXQgZm9yIGl0IHRvIHRlcm1pbmF0ZS4gKi8KLQlpZiAoanZtUHJvY2VzcyAhPSAwKQotCXsKLQkJd2FpdHBpZChqdm1Qcm9jZXNzLCAmZXhpdENvZGUsIDApOwotICAJCS8qIFRPRE8sIHRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIHJ1blJlc3VsdCBpZiB3ZSBjb3VsZCBkaXN0aW5ndWlzaCB0aGUgbGF1bmNoIHByb2JsZW0gYWJvdmUgKi8KLQkJanZtUmVzdWx0cy0+bGF1bmNoUmVzdWx0ID0gKChleGl0Q29kZSAmIDB4MDBmZikgPT0gMCA/IChleGl0Q29kZSA+PiA4KSA6IGV4aXRDb2RlKTsgLyogc2VlIHdhaXQoMikgKi8KLQl9Ci0JCi0JLyogUmV0dXJuIHRoZSBleGl0IGNvZGUgZnJvbSB0aGUgSlZNLiAqLwotCXJldHVybiBqdm1SZXN1bHRzOwotfQotCi1pbnQgcmV1c2VXb3JrYmVuY2goX1RDSEFSKiogZmlsZVBhdGgsIGludCB0aW1lb3V0KSB7Ci0JLyogbm90IHlldCBpbXBsZW1lbnRlZCBvbiBtb3RpZiAqLwotCXJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvZWNsaXBzZU1vdGlmLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL2VjbGlwc2VNb3RpZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI4MDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvZWNsaXBzZU1vdGlmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEVDTElQU0VfTU9USUZfSAotI2RlZmluZSBFQ0xJUFNFX01PVElGX0gKLQotI2luY2x1ZGUgPFhtL1htQWxsLmg+Ci0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWNQLmg+Ci0jaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgotI2luY2x1ZGUgPFgxMS9TaGVsbC5oPgotCi0jaWZuZGVmIE5PX1hJTkVSQU1BX0VYVEVOU0lPTlMKLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YaW5lcmFtYS5oPgotI2VuZGlmCi0KLXN0cnVjdCBNT1RJRl9QVFJTIHsKLSNpZm5kZWYgTk9fWElORVJBTUFfRVhURU5TSU9OUwotCUJvb2wgCQkoKlhpbmVyYW1hSXNBY3RpdmUpCQkoRGlzcGxheSopOwotCVhpbmVyYW1hU2NyZWVuSW5mbyogICgqWGluZXJhbWFRdWVyeVNjcmVlbnMpIChEaXNwbGF5KiwgaW50Kik7Ci0jZW5kaWYKLQlXaWRnZXQgCQkoKlhtQ3JlYXRlRHJhd2luZ0FyZWEpCShXaWRnZXQsIFN0cmluZywgQXJnTGlzdCwgQ2FyZGluYWwpOwotCVdpZGdldCAJCSgqWG1DcmVhdGVMYWJlbEdhZGdldCkJKFdpZGdldCwgY2hhciAqLCBBcmcgKiwgQ2FyZGluYWwpOwotCVdpZGdldCAJCSgqWG1DcmVhdGVNYWluV2luZG93KQkoV2lkZ2V0LCBjaGFyICosIEFyZ0xpc3QsIENhcmRpbmFsKTsKLQlXaWRnZXQJCSgqWG1DcmVhdGVNZXNzYWdlRGlhbG9nKShXaWRnZXQsIFN0cmluZywgQXJnTGlzdCwgQ2FyZGluYWwpOwotCVdpZGdldAkJKCpYbU1lc3NhZ2VCb3hHZXRDaGlsZCkJKFdpZGdldCwgdW5zaWduZWQgY2hhcik7Ci0Jdm9pZCAJCSgqWG1TdHJpbmdGcmVlKQkJCShYbVN0cmluZyk7Ci0JWG1TdHJpbmcgCSgqWG1TdHJpbmdHZW5lcmF0ZSkgCShYdFBvaW50ZXIsIFhtU3RyaW5nVGFnLCBYbVRleHRUeXBlLCBYbVN0cmluZ1RhZyk7Ci0JCi0Jdm9pZCAJCSgqWHRBZGRDYWxsYmFjaykJCShXaWRnZXQsIFN0cmluZywgWHRDYWxsYmFja1Byb2MsIFh0UG9pbnRlcik7Ci0JV2lkZ2V0IAkJKCpYdEFwcENyZWF0ZVNoZWxsKQkJKFN0cmluZywgU3RyaW5nLCBXaWRnZXRDbGFzcywgRGlzcGxheSosIEFyZ0xpc3QsIENhcmRpbmFsKTsKLQl2b2lkCQkoKlh0QXBwTmV4dEV2ZW50KQkJKFh0QXBwQ29udGV4dCwgWEV2ZW50Kik7Ci0JWHRJbnB1dE1hc2sgKCpYdEFwcFBlbmRpbmcpCQkJKFh0QXBwQ29udGV4dCk7Ci0Jdm9pZCAJCSgqWHRBcHBQcm9jZXNzRXZlbnQpCShYdEFwcENvbnRleHQsIFh0SW5wdXRNYXNrKTsKLQl2b2lkCQkoKlh0RGVzdHJveVdpZGdldCkJCShXaWRnZXQpOwotCUJvb2xlYW4JCSgqWHREaXNwYXRjaEV2ZW50KQkJKFhFdmVudCopOwotCXZvaWQJCSgqWHRHZXRWYWx1ZXMpCQkJKFdpZGdldCwgQXJnTGlzdCwgQ2FyZGluYWwpOwotCVdpZGdldAkJKCpYdEluaXRpYWxpemUpCQkJKFN0cmluZywgU3RyaW5nLCBYcm1PcHRpb25EZXNjUmVjKiwgQ2FyZGluYWwsIGludCosIGNoYXIqKik7Ci0jaWZkZWYgQUlYCi0JV2lkZ2V0CQkoKmVjbGlwc2VYdEluaXRpYWxpemUpCShTdHJpbmcsIFN0cmluZywgWHJtT3B0aW9uRGVzY1JlYyosIENhcmRpbmFsLCBpbnQqLCBjaGFyKiopOwotI2VuZGlmCi0JQm9vbGVhbgkJKCpYdElzTWFuYWdlZCkJCQkoV2lkZ2V0KTsKLQl2b2lkIAkJKCpYdE1hbmFnZUNoaWxkKQkJKFdpZGdldCk7Ci0JaW50CQkJKCpYdE1hcFdpZGdldCkJCQkoV2lkZ2V0KTsKLQl2b2lkIAkJKCpYdFBvcHVwKQkJCQkoV2lkZ2V0LCBYdEdyYWJLaW5kKTsKLQl2b2lkCQkoKlh0UmVhbGl6ZVdpZGdldCkJCShXaWRnZXQpOwotCVdpZGdldAkJKCpYdFNldExhbmd1YWdlUHJvYykJKFh0QXBwQ29udGV4dCwgWHRMYW5ndWFnZVByb2MsIFh0UG9pbnRlcik7Ci0Jdm9pZCAJCSgqWHRTZXRNYXBwZWRXaGVuTWFuYWdlZCkoV2lkZ2V0LCBCb29sZWFuKTsKLQl2b2lkCQkoKlh0U2V0VmFsdWVzKQkJCShXaWRnZXQsIEFyZ0xpc3QsIENhcmRpbmFsKTsKLQl2b2lkCQkoKlh0VW5tYW5hZ2VDaGlsZCkJCShXaWRnZXQpOwotCVh0QXBwQ29udGV4dCAoKlh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQpIChXaWRnZXQpOwotCVdpbmRvdwkJKCpYdFdpbmRvd09mT2JqZWN0KQkJKFdpZGdldCk7Ci0JCi0JU2NyZWVuICogCSgqWERlZmF1bHRTY3JlZW5PZkRpc3BsYXkpKERpc3BsYXkqKTsKLQlpbnQJCQkoKlhGcmVlKQkJCQkodm9pZCopOwotCWludAkJCSgqWEZsdXNoKQkJCQkoRGlzcGxheSopOwotCVN0YXR1cyAJCSgqWEdldEdlb21ldHJ5KQkJCShEaXNwbGF5KiwgRHJhd2FibGUsIFdpbmRvdyosIGludCosIGludCosIHVuc2lnbmVkIGludCosIHVuc2lnbmVkIGludCosIHVuc2lnbmVkIGludCosIHVuc2lnbmVkIGludCopOwotCWludCAJCSgqWE1hcFdpbmRvdykJCQkoRGlzcGxheSosIFdpbmRvdyk7Ci0JCi0JY2hhciAqIAkJX1htU3RyaW5nczsKLQljaGFyICogCQlYdFNoZWxsU3RyaW5nczsKLQljaGFyICogCQlYdFN0cmluZ3M7Ci0JV2lkZ2V0Q2xhc3MgKmFwcGxpY2F0aW9uU2hlbGxXaWRnZXRDbGFzczsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgTU9USUZfUFRSUyBtb3RpZjsKLQotI2RlZmluZSBtb3RpZl9YdERpc3BsYXkgCQkJWHREaXNwbGF5Ci0jZGVmaW5lIG1vdGlmX1h0U2V0QXJnCQkJCVh0U2V0QXJnCi0jZGVmaW5lIG1vdGlmX1h0V2luZG93CQkJCVh0V2luZG93Ci0jZGVmaW5lIG1vdGlmX1h0SXNUb3BMZXZlbFNoZWxsIAlYdElzVG9wTGV2ZWxTaGVsbAotI2RlZmluZSBtb3RpZl9YdElzUmVhbGl6ZWQob2JqZWN0KSAobW90aWYuWHRXaW5kb3dPZk9iamVjdChvYmplY3QpICE9IE5vbmUpCi0jZGVmaW5lIG1vdGlmX1h0TWFwV2lkZ2V0KHdpZGdldCkgIG1vdGlmLlhNYXBXaW5kb3coWHREaXNwbGF5KHdpZGdldCksIFh0V2luZG93KHdpZGdldCkpCi0KLSNkZWZpbmUgX1htU3RyaW5ncyAJCQkJbW90aWYuX1htU3RyaW5ncwotI2RlZmluZSBYdFNoZWxsU3RyaW5ncyAJCQltb3RpZi5YdFNoZWxsU3RyaW5ncwotI2RlZmluZSBYdFN0cmluZ3MgCQkJCW1vdGlmLlh0U3RyaW5ncwotCi0vKiBtYWNybyByZXNvbHZlcyB0byB7ICh2b2lkKiopJm1vdGlmLmZvbywgImZvbyIgfSwgdXNlIGl0IHRvIGluaXRpYWxpemUgRk5fVEFCTEVzICovCi0jZGVmaW5lIEZOX1RBQkxFX0VOVFJZKGZuKSB7ICh2b2lkKiopJm1vdGlmLmZuLCAjZm4gfSAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2lkICoqIGZuUHRyOwotCWNoYXIgKiBmbk5hbWU7Ci19IEZOX1RBQkxFOwotCi1leHRlcm4gaW50IGxvYWRNb3RpZigpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL2VjbGlwc2VNb3RpZkNvbW1vbi5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9lY2xpcHNlTW90aWZDb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmMjFjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL2VjbGlwc2VNb3RpZkNvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEFuZHJldyBOaWVmZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2luY2x1ZGUgImVjbGlwc2VDb21tb24uaCIKLSNpbmNsdWRlICJlY2xpcHNlT1MuaCIKLSNpbmNsdWRlICJlY2xpcHNlTW90aWYuaCIKLQotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNkZWZpbmUgRUNMSVBTRV9JQ09OICA0MDEKLQotY2hhciAgIGRpclNlcGFyYXRvciAgPSAnLyc7Ci1jaGFyICAgcGF0aFNlcGFyYXRvciA9ICc6JzsKLQotdm9pZCBjZW50cmVTaGVsbCggV2lkZ2V0IHdpZGdldCwgV2lkZ2V0IGV4cG9zZSApOwotCi0vKiBHbG9iYWwgVmFyaWFibGVzICovCi1YdEFwcENvbnRleHQgYXBwQ29udGV4dCA9IDA7Ci1XaWRnZXQgICAgICAgdG9wV2luZG93ICA9IDA7Ci0KLS8qIERlZmluZSBsb2NhbCB2YXJpYWJsZXMgZm9yIHRoZSBtYWluIHdpbmRvdy4gKi8KLXN0YXRpYyBpbnQgICAgICAgICAgc2F2ZUFyZ2MgICA9IDA7CQkvKiBhcmd1bWVudHMgYWZ0ZXIgdGhleSB3ZXJlIHBhcnNlZCwgZm9yIHdpbmRvdyBzeXN0ZW0gKi8KLXN0YXRpYyBjaGFyKiogICAgICAgc2F2ZUFyZ3YgICA9IDA7Ci0KLWludCBtb3RpZkluaXRpYWxpemVkID0gMDsKLQotLyogRGlzcGxheSBhIE1lc3NhZ2UgKi8KLXZvaWQgZGlzcGxheU1lc3NhZ2UoIGNoYXIqIHRpdGxlLCBjaGFyKiBtZXNzYWdlICkgCi17Ci0gICAgY2hhciogICAgICAgICBkaXNwbGF5TmFtZSA9IE5VTEw7Ci0gICAgV2lkZ2V0ICAgICAgICBtc2dCb3ggPSBOVUxMOwotICAgIFhtU3RyaW5nICAgICAgbXNnOwotICAgIEFyZyAgICAgICAgICAgYXJnWzIwXTsKLSAgICBpbnQgICAgICAgICAgIG5BcmdzOwotICAgIFhFdmVudCAgICAgICAgZXZlbnQ7Ci0gICAgCi0gICAgLyogSWYgdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBkaXNwbGF5LCBvciB3ZSBmYWlsIHRvIGluaXRpYWxpemUgWHQsIGp1c3QgcHJpbnQgdGhlIGVycm9yIGFuZCByZXR1cm4uICovCi0gICAgZGlzcGxheU5hbWUgPSBnZXRlbnYoIkRJU1BMQVkiKTsKLSAgICBpZiAoIGRpc3BsYXlOYW1lID09IE5VTEwgfHwgc3RybGVuKGRpc3BsYXlOYW1lKSA9PSAwIHx8Ci0gICAgICAgICh0b3BXaW5kb3cgPT0gMCAmJiBpbml0V2luZG93U3lzdGVtKCAmc2F2ZUFyZ2MsIHNhdmVBcmd2LCAxICkgIT0gMCkJKSAKLSAgICB7Ci0gICAgCXByaW50ZigiJXM6XG4lc1xuIiwgdGl0bGUsIG1lc3NhZ2UpOwotICAgIAlyZXR1cm47Ci0gICAgfQotCW1zZyA9IG1vdGlmLlhtU3RyaW5nR2VuZXJhdGUoIG1lc3NhZ2UsIE5VTEwsIFhtQ0hBUlNFVF9URVhULCBOVUxMICk7Ci0KLSAgICAvKiBPdXRwdXQgYSBzaW1wbGUgbWVzc2FnZSBib3guICovIAotICAgIG5BcmdzID0gMDsKLSAgICAKLSAgICBtb3RpZl9YdFNldEFyZyggYXJnWyBuQXJncyBdLCBYbU5kaWFsb2dUeXBlLCBYbURJQUxPR19NRVNTQUdFICk7IG5BcmdzKys7Ci0gICAgbW90aWZfWHRTZXRBcmcoIGFyZ1sgbkFyZ3MgXSwgWG1OdGl0bGUsIHRpdGxlICk7IG5BcmdzKys7Ci0gICAgbW90aWZfWHRTZXRBcmcoIGFyZ1sgbkFyZ3MgXSwgWG1ObWVzc2FnZVN0cmluZywgbXNnICk7IG5BcmdzKys7Ci0gICAgbXNnQm94ID0gbW90aWYuWG1DcmVhdGVNZXNzYWdlRGlhbG9nKCB0b3BXaW5kb3csIGdldE9mZmljaWFsTmFtZSgpLCBhcmcsIG5BcmdzICk7Ci0KLSAgICBtb3RpZi5YdFVubWFuYWdlQ2hpbGQoIG1vdGlmLlhtTWVzc2FnZUJveEdldENoaWxkKCBtc2dCb3gsIFhtRElBTE9HX0NBTkNFTF9CVVRUT04gKSApOwotICAgIG1vdGlmLlh0VW5tYW5hZ2VDaGlsZCggbW90aWYuWG1NZXNzYWdlQm94R2V0Q2hpbGQoIG1zZ0JveCwgWG1ESUFMT0dfSEVMUF9CVVRUT04gKSApOwotICAgIG1vdGlmLlh0TWFuYWdlQ2hpbGQoIG1zZ0JveCApOwotICAgIGNlbnRyZVNoZWxsKCBtc2dCb3gsIG1zZ0JveCApOwotICAgIGlmIChtc2cgIT0gMCkgbW90aWYuWG1TdHJpbmdGcmVlIChtc2cpOwotCi0gICAgLyogV2FpdCBmb3IgdGhlIE9LIGJ1dHRvbiB0byBiZSBwcmVzc2VkLiAqLwotICAgIHdoaWxlIChtb3RpZl9YdElzUmVhbGl6ZWQoIG1zZ0JveCApICYmIG1vdGlmLlh0SXNNYW5hZ2VkKCBtc2dCb3ggKSkKLSAgICB7Ci0gICAgICAgIG1vdGlmLlh0QXBwTmV4dEV2ZW50KCBhcHBDb250ZXh0LCAmZXZlbnQgKTsKLSAgICAgICAgbW90aWYuWHREaXNwYXRjaEV2ZW50KCAmZXZlbnQgKTsKLSAgICB9Ci0gICAgbW90aWYuWHREZXN0cm95V2lkZ2V0KCBtc2dCb3ggKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBXaW5kb3cgU3lzdGVtCi0gKgotICogSW5pdGlhbGl6ZSB0aGUgWHQgYW5kIFhsaWIuCi0gKi8KLWludCBpbml0V2luZG93U3lzdGVtKCBpbnQqIHBBcmdjLCBjaGFyKiBhcmd2W10sIGludCBzaG93U3BsYXNoICkKLXsKLSAgICBBcmcgICAgIGFyZ1syMF07Ci0gICAgY2hhciAqIG9mZmljaWFsTmFtZTsKLSAgICAKLSAgICBpZihtb3RpZkluaXRpYWxpemVkID09IDEpCi0gICAgCXJldHVybiAwOwotICAgIAotICAgIGlmIChsb2FkTW90aWYoKSAhPSAwKQotICAgIAlyZXR1cm4gLTE7Ci0gICAgCi0gICAgLyogU2F2ZSB0aGUgYXJndW1lbnRzIGluIGNhc2UgZGlzcGxheU1lc3NhZ2UoKSBpcyBjYWxsZWQgaW4gdGhlIG1haW4gbGF1bmNoZXIuICovIAotICAgIGlmIChzYXZlQXJndiA9PSAwKQotICAgIHsKLSAgICAJc2F2ZUFyZ2MgPSAqcEFyZ2M7Ci0gICAgCXNhdmVBcmd2ID0gIGFyZ3Y7Ci0gICAgfSAgCi0KLSAgICBvZmZpY2lhbE5hbWUgPSBnZXRPZmZpY2lhbE5hbWUoKTsKLSAgICBpZiAob2ZmaWNpYWxOYW1lICE9IE5VTEwpCi0gICAgCXNldGVudigiUkVTT1VSQ0VfTkFNRSIsIGdldE9mZmljaWFsTmFtZSgpLCAxKTsKLSAgICAKLSAgICAvKiBDcmVhdGUgdGhlIHRvcCBsZXZlbCBzaGVsbCB0aGF0IHdpbGwgbm90IGJlIHVzZWQgb3RoZXIgdGhhbgotICAgICAgIHRvIGluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uLiAKLSAgICAgKi8KLSNpZmRlZiBBSVgKLSAgICB0b3BXaW5kb3cgPSBtb3RpZi5lY2xpcHNlWHRJbml0aWFsaXplKE5VTEwsIG9mZmljaWFsTmFtZSwgTlVMTCwgMCwgcEFyZ2MsIGFyZ3YpOwotI2Vsc2UKLQl0b3BXaW5kb3cgPSBtb3RpZi5YdEluaXRpYWxpemUoTlVMTCwgb2ZmaWNpYWxOYW1lLCBOVUxMLCAwLCBwQXJnYywgYXJndik7Ci0jZW5kaWYKLQlhcHBDb250ZXh0ID0gbW90aWYuWHRXaWRnZXRUb0FwcGxpY2F0aW9uQ29udGV4dCh0b3BXaW5kb3cpOwotCW1vdGlmLlh0U2V0TGFuZ3VhZ2VQcm9jIChhcHBDb250ZXh0LCBOVUxMLCBOVUxMKTsKLQltb3RpZl9YdFNldEFyZyggYXJnWyAwIF0sIFhtTm1hcHBlZFdoZW5NYW5hZ2VkLCBGYWxzZSApOwotICAgIG1vdGlmLlh0U2V0VmFsdWVzKCB0b3BXaW5kb3csIGFyZywgMSApOwotICAgIG1vdGlmLlh0UmVhbGl6ZVdpZGdldCggdG9wV2luZG93ICk7Ci0gICAgbW90aWZJbml0aWFsaXplZCA9IDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENlbnRyZSB0aGUgc2hlbGwgb24gdGhlIHNjcmVlbi4gKi8KLXZvaWQgY2VudHJlU2hlbGwoIFdpZGdldCB3aWRnZXQsIFdpZGdldCBleHBvc2UgKQotewotICAgIFh0QXBwQ29udGV4dCBjb250ZXh0OwotICAgIFhFdmVudCAgICAgICBldmVudDsKLSAgICBBcmcgICAgICAgICAgYXJnWzIwXTsKLSAgICBpbnQgICAgICAgICAgbkFyZ3M7Ci0gICAgUG9zaXRpb24gICAgIHgsIHk7Ci0gICAgRGltZW5zaW9uICAgIHdpZHRoLCBoZWlnaHQ7Ci0gICAgU2NyZWVuKiAgICAgIHNjcmVlbjsKLSAgICBpbnQgICAgICAgICAgd2FpdGluZzsKLSAgICBzaG9ydCAgICAgICAgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodDsKLSAgICAKLSNpZm5kZWYgTk9fWElORVJBTUFfRVhURU5TSU9OUwotICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1vbml0b3JDb3VudDsKLSAgICBYaW5lcmFtYVNjcmVlbkluZm8qIGluZm87Ci0jZW5kaWYKLQkKLSAgICAvKiBSZWFsaXplIHRoZSBzaGVsbCB0byBjYWxjdWxhdGUgaXRzIHdpZHRoL2hlaWdodC4gKi8KLSAgICBtb3RpZi5YdFJlYWxpemVXaWRnZXQoIHdpZGdldCApOwotCi0gICAgLyogR2V0IHRoZSBkZXNpcmVkIGRpbWVuc2lvbnMgb2YgdGhlIHNoZWxsLiAqLwotICAgIG5BcmdzID0gMDsKLSAgICBtb3RpZl9YdFNldEFyZyggYXJnWyBuQXJncyBdLCBYbU53aWR0aCwgICZ3aWR0aCAgKTsgbkFyZ3MrKzsKLSAgICBtb3RpZl9YdFNldEFyZyggYXJnWyBuQXJncyBdLCBYbU5oZWlnaHQsICZoZWlnaHQgKTsgbkFyZ3MrKzsKLSAgICBtb3RpZl9YdFNldEFyZyggYXJnWyBuQXJncyBdLCBYbU5zY3JlZW4sICZzY3JlZW4gKTsgbkFyZ3MrKzsKLSAgICBtb3RpZi5YdEdldFZhbHVlcyggd2lkZ2V0LCBhcmcsIG5BcmdzICk7Ci0KLQlzY3JlZW5XaWR0aCA9IHNjcmVlbi0+d2lkdGg7Ci0Jc2NyZWVuSGVpZ2h0ID0gc2NyZWVuLT5oZWlnaHQ7Ci0jaWZuZGVmIE5PX1hJTkVSQU1BX0VYVEVOU0lPTlMKLQlkaXNwbGF5ID0gbW90aWZfWHREaXNwbGF5KCB3aWRnZXQgKTsKLQlpZiAobW90aWYuWGluZXJhbWFJc0FjdGl2ZSAhPSAwICYmIG1vdGlmLlhpbmVyYW1hSXNBY3RpdmUoIGRpc3BsYXkgKSkgewotCQlpbmZvID0gbW90aWYuWGluZXJhbWFRdWVyeVNjcmVlbnMoIGRpc3BsYXksICZtb25pdG9yQ291bnQgKTsKLQkJaWYgKGluZm8gIT0gMCkgewotCQkJaWYgKG1vbml0b3JDb3VudCA+IDEpIHsKLQkJCQlzY3JlZW5XaWR0aCA9IGluZm8tPndpZHRoOwotCQkJCXNjcmVlbkhlaWdodCA9IGluZm8tPmhlaWdodDsKLQkJCX0KLQkJCW1vdGlmLlhGcmVlIChpbmZvKTsKLQkJfQotCX0KLSNlbmRpZgotCQotICAgIC8qIENhbGN1bGF0ZSB0aGUgWCBhbmQgWSBwb3NpdGlvbiBmb3IgdGhlIHNoZWxsLiAqLwotICAgIHggPSAoc2NyZWVuV2lkdGggLSB3aWR0aCkgLyAyOwotICAgIHkgPSAoc2NyZWVuSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7Ci0KLSAgICAvKiBTZXQgdGhlIG5ldyBzaGVsbCBwb3NpdGlvbiBhbmQgZGlzcGxheSBpdC4gKi8KLSAgICBuQXJncyA9IDA7Ci0gICAgbW90aWZfWHRTZXRBcmcoIGFyZ1sgbkFyZ3MgXSwgWG1OeCwgeCApOyBuQXJncysrOwotICAgIG1vdGlmX1h0U2V0QXJnKCBhcmdbIG5BcmdzIF0sIFhtTnksIHkgKTsgbkFyZ3MrKzsKLSAgICBtb3RpZi5YdFNldFZhbHVlcyggd2lkZ2V0LCBhcmcsIG5BcmdzICk7Ci0gICAgbW90aWZfWHRNYXBXaWRnZXQoIHdpZGdldCApOwotCi0gICAgLyogV2FpdCBmb3IgYW4gZXhwb3NlIGV2ZW50IG9uIHRoZSBkZXNpcmVkIHdpZGdldC4gVGhpcyB3YWl0IGxvb3AgaXMgcmVxdWlyZWQgd2hlbgotICAgICAqIHRoZSBzdGFydFZNIGNvbW1hbmQgZmFpbHMgYW5kIHRoZSBtZXNzYWdlIGJveCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgc3BsYXNoCi0gICAgICogd2luZG93IGlzIGRpc3BsYXllZC4gV2l0aG91dCB0aGlzIHdhaXQsIHRoZSBtZXNzYWdlIGJveCBzb21ldGltZXMgYXBwZWFycwotICAgICAqIHVuZGVyIHRoZSBzcGxhc2ggd2luZG93IGFuZCB0aGUgdXNlciBjYW5ub3Qgc2VlIGl0LgotICAgICAqLwotICAgIGNvbnRleHQgPSBtb3RpZi5YdFdpZGdldFRvQXBwbGljYXRpb25Db250ZXh0KCB3aWRnZXQgKTsKLSAgICB3YWl0aW5nID0gVHJ1ZTsKLSAgICB3aGlsZSAod2FpdGluZykgCi0gICAgewotICAgICAgICBtb3RpZi5YdEFwcE5leHRFdmVudCggY29udGV4dCwgJmV2ZW50ICk7Ci0gICAgICAgIGlmIChldmVudC54YW55LnR5cGUgPT0gRXhwb3NlICYmIGV2ZW50Lnhhbnkud2luZG93ID09IG1vdGlmX1h0V2luZG93KCBleHBvc2UgKSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhaXRpbmcgPSBGYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtb3RpZi5YdERpc3BhdGNoRXZlbnQoICZldmVudCApOwotICAgIH0KLSAgICBtb3RpZi5YRmx1c2goIG1vdGlmX1h0RGlzcGxheSggd2lkZ2V0ICkgKTsKLX0KLQotLyogTG9hZCB0aGUgc3BlY2lmaWVkIHNoYXJlZCBsaWJyYXJ5Ci0gKi8KLXZvaWQgKiBsb2FkTGlicmFyeSggY2hhciAqIGxpYnJhcnkgKXsKLQl2b2lkICogcmVzdWx0PSBkbG9wZW4obGlicmFyeSwgUlRMRF9MQVpZKTsKLQlpZihyZXN1bHQgPT0gMCkgCi0JCXByaW50ZigiJXNcbiIsZGxlcnJvcigpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKiBVbmxvYWQgdGhlIHNoYXJlZCBsaWJyYXJ5Ci0gKi8KLXZvaWQgdW5sb2FkTGlicmFyeSggdm9pZCAqIGhhbmRsZSApewotCWRsY2xvc2UoaGFuZGxlKTsKLX0KLSAKLS8qIEZpbmQgdGhlIGdpdmVuIHN5bWJvbCBpbiB0aGUgc2hhcmVkIGxpYnJhcnkKLSAqLwotdm9pZCAqIGZpbmRTeW1ib2woIHZvaWQgKiBoYW5kbGUsIGNoYXIgKiBzeW1ib2wgKXsKLQlyZXR1cm4gZGxzeW0oaGFuZGxlLCBzeW1ib2wpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL2VjbGlwc2VNb3RpZkluaXQuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvZWNsaXBzZU1vdGlmSW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGU3Mjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvZWNsaXBzZU1vdGlmSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJlY2xpcHNlTW90aWYuaCIKLSNpbmNsdWRlICJlY2xpcHNlQ29tbW9uLmgiCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotc3RydWN0IE1PVElGX1BUUlMgbW90aWY7Ci0KLS8qIG5lZWQgdG8gdW5kZWYgdGhlc2Ugc28gdGhlIEZOX1RBQkxFIHdvcmtzIG9rICovCi0jdW5kZWYgX1htU3RyaW5ncwotI3VuZGVmIFh0U2hlbGxTdHJpbmdzCi0jdW5kZWYgWHRTdHJpbmdzCi0KLS8qIGZ1bmN0aW9ucyBmcm9tIGxpYlhtICovCi1zdGF0aWMgRk5fVEFCTEUgeG1GdW5jdGlvbnNbXSA9IHsJRk5fVEFCTEVfRU5UUlkoWG1DcmVhdGVEcmF3aW5nQXJlYSksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYbUNyZWF0ZUxhYmVsR2FkZ2V0KSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFhtQ3JlYXRlTWFpbldpbmRvdyksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYbUNyZWF0ZU1lc3NhZ2VEaWFsb2cpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWG1NZXNzYWdlQm94R2V0Q2hpbGQpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWG1TdHJpbmdGcmVlKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFhtU3RyaW5nR2VuZXJhdGUpLCAKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKF9YbVN0cmluZ3MpLAkJLyogbm90IGEgZnVuY3Rpb24gKi8KLQkJCQkJCQkJCXsgTlVMTCwgTlVMTCB9IAotCQkJCQkJICAJCSB9OwotCi0vKiBmdW5jdGlvbnMgZnJvbSBsaWJYdCAqLwotc3RhdGljIEZOX1RBQkxFIHh0RnVuY3Rpb25zW10gPSB7CUZOX1RBQkxFX0VOVFJZKFh0QWRkQ2FsbGJhY2spLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWHRBcHBDcmVhdGVTaGVsbCksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYdEFwcE5leHRFdmVudCksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYdEFwcFBlbmRpbmcpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWHRBcHBQcm9jZXNzRXZlbnQpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWHREZXN0cm95V2lkZ2V0KSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFh0RGlzcGF0Y2hFdmVudCksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYdEdldFZhbHVlcyksCi0jaWZuZGVmIEFJWAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWHRJbml0aWFsaXplKSwKLSNlbmRpZgotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWHRJc01hbmFnZWQpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWHRNYW5hZ2VDaGlsZCksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYdE1hcFdpZGdldCksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYdFBvcHVwKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFh0UmVhbGl6ZVdpZGdldCksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYdFNldExhbmd1YWdlUHJvYyksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYdFNldE1hcHBlZFdoZW5NYW5hZ2VkKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFh0U2V0VmFsdWVzKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFh0VW5tYW5hZ2VDaGlsZCksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYdFdpZGdldFRvQXBwbGljYXRpb25Db250ZXh0KSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFh0V2luZG93T2ZPYmplY3QpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWHRTaGVsbFN0cmluZ3MpLAkJCQkgLyogbm90IGEgZnVuY3Rpb24gKi8KLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFh0U3RyaW5ncyksCQkJCQkgLyogbm90IGEgZnVuY3Rpb24gKi8KLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKGFwcGxpY2F0aW9uU2hlbGxXaWRnZXRDbGFzcyksIC8qIG5vdCBhIGZ1bmN0aW9uICovCi0JCQkJCQkJCQl7IE5VTEwsIE5VTEwgfSAKLQkJCQkJCQkJfTsKLQotI2lmZGVmIEFJWAotc3RhdGljIEZOX1RBQkxFIHNoaW1GdW5jdGlvbnNbXSA9IHsgRk5fVEFCTEVfRU5UUlkoZWNsaXBzZVh0SW5pdGlhbGl6ZSksIHtOVUxMLCBOVUxMfSB9OwotI2VuZGlmCi0KLS8qIGZ1bmN0aW9ucyBmcm9tIGxpYlgxMSAqLwotc3RhdGljIEZOX1RBQkxFIHgxMUZ1bmN0aW9uc1tdID0gewlGTl9UQUJMRV9FTlRSWShYRGVmYXVsdFNjcmVlbk9mRGlzcGxheSksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYRnJlZSksCi0JCQkJCQkJCQlGTl9UQUJMRV9FTlRSWShYRmx1c2gpLAotCQkJCQkJCQkJRk5fVEFCTEVfRU5UUlkoWEdldEdlb21ldHJ5KSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFhNYXBXaW5kb3cpLAotCQkJCQkJCQkJeyBOVUxMLCBOVUxMIH0gCi0JCQkJCQkJCX07Ci0KLSNpZm5kZWYgTk9fWElORVJBTUFfRVhURU5TSU9OUwotc3RhdGljIEZOX1RBQkxFIHhpbkZ1bmN0aW9uc1tdID0gewlGTl9UQUJMRV9FTlRSWShYaW5lcmFtYUlzQWN0aXZlKSwKLQkJCQkJCQkJCUZOX1RBQkxFX0VOVFJZKFhpbmVyYW1hUXVlcnlTY3JlZW5zKSwKLQkJCQkJCQkJCXsgTlVMTCwgTlVMTCB9Ci0JCQkJCQkJCSB9OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbG9hZE1vdGlmU3ltYm9scyggdm9pZCAqIGxpYnJhcnksIEZOX1RBQkxFICogdGFibGUpIHsKLQlpbnQgaSA9IDA7Ci0Jdm9pZCAqIGZuOwotCWZvciAoaSA9IDA7IHRhYmxlW2ldLmZuTmFtZSAhPSBOVUxMOyBpKyspIHsKLQkJZm4gPSBmaW5kU3ltYm9sKGxpYnJhcnksIHRhYmxlW2ldLmZuTmFtZSk7Ci0JCWlmIChmbiAhPSAwKSB7Ci0JCQkqKHRhYmxlW2ldLmZuUHRyKSA9IGZuOwotCQl9IGVsc2UgewotCQkJKih0YWJsZVtpXS5mblB0cikgPSAwOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQUlYCi12b2lkICogbG9hZE1vdGlmU2hpbUxpYnJhcnkoKSB7Ci0JaWYgKGVjbGlwc2VMaWJyYXJ5ICE9IE5VTEwpIHsKLQkJLyogbGlicmFyeSBpcyB0aGUgbm9ybWFsIGVjbGlwc2VfPHZlcj4uc28sIGxvb2sgZm9yIGxpYmVjbGlwc2UtbW90aWYuc28gYmVzaWRlIGl0ICovCi0JCV9UQ0hBUiogZWNsaXBzZU1vdGlmTGliID0gX1RfRUNMSVBTRSgibGliZWNsaXBzZS1tb3RpZi5zbyIpOwotCQlfVENIQVIqIHBhdGggPSBzdHJkdXAoZWNsaXBzZUxpYnJhcnkpOwotCQlfVENIQVIqIGMgPSBzdHJyY2hyKHBhdGgsICcvJyk7Ci0JCWlmIChjID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQkqYyA9IDA7Ci0JCWMgPSBtYWxsb2MoKHN0cmxlbihwYXRoKSArIDIgKyBzdHJsZW4oZWNsaXBzZU1vdGlmTGliKSkgKiBzaXplb2YoY2hhcikpOwotCQlfc3RwcmludGYoYywgX1RfRUNMSVBTRSgiJXMvJXMiKSwgcGF0aCwgZWNsaXBzZU1vdGlmTGliKTsKLQotCQlyZXR1cm4gZGxvcGVuKGMsIFJUTERfTEFaWSk7Ci0JfQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLWludCBsb2FkTW90aWYoKSB7Ci0Jdm9pZCAqIHhtTGliID0gTlVMTCwgKnh0TGliID0gTlVMTCwgKngxMUxpYiA9IE5VTEwsICp4aW5MaWIgPSBOVUxMOwotI2lmZGVmIEFJWAotCXZvaWQgKiBtb3RpZlNoaW0gPSBOVUxMOwotI2VuZGlmCi0JY2hhciAqIHBhdGggPSBnZXRQcm9ncmFtRGlyKCk7Ci0JaW50IGRsRmxhZ3MgPSBSVExEX0xBWlk7Ci0JCi0JLyogaW5pdGlhbGl6ZSBwdHIgc3RydWN0IHRvIDAncyAqLwotCW1lbXNldCgmbW90aWYsIDAsIHNpemVvZihzdHJ1Y3QgTU9USUZfUFRSUykpOwotCi0jaWZuZGVmIEFJWAkKLQlpZiAocGF0aCAhPSBOVUxMKSB7Ci0JCS8qIGxvb2sgZm9yIGxpYlhtIGZpcnN0IGluIHRoZSByb290IG9mIGVjbGlwc2UgKi8KLQkJY2hhciAqIGxpYiA9IG1hbGxvYygoc3RybGVuKHBhdGgpICsgc3RybGVuKF9UX0VDTElQU0UoWE1fTElCKSkgKyAyKSAqIHNpemVvZihjaGFyKSk7Ci0JCXNwcmludGYoIGxpYiwgIiVzJWMlcyIsIHBhdGgsIGRpclNlcGFyYXRvciwgWE1fTElCKTsKLQkJeG1MaWIgPSBkbG9wZW4obGliLCBkbEZsYWdzKTsKLQkJZnJlZShsaWIpOwotCX0KLSNlbHNlCi0JZGxGbGFncyB8PSBSVExEX01FTUJFUjsKLQltb3RpZlNoaW0gPSBsb2FkTW90aWZTaGltTGlicmFyeSgpOwotCWlmIChtb3RpZlNoaW0gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotI2VuZGlmCi0KLQlpZiAoeG1MaWIgPT0gTlVMTCkgewotCQl4bUxpYiA9IGRsb3BlbihYTV9MSUIsIGRsRmxhZ3MpOwotCX0KLQkKLQlpZiAoeG1MaWIgPT0gTlVMTCkgewotCQkvKiBiYWlsIG5vdywgZG9uJ3QgbG9hZCB0aGUgb3RoZXJzLCBsaWJYbSBtdXN0IGJlIGxvYWRlZCBmaXJzdCwgc28gbGVhdmUgdGhpbmdzIGZvcgotCQkgKiBzd3QgdG8gZG8gbGF0ZXIgKi8KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQl4dExpYiA9IGRsb3BlbihYVF9MSUIsIGRsRmxhZ3MpOwotCXgxMUxpYiA9IGRsb3BlbihYMTFfTElCLCBkbEZsYWdzKTsKLQkJCQotCS8qIHByaW50ZigiWG1MaWI6ICVzOiAleFxuWHRMaWI6ICVzOiAleFxuWDExTGliOiVzLCAleFxuIiwgWE1fTElCLCB4bUxpYiwgWFRfTElCLCB4dExpYiwgWDExX0xJQiwgeDExTGliKTsqLwotI2lmbmRlZiBOT19YSU5FUkFNQV9FWFRFTlNJT05TCi0JLyogZG9uJ3QgZmFpbCB3aXRob3V0IFhpbmVyYW1hICovCi0JeGluTGliID0gZGxvcGVuKFhJTl9MSUIsIGRsRmxhZ3MpOwotCWlmICh4aW5MaWIgIT0gTlVMTCkKLQkJbG9hZE1vdGlmU3ltYm9scyh4aW5MaWIsIHhpbkZ1bmN0aW9ucyk7Ci0jZW5kaWYKLQlpZiggeHRMaWIgPT0gTlVMTCB8fCB4MTFMaWIgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKGxvYWRNb3RpZlN5bWJvbHMoeG1MaWIsIHhtRnVuY3Rpb25zKSAgIT0gMCkgcmV0dXJuIC0xOwotCWlmIChsb2FkTW90aWZTeW1ib2xzKHh0TGliLCB4dEZ1bmN0aW9ucykgICE9IDApIHJldHVybiAtMTsKLQlpZiAobG9hZE1vdGlmU3ltYm9scyh4MTFMaWIsIHgxMUZ1bmN0aW9ucykgICE9IDApIHJldHVybiAtMTsKLSNpZmRlZiBBSVgKLQlpZiAobG9hZE1vdGlmU3ltYm9scyhtb3RpZlNoaW0sIHNoaW1GdW5jdGlvbnMpICE9MCkgcmV0dXJuIC0xOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvZWNsaXBzZU1vdGlmU2hpbS5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9lY2xpcHNlTW90aWZTaGltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NDhlYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9lY2xpcHNlTW90aWZTaGltLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxYMTEvWC5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSA8WG0vWG1BbGwuaD4KLQotV2lkZ2V0IGVjbGlwc2VYdEluaXRpYWxpemUoU3RyaW5nIHNoZWxsTmFtZSwgU3RyaW5nIGFwcENsYXNzLCBYcm1PcHRpb25EZXNjUmVjKiBvcHRpb25zLCBDYXJkaW5hbCBudW1PcHRpb25zLCBpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0JcmV0dXJuIFh0SW5pdGlhbGl6ZShzaGVsbE5hbWUsIGFwcENsYXNzLCBvcHRpb25zLCBudW1PcHRpb25zLCBhcmdjLCBhcmd2KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvbWFrZV9haXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9tYWtlX2FpeC5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDY4OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9tYWtlX2FpeC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotaW5jbHVkZSAuLi9tYWtlX3ZlcnNpb24ubWFrCi0jIE1ha2VmaWxlIGZvciBjcmVhdGluZyB0aGUgQUlYL01vdGlmIGVjbGlwc2UgbGF1bmNoZXIgcHJvZ3JhbS4KLQotIyBUaGlzIG1ha2VmaWxlIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0OgotIwotIyBQUk9HUkFNX09VVFBVVCAgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBleGVjdXRhYmxlCi0jIFBST0dSQU1fTElCUkFSWSAtIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGxpYnJhcnkKLSMgREVGQVVMVF9PUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItb3MiIHN3aXRjaAotIyBERUZBVUxUX09TX0FSQ0ggLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1hcmNoIiBzd2l0Y2gKLSMgREVGQVVMVF9XUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItd3MiIHN3aXRjaAotIyBYMTFfSE9NRQkgLSB0aGUgZnVsbCBwYXRoIHRvIFgxMSBoZWFkZXIgZmlsZXMKLSMgTU9USUZfSE9NRQkgLSB0aGUgZnVsbCBwYXRoIHRvIE1vdGlmIGhlYWRlciBmaWxlcwotIyBKQVZBX0pOSSAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gdGhlIGphdmEgam5pIGhlYWRlciBmaWxlcwotCi1QUk9HUkFNX09VVFBVVD1lY2xpcHNlCi1QUk9HUkFNX0xJQlJBUlk9ZWNsaXBzZV8kKExJQl9WRVJTSU9OKS5zbwotU0hJTT1saWJlY2xpcHNlLW1vdGlmLnNvCi0KLUNDID0gZ2NjCi0jIERlZmluZSB0aGUgb2JqZWN0IG1vZHVsZXMgdG8gYmUgY29tcGlsZWQgYW5kIGZsYWdzLgotTUFJTl9PQkpTID0gZWNsaXBzZU1haW4ubwotU0hJTV9PQkpTID0gZWNsaXBzZU1vdGlmU2hpbS5vCi1DT01NT05fT0JKUyA9IGVjbGlwc2VDb25maWcubyBlY2xpcHNlQ29tbW9uLm8gZWNsaXBzZU1vdGlmQ29tbW9uLm8gZWNsaXBzZU1vdGlmSW5pdC5vCi1ETExfT0JKUwk9IGVjbGlwc2UubyBlY2xpcHNlTW90aWYubyBlY2xpcHNlVXRpbC5vIGVjbGlwc2VKTkkubyBlY2xpcHNlU2htLm8gZWNsaXBzZU5peC5vXAotCQkJICBOZ0NvbW1vbi5vIE5nSW1hZ2UubyBOZ0ltYWdlRGF0YS5vIE5nV2luQk1QRmlsZUZvcm1hdC5vIAotCi1FWEVDID0gJChQUk9HUkFNX09VVFBVVCkKLURMTCA9ICQoUFJPR1JBTV9MSUJSQVJZKQotTElCUyA9IC1MJChNT1RJRl9IT01FKS9saWIgLWxkbAotU0hJTV9MSUJTID0gLUwkKE1PVElGX0hPTUUpL2xpYiAtbFhtIC1sWHQgLWxYMTEKLU1PVElGX0xJQlMgPSAtRFhNX0xJQj0iXCJsaWJYbS5hKHNocl8zMi5vKVwiIiAtRFhUX0xJQj0iXCJsaWJYdC5hKHNocjQubylcIiIgLURYMTFfTElCPSJcImxpYlgxMS5hKHNocjQubylcIiIKLUxGTEFHUyA9IC1HIC1ibm9lbnRyeSAtYmV4cGFsbCAtbG0gLWxjX3IgLWxDX3IKLUNGTEFHUyA9IC1PIC1zIFwKLQktRE1PVElGIFwKLQktRE5PX1hJTkVSQU1BX0VYVEVOU0lPTlMgXAotCS1EREVGQVVMVF9PUz0iXCIkKERFRkFVTFRfT1MpXCIiIFwKLQktRERFRkFVTFRfT1NfQVJDSD0iXCIkKERFRkFVTFRfT1NfQVJDSClcIiIgXAotCS1EREVGQVVMVF9XUz0iXCIkKERFRkFVTFRfV1MpXCIiIFwKLQkkKE1PVElGX0xJQlMpIFwKLSAgICAtREFJWCBcCi0JLUkuLyBcCi0JLUkuLi8gXAotCS1JJChNT1RJRl9IT01FKS9pbmNsdWRlIFwKLQktSS91c3IvamF2YTUvaW5jbHVkZQotCi1hbGw6ICQoRVhFQykgJChETEwpICQoU0hJTSkKLQotLmMubzoKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQotZWNsaXBzZU1haW4ubzogLi4vZWNsaXBzZU1haW4uYyAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VDb21tb24uaCAgCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0JCi1lY2xpcHNlLm86IC4uL2VjbGlwc2UuYyAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZUpOSS5oCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0KLWVjbGlwc2VDb21tb24ubzogLi4vZWNsaXBzZUNvbW1vbi5jIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlVW5pY29kZS5oIAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAotCQotZWNsaXBzZVV0aWwubzogLi4vZWNsaXBzZVV0aWwuYyAuLi9lY2xpcHNlVXRpbC5oIC4uL2VjbGlwc2VPUy5oCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0KLWVjbGlwc2VKTkkubzogLi4vZWNsaXBzZUpOSS5jIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlSk5JLmgKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQkKLWVjbGlwc2VDb25maWcubzogLi4vZWNsaXBzZUNvbmZpZy5jIC4uL2VjbGlwc2VDb25maWcuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAotCi1lY2xpcHNlU2htLm86IC4uL2VjbGlwc2VTaG0uYyAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQotZWNsaXBzZU5peC5vOiAuLi9lY2xpcHNlTml4LmMKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQkJCi0kKEVYRUMpOiAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykKLQkkKENDKSAtV2wsLWJNOlVSIC1vICQoRVhFQykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoTElCUykKLQlzZWRtZ3IgLWMgZXhlbXB0ICQoRVhFQykKLQotJChETEwpOiAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKQotCWxkICQoTEZMQUdTKSAtbyAkKERMTCkgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCi0kKFNISU0pOiAkKFNISU1fT0JKUykKLQlsZCAkKExGTEFHUykgLW8gJChTSElNKSAkKFNISU1fT0JKUykgJChTSElNX0xJQlMpCi0JCQotaW5zdGFsbDogYWxsCi0JY3AgJChFWEVDKSAkKE9VVFBVVF9ESVIpCi0JY3AgJChTSElNKSAkKE9VVFBVVF9ESVIpCi0JY3AgICQoRExMKSAkKExJQlJBUllfRElSKQotCXJtIC1mICQoRVhFQykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoRExMX09CSlMpCi0KLWNsZWFuOgotCXJtIC1mICQoRVhFQykgJChETEwpICQoU0hJTSkgJChTSElNX09CSlMpICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKERMTF9PQkpTKQotCQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9tYWtlX2hwdXhfUEFfUklTQy5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL21ha2VfaHB1eF9QQV9SSVNDLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5ZDllZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL21ha2VfaHB1eF9QQV9SSVNDLm1haworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEtldmluIENvcm5lbGwgKFJhdGlvbmFsIFNvZnR3YXJlIENvcnBvcmF0aW9uKQotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWluY2x1ZGUgLi4vbWFrZV92ZXJzaW9uLm1hawotIyBNYWtlZmlsZSBmb3IgY3JlYXRpbmcgdGhlIEhQVVgvTW90aWYgZWNsaXBzZSBsYXVuY2hlciBwcm9ncmFtLgotCi0jIFRoaXMgbWFrZWZpbGUgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQ6Ci0jCi0jIFBST0dSQU1fT1VUUFVUICAtIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGV4ZWN1dGFibGUKLSMgREVGQVVMVF9PUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItb3MiIHN3aXRjaAotIyBERUZBVUxUX09TX0FSQ0ggLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1hcmNoIiBzd2l0Y2gKLSMgREVGQVVMVF9XUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItd3MiIHN3aXRjaAotIyBYMTFfSE9NRQkgLSB0aGUgZnVsbCBwYXRoIHRvIFgxMSBoZWFkZXIgZmlsZXMKLSMgTU9USUZfSE9NRQkgLSB0aGUgZnVsbCBwYXRoIHRvIE1vdGlmIGhlYWRlciBmaWxlcwotCi1pZmVxICgkKFBST0dSQU1fT1VUUFVUKSwpCi0gIFBST0dSQU1fT1VUUFVUPWVjbGlwc2UKLWVuZGlmCi0KLVBST0dSQU1fTElCUkFSWT1lY2xpcHNlXyQoTElCX1ZFUlNJT04pLnNvCi0KLSMgRGVmaW5lIHRoZSBvYmplY3QgbW9kdWxlcyB0byBiZSBjb21waWxlZCBhbmQgZmxhZ3MuCi1NQUlOX09CSlMgPSBlY2xpcHNlTWFpbi5vCi1DT01NT05fT0JKUyA9IGVjbGlwc2VDb25maWcubyBlY2xpcHNlQ29tbW9uLm8gZWNsaXBzZU1vdGlmQ29tbW9uLm8KLURMTF9PQkpTCT0gZWNsaXBzZS5vIGVjbGlwc2VNb3RpZi5vIGVjbGlwc2VVdGlsLm8gZWNsaXBzZUpOSS5vIGVjbGlwc2VOaXgubyBlY2xpcHNlU2htLm9cCi0JCQkgIE5nQ29tbW9uLm8gTmdJbWFnZS5vIE5nSW1hZ2VEYXRhLm8gTmdXaW5CTVBGaWxlRm9ybWF0Lm8KLQotRVhFQyA9ICQoUFJPR1JBTV9PVVRQVVQpCi1ETEwgPSAkKFBST0dSQU1fTElCUkFSWSkKLUxJQlMgPSAtTCQoTU9USUZfSE9NRSkvbGliIC1MJChYMTFfSE9NRSkvbGliIC1sWG0gLWxYdCAtbFgxMSAtbHB0aHJlYWQKLUxGTEFHUyA9IC1zaGFyZWQgLVdsLC0tZXhwb3J0LWR5bmFtaWMKLUNGTEFHUyA9IC1PIC1zIFwKLQktRE5PX1hJTkVSQU1BX0VYVEVOU0lPTlMgXAotCS1ETkVUU0NBUEVfRklYIFwKLQktRERFRkFVTFRfT1M9IlwiJChERUZBVUxUX09TKVwiIiBcCi0JLURERUZBVUxUX09TX0FSQ0g9IlwiJChERUZBVUxUX09TX0FSQ0gpXCIiIFwKLQktRERFRkFVTFRfV1M9IlwiJChERUZBVUxUX1dTKVwiIiBcCi0JK1ogXAotCS1JLi8gXAotCS1JLi4vIFwKLQktSSQoTU9USUZfSE9NRSkvaW5jbHVkZSBcCi0JLUkkKFgxMV9IT01FKS9pbmNsdWRlIFwKLQktSSQoSkFWQV9KTkkpIFwKLQkrREFwb3J0YWJsZQotCi1hbGw6ICQoRVhFQykKLQotLmMubzoKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQotZWNsaXBzZU1haW4ubzogLi4vZWNsaXBzZU1haW4uYyAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VDb21tb24uaCAgCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2VNYWluLmMgLW8gJEAKLQkKLWVjbGlwc2UubzogLi4vZWNsaXBzZS5jIC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlSk5JLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZS5jIC1vICRACi0KLWVjbGlwc2VDb21tb24ubzogLi4vZWNsaXBzZUNvbW1vbi5jIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlVW5pY29kZS5oIAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlQ29tbW9uLmMgLW8gJEAKLQkKLWVjbGlwc2VVdGlsLm86IC4uL2VjbGlwc2VVdGlsLmMgLi4vZWNsaXBzZVV0aWwuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlVXRpbC5jIC1vICRACi0KLWVjbGlwc2VKTkkubzogLi4vZWNsaXBzZUpOSS5jIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlSk5JLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZUpOSS5jIC1vICRACi0JCi1lY2xpcHNlQ29uZmlnLm86IC4uL2VjbGlwc2VDb25maWcuYyAuLi9lY2xpcHNlQ29uZmlnLmggLi4vZWNsaXBzZU9TLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZUNvbmZpZy5jIC1vICRACi0KLWVjbGlwc2VTaG0ubzogLi4vZWNsaXBzZVNobS5oIC4uL2VjbGlwc2VVbmljb2RlLmggLi4vZWNsaXBzZVNobS5jCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2VTaG0uYyAtbyAkQAotCi1lY2xpcHNlTml4Lm86IC4uL2VjbGlwc2VOaXguYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlTml4LmMgLW8gJEAJCQotCQotJChFWEVDKTogJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpCi0JJChDQykgLW8gJChFWEVDKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCi0kKERMTCk6ICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpCi0JJChDQykgJChMRkxBR1MpIC1vICQoRExMKSAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKExJQlMpCi0JCi1pbnN0YWxsOiBhbGwKLQljcCAkKEVYRUMpICQoRExMKSAkKE9VVFBVVF9ESVIpCi0Jcm0gLWYgJChFWEVDKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChETExfT0JKUykKLQotY2xlYW46Ci0Jcm0gLWYgJChFWEVDKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChETExfT0JKUykKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvbWFrZV9ocHV4X2lhNjRfMzIubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9tYWtlX2hwdXhfaWE2NF8zMi5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWYyMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9tYWtlX2hwdXhfaWE2NF8zMi5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jICAgICBTdW1pdCBTYXJrYXIgKEhld2xldHQtUGFja2FyZCkKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1pbmNsdWRlIC4uL21ha2VfdmVyc2lvbi5tYWsKLSMgTWFrZWZpbGUgZm9yIGNyZWF0aW5nIHRoZSBIUFVYL01vdGlmIGVjbGlwc2UgbGF1bmNoZXIgcHJvZ3JhbS4KLQotIyBUaGlzIG1ha2VmaWxlIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0OgotIwotIyBQUk9HUkFNX09VVFBVVCAgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBleGVjdXRhYmxlCi0jIERFRkFVTFRfT1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLW9zIiBzd2l0Y2gKLSMgREVGQVVMVF9PU19BUkNIIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItYXJjaCIgc3dpdGNoCi0jIERFRkFVTFRfV1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLXdzIiBzd2l0Y2gKLSMgWDExX0hPTUUJIC0gdGhlIGZ1bGwgcGF0aCB0byBYMTEgaGVhZGVyIGZpbGVzCi0jIE1PVElGX0hPTUUJIC0gdGhlIGZ1bGwgcGF0aCB0byBNb3RpZiBoZWFkZXIgZmlsZXMKLQotI2lmZXEgKCQoUFJPR1JBTV9PVVRQVVQpLCkKLSMgIFBST0dSQU1fT1VUUFVUPWVjbGlwc2UKLSNlbmRpZgotCi1ERUZBVUxUX0pBVkE9REVGQVVMVF9KQVZBX0VYRUMKLVBST0dSQU1fTElCUkFSWT1lY2xpcHNlXyQoTElCX1ZFUlNJT04pLnNvCi0KLSMgRGVmaW5lIHRoZSBvYmplY3QgbW9kdWxlcyB0byBiZSBjb21waWxlZCBhbmQgZmxhZ3MuCi1DQz1nY2MKLU1BSU5fT0JKUyA9IGVjbGlwc2VNYWluLm8KLUNPTU1PTl9PQkpTID0gZWNsaXBzZUNvbmZpZy5vIGVjbGlwc2VDb21tb24ubyBlY2xpcHNlTW90aWZDb21tb24ubyBlY2xpcHNlTW90aWZJbml0Lm8KLURMTF9PQkpTCT0gZWNsaXBzZS5vIGVjbGlwc2VNb3RpZi5vIGVjbGlwc2VVdGlsLm8gZWNsaXBzZUpOSS5vIGVjbGlwc2VOaXgubyBlY2xpcHNlU2htLm8gXAotCQkJICBOZ0NvbW1vbi5vIE5nSW1hZ2UubyBOZ0ltYWdlRGF0YS5vIE5nV2luQk1QRmlsZUZvcm1hdC5vCi0KLUVYRUMgPSAkKFBST0dSQU1fT1VUUFVUKQotRExMID0gJChQUk9HUkFNX0xJQlJBUlkpCi1MSUJTID0gLUwkKE1PVElGX0hPTUUpL2xpYiAtTCQoWDExX0hPTUUpL2xpYiAtbHB0aHJlYWQKLU1PVElGX0xJQlMgPSAtRFhNX0xJQj0iXCJsaWJYbS5zby4xXCIiIC1EWFRfTElCPSJcImxpYlh0LnNvLjFcIiIgLURYMTFfTElCPSJcImxpYlgxMS5zby4xXCIiCi1MRkxBR1MgPSAtc2hhcmVkIC1zdGF0aWMtbGliZ2NjCi0jIC1XbCwtLWV4cG9ydC1keW5hbWljCi1DRkxBR1MgPSAtTyAtcyBcCi0JLUROT19YSU5FUkFNQV9FWFRFTlNJT05TIFwKLQktRE5FVFNDQVBFX0ZJWCBcCi0JLURERUZBVUxUX09TPSJcIiQoREVGQVVMVF9PUylcIiIgXAotCS1EREVGQVVMVF9PU19BUkNIPSJcIiQoREVGQVVMVF9PU19BUkNIKVwiIiBcCi0JLURERUZBVUxUX1dTPSJcIiQoREVGQVVMVF9XUylcIiIgXAotCS1EJChERUZBVUxUX0pBVkEpIFwKLQktREhQVVggXAotCSQoTU9USUZfTElCUykgXAotCS1JLi8gXAotCS1JLi4vIFwKLQktSSQoTU9USUZfSE9NRSkvaW5jbHVkZSBcCi0JLUkkKFgxMV9IT01FKS9pbmNsdWRlIFwKLQktSSQoSkFWQV9IT01FKS9pbmNsdWRlIC1JJChKQVZBX0hPTUUpL2luY2x1ZGUvaHAtdXggCi0KLWFsbDogJChFWEVDKSAkKERMTCkKLQotLmMubzoKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQotZWNsaXBzZS5vOiAuLi9lY2xpcHNlLmMgLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZUNvbW1vbi5oIC4uL2VjbGlwc2VKTkkuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlLmMgLW8gJEAKLQkKLWVjbGlwc2VNYWluLm86IC4uL2VjbGlwc2VNYWluLmMgLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmggIAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlTWFpbi5jIC1vICRACi0KLWVjbGlwc2VDb21tb24ubzogLi4vZWNsaXBzZUNvbW1vbi5jIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlVW5pY29kZS5oIAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlQ29tbW9uLmMgLW8gJEAKLQkKLWVjbGlwc2VVdGlsLm86IC4uL2VjbGlwc2VVdGlsLmMgLi4vZWNsaXBzZVV0aWwuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlVXRpbC5jIC1vICRACi0KLWVjbGlwc2VKTkkubzogLi4vZWNsaXBzZUpOSS5jIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlSk5JLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZUpOSS5jIC1vICRACi0JCi1lY2xpcHNlQ29uZmlnLm86IC4uL2VjbGlwc2VDb25maWcuYyAuLi9lY2xpcHNlQ29uZmlnLmggLi4vZWNsaXBzZU9TLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZUNvbmZpZy5jIC1vICRACi0JCi1lY2xpcHNlU2htLm86IC4uL2VjbGlwc2VTaG0uaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VTaG0uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlU2htLmMgLW8gJEAKLQotZWNsaXBzZU5peC5vOiAuLi9lY2xpcHNlTml4LmMKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZU5peC5jIC1vICRACi0KLSQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKQotCSQoQ0MpIC1vICQoRVhFQykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoTElCUykKLQotJChETEwpOiAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKQotCSQoQ0MpICQoTEZMQUdTKSAtbyAkKERMTCkgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCQotaW5zdGFsbDogYWxsCi0JY3AgJChFWEVDKSAkKE9VVFBVVF9ESVIpCi0JY3AgICQoRExMKSAkKExJQlJBUllfRElSKQotCXJtIC1mICQoRVhFQykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoRExMX09CSlMpCi0KLWNsZWFuOgotCXJtIC1mICQoRVhFQykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoRExMX09CSlMpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9tb3RpZi9tYWtlX2xpbnV4Lm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4ZDUxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL21ha2VfbGludXgubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEtldmluIENvcm5lbGwgKFJhdGlvbmFsIFNvZnR3YXJlIENvcnBvcmF0aW9uKQotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWluY2x1ZGUgLi4vbWFrZV92ZXJzaW9uLm1hawotIyBNYWtlZmlsZSBmb3IgY3JlYXRpbmcgdGhlIExpbnV4L01vdGlmIGVjbGlwc2UgbGF1bmNoZXIgcHJvZ3JhbS4KLQotIyBUaGlzIG1ha2VmaWxlIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0OgotIwotIyBQUk9HUkFNX09VVFBVVCAgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBleGVjdXRhYmxlCi0jIFBST0dSQU1fTElCUkFSWSAtIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGxpYnJhcnkKLSMgREVGQVVMVF9PUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItb3MiIHN3aXRjaAotIyBERUZBVUxUX09TX0FSQ0ggLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1hcmNoIiBzd2l0Y2gKLSMgREVGQVVMVF9XUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItd3MiIHN3aXRjaAotIyBYMTFfSE9NRQkgICAgIC0gdGhlIGZ1bGwgcGF0aCB0byBYMTEgaGVhZGVyIGZpbGVzCi0jIE1PVElGX0hPTUUJIC0gdGhlIGZ1bGwgcGF0aCB0byBNb3RpZiBoZWFkZXIgZmlsZXMKLSMgSkFWQV9IT01FICAgICAgLSBKQVZBX0hPTUUgZm9yIHRoZSBqYXZhIGpuaSBoZWFkZXIgZmlsZXMKLQotaWZlcSAoJChQUk9HUkFNX09VVFBVVCksKQotICBQUk9HUkFNX09VVFBVVD1lY2xpcHNlCi1lbmRpZgotCi1QUk9HUkFNX0xJQlJBUlk9ZWNsaXBzZV8kKExJQl9WRVJTSU9OKS5zbwotCi1pZmVxICgkKERFRkFVTFRfSkFWQSksKQotICBERUZBVUxUX0pBVkE9REVGQVVMVF9KQVZBX0pOSQotZW5kaWYKLQotIyBEZWZpbmUgdGhlIG9iamVjdCBtb2R1bGVzIHRvIGJlIGNvbXBpbGVkIGFuZCBmbGFncy4KLUNDPz1nY2MKLU1BSU5fT0JKUyA9IGVjbGlwc2VNYWluLm8KLUNPTU1PTl9PQkpTID0gZWNsaXBzZUNvbmZpZy5vIGVjbGlwc2VDb21tb24ubyBlY2xpcHNlTW90aWZDb21tb24ubyBlY2xpcHNlTW90aWZJbml0Lm8KLURMTF9PQkpTCT0gZWNsaXBzZS5vIGVjbGlwc2VNb3RpZi5vIGVjbGlwc2VVdGlsLm8gZWNsaXBzZUpOSS5vIGVjbGlwc2VNb3ppbGxhLm8gZWNsaXBzZVNobS5vIGVjbGlwc2VOaXgubyBcCi0JCQkgIE5nQ29tbW9uLm8gTmdJbWFnZS5vIE5nSW1hZ2VEYXRhLm8gTmdXaW5CTVBGaWxlRm9ybWF0Lm8gCi0KLUVYRUMgPSAkKFBST0dSQU1fT1VUUFVUKQotRExMID0gJChQUk9HUkFNX0xJQlJBUlkpCi1MSUJTID0gLVhsaW5rZXIgLXJwYXRoIC1YbGlua2VyIC4gLUwkKE1PVElGX0hPTUUpL2xpYiAtTCQoWDExX0hPTUUpL2xpYiAgLWxwdGhyZWFkIC1sZGwKLU1PVElGX0xJQlMgPSAtRFhNX0xJQj0iXCJsaWJYbS5zby4yXCIiIC1EWFRfTElCPSJcImxpYlh0LnNvLjZcIiIgLURYMTFfTElCPSJcImxpYlgxMS5zby42XCIiIC1EWElOX0xJQj0iXCJsaWJYaW5lcmFtYS5zby4xXCIiCi1MRkxBR1MgPSAtc2hhcmVkIC1mcGljIC1XbCwtLWV4cG9ydC1keW5hbWljIAotQ0ZMQUdTID0gLWcgLXMgLVdhbGwgXAotCS1ETElOVVggXAotCS1ETU9USUYgXAotCS1ETU9aSUxMQV9GSVggXAotCS1EREVGQVVMVF9PUz0iXCIkKERFRkFVTFRfT1MpXCIiIFwKLQktRERFRkFVTFRfT1NfQVJDSD0iXCIkKERFRkFVTFRfT1NfQVJDSClcIiIgXAotCS1EREVGQVVMVF9XUz0iXCIkKERFRkFVTFRfV1MpXCIiIFwKLQkkKE1PVElGX0xJQlMpIFwKLQktRCQoREVGQVVMVF9KQVZBKVwKLQktZlBJQyBcCi0JLUkuLyBcCi0JLUkuLi8gXAotCS1JJChNT1RJRl9IT01FKS9pbmNsdWRlIFwKLQktSSQoWDExX0hPTUUpL2luY2x1ZGUgXAotCS1JJChKQVZBX0hPTUUpL2luY2x1ZGUgLUkkKEpBVkFfSE9NRSkvaW5jbHVkZS9saW51eAotCi1hbGw6ICQoRVhFQykgJChETEwpCi0KLS5jLm86Ci0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0KLWVjbGlwc2VNYWluLm86IC4uL2VjbGlwc2VNYWluLmMgLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmggIAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAotCQotZWNsaXBzZS5vOiAuLi9lY2xpcHNlLmMgLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZUNvbW1vbi5oIC4uL2VjbGlwc2VKTkkuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAotCi1lY2xpcHNlQ29tbW9uLm86IC4uL2VjbGlwc2VDb21tb24uYyAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQkKLWVjbGlwc2VVdGlsLm86IC4uL2VjbGlwc2VVdGlsLmMgLi4vZWNsaXBzZVV0aWwuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAotCi1lY2xpcHNlSk5JLm86IC4uL2VjbGlwc2VKTkkuYyAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZUpOSS5oCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0JCi1lY2xpcHNlQ29uZmlnLm86IC4uL2VjbGlwc2VDb25maWcuYyAuLi9lY2xpcHNlQ29uZmlnLmggLi4vZWNsaXBzZU9TLmgKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQkKLWVjbGlwc2VNb3ppbGxhLm86IC4uL2VjbGlwc2VNb3ppbGxhLmMgLi4vZWNsaXBzZU1vemlsbGEuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAotCQotZWNsaXBzZVNobS5vOiAuLi9lY2xpcHNlU2htLmMgLi4vZWNsaXBzZVNobS5oIC4uL2VjbGlwc2VVbmljb2RlLmggCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0JCi1lY2xpcHNlTml4Lm86IC4uL2VjbGlwc2VOaXguYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAotCQotJChFWEVDKTogJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpCi0JJChDQykgLW8gJChFWEVDKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCi0kKERMTCk6ICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpCi0JJChDQykgJChMRkxBR1MpIC1vICQoRExMKSAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKExJQlMpCi0JCi1pbnN0YWxsOiBhbGwKLQljcCAkKEVYRUMpICQoT1VUUFVUX0RJUikKLQljcCAgJChETEwpICQoTElCUkFSWV9ESVIpCi0Jcm0gLWYgJChFWEVDKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChETExfT0JKUykKLQotY2xlYW46Ci0Jcm0gLWYgJChFWEVDKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChETExfT0JKUykKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvbWFrZV9zb2xhcmlzLm1hayBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvbW90aWYvbWFrZV9zb2xhcmlzLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNzUyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L21vdGlmL21ha2Vfc29sYXJpcy5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jIE1hcnRpbiBPYmVyaHViZXIgKFdpbmQgUml2ZXIpIC0gWzE4NTczNF0gU3VwcG9ydCBidWlsZGluZyB3aXRoIGdjYyBhbmQgZGVidWcKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1pbmNsdWRlIC4uL21ha2VfdmVyc2lvbi5tYWsKLSMgTWFrZWZpbGUgZm9yIGNyZWF0aW5nIHRoZSBTb2xhcmlzL01vdGlmIGVjbGlwc2UgbGF1bmNoZXIgcHJvZ3JhbS4KLQotIyBUaGlzIG1ha2VmaWxlIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0OgotIwotIyBQUk9HUkFNX09VVFBVVCAgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBleGVjdXRhYmxlCi0jIERFRkFVTFRfT1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLW9zIiBzd2l0Y2gKLSMgREVGQVVMVF9PU19BUkNIIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItYXJjaCIgc3dpdGNoCi0jIERFRkFVTFRfV1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLXdzIiBzd2l0Y2gKLSMgWDExX0hPTUUJIC0gdGhlIGZ1bGwgcGF0aCB0byBYMTEgaGVhZGVyIGZpbGVzCi0jIE1PVElGX0hPTUUJIC0gdGhlIGZ1bGwgcGF0aCB0byBNb3RpZiBoZWFkZXIgZmlsZXMKLSMgSkFWQV9IT01FICAgICAgIC0gcGF0aCB0byBqYXZhIGZvciBKTkkgaGVhZGVycwotCi0jaWZlcSAoJChQUk9HUkFNX09VVFBVVCksKQotICBQUk9HUkFNX09VVFBVVD1lY2xpcHNlCi0jZW5kaWYKLQotUFJPR1JBTV9MSUJSQVJZPWVjbGlwc2VfJChMSUJfVkVSU0lPTikuc28KLQotIyBEZWZpbmUgdGhlIG9iamVjdCBtb2R1bGVzIHRvIGJlIGNvbXBpbGVkIGFuZCBmbGFncy4KLU1BSU5fT0JKUyA9IGVjbGlwc2VNYWluLm8KLUNPTU1PTl9PQkpTID0gZWNsaXBzZUNvbmZpZy5vIGVjbGlwc2VDb21tb24ubyBlY2xpcHNlTW90aWZDb21tb24ubyAgZWNsaXBzZU1vdGlmSW5pdC5vCi1ETExfT0JKUwk9IGVjbGlwc2UubyBlY2xpcHNlTW90aWYubyBlY2xpcHNlVXRpbC5vIGVjbGlwc2VKTkkubyBlY2xpcHNlU2htLm8gZWNsaXBzZU5peC5vXAotCQkJICBOZ0NvbW1vbi5vIE5nSW1hZ2UubyBOZ0ltYWdlRGF0YS5vIE5nV2luQk1QRmlsZUZvcm1hdC5vIAotUElDRkxBRyA9IC1LIFBJQwotIyBPcHRpbWl6ZSBhbmQgcmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnkgZGVmYXVsdAotT1BURkxBRyA9IC1PIC1zCi0jIE9QVEZMQUcgPSAtZwotCi1FWEVDID0gJChQUk9HUkFNX09VVFBVVCkKLURMTCA9ICQoUFJPR1JBTV9MSUJSQVJZKQotTElCUyA9IC1MJChNT1RJRl9IT01FKS9saWIgLUwkKFgxMV9IT01FKS9saWIgLWxpbnRsIC1sdGhyZWFkIC1sZGwgLWxjCi1NT1RJRl9MSUJTID0gLURYTV9MSUI9IlwibGliWG0uc28uNFwiIiAtRFhUX0xJQj0iXCJsaWJYdC5zby40XCIiIC1EWDExX0xJQj0iXCJsaWJYMTEuc28uNFwiIiAtRFhJTl9MSUI9IlwibGliWGluZXJhbWEuc28uMVwiIgotI0xGTEFHUyA9IC1zaGFyZWQgLVdsLC0tZXhwb3J0LWR5bmFtaWMgCi1MRkxBR1MgPSAtRwotQ0ZMQUdTID0kKE9QVEZMQUcpIFwKLQktRFNPTEFSSVMgXAotCSQoUElDRkxBRykgXAotCS1ETk9fWElORVJBTUFfRVhURU5TSU9OUyBcCi0JLURORVRTQ0FQRV9GSVggXAotCS1EREVGQVVMVF9PUz0iXCIkKERFRkFVTFRfT1MpXCIiIFwKLQktRERFRkFVTFRfT1NfQVJDSD0iXCIkKERFRkFVTFRfT1NfQVJDSClcIiIgXAotCS1EREVGQVVMVF9XUz0iXCIkKERFRkFVTFRfV1MpXCIiIFwKLQkkKE1PVElGX0xJQlMpIFwKLQktSS4vIFwKLQktSS4uLyBcCi0JLUkkKE1PVElGX0hPTUUpL2luY2x1ZGUgXAotCS1JJChYMTFfSE9NRSkvaW5jbHVkZSBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZSAtSSQoSkFWQV9IT01FKS9pbmNsdWRlL3NvbGFyaXMKLQotYWxsOiAkKEVYRUMpICQoRExMKQotCi0uYy5vOgotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAotCi1lY2xpcHNlTWFpbi5vOiAuLi9lY2xpcHNlTWFpbi5jIC4uL2VjbGlwc2VVbmljb2RlLmggLi4vZWNsaXBzZUNvbW1vbi5oICAKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZU1haW4uYyAtbyAkQAotCQotZWNsaXBzZS5vOiAuLi9lY2xpcHNlLmMgLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZUNvbW1vbi5oIC4uL2VjbGlwc2VKTkkuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlLmMgLW8gJEAKLQotZWNsaXBzZUNvbW1vbi5vOiAuLi9lY2xpcHNlQ29tbW9uLmMgLi4vZWNsaXBzZUNvbW1vbi5oIC4uL2VjbGlwc2VVbmljb2RlLmggCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2VDb21tb24uYyAtbyAkQAotCQotZWNsaXBzZVV0aWwubzogLi4vZWNsaXBzZVV0aWwuYyAuLi9lY2xpcHNlVXRpbC5oIC4uL2VjbGlwc2VPUy5oCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2VVdGlsLmMgLW8gJEAKLQotZWNsaXBzZUpOSS5vOiAuLi9lY2xpcHNlSk5JLmMgLi4vZWNsaXBzZUNvbW1vbi5oIC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VKTkkuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlSk5JLmMgLW8gJEAKLQkKLWVjbGlwc2VDb25maWcubzogLi4vZWNsaXBzZUNvbmZpZy5jIC4uL2VjbGlwc2VDb25maWcuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlQ29uZmlnLmMgLW8gJEAKLQotZWNsaXBzZVNobS5vOiAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlU2htLmMKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZVNobS5jIC1vICRACi0JCi1lY2xpcHNlTml4Lm86IC4uL2VjbGlwc2VOaXguYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlTml4LmMgLW8gJEAKLQkKLSQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKQotCSQoQ0MpIC1vICQoRVhFQykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoTElCUykKLQotJChETEwpOiAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKQotCSQoQ0MpICQoTEZMQUdTKSAtbyAkKERMTCkgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCQotaW5zdGFsbDogYWxsCi0JY3AgJChFWEVDKSAkKE9VVFBVVF9ESVIpCi0JY3AgICQoRExMKSAkKExJQlJBUllfRElSKQotCXJtIC1mICQoRVhFQykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoRExMX09CSlMpCi0KLWNsZWFuOgotCXJtIC1mICQoRVhFQykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoRExMX09CSlMpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3Bob3Rvbi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9waG90b24vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzNWRmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3Bob3Rvbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLm8KLWVjbGlwc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvcGhvdG9uL2J1aWxkLnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9waG90b24vYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjZkMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9waG90b24vYnVpbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jIS9iaW4vc2gKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEtldmluIENvcm5lbGwgKFJhdGlvbmFsIFNvZnR3YXJlIENvcnBvcmF0aW9uKQotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMKLSMgVXNhZ2U6IHNoIGJ1aWxkLnNoIFs8b3B0aW9uYWwgc3dpdGNoZXM+XSBbY2xlYW5dCi0jCi0jICAgd2hlcmUgdGhlIG9wdGlvbmFsIHN3aXRjaGVzIGFyZToKLSMgICAgICAgLW91dHB1dCA8UFJPR1JBTV9PVVRQVVQ+ICAtIGV4ZWN1dGFibGUgZmlsZW5hbWUgKCJlY2xpcHNlIikKLSMgICAgICAgLW9zICAgICA8REVGQVVMVF9PUz4gICAgICAtIGRlZmF1bHQgRWNsaXBzZSAiLW9zIiB2YWx1ZQotIyAgICAgICAtYXJjaCAgIDxERUZBVUxUX09TX0FSQ0g+IC0gZGVmYXVsdCBFY2xpcHNlICItYXJjaCIgdmFsdWUKLSMgICAgICAgLXdzICAgICA8REVGQVVMVF9XUz4gICAgICAtIGRlZmF1bHQgRWNsaXBzZSAiLXdzIiB2YWx1ZQotIwotIwotIyAgICBUaGlzIHNjcmlwdCBjYW4gYWxzbyBiZSBpbnZva2VkIHdpdGggdGhlICJjbGVhbiIgYXJndW1lbnQuCi0KLWNkIGBkaXJuYW1lICQwYAotCi0jIERlZmluZSBkZWZhdWx0IHZhbHVlcyBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG1ha2VmaWxlcy4KLXByb2dyYW1PdXRwdXQ9ImVjbGlwc2UiCi1kZWZhdWx0T1M9InFueCIKLWRlZmF1bHRPU0FyY2g9Ing4NiIKLWRlZmF1bHRXUz0icGhvdG9uIgotbWFrZWZpbGU9Im1ha2VfcW54Lm1hayIKLWlmIFsgIiRPUyIgPSAiIiBdOyAgdGhlbgotICAgIE9TPWB1bmFtZSAtc2AKLWZpCi0KLSMgUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlcy4KLWV4dHJhQXJncz0iIgotd2hpbGUgWyAiJDEiICE9ICIiIF07IGRvCi0gICAgaWYgWyAiJDEiID0gIi1vcyIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotICAgICAgICBkZWZhdWx0T1M9IiQyIgotICAgICAgICBzaGlmdAotICAgIGVsaWYgWyAiJDEiID0gIi1hcmNoIiBdICYmIFsgIiQyIiAhPSAiIiBdOyB0aGVuCi0gICAgICAgIGRlZmF1bHRPU0FyY2g9IiQyIgotICAgICAgICBzaGlmdAotICAgIGVsaWYgWyAiJDEiID0gIi13cyIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotICAgICAgICBkZWZhdWx0V1M9IiQyIgotICAgICAgICBzaGlmdAotICAgIGVsaWYgWyAiJDEiID0gIi1vdXRwdXQiIF0gJiYgWyAiJDIiICE9ICIiIF07IHRoZW4KLSAgICAgICAgcHJvZ3JhbU91dHB1dD0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxzZQotICAgICAgICBleHRyYUFyZ3M9IiRleHRyYUFyZ3MgJDEiCi0gICAgZmkKLSAgICBzaGlmdAotZG9uZQotCi0jIFNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbmVlZGVkIGJ5IHRoZSBtYWtlZmlsZXMuCi1QUk9HUkFNX09VVFBVVD0iJHByb2dyYW1PdXRwdXQiCi1ERUZBVUxUX09TPSIkZGVmYXVsdE9TIgotREVGQVVMVF9PU19BUkNIPSIkZGVmYXVsdE9TQXJjaCIKLURFRkFVTFRfV1M9IiRkZWZhdWx0V1MiCi1PVVRQVVRfRElSPSIuLi8uLi9iaW4vJGRlZmF1bHRXUy8kZGVmYXVsdE9TLyRkZWZhdWx0T1NBcmNoIgotCi1leHBvcnQgT1VUUFVUX0RJUiBQUk9HUkFNX09VVFBVVCBERUZBVUxUX09TIERFRkFVTFRfT1NfQVJDSCBERUZBVUxUX1dTCi0KLSMgSWYgdGhlIE9TIGlzIHN1cHBvcnRlZCAoYSBtYWtlZmlsZSBleGlzdHMpCi1pZiBbICIkbWFrZWZpbGUiICE9ICIiIF07IHRoZW4KLQlpZiBbICIkZXh0cmFBcmdzIiAhPSAiIiBdOyB0aGVuCi0JCW1ha2UgLWYgJG1ha2VmaWxlICRleHRyYUFyZ3MKLQllbHNlCi0JCWVjaG8gIkJ1aWxkaW5nICRPUyBsYXVuY2hlci4gRGVmYXVsdHM6IC1vcyAkREVGQVVMVF9PUyAtYXJjaCAkREVGQVVMVF9PU19BUkNIIC13cyAkREVGQVVMVF9XUyIKLQkJbWFrZSAtZiAkbWFrZWZpbGUgY2xlYW4KLQkJbWFrZSAtZiAkbWFrZWZpbGUgYWxsCi0JZmkKLWVsc2UKLQllY2hvICJVbmtub3duIE9TICgkT1MpIC0tIGJ1aWxkIGFib3J0ZWQiCi1maQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9waG90b24vYnVpbGQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9waG90b24vYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDMwOGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvcGhvdG9uL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9ImJ1aWxkX2VjbGlwc2UiIGJhc2VkaXI9Ii4iPgotCi08dGFyZ2V0IG5hbWU9ImJ1aWxkX2VjbGlwc2UiPgotCTxleGVjIGRpcj0iLiIgZXhlY3V0YWJsZT0ic2giPgotCQk8YXJnIGxpbmU9IiR7YmFzZWRpcn0vYnVpbGQuc2giLz4KLQkJPGFyZyBsaW5lPSJpbnN0YWxsIi8+Ci0JPC9leGVjPgotCTxlY2xpcHNlLnJlZnJlc2hMb2NhbCByZXNvdXJjZT0icGxhdGZvcm0tbGF1bmNoZXIiIGRlcHRoPSJpbmZpbml0ZSIgLz4JCQotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCTx0c3RhbXAvPgotCTxleGVjIGRpcj0iLiIgZXhlY3V0YWJsZT0ic2giPgotCQk8YXJnIGxpbmU9IiR7YmFzZWRpcn0vYnVpbGQuc2giLz4KLQkJPGFyZyBsaW5lPSJjbGVhbiIvPgotCTwvZXhlYz4KLTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9waG90b24vZWNsaXBzZVBob3Rvbi5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9waG90b24vZWNsaXBzZVBob3Rvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRjYjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvcGhvdG9uL2VjbGlwc2VQaG90b24uYworKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotLyogUGhvdG9uIHNwZWNpZmljIGxvZ2ljIGZvciBkaXNwbGF5aW5nIHRoZSBzcGxhc2ggc2NyZWVuLiAqLwotCi0jaW5jbHVkZSAiZWNsaXBzZU9TLmgiCi0jaW5jbHVkZSAiZWNsaXBzZVV0aWwuaCIKLSNpbmNsdWRlIDxQdC5oPgotCi0jZGVmaW5lIFBYX0lNQUdFX01PRFVMRVMKLSNkZWZpbmUgUFhfQk1QX1NVUFBPUlQKLQotI2luY2x1ZGUgPHBob3Rvbi9QeEltYWdlLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxsaWJnZW4uaD4KLQotLyogR2xvYmFsIFZhcmlhYmxlcyAqLwotY2hhciAgIGRpclNlcGFyYXRvciAgPSAnLyc7Ci1jaGFyICAgcGF0aFNlcGFyYXRvciA9ICc6JzsKLSNpZm5kZWYgSjlWTQotY2hhciogIGRlZmF1bHRWTSAgICAgPSAiamF2YSI7Ci1jaGFyKiAgc2hpcHBlZFZNRGlyICA9ICJqcmUvYmluLyI7Ci0jZWxzZQotY2hhciogIGRlZmF1bHRWTSAgICAgPSAiajkiOwotY2hhciogIHNoaXBwZWRWTURpciAgPSAiaXZlL2Jpbi8iOwotI2VuZGlmCi0KLS8qIERlZmluZSB0aGUgd2luZG93IHN5c3RlbSBhcmd1bWVudHMgZm9yIHRoZSB2YXJpb3VzIEphdmEgVk1zLiAqLwotc3RhdGljIGNoYXIqICBhcmdWTV9KQVZBW10gPSB7IE5VTEwgfTsKLXN0YXRpYyBjaGFyKiAgYXJnVk1fSjlbXSAgID0geyAiLWppdCIsICItbXM6MzIiLCAiLW1zbzoyNTYiLCBOVUxMIH07Ci0KLQotLyogRGVmaW5lIGxvY2FsIHZhcmlhYmxlcyBmb3IgdGhlIG1haW4gd2luZG93LiAqLwotc3RhdGljIFB0V2lkZ2V0X3QqICB0b3BXaW5kb3cgPSBOVUxMOwotCi0vKiBEZWZpbmUgbG9jYWwgdmFyaWFibGVzIGZvciBydW5uaW5nIHRoZSBKVk0gYW5kIGRldGVjdGluZyBpdHMgZXhpdC4gKi8KLXN0YXRpYyBwaWRfdCAgIGp2bVByb2Nlc3MgPSAwOwotc3RhdGljIGludCAgICAganZtRXhpdENvZGU7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgICAgICAgYnJpbmdEb3duU3BsYXNoV2luZG93KCBpbnQgKTsKLXN0YXRpYyB2b2lkICAgICAgIGNlbnRyZVdpbmRvdyggUHRXaWRnZXRfdCAqd2lkZ2V0LCBQdFdpZGdldF90ICpsYWJlbCk7Ci1zdGF0aWMgaW50ICAgICAgICBzcGxhc2hUaW1lb3V0KCBQdFdpZGdldF90KiB3aWRnZXQsIHZvaWQqIGRhdGEsIFB0Q2FsbGJhY2tJbmZvX3QqIGlkICk7Ci0KLS8qIERpc3BsYXkgYSBNZXNzYWdlICovCi12b2lkIGRpc3BsYXlNZXNzYWdlKCBjaGFyKiB0aXRsZSwgY2hhciogbWVzc2FnZSApCi17Ci0gICAgaWYgKHRvcFdpbmRvdyA9PSAwKSAKLSAgICB7Ci0JCWluaXRXaW5kb3dTeXN0ZW0oIE5VTEwsIE5VTEwsIDAgKTsKLSAgICB9Ci0gICAgCi0gCVB0Tm90aWNlKCBOVUxMLE5VTEwsIHRpdGxlLCBOVUxMLCBtZXNzYWdlLCBOVUxMLCBOVUxMLCBOVUxMLCBQdF9DRU5URVIgfCBQdF9NT0RBTCApOwotfQotCi0KLS8qIEluaXRpYWxpemUgV2luZG93IFN5c3RlbQotICoKLSAqIEluaXRpYWxpemUgUGhvdG9uLgotICovCi12b2lkIGluaXRXaW5kb3dTeXN0ZW0oIGludCogcEFyZ2MsIGNoYXIqIGFyZ3ZbXSwgaW50IHNob3dTcGxhc2ggKQotewotICAgIFB0QXJnX3QgYXJnWzVdOwotICAgIGludCAgICAgbkFyZ3M7Ci0gICAKLSAgICAvKiBDcmVhdGUgYSB0b3AgbGV2ZWwgd2luZG93IHdpdGggbm8gZGVjb3JhdGlvbnMuICovCi0gICAgc2V0bG9jYWxlKExDX0FMTCwgIiIpOwotICAgIFB0SW5pdCggTlVMTCApOwotICAgIG5BcmdzID0gMDsKLSAgICBQdFNldEFyZyggJmFyZ1sgbkFyZ3MrKyBdLCBQdF9BUkdfV0lORE9XX1JFTkRFUl9GTEFHUywgMCwgfjAgKTsgCi0gICAgUHRTZXRBcmcoICZhcmdbIG5BcmdzKysgXSwgUHRfQVJHX1dJTkRPV19NQU5BR0VEX0ZMQUdTLCBQaF9XTV9UQVNLQkFSIHwgUGhfV01fQ0xPU0UsIH4wICk7IAotICAgIFB0U2V0QXJnKCAmYXJnWyBuQXJncysrIF0sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFBoX1dNX1NUQVRFX0lTRlJPTlQsIH4wICk7IAotICAgIFB0U2V0QXJnKCAmYXJnWyBuQXJncysrIF0sIFB0X0FSR19XSU5ET1dfVElUTEUsIGdldE9mZmljaWFsTmFtZSgpLCB+MCApOyAKLSAgICB0b3BXaW5kb3cgPSBQdENyZWF0ZVdpZGdldCggUHRXaW5kb3csIFB0X05PX1BBUkVOVCwgbkFyZ3MsIGFyZyApOwotfQotCi0KLS8qIFNob3cgdGhlIFNwbGFzaCBXaW5kb3cKLSAqCi0gKiBDcmVhdGUgdGhlIHNwbGFzaCB3aW5kb3csIGxvYWQgdGhlIGJpdG1hcCBhbmQgZGlzcGxheSB0aGUgc3BsYXNoIHdpbmRvdy4KLSAqCi0gKi8KLWludCBzaG93U3BsYXNoKCBjaGFyKiB0aW1lb3V0U3RyaW5nLCBjaGFyKiBmZWF0dXJlSW1hZ2UgKQotewotCWludCAgICAgICAgICB0aW1lb3V0ID0gMDsKLSAgICBQdFdpZGdldF90KiAgbGFiZWw7Ci0gICAgUHRBcmdfdCAgICAgIGFyZ1sxMF07Ci0gICAgUGhJbWFnZV90KiAgIGltYWdlID0gTlVMTDsKLSAgICBpbnQgICAgICAgICAgbkFyZ3M7Ci0gICAgaW50ICAgICAgICAgIGRlcHRoOwotCVBnRGlzcGxheVNldHRpbmdzX3Qgc2V0dGluZ3M7Ci0JUGdWaWRlb01vZGVJbmZvX3QgICBtb2RlX2luZm87Ci0gICAgCi0JLyogRGV0ZXJtaW5lIHRoZSBzcGxhc2ggdGltZW91dCB2YWx1ZSAoaW4gc2Vjb25kcykuICovCi0JaWYgKHRpbWVvdXRTdHJpbmcgIT0gTlVMTCAmJiBzdHJsZW4oIHRpbWVvdXRTdHJpbmcgKSA+IDApCi0JewotCSAgICBzc2NhbmYoIHRpbWVvdXRTdHJpbmcsICIlZCIsICZ0aW1lb3V0ICk7Ci0JfQotCQotICAgIC8qIEluc3RhbGwgYSBzaWduYWwgaGFuZGxlciB0byBjYXRjaCBTSUdVU1IyICh3aGljaCB3aWxsIHNodXQgZG93biB0aGUgd2luZG93KS4gKi8KLSAgICBzaWduYWwoIFNJR1VTUjIsIGJyaW5nRG93blNwbGFzaFdpbmRvdyApOwotICAKLQkvKiBMb2FkIHRoZSBzcGxhc2ggaW1hZ2UgZnJvbSB0aGUgZmVhdHVyZSBkaXJlY3RvcnkuICovCi0gICAgUGdHZXRWaWRlb01vZGUoICZzZXR0aW5ncyApOwotICAgIFBnR2V0VmlkZW9Nb2RlSW5mbyggc2V0dGluZ3MubW9kZSwgJm1vZGVfaW5mbyApOwotICAgIGRlcHRoID0gbW9kZV9pbmZvLmJpdHNfcGVyX3BpeGVsOwotICAgIGlmIChmZWF0dXJlSW1hZ2UgIT0gTlVMTCkKLSAgICAJaW1hZ2UgPSBQeExvYWRJbWFnZSggZmVhdHVyZUltYWdlLCBOVUxMICk7Ci0KLSAgICAvKiBJZiB0aGUgc3BsYXNoIGltYWdlIGNvdWxkIG5vdCBiZSBmb3VuZCwgcmV0dXJuIGFuIGVycm9yLiAqLwotICAgIGlmIChpbWFnZSA9PSBOVUxMKQotICAgIAlyZXR1cm4gRU5PRU5UOwotCi0gICAgLyogQ3JlYXRlIGEgbGFiZWwgd2lkZ2V0IChvbmx5IGNoaWxkIG9mIHRvcCB3aW5kb3cpIHdpdGggdGhlIGltYWdlLiAqLwotICAgIG5BcmdzID0gMDsKLQlpbWFnZS0+ZmxhZ3MgfD0gUGhfUkVMRUFTRV9JTUFHRV9BTEw7Ci0gICAgUHRTZXRBcmcoICZhcmdbIG5BcmdzKysgXSwgUHRfQVJHX0xBQkVMX1RZUEUsIFB0X0lNQUdFLCAwICk7Ci0gICAgUHRTZXRBcmcoICZhcmdbIG5BcmdzKysgXSwgUHRfQVJHX0xBQkVMX0lNQUdFLCBpbWFnZSwgMCApOwotICAgIFB0U2V0QXJnKCAmYXJnWyBuQXJncysrIF0sIFB0X0FSR19URVhUX1NUUklORywgb2ZmaWNpYWxOYW1lLCAwICk7Ci0gICAgUHRTZXRBcmcoICZhcmdbIG5BcmdzKysgXSwgUHRfQVJHX01BUkdJTl9XSURUSCwgMCwgMCApOwotICAgIFB0U2V0QXJnKCAmYXJnWyBuQXJncysrIF0sIFB0X0FSR19NQVJHSU5fSEVJR0hULCAwLCAwICk7Ci0gICAgbGFiZWwgPSBQdENyZWF0ZVdpZGdldCggUHRMYWJlbCwgdG9wV2luZG93LCBuQXJncywgYXJnICk7Ci0gICAgCi0gICAgLyogRnJlZSB0aGUgaW1hZ2UgKi8KLSAgICBmcmVlKCBpbWFnZSApOwotCi0gICAgLyogQ2VudHJlIHRoZSBzcGxhc2ggd2luZG93IGFuZCBkaXNwbGF5IGl0LiAqLwotICAgIGNlbnRyZVdpbmRvdyggdG9wV2luZG93LCBsYWJlbCApOwotCQotCS8qIElmIGEgdGltZW91dCBmb3IgdGhlIHNwbGFzaCB3aW5kb3cgd2FzIGdpdmVuICovCi0JaWYgKHRpbWVvdXQgIT0gMCkKLQl7Ci0gICAgICAgIFB0QWRkRXZlbnRIYW5kbGVyKCB0b3BXaW5kb3csIFBoX0VWX1RJTUVSLCBzcGxhc2hUaW1lb3V0LCBOVUxMICk7Ci0gICAgICAgIFB0VGltZXJBcm0oIHRvcFdpbmRvdywgKHRpbWVvdXQgKiAxMDAwKSApOwotCX0KLQotICAgIC8qIFByb2Nlc3MgbWVzc2FnZXMgdW50aWwgdGhlIHNwbGFzaCB3aW5kb3cgaXMgY2xvc2VkIG9yIHByb2Nlc3MgaXMgdGVybWluYXRlZC4gKi8KLSAJd2hpbGUgKFB0V2lkZ2V0SXNSZWFsaXplZCggdG9wV2luZG93ICkpCi0gCXsKLSAgCSAgICBQdFByb2Nlc3NFdmVudCgpOwotICAgIH0KLQotICAgIC8qIERlc3Ryb3kgdGhlIHNwbGFzaCB3aW5kb3cuICovCi0gICAgUHREZXN0cm95V2lkZ2V0KCB0b3BXaW5kb3cgKTsKLSAgICB0b3BXaW5kb3cgPSAwOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyogR2V0IHRoZSB3aW5kb3cgc3lzdGVtIHNwZWNpZmljIFZNIGFyZ3VtZW50cyAqLwotY2hhcioqIGdldEFyZ1ZNKCBjaGFyKiB2bSApIAotewotICAgIHJldHVybiAoaXNKOVZNKCB2bSApID8gYXJnVk1fSjkgOiBhcmdWTV9KQVZBKTsKLX0KLQotdm9pZCBmaXhFbnZGb3JKOSggY2hhciogdm0gKSB7Ci0gICAgaWYgKGlzSjlWTSggdm0gKSkgewotICAgICAgICBjaGFyICAgKmxkcGF0aDsKLSAgICAgICAgY2hhciAgIG5ld3BhdGhbUEFUSF9NQVgrMV07Ci0KLSAgICAgICAgbGRwYXRoID0gZ2V0ZW52KCAiTERfTElCUkFSWV9QQVRIIiApOwotCi0gICAgICAgIC8qIEFsd2F5cyBkdXAgdGhlIHN0cmluZyBzbyB3ZSBjYW4gZnJlZSBsYXRlciAqLwotICAgICAgICBpZiggbGRwYXRoICE9IE5VTEwgKQotICAgICAgICAgICAgbGRwYXRoID0gc3RyZHVwKCBsZHBhdGggKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGRwYXRoID0gc3RyZHVwKCAiIiApOwotCi0gICAgICAgIC8qIEdldCB0aGUgajkgYmluYXJ5IGxvY2F0aW9uICovIAotICAgICAgICBzdHJuY3B5KCBuZXdwYXRoLCB2bSwgUEFUSF9NQVggKTsKLSAgICAgICAgZGlybmFtZSggbmV3cGF0aCApOwotCi0JCS8qIEFkZCBqOSBiaW5hcnkgbG9jYXRpb24gdG8gTERfTElCUkFSWV9QQVRIICovCi0gICAgICAgIGxkcGF0aCA9IHJlYWxsb2MoIGxkcGF0aCwgc3RybGVuKCBsZHBhdGggKSArIHN0cmxlbiggbmV3cGF0aCApICsgMiApOwotICAgICAgICBpZiggbGRwYXRoICE9IE5VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJjYXQoIGxkcGF0aCwgIjoiICk7Ci0gICAgICAgICAgICBzdHJjYXQoIGxkcGF0aCwgbmV3cGF0aCApOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0ZW52KCAiTERfTElCUkFSWV9QQVRIIiwgbGRwYXRoLCAxICk7Ci0KLSAgICAgICAgZnJlZSggbGRwYXRoICk7Ci0gICAgfQotfQotCi0vKiBTdGFydCB0aGUgSmF2YSBWTSAKLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gc3RhcnQgdGhlIEphdmEgdmlydHVhbCBtYWNoaW5lIGFuZCB0byB3YWl0IHVudGlsIGl0Ci0gKiB0ZXJtaW5hdGVzLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgZXhpdCBjb2RlIGZyb20gdGhlIEpWTS4KLSAqLwotaW50IHN0YXJ0SmF2YVZNKCBjaGFyKiBhcmdzW10gKSAKLXsKLSAgICBpbnQgICAgZXhpdENvZGU7Ci0gICAgCi0gICAgZml4RW52Rm9ySjkgKGFyZ3MgWzBdKTsKLQkKLQkvKiBDcmVhdGUgYSBjaGlsZCBwcm9jZXNzIGZvciB0aGUgSlZNLiAqLwkKLQlqdm1Qcm9jZXNzID0gZm9yaygpOwotCWlmIChqdm1Qcm9jZXNzID09IDApIAotCXsKLQkJLyogQ2hpbGQgcHJvY2VzcyAuLi4gc3RhcnQgdGhlIEpWTSAqLwotCQlleGVjdiggYXJnc1swXSwgYXJncyApOwotCQkKLQkJLyogVGhlIEpWTSB3b3VsZCBub3Qgc3RhcnQgLi4uIHJldHVybiBlcnJvciBjb2RlIHRvIHBhcmVudCBwcm9jZXNzLiAqLwotCQlqdm1FeGl0Q29kZSA9IGVycm5vOwotICAgICAgICBleGl0KCBqdm1FeGl0Q29kZSApOwotCX0KLQkKLQkvKiBJZiB0aGUgSlZNIGlzIHN0aWxsIHJ1bm5pbmcsIHdhaXQgZm9yIGl0IHRvIHRlcm1pbmF0ZS4gKi8KLQlpZiAoanZtUHJvY2VzcyAhPSAwKQotCXsKLQkJd2FpdCggJmV4aXRDb2RlICk7Ci0JCWp2bUV4aXRDb2RlID0gKChleGl0Q29kZSAmIDB4MDBmZikgPT0gMCA/IChleGl0Q29kZSA+PiA4KSA6IGV4aXRDb2RlKTsgLyogc2VlIHdhaXQoMikgKi8KLQl9Ci0JCi0JLyogUmV0dXJuIHRoZSBleGl0IGNvZGUgZnJvbSB0aGUgSlZNLiAqLwotCXJldHVybiBqdm1FeGl0Q29kZTsKLX0KLQotLyotLS0tLS0gTG9jYWwgZnVuY3Rpb25zIC0tLS0tKi8KLQotCi0vKiBDYXRjaCBhIHNpZ25hbCB0aGF0IGluZGljYXRlcyB0aGUgc3BsYXNoIHdpbmRvdyBpcyB0byBiZSBicm91Z2h0IGRvd24uICovCi1zdGF0aWMgdm9pZCBicmluZ0Rvd25TcGxhc2hXaW5kb3coIGludCBzaWcgKQotewotICAgIGlmICh0b3BXaW5kb3cgIT0gMCkgCi0gICAgewotICAgICAgICBQdFVucmVhbGl6ZVdpZGdldCggdG9wV2luZG93ICk7Ci0gICAgfQotfQotCi0KLS8qIENlbnRyZSB0aGUgdG9wIHdpbmRvdyBvbiB0aGUgc2NyZWVuLiAqLwotCi1zdGF0aWMgdm9pZCBjZW50cmVXaW5kb3coIFB0V2lkZ2V0X3QqIHdpbmRvdywgUHRXaWRnZXRfdCogZXhwb3NlICkKLXsKLSAgICBQdEFyZ190ICAgYXJnWzJdOwotICAgIGludCAgIG5BcmdzOwotICAgIFBoUG9pbnRfdCBwb3M7Ci0JUGhBcmVhX3QgYXJlYTsKLSAgICBQaFJlY3RfdCByZWN0OwotICAgIGludCB3aWR0aCwgaGVpZ2h0OwotCi0gICAgLyogUmVhbGl6ZSB0aGUgdG9wIHdpbmRvdyB0byBjYWxjdWxhdGUgaXRzIHdpZHRoL2hlaWdodC4gKi8KLSAgICBQdEV4dGVudFdpZGdldEZhbWlseSggd2luZG93ICk7Ci0KLSAgICAvKiBHZXQgdGhlIGRlc2lyZWQgZGltZW5zaW9ucyBvZiB0aGUgd2luZG93LiAqLwotICAgIFB0V2lkZ2V0QXJlYSggd2luZG93LCAmYXJlYSApOwotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBYIGFuZCBZIHBvc2l0aW9uIGZvciB0aGUgd2luZG93LiAqLwotICAgIFBoV2luZG93UXVlcnlWaXNpYmxlKCBQaF9RVUVSWV9XT1JLU1BBQ0UsIDAsIFBoSW5wdXRHcm91cCgwKSwgJnJlY3QgKTsKLSAgICB3aWR0aCA9IHJlY3QubHIueCAtIHJlY3QudWwueCArIDE7Ci0gICAgaGVpZ2h0ID0gcmVjdC5sci55IC0gcmVjdC51bC55ICsgMTsKLSAgICBwb3MueCA9IHJlY3QudWwueCArICh3aWR0aCAgLSBhcmVhLnNpemUudykgLyAyOwotICAgIHBvcy55ID0gcmVjdC51bC55ICsgKGhlaWdodCAtIGFyZWEuc2l6ZS5oKSAvIDI7Ci0KLSAgICAvKiBTZXQgdGhlIG5ldyBzaGVsbCBwb3NpdGlvbiBhbmQgZGlzcGxheSBpdC4gKi8KLSAgICBuQXJncyA9IDA7Ci0gICAgUHRTZXRBcmcoICZhcmdbIG5BcmdzKysgXSwgUHRfQVJHX1BPUywgJnBvcywgMCApOwotICAgIFB0U2V0UmVzb3VyY2VzKCB3aW5kb3csIG5BcmdzLCBhcmcgKTsKLSAgICBQdFJlYWxpemVXaWRnZXQoIHdpbmRvdyApOwotfQotCi0KLS8qIFNwbGFzaCBUaW1lb3V0ICovCi1zdGF0aWMgaW50IHNwbGFzaFRpbWVvdXQoIFB0V2lkZ2V0X3QqIHdpZGdldCwgdm9pZCogZGF0YSwgUHRDYWxsYmFja0luZm9fdCogaW5mbyApCi17Ci0gICAgYnJpbmdEb3duU3BsYXNoV2luZG93KCAwICk7Ci0gICAJcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3Bob3Rvbi9tYWtlX3FueC5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3Bob3Rvbi9tYWtlX3FueC5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzY5MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS9waG90b24vbWFrZV9xbngubWFrCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIAotIyBNYWtlZmlsZSBmb3IgY3JlYXRpbmcgdGhlIFBob3RvbiBlY2xpcHNlIGxhdW5jaGVyIHByb2dyYW0uCi0KLSMgVGhpcyBtYWtlZmlsZSBleHBlY3RzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldDoKLSMKLSMgUFJPR1JBTV9PVVRQVVQgIC0gdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZXhlY3V0YWJsZQotIyBERUZBVUxUX09TICAgICAgLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1vcyIgc3dpdGNoCi0jIERFRkFVTFRfT1NfQVJDSCAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLWFyY2giIHN3aXRjaAotIyBERUZBVUxUX1dTICAgICAgLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi13cyIgc3dpdGNoCi0KLSMgRGVmaW5lIHRoZSBvYmplY3QgbW9kdWxlcyB0byBiZSBjb21waWxlZCBhbmQgZmxhZ3MuCi1PQkpTID0gZWNsaXBzZS5vIGVjbGlwc2VVdGlsLm8gZWNsaXBzZVNobS5vIGVjbGlwc2VDb25maWcubyBlY2xpcHNlUGhvdG9uLm8KLUVYRUMgPSAkKFBST0dSQU1fT1VUUFVUKQotTElCUyA9IC1scGggLWxwaHJlbmRlciAtbHBoZXhsaWIKLUNGTEFHUyA9IC1PIC1zIC1XYWxsIFwKLQktRERFRkFVTFRfT1M9IlwiJChERUZBVUxUX09TKVwiIiBcCi0JLURERUZBVUxUX09TX0FSQ0g9IlwiJChERUZBVUxUX09TX0FSQ0gpXCIiIFwKLQktRERFRkFVTFRfV1M9IlwiJChERUZBVUxUX1dTKVwiIiBcCi0JLURKOVZNIC1JLi4gLURQSE9UT04KLQotYWxsOiAkKEVYRUMpCi0KLS5jLm86Ci0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0KLWVjbGlwc2UubzogLi4vZWNsaXBzZS5jIC4uL2VjbGlwc2VPUy5oCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2UuYyAtbyAkQAotCi1lY2xpcHNlU2htLm86IC4uL2VjbGlwc2VTaG0uYyAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZU9TLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLi4vZWNsaXBzZVNobS5jIC1vICRACi0KLWVjbGlwc2VDb25maWcubzogLi4vZWNsaXBzZUNvbmZpZy5jIC4uL2VjbGlwc2VDb25maWcuaCAuLi9lY2xpcHNlT1MuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi9lY2xpcHNlQ29uZmlnLmMgLW8gJEAKLQotZWNsaXBzZVV0aWwubzogLi4vZWNsaXBzZVV0aWwuYyAuLi9lY2xpcHNlVXRpbC5oIC4uL2VjbGlwc2VPUy5oCi0JJChDQykgJChDRkxBR1MpIC1jIC4uL2VjbGlwc2VVdGlsLmMgLW8gJEAKLQotJChFWEVDKTogJChPQkpTKQotCSQoQ0MpIC1vICQoRVhFQykgJChPQkpTKSAkKExJQlMpCi0KLWluc3RhbGw6IGFsbAotCWNwICQoRVhFQykgJChPVVRQVVRfRElSKQotCXJtIC1mICQoRVhFQykgJChPQkpTKQotCi1jbGVhbjoKLQlybSAtZiAkKEVYRUMpICQoT0JKUykKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd2luMzIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd2luMzIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMTcwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSoub2JqCi1lY2xpcHNlLmV4ZQotZWNsaXBzZS5yZXMKLSoucGRiCi0qLmV4cAotKi5saWIKLWVjbGlwc2VfKi5kbGwKLWVjbGlwc2VjLmV4ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9idWlsZC5iYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2J1aWxkLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjNDlmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2J1aWxkLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi1AcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUByZW0gIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUByZW0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLUByZW0gIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotQHJlbSAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi1AcmVtICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotQHJlbSAgCi1AcmVtICBDb250cmlidXRvcnM6Ci1AcmVtICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi1AcmVtICAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi1AcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1AcmVtIAotQHJlbSAgVXNhZ2U6IHNoIGJ1aWxkLnNoIFs8b3B0aW9uYWwgc3dpdGNoZXM+XSBbY2xlYW5dCi1AcmVtIAotQHJlbSAgICB3aGVyZSB0aGUgb3B0aW9uYWwgc3dpdGNoZXMgYXJlOgotQHJlbSAgICAgICAgLW91dHB1dCA8UFJPR1JBTV9PVVRQVVQ+ICAtIGV4ZWN1dGFibGUgZmlsZW5hbWUgKCJlY2xpcHNlIikKLUByZW0gICAgICAgIC1saWJyYXJ5IDxQUk9HUkFNX0xJQlJBUlk+LSBkbGwgZmlsZW5hbWUgKGVjbGlwc2UuZGxsKQotQHJlbSAgICAgICAgLW9zICAgICA8REVGQVVMVF9PUz4gICAgICAtIGRlZmF1bHQgRWNsaXBzZSAiLW9zIiB2YWx1ZSAocW54KSAKLUByZW0gICAgICAgIC1hcmNoICAgPERFRkFVTFRfT1NfQVJDSD4gLSBkZWZhdWx0IEVjbGlwc2UgIi1hcmNoIiB2YWx1ZSAoeDg2KSAKLUByZW0gICAgICAgIC13cyAgICAgPERFRkFVTFRfV1M+ICAgICAgLSBkZWZhdWx0IEVjbGlwc2UgIi13cyIgdmFsdWUgKHBob3RvbikKLUByZW0JCS1qYXZhICAgPEpBVkFfSE9NRT4gICAgICAgLSBsb2NhdGlvbiBvZiBhIEphdmEgU0RLIGZvciBKTkkgaGVhZGVycyAKLUByZW0gCi1AcmVtIAotQHJlbSAgICAgVGhpcyBzY3JpcHQgY2FuIGFsc28gYmUgaW52b2tlZCB3aXRoIHRoZSAiY2xlYW4iIGFyZ3VtZW50LgotQHJlbQotQHJlbSBOT1RFOiBUaGUgQyBjb21waWxlciBuZWVkcyB0byBiZSBzZXR1cC4gVGhpcyBzY3JpcHQgaGFzIGJlZW4KLUByZW0gICAgICAgdGVzdGVkIGFnYWluc3QgTWljcm9zb2Z0IFZpc3VhbCBDIGFuZCBDKysgQ29tcGlsZXIgNi4wLgotQHJlbQkKLUByZW0gVW5jb21tZW50IHRoZSBsaW5lcyBiZWxvdyBhbmQgZWRpdCBNU1ZDX0hPTUUgdG8gcG9pbnQgdG8gdGhlCi1AcmVtIGNvcnJlY3Qgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGNvbXBpbGVyIGluc3RhbGxhdGlvbiwgaWYgeW91Ci1AcmVtIHdhbnQgdGhpcyB0byBiZSBkb25lIGJ5IHRoaXMgc2NyaXB0LgotQHJlbSAKLUByZW0gKioqKioqCi1AZWNobyBvZmYKLQotSUYgeC4lMT09eC54ODZfNjQgR09UTyBYODZfNjQKLUlGIHguJTE9PXguaWE2NCBHT1RPIElBNjQKLQotOlg4NgotSUYgeC4lSkFWQV9IT01FJT09eC4gc2V0IEpBVkFfSE9NRT1DOlxEZXZcSmF2YVxJQk0tMS41LjAtMjAwOTA3MDctU1IxMAotc2V0IGphdmFIb21lPSVKQVZBX0hPTUUlCi1pZiBub3QgeC4lTVNWQ19IT01FJSA9PSB4LiBnb3RvIE1BS0UKLXNldCBNU1ZDX0hPTUU9IkM6XFByb2dyYW0gRmlsZXNcTVNfUExBVF9TREtcbXN2YzYwXFZDOTgiCi1jYWxsICVNU1ZDX0hPTUUlXGJpblx2Y3ZhcnMzMi5iYXQKLWlmIG5vdCAiJW1zc2RrJSIgPT0gIiIgZ290byBNQUtFCi1zZXQgbXNzZGs9IkM6XFByb2dyYW0gRmlsZXNcTVNfUExBVF9TREtcZmViMjAwMyIKLWNhbGwgJW1zc2RrJVxzZXRlbnYuYmF0Ci1JRiB4LiUxPT14Lng4NiBzaGlmdAotc2V0IGRlZmF1bHRPU0FyY2g9eDg2Ci1zZXQgbWFrZWZpbGU9bWFrZV93aW4zMi5tYWsKLUdPVE8gTUFLRQotCi06WDg2XzY0Ci1zaGlmdAotc2V0IGRlZmF1bHRPU0FyY2g9eDg2XzY0Ci1JRiB4LiVKQVZBX0hPTUUlPT14LiBzZXQgSkFWQV9IT01FPUM6XERldlxKYXZhXGlibS1zZGstbjE0MnAtd2luNjQteDg2Ci1JRiAieC4lbXNzZGslIiA9PSAieC4iICAgc2V0IG1zc2RrPSJDOlxQcm9ncmFtIEZpbGVzXE1TX1NES18yMDAzX1IyIgotc2V0IGphdmFIb21lPSVKQVZBX0hPTUUlCi1zZXQgbWFrZWZpbGU9bWFrZV93aW42NC5tYWsKLWNhbGwgJW1zc2RrJVxzZXRlbnYgL1g2NCAvUkVUQUlMCi1HT1RPIE1BS0UKLQotOklBNjQKLXNoaWZ0Ci1zZXQgZGVmYXVsdE9TQXJjaD1pYTY0Ci1JRiB4LiVKQVZBX0hPTUUlPT14LiBzZXQgSkFWQV9IT01FPUM6XERldlxKYXZhXGpkay0xXzVfMF8wNC1mY3MtYmluLWIwNS13aW5kb3dzLWlhNjQKLUlGICJ4LiVtc3NkayUiID09ICJ4LiIgICBzZXQgbXNzZGs9IkM6XFByb2dyYW0gRmlsZXNcTVNfU0RLXzIwMDNfUjIiCi1zZXQgamF2YUhvbWU9JUpBVkFfSE9NRSUKLXNldCBtYWtlZmlsZT1tYWtlX3dpbjY0X2lhNjQubWFrCi1jYWxsICVtc3NkayVcc2V0ZW52IC9TUlY2NCAvUkVUQUlMCi1HT1RPIE1BS0UKLQotOk1BS0UgCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlbSBEZWZpbmUgZGVmYXVsdCB2YWx1ZXMgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2VkIGluIHRoZSBtYWtlZmlsZXMuCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNldCBwcm9ncmFtT3V0cHV0PWVjbGlwc2UuZXhlCi1zZXQgcHJvZ3JhbUxpYnJhcnk9ZWNsaXBzZS5kbGwKLXNldCBkZWZhdWx0T1M9d2luMzIKLXNldCBkZWZhdWx0V1M9d2luMzIKLXNldCBPUz1XaW5kb3dzCi0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVtIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZXMuCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNldCBleHRyYUFyZ3M9Ci06V0hJTEUKLWlmICIlMSIgPT0gIiIgZ290byBXSElMRV9FTkQKLSAgICBpZiAiJTIiID09ICIiICAgICAgIGdvdG8gTEFTVF9BUkcKLQotICAgIGlmICIlMSIgPT0gIi1vcyIgKAotCQlzZXQgZGVmYXVsdE9TPSUyCi0JCXNoaWZ0Ci0JCWdvdG8gTkVYVCApCi0gICAgaWYgIiUxIiA9PSAiLWFyY2giICgKLQkJc2V0IGRlZmF1bHRPU0FyY2g9JTIKLQkJc2hpZnQKLQkJZ290byBORVhUICkKLSAgICBpZiAiJTEiID09ICItd3MiICgKLQkJc2V0IGRlZmF1bHRXUz0lMgotCQlzaGlmdAotCQlnb3RvIE5FWFQgKQotICAgIGlmICIlMSIgPT0gIi1vdXRwdXQiICgKLQkJc2V0IHByb2dyYW1PdXRwdXQ9JTIKLQkJc2hpZnQKLQkJZ290byBORVhUICkKLQlpZiAiJTEiID09ICItbGlicmFyeSIgKAotCQlzZXQgcHJvZ3JhbUxpYnJhcnk9JTIKLQkJc2hpZnQKLQkJZ290byBORVhUICkKLQlpZiAiJTEiID09ICItamF2YSIgKAotCQlzZXQgamF2YUhvbWU9JTIKLQkJZWNobyAlamF2YUhvbWUlCi0JCXNoaWZ0Ci0JCWdvdG8gTkVYVCApCi06TEFTVF9BUkcKLSAgICAgICAgc2V0IGV4dHJhQXJncz0lZXh0cmFBcmdzJSAlMQotCi06TkVYVAotICAgIHNoaWZ0Ci0gICAgZ290byBXSElMRQotOldISUxFX0VORAotCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlbSBTZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5lZWRlZCBieSB0aGUgbWFrZWZpbGUuCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNldCBQUk9HUkFNX09VVFBVVD0lcHJvZ3JhbU91dHB1dCUKLXNldCBQUk9HUkFNX0xJQlJBUlk9JXByb2dyYW1MaWJyYXJ5JQotc2V0IERFRkFVTFRfT1M9JWRlZmF1bHRPUyUKLXNldCBERUZBVUxUX09TX0FSQ0g9JWRlZmF1bHRPU0FyY2glCi1zZXQgREVGQVVMVF9XUz0lZGVmYXVsdFdTJQotc2V0IE9VVFBVVF9ESVI9Li5cLi5cYmluXCVkZWZhdWx0V1MlXCVkZWZhdWx0T1MlXCVkZWZhdWx0T1NBcmNoJQotc2V0IEpBVkFfSE9NRT0lamF2YUhvbWUlCi0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVtIFJ1biBubWFrZSB0byBidWlsZCB0aGUgZXhlY3V0YWJsZS4KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaWYgIiVleHRyYUFyZ3MlIiA9PSAiIiBnb3RvIE1BS0VfQUxMCi0KLW5tYWtlIC1mICVtYWtlZmlsZSUgJWV4dHJhQXJncyUKLWdvdG8gRE9ORQotCi06TUFLRV9BTEwKLWVjaG8gQnVpbGRpbmcgJU9TJSBsYXVuY2hlci4gRGVmYXVsdHM6IC1vcyAlREVGQVVMVF9PUyUgLWFyY2ggJURFRkFVTFRfT1NfQVJDSCUgLXdzICVERUZBVUxUX1dTJQotbm1ha2UgLWYgJW1ha2VmaWxlJSBjbGVhbgotbm1ha2UgLWYgJW1ha2VmaWxlJSAlMSAlMiAlMyAlNAotZ290byBET05FCi0KLQotOkRPTkUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd2luMzIvYnVpbGQuc2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODZmODFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd2luMzIvYnVpbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jIS9iaW4vc2gKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEtldmluIENvcm5lbGwgKFJhdGlvbmFsIFNvZnR3YXJlIENvcnBvcmF0aW9uKQotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMKLSMgVXNhZ2U6IHNoIGJ1aWxkLnNoIFs8b3B0aW9uYWwgc3dpdGNoZXM+XSBbY2xlYW5dCi0jCi0jICAgd2hlcmUgdGhlIG9wdGlvbmFsIHN3aXRjaGVzIGFyZToKLSMgICAgICAgLW91dHB1dCA8UFJPR1JBTV9PVVRQVVQ+ICAtIGV4ZWN1dGFibGUgZmlsZW5hbWUgKCJlY2xpcHNlIikKLSMgICAgICAgLW9zICAgICA8REVGQVVMVF9PUz4gICAgICAtIGRlZmF1bHQgRWNsaXBzZSAiLW9zIiB2YWx1ZQotIyAgICAgICAtYXJjaCAgIDxERUZBVUxUX09TX0FSQ0g+IC0gZGVmYXVsdCBFY2xpcHNlICItYXJjaCIgdmFsdWUKLSMgICAgICAgLXdzICAgICA8REVGQVVMVF9XUz4gICAgICAtIGRlZmF1bHQgRWNsaXBzZSAiLXdzIiB2YWx1ZQotIwotIwotIyAgICBUaGlzIHNjcmlwdCBjYW4gYWxzbyBiZSBpbnZva2VkIHdpdGggdGhlICJjbGVhbiIgYXJndW1lbnQuCi0KLWNkIGBkaXJuYW1lICQwYAotCi0jIERlZmluZSBkZWZhdWx0IHZhbHVlcyBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG1ha2VmaWxlcy4KLXByb2dyYW1PdXRwdXQ9ImVjbGlwc2UuZXhlIgotZGVmYXVsdE9TPSJ3aW4zMiIKLWRlZmF1bHRPU0FyY2g9Ing4NiIKLWRlZmF1bHRXUz0id2luMzIiCi1tYWtlZmlsZT0ibWFrZV9taW5ndy5tYWsiCi1PUz0iV2luZG93cyIKLQotIyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVzLgotZXh0cmFBcmdzPSIiCi13aGlsZSBbICIkMSIgIT0gIiIgXTsgZG8KLSAgICBpZiBbICIkMSIgPSAiLW9zIiBdICYmIFsgIiQyIiAhPSAiIiBdOyB0aGVuCi0gICAgICAgIGRlZmF1bHRPUz0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLWFyY2giIF0gJiYgWyAiJDIiICE9ICIiIF07IHRoZW4KLSAgICAgICAgZGVmYXVsdE9TQXJjaD0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLXdzIiBdICYmIFsgIiQyIiAhPSAiIiBdOyB0aGVuCi0gICAgICAgIGRlZmF1bHRXUz0iJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLW91dHB1dCIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotICAgICAgICBwcm9ncmFtT3V0cHV0PSIkMiIKLSAgICAgICAgc2hpZnQKLSAgICBlbHNlCi0gICAgICAgIGV4dHJhQXJncz0iJGV4dHJhQXJncyAkMSIKLSAgICBmaQotICAgIHNoaWZ0Ci1kb25lCi0KLSMgU2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZWVkZWQgYnkgdGhlIG1ha2VmaWxlcy4KLVBST0dSQU1fT1VUUFVUPSIkcHJvZ3JhbU91dHB1dCIKLURFRkFVTFRfT1M9IiRkZWZhdWx0T1MiCi1ERUZBVUxUX09TX0FSQ0g9IiRkZWZhdWx0T1NBcmNoIgotREVGQVVMVF9XUz0iJGRlZmF1bHRXUyIKLU9VVFBVVF9ESVI9Li4vLi4vYmluLyRkZWZhdWx0V1MvJGRlZmF1bHRPUy8kZGVmYXVsdE9TQXJjaAotCi1leHBvcnQgT1VUUFVUX0RJUiBQUk9HUkFNX09VVFBVVCBERUZBVUxUX09TIERFRkFVTFRfT1NfQVJDSCBERUZBVUxUX1dTCi0KLSMgSWYgdGhlIE9TIGlzIHN1cHBvcnRlZCAoYSBtYWtlZmlsZSBleGlzdHMpCi1pZiBbICIkbWFrZWZpbGUiICE9ICIiIF07IHRoZW4KLQlpZiBbICIkZXh0cmFBcmdzIiAhPSAiIiBdOyB0aGVuCi0JCW1ha2UgLWYgJG1ha2VmaWxlICRleHRyYUFyZ3MKLQllbHNlCi0JCWVjaG8gIkJ1aWxkaW5nICRPUyBsYXVuY2hlci4gRGVmYXVsdHM6IC1vcyAkREVGQVVMVF9PUyAtYXJjaCAkREVGQVVMVF9PU19BUkNIIC13cyAkREVGQVVMVF9XUyIKLQkJbWFrZSAtZiAkbWFrZWZpbGUgY2xlYW4KLQkJbWFrZSAtZiAkbWFrZWZpbGUgYWxsCi0JZmkKLWVsc2UKLQllY2hvICJVbmtub3duIE9TICgkT1MpIC0tIGJ1aWxkIGFib3J0ZWQiCi1maQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9idWlsZC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhOTlhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9ImJ1aWxkX2VjbGlwc2UiIGJhc2VkaXI9Ii4iPgotCi08dGFyZ2V0IG5hbWU9ImJ1aWxkX2VjbGlwc2UiPgotCTxleGVjIGRpcj0iLiIgZXhlY3V0YWJsZT0iJHtiYXNlZGlyfVxidWlsZC5iYXQiPgotCQk8YXJnIGxpbmU9Imluc3RhbGwiLz4KLQk8L2V4ZWM+Ci0JPGVjbGlwc2UucmVmcmVzaExvY2FsIHJlc291cmNlPSJwbGF0Zm9ybS1sYXVuY2hlciIgZGVwdGg9ImluZmluaXRlIiAvPgkJCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JPHRzdGFtcC8+Ci0JPGV4ZWMgZGlyPSIuIiBleGVjdXRhYmxlPSIke2Jhc2VkaXJ9XGJ1aWxkLmJhdCI+Ci0JCTxhcmcgbGluZT0iY2xlYW4iLz4KLQk8L2V4ZWM+Ci08L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd2luMzIvZWNsaXBzZS5leGUubWFuaWZlc3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2VjbGlwc2UuZXhlLm1hbmlmZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGExNTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd2luMzIvZWNsaXBzZS5leGUubWFuaWZlc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Ci08YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIiBtYW5pZmVzdFZlcnNpb249IjEuMCI+Ci0JPGFzc2VtYmx5SWRlbnRpdHkgdmVyc2lvbj0iMy4xLjAuMCIgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPSIqIiBuYW1lPSJFY2xpcHNlIExhdW5jaGVyIiB0eXBlPSJ3aW4zMiIvPgotCTxkZXNjcmlwdGlvbj5TdGFuZGFyZCBXaWRnZXQgVG9vbGtpdDwvZGVzY3JpcHRpb24+Ci0JPGRlcGVuZGVuY3k+Ci0JCTxkZXBlbmRlbnRBc3NlbWJseT4KLQkJCTxhc3NlbWJseUlkZW50aXR5IHR5cGU9IndpbjMyIiBuYW1lPSJNaWNyb3NvZnQuV2luZG93cy5Db21tb24tQ29udHJvbHMiIHZlcnNpb249IjYuMC4wLjAiIHByb2Nlc3NvckFyY2hpdGVjdHVyZT0iKiIgcHVibGljS2V5VG9rZW49IjY1OTViNjQxNDRjY2YxZGYiIGxhbmd1YWdlPSIqIi8+Ci0JCTwvZGVwZW5kZW50QXNzZW1ibHk+Ci0JPC9kZXBlbmRlbmN5PgotPC9hc3NlbWJseT4KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2VjbGlwc2UuaWNvIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9lY2xpcHNlLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyZjEzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2VjbGlwc2UuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9lY2xpcHNlLnJjIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9lY2xpcHNlLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjNiYWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd2luMzIvZWNsaXBzZS5yYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRUNMSVBTRV9JQ09OICA0MDEKLQotI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJ3aW52ZXIuaCIKLQotCi1FQ0xJUFNFX0lDT04gICAgICAgICAgICBJQ09OICAgIERJU0NBUkRBQkxFICAgICAiZWNsaXBzZS5pY28iCi0KLUNSRUFURVBST0NFU1NfTUFOSUZFU1RfUkVTT1VSQ0VfSUQgUlRfTUFOSUZFU1QgImVjbGlwc2UuZXhlLm1hbmlmZXN0IiAKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9lY2xpcHNlV2luLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2VjbGlwc2VXaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlYzgyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL2VjbGlwc2VXaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDYwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZWNsaXBzZU9TLmgiCi0jaW5jbHVkZSAiZWNsaXBzZVV0aWwuaCIKLSNpbmNsdWRlICJlY2xpcHNlQ29tbW9uLmgiCi0jaW5jbHVkZSAiZWNsaXBzZUpOSS5oIgotI2luY2x1ZGUgImVjbGlwc2VTaG0uaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxjb21tY3RybC5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIF9fTUlOR1czMl9fCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotZXh0ZXJuIEhXTkQgdG9wV2luZG93OwotCi0vKiBHbG9iYWwgVmFyaWFibGVzICovCi1fVENIQVIqICBkZWZhdWx0Vk0gICAgID0gX1QoImphdmF3LmV4ZSIpOwotX1RDSEFSKiAgY29uc29sZVZNICAgICA9IF9UKCJqYXZhLmV4ZSIpOwotX1RDSEFSKiAgdm1MaWJyYXJ5IAkgICA9IF9UKCJqdm0uZGxsIik7Ci1fVENIQVIqICBzaGlwcGVkVk1EaXIgID0gX1QoImpyZVxcYmluXFwiKTsKLQotLyogRGVmaW5lIGxvY2FsIHZhcmlhYmxlcyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHJ1bm5pbmcgZWNsaXBzZSBpbnN0YW5jZS4gKi8KLXN0YXRpYyBIQU5ETEUJbXV0ZXg7Ci1zdGF0aWMgVUlOVAkJZmluZFdpbmRvd1RpbWVvdXQgPSAxMDAwOwotc3RhdGljIFVJTlRfUFRSIGZpbmRXaW5kb3dUaW1lcklkID0gOTc7Ci1zdGF0aWMgVUlOVAkJdGltZXJDb3VudCA9IDA7Ci1zdGF0aWMgVUlOVAkJb3BlbkZpbGVUaW1lb3V0ID0gNjA7Ci1zdGF0aWMgX1RDSEFSKioJb3BlbkZpbGVQYXRoOwotCi0vKiBEZWZpbmUgdGhlIHdpbmRvdyBzeXN0ZW0gYXJndW1lbnRzIGZvciB0aGUgSmF2YSBWTS4gKi8KLXN0YXRpYyBfVENIQVIqICBhcmdWTVtdID0geyBOVUxMIH07Ci0KLS8qIERlZmluZSBsb2NhbCB2YXJpYWJsZXMgZm9yIHJ1bm5pbmcgdGhlIEpWTSBhbmQgZGV0ZWN0aW5nIGl0cyBleGl0LiAqLwotc3RhdGljIEhBTkRMRSAganZtUHJvY2VzcyAgICAgPSAwOwotc3RhdGljIEphdmFSZXN1bHRzKiBqdm1SZXN1bHRzID0gTlVMTDsKLXN0YXRpYyBVSU5UICAgIGp2bUV4aXRUaW1lb3V0ID0gMTAwOwotc3RhdGljIFVJTlRfUFRSIGp2bUV4aXRUaW1lcklkID0gOTk7Ci0KLXN0YXRpYyB2b2lkIENBTExCQUNLIGZpbmRXaW5kb3dQcm9jKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBVSU5UIGlkVGltZXIsIERXT1JEIGR3VGltZSk7Ci1zdGF0aWMgdm9pZCBDQUxMQkFDSyAgZGV0ZWN0SnZtRXhpdCggSFdORCBod25kLCBVSU5UIHVNc2csIFVJTlQgaWQsIERXT1JEIGR3VGltZSApOwotc3RhdGljIF9UQ0hBUiogY2hlY2tWTVJlZ2lzdHJ5S2V5KEhLRVkganJla2V5LCBfVENIQVIqIHN1YktleU5hbWUpOwotc3RhdGljIHZvaWQgYWRqdXN0U2VhcmNoUGF0aCggX1RDSEFSICogdm1MaWJyYXJ5ICk7Ci1zdGF0aWMgX1RDSEFSKiBmaW5kTGliKCBfVENIQVIqIGNvbW1hbmQgKTsKLQotLyogZGVmaW5lIGRlZmF1bHQgbG9jYXRpb25zIGluIHdoaWNoIHRvIGZpbmQgdGhlIGp2bSBzaGFyZWQgbGlicmFyeQotICogdGhlc2UgYXJlIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBqYXZhIGV4ZSwgdGhlIHNoYXJlZCBsaWJyYXJ5IGlzCi0gKiBmb3IgZXhhbXBsZSBqdm1Mb2NhdGlvbnNbMF0gKyBkaXJTZXBhcmF0b3IgKyB2bUxpYnJhcnkgKi8KLSNkZWZpbmUgTUFYX0xPQ0FUSU9OX0xFTkdUSCAyNSAvKiBub25lIG9mIHRoZSBqdm1Mb2NhdGlvbnMgc3RyaW5ncyBzaG91bGQgYmUgbG9uZ2VyIHRoYW4gdGhpcyAqLyAKLXN0YXRpYyBjb25zdCBfVENIQVIqIGp2bUxvY2F0aW9ucyBbXSA9IHsgX1QoImo5dm0iKSwgX1QoIi4uXFxqcmVcXGJpblxcajl2bSIpLAotCQkJCQkJCQkJCSBfVCgiY2xpZW50IiksIF9UKCIuLlxcanJlXFxiaW5cXGNsaWVudCIpLCAKLQkJCQkJCQkJCQkgX1QoInNlcnZlciIpLCBfVCgiLi5cXGpyZVxcYmluXFxzZXJ2ZXIiKSwKLQkJCQkJCQkJCQkgX1QoImNsYXNzaWMiKSwgX1QoIi4uXFxqcmVcXGJpblxcY2xhc3NpYyIpLAotCQkJCQkJCQkJCSBfVCgianJvY2tpdCIpLCBfVCgiLi5cXGpyZVxcYmluXFxqcm9ja2l0IiksCi0JCQkJCQkJCSAJCSBOVUxMIH07Ci0KLS8qIGZvciBkZXRlY3Rpbmcgc3VuIHZtcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCVdPUkQgbGFuZ3VhZ2U7Ci0JV09SRCBjb2RlcGFnZTsKLX0gVFJBTlNMQVRJT05TOwotCi0jZGVmaW5lIENPTVBBTllfTkFNRV9LRVkgX1RfRUNMSVBTRSgiXFxTdHJpbmdGaWxlSW5mb1xcJTA0eCUwNHhcXENvbXBhbnlOYW1lIikKLSNkZWZpbmUgU1VOX01JQ1JPU1lTVEVNUyBfVF9FQ0xJUFNFKCJTdW4gTWljcm9zeXN0ZW1zIikKLQotc3RhdGljIHZvaWQgc2VuZE9wZW5GaWxlTWVzc2FnZShIV05EIHdpbmRvdykgewotCV9UQ0hBUiogaWQ7Ci0JVUlOVCBtc2c7Ci0JaW50IGluZGV4ID0gMDsKLQlpbnQgc2l6ZSA9IDA7Ci0JRFdPUkQgd1BhcmFtOwotI2lmZGVmIFdJTjY0Ci0JRFdPUkRMT05HIGxQYXJhbTsKLSNlbHNlCi0JRFdPUkQgbFBhcmFtOwotI2VuZGlmCi0KLQkvKiB3aGF0J3MgdGhlIGxvbmdlc3QgcGF0aD8gKi8KLQl3aGlsZSAob3BlbkZpbGVQYXRoW2luZGV4XSAhPSBOVUxMKSB7Ci0JCWludCBsZW5ndGggPSBfdGNzbGVuKG9wZW5GaWxlUGF0aFtpbmRleCsrXSk7Ci0JCWlmIChzaXplIDw9IGxlbmd0aCkKLQkJCXNpemUgPSBsZW5ndGggKyAxOwotCX0KLQotCWNyZWF0ZVNoYXJlZERhdGEoJmlkLCBzaXplICogc2l6ZW9mKF9UQ0hBUikpOwotCV9zdHNjYW5mKGlkLCBfVF9FQ0xJUFNFKCIlbHhfJWx4IiksICZ3UGFyYW0sICZsUGFyYW0pOwotCW1zZyA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZShfVCgiU1dUX09QRU5ET0MiKSk7Ci0KLQlpbmRleCA9IDA7Ci0JZm9yKGluZGV4ID0gMDsgb3BlbkZpbGVQYXRoW2luZGV4XSAhPSBOVUxMOyBpbmRleCsrKSB7Ci0JCS8qIFNlbmRNZXNzYWdlIGRvZXMgbm90IHJldHVybiB1bnRpbCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLQkJc2V0U2hhcmVkRGF0YShpZCwgb3BlbkZpbGVQYXRoW2luZGV4XSk7Ci0JCVNlbmRNZXNzYWdlKHdpbmRvdywgbXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci0JfQotCWRlc3Ryb3lTaGFyZWREYXRhKGlkKTsKLQlmcmVlKGlkKTsKLX0KLQotc3RhdGljIEhXTkQgZmluZFNXVE1lc3NhZ2VXaW5kb3coKSB7Ci0JSFdORCB3aW5kb3cgPSBOVUxMOwotCV9UQ0hBUiAqd2luZG93VGl0bGUsICp3aW5kb3dQcmVmaXgsICpuYW1lOwotCi0Jd2luZG93UHJlZml4ID0gX1QoIlNXVF9XaW5kb3dfIik7Ci0JbmFtZSA9IGdldE9mZmljaWFsTmFtZSgpOwotCXdpbmRvd1RpdGxlID0gbWFsbG9jKChfdGNzbGVuKHdpbmRvd1ByZWZpeCkgKyBfdGNzbGVuKG5hbWUpICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0JX3N0cHJpbnRmKHdpbmRvd1RpdGxlLCBfVF9FQ0xJUFNFKCIlcyVzIiksIHdpbmRvd1ByZWZpeCwgbmFtZSk7Ci0Jd2luZG93ID0gRmluZFdpbmRvdyhOVUxMLCB3aW5kb3dUaXRsZSk7Ci0JZnJlZSh3aW5kb3dUaXRsZSk7Ci0JcmV0dXJuIHdpbmRvdzsKLX0KLQotc3RhdGljIHZvaWQgQ0FMTEJBQ0sgZmluZFdpbmRvd1Byb2MoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFVJTlQgaWRUaW1lciwgRFdPUkQgZHdUaW1lKSB7Ci0JSFdORCB3aW5kb3cgPSBmaW5kU1dUTWVzc2FnZVdpbmRvdygpOwotCWlmICh3aW5kb3cgIT0gTlVMTCkgewotCQlzZW5kT3BlbkZpbGVNZXNzYWdlKHdpbmRvdyk7Ci0JCVJlbGVhc2VNdXRleChtdXRleCk7Ci0JCUNsb3NlSGFuZGxlKG11dGV4KTsKLQkJS2lsbFRpbWVyKGh3bmQsIGZpbmRXaW5kb3dUaW1lcklkKTsKLQkJcmV0dXJuOwotCX0KLQkKLQkvKiBubyB3aW5kb3cgeWV0LCBzZXQgdGltZXIgdG8gdHJ5IGFnYWluIGxhdGVyICovCi0JaWYgKHRpbWVyQ291bnQrKyA+PSBvcGVuRmlsZVRpbWVvdXQpIHsKLQkJS2lsbFRpbWVyKGh3bmQsIGZpbmRXaW5kb3dUaW1lcklkKTsKLQkJUmVsZWFzZU11dGV4KG11dGV4KTsKLQkJQ2xvc2VIYW5kbGUobXV0ZXgpOwotCX0KLX0KLQotLyogcmV0dXJuID4gMCBpZiB3ZSBzdWNjZXNzZnVsbHkgc2VuZCBhIG1lc3NhZ2UgdG8gYW5vdGhlciBlY2xpcHNlIGluc3RhbmNlICovCi1pbnQgcmV1c2VXb3JrYmVuY2goX1RDSEFSKiogZmlsZVBhdGgsIGludCB0aW1lb3V0KSB7Ci0JX1RDSEFSKiAgIG11dGV4UHJlZml4ID0gX1QoIlNXVF9NdXRleF8iKTsKLQlfVENIQVIqICAgbXV0ZXhOYW1lLCAqbmFtZTsKLQlEV09SRCAJICBsb2NrOwotCUhXTkQgCSAgd2luZG93ID0gTlVMTDsKLQotCS8qIHN0b3JlIGZvciBsYXRlciAqLwotCW9wZW5GaWxlUGF0aCA9IGZpbGVQYXRoOwotCW9wZW5GaWxlVGltZW91dCA9IHRpbWVvdXQ7Ci0JCi0JbmFtZSA9IGdldE9mZmljaWFsTmFtZSgpOwotCW11dGV4TmFtZSA9IG1hbGxvYygoX3Rjc2xlbihtdXRleFByZWZpeCkgKyBfdGNzbGVuKG5hbWUpICArIDEpICogc2l6ZW9mKF9UQ0hBUikpOwotCV9zdHByaW50ZihtdXRleE5hbWUsIF9UX0VDTElQU0UoIiVzJXMiKSwgbXV0ZXhQcmVmaXgsIG5hbWUpOwotCW11dGV4ID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIG11dGV4TmFtZSk7Ci0JZnJlZShtdXRleE5hbWUpOwotCWlmIChtdXRleCA9PSBOVUxMKSByZXR1cm4gLTE7Ci0JCi0JLy93YWl0IGZvciB0aW1lb3V0IHNlY29uZHMKLQlsb2NrID0gV2FpdEZvclNpbmdsZU9iamVjdChtdXRleCwgdGltZW91dCAqIDEwMDApOwotCWlmIChsb2NrICE9IFdBSVRfT0JKRUNUXzApIHsKLQkJLyogZmFpbGVkIHRvIGdldCB0aGUgbG9jayBiZWZvcmUgdGltZW91dCwgV2Ugd29uJ3QgYmUgcmV1c2luZyBhbiBleGlzdGluZyBlY2xpcHNlLiAqLwotCQlDbG9zZUhhbmRsZShtdXRleCk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQkvKiB3ZSBoYXZlIHRoZSBtdXRleCwgbG9vayBmb3IgdGhlIFNXVCB3aW5kb3cgKi8KLQl3aW5kb3cgPSBmaW5kU1dUTWVzc2FnZVdpbmRvdygpOwotCWlmICh3aW5kb3cgIT0gTlVMTCkgewotCQlzZW5kT3BlbkZpbGVNZXNzYWdlKHdpbmRvdyk7Ci0JCVJlbGVhc2VNdXRleChtdXRleCk7Ci0JCUNsb3NlSGFuZGxlKG11dGV4KTsKLQkJcmV0dXJuIDE7IC8qIHN1Y2Nlc3MhICovCi0JfSAKLQkKLQkvKiBubyB3aW5kb3csIHNldCBhIHRpbWVyIHRvIGxvb2sgYWdhaW4gbGF0ZXIgKi8KLQlpZiAoaW5pdFdpbmRvd1N5c3RlbSgwLCBOVUxMLCAwKSA9PSAwKQotCQlTZXRUaW1lciggdG9wV2luZG93LCBmaW5kV2luZG93VGltZXJJZCwgZmluZFdpbmRvd1RpbWVvdXQsIGZpbmRXaW5kb3dQcm9jICk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFNob3cgdGhlIFNwbGFzaCBXaW5kb3cKLSAqCi0gKiBPcGVuIHRoZSBiaXRtYXAsIGluc2VydCBpbnRvIHRoZSBzcGxhc2ggd2luZG93IGFuZCBkaXNwbGF5IGl0LgotICoKLSAqLwotaW50IHNob3dTcGxhc2goIGNvbnN0IF9UQ0hBUiogZmVhdHVyZUltYWdlICkKLXsKLQlzdGF0aWMgaW50IHNwbGFzaGluZyA9IDA7Ci0gICAgSEJJVE1BUCBoQml0bWFwID0gMDsKLSAgICBCSVRNQVAgIGJtcDsKLSAgICBIREMgICAgIGhEQzsKLSAgICBpbnQgICAgIGRlcHRoOwotICAgIGludCAgICAgeCwgeTsKLSAgICBpbnQgICAgIHdpZHRoLCBoZWlnaHQ7Ci0KLQlpZihzcGxhc2hpbmcpIHsKLQkJLypzcGxhc2ggc2NyZWVuIGlzIGFscmVhZHkgc2hvd2luZywgZG8gbm90aGluZyAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGZlYXR1cmVJbWFnZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JCi0JLyogaWYgSmF2YSB3YXMgc3RhcnRlZCBmaXJzdCBhbmQgaXMgY2FsbGluZyBiYWNrIHRvIHNob3cgdGhlIHNwbGFzaCwgd2UgbWlnaHQgbm90Ci0JICogaGF2ZSBpbml0aWFsaXplZCB0aGUgd2luZG93IHN5c3RlbSB5ZXQKLQkgKi8KLQlpbml0V2luZG93U3lzdGVtKDAsIE5VTEwsIDEpOwotCQotICAgIC8qIExvYWQgdGhlIGJpdG1hcCBmb3IgdGhlIGZlYXR1cmUuICovCi0gICAgaERDID0gR2V0REMoIE5VTEwpOwotICAgIGRlcHRoID0gR2V0RGV2aWNlQ2FwcyggaERDLCBCSVRTUElYRUwgKSAqIEdldERldmljZUNhcHMoIGhEQywgUExBTkVTKTsKLSAgICBSZWxlYXNlREMoTlVMTCwgaERDKTsKLSAgICBpZiAoZmVhdHVyZUltYWdlICE9IE5VTEwpCi0gICAgCWhCaXRtYXAgPSBMb2FkSW1hZ2UoTlVMTCwgZmVhdHVyZUltYWdlLCBJTUFHRV9CSVRNQVAsIDAsIDAsIExSX0xPQURGUk9NRklMRSk7Ci0KLSAgICAvKiBJZiB0aGUgYml0bWFwIGNvdWxkIG5vdCBiZSBmb3VuZCwgcmV0dXJuIGFuIGVycm9yLiAqLwotICAgIGlmIChoQml0bWFwID09IDApCi0gICAgCXJldHVybiBFUlJPUl9GSUxFX05PVF9GT1VORDsKLSAgICAKLQlHZXRPYmplY3QoaEJpdG1hcCwgc2l6ZW9mKEJJVE1BUCksICZibXApOwotCi0gICAgLyogZmlndXJlIG91dCBwb3NpdGlvbiAqLwotICAgIHdpZHRoID0gR2V0U3lzdGVtTWV0cmljcyAoU01fQ1hTQ1JFRU4pOwotICAgIGhlaWdodCA9IEdldFN5c3RlbU1ldHJpY3MgKFNNX0NZU0NSRUVOKTsKLSAgICB4ID0gKHdpZHRoIC0gYm1wLmJtV2lkdGgpIC8gMjsKLSAgICB5ID0gKGhlaWdodCAtIGJtcC5ibUhlaWdodCkgLyAyOwotCi0JLyogQ2VudHJlIHRoZSBzcGxhc2ggd2luZG93IGFuZCBkaXNwbGF5IGl0LiAqLwotICAgIFNldFdpbmRvd1BvcyAodG9wV2luZG93LCAwLCB4LCB5LCBibXAuYm1XaWR0aCwgYm1wLmJtSGVpZ2h0LCBTV1BfTk9aT1JERVIgfCBTV1BfTk9TSVpFIHwgU1dQX05PQUNUSVZBVEUpOwotICAgIFNlbmRNZXNzYWdlKCB0b3BXaW5kb3csIFNUTV9TRVRJTUFHRSwgSU1BR0VfQklUTUFQLCAoTFBBUkFNKSBoQml0bWFwICk7Ci0gICAgU2hvd1dpbmRvdyggdG9wV2luZG93LCBTV19TSE9XICk7Ci0gICAgQnJpbmdXaW5kb3dUb1RvcCggdG9wV2luZG93ICk7Ci0Jc3BsYXNoaW5nID0gMTsKLQkKLSAgICAvKiBQcm9jZXNzIG1lc3NhZ2VzICovCi0JZGlzcGF0Y2hNZXNzYWdlcygpOwotCXJldHVybiAwOwotfQotCi12b2lkIGRpc3BhdGNoTWVzc2FnZXMoKSB7Ci0JTVNHICAgICBtc2c7Ci0JCi0JaWYodG9wV2luZG93ID09IDApCi0JCXJldHVybjsKLQl3aGlsZSAoUGVla01lc3NhZ2UoICZtc2csIE5VTEwsIDAsIDAsIFBNX1JFTU9WRSkpCi0gICAJewotCQlUcmFuc2xhdGVNZXNzYWdlKCAmbXNnICk7Ci0JCURpc3BhdGNoTWVzc2FnZSggJm1zZyApOwotCX0KLX0KLQotamxvbmcgZ2V0U3BsYXNoSGFuZGxlKCkgewotCXJldHVybiAoamxvbmcpdG9wV2luZG93OwotfQotCi12b2lkIHRha2VEb3duU3BsYXNoKCkgewotCWlmKHRvcFdpbmRvdyAhPSBOVUxMKSB7Ci0JCURlc3Ryb3lXaW5kb3codG9wV2luZG93KTsKLQkJZGlzcGF0Y2hNZXNzYWdlcygpOwotCQl0b3BXaW5kb3cgPSAwOwotCX0KLX0KLQotLyogR2V0IHRoZSB3aW5kb3cgc3lzdGVtIHNwZWNpZmljIFZNIGFyZ3MgKi8KLV9UQ0hBUioqIGdldEFyZ1ZNKCBfVENIQVIgKnZtICkKLXsKLQlyZXR1cm4gYXJnVk07Ci19Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucyAqLwotCi1fVENIQVIgKiBmaW5kVk1MaWJyYXJ5KCBfVENIQVIqIGNvbW1hbmQgKSB7Ci0JX1RDSEFSKiBsaWIgPSBmaW5kTGliKGNvbW1hbmQpOwotCWlmKCBsaWIgIT0gTlVMTCApIHsKLQkJYWRqdXN0U2VhcmNoUGF0aChsaWIpOwotCX0KLQlyZXR1cm4gbGliOwotfQotCi12b2lkIGFkanVzdFNlYXJjaFBhdGgoIF9UQ0hBUiogdm1MaWIgKXsKLQlfVENIQVIgKiogcGF0aHM7Ci0JX1RDSEFSICogcGF0aCA9IE5VTEwsICpuZXdQYXRoID0gTlVMTDsKLQlfVENIQVIgKiBjOwotCWludCBpLCBsZW5ndGg7Ci0JaW50IG5lZWRBZGp1c3QgPSAwLCBmcmVlUGF0aCA9IDA7Ci0JCi0JcGF0aHMgPSBnZXRWTUxpYnJhcnlTZWFyY2hQYXRoKHZtTGliKTsKLQkKLQkvKiBmaXJzdCBjYWxsIHRvIEdldEVudmlyb25tZW50VmFyaWFibGUgdGVsbHMgdXMgaG93IGJpZyB0byBtYWtlIHRoZSBidWZmZXIgKi8KLQlsZW5ndGggPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKF9UX0VDTElQU0UoIlBBVEgiKSwgcGF0aCwgMCk7Ci0JaWYgKGxlbmd0aCA+IDApIHsKLQkJcGF0aCA9IG1hbGxvYyhsZW5ndGggKiBzaXplb2YoX1RDSEFSKSk7Ci0JCUdldEVudmlyb25tZW50VmFyaWFibGUoX1RfRUNMSVBTRSgiUEFUSCIpLCBwYXRoLCBsZW5ndGgpOwotCQluZWVkQWRqdXN0ID0gIWNvbnRhaW5zUGF0aHMocGF0aCwgcGF0aHMpOwotCQlmcmVlUGF0aCA9IDE7Ci0JfSBlbHNlIHsKLQkJcGF0aCA9IF9UX0VDTElQU0UoIiIpOwotCQlmcmVlUGF0aCA9IDA7Ci0JCW5lZWRBZGp1c3QgPSAxOwotCX0KLQkKLQlpZiAobmVlZEFkanVzdCkgewotCQljID0gY29uY2F0U3RyaW5ncyhwYXRocyk7Ci0JCW5ld1BhdGggPSBtYWxsb2MoKF90Y3NsZW4oYykgKyBsZW5ndGggKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLQkJX3N0cHJpbnRmKG5ld1BhdGgsIF9UX0VDTElQU0UoIiVzJXMiKSwgYywgcGF0aCk7Ci0JCVNldEVudmlyb25tZW50VmFyaWFibGUoIF9UX0VDTElQU0UoIlBBVEgiKSwgbmV3UGF0aCk7Ci0JCWZyZWUoYyk7Ci0JCWZyZWUobmV3UGF0aCk7Ci0JfQotCQotCWZvciAoaSA9IDA7IHBhdGhzW2ldICE9IE5VTEw7IGkrKykKLQkJZnJlZShwYXRoc1tpXSk7Ci0JZnJlZShwYXRocyk7Ci0JaWYgKGZyZWVQYXRoKQotCQlmcmVlKHBhdGgpOwotfQotLyoKLSAqIEZpbmQgdGhlIFZNIHNoYXJlZCBsaWJyYXJ5IHN0YXJ0aW5nIGZyb20gdGhlIGphdmEgZXhlY3V0YWJsZSAKLSAqLwotc3RhdGljIF9UQ0hBUiogZmluZExpYiggX1RDSEFSKiBjb21tYW5kICkgewotCWludCBpLCBqOwotCXNpemVfdCBwYXRoTGVuZ3RoOwkKLQlzdHJ1Y3QgX3N0YXQgc3RhdHM7Ci0JX1RDSEFSICogcGF0aDsJCQkJLyogcGF0aCB0byByZXN1bHRpbmcganZtIHNoYXJlZCBsaWJyYXJ5ICovCi0JX1RDSEFSICogbG9jYXRpb247CQkJLyogcG9pbnRzIHRvIGJlZ2luaW5nIG9mIGp2bUxvY2F0aW9ucyBzZWN0aW9uIG9mIHBhdGggKi8KLQkKLQkvKiBmb3IgbG9va2luZyBpbiB0aGUgcmVnaXN0cnkgKi8KLQlIS0VZIGpyZUtleSA9IE5VTEw7Ci0JRFdPUkQgbGVuZ3RoID0gTUFYX1BBVEg7Ci0JX1RDSEFSIGtleU5hbWVbTUFYX1BBVEhdOwotCV9UQ0hBUiAqIGpyZUtleU5hbWU7CQkKLQkKLQlpZiAoY29tbWFuZCAhPSBOVUxMKSB7Ci0JCWxvY2F0aW9uID0gbGFzdERpclNlcGFyYXRvciggY29tbWFuZCApICsgMTsKLQkJCi0JCS8qY2hlY2sgZmlyc3QgdG8gc2VlIGlmIGNvbW1hbmQgYWxyZWFkeSBwb2ludHMgdG8gdGhlIGxpYnJhcnkgKi8KLQkJaWYgKGlzVk1MaWJyYXJ5KGNvbW1hbmQpKSB7Ci0JCQlpZiAoX3RzdGF0KCBjb21tYW5kLCAmc3RhdHMgKSA9PSAwICYmIChzdGF0cy5zdF9tb2RlICYgU19JRlJFRykgIT0gMCkKLQkJCQlyZXR1cm4gY29tbWFuZDsgCS8qIGV4aXN0cyAqLwotCQkJcmV0dXJuIE5VTEw7IC8qIGRvZXNuJ3QgZXhpc3QgKi8KLQkJfQotCQkKLQkJcGF0aExlbmd0aCA9IChzaXplX3QpIChsb2NhdGlvbiAtIGNvbW1hbmQpOwotCQlwYXRoID0gbWFsbG9jKChwYXRoTGVuZ3RoICsgTUFYX0xPQ0FUSU9OX0xFTkdUSCArIDEgKyBfdGNzbGVuKHZtTGlicmFyeSkgKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLQkJX3Rjc25jcHkocGF0aCwgY29tbWFuZCwgcGF0aExlbmd0aCk7Ci0JCWxvY2F0aW9uID0gJnBhdGhbcGF0aExlbmd0aF07Ci0JCSAKLQkJLyogCi0JCSAqIFdlIGFyZSB0cnlpbmcgYmFzZS9qdm1Mb2NhdGlvbnNbKl0vdm1MaWJyYXJ5Ci0JCSAqIHdoZXJlIGJhc2UgaXMgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBnaXZlbiBqYXZhIGNvbW1hbmQsIG5vcm1hbGx5IGpyZS9iaW4KLQkJICovCi0JCWkgPSAtMTsKLQkJd2hpbGUoanZtTG9jYXRpb25zWysraV0gIT0gTlVMTCkgewotCQkJX3N0cHJpbnRmKGxvY2F0aW9uLCBfVF9FQ0xJUFNFKCIlcyVjJXMiKSwganZtTG9jYXRpb25zW2ldLCBkaXJTZXBhcmF0b3IsIHZtTGlicmFyeSk7Ci0JCQlpZiAoX3RzdGF0KCBwYXRoLCAmc3RhdHMgKSA9PSAwICYmIChzdGF0cy5zdF9tb2RlICYgU19JRlJFRykgIT0gMCkKLQkJCXsJLyogZm91bmQgaXQgKi8KLQkJCQlyZXR1cm4gcGF0aDsKLQkJCX0KLQkJfQotCQkKLQkJLyogaWYgY29tbWFuZCBpcyBlY2xpcHNlL2pyZSwgZG9uJ3QgbG9vayBpbiByZWdpc3RyeSAqLwotCQkgbG9jYXRpb24gPSBtYWxsb2MoIChfdGNzbGVuKCBnZXRQcm9ncmFtRGlyKCkgKSArIF90Y3NsZW4oIHNoaXBwZWRWTURpciApICsgMSkgKiBzaXplb2YoX1RDSEFSKSApOwotICAgICAgICBfc3RwcmludGYoIGxvY2F0aW9uLCBfVF9FQ0xJUFNFKCIlcyVzIiksIGdldFByb2dyYW1EaXIoKSwgc2hpcHBlZFZNRGlyICk7Ci0gICAgICAgIGlmKCBfdGNzbmNtcChjb21tYW5kLCBsb2NhdGlvbiwgX3Rjc2xlbihsb2NhdGlvbikpID09IDApIHsKLSAgICAgICAgCWZyZWUobG9jYXRpb24pOwotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShsb2NhdGlvbik7Ci0JfQotCQotCS8qIE5vdCBmb3VuZCB5ZXQsIHRyeSB0aGUgcmVnaXN0cnksIHdlIHdpbGwgdXNlIHRoZSBmaXJzdCB2bSA+PSAxLjQgKi8KLQlqcmVLZXlOYW1lID0gX1QoIlNvZnR3YXJlXFxKYXZhU29mdFxcSmF2YSBSdW50aW1lIEVudmlyb25tZW50Iik7Ci0JaWYgKFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsIGpyZUtleU5hbWUsIDAsIEtFWV9SRUFELCAmanJlS2V5KSA9PSBFUlJPUl9TVUNDRVNTKSB7Ci0JCWlmKFJlZ1F1ZXJ5VmFsdWVFeChqcmVLZXksIF9UX0VDTElQU0UoIkN1cnJlbnRWZXJzaW9uIiksIE5VTEwsIE5VTEwsICh2b2lkKikma2V5TmFtZSwgJmxlbmd0aCkgPT0gRVJST1JfU1VDQ0VTUykgewotCQkJcGF0aCA9IGNoZWNrVk1SZWdpc3RyeUtleShqcmVLZXksIGtleU5hbWUpOwotCQkJaWYgKHBhdGggIT0gTlVMTCkgewotCQkJCVJlZ0Nsb3NlS2V5KGpyZUtleSk7Ci0JCQkJcmV0dXJuIHBhdGg7Ci0JCQl9Ci0JCX0KLQkJaiA9IDA7Ci0JCWxlbmd0aCA9IE1BWF9QQVRIOwotCQl3aGlsZSAoUmVnRW51bUtleUV4KGpyZUtleSwgaisrLCBrZXlOYW1lLCAmbGVuZ3RoLCAwLCAwLCAwLCAwKSA9PSBFUlJPUl9TVUNDRVNTKSB7ICAKLQkJCS8qbG9vayBmb3IgYSAxLjQgb3IgMS41IHZtKi8gCi0JCQlpZiggX3Rjc25jbXAoX1QoIjEuNCIpLCBrZXlOYW1lLCAzKSA8PSAwICkgewotCQkJCXBhdGggPSBjaGVja1ZNUmVnaXN0cnlLZXkoanJlS2V5LCBrZXlOYW1lKTsKLQkJCQlpZiAocGF0aCAhPSBOVUxMKSB7Ci0JCQkJCVJlZ0Nsb3NlS2V5KGpyZUtleSk7Ci0JCQkJCXJldHVybiBwYXRoOwotCQkJCX0KLQkJCX0KLQkJfQotCQlSZWdDbG9zZUtleShqcmVLZXkpOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIHN1YktleU5hbWUgc3ViS2V5IG9mIGpyZUtleSBhbmQgbG9vayB0byBzZWUgaWYgaXQgaGFzIGEgVmFsdWUgCi0gKiAiUnVudGltZUxpYiIgd2hpY2ggcG9pbnRzIHRvIGEganZtIGxpYnJhcnkgd2UgY2FuIHVzZSAKLSAqIAotICogRG9lcyBub3QgY2xvc2UganJlS2V5Ci0gKi8KLXN0YXRpYyBfVENIQVIqIGNoZWNrVk1SZWdpc3RyeUtleShIS0VZIGpyZUtleSwgX1RDSEFSKiBzdWJLZXlOYW1lKSB7Ci0JX1RDSEFSIHZhbHVlW01BWF9QQVRIXTsKLQlIS0VZIHN1YktleSA9IE5VTEw7Ci0JRFdPUkQgbGVuZ3RoID0gTUFYX1BBVEg7Ci0JX1RDSEFSICpyZXN1bHQgPSBOVUxMOwotCXN0cnVjdCBfc3RhdCBzdGF0czsKLQkKLQlpZihSZWdPcGVuS2V5RXgoanJlS2V5LCBzdWJLZXlOYW1lLCAwLCBLRVlfUkVBRCwgJnN1YktleSkgPT0gRVJST1JfU1VDQ0VTUykgewkJCQkKLQkJLypUaGUgUnVudGltZUxpYiB2YWx1ZSBzaG91bGQgcG9pbnQgdG8gdGhlIGxpYnJhcnkgd2Ugd2FudCovCi0JCWlmKFJlZ1F1ZXJ5VmFsdWVFeChzdWJLZXksIF9UKCJSdW50aW1lTGliIiksIE5VTEwsIE5VTEwsICh2b2lkKikmdmFsdWUsICZsZW5ndGgpID09IEVSUk9SX1NVQ0NFU1MpIHsKLQkJCWlmIChfdHN0YXQoIHZhbHVlLCAmc3RhdHMgKSA9PSAwICYmIChzdGF0cy5zdF9tb2RlICYgU19JRlJFRykgIT0gMCkKLQkJCXsJLypsaWJyYXJ5IGV4aXN0cyovCi0JCQkJcmVzdWx0ID0gX3Rjc2R1cCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJUmVnQ2xvc2VLZXkoc3ViS2V5KTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIF9UQ0hBUiogYnVpbGRDb21tYW5kTGluZSggX1RDSEFSKiBwcm9ncmFtLCBfVENIQVIqIGFyZ3NbXSApCi17Ci0JaW50ICAgaW5kZXgsIHNsYXNoOwotCXNpemVfdCBsZW5ndGggPSAwOwotCV9UQ0hBUiAqY29tbWFuZExpbmUsICpjaCwgKnNwYWNlOwotCi0JLyoKLQkqIEJ1aWxkIHRoZSBjb21tYW5kIGxpbmUuIEFueSBhcmd1bWVudCB3aXRoIHNwYWNlcyBtdXN0IGJlIGluCi0JKiBkb3VibGUgcXVvdGVzIGluIHRoZSBjb21tYW5kIGxpbmUuIAotCSovCi0JaWYocHJvZ3JhbSAhPSBOVUxMKSAKLQkJbGVuZ3RoID0gX3Rjc2xlbihwcm9ncmFtKSArIDE7Ci0JZm9yIChpbmRleCA9IDA7IGFyZ3NbaW5kZXhdICE9IE5VTEw7IGluZGV4KyspCi0JewotCQkvKiBTdHJpbmcgbGVuZ3RoIHBsdXMgc3BhY2UgY2hhcmFjdGVyICovCi0JCWxlbmd0aCArPSBfdGNzbGVuKCBhcmdzWyBpbmRleCBdICkgKyAxOwotCQkvKiBRdW90ZXMgKyBwb3RlbnRpYWwgZXNjYXBpbmcgJ1wnICovCi0JCWlmIChfdGNzY2hyKCBhcmdzWyBpbmRleCBdLCBfVCgnICcpICkgIT0gTlVMTCkgbGVuZ3RoICs9IDM7Ci0JfQotCQotCWNvbW1hbmRMaW5lID0gY2ggPSBtYWxsb2MgKCAobGVuZ3RoICsgMSkgKiBzaXplb2YoX1RDSEFSKSApOwotCWlmIChwcm9ncmFtICE9IE5VTEwpIHsKLQkJX3Rjc2NweShjaCwgcHJvZ3JhbSk7Ci0JCWNoICs9IF90Y3NsZW4ocHJvZ3JhbSk7Ci0JCSpjaCsrID0gX1QoJyAnKTsKLQl9Ci0JZm9yIChpbmRleCA9IDA7IGFyZ3NbaW5kZXhdICE9IE5VTEw7IGluZGV4KyspCi0JewotCQlzcGFjZSA9IF90Y3NjaHIoIGFyZ3NbIGluZGV4IF0sIF9UKCcgJykpOwotCQlpZiAoc3BhY2UgIT0gTlVMTCkgKmNoKysgPSBfVCgnXCInKTsKLQkJX3Rjc2NweSggY2gsIGFyZ3NbaW5kZXhdICk7Ci0JCWNoICs9IF90Y3NsZW4oIGFyZ3NbaW5kZXhdICk7Ci0JCWlmIChzcGFjZSAhPSBOVUxMKSB7Ci0JCQlpZiAoICooY2ggLSAxKSA9PSBfVCgnXFwnKSApIHsKLQkJCQkvKiBlc2NhcGUgYSB0cmFpbGluZyB1bmVzY2FwZWQgJ1wnIG9yIGl0IHdpbGwgZXNjYXBlIG91ciBjbG9zaW5nICciJyBhbmQgbWVzcyB0aGluZ3MgdXAgKi8KLQkJCQlzbGFzaCA9IDE7Ci0JCQkJd2hpbGUgKCAqKGNoIC0gMSAtIHNsYXNoKSA9PSBfVCgnXFwnKSkgc2xhc2grKzsKLQkJCQlpZiAoc2xhc2ggJSAyKSAqY2grKyA9IF9UKCdcXCcpOwotCQkJfQotCQkJKmNoKysgPSBfVCgnXCInKTsKLQkJfQotCQkqY2grKyA9IF9UKCcgJyk7Ci0JfQotCSpjaCA9IF9UKCdcMCcpOwotCXJldHVybiBjb21tYW5kTGluZTsKLX0KLXZvaWQgcmVzdGFydExhdW5jaGVyKCBfVENIQVIqIHByb2dyYW0sIF9UQ0hBUiogYXJnc1tdICkKLXsKLQlfVENIQVIqIGNvbW1hbmRMaW5lID0gYnVpbGRDb21tYW5kTGluZShwcm9ncmFtLCBhcmdzKTsKLQkKLQl7Ci0JU1RBUlRVUElORk8gICAgc2k7Ci0gICAgUFJPQ0VTU19JTkZPUk1BVElPTiAgcGk7Ci0gICAgR2V0U3RhcnR1cEluZm8oJnNpKTsKLSAgICBpZiAoQ3JlYXRlUHJvY2VzcyhOVUxMLCBjb21tYW5kTGluZSwgTlVMTCwgTlVMTCwgVFJVRSwgMCwgTlVMTCwgTlVMTCwgJnNpLCAmcGkpKSB7Ci0gICAgCUNsb3NlSGFuZGxlKCBwaS5oVGhyZWFkICk7Ci0gICAgfSAgIAotCX0KLQlmcmVlKGNvbW1hbmRMaW5lKTsKLX0KLQotSmF2YVJlc3VsdHMqIGxhdW5jaEphdmFWTSggX1RDSEFSKiBhcmdzW10gKQotewotCU1TRyBtc2c7Ci0JX1RDSEFSKiBjb21tYW5kTGluZTsKLQlqdm1Qcm9jZXNzID0gMDsKLQljb21tYW5kTGluZSA9IGJ1aWxkQ29tbWFuZExpbmUoTlVMTCwgYXJncyk7Ci0JanZtUmVzdWx0cyA9IG1hbGxvYyhzaXplb2YoSmF2YVJlc3VsdHMpKTsKLQltZW1zZXQoanZtUmVzdWx0cywgMCwgc2l6ZW9mKEphdmFSZXN1bHRzKSk7Ci0JCi0JLyoKLQkqIFN0YXJ0IHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZS4gVXNlIENyZWF0ZVByb2Nlc3MoKSBpbnN0ZWFkIG9mIHNwYXdudigpCi0JKiBvdGhlcndpc2UgdGhlIGFyZ3VtZW50cyBjYW5ub3QgYmUgZnJlZWQgc2luY2Ugc3Bhd252KCkgc2VnbWVudHMgZmF1bHQuCi0JKi8KLQl7Ci0JU1RBUlRVUElORk8gICAgc2k7Ci0gICAgUFJPQ0VTU19JTkZPUk1BVElPTiAgcGk7Ci0gICAgR2V0U3RhcnR1cEluZm8oJnNpKTsKLSAgICBpZiAoQ3JlYXRlUHJvY2VzcyhOVUxMLCBjb21tYW5kTGluZSwgTlVMTCwgTlVMTCwgVFJVRSwgMCwgTlVMTCwgTlVMTCwgJnNpLCAmcGkpKSB7Ci0gICAgCUNsb3NlSGFuZGxlKCBwaS5oVGhyZWFkICk7Ci0gICAgCWp2bVByb2Nlc3MgPSBwaS5oUHJvY2VzczsKLSAgICB9IGVsc2UgewotICAgIAlqdm1SZXN1bHRzLT5sYXVuY2hSZXN1bHQgPSBlcnJubzsKLSAgICB9Ci0JfQotCi0JZnJlZSggY29tbWFuZExpbmUgKTsKLQotCWlmIChqdm1Qcm9jZXNzID4gMCkKLQl7Ci0gICAgICAgIC8qIFNldCBhIHRpbWVyIHRvIGRldGVjdCBKVk0gcHJvY2VzcyB0ZXJtaW5hdGlvbi4gKi8KLSAgICAgICAgU2V0VGltZXIoIHRvcFdpbmRvdywganZtRXhpdFRpbWVySWQsIGp2bUV4aXRUaW1lb3V0LCBkZXRlY3RKdm1FeGl0ICk7Ci0KLSAgICAJLyogUHJvY2VzcyBtZXNzYWdlcyB1bnRpbCB0aGUgSlZNIHRlcm1pbmF0ZXMuCi0gICAgCSAgIFRoaXMgbGF1bmNoZXIgcHJvY2VzcyBtdXN0IGNvbnRpbnVlIHRvIHByb2Nlc3MgZXZlbnRzIHVudGlsIHRoZSBKVk0gZXhpdHMKLSAgICAJICAgb3IgZWxzZSBXaW5kb3dzIDJLIHdpbGwgaGFuZyBpZiB0aGUgZGVza3RvcCBwcm9wZXJ0aWVzIChlLmcuLCBiYWNrZ3JvdW5kKSBhcmUKLSAgICAJICAgY2hhbmdlZCBieSB0aGUgdXNlci4gV2luZG93cyBkb2VzIGEgU2VuZE1lc3NhZ2UoKSB0byBldmVyeSB0b3AgbGV2ZWwgd2luZG93Ci0gICAgCSAgIHByb2Nlc3MsIHdoaWNoIGJsb2NrcyB0aGUgY2FsbGVyIHVudGlsIHRoZSBwcm9jZXNzIHJlc3BvbmRzLiAqLwotICAgCQl3aGlsZSAoanZtUHJvY2VzcyAhPSAwKQotICAgCQl7Ci0gICAJCQlHZXRNZXNzYWdlKCAmbXNnLCBOVUxMLCAwLCAwICk7Ci0JCQlUcmFuc2xhdGVNZXNzYWdlKCAmbXNnICk7Ci0JCQlEaXNwYXRjaE1lc3NhZ2UoICZtc2cgKTsKLQkJfQotCi0JCS8qIEtpbGwgdGhlIHRpbWVyLiAqLwotICAgICAgICBLaWxsVGltZXIoIHRvcFdpbmRvdywganZtRXhpdFRpbWVySWQgKTsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGV4aXQgY29kZSBmcm9tIHRoZSBKVk0uICovCi0JcmV0dXJuIGp2bVJlc3VsdHM7Ci19Ci0KLS8qIERldGVjdCBKVk0gUHJvY2VzcyBUZXJtaW5hdGlvbiAqLwotc3RhdGljIHZvaWQgQ0FMTEJBQ0sgZGV0ZWN0SnZtRXhpdCggSFdORCBod25kLCBVSU5UIHVNc2csIFVJTlQgaWQsIERXT1JEIGR3VGltZSApCi17Ci0gICAgRFdPUkQgICBleGl0Q29kZTsKLQotICAgIC8qIElmIHRoZSBKVk0gcHJvY2VzcyBoYXMgdGVybWluYXRlZCAqLwotICAgIGlmICghR2V0RXhpdENvZGVQcm9jZXNzKCAoSEFORExFKWp2bVByb2Nlc3MsICZleGl0Q29kZSApIHx8Ci0gICAgCQkgZXhpdENvZGUgIT0gU1RJTExfQUNUSVZFKQotICAgIHsKLSAgICAJLyogU2F2ZSB0aGUgSlZNIGV4aXQgY29kZS4gVGhpcyBzaG91bGQgY2F1c2UgdGhlIGxvb3AgaW4gbGF1bmNoSmF2YVZNKCkgdG8gZXhpdC4gKi8KLSAgICAgICAganZtUmVzdWx0cy0+cnVuUmVzdWx0ID0gZXhpdENvZGU7Ci0gICAgICAgIGp2bVByb2Nlc3MgPSAwOwotICAgIH0KLX0KLQotdm9pZCBwcm9jZXNzVk1BcmdzKF9UQ0hBUiAqKnZtYXJnc1tdICkgewotCS8qIG5vdGhpbmcgeWV0ICovCi19Ci0KLUphdmFSZXN1bHRzKiBzdGFydEphdmFWTSggX1RDSEFSKiBsaWJQYXRoLCBfVENIQVIqIHZtQXJnc1tdLCBfVENIQVIqIHByb2dBcmdzW10sIF9UQ0hBUiogamFyRmlsZSApCi17Ci0JcmV0dXJuIHN0YXJ0SmF2YUpOSShsaWJQYXRoLCB2bUFyZ3MsIHByb2dBcmdzLCBqYXJGaWxlKTsKLX0KLQotaW50IGlzU3VuVk0oIF9UQ0hBUiAqIGphdmFWTSwgX1RDSEFSICogam5pTGliICkgewotCV9UQ0hBUiAqdm0gPSAoam5pTGliICE9IE5VTEwpID8gam5pTGliIDogamF2YVZNOwotCWludCByZXN1bHQgPSAwOwotCURXT1JEIGluZm9TaXplOwotCURXT1JEIGhhbmRsZTsKLQl2b2lkICogaW5mbzsKLQkKLQlfVENIQVIgKiBrZXksICp2YWx1ZTsKLQlzaXplX3QgaTsKLQlpbnQgdmFsdWVTaXplOwotCQotCWlmICh2bSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQkKLQlpbmZvU2l6ZSA9IEdldEZpbGVWZXJzaW9uSW5mb1NpemUodm0sICZoYW5kbGUpOwotCWlmIChpbmZvU2l6ZSA+IDApIHsKLQkJaW5mbyA9IG1hbGxvYyhpbmZvU2l6ZSk7Ci0JCWlmIChHZXRGaWxlVmVyc2lvbkluZm8odm0sIDAsICBpbmZvU2l6ZSwgaW5mbykpIHsKLQkJCVRSQU5TTEFUSU9OUyAqIHRyYW5zbGF0aW9uczsKLQkJCWludCB0cmFuc2xhdGlvbnNTaXplOwotCQkJVmVyUXVlcnlWYWx1ZShpbmZvLCAgX1RfRUNMSVBTRSgiXFxWYXJGaWxlSW5mb1xcVHJhbnNsYXRpb24iKSwgKHZvaWQgKikgJnRyYW5zbGF0aW9ucywgJnRyYW5zbGF0aW9uc1NpemUpOwotCQkJCi0JCQkvKiB0aGlzIHNpemUgaXMgb25seSByaWdodCBiZWNhdXNlICUwNHggaXMgNCBjaGFyYWN0ZXJzICovCi0JCQlrZXkgPSBtYWxsb2MoIChfdGNzbGVuKENPTVBBTllfTkFNRV9LRVkpICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgKHRyYW5zbGF0aW9uc1NpemUgLyBzaXplb2YoVFJBTlNMQVRJT05TKSk7IGkrKykgewotCQkJCV9zdHByaW50ZihrZXksIENPTVBBTllfTkFNRV9LRVksIHRyYW5zbGF0aW9uc1tpXS5sYW5ndWFnZSwgdHJhbnNsYXRpb25zW2ldLmNvZGVwYWdlKTsKLQkJCQkKLQkJCQlWZXJRdWVyeVZhbHVlKGluZm8sIGtleSwgKHZvaWQgKikmdmFsdWUsICZ2YWx1ZVNpemUpOwotCQkJCWlmIChfdGNzbmNtcCh2YWx1ZSwgU1VOX01JQ1JPU1lTVEVNUywgX3Rjc2xlbihTVU5fTUlDUk9TWVNURU1TKSkgPT0gMCkgewotCQkJCQlyZXN1bHQgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlmcmVlKGtleSk7Ci0JCX0KLQkJZnJlZShpbmZvKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd2luMzIvZWNsaXBzZVdpbkNvbW1vbi5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9lY2xpcHNlV2luQ29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZjM4YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9lY2xpcHNlV2luQ29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQW5kcmV3IE5pZWZlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAiZWNsaXBzZUNvbW1vbi5oIgotI2luY2x1ZGUgImVjbGlwc2VPUy5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGNvbW1jdHJsLmg+Ci0KLSNkZWZpbmUgRUNMSVBTRV9JQ09OICA0MDEKLQotX1RDSEFSICAgZGlyU2VwYXJhdG9yICA9IF9UKCdcXCcpOwotX1RDSEFSICAgcGF0aFNlcGFyYXRvciA9IF9UKCc7Jyk7Ci0KLS8qIEdsb2JhbCBNYWluIFdpbmRvdyovCi1IV05EICAgIHRvcFdpbmRvdyA9IDA7Ci0KLS8qIERlZmluZSBsb2NhbCB2YXJpYWJsZXMgZm9yIHRoZSBtYWluIHdpbmRvdy4gKi8KLS8qc3RhdGljIFdORFBST0Mgb2xkUHJvYzsqLwotCi1zdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLQotLyogRGlzcGxheSBhIE1lc3NhZ2UgKi8KLXZvaWQgZGlzcGxheU1lc3NhZ2UoIF9UQ0hBUiogdGl0bGUsIF9UQ0hBUiogbWVzc2FnZSApCi17Ci0JaWYoIWluaXRpYWxpemVkKQotCQlpbml0V2luZG93U3lzdGVtKDAsIE5VTEwsIDApOwotCU1lc3NhZ2VCb3goIHRvcFdpbmRvdywgbWVzc2FnZSwgdGl0bGUsIE1CX09LICk7Ci19Ci0KLS8qIEluaXRpYWxpemUgV2luZG93IFN5c3RlbQotICoKLSAqIENyZWF0ZSBhIHBvcCB3aW5kb3cgdG8gZGlzcGxheSB0aGUgYml0bWFwIGltYWdlLgotICoKLSAqIFJldHVybiB0aGUgd2luZG93IGhhbmRsZSBhcyB0aGUgZGF0YSBmb3IgdGhlIHNwbGFzaCBjb21tYW5kLgotICoKLSAqLwotaW50IGluaXRXaW5kb3dTeXN0ZW0oIGludCogcEFyZ2MsIF9UQ0hBUiogYXJndltdLCBpbnQgc2hvd1NwbGFzaCApCi17Ci0JSElOU1RBTkNFIG1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZShOVUxMKTsKLQlISUNPTiBpY29uID0gTlVMTDsKLQkKLQlpZihpbml0aWFsaXplZCkKLQkJcmV0dXJuIDA7Ci0KLQlpY29uID0gTG9hZEljb24obW9kdWxlLCBNQUtFSU5UUkVTT1VSQ0UoRUNMSVBTRV9JQ09OKSk7IAotICAgIGlmIChpY29uID09IE5VTEwpIHsKLSAgICAJSE1PRFVMRSBobSA9IExvYWRMaWJyYXJ5RXgoZ2V0UHJvZ3JhbVBhdGgoKSwgMCwgTE9BRF9MSUJSQVJZX0FTX0RBVEFGSUxFICYgMHgyIC8qTE9BRF9MSUJSQVJZX0FTX0lNQUdFX1JFU09VUkNFKi8pOwotICAgIAlpZiAoaG0gIT0gTlVMTCkKLSAgICAJCWljb24gPSBMb2FkSWNvbihobSwgTUFLRUlOVFJFU09VUkNFKEVDTElQU0VfSUNPTikpOwotICAgIH0KLSAgICAKLSAgICAvKiBDcmVhdGUgYSB3aW5kb3cgdGhhdCBoYXMgbm8gZGVjb3JhdGlvbnMuICovCi0JSW5pdENvbW1vbkNvbnRyb2xzKCk7Ci0gICAgdG9wV2luZG93ID0gQ3JlYXRlV2luZG93RXggKCBpY29uICE9IE5VTEwgPyAwIDogV1NfRVhfVE9PTFdJTkRPVywKLQkJX1QoIlNUQVRJQyIpLAotCQlnZXRPZmZpY2lhbE5hbWUoKSwKLQkJU1NfQklUTUFQIHwgV1NfUE9QVVAgfCBXU19DTElQQ0hJTERSRU4sCi0JCUNXX1VTRURFRkFVTFQsCi0JCTAsCi0JCUNXX1VTRURFRkFVTFQsCi0JCTAsCi0JCU5VTEwsCi0JCU5VTEwsCi0JCW1vZHVsZSwKLQkJTlVMTCk7Ci0KLSAgICBpZiAoaWNvbiAhPSBOVUxMKQotI2lmZGVmIFdJTjY0Ci0gICAgCVNldENsYXNzTG9uZ1B0cih0b3BXaW5kb3csIEdDTFBfSElDT04sIChMT05HX1BUUilpY29uKTsKLSNlbHNlCi0gICAgCVNldENsYXNzTG9uZyh0b3BXaW5kb3csIEdDTF9ISUNPTiwgKExPTkcpaWNvbik7Ci0jZW5kaWYKLQotCWluaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogTG9hZCB0aGUgc3BlY2lmaWVkIHNoYXJlZCBsaWJyYXJ5Ci0gKi8KLXZvaWQgKiBsb2FkTGlicmFyeSggX1RDSEFSICogbGlicmFyeSApewotCXJldHVybiBMb2FkTGlicmFyeShsaWJyYXJ5KTsKLX0KLQotLyogVW5sb2FkIHRoZSBzaGFyZWQgbGlicmFyeQotICovCi12b2lkIHVubG9hZExpYnJhcnkoIHZvaWQgKiBoYW5kbGUgKXsKLQlGcmVlTGlicmFyeShoYW5kbGUpOwotfQotIAotLyogRmluZCB0aGUgZ2l2ZW4gc3ltYm9sIGluIHRoZSBzaGFyZWQgbGlicmFyeQotICovCi12b2lkICogZmluZFN5bWJvbCggdm9pZCAqIGhhbmRsZSwgX1RDSEFSICogc3ltYm9sICl7Ci0JY2hhciAqIHN0ciA9IE5VTEw7Ci0Jdm9pZCAqIHJlc3VsdDsKLQkKLQlzdHIgPSB0b05hcnJvdyhzeW1ib2wpOwotCXJlc3VsdCA9IEdldFByb2NBZGRyZXNzKGhhbmRsZSwgc3RyKTsKLQlmcmVlKHN0cik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotX1RDSEFSKiByZXNvbHZlU3ltbGlua3MoIF9UQ0hBUiogcGF0aCApIHsKLQkvKiBubyBzeW1saW5rcyBvbiB3aW5kb3dzICovCi0JcmV0dXJuIHBhdGg7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL21ha2VfbWluZ3cubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9tYWtlX21pbmd3Lm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlYjgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL21ha2VfbWluZ3cubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEtldmluIENvcm5lbGwgKFJhdGlvbmFsIFNvZnR3YXJlIENvcnBvcmF0aW9uKQotIyAgICAgU2lsZW5pbyBRdWFydGkgKElCTSkKLSMgICAgIFNhbSBSb2JiIChUaW1lU3lzIENvcnBvcmF0aW9uKQotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWluY2x1ZGUgLi4vbWFrZV92ZXJzaW9uLm1hawotIyBNYWtlZmlsZSBmb3IgY3JlYXRpbmcgdGhlIGVjbGlwc2UgbGF1bmNoZXIgcHJvZ3JhbS4KLQotIyBUaGlzIG1ha2VmaWxlIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0OgotIwotIyBQUk9HUkFNX09VVFBVVCAgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBleGVjdXRhYmxlCi0jIFBST0dSQU1fTElCUkFSWSAtIHRoZSBmaWxlIG9mIHRoZSBvdXRwdXQgc2hhcmVkIGxpYnJhcnkKLSMgREVGQVVMVF9PUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItb3MiIHN3aXRjaAotIyBERUZBVUxUX09TX0FSQ0ggLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1hcmNoIiBzd2l0Y2gKLSMgREVGQVVMVF9XUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItd3MiIHN3aXRjaAotCi0jaWYgUFJPR1JBTV9PVVRQVVQgaXMgbm90IHNldCwgYXNzdW1lIGVjbGlwc2UuZXhlCi1pZmVxICgkKFBST0dSQU1fT1VUUFVUKSwpCi0gIFBST0dSQU1fT1VUUFVUPWVjbGlwc2UuZXhlCi1lbmRpZgotCi0jIFNlcGFyYXRlIGZpbGVuYW1lIGZyb20gZXh0ZW50aW9uCi1QUk9HUkFNX05BTUU9JChQUk9HUkFNX09VVFBVVDouZXhlPSkKLQotUFJPR1JBTV9MSUJSQVJZPWVjbGlwc2VfJChMSUJfVkVSU0lPTikuZGxsCi0KLSMgQWxsb3cgZm9yIGNyb3NzLWNvbXBpbGluZyB1bmRlciBsaW51eAotT1NUWVBFCT89ICQoc2hlbGwgaWYgdW5hbWUgLXMgfCBncmVwIC1pcSBjeWd3aW4gOyB0aGVuIGVjaG8gY3lnd2luOyBlbHNlIGVjaG8gbGludXg7IGZpKQotCi1pZmVxICgkKE9TVFlQRSksY3lnd2luKQotQ0NWRVIgICA9IGk2ODYKLUNDICAgICAgPSBpNjg2LXBjLWN5Z3dpbi1nY2MtMwotUkMgICAgICA9IHdpbmRyZXMKLWVsc2UKLUNDVkVSICAgPSBpNTg2Ci1DQyAgICAgID0gJChzaGVsbCB3aGljaCBpNTg2LXBjLWN5Z3dpbi1nY2MpCi1URElSICAgID0gJChkaXIgJChzaGVsbCB0ZXN0IC1MICQoQ0MpICYmIHJlYWRsaW5rICQoQ0MpIHx8IGVjaG8gJChDQykpKQotUkMgICAgICA9ICQoVERJUikvaTU4Ni1wYy1jeWd3aW4td2luZHJlcwotU1lTSU5DICA9IC1pc3lzdGVtICQoVERJUikvLi4vaW5jbHVkZS9taW5ndwotZW5kaWYKLQotaWZlcSAoJChDQyksKQotJChlcnJvciBVbmFibGUgdG8gZmluZCAkKENDVkVSKS1wYy1jeWd3aW4tZ2NjKQotZW5kaWYKLQotIyBEZWZpbmUgdGhlIG9iamVjdCBtb2R1bGVzIHRvIGJlIGNvbXBpbGVkIGFuZCBmbGFncy4KLU1BSU5fT0JKUyA9IGVjbGlwc2VNYWluLm8gCi1DT01NT05fT0JKUyA9IGVjbGlwc2VDb25maWcubyBlY2xpcHNlQ29tbW9uLm8gICBlY2xpcHNlV2luQ29tbW9uLm8KLURMTF9PQkpTCT0gZWNsaXBzZS5vICBlY2xpcHNlV2luLm8gIGVjbGlwc2VVdGlsLm8gIGVjbGlwc2VKTkkubyBlY2xpcHNlU2htLm8KLQkgIAkJICAKLUxJQlMJPSAtbGtlcm5lbDMyIC1sdXNlcjMyIC1sZ2RpMzIgLWxjb21jdGwzMiAtbG1zdmNydCAtbHZlcnNpb24KLUxERkxBR1MgPSAtbXdpbmRvd3MgLW1uby1jeWd3aW4KLUNPTlNPTEVGTEFHUyA9IC1tY29uc29sZSAtbW5vLWN5Z3dpbgotRExMX0xERkxBR1MgPSAtbW5vLWN5Z3dpbiAtc2hhcmVkIC1XbCwtLWV4cG9ydC1hbGwtc3ltYm9scyAtV2wsLS1raWxsLWF0LC0taW1hZ2UtYmFzZT0weDcyMDAwMDAwCi1SRVMJPSAkKFBST0dSQU1fTkFNRSkucmVzCi1DT05TT0xFID0gJChQUk9HUkFNX05BTUUpYy5leGUKLUVYRUMJPSAkKFBST0dSQU1fT1VUUFVUKQotRExMICAgICA9ICQoUFJPR1JBTV9MSUJSQVJZKQotREVCVUcJPSAkKENERUJVRykKLUNGTEFHUwk9IC1nIC1zIC1XYWxsIFwKLQkgIC1JLiAtSSQoSkFWQV9IT01FKS9pbmNsdWRlIC1JJChKQVZBX0hPTUUpL2luY2x1ZGUvd2luMzIgJChTWVNJTkMpIFwKLQkgIC1EX1dJTjMyIFwKLQkgIC1EV0lOMzJfTEVBTl9BTkRfTUVBTiBcCi0JICAtbW5vLWN5Z3dpbiAtRF9faW50NjQ9ImxvbmcgbG9uZyIKLVdDRkxBR1MgPSAtRFVOSUNPREUgLUkuLiAtRERFRkFVTFRfT1M9IlwiJChERUZBVUxUX09TKVwiIiBcCi0JICAtRERFRkFVTFRfT1NfQVJDSD0iXCIkKERFRkFVTFRfT1NfQVJDSClcIiIgXAotCSAgLURERUZBVUxUX1dTPSJcIiQoREVGQVVMVF9XUylcIiIgXAotCSAgJChERUJVRykgJChDRkxBR1MpCi0KLWFsbDogJChFWEVDKSAkKERMTCkgJChDT05TT0xFKQotCi1lY2xpcHNlTWFpbi5vOiAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlTWFpbi5jIAotCSQoQ0MpICQoREVCVUcpICQoV0NGTEFHUykgLWMgLW8gJEAgLi4vZWNsaXBzZU1haW4uYwotCQotZWNsaXBzZUNvbW1vbi5vOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmMKLQkkKENDKSAkKERFQlVHKSAkKFdDRkxBR1MpIC1jIC1vICRAIC4uL2VjbGlwc2VDb21tb24uYwotCQotZWNsaXBzZVdpbkNvbW1vbi5vOiAuLi9lY2xpcHNlQ29tbW9uLmggZWNsaXBzZVdpbkNvbW1vbi5jCi0JJChDQykgJChERUJVRykgJChXQ0ZMQUdTKSAtYyAtbyAkQCBlY2xpcHNlV2luQ29tbW9uLmMKLQotZWNsaXBzZS5vOiAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VKTkkuaCAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZS5jCi0JJChDQykgJChERUJVRykgJChXQ0ZMQUdTKSAtYyAtbyAkQCAuLi9lY2xpcHNlLmMKLQotZWNsaXBzZVV0aWwubzogLi4vZWNsaXBzZVV0aWwuaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VVdGlsLmMKLQkkKENDKSAkKERFQlVHKSAkKFdDRkxBR1MpIC1jIC1vICRAIC4uL2VjbGlwc2VVdGlsLmMKLQotZWNsaXBzZUNvbmZpZy5vOiAuLi9lY2xpcHNlQ29uZmlnLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29uZmlnLmMKLQkkKENDKSAkKERFQlVHKSAkKFdDRkxBR1MpIC1jIC1vICRAIC4uL2VjbGlwc2VDb25maWcuYwotCQotZWNsaXBzZVdpbi5vOiAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlVW5pY29kZS5oIGVjbGlwc2VXaW4uYwotCSQoQ0MpICQoREVCVUcpICQoV0NGTEFHUykgLWMgLW8gJEAgZWNsaXBzZVdpbi5jCi0KLWVjbGlwc2VKTkkubzogLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlSk5JLmMKLQkkKENDKSAkKERFQlVHKSAkKFdDRkxBR1MpIC1jIC1vICRAIC4uL2VjbGlwc2VKTkkuYwotCQotZWNsaXBzZVNobS5vOiAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlU2htLmMKLQkkKENDKSAkKERFQlVHKSAkKFdDRkxBR1MpIC1jIC1vICRAIC4uL2VjbGlwc2VTaG0uYwotCQotJChSRVMpOiAkKFBST0dSQU1fTkFNRSkucmMKLQkkKFJDKSAtLW91dHB1dC1mb3JtYXQ9Y29mZiAtLWluY2x1ZGUtZGlyPS4uIC1vICRAICQ8Ci0KLSQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykKLQkkKENDKSAkKExERkxBR1MpIC1vICQoRVhFQykgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoUkVTKSAkKExJQlMpCi0KLSN0aGUgY29uc29sZSB2ZXJzaW9uIG5lZWRzIGEgZmxhZyBzZXQsIHNob3VsZCBsb29rIGZvciBhIGJldHRlciB3YXkgdG8gZG8gdGhpcwotJChDT05TT0xFKTogJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpIAotCXJtIC1mIGVjbGlwc2VDb25maWcubyBhZWNsaXBzZUNvbmZpZy5vCi0JJChDQykgJChERUJVRykgJChXQ0ZMQUdTKSAtRF9XSU4zMl9DT05TT0xFIC1jIC1vIGVjbGlwc2VDb25maWcubyAuLi9lY2xpcHNlQ29uZmlnLmMKLQkkKENDKSAkKENPTlNPTEVGTEFHUykgLW8gJChDT05TT0xFKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCQotJChETEwpOiAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKQotCSQoQ0MpICQoRExMX0xERkxBR1MpIC1vICQoRExMKSAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKExJQlMpCi0JCi1pbnN0YWxsOiBhbGwKLQljcCAkKEVYRUMpICQoRExMKSAkKENPTlNPTEUpICQoT1VUUFVUX0RJUikgCi0Jcm0gLWYgJChFWEVDKSAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKE1BSU5fT0JKUykgJChSRVMpICQoQ09OU09MRSkKLQotY2xlYW46Ci0JJChSTSkgJChFWEVDKSAkKERMTCkgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChNQUlOX09CSlMpICQoUkVTKSAkKENPTlNPTEUpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL21ha2Vfd2luMzIubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9tYWtlX3dpbjMyLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmZmVmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL21ha2Vfd2luMzIubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIE1ha2VmaWxlIGZvciBjcmVhdGluZyB0aGUgZWNsaXBzZSBsYXVuY2hlciBwcm9ncmFtLgotCi0jIFRoaXMgbWFrZWZpbGUgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQ6Ci0jCi0jIFBST0dSQU1fT1VUUFVUICAtIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGV4ZWN1dGFibGUKLSMgUFJPR1JBTV9MSUJSQVJZIC0gdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZGxsIGxpYnJhcnkKLSMgREVGQVVMVF9PUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItb3MiIHN3aXRjaAotIyBERUZBVUxUX09TX0FSQ0ggLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1hcmNoIiBzd2l0Y2gKLSMgREVGQVVMVF9XUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItd3MiIHN3aXRjaAotIyBKQVZBX0hPTUUgICAgICAgLSB0aGUgbG9jYXRpb24gb2YgdGhlIEphdmEgZm9yIEpOSSBpbmNsdWRlcwotTk9ERUJVRz0xCi0haW5jbHVkZSA8bnR3aW4zMi5tYWs+Ci0haW5jbHVkZSA8Li5cbWFrZV92ZXJzaW9uLm1haz4KLQotUFJPR1JBTV9PVVRQVVQ9ZWNsaXBzZS5leGUKLSMgU2VwYXJhdGUgZmlsZW5hbWUgZnJvbSBleHRlbnRpb24KLVBST0dSQU1fTkFNRT0kKFBST0dSQU1fT1VUUFVUOi5leGU9KQotCi1QUk9HUkFNX0xJQlJBUlkgPSBlY2xpcHNlXyQoTElCX1ZFUlNJT04pLmRsbAotCi0jIERlZmluZSB0aGUgb2JqZWN0IG1vZHVsZXMgdG8gYmUgY29tcGlsZWQgYW5kIGZsYWdzLgotTUFJTl9PQkpTID0gZWNsaXBzZU1haW4ub2JqCi1DT01NT05fT0JKUyA9IGVjbGlwc2VDb25maWcub2JqIGVjbGlwc2VDb21tb24ub2JqICAgZWNsaXBzZVdpbkNvbW1vbi5vYmoKLURMTF9PQkpTCT0gZWNsaXBzZS5vYmogIGVjbGlwc2VXaW4ub2JqICBlY2xpcHNlVXRpbC5vYmogIGVjbGlwc2VKTkkub2JqIGVjbGlwc2VTaG0ub2JqCi0KLUxJQlMgICA9IGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGNvbWN0bDMyLmxpYiBtc3ZjcnQubGliCi1ETExfTElCUyA9IGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGNvbWN0bDMyLmxpYiBnZGkzMi5saWIgQWR2YXBpMzIubGliIG1zdmNydC5saWIgdmVyc2lvbi5saWIKLUxGTEFHUyA9IC9OT0RFRkFVTFRMSUIgL0lOQ1JFTUVOVEFMOk5PIC9SRUxFQVNFIC9OT0xPR08gLXN1YnN5c3RlbTp3aW5kb3dzLDQuMCAtZW50cnk6d21haW5DUlRTdGFydHVwCi1DT05TT0xFRkxBR1MgPSAvTk9ERUZBVUxUTElCIC9JTkNSRU1FTlRBTDpOTyAvUkVMRUFTRSAvTk9MT0dPIC1zdWJzeXN0ZW06Y29uc29sZSw0LjAgLWVudHJ5OndtYWluQ1JUU3RhcnR1cAotRExMX0xGTEFHUyA9IC9OT0RFRkFVTFRMSUIgL0lOQ1JFTUVOVEFMOk5PIC9QREI6Tk9ORSAvUkVMRUFTRSAvTk9MT0dPIC1lbnRyeTpfRGxsTWFpbkNSVFN0YXJ0dXBAMTIgLWRsbCAvQkFTRToweDcyMDAwMDAwIC9ETEwKLVJFUwk9ICQoUFJPR1JBTV9OQU1FKS5yZXMKLUVYRUMJPSAkKFBST0dSQU1fT1VUUFVUKQotQ09OU09MRSA9ICQoUFJPR1JBTV9OQU1FKWMuZXhlCi1ETEwgICAgPSAkKFBST0dSQU1fTElCUkFSWSkKLURFQlVHICA9ICMkKGNkZWJ1ZykKLXdjZmxhZ3MgPSAtRFVOSUNPREUgLUkuLiAtRERFRkFVTFRfT1M9IlwiJChERUZBVUxUX09TKVwiIiBcCi0JLURERUZBVUxUX09TX0FSQ0g9IlwiJChERUZBVUxUX09TX0FSQ0gpXCIiIFwKLQktRERFRkFVTFRfV1M9IlwiJChERUZBVUxUX1dTKVwiIiBcCi0JLUkkKEpBVkFfSE9NRSlcaW5jbHVkZSAtSSQoSkFWQV9IT01FKVxpbmNsdWRlXHdpbjMyIFwKLQkkKGNmbGFncykKLQotYWxsOiAkKEVYRUMpICQoRExMKSAkKENPTlNPTEUpCi0KLWVjbGlwc2VNYWluLm9iajogLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU1haW4uYyAKLQkkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlTWFpbi5jCi0KLWVjbGlwc2VDb21tb24ub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmMKLQkkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlQ29tbW9uLmMKLQotZWNsaXBzZS5vYmo6IC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VVbmljb2RlLmggLi4vZWNsaXBzZS5jCi0gICAgJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogLi4vZWNsaXBzZS5jCi0KLWVjbGlwc2VVdGlsLm9iajogLi4vZWNsaXBzZVV0aWwuaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VVdGlsLmMKLSAgICAkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlVXRpbC5jCi0KLWVjbGlwc2VDb25maWcub2JqOiAuLi9lY2xpcHNlQ29uZmlnLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29uZmlnLmMKLSAgICAkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlQ29uZmlnLmMKLQotZWNsaXBzZVdpbi5vYmo6IC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VVbmljb2RlLmggZWNsaXBzZVdpbi5jCi0gICAgJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogZWNsaXBzZVdpbi5jCi0KLWVjbGlwc2VXaW5Db21tb24ub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggZWNsaXBzZVdpbkNvbW1vbi5jCi0gICAgJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogZWNsaXBzZVdpbkNvbW1vbi5jCi0KLWVjbGlwc2VKTkkub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZUpOSS5jCi0JJChDQykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogLi4vZWNsaXBzZUpOSS5jCi0KLWVjbGlwc2VTaG0ub2JqOiAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlU2htLmMKLQkkKENDKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlU2htLmMKLQkKLSQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykKLSAgICAkKGxpbmspICQoTEZMQUdTKSAtb3V0OiQoUFJPR1JBTV9PVVRQVVQpICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykgJChMSUJTKQotCi0jdGhlIGNvbnNvbGUgdmVyc2lvbiBuZWVkcyBhIGZsYWcgc2V0LCBzaG91bGQgbG9vayBmb3IgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMKLSQoQ09OU09MRSk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKQotCWRlbCAtZiBlY2xpcHNlQ29uZmlnLm9iaiBhZWNsaXBzZUNvbmZpZy5vYmoKLQkkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC1EX1dJTjMyX0NPTlNPTEUgL0ZvZWNsaXBzZUNvbmZpZy5vYmogLi4vZWNsaXBzZUNvbmZpZy5jCi0gICAgJChsaW5rKSAkKENPTlNPTEVGTEFHUykgLW91dDokKENPTlNPTEUpICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKExJQlMpCi0KLSQoRExMKTogJChETExfT0JKUykgJChDT01NT05fT0JKUykKLSAgICAkKGxpbmspICQoRExMX0xGTEFHUykgLW91dDokKFBST0dSQU1fTElCUkFSWSkgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChETExfTElCUykKLQotJChSRVMpOiAkKFBST0dSQU1fTkFNRSkucmMKLSAgICAkKHJjKSAtciAtZm8gJChSRVMpIGVjbGlwc2UucmMKLQotaW5zdGFsbDogYWxsCi0JY29weSAkKEVYRUMpICQoT1VUUFVUX0RJUikKLQlkZWwgLWYgJChFWEVDKSAkKE1BSU5fT0JKUykgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChSRVMpCi0gICAKLWNsZWFuOgotCWRlbCAkKEVYRUMpICQoRExMKSAkKE1BSU5fT0JKUykgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChSRVMpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL21ha2Vfd2luNjQubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9tYWtlX3dpbjY0Lm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYWFhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL21ha2Vfd2luNjQubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIyBNYWtlZmlsZSBmb3IgY3JlYXRpbmcgdGhlIGVjbGlwc2UgbGF1bmNoZXIgcHJvZ3JhbS4KLQotIyBUaGlzIG1ha2VmaWxlIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0OgotIwotIyBQUk9HUkFNX09VVFBVVCAgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBleGVjdXRhYmxlCi0jIFBST0dSQU1fTElCUkFSWSAtIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGRsbCBsaWJyYXJ5Ci0jIERFRkFVTFRfT1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLW9zIiBzd2l0Y2gKLSMgREVGQVVMVF9PU19BUkNIIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItYXJjaCIgc3dpdGNoCi0jIERFRkFVTFRfV1MgICAgICAtIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiLXdzIiBzd2l0Y2gKLSMgSkFWQV9IT01FICAgICAgIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSBKYXZhIGZvciBKTkkgaW5jbHVkZXMKLU5PREVCVUc9MQotCi1BUFBWRVI9NC4wCi1fV0lOMzJfV0lOTlQ9MHgwNDAwCi1fV0lOMzJfSUU9MHgwMzAwCi0KLSFpbmNsdWRlIDxudHdpbjMyLm1haz4KLSFpbmNsdWRlIDwuLlxtYWtlX3ZlcnNpb24ubWFrPgotCi1QUk9HUkFNX09VVFBVVD1lY2xpcHNlLmV4ZQotIyBTZXBhcmF0ZSBmaWxlbmFtZSBmcm9tIGV4dGVudGlvbgotUFJPR1JBTV9OQU1FPSQoUFJPR1JBTV9PVVRQVVQ6LmV4ZT0pCi0KLVBST0dSQU1fTElCUkFSWSA9IGVjbGlwc2VfJChMSUJfVkVSU0lPTikuZGxsCi0KLSMgRGVmaW5lIHRoZSBvYmplY3QgbW9kdWxlcyB0byBiZSBjb21waWxlZCBhbmQgZmxhZ3MuCi1NQUlOX09CSlMgPSBlY2xpcHNlTWFpbi5vYmoKLUNPTU1PTl9PQkpTID0gZWNsaXBzZUNvbmZpZy5vYmogZWNsaXBzZUNvbW1vbi5vYmogICBlY2xpcHNlV2luQ29tbW9uLm9iagotRExMX09CSlMJPSBlY2xpcHNlLm9iaiAgZWNsaXBzZVdpbi5vYmogIGVjbGlwc2VVdGlsLm9iaiAgZWNsaXBzZUpOSS5vYmogZWNsaXBzZVNobS5vYmoKLQotTElCUyAgID0ga2VybmVsMzIubGliIHVzZXIzMi5saWIgY29tY3RsMzIubGliIG1zdmNydC5saWIgYnVmZmVyb3ZlcmZsb3dVLmxpYgotRExMX0xJQlMgPSBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBjb21jdGwzMi5saWIgZ2RpMzIubGliIEFkdmFwaTMyLmxpYiBtc3ZjcnQubGliIHZlcnNpb24ubGliIGJ1ZmZlcm92ZXJmbG93VS5saWIKLUxGTEFHUyA9IC9OT0RFRkFVTFRMSUIgL0lOQ1JFTUVOVEFMOk5PIC9SRUxFQVNFIC9OT0xPR08gLXN1YnN5c3RlbTp3aW5kb3dzIC1lbnRyeTp3bWFpbkNSVFN0YXJ0dXAKLUNPTlNPTEVGTEFHUyA9IC9OT0RFRkFVTFRMSUIgL0lOQ1JFTUVOVEFMOk5PIC9SRUxFQVNFIC9OT0xPR08gLXN1YnN5c3RlbTpjb25zb2xlIC1lbnRyeTp3bWFpbkNSVFN0YXJ0dXAKLSNETExfTEZMQUdTID0gL05PREVGQVVMVExJQiAvSU5DUkVNRU5UQUw6Tk8gL1BEQjpOT05FIC9SRUxFQVNFIC9OT0xPR08gLWVudHJ5Ol9EbGxNYWluQ1JUU3RhcnR1cEAxMiAtZGxsIC9CQVNFOjB4NzIwMDAwMDAgL0RMTAotRExMX0xGTEFHUyA9IC9OT0RFRkFVTFRMSUIgL0lOQ1JFTUVOVEFMOk5PIC9QREI6Tk9ORSAvUkVMRUFTRSAvTk9MT0dPICAtZGxsIC9CQVNFOjB4NzIwMDAwMDAgL0RMTAotUkVTCT0gJChQUk9HUkFNX05BTUUpLnJlcwotRVhFQwk9ICQoUFJPR1JBTV9PVVRQVVQpCi1DT05TT0xFID0gJChQUk9HUkFNX05BTUUpYy5leGUKLURMTCAgICA9ICQoUFJPR1JBTV9MSUJSQVJZKQotREVCVUcgID0gIyQoY2RlYnVnKQotd2NmbGFncyA9IC1EVU5JQ09ERSAtSS4uIC1EREVGQVVMVF9PUz0iXCIkKERFRkFVTFRfT1MpXCIiIFwKLQktRERFRkFVTFRfT1NfQVJDSD0iXCIkKERFRkFVTFRfT1NfQVJDSClcIiIgXAotCS1EREVGQVVMVF9XUz0iXCIkKERFRkFVTFRfV1MpXCIiIFwKLQktSSQoSkFWQV9IT01FKVxpbmNsdWRlIC1JJChKQVZBX0hPTUUpXGluY2x1ZGVcd2luMzIgXAotCSQoY2ZsYWdzKQotYWxsOiAkKEVYRUMpICQoRExMKSAkKENPTlNPTEUpCi0KLWVjbGlwc2VNYWluLm9iajogLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU1haW4uYyAKLQkkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlTWFpbi5jCi0KLWVjbGlwc2VDb21tb24ub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmMKLQkkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlQ29tbW9uLmMKLQotZWNsaXBzZS5vYmo6IC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VVbmljb2RlLmggLi4vZWNsaXBzZS5jCi0gICAgJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogLi4vZWNsaXBzZS5jCi0KLWVjbGlwc2VVdGlsLm9iajogLi4vZWNsaXBzZVV0aWwuaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VVdGlsLmMKLSAgICAkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlVXRpbC5jCi0KLWVjbGlwc2VDb25maWcub2JqOiAuLi9lY2xpcHNlQ29uZmlnLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29uZmlnLmMKLSAgICAkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlQ29uZmlnLmMKLQotZWNsaXBzZVdpbi5vYmo6IC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VVbmljb2RlLmggZWNsaXBzZVdpbi5jCi0gICAgJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogZWNsaXBzZVdpbi5jCi0KLWVjbGlwc2VXaW5Db21tb24ub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggZWNsaXBzZVdpbkNvbW1vbi5jCi0gICAgJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogZWNsaXBzZVdpbkNvbW1vbi5jCi0KLWVjbGlwc2VKTkkub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZUpOSS5jCi0JJChDQykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogLi4vZWNsaXBzZUpOSS5jCi0KLWVjbGlwc2VTaG0ub2JqOiAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlU2htLmMKLQkkKENDKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlU2htLmMKLQkKLSQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykKLSAgICAkKGxpbmspICQoTEZMQUdTKSAtb3V0OiQoUFJPR1JBTV9PVVRQVVQpICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykgJChMSUJTKQotCi0jdGhlIGNvbnNvbGUgdmVyc2lvbiBuZWVkcyBhIGZsYWcgc2V0LCBzaG91bGQgbG9vayBmb3IgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMKLSQoQ09OU09MRSk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKQotCWRlbCAtZiBlY2xpcHNlQ29uZmlnLm9iaiBhZWNsaXBzZUNvbmZpZy5vYmoKLQkkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnNkbGwpIC1EX1dJTjMyX0NPTlNPTEUgL0ZvZWNsaXBzZUNvbmZpZy5vYmogLi4vZWNsaXBzZUNvbmZpZy5jCi0gICAgJChsaW5rKSAkKENPTlNPTEVGTEFHUykgLW91dDokKENPTlNPTEUpICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKExJQlMpCi0KLSQoRExMKTogJChETExfT0JKUykgJChDT01NT05fT0JKUykKLSAgICAkKGxpbmspICQoRExMX0xGTEFHUykgLW91dDokKFBST0dSQU1fTElCUkFSWSkgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChETExfTElCUykKLQotJChSRVMpOiAkKFBST0dSQU1fTkFNRSkucmMKLSAgICAkKHJjKSAtciAtZm8gJChSRVMpIGVjbGlwc2UucmMKLQotaW5zdGFsbDogYWxsCi0JY29weSAkKEVYRUMpICQoT1VUUFVUX0RJUikKLQlkZWwgLWYgJChFWEVDKSAkKE1BSU5fT0JKUykgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChSRVMpCi0gICAKLWNsZWFuOgotCWRlbCAkKEVYRUMpICQoRExMKSAkKE1BSU5fT0JKUykgJChETExfT0JKUykgJChDT01NT05fT0JKUykgJChSRVMpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL21ha2Vfd2luNjRfaWE2NC5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dpbjMyL21ha2Vfd2luNjRfaWE2NC5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWZmNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93aW4zMi9tYWtlX3dpbjY0X2lhNjQubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIE1ha2VmaWxlIGZvciBjcmVhdGluZyB0aGUgZWNsaXBzZSBsYXVuY2hlciBwcm9ncmFtLgotCi0jIFRoaXMgbWFrZWZpbGUgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQ6Ci0jCi0jIFBST0dSQU1fT1VUUFVUICAtIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGV4ZWN1dGFibGUKLSMgUFJPR1JBTV9MSUJSQVJZIC0gdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZGxsIGxpYnJhcnkKLSMgREVGQVVMVF9PUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItb3MiIHN3aXRjaAotIyBERUZBVUxUX09TX0FSQ0ggLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1hcmNoIiBzd2l0Y2gKLSMgREVGQVVMVF9XUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItd3MiIHN3aXRjaAotIyBKQVZBX0hPTUUgICAgICAgLSB0aGUgbG9jYXRpb24gb2YgdGhlIEphdmEgZm9yIEpOSSBpbmNsdWRlcwotTk9ERUJVRz0xCi0haW5jbHVkZSA8bnR3aW4zMi5tYWs+Ci0haW5jbHVkZSA8Li5cbWFrZV92ZXJzaW9uLm1haz4KLQotUFJPR1JBTV9MSUJSQVJZID0gZWNsaXBzZV8kKExJQl9WRVJTSU9OKS5kbGwKLQotIyBEZWZpbmUgdGhlIG9iamVjdCBtb2R1bGVzIHRvIGJlIGNvbXBpbGVkIGFuZCBmbGFncy4KLU1BSU5fT0JKUyA9IGVjbGlwc2VNYWluLm9iagotQ09NTU9OX09CSlMgPSBlY2xpcHNlQ29uZmlnLm9iaiBlY2xpcHNlQ29tbW9uLm9iaiAgIGVjbGlwc2VXaW5Db21tb24ub2JqCi1ETExfT0JKUwk9IGVjbGlwc2Uub2JqICBlY2xpcHNlV2luLm9iaiAgZWNsaXBzZVV0aWwub2JqICBlY2xpcHNlSk5JLm9iaiBlY2xpcHNlU2htLm9iagotCi0jIHVzaW5nIGR5bmFtaWMgbGliCi0jTElCUyAgID0ga2VybmVsMzIubGliIHVzZXIzMi5saWIgY29tY3RsMzIubGliIG1zdmNydC5saWIKLSNETExfTElCUyA9IGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGNvbWN0bDMyLmxpYiBnZGkzMi5saWIgQWR2YXBpMzIubGliIG1zdmNydC5saWIgdmVyc2lvbi5saWIKLQotTElCUyAgID0ga2VybmVsMzIubGliIHVzZXIzMi5saWIgY29tY3RsMzIubGliIGxpYmNtdC5saWIgYnVmZmVyb3ZlcmZsb3dVLmxpYgotRExMX0xJQlMgPSBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBjb21jdGwzMi5saWIgZ2RpMzIubGliIEFkdmFwaTMyLmxpYiBsaWJjbXQubGliIHZlcnNpb24ubGliIGJ1ZmZlcm92ZXJmbG93VS5saWIKLSMgTElCUyAgID0ga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGNvbWN0bDMyLmxpYiBidWZmZXJvdmVyZmxvd3UubGliCi0jIExGTEFHUyA9IC9JTkNSRU1FTlRBTDpOTyAvTk9MT0dPIC1zdWJzeXN0ZW06d2luZG93cyAtZW50cnk6d21haW5DUlRTdGFydHVwIC1tYWNoaW5lOklBNjQKLQotIyB3YXM6IHdpbmRvd3MKLUxGTEFHUyAgICAgICA9IC9OT0RFRkFVTFRMSUIgL0lOQ1JFTUVOVEFMOk5PIC9SRUxFQVNFIC9OT0xPR08gLXN1YnN5c3RlbTp3aW5kb3dzIC1lbnRyeTp3bWFpbkNSVFN0YXJ0dXAgLW1hY2hpbmU6SUE2NAotQ09OU09MRUZMQUdTID0gL05PREVGQVVMVExJQiAvSU5DUkVNRU5UQUw6Tk8gL1JFTEVBU0UgL05PTE9HTyAtc3Vic3lzdGVtOmNvbnNvbGUgLWVudHJ5OndtYWluQ1JUU3RhcnR1cCAtbWFjaGluZTpJQTY0Ci1ETExfTEZMQUdTICAgPSAvTk9ERUZBVUxUTElCIC9JTkNSRU1FTlRBTDpOTyAvUkVMRUFTRSAvTk9MT0dPIC9QREI6Tk9ORSAtZW50cnk6X0RsbE1haW5DUlRTdGFydHVwIC1kbGwgL0JBU0U6MHg3MjAwMDAwMCAvRExMIC1tYWNoaW5lOklBNjQKLVJFUyAgICA9IGVjbGlwc2UucmVzCi1FWEVDICAgPSBlY2xpcHNlLmV4ZQotQ09OU09MRSA9IGVjbGlwc2VjLmV4ZQotRExMICAgID0gJChQUk9HUkFNX0xJQlJBUlkpCi1ERUJVRyAgPSAjJChjZGVidWcpCi13Y2ZsYWdzID0gLURVTklDT0RFIC1JLi4gLURERUZBVUxUX09TPSJcIiQoREVGQVVMVF9PUylcIiIgXAotCS1EREVGQVVMVF9PU19BUkNIPSJcIiQoREVGQVVMVF9PU19BUkNIKVwiIiBcCi0JLURERUZBVUxUX1dTPSJcIiQoREVGQVVMVF9XUylcIiIgXAotCS1JJChKQVZBX0hPTUUpXGluY2x1ZGUgLUkkKEpBVkFfSE9NRSlcaW5jbHVkZVx3aW4zMiBcCi0JJChjZmxhZ3MpIC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgLURfQ1JUX05PTl9DT05GT1JNSU5HX1NXUFJJTlRGUwotYWxsOiAkKEVYRUMpICQoRExMKSAkKENPTlNPTEUpCi0KLWVjbGlwc2VNYWluLm9iajogLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU1haW4uYyAKLQkkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnMpIC9GbyQqLm9iaiAuLi9lY2xpcHNlTWFpbi5jCi0KLWVjbGlwc2VDb21tb24ub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmMKLQkkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnMpIC9GbyQqLm9iaiAuLi9lY2xpcHNlQ29tbW9uLmMKLQotZWNsaXBzZS5vYmo6IC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VVbmljb2RlLmggLi4vZWNsaXBzZS5jCi0gICAgJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzKSAvRm8kKi5vYmogLi4vZWNsaXBzZS5jCi0KLWVjbGlwc2VVdGlsLm9iajogLi4vZWNsaXBzZVV0aWwuaCAuLi9lY2xpcHNlVW5pY29kZS5oIC4uL2VjbGlwc2VVdGlsLmMKLSAgICAkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnMpIC9GbyQqLm9iaiAuLi9lY2xpcHNlVXRpbC5jCi0KLWVjbGlwc2VDb25maWcub2JqOiAuLi9lY2xpcHNlQ29uZmlnLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29uZmlnLmMKLSAgICAkKGNjKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnMpIC9GbyQqLm9iaiAuLi9lY2xpcHNlQ29uZmlnLmMKLQotZWNsaXBzZVdpbi5vYmo6IC4uL2VjbGlwc2VPUy5oIC4uL2VjbGlwc2VVbmljb2RlLmggZWNsaXBzZVdpbi5jCi0gICAgJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzKSAvRm8kKi5vYmogZWNsaXBzZVdpbi5jCi0KLWVjbGlwc2VXaW5Db21tb24ub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggZWNsaXBzZVdpbkNvbW1vbi5jCi0gICAgJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzKSAvRm8kKi5vYmogZWNsaXBzZVdpbkNvbW1vbi5jCi0KLWVjbGlwc2VKTkkub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZUpOSS5jCi0JJChDQykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzKSAvRm8kKi5vYmogLi4vZWNsaXBzZUpOSS5jCi0KLWVjbGlwc2VTaG0ub2JqOiAuLi9lY2xpcHNlU2htLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlU2htLmMKLQkkKENDKSAkKERFQlVHKSAkKHdjZmxhZ3MpICQoY3ZhcnMpIC9GbyQqLm9iaiAuLi9lY2xpcHNlU2htLmMKLQkKLSQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykKLSAgICAkKGxpbmspICQoTEZMQUdTKSAtb3V0OiQoUFJPR1JBTV9PVVRQVVQpICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykgJChMSUJTKQotIyQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykKLSMgICAgJChsaW5rKSAkKExGTEFHUykgLW91dDokKFBST0dSQU1fT1VUUFVUKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChSRVMpICQoTElCUykKLQotI3RoZSBjb25zb2xlIHZlcnNpb24gbmVlZHMgYSBmbGFnIHNldCwgc2hvdWxkIGxvb2sgZm9yIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzCi0kKENPTlNPTEUpOiAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykKLQlkZWwgLWYgZWNsaXBzZUNvbmZpZy5vYmogYWVjbGlwc2VDb25maWcub2JqCi0JJChjYykgJChERUJVRykgJCh3Y2ZsYWdzKSAkKGN2YXJzKSAtRF9XSU4zMl9DT05TT0xFIC9Gb2VjbGlwc2VDb25maWcub2JqIC4uL2VjbGlwc2VDb25maWcuYwotICAgICQobGluaykgJChDT05TT0xFRkxBR1MpIC1vdXQ6JChDT05TT0xFKSAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykgJChMSUJTKQotCi0kKERMTCk6ICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpCi0gICAgJChsaW5rKSAkKERMTF9MRkxBR1MpIC1vdXQ6JChQUk9HUkFNX0xJQlJBUlkpICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpICQoRExMX0xJQlMpCi0KLSQoUkVTKTogZWNsaXBzZS5yYwotICAgICQocmMpIC12IC1yIC1mbyAkKFJFUykgZWNsaXBzZS5yYwotCi1pbnN0YWxsOiBhbGwKLQljb3B5ICQoRVhFQykgJChPVVRQVVRfRElSKQotCWRlbCAtZiAkKEVYRUMpICQoTUFJTl9PQkpTKSAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykKLSAgIAotY2xlYW46Ci0JZGVsICQoRVhFQykgJChETEwpICQoTUFJTl9PQkpTKSAkKERMTF9PQkpTKSAkKENPTU1PTl9PQkpTKSAkKFJFUykKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd3BmLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU4NWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd3BmLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0qLm9iagotZWNsaXBzZS5leGUKLWVjbGlwc2UucmVzCi0qLnBkYgotKi5leHAKLSoubGliCi1lY2xpcHNlXyouZGxsCi1jb21fKi5kbGwKLWVjbGlwc2VjLmV4ZQotZWNsaXBzZWMuZXhlLm1hbmlmZXN0Ci1lY2xpcHNlXyouZGxsLm1hbmlmZXN0Ci1lY2xpcHNlLmV4ZS5tYW5pZmVzdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93cGYvYnVpbGQuYmF0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93cGYvYnVpbGQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDcwZmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd3BmL2J1aWxkLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi1AcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUByZW0gIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUByZW0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLUByZW0gIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotQHJlbSAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi1AcmVtICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotQHJlbSAgCi1AcmVtICBDb250cmlidXRvcnM6Ci1AcmVtICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi1AcmVtICAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi1AcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1AcmVtIAotQHJlbSAgVXNhZ2U6IHNoIGJ1aWxkLnNoIFs8b3B0aW9uYWwgc3dpdGNoZXM+XSBbY2xlYW5dCi1AcmVtIAotQHJlbSAgICB3aGVyZSB0aGUgb3B0aW9uYWwgc3dpdGNoZXMgYXJlOgotQHJlbSAgICAgICAgLW91dHB1dCA8UFJPR1JBTV9PVVRQVVQ+ICAtIGV4ZWN1dGFibGUgZmlsZW5hbWUgKCJlY2xpcHNlIikKLUByZW0gICAgICAgIC1saWJyYXJ5IDxQUk9HUkFNX0xJQlJBUlk+LSBkbGwgZmlsZW5hbWUgKGVjbGlwc2UuZGxsKQotQHJlbSAgICAgICAgLW9zICAgICA8REVGQVVMVF9PUz4gICAgICAtIGRlZmF1bHQgRWNsaXBzZSAiLW9zIiB2YWx1ZSAocW54KSAKLUByZW0gICAgICAgIC1hcmNoICAgPERFRkFVTFRfT1NfQVJDSD4gLSBkZWZhdWx0IEVjbGlwc2UgIi1hcmNoIiB2YWx1ZSAoeDg2KSAKLUByZW0gICAgICAgIC13cyAgICAgPERFRkFVTFRfV1M+ICAgICAgLSBkZWZhdWx0IEVjbGlwc2UgIi13cyIgdmFsdWUgKHBob3RvbikKLUByZW0JCS1qYXZhICAgPEpBVkFfSE9NRT4gICAgICAgLSBsb2NhdGlvbiBvZiBhIEphdmEgU0RLIGZvciBKTkkgaGVhZGVycyAKLUByZW0gCi1AcmVtIAotQHJlbSAgICAgVGhpcyBzY3JpcHQgY2FuIGFsc28gYmUgaW52b2tlZCB3aXRoIHRoZSAiY2xlYW4iIGFyZ3VtZW50LgotQHJlbQotQHJlbSBOT1RFOiBUaGUgQyBjb21waWxlciBuZWVkcyB0byBiZSBzZXR1cC4gVGhpcyBzY3JpcHQgaGFzIGJlZW4KLUByZW0gICAgICAgdGVzdGVkIGFnYWluc3QgTWljcm9zb2Z0IFZpc3VhbCBDIGFuZCBDKysgQ29tcGlsZXIgNi4wLgotQHJlbQkKLUByZW0gVW5jb21tZW50IHRoZSBsaW5lcyBiZWxvdyBhbmQgZWRpdCBNU1ZDX0hPTUUgdG8gcG9pbnQgdG8gdGhlCi1AcmVtIGNvcnJlY3Qgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGNvbXBpbGVyIGluc3RhbGxhdGlvbiwgaWYgeW91Ci1AcmVtIHdhbnQgdGhpcyB0byBiZSBkb25lIGJ5IHRoaXMgc2NyaXB0LgotQHJlbSAKLUByZW0gKioqKioqCi1AZWNobyBvZmYKLQotSUYgeC4lMT09eC54ODYgc2hpZnQKLQotSUYgTk9UICIlSkFWQV9IT01FJSI9PSIiIEdPVE8gTVNWQwotcmVtICoqKioqCi1yZW0gSmF2YWgKLXJlbSAqKioqKgotc2V0IEpBVkFfSE9NRT0iQzpcUHJvZ3JhbSBGaWxlc1xJQk1cSmF2YTUwIgotCi06TVNWQwotCi1jYWxsICJDOlxQcm9ncmFtIEZpbGVzXE1TX1BMQVRfU0RLXE1hcmNoMjAwN1Zpc3RhUlRNXEJpblxzZXRlbnYuY21kIiAvdmlzdGEKLTpNQUtFCi0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVtIERlZmluZSBkZWZhdWx0IHZhbHVlcyBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG1ha2VmaWxlcy4KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc2V0IHByb2dyYW1PdXRwdXQ9ZWNsaXBzZS5leGUKLXNldCBwcm9ncmFtTGlicmFyeT1lY2xpcHNlLmRsbAotc2V0IGRlZmF1bHRPUz13aW4zMgotc2V0IGRlZmF1bHRPU0FyY2g9eDg2Ci1zZXQgZGVmYXVsdFdTPXdwZgotc2V0IG1ha2VmaWxlPW1ha2Vfd3BmLm1hawotc2V0IE9TPVdpbmRvd3MKLQotcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yZW0gUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlcy4KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc2V0IGV4dHJhQXJncz0KLTpXSElMRQotaWYgIiUxIiA9PSAiIiBnb3RvIFdISUxFX0VORAotICAgIGlmICIlMiIgPT0gIiIgICAgICAgZ290byBMQVNUX0FSRwotCi0gICAgaWYgIiUxIiA9PSAiLW9zIiAoCi0JCXNldCBkZWZhdWx0T1M9JTIKLQkJc2hpZnQKLQkJZ290byBORVhUICkKLSAgICBpZiAiJTEiID09ICItYXJjaCIgKAotCQlzZXQgZGVmYXVsdE9TQXJjaD0lMgotCQlzaGlmdAotCQlnb3RvIE5FWFQgKQotICAgIGlmICIlMSIgPT0gIi13cyIgKAotCQlzZXQgZGVmYXVsdFdTPSUyCi0JCXNoaWZ0Ci0JCWdvdG8gTkVYVCApCi0gICAgaWYgIiUxIiA9PSAiLW91dHB1dCIgKAotCQlzZXQgcHJvZ3JhbU91dHB1dD0lMgotCQlzaGlmdAotCQlnb3RvIE5FWFQgKQotCWlmICIlMSIgPT0gIi1saWJyYXJ5IiAoCi0JCXNldCBwcm9ncmFtTGlicmFyeT0lMgotCQlzaGlmdAotCQlnb3RvIE5FWFQgKQotCWlmICIlMSIgPT0gIi1qYXZhIiAoCi0JCXNldCBqYXZhSG9tZT0lMgotCQlzaGlmdAotCQlnb3RvIE5FWFQgKQotOkxBU1RfQVJHCi0gICAgICAgIHNldCBleHRyYUFyZ3M9JWV4dHJhQXJncyUgJTEKLQotOk5FWFQKLSAgICBzaGlmdAotICAgIGdvdG8gV0hJTEUKLTpXSElMRV9FTkQKLQotcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yZW0gU2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZWVkZWQgYnkgdGhlIG1ha2VmaWxlLgotcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zZXQgUFJPR1JBTV9PVVRQVVQ9JXByb2dyYW1PdXRwdXQlCi1zZXQgUFJPR1JBTV9MSUJSQVJZPSVwcm9ncmFtTGlicmFyeSUKLXNldCBERUZBVUxUX09TPSVkZWZhdWx0T1MlCi1zZXQgREVGQVVMVF9PU19BUkNIPSVkZWZhdWx0T1NBcmNoJQotc2V0IERFRkFVTFRfV1M9JWRlZmF1bHRXUyUKLXNldCBPVVRQVVRfRElSPS4uXC4uXGJpblwlZGVmYXVsdFdTJVwlZGVmYXVsdE9TJVwlZGVmYXVsdE9TQXJjaCUKLXNldCBKQVZBX0hPTUU9JWphdmFIb21lJQotCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlbSBSdW4gbm1ha2UgdG8gYnVpbGQgdGhlIGV4ZWN1dGFibGUuCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWlmICIlZXh0cmFBcmdzJSIgPT0gIiIgZ290byBNQUtFX0FMTAotCi1ubWFrZSAtZiAlbWFrZWZpbGUlICVleHRyYUFyZ3MlCi1nb3RvIERPTkUKLQotOk1BS0VfQUxMCi1lY2hvIEJ1aWxkaW5nICVPUyUgbGF1bmNoZXIuIERlZmF1bHRzOiAtb3MgJURFRkFVTFRfT1MlIC1hcmNoICVERUZBVUxUX09TX0FSQ0glIC13cyAlREVGQVVMVF9XUyUKLW5tYWtlIC1mICVtYWtlZmlsZSUgY2xlYW4KLW5tYWtlIC1mICVtYWtlZmlsZSUgJTEgJTIgJTMgJTQKLWdvdG8gRE9ORQotCi0KLTpET05FCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9idWlsZC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Yjk2ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93cGYvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHByb2plY3QgZGVmYXVsdD0iYnVpbGRfZWNsaXBzZSIgYmFzZWRpcj0iLiI+Ci0KLTx0YXJnZXQgbmFtZT0iYnVpbGRfZWNsaXBzZSI+Ci0JPGV4ZWMgZGlyPSIuIiBleGVjdXRhYmxlPSIke2Jhc2VkaXJ9XGJ1aWxkLmJhdCI+Ci0JCTxhcmcgbGluZT0iaW5zdGFsbCIvPgotCTwvZXhlYz4KLQk8ZWNsaXBzZS5yZWZyZXNoTG9jYWwgcmVzb3VyY2U9Im9yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZSIgZGVwdGg9ImluZmluaXRlIiAvPgkJCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JPHRzdGFtcC8+Ci0JPGV4ZWMgZGlyPSIuIiBleGVjdXRhYmxlPSIke2Jhc2VkaXJ9XGJ1aWxkLmJhdCI+Ci0JCTxhcmcgbGluZT0iY2xlYW4iLz4KLQk8L2V4ZWM+Ci08L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd3BmL2NvbS5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93cGYvY29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2UzODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93cGYvY29tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8b2xlMi5oPgotCi0jZGVmaW5lIENPTV9OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9lcXVpbm94X2xhdW5jaGVyX0pOSUJyaWRnZV8jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBDT01fTkFUSVZFKE9sZUluaXRpYWxpemUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCXJldHVybiAoamludClPbGVJbml0aWFsaXplKChMUFZPSUQpYXJnMCk7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgQ09NX05BVElWRShPbGVVbmluaXRpYWxpemUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlPbGVVbmluaXRpYWxpemUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93cGYvZWNsaXBzZS5pY28gYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9lY2xpcHNlLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyZjEzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9lY2xpcHNlLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd3BmL2VjbGlwc2UucmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9lY2xpcHNlLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjU0ZTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd3BmL2VjbGlwc2UucmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVDTElQU0VfSUNPTiAgNDAxCi0KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAid2ludmVyLmgiCi0KLQotRUNMSVBTRV9JQ09OICAgICAgICAgICAgSUNPTiAgICBESVNDQVJEQUJMRSAgICAgImVjbGlwc2UuaWNvIgotCi0vL0NSRUFURVBST0NFU1NfTUFOSUZFU1RfUkVTT1VSQ0VfSUQgUlRfTUFOSUZFU1QgImVjbGlwc2UuZXhlLm1hbmlmZXN0IiAKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93cGYvZWNsaXBzZVdwZi5jcHAgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9lY2xpcHNlV3BmLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiNmM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9lY2xpcHNlV3BmLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gIkMiIHsKLQotI2luY2x1ZGUgImVjbGlwc2VPUy5oIgotI2luY2x1ZGUgImVjbGlwc2VVdGlsLmgiCi0jaW5jbHVkZSAiZWNsaXBzZUNvbW1vbi5oIgotI2luY2x1ZGUgImVjbGlwc2VKTkkuaCIKLQotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFN5c3RlbTsKLXVzaW5nIG5hbWVzcGFjZSBTeXN0ZW06OklPOwotdXNpbmcgbmFtZXNwYWNlIFN5c3RlbTo6V2luZG93czsKLXVzaW5nIG5hbWVzcGFjZSBTeXN0ZW06OldpbmRvd3M6OklucHV0OwotdXNpbmcgbmFtZXNwYWNlIFN5c3RlbTo6V2luZG93czo6TWVkaWE7Ci11c2luZyBuYW1lc3BhY2UgU3lzdGVtOjpXaW5kb3dzOjpNZWRpYTo6SW1hZ2luZzsKLXVzaW5nIG5hbWVzcGFjZSBTeXN0ZW06OldpbmRvd3M6OkNvbnRyb2xzOwotdXNpbmcgbmFtZXNwYWNlIFN5c3RlbTo6V2luZG93czo6VGhyZWFkaW5nOwotdXNpbmcgbmFtZXNwYWNlIFN5c3RlbTo6UnVudGltZTo6SW50ZXJvcFNlcnZpY2VzOwotdXNpbmcgbmFtZXNwYWNlIFN5c3RlbTo6Q29tcG9uZW50TW9kZWw7Ci0KLQotLyogR2xvYmFsIFZhcmlhYmxlcyAqLwotX1RDSEFSKiAgZGVmYXVsdFZNICAgICA9IF9UKCJqYXZhdy5leGUiKTsKLV9UQ0hBUiogIGNvbnNvbGVWTSAgICAgPSBfVCgiamF2YS5leGUiKTsKLV9UQ0hBUiogIHZtTGlicmFyeSAJICAgPSBfVCgianZtLmRsbCIpOwotX1RDSEFSKiAgc2hpcHBlZFZNRGlyICA9IF9UKCJqcmVcXGJpblxcIik7Ci0KLS8qIERlZmluZSB0aGUgd2luZG93IHN5c3RlbSBhcmd1bWVudHMgZm9yIHRoZSBKYXZhIFZNLiAqLwotc3RhdGljIF9UQ0hBUiogIGFyZ1ZNW10gPSB7IE5VTEwgfTsKLQotLyogRGVmaW5lIGxvY2FsIHZhcmlhYmxlcyBmb3IgcnVubmluZyB0aGUgSlZNIGFuZCBkZXRlY3RpbmcgaXRzIGV4aXQuICovCi1zdGF0aWMgaW50ICAgICBqdm1Qcm9jZXNzICAgICA9IDA7Ci1zdGF0aWMgSmF2YVJlc3VsdHMqIGp2bVJlc3VsdHMgPSBOVUxMOwotc3RhdGljIGludCAgICAganZtRXhpdFRpbWVvdXQgPSAxMDA7Ci1zdGF0aWMgaW50ICAgICBqdm1FeGl0VGltZXJJZCA9IDk5OwotCi1zdGF0aWMgdm9pZCBDQUxMQkFDSyAgZGV0ZWN0SnZtRXhpdCAoKTsKLXN0YXRpYyBfVENIQVIqIGNoZWNrVk1SZWdpc3RyeUtleShIS0VZIGpyZWtleSwgX1RDSEFSKiBzdWJLZXlOYW1lKTsKLXN0YXRpYyB2b2lkIGFkanVzdFNlYXJjaFBhdGgoIF9UQ0hBUiAqIHZtTGlicmFyeSApOwotc3RhdGljIF9UQ0hBUiogZmluZExpYiggX1RDSEFSKiBjb21tYW5kICk7Ci0KLS8qIGRlZmluZSBkZWZhdWx0IGxvY2F0aW9ucyBpbiB3aGljaCB0byBmaW5kIHRoZSBqdm0gc2hhcmVkIGxpYnJhcnkKLSAqIHRoZXNlIGFyZSBwYXRocyByZWxhdGl2ZSB0byB0aGUgamF2YSBleGUsIHRoZSBzaGFyZWQgbGlicmFyeSBpcwotICogZm9yIGV4YW1wbGUganZtTG9jYXRpb25zWzBdICsgZGlyU2VwYXJhdG9yICsgdm1MaWJyYXJ5ICovCi0jZGVmaW5lIE1BWF9MT0NBVElPTl9MRU5HVEggMjUgLyogbm9uZSBvZiB0aGUganZtTG9jYXRpb25zIHN0cmluZ3Mgc2hvdWxkIGJlIGxvbmdlciB0aGFuIHRoaXMgKi8gCi1zdGF0aWMgY29uc3QgX1RDSEFSKiBqdm1Mb2NhdGlvbnMgW10gPSB7IF9UKCJqOXZtIiksIF9UKCIuLlxcanJlXFxiaW5cXGo5dm0iKSwKLQkJCQkJCQkJCQkgX1QoImNsaWVudCIpLCBfVCgiLi5cXGpyZVxcYmluXFxjbGllbnQiKSwgCi0JCQkJCQkJCQkJIF9UKCJzZXJ2ZXIiKSwgX1QoIi4uXFxqcmVcXGJpblxcc2VydmVyIiksCi0JCQkJCQkJCQkJIF9UKCJjbGFzc2ljIiksIF9UKCIuLlxcanJlXFxiaW5cXGNsYXNzaWMiKSwKLQkJCQkJCQkJCQkgX1QoImpyb2NraXQiKSwgX1QoIi4uXFxqcmVcXGJpblxcanJvY2tpdCIpLAotCQkJCQkJCQkgCQkgTlVMTCB9OwotLyogZm9yIGRldGVjdGluZyBzdW4gdm1zICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JV09SRCBsYW5ndWFnZTsKLQlXT1JEIGNvZGVwYWdlOwotfSBUUkFOU0xBVElPTlM7Ci0KLSNkZWZpbmUgQ09NUEFOWV9OQU1FX0tFWSBfVF9FQ0xJUFNFKCJcXFN0cmluZ0ZpbGVJbmZvXFwlMDR4JTA0eFxcQ29tcGFueU5hbWUiKQotI2RlZmluZSBTVU5fTUlDUk9TWVNURU1TIF9UX0VDTElQU0UoIlN1biBNaWNyb3N5c3RlbXMiKQotCi1kZWxlZ2F0ZSB2b2lkIE5vQXJnc0hhbmRsZXIgKCk7Ci0KLXB1YmxpYyByZWYgY2xhc3MgR2xvYmFscyB7Ci1wdWJsaWM6Ci0Jc3RhdGljIFdpbmRvd14gd2luZG93ID0gbnVsbHB0cjsKLQlzdGF0aWMgRGlzcGF0Y2hlckZyYW1lXiBmcmFtZSA9IG51bGxwdHI7CQotCQotCXN0YXRpYyB2b2lkIEhhbmRsZURpc3BhdGNoZXJJbmFjdGl2ZSAoT2JqZWN0XiBvLCBFdmVudEFyZ3NeIGUpIHsKLQkJaWYgKGZyYW1lICE9IG51bGxwdHIpIGZyYW1lLT5Db250aW51ZSA9IGZhbHNlOwotCX0KLQlzdGF0aWMgdm9pZCBIYW5kbGVDbG9zaW5nIChPYmplY3ReIG8sIENhbmNlbEV2ZW50QXJnc14gZSkgewotCQl3aW5kb3cgPSBudWxscHRyOwotCX0KLQlzdGF0aWMgdm9pZCBIYW5kbGVUaW1lciAoT2JqZWN0XiBvLCBFdmVudEFyZ3NeIGUpIHsKLQkJZGV0ZWN0SnZtRXhpdCgpOwotCQlpZiAoanZtUHJvY2VzcyA9PSAwKSB7Ci0JCQlpZiAoZnJhbWUgIT0gbnVsbHB0cikgewotCQkJCWZyYW1lLT5Db250aW51ZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCXN0YXRpYyB2b2lkIENsb3NlV2luZG93ICgpIHsKLQkJaWYgKHdpbmRvdyAhPSBudWxscHRyKSB7Ci0JCQl3aW5kb3ctPkNsb3NlKCk7Ci0JCQl3aW5kb3cgPSBudWxscHRyOwotCQl9Ci0JfQotfTsKLQotCQkJCQkJCQkgCQkgCi0vKiBTaG93IHRoZSBTcGxhc2ggV2luZG93Ci0gKgotICogT3BlbiB0aGUgYml0bWFwLCBpbnNlcnQgaW50byB0aGUgc3BsYXNoIHdpbmRvdyBhbmQgZGlzcGxheSBpdC4KLSAqCi0gKi8KLWludCBzaG93U3BsYXNoKCBjb25zdCBfVENIQVIqIGZlYXR1cmVJbWFnZSApCi17Ci0Jc3RhdGljIGludCBzcGxhc2hpbmcgPSAwOwotICAgCi0JaWYoc3BsYXNoaW5nKSB7Ci0JCS8qc3BsYXNoIHNjcmVlbiBpcyBhbHJlYWR5IHNob3dpbmcsIGRvIG5vdGhpbmcgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChmZWF0dXJlSW1hZ2UgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCQotCS8qIGlmIEphdmEgd2FzIHN0YXJ0ZWQgZmlyc3QgYW5kIGlzIGNhbGxpbmcgYmFjayB0byBzaG93IHRoZSBzcGxhc2gsIHdlIG1pZ2h0IG5vdAotCSAqIGhhdmUgaW5pdGlhbGl6ZWQgdGhlIHdpbmRvdyBzeXN0ZW0geWV0Ci0JICovCi0JaW5pdFdpbmRvd1N5c3RlbSgwLCBOVUxMLCAxKTsKLQkKLSAgICAvKiBMb2FkIHRoZSBiaXRtYXAgZm9yIHRoZSBmZWF0dXJlLiAqLwotICAgIEJpdG1hcFNvdXJjZV4gaW1hZ2UgPSBudWxscHRyOwotICAgIGlmIChmZWF0dXJlSW1hZ2UgIT0gTlVMTCkgewotICAgIAlTdHJpbmdeIHN0cmluZyA9IGdjbmV3IFN0cmluZyAoZmVhdHVyZUltYWdlKTsKLSAgICAJaWYgKEZpbGU6OkV4aXN0cyAoc3RyaW5nKSkgewotCSAgICAJVXJpXiB1cmkgPSBnY25ldyBVcmkgKHN0cmluZyk7Ci0gICAgCQlpbWFnZSA9IGdjbmV3IEJpdG1hcEltYWdlICh1cmkpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIC8qIElmIHRoZSBiaXRtYXAgY291bGQgbm90IGJlIGZvdW5kLCByZXR1cm4gYW4gZXJyb3IuICovCi0gICAgaWYgKGltYWdlID09IG51bGxwdHIpCi0gICAgCXJldHVybiBFUlJPUl9GSUxFX05PVF9GT1VORDsKLQotIAkvKiBDcmVhdGUgYSB3aW5kb3cgdGhhdCBoYXMgbm8gZGVjb3JhdGlvbnMuICovCi0gICAgV2luZG93XiB3aW5kb3cgPSBHbG9iYWxzOjp3aW5kb3cgPSBnY25ldyBXaW5kb3coKTsKLSAgICB3aW5kb3ctPkNsb3NpbmcgKz0gZ2NuZXcgQ2FuY2VsRXZlbnRIYW5kbGVyKCZHbG9iYWxzOjpIYW5kbGVDbG9zaW5nKTsKLSAgICB3aW5kb3ctPldpbmRvd1N0eWxlID0gV2luZG93U3R5bGU6Ok5vbmU7Ci0gICAgd2luZG93LT5TaG93SW5UYXNrYmFyID0gZmFsc2U7Ci0Jd2luZG93LT5SZXNpemVNb2RlID0gUmVzaXplTW9kZTo6Tm9SZXNpemU7Ci0Jd2luZG93LT5XaW5kb3dTdGFydHVwTG9jYXRpb24gPSBXaW5kb3dTdGFydHVwTG9jYXRpb246OkNlbnRlclNjcmVlbjsKLSAgICBLZXlib2FyZE5hdmlnYXRpb246OlNldFRhYk5hdmlnYXRpb24gKHdpbmRvdywgS2V5Ym9hcmROYXZpZ2F0aW9uTW9kZTo6Tm9uZSk7Ci0gICAgCi0gICAgR3JpZF4gZ3JpZCA9IGdjbmV3IEdyaWQoKTsKLSAgICBHcmlkTGVuZ3RoIGxlbmd0aCAoMSwgR3JpZFVuaXRUeXBlOjpBdXRvKTsKLSAgICBDb2x1bW5EZWZpbml0aW9uXiBjb2x1bW4gPSBnY25ldyBDb2x1bW5EZWZpbml0aW9uKCk7Ci0gICAgZ3JpZC0+Q29sdW1uRGVmaW5pdGlvbnMtPkFkZCAoY29sdW1uKTsKLSAgICBjb2x1bW4gPSBnY25ldyBDb2x1bW5EZWZpbml0aW9uKCk7Ci0gICAgY29sdW1uLT5XaWR0aCA9IGxlbmd0aDsgCi0gICAgZ3JpZC0+Q29sdW1uRGVmaW5pdGlvbnMtPkFkZCAoY29sdW1uKTsKLSAgICBSb3dEZWZpbml0aW9uXiByb3cgPSBnY25ldyBSb3dEZWZpbml0aW9uICgpOwotICAgIHJvdy0+SGVpZ2h0ID0gbGVuZ3RoOwotICAgIGdyaWQtPlJvd0RlZmluaXRpb25zLT5BZGQgKHJvdyk7Ci0gICAgcm93ID0gZ2NuZXcgUm93RGVmaW5pdGlvbiAoKTsKLSAgICBncmlkLT5Sb3dEZWZpbml0aW9ucy0+QWRkIChyb3cpOwotICAgIHJvdyA9IGdjbmV3IFJvd0RlZmluaXRpb24gKCk7Ci0gICAgcm93LT5IZWlnaHQgPSBsZW5ndGg7Ci0gICAgZ3JpZC0+Um93RGVmaW5pdGlvbnMtPkFkZCAocm93KTsKLSAgICB3aW5kb3ctPkNvbnRlbnQgPSBncmlkOwotCi0JQ2FudmFzXiBjYW52YXMgPSBnY25ldyBDYW52YXMgKCk7Ci0JY2FudmFzLT5Gb2N1c1Zpc3VhbFN0eWxlID0gbnVsbHB0cjsKLQljYW52YXMtPkZvY3VzYWJsZSA9IHRydWU7Ci0JR3JpZDo6U2V0Um93IChjYW52YXMsIDEpOwotCUdyaWQ6OlNldENvbHVtbiAoY2FudmFzLCAwKTsKLQlncmlkLT5DaGlsZHJlbi0+QWRkIChjYW52YXMpOwotCQotCUltYWdlQnJ1c2heIGJydXNoID0gZ2NuZXcgSW1hZ2VCcnVzaChpbWFnZSk7Ci0JY2FudmFzLT5CYWNrZ3JvdW5kID0gYnJ1c2g7Ci0JCi0Jd2luZG93LT5XaWR0aCA9IGltYWdlLT5XaWR0aDsKLQl3aW5kb3ctPkhlaWdodCA9IGltYWdlLT5IZWlnaHQ7Ci0Jd2luZG93LT5TaG93KCk7Ci0JCi0Jc3BsYXNoaW5nID0gMTsKLQkKLSAgICAvKiBQcm9jZXNzIG1lc3NhZ2VzICovCi0JZGlzcGF0Y2hNZXNzYWdlcygpOwotCXJldHVybiAwOwotfQotCi12b2lkIGRpc3BhdGNoTWVzc2FnZXMoKSB7Ci0JRGlzcGF0Y2hlckZyYW1lXiBmcmFtZSA9IGdjbmV3IERpc3BhdGNoZXJGcmFtZSgpOwotCUdsb2JhbHM6OmZyYW1lID0gZnJhbWU7Ci0JRXZlbnRIYW5kbGVyXiBoYW5kbGVyID0gZ2NuZXcgRXZlbnRIYW5kbGVyICgmR2xvYmFsczo6SGFuZGxlRGlzcGF0Y2hlckluYWN0aXZlKTsKLQlEaXNwYXRjaGVyXiBkaXNwYXRjaGVyID0gRGlzcGF0Y2hlcjo6Q3VycmVudERpc3BhdGNoZXI7Ci0JRGlzcGF0Y2hlckhvb2tzXiBob29rcyA9IGRpc3BhdGNoZXItPkhvb2tzOwotCWhvb2tzLT5EaXNwYXRjaGVySW5hY3RpdmUgKz0gaGFuZGxlcjsKLQlEaXNwYXRjaGVyOjpQdXNoRnJhbWUgKGZyYW1lKTsKLQlob29rcy0+RGlzcGF0Y2hlckluYWN0aXZlIC09IGhhbmRsZXI7Ci0JR2xvYmFsczo6ZnJhbWUgPSBudWxscHRyOwotfQotCi1qbG9uZyBnZXRTcGxhc2hIYW5kbGUoKSB7Ci0JV2luZG93XiB3aW5kb3cgPSBHbG9iYWxzOjp3aW5kb3c7Ci0JcmV0dXJuIChqbG9uZykoaW50KUdDSGFuZGxlOjpUb0ludFB0cihHQ0hhbmRsZTo6QWxsb2Mod2luZG93KSk7Ci19Ci0KLXZvaWQgdGFrZURvd25TcGxhc2goKSB7Ci0JaWYgKGZhbHNlKSB7Ci0JCU5vQXJnc0hhbmRsZXJeIGhhbmRsZXIgPSBnY25ldyBOb0FyZ3NIYW5kbGVyKCZHbG9iYWxzOjpDbG9zZVdpbmRvdyk7Ci0JCURpc3BhdGNoZXI6OkN1cnJlbnREaXNwYXRjaGVyLT5CZWdpbkludm9rZShEaXNwYXRjaGVyUHJpb3JpdHk6OlNlbmQsIGhhbmRsZXIpOwotCX0gZWxzZSB7Ci0JCVdpbmRvd14gd2luZG93ID0gR2xvYmFsczo6d2luZG93OwotCQlpZih3aW5kb3cgIT0gbnVsbHB0cikgewotCQkJd2luZG93LT5DbG9zZSAoKTsKLQkJCXdpbmRvdyA9IG51bGxwdHI7Ci0JCQlkaXNwYXRjaE1lc3NhZ2VzKCk7Ci0JCX0KLQl9Ci19Ci0KLS8qIEdldCB0aGUgd2luZG93IHN5c3RlbSBzcGVjaWZpYyBWTSBhcmdzICovCi1fVENIQVIqKiBnZXRBcmdWTSggX1RDSEFSICp2bSApCi17Ci0JcmV0dXJuIGFyZ1ZNOwotfQotCi0vKiBMb2NhbCBmdW5jdGlvbnMgKi8KLQotLyoKLSAqIEZpbmQgdGhlIFZNIHNoYXJlZCBsaWJyYXJ5IHN0YXJ0aW5nIGZyb20gdGhlIGphdmEgZXhlY3V0YWJsZSAKLSAqLwotX1RDSEFSICogZmluZFZNTGlicmFyeSggX1RDSEFSKiBjb21tYW5kICkgewotCV9UQ0hBUiogbGliID0gZmluZExpYihjb21tYW5kKTsKLQlpZiggbGliICE9IE5VTEwgKSB7Ci0JCWFkanVzdFNlYXJjaFBhdGgobGliKTsKLQl9Ci0JcmV0dXJuIGxpYjsKLX0KLQotdm9pZCBhZGp1c3RTZWFyY2hQYXRoKCBfVENIQVIqIHZtTGliICl7Ci0JX1RDSEFSICoqIHBhdGhzOwotCV9UQ0hBUiAqIHBhdGggPSBOVUxMLCAqbmV3UGF0aCA9IE5VTEw7Ci0JX1RDSEFSICogYnVmZmVyLCAqYzsKLQlpbnQgaSwgbGVuZ3RoOwotCWludCBuZWVkQWRqdXN0ID0gMCwgZnJlZVBhdGggPSAwOwotCQotCS8qIHdlIHdhbnQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBsaWJyYXJ5LCBhbmQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhhdCAqLwotCXBhdGhzID0gZ2V0Vk1MaWJyYXJ5U2VhcmNoUGF0aCh2bUxpYik7Ci0JCi0JLyogZmlyc3QgY2FsbCB0byBHZXRFbnZpcm9ubWVudFZhcmlhYmxlIHRlbGxzIHVzIGhvdyBiaWcgdG8gbWFrZSB0aGUgYnVmZmVyICovCi0JbGVuZ3RoID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZShfVF9FQ0xJUFNFKCJQQVRIIiksIHBhdGgsIDApOwotCWlmIChsZW5ndGggPiAwKSB7Ci0JCXBhdGggPSAoX1RDSEFSKiltYWxsb2MobGVuZ3RoICogc2l6ZW9mKF9UQ0hBUikpOwotCQlHZXRFbnZpcm9ubWVudFZhcmlhYmxlKF9UX0VDTElQU0UoIlBBVEgiKSwgcGF0aCwgbGVuZ3RoKTsKLQkJbmVlZEFkanVzdCA9ICFjb250YWluc1BhdGhzKHBhdGgsIHBhdGhzKTsKLQkJZnJlZVBhdGggPSAxOwotCX0gZWxzZSB7Ci0JCXBhdGggPSBfVF9FQ0xJUFNFKCIiKTsKLQkJZnJlZVBhdGggPSAwOwotCQluZWVkQWRqdXN0ID0gMTsKLQl9Ci0KLQlpZiAobmVlZEFkanVzdCkgewotCQljID0gY29uY2F0U3RyaW5ncyhwYXRocyk7Ci0JCW5ld1BhdGggPSAoX1RDSEFSKiltYWxsb2MoKF90Y3NsZW4oYykgKyBsZW5ndGggKyAxKSAqIHNpemVvZihfVENIQVIpKTsKLQkJX3N0cHJpbnRmKG5ld1BhdGgsIF9UX0VDTElQU0UoIiVzJXMiKSwgYywgcGF0aCk7Ci0JCVNldEVudmlyb25tZW50VmFyaWFibGUoIF9UX0VDTElQU0UoIlBBVEgiKSwgbmV3UGF0aCk7Ci0JCWZyZWUoYyk7Ci0JCWZyZWUobmV3UGF0aCk7Ci0JfQotCQotCWZvciAoaSA9IDA7IGkgPCAyICYmIHBhdGhzW2ldICE9IE5VTEw7IGkrKykKLQkJZnJlZShwYXRoc1tpXSk7Ci0JZnJlZShwYXRocyk7Ci0JaWYgKGZyZWVQYXRoKQotCQlmcmVlKHBhdGgpOwotfQotCi1zdGF0aWMgX1RDSEFSKiBmaW5kTGliKCBfVENIQVIqIGNvbW1hbmQgKSB7Ci0JaW50IGksIGo7Ci0JaW50IHBhdGhMZW5ndGg7CQotCXN0cnVjdCBfc3RhdCBzdGF0czsKLQlfVENIQVIgKiBwYXRoOwkJCQkvKiBwYXRoIHRvIHJlc3VsdGluZyBqdm0gc2hhcmVkIGxpYnJhcnkgKi8KLQlfVENIQVIgKiBsb2NhdGlvbjsJCQkvKiBwb2ludHMgdG8gYmVnaW5pbmcgb2YganZtTG9jYXRpb25zIHNlY3Rpb24gb2YgcGF0aCAqLwotCQotCS8qIGZvciBsb29raW5nIGluIHRoZSByZWdpc3RyeSAqLwotCUhLRVkganJlS2V5ID0gTlVMTDsKLQlEV09SRCBsZW5ndGggPSBNQVhfUEFUSDsKLQlfVENIQVIga2V5TmFtZVtNQVhfUEFUSF07Ci0JX1RDSEFSICoganJlS2V5TmFtZTsJCQotCQotCWlmIChjb21tYW5kICE9IE5VTEwpIHsKLQkJbG9jYXRpb24gPSBsYXN0RGlyU2VwYXJhdG9yKCBjb21tYW5kICkgKyAxOwotCQkKLQkJLypjaGVjayBmaXJzdCB0byBzZWUgaWYgY29tbWFuZCBhbHJlYWR5IHBvaW50cyB0byB0aGUgbGlicmFyeSAqLwotCQlpZiAoaXNWTUxpYnJhcnkoY29tbWFuZCkpIHsKLQkJCWlmIChfdHN0YXQoIGNvbW1hbmQsICZzdGF0cyApID09IDAgJiYgKHN0YXRzLnN0X21vZGUgJiBTX0lGUkVHKSAhPSAwKQotCQkJCXJldHVybiBjb21tYW5kOyAJLyogZXhpc3RzICovCi0JCQlyZXR1cm4gTlVMTDsgLyogZG9lc24ndCBleGlzdCAqLwotCQl9Ci0JCQotCQlwYXRoTGVuZ3RoID0gbG9jYXRpb24gLSBjb21tYW5kOwotCQlwYXRoID0gKF9UQ0hBUiAqKW1hbGxvYygocGF0aExlbmd0aCArIE1BWF9MT0NBVElPTl9MRU5HVEggKyAxICsgX3Rjc2xlbih2bUxpYnJhcnkpICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0JCV90Y3NuY3B5KHBhdGgsIGNvbW1hbmQsIHBhdGhMZW5ndGgpOwotCQlsb2NhdGlvbiA9ICZwYXRoW3BhdGhMZW5ndGhdOwotCQkgCi0JCS8qIAotCQkgKiBXZSBhcmUgdHJ5aW5nIGJhc2UvanZtTG9jYXRpb25zWypdL3ZtTGlicmFyeQotCQkgKiB3aGVyZSBiYXNlIGlzIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZ2l2ZW4gamF2YSBjb21tYW5kLCBub3JtYWxseSBqcmUvYmluCi0JCSAqLwotCQlpID0gLTE7Ci0JCXdoaWxlKGp2bUxvY2F0aW9uc1srK2ldICE9IE5VTEwpIHsKLQkJCV9zdHByaW50Zihsb2NhdGlvbiwgX1RfRUNMSVBTRSgiJXMlYyVzIiksIGp2bUxvY2F0aW9uc1tpXSwgZGlyU2VwYXJhdG9yLCB2bUxpYnJhcnkpOwotCQkJaWYgKF90c3RhdCggcGF0aCwgJnN0YXRzICkgPT0gMCAmJiAoc3RhdHMuc3RfbW9kZSAmIFNfSUZSRUcpICE9IDApCi0JCQl7CS8qIGZvdW5kIGl0ICovCi0JCQkJcmV0dXJuIHBhdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogTm90IGZvdW5kIHlldCwgdHJ5IHRoZSByZWdpc3RyeSwgd2Ugd2lsbCB1c2UgdGhlIGZpcnN0IHZtID49IDEuNCAqLwotCWpyZUtleU5hbWUgPSBfVCgiU29mdHdhcmVcXEphdmFTb2Z0XFxKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQiKTsKLQlpZiAoUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwganJlS2V5TmFtZSwgMCwgS0VZX1JFQUQsICZqcmVLZXkpID09IEVSUk9SX1NVQ0NFU1MpIHsKLQkJaWYoUmVnUXVlcnlWYWx1ZUV4KGpyZUtleSwgX1RfRUNMSVBTRSgiQ3VycmVudFZlcnNpb24iKSwgTlVMTCwgTlVMTCwgKExQQllURSkma2V5TmFtZSwgJmxlbmd0aCkgPT0gRVJST1JfU1VDQ0VTUykgewotCQkJcGF0aCA9IGNoZWNrVk1SZWdpc3RyeUtleShqcmVLZXksIGtleU5hbWUpOwotCQkJaWYgKHBhdGggIT0gTlVMTCkgewotCQkJCVJlZ0Nsb3NlS2V5KGpyZUtleSk7Ci0JCQkJcmV0dXJuIHBhdGg7Ci0JCQl9Ci0JCX0KLQkJaiA9IDA7Ci0JCWxlbmd0aCA9IE1BWF9QQVRIOwotCQl3aGlsZSAoUmVnRW51bUtleUV4KGpyZUtleSwgaisrLCBrZXlOYW1lLCAmbGVuZ3RoLCAwLCAwLCAwLCAwKSA9PSBFUlJPUl9TVUNDRVNTKSB7ICAKLQkJCS8qbG9vayBmb3IgYSAxLjQgb3IgMS41IHZtKi8gCi0JCQlpZiggX3Rjc25jbXAoX1QoIjEuNCIpLCBrZXlOYW1lLCAzKSA8PSAwICkgewotCQkJCXBhdGggPSBjaGVja1ZNUmVnaXN0cnlLZXkoanJlS2V5LCBrZXlOYW1lKTsKLQkJCQlpZiAocGF0aCAhPSBOVUxMKSB7Ci0JCQkJCVJlZ0Nsb3NlS2V5KGpyZUtleSk7Ci0JCQkJCXJldHVybiBwYXRoOwotCQkJCX0KLQkJCX0KLQkJfQotCQlSZWdDbG9zZUtleShqcmVLZXkpOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIHN1YktleU5hbWUgc3ViS2V5IG9mIGpyZUtleSBhbmQgbG9vayB0byBzZWUgaWYgaXQgaGFzIGEgVmFsdWUgCi0gKiAiUnVudGltZUxpYiIgd2hpY2ggcG9pbnRzIHRvIGEganZtIGxpYnJhcnkgd2UgY2FuIHVzZSAKLSAqIAotICogRG9lcyBub3QgY2xvc2UganJlS2V5Ci0gKi8KLXN0YXRpYyBfVENIQVIqIGNoZWNrVk1SZWdpc3RyeUtleShIS0VZIGpyZUtleSwgX1RDSEFSKiBzdWJLZXlOYW1lKSB7Ci0JX1RDSEFSIHZhbHVlW01BWF9QQVRIXTsKLQlIS0VZIHN1YktleSA9IE5VTEw7Ci0JRFdPUkQgbGVuZ3RoID0gTUFYX1BBVEg7Ci0JX1RDSEFSICpyZXN1bHQgPSBOVUxMOwotCXN0cnVjdCBfc3RhdCBzdGF0czsKLQkKLQlpZihSZWdPcGVuS2V5RXgoanJlS2V5LCBzdWJLZXlOYW1lLCAwLCBLRVlfUkVBRCwgJnN1YktleSkgPT0gRVJST1JfU1VDQ0VTUykgewkJCQkKLQkJLypUaGUgUnVudGltZUxpYiB2YWx1ZSBzaG91bGQgcG9pbnQgdG8gdGhlIGxpYnJhcnkgd2Ugd2FudCovCi0JCWlmKFJlZ1F1ZXJ5VmFsdWVFeChzdWJLZXksIF9UKCJSdW50aW1lTGliIiksIE5VTEwsIE5VTEwsIChMUEJZVEUpJnZhbHVlLCAmbGVuZ3RoKSA9PSBFUlJPUl9TVUNDRVNTKSB7Ci0JCQlpZiAoX3RzdGF0KCB2YWx1ZSwgJnN0YXRzICkgPT0gMCAmJiAoc3RhdHMuc3RfbW9kZSAmIFNfSUZSRUcpICE9IDApCi0JCQl7CS8qbGlicmFyeSBleGlzdHMqLwotCQkJCXJlc3VsdCA9IF90Y3NkdXAodmFsdWUpOwotCQkJfQotCQl9Ci0JCVJlZ0Nsb3NlS2V5KHN1YktleSk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBfVENIQVIqIGJ1aWxkQ29tbWFuZExpbmUoIF9UQ0hBUiogcHJvZ3JhbSwgX1RDSEFSKiBhcmdzW10gKQotewotCWludCAgIGluZGV4LCBsZW5ndGggPSAwLCBzbGFzaDsKLQlfVENIQVIgKmNvbW1hbmRMaW5lLCAqY2gsICpzcGFjZTsKLQotCS8qCi0JKiBCdWlsZCB0aGUgY29tbWFuZCBsaW5lLiBBbnkgYXJndW1lbnQgd2l0aCBzcGFjZXMgbXVzdCBiZSBpbgotCSogZG91YmxlIHF1b3RlcyBpbiB0aGUgY29tbWFuZCBsaW5lLiAKLQkqLwotCWlmKHByb2dyYW0gIT0gTlVMTCkgCi0JCWxlbmd0aCA9IF90Y3NsZW4ocHJvZ3JhbSkgKyAxOwotCWZvciAoaW5kZXggPSAwOyBhcmdzW2luZGV4XSAhPSBOVUxMOyBpbmRleCsrKQotCXsKLQkJLyogU3RyaW5nIGxlbmd0aCBwbHVzIHNwYWNlIGNoYXJhY3RlciAqLwotCQlsZW5ndGggKz0gX3Rjc2xlbiggYXJnc1sgaW5kZXggXSApICsgMTsKLQkJLyogUXVvdGVzICsgcG90ZW50aWFsIGVzY2FwaW5nICdcJyAqLwotCQlpZiAoX3Rjc2NociggYXJnc1sgaW5kZXggXSwgX1QoJyAnKSApICE9IE5VTEwpIGxlbmd0aCArPSAzOwotCX0KLQkKLQljb21tYW5kTGluZSA9IGNoID0gKF9UQ0hBUiAqKW1hbGxvYyAoIChsZW5ndGggKyAxKSAqIHNpemVvZihfVENIQVIpICk7Ci0JaWYgKHByb2dyYW0gIT0gTlVMTCkgewotCQlfdGNzY3B5KGNoLCBwcm9ncmFtKTsKLQkJY2ggKz0gX3Rjc2xlbihwcm9ncmFtKTsKLQkJKmNoKysgPSBfVCgnICcpOwotCX0KLQlmb3IgKGluZGV4ID0gMDsgYXJnc1tpbmRleF0gIT0gTlVMTDsgaW5kZXgrKykKLQl7Ci0JCXNwYWNlID0gX3Rjc2NociggYXJnc1sgaW5kZXggXSwgX1QoJyAnKSk7Ci0JCWlmIChzcGFjZSAhPSBOVUxMKSAqY2grKyA9IF9UKCdcIicpOwotCQlfdGNzY3B5KCBjaCwgYXJnc1tpbmRleF0gKTsKLQkJY2ggKz0gX3Rjc2xlbiggYXJnc1tpbmRleF0gKTsKLQkJaWYgKHNwYWNlICE9IE5VTEwpIHsKLQkJCWlmICggKihjaCAtIDEpID09IF9UKCdcXCcpICkgewotCQkJCS8qIGVzY2FwZSBhIHRyYWlsaW5nIHVuZXNjYXBlZCAnXCcgb3IgaXQgd2lsbCBlc2NhcGUgb3VyIGNsb3NpbmcgJyInIGFuZCBtZXNzIHRoaW5ncyB1cCAqLwotCQkJCXNsYXNoID0gMTsKLQkJCQl3aGlsZSAoICooY2ggLSAxIC0gc2xhc2gpID09IF9UKCdcXCcpKSBzbGFzaCsrOwotCQkJCWlmIChzbGFzaCAlIDIpICpjaCsrID0gX1QoJ1xcJyk7Ci0JCQl9Ci0JCQkqY2grKyA9IF9UKCdcIicpOwotCQl9Ci0JCSpjaCsrID0gX1QoJyAnKTsKLQl9Ci0JKmNoID0gX1QoJ1wwJyk7Ci0JcmV0dXJuIGNvbW1hbmRMaW5lOwotfQotdm9pZCByZXN0YXJ0TGF1bmNoZXIoIF9UQ0hBUiogcHJvZ3JhbSwgX1RDSEFSKiBhcmdzW10gKQotewotCV9UQ0hBUiogY29tbWFuZExpbmUgPSBidWlsZENvbW1hbmRMaW5lKHByb2dyYW0sIGFyZ3MpOwotCQotCXsKLQlTVEFSVFVQSU5GTyAgICBzaTsKLSAgICBQUk9DRVNTX0lORk9STUFUSU9OICBwaTsKLSAgICBHZXRTdGFydHVwSW5mbygmc2kpOwotICAgIGlmIChDcmVhdGVQcm9jZXNzKE5VTEwsIGNvbW1hbmRMaW5lLCBOVUxMLCBOVUxMLCBUUlVFLCAwLCBOVUxMLCBOVUxMLCAmc2ksICZwaSkpIHsKLSAgICAJQ2xvc2VIYW5kbGUoIHBpLmhUaHJlYWQgKTsKLSAgICB9ICAgCi0JfQotCWZyZWUoY29tbWFuZExpbmUpOwotfQotCi1KYXZhUmVzdWx0cyogbGF1bmNoSmF2YVZNKCBfVENIQVIqIGFyZ3NbXSApCi17Ci0JTVNHIG1zZzsKLQlfVENIQVIqIGNvbW1hbmRMaW5lOwotCWp2bVByb2Nlc3MgPSAtMTsKLQljb21tYW5kTGluZSA9IGJ1aWxkQ29tbWFuZExpbmUoTlVMTCwgYXJncyk7Ci0JanZtUmVzdWx0cyA9IChKYXZhUmVzdWx0cyopIG1hbGxvYyhzaXplb2YoSmF2YVJlc3VsdHMpKTsKLQltZW1zZXQoanZtUmVzdWx0cywgMCwgc2l6ZW9mKEphdmFSZXN1bHRzKSk7Ci0JCi0JLyoKLQkqIFN0YXJ0IHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZS4gVXNlIENyZWF0ZVByb2Nlc3MoKSBpbnN0ZWFkIG9mIHNwYXdudigpCi0JKiBvdGhlcndpc2UgdGhlIGFyZ3VtZW50cyBjYW5ub3QgYmUgZnJlZWQgc2luY2Ugc3Bhd252KCkgc2VnbWVudHMgZmF1bHQuCi0JKi8KLQl7Ci0JU1RBUlRVUElORk8gICAgc2k7Ci0gICAgUFJPQ0VTU19JTkZPUk1BVElPTiAgcGk7Ci0gICAgR2V0U3RhcnR1cEluZm8oJnNpKTsKLSAgICBpZiAoQ3JlYXRlUHJvY2VzcyhOVUxMLCBjb21tYW5kTGluZSwgTlVMTCwgTlVMTCwgVFJVRSwgMCwgTlVMTCwgTlVMTCwgJnNpLCAmcGkpKSB7Ci0gICAJCUNsb3NlSGFuZGxlKCBwaS5oVGhyZWFkICk7Ci0gICAgCWp2bVByb2Nlc3MgPSAoaW50KXBpLmhQcm9jZXNzOwotICAgIH0KLQl9Ci0KLQlmcmVlKCBjb21tYW5kTGluZSApOwotCi0JLyogSWYgdGhlIGNoaWxkIHByb2Nlc3MgKEpWTSkgd291bGQgbm90IHN0YXJ0ICovCi0JaWYgKGp2bVByb2Nlc3MgPT0gLTEpCi0JewotCQkvKiBSZXR1cm4gdGhlIGVycm9yIG51bWJlci4gKi8KLQkJanZtUmVzdWx0cy0+bGF1bmNoUmVzdWx0ID0gZXJybm87Ci0JCWp2bVByb2Nlc3MgID0gMDsKLQl9Ci0KLQkvKiBlbHNlICovCi0JZWxzZQotCXsKLQkgCi0gICAgICAvKiBTZXQgYSB0aW1lciB0byBkZXRlY3QgSlZNIHByb2Nlc3MgdGVybWluYXRpb24uICovCi0JCURpc3BhdGNoZXJUaW1lcl4gdGltZXIgPSBnY25ldyBEaXNwYXRjaGVyVGltZXIoKTsKLQkJdGltZXItPkludGVydmFsID0gVGltZVNwYW46OkZyb21NaWxsaXNlY29uZHMgKGp2bUV4aXRUaW1lb3V0KTsKLQkJdGltZXItPlRpY2sgKz0gZ2NuZXcgRXZlbnRIYW5kbGVyKCZHbG9iYWxzOjpIYW5kbGVUaW1lcik7Ci0JCQotICAgIAkvKiBQcm9jZXNzIG1lc3NhZ2VzIHVudGlsIHRoZSBKVk0gdGVybWluYXRlcy4KLSAgICAJICAgVGhpcyBsYXVuY2hlciBwcm9jZXNzIG11c3QgY29udGludWUgdG8gcHJvY2VzcyBldmVudHMgdW50aWwgdGhlIEpWTSBleGl0cwotICAgIAkgICBvciBlbHNlIFdpbmRvd3MgMksgd2lsbCBoYW5nIGlmIHRoZSBkZXNrdG9wIHByb3BlcnRpZXMgKGUuZy4sIGJhY2tncm91bmQpIGFyZQotICAgIAkgICBjaGFuZ2VkIGJ5IHRoZSB1c2VyLiBXaW5kb3dzIGRvZXMgYSBTZW5kTWVzc2FnZSgpIHRvIGV2ZXJ5IHRvcCBsZXZlbCB3aW5kb3cKLSAgICAJICAgcHJvY2Vzcywgd2hpY2ggYmxvY2tzIHRoZSBjYWxsZXIgdW50aWwgdGhlIHByb2Nlc3MgcmVzcG9uZHMuICovCi0gICAgCSAgIAotCQlEaXNwYXRjaGVyRnJhbWVeIGZyYW1lID0gZ2NuZXcgRGlzcGF0Y2hlckZyYW1lKCk7Ci0JCUdsb2JhbHM6OmZyYW1lID0gZnJhbWU7Ci0JCXRpbWVyLT5TdGFydCgpOwotCQlEaXNwYXRjaGVyOjpQdXNoRnJhbWUoZnJhbWUpOwotCQlHbG9iYWxzOjpmcmFtZSA9IG51bGxwdHI7Ci0JCXRpbWVyLT5TdG9wKCk7Ci0gICAgICAKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGV4aXQgY29kZSBmcm9tIHRoZSBKVk0uICovCi0JcmV0dXJuIGp2bVJlc3VsdHM7Ci19Ci0KLS8qIERldGVjdCBKVk0gUHJvY2VzcyBUZXJtaW5hdGlvbiAqLwotc3RhdGljIHZvaWQgQ0FMTEJBQ0sgZGV0ZWN0SnZtRXhpdCAoKQotewotICAgIERXT1JEICAgZXhpdENvZGU7Ci0gICAgLyogSWYgdGhlIEpWTSBwcm9jZXNzIGhhcyB0ZXJtaW5hdGVkICovCi0gICAgaWYgKCFHZXRFeGl0Q29kZVByb2Nlc3MoIChIQU5ETEUpanZtUHJvY2VzcywgJmV4aXRDb2RlICkgfHwKLSAgICAJCSBleGl0Q29kZSAhPSBTVElMTF9BQ1RJVkUpCi0gICAgewotICAgIAkvKiBTYXZlIHRoZSBKVk0gZXhpdCBjb2RlLiBUaGlzIHNob3VsZCBjYXVzZSB0aGUgbG9vcCBpbiBsYXVuY2hKYXZhVk0oKSB0byBleGl0LiAqLwotICAgIAlqdm1SZXN1bHRzLT5ydW5SZXN1bHQgPSBleGl0Q29kZTsKLSAgICAgICAganZtUHJvY2VzcyA9IDA7Ci0gICAgfQotfQotCi12b2lkIHByb2Nlc3NWTUFyZ3MoX1RDSEFSICoqdm1hcmdzW10gKSB7Ci0vLwkvKiBub3RoaW5nIHlldCAqLwotfQotCi1KYXZhUmVzdWx0cyogc3RhcnRKYXZhVk0oIF9UQ0hBUiogbGliUGF0aCwgX1RDSEFSKiB2bUFyZ3NbXSwgX1RDSEFSKiBwcm9nQXJnc1tdLCBfVENIQVIqIGphckZpbGUgKQotewotCXJldHVybiBzdGFydEphdmFKTkkobGliUGF0aCwgdm1BcmdzLCBwcm9nQXJncywgamFyRmlsZSk7Ci19Ci0KLWludCBpc1N1blZNKCBfVENIQVIgKiBqYXZhVk0sIF9UQ0hBUiAqIGpuaUxpYiApIHsKLQlfVENIQVIgKnZtID0gKGpuaUxpYiAhPSBOVUxMKSA/IGpuaUxpYiA6IGphdmFWTTsKLQlpbnQgcmVzdWx0ID0gMDsKLQlEV09SRCBpbmZvU2l6ZTsKLQlEV09SRCBoYW5kbGU7Ci0Jdm9pZCAqIGluZm87Ci0JCi0JX1RDSEFSICoga2V5LCAqdmFsdWU7Ci0Jc2l6ZV90IGk7Ci0JaW50IHZhbHVlU2l6ZTsKLQkKLQlpZiAodm0gPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JCi0JaW5mb1NpemUgPSBHZXRGaWxlVmVyc2lvbkluZm9TaXplKHZtLCAmaGFuZGxlKTsKLQlpZiAoaW5mb1NpemUgPiAwKSB7Ci0JCWluZm8gPSBtYWxsb2MoaW5mb1NpemUpOwotCQlpZiAoR2V0RmlsZVZlcnNpb25JbmZvKHZtLCAwLCAgaW5mb1NpemUsIGluZm8pKSB7Ci0JCQlUUkFOU0xBVElPTlMgKiB0cmFuc2xhdGlvbnM7Ci0JCQlpbnQgdHJhbnNsYXRpb25zU2l6ZTsKLQkJCVZlclF1ZXJ5VmFsdWUoaW5mbywgIF9UX0VDTElQU0UoIlxcVmFyRmlsZUluZm9cXFRyYW5zbGF0aW9uIiksIChMUFZPSUQgKikgJnRyYW5zbGF0aW9ucywgKFBVSU5UKSZ0cmFuc2xhdGlvbnNTaXplKTsKLQkJCQotCQkJLyogdGhpcyBzaXplIGlzIG9ubHkgcmlnaHQgYmVjYXVzZSAlMDR4IGlzIDQgY2hhcmFjdGVycyAqLwotCQkJa2V5ID0gKF9UQ0hBUiAqKSBtYWxsb2MoIChfdGNzbGVuKENPTVBBTllfTkFNRV9LRVkpICsgMSkgKiBzaXplb2YoX1RDSEFSKSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgKHRyYW5zbGF0aW9uc1NpemUgLyBzaXplb2YoVFJBTlNMQVRJT05TKSk7IGkrKykgewotCQkJCV9zdHByaW50ZihrZXksIENPTVBBTllfTkFNRV9LRVksIHRyYW5zbGF0aW9uc1tpXS5sYW5ndWFnZSwgdHJhbnNsYXRpb25zW2ldLmNvZGVwYWdlKTsKLQkJCQkKLQkJCQlWZXJRdWVyeVZhbHVlKGluZm8sIGtleSwgKExQVk9JRCAqKSZ2YWx1ZSwgKFBVSU5UKSZ2YWx1ZVNpemUpOwotCQkJCWlmIChfdGNzbmNtcCh2YWx1ZSwgU1VOX01JQ1JPU1lTVEVNUywgX3Rjc2xlbihTVU5fTUlDUk9TWVNURU1TKSkgPT0gMCkgewotCQkJCQlyZXN1bHQgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlmcmVlKGtleSk7Ci0JCX0KLQkJZnJlZShpbmZvKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHJldXNlV29ya2JlbmNoKF9UQ0hBUioqIGZpbGVQYXRoLCBpbnQgdGltZW91dCkgewotCS8qIG5vdCBpbXBsZW1lbnRlZCBmb3IgV1BGICovCi0JcmV0dXJuIC0xOwotfQotfSAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9lY2xpcHNlV3BmQ29tbW9uLmNwcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd3BmL2VjbGlwc2VXcGZDb21tb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGFhOGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL2xpYnJhcnkvd3BmL2VjbGlwc2VXcGZDb21tb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQW5kcmV3IE5pZWZlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0KLWV4dGVybiAiQyIgewotCi0jaW5jbHVkZSAiZWNsaXBzZUNvbW1vbi5oIgotI2luY2x1ZGUgImVjbGlwc2VPUy5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGNvbW1jdHJsLmg+Ci0KLQotI2RlZmluZSBFQ0xJUFNFX0lDT04gIDQwMQotCi1fVENIQVIgICBkaXJTZXBhcmF0b3IgID0gX1QoJ1xcJyk7Ci1fVENIQVIgICBwYXRoU2VwYXJhdG9yID0gX1QoJzsnKTsKLQotc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0KLS8qIExvYWQgdGhlIHNwZWNpZmllZCBzaGFyZWQgbGlicmFyeQotICovCi12b2lkICogbG9hZExpYnJhcnkoIF9UQ0hBUiAqIGxpYnJhcnkgKXsKLQlyZXR1cm4gKHZvaWQgKilMb2FkTGlicmFyeShsaWJyYXJ5KTsKLX0KLQotLyogVW5sb2FkIHRoZSBzaGFyZWQgbGlicmFyeQotICovCi12b2lkIHVubG9hZExpYnJhcnkoIHZvaWQgKiBoYW5kbGUgKXsKLQlGcmVlTGlicmFyeSgoSE1PRFVMRSloYW5kbGUpOwotfQotIAotLyogRmluZCB0aGUgZ2l2ZW4gc3ltYm9sIGluIHRoZSBzaGFyZWQgbGlicmFyeQotICovCi12b2lkICogZmluZFN5bWJvbCggdm9pZCAqIGhhbmRsZSwgX1RDSEFSICogc3ltYm9sICl7Ci0JY2hhciAqIHN0ciA9IE5VTEw7Ci0Jdm9pZCAqIHJlc3VsdDsKLQkKLQlzdHIgPSB0b05hcnJvdyhzeW1ib2wpOwotCXJlc3VsdCA9IEdldFByb2NBZGRyZXNzKChITU9EVUxFKWhhbmRsZSwgc3RyKTsKLQlmcmVlKHN0cik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotX1RDSEFSKiByZXNvbHZlU3ltbGlua3MoIF9UQ0hBUiogcGF0aCApIHsKLQkvKiBubyBzeW1saW5rcyBvbiB3aW5kb3dzICovCi0JcmV0dXJuIHBhdGg7Ci19Ci0KLX0gLy9lbmQgZXh0ZXJuIEMKLQotLyogRGlzcGxheSBhIE1lc3NhZ2UgKi8KLXZvaWQgZGlzcGxheU1lc3NhZ2UoIF9UQ0hBUiogdGl0bGUsIF9UQ0hBUiogbWVzc2FnZSApCi17Ci0JaWYoIWluaXRpYWxpemVkKSAKLQkJaW5pdFdpbmRvd1N5c3RlbSgwLCBOVUxMLCAwKTsKLQkKLQlTeXN0ZW06OlN0cmluZ14gdGl0bGVTdHIgPSBnY25ldyBTeXN0ZW06OlN0cmluZyAodGl0bGUpOwotCVN5c3RlbTo6U3RyaW5nXiBtZXNzYWdlU3RyID0gZ2NuZXcgU3lzdGVtOjpTdHJpbmcgKG1lc3NhZ2UpOwkJCi0JU3lzdGVtOjpXaW5kb3dzOjpNZXNzYWdlQm94OjpTaG93IChtZXNzYWdlU3RyLCB0aXRsZVN0ciwgIFN5c3RlbTo6V2luZG93czo6TWVzc2FnZUJveEJ1dHRvbjo6T0spOwotfQotCi0vKiBJbml0aWFsaXplIFdpbmRvdyBTeXN0ZW0KLSAqCi0gKiBDcmVhdGUgYSBwb3Agd2luZG93IHRvIGRpc3BsYXkgdGhlIGJpdG1hcCBpbWFnZS4KLSAqCi0gKiBSZXR1cm4gdGhlIHdpbmRvdyBoYW5kbGUgYXMgdGhlIGRhdGEgZm9yIHRoZSBzcGxhc2ggY29tbWFuZC4KLSAqCi0gKi8KLWludCBpbml0V2luZG93U3lzdGVtKCBpbnQqIHBBcmdjLCBfVENIQVIqIGFyZ3ZbXSwgaW50IHNob3dTcGxhc2ggKQotewotCQotCWlmKGluaXRpYWxpemVkKQotCQlyZXR1cm4gMDsKLQlpbml0aWFsaXplZCA9IDE7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9tYWtlX3dwZi5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWJyYXJ5L3dwZi9tYWtlX3dwZi5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOTg5NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGlicmFyeS93cGYvbWFrZV93cGYubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgS2V2aW4gQ29ybmVsbCAoUmF0aW9uYWwgU29mdHdhcmUgQ29ycG9yYXRpb24pCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIE1ha2VmaWxlIGZvciBjcmVhdGluZyB0aGUgZWNsaXBzZSBsYXVuY2hlciBwcm9ncmFtLgotCi0jIFRoaXMgbWFrZWZpbGUgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQ6Ci0jCi0jIFBST0dSQU1fT1VUUFVUICAtIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGV4ZWN1dGFibGUKLSMgUFJPR1JBTV9MSUJSQVJZIC0gdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZGxsIGxpYnJhcnkKLSMgREVGQVVMVF9PUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItb3MiIHN3aXRjaAotIyBERUZBVUxUX09TX0FSQ0ggLSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgIi1hcmNoIiBzd2l0Y2gKLSMgREVGQVVMVF9XUyAgICAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICItd3MiIHN3aXRjaAotIyBKQVZBX0hPTUUgICAgICAgLSB0aGUgbG9jYXRpb24gb2YgdGhlIEphdmEgZm9yIEpOSSBpbmNsdWRlcwotTk9ERUJVRz0xCi0haW5jbHVkZSA8Li5cbWFrZV92ZXJzaW9uLm1haz4KLQotUFJPR1JBTV9MSUJSQVJZID0gZWNsaXBzZV8kKExJQl9WRVJTSU9OKS5kbGwKLVBST0dSQU1fT1VUUFVUPWVjbGlwc2UuZXhlCi0jIFNlcGFyYXRlIGZpbGVuYW1lIGZyb20gZXh0ZW50aW9uCi1QUk9HUkFNX05BTUU9JChQUk9HUkFNX09VVFBVVDouZXhlPSkKLQotIyBEZWZpbmUgdGhlIG9iamVjdCBtb2R1bGVzIHRvIGJlIGNvbXBpbGVkIGFuZCBmbGFncy4KLU1BSU5fT0JKUyA9IGVjbGlwc2VNYWluLm9iaiAgCi1DT01NT05fT0JKUyA9IGVjbGlwc2VDb25maWcub2JqIGVjbGlwc2VDb21tb24ub2JqICBlY2xpcHNlV3BmQ29tbW9uLm9iagotRExMX09CSlMJPSBlY2xpcHNlLm9iaiAgZWNsaXBzZVdwZi5vYmogIGVjbGlwc2VVdGlsLm9iaiAgZWNsaXBzZUpOSS5vYmogZWNsaXBzZVNobS5vYmoKLQotTElCUyAgID0ga2VybmVsMzIubGliIG1zdmNydC5saWIgbXNjb3JlZS5saWIKLURMTF9MSUJTID0ga2VybmVsMzIubGliIEFkdmFwaTMyLmxpYiBtc3ZjcnQubGliIHZlcnNpb24ubGliCi1MRkxBR1MgPSAgLUNMUlRIUkVBREFUVFJJQlVURTpTVEEgL05PREVGQVVMVExJQjpMSUJDTVQgL0lOQ1JFTUVOVEFMOk5PIC9SRUxFQVNFIC9OT0xPR08gLXN1YnN5c3RlbTp3aW5kb3dzLDQuMCAtZW50cnk6d21haW5DUlRTdGFydHVwCi1DT05TT0xFRkxBR1MgPSAgLUNMUlRIUkVBREFUVFJJQlVURTpTVEEgL05PREVGQVVMVExJQjpMSUJDTVQgL0lOQ1JFTUVOVEFMOk5PIC9SRUxFQVNFIC9OT0xPR08gLXN1YnN5c3RlbTpjb25zb2xlLDQuMCAtZW50cnk6d21haW5DUlRTdGFydHVwCi1ETExfTEZMQUdTID0gLUNMUlRIUkVBREFUVFJJQlVURTpTVEEgL05PREVGQVVMVExJQjpMSUJDTVQgL0lOQ1JFTUVOVEFMOk5PIC9QREI6Tk9ORSAtZGxsIC9CQVNFOjB4NzIwMDAwMDAgL0RMTAotUkVTICAgID0gJChQUk9HUkFNX05BTUUpLnJlcwotRVhFQyAgID0gJChQUk9HUkFNX09VVFBVVCkKLUNPTlNPTEUgPSAkKFBST0dSQU1fTkFNRSljLmV4ZQotRExMICAgID0gJChQUk9HUkFNX0xJQlJBUlkpCi1ERUJVRyAgPSAjJChjZGVidWcpCi0KLUNGTEFHUyA9IC1jIC1EVU5JQ09ERSAtRFZJU1RBIC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05fQ09ORk9STUlOR19TV1BSSU5URlMgLUkuLiAtRERFRkFVTFRfT1M9IlwiJChERUZBVUxUX09TKVwiIiBcCi0JLURERUZBVUxUX09TX0FSQ0g9IlwiJChERUZBVUxUX09TX0FSQ0gpXCIiIFwKLQktRERFRkFVTFRfV1M9IlwiJChERUZBVUxUX1dTKVwiIiBcCi0JLUkkKEpBVkFfSE9NRSlcaW5jbHVkZSAtSSQoSkFWQV9IT01FKVxpbmNsdWRlXHdpbjMyIFwKLQkkKGNmbGFncykKLQkKLVdQRl9IT01FID0gQzpcUHJvZ3JhbSBGaWxlc1xSZWZlcmVuY2UgQXNzZW1ibGllc1xNaWNyb3NvZnRcRnJhbWV3b3JrXHYzLjAKLURPVE5FVF9IT01FID0gQzpcV0lORE9XU1xNaWNyb3NvZnQuTkVUXEZyYW1ld29ya1x2Mi4wLjUwNzI3Ci1DUFBGTEFHUyA9IC1jbHIgL0ZVIiQoV1BGX0hPTUUpXFByZXNlbnRhdGlvbkNvcmUuZGxsIiAvRlUiJChXUEZfSE9NRSlcUHJlc2VudGF0aW9uRnJhbWV3b3JrLmRsbCIgL0ZVJChET1RORVRfSE9NRSlcU3lzdGVtLkRhdGEuZGxsIC9GVSQoRE9UTkVUX0hPTUUpXFN5c3RlbS5kbGwgL0ZVJChET1RORVRfSE9NRSlcU3lzdGVtLlhtbC5kbGwgL0ZVIiQoV1BGX0hPTUUpXFVJQXV0b21hdGlvblByb3ZpZGVyLmRsbCIgL0ZVIiQoV1BGX0hPTUUpXFVJQXV0b21hdGlvblR5cGVzLmRsbCIgL0ZVIiQoV1BGX0hPTUUpXFdpbmRvd3NCYXNlLmRsbCIKLQotCQotYWxsOiAkKEVYRUMpICQoRExMKSBjb20gJChDT05TT0xFKQotCi1lY2xpcHNlTWFpbi5vYmo6IC4uL2VjbGlwc2VVbmljb2RlLmggLi4vZWNsaXBzZUNvbW1vbi5oIC4uL2VjbGlwc2VNYWluLmMgCi0JJChDQykgJChERUJVRykgJChDRkxBR1MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlTWFpbi5jCi0KLWVjbGlwc2VDb21tb24ub2JqOiAuLi9lY2xpcHNlQ29tbW9uLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29tbW9uLmMKLQkkKENDKSAkKERFQlVHKSAkKENGTEFHUykgJChjdmFyc2RsbCkgL0ZvJCoub2JqIC4uL2VjbGlwc2VDb21tb24uYwotCi1lY2xpcHNlLm9iajogLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlLmMKLSAgICAkKENDKSAkKERFQlVHKSAkKENGTEFHUykgJChjdmFyc2RsbCkgL0ZvJCoub2JqIC4uL2VjbGlwc2UuYwotCi1lY2xpcHNlVXRpbC5vYmo6IC4uL2VjbGlwc2VVdGlsLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlVXRpbC5jCi0gICAgJChDQykgJChERUJVRykgJChDRkxBR1MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlVXRpbC5jCi0KLWVjbGlwc2VDb25maWcub2JqOiAuLi9lY2xpcHNlQ29uZmlnLmggLi4vZWNsaXBzZVVuaWNvZGUuaCAuLi9lY2xpcHNlQ29uZmlnLmMKLSAgICAkKENDKSAkKERFQlVHKSAkKENGTEFHUykgJChjdmFyc2RsbCkgL0ZvJCoub2JqIC4uL2VjbGlwc2VDb25maWcuYwotCi1lY2xpcHNlV3BmLm9iajogLi4vZWNsaXBzZU9TLmggLi4vZWNsaXBzZVVuaWNvZGUuaCBlY2xpcHNlV3BmLmNwcAotICAgICQoQ0MpICQoREVCVUcpICQoQ0ZMQUdTKSAkKENQUEZMQUdTKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogZWNsaXBzZVdwZi5jcHAKLQotZWNsaXBzZVdwZkNvbW1vbi5vYmo6IC4uL2VjbGlwc2VDb21tb24uaCBlY2xpcHNlV3BmQ29tbW9uLmNwcAotICAgICQoQ0MpICQoREVCVUcpICQoQ0ZMQUdTKSAkKENQUEZMQUdTKSAkKGN2YXJzZGxsKSAvRm8kKi5vYmogZWNsaXBzZVdwZkNvbW1vbi5jcHAKLQotZWNsaXBzZUpOSS5vYmo6IC4uL2VjbGlwc2VDb21tb24uaCAuLi9lY2xpcHNlT1MuaCAuLi9lY2xpcHNlSk5JLmMKLQkkKENDKSAkKERFQlVHKSAkKENGTEFHUykgJChjdmFyc2RsbCkgL0ZvJCoub2JqIC4uL2VjbGlwc2VKTkkuYwotCi1lY2xpcHNlU2htLm9iajogLi4vZWNsaXBzZVNobS5oIC4uL2VjbGlwc2VVbmljb2RlLmggLi4vZWNsaXBzZVNobS5jCi0JJChDQykgJChERUJVRykgJChDRkxBR1MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiAuLi9lY2xpcHNlU2htLmMKLQkKLSQoRVhFQyk6ICQoTUFJTl9PQkpTKSAkKENPTU1PTl9PQkpTKQotICAgIHJjLmV4ZSAtciAtZm8gJChSRVMpICQoUFJPR1JBTV9OQU1FKS5yYwotICAgIGxpbmsgJChMRkxBR1MpIC1vdXQ6JChQUk9HUkFNX09VVFBVVCkgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoUkVTKSAkKExJQlMpCi0gICAgbXQuZXhlIC1tYW5pZmVzdCAkKFBST0dSQU1fT1VUUFVUKS5tYW5pZmVzdCAtb3V0cHV0cmVzb3VyY2U6JChQUk9HUkFNX09VVFBVVCk7MgotCi0kKENPTlNPTEUpOiAkKE1BSU5fT0JKUykgJChDT01NT05fT0JKUykKLQlkZWwgLWYgZWNsaXBzZUNvbmZpZy5vYmoKLSAgICAkKENDKSAkKERFQlVHKSAkKENGTEFHUykgJChjdmFyc2RsbCkgLURfV0lOMzJfQ09OU09MRSAvRm9lY2xpcHNlQ29uZmlnLm9iaiAuLi9lY2xpcHNlQ29uZmlnLmMKLSAgICBsaW5rICQoQ09OU09MRUZMQUdTKSAtb3V0OiQoQ09OU09MRSkgJChNQUlOX09CSlMpICQoQ09NTU9OX09CSlMpICQoTElCUykKLSAgICBtdC5leGUgLW1hbmlmZXN0ICQoUFJPR1JBTV9PVVRQVVQpLm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokKENPTlNPTEUpOzIKLSAgICAKLSQoRExMKTogJChETExfT0JKUykgJChDT01NT05fT0JKUykKLSAgICBsaW5rICQoRExMX0xGTEFHUykgLW91dDokKFBST0dSQU1fTElCUkFSWSkgJChETExfT0JKUykgJChDT01NT05fT0JKUykgICQoRExMX0xJQlMpCi0gICAgbXQuZXhlIC1tYW5pZmVzdCAkKFBST0dSQU1fTElCUkFSWSkubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOiQoUFJPR1JBTV9MSUJSQVJZKTsyCi0KLWNvbS5vYmo6IGNvbS5jCi0JJChDQykgJChERUJVRykgJChDRkxBR1MpICQoY3ZhcnNkbGwpIC9GbyQqLm9iaiBjb20uYwotCi1jb206IGNvbS5vYmoKLSAJbGluayAgL0RMTCAtb3V0OmNvbV8kKExJQl9WRVJTSU9OKS5kbGwgY29tLm9iaiBvbGUzMi5saWIKLQkKLWluc3RhbGw6IGFsbAotCWNvcHkgJChFWEVDKSAkKE9VVFBVVF9ESVIpCi0JZGVsIC1mICQoRVhFQykgJChNQUlOX09CSlMpICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpICQoUkVTKQotICAgCi1jbGVhbjoKLQlkZWwgJChFWEVDKSAkKERMTCkgJChNQUlOX09CSlMpICQoRExMX09CSlMpICQoQ09NTU9OX09CSlMpICQoUkVTKSAqLm1hbmlmZXN0ICouZXhwICoubGliICouZGxsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWNlbnNlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbW90aWZfcm9vdC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbW90aWZfcm9vdC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI0NjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL21vdGlmX3Jvb3QvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkZlYnJ1YXJ5IDIyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhpcmQtcGFydHkgbGlicmFyaWVzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHRoZSBFY2xpcHNlIGxhdW5jaGVyLiAgUmVmZXIgYmVsb3cgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uPC9wPgotCi08aDQ+Q2Fpcm8gZm9yIExpbnV4PC9oND4KLQotPHA+UmVmZXIgdG8gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvYWJvdXRfY2Fpcm8uaHRtbCI+YWJvdXRfY2Fpcm8uaHRtbDwvYT4gZm9yIGxpY2Vuc2luZyBkZXRhaWxzIGFib3V0ICZxdW90O0NhaXJvIGZvciBMaW51eCZxdW90Oy48L3A+Ci0KLTxoND5PcGVuIE1vdGlmIGZvciBMaW51eDwvaDQ+Ci0KLTxwPlJlZmVyIHRvIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL2Fib3V0X29wZW5fbW90aWYuaHRtbCI+YWJvdXRfb3Blbl9tb3RpZi5odG1sPC9hPiBmb3IgbGljZW5zaW5nIGRldGFpbHMgYWJvdXQgJnF1b3Q7T3BlbiBNb3RpZiBmb3IgTGludXgmcXVvdDsuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9tb3RpZl9yb290L2Fib3V0X2ZpbGVzL2Fib3V0X2NhaXJvLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9tb3RpZl9yb290L2Fib3V0X2ZpbGVzL2Fib3V0X2NhaXJvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzIzMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbW90aWZfcm9vdC9hYm91dF9maWxlcy9hYm91dF9jYWlyby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1hcmNoIDI3LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBoYXMgaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBwYWNrYWdlIGZvciB5b3VyIGNvbnZlbmllbmNlOjwvcD4gCi0KLTxoND5DYWlybyAxLjAuMiBmb3IgTGludXg8L2g0PgotCi08cD5DYWlybyBmb3IgTGludXggKCZxdW90O0NhaXJvJnF1b3Q7KSBpcyBkZXZlbG9wZWQgYnkgVGhlIENhaXJvIFByb2plY3QgKDxhIGhyZWY9Imh0dHA6Ly93d3cuY2Fpcm9ncmFwaGljcy5vcmciIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LmNhaXJvZ3JhcGhpY3Mub3JnPC9hPik6PC9wPgotCi08cD5DYWlybyBpcyBkZWxpdmVyZWQgaW4gdGhlIGZvbGxvd2luZyBmaWxlICgmcXVvdDtDYWlybyBMaWJyYXJ5JnF1b3Q7KTo8L3A+Ci08dWw+Ci0gICAgPGxpPmxpYmNhaXJvLXN3dC5zbzwvbGk+Ci08L3VsPgotCi08cD53aGljaCB3YXMgY29tcGlsZWQgZnJvbSBDYWlybyBzb3VyY2UgY29kZSBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5jYWlyb2dyYXBoaWNzLm9yZy9zbmFwc2hvdHMiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LmNhaXJvZ3JhcGhpY3Mub3JnL3NuYXBzaG90czwvYT4uPC9wPgotCi08cD5Zb3VyIHVzZSBvZiB0aGUgQ2Fpcm8gY29kZSBpbiBiaW5hcnkgZm9ybSBpcyBzdWJqZWN0IHRvCi10aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoJnF1b3Q7TVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgTVBMIGlzIHByb3ZpZGVkICg8YSBocmVmPSJtcGwtdjExLnR4dCIgdGFyZ2V0PSJibGFuayI+bXBsLXYxMS50eHQ8L2E+KQotYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbC48L2E+Ci0KLTxoND5waXhtYW4gMC4xLjY8L2g0PgotCi08cD5waXhtYW4gKCZxdW90O3BpeG1hbiZxdW90OykgaXMgcGFja2FnZWQgd2l0aGluIHRoZSBDYWlybyBMaWJyYXJ5IGFuZCB3YXMgY29tcGlsZWQgZnJvbSBzb3VyY2UgY29kZSBhdmFpbGFibGUgYXQKLTxhIGhyZWY9Imh0dHA6Ly93d3cuY2Fpcm9ncmFwaGljcy5vcmcvc25hcHNob3RzIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5jYWlyb2dyYXBoaWNzLm9yZy9zbmFwc2hvdHM8L2E+LgotcGl4bWFuIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgcGFja2FnZXM6PC9wPgotCi08dWw+Ci0JPGxpPmxpYnBpeHJlZ2lvbjwvbGk+Ci0JPGxpPmxpYmljPC9saT4KLQk8bGk+c2xpbTwvbGk+Ci08L3VsPgotCi1Zb3VyIHVzZSBvZiBwaXhtYW4gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2VzIGluIDxhIGhyZWY9InBpeG1hbi1saWNlbnNlcy50eHQiIHRhcmdldD0iYmxhbmsiPnBpeG1hbi1saWNlbnNlcy50eHQ8L2E+LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGUgQ2Fpcm8gTGlicmFyeSBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBwYWNrYWdlIGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IGl0cyB1c2UuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgY29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbW90aWZfcm9vdC9hYm91dF9maWxlcy9hYm91dF9vcGVuX21vdGlmLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9tb3RpZl9yb290L2Fib3V0X2ZpbGVzL2Fib3V0X29wZW5fbW90aWYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2MjUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9tb3RpZl9yb290L2Fib3V0X2ZpbGVzL2Fib3V0X29wZW5fbW90aWYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIwLCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBoYXMgaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBwYWNrYWdlIGZvciB5b3VyIGNvbnZlbmllbmNlOjwvcD4gCi0KLTxoND5PcGVuIE1vdGlmIGZvciBMaW51eCAyLjEuMzAgUmVsZWFzZSA0PC9oND4KLQotPHA+T3BlbiBNb3RpZiBmb3IgTGludXggKCZxdW90O09wZW4gTW90aWYmcXVvdDspIGlzIGRldmVsb3BlZCBieSBNZXRybyBMaW5rIGFzIHBhcnQgb2YgVGhlIE9wZW4gTW90aWYgcHJvamVjdC4gIE9wZW4gTW90aWYgaXM6PC9wPgotCi08YmxvY2txdW90ZT4KLQlDb3B5cmlnaHQgKEMpIE1heSwgMjAwMCBUaGUgT3BlbiBHcm91cCwgTWV0cm8gTGluaywgSW5jb3Jwb3JhdGVkIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLTwvYmxvY2txdW90ZT4KLQotPHA+T3BlbiBNb3RpZiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGZpbGVzOjwvcD4KLTx1bD4KLSAgICA8bGk+bGliWG0uc28uMjwvbGk+Ci08L3VsPgotCi08cD5PcGVuIE1vdGlmIGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZWQgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbi4gIFlvdXIgdXNlIG9mIHRoZSBPcGVuIE1vdGlmIGNvZGUgaW4gYmluYXJ5IGZvcm0gaXMgc3ViamVjdCB0bwotdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoJnF1b3Q7TUxQTCZxdW90OykuICAgQSBjb3B5IG9mIHRoZSBNTFBMIGlzIHByb3ZpZGVkICg8YSBocmVmPSJtbHBsLXYxMC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+bWxwbC12MTAuaHRtbDwvYT4pCi1hbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4uPC9wPgotCi08cD5Tb3VyY2UgY29kZSBmb3IgT3BlbiBNb3RpZiBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rLzwvYT4uPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIE9wZW4gTW90aWYgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgcGFja2FnZSBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSBpdHMgdXNlLiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIGNvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL21vdGlmX3Jvb3QvYWJvdXRfZmlsZXMvbWxwbC12MTAuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL21vdGlmX3Jvb3QvYWJvdXRfZmlsZXMvbWxwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2OTJhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9tb3RpZl9yb290L2Fib3V0X2ZpbGVzL21scGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNjgpaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwgLS0+Ci08SFRNTCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCIgeG1sbnM6byA9IAotInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dyA9IAotInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiPjxIRUFEPjxUSVRMRT5NZXRybyBMaW5rIE9wZW4gTW90aWYgTGljZW5zZTwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxNRVRBIGNvbnRlbnQ9V29yZC5Eb2N1bWVudCBuYW1lPVByb2dJZD4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ5MSIgbmFtZT1HRU5FUkFUT1I+Ci08TUVUQSBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5IiBuYW1lPU9yaWdpbmF0b3I+PExJTksgCi1ocmVmPSIuL09wZW5fTW90aWZfTGljZW5zZV92ZXIxLjAwX2ZpbGVzL2ZpbGVsaXN0LnhtbCIgcmVsPUZpbGUtTGlzdD48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOkF1dGhvcj4xMC0wNi05OSBXOTg8L286QXV0aG9yPgotICA8bzpMYXN0QXV0aG9yPlByZWZlcnJlZCBDdXN0b21lcjwvbzpMYXN0QXV0aG9yPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MTE8L286VG90YWxUaW1lPgotICA8bzpMYXN0UHJpbnRlZD4yMDAwLTA1LTEwVDIzOjM4OjAwWjwvbzpMYXN0UHJpbnRlZD4KLSAgPG86Q3JlYXRlZD4yMDAwLTA1LTExVDE5OjM2OjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwMC0wNS0xMVQxOTozNjowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNzUwPC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjk5Nzc8L286Q2hhcmFjdGVycz4KLSAgPG86Q29tcGFueT5Ba2VybWFuPC9vOkNvbXBhbnk+Ci0gIDxvOkJ5dGVzPjM1ODQwPC9vOkJ5dGVzPgotICA8bzpMaW5lcz44MzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xOTwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMjI1MjwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjI3MjA8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpEaXNwbGF5SG9yaXpvbnRhbERyYXdpbmdHcmlkRXZlcnk+MDwvdzpEaXNwbGF5SG9yaXpvbnRhbERyYXdpbmdHcmlkRXZlcnk+Ci0gIDx3OkRpc3BsYXlWZXJ0aWNhbERyYXdpbmdHcmlkRXZlcnk+MDwvdzpEaXNwbGF5VmVydGljYWxEcmF3aW5nR3JpZEV2ZXJ5PgotICA8dzpVc2VNYXJnaW5zRm9yRHJhd2luZ0dyaWRPcmlnaW4vPgotICA8dzpDb21wYXRpYmlsaXR5PgotICAgPHc6Rm9vdG5vdGVMYXlvdXRMaWtlV1c4Lz4KLSAgIDx3OlNoYXBlTGF5b3V0TGlrZVdXOC8+Ci0gICA8dzpBbGlnblRhYmxlc1Jvd0J5Um93Lz4KLSAgIDx3OkZvcmdldExhc3RUYWJBbGlnbm1lbnQvPgotICAgPHc6TGF5b3V0UmF3VGFibGVXaWR0aC8+Ci0gICA8dzpMYXlvdXRUYWJsZVJvd3NBcGFydC8+Ci0gIDwvdzpDb21wYXRpYmlsaXR5PgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxTVFlMRT5AcGFnZSBTZWN0aW9uMSB7c2l6ZTogOC41aW4gMTEuMGluOyBtYXJnaW46IDEuMGluIDEuMGluIDEuMGluIDEuMGluOyBtc28taGVhZGVyLW1hcmdpbjogMS4waW47IG1zby1mb290ZXItbWFyZ2luOiAxLjBpbjsgbXNvLWZvb3RlcjogdXJsKCIuL09wZW5fTW90aWZfTGljZW5zZV92ZXIxLjAwX2ZpbGVzL2hlYWRlci5odG0iKSBmMTsgbXNvLXBhcGVyLXNvdXJjZTogMDsgfQotUC5Nc29Ob3JtYWwgewotCUZPTlQtU0laRTogMTBwdDsgTUFSR0lOOiAwaW4gMGluIDBwdDsgRk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tc3R5bGUtcGFyZW50OiAiIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iCi19Ci1MSS5Nc29Ob3JtYWwgewotCUZPTlQtU0laRTogMTBwdDsgTUFSR0lOOiAwaW4gMGluIDBwdDsgRk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tc3R5bGUtcGFyZW50OiAiIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iCi19Ci1ESVYuTXNvTm9ybWFsIHsKLQlGT05ULVNJWkU6IDEwcHQ7IE1BUkdJTjogMGluIDBpbiAwcHQ7IEZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXN0eWxlLXBhcmVudDogIiI7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIgotfQotUC5Nc29IZWFkZXIgewotCUZPTlQtU0laRTogMTBwdDsgTUFSR0lOOiAwaW4gMGluIDBwdDsgRk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IHRhYi1zdG9wczogY2VudGVyIDMuMGluIHJpZ2h0IDYuMGluCi19Ci1MSS5Nc29IZWFkZXIgewotCUZPTlQtU0laRTogMTBwdDsgTUFSR0lOOiAwaW4gMGluIDBwdDsgRk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IHRhYi1zdG9wczogY2VudGVyIDMuMGluIHJpZ2h0IDYuMGluCi19Ci1ESVYuTXNvSGVhZGVyIHsKLQlGT05ULVNJWkU6IDEwcHQ7IE1BUkdJTjogMGluIDBpbiAwcHQ7IEZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyB0YWItc3RvcHM6IGNlbnRlciAzLjBpbiByaWdodCA2LjBpbgotfQotUC5Nc29Gb290ZXIgewotCUZPTlQtU0laRTogMTBwdDsgTUFSR0lOOiAwaW4gMGluIDBwdDsgRk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IHRhYi1zdG9wczogY2VudGVyIDMuMGluIHJpZ2h0IDYuMGluCi19Ci1MSS5Nc29Gb290ZXIgewotCUZPTlQtU0laRTogMTBwdDsgTUFSR0lOOiAwaW4gMGluIDBwdDsgRk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IHRhYi1zdG9wczogY2VudGVyIDMuMGluIHJpZ2h0IDYuMGluCi19Ci1ESVYuTXNvRm9vdGVyIHsKLQlGT05ULVNJWkU6IDEwcHQ7IE1BUkdJTjogMGluIDBpbiAwcHQ7IEZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyB0YWItc3RvcHM6IGNlbnRlciAzLjBpbiByaWdodCA2LjBpbgotfQotUC5IMiB7Ci0JRk9OVC1XRUlHSFQ6IGJvbGQ7IEZPTlQtU0laRTogMThwdDsgTUFSR0lOOiA1cHQgMGluOyBMQVlPVVQtR1JJRC1NT0RFOiBsaW5lOyBGT05ULUZBTUlMWTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXN0eWxlLW5hbWU6IEgyOyBtc28tc3R5bGUtbmV4dDogTm9ybWFsOyBtc28tb3V0bGluZS1sZXZlbDogMzsgbXNvLWJpZGktZm9udC1zaXplOiAxMC4wcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBub3JtYWwKLX0KLUxJLkgyIHsKLQlGT05ULVdFSUdIVDogYm9sZDsgRk9OVC1TSVpFOiAxOHB0OyBNQVJHSU46IDVwdCAwaW47IExBWU9VVC1HUklELU1PREU6IGxpbmU7IEZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tc3R5bGUtbmFtZTogSDI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby1vdXRsaW5lLWxldmVsOiAzOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjBwdDsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbAotfQotRElWLkgyIHsKLQlGT05ULVdFSUdIVDogYm9sZDsgRk9OVC1TSVpFOiAxOHB0OyBNQVJHSU46IDVwdCAwaW47IExBWU9VVC1HUklELU1PREU6IGxpbmU7IEZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tc3R5bGUtbmFtZTogSDI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby1vdXRsaW5lLWxldmVsOiAzOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjBwdDsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbAotfQotUC5IMyB7Ci0JRk9OVC1XRUlHSFQ6IGJvbGQ7IEZPTlQtU0laRTogMTRwdDsgTUFSR0lOOiA1cHQgMGluOyBMQVlPVVQtR1JJRC1NT0RFOiBsaW5lOyBGT05ULUZBTUlMWTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXN0eWxlLW5hbWU6IEgzOyBtc28tc3R5bGUtbmV4dDogTm9ybWFsOyBtc28tb3V0bGluZS1sZXZlbDogNDsgbXNvLWJpZGktZm9udC1zaXplOiAxMC4wcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBub3JtYWwKLX0KLUxJLkgzIHsKLQlGT05ULVdFSUdIVDogYm9sZDsgRk9OVC1TSVpFOiAxNHB0OyBNQVJHSU46IDVwdCAwaW47IExBWU9VVC1HUklELU1PREU6IGxpbmU7IEZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tc3R5bGUtbmFtZTogSDM7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby1vdXRsaW5lLWxldmVsOiA0OyBtc28tYmlkaS1mb250LXNpemU6IDEwLjBwdDsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbAotfQotRElWLkgzIHsKLQlGT05ULVdFSUdIVDogYm9sZDsgRk9OVC1TSVpFOiAxNHB0OyBNQVJHSU46IDVwdCAwaW47IExBWU9VVC1HUklELU1PREU6IGxpbmU7IEZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tc3R5bGUtbmFtZTogSDM7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby1vdXRsaW5lLWxldmVsOiA0OyBtc28tYmlkaS1mb250LXNpemU6IDEwLjBwdDsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbAotfQotUC5CbG9ja3F1b3RlIHsKLQlGT05ULVNJWkU6IDEycHQ7IE1BUkdJTjogNXB0IDAuMjVpbjsgTEFZT1VULUdSSUQtTU9ERTogbGluZTsgRk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1zdHlsZS1uYW1lOiBCbG9ja3F1b3RlOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjBwdAotfQotTEkuQmxvY2txdW90ZSB7Ci0JRk9OVC1TSVpFOiAxMnB0OyBNQVJHSU46IDVwdCAwLjI1aW47IExBWU9VVC1HUklELU1PREU6IGxpbmU7IEZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tc3R5bGUtbmFtZTogQmxvY2txdW90ZTsgbXNvLWJpZGktZm9udC1zaXplOiAxMC4wcHQKLX0KLURJVi5CbG9ja3F1b3RlIHsKLQlGT05ULVNJWkU6IDEycHQ7IE1BUkdJTjogNXB0IDAuMjVpbjsgTEFZT1VULUdSSUQtTU9ERTogbGluZTsgRk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1zdHlsZS1uYW1lOiBCbG9ja3F1b3RlOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjBwdAotfQotRElWLlNlY3Rpb24xIHsKLQlwYWdlOiBTZWN0aW9uMQotfQotT0wgewotCU1BUkdJTi1CT1RUT006IDBpbgotfQotVUwgewotCU1BUkdJTi1CT1RUT006IDBpbgotfQotPC9TVFlMRT4KLTwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgc3R5bGU9InRhYi1pbnRlcnZhbDogLjVpbiIgYmdDb2xvcj13aGl0ZT4KLTxESVYgY2xhc3M9U2VjdGlvbjE+Ci08UCBjbGFzcz1IMiBzdHlsZT0iVEVYVC1BTElHTjogY2VudGVyIiBhbGlnbj1jZW50ZXI+TUVUUk8gTElOSyBQVUJMSUMgTElDRU5TRSAKLTxCUj5NT1RJRiBHUkFQSElDQUwgVVNFUiBJTlRFUkZBQ0UgU09GVFdBUkU8QlI+VmVyc2lvbiAxLjAwPC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyAKLU1FVFJPIExJTksgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiAKLU9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuIDwvUD4KLTxQIGNsYXNzPUgzPjEuIERFRklOSVRJT05TIDwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD4iQ29udHJpYnV0aW9uIiBtZWFuczogPC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPE9MIHN0eWxlPSJNQVJHSU4tVE9QOiAwaW4iIHR5cGU9YT4KLSAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgc3R5bGU9InRhYi1zdG9wczogbGlzdCAuNWluOyBtc28tb3V0bGluZS1sZXZlbDogMTsgbXNvLWxpc3Q6IGw2IGxldmVsMSBsZm85Ij5pbiAKLSAgdGhlIGNhc2Ugb2YgTUVUUk8gTElOSywgSU5DT1JQT1JBVEVEICgiTUVUUk8gTElOSyIpLCB0aGUgTWV0cm8gTGluayBQcm9ncmFtLCAKLSAgYW5kIDwvTEk+PC9PTD4KLTxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ibXNvLW91dGxpbmUtbGV2ZWw6IDEiPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPE9MIHN0eWxlPSJNQVJHSU4tVE9QOiAwaW4iIHR5cGU9YSBzdGFydD0yPgotICA8TEkgY2xhc3M9TXNvTm9ybWFsIAotICBzdHlsZT0idGFiLXN0b3BzOiBsaXN0IC41aW47IG1zby1vdXRsaW5lLWxldmVsOiAxOyBtc28tbGlzdDogbDYgbGV2ZWwxIGxmbzkiPmluIAotICB0aGUgY2FzZSBvZiBlYWNoIENvbnRyaWJ1dG9yLCA8L0xJPjwvT0w+Ci08UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Im1zby1vdXRsaW5lLWxldmVsOiAxIj48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxPTCBzdHlsZT0iTUFSR0lOLVRPUDogMGluIiB0eXBlPTE+Ci0gIDxPTCBzdHlsZT0iTUFSR0lOLVRPUDogMGluIiB0eXBlPTE+Ci0gICAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgICBzdHlsZT0idGFiLXN0b3BzOiBsaXN0IDEuMGluOyBtc28tb3V0bGluZS1sZXZlbDogMjsgbXNvLWxpc3Q6IGwwIGxldmVsMiBsZm8yIj5jaGFuZ2VzIAotICAgIHRvIHRoZSBQcm9ncmFtLCBhbmQgCi0gICAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgICBzdHlsZT0idGFiLXN0b3BzOiBsaXN0IDEuMGluOyBtc28tb3V0bGluZS1sZXZlbDogMjsgbXNvLWxpc3Q6IGwwIGxldmVsMiBsZm8yIj5hZGRpdGlvbnMgCi0gICAgdG8gdGhlIFByb2dyYW07IDwvTEk+PC9PTD48L09MPgotPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU4tTEVGVDogMC43NWluOyBtc28tb3V0bGluZS1sZXZlbDogMiI+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT48IVtlbmRpZl0+Jm5ic3A7PG86cD48L286cD48L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTi1MRUZUOiAwLjVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDEiPndoZXJlIHN1Y2ggCi1jaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSAKLXRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiAKLWl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggCi1Db250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gCi13aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIAotUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiAKLXRoZSBQcm9ncmFtLiA8L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTi1MRUZUOiAwLjVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDEiPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPiJDb250cmlidXRvciIgbWVhbnMgVGhlIE9wZW4gR3JvdXAsIE1FVFJPIExJTksgYW5kIGFueSBvdGhlciAKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLiA8L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT48IVtlbmRpZl0+Jm5ic3A7PG86cD48L286cD48L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+IkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgCi1Db250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgCi1Db250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD4iT3BlbiBTb3VyY2UiPFNQQU4gc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVzIj4mbmJzcDsgCi08L1NQQU4+cHJvZ3JhbXMgbWVhbiBzb2Z0d2FyZSBmb3IgdGhlIHNvdXJjZSBjb2RlIGlzIGF2YWlsYWJsZSB3aXRob3V0IAotY29uZmlkZW50aWFsIG9yIHRyYWRlIHNlY3JldCByZXN0cmljdGlvbnMgYW5kIGZvciB3aGljaDxTUEFOIAotc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVzIj4mbmJzcDsgPC9TUEFOPnRoZSBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgYXJlIAotYXZhaWxhYmxlIGZvciBkaXN0cmlidXRpb24gd2l0aG91dCBsaWNlbnNlIGNoYXJnZXMuPC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPiJNZXRybyBMaW5rIFByb2dyYW0iIG1lYW5zIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSAKLXNvZnR3YXJlIGFjY29tcGFueWluZyB0aGlzIEFncmVlbWVudCBhcyByZWxlYXNlZCBieSBNRVRSTyBMSU5LLCBpbmNsdWRpbmcgc291cmNlIAotY29kZSwgb2JqZWN0IGNvZGUgYW5kIGRvY3VtZW50YXRpb24sIGlmIGFueS4gPC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPiJQcm9ncmFtIiBtZWFucyB0aGUgTWV0cm8gTGluayBQcm9ncmFtIGFuZCBDb250cmlidXRpb25zLiAKLTwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgCi1BZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLiA8L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT48IVtlbmRpZl0+Jm5ic3A7PG86cD48L286cD48L1A+Ci08UCBjbGFzcz1IMyAKLXN0eWxlPSJNQVJHSU4tTEVGVDogMC41aW47IFRFWFQtSU5ERU5UOiAtMC4yNWluOyB0YWItc3RvcHM6IGxpc3QgLjVpbjsgbXNvLWxpc3Q6IGw0IGxldmVsMSBsZm84Ij48IVtpZiAhc3VwcG9ydExpc3RzXT4yLjxTUEFOIAotc3R5bGU9IkZPTlQ6IDdwdCAnVGltZXMgTmV3IFJvbWFuJyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IAotPC9TUEFOPjwhW2VuZGlmXT5HUkFOVCBPRiBSSUdIVFMgPC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPlRoZSByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UgYXJlIGxpbWl0ZWQgc29sZWx5IHRvIAotZGlzdHJpYnV0aW9uIGFuZCBzdWJsaWNlbnNpbmcgb2YgdGhlIENvbnRyaWJ1dGlvbihzKSBvbiwgd2l0aCBvcjxTUEFOIAotc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVzIj4mbmJzcDsgPC9TUEFOPmZvciBvcGVyYXRpbmcgc3lzdGVtcyB3aGljaCBhcmUgCi10aGVtc2VsdmVzIE9wZW4gU291cmNlIHByb2dyYW1zLjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxPTCBzdHlsZT0iTUFSR0lOLVRPUDogMGluIiB0eXBlPWE+Ci0gIDxMSSBjbGFzcz1Nc29Ob3JtYWwgCi0gIHN0eWxlPSJ0YWItc3RvcHM6IGxpc3QgLjVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDE7IG1zby1saXN0OiBsMSBsZXZlbDEgbGZvMyI+U3ViamVjdCAKLSAgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBUaGUgT3BlbiBHcm91cCBQdWJsaWMgTGljZW5zZSBBZ3JlZW1lbnQgCi0gIGF0dGFjaGVkIGhlcmV0byAok1RoZSBPcGVuIEdyb3VwIEFncmVlbWVudJQpIGFuZDxTUEFOIAotICBzdHlsZT0ibXNvLXNwYWNlcnVuOiB5ZXMiPiZuYnNwOyA8L1NQQU4+dGhlIGxpbWl0YXRpb25zIG9mIHRoaXMgU2VjdGlvbiAyLCAKLSAgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgCi0gIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgCi0gIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiAKLSAgb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgCi0gIG9iamVjdCBjb2RlIGZvcm0uIDwvTEk+PC9PTD4KLTxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDAuMjVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDEiPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPE9MIHN0eWxlPSJNQVJHSU4tVE9QOiAwaW4iIHR5cGU9YSBzdGFydD0yPgotICA8TEkgY2xhc3M9TXNvTm9ybWFsIAotICBzdHlsZT0idGFiLXN0b3BzOiBsaXN0IC41aW47IG1zby1vdXRsaW5lLWxldmVsOiAxOyBtc28tbGlzdDogbDEgbGV2ZWwxIGxmbzMiPlN1YmplY3QgCi0gIHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgVGhlIE9wZW4gR3JvdXAgQWdyZWVtZW50IGFuZCB0aGlzIFNlY3Rpb24gMiwgCi0gIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIAotICByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIAotICB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIAotICBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IAotICB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSAKLSAgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIAotICBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IAotICBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIAotICBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuIDwvTEk+PC9PTD4KLTxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ibXNvLW91dGxpbmUtbGV2ZWw6IDEiPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU4tTEVGVDogMC4yNWluOyBtc28tb3V0bGluZS1sZXZlbDogMSI+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT48IVtlbmRpZl0+Jm5ic3A7PG86cD48L286cD48L1A+Ci08T0wgc3R5bGU9Ik1BUkdJTi1UT1A6IDBpbiIgdHlwZT1hIHN0YXJ0PTM+Ci0gIDxMSSBjbGFzcz1Nc29Ob3JtYWwgCi0gIHN0eWxlPSJ0YWItc3RvcHM6IGxpc3QgLjVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDE7IG1zby1saXN0OiBsMSBsZXZlbDEgbGZvMyI+UmVjaXBpZW50IAotICB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgCi0gIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIAotICB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IAotICByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byAKLSAgUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiAKLSAgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIAotICByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIAotICByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiAKLSAgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyAKLSAgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIAotICBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLiA8L0xJPjwvT0w+Ci08UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTi1MRUZUOiAwLjI1aW47IG1zby1vdXRsaW5lLWxldmVsOiAxIj48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxPTCBzdHlsZT0iTUFSR0lOLVRPUDogMGluIiB0eXBlPWEgc3RhcnQ9ND4KLSAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgc3R5bGU9InRhYi1zdG9wczogbGlzdCAuNWluOyBtc28tb3V0bGluZS1sZXZlbDogMTsgbXNvLWxpc3Q6IGwxIGxldmVsMSBsZm8zIj5FYWNoIAotICBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgCi0gIHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggCi0gIGluIHRoaXMgQWdyZWVtZW50LiA8L0xJPjwvT0w+Ci08UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Im1zby1vdXRsaW5lLWxldmVsOiAxIj48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDAuMjVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDEiPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9SDM+My4gUkVRVUlSRU1FTlRTIDwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgCi1jb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDogPC9QPgotPE9MIHN0eWxlPSJNQVJHSU4tVE9QOiAwaW4iIHR5cGU9YT4KLSAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgc3R5bGU9InRhYi1zdG9wczogbGlzdCAuNWluOyBtc28tb3V0bGluZS1sZXZlbDogMTsgbXNvLWxpc3Q6IGwyIGxldmVsMSBsZm80Ij5pdCAKLSAgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ8QiAKLSAgc3R5bGU9Im1zby1iaWRpLWZvbnQtd2VpZ2h0OiBub3JtYWwiPiA8L0I+YW5kIFRoZSBPcGVuIEdyb3VwIEFncmVlbWVudDsgYW5kIAotICA8L0xJPjwvT0w+Ci08UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTi1MRUZUOiAwLjI1aW47IG1zby1vdXRsaW5lLWxldmVsOiAxIj48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxPTCBzdHlsZT0iTUFSR0lOLVRPUDogMGluIiB0eXBlPWEgc3RhcnQ9Mj4KLSAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgc3R5bGU9InRhYi1zdG9wczogbGlzdCAuNWluOyBtc28tb3V0bGluZS1sZXZlbDogMTsgbXNvLWxpc3Q6IGwyIGxldmVsMSBsZm80Ij5pdHMgCi0gIGxpY2Vuc2UgYWdyZWVtZW50OiA8L0xJPjwvT0w+Ci08UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Im1zby1vdXRsaW5lLWxldmVsOiAxIj48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDAuMjVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDEiPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPE9MIHN0eWxlPSJNQVJHSU4tVE9QOiAwaW4iIHR5cGU9MSBzdGFydD0yPgotICA8T0wgc3R5bGU9Ik1BUkdJTi1UT1A6IDBpbiIgdHlwZT0xPgotICAgIDxMSSBjbGFzcz1Nc29Ob3JtYWwgCi0gICAgc3R5bGU9InRhYi1zdG9wczogbGlzdCAxLjBpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDI7IG1zby1saXN0OiBsMiBsZXZlbDIgbGZvNSI+ZWZmZWN0aXZlbHkgCi0gICAgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCAKLSAgICBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCAKLSAgICBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IAotICAgIGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgCi0gICAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgICBzdHlsZT0idGFiLXN0b3BzOiBsaXN0IDEuMGluOyBtc28tb3V0bGluZS1sZXZlbDogMjsgbXNvLWxpc3Q6IGwyIGxldmVsMiBsZm81Ij5lZmZlY3RpdmVseSAKLSAgICBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgCi0gICAgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIAotICAgIGxvc3QgcHJvZml0czsgCi0gICAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgICBzdHlsZT0idGFiLXN0b3BzOiBsaXN0IDEuMGluOyBtc28tb3V0bGluZS1sZXZlbDogMjsgbXNvLWxpc3Q6IGwyIGxldmVsMiBsZm81Ij5zdGF0ZXMgCi0gICAgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IAotICAgIENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQgCi0gICAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgICBzdHlsZT0idGFiLXN0b3BzOiBsaXN0IDEuMGluOyBtc28tb3V0bGluZS1sZXZlbDogMjsgbXNvLWxpc3Q6IGwyIGxldmVsMiBsZm81Ij5zdGF0ZXMgCi0gICAgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIAotICAgIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgCi0gICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLiA8L0xJPjwvT0w+PC9PTD4KLTxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDAuNzVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDIiPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTogPC9QPgotPE9MIHN0eWxlPSJNQVJHSU4tVE9QOiAwaW4iIHR5cGU9YT4KLSAgPExJIGNsYXNzPU1zb05vcm1hbCAKLSAgc3R5bGU9InRhYi1zdG9wczogbGlzdCAuNWluOyBtc28tb3V0bGluZS1sZXZlbDogMTsgbXNvLWxpc3Q6IGwzIGxldmVsMSBsZm82Ij5pdCAKLSAgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgdGhlIE9wZW4gR3JvdXAgQWdyZWVtZW50OyBhbmQgCi0gIDwvTEk+PC9PTD4KLTxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDAuMjVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDEiPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPE9MIHN0eWxlPSJNQVJHSU4tVE9QOiAwaW4iIHR5cGU9YSBzdGFydD0yPgotICA8TEkgY2xhc3M9TXNvTm9ybWFsIAotICBzdHlsZT0idGFiLXN0b3BzOiBsaXN0IC41aW47IG1zby1vdXRsaW5lLWxldmVsOiAxOyBtc28tbGlzdDogbDMgbGV2ZWwxIGxmbzYiPmEgCi0gIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gCi08L0xJPjwvT0w+Ci08UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Im1zby1vdXRsaW5lLWxldmVsOiAxIj48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDAuMjVpbjsgbXNvLW91dGxpbmUtbGV2ZWw6IDEiPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgaW4gYSBjb25zcGljdW91cyAKLWxvY2F0aW9uIGluIHRoZSBQcm9ncmFtOiA8L1A+Ci08UCBjbGFzcz1CbG9ja3F1b3RlPkNvcHlyaWdodCAoQykgTWF5LCAyMDAwIFRoZSBPcGVuIEdyb3VwLCBNZXRybyBMaW5rLCAKLUluY29ycG9yYXRlZCBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkPC9QPgotPFAgY2xhc3M9QmxvY2txdW90ZT48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD5JbiBhZGRpdGlvbiwgZWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyAKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L1A+Ci08UCBjbGFzcz1IMz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTiA8L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIAotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIAotV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCAKLXRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIAotZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIAotQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIAotcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIAotZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgCi1hbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCAKLWxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSAKLUluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIAotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIAotY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgCi1jbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgCi1pbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IDwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbCAKLXN0eWxlPSJNQVJHSU4tTEVGVDogMC4yNWluOyBURVhULUlOREVOVDogLTAuMjVpbjsgdGFiLXN0b3BzOiBsaXN0IC4yNWluOyBtc28tbGlzdDogbDUgbGV2ZWwxIGxmbzciPjwhW2lmICFzdXBwb3J0TGlzdHNdPmEpPFNQQU4gCi1zdHlsZT0iRk9OVDogN3B0ICdUaW1lcyBOZXcgUm9tYW4nIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9TUEFOPjwhW2VuZGlmXT5wcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIAotY2xhaW0sIGFuZCA8L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT48IVtlbmRpZl0+Jm5ic3A7PG86cD48L286cD48L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWwgCi1zdHlsZT0iTUFSR0lOLUxFRlQ6IDAuMjVpbjsgVEVYVC1JTkRFTlQ6IC0wLjI1aW47IHRhYi1zdG9wczogbGlzdCAuMjVpbjsgbXNvLWxpc3Q6IGw1IGxldmVsMSBsZm83Ij48IVtpZiAhc3VwcG9ydExpc3RzXT5iKTxTUEFOIAotc3R5bGU9IkZPTlQ6IDdwdCAnVGltZXMgTmV3IFJvbWFuJyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvU1BBTj48IVtlbmRpZl0+YWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIAotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IAotbmVnb3RpYXRpb25zLiA8L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT48IVtlbmRpZl0+Jm5ic3A7PG86cD48L286cD48L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+VGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSAKLWF0IGl0cyBvd24gZXhwZW5zZS4gPC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSAKLWNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIAotQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3IgCi1vZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIAotYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSAKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIAotQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCAKLXJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIAotQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4gPC9QPgotPFAgY2xhc3M9SDM+NS4gTk8gV0FSUkFOVFkgPC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSAKLUlTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCAKLUVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIAotQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgCi1QQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIAotYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIAotYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IAotbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSAKLWxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIAotaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvUD4KLTxQIGNsYXNzPUgzPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZIDwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiAKLVJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIAotSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgCi1XSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCAKLVdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIAotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIAotVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCi1PRiBTVUNIIERBTUFHRVMuIDwvUD4KLTxQIGNsYXNzPUgzPjcuIEdFTkVSQUwgPC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciAKLXVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIAotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuIDwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgCi1Db250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgCi1jcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgCi10aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAKLXRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCAKLWxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSAKLWxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIAotd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIAotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT48IVtlbmRpZl0+Jm5ic3A7PG86cD48L286cD48L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgCi1pZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyAKLUFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIAotYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgCi1BZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSAKLVByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyAKLXVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIAotUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPgotPFAgY2xhc3M9TXNvTm9ybWFsPk1FVFJPIExJTksgbWF5IHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiAKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSAKLWdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IAotYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgCi1yZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIAotQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgCi11bmRlciB0aGUgbmV3IHZlcnNpb24uIE5vIG9uZSBvdGhlciB0aGFuIE1FVFJPIExJTksgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyAKLUFncmVlbWVudC4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IAotcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIAotdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiAKLUFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSAKLXJlc2VydmVkLiA8L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT48IVtlbmRpZl0+Jm5ic3A7PG86cD48L286cD48L1A+Ci08UCBjbGFzcz1Nc29Ob3JtYWw+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIAotRmxvcmlkYSBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIDwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPjwhW2VuZGlmXT4mbmJzcDs8bzpwPjwvbzpwPjwvUD4KLTxQIGNsYXNzPU1zb05vcm1hbD5ObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIAotdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgCi13YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvUD4KLTxQIAotY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+PCFbZW5kaWZdPiZuYnNwOzxvOnA+PC9vOnA+PC9QPjwvRElWPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9tb3RpZl9yb290L2Fib3V0X2ZpbGVzL21wbC12MTEudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbW90aWZfcm9vdC9hYm91dF9maWxlcy9tcGwtdjExLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxNDE0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS9tb3RpZl9yb290L2Fib3V0X2ZpbGVzL21wbC12MTEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTU9aSUxMQSBQVUJMSUMgTElDRU5TRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0KLQotMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgMS4wLjEuICJDb21tZXJjaWFsIFVzZSIgbWVhbnMgZGlzdHJpYnV0aW9uIG9yIG90aGVyd2lzZSBtYWtpbmcgdGhlCi0gICAgIENvdmVyZWQgQ29kZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KLQotICAgICAxLjEuICJDb250cmlidXRvciIgbWVhbnMgZWFjaCBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvCi0gICAgIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgotCi0gICAgIDEuMi4gIkNvbnRyaWJ1dG9yIFZlcnNpb24iIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgQ29kZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IsIGFuZCB0aGUgTW9kaWZpY2F0aW9ucwotICAgICBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLQotICAgICAxLjMuICJDb3ZlcmVkIENvZGUiIG1lYW5zIHRoZSBPcmlnaW5hbCBDb2RlIG9yIE1vZGlmaWNhdGlvbnMgb3IgdGhlCi0gICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGFuZCBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UKLSAgICAgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCi0KLSAgICAgMS40LiAiRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIiBtZWFucyBhIG1lY2hhbmlzbSBnZW5lcmFsbHkKLSAgICAgYWNjZXB0ZWQgaW4gdGhlIHNvZnR3YXJlIGRldmVsb3BtZW50IGNvbW11bml0eSBmb3IgdGhlIGVsZWN0cm9uaWMKLSAgICAgdHJhbnNmZXIgb2YgZGF0YS4KLQotICAgICAxLjUuICJFeGVjdXRhYmxlIiBtZWFucyBDb3ZlcmVkIENvZGUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UKLSAgICAgQ29kZS4KLQotICAgICAxLjYuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IGlkZW50aWZpZWQKLSAgICAgYXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdAotICAgICBBLgotCi0gICAgIDEuNy4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBDb2RlIG9yCi0gICAgIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgIDEuOC4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgMS44LjEuICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bQotICAgICBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3IKLSAgICAgc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KLQotICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyBhbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUKLSAgICAgc3Vic3RhbmNlIG9yIHN0cnVjdHVyZSBvZiBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW55IHByZXZpb3VzCi0gICAgIE1vZGlmaWNhdGlvbnMuIFdoZW4gQ292ZXJlZCBDb2RlIGlzIHJlbGVhc2VkIGFzIGEgc2VyaWVzIG9mIGZpbGVzLCBhCi0gICAgIE1vZGlmaWNhdGlvbiBpczoKLSAgICAgICAgICBBLiBBbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUgY29udGVudHMgb2YgYSBmaWxlCi0gICAgICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBDb2RlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgQ29kZSBvcgotICAgICAgICAgIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgMS4xMC4gIk9yaWdpbmFsIENvZGUiIG1lYW5zIFNvdXJjZSBDb2RlIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUKLSAgICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdCBBIGFzCi0gICAgIE9yaWdpbmFsIENvZGUsIGFuZCB3aGljaCwgYXQgdGhlIHRpbWUgb2YgaXRzIHJlbGVhc2UgdW5kZXIgdGhpcwotICAgICBMaWNlbnNlIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZSBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgMS4xMC4xLiAiUGF0ZW50IENsYWltcyIgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yCi0gICAgIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgIG1ldGhvZCwgcHJvY2VzcywKLSAgICAgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQgTGljZW5zYWJsZSBieSBncmFudG9yLgotCi0gICAgIDEuMTEuICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSBDb3ZlcmVkIENvZGUgZm9yCi0gICAgIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LCBpbmNsdWRpbmcgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMKLSAgICAgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHNjcmlwdHMgdXNlZCB0byBjb250cm9sCi0gICAgIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgYW4gRXhlY3V0YWJsZSwgb3Igc291cmNlIGNvZGUKLSAgICAgZGlmZmVyZW50aWFsIGNvbXBhcmlzb25zIGFnYWluc3QgZWl0aGVyIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGFub3RoZXIKLSAgICAgd2VsbCBrbm93biwgYXZhaWxhYmxlIENvdmVyZWQgQ29kZSBvZiB0aGUgQ29udHJpYnV0b3IncyBjaG9pY2UuIFRoZQotICAgICBTb3VyY2UgQ29kZSBjYW4gYmUgaW4gYSBjb21wcmVzc2VkIG9yIGFyY2hpdmFsIGZvcm0sIHByb3ZpZGVkIHRoZQotICAgICBhcHByb3ByaWF0ZSBkZWNvbXByZXNzaW9uIG9yIGRlLWFyY2hpdmluZyBzb2Z0d2FyZSBpcyB3aWRlbHkgYXZhaWxhYmxlCi0gICAgIGZvciBubyBjaGFyZ2UuCi0KLSAgICAgMS4xMi4gIllvdSIgKG9yICJZb3VyIikgIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkKLSAgICAgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzCi0gICAgIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXNzdWVkIHVuZGVyIFNlY3Rpb24gNi4xLgotICAgICBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzCi0gICAgIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YKLSAgICAgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LAotICAgICB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkKLSAgICAgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50Ci0gICAgICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaAotICAgICBlbnRpdHkuCi0KLTIuIFNvdXJjZSBDb2RlIExpY2Vuc2UuCi0KLSAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi0gICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKLSAgICAgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eQotICAgICBjbGFpbXM6Ci0gICAgICAgICAgKGEpICB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcgotICAgICAgICAgIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciB0byB1c2UsIHJlcHJvZHVjZSwKLSAgICAgICAgICBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsCi0gICAgICAgICAgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vcgotICAgICAgICAgIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0KLSAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50cyBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yCi0gICAgICAgICAgc2VsbGluZyBvZiBPcmlnaW5hbCBDb2RlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsCi0gICAgICAgICAgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlCi0gICAgICAgICAgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikuCi0KLSAgICAgICAgICAoYykgdGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gdGhpcyBTZWN0aW9uIDIuMShhKSBhbmQgKGIpIGFyZQotICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcwotICAgICAgICAgIE9yaWdpbmFsIENvZGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzCi0gICAgICAgICAgZ3JhbnRlZDogMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20gdGhlIE9yaWdpbmFsIENvZGU7IDIpCi0gICAgICAgICAgc2VwYXJhdGUgZnJvbSB0aGUgT3JpZ2luYWwgQ29kZTsgIG9yIDMpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZAotICAgICAgICAgIGJ5OiBpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGlpKSB0aGUKLSAgICAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgQ29kZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuCi0KLSAgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4KLSAgICAgU3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yCi0gICAgIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UKLQotICAgICAgICAgIChhKSAgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IKLSAgICAgICAgICB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksCi0gICAgICAgICAgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucwotICAgICAgICAgIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZikgZWl0aGVyIG9uIGFuCi0gICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIENvZGUKLSAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLQotICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3IKLSAgICAgICAgICBzZWxsaW5nIG9mICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUKLSAgICAgICAgICBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMKLSAgICAgICAgICBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZQotICAgICAgICAgIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogMSkgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgICAgICBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAyKSB0aGUgY29tYmluYXRpb24gb2YKLSAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvcgotICAgICAgICAgIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgotCi0gICAgICAgICAgKGMpIHRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZQotICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBtYWtlcyBDb21tZXJjaWFsIFVzZSBvZgotICAgICAgICAgIHRoZSBDb3ZlcmVkIENvZGUuCi0KLSAgICAgICAgICAoZCkgICAgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcwotICAgICAgICAgIGdyYW50ZWQ6IDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlCi0gICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbjsgMikgIHNlcGFyYXRlIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247Ci0gICAgICAgICAgMykgIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogaSkgdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZgotICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24gb3IgaWkpICB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlCi0gICAgICAgICAgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlICAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlCi0gICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgNCkgdW5kZXIgUGF0ZW50IENsYWltcwotICAgICAgICAgIGluZnJpbmdlZCBieSBDb3ZlcmVkIENvZGUgaW4gdGhlIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5Ci0gICAgICAgICAgdGhhdCBDb250cmlidXRvci4KLQotMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotCi0gICAgIDMuMS4gQXBwbGljYXRpb24gb2YgTGljZW5zZS4KLSAgICAgVGhlIE1vZGlmaWNhdGlvbnMgd2hpY2ggWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUKLSAgICAgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICAgICBTZWN0aW9uIDIuMi4gVGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gb2YgQ292ZXJlZCBDb2RlIG1heSBiZQotICAgICBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbgotICAgICBvZiB0aGlzIExpY2Vuc2UgcmVsZWFzZWQgdW5kZXIgU2VjdGlvbiA2LjEsIGFuZCBZb3UgbXVzdCBpbmNsdWRlIGEKLSAgICAgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBZb3UKLSAgICAgZGlzdHJpYnV0ZS4gWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgU291cmNlIENvZGUKLSAgICAgdmVyc2lvbiB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzCi0gICAgIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMnIHJpZ2h0cyBoZXJldW5kZXIuIEhvd2V2ZXIsIFlvdSBtYXkgaW5jbHVkZQotICAgICBhbiBhZGRpdGlvbmFsIGRvY3VtZW50IG9mZmVyaW5nIHRoZSBhZGRpdGlvbmFsIHJpZ2h0cyBkZXNjcmliZWQgaW4KLSAgICAgU2VjdGlvbiAzLjUuCi0KLSAgICAgMy4yLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0gICAgIEFueSBNb2RpZmljYXRpb24gd2hpY2ggWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBtdXN0IGJlCi0gICAgIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQotICAgICBlaXRoZXIgb24gdGhlIHNhbWUgbWVkaWEgYXMgYW4gRXhlY3V0YWJsZSB2ZXJzaW9uIG9yIHZpYSBhbiBhY2NlcHRlZAotICAgICBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gdG8gYW55b25lIHRvIHdob20geW91IG1hZGUgYW4KLSAgICAgRXhlY3V0YWJsZSB2ZXJzaW9uIGF2YWlsYWJsZTsgYW5kIGlmIG1hZGUgYXZhaWxhYmxlIHZpYSBFbGVjdHJvbmljCi0gICAgIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20sIG11c3QgcmVtYWluIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3QgdHdlbHZlICgxMikKLSAgICAgbW9udGhzIGFmdGVyIHRoZSBkYXRlIGl0IGluaXRpYWxseSBiZWNhbWUgYXZhaWxhYmxlLCBvciBhdCBsZWFzdCBzaXgKLSAgICAgKDYpIG1vbnRocyBhZnRlciBhIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGF0IHBhcnRpY3VsYXIgTW9kaWZpY2F0aW9uCi0gICAgIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIHRvIHN1Y2ggcmVjaXBpZW50cy4gWW91IGFyZSByZXNwb25zaWJsZSBmb3IKLSAgICAgZW5zdXJpbmcgdGhhdCB0aGUgU291cmNlIENvZGUgdmVyc2lvbiByZW1haW5zIGF2YWlsYWJsZSBldmVuIGlmIHRoZQotICAgICBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gaXMgbWFpbnRhaW5lZCBieSBhIHRoaXJkIHBhcnR5LgotCi0gICAgIDMuMy4gRGVzY3JpcHRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLSAgICAgWW91IG11c3QgY2F1c2UgYWxsIENvdmVyZWQgQ29kZSB0byB3aGljaCBZb3UgY29udHJpYnV0ZSB0byBjb250YWluIGEKLSAgICAgZmlsZSBkb2N1bWVudGluZyB0aGUgY2hhbmdlcyBZb3UgbWFkZSB0byBjcmVhdGUgdGhhdCBDb3ZlcmVkIENvZGUgYW5kCi0gICAgIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBwcm9taW5lbnQgc3RhdGVtZW50IHRoYXQKLSAgICAgdGhlIE1vZGlmaWNhdGlvbiBpcyBkZXJpdmVkLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBmcm9tIE9yaWdpbmFsCi0gICAgIENvZGUgcHJvdmlkZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlCi0gICAgIEluaXRpYWwgRGV2ZWxvcGVyIGluIChhKSB0aGUgU291cmNlIENvZGUsIGFuZCAoYikgaW4gYW55IG5vdGljZSBpbiBhbgotICAgICBFeGVjdXRhYmxlIHZlcnNpb24gb3IgcmVsYXRlZCBkb2N1bWVudGF0aW9uIGluIHdoaWNoIFlvdSBkZXNjcmliZSB0aGUKLSAgICAgb3JpZ2luIG9yIG93bmVyc2hpcCBvZiB0aGUgQ292ZXJlZCBDb2RlLgotCi0gICAgIDMuNC4gSW50ZWxsZWN0dWFsIFByb3BlcnR5IE1hdHRlcnMKLSAgICAgICAgICAoYSkgVGhpcmQgUGFydHkgQ2xhaW1zLgotICAgICAgICAgIElmIENvbnRyaWJ1dG9yIGhhcyBrbm93bGVkZ2UgdGhhdCBhIGxpY2Vuc2UgdW5kZXIgYSB0aGlyZCBwYXJ0eSdzCi0gICAgICAgICAgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBpcyByZXF1aXJlZCB0byBleGVyY2lzZSB0aGUgcmlnaHRzCi0gICAgICAgICAgZ3JhbnRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIHVuZGVyIFNlY3Rpb25zIDIuMSBvciAyLjIsCi0gICAgICAgICAgQ29udHJpYnV0b3IgbXVzdCBpbmNsdWRlIGEgdGV4dCBmaWxlIHdpdGggdGhlIFNvdXJjZSBDb2RlCi0gICAgICAgICAgZGlzdHJpYnV0aW9uIHRpdGxlZCAiTEVHQUwiIHdoaWNoIGRlc2NyaWJlcyB0aGUgY2xhaW0gYW5kIHRoZQotICAgICAgICAgIHBhcnR5IG1ha2luZyB0aGUgY2xhaW0gaW4gc3VmZmljaWVudCBkZXRhaWwgdGhhdCBhIHJlY2lwaWVudCB3aWxsCi0gICAgICAgICAga25vdyB3aG9tIHRvIGNvbnRhY3QuIElmIENvbnRyaWJ1dG9yIG9idGFpbnMgc3VjaCBrbm93bGVkZ2UgYWZ0ZXIKLSAgICAgICAgICB0aGUgTW9kaWZpY2F0aW9uIGlzIG1hZGUgYXZhaWxhYmxlIGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMiwKLSAgICAgICAgICBDb250cmlidXRvciBzaGFsbCBwcm9tcHRseSBtb2RpZnkgdGhlIExFR0FMIGZpbGUgaW4gYWxsIGNvcGllcwotICAgICAgICAgIENvbnRyaWJ1dG9yIG1ha2VzIGF2YWlsYWJsZSB0aGVyZWFmdGVyIGFuZCBzaGFsbCB0YWtlIG90aGVyIHN0ZXBzCi0gICAgICAgICAgKHN1Y2ggYXMgbm90aWZ5aW5nIGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdHMgb3IgbmV3c2dyb3VwcykKLSAgICAgICAgICByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHRob3NlIHdobyByZWNlaXZlZCB0aGUgQ292ZXJlZAotICAgICAgICAgIENvZGUgdGhhdCBuZXcga25vd2xlZGdlIGhhcyBiZWVuIG9idGFpbmVkLgotCi0gICAgICAgICAgKGIpIENvbnRyaWJ1dG9yIEFQSXMuCi0gICAgICAgICAgSWYgQ29udHJpYnV0b3IncyBNb2RpZmljYXRpb25zIGluY2x1ZGUgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcKLSAgICAgICAgICBpbnRlcmZhY2UgYW5kIENvbnRyaWJ1dG9yIGhhcyBrbm93bGVkZ2Ugb2YgcGF0ZW50IGxpY2Vuc2VzIHdoaWNoCi0gICAgICAgICAgYXJlIHJlYXNvbmFibHkgbmVjZXNzYXJ5IHRvIGltcGxlbWVudCB0aGF0IEFQSSwgQ29udHJpYnV0b3IgbXVzdAotICAgICAgICAgIGFsc28gaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBMRUdBTCBmaWxlLgotCi0gICAgICAgICAgICAgICAoYykgICAgUmVwcmVzZW50YXRpb25zLgotICAgICAgICAgIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCwgZXhjZXB0IGFzIGRpc2Nsb3NlZCBwdXJzdWFudCB0bwotICAgICAgICAgIFNlY3Rpb24gMy40KGEpIGFib3ZlLCBDb250cmlidXRvciBiZWxpZXZlcyB0aGF0IENvbnRyaWJ1dG9yJ3MKLSAgICAgICAgICBNb2RpZmljYXRpb25zIGFyZSBDb250cmlidXRvcidzIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vcgotICAgICAgICAgIENvbnRyaWJ1dG9yIGhhcyBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5Ci0gICAgICAgICAgdGhpcyBMaWNlbnNlLgotCi0gICAgIDMuNS4gUmVxdWlyZWQgTm90aWNlcy4KLSAgICAgWW91IG11c3QgZHVwbGljYXRlIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGluIGVhY2ggZmlsZSBvZiB0aGUgU291cmNlCi0gICAgIENvZGUuICBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gcHV0IHN1Y2ggbm90aWNlIGluIGEgcGFydGljdWxhciBTb3VyY2UKLSAgICAgQ29kZSBmaWxlIGR1ZSB0byBpdHMgc3RydWN0dXJlLCB0aGVuIFlvdSBtdXN0IGluY2x1ZGUgc3VjaCBub3RpY2UgaW4gYQotICAgICBsb2NhdGlvbiAoc3VjaCBhcyBhIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSB1c2VyIHdvdWxkIGJlIGxpa2VseQotICAgICB0byBsb29rIGZvciBzdWNoIGEgbm90aWNlLiAgSWYgWW91IGNyZWF0ZWQgb25lIG9yIG1vcmUgTW9kaWZpY2F0aW9uKHMpCi0gICAgIFlvdSBtYXkgYWRkIHlvdXIgbmFtZSBhcyBhIENvbnRyaWJ1dG9yIHRvIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluCi0gICAgIEV4aGliaXQgQS4gIFlvdSBtdXN0IGFsc28gZHVwbGljYXRlIHRoaXMgTGljZW5zZSBpbiBhbnkgZG9jdW1lbnRhdGlvbgotICAgICBmb3IgdGhlIFNvdXJjZSBDb2RlIHdoZXJlIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgb3Igb3duZXJzaGlwCi0gICAgIHJpZ2h0cyByZWxhdGluZyB0byBDb3ZlcmVkIENvZGUuICBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvCi0gICAgIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5Ci0gICAgIG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBDb2RlLiBIb3dldmVyLCBZb3UKLSAgICAgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhbgotICAgICBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzCi0gICAgIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwKLSAgICAgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUKLSAgICAgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwKLSAgICAgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLSAgICAgMy42LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLSAgICAgWW91IG1heSBkaXN0cmlidXRlIENvdmVyZWQgQ29kZSBpbiBFeGVjdXRhYmxlIGZvcm0gb25seSBpZiB0aGUKLSAgICAgcmVxdWlyZW1lbnRzIG9mIFNlY3Rpb24gMy4xLTMuNSBoYXZlIGJlZW4gbWV0IGZvciB0aGF0IENvdmVyZWQgQ29kZSwKLSAgICAgYW5kIGlmIFlvdSBpbmNsdWRlIGEgbm90aWNlIHN0YXRpbmcgdGhhdCB0aGUgU291cmNlIENvZGUgdmVyc2lvbiBvZgotICAgICB0aGUgQ292ZXJlZCBDb2RlIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAotICAgICBpbmNsdWRpbmcgYSBkZXNjcmlwdGlvbiBvZiBob3cgYW5kIHdoZXJlIFlvdSBoYXZlIGZ1bGZpbGxlZCB0aGUKLSAgICAgb2JsaWdhdGlvbnMgb2YgU2VjdGlvbiAzLjIuIFRoZSBub3RpY2UgbXVzdCBiZSBjb25zcGljdW91c2x5IGluY2x1ZGVkCi0gICAgIGluIGFueSBub3RpY2UgaW4gYW4gRXhlY3V0YWJsZSB2ZXJzaW9uLCByZWxhdGVkIGRvY3VtZW50YXRpb24gb3IKLSAgICAgY29sbGF0ZXJhbCBpbiB3aGljaCBZb3UgZGVzY3JpYmUgcmVjaXBpZW50cycgcmlnaHRzIHJlbGF0aW5nIHRvIHRoZQotICAgICBDb3ZlcmVkIENvZGUuIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSB2ZXJzaW9uIG9mIENvdmVyZWQKLSAgICAgQ29kZSBvciBvd25lcnNoaXAgcmlnaHRzIHVuZGVyIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5Ci0gICAgIGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4KLSAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZQotICAgICBFeGVjdXRhYmxlIHZlcnNpb24gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MKLSAgICAgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcwotICAgICBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSB2ZXJzaW9uIHVuZGVyIGEgZGlmZmVyZW50Ci0gICAgIGxpY2Vuc2UgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlcgotICAgICBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUKLSAgICAgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5Ci0gICAgIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoCi0gICAgIHRlcm1zIFlvdSBvZmZlci4KLQotICAgICAzLjcuIExhcmdlciBXb3Jrcy4KLSAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBDb2RlIHdpdGggb3RoZXIgY29kZQotICAgICBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyCi0gICAgIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUKLSAgICAgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBDb2RlLgotCi00LiBJbmFiaWxpdHkgdG8gQ29tcGx5IER1ZSB0byBTdGF0dXRlIG9yIFJlZ3VsYXRpb24uCi0KLSAgICAgSWYgaXQgaXMgaW1wb3NzaWJsZSBmb3IgWW91IHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgdGVybXMgb2YgdGhpcwotICAgICBMaWNlbnNlIHdpdGggcmVzcGVjdCB0byBzb21lIG9yIGFsbCBvZiB0aGUgQ292ZXJlZCBDb2RlIGR1ZSB0bwotICAgICBzdGF0dXRlLCBqdWRpY2lhbCBvcmRlciwgb3IgcmVndWxhdGlvbiB0aGVuIFlvdSBtdXN0OiAoYSkgY29tcGx5IHdpdGgKLSAgICAgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGU7IGFuZCAoYikKLSAgICAgZGVzY3JpYmUgdGhlIGxpbWl0YXRpb25zIGFuZCB0aGUgY29kZSB0aGV5IGFmZmVjdC4gU3VjaCBkZXNjcmlwdGlvbgotICAgICBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBMRUdBTCBmaWxlIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuNCBhbmQgbXVzdAotICAgICBiZSBpbmNsdWRlZCB3aXRoIGFsbCBkaXN0cmlidXRpb25zIG9mIHRoZSBTb3VyY2UgQ29kZS4gRXhjZXB0IHRvIHRoZQotICAgICBleHRlbnQgcHJvaGliaXRlZCBieSBzdGF0dXRlIG9yIHJlZ3VsYXRpb24sIHN1Y2ggZGVzY3JpcHRpb24gbXVzdCBiZQotICAgICBzdWZmaWNpZW50bHkgZGV0YWlsZWQgZm9yIGEgcmVjaXBpZW50IG9mIG9yZGluYXJ5IHNraWxsIHRvIGJlIGFibGUgdG8KLSAgICAgdW5kZXJzdGFuZCBpdC4KLQotNS4gQXBwbGljYXRpb24gb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGNvZGUgdG8gd2hpY2ggdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhhcwotICAgICBhdHRhY2hlZCB0aGUgbm90aWNlIGluIEV4aGliaXQgQSBhbmQgdG8gcmVsYXRlZCBDb3ZlcmVkIENvZGUuCi0KLTYuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi0gICAgIDYuMS4gTmV3IFZlcnNpb25zLgotICAgICBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbiAoIk5ldHNjYXBlIikgbWF5IHB1Ymxpc2ggcmV2aXNlZAotICAgICBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoZSBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24KLSAgICAgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLgotCi0gICAgIDYuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KLSAgICAgT25jZSBDb3ZlcmVkIENvZGUgaGFzIGJlZW4gcHVibGlzaGVkIHVuZGVyIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZQotICAgICBMaWNlbnNlLCBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoYXQKLSAgICAgdmVyc2lvbi4gWW91IG1heSBhbHNvIGNob29zZSB0byB1c2Ugc3VjaCBDb3ZlcmVkIENvZGUgdW5kZXIgdGhlIHRlcm1zCi0gICAgIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IE5ldHNjYXBlLiBObyBvbmUKLSAgICAgb3RoZXIgdGhhbiBOZXRzY2FwZSBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGUgdGVybXMgYXBwbGljYWJsZSB0bwotICAgICBDb3ZlcmVkIENvZGUgY3JlYXRlZCB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgICAgNi4zLiBEZXJpdmF0aXZlIFdvcmtzLgotICAgICBJZiBZb3UgY3JlYXRlIG9yIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlICh3aGljaCB5b3UgbWF5Ci0gICAgIG9ubHkgZG8gaW4gb3JkZXIgdG8gYXBwbHkgaXQgdG8gY29kZSB3aGljaCBpcyBub3QgYWxyZWFkeSBDb3ZlcmVkIENvZGUKLSAgICAgZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlKSwgWW91IG11c3QgKGEpIHJlbmFtZSBZb3VyIGxpY2Vuc2Ugc28gdGhhdAotICAgICB0aGUgcGhyYXNlcyAiTW96aWxsYSIsICJNT1pJTExBUEwiLCAiTU9aUEwiLCAiTmV0c2NhcGUiLAotICAgICAiTVBMIiwgIk5QTCIgb3IgYW55IGNvbmZ1c2luZ2x5IHNpbWlsYXIgcGhyYXNlIGRvIG5vdCBhcHBlYXIgaW4geW91cgotICAgICBsaWNlbnNlIChleGNlcHQgdG8gbm90ZSB0aGF0IHlvdXIgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKQotICAgICBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgWW91ciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlCi0gICAgIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgICBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZS4gKEZpbGxpbmcgaW4gdGhlIG5hbWUgb2YgdGhlIEluaXRpYWwKLSAgICAgRGV2ZWxvcGVyLCBPcmlnaW5hbCBDb2RlIG9yIENvbnRyaWJ1dG9yIGluIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluCi0gICAgIEV4aGliaXQgQSBzaGFsbCBub3Qgb2YgdGhlbXNlbHZlcyBiZSBkZWVtZWQgdG8gYmUgbW9kaWZpY2F0aW9ucyBvZgotICAgICB0aGlzIExpY2Vuc2UuKQotCi03LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotCi0gICAgIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsCi0gICAgIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRgotICAgICBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuCi0gICAgIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgQ09ERQotICAgICBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULAotICAgICBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFCi0gICAgIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIKLSAgICAgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YKLSAgICAgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgotCi04LiBURVJNSU5BVElPTi4KLQotICAgICA4LjEuICBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUKLSAgICAgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZQotICAgICBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBBbGwKLSAgICAgc3VibGljZW5zZXMgdG8gdGhlIENvdmVyZWQgQ29kZSB3aGljaCBhcmUgcHJvcGVybHkgZ3JhbnRlZCBzaGFsbAotICAgICBzdXJ2aXZlIGFueSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyCi0gICAgIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlCi0gICAgIHNoYWxsIHN1cnZpdmUuCi0KLSAgICAgOC4yLiAgSWYgWW91IGluaXRpYXRlIGxpdGlnYXRpb24gYnkgYXNzZXJ0aW5nIGEgcGF0ZW50IGluZnJpbmdlbWVudAotICAgICBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyCi0gICAgIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20KLSAgICAgWW91IGZpbGUgc3VjaCBhY3Rpb24gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikgIGFsbGVnaW5nIHRoYXQ6Ci0KLSAgICAgKGEpICBzdWNoIFBhcnRpY2lwYW50J3MgQ29udHJpYnV0b3IgVmVyc2lvbiBkaXJlY3RseSBvciBpbmRpcmVjdGx5Ci0gICAgIGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGJ5IHN1Y2gKLSAgICAgUGFydGljaXBhbnQgdG8gWW91IHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZQotICAgICBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5LAotICAgICB1bmxlc3MgaWYgd2l0aGluIDYwIGRheXMgYWZ0ZXIgcmVjZWlwdCBvZiBub3RpY2UgWW91IGVpdGhlcjogKGkpCi0gICAgIGFncmVlIGluIHdyaXRpbmcgdG8gcGF5IFBhcnRpY2lwYW50IGEgbXV0dWFsbHkgYWdyZWVhYmxlIHJlYXNvbmFibGUKLSAgICAgcm95YWx0eSBmb3IgWW91ciBwYXN0IGFuZCBmdXR1cmUgdXNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSBzdWNoCi0gICAgIFBhcnRpY2lwYW50LCBvciAoaWkpIHdpdGhkcmF3IFlvdXIgbGl0aWdhdGlvbiBjbGFpbSB3aXRoIHJlc3BlY3QgdG8KLSAgICAgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50LiAgSWYgd2l0aGluIDYwIGRheXMKLSAgICAgb2Ygbm90aWNlLCBhIHJlYXNvbmFibGUgcm95YWx0eSBhbmQgcGF5bWVudCBhcnJhbmdlbWVudCBhcmUgbm90Ci0gICAgIG11dHVhbGx5IGFncmVlZCB1cG9uIGluIHdyaXRpbmcgYnkgdGhlIHBhcnRpZXMgb3IgdGhlIGxpdGlnYXRpb24gY2xhaW0KLSAgICAgaXMgbm90IHdpdGhkcmF3biwgdGhlIHJpZ2h0cyBncmFudGVkIGJ5IFBhcnRpY2lwYW50IHRvIFlvdSB1bmRlcgotICAgICBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSBhdCB0aGUgZXhwaXJhdGlvbiBvZgotICAgICB0aGUgNjAgZGF5IG5vdGljZSBwZXJpb2Qgc3BlY2lmaWVkIGFib3ZlLgotCi0gICAgIChiKSAgYW55IHNvZnR3YXJlLCBoYXJkd2FyZSwgb3IgZGV2aWNlLCBvdGhlciB0aGFuIHN1Y2ggUGFydGljaXBhbnQncwotICAgICBDb250cmlidXRvciBWZXJzaW9uLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuCi0gICAgIGFueSByaWdodHMgZ3JhbnRlZCB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCB1bmRlciBTZWN0aW9ucyAyLjEoYikKLSAgICAgYW5kIDIuMihiKSBhcmUgcmV2b2tlZCBlZmZlY3RpdmUgYXMgb2YgdGhlIGRhdGUgWW91IGZpcnN0IG1hZGUsIHVzZWQsCi0gICAgIHNvbGQsIGRpc3RyaWJ1dGVkLCBvciBoYWQgbWFkZSwgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgUGFydGljaXBhbnQuCi0KLSAgICAgOC4zLiAgSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gYWdhaW5zdCBQYXJ0aWNpcGFudAotICAgICBhbGxlZ2luZyB0aGF0IHN1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uIGRpcmVjdGx5IG9yCi0gICAgIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQgd2hlcmUgc3VjaCBjbGFpbSBpcyByZXNvbHZlZCAoc3VjaCBhcwotICAgICBieSBsaWNlbnNlIG9yIHNldHRsZW1lbnQpIHByaW9yIHRvIHRoZSBpbml0aWF0aW9uIG9mIHBhdGVudAotICAgICBpbmZyaW5nZW1lbnQgbGl0aWdhdGlvbiwgdGhlbiB0aGUgcmVhc29uYWJsZSB2YWx1ZSBvZiB0aGUgbGljZW5zZXMKLSAgICAgZ3JhbnRlZCBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDIuMSBvciAyLjIgc2hhbGwgYmUgdGFrZW4KLSAgICAgaW50byBhY2NvdW50IGluIGRldGVybWluaW5nIHRoZSBhbW91bnQgb3IgdmFsdWUgb2YgYW55IHBheW1lbnQgb3IKLSAgICAgbGljZW5zZS4KLQotICAgICA4LjQuICBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgOC4xIG9yIDguMiBhYm92ZSwKLSAgICAgYWxsIGVuZCB1c2VyIGxpY2Vuc2UgYWdyZWVtZW50cyAoZXhjbHVkaW5nIGRpc3RyaWJ1dG9ycyBhbmQgcmVzZWxsZXJzKQotICAgICB3aGljaCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyCi0gICAgIHByaW9yIHRvIHRlcm1pbmF0aW9uIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCi0KLTkuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgotCi0gICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUCi0gICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwKLSAgICAgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIENPREUsCi0gICAgIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IKLSAgICAgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCi0gICAgIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TUyBPRiBHT09EV0lMTCwKLSAgICAgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIKLSAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTgotICAgICBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YKLSAgICAgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWQotICAgICBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZJ1MgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXCi0gICAgIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFCi0gICAgIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTwotICAgICBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KLQotMTAuIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLSAgICAgVGhlIENvdmVyZWQgQ29kZSBpcyBhICJjb21tZXJjaWFsIGl0ZW0sIiBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbgotICAgICA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwgY29tcHV0ZXIKLSAgICAgc29mdHdhcmUiIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uLCIgYXMgc3VjaAotICAgICB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4Ci0gICAgIEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwKLSAgICAgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIENvZGUgd2l0aCBvbmx5IHRob3NlCi0gICAgIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLgotCi0xMS4gTUlTQ0VMTEFORU9VUy4KLQotICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdAotICAgICBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlCi0gICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudAotICAgICBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5Ci0gICAgIENhbGlmb3JuaWEgbGF3IHByb3Zpc2lvbnMgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZgotICAgICBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBpdHMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuCi0gICAgIFdpdGggcmVzcGVjdCB0byBkaXNwdXRlcyBpbiB3aGljaCBhdCBsZWFzdCBvbmUgcGFydHkgaXMgYSBjaXRpemVuIG9mLAotICAgICBvciBhbiBlbnRpdHkgY2hhcnRlcmVkIG9yIHJlZ2lzdGVyZWQgdG8gZG8gYnVzaW5lc3MgaW4gdGhlIFVuaXRlZAotICAgICBTdGF0ZXMgb2YgQW1lcmljYSwgYW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlCi0gICAgIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuCi0gICAgIERpc3RyaWN0IG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LAotICAgICBDYWxpZm9ybmlhLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcKLSAgICAgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kCi0gICAgIGV4cGVuc2VzLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24KLSAgICAgQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4KLSAgICAgQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3QKLSAgICAgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMKLSAgICAgTGljZW5zZS4KLQotMTIuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCi0KLSAgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcwotICAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksCi0gICAgIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvCi0gICAgIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaAotICAgICByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yCi0gICAgIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi0xMy4gTVVMVElQTEUtTElDRU5TRUQgQ09ERS4KLQotICAgICBJbml0aWFsIERldmVsb3BlciBtYXkgZGVzaWduYXRlIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgYXMKLSAgICAgIk11bHRpcGxlLUxpY2Vuc2VkIi4gICJNdWx0aXBsZS1MaWNlbnNlZCIgbWVhbnMgdGhhdCB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgcGVybWl0cyB5b3UgdG8gdXRpbGl6ZSBwb3J0aW9ucyBvZiB0aGUgQ292ZXJlZCBDb2RlIHVuZGVyCi0gICAgIFlvdXIgY2hvaWNlIG9mIHRoZSBOUEwgb3IgdGhlIGFsdGVybmF0aXZlIGxpY2Vuc2VzLCBpZiBhbnksIHNwZWNpZmllZAotICAgICBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIGZpbGUgZGVzY3JpYmVkIGluIEV4aGliaXQgQS4KLQotRVhISUJJVCBBIC1Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlLgotCi0gICAgIGBgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQotICAgICBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi0gICAgIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotCi0gICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLSAgICAgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAgICAgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zCi0gICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgotCi0gICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBfX19fX19fX19fX19fX19fX19fX19fX18uCi0gICAgIFBvcnRpb25zIGNyZWF0ZWQgYnkgX19fX19fX19fX19fX19fX19fX19fXyBhcmUgQ29weXJpZ2h0IChDKSBfX19fX18KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX18uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSAgICAgQ29udHJpYnV0b3Iocyk6IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgotCi0gICAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi0gICAgIG9mIHRoZSBfX19fXyBsaWNlbnNlICh0aGUgICJbX19fXSBMaWNlbnNlIiksIGluIHdoaWNoIGNhc2UgdGhlCi0gICAgIHByb3Zpc2lvbnMgb2YgW19fX19fX10gTGljZW5zZSBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRob3NlCi0gICAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQotICAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFtfX19fXSBMaWNlbnNlIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotICAgICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKLSAgICAgZGVsZXRpbmcgIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlICB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKLSAgICAgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgW19fX10gTGljZW5zZS4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0gICAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSAgICAgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIFtfX19dIExpY2Vuc2UuIgotCi0gICAgIFtOT1RFOiBUaGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSBtYXkgZGlmZmVyIHNsaWdodGx5IGZyb20gdGhlIHRleHQgb2YKLSAgICAgdGhlIG5vdGljZXMgaW4gdGhlIFNvdXJjZSBDb2RlIGZpbGVzIG9mIHRoZSBPcmlnaW5hbCBDb2RlLiBZb3Ugc2hvdWxkCi0gICAgIHVzZSB0aGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSByYXRoZXIgdGhhbiB0aGUgdGV4dCBmb3VuZCBpbiB0aGUKLSAgICAgT3JpZ2luYWwgQ29kZSBTb3VyY2UgQ29kZSBmb3IgWW91ciBNb2RpZmljYXRpb25zLl0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbW90aWZfcm9vdC9hYm91dF9maWxlcy9waXhtYW4tbGljZW5zZXMudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvbW90aWZfcm9vdC9hYm91dF9maWxlcy9waXhtYW4tbGljZW5zZXMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDhkY2E2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL21vdGlmX3Jvb3QvYWJvdXRfZmlsZXMvcGl4bWFuLWxpY2Vuc2VzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLWxpYnBpeHJlZ2lvbgotCi1Db3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci1jb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi1kb2N1bWVudGF0aW9uLgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLU9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgotQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCi11c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKLWluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KLQotCi1Db3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAotcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAotc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQotdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCi1zb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKLQotRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCi1BTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKLURJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCi1BTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCi1XSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCi1BUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCi1TT0ZUV0FSRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbGliaWMKLQotQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLXRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgotYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci1zcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwotcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0Ci1pcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotCi1LRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi1EQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi1UT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi1QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zbGltCi0KLXNsaW0gaXMgQ29weXJpZ2h0IKkgMjAwMyBSaWNoYXJkIEhlbmRlcnNvbgotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCi1hbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi1zdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFJpY2hhcmQgSGVuZGVyc29uIG5vdCBiZQotdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCi1zb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBSaWNoYXJkIEhlbmRlcnNvbgotbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgotYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCi13YXJyYW50eS4KLQotUklDSEFSRCBIRU5ERVJTT04gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi1JTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi1FVkVOVCBTSEFMTCBSSUNIQVJEIEhFTkRFUlNPTiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi1PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi1QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS90YXJnZXQuYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL3RhcmdldC5idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjBlMjU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL3RhcmdldC5idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jdXN0b20gPSB0cnVlCi0KLSMjIyNFdmVuIHRob3VnaCBtYXJrZWQgYXMgY3VzdG9tLCB0aGUgY29udGVudCBvZiB0aGUgYnVpbGQucHJvcGVydGllcyBuZWVkcyB0byBiZSB1cGRhdGVkIHRvIGVuc3VyZSBjb3JyZWN0bmVzcyBvZiBSQ1AgYXBwIGV4cG9ydGVkIAotcm9vdC5wZXJtaXNzaW9ucy43NTU9JHtsYXVuY2hlck5hbWV9Ci0KLXJvb3Qud2luMzIud2luMzIueDg2PWZpbGU6YmluL3dpbjMyL3dpbjMyL3g4Ni9sYXVuY2hlci5leGUKLXJvb3Qud2luMzIud2luMzIueDg2XzY0PWZpbGU6YmluL3dpbjMyL3dpbjMyL3g4Nl82NC9sYXVuY2hlci5leGUKLXJvb3Qud2luMzIud2luMzIuaWE2ND1maWxlOmNvbnRyaWJ1dGVkL3dpbjMyL3dpbjMyL2lhNjQvbGF1bmNoZXIuZXhlCi1yb290LndpbjMyLndwZi54ODY9ZmlsZTpiaW4vd3BmL3dpbjMyL3g4Ni9sYXVuY2hlci5leGUKLQotcm9vdC5saW51eC5ndGsueDg2PWJpbi9ndGsvbGludXgveDg2LGd0a19yb290Ci1yb290LmxpbnV4Lmd0ay54ODYucGVybWlzc2lvbnMuNzU1PWxpYmNhaXJvLXN3dC5zbwotCi1yb290LmxpbnV4Lmd0ay5wcGM9YmluL2d0ay9saW51eC9wcGMsZ3RrX3Jvb3QKLXJvb3QubGludXguZ3RrLnBwYy5wZXJtaXNzaW9ucy43NTU9bGliY2Fpcm8tc3d0LnNvCi0KLXJvb3QubGludXguZ3RrLnBwYzY0PWJpbi9ndGsvbGludXgvcHBjNjQsZ3RrX3Jvb3QKLQotcm9vdC5tYWNvc3guY2FyYm9uLnBwYz1iaW4vY2FyYm9uL21hY29zeC9wcGMKLXJvb3QubWFjb3N4LmNhcmJvbi5wcGMucGVybWlzc2lvbnMuNzU1PSR7bGF1bmNoZXJOYW1lfS5hcHAvQ29udGVudHMvTWFjT1MvJHtsYXVuY2hlck5hbWV9Ci0KLXJvb3QubWFjb3N4LmNhcmJvbi54ODY9YmluL2NhcmJvbi9tYWNvc3gveDg2Ci1yb290Lm1hY29zeC5jYXJib24ueDg2LnBlcm1pc3Npb25zLjc1NT0ke2xhdW5jaGVyTmFtZX0uYXBwL0NvbnRlbnRzL01hY09TLyR7bGF1bmNoZXJOYW1lfQotCi1yb290Lm1hY29zeC5jb2NvYS5wcGM9YmluL2NvY29hL21hY29zeC9wcGMKLXJvb3QubWFjb3N4LmNvY29hLnBwYy5wZXJtaXNzaW9ucy43NTU9JHtsYXVuY2hlck5hbWV9LmFwcC9Db250ZW50cy9NYWNPUy8ke2xhdW5jaGVyTmFtZX0KLQotcm9vdC5tYWNvc3guY29jb2EueDg2PWJpbi9jb2NvYS9tYWNvc3gveDg2Ci1yb290Lm1hY29zeC5jb2NvYS54ODYucGVybWlzc2lvbnMuNzU1PSR7bGF1bmNoZXJOYW1lfS5hcHAvQ29udGVudHMvTWFjT1MvJHtsYXVuY2hlck5hbWV9Ci0KLXJvb3QubWFjb3N4LmNvY29hLng4Nl82ND1iaW4vY29jb2EvbWFjb3N4L3g4Nl82NAotcm9vdC5tYWNvc3guY29jb2EueDg2XzY0LnBlcm1pc3Npb25zLjc1NT0ke2xhdW5jaGVyTmFtZX0uYXBwL0NvbnRlbnRzL01hY09TLyR7bGF1bmNoZXJOYW1lfQotCi1yb290LmFpeC5tb3RpZi5wcGM9YmluL21vdGlmL2FpeC9wcGMKLQotcm9vdC5ocHV4Lm1vdGlmLlBBX1JJU0M9YmluL21vdGlmL2hwdXgvUEFfUklTQwotcm9vdC5ocHV4Lm1vdGlmLmlhNjRfMzI9YmluL21vdGlmL2hwdXgvaWE2NF8zMgotCi1yb290LnNvbGFyaXMubW90aWYuc3BhcmM9Y29udHJpYnV0ZWQvbW90aWYvc29sYXJpcy9zcGFyYwotcm9vdC5zb2xhcmlzLmd0ay54ODY9YmluL2d0ay9zb2xhcmlzL3g4Ngotcm9vdC5zb2xhcmlzLmd0ay5zcGFyYz1iaW4vZ3RrL3NvbGFyaXMvc3BhcmMKLQotcm9vdC5saW51eC5ndGsueDg2XzY0PWJpbi9ndGsvbGludXgveDg2XzY0LGd0a19yb290Ci1yb290LmxpbnV4Lmd0ay54ODZfNjQucGVybWlzc2lvbnMuNzU1PWxpYmNhaXJvLXN3dC5zbwotCi1yb290LnFueC5waG90b24ueDg2PWJpbi9waG90b24vcW54L3g4NgotCi1yb290LmxpbnV4Lm1vdGlmLng4Nj1iaW4vbW90aWYvbGludXgveDg2LG1vdGlmX3Jvb3QKLXJvb3QubGludXgubW90aWYueDg2LnBlcm1pc3Npb25zLjc1NT1saWJYbS5zby4yLGxpYmNhaXJvLXN3dC5zbwotCi1yb290LmxpbnV4Lmd0ay5zMzkweD1jb250cmlidXRlZC9ndGsvbGludXgvczM5MHgsZ3RrX3Jvb3QKLXJvb3QubGludXguZ3RrLnMzOTA9Y29udHJpYnV0ZWQvZ3RrL2xpbnV4L3MzOTAsZ3RrX3Jvb3QKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL3RhcmdldC5idWlsZC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS90YXJnZXQuYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDZhNTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlL3RhcmdldC5idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmxhdW5jaGVycyIgZGVmYXVsdD0iYnVpbGQudXBkYXRlLmphciIgYmFzZWRpcj0iLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0iZmVhdHVyZS5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InAyLmJ1aWxkLnJlcG8iIHZhbHVlPSJmaWxlOiR7YnVpbGREaXJlY3Rvcnl9L2J1aWxkUmVwbyIvPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJwMi5wdWJsaXNoLnBhcnRzIiB2YWx1ZT0idHJ1ZSIJCT4KLQkJCTxpc3RydWUgdmFsdWU9IiR7cDIuZ2F0aGVyaW5nfSIvPgotCQk8L2NvbmRpdGlvbj4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYWxsLnBsdWdpbnMiIGRlcGVuZHM9ImluaXQiPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYWxsLmZlYXR1cmVzIiBkZXBlbmRzPSJpbml0Ij4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVwZGF0ZS5mZWF0dXJlIiBkZXBlbmRzPSJpbml0Ij4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYWxsLmNoaWxkcmVuIiBkZXBlbmRzPSJpbml0LGFsbC5mZWF0dXJlcyxhbGwucGx1Z2lucyx1cGRhdGUuZmVhdHVyZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNoaWxkcmVuIiBpZj0iaW5jbHVkZS5jaGlsZHJlbiI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsLmNoaWxkcmVuIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLmphcnMiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJCdWlsZCBhbGwgdGhlIGphcnMgZm9yIHRoZSBmZWF0dXJlOiBvcmcuZWNsaXBzZS5wbGF0Zm9ybS5sYXVuY2hlcnMuIj4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQuc291cmNlcyIgZGVwZW5kcz0iaW5pdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLnppcHMiIGRlcGVuZHM9ImluaXQiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC51cGRhdGUuamFyIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIGZlYXR1cmUgamFyIG9mOiBvcmcuZWNsaXBzZS5wbGF0Zm9ybS5sYXVuY2hlcnMgZm9yIGFuIHVwZGF0ZSBzaXRlLiI+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwdWJsaXNoLmJpbi5wYXJ0cyIgZGVwZW5kcz0iaW5pdCIgaWY9InAyLnB1Ymxpc2gucGFydHMiPgotCQk8ZWNsaXBzZS5nYXRoZXJGZWF0dXJlIAotCQkgICBtZXRhZGF0YVJlcG9zaXRvcnk9IiR7cDIuYnVpbGQucmVwb30iCi0JCSAgIGFydGlmYWN0UmVwb3NpdG9yeT0iJHtwMi5idWlsZC5yZXBvfSIKLQkJICAgYnVpbGRSZXN1bHRGb2xkZXI9IiR7YmFzZWRpcn0iCi0JCSAgIGJhc2VEaXJlY3Rvcnk9IiR7YmFzZWRpcn0iCi0JCS8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5iaW4ucGFydHMiIGRlcGVuZHM9ImluaXQiIGlmPSJmZWF0dXJlLmJhc2UiPgotCQk8c3ViYW50IHRhcmdldD0icm9vdEZpbGVzJHtvc31fJHt3c31fJHthcmNofSIgYnVpbGRwYXRoPSIuIiBmYWlsb25lcnJvcj0iZmFsc2UiIGluaGVyaXRhbGw9InRydWUiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InJvb3RGaWxlc3dpbjMyX3dpbjMyX3g4NiI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS93aW4zMi53aW4zMi54ODYvJHtjb2xsZWN0aW5nRm9sZGVyfSIvPgotCQk8Y29weSB0b2Rpcj0iJHtmZWF0dXJlLmJhc2V9L3dpbjMyLndpbjMyLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9iaW4vd2luMzIvd2luMzIveDg2Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSJsYXVuY2hlci5leGUiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9jb3B5PgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS93aW4zMi53aW4zMi54ODYvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9ImxhdW5jaGVyLmV4ZSIgLz4gCi0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJyb290RmlsZXN3aW4zMl93aW4zMl94ODZfNjQiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vd2luMzIud2luMzIueDg2XzY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS93aW4zMi53aW4zMi54ODZfNjQvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vYmluL3dpbjMyL3dpbjMyL3g4Nl82NCI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0ibGF1bmNoZXIuZXhlIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vd2luMzIud2luMzIueDg2XzY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsYXVuY2hlci5leGUiIC8+IAotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icm9vdEZpbGVzd2luMzJfd2luMzJfaWE2NCI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS93aW4zMi53aW4zMi5pYTY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS93aW4zMi53aW4zMi5pYTY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2NvbnRyaWJ1dGVkL3dpbjMyL3dpbjMyL2lhNjQiPgotCQkJCTxpbmNsdWRlIG5hbWU9ImxhdW5jaGVyLmV4ZSIvPgotCQkJPC9maWxlc2V0PgotCQk8L2NvcHk+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L3dpbjMyLndpbjMyLmlhNjQvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9ImxhdW5jaGVyLmV4ZSIgLz4gCi0JPC90YXJnZXQ+Ci0JCQkKLQk8dGFyZ2V0IG5hbWU9InJvb3RGaWxlc3dpbjMyX3dwZl94ODYiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vd2luMzIud3BmLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2ZlYXR1cmUuYmFzZX0vd2luMzIud3BmLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9LyIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vYmluL3dwZi93aW4zMi94ODYiPgotCQkJCTxpbmNsdWRlIG5hbWU9ImxhdW5jaGVyLmV4ZSIvPgotCQkJPC9maWxlc2V0PgotCQk8L2NvcHk+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L3dpbjMyLndwZi54ODYvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9ImxhdW5jaGVyLmV4ZSIgLz4gCi0JPC90YXJnZXQ+Ci0JCQotCTx0YXJnZXQgbmFtZT0icm9vdEZpbGVzbWFjb3N4X2NhcmJvbl9wcGMiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbWFjb3N4LmNhcmJvbi5wcGMvJHtjb2xsZWN0aW5nRm9sZGVyfSIvPgotCQk8Y29weSB0b2Rpcj0iJHtmZWF0dXJlLmJhc2V9L21hY29zeC5jYXJib24ucHBjLyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2Jpbi9jYXJib24vbWFjb3N4L3BwYyIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbWFjb3N4LmNhcmJvbi5wcGMvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9IiR7bGF1bmNoZXJOYW1lfSIgLz4gCi0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L21hY29zeC5jYXJib24ucHBjLyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJFY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUy9sYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNtYWNvc3hfY2FyYm9uX3g4NiI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9tYWNvc3guY2FyYm9uLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2ZlYXR1cmUuYmFzZX0vbWFjb3N4LmNhcmJvbi54ODYvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vYmluL2NhcmJvbi9tYWNvc3gveDg2IiBpbmNsdWRlcz0iKioiCQkJLz4KLQkJPC9jb3B5PgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9tYWNvc3guY2FyYm9uLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0iJHtsYXVuY2hlck5hbWV9IiAvPiAKLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbWFjb3N4LmNhcmJvbi54ODYvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9IkVsY2lwc2UuYXBwL0NvbnRlbnRzL01hY09TL2xhdW5jaGVyIiAvPiAKLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InJvb3RGaWxlc21hY29zeF9jb2NvYV9wcGMiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbWFjb3N4LmNvY29hLnBwYy8ke2NvbGxlY3RpbmdGb2xkZXJ9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2ZlYXR1cmUuYmFzZX0vbWFjb3N4LmNvY29hLnBwYy8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9iaW4vY29jb2EvbWFjb3N4L3BwYyIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbWFjb3N4LmNvY29hLnBwYy8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0iJHtsYXVuY2hlck5hbWV9IiAvPiAKLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbWFjb3N4LmNvY29hLnBwYy8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0iRWxjaXBzZS5hcHAvQ29udGVudHMvTWFjT1MvbGF1bmNoZXIiIC8+IAotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0icm9vdEZpbGVzbWFjb3N4X2NvY29hX3g4NiI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9tYWNvc3guY29jb2EueDg2LyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9tYWNvc3guY29jb2EueDg2LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2Jpbi9jb2NvYS9tYWNvc3gveDg2IiBpbmNsdWRlcz0iKioiCQkJLz4KLQkJPC9jb3B5PgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9tYWNvc3guY29jb2EueDg2LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSIke2xhdW5jaGVyTmFtZX0iIC8+IAotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9tYWNvc3guY29jb2EueDg2LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJFY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUy9sYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNtYWNvc3hfY29jb2FfeDg2XzY0Ij4KLQkJPG1rZGlyIGRpcj0iJHtmZWF0dXJlLmJhc2V9L21hY29zeC5jb2NvYS54ODZfNjQvJHtjb2xsZWN0aW5nRm9sZGVyfSIvPgotCQk8Y29weSB0b2Rpcj0iJHtmZWF0dXJlLmJhc2V9L21hY29zeC5jb2NvYS54ODZfNjQvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vYmluL2NvY29hL21hY29zeC94ODZfNjQiIGluY2x1ZGVzPSIqKiIJCQkvPgotCQk8L2NvcHk+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L21hY29zeC5jb2NvYS54ODZfNjQvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9IiR7bGF1bmNoZXJOYW1lfSIgLz4gCi0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L21hY29zeC5jb2NvYS54ODZfNjQvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9IkVjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TL2xhdW5jaGVyIiAvPiAKLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InJvb3RGaWxlc2xpbnV4X2d0a194ODYiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9iaW4vZ3RrL2xpbnV4L3g4NiIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vZ3RrX3Jvb3QiIGluY2x1ZGVzPSIqKiIJCQkvPgotCQk8L2NvcHk+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L2xpbnV4Lmd0ay54ODYvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9ImxhdW5jaGVyIiAvPiAKLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0ibGliY2Fpcm8tc3d0LnNvIiAvPiAKLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InJvb3RGaWxlc2xpbnV4X2d0a19wcGMiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLnBwYy8ke2NvbGxlY3RpbmdGb2xkZXJ9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLnBwYy8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9iaW4vZ3RrL2xpbnV4L3BwYyIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vZ3RrX3Jvb3QiIGluY2x1ZGVzPSIqKiIJCQkvPgotCQk8L2NvcHk+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L2xpbnV4Lmd0ay5wcGMvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9ImxhdW5jaGVyIiAvPgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9saW51eC5ndGsueDg2LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsaWJjYWlyby1zd3Quc28iIC8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNsaW51eF9ndGtfcHBjNjQiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLnBwYzY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9saW51eC5ndGsucHBjNjQvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vYmluL2d0ay9saW51eC9wcGM2NCIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vZ3RrX3Jvb3QiIGluY2x1ZGVzPSIqKiIJCQkvPgotCQk8L2NvcHk+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L2xpbnV4Lmd0ay5wcGM2NC8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0ibGF1bmNoZXIiIC8+IAotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0icm9vdEZpbGVzbGludXhfZ3RrX3g4Nl82NCI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9saW51eC5ndGsueDg2XzY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9saW51eC5ndGsueDg2XzY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2Jpbi9ndGsvbGludXgveDg2XzY0IiBpbmNsdWRlcz0iKioiCQkJLz4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9ndGtfcm9vdCIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLng4Nl82NC8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0ibGF1bmNoZXIiIC8+IAotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9saW51eC5ndGsueDg2XzY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsaWJjYWlyby1zd3Quc28iIC8+IAotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0icm9vdEZpbGVzbGludXhfZ3RrX2lhNjQiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLmlhNjQvJHtjb2xsZWN0aW5nRm9sZGVyfSIvPgotCQk8Y29weSB0b2Rpcj0iJHtmZWF0dXJlLmJhc2V9L2xpbnV4Lmd0ay5pYTY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9InRydWUiPgotCQk8L2NvcHk+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L2xpbnV4Lmd0ay5pYTY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNsaW51eF9ndGtfczM5MHgiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLnMzOTB4LyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9saW51eC5ndGsuczM5MHgvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vY29udHJpYnV0ZWQvZ3RrL2xpbnV4L3MzOTB4IiBpbmNsdWRlcz0iKioiCQkJLz4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9ndGtfcm9vdCIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLnMzOTB4LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNsaW51eF9ndGtfczM5MCI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9saW51eC5ndGsuczM5MC8ke2NvbGxlY3RpbmdGb2xkZXJ9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXguZ3RrLnMzOTAvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vY29udHJpYnV0ZWQvZ3RrL2xpbnV4L3MzOTAiIGluY2x1ZGVzPSIqKiIJCQkvPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2d0a19yb290IiBpbmNsdWRlcz0iKioiCQkJLz4KLQkJPC9jb3B5PgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9saW51eC5ndGsuczM5MC8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0ibGF1bmNoZXIiIC8+IAotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0icm9vdEZpbGVzbGludXhfbW90aWZfeDg2Ij4KLQkJPG1rZGlyIGRpcj0iJHtmZWF0dXJlLmJhc2V9L2xpbnV4Lm1vdGlmLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2ZlYXR1cmUuYmFzZX0vbGludXgubW90aWYueDg2LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2Jpbi9tb3RpZi9saW51eC94ODYiIGluY2x1ZGVzPSIqKiIJCQkvPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L21vdGlmX3Jvb3QiIGluY2x1ZGVzPSIqKiIJCQkvPgotCQk8L2NvcHk+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L2xpbnV4Lm1vdGlmLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0ibGliWG0uc28uMixsaWJjYWlyby1zd3Quc28iIC8+IAotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9saW51eC5tb3RpZi54ODYvJHtjb2xsZWN0aW5nRm9sZGVyfSIgaW5jbHVkZXM9ImxhdW5jaGVyIiAvPiAKLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InJvb3RGaWxlc3NvbGFyaXNfZ3RrX3NwYXJjIj4KLQkJPG1rZGlyIGRpcj0iJHtmZWF0dXJlLmJhc2V9L3NvbGFyaXMuZ3RrLnNwYXJjLyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9zb2xhcmlzLmd0ay5zcGFyYy8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9iaW4vZ3RrL3NvbGFyaXMvc3BhcmMiIGluY2x1ZGVzPSIqKiIJCQkvPgotCQk8L2NvcHk+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHtmZWF0dXJlLmJhc2V9L3NvbGFyaXMuZ3RrLnNwYXJjLyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNzb2xhcmlzX2d0a194ODYiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vc29sYXJpcy5ndGsueDg2LyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9zb2xhcmlzLmd0ay54ODYvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vYmluL2d0ay9zb2xhcmlzL3g4NiIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vc29sYXJpcy5ndGsueDg2LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNzb2xhcmlzX21vdGlmX3NwYXJjIj4KLQkJPG1rZGlyIGRpcj0iJHtmZWF0dXJlLmJhc2V9L3NvbGFyaXMubW90aWYuc3BhcmMvJHtjb2xsZWN0aW5nRm9sZGVyfSIvPgotCQk8Y29weSB0b2Rpcj0iJHtmZWF0dXJlLmJhc2V9L3NvbGFyaXMubW90aWYuc3BhcmMvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vY29udHJpYnV0ZWQvbW90aWYvc29sYXJpcy9zcGFyYyIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vc29sYXJpcy5tb3RpZi5zcGFyYy8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0ibGF1bmNoZXIiIC8+IAotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0icm9vdEZpbGVzYWl4X21vdGlmX3BwYyI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9haXgubW90aWYucHBjLyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9haXgubW90aWYucHBjLyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2Jpbi9tb3RpZi9haXgvcHBjIiBpbmNsdWRlcz0iKioiCQkJLz4KLQkJPC9jb3B5PgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9haXgubW90aWYucHBjLyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNocHV4X21vdGlmX1BBX1JJU0MiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vaHB1eC5tb3RpZi5QQV9SSVNDLyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9ocHV4Lm1vdGlmLlBBX1JJU0MvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vYmluL21vdGlmL2hwdXgvUEFfUklTQyIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vaHB1eC5tb3RpZi5QQV9SSVNDLyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNocHV4X21vdGlmX2lhNjQiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vaHB1eC5tb3RpZi5pYTY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9ocHV4Lm1vdGlmLmlhNjQvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vaHB1eC5tb3RpZi5pYTY0LyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNocHV4X21vdGlmX2lhNjRfMzIiPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vaHB1eC5tb3RpZi5pYTY0XzMyLyR7Y29sbGVjdGluZ0ZvbGRlcn0iLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZmVhdHVyZS5iYXNlfS9ocHV4Lm1vdGlmLmlhNjRfMzIvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vYmluL21vdGlmL2hwdXgvaWE2NF8zMiIgaW5jbHVkZXM9IioqIgkJCS8+Ci0JCTwvY29weT4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke2ZlYXR1cmUuYmFzZX0vaHB1eC5tb3RpZi5pYTY0XzMyLyR7Y29sbGVjdGluZ0ZvbGRlcn0iIGluY2x1ZGVzPSJsYXVuY2hlciIgLz4gCi0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNxbnhfcGhvdG9uX3g4NiI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9xbngucGhvdG9uLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2ZlYXR1cmUuYmFzZX0vcW54LnBob3Rvbi54ODYvJHtjb2xsZWN0aW5nRm9sZGVyfSIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vYmluL3Bob3Rvbi9xbngveDg2IiBpbmNsdWRlcz0iKioiCQkJLz4KLQkJPC9jb3B5PgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9xbngucGhvdG9uLng4Ni8ke2NvbGxlY3RpbmdGb2xkZXJ9IiBpbmNsdWRlcz0ibGF1bmNoZXIiIC8+IAotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0icm9vdEZpbGVzZ3JvdXBfZ3JvdXBfZ3JvdXAiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJvb3RGaWxlc3dpbjMyX3dpbjMyX3g4NiIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJvb3RGaWxlc3dpbjMyX3dwZl94ODYiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXN3aW4zMl93aW4zMl94ODZfNjQiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXN3aW4zMl93aW4zMl9pYTY0Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0icm9vdEZpbGVzbWFjb3N4X2NhcmJvbl9wcGMiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXNtYWNvc3hfY2FyYm9uX3g4NiIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJvb3RGaWxlc21hY29zeF9jb2NvYV9wcGMiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXNtYWNvc3hfY29jb2FfeDg2Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0icm9vdEZpbGVzbGludXhfZ3RrX3g4NiIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJvb3RGaWxlc2xpbnV4X2d0a19wcGMiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXNsaW51eF9ndGtfcHBjNjQiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXNsaW51eF9ndGtfeDg2XzY0Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0icm9vdEZpbGVzbGludXhfZ3RrX2lhNjQiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXNsaW51eF9ndGtfczM5MHgiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXNsaW51eF9tb3RpZl94ODYiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXNzb2xhcmlzX2d0a19zcGFyYyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJvb3RGaWxlc3NvbGFyaXNfZ3RrX3g4NiIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJvb3RGaWxlc3NvbGFyaXNfbW90aWZfc3BhcmMiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXNhaXhfbW90aWZfcHBjIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0icm9vdEZpbGVzaHB1eF9tb3RpZl9QQV9SSVNDIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0icm9vdEZpbGVzaHB1eF9tb3RpZl9pYTY0Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0icm9vdEZpbGVzaHB1eF9tb3RpZl9pYTY0XzMyIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0icm9vdEZpbGVzcW54X3Bob3Rvbl94ODYiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iemlwLmRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIHppcCBjb250YWluaW5nIGFsbCB0aGUgcGx1Zy1pbnMgYW5kIGZlYXR1cmVzIGZvciB0aGUgZmVhdHVyZTogb3JnLmVjbGlwc2UucGxhdGZvcm0ubGF1bmNoZXJzLiI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InppcC5zb3VyY2VzIiBkZXBlbmRzPSJpbml0Ij4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iemlwLmxvZ3MiIGRlcGVuZHM9ImluaXQiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkNsZWFuIHRoZSBmZWF0dXJlOiBvcmcuZWNsaXBzZS5wbGF0Zm9ybS5sYXVuY2hlcnMgb2YgYWxsIHRoZSB6aXBzLCBqYXJzIGFuZCBsb2dzIGNyZWF0ZWQuIj4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icmVmcmVzaCIgZGVwZW5kcz0iaW5pdCIgaWY9ImVjbGlwc2UucnVubmluZyIgZGVzY3JpcHRpb249IlJlZnJlc2ggdGhpcyBmb2xkZXIuIj4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2F0aGVyLmxvZ3MiIGRlcGVuZHM9ImluaXQiPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLmNkdHByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLmNkdHByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTQ2OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLy5jZHRwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UtY2R0IHZlcnNpb249IjIuMCI/PgotCi08Y2R0cHJvamVjdCBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5tYWtlIj4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVMRiIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuUEUiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiLz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLk1hY2hPIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIj4KLTxhdHRyaWJ1dGUga2V5PSJjKytmaWx0IiB2YWx1ZT0iYysrZmlsdCIvPgotPC9leHRlbnNpb24+Ci08ZGF0YT4KLTxpdGVtIGlkPSJzY2FubmVyQ29uZmlndXJhdGlvbiI+Ci08YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLWYgJHtwcm9qZWN0X25hbWV9X3NjZC5tayIgY29tbWFuZD0ibWFrZSIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPC9pdGVtPgotPGl0ZW0gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhdGhlbnRyeSI+Ci08cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9Im91dCIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5ESVNDT1ZFUkVEX1NDQU5ORVJfSU5GTyIvPgotPC9pdGVtPgotPGl0ZW0gaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGR0YXJnZXRzIj4KLTxidWlsZFRhcmdldHM+Ci08dGFyZ2V0IG5hbWU9ImFsbC1taW5ndyIgcGF0aD0ibGlicmFyeS93aW4zMiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbWluZ3cubWFrPC9idWlsZEFyZ3VtZW50cz4KLTxidWlsZFRhcmdldD5hbGw8L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0iY2xlYW4iIHBhdGg9ImxpYnJhcnkvd2luMzIiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cz4tZiBtYWtlX21pbmd3Lm1hazwvYnVpbGRBcmd1bWVudHM+Ci08YnVpbGRUYXJnZXQ+Y2xlYW48L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0ibGludXgtYWxsIiBwYXRoPSJsaWJyYXJ5L2d0ayIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbGludXgubWFrPC9idWlsZEFyZ3VtZW50cz4KLTxidWlsZFRhcmdldD5hbGw8L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0iY2xlYW4iIHBhdGg9ImxpYnJhcnkvZ3RrIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHM+LWYgbWFrZV9saW51eC5tYWs8L2J1aWxkQXJndW1lbnRzPgotPGJ1aWxkVGFyZ2V0PmNsZWFuPC9idWlsZFRhcmdldD4KLTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci08dXNlRGVmYXVsdENvbW1hbmQ+ZmFsc2U8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08dGFyZ2V0IG5hbWU9ImFsbCIgcGF0aD0ibGlicmFyeS9jYXJib24iIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cz4tZiBtYWtlX21hY29zeC5tYWs8L2J1aWxkQXJndW1lbnRzPgotPGJ1aWxkVGFyZ2V0PmFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJjbGVhbiIgcGF0aD0ibGlicmFyeS9jYXJib24iIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cz4tZiBtYWtlX21hY29zeC5tYWs8L2J1aWxkQXJndW1lbnRzPgotPGJ1aWxkVGFyZ2V0PmNsZWFuPC9idWlsZFRhcmdldD4KLTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci08dXNlRGVmYXVsdENvbW1hbmQ+ZmFsc2U8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08dGFyZ2V0IG5hbWU9ImxpbnV4LWFsbCIgcGF0aD0ibGlicmFyeS9tb3RpZiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbGludXgubWFrPC9idWlsZEFyZ3VtZW50cz4KLTxidWlsZFRhcmdldD5hbGw8L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTwvYnVpbGRUYXJnZXRzPgotPC9pdGVtPgotPC9kYXRhPgotPC9jZHRwcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MzVmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9PU0dpJU1pbmltdW0tMS4yIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci8uY3Byb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLmNwcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmI0NWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci8uY3Byb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZmlsZVZlcnNpb24gNC4wLjA/PgotCi08Y3Byb2plY3Q+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiPgotPGNjb25maWd1cmF0aW9uIGlkPSJjb252ZXJ0ZWQuY29uZmlnLjE1Mjk2MDI4MzMiPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUucGF0aGVudHJ5Ij4KLTxwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIiLz4KLTxwYXRoZW50cnkga2luZD0ib3V0IiBwYXRoPSIiLz4KLTxwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkRJU0NPVkVSRURfU0NBTk5FUl9JTkZPIi8+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZHRhcmdldHMiPgotPGJ1aWxkVGFyZ2V0cz4KLTx0YXJnZXQgbmFtZT0iYWxsLW1pbmd3IiBwYXRoPSJsaWJyYXJ5L3dpbjMyIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHM+LWYgbWFrZV9taW5ndy5tYWs8L2J1aWxkQXJndW1lbnRzPgotPGJ1aWxkVGFyZ2V0PmFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJjbGVhbiIgcGF0aD0ibGlicmFyeS93aW4zMiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbWluZ3cubWFrPC9idWlsZEFyZ3VtZW50cz4KLTxidWlsZFRhcmdldD5jbGVhbjwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJsaW51eC1hbGwiIHBhdGg9ImxpYnJhcnkvZ3RrIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHM+LWYgbWFrZV9saW51eC5tYWs8L2J1aWxkQXJndW1lbnRzPgotPGJ1aWxkVGFyZ2V0PmFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJjbGVhbiIgcGF0aD0ibGlicmFyeS9ndGsiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cz4tZiBtYWtlX2xpbnV4Lm1hazwvYnVpbGRBcmd1bWVudHM+Ci08YnVpbGRUYXJnZXQ+Y2xlYW48L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0iYWxsIiBwYXRoPSJsaWJyYXJ5L2NhcmJvbiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbWFjb3N4Lm1hazwvYnVpbGRBcmd1bWVudHM+Ci08YnVpbGRUYXJnZXQ+YWxsPC9idWlsZFRhcmdldD4KLTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci08dXNlRGVmYXVsdENvbW1hbmQ+ZmFsc2U8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08dGFyZ2V0IG5hbWU9ImNsZWFuIiBwYXRoPSJsaWJyYXJ5L2NhcmJvbiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzPi1mIG1ha2VfbWFjb3N4Lm1hazwvYnVpbGRBcmd1bWVudHM+Ci08YnVpbGRUYXJnZXQ+Y2xlYW48L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD5mYWxzZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0ibGludXgtYWxsIiBwYXRoPSJsaWJyYXJ5L21vdGlmIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHM+LWYgbWFrZV9saW51eC5tYWs8L2J1aWxkQXJndW1lbnRzPgotPGJ1aWxkVGFyZ2V0PmFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPmZhbHNlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTwvdGFyZ2V0PgotPC9idWlsZFRhcmdldHM+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5kZWZhdWx0Q29uZmlnRGF0YVByb3ZpZGVyIiBpZD0iY29udmVydGVkLmNvbmZpZy4xNTI5NjAyODMzIiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9ImNvbnZlcnRlZENvbmZpZyI+Ci08ZXh0ZXJuYWxTZXR0aW5ncy8+Ci08ZXh0ZW5zaW9ucz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVMRiIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuUEUiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiLz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLk1hY2hPIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIj4KLTxhdHRyaWJ1dGUga2V5PSJjKytmaWx0IiB2YWx1ZT0iYysrZmlsdCIvPgotPC9leHRlbnNpb24+Ci08L2V4dGVuc2lvbnM+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08L2Njb25maWd1cmF0aW9uPgotPC9zdG9yYWdlTW9kdWxlPgotPC9jcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1NDQ2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjgxYjIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08Y29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIiB2ZXJzaW9uPSIyIj4KLSAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2VxdWlub3gvbGF1bmNoZXIvTWFpbi5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLk1haW4kRWNsaXBzZVBvbGljeSI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjY0NzAwNDE5MyI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuTWFpbi5FY2xpcHNlUG9saWN5LmltcGxpZXMoUHJvdGVjdGlvbkRvbWFpbiwgUGVybWlzc2lvbikiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iUG9saWN5Ii8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImltcGxpZXMoUHJvdGVjdGlvbkRvbWFpbiwgUGVybWlzc2lvbikiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iSjJTRS0xLjMiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgIDwvZmlsdGVyPgotICAgICAgICA8ZmlsdGVyIGlkPSI2NDcwMDQxOTMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLk1haW4uRWNsaXBzZVBvbGljeS5nZXRQZXJtaXNzaW9ucyhQcm90ZWN0aW9uRG9tYWluKSIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJQb2xpY3kiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0UGVybWlzc2lvbnMoUHJvdGVjdGlvbkRvbWFpbikiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iSjJTRS0xLjMiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgIDwvZmlsdGVyPgotICAgIDwvcmVzb3VyY2U+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzlkMmIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotI1dlZCBBcHIgMDggMDk6MzY6MDUgRURUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlMmNmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNUdWUgQXVnIDIxIDExOjMwOjU5IENEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTIxZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBOb3YgMTMgMTE6MDA6MzggRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDExMWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wLnF1YWxpZmllcgotTWFpbi1DbGFzczogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5NYWluCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogT1NHaS9NaW5pbXVtLTEuMgotQnVuZGxlLUxvY2FsaXphdGlvbjogbGF1bmNoZXIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5sYXVuY2hlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXI7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ZGYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlMzAxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGxhdW5jaGVyLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTAvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmZGI1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTA8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkwL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODE5OTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTA7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIKLUVjbGlwc2UtUGxhdGZvcm1GaWx0ZXI6ICgmIChvc2dpLndzPWd0aykgKG9zZ2kub3M9bGludXgpIChvc2dpLmFyY2g9czM5MCkpCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBsYXVuY2hlci5ndGsubGludXguczM5MAotRWNsaXBzZS1CdW5kbGVTaGFwZTogZGlyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTAvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MjM5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkwL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2MwNjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlXyouc28sXAotICAgICAgICAgICAgICAgbGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTAucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi0gICAgICAgICAgICAgICAKLWN1c3RvbUJ1aWxkQ2FsbGJhY2tzPWN1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkwL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkwL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjOGVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KLTwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCQk8ZWNobyBtZXNzYWdlPSJUaGlzIGZpbGUgbXVzdCBiZSBjYWxsZWQgd2l0aCBleHBsaWNpdCB0YXJnZXRzIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLmphcnMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLmphcnMiPgkKLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYmFzZS5kaXIgLSByb290IG9mIHRoZSBwcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciBjb250YWluaW5nIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tICAgdGFyZ2V0LmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHt0YXJnZXQuZm9sZGVyfSIgaW5jbHVkZXM9ImVjbGlwc2VfKiIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmxvZ3MiPiAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmxvZ3MiPiAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmNsZWFuIj4gICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHBsdWdpbi5kZXN0aW5hdGlvbiAtIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBidWlsZCAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRlbXAuZm9sZGVyIC0gdGVtcG9yYXJ5IGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmNsZWFuIj4gICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MC9sYXVuY2hlci5ndGsubGludXguczM5MC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTAvbGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTAucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4MjI5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MC9sYXVuY2hlci5ndGsubGludXguczM5MC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IExhdW5jaGVyIExpbnV4IHMzOTAgRnJhZ21lbnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnIC0gRXF1aW5veApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzEzYTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2EyMzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXI7YnVuZGxlLXZlcnNpb249IjEuMC4wIgotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9Z3RrKSAob3NnaS5vcz1saW51eCkgKG9zZ2kuYXJjaD1zMzkweCkpCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBsYXVuY2hlci5ndGsubGludXguczM5MHgKLUVjbGlwc2UtQnVuZGxlU2hhcGU6IGRpcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4L2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MHgvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MjM5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MHgvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MHgvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjEzOTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZWNsaXBzZV8qLnNvLFwKLSAgICAgICAgICAgICAgIGxhdW5jaGVyLmd0ay5saW51eC5zMzkweC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLSAgICAgICAgICAgICAgIAotY3VzdG9tQnVpbGRDYWxsYmFja3M9Y3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4L2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzhlZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4L2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQ3VzdG9tIHRhcmdldHMgY2FsbGVkIGZyb20gYSBwcm9qZWN0J3MgZ2VuZXJhdGVkIGJ1aWxkLnhtbCAgICAgICAgICAgIC0tPgotPCEtLSBTZXQgY3VzdG9tQnVpbGRDYWxsYmFja3M9PHBhdGgvdG8vdGhpcy9maWxlPiBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMuLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IlRoaXMgZmlsZSBtdXN0IGJlIGNhbGxlZCB3aXRoIGV4cGxpY2l0IHRhcmdldHMiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuamFycyI+CQotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5iaW4ucGFydHMiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBiYXNlLmRpciAtIHJvb3Qgb2YgdGhlIHByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke3RhcmdldC5mb2xkZXJ9IiBpbmNsdWRlcz0iZWNsaXBzZV8qIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIubG9ncyI+ICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIubG9ncyI+ICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuY2xlYW4iPiAgICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgcGx1Z2luLmRlc3RpbmF0aW9uIC0gZmluYWwgZGVzdGluYXRpb24gb2YgdGhlIGJ1aWxkICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIHJlc3VsdHMgb2YgdGhlIGNvbXBpbGF0aW9uICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgdGVtcC5mb2xkZXIgLSB0ZW1wb3JhcnkgZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuY2xlYW4iPiAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweC9sYXVuY2hlci5ndGsubGludXguczM5MHgucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweC9sYXVuY2hlci5ndGsubGludXguczM5MHgucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwYjBhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MHgvbGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTB4LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggTGF1bmNoZXIgTGludXggczM5MHggRnJhZ21lbnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnIC0gRXF1aW5veApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODE3ZDI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLng4Ni8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzg5NzE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLng4Ni9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLng4NjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMi4wKSIKLUVjbGlwc2UtUGxhdGZvcm1GaWx0ZXI6ICgmIChvc2dpLndzPWd0aykgKG9zZ2kub3M9c29sYXJpcykgKG9zZ2kuYXJjaD14ODYpKQotQnVuZGxlLUxvY2FsaXphdGlvbjogbGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2Ci1FY2xpcHNlLUJ1bmRsZVNoYXBlOiBkaXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLng4Ni9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWRmM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLng4Ni9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjU1MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlXyouc28sXAotICAgICAgICAgICAgICAgbGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotICAgICAgICAgICAgICAgCi1jdXN0b21CdWlsZENhbGxiYWNrcz1jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsuc29sYXJpcy54ODYvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2L2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjOGVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvY29udHJpYnV0ZWQvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsuc29sYXJpcy54ODYvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBDdXN0b20gdGFyZ2V0cyBjYWxsZWQgZnJvbSBhIHByb2plY3QncyBnZW5lcmF0ZWQgYnVpbGQueG1sICAgICAgICAgICAgLS0+Ci08IS0tIFNldCBjdXN0b21CdWlsZENhbGxiYWNrcz08cGF0aC90by90aGlzL2ZpbGU+IGluIHlvdXIgYnVpbGQucHJvcGVydGllcy4tLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHByb2plY3QgbmFtZT0iQnVpbGQgc3BlY2lmaWMgdGFyZ2V0cyBhbmQgcHJvcGVydGllcyIgZGVmYXVsdD0ibm9EZWZhdWx0Ij4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVGhpcyBmaWxlIG11c3QgYmUgY2FsbGVkIHdpdGggZXhwbGljaXQgdGFyZ2V0cyIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5qYXJzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5qYXJzIj4JCi0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5iaW4ucGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJhc2UuZGlyIC0gcm9vdCBvZiB0aGUgcHJvamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgY29udGFpbmluZyB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5iaW4ucGFydHMiPgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7dGFyZ2V0LmZvbGRlcn0iIGluY2x1ZGVzPSJlY2xpcHNlXyoiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5sb2dzIj4gICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5sb2dzIj4gICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5jbGVhbiI+ICAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBwbHVnaW4uZGVzdGluYXRpb24gLSBmaW5hbCBkZXN0aW5hdGlvbiBvZiB0aGUgYnVpbGQgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0ZW1wLmZvbGRlciAtIHRlbXBvcmFyeSBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5jbGVhbiI+ICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2L2xhdW5jaGVyLmd0ay5zb2xhcmlzLng4Ni5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2NvbnRyaWJ1dGVkL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMueDg2L2xhdW5jaGVyLmd0ay5zb2xhcmlzLng4Ni5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzZiZGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9jb250cmlidXRlZC9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLng4Ni9sYXVuY2hlci5ndGsuc29sYXJpcy54ODYucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBMYXVuY2hlciBTb2xhcmlzIFg4NiBGcmFnbWVudAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcgLSBFcXVpbm94CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY2FyYm9uLm1hY29zeC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jYXJib24ubWFjb3N4Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmEyYjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jYXJib24ubWFjb3N4Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jYXJib24ubWFjb3N4PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTlmZWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jYXJib24ubWFjb3N4Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1dlZCBEZWMgMDYgMTE6MzU6NDQgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY2FyYm9uLm1hY29zeC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyNGUxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY2FyYm9uLm1hY29zeC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3g7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjIuMCkiCi1FY2xpcHNlLVBsYXRmb3JtRmlsdGVyOiAoJiAob3NnaS53cz1jYXJib24pIChvc2dpLm9zPW1hY29zeCkgKHwob3NnaS5hcmNoPXg4Nikob3NnaS5hcmNoPXBwYykpICkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGxhdW5jaGVyLmNhcmJvbi5tYWNvc3gKLUVjbGlwc2UtQnVuZGxlU2hhcGU6IGRpcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jYXJib24ubWFjb3N4L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWRmM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jYXJib24ubWFjb3N4L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZDJlNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfKi5zbyxcCi0gICAgICAgICAgICAgICBsYXVuY2hlci5jYXJib24ubWFjb3N4LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotICAgICAgICAgICAgICAgCi1jdXN0b21CdWlsZENhbGxiYWNrcz1jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY2FyYm9uLm1hY29zeC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY2FyYm9uLm1hY29zeC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzhlZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBDdXN0b20gdGFyZ2V0cyBjYWxsZWQgZnJvbSBhIHByb2plY3QncyBnZW5lcmF0ZWQgYnVpbGQueG1sICAgICAgICAgICAgLS0+Ci08IS0tIFNldCBjdXN0b21CdWlsZENhbGxiYWNrcz08cGF0aC90by90aGlzL2ZpbGU+IGluIHlvdXIgYnVpbGQucHJvcGVydGllcy4tLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHByb2plY3QgbmFtZT0iQnVpbGQgc3BlY2lmaWMgdGFyZ2V0cyBhbmQgcHJvcGVydGllcyIgZGVmYXVsdD0ibm9EZWZhdWx0Ij4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVGhpcyBmaWxlIG11c3QgYmUgY2FsbGVkIHdpdGggZXhwbGljaXQgdGFyZ2V0cyIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5qYXJzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5qYXJzIj4JCi0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5iaW4ucGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJhc2UuZGlyIC0gcm9vdCBvZiB0aGUgcHJvamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgY29udGFpbmluZyB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5iaW4ucGFydHMiPgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7dGFyZ2V0LmZvbGRlcn0iIGluY2x1ZGVzPSJlY2xpcHNlXyoiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5sb2dzIj4gICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5sb2dzIj4gICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5jbGVhbiI+ICAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBwbHVnaW4uZGVzdGluYXRpb24gLSBmaW5hbCBkZXN0aW5hdGlvbiBvZiB0aGUgYnVpbGQgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0ZW1wLmZvbGRlciAtIHRlbXBvcmFyeSBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5jbGVhbiI+ICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvbGF1bmNoZXIuY2FyYm9uLm1hY29zeC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3gvbGF1bmNoZXIuY2FyYm9uLm1hY29zeC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjZmNzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jYXJib24ubWFjb3N4L2xhdW5jaGVyLmNhcmJvbi5tYWNvc3gucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBMYXVuY2hlciBNYWNPU1ggQ2FyYm9uIEZyYWdtZW50Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZyAtIEVxdWlub3gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNvY29hLm1hY29zeC54ODZfNjQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzE0ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNvY29hLm1hY29zeC54ODZfNjQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNvY29hLm1hY29zeC54ODZfNjQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4Lng4Nl82NC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGVjYjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4Lng4Nl82NDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMi4wKSIKLUVjbGlwc2UtUGxhdGZvcm1GaWx0ZXI6ICgmIChvc2dpLndzPWNvY29hKSAob3NnaS5vcz1tYWNvc3gpIChvc2dpLmFyY2g9eDg2XzY0KSApCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBsYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0Ci1FY2xpcHNlLUJ1bmRsZVNoYXBlOiBkaXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0L2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4Lng4Nl82NC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVkZjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0L2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4Lng4Nl82NC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDY0MmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlXyouc28sXAotICAgICAgICAgICAgICAgbGF1bmNoZXIuY29jb2EubWFjb3N4Lng4Nl82NC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLSAgICAgICAgICAgICAgIAotY3VzdG9tQnVpbGRDYWxsYmFja3M9Y3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNvY29hLm1hY29zeC54ODZfNjQvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNvY29hLm1hY29zeC54ODZfNjQvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmM4ZWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0L2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQ3VzdG9tIHRhcmdldHMgY2FsbGVkIGZyb20gYSBwcm9qZWN0J3MgZ2VuZXJhdGVkIGJ1aWxkLnhtbCAgICAgICAgICAgIC0tPgotPCEtLSBTZXQgY3VzdG9tQnVpbGRDYWxsYmFja3M9PHBhdGgvdG8vdGhpcy9maWxlPiBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMuLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IlRoaXMgZmlsZSBtdXN0IGJlIGNhbGxlZCB3aXRoIGV4cGxpY2l0IHRhcmdldHMiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuamFycyI+CQotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5iaW4ucGFydHMiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBiYXNlLmRpciAtIHJvb3Qgb2YgdGhlIHByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke3RhcmdldC5mb2xkZXJ9IiBpbmNsdWRlcz0iZWNsaXBzZV8qIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIubG9ncyI+ICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIubG9ncyI+ICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuY2xlYW4iPiAgICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgcGx1Z2luLmRlc3RpbmF0aW9uIC0gZmluYWwgZGVzdGluYXRpb24gb2YgdGhlIGJ1aWxkICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIHJlc3VsdHMgb2YgdGhlIGNvbXBpbGF0aW9uICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgdGVtcC5mb2xkZXIgLSB0ZW1wb3JhcnkgZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuY2xlYW4iPiAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0L2xhdW5jaGVyLmNvY29hLm1hY29zeC54ODZfNjQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0L2xhdW5jaGVyLmNvY29hLm1hY29zeC54ODZfNjQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5YmU5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4Lng4Nl82NC9sYXVuY2hlci5jb2NvYS5tYWNvc3gueDg2XzY0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggTGF1bmNoZXIgTWFjT1NYIENvY29hIEZyYWdtZW50Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZyAtIEVxdWlub3gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2NlYWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNvY29hLm1hY29zeDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDIxYTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3g7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjIuMCkiCi1FY2xpcHNlLVBsYXRmb3JtRmlsdGVyOiAoJiAob3NnaS53cz1jb2NvYSkgKG9zZ2kub3M9bWFjb3N4KSAofChvc2dpLmFyY2g9eDg2KShvc2dpLmFyY2g9cHBjKSkgKQotQnVuZGxlLUxvY2FsaXphdGlvbjogbGF1bmNoZXIuY29jb2EubWFjb3N4Ci1FY2xpcHNlLUJ1bmRsZVNoYXBlOiBkaXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ZGYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmYTI1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlXyouc28sXAotICAgICAgICAgICAgICAgbGF1bmNoZXIuY29jb2EubWFjb3N4LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotICAgICAgICAgICAgICAgCi1jdXN0b21CdWlsZENhbGxiYWNrcz1jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY29jb2EubWFjb3N4L2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmM4ZWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBDdXN0b20gdGFyZ2V0cyBjYWxsZWQgZnJvbSBhIHByb2plY3QncyBnZW5lcmF0ZWQgYnVpbGQueG1sICAgICAgICAgICAgLS0+Ci08IS0tIFNldCBjdXN0b21CdWlsZENhbGxiYWNrcz08cGF0aC90by90aGlzL2ZpbGU+IGluIHlvdXIgYnVpbGQucHJvcGVydGllcy4tLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHByb2plY3QgbmFtZT0iQnVpbGQgc3BlY2lmaWMgdGFyZ2V0cyBhbmQgcHJvcGVydGllcyIgZGVmYXVsdD0ibm9EZWZhdWx0Ij4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVGhpcyBmaWxlIG11c3QgYmUgY2FsbGVkIHdpdGggZXhwbGljaXQgdGFyZ2V0cyIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5qYXJzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5qYXJzIj4JCi0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5iaW4ucGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJhc2UuZGlyIC0gcm9vdCBvZiB0aGUgcHJvamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgY29udGFpbmluZyB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5iaW4ucGFydHMiPgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7dGFyZ2V0LmZvbGRlcn0iIGluY2x1ZGVzPSJlY2xpcHNlXyoiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5sb2dzIj4gICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5sb2dzIj4gICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5jbGVhbiI+ICAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBwbHVnaW4uZGVzdGluYXRpb24gLSBmaW5hbCBkZXN0aW5hdGlvbiBvZiB0aGUgYnVpbGQgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0ZW1wLmZvbGRlciAtIHRlbXBvcmFyeSBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5jbGVhbiI+ICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNvY29hLm1hY29zeC9sYXVuY2hlci5jb2NvYS5tYWNvc3gucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5jb2NvYS5tYWNvc3gvbGF1bmNoZXIuY29jb2EubWFjb3N4LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWJlOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNvY29hLm1hY29zeC9sYXVuY2hlci5jb2NvYS5tYWNvc3gucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBMYXVuY2hlciBNYWNPU1ggQ29jb2EgRnJhZ21lbnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnIC0gRXF1aW5veApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiNjM0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1ZjAyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNXZWQgRGVjIDA2IDExOjQ0OjAwIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZTI2OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDAucXVhbGlmaWVyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4yLjApIgotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9Z3RrKSAob3NnaS5vcz1saW51eCkgKG9zZ2kuYXJjaD1wcGMpKQotQnVuZGxlLUxvY2FsaXphdGlvbjogbGF1bmNoZXIuZ3RrLmxpbnV4LnBwYwotRWNsaXBzZS1CdW5kbGVTaGFwZTogZGlyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ZGYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0NTMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZWNsaXBzZV8qLnNvLFwKLSAgICAgICAgICAgICAgIGxhdW5jaGVyLmd0ay5saW51eC5wcGMucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi0gICAgICAgICAgICAgICAKLWN1c3RvbUJ1aWxkQ2FsbGJhY2tzPWN1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjOGVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KLTwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCQk8ZWNobyBtZXNzYWdlPSJUaGlzIGZpbGUgbXVzdCBiZSBjYWxsZWQgd2l0aCBleHBsaWNpdCB0YXJnZXRzIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLmphcnMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLmphcnMiPgkKLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYmFzZS5kaXIgLSByb290IG9mIHRoZSBwcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciBjb250YWluaW5nIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tICAgdGFyZ2V0LmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHt0YXJnZXQuZm9sZGVyfSIgaW5jbHVkZXM9ImVjbGlwc2VfKiIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmxvZ3MiPiAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmxvZ3MiPiAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmNsZWFuIj4gICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHBsdWdpbi5kZXN0aW5hdGlvbiAtIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBidWlsZCAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRlbXAuZm9sZGVyIC0gdGVtcG9yYXJ5IGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmNsZWFuIj4gICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy9sYXVuY2hlci5ndGsubGludXgucHBjLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy9sYXVuY2hlci5ndGsubGludXgucHBjLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYjQ3ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGMvbGF1bmNoZXIuZ3RrLmxpbnV4LnBwYy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IExhdW5jaGVyIExpbnV4IFBQQyBGcmFnbWVudAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcgLSBFcXVpbm94CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYzY0Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGM2NC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZDU0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYzY0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjNjQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYzY0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGM2NC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiNTYwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYzY0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYzY0O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4yLjApIgotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9Z3RrKSAob3NnaS5vcz1saW51eCkgKG9zZ2kuYXJjaD1wcGM2NCkpCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBsYXVuY2hlci5ndGsubGludXgucHBjNjQKLUVjbGlwc2UtQnVuZGxlU2hhcGU6IGRpcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGM2NC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGM2NC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVkZjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjNjQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGM2NC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGM2NC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzU2YmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjNjQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfKi5zbyxcCi0gICAgICAgICAgICAgICBsYXVuY2hlci5ndGsubGludXgucHBjNjQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi0gICAgICAgICAgICAgICAKLWN1c3RvbUJ1aWxkQ2FsbGJhY2tzPWN1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgucHBjNjQvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGM2NC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzhlZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGM2NC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KLTwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCQk8ZWNobyBtZXNzYWdlPSJUaGlzIGZpbGUgbXVzdCBiZSBjYWxsZWQgd2l0aCBleHBsaWNpdCB0YXJnZXRzIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLmphcnMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLmphcnMiPgkKLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYmFzZS5kaXIgLSByb290IG9mIHRoZSBwcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciBjb250YWluaW5nIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tICAgdGFyZ2V0LmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHt0YXJnZXQuZm9sZGVyfSIgaW5jbHVkZXM9ImVjbGlwc2VfKiIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmxvZ3MiPiAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmxvZ3MiPiAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmNsZWFuIj4gICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHBsdWdpbi5kZXN0aW5hdGlvbiAtIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBidWlsZCAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRlbXAuZm9sZGVyIC0gdGVtcG9yYXJ5IGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmNsZWFuIj4gICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYzY0L2xhdW5jaGVyLmd0ay5saW51eC5wcGM2NC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGM2NC9sYXVuY2hlci5ndGsubGludXgucHBjNjQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NjNlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYzY0L2xhdW5jaGVyLmd0ay5saW51eC5wcGM2NC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IExhdW5jaGVyIExpbnV4IFBQQzY0IEZyYWdtZW50Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZyAtIEVxdWlub3gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzhhZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODY8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Ni9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGQwMGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4NjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMi4wKSIKLUVjbGlwc2UtUGxhdGZvcm1GaWx0ZXI6ICgmIChvc2dpLndzPWd0aykgKG9zZ2kub3M9bGludXgpIChvc2dpLmFyY2g9eDg2KSkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGxhdW5jaGVyLmd0ay5saW51eC54ODYKLUVjbGlwc2UtQnVuZGxlU2hhcGU6IGRpcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWRmM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODE5NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfKi5zbyxcCi0gICAgICAgICAgICAgICBsYXVuY2hlci5ndGsubGludXgueDg2LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotICAgICAgICAgICAgICAgCi1jdXN0b21CdWlsZENhbGxiYWNrcz1jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Ni9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Ni9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzhlZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBDdXN0b20gdGFyZ2V0cyBjYWxsZWQgZnJvbSBhIHByb2plY3QncyBnZW5lcmF0ZWQgYnVpbGQueG1sICAgICAgICAgICAgLS0+Ci08IS0tIFNldCBjdXN0b21CdWlsZENhbGxiYWNrcz08cGF0aC90by90aGlzL2ZpbGU+IGluIHlvdXIgYnVpbGQucHJvcGVydGllcy4tLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHByb2plY3QgbmFtZT0iQnVpbGQgc3BlY2lmaWMgdGFyZ2V0cyBhbmQgcHJvcGVydGllcyIgZGVmYXVsdD0ibm9EZWZhdWx0Ij4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVGhpcyBmaWxlIG11c3QgYmUgY2FsbGVkIHdpdGggZXhwbGljaXQgdGFyZ2V0cyIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5qYXJzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5qYXJzIj4JCi0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5iaW4ucGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJhc2UuZGlyIC0gcm9vdCBvZiB0aGUgcHJvamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgY29udGFpbmluZyB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5iaW4ucGFydHMiPgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7dGFyZ2V0LmZvbGRlcn0iIGluY2x1ZGVzPSJlY2xpcHNlXyoiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5sb2dzIj4gICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5sb2dzIj4gICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5jbGVhbiI+ICAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBwbHVnaW4uZGVzdGluYXRpb24gLSBmaW5hbCBkZXN0aW5hdGlvbiBvZiB0aGUgYnVpbGQgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0ZW1wLmZvbGRlciAtIHRlbXBvcmFyeSBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5jbGVhbiI+ICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYvbGF1bmNoZXIuZ3RrLmxpbnV4Lng4Ni5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYvbGF1bmNoZXIuZ3RrLmxpbnV4Lng4Ni5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBjNWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2L2xhdW5jaGVyLmd0ay5saW51eC54ODYucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBMYXVuY2hlciBMaW51eCBYODYgRnJhZ21lbnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnIC0gRXF1aW5veApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWExODcyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2XzY0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2XzY0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2NzkwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNXZWQgRGVjIDA2IDExOjQ2OjQ3IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2XzY0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTk4NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2XzY0O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDAucXVhbGlmaWVyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4yLjApIgotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9Z3RrKSAob3NnaS5vcz1saW51eCkgKG9zZ2kuYXJjaD14ODZfNjQpKQotQnVuZGxlLUxvY2FsaXphdGlvbjogbGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NAotRWNsaXBzZS1CdW5kbGVTaGFwZTogZGlyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ZGYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkMzcxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZWNsaXBzZV8qLnNvLFwKLSAgICAgICAgICAgICAgIGxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi0gICAgICAgICAgICAgICAKLWN1c3RvbUJ1aWxkQ2FsbGJhY2tzPWN1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzhlZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBDdXN0b20gdGFyZ2V0cyBjYWxsZWQgZnJvbSBhIHByb2plY3QncyBnZW5lcmF0ZWQgYnVpbGQueG1sICAgICAgICAgICAgLS0+Ci08IS0tIFNldCBjdXN0b21CdWlsZENhbGxiYWNrcz08cGF0aC90by90aGlzL2ZpbGU+IGluIHlvdXIgYnVpbGQucHJvcGVydGllcy4tLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHByb2plY3QgbmFtZT0iQnVpbGQgc3BlY2lmaWMgdGFyZ2V0cyBhbmQgcHJvcGVydGllcyIgZGVmYXVsdD0ibm9EZWZhdWx0Ij4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVGhpcyBmaWxlIG11c3QgYmUgY2FsbGVkIHdpdGggZXhwbGljaXQgdGFyZ2V0cyIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5qYXJzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5qYXJzIj4JCi0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5iaW4ucGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJhc2UuZGlyIC0gcm9vdCBvZiB0aGUgcHJvamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgY29udGFpbmluZyB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5iaW4ucGFydHMiPgotCQk8Y2htb2QgcGVybT0iNzU1IiBkaXI9IiR7dGFyZ2V0LmZvbGRlcn0iIGluY2x1ZGVzPSJlY2xpcHNlXyoiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5sb2dzIj4gICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5sb2dzIj4gICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5jbGVhbiI+ICAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBwbHVnaW4uZGVzdGluYXRpb24gLSBmaW5hbCBkZXN0aW5hdGlvbiBvZiB0aGUgYnVpbGQgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0ZW1wLmZvbGRlciAtIHRlbXBvcmFyeSBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5jbGVhbiI+ICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQvbGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQvbGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTViMmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2XzY0L2xhdW5jaGVyLmd0ay5saW51eC54ODZfNjQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBMYXVuY2hlciBMaW51eCBYODZfNjQgRnJhZ21lbnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnIC0gRXF1aW5veApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjFmMzk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsuc29sYXJpcy5zcGFyYy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxNzIwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jV2VkIERlYyAwNiAxMTo0MDoyMSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjdkN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjIuMCkiCi1FY2xpcHNlLVBsYXRmb3JtRmlsdGVyOiAoJiAob3NnaS53cz1ndGspIChvc2dpLm9zPXNvbGFyaXMpIChvc2dpLmFyY2g9c3BhcmMpKQotQnVuZGxlLUxvY2FsaXphdGlvbjogbGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMKLUVjbGlwc2UtQnVuZGxlU2hhcGU6IGRpcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ZGYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlZTUxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfKi5zbyxcCi0gICAgICAgICAgICAgICBsYXVuY2hlci5ndGsuc29sYXJpcy5zcGFyYy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLSAgICAgICAgICAgICAgIAotY3VzdG9tQnVpbGRDYWxsYmFja3M9Y3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsuc29sYXJpcy5zcGFyYy9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzhlZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQ3VzdG9tIHRhcmdldHMgY2FsbGVkIGZyb20gYSBwcm9qZWN0J3MgZ2VuZXJhdGVkIGJ1aWxkLnhtbCAgICAgICAgICAgIC0tPgotPCEtLSBTZXQgY3VzdG9tQnVpbGRDYWxsYmFja3M9PHBhdGgvdG8vdGhpcy9maWxlPiBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMuLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IlRoaXMgZmlsZSBtdXN0IGJlIGNhbGxlZCB3aXRoIGV4cGxpY2l0IHRhcmdldHMiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuamFycyI+CQotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5iaW4ucGFydHMiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBiYXNlLmRpciAtIHJvb3Qgb2YgdGhlIHByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke3RhcmdldC5mb2xkZXJ9IiBpbmNsdWRlcz0iZWNsaXBzZV8qIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIubG9ncyI+ICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIubG9ncyI+ICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuY2xlYW4iPiAgICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgcGx1Z2luLmRlc3RpbmF0aW9uIC0gZmluYWwgZGVzdGluYXRpb24gb2YgdGhlIGJ1aWxkICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIHJlc3VsdHMgb2YgdGhlIGNvbXBpbGF0aW9uICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgdGVtcC5mb2xkZXIgLSB0ZW1wb3JhcnkgZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuY2xlYW4iPiAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsuc29sYXJpcy5zcGFyYy9sYXVuY2hlci5ndGsuc29sYXJpcy5zcGFyYy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjL2xhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZmViZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjL2xhdW5jaGVyLmd0ay5zb2xhcmlzLnNwYXJjLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggTGF1bmNoZXIgU3BhcmMgRnJhZ21lbnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnIC0gRXF1aW5veApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmFpeC5wcGMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlMzE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5haXgucHBjLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5haXgucHBjLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5Mzk2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNXZWQgRGVjIDA2IDExOjQxOjI3IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5haXgucHBjL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmFpeC5wcGMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2NhMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmFpeC5wcGMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5haXgucHBjO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDAucXVhbGlmaWVyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4yLjApIgotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9bW90aWYpIChvc2dpLm9zPWFpeCkgKG9zZ2kuYXJjaD1wcGMpKQotQnVuZGxlLUxvY2FsaXphdGlvbjogbGF1bmNoZXIubW90aWYuYWl4LnBwYwotRWNsaXBzZS1CdW5kbGVTaGFwZTogZGlyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmFpeC5wcGMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ZGYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmFpeC5wcGMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5MGUyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZWNsaXBzZV8qLnNvLFwKLSAgICAgICAgICAgICAgIGxpYmVjbGlwc2UtbW90aWYuc28sIFwKLSAgICAgICAgICAgICAgIGxhdW5jaGVyLm1vdGlmLmFpeC5wcGMucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi0gICAgICAgICAgICAgICAKLWN1c3RvbUJ1aWxkQ2FsbGJhY2tzPWN1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5haXgucHBjL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5haXgucHBjL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjOGVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KLTwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCQk8ZWNobyBtZXNzYWdlPSJUaGlzIGZpbGUgbXVzdCBiZSBjYWxsZWQgd2l0aCBleHBsaWNpdCB0YXJnZXRzIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLmphcnMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLmphcnMiPgkKLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYmFzZS5kaXIgLSByb290IG9mIHRoZSBwcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciBjb250YWluaW5nIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tICAgdGFyZ2V0LmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHt0YXJnZXQuZm9sZGVyfSIgaW5jbHVkZXM9ImVjbGlwc2VfKiIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmxvZ3MiPiAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmxvZ3MiPiAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmNsZWFuIj4gICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHBsdWdpbi5kZXN0aW5hdGlvbiAtIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBidWlsZCAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRlbXAuZm9sZGVyIC0gdGVtcG9yYXJ5IGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmNsZWFuIj4gICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy9sYXVuY2hlci5tb3RpZi5haXgucHBjLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYy9sYXVuY2hlci5tb3RpZi5haXgucHBjLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzRhNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmFpeC5wcGMvbGF1bmNoZXIubW90aWYuYWl4LnBwYy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IExhdW5jaGVyIEFJWCBQUEMgRnJhZ21lbnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnIC0gRXF1aW5veApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguUEFfUklTQy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LlBBX1JJU0MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5N2E2NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguUEFfUklTQy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5QQV9SSVNDPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguUEFfUklTQy9SRUFETUUuVFhUIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguUEFfUklTQy9SRUFETUUuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmZlMzkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LlBBX1JJU0MvUkVBRE1FLlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhlIG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5QQV9SSVNDIGxhdW5jaGVyIGlzIG5vIGxvbmdlciBtYWludGFpbmVkLiAgCi1Db250ZW50IGhhcyBiZWVuIGRlbGV0ZWQuICBUaGUgdGFnIHYyMDEwMDExOCBjb250YWlucyB0aGUgbGFzdCBjb250ZW50IGJlZm9yZSBkZWxldGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguaWE2NF8zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiY2Q4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LmlhNjRfMzI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguaWE2NF8zMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlOGViMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDAucXVhbGlmaWVyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4yLjApIgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9bW90aWYpIChvc2dpLm9zPWhwdXgpIChvc2dpLmFyY2g9aWE2NF8zMikgKQotQnVuZGxlLUxvY2FsaXphdGlvbjogbGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyCi1FY2xpcHNlLUJ1bmRsZVNoYXBlOiBkaXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LmlhNjRfMzIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LmlhNjRfMzIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ZGYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LmlhNjRfMzIvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LmlhNjRfMzIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4Yjg0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlXyouc28sXAotICAgICAgICAgICAgICAgbGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotICAgICAgICAgICAgICAgCi1jdXN0b21CdWlsZENhbGxiYWNrcz1jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguaWE2NF8zMi9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjOGVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQ3VzdG9tIHRhcmdldHMgY2FsbGVkIGZyb20gYSBwcm9qZWN0J3MgZ2VuZXJhdGVkIGJ1aWxkLnhtbCAgICAgICAgICAgIC0tPgotPCEtLSBTZXQgY3VzdG9tQnVpbGRDYWxsYmFja3M9PHBhdGgvdG8vdGhpcy9maWxlPiBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMuLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IlRoaXMgZmlsZSBtdXN0IGJlIGNhbGxlZCB3aXRoIGV4cGxpY2l0IHRhcmdldHMiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuamFycyI+CQotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5iaW4ucGFydHMiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBiYXNlLmRpciAtIHJvb3Qgb2YgdGhlIHByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke3RhcmdldC5mb2xkZXJ9IiBpbmNsdWRlcz0iZWNsaXBzZV8qIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIubG9ncyI+ICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIubG9ncyI+ICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuY2xlYW4iPiAgICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgcGx1Z2luLmRlc3RpbmF0aW9uIC0gZmluYWwgZGVzdGluYXRpb24gb2YgdGhlIGJ1aWxkICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIHJlc3VsdHMgb2YgdGhlIGNvbXBpbGF0aW9uICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgdGVtcC5mb2xkZXIgLSB0ZW1wb3JhcnkgZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuY2xlYW4iPiAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LmlhNjRfMzIvbGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyL2xhdW5jaGVyLm1vdGlmLmhwdXguaWE2NF8zMi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmQzODdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LmlhNjRfMzIvbGF1bmNoZXIubW90aWYuaHB1eC5pYTY0XzMyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggTGF1bmNoZXIgSFBVWCBJQTY0XzMyIEZyYWdtZW50Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZyAtIEVxdWlub3gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5saW51eC54ODYvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYubGludXgueDg2Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTkyY2IwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5saW51eC54ODYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4NjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5saW51eC54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYubGludXgueDg2L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjN2UyODBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5saW51eC54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5saW51eC54ODY7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjIuMCkiCi1FY2xpcHNlLVBsYXRmb3JtRmlsdGVyOiAoJiAob3NnaS53cz1tb3RpZikgKG9zZ2kub3M9bGludXgpIChvc2dpLmFyY2g9eDg2KSkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4NgotRWNsaXBzZS1CdW5kbGVTaGFwZTogZGlyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYubGludXgueDg2L2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYubGludXgueDg2L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5NWRmM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4Ni9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYubGludXgueDg2L2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYubGludXgueDg2L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4Nzk4OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4Ni9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZWNsaXBzZV8qLnNvLFwKLSAgICAgICAgICAgICAgIGxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4Ni5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLSAgICAgICAgICAgICAgIAotY3VzdG9tQnVpbGRDYWxsYmFja3M9Y3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5saW51eC54ODYvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4Ni9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyYzhlZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4Ni9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KLTwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCQk8ZWNobyBtZXNzYWdlPSJUaGlzIGZpbGUgbXVzdCBiZSBjYWxsZWQgd2l0aCBleHBsaWNpdCB0YXJnZXRzIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLmphcnMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLmphcnMiPgkKLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYmFzZS5kaXIgLSByb290IG9mIHRoZSBwcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciBjb250YWluaW5nIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tICAgdGFyZ2V0LmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JCTxjaG1vZCBwZXJtPSI3NTUiIGRpcj0iJHt0YXJnZXQuZm9sZGVyfSIgaW5jbHVkZXM9ImVjbGlwc2VfKiIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmxvZ3MiPiAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmxvZ3MiPiAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmNsZWFuIj4gICAgICAgICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHBsdWdpbi5kZXN0aW5hdGlvbiAtIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBidWlsZCAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRlbXAuZm9sZGVyIC0gdGVtcG9yYXJ5IGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmNsZWFuIj4gICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYubGludXgueDg2L2xhdW5jaGVyLm1vdGlmLmxpbnV4Lng4Ni5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4Ni9sYXVuY2hlci5tb3RpZi5saW51eC54ODYucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyYmI5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYubGludXgueDg2L2xhdW5jaGVyLm1vdGlmLmxpbnV4Lng4Ni5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IExhdW5jaGVyIE1vdGlmIExpbnV4IFg4NiBGcmFnbWVudAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcgLSBFcXVpbm94CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuc29sYXJpcy5zcGFyYy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDU1YzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuc29sYXJpcy5zcGFyYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0YTJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuc29sYXJpcy5zcGFyYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogU3BhcmMgRnJhZ21lbnQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuc29sYXJpcy5zcGFyYztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMi4wKSIKLUVjbGlwc2UtUGxhdGZvcm1GaWx0ZXI6ICgmIChvc2dpLndzPW1vdGlmKSAob3NnaS5vcz1zb2xhcmlzKSAob3NnaS5hcmNoPXNwYXJjKSkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGxhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMKLUVjbGlwc2UtQnVuZGxlU2hhcGU6IGRpcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWRmM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDhiY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfKi5zbyxcCi0gICAgICAgICAgICAgICBsYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotICAgICAgICAgICAgICAgCi1jdXN0b21CdWlsZENhbGxiYWNrcz1jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmM4ZWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQ3VzdG9tIHRhcmdldHMgY2FsbGVkIGZyb20gYSBwcm9qZWN0J3MgZ2VuZXJhdGVkIGJ1aWxkLnhtbCAgICAgICAgICAgIC0tPgotPCEtLSBTZXQgY3VzdG9tQnVpbGRDYWxsYmFja3M9PHBhdGgvdG8vdGhpcy9maWxlPiBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMuLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IlRoaXMgZmlsZSBtdXN0IGJlIGNhbGxlZCB3aXRoIGV4cGxpY2l0IHRhcmdldHMiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuamFycyI+CQotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5iaW4ucGFydHMiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBiYXNlLmRpciAtIHJvb3Qgb2YgdGhlIHByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQkJPGNobW9kIHBlcm09Ijc1NSIgZGlyPSIke3RhcmdldC5mb2xkZXJ9IiBpbmNsdWRlcz0iZWNsaXBzZV8qIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIubG9ncyI+ICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIubG9ncyI+ICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuY2xlYW4iPiAgICAgICAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgcGx1Z2luLmRlc3RpbmF0aW9uIC0gZmluYWwgZGVzdGluYXRpb24gb2YgdGhlIGJ1aWxkICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIHJlc3VsdHMgb2YgdGhlIGNvbXBpbGF0aW9uICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgdGVtcC5mb2xkZXIgLSB0ZW1wb3JhcnkgZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuY2xlYW4iPiAgICAgICAgICAgICAKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjL2xhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjL2xhdW5jaGVyLm1vdGlmLnNvbGFyaXMuc3BhcmMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxMWEyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuc29sYXJpcy5zcGFyYy9sYXVuY2hlci5tb3RpZi5zb2xhcmlzLnNwYXJjLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggTGF1bmNoZXIgTW90aWYgU29sYXJpcyBTcGFyYyBGcmFnbWVudAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcgLSBFcXVpbm94CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIuaWE2NC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi5pYTY0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTY1NjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi5pYTY0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi5pYTY0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIuaWE2NC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmYjlhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIuaWE2NC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQ7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjEwMC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjIuMCkiCi1FY2xpcHNlLVBsYXRmb3JtRmlsdGVyOiAoJiAob3NnaS53cz13aW4zMikgKG9zZ2kub3M9d2luMzIpIChvc2dpLmFyY2g9aWE2NCkpCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBsYXVuY2hlci53aW4zMi53aW4zMi5pYTY0Ci1FY2xpcHNlLUJ1bmRsZVNoYXBlOiBkaXIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi5pYTY0L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWRmM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi5pYTY0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ODlmODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfKi5kbGwsXAotICAgICAgICAgICAgICAgbGF1bmNoZXIud2luMzIud2luMzIuaWE2NC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQvbGF1bmNoZXIud2luMzIud2luMzIuaWE2NC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQvbGF1bmNoZXIud2luMzIud2luMzIuaWE2NC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjU1M2NmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi5pYTY0L2xhdW5jaGVyLndpbjMyLndpbjMyLmlhNjQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBMYXVuY2hlciBXaW4zMiBJQTY0IEZyYWdtZW50Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZyAtIEVxdWlub3gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E5ZTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Ni8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMGUzMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Ni8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNXZWQgRGVjIDA2IDExOjI0OjI1IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTk1NTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODY7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDAucXVhbGlmaWVyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4yLjApIgotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9d2luMzIpIChvc2dpLm9zPXdpbjMyKSAob3NnaS5hcmNoPXg4NikpCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBsYXVuY2hlci53aW4zMi53aW4zMi54ODYKLUVjbGlwc2UtQnVuZGxlU2hhcGU6IGRpcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Ni9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Ni9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVkZjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Ni9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Ni9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTlmN2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfKi5kbGwsXAotICAgICAgICAgICAgICAgbGF1bmNoZXIud2luMzIud2luMzIueDg2LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2L2xhdW5jaGVyLndpbjMyLndpbjMyLng4Ni5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Ni9sYXVuY2hlci53aW4zMi53aW4zMi54ODYucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjYTYxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2L2xhdW5jaGVyLndpbjMyLndpbjMyLng4Ni5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IExhdW5jaGVyIFdpbjMyIFg4NiBGcmFnbWVudAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcgLSBFcXVpbm94CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2XzY0Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4Zjk3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2XzY0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODZfNjQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2XzY0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNzcwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2XzY0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2XzY0O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDAucXVhbGlmaWVyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4yLjApIgotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9d2luMzIpIChvc2dpLm9zPXdpbjMyKSAob3NnaS5hcmNoPXg4Nl82NCkpCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBsYXVuY2hlci53aW4zMi53aW4zMi54ODZfNjQKLUVjbGlwc2UtQnVuZGxlU2hhcGU6IGRpcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVkZjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODZfNjQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQyNDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODZfNjQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfKi5kbGwsXAotICAgICAgICAgICAgICAgbGF1bmNoZXIud2luMzIud2luMzIueDg2XzY0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2XzY0L2xhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NC9sYXVuY2hlci53aW4zMi53aW4zMi54ODZfNjQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0MGE0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2XzY0L2xhdW5jaGVyLndpbjMyLndpbjMyLng4Nl82NC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IExhdW5jaGVyIFdpbjMyIFg4Nl82NCBGcmFnbWVudAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcgLSBFcXVpbm94CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud3BmLndpbjMyLng4Ni8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndwZi53aW4zMi54ODYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud3BmLndpbjMyLng4Ni8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndwZi53aW4zMi54ODYvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud3BmLndpbjMyLng4Ni8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZTBiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud3BmLndpbjMyLng4Ni8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud3BmLndpbjMyLng4NjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53cGYud2luMzIueDg2L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndwZi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjlhZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndwZi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53cGYud2luMzIueDg2OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMi4wKSIKLUVjbGlwc2UtUGxhdGZvcm1GaWx0ZXI6ICgmIChvc2dpLndzPXdwZikgKG9zZ2kub3M9d2luMzIpIChvc2dpLmFyY2g9eDg2KSkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGxhdW5jaGVyLndwZi53aW4zMi54ODYKLUVjbGlwc2UtQnVuZGxlU2hhcGU6IGRpcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndwZi53aW4zMi54ODYvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53cGYud2luMzIueDg2L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWRmM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndwZi53aW4zMi54ODYvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndwZi53aW4zMi54ODYvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53cGYud2luMzIueDg2L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYjgzNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL2ZyYWdtZW50cy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndwZi53aW4zMi54ODYvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfKi5kbGwsXAotICAgICAgICAgICAgICAgY29tXyouZGxsLFwKLSAgICAgICAgICAgICAgIGxhdW5jaGVyLndwZi53aW4zMi54ODYucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53cGYud2luMzIueDg2L2xhdW5jaGVyLndwZi53aW4zMi54ODYucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9mcmFnbWVudHMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53cGYud2luMzIueDg2L2xhdW5jaGVyLndwZi53aW4zMi54ODYucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzYWFjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvZnJhZ21lbnRzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud3BmLndpbjMyLng4Ni9sYXVuY2hlci53cGYud2luMzIueDg2LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggTGF1bmNoZXIgV1BGIFdpbjMyIFg4NiBGcmFnbWVudAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcgLSBFcXVpbm94CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvbGF1bmNoZXIucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9sYXVuY2hlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDkzYzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9sYXVuY2hlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IExhdW5jaGVyCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZyAtIEVxdWlub3gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvY29yZS9sYXVuY2hlci9NYWluLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL2NvcmUvbGF1bmNoZXIvTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOThmN2VmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvY29yZS9sYXVuY2hlci9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQW5kcmV3IE5pZWZlciAtIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleGlzdHMgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gKiBUaGUgcmVhbCBNYWluIGNsYXNzIGlzIG5vdyBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLk1haW4uCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBwcm9ncmFtbWF0aWNhbGx5IGJ5Ci0gKiBvdGhlciBKYXZhIGNvZGUuIFRoaXMgY2xhc3MgZXhpc3RzIG9ubHkgZm9yIHRoZSBwdXJwb3NlIG9mIGxhdW5jaGluZyBFY2xpcHNlCi0gKiBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIFRvIGxhdW5jaCBFY2xpcHNlIHByb2dyYW1tYXRpY2FsbHksIHVzZSAKLSAqIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdG9yLkVjbGlwc2VTdGFydGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzCi0gKiBvbiB0aGlzIGNsYXNzIGFyZSBub3QgQVBJLgotICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgY2xhc3MgTWFpbiB7Ci0KLQkvKioKLQkgKiBQYXNzIG91ciBhcmdzIGFsb25nIHRvIHRoZSByZWFsIE1haW4gY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGFyZ3MgdGhlIGdpdmVuIGFyZ3VtZW50cwotCSAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5NYWluLm1haW4oYXJncyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL2NvcmUvbGF1bmNoZXIvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2xhdW5jaGVyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyOTkyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL2NvcmUvbGF1bmNoZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1MYXVuY2hlcyB0aGUgRWNsaXBzZSBQbGF0Zm9ybS4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci0KLVRoaXMgcGFja2FnZSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgVG8gc3RhcnQgdGhlIHBsYXRmb3JtLCBzcGVjaWZ5IG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuTWFpbgotYXMgdGhlIG1haW4gY2xhc3Mgd2hlbiBpbnZva2luZyB0aGUgSmF2YSBWTS4KLTxwPgotVGhpcyBwYWNrYWdlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIEphdmEgY29kZS4gVGhlIG1ldGhvZHMKLWFuZCBmaWVsZHMgaW4gdGhlc2UgY2xhc3NlcyBhcmUgbm90IEFQSS4KLQotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2xhdW5jaGVyL0NvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2xhdW5jaGVyL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTgzYjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9sYXVuY2hlci9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBBbmRyZXcgTmllZmVyIC0gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5sYXVuY2hlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX0FSQ0hfSTM4NiA9ICJpMzg2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX0FNRDY0ID0gImFtZDY0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX09TX1NVTk9TID0gIlN1bk9TIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX09TX0xJTlVYID0gIkxpbnV4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX09TX01BQ09TWCA9ICJNYWMgT1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfT1NfQUlYID0gIkFJWCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUk5BTF9PU19IUFVYID0gIkhQLVVYIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX09TX1FOWCA9ICJRTlgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfT1NfT1M0MDAgPSAiT1MvNDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX09TX09TMzkwID0gIk9TLzM5MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUk5BTF9PU19aT1MgPSAiei9PUyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hfWDg2ID0gIng4NiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hfWDg2XzY0ID0gIng4Nl82NCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAid2luMzIiKSBpbmRpY2F0aW5nIHRoZSBwbGF0Zm9ybSBpcyBydW5uaW5nIG9uIGEKLQkgKiBXaW5kb3cgMzItYml0IG9wZXJhdGluZyBzeXN0ZW0gKGUuZy4sIFdpbmRvd3MgOTgsIE5ULCAyMDAwKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU19XSU4zMiA9ICJ3aW4zMiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAibGludXgiKSBpbmRpY2F0aW5nIHRoZSBwbGF0Zm9ybSBpcyBydW5uaW5nIG9uIGEKLQkgKiBMaW51eC1iYXNlZCBvcGVyYXRpbmcgc3lzdGVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX0xJTlVYID0gImxpbnV4IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdGFudCBzdHJpbmcgKHZhbHVlICJhaXgiKSBpbmRpY2F0aW5nIHRoZSBwbGF0Zm9ybSBpcyBydW5uaW5nIG9uIGFuCi0JICogQUlYLWJhc2VkIG9wZXJhdGluZyBzeXN0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfQUlYID0gImFpeCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAic29sYXJpcyIpIGluZGljYXRpbmcgdGhlIHBsYXRmb3JtIGlzIHJ1bm5pbmcgb24gYQotCSAqIFNvbGFyaXMtYmFzZWQgb3BlcmF0aW5nIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU19TT0xBUklTID0gInNvbGFyaXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHN0cmluZyAodmFsdWUgImhwdXgiKSBpbmRpY2F0aW5nIHRoZSBwbGF0Zm9ybSBpcyBydW5uaW5nIG9uIGFuCi0JICogSFAvVVgtYmFzZWQgb3BlcmF0aW5nIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU19IUFVYID0gImhwdXgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHN0cmluZyAodmFsdWUgInFueCIpIGluZGljYXRpbmcgdGhlIHBsYXRmb3JtIGlzIHJ1bm5pbmcgb24gYQotCSAqIFFOWC1iYXNlZCBvcGVyYXRpbmcgc3lzdGVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1FOWCA9ICJxbngiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHN0cmluZyAodmFsdWUgIm1hY29zeCIpIGluZGljYXRpbmcgdGhlIHBsYXRmb3JtIGlzIHJ1bm5pbmcgb24gYQotCSAqIE1hYyBPUyBYIG9wZXJhdGluZyBzeXN0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfTUFDT1NYID0gIm1hY29zeCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAib3MvNDAwIikgaW5kaWNhdGluZyB0aGUgcGxhdGZvcm0gaXMgcnVubmluZyBvbiBhCi0JICogT1MvNDAwIG9wZXJhdGluZyBzeXN0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfT1M0MDAgPSAib3MvNDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAib3MvMzkwIikgaW5kaWNhdGluZyB0aGUgcGxhdGZvcm0gaXMgcnVubmluZyBvbiBhCi0JICogT1MvMzkwIG9wZXJhdGluZyBzeXN0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfT1MzOTAgPSAib3MvMzkwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAiei9vcyIpIGluZGljYXRpbmcgdGhlIHBsYXRmb3JtIGlzIHJ1bm5pbmcgb24gYQotCSAqIHovT1Mgb3BlcmF0aW5nIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU19aT1MgPSAiei9vcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHN0cmluZyAodmFsdWUgInVua25vd24iKSBpbmRpY2F0aW5nIHRoZSBwbGF0Zm9ybSBpcyBydW5uaW5nIG9uIGEKLQkgKiBtYWNoaW5lIHJ1bm5pbmcgYW4gdW5rbm93biBvcGVyYXRpbmcgc3lzdGVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1VOS05PV04gPSAidW5rbm93biI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAid2luMzIiKSBpbmRpY2F0aW5nIHRoZSBwbGF0Zm9ybSBpcyBydW5uaW5nIG9uIGEKLQkgKiBtYWNoaW5lIHVzaW5nIHRoZSBXaW5kb3dzIHdpbmRvd2luZyBzeXN0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NfV0lOMzIgPSAid2luMzIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHN0cmluZyAodmFsdWUgIndwZiIpIGluZGljYXRpbmcgdGhlIHBsYXRmb3JtIGlzIHJ1bm5pbmcgb24gYQotCSAqIG1hY2hpbmUgdXNpbmcgdGhlIFdpbmRvd3MgUHJlc2VuZGF0aW9uIEZvdW5kYXRpb24gc3lzdGVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX1dQRiA9ICJ3cGYiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHN0cmluZyAodmFsdWUgIm1vdGlmIikgaW5kaWNhdGluZyB0aGUgcGxhdGZvcm0gaXMgcnVubmluZyBvbiBhCi0JICogbWFjaGluZSB1c2luZyB0aGUgTW90aWYgd2luZG93aW5nIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19NT1RJRiA9ICJtb3RpZiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAiZ3RrIikgaW5kaWNhdGluZyB0aGUgcGxhdGZvcm0gaXMgcnVubmluZyBvbiBhCi0JICogbWFjaGluZSB1c2luZyB0aGUgR1RLIHdpbmRvd2luZyBzeXN0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NfR1RLID0gImd0ayI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAicGhvdG9uIikgaW5kaWNhdGluZyB0aGUgcGxhdGZvcm0gaXMgcnVubmluZyBvbiBhCi0JICogbWFjaGluZSB1c2luZyB0aGUgUGhvdG9uIHdpbmRvd2luZyBzeXN0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NfUEhPVE9OID0gInBob3RvbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgc3RyaW5nICh2YWx1ZSAiY2FyYm9uIikgaW5kaWNhdGluZyB0aGUgcGxhdGZvcm0gaXMgcnVubmluZyBvbiBhCi0JICogbWFjaGluZSB1c2luZyB0aGUgQ2FyYm9uIHdpbmRvd2luZyBzeXN0ZW0gKE1hYyBPUyBYKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19DQVJCT04gPSAiY2FyYm9uIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdGFudCBzdHJpbmcgKHZhbHVlICJjb2NvYSIpIGluZGljYXRpbmcgdGhlIHBsYXRmb3JtIGlzIHJ1bm5pbmcgb24gYQotCSAqIG1hY2hpbmUgdXNpbmcgdGhlIENvY29hIHdpbmRvd2luZyBzeXN0ZW0gKE1hYyBPUyBYKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19DT0NPQSA9ICJjb2NvYSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHN0cmluZyAodmFsdWUgInVua25vd24iKSBpbmRpY2F0aW5nIHRoZSBwbGF0Zm9ybSBpcyBydW5uaW5nIG9uIGEKLQkgKiBtYWNoaW5lIHJ1bm5pbmcgYW4gdW5rbm93biB3aW5kb3dpbmcgc3lzdGVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX1VOS05PV04gPSAidW5rbm93biI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2xhdW5jaGVyL0pOSUJyaWRnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2xhdW5jaGVyL0pOSUJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc0OWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9sYXVuY2hlci9KTklCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyOwotCi0vKioKLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBwcm9ncmFtbWF0aWNhbGx5IGJ5Ci0gKiBvdGhlciBKYXZhIGNvZGUuIFRoaXMgY2xhc3MgZXhpc3RzIG9ubHkgZm9yIHRoZSBwdXJwb3NlIG9mIGludGVyYWN0aW5nIHdpdGgKLSAqIGEgbmF0aXZlIGxhdW5jaGVyLiBUbyBsYXVuY2ggRWNsaXBzZSBwcm9ncmFtbWF0aWNhbGx5LCB1c2UgCi0gKiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5FY2xpcHNlU3RhcnRlci4gVGhpcyBjbGFzcyBpcyBub3QgQVBJLgotICoKLSAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGNsYXNzIEpOSUJyaWRnZSB7Ci0JLy9UT0RPOiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgcHVibGljCi0JcHJpdmF0ZSBuYXRpdmUgdm9pZCBfc2V0X2V4aXRfZGF0YShTdHJpbmcgc2hhcmVkSWQsIFN0cmluZyBkYXRhKTsKLQotCXByaXZhdGUgbmF0aXZlIHZvaWQgX3NldF9sYXVuY2hlcl9pbmZvKFN0cmluZyBsYXVuY2hlciwgU3RyaW5nIG5hbWUpOwotCi0JcHJpdmF0ZSBuYXRpdmUgdm9pZCBfdXBkYXRlX3NwbGFzaCgpOwotCi0JcHJpdmF0ZSBuYXRpdmUgbG9uZyBfZ2V0X3NwbGFzaF9oYW5kbGUoKTsKLQotCXByaXZhdGUgbmF0aXZlIHZvaWQgX3Nob3dfc3BsYXNoKFN0cmluZyBiaXRtYXApOwotCi0JcHJpdmF0ZSBuYXRpdmUgdm9pZCBfdGFrZWRvd25fc3BsYXNoKCk7Ci0KLQlwcml2YXRlIG5hdGl2ZSBpbnQgT2xlSW5pdGlhbGl6ZShpbnQgcmVzZXJ2ZWQpOwotCi0JcHJpdmF0ZSBuYXRpdmUgdm9pZCBPbGVVbmluaXRpYWxpemUoKTsKLQotCXByaXZhdGUgU3RyaW5nIGxpYnJhcnk7Ci0JcHJpdmF0ZSBib29sZWFuIGxpYnJhcnlMb2FkZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBub3JlZmVyZW5jZSBUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkgdGhlIGdpdmVuIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgSk5JQnJpZGdlKFN0cmluZyBsaWJyYXJ5KSB7Ci0JCXRoaXMubGlicmFyeSA9IGxpYnJhcnk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRMaWJyYXJ5KCkgewotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChsaWJyYXJ5LmluZGV4T2YoIndwZiIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW50IGlkeCA9IGxpYnJhcnkuaW5kZXhPZigiZWNsaXBzZV8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaWR4ICE9IC0xKSB7Ci0JCQkJCQlTdHJpbmcgY29tTGlicmFyeSA9IGxpYnJhcnkuc3Vic3RyaW5nKDAsIGlkeCkgKyAiY29tXyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbUxpYnJhcnkgKz0gbGlicmFyeS5zdWJzdHJpbmcoaWR4ICsgOCwgbGlicmFyeS5sZW5ndGgoKSk7Ci0JCQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5sb2FkKGNvbUxpYnJhcnkpOwotCQkJCQkJT2xlSW5pdGlhbGl6ZSgwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5sb2FkKGxpYnJhcnkpOwotCQkJfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgewotCQkJCS8vZmFpbGVkCi0JCQl9Ci0JCX0KLQkJbGlicmFyeUxvYWRlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0RXhpdERhdGEoU3RyaW5nIHNoYXJlZElkLCBTdHJpbmcgZGF0YSkgewotCQl0cnkgewotCQkJX3NldF9leGl0X2RhdGEoc2hhcmVkSWQsIGRhdGEpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUpIHsKLQkJCWlmICghbGlicmFyeUxvYWRlZCkgewotCQkJCWxvYWRMaWJyYXJ5KCk7Ci0JCQkJcmV0dXJuIHNldEV4aXREYXRhKHNoYXJlZElkLCBkYXRhKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0TGF1bmNoZXJJbmZvKFN0cmluZyBsYXVuY2hlciwgU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCV9zZXRfbGF1bmNoZXJfaW5mbyhsYXVuY2hlciwgbmFtZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgewotCQkJaWYgKCFsaWJyYXJ5TG9hZGVkKSB7Ci0JCQkJbG9hZExpYnJhcnkoKTsKLQkJCQlyZXR1cm4gc2V0TGF1bmNoZXJJbmZvKGxhdW5jaGVyLCBuYW1lKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dTcGxhc2goU3RyaW5nIGJpdG1hcCkgewotCQl0cnkgewotCQkJX3Nob3dfc3BsYXNoKGJpdG1hcCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgewotCQkJaWYgKCFsaWJyYXJ5TG9hZGVkKSB7Ci0JCQkJbG9hZExpYnJhcnkoKTsKLQkJCQlyZXR1cm4gc2hvd1NwbGFzaChiaXRtYXApOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU3BsYXNoKCkgewotCQl0cnkgewotCQkJX3VwZGF0ZV9zcGxhc2goKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7Ci0JCQlpZiAoIWxpYnJhcnlMb2FkZWQpIHsKLQkJCQlsb2FkTGlicmFyeSgpOwotCQkJCXJldHVybiB1cGRhdGVTcGxhc2goKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBsb25nIGdldFNwbGFzaEhhbmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBfZ2V0X3NwbGFzaF9oYW5kbGUoKTsKLQkJfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgewotCQkJaWYgKCFsaWJyYXJ5TG9hZGVkKSB7Ci0JCQkJbG9hZExpYnJhcnkoKTsKLQkJCQlyZXR1cm4gZ2V0U3BsYXNoSGFuZGxlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIG9yIG5vdCB3ZSBsb2FkZWQgdGhlIHNoYXJlZCBsaWJyYXJ5IGhlcmUgZnJvbSBqYXZhLiAgCi0JICogRmFsc2UgZG9lcyBub3QgaW1wbHkgdGhlIGxpYnJhcnkgaXMgbm90IGF2YWlsYWJsZSwgaXQgY291bGQgaGF2ZQotCSAqIGJlZW4gbG9hZGVkIG5hdGl2ZWx5IGJ5IHRoZSBleGVjdXRhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNMaWJyYXJ5TG9hZGVkQnlKYXZhKCkgewotCQlyZXR1cm4gbGlicmFyeUxvYWRlZDsKLQl9Ci0KLQkvKioKLQkgKiBAbm9yZWZlcmVuY2UgVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgYnkgY2xpZW50cy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0YWtlRG93blNwbGFzaCgpIHsKLQkJdHJ5IHsKLQkJCV90YWtlZG93bl9zcGxhc2goKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7Ci0JCQlpZiAoIWxpYnJhcnlMb2FkZWQpIHsKLQkJCQlsb2FkTGlicmFyeSgpOwotCQkJCXJldHVybiB0YWtlRG93blNwbGFzaCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5pbml0aWFsaXplKCkgewotCQlpZiAobGlicmFyeUxvYWRlZCAmJiBsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCWlmIChsaWJyYXJ5LmluZGV4T2YoIndwZiIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlPbGVVbmluaXRpYWxpemUoKTsKLQkJCQl9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7Ci0JCQkJCS8vIGxpYnJhcnkgbm90IGxvYWRlZAotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9sYXVuY2hlci9NYWluLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvbGF1bmNoZXIvTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTMwNzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9sYXVuY2hlci9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBBbnRvbiBMZWhlcmJhdWVyIChXaW5kIFJpdmVyIFN5c3RlbXMpIC0gYnVnIDMwMTIyNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5sYXVuY2hlci5Db25zdGFudHM7Ci0KLS8qKgotICogVGhlIGxhdW5jaGVyIGZvciBFY2xpcHNlLgotICogCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgcHJvZ3JhbW1hdGljYWxseSBieQotICogb3RoZXIgSmF2YSBjb2RlLiBUaGlzIGNsYXNzIGV4aXN0cyBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiBsYXVuY2hpbmcgRWNsaXBzZQotICogZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBUbyBsYXVuY2ggRWNsaXBzZSBwcm9ncmFtbWF0aWNhbGx5LCB1c2UgCi0gKiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5FY2xpcHNlU3RhcnRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcwotICogb24gdGhpcyBjbGFzcyBhcmUgbm90IEFQSS4KLSAqIAotICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgY2xhc3MgTWFpbiB7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBpcyBydW5uaW5nIGluIGRlYnVnIG1vZGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGF1bmNoZXIgdG8gcnVuLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYm9vdExvY2F0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5zdGFsbCByb290Ci0JICovCi0JcHJvdGVjdGVkIFVSTCBpbnN0YWxsTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGxvY2F0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGluc3RhbmNlCi0JICovCi0JcHJvdGVjdGVkIFVSTCBjb25maWd1cmF0aW9uTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGxvY2F0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluIHRoZSBpbnN0YWxsIHJvb3QKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudENvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgaWQgb2YgdGhlIGJ1bmRsZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgZnJhbWV3b3JrIHRvIHJ1bi4gIERlZmF1bHRzIHRvIG9yZy5lY2xpcHNlLm9zZ2kuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmcmFtZXdvcmsgPSBPU0dJOwotCi0JLyoqCi0JICogVGhlIGV4dHJhIGRldmVsb3BtZW50IHRpbWUgY2xhc3MgcGF0aCBlbnRyaWVzIGZvciB0aGUgZnJhbWV3b3JrLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGV2Q2xhc3NQYXRoID0gbnVsbDsKLQotCS8qCi0JICogVGhlIGV4dHJhIGRldmVsb3BtZW50IHRpbWUgY2xhc3MgcGF0aCBlbnRyaWVzIGZvciBhbGwgYnVuZGxlcy4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnRpZXMgZGV2Q2xhc3NQYXRoUHJvcHMgPSBudWxsOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBpcyBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5EZXZlbG9wbWVudE1vZGUgPSBmYWxzZTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGljaCBPUyB3YXMgcGFzc2VkIGluIHdpdGggLW9zCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcyA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyB3cyA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBhcmNoID0gbnVsbDsKLQotCS8vICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOyAvLyBUaGUgbmFtZSB0byBicmFuZCB0aGUgbGF1bmNoZXIKLQkvLyAgICBwcml2YXRlIFN0cmluZyBsYXVuY2hlciA9IG51bGw7IC8vIFRoZSBmdWxsIHBhdGggdG8gdGhlIGxhdW5jaGVyCi0JcHJpdmF0ZSBTdHJpbmcgbGlicmFyeSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZXhpdERhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdm0gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nW10gdm1hcmdzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIGNvbW1hbmRzID0gbnVsbDsKLQlTdHJpbmdbXSBleHRlbnNpb25QYXRocyA9IG51bGw7Ci0KLQlKTklCcmlkZ2UgYnJpZGdlID0gbnVsbDsKLQotCS8vIHNwbGFzaCBoYW5kbGluZwotCXByaXZhdGUgYm9vbGVhbiBzaG93U3BsYXNoID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgc3BsYXNoTG9jYXRpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGVuZFNwbGFzaCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGxhc2hEb3duID0gZmFsc2U7Ci0KLQlwdWJsaWMgZmluYWwgY2xhc3MgU3BsYXNoSGFuZGxlciBleHRlbmRzIFRocmVhZCB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRha2VEb3duU3BsYXNoKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGVTcGxhc2goKSB7Ci0JCQlpZiAoYnJpZGdlICE9IG51bGwgJiYgIXNwbGFzaERvd24pIHsKLQkJCQlicmlkZ2UudXBkYXRlU3BsYXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIFRocmVhZCBzcGxhc2hIYW5kbGVyID0gbmV3IFNwbGFzaEhhbmRsZXIoKTsKLQotCS8vc3BsYXNoIHNjcmVlbiBzeXN0ZW0gcHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTEFTSF9IQU5ETEUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5zcGxhc2guaGFuZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTEFTSF9MT0NBVElPTiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLnNwbGFzaC5sb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGNvbW1hbmQgbGluZSBhcmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FV09SSyA9ICItZnJhbWV3b3JrIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMID0gIi1pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMSVpFID0gIi1pbml0aWFsaXplIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWTSA9ICItdm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZNQVJHUyA9ICItdm1hcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVRyA9ICItZGVidWciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFViA9ICItZGV2IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OID0gIi1jb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1NQTEFTSCA9ICItbm9zcGxhc2giOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dTUExBU0ggPSAiLXNob3dzcGxhc2giOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYSVREQVRBID0gIi1leGl0ZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICItbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIRVIgPSAiLWxhdW5jaGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZID0gIi0tbGF1bmNoZXIubGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkwgPSAiLW5sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRTUExBU0ggPSAiLWVuZHNwbGFzaCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BMQVNIX0lNQUdFID0gInNwbGFzaC5ibXAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOID0gIi1jbGVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9FWElUID0gIi1ub0V4aXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TID0gIi1vcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1MgPSAiLXdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNIID0gIi1hcmNoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVFVQID0gIi1zdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TR0kgPSAib3JnLmVjbGlwc2Uub3NnaSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRFUiA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5FY2xpcHNlU3RhcnRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fVVJMID0gInBsYXRmb3JtOi9iYXNlLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRV9QUk9QRVJUSUVTID0gImVjbGlwc2UucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkICAgIAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9TQ0hFTUUgPSAicmVmZXJlbmNlOiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfU0NIRU1FID0gImphcjoiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBjb25zdGFudHM6IGNvbmZpZ3VyYXRpb24gZmlsZSBsb2NhdGlvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRElSID0gImNvbmZpZ3VyYXRpb24vIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRklMRSA9ICJjb25maWcuaW5pIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRklMRV9URU1QX1NVRkZJWCA9ICIudG1wIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRklMRV9CQUtfU1VGRklYID0gIi5iYWsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0UgPSAiZWNsaXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TSVRFX01BUktFUiA9ICIuZWNsaXBzZXByb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfU0lURV9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TSVRFX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGNvbnN0YW50czogU3lzdGVtIHByb3BlcnR5IGtleXMgYW5kL29yIGNvbmZpZ3VyYXRpb24gZmlsZSBlbGVtZW50cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1VTRVJfSE9NRSA9ICJ1c2VyLmhvbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVVNFUl9ESVIgPSAidXNlci5kaXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSU5TVEFMTF9BUkVBID0gIm9zZ2kuaW5zdGFsbC5hcmVhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0NPTkZJR19BUkVBID0gIm9zZ2kuY29uZmlndXJhdGlvbi5hcmVhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0NPTkZJR19BUkVBX0RFRkFVTFQgPSAib3NnaS5jb25maWd1cmF0aW9uLmFyZWEuZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9CQVNFX0NPTkZJR19BUkVBID0gIm9zZ2kuYmFzZUNvbmZpZ3VyYXRpb24uYXJlYSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TSEFSRURfQ09ORklHX0FSRUEgPSAib3NnaS5zaGFyZWRDb25maWd1cmF0aW9uLmFyZWEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ09ORklHX0NBU0NBREVEID0gIm9zZ2kuY29uZmlndXJhdGlvbi5jYXNjYWRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0ZSQU1FV09SSyA9ICJvc2dpLmZyYW1ld29yayI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TUExBU0hQQVRIID0gIm9zZ2kuc3BsYXNoUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TUExBU0hMT0NBVElPTiA9ICJvc2dpLnNwbGFzaExvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0NMQVNTUEFUSCA9ICJvc2dpLmZyYW1ld29ya0NsYXNzUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9FWFRFTlNJT05TID0gIm9zZ2kuZnJhbWV3b3JrLmV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRlJBTUVXT1JLX1NZU1BBVEggPSAib3NnaS5zeXNwYXRoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0ZSQU1FV09SS19TSEFQRSA9ICJvc2dpLmZyYW1ld29yay5zaGFwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MT0dGSUxFID0gIm9zZ2kubG9nZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9SRVFVSVJFRF9KQVZBX1ZFUlNJT04gPSAib3NnaS5yZXF1aXJlZEphdmFWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BBUkVOVF9DTEFTU0xPQURFUiA9ICJvc2dpLnBhcmVudENsYXNzbG9hZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0ZSQU1FV09SS19QQVJFTlRfQ0xBU1NMT0FERVIgPSAib3NnaS5mcmFtZXdvcmtQYXJlbnRDbGFzc2xvYWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9OTCA9ICJvc2dpLm5sIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9OT1NIVVRET1dOID0gIm9zZ2kubm9TaHV0ZG93biI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ERUJVRyA9ICJvc2dpLmRlYnVnIjsgLy8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9PUyA9ICJvc2dpLm9zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1dTID0gIm9zZ2kud3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVJDSCA9ICJvc2dpLmFyY2giOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9FWElUQ09ERSA9ICJlY2xpcHNlLmV4aXRjb2RlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0VYSVREQVRBID0gImVjbGlwc2UuZXhpdGRhdGEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTEFVTkNIRVIgPSAiZWNsaXBzZS5sYXVuY2hlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MQVVOQ0hFUl9OQU1FID0gImVjbGlwc2UubGF1bmNoZXIubmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNID0gImVjbGlwc2Uudm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1BUkdTID0gImVjbGlwc2Uudm1hcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0NPTU1BTkRTID0gImVjbGlwc2UuY29tbWFuZHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRUNMSVBTRVNFQ1VSSVRZID0gImVjbGlwc2Uuc2VjdXJpdHkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBTdWZmaXggZm9yIGxvY2F0aW9uIHByb3BlcnRpZXMgLSBzZWUgTG9jYXRpb25NYW5hZ2VyLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX09OTFlfQVJFQV9TVUZGSVggPSAiLnJlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRGF0YSBtb2RlIGNvbnN0YW50cyBmb3IgdXNlciwgY29uZmlndXJhdGlvbiBhbmQgZGF0YSBsb2NhdGlvbnMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAiQG5vbmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0RFRkFVTFQgPSAiQG5vRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9IT01FID0gIkB1c2VyLmhvbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfRElSID0gIkB1c2VyLmRpciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHR5cGVzIG9mIHBhcmVudCBjbGFzc2xvYWRlcnMgdGhlIGZyYW1ld29yayBjYW4gaGF2ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfQ0xBU1NMT0FERVJfQVBQID0gImFwcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0NMQVNTTE9BREVSX0VYVCA9ICJleHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9DTEFTU0xPQURFUl9CT09UID0gImJvb3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9DTEFTU0xPQURFUl9DVVJSRU5UID0gImN1cnJlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBsb2cgZmlsZSBoYW5kbGluZwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT04gPSAiIVNFU1NJT04iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5UUlkgPSAiIUVOVFJZIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiIU1FU1NBR0UiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBQ0sgPSAiIVNUQUNLIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gNDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgRmlsZSBsb2dGaWxlID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnVmZmVyZWRXcml0ZXIgbG9nID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZXdTZXNzaW9uID0gdHJ1ZTsKLQotCS8qKgotCSAqIEEgc3RydWN0dXJlZCBmb3JtIGZvciBhIHZlcnNpb24gaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAc2VlICJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvdmVyc2lvbmluZ19uYW1pbmcuaHRtbCBmb3IgaW5mb3JtYXRpb24gb24gdmFsaWQgdmVyc2lvbiBzdHJpbmdzIgotCSAqLwotCXN0YXRpYyBjbGFzcyBJZGVudGlmaWVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNID0gIi4gXy0iOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgaW50IG1ham9yLCBtaW5vciwgc2VydmljZTsKLQotCQlJZGVudGlmaWVyKGludCBtYWpvciwgaW50IG1pbm9yLCBpbnQgc2VydmljZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubWFqb3IgPSBtYWpvcjsKLQkJCXRoaXMubWlub3IgPSBtaW5vcjsKLQkJCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JCX0KLQotCQkvKioKLQkJICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgY2Fubm90IHBhcnNlIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBjb21wb25lbnRzCi0JCSAqLwotCQlJZGVudGlmaWVyKFN0cmluZyB2ZXJzaW9uU3RyaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyc2lvblN0cmluZywgREVMSU0pOwotCi0JCQkvLyBtYWpvcgotCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJbWFqb3IgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0KLQkJCS8vIG1pbm9yCi0JCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLQkJCQltaW5vciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBzZXJ2aWNlCi0JCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJCXNlcnZpY2UgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJLy8gaWdub3JlIHRoZSBzZXJ2aWNlIHF1YWxpZmllciBpbiB0aGF0IGNhc2UgYW5kIGRlZmF1bHQgdG8gMAotCQkJCS8vIHRoaXMgd2lsbCBhbGxvdyB1cyB0byB0b2xlcmF0ZSBvdGhlciBub24tY29udmVudGlvbmFsIHZlcnNpb24gbnVtYmVycyAKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpZCBpcyBjb25zaWRlcmVkIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gYmFzZWxpbmUuCi0JCSAqIGUuZy4gCi0JCSAqIDEuMi45ID49IDEuMy4xIC0+IGZhbHNlCi0JCSAqIDEuMy4wID49IDEuMy4xIC0+IGZhbHNlCi0JCSAqIDEuMy4xID49IDEuMy4xIC0+IHRydWUKLQkJICogMS4zLjIgPj0gMS4zLjEgLT4gdHJ1ZQotCQkgKiAyLjAuMCA+PSAxLjMuMSAtPiB0cnVlCi0JCSAqLwotCQlib29sZWFuIGlzR3JlYXRlckVxdWFsVG8oSWRlbnRpZmllciBtaW5pbXVtKSB7Ci0JCQlpZiAobWFqb3IgPCBtaW5pbXVtLm1ham9yKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChtYWpvciA+IG1pbmltdW0ubWFqb3IpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBtYWpvciBudW1iZXJzIGFyZSBlcXVpdmFsZW50IHNvIGNoZWNrIG1pbm9yCi0JCQlpZiAobWlub3IgPCBtaW5pbXVtLm1pbm9yKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChtaW5vciA+IG1pbmltdW0ubWlub3IpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBtaW5vciBudW1iZXJzIGFyZSBlcXVpdmFsZW50IHNvIGNoZWNrIHNlcnZpY2UKLQkJCXJldHVybiBzZXJ2aWNlID49IG1pbmltdW0uc2VydmljZTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFdTKCkgewotCQlpZiAod3MgIT0gbnVsbCkKLQkJCXJldHVybiB3czsKLQotCQlTdHJpbmcgb3NnaVdzID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfV1MpOwotCQlpZiAob3NnaVdzICE9IG51bGwpIHsKLQkJCXdzID0gb3NnaVdzOwotCQkJcmV0dXJuIHdzOwotCQl9Ci0KLQkJU3RyaW5nIG9zTmFtZSA9IGdldE9TKCk7Ci0JCWlmIChvc05hbWUuZXF1YWxzKENvbnN0YW50cy5PU19XSU4zMikpCi0JCQlyZXR1cm4gQ29uc3RhbnRzLldTX1dJTjMyOwotCQlpZiAob3NOYW1lLmVxdWFscyhDb25zdGFudHMuT1NfTElOVVgpKQotCQkJcmV0dXJuIENvbnN0YW50cy5XU19HVEs7Ci0JCWlmIChvc05hbWUuZXF1YWxzKENvbnN0YW50cy5PU19NQUNPU1gpKQotCQkJcmV0dXJuIENvbnN0YW50cy5XU19DT0NPQTsKLQkJaWYgKG9zTmFtZS5lcXVhbHMoQ29uc3RhbnRzLk9TX0hQVVgpKQotCQkJcmV0dXJuIENvbnN0YW50cy5XU19NT1RJRjsKLQkJaWYgKG9zTmFtZS5lcXVhbHMoQ29uc3RhbnRzLk9TX0FJWCkpCi0JCQlyZXR1cm4gQ29uc3RhbnRzLldTX01PVElGOwotCQlpZiAob3NOYW1lLmVxdWFscyhDb25zdGFudHMuT1NfU09MQVJJUykpCi0JCQlyZXR1cm4gQ29uc3RhbnRzLldTX0dUSzsKLQkJaWYgKG9zTmFtZS5lcXVhbHMoQ29uc3RhbnRzLk9TX1FOWCkpCi0JCQlyZXR1cm4gQ29uc3RhbnRzLldTX1BIT1RPTjsKLQkJcmV0dXJuIENvbnN0YW50cy5XU19VTktOT1dOOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEFsdGVybmF0ZVdTKFN0cmluZyBkZWZhdWx0V1MpIHsKLQkJLy8gV2UnbGwgaGF2ZSBhbHJlYWR5IHRyaWVkIHRoZSBkZWZhdWx0LCBzbyB3ZSBvbmx5IG5lZWQgdG8gbWFwCi0JCS8vIGluIG9uZSBkaXJlY3Rpb24uIChkZWZhdWx0IC0+IGFsdGVybmF0ZSkKLQkJaWYgKENvbnN0YW50cy5XU19DT0NPQS5lcXVhbHMoZGVmYXVsdFdTKSkKLQkJCXJldHVybiBDb25zdGFudHMuV1NfQ0FSQk9OOwotCQlpZiAoQ29uc3RhbnRzLldTX0dUSy5lcXVhbHMoZGVmYXVsdFdTKSkKLQkJCXJldHVybiBDb25zdGFudHMuV1NfTU9USUY7Ci0JCWlmIChDb25zdGFudHMuV1NfV0lOMzIuZXF1YWxzKGRlZmF1bHRXUykpCi0JCQlyZXR1cm4gQ29uc3RhbnRzLldTX1dQRjsKLQkJcmV0dXJuIENvbnN0YW50cy5XU19VTktOT1dOOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE9TKCkgewotCQlpZiAob3MgIT0gbnVsbCkKLQkJCXJldHVybiBvczsKLQkJU3RyaW5nIG9zZ2lPcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX09TKTsKLQkJaWYgKG9zZ2lPcyAhPSBudWxsKSB7Ci0JCQlvcyA9IG9zZ2lPczsKLQkJCXJldHVybiBvczsKLQkJfQotCQlTdHJpbmcgb3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChvc05hbWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBDb25zdGFudHMuT1NfV0lOMzIsIDAsIDMpKQotCQkJcmV0dXJuIENvbnN0YW50cy5PU19XSU4zMjsKLQkJLy8gRVhDRVBUSU9OOiBBbGwgbWFwcGluZ3Mgb2YgU3VuT1MgY29udmVydCB0byBTb2xhcmlzCi0JCWlmIChvc05hbWUuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuSU5URVJOQUxfT1NfU1VOT1MpKQotCQkJcmV0dXJuIENvbnN0YW50cy5PU19TT0xBUklTOwotCQlpZiAob3NOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLklOVEVSTkFMX09TX0xJTlVYKSkKLQkJCXJldHVybiBDb25zdGFudHMuT1NfTElOVVg7Ci0JCWlmIChvc05hbWUuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuSU5URVJOQUxfT1NfUU5YKSkKLQkJCXJldHVybiBDb25zdGFudHMuT1NfUU5YOwotCQlpZiAob3NOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLklOVEVSTkFMX09TX0FJWCkpCi0JCQlyZXR1cm4gQ29uc3RhbnRzLk9TX0FJWDsKLQkJaWYgKG9zTmFtZS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5JTlRFUk5BTF9PU19IUFVYKSkKLQkJCXJldHVybiBDb25zdGFudHMuT1NfSFBVWDsKLQkJaWYgKG9zTmFtZS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5JTlRFUk5BTF9PU19PUzQwMCkpCi0JCQlyZXR1cm4gQ29uc3RhbnRzLk9TX09TNDAwOwotCQlpZiAob3NOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLklOVEVSTkFMX09TX09TMzkwKSkKLQkJCXJldHVybiBDb25zdGFudHMuT1NfT1MzOTA7Ci0JCWlmIChvc05hbWUuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuSU5URVJOQUxfT1NfWk9TKSkKLQkJCXJldHVybiBDb25zdGFudHMuT1NfWk9TOwotCQkvLyBvcy5uYW1lIG9uIE1hYyBPUyBjYW4gYmUgZWl0aGVyIE1hYyBPUyBvciBNYWMgT1MgWAotCQlpZiAob3NOYW1lLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgQ29uc3RhbnRzLklOVEVSTkFMX09TX01BQ09TWCwgMCwgQ29uc3RhbnRzLklOVEVSTkFMX09TX01BQ09TWC5sZW5ndGgoKSkpCi0JCQlyZXR1cm4gQ29uc3RhbnRzLk9TX01BQ09TWDsKLQkJcmV0dXJuIENvbnN0YW50cy5PU19VTktOT1dOOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEFyY2goKSB7Ci0JCWlmIChhcmNoICE9IG51bGwpCi0JCQlyZXR1cm4gYXJjaDsKLQkJU3RyaW5nIG9zZ2lBcmNoID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQVJDSCk7Ci0JCWlmIChvc2dpQXJjaCAhPSBudWxsKSB7Ci0JCQlhcmNoID0gb3NnaUFyY2g7Ci0JCQlyZXR1cm4gYXJjaDsKLQkJfQotCQlTdHJpbmcgbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoIm9zLmFyY2giKTsvLyROT04tTkxTLTEkCi0JCS8vIE1hcCBpMzg2IGFyY2hpdGVjdHVyZSB0byB4ODYKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuSU5URVJOQUxfQVJDSF9JMzg2KSkKLQkJCXJldHVybiBDb25zdGFudHMuQVJDSF9YODY7Ci0JCS8vIE1hcCBhbWQ2NCBhcmNoaXRlY3R1cmUgdG8geDg2XzY0Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuSU5URVJOQUxfQU1ENjQpKQotCQkJcmV0dXJuIENvbnN0YW50cy5BUkNIX1g4Nl82NDsKLQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRGcmFnbWVudFN0cmluZyhTdHJpbmcgZnJhZ21lbnRPUywgU3RyaW5nIGZyYWdtZW50V1MsIFN0cmluZyBmcmFnbWVudEFyY2gpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoUExVR0lOX0lEKTsKLQkJYnVmZmVyLmFwcGVuZCgnLicpOwotCQlidWZmZXIuYXBwZW5kKGZyYWdtZW50V1MpOwotCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZnJhZ21lbnRPUyk7Ci0JCWlmICghKGZyYWdtZW50T1MuZXF1YWxzKENvbnN0YW50cy5PU19NQUNPU1gpICYmICFDb25zdGFudHMuQVJDSF9YODZfNjQuZXF1YWxzKGZyYWdtZW50QXJjaCkpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGZyYWdtZW50QXJjaCk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqICBTZXRzIHVwIHRoZSBKTkkgYnJpZGdlIHRvIG5hdGl2ZSBjYWxscwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEpOSShVUkxbXSBkZWZhdWx0UGF0aCkgewotCQlTdHJpbmcgbGliUGF0aCA9IG51bGw7Ci0KLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJRmlsZSBsaWIgPSBuZXcgRmlsZShsaWJyYXJ5KTsKLQkJCWlmIChsaWIuaXNEaXJlY3RvcnkoKSkgewotCQkJCWxpYlBhdGggPSBzZWFyY2hGb3IoImVjbGlwc2UiLCBsaWIuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGxpYi5leGlzdHMoKSkgewotCQkJCWxpYlBhdGggPSBsaWIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxpYlBhdGggPT0gbnVsbCkgewotCQkJLy9maW5kIG91ciBmcmFnbWVudCBuYW1lCi0JCQlTdHJpbmcgZnJhZ21lbnRPUyA9IGdldE9TKCk7Ci0JCQlTdHJpbmcgZnJhZ21lbnRXUyA9IGdldFdTKCk7Ci0JCQlTdHJpbmcgZnJhZ21lbnRBcmNoID0gZ2V0QXJjaCgpOwotCi0JCQlsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoZ2V0RnJhZ21lbnRTdHJpbmcoZnJhZ21lbnRPUywgZnJhZ21lbnRXUywgZnJhZ21lbnRBcmNoKSwgZGVmYXVsdFBhdGgpOwotCQkJaWYgKGxpYlBhdGggPT0gbnVsbCAmJiB3cyA9PSBudWxsKSB7Ci0JCQkJLy8gbm8gd3Mgd2FzIHNwZWNpZmllZCBhbmQgd2UgZGlkbid0IGZpbmQgdGhlIGRlZmF1bHQgZnJhZ21lbnQsIHRyeSBhbiBhbHRlcm5hdGUgd3MKLQkJCQlTdHJpbmcgYWx0ZXJuYXRlV1MgPSBnZXRBbHRlcm5hdGVXUyhmcmFnbWVudFdTKTsKLQkJCQlsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoZ2V0RnJhZ21lbnRTdHJpbmcoZnJhZ21lbnRPUywgYWx0ZXJuYXRlV1MsIGZyYWdtZW50QXJjaCksIGRlZmF1bHRQYXRoKTsKLQkJCQlpZiAobGliUGF0aCAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfV1MsIGFsdGVybmF0ZVdTKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbGlicmFyeSA9IGxpYlBhdGg7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpCi0JCQlicmlkZ2UgPSBuZXcgSk5JQnJpZGdlKGxpYnJhcnkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpYnJhcnlQYXRoKFN0cmluZyBmcmFnbWVudE5hbWUsIFVSTFtdIGRlZmF1bHRQYXRoKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gbnVsbDsKLQkJU3RyaW5nIGZyYWdtZW50ID0gbnVsbDsKLQkJaWYgKGluRGV2ZWxvcG1lbnRNb2RlICYmIGRldkNsYXNzUGF0aFByb3BzICE9IG51bGwpIHsKLQkJCVN0cmluZyBkZXZQYXRoTGlzdCA9IGRldkNsYXNzUGF0aFByb3BzLmdldFByb3BlcnR5KFBMVUdJTl9JRCk7Ci0JCQlTdHJpbmdbXSBsb2NhdGlvbnMgPSBnZXRBcnJheUZyb21MaXN0KGRldlBhdGhMaXN0KTsKLQkJCWlmIChsb2NhdGlvbnMubGVuZ3RoID4gMCkgewotCQkJCUZpbGUgbG9jYXRpb24gPSBuZXcgRmlsZShsb2NhdGlvbnNbMF0pOwotCQkJCWlmIChsb2NhdGlvbi5pc0Fic29sdXRlKCkpIHsKLQkJCQkJU3RyaW5nIGRpciA9IGxvY2F0aW9uLmdldFBhcmVudCgpOwotCQkJCQlmcmFnbWVudCA9IHNlYXJjaEZvcihmcmFnbWVudE5hbWUsIGRpcik7Ci0JCQkJCWlmIChmcmFnbWVudCAhPSBudWxsKQotCQkJCQkJbGliUGF0aCA9IGdldExpYnJhcnlGcm9tRnJhZ21lbnQoZnJhZ21lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobGliUGF0aCA9PSBudWxsICYmIGJvb3RMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlVUkxbXSB1cmxzID0gZGVmYXVsdFBhdGg7Ci0JCQlpZiAodXJscyAhPSBudWxsICYmIHVybHMubGVuZ3RoID4gMCkgewotCQkJCS8vdGhlIGxhc3Qgb25lIGlzIG1vc3QgaW50ZXJlc3RpbmcKLQkJCQlmb3IgKGludCBpID0gdXJscy5sZW5ndGggLSAxOyBpID49IDAgJiYgbGliUGF0aCA9PSBudWxsOyBpLS0pIHsKLQkJCQkJRmlsZSBlbnRyeUZpbGUgPSBuZXcgRmlsZSh1cmxzW2ldLmdldEZpbGUoKSk7Ci0JCQkJCVN0cmluZyBkaXIgPSBlbnRyeUZpbGUuZ2V0UGFyZW50KCk7Ci0JCQkJCWlmIChpbkRldmVsb3BtZW50TW9kZSkgewotCQkJCQkJU3RyaW5nIGRldkRpciA9IGRpciArICIvIiArIFBMVUdJTl9JRCArICIvZnJhZ21lbnRzIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlmcmFnbWVudCA9IHNlYXJjaEZvcihmcmFnbWVudE5hbWUsIGRldkRpcik7Ci0JCQkJCX0KLQkJCQkJaWYgKGZyYWdtZW50ID09IG51bGwpCi0JCQkJCQlmcmFnbWVudCA9IHNlYXJjaEZvcihmcmFnbWVudE5hbWUsIGRpcik7Ci0JCQkJCWlmIChmcmFnbWVudCAhPSBudWxsKQotCQkJCQkJbGliUGF0aCA9IGdldExpYnJhcnlGcm9tRnJhZ21lbnQoZnJhZ21lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobGliUGF0aCA9PSBudWxsKSB7Ci0JCQlVUkwgaW5zdGFsbCA9IGdldEluc3RhbGxMb2NhdGlvbigpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gaW5zdGFsbC5nZXRGaWxlKCk7Ci0JCQlsb2NhdGlvbiArPSAiL3BsdWdpbnMvIjsgLy8kTk9OLU5MUy0xJAotCQkJZnJhZ21lbnQgPSBzZWFyY2hGb3IoZnJhZ21lbnROYW1lLCBsb2NhdGlvbik7Ci0JCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCQlsaWJQYXRoID0gZ2V0TGlicmFyeUZyb21GcmFnbWVudChmcmFnbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGxpYlBhdGg7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGlicmFyeUZyb21GcmFnbWVudChTdHJpbmcgZnJhZ21lbnQpIHsKLQkJaWYgKGZyYWdtZW50LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUUpKQotCQkJZnJhZ21lbnQgPSBmcmFnbWVudC5zdWJzdHJpbmcoNSk7Ci0KLQkJRmlsZSBmcmFnID0gbmV3IEZpbGUoZnJhZ21lbnQpOwotCQlpZiAoIWZyYWcuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoZnJhZy5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIHNlYXJjaEZvcigiZWNsaXBzZSIsIGZyYWdtZW50KTsgLy8kTk9OLU5MUy0xJDsKLQotCQlaaXBGaWxlIGZyYWdtZW50SmFyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZyYWdtZW50SmFyID0gbmV3IFppcEZpbGUoZnJhZyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiRXhjZXB0aW9uIG9wZW5pbmcgSkFSIGZpbGU6ICIgKyBmcmFnbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCWxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRW51bWVyYXRpb24gZW50cmllcyA9IGZyYWdtZW50SmFyLmVudHJpZXMoKTsKLQkJU3RyaW5nIGVudHJ5ID0gbnVsbDsKLQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVppcEVudHJ5IHppcEVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoemlwRW50cnkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImVjbGlwc2VfIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5ID0gemlwRW50cnkuZ2V0TmFtZSgpOwotCQkJCXRyeSB7Ci0JCQkJCWZyYWdtZW50SmFyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvL2lnbm9yZQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxpYiA9IGV4dHJhY3RGcm9tSkFSKGZyYWdtZW50LCBlbnRyeSk7Ci0JCQlpZiAoIWdldE9TKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKG5ldyBTdHJpbmdbXSB7ImNobW9kIiwgIjc1NSIsIGxpYn0pLndhaXRGb3IoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJLy9pZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGliOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBsYXVuY2guCi0JICogCi0JICogQHBhcmFtIGFyZ3MgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotCSAqIEBleGNlcHRpb24gRXhjZXB0aW9uIHRocm93biBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyB0aGUgbGF1bmNoCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNSdW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJlY2xpcHNlLnN0YXJ0VGltZSIsIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsgLy8kTk9OLU5MUy0xJAotCQljb21tYW5kcyA9IGFyZ3M7Ci0JCVN0cmluZ1tdIHBhc3NUaHJ1QXJncyA9IHByb2Nlc3NDb21tYW5kTGluZShhcmdzKTsKLQotCQlpZiAoIWRlYnVnKQotCQkJLy8gZGVidWcgY2FuIGJlIHNwZWNpZmllZCBhcyBzeXN0ZW0gcHJvcGVydHkgYXMgd2VsbAotCQkJZGVidWcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9ERUJVRykgIT0gbnVsbDsKLQkJc2V0dXBWTVByb3BlcnRpZXMoKTsKLQkJcHJvY2Vzc0NvbmZpZ3VyYXRpb24oKTsKLQotCQkvLyBuZWVkIHRvIGVuc3VyZSB0aGF0IGdldEluc3RhbGxMb2NhdGlvbiBpcyBjYWxsZWQgYXQgbGVhc3Qgb25jZSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4KLQkJLy8gRG8gdGhpcyBBRlRFUiBwcm9jZXNzaW5nIHRoZSBjb25maWd1cmF0aW9uIHRvIGFsbG93IHRoZSBjb25maWd1cmF0aW9uIHRvIHNldAotCQkvLyB0aGUgaW5zdGFsbCBsb2NhdGlvbi4gIAotCQlnZXRJbnN0YWxsTG9jYXRpb24oKTsKLQotCQkvLyBsb2NhdGUgYm9vdCBwbHVnaW4gKG1heSByZXR1cm4gLWRldiBtb2RlIHZhcmlhdGlvbnMpCi0JCVVSTFtdIGJvb3RQYXRoID0gZ2V0Qm9vdFBhdGgoYm9vdExvY2F0aW9uKTsKLQotCQkvL1NldCB1cCB0aGUgSk5JIGJyaWRnZS4gIFdlIG5lZWQgdG8ga25vdyB0aGUgaW5zdGFsbCBsb2NhdGlvbiB0byBmaW5kIHRoZSBzaGFyZWQgbGlicmFyeQotCQlzZXR1cEpOSShib290UGF0aCk7Ci0KLQkJLy9lbnN1cmUgbWluaW11bSBKYXZhIHZlcnNpb24sIGRvIHRoaXMgYWZ0ZXIgSk5JIGlzIHNldCB1cCBzbyB0aGF0IHdlIGNhbiB3cml0ZSBhbiBlcnJvciBtZXNzYWdlIAotCQkvL3dpdGggZXhpdGRhdGEgaWYgd2UgZmFpbC4KLQkJaWYgKCFjaGVja1ZlcnNpb24oU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKSwgU3lzdGVtLmdldFByb3BlcnR5KFBST1BfUkVRVUlSRURfSkFWQV9WRVJTSU9OKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQotCQkvLyB2ZXJpZnkgY29uZmlndXJhdGlvbiBsb2NhdGlvbiBpcyB3cml0YWJsZQotCQlpZiAoIWNoZWNrQ29uZmlndXJhdGlvbkxvY2F0aW9uKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbikpCi0JCQlyZXR1cm47Ci0KLQkJc2V0U2VjdXJpdHlQb2xpY3koYm9vdFBhdGgpOwotCQkvLyBzcGxhc2ggaGFuZGxpbmcgaXMgZG9uZSBoZXJlLCBiZWNhdXNlIHRoZSBkZWZhdWx0IGNhc2UgbmVlZHMgdG8ga25vdwotCQkvLyB0aGUgbG9jYXRpb24gb2YgdGhlIGJvb3QgcGx1Z2luIHdlIGFyZSBnb2luZyB0byB1c2UKLQkJaGFuZGxlU3BsYXNoKGJvb3RQYXRoKTsKLQotCQliZWZvcmVGd2tJbnZvY2F0aW9uKCk7Ci0JCWludm9rZUZyYW1ld29yayhwYXNzVGhydUFyZ3MsIGJvb3RQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiZWZvcmVGd2tJbnZvY2F0aW9uKCkgewotCQkvL05vdGhpbmcgdG8gZG8uCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VjdXJpdHlQb2xpY3koVVJMW10gYm9vdFBhdGgpIHsKLQkJU3RyaW5nIGVjbGlwc2VTZWN1cml0eSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0VDTElQU0VTRUNVUklUWSk7Ci0JCWlmIChlY2xpcHNlU2VjdXJpdHkgIT0gbnVsbCkgewotCQkJLy8gc2V0dXAgYSBwb2xpY3kgdGhhdCBncmFudHMgdGhlIGxhdW5jaGVyIGFuZCBwYXRoIGZvciB0aGUgZnJhbWV3b3JrIEFsbFBlcm1pc3Npb25zLgotCQkJLy8gRG8gbm90IHNldCB0aGUgc2VjdXJpdHkgbWFuYWdlciwgdGhpcyB3aWxsIGJlIGRvbmUgYnkgdGhlIGZyYW1ld29yayBpdHNlbGYuCi0JCQlQcm90ZWN0aW9uRG9tYWluIGRvbWFpbiA9IE1haW4uY2xhc3MuZ2V0UHJvdGVjdGlvbkRvbWFpbigpOwotCQkJQ29kZVNvdXJjZSBzb3VyY2UgPSBudWxsOwotCQkJaWYgKGRvbWFpbiAhPSBudWxsKQotCQkJCXNvdXJjZSA9IE1haW4uY2xhc3MuZ2V0UHJvdGVjdGlvbkRvbWFpbigpLmdldENvZGVTb3VyY2UoKTsKLQkJCWlmIChkb21haW4gPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkgewotCQkJCWxvZygiQ2FuIG5vdCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgc2VjdXJpdHkgbWFuYWdlci4gUGxlYXNlIHVzZSBhIHBvbGljeSBmaWxlLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGNvZGVzb3VyY2UgVVJMcyB0byBncmFudCBBbGxQZXJtaXNzaW9uIHRvCi0JCQlVUkxbXSByb290VVJMcyA9IG5ldyBVUkxbYm9vdFBhdGgubGVuZ3RoICsgMV07Ci0JCQlyb290VVJMc1swXSA9IHNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkJU3lzdGVtLmFycmF5Y29weShib290UGF0aCwgMCwgcm9vdFVSTHMsIDEsIGJvb3RQYXRoLmxlbmd0aCk7Ci0JCQkvLyByZXBsYWNlIHRoZSBzZWN1cml0eSBwb2xpY3kKLQkJCVBvbGljeSBlY2xpcHNlUG9saWN5ID0gbmV3IEVjbGlwc2VQb2xpY3koUG9saWN5LmdldFBvbGljeSgpLCByb290VVJMcyk7Ci0JCQlQb2xpY3kuc2V0UG9saWN5KGVjbGlwc2VQb2xpY3kpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludm9rZUZyYW1ld29yayhTdHJpbmdbXSBwYXNzVGhydUFyZ3MsIFVSTFtdIGJvb3RQYXRoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBFcnJvciwgRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHR5cGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9GUkFNRVdPUktfUEFSRU5UX0NMQVNTTE9BREVSLCBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9QQVJFTlRfQ0xBU1NMT0FERVIsIFBBUkVOVF9DTEFTU0xPQURFUl9CT09UKSk7Ci0JCUNsYXNzTG9hZGVyIHBhcmVudCA9IG51bGw7Ci0JCWlmIChQQVJFTlRfQ0xBU1NMT0FERVJfQVBQLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpCi0JCQlwYXJlbnQgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwotCQllbHNlIGlmIChQQVJFTlRfQ0xBU1NMT0FERVJfRVhULmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCUNsYXNzTG9hZGVyIGFwcENMID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKLQkJCWlmIChhcHBDTCAhPSBudWxsKQotCQkJCXBhcmVudCA9IGFwcENMLmdldFBhcmVudCgpOwotCQl9IGVsc2UgaWYgKFBBUkVOVF9DTEFTU0xPQURFUl9DVVJSRU5ULmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpCi0JCQlwYXJlbnQgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJVVJMQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFN0YXJ0dXBDbGFzc0xvYWRlcihib290UGF0aCwgcGFyZW50KTsKLQkJQ2xhc3MgY2xhenogPSBsb2FkZXIubG9hZENsYXNzKFNUQVJURVIpOwotCQlNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2QoInJ1biIsIG5ldyBDbGFzc1tdIHtTdHJpbmdbXS5jbGFzcywgUnVubmFibGUuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJbWV0aG9kLmludm9rZShjbGF6eiwgbmV3IE9iamVjdFtdIHtwYXNzVGhydUFyZ3MsIHNwbGFzaEhhbmRsZXJ9KTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEVycm9yKQotCQkJCXRocm93IChFcnJvcikgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCWVsc2UgaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBFeGNlcHRpb24pCi0JCQkJdGhyb3cgKEV4Y2VwdGlvbikgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCWVsc2UKLQkJCQkvL2NvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgVGhyb3dhYmxlIQotCQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gYXZhaWxhYmxlIHZlcnNpb24gaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgCi0JICogZ2l2ZW4gcmVxdWlyZWQgdmVyc2lvbi4KLQkgKiA8cD5XaWxsIHNldCBQUk9QX0VYSVRDT0RFL1BST1BfRVhJVERBVEEgYWNjb3JkaW5nbHkgaWYgY2hlY2sgZmFpbHMuPC9wPgotCSAqICAgCi0JICogQHJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjaGVja2luZyBwYXNzZWQgCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrVmVyc2lvbihTdHJpbmcgYXZhaWxhYmxlVmVyc2lvbiwgU3RyaW5nIHJlcXVpcmVkVmVyc2lvbikgewotCQlpZiAocmVxdWlyZWRWZXJzaW9uID09IG51bGwgfHwgYXZhaWxhYmxlVmVyc2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRyeSB7Ci0JCQlJZGVudGlmaWVyIHJlcXVpcmVkID0gbmV3IElkZW50aWZpZXIocmVxdWlyZWRWZXJzaW9uKTsKLQkJCUlkZW50aWZpZXIgYXZhaWxhYmxlID0gbmV3IElkZW50aWZpZXIoYXZhaWxhYmxlVmVyc2lvbik7Ci0JCQlib29sZWFuIGNvbXBhdGlibGUgPSBhdmFpbGFibGUuaXNHcmVhdGVyRXF1YWxUbyhyZXF1aXJlZCk7Ci0JCQlpZiAoIWNvbXBhdGlibGUpIHsKLQkJCQkvLyBhbnkgbm9uLXplcm8gdmFsdWUgc2hvdWxkIGRvIGl0IC0gMTQgdXNlZCB0byBiZSB1c2VkIGZvciB2ZXJzaW9uIGluY29tcGF0aWJpbGl0eSBpbiBFY2xpcHNlIDIuMSAKLQkJCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0VYSVRDT0RFLCAiMTQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfRVhJVERBVEEsICI8dGl0bGU+SW5jb21wYXRpYmxlIEpWTTwvdGl0bGU+VmVyc2lvbiAiICsgYXZhaWxhYmxlVmVyc2lvbiArICIgb2YgdGhlIEpWTSBpcyBub3Qgc3VpdGFibGUgZm9yIHRoaXMgcHJvZHVjdC4gVmVyc2lvbjogIiArIHJlcXVpcmVkVmVyc2lvbiArICIgb3IgZ3JlYXRlciBpcyByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCXJldHVybiBjb21wYXRpYmxlOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZiB0aGUgc2VjdXJpdHkgbWFuYWdlciB3b24ndCBhbGxvdyB1cyB0byBnZXQgdGhlIHN5c3RlbSBwcm9wZXJ0eSwgY29udGludWUgZm9yCi0JCQkvLyBub3cgYW5kIGxldCB0aGluZ3MgZmFpbCBsYXRlciBvbiB0aGVpciBvd24gaWYgbmVjZXNzYXJ5LgotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZiB0aGUgdmVyc2lvbiBzdHJpbmcgd2FzIGluIGEgZm9ybWF0IHRoYXQgd2UgZG9uJ3QgdW5kZXJzdGFuZCwgY29udGludWUgYW5kCi0JCQkvLyBsZXQgdGhpbmdzIGZhaWwgbGF0ZXIgb24gdGhlaXIgb3duIGlmIG5lY2Vzc2FyeS4KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxvY2F0aW9uIGNhbiBiZSBjcmVhdGVkIGFuZCBpcyB3cml0YWJsZS4KLQkgKiBJZiB0aGUgc3lzdGVtIHByb3BlcnR5ICJvc2dpLmNvbmZpZ3VyYXRpb24uYXJlYS5yZWFkT25seSIgaXMgc2V0Ci0JICogdGhlIGNoZWNrIGFsd2F5cyBzdWNjZWVkcy4KLQkgKiA8cD5XaWxsIHNldCBQUk9QX0VYSVRDT0RFL1BST1BfRVhJVERBVEEgYWNjb3JkaW5nbHkgaWYgY2hlY2sgZmFpbHMuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvblVybCAgY29uZmlndXJhdGlvbiBhcmVhIFVSTCwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjaGVja2luZyBwYXNzZWQgCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQ29uZmlndXJhdGlvbkxvY2F0aW9uKFVSTCBsb2NhdGlvblVybCkgewotCQlpZiAobG9jYXRpb25VcmwgPT0gbnVsbCB8fCAhImZpbGUiLmVxdWFscyhsb2NhdGlvblVybC5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChCb29sZWFuLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQ09ORklHX0FSRUEgKyBSRUFEX09OTFlfQVJFQV9TVUZGSVgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJLy8gdXNlciB3YW50cyByZWFkb25seSBjb25maWcgYXJlYQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShsb2NhdGlvblVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlRmlsZSgpOwotCQlpZiAoIWNvbmZpZ0Rpci5leGlzdHMoKSkgewotCQkJY29uZmlnRGlyLm1rZGlycygpOwotCQkJaWYgKCFjb25maWdEaXIuZXhpc3RzKCkpIHsKLQkJCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0VYSVRDT0RFLCAiMTUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfRVhJVERBVEEsICI8dGl0bGU+SW52YWxpZCBDb25maWd1cmF0aW9uIExvY2F0aW9uPC90aXRsZT5UaGUgY29uZmlndXJhdGlvbiBhcmVhIGF0ICciICsgY29uZmlnRGlyICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJIicgY291bGQgbm90IGJlIGNyZWF0ZWQuICBQbGVhc2UgY2hvb3NlIGEgd3JpdGFibGUgbG9jYXRpb24gdXNpbmcgdGhlICctY29uZmlndXJhdGlvbicgY29tbWFuZCBsaW5lIG9wdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoIWNhbldyaXRlKGNvbmZpZ0RpcikpIHsKLQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfRVhJVENPREUsICIxNSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0VYSVREQVRBLCAiPHRpdGxlPkludmFsaWQgQ29uZmlndXJhdGlvbiBMb2NhdGlvbjwvdGl0bGU+VGhlIGNvbmZpZ3VyYXRpb24gYXJlYSBhdCAnIiArIGNvbmZpZ0RpciArIC8vJE5PTi1OTFMtMSQKLQkJCQkJIicgaXMgbm90IHdyaXRhYmxlLiAgUGxlYXNlIGNob29zZSBhIHdyaXRhYmxlIGxvY2F0aW9uIHVzaW5nIHRoZSAnLWNvbmZpZ3VyYXRpb24nIGNvbW1hbmQgbGluZSBvcHRpb24uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBVUkwgU3RyaW5nLiAgVGhpcyBjb252ZXJ0cwotCSAqIGVzY2FwZWQgc2VxdWVuY2VzICglLi4pIGluIHRoZSBVUkwgaW50byB0aGUgYXBwcm9wcmlhdGUgY2hhcmFjdGVycy4KLQkgKiBOT1RFOiBkdWUgdG8gY2xhc3MgdmlzaWJpbGl0eSB0aGVyZSBpcyBhIGNvcHkgb2YgdGhpcyBtZXRob2QKLQkgKiAgICAgICBpbiBJbnRlcm5hbEJvb3RMb2FkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29kZShTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCS8vdHJ5IHRvIHVzZSBKYXZhIDEuNCBtZXRob2QgaWYgYXZhaWxhYmxlCi0JCXRyeSB7Ci0JCQlDbGFzcyBjbGF6eiA9IFVSTERlY29kZXIuY2xhc3M7Ci0JCQlNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2QoImRlY29kZSIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCQkvL2ZpcnN0IGVuY29kZSAnKycgY2hhcmFjdGVycywgYmVjYXVzZSBVUkxEZWNvZGVyIGluY29ycmVjdGx5IGNvbnZlcnRzIAotCQkJLy90aGVtIHRvIHNwYWNlcyBvbiBjZXJ0YWluIGNsYXNzIGxpYnJhcnkgaW1wbGVtZW50YXRpb25zLgotCQkJaWYgKHVybFN0cmluZy5pbmRleE9mKCcrJykgPj0gMCkgewotCQkJCWludCBsZW4gPSB1cmxTdHJpbmcubGVuZ3RoKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJCWNoYXIgYyA9IHVybFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCWlmIChjID09ICcrJykKLQkJCQkJCWJ1Zi5hcHBlbmQoIiUyQiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJfQotCQkJCXVybFN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQkJT2JqZWN0IHJlc3VsdCA9IG1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHt1cmxTdHJpbmcsICJVVEYtOCJ9KTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiAoU3RyaW5nKSByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0pESyAxLjQgbWV0aG9kIG5vdCBmb3VuZCAtLSBmYWxsIHRocm91Z2ggYW5kIGRlY29kZSBieSBoYW5kCi0JCX0KLQkJLy9kZWNvZGUgVVJMIGJ5IGhhbmQKLQkJYm9vbGVhbiByZXBsYWNlZCA9IGZhbHNlOwotCQlieXRlW10gZW5jb2RlZEJ5dGVzID0gdXJsU3RyaW5nLmdldEJ5dGVzKCk7Ci0JCWludCBlbmNvZGVkTGVuZ3RoID0gZW5jb2RlZEJ5dGVzLmxlbmd0aDsKLQkJYnl0ZVtdIGRlY29kZWRCeXRlcyA9IG5ldyBieXRlW2VuY29kZWRMZW5ndGhdOwotCQlpbnQgZGVjb2RlZExlbmd0aCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW5jb2RlZExlbmd0aDsgaSsrKSB7Ci0JCQlieXRlIGIgPSBlbmNvZGVkQnl0ZXNbaV07Ci0JCQlpZiAoYiA9PSAnJScpIHsKLQkJCQlpZiAoaSArIDIgPj0gZW5jb2RlZExlbmd0aCkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWFsZm9ybWVkIFVSTCAoXCIiICsgdXJsU3RyaW5nICsgIlwiKTogJSBtdXN0IGJlIGZvbGxvd2VkIGJ5IDIgZGlnaXRzLiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCWJ5dGUgZW5jMSA9IGVuY29kZWRCeXRlc1srK2ldOwotCQkJCWJ5dGUgZW5jMiA9IGVuY29kZWRCeXRlc1srK2ldOwotCQkJCWIgPSAoYnl0ZSkgKChoZXhUb0J5dGUoZW5jMSkgPDwgNCkgKyBoZXhUb0J5dGUoZW5jMikpOwotCQkJCXJlcGxhY2VkID0gdHJ1ZTsKLQkJCX0KLQkJCWRlY29kZWRCeXRlc1tkZWNvZGVkTGVuZ3RoKytdID0gYjsKLQkJfQotCQlpZiAoIXJlcGxhY2VkKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgU3RyaW5nKGRlY29kZWRCeXRlcywgMCwgZGVjb2RlZExlbmd0aCwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL3VzZSBkZWZhdWx0IGVuY29kaW5nCi0JCQlyZXR1cm4gbmV3IFN0cmluZyhkZWNvZGVkQnl0ZXMsIDAsIGRlY29kZWRMZW5ndGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgYSBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCB0b2tlbnMgaW50byBhbiBhcnJheQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHN0cmluZyB0b2tlbnMKLQkgKiBAcGFyYW0gcHJvcCB0aGUgaW5pdGlhbCBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFycmF5RnJvbUxpc3QoU3RyaW5nIHByb3ApIHsKLQkJaWYgKHByb3AgPT0gbnVsbCB8fCBwcm9wLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJVmVjdG9yIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3AsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZiAoIXRva2VuLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlsaXN0LmFkZEVsZW1lbnQodG9rZW4pOwotCQl9Ci0JCXJldHVybiBsaXN0LmlzRW1wdHkoKSA/IG5ldyBTdHJpbmdbMF0gOiAoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+VVJMPC9jb2RlPi1iYXNlZCBjbGFzcyBwYXRoIGRlc2NyaWJpbmcgd2hlcmUgdGhlIGJvb3QgY2xhc3NlcwotCSAqIGFyZSBsb2NhdGVkIHdoZW4gcnVubmluZyBpbiBkZXZlbG9wbWVudCBtb2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVybC1iYXNlZCBjbGFzcyBwYXRoCi0JICogQHBhcmFtIGJhc2UgdGhlIGJhc2UgbG9jYXRpb24KLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGNvbXB1dGluZyB0aGUgY2xhc3MgcGF0aAotCSAqLwotCXByaXZhdGUgVVJMW10gZ2V0RGV2UGF0aChVUkwgYmFzZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCWlmIChpbkRldmVsb3BtZW50TW9kZSkKLQkJCWFkZERldkVudHJpZXMoYmFzZSwgcmVzdWx0LCBPU0dJKTsKLQkJLy9UaGUgamFycyBmcm9tIHRoZSBiYXNlIGFsd2F5cyBuZWVkIHRvIGJlIGFkZGVkLCBldmVuIHdoZW4gcnVubmluZyBpbiBkZXYgbW9kZSAoYnVnIDQ2NzcyKQotCQlhZGRCYXNlSmFycyhiYXNlLCByZXN1bHQpOwotCQlyZXR1cm4gKFVSTFtdKSByZXN1bHQudG9BcnJheShuZXcgVVJMW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlVUkwgY29uc3RydWN0VVJMKFVSTCB1cmwsIFN0cmluZyBuYW1lKSB7Ci0JCS8vUmVjb2duaXplIHRoZSBmb2xsb3dpbmcgVVJMcwotCQkvL3VybDogZmlsZTpmb28vZGlyLwotCQkvL3VybDogZmlsZTpmb28vZmlsZS5qYXIKLQotCQlTdHJpbmcgZXh0ZXJuYWxGb3JtID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCWlmIChleHRlcm5hbEZvcm0uZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgVVJMKEpBUl9TQ0hFTUUgKyB1cmwgKyAiIS8iICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTCh1cmwsIG5hbWUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRGcmFtZXdvcmtFeHRlbnNpb25zKFVSTCBiYXNlLCBBcnJheUxpc3QgcmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdbXSBleHRlbnNpb25zID0gZ2V0QXJyYXlGcm9tTGlzdChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KFBST1BfRVhURU5TSU9OUykpOwotCQlTdHJpbmcgcGFyZW50ID0gbmV3IEZpbGUoYmFzZS5nZXRGaWxlKCkpLmdldFBhcmVudCgpLnRvU3RyaW5nKCk7Ci0JCUFycmF5TGlzdCBleHRlbnNpb25SZXN1bHRzID0gbmV3IEFycmF5TGlzdChleHRlbnNpb25zLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJLy9TZWFyY2ggdGhlIGV4dGVuc2lvbiByZWxhdGl2ZWx5IHRvIHRoZSBvc2dpIHBsdWdpbiAKLQkJCVN0cmluZyBwYXRoID0gc2VhcmNoRm9yQnVuZGxlKGV4dGVuc2lvbnNbaV0sIHBhcmVudCk7Ci0JCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQkJbG9nKCJDb3VsZCBub3QgZmluZCBleHRlbnNpb246ICIgKyBleHRlbnNpb25zW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGRlYnVnKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyBleHRlbnNpb246ICIgKyBleHRlbnNpb25zW2ldKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlVUkwgZXh0ZW5zaW9uVVJMID0gbnVsbDsKLQkJCWlmIChpbnN0YWxsTG9jYXRpb24uZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZXh0ZW5zaW9uUmVzdWx0cy5hZGQocGF0aCk7Ci0JCQkJZXh0ZW5zaW9uVVJMID0gbmV3IEZpbGUocGF0aCkudG9VUkwoKTsKLQkJCX0gZWxzZQotCQkJCWV4dGVuc2lvblVSTCA9IG5ldyBVUkwoaW5zdGFsbExvY2F0aW9uLmdldFByb3RvY29sKCksIGluc3RhbGxMb2NhdGlvbi5nZXRIb3N0KCksIGluc3RhbGxMb2NhdGlvbi5nZXRQb3J0KCksIHBhdGgpOwotCi0JCQkvL0xvYWQgYSBwcm9wZXJ0eSBmaWxlIG9mIHRoZSBleHRlbnNpb24sIG1lcmdlIGl0cyBjb250ZW50LCBhbmQgaW4gY2FzZSBvZiBkZXYgbW9kZSBhZGQgdGhlIGJpbiBlbnRyaWVzCi0JCQlQcm9wZXJ0aWVzIGV4dGVuc2lvblByb3BlcnRpZXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlleHRlbnNpb25Qcm9wZXJ0aWVzID0gbG9hZFByb3BlcnRpZXMoY29uc3RydWN0VVJMKGV4dGVuc2lvblVSTCwgRUNMSVBTRV9QUk9QRVJUSUVTKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGRlYnVnKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIEVDTElQU0VfUFJPUEVSVElFUyArICIgbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJU3RyaW5nIGV4dGVuc2lvbkNsYXNzUGF0aCA9IG51bGw7Ci0JCQlpZiAoZXh0ZW5zaW9uUHJvcGVydGllcyAhPSBudWxsKQotCQkJCWV4dGVuc2lvbkNsYXNzUGF0aCA9IGV4dGVuc2lvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPUF9DTEFTU1BBVEgpOwotCQkJZWxzZQotCQkJCS8vIHRoaXMgaXMgYSAibm9ybWFsIiBSRkMgMTAxIGZyYW1ld29yayBleHRlbnNpb24gYnVuZGxlIGp1c3QgcHV0IHRoZSBiYXNlIHBhdGggb24gdGhlIGNsYXNzcGF0aAotCQkJCWV4dGVuc2lvblByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJU3RyaW5nW10gZW50cmllcyA9IGV4dGVuc2lvbkNsYXNzUGF0aCA9PSBudWxsIHx8IGV4dGVuc2lvbkNsYXNzUGF0aC5sZW5ndGgoKSA9PSAwID8gbmV3IFN0cmluZ1tdIHsiIn0gOiBnZXRBcnJheUZyb21MaXN0KGV4dGVuc2lvbkNsYXNzUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBxdWFsaWZpZWRQYXRoOwotCQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0NMQVNTUEFUSCkgPT0gbnVsbCkKLQkJCQlxdWFsaWZpZWRQYXRoID0gIi4iOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcXVhbGlmaWVkUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspCi0JCQkJcXVhbGlmaWVkUGF0aCArPSAiLCAiICsgRklMRV9TQ0hFTUUgKyBwYXRoICsgZW50cmllc1tqXTsgLy8kTk9OLU5MUy0xJAotCQkJZXh0ZW5zaW9uUHJvcGVydGllcy5wdXQoUFJPUF9DTEFTU1BBVEgsIHF1YWxpZmllZFBhdGgpOwotCQkJbWVyZ2VQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCksIGV4dGVuc2lvblByb3BlcnRpZXMpOwotCQkJaWYgKGluRGV2ZWxvcG1lbnRNb2RlKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBleHRlbnNpb25zW2ldOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoUkVGRVJFTkNFX1NDSEVNRSkpIHsKLQkJCQkJLy8gbmVlZCB0byBleHRyYWN0IHRoZSBCU04gZnJvbSB0aGUgcGF0aAotCQkJCQluYW1lID0gbmV3IEZpbGUocGF0aCkuZ2V0TmFtZSgpOwotCQkJCQkvLyBOb3RlIHRoYXQgd2UgZG8gbm90IGV4dHJhY3QgYW55IHZlcnNpb24gaW5mb3JtYXRpb24uCi0JCQkJCS8vIFdlIGFzc3VtZSB0aGUgZXh0ZW5zaW9uIGlzIGxvY2F0ZWQgaW4gdGhlIHdvcmtzcGFjZSBpbiBhIHByb2plY3QKLQkJCQkJLy8gdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgQlNOLgotCQkJCQkvLyBXZSBjb3VsZCBhZGQgbW9yZSBsb2dpYyBoZXJlIHRvIHN1cHBvcnQgdmVyc2lvbnMgaW4gcHJvamVjdCBmb2xkZXIgbmFtZXMKLQkJCQkJLy8gYnV0IGl0IHdpbGwgbGlrZWx5IGJlIGNvbXBsaWNhdGVkIGFuZCBlcnJvciBwcm9uZS4KLQkJCQl9Ci0JCQkJYWRkRGV2RW50cmllcyhleHRlbnNpb25VUkwsIHJlc3VsdCwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZXh0ZW5zaW9uUGF0aHMgPSAoU3RyaW5nW10pIGV4dGVuc2lvblJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW2V4dGVuc2lvblJlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEJhc2VKYXJzKFVSTCBiYXNlLCBBcnJheUxpc3QgcmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgYmFzZUphckxpc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9DTEFTU1BBVEgpOwotCQlpZiAoYmFzZUphckxpc3QgPT0gbnVsbCkgewotCQkJcmVhZEZyYW1ld29ya0V4dGVuc2lvbnMoYmFzZSwgcmVzdWx0KTsKLQkJCWJhc2VKYXJMaXN0ID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eShQUk9QX0NMQVNTUEFUSCk7Ci0JCX0KLQotCQlGaWxlIGZ3a0ZpbGUgPSBuZXcgRmlsZShiYXNlLmdldEZpbGUoKSk7Ci0JCWJvb2xlYW4gZndrSXNEaXJlY3RvcnkgPSBmd2tGaWxlLmlzRGlyZWN0b3J5KCk7Ci0JCS8vV2UgZm91bmQgd2hlcmUgdGhlIGZ3ayBpcywgcmVtZW1iZXIgaXQgYW5kIGl0cyBzaGFwZQotCQlpZiAoZndrSXNEaXJlY3RvcnkpIHsKLQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfRlJBTUVXT1JLX1NIQVBFLCAiZm9sZGVyIik7Ly8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9GUkFNRVdPUktfU0hBUEUsICJqYXIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIGZ3a1BhdGggPSBuZXcgRmlsZShuZXcgRmlsZShiYXNlLmdldEZpbGUoKSkuZ2V0UGFyZW50KCkpLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGZ3a1BhdGguY2hhckF0KDApKSkgewotCQkJY2hhcltdIGNoYXJzID0gZndrUGF0aC50b0NoYXJBcnJheSgpOwotCQkJY2hhcnNbMF0gPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2hhcnNbMF0pOwotCQkJZndrUGF0aCA9IG5ldyBTdHJpbmcoY2hhcnMpOwotCQl9Ci0JCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfRlJBTUVXT1JLX1NZU1BBVEgsIGZ3a1BhdGgpOwotCi0JCVN0cmluZ1tdIGJhc2VKYXJzID0gZ2V0QXJyYXlGcm9tTGlzdChiYXNlSmFyTGlzdCk7Ci0JCWlmIChiYXNlSmFycy5sZW5ndGggPT0gMCkgewotCQkJaWYgKCFpbkRldmVsb3BtZW50TW9kZSAmJiBuZXcgRmlsZShiYXNlLmdldEZpbGUoKSkuaXNEaXJlY3RvcnkoKSkKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBpbml0aWFsaXplICIgKyBQUk9QX0NMQVNTUEFUSCk7IC8vJE5PTi1OTFMtMSQKLQkJCWFkZEVudHJ5KGJhc2UsIHJlc3VsdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlSmFycy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHN0cmluZyA9IGJhc2VKYXJzW2ldOwotCQkJdHJ5IHsKLQkJCQkvLyBpZiB0aGUgc3RyaW5nIGlzIGEgZmlsZTogVVJMIHRoZW4gKmNhcmVmdWxseSogY29uc3RydWN0IHRoZQotCQkJCS8vIFVSTC4gT3RoZXJ3aXNlanVzdCB0cnkgdG8gYnVpbGQgYSBVUkwuIEluIGVpdGhlciBjYXNlLCBpZiB3ZSBmYWlsLCB1c2UKLQkJCQkvLyBzdHJpbmcgYXMgc29tZXRoaW5nIHRvIHRhY2sgb24gdGhlIGVuZCBvZiB0aGUgYmFzZS4KLQotCQkJCWlmIChzdHJpbmcuZXF1YWxzKCIuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlhZGRFbnRyeShiYXNlLCByZXN1bHQpOwotCQkJCX0KLQkJCQlVUkwgdXJsID0gbnVsbDsKLQkJCQlpZiAoc3RyaW5nLnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUUpKQotCQkJCQl1cmwgPSBuZXcgRmlsZShzdHJpbmcuc3Vic3RyaW5nKDUpKS50b1VSTCgpOwotCQkJCWVsc2UKLQkJCQkJdXJsID0gbmV3IFVSTChzdHJpbmcpOwotCQkJCWFkZEVudHJ5KHVybCwgcmVzdWx0KTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWRkRW50cnkobmV3IFVSTChiYXNlLCBzdHJpbmcpLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50cnkoVVJMIHVybCwgTGlzdCByZXN1bHQpIHsKLQkJaWYgKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmV4aXN0cygpKQotCQkJcmVzdWx0LmFkZCh1cmwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREZXZFbnRyaWVzKFVSTCBiYXNlLCBMaXN0IHJlc3VsdCwgU3RyaW5nIHN5bWJvbGljTmFtZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCWlmIChkZXZDbGFzc1BhdGhQcm9wcyA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBkbyBub3RoaW5nCi0JCVN0cmluZyBkZXZQYXRoTGlzdCA9IGRldkNsYXNzUGF0aFByb3BzLmdldFByb3BlcnR5KHN5bWJvbGljTmFtZSk7Ci0JCWlmIChkZXZQYXRoTGlzdCA9PSBudWxsKQotCQkJZGV2UGF0aExpc3QgPSBkZXZDbGFzc1BhdGhQcm9wcy5nZXRQcm9wZXJ0eSgiKiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIGxvY2F0aW9ucyA9IGdldEFycmF5RnJvbUxpc3QoZGV2UGF0aExpc3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gbG9jYXRpb25zW2ldOwotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUobG9jYXRpb24pOwotCQkJVVJMIHVybDsKLQkJCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCQl1cmwgPSBwYXRoLnRvVVJMKCk7Ci0JCQllbHNlIHsKLQkJCQkvLyBkZXYgcGF0aCBpcyByZWxhdGl2ZSwgY29tYmluZSB3aXRoIGJhc2UgbG9jYXRpb24KLQkJCQljaGFyIGxhc3RDaGFyID0gbG9jYXRpb24uY2hhckF0KGxvY2F0aW9uLmxlbmd0aCgpIC0gMSk7Ci0JCQkJaWYgKChsb2NhdGlvbi5lbmRzV2l0aCgiLmphciIpIHx8IChsYXN0Q2hhciA9PSAnLycgfHwgbGFzdENoYXIgPT0gJ1xcJykpKSAvLyROT04tTkxTLTEkCi0JCQkJCXVybCA9IG5ldyBVUkwoYmFzZSwgbG9jYXRpb24pOwotCQkJCWVsc2UKLQkJCQkJdXJsID0gbmV3IFVSTChiYXNlLCBsb2NhdGlvbiArICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWFkZEVudHJ5KHVybCwgcmVzdWx0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPlVSTDwvY29kZT4tYmFzZWQgY2xhc3MgcGF0aCBkZXNjcmliaW5nIHdoZXJlIHRoZSBib290IGNsYXNzZXMgYXJlIGxvY2F0ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgdXJsLWJhc2VkIGNsYXNzIHBhdGgKLQkgKiBAcGFyYW0gYmFzZSB0aGUgYmFzZSBsb2NhdGlvbgotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMgY29tcHV0aW5nIHRoZSBjbGFzcyBwYXRoCi0JICovCi0JcHJvdGVjdGVkIFVSTFtdIGdldEJvb3RQYXRoKFN0cmluZyBiYXNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlVUkwgdXJsID0gbnVsbDsKLQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJdXJsID0gYnVpbGRVUkwoYmFzZSwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZWFyY2ggaW4gdGhlIHJvb3QgbG9jYXRpb24KLQkJCXVybCA9IGdldEluc3RhbGxMb2NhdGlvbigpOwotCQkJU3RyaW5nIHBhdGggPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpLCAicGx1Z2lucyIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhdGggPSBzZWFyY2hGb3IoZnJhbWV3b3JrLCBwYXRoKTsKLQkJCWlmIChwYXRoID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGZyYW1ld29yayIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl1cmwgPSBuZXcgRmlsZShwYXRoKS50b1VSTCgpOwotCQkJZWxzZQotCQkJCXVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksIHBhdGgpOwotCQl9Ci0JCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9GUkFNRVdPUkspID09IG51bGwpCi0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0ZSQU1FV09SSywgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZyYW1ld29yayBsb2NhdGVkOlxuICAgICIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYWRkIG9uIGFueSBkZXYgcGF0aCBlbGVtZW50cwotCQlVUkxbXSByZXN1bHQgPSBnZXREZXZQYXRoKHVybCk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGcmFtZXdvcmsgY2xhc3NwYXRoOiIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAiICsgcmVzdWx0W2ldLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgdGhlIGdpdmVuIHRhcmdldCBkaXJlY3Rvcnkgc3RhcnRpbmcgaW4gdGhlICJwbHVnaW5zIiBzdWJkaXJlY3RvcnkKLQkgKiBvZiB0aGUgZ2l2ZW4gbG9jYXRpb24uICBJZiBvbmUgaXMgZm91bmQgdGhlbiB0aGlzIGxvY2F0aW9uIGlzIHJldHVybmVkOyAKLQkgKiBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiB3aGVyZSB0YXJnZXQgZGlyZWN0b3J5IHdhcyBmb3VuZAotCSAqIEBwYXJhbSBzdGFydCB0aGUgbG9jYXRpb24gdG8gYmVnaW4gc2VhcmNoaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZWFyY2hGb3IoZmluYWwgU3RyaW5nIHRhcmdldCwgU3RyaW5nIHN0YXJ0KSB7Ci0JCXJldHVybiBzZWFyY2hGb3IodGFyZ2V0LCBudWxsLCBzdGFydCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWFyY2hGb3IoZmluYWwgU3RyaW5nIHRhcmdldCwgZmluYWwgU3RyaW5nIHRhcmdldFN1ZmZpeCwgU3RyaW5nIHN0YXJ0KSB7Ci0JCUZpbGUgcm9vdCA9IHJlc29sdmVGaWxlKG5ldyBGaWxlKHN0YXJ0KSk7Ci0KLQkJLy8gTm90ZSB0aGF0IEZpbGUubGlzdCBvbmx5IGdpdmVzIHlvdSBmaWxlIG5hbWVzIG5vdCB0aGUgY29tcGxldGUgcGF0aCBmcm9tIHN0YXJ0Ci0JCVN0cmluZ1tdIGNhbmRpZGF0ZXMgPSByb290Lmxpc3QoKTsKLQkJaWYgKGNhbmRpZGF0ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFycmF5TGlzdCBtYXRjaGVzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNNYXRjaGluZ0NhbmRpZGF0ZSh0YXJnZXQsIGNhbmRpZGF0ZXNbaV0sIHJvb3QpKQotCQkJCW1hdGNoZXMuYWRkKGNhbmRpZGF0ZXNbaV0pOwotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gKFN0cmluZ1tdKSBtYXRjaGVzLnRvQXJyYXkobmV3IFN0cmluZ1ttYXRjaGVzLnNpemUoKV0pOwotCQlpbnQgcmVzdWx0ID0gZmluZE1heCh0YXJnZXQsIG5hbWVzKTsKLQkJaWYgKHJlc3VsdCA9PSAtMSkKLQkJCXJldHVybiBudWxsOwotCQlGaWxlIGNhbmRpZGF0ZSA9IG5ldyBGaWxlKHN0YXJ0LCBuYW1lc1tyZXN1bHRdKTsKLQkJcmV0dXJuIGNhbmRpZGF0ZS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSArIChjYW5kaWRhdGUuaXNEaXJlY3RvcnkoKSA/ICIvIiA6ICIiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNNYXRjaGluZ0NhbmRpZGF0ZShTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgY2FuZGlkYXRlLCBGaWxlIHJvb3QpIHsKLQkJaWYgKGNhbmRpZGF0ZS5lcXVhbHModGFyZ2V0KSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIWNhbmRpZGF0ZS5zdGFydHNXaXRoKHRhcmdldCArICJfIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHRhcmdldExlbmd0aCA9IHRhcmdldC5sZW5ndGgoKTsKLQkJaW50IGxhc3RVbmRlcnNjb3JlID0gY2FuZGlkYXRlLmxhc3RJbmRleE9mKCdfJyk7Ci0KLQkJLy9kbyB3ZSBoYXZlIGEgc2Vjb25kICdfJywgdmVyc2lvbiAoZm9vXzEuMC4wLnYxXzEyMykgb3IgaWQgKGZvby54ODZfNjQpID8KLQkJLy9maWxlcyBhcmUgYXNzdW1lZCB0byBoYXZlIGFuIGV4dGVuc2lvbiAoemlwIG9yIGphciBvbmx5KSwgcmVtb3ZlIGl0Ci0JCS8vTk9URTogd2Ugb25seSByZW1vdmUgLnppcCBhbmQgLmphciBleHRlbnNpb25zIGJlY2F1c2Ugd2Ugc3RpbGwgbmVlZCB0byBhY2NlcHQgbGlicmFyaWVzIHdpdGgKLQkJLy9zaW1wbGUgdmVyc2lvbnMgKGUuZy4gZWNsaXBzZV8xMjM0LmRsbCkKLQkJRmlsZSBjYW5kaWRhdGVGaWxlID0gbmV3IEZpbGUocm9vdCwgY2FuZGlkYXRlKTsKLQkJaWYgKGNhbmRpZGF0ZUZpbGUuaXNGaWxlKCkgJiYgKGNhbmRpZGF0ZS5lbmRzV2l0aCgiLmphciIpIHx8IGNhbmRpZGF0ZS5lbmRzV2l0aCgiLnppcCIpKSkgeyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJaW50IGV4dGVuc2lvbiA9IGNhbmRpZGF0ZS5sYXN0SW5kZXhPZignLicpOwotCQkJY2FuZGlkYXRlID0gY2FuZGlkYXRlLnN1YnN0cmluZygwLCBleHRlbnNpb24pOwotCQl9Ci0KLQkJaW50IGxhc3REb3QgPSBjYW5kaWRhdGUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3REb3QgPCB0YXJnZXRMZW5ndGgpIHsKLQkJCS8vIG5vIGRvdHMgYWZ0ZXIgdGFyZ2V0LCB0aGUgJ18nIGlzIG5vdCBpbiBhIHZlcnNpb24gKGZvby54ODZfNjQgY2FzZSksIG5vdCBhIG1hdGNoCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvL2dldCBwYXN0IGFsbCAnXycgdGhhdCBhcmUgcGFydCBvZiB0aGUgcXVhbGlmaWVyCi0JCXdoaWxlIChsYXN0VW5kZXJzY29yZSA+IGxhc3REb3QpCi0JCQlsYXN0VW5kZXJzY29yZSA9IGNhbmRpZGF0ZS5sYXN0SW5kZXhPZignXycsIGxhc3RVbmRlcnNjb3JlIC0gMSk7Ci0KLQkJaWYgKGxhc3RVbmRlcnNjb3JlID09IHRhcmdldExlbmd0aCkKLQkJCXJldHVybiB0cnVlOyAvL3VuZGVyc2NvcmUgYXQgdGhlIGVuZCBvZiB0YXJnZXQgKGZvb18xLjAuMC52MV8xMjMgY2FzZSkKLQkJcmV0dXJuIGZhbHNlOyAvL2Fub3RoZXIgdW5kZXJzY29yZSBiZXR3ZWVuIHRhcmdldCBhbmQgdmVyc2lvbiAoZm9vXzY0XzEuMC4wLnYxXzEyMyBjYXNlKQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHNlYXJjaEZvckJ1bmRsZShTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgc3RhcnQpIHsKLQkJLy9Pbmx5IGhhbmRsZSAicmVmZXJlbmNlOmZpbGU6IiB1cmxzLCBhbmQgbm90IHNpbXBsZSAiZmlsZToiIGJlY2F1c2Ugd2Ugd2lsbCBiZSB1c2luZyB0aGUgamFyIHdoZXJldmVyIGl0IGlzLgotCQlpZiAodGFyZ2V0LnN0YXJ0c1dpdGgoUkVGRVJFTkNFX1NDSEVNRSkpIHsKLQkJCXRhcmdldCA9IHRhcmdldC5zdWJzdHJpbmcoUkVGRVJFTkNFX1NDSEVNRS5sZW5ndGgoKSk7Ci0JCQlpZiAoIXRhcmdldC5zdGFydHNXaXRoKEZJTEVfU0NIRU1FKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCdW5kbGUgVVJMIGlzIGludmFsaWQ6ICIgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCQl0YXJnZXQgPSB0YXJnZXQuc3Vic3RyaW5nKEZJTEVfU0NIRU1FLmxlbmd0aCgpKTsKLQkJCUZpbGUgY2hpbGQgPSBuZXcgRmlsZSh0YXJnZXQpOwotCQkJRmlsZSBmaWxlTG9jYXRpb24gPSBjaGlsZDsKLQkJCWlmICghY2hpbGQuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJRmlsZSBwYXJlbnQgPSByZXNvbHZlRmlsZShuZXcgRmlsZShzdGFydCkpOwotCQkJCWZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKHBhcmVudCwgY2hpbGQuZ2V0UGF0aCgpKTsKLQkJCX0KLQkJCXJldHVybiBzZWFyY2hGb3IoZmlsZUxvY2F0aW9uLmdldE5hbWUoKSwgZmlsZUxvY2F0aW9uLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHNlYXJjaEZvcih0YXJnZXQsIHN0YXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGZpbmRNYXgoU3RyaW5nIHByZWZpeCwgU3RyaW5nW10gY2FuZGlkYXRlcykgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCU9iamVjdCBtYXhWZXJzaW9uID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChjYW5kaWRhdGVzW2ldICE9IG51bGwpID8gY2FuZGlkYXRlc1tpXSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmVyc2lvbiA9ICIiOyAvLyROT04tTkxTLTEkIC8vIE5vdGU6IGRpcmVjdG9yeSB3aXRoIHZlcnNpb24gc3VmZml4IGlzIGFsd2F5cyA+IHRoYW4gZGlyZWN0b3J5IHdpdGhvdXQgdmVyc2lvbiBzdWZmaXgKLQkJCWlmIChwcmVmaXggPT0gbnVsbCkKLQkJCQl2ZXJzaW9uID0gbmFtZTsgLy93ZWJzdGFydCBqdXN0IHBhc3NlcyBpbiB2ZXJzaW9ucwotCQkJZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKHByZWZpeCArICJfIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl2ZXJzaW9uID0gbmFtZS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpICsgMSk7IC8vcHJlZml4X3ZlcnNpb24KLQkJCU9iamVjdCBjdXJyZW50VmVyc2lvbiA9IGdldFZlcnNpb25FbGVtZW50cyh2ZXJzaW9uKTsKLQkJCWlmIChtYXhWZXJzaW9uID09IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBpOwotCQkJCW1heFZlcnNpb24gPSBjdXJyZW50VmVyc2lvbjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNvbXBhcmVWZXJzaW9uKChPYmplY3RbXSkgbWF4VmVyc2lvbiwgKE9iamVjdFtdKSBjdXJyZW50VmVyc2lvbikgPCAwKSB7Ci0JCQkJCXJlc3VsdCA9IGk7Ci0JCQkJCW1heFZlcnNpb24gPSBjdXJyZW50VmVyc2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlcyB2ZXJzaW9uIHN0cmluZ3MuIAotCSAqIEByZXR1cm4gcmVzdWx0IG9mIGNvbXBhcmlzb24sIGFzIGludGVnZXI7Ci0JICogPGNvZGU+PDA8L2NvZGU+IGlmIGxlZnQgPCByaWdodDsKLQkgKiA8Y29kZT4wPC9jb2RlPiBpZiBsZWZ0ID09IHJpZ2h0OwotCSAqIDxjb2RlPj4wPC9jb2RlPiBpZiBsZWZ0ID4gcmlnaHQ7Ci0JICovCi0JcHJpdmF0ZSBpbnQgY29tcGFyZVZlcnNpb24oT2JqZWN0W10gbGVmdCwgT2JqZWN0W10gcmlnaHQpIHsKLQotCQlpbnQgcmVzdWx0ID0gKChJbnRlZ2VyKSBsZWZ0WzBdKS5jb21wYXJlVG8oKEludGVnZXIpIHJpZ2h0WzBdKTsgLy8gY29tcGFyZSBtYWpvcgotCQlpZiAocmVzdWx0ICE9IDApCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCXJlc3VsdCA9ICgoSW50ZWdlcikgbGVmdFsxXSkuY29tcGFyZVRvKChJbnRlZ2VyKSByaWdodFsxXSk7IC8vIGNvbXBhcmUgbWlub3IKLQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlyZXN1bHQgPSAoKEludGVnZXIpIGxlZnRbMl0pLmNvbXBhcmVUbygoSW50ZWdlcikgcmlnaHRbMl0pOyAvLyBjb21wYXJlIHNlcnZpY2UKLQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlyZXR1cm4gKChTdHJpbmcpIGxlZnRbM10pLmNvbXBhcmVUbygoU3RyaW5nKSByaWdodFszXSk7IC8vIGNvbXBhcmUgcXVhbGlmaWVyCi0JfQotCi0JLyoqCi0JICogRG8gYSBxdWljayBwYXJzZSBvZiB2ZXJzaW9uIGlkZW50aWZpZXIgc28gaXRzIGVsZW1lbnRzIGNhbiBiZSBjb3JyZWN0bHkgY29tcGFyZWQuCi0JICogSWYgd2UgYXJlIHVuYWJsZSB0byBwYXJzZSB0aGUgZnVsbCB2ZXJzaW9uLCByZW1haW5pbmcgZWxlbWVudHMgYXJlIGluaXRpYWxpemVkCi0JICogd2l0aCBzdWl0YWJsZSBkZWZhdWx0cy4KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNpemUgNDsgZmlyc3QgdGhyZWUgZWxlbWVudHMgYXJlIG9mIHR5cGUgSW50ZWdlciAocmVwcmVzZW50aW5nCi0JICogbWFqb3IsIG1pbm9yIGFuZCBzZXJ2aWNlKSBhbmQgdGhlIGZvdXJ0aCBlbGVtZW50IGlzIG9mIHR5cGUgU3RyaW5nIChyZXByZXNlbnRpbmcKLQkgKiBxdWFsaWZpZXIpLiBOb3RlLCB0aGF0IHJldHVybmluZyBhbnl0aGluZyBlbHNlIHdpbGwgY2F1c2UgZXhjZXB0aW9ucyBpbiB0aGUgY2FsbGVyLgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gZ2V0VmVyc2lvbkVsZW1lbnRzKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmICh2ZXJzaW9uLmVuZHNXaXRoKCIuamFyIikpIC8vJE5PTi1OTFMtMSQKLQkJCXZlcnNpb24gPSB2ZXJzaW9uLnN1YnN0cmluZygwLCB2ZXJzaW9uLmxlbmd0aCgpIC0gNCk7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IHtuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMCksIG5ldyBJbnRlZ2VyKDApLCAiIn07IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9rZW5pemVyIHQgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlcnNpb24sICIuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRva2VuOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICh0Lmhhc01vcmVUb2tlbnMoKSAmJiBpIDwgNCkgewotCQkJdG9rZW4gPSB0Lm5leHRUb2tlbigpOwotCQkJaWYgKGkgPCAzKSB7Ci0JCQkJLy8gbWFqb3IsIG1pbm9yIG9yIHNlcnZpY2UgLi4uIG51bWVyaWMgdmFsdWVzCi0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0W2krK10gPSBuZXcgSW50ZWdlcih0b2tlbik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaW52YWxpZCBudW1iZXIgZm9ybWF0IC0gdXNlIGRlZmF1bHQgbnVtYmVycyAoMCkgZm9yIHRoZSByZXN0Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcXVhbGlmaWVyIC4uLiBzdHJpbmcgdmFsdWUKLQkJCQlyZXN1bHRbaSsrXSA9IHRva2VuOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIGJ1aWxkVVJMKFN0cmluZyBzcGVjLCBib29sZWFuIHRyYWlsaW5nU2xhc2gpIHsKLQkJaWYgKHNwZWMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlib29sZWFuIGlzRmlsZSA9IHNwZWMuc3RhcnRzV2l0aChGSUxFX1NDSEVNRSk7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNGaWxlKSB7Ci0JCQkJRmlsZSB0b0FkanVzdCA9IG5ldyBGaWxlKHNwZWMuc3Vic3RyaW5nKDUpKTsKLQkJCQl0b0FkanVzdCA9IHJlc29sdmVGaWxlKHRvQWRqdXN0KTsKLQkJCQlpZiAodG9BZGp1c3QuaXNEaXJlY3RvcnkoKSkKLQkJCQkJcmV0dXJuIGFkanVzdFRyYWlsaW5nU2xhc2godG9BZGp1c3QudG9VUkwoKSwgdHJhaWxpbmdTbGFzaCk7Ci0JCQkJcmV0dXJuIHRvQWRqdXN0LnRvVVJMKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFVSTChzcGVjKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIHdlIGZhaWxlZCBhbmQgaXQgaXMgYSBmaWxlIHNwZWMsIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB3ZSBjYW4gZG8KLQkJCS8vIG90aGVyd2lzZSwgdHJ5IHRvIG1ha2UgdGhlIHNwZWMgaW50byBhIGZpbGUgVVJMLgotCQkJaWYgKGlzRmlsZSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJRmlsZSB0b0FkanVzdCA9IG5ldyBGaWxlKHNwZWMpOwotCQkJCWlmICh0b0FkanVzdC5pc0RpcmVjdG9yeSgpKQotCQkJCQlyZXR1cm4gYWRqdXN0VHJhaWxpbmdTbGFzaCh0b0FkanVzdC50b1VSTCgpLCB0cmFpbGluZ1NsYXNoKTsKLQkJCQlyZXR1cm4gdG9BZGp1c3QudG9VUkwoKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgZ2l2ZW4gZmlsZSBhZ2FpbnN0ICBvc2dpLmluc3RhbGwuYXJlYS4KLQkgKiBJZiBvc2dpLmluc3RhbGwuYXJlYSBpcyBub3Qgc2V0LCBvciB0aGUgZmlsZSBpcyBub3QgcmVsYXRpdmUsIHRoZW4KLQkgKiB0aGUgZmlsZSBpcyByZXR1cm5lZCBhcyBpcy4gCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSByZXNvbHZlRmlsZShGaWxlIHRvQWRqdXN0KSB7Ci0JCWlmICghdG9BZGp1c3QuaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgaW5zdGFsbEFyZWEgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KFBST1BfSU5TVEFMTF9BUkVBKTsKLQkJCWlmIChpbnN0YWxsQXJlYSAhPSBudWxsKSB7Ci0JCQkJaWYgKGluc3RhbGxBcmVhLnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUUpKQotCQkJCQl0b0FkanVzdCA9IG5ldyBGaWxlKGluc3RhbGxBcmVhLnN1YnN0cmluZyg1KSwgdG9BZGp1c3QuZ2V0UGF0aCgpKTsKLQkJCQllbHNlIGlmIChuZXcgRmlsZShpbnN0YWxsQXJlYSkuZXhpc3RzKCkpCi0JCQkJCXRvQWRqdXN0ID0gbmV3IEZpbGUoaW5zdGFsbEFyZWEsIHRvQWRqdXN0LmdldFBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvQWRqdXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFVSTCBhZGp1c3RUcmFpbGluZ1NsYXNoKFVSTCB1cmwsIGJvb2xlYW4gdHJhaWxpbmdTbGFzaCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlID0gdXJsLmdldEZpbGUoKTsKLQkJaWYgKHRyYWlsaW5nU2xhc2ggPT0gKGZpbGUuZW5kc1dpdGgoIi8iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB1cmw7Ci0JCWZpbGUgPSB0cmFpbGluZ1NsYXNoID8gZmlsZSArICIvIiA6IGZpbGUuc3Vic3RyaW5nKDAsIGZpbGUubGVuZ3RoKCkgLSAxKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgZmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgYnVpbGRMb2NhdGlvbihTdHJpbmcgcHJvcGVydHksIFVSTCBkZWZhdWx0TG9jYXRpb24sIFN0cmluZyB1c2VyRGVmYXVsdEFwcGVuZGFnZSkgewotCQlVUkwgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGxvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5KTsKLQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUocHJvcGVydHkpOwotCQkvLyBpZiB0aGUgaW5zdGFuY2UgbG9jYXRpb24gaXMgbm90IHNldCwgcHJlZGljdCB3aGVyZSB0aGUgd29ya3NwYWNlIHdpbGwgYmUgYW5kIAotCQkvLyBwdXQgdGhlIGluc3RhbmNlIGFyZWEgaW5zaWRlIHRoZSB3b3Jrc3BhY2UgbWV0YSBhcmVhLgotCQl0cnkgewotCQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdExvY2F0aW9uOwotCQkJZWxzZSBpZiAobG9jYXRpb24uZXF1YWxzSWdub3JlQ2FzZShOT05FKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWVsc2UgaWYgKGxvY2F0aW9uLmVxdWFsc0lnbm9yZUNhc2UoTk9fREVGQVVMVCkpCi0JCQkJcmVzdWx0ID0gYnVpbGRVUkwobG9jYXRpb24sIHRydWUpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoVVNFUl9IT01FKSkgewotCQkJCQlTdHJpbmcgYmFzZSA9IHN1YnN0aXR1dGVWYXIobG9jYXRpb24sIFVTRVJfSE9NRSwgUFJPUF9VU0VSX0hPTUUpOwotCQkJCQlsb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2UsIHVzZXJEZWZhdWx0QXBwZW5kYWdlKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9IGVsc2UgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoVVNFUl9ESVIpKSB7Ci0JCQkJCVN0cmluZyBiYXNlID0gc3Vic3RpdHV0ZVZhcihsb2NhdGlvbiwgVVNFUl9ESVIsIFBST1BfVVNFUl9ESVIpOwotCQkJCQlsb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2UsIHVzZXJEZWZhdWx0QXBwZW5kYWdlKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQkJcmVzdWx0ID0gYnVpbGRVUkwobG9jYXRpb24sIHRydWUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KHByb3BlcnR5LCByZXN1bHQudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBzdWJzdGl0dXRlVmFyKFN0cmluZyBzb3VyY2UsIFN0cmluZyB2YXIsIFN0cmluZyBwcm9wKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHZhbHVlICsgc291cmNlLnN1YnN0cmluZyh2YXIubGVuZ3RoKCkpOwotCX0KLQotCS8qKiAKLQkgKiBSZXR1bnMgdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gcGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gbG9jYXRpb24uCi0JICogQnkgZGVmYXVsdCB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQotCSAqIGlmIHRoaXMgaXMgd3JpdGVhYmxlLiAgT3RoZXJ3aXNlIGl0IGlzIGxvY2F0ZWQgc29tZXdoZXJlIGluIHRoZSB1c2VyLmhvbWUKLQkgKiBhcmVhIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHByb2R1Y3QuIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gcGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpIHsKLQkJLy8gMSkgV2Ugc3RvcmUgdGhlIGNvbmZpZyBzdGF0ZSByZWxhdGl2ZSB0byB0aGUgJ2VjbGlwc2UnIGRpcmVjdG9yeSBpZiBwb3NzaWJsZQotCQkvLyAyKSBJZiB0aGlzIGRpcmVjdG9yeSBpcyByZWFkLW9ubHkgCi0JCS8vICAgIHdlIHN0b3JlIHRoZSBzdGF0ZSBpbiA8dXNlci5ob21lPi8uZWNsaXBzZS88YXBwbGljYXRpb24taWQ+Xzx2ZXJzaW9uPiB3aGVyZSA8dXNlci5ob21lPiAKLQkJLy8gICAgaXMgdW5pcXVlIGZvciBlYWNoIGxvY2FsIHVzZXIsIGFuZCA8YXBwbGljYXRpb24taWQ+IGlzIHRoZSBvbmUgCi0JCS8vICAgIGRlZmluZWQgaW4gLmVjbGlwc2Vwcm9kdWN0IG1hcmtlciBmaWxlLiBJZiAuZWNsaXBzZXByb2R1Y3QgZG9lcyBub3QKLQkJLy8gICAgZXhpc3QsIHVzZSAiZWNsaXBzZSIgYXMgdGhlIGFwcGxpY2F0aW9uLWlkLgotCi0JCVVSTCBpbnN0YWxsID0gZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0JCS8vIFRPRE8gYSBsaXR0bGUgZGFuZ2Vyb3VzIGhlcmUuICBCYXNpY2FsbHkgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCBpdCBpcyBhIGZpbGUgVVJMLgotCQlpZiAoaW5zdGFsbC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgaW5zdGFsbERpciA9IG5ldyBGaWxlKGluc3RhbGwuZ2V0RmlsZSgpKTsKLQkJCWlmIChjYW5Xcml0ZShpbnN0YWxsRGlyKSkKLQkJCQlyZXR1cm4gaW5zdGFsbERpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgQ09ORklHX0RJUjsKLQkJfQotCQkvLyBXZSBjYW4ndCB3cml0ZSBpbiB0aGUgZWNsaXBzZSBpbnN0YWxsIGRpciBzbyB0cnkgZm9yIHNvbWUgcGxhY2UgaW4gdGhlIHVzZXIncyBob21lIGRpcgotCQlyZXR1cm4gY29tcHV0ZURlZmF1bHRVc2VyQXJlYUxvY2F0aW9uKENPTkZJR19ESVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuV3JpdGUoRmlsZSBpbnN0YWxsRGlyKSB7Ci0JCWlmIChpbnN0YWxsRGlyLmNhbldyaXRlKCkgPT0gZmFsc2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKCFpbnN0YWxsRGlyLmlzRGlyZWN0b3J5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRmlsZSBmaWxlVGVzdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyB3ZSB1c2UgdGhlIC5kbGwgc3VmZml4IHRvIHByb3Blcmx5IHRlc3Qgb24gVmlzdGEgdmlydHVhbCBkaXJlY3RvcmllcwotCQkJLy8gb24gVmlzdGEgeW91IGFyZSBub3QgYWxsb3dlZCB0byB3cml0ZSBleGVjdXRhYmxlIGZpbGVzIG9uIHZpcnR1YWwgZGlyZWN0b3JpZXMgbGlrZSAiUHJvZ3JhbSBGaWxlcyIKLQkJCWZpbGVUZXN0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgid3JpdHRhYmxlQXJlYSIsICIuZGxsIiwgaW5zdGFsbERpcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lmIGFuIGV4Y2VwdGlvbiBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgdGhlIGZpbGUsIGl0IG1lYW5zIHRoYXQgaXQgaXMgbm90IHdyaXR0YWJsZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZpbGVUZXN0ICE9IG51bGwpCi0JCQkJZmlsZVRlc3QuZGVsZXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbGVzIHN5c3RlbSBwYXRoIGZvciBhbiBhcmVhIGluIHRoZSB1c2VyLmhvbWUgcmVnaW9uIHJlbGF0ZWQgdG8gdGhlCi0JICogY3VycmVudCBwcm9kdWN0LiAgVGhlIGdpdmVuIGFwcGVuZGFnZSBpcyBhZGRlZCB0byB0aGlzIGJhc2UgbG9jYXRpb24KLQkgKiBAcGFyYW0gcGF0aEFwcGVuZGFnZSB0aGUgcGF0aCBzZWdtZW50cyB0byBhZGQgdG8gY29tcHV0ZWQgYmFzZQotCSAqIEByZXR1cm4gYSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBpbiB0aGUgdXNlci5ob21lIGFyZWEgcmVsYXRlZCB0aGUgdGhlIGN1cnJlbnQKLQkgKiAgIHByb2R1Y3QgYW5kIHRoZSBnaXZlbiBhcHBlbmRhZ2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlRGVmYXVsdFVzZXJBcmVhTG9jYXRpb24oU3RyaW5nIHBhdGhBcHBlbmRhZ2UpIHsKLQkJLy8gICAgd2Ugc3RvcmUgdGhlIHN0YXRlIGluIDx1c2VyLmhvbWU+Ly5lY2xpcHNlLzxhcHBsaWNhdGlvbi1pZD5fPHZlcnNpb24+IHdoZXJlIDx1c2VyLmhvbWU+IAotCQkvLyAgICBpcyB1bmlxdWUgZm9yIGVhY2ggbG9jYWwgdXNlciwgYW5kIDxhcHBsaWNhdGlvbi1pZD4gaXMgdGhlIG9uZSAKLQkJLy8gICAgZGVmaW5lZCBpbiAuZWNsaXBzZXByb2R1Y3QgbWFya2VyIGZpbGUuIElmIC5lY2xpcHNlcHJvZHVjdCBkb2VzIG5vdAotCQkvLyAgICBleGlzdCwgdXNlICJlY2xpcHNlIiBhcyB0aGUgYXBwbGljYXRpb24taWQuCi0JCVVSTCBpbnN0YWxsVVJMID0gZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0JCWlmIChpbnN0YWxsVVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRmlsZSBpbnN0YWxsRGlyID0gbmV3IEZpbGUoaW5zdGFsbFVSTC5nZXRGaWxlKCkpOwotCQkvLyBjb21wdXRlIGFuIGluc3RhbGwgZGlyIGhhc2ggdG8gcHJldmVudCBjb25maWd1cmF0aW9uIGFyZWEgY29sbGlzaW9ucyB3aXRoIG90aGVyIGVjbGlwc2UgaW5zdGFsbHMKLQkJaW50IGhhc2hDb2RlOwotCQl0cnkgewotCQkJaGFzaENvZGUgPSBpbnN0YWxsRGlyLmdldENhbm9uaWNhbFBhdGgoKS5oYXNoQ29kZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCS8vIGZhbGwgYmFjayB0byBhYnNvbHV0ZSBwYXRoCi0JCQloYXNoQ29kZSA9IGluc3RhbGxEaXIuZ2V0QWJzb2x1dGVQYXRoKCkuaGFzaENvZGUoKTsKLQkJfQotCQlpZiAoaGFzaENvZGUgPCAwKQotCQkJaGFzaENvZGUgPSAtKGhhc2hDb2RlKTsKLQkJU3RyaW5nIGluc3RhbGxEaXJIYXNoID0gU3RyaW5nLnZhbHVlT2YoaGFzaENvZGUpOwotCi0JCVN0cmluZyBhcHBOYW1lID0gIi4iICsgRUNMSVBTRTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIGVjbGlwc2VQcm9kdWN0ID0gbmV3IEZpbGUoaW5zdGFsbERpciwgUFJPRFVDVF9TSVRFX01BUktFUik7Ci0JCWlmIChlY2xpcHNlUHJvZHVjdC5leGlzdHMoKSkgewotCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQl0cnkgewotCQkJCXByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShlY2xpcHNlUHJvZHVjdCkpOwotCQkJCVN0cmluZyBhcHBJZCA9IHByb3BzLmdldFByb3BlcnR5KFBST0RVQ1RfU0lURV9JRCk7Ci0JCQkJaWYgKGFwcElkID09IG51bGwgfHwgYXBwSWQudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCWFwcElkID0gRUNMSVBTRTsKLQkJCQlTdHJpbmcgYXBwVmVyc2lvbiA9IHByb3BzLmdldFByb3BlcnR5KFBST0RVQ1RfU0lURV9WRVJTSU9OKTsKLQkJCQlpZiAoYXBwVmVyc2lvbiA9PSBudWxsIHx8IGFwcFZlcnNpb24udHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCWFwcFZlcnNpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWFwcE5hbWUgKz0gRmlsZS5zZXBhcmF0b3IgKyBhcHBJZCArICJfIiArIGFwcFZlcnNpb24gKyAiXyIgKyBpbnN0YWxsRGlySGFzaDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZyBpZiB3ZSBnZXQgYW4gZXhjZXB0aW9uLiAgV2Ugd2lsbCBkZWZhdWx0IHRvIGEgc3RhbmRhcmQgbG9jYXRpb24gCi0JCQkJLy8gaW4gdGhlIHVzZXIncyBob21lIGRpci4KLQkJCQkvLyBhZGQgdGhlIGhhc2ggdG8gaGVscCBwcmV2ZW50IGNvbGxpc2lvbnMKLQkJCQlhcHBOYW1lICs9IEZpbGUuc2VwYXJhdG9yICsgaW5zdGFsbERpckhhc2g7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBhZGQgdGhlIGhhc2ggdG8gaGVscCBwcmV2ZW50IGNvbGxpc2lvbnMKLQkJCWFwcE5hbWUgKz0gRmlsZS5zZXBhcmF0b3IgKyBpbnN0YWxsRGlySGFzaDsKLQkJfQotCQlTdHJpbmcgdXNlckhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9VU0VSX0hPTUUpOwotCQlyZXR1cm4gbmV3IEZpbGUodXNlckhvbWUsIGFwcE5hbWUgKyAiLyIgKyBwYXRoQXBwZW5kYWdlKS5nZXRBYnNvbHV0ZVBhdGgoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhpcyBsYXVuY2hlciB3aXRoIHRoZSBhcmd1bWVudHMgc3BlY2lmaWVkIGluIHRoZSBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIGFyZ1N0cmluZyB0aGUgYXJndW1lbnRzIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdTdHJpbmcpIHsKLQkJVmVjdG9yIGxpc3QgPSBuZXcgVmVjdG9yKDUpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFyZ1N0cmluZywgIiAiKTsgdG9rZW5zLmhhc01vcmVFbGVtZW50cygpOykgLy8kTk9OLU5MUy0xJAotCQkJbGlzdC5hZGRFbGVtZW50KHRva2Vucy5uZXh0RWxlbWVudCgpKTsKLQkJbWFpbigoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHBsYXRmb3JtIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgbXVzdCBpZGVudGlmeQotCSAqIGFuIGFwcGxpY2F0aW9uIHRvIHJ1biAoZS5nLiwgPGNvZGU+LWFwcGxpY2F0aW9uIGNvbS5leGFtcGxlLmFwcGxpY2F0aW9uPC9jb2RlPikuCi0JICogQWZ0ZXIgcnVubmluZyB0aGUgYXBwbGljYXRpb24gPGNvZGU+U3lzdGVtLmV4aXQoTik8L2NvZGU+IGlzIGV4ZWN1dGVkLgotCSAqIFRoZSB2YWx1ZSBvZiBOIGlzIGRlcml2ZWQgZnJvbSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBJZiB0aGUgYXBwbGljYXRpb24ncyByZXR1cm4gdmFsdWUgaXMgYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4sIE4gaXMgdGhpcyB2YWx1ZS4KLQkgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIE4gPSAwLgotCSAqIDxwPgotCSAqIENsaWVudHMgd2lzaGluZyB0byBydW4gdGhlIHBsYXRmb3JtIHdpdGhvdXQgYSBmb2xsb3dpbmcgPGNvZGU+U3lzdGVtLmV4aXQ8L2NvZGU+Ci0JICogY2FsbCBzaG91bGQgdXNlIDxjb2RlPnJ1bigpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFyZ3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLQkgKiBAc2VlICNydW4oU3RyaW5nW10pCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IG5ldyBNYWluKCkucnVuKGFyZ3MpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJLy8gVGhpcyBpcyAqcmVhbGx5KiB1bmxpa2VseSB0byBoYXBwZW4gLSBydW4oKSB0YWtlcyBjYXJlIG9mIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbnMuCi0JCQkvLyBJbiBjYXNlIHNvbWV0aGluZyB3ZWlyZCBoYXBwZW5zLCBqdXN0IGR1bXAgc3RhY2sgLSBsb2dnaW5nIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhpcyBwb2ludAotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICghQm9vbGVhbi5nZXRCb29sZWFuKFBST1BfTk9TSFVURE9XTikpCi0JCQkJLy8gbWFrZSBzdXJlIHdlIGFsd2F5cyB0ZXJtaW5hdGUgdGhlIFZNCi0JCQkJU3lzdGVtLmV4aXQocmVzdWx0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHBsYXRmb3JtIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgbXVzdCBpZGVudGlmeQotCSAqIGFuIGFwcGxpY2F0aW9uIHRvIHJ1biAoZS5nLiwgPGNvZGU+LWFwcGxpY2F0aW9uIGNvbS5leGFtcGxlLmFwcGxpY2F0aW9uPC9jb2RlPikuCi0JICogUmV0dXJucyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBJZiB0aGUgYXBwbGljYXRpb24ncyByZXR1cm4gdmFsdWUgaXMgYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4sIE4gaXMgdGhpcyB2YWx1ZS4KLQkgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIE4gPSAwLgotCSAqCi0JICogQHBhcmFtIGFyZ3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgaW50IHJ1bihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQl0cnkgewotCQkJYmFzaWNSdW4oYXJncyk7Ci0JCQlTdHJpbmcgZXhpdENvZGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9FWElUQ09ERSk7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IGV4aXRDb2RlID09IG51bGwgPyAwIDogSW50ZWdlci5wYXJzZUludChleGl0Q29kZSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXJlc3VsdCA9IDE3OwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJLy8gb25seSBsb2cgdGhlIGV4Y2VwdGlvbnMgaWYgdGhleSBoYXZlIG5vdCBiZWVuIGNhdWdodCBieSB0aGUgCi0JCQkvLyBFY2xpcHNlU3RhcnRlciAoaS5lLiwgaWYgdGhlIGV4aXRDb2RlIGlzIG5vdCAxMykgCi0JCQlpZiAoISIxMyIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0VYSVRDT0RFKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWxvZygiRXhjZXB0aW9uIGxhdW5jaGluZyB0aGUgRWNsaXBzZSBQbGF0Zm9ybToiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWxvZyhlKTsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJBbiBlcnJvciBoYXMgb2NjdXJyZWQiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGxvZ0ZpbGUgPT0gbnVsbCkKLQkJCQkJbWVzc2FnZSArPSAiIGFuZCBjb3VsZCBub3QgYmUgbG9nZ2VkOiBcbiIgKyBlLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UKLQkJCQkJbWVzc2FnZSArPSAiLiAgU2VlIHRoZSBsb2cgZmlsZVxuIiArIGxvZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0VYSVREQVRBLCBtZXNzYWdlKTsKLQkJCX0KLQkJCS8vIFJldHVybiAidW5sdWNreSIgMTMgYXMgdGhlIGV4aXQgY29kZS4gVGhlIGV4ZWN1dGFibGUgd2lsbCByZWNvZ25pemUKLQkJCS8vIHRoaXMgY29uc3RhbnQgYW5kIGRpc3BsYXkgYSBtZXNzYWdlIHRvIHRoZSB1c2VyIHRlbGxpbmcgdGhlbSB0aGF0Ci0JCQkvLyB0aGVyZSBpcyBpbmZvcm1hdGlvbiBpbiB0aGVpciBsb2cgZmlsZS4KLQkJCXJlc3VsdCA9IDEzOwotCQl9IGZpbmFsbHkgewotCQkJLy8gYWx3YXlzIHRyeSBwdXR0aW5nIGRvd24gdGhlIHNwbGFzaCBzY3JlZW4ganVzdCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBmYWlsZWQgdG8gZG8gc28KLQkJCXRha2VEb3duU3BsYXNoKCk7Ci0JCQlpZiAoYnJpZGdlICE9IG51bGwpCi0JCQkJYnJpZGdlLnVuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JCS8vIFJldHVybiBhbiBpbnQgZXhpdCBjb2RlIGFuZCBlbnN1cmUgdGhlIHN5c3RlbSBwcm9wZXJ0eSBpcyBzZXQuCi0JCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfRVhJVENPREUsIEludGVnZXIudG9TdHJpbmcocmVzdWx0KSk7Ci0JCXNldEV4aXREYXRhKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEV4aXREYXRhKCkgewotCQlTdHJpbmcgZGF0YSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0VYSVREQVRBKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy9pZiB0aGUgYnJpZGdlIGlzIG51bGwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gc2VuZCB0aGUgZGF0YSB0bzsKLQkJLy9leGl0RGF0YSBpcyBhIHNoYXJlZCBtZW1vcnkgaWQsIGlmIHdlIGxvYWRlZCB0aGUgbGlicmFyeSBmcm9tIGphdmEsIHdlIG5lZWQgYSBub24tbnVsbCBleGl0RGF0YQotCQkvL2lmIHRoZSBleGVjdXRhYmxlIGxvYWRlZCB0aGUgbGlicmFyeSwgdGhlbiB3ZSBkb24ndCBuZWVkIHRoZSBleGl0RGF0YSBpZAotCQlpZiAoYnJpZGdlID09IG51bGwgfHwgKGJyaWRnZS5pc0xpYnJhcnlMb2FkZWRCeUphdmEoKSAmJiBleGl0RGF0YSA9PSBudWxsKSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihkYXRhKTsKLQkJZWxzZQotCQkJYnJpZGdlLnNldEV4aXREYXRhKGV4aXREYXRhLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBUaGUgZ2VuZXJhbCBwcmluY2lwbGUgaXMgdG8gTk9UCi0JICogY29uc3VtZSB0aGUgYXJndW1lbnRzIGFuZCBsZWF2ZSB0aGVtIHRvIGJlIHByb2Nlc3NlZCBieSBFY2xpcHNlIHByb3Blci4KLQkgKiBUaGVyZSBhcmUgYSBmZXcgYXJncyB3aGljaCBhcmUgZGlyZWN0ZWQgdG93YXJkcyBtYWluKCkgYW5kIGEgZmV3IG90aGVycwotCSAqIHdoaWNoIHdlIG5lZWQgdG8ga25vdyBhYm91dC4gVmVyeSBmZXcgc2hvdWxkIGFjdHVhbGx5IGJlIGNvbnN1bWVkIGhlcmUuCi0JICogCi0JICogQHJldHVybiB0aGUgYXJndW1lbnRzIHRvIHBhc3MgdGhyb3VnaCB0byB0aGUgbGF1bmNoZWQgYXBwbGljYXRpb24KLQkgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBwcm9jZXNzQ29tbWFuZExpbmUoU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBhcmdzOwotCQlpbnRbXSBjb25maWdBcmdzID0gbmV3IGludFthcmdzLmxlbmd0aF07Ci0JCWNvbmZpZ0FyZ3NbMF0gPSAtMTsgLy8gbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaXJzdCBlbGVtZW50IHRvIHNvbWV0aGluZyB0aGF0IGNvdWxkIG5vdCBiZSBhbiBpbmRleC4KLQkJaW50IGNvbmZpZ0FyZ0luZGV4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRob3V0IHBhcmFtZXRlcnMgKGkuZS4sIGEgZmxhZyBhcmcpCi0JCQkvLyBjaGVjayBpZiBkZWJ1ZyBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhlIGVudGlyZSBwbGF0Zm9ybQotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZShERUJVRykpIHsKLQkJCQlkZWJ1ZyA9IHRydWU7Ci0JCQkJLy8gcGFzc2VkIHRocnUgdGhpcyBhcmcgKGkuZS4sIGRvIG5vdCBzZXQgZm91bmQgPSB0cnVlKQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBsb29rIGZvciBhbmQgY29uc3VtZSB0aGUgbm9zcGxhc2ggZGlyZWN0aXZlLiAgVGhpcyBzdXBlcmNlZGVzIGFueQotCQkJLy8gLXNob3dzcGxhc2ggY29tbWFuZCB0aGF0IG1pZ2h0IGJlIHByZXNlbnQuCi0JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKE5PU1BMQVNIKSkgewotCQkJCXNwbGFzaERvd24gPSB0cnVlOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZShOT0VYSVQpKSB7Ci0JCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9OT1NIVVRET1dOLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCi0JCQkvLyBjaGVjayBpZiB0aGlzIGlzIGluaXRpYWxpemF0aW9uIHBhc3MKLQkJCWlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoSU5JVElBTElaRSkpIHsKLQkJCQlpbml0aWFsaXplID0gdHJ1ZTsKLQkJCQkvLyBwYXNzZWQgdGhydSB0aGlzIGFyZyAoaS5lLiwgZG8gbm90IHNldCBmb3VuZCA9IHRydWUpCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlmIGRldmVsb3BtZW50IG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoZSBlbnRpcmUgcGxhdGZvcm0KLQkJCS8vIElmIHRoaXMgaXMgdGhlIGxhc3QgYXJnIG9yIHRoZXJlIGlzIGEgZm9sbG93aW5nIGFyZyAoaS5lLiwgYXJnKzEgaGFzIGEgbGVhZGluZyAtKSwgCi0JCQkvLyBzaW1wbHkgZW5hYmxlIGRldmVsb3BtZW50IG1vZGUuICBPdGhlcndpc2UsIGFzc3VtZSB0aGF0IHRoYXQgdGhlIGZvbGxvd2luZyBhcmcgaXMKLQkJCS8vIGFjdHVhbGx5IHNvbWUgYWRkaXRpb25hbCBkZXZlbG9wbWVudCB0aW1lIGNsYXNzIHBhdGggZW50cmllcy4gIFRoaXMgd2lsbCBiZSBwcm9jZXNzZWQgYmVsb3cuCi0JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKERFVikgJiYgKChpICsgMSA9PSBhcmdzLmxlbmd0aCkgfHwgKChpICsgMSA8IGFyZ3MubGVuZ3RoKSAmJiAoYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbkRldmVsb3BtZW50TW9kZSA9IHRydWU7Ci0JCQkJLy8gZG8gbm90IG1hcmsgdGhlIGFyZyBhcyBmb3VuZCBzbyBpdCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIGxvb2sgZm9yIHRoZSBjb21tYW5kIHRvIHVzZSB0byBzaG93IHRoZSBzcGxhc2ggc2NyZWVuCi0JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFNIT1dTUExBU0gpKSB7Ci0JCQkJc2hvd1NwbGFzaCA9IHRydWU7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCS8vY29uc3VtZSBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIHNob3dzcGxhc2gKLQkJCQlpZiAoaSArIDEgPCBhcmdzLmxlbmd0aCAmJiAhYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29uZmlnQXJnc1tjb25maWdBcmdJbmRleCsrXSA9IGkrKzsKLQkJCQkJc3BsYXNoTG9jYXRpb24gPSBhcmdzW2ldOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZG9uZSBjaGVja2luZyBmb3IgYXJncy4gIFJlbWVtYmVyIHdoZXJlIGFuIGFyZyB3YXMgZm91bmQgCi0JCQlpZiAoZm91bmQpIHsKLQkJCQljb25maWdBcmdzW2NvbmZpZ0FyZ0luZGV4KytdID0gaTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gbG9vayBmb3IgdGhlIFZNIGFyZ3MgYXJnLiAgV2UgaGF2ZSB0byBkbyB0aGF0IGJlZm9yZSBsb29raW5nIHRvIHNlZQotCQkJLy8gaWYgdGhlIG5leHQgZWxlbWVudCBpcyBhIC1hcmcgYXMgdGhlIHRoaW5nIGZvbGxvd2luZyAtdm1hcmdzIG1heSBpbgotCQkJLy8gZmFjdCBiZSBhbm90aGVyIC1hcmcuCi0JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFZNQVJHUykpIHsKLQkJCQkvLyBjb25zdW1lIHRoZSAtdm1hcmdzIGFyZyBpdHNlbGYKLQkJCQlhcmdzW2ldID0gbnVsbDsKLQkJCQlpKys7Ci0JCQkJdm1hcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIGldOwotCQkJCWZvciAoaW50IGogPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJCQl2bWFyZ3NbaisrXSA9IGFyZ3NbaV07Ci0JCQkJCWFyZ3NbaV0gPSBudWxsOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgaWYgdGhlIG5leHQgb25lCi0JCQkvLyBoYXMgYSAnLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciwgdGhlbiB3ZSBjYW4ndCBoYXZlIGFuIGFyZyB3aXRoIGEgcGFybSBzbyBjb250aW51ZS4KLQkJCWlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBhcmcgPSBhcmdzWysraV07Ci0KLQkJCS8vIGxvb2sgZm9yIHRoZSBkZXZlbG9wbWVudCBtb2RlIGFuZCBjbGFzcyBwYXRoIGVudHJpZXMuICAKLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKERFVikpIHsKLQkJCQlpbkRldmVsb3BtZW50TW9kZSA9IHRydWU7Ci0JCQkJZGV2Q2xhc3NQYXRoUHJvcHMgPSBwcm9jZXNzRGV2QXJnKGFyZyk7Ci0JCQkJaWYgKGRldkNsYXNzUGF0aFByb3BzICE9IG51bGwpIHsKLQkJCQkJZGV2Q2xhc3NQYXRoID0gZGV2Q2xhc3NQYXRoUHJvcHMuZ2V0UHJvcGVydHkoT1NHSSk7Ci0JCQkJCWlmIChkZXZDbGFzc1BhdGggPT0gbnVsbCkKLQkJCQkJCWRldkNsYXNzUGF0aCA9IGRldkNsYXNzUGF0aFByb3BzLmdldFByb3BlcnR5KCIqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIGxvb2sgZm9yIHRoZSBmcmFtZXdvcmsgdG8gcnVuCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShGUkFNRVdPUkspKSB7Ci0JCQkJZnJhbWV3b3JrID0gYXJnOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoT1MpKSB7Ci0JCQkJb3MgPSBhcmc7Ci0JCQkJLy8gcGFzc2VkIHRocnUgdGhpcyBhcmcgCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKFdTKSkgewotCQkJCXdzID0gYXJnOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShBUkNIKSkgewotCQkJCWFyY2ggPSBhcmc7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIGxvb2sgZm9yIGV4cGxpY2l0bHkgc2V0IGluc3RhbGwgcm9vdAotCQkJLy8gQ29uc3VtZSB0aGUgYXJnIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIGxhdW5jaGVyIGFuZCBFY2xpcHNlIGdldCB0aGUgCi0JCQkvLyBzYW1lIHZhbHVlIGFzIGVhY2ggb3RoZXIuICAKLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKElOU1RBTEwpKSB7Ci0JCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9JTlNUQUxMX0FSRUEsIGFyZyk7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCi0JCQkvLyBsb29rIGZvciB0aGUgY29uZmlndXJhdGlvbiB0byB1c2UuICAKLQkJCS8vIENvbnN1bWUgdGhlIGFyZyBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSBsYXVuY2hlciBhbmQgRWNsaXBzZSBnZXQgdGhlIAotCQkJLy8gc2FtZSB2YWx1ZSBhcyBlYWNoIG90aGVyLiAgCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShDT05GSUdVUkFUSU9OKSkgewotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfQ09ORklHX0FSRUEsIGFyZyk7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShFWElUREFUQSkpIHsKLQkJCQlleGl0RGF0YSA9IGFyZzsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGxvb2sgZm9yIHRoZSBuYW1lIHRvIHVzZSBieSB0aGUgbGF1bmNoZXIKLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKE5BTUUpKSB7Ci0JCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9MQVVOQ0hFUl9OQU1FLCBhcmcpOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQotCQkJLy8gbG9vayBmb3IgdGhlIHN0YXJ0dXAgamFyIHVzZWQgCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShTVEFSVFVQKSkgewotCQkJCS8vbm90IGRvaW5nIGFueXRoaW5nIHdpdGggdGhpcyByaWdodCBub3csIGJ1dCBzdGlsbCBjb25zdW1lIGl0Ci0JCQkJLy9zdGFydHVwID0gYXJnOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQotCQkJLy8gbG9vayBmb3IgdGhlIGxhdW5jaGVyIGxvY2F0aW9uCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hFUikpIHsKLQkJCQkvL25vdCBkb2luZyBhbnl0aGluZyB3aXRoIHRoaXMgcmlnaHQgbm93LCBidXQgc3RpbGwgY29uc3VtZSBpdAotCQkJCS8vbGF1bmNoZXIgPSBhcmc7Ci0JCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9MQVVOQ0hFUiwgYXJnKTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKExJQlJBUlkpKSB7Ci0JCQkJbGlicmFyeSA9IGFyZzsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGxvb2sgZm9yIHRoZSBjb21tYW5kIHRvIHVzZSB0byBlbmQgdGhlIHNwbGFzaCBzY3JlZW4KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKEVORFNQTEFTSCkpIHsKLQkJCQllbmRTcGxhc2ggPSBhcmc7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCi0JCQkvLyBsb29rIGZvciB0aGUgVk0gbG9jYXRpb24gYXJnCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShWTSkpIHsKLQkJCQl2bSA9IGFyZzsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCS8vbG9vayBmb3IgdGhlIG5sIHNldHRpbmcKLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKE5MKSkgewotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfTkwsIGFyZyk7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCi0JCQkvLyBkb25lIGNoZWNraW5nIGZvciBhcmdzLiAgUmVtZW1iZXIgd2hlcmUgYW4gYXJnIHdhcyBmb3VuZCAKLQkJCWlmIChmb3VuZCkgewotCQkJCWNvbmZpZ0FyZ3NbY29uZmlnQXJnSW5kZXgrK10gPSBpIC0gMTsKLQkJCQljb25maWdBcmdzW2NvbmZpZ0FyZ0luZGV4KytdID0gaTsKLQkJCX0KLQkJfQotCQkvLyByZW1vdmUgYWxsIHRoZSBhcmd1bWVudHMgY29uc3VtZWQgYnkgdGhpcyBhcmd1bWVudCBwYXJzaW5nCi0JCVN0cmluZ1tdIHBhc3NUaHJ1QXJncyA9IG5ldyBTdHJpbmdbYXJncy5sZW5ndGggLSBjb25maWdBcmdJbmRleCAtICh2bWFyZ3MgPT0gbnVsbCA/IDAgOiB2bWFyZ3MubGVuZ3RoICsgMSldOwotCQljb25maWdBcmdJbmRleCA9IDA7Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA9PSBjb25maWdBcmdzW2NvbmZpZ0FyZ0luZGV4XSkKLQkJCQljb25maWdBcmdJbmRleCsrOwotCQkJZWxzZSBpZiAoYXJnc1tpXSAhPSBudWxsKQotCQkJCXBhc3NUaHJ1QXJnc1tqKytdID0gYXJnc1tpXTsKLQkJfQotCQlyZXR1cm4gcGFzc1RocnVBcmdzOwotCX0KLQotCXByaXZhdGUgUHJvcGVydGllcyBwcm9jZXNzRGV2QXJnKFN0cmluZyBhcmcpIHsKLQkJaWYgKGFyZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgbG9jYXRpb24gPSBuZXcgVVJMKGFyZyk7Ci0JCQlyZXR1cm4gbG9hZChsb2NhdGlvbiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGUgYXJnIHdhcyBub3QgYSBVUkwgc28gdXNlIGl0IGFzIGlzLgotCQkJUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotCQkJcmVzdWx0LnB1dCgiKiIsIGFyZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gY29uc2lkZXIgbG9nZ2luZyBoZXJlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgVVJMIGdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbjsKLQkJY29uZmlndXJhdGlvbkxvY2F0aW9uID0gYnVpbGRMb2NhdGlvbihQUk9QX0NPTkZJR19BUkVBLCBudWxsLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uTG9jYXRpb24gPSBidWlsZExvY2F0aW9uKFBST1BfQ09ORklHX0FSRUFfREVGQVVMVCwgbnVsbCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoY29uZmlndXJhdGlvbkxvY2F0aW9uID09IG51bGwpCi0JCQkJY29uZmlndXJhdGlvbkxvY2F0aW9uID0gYnVpbGRVUkwoY29tcHV0ZURlZmF1bHRDb25maWd1cmF0aW9uTG9jYXRpb24oKSwgdHJ1ZSk7Ci0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiAhPSBudWxsKQotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9DT05GSUdfQVJFQSwgY29uZmlndXJhdGlvbkxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmZpZ3VyYXRpb24gbG9jYXRpb246XG4gICAgIiArIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIGlmIHRoZSBjb25maWd1cmF0aW9uIGFyZWEgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgZGlzY292ZXIgdGhlIGNvbmZpZyBhcmVhIGJ5Ci0JCS8vIHRyeWluZyB0byBmaW5kIGEgYmFzZSBjb25maWcgYXJlYS4gIFRoaXMgaXMgZWl0aGVyIGRlZmluZWQgaW4gYSBzeXN0ZW0gcHJvcGVydHkgb3IKLQkJLy8gaXMgY29tcHV0ZWQgcmVsYXRpdmUgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24uCi0JCS8vIE5vdGUgdGhhdCB0aGUgY29uZmlnIGluZm8gcmVhZCBoZXJlIGlzIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgYSB2YWx1ZSAKLQkJLy8gZm9yIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gYXJlYQotCQlVUkwgYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IG51bGw7Ci0JCVByb3BlcnRpZXMgYmFzZUNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQ09ORklHX0FSRUEpID09IG51bGwpIHsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9CQVNFX0NPTkZJR19BUkVBKTsKLQkJCWlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkKLQkJCQkvLyBoZXJlIHRoZSBiYXNlIGNvbmZpZyBjYW5ub3QgaGF2ZSBhbnkgc3ltYm9saWMgKGUuLmcsIEB4eHgpIGVudHJpZXMuICBJdCBtdXN0IGp1c3QKLQkJCQkvLyBwb2ludCB0byB0aGUgY29uZmlnIGZpbGUuCi0JCQkJYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IGJ1aWxkVVJMKGJhc2VMb2NhdGlvbiwgdHJ1ZSk7Ci0JCQlpZiAoYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9PSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCS8vIGhlcmUgd2UgYWNjZXNzIHRoZSBpbnN0YWxsIGxvY2F0aW9uIGJ1dCB0aGlzIGlzIHZlcnkgZWFybHkuICBUaGlzIGNhc2Ugd2lsbCBvbmx5IGhhcHBlbiBpZgotCQkJCQkvLyB0aGUgY29uZmlnIGFyZWEgaXMgbm90IHNldCBhbmQgdGhlIGJhc2UgY29uZmlnIGFyZWEgaXMgbm90IHNldCAob3IgaXMgYm9ndXMpLgotCQkJCQkvLyBJbiB0aGlzIGNhc2Ugd2UgY29tcHV0ZSBiYXNlZCBvbiB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KLQkJCQkJYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IG5ldyBVUkwoZ2V0SW5zdGFsbExvY2F0aW9uKCksIENPTkZJR19ESVIpOwotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGxlYXZlIGJhc2VDb25maWd1cmF0aW9uTG9jYXRpb24gbnVsbAotCQkJCX0KLQkJCWJhc2VDb25maWd1cmF0aW9uID0gbG9hZENvbmZpZ3VyYXRpb24oYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbik7Ci0JCQlpZiAoYmFzZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJCS8vIGlmIHRoZSBiYXNlIHNldHMgdGhlIGluc3RhbGwgYXJlYSB0aGVuIHVzZSB0aGF0IHZhbHVlIGlmIHRoZSBwcm9wZXJ0eS4gIFdlIGtub3cgdGhlIAotCQkJCS8vIHByb3BlcnR5IGlzIG5vdCBhbHJlYWR5IHNldC4KLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBiYXNlQ29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eShQUk9QX0NPTkZJR19BUkVBKTsKLQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKLQkJCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9DT05GSUdfQVJFQSwgbG9jYXRpb24pOwotCQkJCS8vIGlmIHRoZSBiYXNlIHNldHMgdGhlIGluc3RhbGwgYXJlYSB0aGVuIHVzZSB0aGF0IHZhbHVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgYWxyZWFkeSBzZXQuCi0JCQkJLy8gVGhpcyBoZWxwcyBpbiBzZWxmaG9zdGluZyBjYXNlcyB3aGVyZSB5b3UgY2Fubm90IGVhc2lseSBjb21wdXRlIHRoZSBpbnN0YWxsIGxvY2F0aW9uCi0JCQkJLy8gZnJvbSB0aGUgY29kZSBiYXNlLgotCQkJCWxvY2F0aW9uID0gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoUFJPUF9JTlNUQUxMX0FSRUEpOwotCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsICYmIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0lOU1RBTExfQVJFQSkgPT0gbnVsbCkKLQkJCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9JTlNUQUxMX0FSRUEsIGxvY2F0aW9uKTsKLQkJCX0KLQkJfQotCi0JCS8vIE5vdyB3ZSBrbm93IHdoZXJlIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9zZWQgdG8gYmUuICBHbyBhaGVhZCBhbmQgbG9hZAotCQkvLyBpdCBhbmQgbWVyZ2UgaW50byB0aGUgU3lzdGVtIHByb3BlcnRpZXMuICBUaGVuLCBpZiBjYXNjYWRlZCwgcmVhZCB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb24KLQkJLy8gTm90ZSB0aGF0IHRoZSBwYXJlbnQgbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgcGFyZW50IGFzIHdlIHJlYWQgYWJvdmUgc2luY2UgdGhlIAotCQkvLyBiYXNlIGNhbiBkZWZpbmUgaXRzIHBhcmVudC4gIFRoZSBmaXJzdCBwYXJlbnQgd2UgcmVhZCB3YXMgZWl0aGVyIGRlZmluZWQgYnkgdGhlIHVzZXIKLQkJLy8gb24gdGhlIGNvbW1hbmQgbGluZSBvciB3YXMgdGhlIG9uZSBpbiB0aGUgaW5zdGFsbCBkaXIuICAKLQkJLy8gaWYgdGhlIGNvbmZpZyBvciBwYXJlbnQgd2UgYXJlIGFib3V0IHRvIHJlYWQgaXMgdGhlIHNhbWUgYXMgdGhlIGJhc2UgY29uZmlnIHdlIHJlYWQgYWJvdmUsCi0JCS8vIGp1c3QgcmV1c2UgdGhlIGJhc2UKLQkJUHJvcGVydGllcyBjb25maWd1cmF0aW9uID0gYmFzZUNvbmZpZ3VyYXRpb247Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwgfHwgIWdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpLmVxdWFscyhiYXNlQ29uZmlndXJhdGlvbkxvY2F0aW9uKSkKLQkJCWNvbmZpZ3VyYXRpb24gPSBsb2FkQ29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSk7Ci0JCW1lcmdlUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpLCBjb25maWd1cmF0aW9uKTsKLQkJaWYgKCJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9DT05GSUdfQ0FTQ0FERUQpKSkgLy8kTk9OLU5MUy0xJAotCQkJLy8gaWYgd2UgYXJlIG5vdCBjYXNjYWRlZCB0aGVuIHJlbW92ZSB0aGUgcGFyZW50IHByb3BlcnR5IGV2ZW4gaWYgaXQgd2FzIHNldC4KLQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKFBST1BfU0hBUkVEX0NPTkZJR19BUkVBKTsKLQkJZWxzZSB7Ci0JCQllbnN1cmVBYnNvbHV0ZShQUk9QX1NIQVJFRF9DT05GSUdfQVJFQSk7Ci0JCQlVUkwgc2hhcmVkQ29uZmlnVVJMID0gYnVpbGRMb2NhdGlvbihQUk9QX1NIQVJFRF9DT05GSUdfQVJFQSwgbnVsbCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2hhcmVkQ29uZmlnVVJMID09IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhlcmUgaXMgbm8gc2hhcmVkIGNvbmZpZyB2YWx1ZSBzbyBjb21wdXRlIG9uZQotCQkJCQlzaGFyZWRDb25maWdVUkwgPSBuZXcgVVJMKGdldEluc3RhbGxMb2NhdGlvbigpLCBDT05GSUdfRElSKTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBsZWF2ZSBzaGFyZWRDb25maWd1cmF0aW9uTG9jYXRpb24gbnVsbAotCQkJCX0KLQkJCS8vIGlmIHRoZSBwYXJlbnQgbG9jYXRpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlIGNvbmZpZyBsb2NhdGlvbiwgcmVhZCBpdCB0b28uCi0JCQlpZiAoc2hhcmVkQ29uZmlnVVJMICE9IG51bGwpIHsKLQkJCQlpZiAoc2hhcmVkQ29uZmlnVVJMLmVxdWFscyhnZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSkpCi0JCQkJCS8vIHJlbW92ZSB0aGUgcHJvcGVydHkgdG8gc2hvdyB0aGF0IHdlIGRvIG5vdCBoYXZlIGEgcGFyZW50LgotCQkJCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZShQUk9QX1NIQVJFRF9DT05GSUdfQVJFQSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGlmIHRoZSBwYXJlbnQgd2UgYXJlIGFib3V0IHRvIHJlYWQgaXMgdGhlIHNhbWUgYXMgdGhlIGJhc2UgY29uZmlnIHdlIHJlYWQgYWJvdmUsCi0JCQkJCS8vIGp1c3QgcmV1c2UgdGhlIGJhc2UKLQkJCQkJY29uZmlndXJhdGlvbiA9IGJhc2VDb25maWd1cmF0aW9uOwotCQkJCQlpZiAoIXNoYXJlZENvbmZpZ1VSTC5lcXVhbHMoYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbikpCi0JCQkJCQljb25maWd1cmF0aW9uID0gbG9hZENvbmZpZ3VyYXRpb24oc2hhcmVkQ29uZmlnVVJMKTsKLQkJCQkJbWVyZ2VQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCksIGNvbmZpZ3VyYXRpb24pOwotCQkJCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX1NIQVJFRF9DT05GSUdfQVJFQSwgc2hhcmVkQ29uZmlnVVJMLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCQlpZiAoZGVidWcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNoYXJlZCBjb25maWd1cmF0aW9uIGxvY2F0aW9uOlxuICAgICIgKyBzaGFyZWRDb25maWdVUkwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gc2V0dXAgdGhlIHBhdGggdG8gdGhlIGZyYW1ld29yawotCQlTdHJpbmcgdXJsU3RyaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfRlJBTUVXT1JLLCBudWxsKTsKLQkJaWYgKHVybFN0cmluZyAhPSBudWxsKSB7Ci0JCQl1cmxTdHJpbmcgPSByZXNvbHZlKHVybFN0cmluZyk7Ci0JCQkvL2Vuc3VyZSB0aGF0IHRoZSBpbnN0YWxsIGxvY2F0aW9uIGlzIHNldCBiZWZvcmUgcmVzb2x2aW5nIGZyYW1ld29yawotCQkJZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0JCQlVUkwgdXJsID0gYnVpbGRVUkwodXJsU3RyaW5nLCB0cnVlKTsKLQkJCXVybFN0cmluZyA9IHVybC50b0V4dGVybmFsRm9ybSgpOwotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9GUkFNRVdPUkssIHVybFN0cmluZyk7Ci0JCQlib290TG9jYXRpb24gPSB1cmxTdHJpbmc7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoZSB2YWx1ZSBmb3IgYSBzeXN0ZW0gcHJvcGVydHkgaXMgYW4gYWJzb2x1dGUgVVJMLiBSZWxhdGl2ZSBVUkxzIGFyZSB0cmFuc2xhdGVkIHRvCi0JICogYWJzb2x1dGUgVVJMcyBieSB0YWtpbmcgdGhlIGluc3RhbGwgVVJMIGFzIHJlZmVyZW5jZS4KLQkgKiAgIAotCSAqIEBwYXJhbSBsb2NhdGlvblByb3BlcnR5IHRoZSBrZXkgZm9yIGEgc3lzdGVtIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBVUkwKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlQWJzb2x1dGUoU3RyaW5nIGxvY2F0aW9uUHJvcGVydHkpIHsKLQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkobG9jYXRpb25Qcm9wZXJ0eSk7Ci0JCWlmIChwcm9wZXJ0eVZhbHVlID09IG51bGwpCi0JCQkvLyBwcm9wZXJ0eSBub3QgZGVmaW5lZAotCQkJcmV0dXJuOwotCQlVUkwgbG9jYXRpb25VUkwgPSBudWxsOwotCQl0cnkgewotCQkJbG9jYXRpb25VUkwgPSBuZXcgVVJMKHByb3BlcnR5VmFsdWUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gcHJvcGVydHkgaXMgbm90IGEgdmFsaWQgVVJMCi0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGxvY2F0aW9uUGF0aCA9IGxvY2F0aW9uVVJMLmdldFBhdGgoKTsKLQkJaWYgKGxvY2F0aW9uUGF0aC5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vIHByb3BlcnR5IHZhbHVlIGlzIGFic29sdXRlCi0JCQlyZXR1cm47Ci0JCVVSTCBpbnN0YWxsVVJMID0gZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0JCWlmICghbG9jYXRpb25VUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoaW5zdGFsbFVSTC5nZXRQcm90b2NvbCgpKSkKLQkJCS8vIG5vdCBzYW1lIHByb3RvY29sCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlVUkwgYWJzb2x1dGVVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIGxvY2F0aW9uUGF0aCk7Ci0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChsb2NhdGlvblByb3BlcnR5LCBhYnNvbHV0ZVVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBub3QgaGFwcGVuIC0gdGhlIHJlbGF0aXZlIFVSTCBpcyBrbm93biB0byBiZSB2YWxpZAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB1cmwgb2YgdGhlIGxvY2F0aW9uIHRoaXMgY2xhc3Mgd2FzIGxvYWRlZCBmcm9tCi0JICovCi0JcHJpdmF0ZSBVUkwgZ2V0SW5zdGFsbExvY2F0aW9uKCkgewotCQlpZiAoaW5zdGFsbExvY2F0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFsbExvY2F0aW9uOwotCi0JCS8vIHZhbHVlIGlzIG5vdCBzZXQgc28gY29tcHV0ZSB0aGUgZGVmYXVsdCBhbmQgc2V0IHRoZSB2YWx1ZQotCQlTdHJpbmcgaW5zdGFsbEFyZWEgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9JTlNUQUxMX0FSRUEpOwotCQlpZiAoaW5zdGFsbEFyZWEgIT0gbnVsbCkgewotCQkJaW5zdGFsbExvY2F0aW9uID0gYnVpbGRVUkwoaW5zdGFsbEFyZWEsIHRydWUpOwotCQkJaWYgKGluc3RhbGxMb2NhdGlvbiA9PSBudWxsKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluc3RhbGwgbG9jYXRpb24gaXMgaW52YWxpZDogIiArIGluc3RhbGxBcmVhKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9JTlNUQUxMX0FSRUEsIGluc3RhbGxMb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsKLQkJCWlmIChkZWJ1ZykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbGwgbG9jYXRpb246XG4gICAgIiArIGluc3RhbGxMb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpbnN0YWxsTG9jYXRpb247Ci0JCX0KLQotCQlQcm90ZWN0aW9uRG9tYWluIGRvbWFpbiA9IE1haW4uY2xhc3MuZ2V0UHJvdGVjdGlvbkRvbWFpbigpOwotCQlDb2RlU291cmNlIHNvdXJjZSA9IG51bGw7Ci0JCVVSTCByZXN1bHQgPSBudWxsOwotCQlpZiAoZG9tYWluICE9IG51bGwpCi0JCQlzb3VyY2UgPSBkb21haW4uZ2V0Q29kZVNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgZG9tYWluID09IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvZGVTb3VyY2UgbG9jYXRpb24gaXMgbnVsbC4gRGVmYXVsdGluZyB0aGUgaW5zdGFsbCBsb2NhdGlvbiB0byBmaWxlOnN0YXJ0dXAuamFyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gbmV3IFVSTCgiZmlsZTpzdGFydHVwLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTIpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IHNvdXJjZS5nZXRMb2NhdGlvbigpOwotCi0JCVN0cmluZyBwYXRoID0gZGVjb2RlKHJlc3VsdC5nZXRGaWxlKCkpOwotCQkvLyBub3JtYWxpemUgdG8gbm90IGhhdmUgbGVhZGluZyAvIHNvIHdlIGNhbiBjaGVjayB0aGUgZm9ybQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJcGF0aCA9IGZpbGUudG9TdHJpbmcoKS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCS8vIFRPRE8gbmVlZCBhIGJldHRlciB0ZXN0IGZvciB3aW5kb3dzCi0JCS8vIElmIG9uIFdpbmRvd3MgdGhlbiBjYW5vbmljYWxpemUgdGhlIGRyaXZlIGxldHRlciB0byBiZSBsb3dlcmNhc2UuCi0JCS8vIHJlbWVtYmVyIHRoYXQgdGhlcmUgbWF5IGJlIFVOQyBwYXRocyAKLQkJaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnXFwnKQotCQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwYXRoLmNoYXJBdCgwKSkpIHsKLQkJCQljaGFyW10gY2hhcnMgPSBwYXRoLnRvQ2hhckFycmF5KCk7Ci0JCQkJY2hhcnNbMF0gPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2hhcnNbMF0pOwotCQkJCXBhdGggPSBuZXcgU3RyaW5nKGNoYXJzKTsKLQkJCX0KLQkJaWYgKHBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIpKSAvLyROT04tTkxTLTEkCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZigiLyIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiL3BsdWdpbnMvIikpIC8vJE5PTi1OTFMtMSQgCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtICIvcGx1Z2lucy8iLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQkvLyBjcmVhdGUgYSBmaWxlIFVSTCAodmlhIEZpbGUpIHRvIG5vcm1hbGl6ZSB0aGUgZm9ybSAoZS5nLiwgcHV0IAotCQkJCS8vIHRoZSBsZWFkaW5nIC8gb24gaWYgbmVjZXNzYXJ5KQotCQkJCXBhdGggPSBuZXcgRmlsZShwYXRoKS50b1VSTCgpLmdldEZpbGUoKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotCQkJCS8vIHdpbGwgbmV2ZXIgaGFwcGVuLiAgVGhlIHBhdGggaXMgc3RyYWlnaHQgZnJvbSBhIFVSTC4gIAotCQkJfQotCQkJaW5zdGFsbExvY2F0aW9uID0gbmV3IFVSTChyZXN1bHQuZ2V0UHJvdG9jb2woKSwgcmVzdWx0LmdldEhvc3QoKSwgcmVzdWx0LmdldFBvcnQoKSwgcGF0aCk7Ci0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0lOU1RBTExfQVJFQSwgaW5zdGFsbExvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBWZXJ5IHVubGlrZWx5IGNhc2UuICBsb2cgaGVyZS4gIAotCQl9Ci0JCWlmIChkZWJ1ZykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFsbCBsb2NhdGlvbjpcbiAgICAiICsgaW5zdGFsbExvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gaW5zdGFsbExvY2F0aW9uOwotCX0KLQotCS8qCi0JICogTG9hZCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWRDb25maWd1cmF0aW9uKFVSTCB1cmwpIHsKLQkJUHJvcGVydGllcyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCh1cmwsIENPTkZJR19GSUxFKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAoZGVidWcpCi0JCQkJU3lzdGVtLm91dC5wcmludCgiQ29uZmlndXJhdGlvbiBmaWxlOlxuICAgICIgKyB1cmwudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IGxvYWRQcm9wZXJ0aWVzKHVybCk7Ci0JCQlpZiAoZGVidWcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgbG9hZGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKGRlYnVnKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIG5vdCBmb3VuZCBvciBub3QgcmVhZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gdHJ5IHRvIGxvYWQgc2F2ZWQgY29uZmlndXJhdGlvbiBmaWxlICh3YXRjaCBmb3IgZmFpbGVkIHByaW9yIHNhdmUoKSkKLQkJaWYgKHVybCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVByb3BlcnRpZXMgcmVzdWx0ID0gbnVsbDsKLQkJSU9FeGNlcHRpb24gb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gbG9hZCh1cmwsIG51bGwpOyAvLyB0cnkgdG8gbG9hZCBjb25maWcgZmlsZQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJb3JpZ2luYWxFeGNlcHRpb24gPSBlMTsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gbG9hZCh1cmwsIENPTkZJR19GSUxFX1RFTVBfU1VGRklYKTsgLy8gY2hlY2sgZm9yIGZhaWx1cmVzIG9uIHNhdmUKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0ID0gbG9hZCh1cmwsIENPTkZJR19GSUxFX0JBS19TVUZGSVgpOyAvLyBjaGVjayBmb3IgZmFpbHVyZXMgb24gc2F2ZQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUzKSB7Ci0JCQkJCXRocm93IG9yaWdpbmFsRXhjZXB0aW9uOyAvLyB3ZSB0cmllZCwgYnV0IG5vIGNvbmZpZyBoZXJlIC4uLgotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogTG9hZCB0aGUgY29uZmlndXJhdGlvbiAgCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWQoVVJMIHVybCwgU3RyaW5nIHN1ZmZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZmlndXJlIG91dCB3aGF0IHdlIHdpbGwgYmUgbG9hZGluZwotCQlpZiAoc3VmZml4ICE9IG51bGwgJiYgIXN1ZmZpeC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCB1cmwuZ2V0RmlsZSgpICsgc3VmZml4KTsKLQotCQkvLyB0cnkgdG8gbG9hZCBzYXZlZCBjb25maWd1cmF0aW9uIGZpbGUKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCXByb3BzLmxvYWQoaXMpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vaWdub3JlIGZhaWx1cmUgdG8gY2xvc2UKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCS8qCi0JICogSGFuZGxlIHNwbGFzaCBzY3JlZW4uCi0JICogIFRoZSBzcGxhc2ggc2NyZWVuIGlzIGRpc3BsYXllZCBuYXRpdmVseS4gIFdoZXRoZXIgb3Igbm90IHRoZSBzcGxhc2ggc2NyZWVuCi0JICogIHdhcyBkaXNwbGF5ZWQgYnkgdGhlIGxhdW5jaGVyLCB3ZSBpbnZva2UgSk5JQnJpZGdlLnNob3dTcGxhc2goKSBhbmQgdGhlIAotCSAqICBuYXRpdmUgY29kZSBoYW5kbGVzIHRoZSBjYXNlIG9mIHRoZSBzcGxhc2ggc2NyZWVuIGFscmVhZHkgZXhpc3RpbmcuCi0JICogCi0JICogVGhlIC1zaG93c3BsYXNoIGFyZ3VtZW50IG1heSBpbmRpY2F0ZSB0aGUgYml0bWFwIHVzZWQgYnkgdGhlIG5hdGl2ZSBsYXVuY2hlciwKLQkgKiBvciB0aGUgYml0bWFwIGxvY2F0aW9uIG1heSBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgY29uZmlnLmluaQotCSAqIAotCSAqIFdlIHBhc3MgYSBoYW5kbGVyIChSdW5uYWJsZSkgdG8gdGhlIHBsYXRmb3JtIHdoaWNoIGlzIGNhbGxlZCBhcyBhIHJlc3VsdCBvZiB0aGUKLQkgKiBsYXVuY2hlZCBhcHBsaWNhdGlvbiBjYWxsaW5nIFBsYXRmb3JtLmVuZFNwbGFzaCgpLiBUaGlzIGhhbmRsZSBjYWxscyAKLQkgKiBKTklCcmlkZ2UudGFrZURvd25TcGxhc2ggYW5kIHRoZSBuYXRpdmUgY29kZSB3aWxsIGNsb3NlIHRoZSBzcGxhc2ggc2NyZWVuLgotCSAqIAotCSAqIFRoZSAtZW5kc3BsYXNoIGFyZ3VtZW50IGlzIGxvbmdlciB1c2VkIGFuZCBoYXMgdGhlIHNhbWUgcmVzdWx0IGFzIC1ub3NwbGFzaAotCSAqIAotCSAqIEBwYXJhbSBkZWZhdWx0UGF0aCBzZWFyY2ggcGF0aCBmb3IgdGhlIGJvb3QgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwbGFzaChVUkxbXSBkZWZhdWx0UGF0aCkgewotCQkvLyBydW4gd2l0aG91dCBzcGxhc2ggaWYgd2UgYXJlIGluaXRpYWxpemluZyBvciBub3NwbGFzaCAKLQkJLy8gd2FzIHNwZWNpZmllZCAoc3BsYXNoZG93biA9IHRydWUpCi0JCWlmIChpbml0aWFsaXplIHx8IHNwbGFzaERvd24gfHwgYnJpZGdlID09IG51bGwpIHsKLQkJCXNob3dTcGxhc2ggPSBmYWxzZTsKLQkJCWVuZFNwbGFzaCA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoc2hvd1NwbGFzaCB8fCBlbmRTcGxhc2ggIT0gbnVsbCkgewotCQkJLy8gUmVnaXN0ZXIgdGhlIGVuZFNwbGFzaEhhbmRsZXIgdG8gYmUgcnVuIGF0IFZNIHNodXRkb3duLiBUaGlzIGhvb2sgd2lsbCBiZSAKLQkJCS8vIHJlbW92ZWQgb25jZSB0aGUgc3BsYXNoIHNjcmVlbiBoYXMgYmVlbiB0YWtlbiBkb3duLgotCQkJdHJ5IHsKLQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2soc3BsYXNoSGFuZGxlcik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCQkvLyBCZXN0IGVmZm9ydCB0byByZWdpc3RlciB0aGUgaGFuZGxlcgotCQkJfQotCQl9Ci0KLQkJLy8gaWYgLWVuZHNwbGFzaCBpcyBzcGVjaWZpZWQsIHVzZSBpdCBhbmQgaWdub3JlIGFueSAtc2hvd3NwbGFzaCBjb21tYW5kCi0JCWlmIChlbmRTcGxhc2ggIT0gbnVsbCkgewotCQkJc2hvd1NwbGFzaCA9IGZhbHNlOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgd2l0aG91dCBhIHNwbGFzaCBzY3JlZW4KLQkJaWYgKCFzaG93U3BsYXNoKQotCQkJcmV0dXJuOwotCi0JCS8vIGRldGVybWluZSB0aGUgc3BsYXNoIGxvY2F0aW9uCi0JCXNwbGFzaExvY2F0aW9uID0gZ2V0U3BsYXNoTG9jYXRpb24oZGVmYXVsdFBhdGgpOwotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNwbGFzaCBsb2NhdGlvbjpcbiAgICAiICsgc3BsYXNoTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWlmIChzcGxhc2hMb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWJyaWRnZS5zZXRMYXVuY2hlckluZm8oU3lzdGVtLmdldFByb3BlcnR5KFBST1BfTEFVTkNIRVIpLCBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9MQVVOQ0hFUl9OQU1FKSk7Ci0JCWJyaWRnZS5zaG93U3BsYXNoKHNwbGFzaExvY2F0aW9uKTsKLQkJbG9uZyBoYW5kbGUgPSBicmlkZ2UuZ2V0U3BsYXNoSGFuZGxlKCk7Ci0JCWlmIChoYW5kbGUgIT0gMCAmJiBoYW5kbGUgIT0gLTEpIHsKLQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFNQTEFTSF9IQU5ETEUsIFN0cmluZy52YWx1ZU9mKGhhbmRsZSkpOwotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoU1BMQVNIX0xPQ0FUSU9OLCBzcGxhc2hMb2NhdGlvbik7Ci0JCQlicmlkZ2UudXBkYXRlU3BsYXNoKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjb3VsZG4ndCBzaG93IHRoZSBzcGxhc2ggc2NyZWVuIGZvciBzb21lIHJlYXNvbgotCQkJc3BsYXNoRG93biA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRha2UgZG93biB0aGUgc3BsYXNoIHNjcmVlbi4gCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGFrZURvd25TcGxhc2goKSB7Ci0JCWlmIChzcGxhc2hEb3duIHx8IGJyaWRnZSA9PSBudWxsKSAvLyBzcGxhc2ggaXMgYWxyZWFkeSBkb3duCi0JCQlyZXR1cm47Ci0KLQkJc3BsYXNoRG93biA9IGJyaWRnZS50YWtlRG93blNwbGFzaCgpOwotCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZShTUExBU0hfSEFORExFKTsKLQotCQl0cnkgewotCQkJUnVudGltZS5nZXRSdW50aW1lKCkucmVtb3ZlU2h1dGRvd25Ib29rKHNwbGFzaEhhbmRsZXIpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJLy8gT0sgdG8gaWdub3JlIHRoaXMsIGhhcHBlbnMgd2hlbiB0aGUgVk0gaXMgYWxyZWFkeSBzaHV0dGluZyBkb3duCi0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiBwYXRoIG9mIHRoZSBzcGxhc2ggaW1hZ2UgdG8gdXNlLiAgRmlyc3Qgc2VhcmNoIHRoZSBkZWZpbmVkIHNwbGFzaCBwYXRoLgotCSAqIElmIHRoYXQgZG9lcyBub3Qgd29yaywgbG9vayBmb3IgYSBkZWZhdWx0IHNwbGFzaC4gIEN1cnJlbnRseSB0aGUgc3BsYXNoIG11c3QgYmUgaW4gdGhlIGZpbGUgc3lzdGVtCi0JICogc28gdGhlIHJldHVybiB2YWx1ZSBoZXJlIGlzIHRoZSBmaWxlIHN5c3RlbSBwYXRoLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNwbGFzaExvY2F0aW9uKFVSTFtdIGJvb3RQYXRoKSB7Ci0JCS8vY2hlY2sgdGhlIHBhdGggcGFzc2VkIGluIGZyb20gLXNob3dzcGxhc2ggZmlyc3QuICBUaGUgb2xkIGxhdW5jaGVyIHBhc3NlZCBhIHRpbWVvdXQgdmFsdWUKLQkJLy9hcyB0aGUgYXJndW1lbnQsIHNvIG9ubHkgdXNlIGl0IGlmIGl0IGlzbid0IGEgbnVtYmVyIGFuZCB0aGUgZmlsZSBleGlzdHMuCi0JCWlmIChzcGxhc2hMb2NhdGlvbiAhPSBudWxsICYmICFDaGFyYWN0ZXIuaXNEaWdpdChzcGxhc2hMb2NhdGlvbi5jaGFyQXQoMCkpICYmIG5ldyBGaWxlKHNwbGFzaExvY2F0aW9uKS5leGlzdHMoKSkgewotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9TUExBU0hMT0NBVElPTiwgc3BsYXNoTG9jYXRpb24pOwotCQkJcmV0dXJuIHNwbGFzaExvY2F0aW9uOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9TUExBU0hMT0NBVElPTik7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCVN0cmluZyBzcGxhc2hQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfU1BMQVNIUEFUSCk7Ci0JCWlmIChzcGxhc2hQYXRoICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIGVudHJpZXMgPSBnZXRBcnJheUZyb21MaXN0KHNwbGFzaFBhdGgpOwotCQkJQXJyYXlMaXN0IHBhdGggPSBuZXcgQXJyYXlMaXN0KGVudHJpZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBlbnRyeSA9IHJlc29sdmUoZW50cmllc1tpXSk7Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwgJiYgZW50cnkuc3RhcnRzV2l0aChGSUxFX1NDSEVNRSkpIHsKLQkJCQkJRmlsZSBlbnRyeUZpbGUgPSBuZXcgRmlsZShlbnRyeS5zdWJzdHJpbmcoNSkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQkJCQllbnRyeSA9IHNlYXJjaEZvcihlbnRyeUZpbGUuZ2V0TmFtZSgpLCBlbnRyeUZpbGUuZ2V0UGFyZW50KCkpOwotCQkJCQlpZiAoZW50cnkgIT0gbnVsbCkKLQkJCQkJCXBhdGguYWRkKGVudHJ5KTsKLQkJCQl9IGVsc2UKLQkJCQkJbG9nKCJJbnZhbGlkIHNwbGFzaCBwYXRoIGVudHJ5OiAiICsgZW50cmllc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIHNlZSBpZiB3ZSBjYW4gZ2V0IGEgc3BsYXNoIGdpdmVuIHRoZSBzcGxhc2ggcGF0aAotCQkJcmVzdWx0ID0gc2VhcmNoRm9yU3BsYXNoKChTdHJpbmdbXSkgcGF0aC50b0FycmF5KG5ldyBTdHJpbmdbcGF0aC5zaXplKCldKSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX1NQTEFTSExPQ0FUSU9OLCByZXN1bHQpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIERvIGEgbG9jYWxlLXNlbnNpdGl2ZSBsb29rdXAgb2Ygc3BsYXNoIGltYWdlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoRm9yU3BsYXNoKFN0cmluZ1tdIHNlYXJjaFBhdGgpIHsKLQkJaWYgKHNlYXJjaFBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEdldCB0aGUgc3BsYXNoIHNjcmVlbiBmb3IgdGhlIHNwZWNpZmllZCBsb2NhbGUKLQkJU3RyaW5nIGxvY2FsZSA9IChTdHJpbmcpIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFBST1BfTkwpOwotCQlpZiAobG9jYWxlID09IG51bGwpCi0JCQlsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZ1tdIG5sVmFyaWFudHMgPSBidWlsZE5MVmFyaWFudHMobG9jYWxlKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sVmFyaWFudHMubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VhcmNoUGF0aC5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBwYXRoID0gc2VhcmNoUGF0aFtqXTsKLQkJCQlpZiAocGF0aC5zdGFydHNXaXRoKEZJTEVfU0NIRU1FKSkKLQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDUpOwotCQkJCS8vIGRvIHdlIGhhdmUgYSBKQVI/Ci0JCQkJaWYgKGlzSkFSKHBhdGgpKSB7Ci0JCQkJCVN0cmluZyByZXN1bHQgPSBleHRyYWN0RnJvbUpBUihwYXRoLCBubFZhcmlhbnRzW2ldKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB3ZSBoYXZlIGEgZmlsZSBvciBhIGRpcmVjdG9yeQotCQkJCQlpZiAoIXBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKQotCQkJCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvcjsKLQkJCQkJcGF0aCArPSBubFZhcmlhbnRzW2ldOwotCQkJCQlGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCQlpZiAocmVzdWx0LmV4aXN0cygpKQotCQkJCQkJcmV0dXJuIHJlc3VsdC5nZXRBYnNvbHV0ZVBhdGgoKTsgLy8gcmV0dXJuIHRoZSBmaXJzdCBtYXRjaCBmb3VuZCBbMjAwNjNdCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc29ycnksIGNvdWxkIG5vdCBmaW5kIHNwbGFzaCBpbWFnZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2ZlcnMgYWxsIGF2YWlsYWJsZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uIAotCSAqIFJlZ2FyZGxlc3Mgb2YgZmFpbHVyZSwgdGhpcyBtZXRob2QgY2xvc2VzIGJvdGggc3RyZWFtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRyYW5zZmVyU3RyZWFtcyhJbnB1dFN0cmVhbSBzb3VyY2UsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbikgewotCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODA5Nl07Ci0JCXRyeSB7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBieXRlc1JlYWQgPSAtMTsKLQkJCQl0cnkgewotCQkJCQlieXRlc1JlYWQgPSBzb3VyY2UucmVhZChidWZmZXIpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoYnl0ZXNSZWFkID09IC0xKQotCQkJCQlicmVhazsKLQkJCQl0cnkgewotCQkJCQlkZXN0aW5hdGlvbi53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlzb3VyY2UuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy9jbG9zZSBkZXN0aW5hdGlvbiBpbiBmaW5hbGx5IGluIGNhc2Ugc291cmNlLmNsb3NlIGZhaWxzCi0JCQkJdHJ5IHsKLQkJCQkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogTG9vayBmb3IgdGhlIHNwZWNpZmllZCBzcGFzaCBmaWxlIGluIHRoZSBnaXZlbiBKQVIgYW5kIGV4dHJhY3QgaXQgdG8gdGhlIGNvbmZpZyAKLQkgKiBhcmVhIGZvciBjYWNoaW5nIHB1cnBvc2VzLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3RGcm9tSkFSKFN0cmluZyBqYXJQYXRoLCBTdHJpbmcgamFyRW50cnkpIHsKLQkJU3RyaW5nIGNvbmZpZ0xvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQ09ORklHX0FSRUEpOwotCQlpZiAoY29uZmlnTG9jYXRpb24gPT0gbnVsbCkgewotCQkJbG9nKCJDb25maWd1cmF0aW9uIGFyZWEgbm90IHNldCB5ZXQuIFVuYWJsZSB0byBleHRyYWN0ICIgKyBqYXJFbnRyeSArICIgZnJvbSBKQVInZCBwbHVnLWluOiAiICsgamFyUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVVJMIGNvbmZpZ1VSTCA9IGJ1aWxkVVJMKGNvbmZpZ0xvY2F0aW9uLCBmYWxzZSk7Ci0JCWlmIChjb25maWdVUkwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBjYWNoZSB0aGUgc3BsYXNoIGluIHRoZSBlcXVpbm94IGxhdW5jaGVyIHN1Yi1kaXIgaW4gdGhlIGNvbmZpZyBhcmVhCi0JCUZpbGUgc3BsYXNoID0gbmV3IEZpbGUoY29uZmlnVVJMLmdldFBhdGgoKSwgUExVR0lOX0lEKTsKLQkJLy9pbmNsdWRlIHRoZSBuYW1lIG9mIHRoZSBqYXIgaW4gdGhlIGNhY2hlIGxvY2F0aW9uCi0JCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGphclBhdGgpOwotCQlTdHJpbmcgY2FjaGUgPSBqYXJGaWxlLmdldE5hbWUoKTsKLQkJaWYgKGNhY2hlLmVuZHNXaXRoKCIuamFyIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNhY2hlID0gY2FjaGUuc3Vic3RyaW5nKDAsIGNhY2hlLmxlbmd0aCgpIC0gNCk7Ci0JCXNwbGFzaCA9IG5ldyBGaWxlKHNwbGFzaCwgY2FjaGUpOwotCQlzcGxhc2ggPSBuZXcgRmlsZShzcGxhc2gsIGphckVudHJ5KTsKLQkJLy8gaWYgd2UgaGF2ZSBhbHJlYWR5IGV4dHJhY3RlZCB0aGlzIGZpbGUgYmVmb3JlLCB0aGVuIHJldHVybgotCQlpZiAoc3BsYXNoLmV4aXN0cygpKSB7Ci0JCQkvLyBpZiB3ZSBhcmUgcnVubmluZyB3aXRoIC1jbGVhbiB0aGVuIGRlbGV0ZSB0aGUgY2FjaGVkIHNwbGFzaCBmaWxlCi0JCQlib29sZWFuIGNsZWFuID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKENMRUFOLmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZHNbaV0pKSB7Ci0JCQkJCWNsZWFuID0gdHJ1ZTsKLQkJCQkJc3BsYXNoLmRlbGV0ZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWNsZWFuKQotCQkJCXJldHVybiBzcGxhc2guZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQkJWmlwRmlsZSBmaWxlOwotCQl0cnkgewotCQkJZmlsZSA9IG5ldyBaaXBGaWxlKGphclBhdGgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coIkV4Y2VwdGlvbiBsb29raW5nIGZvciAiICsgamFyRW50cnkgKyAiIGluIEpBUiBmaWxlOiAiICsgamFyUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJWmlwRW50cnkgZW50cnkgPSBmaWxlLmdldEVudHJ5KGphckVudHJ5LnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsKLQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBmaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJbG9nKCJFeGNlcHRpb24gb3BlbmluZyBzcGxhc2g6ICIgKyBlbnRyeS5nZXROYW1lKCkgKyAiIGluIEpBUiBmaWxlOiAiICsgamFyUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJbmV3IEZpbGUoc3BsYXNoLmdldFBhcmVudCgpKS5ta2RpcnMoKTsKLQkJT3V0cHV0U3RyZWFtIG91dHB1dDsKLQkJdHJ5IHsKLQkJCW91dHB1dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShzcGxhc2gpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRyeSB7Ci0JCQkJaW5wdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cmFuc2ZlclN0cmVhbXMoaW5wdXQsIG91dHB1dCk7Ci0JCXJldHVybiBzcGxhc2guZXhpc3RzKCkgPyBzcGxhc2guZ2V0QWJzb2x1dGVQYXRoKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbgotCSAqIHBhdGggcmVwcmVzZW50cyBhIEpBUiBmaWxlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pBUihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gbmV3IEZpbGUocGF0aCkuaXNGaWxlKCk7Ci0JfQotCi0JLyoKLQkgKiBCdWlsZCBhbiBhcnJheSBvZiBwYXRoIHN1ZmZpeGVzIGJhc2VkIG9uIHRoZSBnaXZlbiBOTCB3aGljaCBpcyBzdWl0YWJsZQotCSAqIGZvciBzcGxhc2ggcGF0aCBzZWFyY2hpbmcuICBUaGUgcmV0dXJuZWQgYXJyYXkgY29udGFpbnMgcGF0aHMgaW4gb3JkZXIgCi0JICogZnJvbSBtb3N0IHNwZWNpZmljIHRvIG1vc3QgZ2VuZXJpYy4gU28sIGluIHRoZSBGUl9mciBsb2NhbGUsIGl0IHdpbGwgcmV0dXJuIAotCSAqICJubC9mci9GUi9zcGxhc2guYm1wIiwgdGhlbiAibmwvZnIvc3BsYXNoLmJtcCIsIGFuZCBmaW5hbGx5ICJzcGxhc2guYm1wIi4gCi0JICogKHdlIGFsd2F5cyBzZWFyY2ggdGhlIHJvb3QpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gYnVpbGROTFZhcmlhbnRzKFN0cmluZyBsb2NhbGUpIHsKLQkJLy9idWlsZCBsaXN0IG9mIHN1ZmZpeGVzIGZvciBsb2FkaW5nIHJlc291cmNlIGJ1bmRsZXMKLQkJU3RyaW5nIG5sID0gbG9jYWxlOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCg0KTsKLQkJaW50IGxhc3RTZXBhcmF0b3I7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlyZXN1bHQuYWRkKCJubCIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBubC5yZXBsYWNlKCdfJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArIEZpbGUuc2VwYXJhdG9yQ2hhciArIFNQTEFTSF9JTUFHRSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxhc3RTZXBhcmF0b3IgPSBubC5sYXN0SW5kZXhPZignXycpOwotCQkJaWYgKGxhc3RTZXBhcmF0b3IgPT0gLTEpCi0JCQkJYnJlYWs7Ci0JCQlubCA9IG5sLnN1YnN0cmluZygwLCBsYXN0U2VwYXJhdG9yKTsKLQkJfQotCQkvL2FkZCB0aGUgZW1wdHkgc3VmZml4IGxhc3QgKG1vc3QgZ2VuZXJhbCkKLQkJcmVzdWx0LmFkZChTUExBU0hfSU1BR0UpOwotCQlyZXR1cm4gKFN0cmluZ1tdKSByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIHJlc29sdmUgcGxhdGZvcm06L2Jhc2UvIFVSTHMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZXNvbHZlKFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHBlb3BsZSBtaXN0YWtlbmx5IHNwZWMgYSByZWZlcmVyZW5jZTogdXJsLgotCQlpZiAodXJsU3RyaW5nLnN0YXJ0c1dpdGgoUkVGRVJFTkNFX1NDSEVNRSkpCi0JCQl1cmxTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKDEwKTsKLQkJaWYgKHVybFN0cmluZy5zdGFydHNXaXRoKFBMQVRGT1JNX1VSTCkpIHsKLQkJCVN0cmluZyBwYXRoID0gdXJsU3RyaW5nLnN1YnN0cmluZyhQTEFURk9STV9VUkwubGVuZ3RoKCkpOwotCQkJcmV0dXJuIGdldEluc3RhbGxMb2NhdGlvbigpICsgcGF0aDsKLQkJfQotCQlyZXR1cm4gdXJsU3RyaW5nOwotCX0KLQotCS8qCi0JICogRW50cnkgcG9pbnQgZm9yIGxvZ2dpbmcuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGxvZyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCW9wZW5Mb2dGaWxlKCk7Ci0JCQl0cnkgewotCQkJCWlmIChuZXdTZXNzaW9uKSB7Ci0JCQkJCWxvZy53cml0ZShTRVNTSU9OKTsKLQkJCQkJbG9nLndyaXRlKCcgJyk7Ci0JCQkJCVN0cmluZyB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWxvZy53cml0ZSh0aW1lc3RhbXApOwotCQkJCQlsb2cud3JpdGUoJyAnKTsKLQkJCQkJZm9yIChpbnQgaSA9IFNFU1NJT04ubGVuZ3RoKCkgKyB0aW1lc3RhbXAubGVuZ3RoKCk7IGkgPCA3ODsgaSsrKQotCQkJCQkJbG9nLndyaXRlKCctJyk7Ci0JCQkJCWxvZy5uZXdMaW5lKCk7Ci0JCQkJCW5ld1Nlc3Npb24gPSBmYWxzZTsKLQkJCQl9Ci0JCQkJd3JpdGUob2JqKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGxvZ0ZpbGUgPT0gbnVsbCkgewotCQkJCQlpZiAobG9nICE9IG51bGwpCi0JCQkJCQlsb2cuZmx1c2goKTsKLQkJCQl9IGVsc2UKLQkJCQkJY2xvc2VMb2dGaWxlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRvIHRoZSBwbGF0Zm9ybSBsb2c6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJMb2dnaW5nIHRvIHRoZSBjb25zb2xlIGluc3RlYWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vd2UgZmFpbGVkIHRvIHdyaXRlLCBzbyBkdW1wIGxvZyBlbnRyeSB0byBjb25zb2xlIGluc3RlYWQKLQkJCXRyeSB7Ci0JCQkJbG9nID0gbG9nRm9yU3RyZWFtKFN5c3RlbS5lcnIpOwotCQkJCXdyaXRlKG9iaik7Ci0JCQkJbG9nLmZsdXNoKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBsb2dnaW5nIHRvIHRoZSBjb25zb2xlOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZTIucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbG9nID0gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSAjbG9nKCkKLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGUoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGhyb3dhYmxlKSB7Ci0JCQlsb2cud3JpdGUoU1RBQ0spOwotCQkJbG9nLm5ld0xpbmUoKTsKLQkJCSgoVGhyb3dhYmxlKSBvYmopLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIobG9nKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2cud3JpdGUoRU5UUlkpOwotCQkJbG9nLndyaXRlKCcgJyk7Ci0JCQlsb2cud3JpdGUoUExVR0lOX0lEKTsKLQkJCWxvZy53cml0ZSgnICcpOwotCQkJbG9nLndyaXRlKFN0cmluZy52YWx1ZU9mKEVSUk9SKSk7Ci0JCQlsb2cud3JpdGUoJyAnKTsKLQkJCWxvZy53cml0ZShTdHJpbmcudmFsdWVPZigwKSk7Ci0JCQlsb2cud3JpdGUoJyAnKTsKLQkJCWxvZy53cml0ZShnZXREYXRlKG5ldyBEYXRlKCkpKTsKLQkJCWxvZy5uZXdMaW5lKCk7Ci0JCQlsb2cud3JpdGUoTUVTU0FHRSk7Ci0JCQlsb2cud3JpdGUoJyAnKTsKLQkJCWxvZy53cml0ZShTdHJpbmcudmFsdWVPZihvYmopKTsKLQkJfQotCQlsb2cubmV3TGluZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0ZShEYXRlIGRhdGUpIHsKLQkJQ2FsZW5kYXIgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCWMuc2V0VGltZShkYXRlKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlhcHBlbmRQYWRkZWRJbnQoYy5nZXQoQ2FsZW5kYXIuWUVBUiksIDQsIHNiKS5hcHBlbmQoJy0nKTsKLQkJYXBwZW5kUGFkZGVkSW50KGMuZ2V0KENhbGVuZGFyLk1PTlRIKSArIDEsIDIsIHNiKS5hcHBlbmQoJy0nKTsKLQkJYXBwZW5kUGFkZGVkSW50KGMuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCksIDIsIHNiKS5hcHBlbmQoJyAnKTsKLQkJYXBwZW5kUGFkZGVkSW50KGMuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKSwgMiwgc2IpLmFwcGVuZCgnOicpOwotCQlhcHBlbmRQYWRkZWRJbnQoYy5nZXQoQ2FsZW5kYXIuTUlOVVRFKSwgMiwgc2IpLmFwcGVuZCgnOicpOwotCQlhcHBlbmRQYWRkZWRJbnQoYy5nZXQoQ2FsZW5kYXIuU0VDT05EKSwgMiwgc2IpLmFwcGVuZCgnLicpOwotCQlhcHBlbmRQYWRkZWRJbnQoYy5nZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpLCAzLCBzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGFwcGVuZFBhZGRlZEludChpbnQgdmFsdWUsIGludCBwYWQsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJcGFkID0gcGFkIC0gMTsKLQkJaWYgKHBhZCA9PSAwKQotCQkJcmV0dXJuIGJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotCQlpbnQgcGFkZGluZyA9IChpbnQpIE1hdGgucG93KDEwLCBwYWQpOwotCQlpZiAodmFsdWUgPj0gcGFkZGluZykKLQkJCXJldHVybiBidWZmZXIuYXBwZW5kKEludGVnZXIudG9TdHJpbmcodmFsdWUpKTsKLQkJd2hpbGUgKHBhZGRpbmcgPiB2YWx1ZSAmJiBwYWRkaW5nID4gMSkgewotCQkJYnVmZmVyLmFwcGVuZCgnMCcpOwotCQkJcGFkZGluZyA9IHBhZGRpbmcgLyAxMDsKLQkJfQotCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZUxvZ0ZpbGVMb2NhdGlvbigpIHsKLQkJU3RyaW5nIGxvZ0ZpbGVQcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfTE9HRklMRSk7Ci0JCWlmIChsb2dGaWxlUHJvcCAhPSBudWxsKSB7Ci0JCQlpZiAobG9nRmlsZSA9PSBudWxsIHx8ICFsb2dGaWxlUHJvcC5lcXVhbHMobG9nRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCQlsb2dGaWxlID0gbmV3IEZpbGUobG9nRmlsZVByb3ApOwotCQkJCW5ldyBGaWxlKGxvZ0ZpbGUuZ2V0UGFyZW50KCkpLm1rZGlycygpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY29tcHV0ZSB0aGUgYmFzZSBsb2NhdGlvbiBhbmQgdGhlbiBhcHBlbmQgdGhlIG5hbWUgb2YgdGhlIGxvZyBmaWxlCi0JCVVSTCBiYXNlID0gYnVpbGRVUkwoU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQ09ORklHX0FSRUEpLCBmYWxzZSk7Ci0JCWlmIChiYXNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWxvZ0ZpbGUgPSBuZXcgRmlsZShiYXNlLmdldFBhdGgoKSwgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgKyAiLmxvZyIpOyAvLyROT04tTkxTLTEkCi0JCW5ldyBGaWxlKGxvZ0ZpbGUuZ2V0UGFyZW50KCkpLm1rZGlycygpOwotCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0xPR0ZJTEUsIGxvZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGFuIEFTQ0lJIGNoYXJhY3RlciByZXByZXNlbnRpbmcgYSBoZXhhZGVjaW1hbAotCSAqIHZhbHVlIGludG8gaXRzIGludGVnZXIgZXF1aXZhbGVudC4KLQkgKi8KLQlwcml2YXRlIGludCBoZXhUb0J5dGUoYnl0ZSBiKSB7Ci0JCXN3aXRjaCAoYikgewotCQkJY2FzZSAnMCcgOgotCQkJCXJldHVybiAwOwotCQkJY2FzZSAnMScgOgotCQkJCXJldHVybiAxOwotCQkJY2FzZSAnMicgOgotCQkJCXJldHVybiAyOwotCQkJY2FzZSAnMycgOgotCQkJCXJldHVybiAzOwotCQkJY2FzZSAnNCcgOgotCQkJCXJldHVybiA0OwotCQkJY2FzZSAnNScgOgotCQkJCXJldHVybiA1OwotCQkJY2FzZSAnNicgOgotCQkJCXJldHVybiA2OwotCQkJY2FzZSAnNycgOgotCQkJCXJldHVybiA3OwotCQkJY2FzZSAnOCcgOgotCQkJCXJldHVybiA4OwotCQkJY2FzZSAnOScgOgotCQkJCXJldHVybiA5OwotCQkJY2FzZSAnQScgOgotCQkJY2FzZSAnYScgOgotCQkJCXJldHVybiAxMDsKLQkJCWNhc2UgJ0InIDoKLQkJCWNhc2UgJ2InIDoKLQkJCQlyZXR1cm4gMTE7Ci0JCQljYXNlICdDJyA6Ci0JCQljYXNlICdjJyA6Ci0JCQkJcmV0dXJuIDEyOwotCQkJY2FzZSAnRCcgOgotCQkJY2FzZSAnZCcgOgotCQkJCXJldHVybiAxMzsKLQkJCWNhc2UgJ0UnIDoKLQkJCWNhc2UgJ2UnIDoKLQkJCQlyZXR1cm4gMTQ7Ci0JCQljYXNlICdGJyA6Ci0JCQljYXNlICdmJyA6Ci0JCQkJcmV0dXJuIDE1OwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3dpdGNoIGVycm9yIGRlY29kaW5nIFVSTCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkxvZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljb21wdXRlTG9nRmlsZUxvY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlsb2cgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShsb2dGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ0ZpbGUgPSBudWxsOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCXByaXZhdGUgQnVmZmVyZWRXcml0ZXIgbG9nRm9yU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXQsICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9zZUxvZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGxvZyAhPSBudWxsKSB7Ci0JCQkJbG9nLmZsdXNoKCk7Ci0JCQkJbG9nLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlsb2cgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1lcmdlUHJvcGVydGllcyhQcm9wZXJ0aWVzIGRlc3RpbmF0aW9uLCBQcm9wZXJ0aWVzIHNvdXJjZSkgewotCQlpZiAoZGVzdGluYXRpb24gPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gc291cmNlLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoa2V5LmVxdWFscyhQUk9QX0NMQVNTUEFUSCkpIHsKLQkJCQlTdHJpbmcgZGVzdGluYXRpb25DbGFzc3BhdGggPSBkZXN0aW5hdGlvbi5nZXRQcm9wZXJ0eShQUk9QX0NMQVNTUEFUSCk7Ci0JCQkJU3RyaW5nIHNvdXJjZUNsYXNzcGF0aCA9IHNvdXJjZS5nZXRQcm9wZXJ0eShQUk9QX0NMQVNTUEFUSCk7Ci0JCQkJaWYgKGRlc3RpbmF0aW9uQ2xhc3NwYXRoID09IG51bGwpCi0JCQkJCWRlc3RpbmF0aW9uQ2xhc3NwYXRoID0gc291cmNlQ2xhc3NwYXRoOwotCQkJCWVsc2UKLQkJCQkJZGVzdGluYXRpb25DbGFzc3BhdGggPSBkZXN0aW5hdGlvbkNsYXNzcGF0aCArIHNvdXJjZUNsYXNzcGF0aDsKLQkJCQlkZXN0aW5hdGlvbi5wdXQoUFJPUF9DTEFTU1BBVEgsIGRlc3RpbmF0aW9uQ2xhc3NwYXRoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB2YWx1ZSA9IHNvdXJjZS5nZXRQcm9wZXJ0eShrZXkpOwotCQkJaWYgKGRlc3RpbmF0aW9uLmdldFByb3BlcnR5KGtleSkgPT0gbnVsbCkKLQkJCQlkZXN0aW5hdGlvbi5wdXQoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0dXBWTVByb3BlcnRpZXMoKSB7Ci0JCWlmICh2bSAhPSBudWxsKQotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9WTSwgdm0pOwotCQlzZXRNdWx0aVZhbHVlUHJvcGVydHkoUFJPUF9WTUFSR1MsIHZtYXJncyk7Ci0JCXNldE11bHRpVmFsdWVQcm9wZXJ0eShQUk9QX0NPTU1BTkRTLCBjb21tYW5kcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE11bHRpVmFsdWVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIFN0cmluZ1tdIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigzMDApOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotCQkJCWlmICh2YWx1ZVtpXSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQodmFsdWVbaV0pOwotCQkJCQlyZXN1bHQuYXBwZW5kKCdcbicpOwotCQkJCX0KLQkJCX0KLQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KHByb3BlcnR5LCByZXN1bHQudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE5PVEU6IEl0IGlzIG9rIGhlcmUgZm9yIEVjbGlwc2VQb2xpY3kgdG8gdXNlIDEuNCBtZXRob2RzIGJlY2F1c2UgdGhlIG1ldGhvZHMKLQkgKiB0aGF0IGl0IGNhbGxzIHRoZW0gZnJvbSBkb24ndCBleGlzdCBpbiBGb3VuZGF0aW9uIHNvIHRoZXkgd2lsbCBuZXZlciBiZSBjYWxsZWQuIEEgbW9yZQotCSAqIGRldGFpbGVkIGV4cGxhbmF0aW9uIGZyb20gVG9tOgotCSAqIAotCSAqIFRoZXkgd2lsbCBuZXZlciBnZXQgY2FsbGVkIGJlY2F1c2UgaW4gYSBwcmUgMS40IFZNIHRoZSBtZXRob2RzIAotCSAqIGdldFBlcm1pc3Npb25zKENvZGVTb3VyY2UpIGFuZCBpbXBsaWVzKFByb3RlY3Rpb25Eb21haW4sIFBlcm1pc3Npb24pIGFyZSAKLQkgKiB1bmRlZmluZWQgb24gdGhlIFBvbGljeSBjbGFzcyB3aGljaCBpcyB3aGF0IEVjbGlwc2VQb2xpY3kgZXh0ZW5kcy4gIEVjbGlwc2VQb2xpY3kgCi0JICogaW1wbGVtZW50cyB0aGVzZSB0d28gbWV0aG9kcyBzbyBpdCBjYW4gcHJveHkgdGhlbSB0byB0aGUgcGFyZW50IFBvbGljeS4gIAotCSAqIEJ1dCBzaW5jZSB0aGVzZSBtZXRob2RzIGFyZSBub3QgYWN0dWFsbHkgZGVmaW5lZCBvbiBQb2xpY3kgaW4gYSBwcmUtMS40IFZNIAotCSAqIG5vYm9keSB3aWxsIGFjdHVhbGx5IGNhbGwgdGhlbSAodW5sZXNzIHRoZXkgY2FzdGVkIHRoZSBwb2xpY3kgdG8gRWNsaXBzZVBvbGljeSBhbmQgCi0JICogY2FsbGVkIG91ciBtZXRob2RzKQotCSAqLwotCXByaXZhdGUgY2xhc3MgRWNsaXBzZVBvbGljeSBleHRlbmRzIFBvbGljeSB7Ci0JCS8vIFRoZSBwb2xpY3kgdGhhdCB0aGlzIEVjbGlwc2VQb2xpY3kgaXMgcmVwbGFjaW5nCi0JCXByaXZhdGUgUG9saWN5IHBvbGljeTsKLQotCQkvLyBUaGUgc2V0IG9mIFVSTHMgdG8gZ2l2ZSBBbGxQZXJtaXNzaW9ucyB0bzsgdGhpcyBpcyB0aGUgc2V0IG9mIGJvb3RVUkxzCi0JCXByaXZhdGUgVVJMW10gdXJsczsKLQotCQkvLyBUaGUgQWxsUGVybWlzc2lvbnMgY29sbGVjdGlvbgotCQlwcml2YXRlIFBlcm1pc3Npb25Db2xsZWN0aW9uIGFsbFBlcm1pc3Npb25zOwotCi0JCS8vIFRoZSBBbGxQZXJtaXNzaW9uIHBlcm1pc3Npb24KLQkJUGVybWlzc2lvbiBhbGxQZXJtaXNzaW9uID0gbmV3IEFsbFBlcm1pc3Npb24oKTsKLQotCQlFY2xpcHNlUG9saWN5KFBvbGljeSBwb2xpY3ksIFVSTFtdIHVybHMpIHsKLQkJCXRoaXMucG9saWN5ID0gcG9saWN5OwotCQkJdGhpcy51cmxzID0gdXJsczsKLQkJCWFsbFBlcm1pc3Npb25zID0gbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uKCkgewotCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTgxMzEzNDk0OTQ3MDgyNzdMOwotCi0JCQkJLy8gQSBzaW1wbGUgUGVybWlzc2lvbkNvbGxlY3Rpb24gdGhhdCBvbmx5IGhhcyBBbGxQZXJtaXNzaW9uCi0JCQkJcHVibGljIHZvaWQgYWRkKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewotCQkJCQkvL25vIGFkZGluZyB0byB0aGlzIHBvbGljeQotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGltcGxpZXMoUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJCQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsKLQkJCQkJCWludCBjdXIgPSAwOwotCi0JCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCQkJCQkJcmV0dXJuIGN1ciA8IDE7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCQkJCQkJaWYgKGN1ciA9PSAwKSB7Ci0JCQkJCQkJCWN1ciA9IDE7Ci0JCQkJCQkJCXJldHVybiBhbGxQZXJtaXNzaW9uOwotCQkJCQkJCX0KLQkJCQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoQ29kZVNvdXJjZSBjb2Rlc291cmNlKSB7Ci0JCQlpZiAoY29udGFpbnMoY29kZXNvdXJjZSkpCi0JCQkJcmV0dXJuIGFsbFBlcm1pc3Npb25zOwotCQkJcmV0dXJuIHBvbGljeSA9PSBudWxsID8gYWxsUGVybWlzc2lvbnMgOiBwb2xpY3kuZ2V0UGVybWlzc2lvbnMoY29kZXNvdXJjZSk7Ci0JCX0KLQotCQlwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoUHJvdGVjdGlvbkRvbWFpbiBkb21haW4pIHsKLQkJCWlmIChjb250YWlucyhkb21haW4uZ2V0Q29kZVNvdXJjZSgpKSkKLQkJCQlyZXR1cm4gYWxsUGVybWlzc2lvbnM7Ci0JCQlyZXR1cm4gcG9saWN5ID09IG51bGwgPyBhbGxQZXJtaXNzaW9ucyA6IHBvbGljeS5nZXRQZXJtaXNzaW9ucyhkb21haW4pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaW1wbGllcyhQcm90ZWN0aW9uRG9tYWluIGRvbWFpbiwgUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7Ci0JCQlpZiAoY29udGFpbnMoZG9tYWluLmdldENvZGVTb3VyY2UoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gcG9saWN5ID09IG51bGwgPyB0cnVlIDogcG9saWN5LmltcGxpZXMoZG9tYWluLCBwZXJtaXNzaW9uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCQlpZiAocG9saWN5ICE9IG51bGwpCi0JCQkJcG9saWN5LnJlZnJlc2goKTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhDb2RlU291cmNlIGNvZGVTb3VyY2UpIHsKLQkJCWlmIChjb2RlU291cmNlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJVVJMIHVybCA9IGNvZGVTb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCWlmICh1cmwgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBVUkwgaXMgaW4gb3VyIHNldCBvZiBVUkxzIHRvIGdpdmUgQWxsUGVybWlzc2lvbnMgdG8uCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBXZSBkbyBzaW1wbGUgZXF1YWxzIHRlc3QgaGVyZSBiZWNhdXNlIHdlIGFzc3VtZSB0aGUgVVJMcyB3aWxsIGJlIHRoZSBzYW1lIG9iamVjdHMuCi0JCQkJaWYgKHVybHNbaV0gPT0gdXJsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgU3RhcnR1cENsYXNzTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgewotCi0JCXB1YmxpYyBTdGFydHVwQ2xhc3NMb2FkZXIoVVJMW10gdXJscykgewotCQkJc3VwZXIodXJscyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RhcnR1cENsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyIHBhcmVudCkgewotCQkJc3VwZXIodXJscywgcGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyBTdGFydHVwQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXIgcGFyZW50LCBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlzdXBlcih1cmxzLCBwYXJlbnQsIGZhY3RvcnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBmaW5kTGlicmFyeShTdHJpbmcgbmFtZSkgewotCQkJaWYgKGV4dGVuc2lvblBhdGhzID09IG51bGwpCi0JCQkJcmV0dXJuIHN1cGVyLmZpbmRMaWJyYXJ5KG5hbWUpOwotCQkJU3RyaW5nIGxpYk5hbWUgPSBTeXN0ZW0ubWFwTGlicmFyeU5hbWUobmFtZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUoZXh0ZW5zaW9uUGF0aHNbaV0sIGxpYk5hbWUpOwotCQkJCWlmIChsaWJGaWxlLmlzRmlsZSgpKQotCQkJCQlyZXR1cm4gbGliRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5maW5kTGlicmFyeShuYW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9sYXVuY2hlci9XZWJTdGFydE1haW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9sYXVuY2hlci9XZWJTdGFydE1haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjNzQ0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvbGF1bmNoZXIvV2ViU3RhcnRNYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi0vKioKLSAqIFRoZSBsYXVuY2hlciB0byBzdGFydCBlY2xpcHNlIHVzaW5nIHdlYnN0YXJ0LiBUbyB1c2UgdGhpcyBsYXVuY2hlciwgdGhlIGNsaWVudCAKLSAqIG11c3QgYWNjZXB0IHRvIGdpdmUgYWxsIHNlY3VyaXR5IHBlcm1pc3Npb25zLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgcHJvZ3JhbW1hdGljYWxseSBieQotICogb3RoZXIgSmF2YSBjb2RlLiBUaGlzIGNsYXNzIGV4aXN0cyBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiBsYXVuY2hpbmcgRWNsaXBzZQotICogdXNpbmcgSmF2YSB3ZWJzdGFydC4gVG8gbGF1bmNoIEVjbGlwc2UgcHJvZ3JhbW1hdGljYWxseSwgdXNlIAotICogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IuRWNsaXBzZVN0YXJ0ZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMKLSAqIG9uIHRoaXMgY2xhc3MgYXJlIG5vdCBBUEkuCi0gKiAKLSAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KLSAqLwotLy9UaGUgYnVuZGxlcyBhcmUgZGlzY292ZXJlZCBieSBmaW5kaW5nIGFsbCB0aGUgamFycyBvbiB0aGUgY2xhc3NwYXRoLiBUaGVuIHRoZXkgYXJlIGFkZGVkIHdpdGggdGhlaXIgZnVsbCBwYXRoIHRvIHRoZSBvc2dpLmJ1bmRsZXMgbGlzdC4KLXB1YmxpYyBjbGFzcyBXZWJTdGFydE1haW4gZXh0ZW5kcyBNYWluIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9XRUJTVEFSVF9BVVRPTUFUSUNfSU5TVEFMTEFUSU9OID0gImVjbGlwc2Uud2Vic3RhcnQuYXV0b21hdGljSW5zdGFsbGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09TR0lfQlVORExFUyA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbkAyOnN0YXJ0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVAc3RhcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfT1NHSV9CVU5ETEVTID0gIm9zZ2kuYnVuZGxlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DSEVDS19DT05GSUcgPSAib3NnaS5jaGVja0NvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBhbGxCdW5kbGVzID0gbnVsbDsgLy8gTWFwIG9mIGFsbCB0aGUgYnVuZGxlcyBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoLiBJZCAtPiBBcnJheUxpc3Qgb2YgQnVuZGxlSW5mbwotCXByaXZhdGUgTGlzdCBidW5kbGVMaXN0ID0gbnVsbDsgLy9UaGUgbGlzdCBvZiBidW5kbGVzIGZvdW5kIG9uIHRoZSBvc2dpLmJ1bmRsZSBsaXN0IAotCi0JcHJvdGVjdGVkIGNsYXNzIEJ1bmRsZUluZm8gewotCQlTdHJpbmcgYnNuOwotCQlTdHJpbmcgdmVyc2lvbjsKLQkJU3RyaW5nIHN0YXJ0RGF0YTsKLQkJU3RyaW5nIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsgLy9UT0RPIEhhY2sgc28gdGhhdCB3aGVuIHRoZSBjbGFzc2xvYWRlciBsb2FkaW5nIHRoZSBmd2sgaXMgY3JlYXRlZCB3ZSBkb24ndCBoYXZlIGZ1bm55IHBlcm1pc3Npb25zLiBUaGlzIHNob3VsZCBiZSByZXZpc2l0ZWQuIAotCQlpbnQgcmVzdWx0ID0gbmV3IFdlYlN0YXJ0TWFpbigpLnJ1bihhcmdzKTsKLQkJaWYgKCFCb29sZWFuLmdldEJvb2xlYW4oUFJPUF9OT1NIVVRET1dOKSkKLQkJCVN5c3RlbS5leGl0KHJlc3VsdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRCdW5kbGVzKCkgewotCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KFBST1BfT1NHSV9CVU5ETEVTKSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX09TR0lfQlVORExFUywgREVGQVVMVF9PU0dJX0JVTkRMRVMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJhc2ljUnVuKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXREZWZhdWx0QnVuZGxlcygpOwotCQlpbml0aWFsaXplQnVuZGxlTGlzdFN0cnVjdHVyZSgpOwotCQlkaXNjb3ZlckJ1bmRsZXMoKTsKLQkJLy9TZXQgdGhlIGZ3ayBsb2NhdGlvbiBzaW5jZSB0aGUgcmVndWxhciBsb29rdXAgd291bGQgbm90IGZpbmQgaXQKLQkJU3RyaW5nIGZ3a1VSTCA9IHNlYXJjaEZvcihmcmFtZXdvcmssIG51bGwpOwotCQlpZiAoZndrVVJMID09IG51bGwpIHsKLQkJCS8vTUVTU0FHRSBDQU4iVCBGSU5EIFRIRSBGV0sKLQkJfQotCQlhbGxCdW5kbGVzLnJlbW92ZShmcmFtZXdvcmspOwotCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0ZSQU1FV09SSywgZndrVVJMKTsKLQkJc3VwZXIuYmFzaWNSdW4oYXJncyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmVmb3JlRndrSW52b2NhdGlvbigpIHsKLQkJLy8gc2V0IHRoZSBjaGVjayBjb25maWcgb3B0aW9uIHNvIHdlIHBpY2sgdXAgbW9kaWZpZWQgYnVuZGxlIGphcnMgKGJ1ZyAxNTI4MjUpCi0JCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9DSEVDS19DT05GSUcpID09IG51bGwpCi0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0NIRUNLX0NPTkZJRywgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlidWlsZE9TR2lCdW5kbGVMaXN0KCk7Ci0JCWNsZWFudXAoKTsKLQl9Ci0KLQkvKgotCSAqIE51bGwgb3V0IGFsbCB0aGUgZmllbGRzIGNvbnRhaW5pbmcgZGF0YSAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKLQkJYWxsQnVuZGxlcyA9IG51bGw7Ci0JCWJ1bmRsZUxpc3QgPSBudWxsOwotCX0KLQotCS8qCi0JICogRmluZCB0aGUgdGFyZ2V0IGJ1bmRsZSBhbW9uZyBhbGwgdGhlIGJ1bmRsZXMgdGhhdCBhcmUgb24gdGhlIGNsYXNzcGF0aC4KLQkgKiBUaGUgc3RhcnQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkIGluIHRoaXMgY29udGV4dAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VhcmNoRm9yKGZpbmFsIFN0cmluZyB0YXJnZXQsIFN0cmluZyBzdGFydCkgewotCQlBcnJheUxpc3QgbWF0Y2hlcyA9IChBcnJheUxpc3QpIGFsbEJ1bmRsZXMuZ2V0KHRhcmdldCk7Ci0JCWlmIChtYXRjaGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IG51bWJlck9mTWF0Y2hlcyA9IG1hdGNoZXMuc2l6ZSgpOwotCQlpZiAobnVtYmVyT2ZNYXRjaGVzID09IDEpIHsKLQkJCXJldHVybiAoKEJ1bmRsZUluZm8pIG1hdGNoZXMuZ2V0KDApKS5sb2NhdGlvbjsKLQkJfQotCQlpZiAobnVtYmVyT2ZNYXRjaGVzID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdbXSB2ZXJzaW9ucyA9IG5ldyBTdHJpbmdbbnVtYmVyT2ZNYXRjaGVzXTsKLQkJaW50IGhpZ2hlc3QgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQl2ZXJzaW9uc1tpXSA9ICgoQnVuZGxlSW5mbykgbWF0Y2hlcy5nZXQoaSkpLnZlcnNpb247Ci0JCX0KLQkJaGlnaGVzdCA9IGZpbmRNYXgobnVsbCwgdmVyc2lvbnMpOwotCQlyZXR1cm4gKChCdW5kbGVJbmZvKSBtYXRjaGVzLmdldChoaWdoZXN0KSkubG9jYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBCdW5kbGVJbmZvIGZpbmRCdW5kbGUoZmluYWwgU3RyaW5nIHRhcmdldCwgU3RyaW5nIHZlcnNpb24sIGJvb2xlYW4gcmVtb3ZlTWF0Y2gpIHsKLQkJQXJyYXlMaXN0IG1hdGNoZXMgPSAoQXJyYXlMaXN0KSBhbGxCdW5kbGVzLmdldCh0YXJnZXQpOwotCQlpbnQgbnVtYmVyT2ZNYXRjaGVzID0gbWF0Y2hlcyAhPSBudWxsID8gbWF0Y2hlcy5zaXplKCkgOiAwOwotCQlpZiAobnVtYmVyT2ZNYXRjaGVzID09IDEpIHsKLQkJCS8vVE9ETyBOZWVkIHRvIGNoZWNrIHRoZSB2ZXJzaW9uCi0JCQlyZXR1cm4gKEJ1bmRsZUluZm8pIChyZW1vdmVNYXRjaCA/IG1hdGNoZXMucmVtb3ZlKDApIDogbWF0Y2hlcy5nZXQoMCkpOwotCQl9Ci0JCWlmIChudW1iZXJPZk1hdGNoZXMgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlCdW5kbGVJbmZvIGJpID0gKEJ1bmRsZUluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoYmkudmVyc2lvbi5lcXVhbHModmVyc2lvbikpIHsKLQkJCQkJaWYgKHJlbW92ZU1hdGNoKQotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCXJldHVybiBiaTsKLQkJCQl9Ci0JCQl9Ci0JCQkvL1RPRE8gTmVlZCB0byBsb2cgdGhlIGZhY3QgdGhhdCB3ZSBjb3VsZCBub3QgZmluZCB0aGUgdmVyc2lvbiBtZW50aW9uZWQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIHZlcnNpb25zID0gbmV3IFN0cmluZ1tudW1iZXJPZk1hdGNoZXNdOwotCQlpbnQgaGlnaGVzdCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmVyc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXZlcnNpb25zW2ldID0gKChCdW5kbGVJbmZvKSBtYXRjaGVzLmdldChpKSkudmVyc2lvbjsKLQkJfQotCQloaWdoZXN0ID0gZmluZE1heChudWxsLCB2ZXJzaW9ucyk7Ci0JCXJldHVybiAoQnVuZGxlSW5mbykgKHJlbW92ZU1hdGNoID8gbWF0Y2hlcy5yZW1vdmUoaGlnaGVzdCkgOiBtYXRjaGVzLmdldChoaWdoZXN0KSk7Ci0JfQotCi0JLyogCi0JICogR2V0IGFsbCB0aGUgYnVuZGxlcyBhdmFpbGFibGUgb24gdGhlIHdlYnN0YXJ0IGNsYXNzcGF0aAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNjb3ZlckJ1bmRsZXMoKSB7Ci0JCWFsbEJ1bmRsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl0cnkgewotCQkJRW51bWVyYXRpb24gcmVzb3VyY2VzID0gV2ViU3RhcnRNYWluLmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VzKEphckZpbGUuTUFOSUZFU1RfTkFNRSk7Ci0JCQl3aGlsZSAocmVzb3VyY2VzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJQnVuZGxlSW5mbyBmb3VuZCA9IGdldEJ1bmRsZUluZm8oKFVSTCkgcmVzb3VyY2VzLm5leHRFbGVtZW50KCkpOwotCQkJCWlmIChmb3VuZCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlBcnJheUxpc3QgbWF0Y2hpbmcgPSAoQXJyYXlMaXN0KSBhbGxCdW5kbGVzLmdldChmb3VuZC5ic24pOwotCQkJCWlmIChtYXRjaGluZyA9PSBudWxsKSB7Ci0JCQkJCW1hdGNoaW5nID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQkJYWxsQnVuZGxlcy5wdXQoZm91bmQuYnNuLCBtYXRjaGluZyk7Ci0JCQkJfQotCQkJCW1hdGNoaW5nLmFkZChmb3VuZCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0SW5uZXJVUkwoVVJMIHVybCkgewotCQl0cnkgewotCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCWlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgSmFyVVJMQ29ubmVjdGlvbikgewotCQkJCQlKYXJGaWxlIGphckZpbGUgPSAoKEphclVSTENvbm5lY3Rpb24pIGNvbm5lY3Rpb24pLmdldEphckZpbGUoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBqYXJGaWxlLmdldE5hbWUoKTsKLQkJCQkJLy8gU29tZSBWTXMgbWF5IG5vdCByZXR1cm4gYSBqYXIgbmFtZSBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24KLQkJCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApCi0JCQkJCQluYW1lID0gZ2V0SmFyTmFtZUJ5UmVmbGVjdGlvbihqYXJGaWxlKTsKLQotCQkJCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKQotCQkJCQkJcmV0dXJuICJmaWxlOiIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY29ubmVjdGlvbiAhPSBudWxsKQotCQkJCQljb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUgYW5kIHJldHVybiB0aGUgZXh0ZXJuYWwgZm9ybQotCQl9Ci0JCXJldHVybiB1cmwudG9FeHRlcm5hbEZvcm0oKTsKLQl9Ci0KLQkvKgotCSAqICBHZXQgYSB2YWx1ZSBvZiB0aGUgWmlwRmlsZS5uYW1lIGZpZWxkIHVzaW5nIHJlZmxlY3Rpb24uCi0JICogIEZvciB0aGlzIHRvIHN1Y2NlZWQsIHdlIG5lZWQgdGhlICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyIgcGVybWlzc2lvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRKYXJOYW1lQnlSZWZsZWN0aW9uKEphckZpbGUgamFyRmlsZSkgewotCQlpZiAoamFyRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRmllbGQgbmFtZUZpZWxkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW5hbWVGaWVsZCA9IFppcEZpbGUuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUxKSB7Ci0JCQl0cnkgewotCQkJCW5hbWVGaWVsZCA9IFppcEZpbGUuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiZmlsZU5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlCi0JCQl9Ci0JCX0KLQotCQlpZiAobmFtZUZpZWxkID09IG51bGwgfHwgTW9kaWZpZXIuaXNTdGF0aWMobmFtZUZpZWxkLmdldE1vZGlmaWVycygpKSB8fCBuYW1lRmllbGQuZ2V0VHlwZSgpICE9IFN0cmluZy5jbGFzcykKLQkJCXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQluYW1lRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCXJldHVybiAoU3RyaW5nKSBuYW1lRmllbGQuZ2V0KGphckZpbGUpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEb24ndCBoYXZlIHBlcm1pc3Npb25zLCBpZ25vcmUKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNob3VsZG4ndCBoYXBwZW4KLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaG91bGRuJ3QgaGFwcGVuCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIENvbnN0cnVjdCBidW5kbGUgaW5mbyBvYmplY3RzIGZyb20gaXRlbXMgZm91bmQgb24gdGhlIG9zZ2kuYnVuZGxlcyBsaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVCdW5kbGVMaXN0U3RydWN0dXJlKCkgewotCQlmaW5hbCBjaGFyIFNUQVJUTEVWRUxfU0VQQVJBVE9SID0gJ0AnOwotCi0JCS8vSW4gd2Vic3RhcnQgdGhlIGJ1bmRsZXMgbGlzdCBjYW4gb25seSBjb250YWluIGJ1bmRsZSBuYW1lcyB3aXRoIG9yIHdpdGhvdXQgYSB2ZXJzaW9uLgotCQlTdHJpbmcgcHJvcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX09TR0lfQlVORExFUyk7Ci0JCWlmIChwcm9wID09IG51bGwgfHwgcHJvcC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcCwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCVN0cmluZyBidW5kbGVJZCA9IHRva2VuOwotCQkJaWYgKHRva2VuLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCWludCBzdGFydExldmVsU2VwYXJhdG9yOwotCQkJQnVuZGxlSW5mbyB0b0FkZCA9IG5ldyBCdW5kbGVJbmZvKCk7Ci0JCQl0b0FkZC5ic24gPSBidW5kbGVJZDsKLQkJCWlmICgoc3RhcnRMZXZlbFNlcGFyYXRvciA9IHRva2VuLmxhc3RJbmRleE9mKFNUQVJUTEVWRUxfU0VQQVJBVE9SKSkgIT0gLTEpIHsKLQkJCQl0b0FkZC5ic24gPSB0b2tlbi5zdWJzdHJpbmcoMCwgc3RhcnRMZXZlbFNlcGFyYXRvcik7Ci0JCQkJdG9BZGQuc3RhcnREYXRhID0gdG9rZW4uc3Vic3RyaW5nKHN0YXJ0TGV2ZWxTZXBhcmF0b3IpOwotCQkJCS8vTm90ZSB0aGF0IGhlcmUgd2UgZG9uJ3QgdHJ5IHRvIHBhcnNlIHRoZSBzdGFydCBhdHRyaWJ1dGUgc2luY2UgdGhpcyBpbmZvIGlzIHRoZW4gdXNlZCB0byByZWNvbXBvc2UgdGhlIHZhbHVlIGZvciBvc2dpLmJ1bmRsZXMKLQkJCX0KLQkJCWJ1bmRsZUxpc3QuYWRkKHRvQWRkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQnVuZGxlSW5mbyBnZXRCdW5kbGVJbmZvKFVSTCBtYW5pZmVzdFVSTCkgewotCQlmaW5hbCBTdHJpbmcgQlVORExFX1NZTUJPTElDTkFNRSA9ICJCdW5kbGUtU3ltYm9saWNOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgQlVORExFX1ZFUlNJT04gPSAiQnVuZGxlLVZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBERUZBVUxUX1ZFUlNJT04gPSAiMC4wLjAiOyAvLyROT04tTkxTLTEkCi0KLQkJTWFuaWZlc3QgbWY7Ci0JCXRyeSB7Ci0JCQltZiA9IG5ldyBNYW5pZmVzdChtYW5pZmVzdFVSTC5vcGVuU3RyZWFtKCkpOwotCQkJU3RyaW5nIHN5bWJvbGljTmFtZVN0cmluZyA9IG1mLmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCQlpZiAoc3ltYm9saWNOYW1lU3RyaW5nID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCUJ1bmRsZUluZm8gcmVzdWx0ID0gbmV3IEJ1bmRsZUluZm8oKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gbWYuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShCVU5ETEVfVkVSU0lPTik7Ci0JCQlyZXN1bHQudmVyc2lvbiA9ICh2ZXJzaW9uICE9IG51bGwpID8gdmVyc2lvbiA6IERFRkFVTFRfVkVSU0lPTjsKLQkJCXJlc3VsdC5sb2NhdGlvbiA9IGV4dHJhY3RJbm5lclVSTChtYW5pZmVzdFVSTCk7Ci0JCQlpbnQgcG9zID0gc3ltYm9saWNOYW1lU3RyaW5nLmxhc3RJbmRleE9mKCc7Jyk7Ci0JCQlpZiAocG9zICE9IC0xKSB7Ci0JCQkJcmVzdWx0LmJzbiA9IHN5bWJvbGljTmFtZVN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcmVzdWx0LmJzbiA9IHN5bWJvbGljTmFtZVN0cmluZzsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChkZWJ1ZykKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vQnVpbGQgdGhlIG9zZ2kgYnVuZGxlIGxpc3QuIFRoZSBhbGxidW5kbGVzIGRhdGEgc3RydWN0dXJlIGlzIGNoYW5nZWQgZHVyaW5nIHRoZSBwcm9jZXNzLiAKLQlwcml2YXRlIHZvaWQgYnVpbGRPU0dpQnVuZGxlTGlzdCgpIHsKLQkJU3RyaW5nQnVmZmVyIGZpbmFsQnVuZGxlTGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoYWxsQnVuZGxlcy5zaXplKCkgKiAzMCk7Ci0JCS8vRmlyc3QgZ28gdGhyb3VnaCBhbGwgdGhlIGJ1bmRsZXMgb2YgdGhlIGJ1bmRsZQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYnVuZGxlTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlCdW5kbGVJbmZvIHNlYXJjaGVkID0gKEJ1bmRsZUluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUJ1bmRsZUluZm8gZm91bmQgPSBmaW5kQnVuZGxlKHNlYXJjaGVkLmJzbiwgc2VhcmNoZWQudmVyc2lvbiwgdHJ1ZSk7Ci0JCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCQlmaW5hbEJ1bmRsZUxpc3QuYXBwZW5kKFJFRkVSRU5DRV9TQ0hFTUUpLmFwcGVuZChmb3VuZC5sb2NhdGlvbikuYXBwZW5kKHNlYXJjaGVkLnN0YXJ0RGF0YSkuYXBwZW5kKCcsJyk7Ci0JCX0KLQotCQlpZiAoIUJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoUFJPUF9XRUJTVEFSVF9BVVRPTUFUSUNfSU5TVEFMTEFUSU9OKSkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxCdW5kbGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlBcnJheUxpc3QgdG9BZGQgPSAoQXJyYXlMaXN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjIgPSB0b0FkZC5pdGVyYXRvcigpOyBpdGVyYXRvcjIuaGFzTmV4dCgpOykgewotCQkJCQlCdW5kbGVJbmZvIGJpID0gKEJ1bmRsZUluZm8pIGl0ZXJhdG9yMi5uZXh0KCk7Ci0JCQkJCWZpbmFsQnVuZGxlTGlzdC5hcHBlbmQoUkVGRVJFTkNFX1NDSEVNRSkuYXBwZW5kKGJpLmxvY2F0aW9uKS5hcHBlbmQoJywnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9PU0dJX0JVTkRMRVMsIGZpbmFsQnVuZGxlTGlzdC50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvbGF1bmNoZXIvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2xhdW5jaGVyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjZmE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvbGF1bmNoZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1MYXVuY2hlcyB0aGUgRWNsaXBzZSBQbGF0Zm9ybS4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci0KLVRoaXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIGZvciBsYXVuY2hpbmcgdGhlIEVjbGlwc2UgUGxhdGZvcm0gZnJvbSBhIGNvbW1hbmQKLWxpbmUgb3IgdGhyb3VnaCBKYXZhIHdlYiBzdGFydC4gVG8gc3RhcnQgdGhlIHBsYXRmb3JtLCBzcGVjaWZ5IHRoZSBNYWluIGNsYXNzIGluIHRoaXMgcGFja2FnZQotd2hlbiBpbnZva2luZyB0aGUgSmF2YSBWTS4KLTxwPgotVGhpcyBwYWNrYWdlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIEphdmEgY29kZS4gVGhlIG1ldGhvZHMKLWFuZCBmaWVsZHMgaW4gdGhlc2UgY2xhc3NlcyBhcmUgbm90IEFQSS4KLTxicj4mbmJzcDsKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMWRlYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSIiIGtpbmQ9ImxpYiIgZXhwb3J0ZWQ9InRydWUiIHNvdXJjZXBhdGg9InNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9PU0dpJU1pbmltdW0tMS4yIiBraW5kPSJjb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIiBraW5kPSJjb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0iYmluIiBraW5kPSJvdXRwdXQiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWEyYTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZjVlYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBNYXkgMjUgMTU6MDA6MTQgRURUIDIwMDQKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzMwYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSNUdWUgRGVjIDAyIDA5OjAzOjA4IENTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwOTBlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlb3NnaVNlcnZpY2VzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzCi1CdW5kbGUtVmVyc2lvbjogMy4yLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1EZXNjcmlwdGlvbjogJW9zZ2lTZXJ2aWNlc0RlcwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlZWNsaXBzZS5vcmcKLUJ1bmRsZS1Eb2NVcmw6IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcKLUJ1bmRsZS1Db250YWN0QWRkcmVzczogd3d3LmVjbGlwc2Uub3JnCi1CdW5kbGUtQ29weXJpZ2h0OiAlY29weXJpZ2h0Ci1FeHBvcnQtUGFja2FnZTogb3JnLm9zZ2kuc2VydmljZS5jbTsgdmVyc2lvbj0iMS4yLjEiLAotIG9yZy5vc2dpLnNlcnZpY2UuY29tcG9uZW50OyB2ZXJzaW9uPSIxLjEiLAotIG9yZy5vc2dpLnNlcnZpY2UuZGV2aWNlOyB2ZXJzaW9uPSIxLjEiLAotIG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQ7IHZlcnNpb249IjEuMiIsCi0gb3JnLm9zZ2kuc2VydmljZS5odHRwOyB2ZXJzaW9uPSIxLjIuMSIsCi0gb3JnLm9zZ2kuc2VydmljZS5pbzsgdmVyc2lvbj0iMS4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLmxvZzsgdmVyc2lvbj0iMS4zIiwKLSBvcmcub3NnaS5zZXJ2aWNlLm1ldGF0eXBlOyB2ZXJzaW9uPSIxLjEiLAotIG9yZy5vc2dpLnNlcnZpY2UucHJvdmlzaW9uaW5nOyB2ZXJzaW9uPSIxLjIiLAotIG9yZy5vc2dpLnNlcnZpY2UudXBucDsgdmVyc2lvbj0iMS4xIiwKLSBvcmcub3NnaS5zZXJ2aWNlLnVzZXJhZG1pbjsgdmVyc2lvbj0iMS4xIiwKLSBvcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbjsgdmVyc2lvbj0iMS4wIgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazsgdmVyc2lvbj0xLjIsCi0gb3JnLm9zZ2kuc2VydmljZS5jbTsgdmVyc2lvbj0iWzEuMi4xLCAxLjMpIiwKLSBvcmcub3NnaS5zZXJ2aWNlLmNvbXBvbmVudDsgdmVyc2lvbj0iWzEuMSwgMS4yKSIsCi0gb3JnLm9zZ2kuc2VydmljZS5kZXZpY2U7IHZlcnNpb249IlsxLjEsIDEuMikiLAotIG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQ7IHZlcnNpb249IlsxLjIsIDEuMykiLAotIG9yZy5vc2dpLnNlcnZpY2UuaHR0cDsgdmVyc2lvbj0iWzEuMi4xLCAxLjMpIiwKLSBvcmcub3NnaS5zZXJ2aWNlLmlvOyB2ZXJzaW9uPSJbMS4wLCAxLjEpIiwKLSBvcmcub3NnaS5zZXJ2aWNlLmxvZzsgdmVyc2lvbj0iWzEuMywgMS40KSIsCi0gb3JnLm9zZ2kuc2VydmljZS5tZXRhdHlwZTsgdmVyc2lvbj0iWzEuMSwgMS4yKSIsCi0gb3JnLm9zZ2kuc2VydmljZS5wcm92aXNpb25pbmc7IHZlcnNpb249IlsxLjIsIDEuMykiLAotIG9yZy5vc2dpLnNlcnZpY2UudXBucDsgdmVyc2lvbj0iWzEuMSwgMS4yKSIsCi0gb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW47IHZlcnNpb249IlsxLjEsIDEuMikiLAotIG9yZy5vc2dpLnNlcnZpY2Uud2lyZWFkbWluOyB2ZXJzaW9uPSJbMS4wLCAxLjEpIiwKLSBqYXZheC5zZXJ2bGV0OyByZXNvbHV0aW9uOj0ib3B0aW9uYWwiLAotIGphdmF4LnNlcnZsZXQuaHR0cDsgcmVzb2x1dGlvbjo9Im9wdGlvbmFsIgotRHluYW1pY0ltcG9ydC1QYWNrYWdlOiBqYXZheC5zZXJ2bGV0LAotIGphdmF4LnNlcnZsZXQuaHR0cAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IE9TR2kvTWluaW11bS0xLjIsCi0gQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3ZGIyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMjUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLQotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IAotZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCi1mb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSBmb3IgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+T1NHaSBNYXRlcmlhbHM8L2g0PgotCi08cD5BbGwgZmlsZXMgaW4gdGhlIGZvbGxvd2luZyBzdWItZGlyZWN0b3JpZXMgKGFuZCB0aGVpciBzdWItZGlyZWN0b3JpZXMpOjwvcD4KLQotPHVsPgotCTxsaT5vcmcvb3NnaTwvbGk+Ci08L3VsPgotCi08cD5hbmQgdGhlIGZvbGxvd2luZyBmaWxlcyAod2hpY2ggbWF5IG5vdCBiZSBwcmVzZW50IGluIGFsbCBjYXNlcyk6PC9wPgotCi08dWw+Ci0JPGxpPm9zZ2kvZWUuZm91bmRhdGlvbi5qYXI8L2xpPgotCTxsaT5vc2dpL2VlLm1pbmltdW0uamFyPC9saT4JCi08L3VsPgotCi08cD5zaGFsbCBiZSBkZWZpbmVkIGFzIHRoZSAmcXVvdDtPU0dpIE1hdGVyaWFscy4mcXVvdDsgIFRoZSBPU0dpIE1hdGVyaWFscyBhcmU6PC9wPgotCi08YmxvY2txdW90ZT4KLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNgotPGJyIC8+PGJyIC8+Ci1PU0dpIEFsbGlhbmNlCi1CaXNob3AgUmFuY2ggNjxici8+Ci0yNDAwIENhbWlubyBSYW1vbiwgU3VpdGUgMzc1PGJyLz4KLVNhbiBSYW1vbiwgQ0EgOTQ1ODMgVVNBCi08YnIgLz48YnIgLz4KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi08L2Jsb2NrcXVvdGU+Ci0KLTxwPlRoZSBPU0dpIE1hdGVyaWFscyBhcmUgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiAgQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZAotaW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvTElDRU5TRS0yLjAudHh0IiB0YXJnZXQ9Il9ibGFuayI+TElDRU5TRS0yLjAudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbDwvYT4uPC9wPgotCi08cD5JbXBsZW1lbnRhdGlvbiBvZiBjZXJ0YWluIGVsZW1lbnRzIG9mIHRoZSBPU0dpIE1hdGVyaWFscyBtYXkgYmUgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCBwYXRlbnQgcmlnaHRzIChzdWNoIGEgdGhpcmQgcGFydHkgbWF5Ci1vciBtYXkgbm90IGJlIGEgbWVtYmVyIG9mIHRoZSBPU0dpIEFsbGlhbmNlKS4gIFRoZSBPU0dpIEFsbGlhbmNlIGFuZCBpdHMgbWVtYmVycyBhcmUgbm90IHJlc3BvbnNpYmxlIGFuZCBzaGFsbCBub3QgYmUgaGVsZCByZXNwb25zaWJsZSBpbiBhbnkgbWFubmVyIGZvciBpZGVudGlmeWluZyBvciBmYWlsaW5nIHRvIGlkZW50aWZ5IGFueSBvciBhbGwgc3VjaCB0aGlyZCBwYXJ0eQotaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cy48L3A+Ci0KLTxzbWFsbD5PU0dpJnRyYWRlOyBpcyBhIHRyYWRlbWFyaywgcmVnaXN0ZXJlZCB0cmFkZW1hcmssIG9yIHNlcnZpY2UgbWFyayBvZiBUaGUgT1NHaSBBbGxpYW5jZSBpbiB0aGUgVVMgYW5kIG90aGVyIGNvdW50cmllcy4gSmF2YSBpcyBhIHRyYWRlbWFyaywKLXJlZ2lzdGVyZWQgdHJhZGVtYXJrLCBvciBzZXJ2aWNlIG1hcmsgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVVMgYW5kIG90aGVyIGNvdW50cmllcy4gQWxsIG90aGVyIHRyYWRlbWFya3MsIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcywgb3IKLXNlcnZpY2UgbWFya3MgdXNlZCBpbiB0aGUgQ29udGVudCBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzIGFuZCBhcmUgaGVyZWJ5IHJlY29nbml6ZWQuPC9zbWFsbD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvYWJvdXRfZmlsZXMvTElDRU5TRS0yLjAudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL2Fib3V0X2ZpbGVzL0xJQ0VOU0UtMi4wLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvYWJvdXRfZmlsZXMvTElDRU5TRS0yLjAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTYyZGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgb3JnLyxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8KLXNyYy5pbmNsdWRlcyA9IHNyYy56aXAsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8KLXNvdXJjZS4uID0gLgotb3V0cHV0Li4gPSAuCi1jdXN0b21CdWlsZENhbGxiYWNrcz1jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTg3MTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KLTwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCQk8ZWNobyBtZXNzYWdlPSJUaGlzIGZpbGUgbXVzdCBiZSBjYWxsZWQgd2l0aCBleHBsaWNpdCB0YXJnZXRzIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLmphcnMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLmphcnMiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgYnVpbGQuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIGNvbXBpbGF0aW9uIHRhcmdldCA8bmFtZT4gICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBTdWJzdGl0dXRlICJuYW1lIiB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB0YXJnZXQsIGVnIEBkb3QgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHNvdXJjZS5mb2xkZXJuIDogbiA9IDEgLi4uIE4sIHRoZSBzb3VyY2UgZm9sZGVycyAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgIDogd2hlcmUgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXBpbGF0aW9uIGdvICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIDxuYW1lPi5jbGFzc3BhdGggOiBuYW1lID0gbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdGFyZ2V0LiBBICAgICAgICAgLS0+Ci0JPCEtLSAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhlIGNsYXNzcGF0aCBzdHJ1Y3R1cmUuICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUubmFtZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByZS5AZG90Ij4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gZHVyaW5nIHRoZSBjb21waWxhdGlvbiB0YXJnZXQgPG5hbWU+LCBhZnRlciB0aGUgY29tcGlsZSAgIC0tPgotCTwhLS0gYnV0IGJlZm9yZSBqYXJpbmcuICBTdWJzdGl0dXRlICJuYW1lIiB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbi0tPgotCTwhLS0gdGFyZ2V0LCBlZyBAZG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBzb3VyY2UuZm9sZGVybiA6IG4gPSAxIC4uLiBOLCB0aGUgc291cmNlIGZvbGRlcnMgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyICA6IHdoZXJlIHRoZSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiBnbyAgICAgICAgICAgIC0tPgotCTwhLS0gICA8bmFtZT4uY2xhc3NwYXRoIDogbmFtZSA9IG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHRhcmdldC4gQSAgICAgICAgIC0tPgotCTwhLS0gICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHRvIHRoZSBjbGFzc3BhdGggc3RydWN0dXJlLiAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5jb21waWxlLm5hbWUiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwb3N0LmNvbXBpbGUuQGRvdCI+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgY29tcGlsYXRpb24gdGFyZ2V0IDxuYW1lPiAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBTdWJzdGl0dXRlICJuYW1lIiB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB0YXJnZXQsIGVnIEBkb3QgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGphci5sb2NhdGlvbiAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcGlsYXRpb24gcmVzdWx0cyAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIDxuYW1lPi5jbGFzc3BhdGggOiBuYW1lID0gbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdGFyZ2V0LiBBICAgICAgICAgLS0+Ci0JPCEtLSAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhlIGNsYXNzcGF0aCBzdHJ1Y3R1cmUuICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0Lm5hbWUiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwb3N0LkBkb3QiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciBjb250YWluaW5nIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tICAgdGFyZ2V0LmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQkJCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5iaW4ucGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgY29udGFpbmluZyB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5iaW4ucGFydHMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLnNvdXJjZXMiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGdhdGhlci5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmdhdGhlci5zb3VyY2VzIj4KLQkJPHVuemlwIHNyYz0iJHt0YXJnZXQuZm9sZGVyfS9zcmMuemlwIiBkZXN0PSIke3RhcmdldC5mb2xkZXJ9IiBvdmVyd3JpdGU9ImZhbHNlIi8+Ci0JCTxkZWxldGUgZmlsZT0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vc3JjLnppcCIgLz4JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIubG9ncyI+ICAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIubG9ncyI+ICAgICAgIAotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuY2xlYW4iPiAgCi0JCTxtb3ZlICBmaWxlPSJzcmMuemlwIiB0b2ZpbGU9InNlcnZpY2VzX3NyYy56aXAiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBwbHVnaW4uZGVzdGluYXRpb24gLSBmaW5hbCBkZXN0aW5hdGlvbiBvZiB0aGUgYnVpbGQgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0ZW1wLmZvbGRlciAtIHRlbXBvcmFyeSBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5jbGVhbiI+Ci0JCTxtb3ZlIGZpbGU9InNlcnZpY2VzX3NyYy56aXAiIHRvZmlsZT0ic3JjLnppcCIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkY2YyZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25BZG1pbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25BZG1pbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkYTEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uQWRtaW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uRXZlbnQuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uRXZlbnQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YWM3YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkV2ZW50LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OWVhODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25MaXN0ZW5lci5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25MaXN0ZW5lci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiNWU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uTGlzdGVuZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGVybWlzc2lvbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25QZXJtaXNzaW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhjMDRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25QZXJtaXNzaW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvblBlcm1pc3Npb25Db2xsZWN0aW9uJDEuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGVybWlzc2lvbkNvbGxlY3Rpb24kMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxYzhjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGVybWlzc2lvbkNvbGxlY3Rpb24kMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25QZXJtaXNzaW9uQ29sbGVjdGlvbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25QZXJtaXNzaW9uQ29sbGVjdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmODMxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGVybWlzc2lvbkNvbGxlY3Rpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGx1Z2luLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvblBsdWdpbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjNzgyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGx1Z2luLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY20vTWFuYWdlZFNlcnZpY2UuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9NYW5hZ2VkU2VydmljZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwOTRjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9NYW5hZ2VkU2VydmljZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL01hbmFnZWRTZXJ2aWNlRmFjdG9yeS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NtL01hbmFnZWRTZXJ2aWNlRmFjdG9yeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjNGFmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jbS9NYW5hZ2VkU2VydmljZUZhY3RvcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50Q29uc3RhbnRzLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudENvbnN0YW50cy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3MzJkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50Q29uc3RhbnRzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudENvbnRleHQuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50Q29udGV4dC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhODM4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50Q29udGV4dC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRFeGNlcHRpb24uY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50RXhjZXB0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTIyOWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRFeGNlcHRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50RmFjdG9yeS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRGYWN0b3J5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTI3YTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRGYWN0b3J5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudEluc3RhbmNlLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudEluc3RhbmNlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzYxNWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRJbnN0YW5jZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Db25zdGFudHMuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvQ29uc3RhbnRzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE3ZDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Db25zdGFudHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvRGV2aWNlLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RldmljZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0ZGU2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvRGV2aWNlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlci5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Ecml2ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOWI5MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Ecml2ZXJMb2NhdG9yLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlckxvY2F0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWJkYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlckxvY2F0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvRHJpdmVyU2VsZWN0b3IuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvRHJpdmVyU2VsZWN0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZWI0ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlclNlbGVjdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL01hdGNoLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL01hdGNoLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTc1MDg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9NYXRjaC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50JFVubW9kaWZpYWJsZURpY3Rpb25hcnkuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9FdmVudCRVbm1vZGlmaWFibGVEaWN0aW9uYXJ5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQzNTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50JFVubW9kaWZpYWJsZURpY3Rpb25hcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9FdmVudC5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODU2YzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRBZG1pbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50QWRtaW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzY1ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRBZG1pbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50Q29uc3RhbnRzLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRDb25zdGFudHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDE2MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRDb25zdGFudHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9FdmVudEhhbmRsZXIuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9FdmVudEhhbmRsZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDdhZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRIYW5kbGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvVG9waWNQZXJtaXNzaW9uLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvVG9waWNQZXJtaXNzaW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTUzNGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L1RvcGljUGVybWlzc2lvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L1RvcGljUGVybWlzc2lvbkNvbGxlY3Rpb24uY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9Ub3BpY1Blcm1pc3Npb25Db2xsZWN0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWExOWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L1RvcGljUGVybWlzc2lvbkNvbGxlY3Rpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9odHRwL0h0dHBDb250ZXh0LmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9IdHRwQ29udGV4dC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4Y2Y3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9odHRwL0h0dHBDb250ZXh0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9IdHRwU2VydmljZS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2h0dHAvSHR0cFNlcnZpY2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZTdlODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9IdHRwU2VydmljZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2h0dHAvTmFtZXNwYWNlRXhjZXB0aW9uLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9OYW1lc3BhY2VFeGNlcHRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTk2ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9OYW1lc3BhY2VFeGNlcHRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9pby9Db25uZWN0aW9uRmFjdG9yeS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2lvL0Nvbm5lY3Rpb25GYWN0b3J5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDExMjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2lvL0Nvbm5lY3Rpb25GYWN0b3J5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvaW8vQ29ubmVjdG9yU2VydmljZS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2lvL0Nvbm5lY3RvclNlcnZpY2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NTU5NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvaW8vQ29ubmVjdG9yU2VydmljZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2xvZy9Mb2dFbnRyeS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2xvZy9Mb2dFbnRyeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBkYWNhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nRW50cnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nTGlzdGVuZXIuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nTGlzdGVuZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOWE0MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ0xpc3RlbmVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ1JlYWRlclNlcnZpY2UuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nUmVhZGVyU2VydmljZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxNzdjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nUmVhZGVyU2VydmljZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL2xvZy9Mb2dTZXJ2aWNlLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ1NlcnZpY2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODUzYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ1NlcnZpY2UuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9BdHRyaWJ1dGVEZWZpbml0aW9uLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvQXR0cmlidXRlRGVmaW5pdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyNzg4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9BdHRyaWJ1dGVEZWZpbml0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVJbmZvcm1hdGlvbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL01ldGFUeXBlSW5mb3JtYXRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjNmZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVJbmZvcm1hdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL01ldGFUeXBlUHJvdmlkZXIuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZVByb3ZpZGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRiNTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL01ldGFUeXBlUHJvdmlkZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZVNlcnZpY2UuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZVNlcnZpY2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjIyODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVTZXJ2aWNlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvT2JqZWN0Q2xhc3NEZWZpbml0aW9uLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvT2JqZWN0Q2xhc3NEZWZpbml0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJmNDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL09iamVjdENsYXNzRGVmaW5pdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3Byb3Zpc2lvbmluZy9Qcm92aXNpb25pbmdTZXJ2aWNlLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvcHJvdmlzaW9uaW5nL1Byb3Zpc2lvbmluZ1NlcnZpY2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTVjYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvcHJvdmlzaW9uaW5nL1Byb3Zpc2lvbmluZ1NlcnZpY2UuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBBY3Rpb24uY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBBY3Rpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTRlMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QQWN0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QRGV2aWNlLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QRGV2aWNlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzQ0NWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUERldmljZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEV2ZW50TGlzdGVuZXIuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBFdmVudExpc3RlbmVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODRkMWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEV2ZW50TGlzdGVuZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBFeGNlcHRpb24uY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBFeGNlcHRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTJlYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QRXhjZXB0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QSWNvbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEljb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMGU0YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QSWNvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUExvY2FsU3RhdGVWYXJpYWJsZS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUExvY2FsU3RhdGVWYXJpYWJsZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2ZmYwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBMb2NhbFN0YXRlVmFyaWFibGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBTZXJ2aWNlLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QU2VydmljZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwZjg3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBTZXJ2aWNlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QU3RhdGVWYXJpYWJsZS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUFN0YXRlVmFyaWFibGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2I3MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QU3RhdGVWYXJpYWJsZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9BdXRob3JpemF0aW9uLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL0F1dGhvcml6YXRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZmE3MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL0F1dGhvcml6YXRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vR3JvdXAuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vR3JvdXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTUzZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL0dyb3VwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1JvbGUuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vUm9sZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3NDA5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vUm9sZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2QxODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MzIyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pbkV2ZW50LmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pbkV2ZW50LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU1MDI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5FdmVudC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5MaXN0ZW5lci5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5MaXN0ZW5lci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjZTAyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluTGlzdGVuZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluUGVybWlzc2lvbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5QZXJtaXNzaW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTNlNzBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5QZXJtaXNzaW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pblBlcm1pc3Npb25Db2xsZWN0aW9uLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pblBlcm1pc3Npb25Db2xsZWN0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQ0NjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5QZXJtaXNzaW9uQ29sbGVjdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9CYXNpY0VudmVsb3BlLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0Jhc2ljRW52ZWxvcGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGNhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0Jhc2ljRW52ZWxvcGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vQ29uc3VtZXIuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vQ29uc3VtZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDY1ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0NvbnN1bWVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0VudmVsb3BlLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0VudmVsb3BlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGNkYjAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9FbnZlbG9wZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9Qcm9kdWNlci5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9Qcm9kdWNlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxNzc5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vUHJvZHVjZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDBlZjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVBZG1pbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQWRtaW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzUyZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVBZG1pbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQWRtaW5FdmVudC5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQWRtaW5FdmVudC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyOTdmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluRXZlbnQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluTGlzdGVuZXIuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluTGlzdGVuZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YmJiODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVBZG1pbkxpc3RlbmVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVDb25zdGFudHMuY2xhc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUNvbnN0YW50cy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwNTUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUNvbnN0YW50cy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlUGVybWlzc2lvbi5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlUGVybWlzc2lvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlMTQ4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZVBlcm1pc3Npb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZVBlcm1pc3Npb25Db2xsZWN0aW9uLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVQZXJtaXNzaW9uQ29sbGVjdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExYTI0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZVBlcm1pc3Npb25Db2xsZWN0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZjNjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9zZ2lTZXJ2aWNlcyA9IE9TR2kgUmVsZWFzZSA0LjIuMCBTZXJ2aWNlcwotZWNsaXBzZS5vcmcgPSBFY2xpcHNlLm9yZyAtIEVxdWlub3gKLW9zZ2lTZXJ2aWNlc0RlcyA9IE9TR2kgU2VydmljZSBQbGF0Zm9ybSBSZWxlYXNlIDQuMi4wIFNlcnZpY2UgSW50ZXJmYWNlcyBhbmQgQ2xhc3NlcwotY29weXJpZ2h0ID0gQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy9zcmMuemlwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL3NyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNGNkZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzL3NyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmE5MjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3Rlc3QiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0MiIgcGF0aD0iYnVuZGxlc19zcmMvdGVzdDIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0IiBwYXRoPSJidW5kbGVzX3NyYy9jaGFpbi50ZXN0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvY2hhaW4udGVzdC5hIiBwYXRoPSJidW5kbGVzX3NyYy9jaGFpbi50ZXN0LmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmIiIHBhdGg9ImJ1bmRsZXNfc3JjL2NoYWluLnRlc3QuYiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2NoYWluLnRlc3QuYyIgcGF0aD0iYnVuZGxlc19zcmMvY2hhaW4udGVzdC5jIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvY2hhaW4udGVzdC5kIiBwYXRoPSJidW5kbGVzX3NyYy9jaGFpbi50ZXN0LmQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9jaXJjdWxhcml0eS50ZXN0IiBwYXRoPSJidW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvY2lyY3VsYXJpdHkudGVzdC5hIiBwYXRoPSJidW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0LmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEiIHBhdGg9ImJ1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS52MiIgcGF0aD0iYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLnYyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLnJlcXVpcmUiIHBhdGg9ImJ1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS5yZXF1aXJlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5hIiBwYXRoPSJidW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmIiIHBhdGg9ImJ1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2xlZ2FjeS5sYXp5c3RhcnQiIHBhdGg9ImJ1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9sZWdhY3kubGF6eXN0YXJ0LmEiIHBhdGg9ImJ1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2xlZ2FjeS5sYXp5c3RhcnQuYiIgcGF0aD0iYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5iIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvbGVnYWN5LmxhenlzdGFydC5jIiBwYXRoPSJidW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9vc2dpLmxhenlzdGFydCIgcGF0aD0iYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9vc2dpLmxhenlzdGFydC5hIiBwYXRoPSJidW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5hIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvb3NnaS5sYXp5c3RhcnQuYiIgcGF0aD0iYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL29zZ2kubGF6eXN0YXJ0LmMiIHBhdGg9ImJ1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90aHJlYWQubG9ja3Rlc3QiIHBhdGg9ImJ1bmRsZXNfc3JjL3RocmVhZC5sb2NrdGVzdCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2J1ZGR5LnJlZ2lzdGVyZWQuYSIgcGF0aD0iYnVuZGxlc19zcmMvYnVkZHkucmVnaXN0ZXJlZC5hIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QxIiBwYXRoPSJidW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDIiIHBhdGg9ImJ1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2J1ZGR5LmRlcGVuZGVudC5hIiBwYXRoPSJidW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QxIiBwYXRoPSJidW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0MSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QyIiBwYXRoPSJidW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0MiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuYTEiIHBhdGg9ImJ1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9uYXRpdmV0ZXN0LmEyIiBwYXRoPSJidW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmEyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvbmF0aXZldGVzdC5iMSIgcGF0aD0iYnVuZGxlc19zcmMvbmF0aXZldGVzdC5iMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuYjIiIHBhdGg9ImJ1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYjIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9uYXRpdmV0ZXN0LmMiIHBhdGg9ImJ1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuZCIgcGF0aD0iYnVuZGxlc19zcmMvbmF0aXZldGVzdC5kIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvaG9zdC5tdWx0aXBsZS5leHBvcnRzIiBwYXRoPSJidW5kbGVzX3NyYy9ob3N0Lm11bHRpcGxlLmV4cG9ydHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9mcmFnLm11bHRpcGxlLmV4cG9ydHMiIHBhdGg9ImJ1bmRsZXNfc3JjL2ZyYWcubXVsdGlwbGUuZXhwb3J0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2NsaWVudDEubXVsdGlwbGUuZXhwb3J0cyIgcGF0aD0iYnVuZGxlc19zcmMvY2xpZW50MS5tdWx0aXBsZS5leHBvcnRzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvY2xpZW50Mi5tdWx0aXBsZS5leHBvcnRzIiBwYXRoPSJidW5kbGVzX3NyYy9jbGllbnQyLm11bHRpcGxlLmV4cG9ydHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0MSIgcGF0aD0iYnVuZGxlc19zcmMveGZyaWVuZHMudGVzdDEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0MiIgcGF0aD0iYnVuZGxlc19zcmMveGZyaWVuZHMudGVzdDIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0MyIgcGF0aD0iYnVuZGxlc19zcmMveGZyaWVuZHMudGVzdDMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9leHQuZnJhbWV3b3JrLmEiIHBhdGg9ImJ1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2V4dC5mcmFtZXdvcmsuYS5pbXBvcnRlciIgcGF0aD0iYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hLmltcG9ydGVyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvZXh0LmZyYW1ld29yay5hLnJlcXVpcmVzIiBwYXRoPSJidW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmEucmVxdWlyZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9leHQuZnJhbWV3b3JrLmIiIHBhdGg9ImJ1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2V4dC5leHRjbGFzc3BhdGguYSIgcGF0aD0iYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvZXh0LmV4dGNsYXNzcGF0aC5hLmltcG9ydGVyIiBwYXRoPSJidW5kbGVzX3NyYy9leHQuZXh0Y2xhc3NwYXRoLmEuaW1wb3J0ZXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9leHBvcnRlci5pbXBvcnRlcjEiIHBhdGg9ImJ1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2V4cG9ydGVyLmltcG9ydGVyMiIgcGF0aD0iYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvZXhwb3J0ZXIuaW1wb3J0ZXIzIiBwYXRoPSJidW5kbGVzX3NyYy9leHBvcnRlci5pbXBvcnRlcjMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9leHBvcnRlci5pbXBvcnRlcjQiIHBhdGg9ImJ1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3Rlc3QuYnVnMjM1OTU4LngiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LngiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzIzNTk1OC55IiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmJ1ZzIzNTk1OC55Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5mcmFnbWVudDEiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQxIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5mcmFnbWVudDIiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5mcmFnbWVudDMiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5mcmFnbWVudDQiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQ0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5mcmFnbWVudDUiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQ1Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuYSIgcGF0aD0iYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmEuZnJhZyIgcGF0aD0iYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYS5mcmFnIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuYiIgcGF0aD0iYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmIuZnJhZyIgcGF0aD0iYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYi5mcmFnIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuYyIgcGF0aD0iYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmQiIHBhdGg9ImJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5lIiBwYXRoPSJidW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5lIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuZiIgcGF0aD0iYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuZiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmciIHBhdGg9ImJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmciLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5oIiBwYXRoPSJidW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5oIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuaSIgcGF0aD0iYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuaSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmoiIHBhdGg9ImJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmoiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5rIiBwYXRoPSJidW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5rIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMubCIgcGF0aD0iYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMubCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLm0iIHBhdGg9ImJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLm0iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5uIiBwYXRoPSJidW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMucCIgcGF0aD0iYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMucCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLnEiIHBhdGg9ImJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLnEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9hY3RpdmF0b3IuZXJyb3IxIiBwYXRoPSJidW5kbGVzX3NyYy9hY3RpdmF0b3IuZXJyb3IxIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvYWN0aXZhdG9yLmVycm9yMiIgcGF0aD0iYnVuZGxlc19zcmMvYWN0aXZhdG9yLmVycm9yMiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL2FjdGl2YXRvci5lcnJvcjMiIHBhdGg9ImJ1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy9hY3RpdmF0b3IuZXJyb3I0IiBwYXRoPSJidW5kbGVzX3NyYy9hY3RpdmF0b3IuZXJyb3I0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvc2VjdXJpdHkuYSIgcGF0aD0iYnVuZGxlc19zcmMvc2VjdXJpdHkuYSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3NlY3VyaXR5LmEuZnJhZy5hIiBwYXRoPSJidW5kbGVzX3NyYy9zZWN1cml0eS5hLmZyYWcuYSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3NlY3VyaXR5LmIiIHBhdGg9ImJ1bmRsZXNfc3JjL3NlY3VyaXR5LmIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmZpbHRlci5hIiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmZpbHRlci5hIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5saW5rLmEiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QubGluay5hIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5saW5rLmEuY2xpZW50IiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmxpbmsuYS5jbGllbnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYiIgcGF0aD0iYnVuZGxlc19zcmMvdGVzdC5saW5rLmIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYi5jbGllbnQiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QubGluay5iLmNsaWVudCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3Rlc3QubGluay5jIiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmxpbmsuYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3Rlc3QubGluay5jLmNsaWVudCIgcGF0aD0iYnVuZGxlc19zcmMvdGVzdC5saW5rLmMuY2xpZW50Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5saW5rLmQiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QubGluay5kIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5saW5rLmUiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QubGluay5lIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5saW5rLmUuY2xpZW50IiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmxpbmsuZS5jbGllbnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsucG9zdHBvbmVkIiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmxpbmsucG9zdHBvbmVkIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5idWcyNTk5MDMuYSIgcGF0aD0iYnVuZGxlc19zcmMvdGVzdC5idWcyNTk5MDMuYSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3Rlc3QuYnVnMjU5OTAzLmEudXBkYXRlIiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5hLnVwZGF0ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYnVuZGxlX3Rlc3RzL3Rlc3QuYnVnMjU5OTAzLmIiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI1OTkwMy5jIiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5jIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC50Y2NsIiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LnRjY2wiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0Lm1hbmlmZXN0cGFja2FnZSIgcGF0aD0iYnVuZGxlc19zcmMvdGVzdC5tYW5pZmVzdHBhY2thZ2UiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NjMwNyIgcGF0aD0iYnVuZGxlc19zcmMvdGVzdC5idWcyODYzMDciLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NzYzNi5hMSIgcGF0aD0iYnVuZGxlc19zcmMvdGVzdC5idWcyODc2MzYuYTEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NzYzNi5hMiIgcGF0aD0iYnVuZGxlc19zcmMvdGVzdC5idWcyODc2MzYuYTIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NzYzNi5iIiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NzYzNi5iIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5idWcyODc3NTAiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NzUwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJidW5kbGVfdGVzdHMvdGVzdC5idWczMDYxODFhIiBwYXRoPSJidW5kbGVzX3NyYy90ZXN0LmJ1ZzMwNjE4MWEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzMwNjE4MWIiIHBhdGg9ImJ1bmRsZXNfc3JjL3Rlc3QuYnVnMzA2MTgxYiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5NTFmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1idW5kbGVfdGVzdHMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhZjRlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5vc2dpLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5vc2dpPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmRzLmNvcmUuYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGM4YTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgTWF5IDI1IDE1OjAwOjI3IEVEVCAyMDA0Ci1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWQ4YjI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotI1dlZCBGZWIgMTAgMDg6NDE6MjYgQ1NUIDIwMTAKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkT2JqZWN0QWxsb2NhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NmFlODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jVHVlIEF1ZyAyMSAxMTozMzoyOSBDRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9OTkKLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9BbGwgT1NHaSBUZXN0cy5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvQWxsIE9TR2kgVGVzdHMubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmIwYTY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9BbGwgT1NHaSBUZXN0cy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkp1bml0TGF1bmNoQ29uZmlnIj4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJhcHBsaWNhdGlvbiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS5qdW5pdC5ydW50aW1lLmNvcmV0ZXN0YXBwbGljYXRpb24iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXNrY2xlYXIiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzbG9nIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL0FsbCBPU0dpIFRlc3RzIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVGcmFnbWVudHMiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9BbGwgT1NHaSBUZXN0cy90ZXN0LXdvcmtzcGFjZXMiLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvQXV0b21hdGVkVGVzdHMuamF2YSIvPgotPC9saXN0QXR0cmlidXRlPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9UWVBFUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIxIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2VfbG9jYXRvcl9pZCIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS5sYXVuY2hlci5QREVTb3VyY2VMb29rdXBEaXJlY3RvciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlX2xvY2F0b3JfbWVtZW50byIgdmFsdWU9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsmIzEzOyYjMTA7Jmx0O3NvdXJjZUxvb2t1cERpcmVjdG9yJmd0OyYjMTM7JiMxMDsmbHQ7c291cmNlQ29udGFpbmVycyBkdXBsaWNhdGVzPSZxdW90O2ZhbHNlJnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7Y29udGFpbmVyIG1lbWVudG89JnF1b3Q7JmFtcDtsdDs/eG1sIHZlcnNpb249JmFtcDtxdW90OzEuMCZhbXA7cXVvdDsgZW5jb2Rpbmc9JmFtcDtxdW90O1VURi04JmFtcDtxdW90Oz8mYW1wO2d0OyZhbXA7IzEzOyZhbXA7IzEwOyZhbXA7bHQ7amF2YVByb2plY3QgbmFtZT0mYW1wO3F1b3Q7b3JnLmVjbGlwc2Uub3NnaS50ZXN0cyZhbXA7cXVvdDsvJmFtcDtndDsmYW1wOyMxMzsmYW1wOyMxMDsmcXVvdDsgdHlwZUlkPSZxdW90O29yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuc291cmNlQ29udGFpbmVyLmphdmFQcm9qZWN0JnF1b3Q7LyZndDsmIzEzOyYjMTA7Jmx0O2NvbnRhaW5lciBtZW1lbnRvPSZxdW90OyZhbXA7bHQ7P3htbCB2ZXJzaW9uPSZhbXA7cXVvdDsxLjAmYW1wO3F1b3Q7IGVuY29kaW5nPSZhbXA7cXVvdDtVVEYtOCZhbXA7cXVvdDs/JmFtcDtndDsmYW1wOyMxMzsmYW1wOyMxMDsmYW1wO2x0O2RlZmF1bHQvJmFtcDtndDsmYW1wOyMxMzsmYW1wOyMxMDsmcXVvdDsgdHlwZUlkPSZxdW90O29yZy5lY2xpcHNlLmRlYnVnLmNvcmUuY29udGFpbmVyVHlwZS5kZWZhdWx0JnF1b3Q7LyZndDsmIzEzOyYjMTA7Jmx0Oy9zb3VyY2VDb250YWluZXJzJmd0OyYjMTM7JiMxMDsmbHQ7L3NvdXJjZUxvb2t1cERpcmVjdG9yJmd0OyYjMTM7JiMxMDsiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5LRUVQUlVOTklOR19BVFRSIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVE5BTUUiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVF9LSU5EIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LmxvYWRlci5qdW5pdDMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5NQUlOX1RZUEUiIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLkF1dG9tYXRlZFRlc3RzIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1fQVJHVU1FTlRTIiB2YWx1ZT0iLVhYOk1heFBlcm1TaXplPTI1Nm0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pZGUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0icnVuX2luX3VpX3RocmVhZCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0ZW1wbGF0ZUNvbmZpZyIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlQ3VzdG9tRmVhdHVyZXMiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlUHJvZHVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YTU5YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQ29yZSBPU0dpIFRlc3RzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuNi4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBvc2dpdGVzdHMuamFyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuaGFybmVzcywKLSBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLAotIG9yZy5qdW5pdAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYXBwYWRtaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotRHluYW1pY0ltcG9ydC1QYWNrYWdlOiBleHQuZnJhbWV3b3JrLmIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4Yjc3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSAqLmphcixcCi0gICAgICAgICAgICAgICB0ZXN0X2ZpbGVzLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvKi5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotCi1zb3VyY2Uub3NnaXRlc3RzLmphciA9IHNyYy8KLXNvdXJjZS5idW5kbGVfdGVzdHMvdGVzdC5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3Rlc3QuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvdGVzdDIuamFyID0gYnVuZGxlc19zcmMvdGVzdDIvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvdGVzdDIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvY2hhaW4udGVzdC5qYXIgPSBidW5kbGVzX3NyYy9jaGFpbi50ZXN0LwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2NoYWluLnRlc3QuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvY2hhaW4udGVzdC5hLmphciA9IGJ1bmRsZXNfc3JjL2NoYWluLnRlc3QuYS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvY2hhaW4udGVzdC5iLmphciA9IGJ1bmRsZXNfc3JjL2NoYWluLnRlc3QuYi8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvY2hhaW4udGVzdC5jLmphciA9IGJ1bmRsZXNfc3JjL2NoYWluLnRlc3QuYy8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmMuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvY2hhaW4udGVzdC5kLmphciA9IGJ1bmRsZXNfc3JjL2NoYWluLnRlc3QuZC8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmQuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvY2lyY3VsYXJpdHkudGVzdC5qYXIgPSBidW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0LwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2NpcmN1bGFyaXR5LnRlc3QuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvY2lyY3VsYXJpdHkudGVzdC5hLmphciA9IGJ1bmRsZXNfc3JjL2NpcmN1bGFyaXR5LnRlc3QuYS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9jaXJjdWxhcml0eS50ZXN0LmEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLmphciA9IGJ1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLnYyLmphciA9IGJ1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS52Mi8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEudjIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLnJlcXVpcmUuamFyID0gYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLnJlcXVpcmUvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLnJlcXVpcmUuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5hLmphciA9IGJ1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5iLmphciA9IGJ1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYi8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbGVnYWN5LmxhenlzdGFydC5qYXIgPSBidW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2xlZ2FjeS5sYXp5c3RhcnQuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbGVnYWN5LmxhenlzdGFydC5hLmphciA9IGJ1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9sZWdhY3kubGF6eXN0YXJ0LmEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbGVnYWN5LmxhenlzdGFydC5iLmphciA9IGJ1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYi8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9sZWdhY3kubGF6eXN0YXJ0LmIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbGVnYWN5LmxhenlzdGFydC5jLmphciA9IGJ1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYy8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9sZWdhY3kubGF6eXN0YXJ0LmMuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvb3NnaS5sYXp5c3RhcnQuamFyID0gYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvb3NnaS5sYXp5c3RhcnQuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvb3NnaS5sYXp5c3RhcnQuYS5qYXIgPSBidW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5hLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL29zZ2kubGF6eXN0YXJ0LmEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvb3NnaS5sYXp5c3RhcnQuYi5qYXIgPSBidW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5iLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL29zZ2kubGF6eXN0YXJ0LmIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvb3NnaS5sYXp5c3RhcnQuYy5qYXIgPSBidW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5jLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL29zZ2kubGF6eXN0YXJ0LmMuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvdGhyZWFkLmxvY2t0ZXN0LmphciA9IGJ1bmRsZXNfc3JjL3RocmVhZC5sb2NrdGVzdC8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90aHJlYWQubG9ja3Rlc3QuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvYnVkZHkucmVnaXN0ZXJlZC5hLmphciA9IGJ1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9idWRkeS5yZWdpc3RlcmVkLmEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QxLmphciA9IGJ1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QyLmphciA9IGJ1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0Mi8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvYnVkZHkuZGVwZW5kZW50LmEuamFyID0gYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvYnVkZHkuZGVwZW5kZW50LmEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDEuamFyID0gYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDEvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDIuamFyID0gYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDIvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbmF0aXZldGVzdC5hMS5qYXIgPSBidW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmExLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuYTEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbmF0aXZldGVzdC5hMi5qYXIgPSBidW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmEyLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuYTIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbmF0aXZldGVzdC5iMS5qYXIgPSBidW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmIxLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuYjEuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbmF0aXZldGVzdC5iMi5qYXIgPSBidW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmIyLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuYjIuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbmF0aXZldGVzdC5jLmphciA9IGJ1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYy8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9uYXRpdmV0ZXN0LmMuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvbmF0aXZldGVzdC5kLmphciA9IGJ1bmRsZXNfc3JjL25hdGl2ZXRlc3QuZC8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9uYXRpdmV0ZXN0LmQuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvaG9zdC5tdWx0aXBsZS5leHBvcnRzLmphciA9IGJ1bmRsZXNfc3JjL2hvc3QubXVsdGlwbGUuZXhwb3J0cy8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9ob3N0Lm11bHRpcGxlLmV4cG9ydHMuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvZnJhZy5tdWx0aXBsZS5leHBvcnRzLmphciA9IGJ1bmRsZXNfc3JjL2ZyYWcubXVsdGlwbGUuZXhwb3J0cy8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9mcmFnLm11bHRpcGxlLmV4cG9ydHMuamFyID0gTUVUQS1JTkYvTUFOSUZFU1QuTUYKLXNvdXJjZS5idW5kbGVfdGVzdHMvY2xpZW50MS5tdWx0aXBsZS5leHBvcnRzLmphciA9YnVuZGxlc19zcmMvY2xpZW50MS5tdWx0aXBsZS5leHBvcnRzLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2NsaWVudDEubXVsdGlwbGUuZXhwb3J0cy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9jbGllbnQyLm11bHRpcGxlLmV4cG9ydHMuamFyID0gYnVuZGxlc19zcmMvY2xpZW50Mi5tdWx0aXBsZS5leHBvcnRzLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2NsaWVudDIubXVsdGlwbGUuZXhwb3J0cy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0MS5qYXIgPSBidW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0MS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0MS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0Mi5qYXIgPSBidW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0Mi8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0Mi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0My5qYXIgPSBidW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0My8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0My5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHQuZnJhbWV3b3JrLmEuamFyID0gYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4dC5mcmFtZXdvcmsuYS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHQuZnJhbWV3b3JrLmEuaW1wb3J0ZXIuamFyID0gYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hLmltcG9ydGVyLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4dC5mcmFtZXdvcmsuYS5pbXBvcnRlci5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHQuZnJhbWV3b3JrLmEucmVxdWlyZXMuamFyID0gYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hLnJlcXVpcmVzLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4dC5mcmFtZXdvcmsuYS5yZXF1aXJlcy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHQuZnJhbWV3b3JrLmIuamFyID0gYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5iLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4dC5mcmFtZXdvcmsuYi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHQuZXh0Y2xhc3NwYXRoLmEuamFyID0gYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4dC5leHRjbGFzc3BhdGguYS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHQuZXh0Y2xhc3NwYXRoLmEuaW1wb3J0ZXIuamFyID0gYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hLmltcG9ydGVyLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4dC5leHRjbGFzc3BhdGguYS5pbXBvcnRlci5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHBvcnRlci5pbXBvcnRlcjEuamFyID0gYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIxLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4cG9ydGVyLmltcG9ydGVyMS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHBvcnRlci5pbXBvcnRlcjIuamFyID0gYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIyLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4cG9ydGVyLmltcG9ydGVyMi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHBvcnRlci5pbXBvcnRlcjMuamFyID0gYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIzLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4cG9ydGVyLmltcG9ydGVyMy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9leHBvcnRlci5pbXBvcnRlcjQuamFyID0gYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXI0LwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL2V4cG9ydGVyLmltcG9ydGVyNC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzIzNTk1OC54LmphciA9IGJ1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LngvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvdGVzdC5idWcyMzU5NTgueC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzIzNTk1OC55LmphciA9IGJ1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LnkvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvdGVzdC5idWcyMzU5NTgueS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50MS5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmZyYWdtZW50MS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50MS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50Mi5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmZyYWdtZW50Mi8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50Mi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50My5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmZyYWdtZW50My8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50My5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50NC5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmZyYWdtZW50NC8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50NC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50NS5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmZyYWdtZW50NS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50NS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5hLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmEvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuYS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5hLmZyYWcuamFyID0gYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYS5mcmFnLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmEuZnJhZy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5iLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmIvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuYi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5iLmZyYWcuamFyID0gYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYi5mcmFnLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmIuZnJhZy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5jLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmMvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuYy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5kLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmQvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuZC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5lLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmUvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuZS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5mLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmYvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuZi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5nLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmcvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuZy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5oLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmgvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuaC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5pLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmkvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuaS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5qLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmovCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuai5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5rLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmsvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuay5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5sLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmwvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMubC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5tLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLm0vCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMubS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5uLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLm4vCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMubi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5wLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLnAvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMucC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5xLmphciA9IGJ1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLnEvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMucS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9hY3RpdmF0b3IuZXJyb3IxLmphciA9IGJ1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjEvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvYWN0aXZhdG9yLmVycm9yMS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9hY3RpdmF0b3IuZXJyb3IyLmphciA9IGJ1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjIvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvYWN0aXZhdG9yLmVycm9yMi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9hY3RpdmF0b3IuZXJyb3IzLmphciA9IGJ1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjMvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvYWN0aXZhdG9yLmVycm9yMy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9hY3RpdmF0b3IuZXJyb3I0LmphciA9IGJ1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjQvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvYWN0aXZhdG9yLmVycm9yNC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zZWN1cml0eS5hLmphciA9IGJ1bmRsZXNfc3JjL3NlY3VyaXR5LmEvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc2VjdXJpdHkuYS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zZWN1cml0eS5hLmZyYWcuYS5qYXIgPSBidW5kbGVzX3NyYy9zZWN1cml0eS5hLmZyYWcuYS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy9zZWN1cml0eS5hLmZyYWcuYS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy9zZWN1cml0eS5iLmphciA9IGJ1bmRsZXNfc3JjL3NlY3VyaXR5LmIvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvc2VjdXJpdHkuYi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmZpbHRlci5hLmphciA9IGJ1bmRsZXNfc3JjL3Rlc3QuZmlsdGVyLmEvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvdGVzdC5maWx0ZXIuYS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYS5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmxpbmsuYS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYS5jbGllbnQuamFyID0gYnVuZGxlc19zcmMvdGVzdC5saW5rLmEuY2xpZW50LwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3Rlc3QubGluay5hLmNsaWVudC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYi5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmxpbmsuYi8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYi5jbGllbnQuamFyID0gYnVuZGxlc19zcmMvdGVzdC5saW5rLmIuY2xpZW50LwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3Rlc3QubGluay5iLmNsaWVudC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYy5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmxpbmsuYy8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYy5jbGllbnQuamFyID0gYnVuZGxlc19zcmMvdGVzdC5saW5rLmMuY2xpZW50LwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3Rlc3QubGluay5jLmNsaWVudC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuZC5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmxpbmsuZC8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuZC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuZS5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmxpbmsuZS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuZS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuZS5jbGllbnQuamFyID0gYnVuZGxlc19zcmMvdGVzdC5saW5rLmUuY2xpZW50LwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3Rlc3QubGluay5lLmNsaWVudC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsucG9zdHBvbmVkLmphciA9IGJ1bmRsZXNfc3JjL3Rlc3QubGluay5wb3N0cG9uZWQvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvdGVzdC5saW5rLnBvc3Rwb25lZC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI1OTkwMy5hLmphciA9IGJ1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmEvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvdGVzdC5idWcyNTk5MDMuYS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI1OTkwMy5hLnVwZGF0ZS5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5hLnVwZGF0ZS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI1OTkwMy5hLnVwZGF0ZS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI1OTkwMy5iLmphciA9IGJ1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmIvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvdGVzdC5idWcyNTk5MDMuYi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI1OTkwMy5jLmphciA9IGJ1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmMvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvdGVzdC5idWcyNTk5MDMuYy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LnRjY2wuamFyID0gYnVuZGxlc19zcmMvdGVzdC50Y2NsLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3Rlc3QudGNjbC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0Lm1hbmlmZXN0cGFja2FnZS5qYXIgPSBidW5kbGVzX3NyYy90ZXN0Lm1hbmlmZXN0cGFja2FnZS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0Lm1hbmlmZXN0cGFja2FnZS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NjMwNy5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NjMwNy8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NjMwNy5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NzYzNi5hMS5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NzYzNi5hMS8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NzYzNi5hMS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NzYzNi5hMi5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NzYzNi5hMi8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NzYzNi5hMi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NzYzNi5iLmphciA9IGJ1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NjM2LmIvCi1tYW5pZmVzdC5idW5kbGVfdGVzdHMvdGVzdC5idWcyODc2MzYuYi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4Nzc1MC5qYXIgPSBidW5kbGVzX3NyYy90ZXN0LmJ1ZzI4Nzc1MC8KLW1hbmlmZXN0LmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4Nzc1MC5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzMwNjE4MWEuamFyID0gYnVuZGxlc19zcmMvdGVzdC5idWczMDYxODFhLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3Rlc3QuYnVnMzA2MTgxYS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotc291cmNlLmJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzMwNjE4MWIuamFyID0gYnVuZGxlc19zcmMvdGVzdC5idWczMDYxODFiLwotbWFuaWZlc3QuYnVuZGxlX3Rlc3RzL3Rlc3QuYnVnMzA2MTgxYi5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVC5NRgotCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBidW5kbGVfdGVzdHMvZXh0LmZyYW1ld29yay5iLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBvc2dpdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdDIuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmQuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmMuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmIuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmEuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9jaGFpbi50ZXN0LmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvY2lyY3VsYXJpdHkudGVzdC5hLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvY2lyY3VsYXJpdHkudGVzdC5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS52Mi5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS5yZXF1aXJlLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5hLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5iLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvbGVnYWN5LmxhenlzdGFydC5hLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvbGVnYWN5LmxhenlzdGFydC5iLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvbGVnYWN5LmxhenlzdGFydC5jLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvbGVnYWN5LmxhenlzdGFydC5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL29zZ2kubGF6eXN0YXJ0LmEuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9vc2dpLmxhenlzdGFydC5iLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvb3NnaS5sYXp5c3RhcnQuYy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL29zZ2kubGF6eXN0YXJ0LmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGhyZWFkLmxvY2t0ZXN0LmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvYnVkZHkucmVnaXN0ZXJlZC5hLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QxLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QyLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvYnVkZHkuZGVwZW5kZW50LmEuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0MS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QyLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvbmF0aXZldGVzdC5hMS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuYTIuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9uYXRpdmV0ZXN0LmIxLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvbmF0aXZldGVzdC5iMi5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuYy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL25hdGl2ZXRlc3QuZC5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2hvc3QubXVsdGlwbGUuZXhwb3J0cy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2ZyYWcubXVsdGlwbGUuZXhwb3J0cy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2NsaWVudDEubXVsdGlwbGUuZXhwb3J0cy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2NsaWVudDIubXVsdGlwbGUuZXhwb3J0cy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3hmcmllbmRzLnRlc3QxLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMveGZyaWVuZHMudGVzdDIuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy94ZnJpZW5kcy50ZXN0My5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2V4dC5mcmFtZXdvcmsuYS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2V4dC5mcmFtZXdvcmsuYS5pbXBvcnRlci5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2V4dC5mcmFtZXdvcmsuYS5yZXF1aXJlcy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2V4dC5leHRjbGFzc3BhdGguYS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2V4dC5leHRjbGFzc3BhdGguYS5pbXBvcnRlci5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2V4cG9ydGVyLmltcG9ydGVyMS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2V4cG9ydGVyLmltcG9ydGVyMi5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2V4cG9ydGVyLmltcG9ydGVyMy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL2V4cG9ydGVyLmltcG9ydGVyNC5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3Rlc3QuZnJhZ21lbnQxLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC5mcmFnbWVudDIuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmZyYWdtZW50My5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3Rlc3QuZnJhZ21lbnQ0LmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC5mcmFnbWVudDUuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzIzNTk1OC54LFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzIzNTk1OC55LFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5hLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuYS5mcmFnLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuYi5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmIuZnJhZy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmMuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5kLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuZS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmYuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5nLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuaC5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmkuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5qLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMuay5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLmwuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5tLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvc3Vic3RpdHV0ZXMubi5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3N1YnN0aXR1dGVzLnAuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy9zdWJzdGl0dXRlcy5xLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvYWN0aXZhdG9yLmVycm9yMSxcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvYWN0aXZhdG9yLmVycm9yMixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvYWN0aXZhdG9yLmVycm9yMyxcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvYWN0aXZhdG9yLmVycm9yNCxcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvc2VjdXJpdHkuYS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3NlY3VyaXR5LmEuZnJhZy5hLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvc2VjdXJpdHkuYi5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3Rlc3QuZmlsdGVyLmEuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3Rlc3QubGluay5hLmNsaWVudC5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3Rlc3QubGluay5iLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC5saW5rLmIuY2xpZW50LmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC5saW5rLmMuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuYy5jbGllbnQuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmxpbmsuZC5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3Rlc3QubGluay5lLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC5saW5rLmUuY2xpZW50LmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC5saW5rLnBvc3Rwb25lZC5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3Rlc3QuYnVnMjU5OTAzLmEuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI1OTkwMy5hLnVwZGF0ZS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3Rlc3QuYnVnMjU5OTAzLmIuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI1OTkwMy5jLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC50Y2NsLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC5tYW5pZmVzdHBhY2thZ2UuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NjMwNy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgYnVuZGxlX3Rlc3RzL3Rlc3QuYnVnMjg3NjM2LmExLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC5idWcyODc2MzYuYTIuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzI4NzYzNi5iLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBidW5kbGVfdGVzdHMvdGVzdC5idWcyODc3NTAuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzMwNjE4MWEuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV90ZXN0cy90ZXN0LmJ1ZzMwNjE4MWIuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYWN0aXZhdG9yLmVycm9yMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9hY3RpdmF0b3IuZXJyb3IxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWYzOWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9hY3RpdmF0b3IuZXJyb3IxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgYWN0aXZhdG9yLmVycm9yMQotQnVuZGxlLVN5bWJvbGljTmFtZTogYWN0aXZhdG9yLmVycm9yMQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBhY3RpdmF0b3IuZXJyb3IxLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yawpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjEvYWN0aXZhdG9yL2Vycm9yMS9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9hY3RpdmF0b3IuZXJyb3IxL2FjdGl2YXRvci9lcnJvcjEvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjY2FjYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjEvYWN0aXZhdG9yL2Vycm9yMS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2UgYWN0aXZhdG9yLmVycm9yMTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYWN0aXZhdG9yLmVycm9yMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxZTM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYWN0aXZhdG9yLmVycm9yMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIGFjdGl2YXRvci5lcnJvcjIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGFjdGl2YXRvci5lcnJvcjIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogYWN0aXZhdG9yLmVycm9yMi5BY3RpdmF0b3IKLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcmsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9hY3RpdmF0b3IuZXJyb3IyL2FjdGl2YXRvci9lcnJvcjIvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYWN0aXZhdG9yLmVycm9yMi9hY3RpdmF0b3IvZXJyb3IyL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGU1YTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9hY3RpdmF0b3IuZXJyb3IyL2FjdGl2YXRvci9lcnJvcjIvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIGFjdGl2YXRvci5lcnJvcjI7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9hY3RpdmF0b3IuZXJyb3IzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYjQzMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICBhY3RpdmF0b3IuZXJyb3IzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBhY3RpdmF0b3IuZXJyb3IzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IGFjdGl2YXRvci5lcnJvcjMuQWN0aXZhdG9yCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYWN0aXZhdG9yLmVycm9yMy9hY3RpdmF0b3IvZXJyb3IzL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjMvYWN0aXZhdG9yL2Vycm9yMy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhZDFhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYWN0aXZhdG9yLmVycm9yMy9hY3RpdmF0b3IvZXJyb3IzL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBhY3RpdmF0b3IuZXJyb3IzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2FjdGl2YXRvci5lcnJvcjQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYWN0aXZhdG9yLmVycm9yNC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhZjZhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYWN0aXZhdG9yLmVycm9yNC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIGFjdGl2YXRvci5lcnJvcjEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGFjdGl2YXRvci5lcnJvcjEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QxL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmIzYjIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0MS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QxCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBidWRkeS5kZXBlbmRlbnQuYS50ZXN0MQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiAKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotUmVxdWlyZS1CdW5kbGU6IGJ1ZGR5LmRlcGVuZGVudC5hCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDEvYnVkZHkvZGVwZW5kZW50L2EvdGVzdDEvQVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0MS9idWRkeS9kZXBlbmRlbnQvYS90ZXN0MS9BVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzA5YmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0MS9idWRkeS9kZXBlbmRlbnQvYS90ZXN0MS9BVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QxOwotCi1wdWJsaWMgY2xhc3MgQVRlc3QgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDEvcmVzb3VyY2VzL3Rlc3QudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QxL3Jlc291cmNlcy90ZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkZGJmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDEvcmVzb3VyY2VzL3Rlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVkZHkuZGVwZW5kZW50LmEudGVzdDEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDEvcmVzb3VyY2VzL3Rlc3QxLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0MS9yZXNvdXJjZXMvdGVzdDEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmRkYmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0MS9yZXNvdXJjZXMvdGVzdDEudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVkZHkuZGVwZW5kZW50LmEudGVzdDEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZGMzNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogYnVkZHkuZGVwZW5kZW50LmEudGVzdDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QyCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1SZXF1aXJlLUJ1bmRsZTogYnVkZHkuZGVwZW5kZW50LmEudGVzdDEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0Mi9idWRkeS9kZXBlbmRlbnQvYS90ZXN0Mi9BVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QyL2J1ZGR5L2RlcGVuZGVudC9hL3Rlc3QyL0FUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYWM1NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QyL2J1ZGR5L2RlcGVuZGVudC9hL3Rlc3QyL0FUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgYnVkZHkuZGVwZW5kZW50LmEudGVzdDI7Ci0KLXB1YmxpYyBjbGFzcyBBVGVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0Mi9yZXNvdXJjZXMvdGVzdC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEudGVzdDIvcmVzb3VyY2VzL3Rlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjI5YTY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0Mi9yZXNvdXJjZXMvdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWRkeS5kZXBlbmRlbnQuYS50ZXN0MgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS50ZXN0Mi9yZXNvdXJjZXMvdGVzdDIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QyL3Jlc291cmNlcy90ZXN0Mi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjlhNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hLnRlc3QyL3Jlc291cmNlcy90ZXN0Mi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWRkeS5kZXBlbmRlbnQuYS50ZXN0MgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0NzBhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkuZGVwZW5kZW50LmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBidWRkeS5kZXBlbmRlbnQuYQotQnVuZGxlLVN5bWJvbGljTmFtZTogYnVkZHkuZGVwZW5kZW50LmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogCi0gb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUVjbGlwc2UtQnVkZHlQb2xpY3k6IGRlcGVuZGVudAotRXhwb3J0LVBhY2thZ2U6IHJlc291cmNlcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hL3Jlc291cmNlcy90ZXN0LnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5kZXBlbmRlbnQuYS9yZXNvdXJjZXMvdGVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDhiZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LmRlcGVuZGVudC5hL3Jlc291cmNlcy90ZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1ZGR5LmRlcGVuZGVudC5hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMjE3MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGJ1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MQotQnVuZGxlLVN5bWJvbGljTmFtZTogYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QxCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1SZXF1aXJlLUJ1bmRsZTogYnVkZHkucmVnaXN0ZXJlZC5hCi1FY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IGJ1ZGR5LnJlZ2lzdGVyZWQuYQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MS9idWRkeS9yZWdpc3RlcmVkL2EvdGVzdDEvQVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDEvYnVkZHkvcmVnaXN0ZXJlZC9hL3Rlc3QxL0FUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NWQ1NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MS9idWRkeS9yZWdpc3RlcmVkL2EvdGVzdDEvQVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBidWRkeS5yZWdpc3RlcmVkLmEudGVzdDE7Ci0KLXB1YmxpYyBjbGFzcyBBVGVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDEvcmVzb3VyY2VzL3Rlc3QudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MS9yZXNvdXJjZXMvdGVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNmMwMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MS9yZXNvdXJjZXMvdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWRkeS5yZWdpc3RlcmVkLmEudGVzdDEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QxL3Jlc291cmNlcy90ZXN0MS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QxL3Jlc291cmNlcy90ZXN0MS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNmMwMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MS9yZXNvdXJjZXMvdGVzdDEudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0Mi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMGZlZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0Mi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGJ1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MgotQnVuZGxlLVN5bWJvbGljTmFtZTogYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QyCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1SZXF1aXJlLUJ1bmRsZTogYnVkZHkucmVnaXN0ZXJlZC5hCi1FY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IGJ1ZGR5LnJlZ2lzdGVyZWQuYQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0Mi9idWRkeS9yZWdpc3RlcmVkL2EvdGVzdDIvQVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDIvYnVkZHkvcmVnaXN0ZXJlZC9hL3Rlc3QyL0FUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZTNlM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0Mi9idWRkeS9yZWdpc3RlcmVkL2EvdGVzdDIvQVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBidWRkeS5yZWdpc3RlcmVkLmEudGVzdDI7Ci0KLXB1YmxpYyBjbGFzcyBBVGVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEudGVzdDIvcmVzb3VyY2VzL3Rlc3QudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0Mi9yZXNvdXJjZXMvdGVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzMwNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0Mi9yZXNvdXJjZXMvdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWRkeS5yZWdpc3RlcmVkLmEudGVzdDIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QyL3Jlc291cmNlcy90ZXN0Mi50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QyL3Jlc291cmNlcy90ZXN0Mi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzMwNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0Mi9yZXNvdXJjZXMvdGVzdDIudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NmNhZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2J1ZGR5LnJlZ2lzdGVyZWQuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGJ1ZGR5LnJlZ2lzdGVyZWQuYQotQnVuZGxlLVN5bWJvbGljTmFtZTogYnVkZHkucmVnaXN0ZXJlZC5hCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1FY2xpcHNlLUJ1ZGR5UG9saWN5OiByZWdpc3RlcmVkCi1FeHBvcnQtUGFja2FnZTogcmVzb3VyY2VzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvYnVkZHkucmVnaXN0ZXJlZC5hL3Jlc291cmNlcy90ZXN0LnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEvcmVzb3VyY2VzL3Rlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg0MTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9idWRkeS5yZWdpc3RlcmVkLmEvcmVzb3VyY2VzL3Rlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVkZHkucmVnaXN0ZXJlZC5hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NmVhOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IENoYWluIHRlc3QgYgotQnVuZGxlLVN5bWJvbGljTmFtZTogY2hhaW4udGVzdC5hCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IGNoYWluLnRlc3QuYS5BY3RpdmF0b3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIGNoYWluLnRlc3QuYiwKLSBjaGFpbi50ZXN0LmMKLUV4cG9ydC1QYWNrYWdlOiBjaGFpbi50ZXN0LmEKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5hL2NoYWluL3Rlc3QvYS9BQ2hhaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmEvY2hhaW4vdGVzdC9hL0FDaGFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQ1YmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmEvY2hhaW4vdGVzdC9hL0FDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGNoYWluLnRlc3QuYTsKLQotaW1wb3J0IGNoYWluLnRlc3QuYi5CQ2hhaW47Ci0KLXB1YmxpYyBjbGFzcyBBQ2hhaW4gZXh0ZW5kcyBCQ2hhaW57Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmEvY2hhaW4vdGVzdC9hL0FNdWx0aUNoYWluMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYS9jaGFpbi90ZXN0L2EvQU11bHRpQ2hhaW4xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMWRkMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYS9jaGFpbi90ZXN0L2EvQU11bHRpQ2hhaW4xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2hhaW4udGVzdC5hOwotCi1pbXBvcnQgY2hhaW4udGVzdC5iLkJNdWx0aUNoYWluMTsKLWltcG9ydCBjaGFpbi50ZXN0LmMuQ011bHRpcGxlQ2hhaW4xOwotCi1wdWJsaWMgaW50ZXJmYWNlIEFNdWx0aUNoYWluMSBleHRlbmRzIEFNdWx0aUNoYWluMiwgQ011bHRpcGxlQ2hhaW4xLCBCTXVsdGlDaGFpbjEgewotLy8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmEvY2hhaW4vdGVzdC9hL0FNdWx0aUNoYWluMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYS9jaGFpbi90ZXN0L2EvQU11bHRpQ2hhaW4yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjNlNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYS9jaGFpbi90ZXN0L2EvQU11bHRpQ2hhaW4yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2hhaW4udGVzdC5hOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQU11bHRpQ2hhaW4yIHsKLS8vCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5hL2NoYWluL3Rlc3QvYS9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmEvY2hhaW4vdGVzdC9hL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGYyZGEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmEvY2hhaW4vdGVzdC9hL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGNoYWluLnRlc3QuYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY29udGV4dC5nZXRCdW5kbGUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5iL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjNzBjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5iL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQ2hhaW4gdGVzdCBiCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjaGFpbi50ZXN0LmIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogY2hhaW4udGVzdC5iLkFjdGl2YXRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gY2hhaW4udGVzdC5jLAotIGNoYWluLnRlc3QuZAotRXhwb3J0LVBhY2thZ2U6IGNoYWluLnRlc3QuYgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmIvY2hhaW4vdGVzdC9iL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYi9jaGFpbi90ZXN0L2IvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NmIzM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYi9jaGFpbi90ZXN0L2IvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2hhaW4udGVzdC5iOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmIvY2hhaW4vdGVzdC9iL0JDaGFpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYi9jaGFpbi90ZXN0L2IvQkNoYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZTYyNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYi9jaGFpbi90ZXN0L2IvQkNoYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2hhaW4udGVzdC5iOwotCi1wdWJsaWMgY2xhc3MgQkNoYWluIHsKLS8vCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5iL2NoYWluL3Rlc3QvYi9CTXVsdGlDaGFpbjEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmIvY2hhaW4vdGVzdC9iL0JNdWx0aUNoYWluMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjIyNmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmIvY2hhaW4vdGVzdC9iL0JNdWx0aUNoYWluMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGNoYWluLnRlc3QuYjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEJNdWx0aUNoYWluMSB7Ci0vLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYi9jaGFpbi90ZXN0L2IvQk11bHRpQ2hhaW4yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5iL2NoYWluL3Rlc3QvYi9CTXVsdGlDaGFpbjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3ZTg2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5iL2NoYWluL3Rlc3QvYi9CTXVsdGlDaGFpbjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBjaGFpbi50ZXN0LmI7Ci0KLWltcG9ydCBjaGFpbi50ZXN0LmMuQ011bHRpcGxlQ2hhaW4yOwotaW1wb3J0IGNoYWluLnRlc3QuZC5ETXVsdGlwbGVDaGFpbjE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQk11bHRpQ2hhaW4yIGV4dGVuZHMgQ011bHRpcGxlQ2hhaW4yLCBETXVsdGlwbGVDaGFpbjF7Ci0vLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTk0NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IENoYWluIHRlc3QKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNoYWluLnRlc3QuYwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0b3I6IGNoYWluLnRlc3QuYy5BY3RpdmF0b3IKLUV4cG9ydC1QYWNrYWdlOiBjaGFpbi50ZXN0LmMKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBjaGFpbi50ZXN0LmQKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5jL2NoYWluL3Rlc3QvYy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmMvY2hhaW4vdGVzdC9jL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzEwOGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmMvY2hhaW4vdGVzdC9jL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGNoYWluLnRlc3QuYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY29udGV4dC5nZXRCdW5kbGUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5jL2NoYWluL3Rlc3QvYy9DTXVsdGlwbGVDaGFpbjEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmMvY2hhaW4vdGVzdC9jL0NNdWx0aXBsZUNoYWluMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTNiZDZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmMvY2hhaW4vdGVzdC9jL0NNdWx0aXBsZUNoYWluMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGNoYWluLnRlc3QuYzsKLQotcHVibGljIGludGVyZmFjZSBDTXVsdGlwbGVDaGFpbjEgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5jL2NoYWluL3Rlc3QvYy9DTXVsdGlwbGVDaGFpbjIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmMvY2hhaW4vdGVzdC9jL0NNdWx0aXBsZUNoYWluMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODFiNzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0LmMvY2hhaW4vdGVzdC9jL0NNdWx0aXBsZUNoYWluMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGNoYWluLnRlc3QuYzsKLQotcHVibGljIGludGVyZmFjZSBDTXVsdGlwbGVDaGFpbjIgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5kL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmZjVmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5kL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQ2hhaW4gdGVzdAotQnVuZGxlLVN5bWJvbGljTmFtZTogY2hhaW4udGVzdC5kCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUFjdGl2YXRvcjogY2hhaW4udGVzdC5kLkFjdGl2YXRvcgotRXhwb3J0LVBhY2thZ2U6IGNoYWluLnRlc3QuZAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuZC9jaGFpbi90ZXN0L2QvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5kL2NoYWluL3Rlc3QvZC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlOTk5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5kL2NoYWluL3Rlc3QvZC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBjaGFpbi50ZXN0LmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgY29udGV4dC5nZXRCdW5kbGUoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NoYWluLnRlc3QuZC9jaGFpbi90ZXN0L2QvRE11bHRpcGxlQ2hhaW4xLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5kL2NoYWluL3Rlc3QvZC9ETXVsdGlwbGVDaGFpbjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzODlkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC5kL2NoYWluL3Rlc3QvZC9ETXVsdGlwbGVDaGFpbjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBjaGFpbi50ZXN0LmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRE11bHRpcGxlQ2hhaW4xIHsKLS8vCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZhOWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQ2hhaW4gdGVzdAotQnVuZGxlLVN5bWJvbGljTmFtZTogY2hhaW4udGVzdAotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiBjaGFpbi50ZXN0LmEsCi0gY2hhaW4udGVzdC5iLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUFjdGl2YXRvcjogY2hhaW4udGVzdC5BY3RpdmF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0L2NoYWluL3Rlc3QvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC9jaGFpbi90ZXN0L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI5NmExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0L2NoYWluL3Rlc3QvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2hhaW4udGVzdDsKLQotaW1wb3J0IGNoYWluLnRlc3QuYi5CTXVsdGlDaGFpbjE7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IsIFN5bmNocm9ub3VzQnVuZGxlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRleHQuZ2V0UHJvcGVydHkoInRlc3QuYnVnMzAwNjkyIikgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGNvbnRleHQuZ2V0UHJvcGVydHkoInRlc3QuYnVnMzAwNjkyLmxpc3RlbmVyIikgIT0gbnVsbCkgewotCQkJY29udGV4dC5hZGRCdW5kbGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCW5ldyBUZXN0TXVsdGlDaGFpbigpOwotCQljb250ZXh0LnJlbW92ZUJ1bmRsZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGJ1bmRsZUNoYW5nZWQoQnVuZGxlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFR5cGUoKSAhPSBCdW5kbGVFdmVudC5MQVpZX0FDVElWQVRJT04pCi0JCQlyZXR1cm47Ci0JCUNsYXNzIGNsYXp6ID0gQk11bHRpQ2hhaW4xLmNsYXNzOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oY2xhenouZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0L2NoYWluL3Rlc3QvVGVzdE11bHRpQ2hhaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0L2NoYWluL3Rlc3QvVGVzdE11bHRpQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyYjQyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC9jaGFpbi90ZXN0L1Rlc3RNdWx0aUNoYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2hhaW4udGVzdDsKLQotaW1wb3J0IGNoYWluLnRlc3QuYS5BTXVsdGlDaGFpbjE7Ci1pbXBvcnQgY2hhaW4udGVzdC5iLkJNdWx0aUNoYWluMjsKLQotcHVibGljIGNsYXNzIFRlc3RNdWx0aUNoYWluIGltcGxlbWVudHMgQU11bHRpQ2hhaW4xLCBCTXVsdGlDaGFpbjIgewotLy8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0L2NoYWluL3Rlc3QvVGVzdFNpbmdsZUNoYWluLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2hhaW4udGVzdC9jaGFpbi90ZXN0L1Rlc3RTaW5nbGVDaGFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzEzMTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaGFpbi50ZXN0L2NoYWluL3Rlc3QvVGVzdFNpbmdsZUNoYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2hhaW4udGVzdDsKLQotaW1wb3J0IGNoYWluLnRlc3QuYS5BQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLklUZXN0UnVubmVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNpbmdsZUNoYWluIGltcGxlbWVudHMgSVRlc3RSdW5uZXIgewotCi0JcHVibGljIE9iamVjdCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBBQ2hhaW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0LmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2lyY3VsYXJpdHkudGVzdC5hL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDg3YzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0LmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBDaXJjdWxhcml0eSBUZXN0IEEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNpcmN1bGFyaXR5LnRlc3QuYQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBjaXJjdWxhcml0eS50ZXN0LmEuQWN0aXZhdG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotRXhwb3J0LVBhY2thZ2U6IGNpcmN1bGFyaXR5LnRlc3QuYQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0LmEvY2lyY3VsYXJpdHkvdGVzdC9hL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NpcmN1bGFyaXR5LnRlc3QuYS9jaXJjdWxhcml0eS90ZXN0L2EvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYzMwMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NpcmN1bGFyaXR5LnRlc3QuYS9jaXJjdWxhcml0eS90ZXN0L2EvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2lyY3VsYXJpdHkudGVzdC5hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLmluc3RhbGxlci5nZXRCdW5kbGUoImNpcmN1bGFyaXR5LnRlc3QiKS5sb2FkQ2xhc3MoImNpcmN1bGFyaXR5LnRlc3QuVGVzdENpcmN1bGFyaXR5Iik7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudCh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2lyY3VsYXJpdHkudGVzdC5hL2NpcmN1bGFyaXR5L3Rlc3QvYS9JQ2lyY3VsYXJpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0LmEvY2lyY3VsYXJpdHkvdGVzdC9hL0lDaXJjdWxhcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTI4YmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0LmEvY2lyY3VsYXJpdHkvdGVzdC9hL0lDaXJjdWxhcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGNpcmN1bGFyaXR5LnRlc3QuYTsKLQotcHVibGljIGludGVyZmFjZSBJQ2lyY3VsYXJpdHkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2lyY3VsYXJpdHkudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjZiOGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQ2lyY3VsYXJpdHkgVGVzdAotQnVuZGxlLVN5bWJvbGljTmFtZTogY2lyY3VsYXJpdHkudGVzdAotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBjaXJjdWxhcml0eS50ZXN0LkFjdGl2YXRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gY2lyY3VsYXJpdHkudGVzdC5hCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NpcmN1bGFyaXR5LnRlc3QvY2lyY3VsYXJpdHkvdGVzdC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0L2NpcmN1bGFyaXR5L3Rlc3QvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDEwOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NpcmN1bGFyaXR5LnRlc3QvY2lyY3VsYXJpdHkvdGVzdC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBjaXJjdWxhcml0eS50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0L2NpcmN1bGFyaXR5L3Rlc3QvVGVzdENpcmN1bGFyaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2lyY3VsYXJpdHkudGVzdC9jaXJjdWxhcml0eS90ZXN0L1Rlc3RDaXJjdWxhcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjkzOGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jaXJjdWxhcml0eS50ZXN0L2NpcmN1bGFyaXR5L3Rlc3QvVGVzdENpcmN1bGFyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2lyY3VsYXJpdHkudGVzdDsKLQotaW1wb3J0IGNpcmN1bGFyaXR5LnRlc3QuYS5JQ2lyY3VsYXJpdHk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Q2lyY3VsYXJpdHkgaW1wbGVtZW50cyBJQ2lyY3VsYXJpdHkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2xpZW50MS5tdWx0aXBsZS5leHBvcnRzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NsaWVudDEubXVsdGlwbGUuZXhwb3J0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNzRkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2xpZW50MS5tdWx0aXBsZS5leHBvcnRzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogY2xpZW50MS5tdWx0aXBsZS5leHBvcnRzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjbGllbnQxLm11bHRpcGxlLmV4cG9ydHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogY2xpZW50MS5tdWx0aXBsZS5leHBvcnRzLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IGhvc3QubXVsdGlwbGUuZXhwb3J0cywKLSBob3N0Lm11bHRpcGxlLmV4cG9ydHMub25seW9uZSwKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2xpZW50MS5tdWx0aXBsZS5leHBvcnRzL2NsaWVudDEvbXVsdGlwbGUvZXhwb3J0cy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jbGllbnQxLm11bHRpcGxlLmV4cG9ydHMvY2xpZW50MS9tdWx0aXBsZS9leHBvcnRzL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjYzNTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jbGllbnQxLm11bHRpcGxlLmV4cG9ydHMvY2xpZW50MS9tdWx0aXBsZS9leHBvcnRzL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGNsaWVudDEubXVsdGlwbGUuZXhwb3J0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChDbGFzcy5mb3JOYW1lKCJob3N0Lm11bHRpcGxlLmV4cG9ydHMuUHVibGljQ2xhc3MxIikuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KHQpOwotCQl9Ci0JCXRyeSB7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQoQ2xhc3MuZm9yTmFtZSgiaG9zdC5tdWx0aXBsZS5leHBvcnRzLlB1YmxpY0NsYXNzMiIpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudCh0KTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQoQ2xhc3MuZm9yTmFtZSgiaG9zdC5tdWx0aXBsZS5leHBvcnRzLlByaXZhdGVDbGFzczEiKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQoInN1Y2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQoQ2xhc3MuZm9yTmFtZSgiaG9zdC5tdWx0aXBsZS5leHBvcnRzLlByaXZhdGVDbGFzczIiKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQoInN1Y2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2xpZW50Mi5tdWx0aXBsZS5leHBvcnRzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NsaWVudDIubXVsdGlwbGUuZXhwb3J0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmNGI5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvY2xpZW50Mi5tdWx0aXBsZS5leHBvcnRzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogY2xpZW50Mi5tdWx0aXBsZS5leHBvcnRzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjbGllbnQyLm11bHRpcGxlLmV4cG9ydHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogY2xpZW50Mi5tdWx0aXBsZS5leHBvcnRzLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IGhvc3QubXVsdGlwbGUuZXhwb3J0czsgc2NvcGU9InByaXZhdGUiLAotIGhvc3QubXVsdGlwbGUuZXhwb3J0cy5vbmx5b25lLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcmsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9jbGllbnQyLm11bHRpcGxlLmV4cG9ydHMvY2xpZW50Mi9tdWx0aXBsZS9leHBvcnRzL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NsaWVudDIubXVsdGlwbGUuZXhwb3J0cy9jbGllbnQyL211bHRpcGxlL2V4cG9ydHMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZGI0ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2NsaWVudDIubXVsdGlwbGUuZXhwb3J0cy9jbGllbnQyL211bHRpcGxlL2V4cG9ydHMvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY2xpZW50Mi5tdWx0aXBsZS5leHBvcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KENsYXNzLmZvck5hbWUoImhvc3QubXVsdGlwbGUuZXhwb3J0cy5QdWJsaWNDbGFzczEiKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQodCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChDbGFzcy5mb3JOYW1lKCJob3N0Lm11bHRpcGxlLmV4cG9ydHMuUHVibGljQ2xhc3MyIikuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KHQpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChDbGFzcy5mb3JOYW1lKCJob3N0Lm11bHRpcGxlLmV4cG9ydHMuUHJpdmF0ZUNsYXNzMSIpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudCh0KTsKLQkJfQotCQl0cnkgewotCQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KENsYXNzLmZvck5hbWUoImhvc3QubXVsdGlwbGUuZXhwb3J0cy5Qcml2YXRlQ2xhc3MyIikuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIxL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkZWViNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgZXhwb3J0ZXIuaW1wb3J0ZXIxCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBleHBvcnRlci5pbXBvcnRlcjEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRXhwb3J0LVBhY2thZ2U6IGV4cG9ydGVyLmltcG9ydGVyLnRlc3Q7IHZlcnNpb249MS4wCi1JbXBvcnQtUGFja2FnZTogZXhwb3J0ZXIuaW1wb3J0ZXIudGVzdDsgdmVyc2lvbj0xLjAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHBvcnRlci5pbXBvcnRlcjEvZXhwb3J0ZXIvaW1wb3J0ZXIvdGVzdC9UZXN0MS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyMS9leHBvcnRlci9pbXBvcnRlci90ZXN0L1Rlc3QxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTJkZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyMS9leHBvcnRlci9pbXBvcnRlci90ZXN0L1Rlc3QxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgZXhwb3J0ZXIuaW1wb3J0ZXIudGVzdDsKLQotcHVibGljIGNsYXNzIFRlc3QxIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHBvcnRlci5pbXBvcnRlcjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MjRiMDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHBvcnRlci5pbXBvcnRlcjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICBleHBvcnRlci5pbXBvcnRlcjIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGV4cG9ydGVyLmltcG9ydGVyMgotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1FeHBvcnQtUGFja2FnZTogZXhwb3J0ZXIuaW1wb3J0ZXIudGVzdDsgdmVyc2lvbj0xLjAKLUltcG9ydC1QYWNrYWdlOiBleHBvcnRlci5pbXBvcnRlci50ZXN0OyB2ZXJzaW9uPTEuMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyMi9leHBvcnRlci9pbXBvcnRlci90ZXN0L1Rlc3QyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIyL2V4cG9ydGVyL2ltcG9ydGVyL3Rlc3QvVGVzdDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2MTY3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIyL2V4cG9ydGVyL2ltcG9ydGVyL3Rlc3QvVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBleHBvcnRlci5pbXBvcnRlci50ZXN0OwotCi1wdWJsaWMgY2xhc3MgVGVzdDIgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyMy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1YTEwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIGV4cG9ydGVyLmltcG9ydGVyMwotQnVuZGxlLVN5bWJvbGljTmFtZTogZXhwb3J0ZXIuaW1wb3J0ZXIzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUV4cG9ydC1QYWNrYWdlOiBleHBvcnRlci5pbXBvcnRlci50ZXN0OyB2ZXJzaW9uPTEuMAotSW1wb3J0LVBhY2thZ2U6IGV4cG9ydGVyLmltcG9ydGVyLnRlc3Q7IHZlcnNpb249MS4wLAotIG9yZy5vc2dpLmZyYW1ld29yawotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1BY3RpdmF0b3I6IGV4cG9ydGVyLmltcG9ydGVyLkFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyMy9leHBvcnRlci9pbXBvcnRlci9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHBvcnRlci5pbXBvcnRlcjMvZXhwb3J0ZXIvaW1wb3J0ZXIvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZjMzZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4cG9ydGVyLmltcG9ydGVyMy9leHBvcnRlci9pbXBvcnRlci9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2UgZXhwb3J0ZXIuaW1wb3J0ZXI7Ci1pbXBvcnQgZXhwb3J0ZXIuaW1wb3J0ZXIudGVzdC5UZXN0MzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBUZXN0MygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXIzL2V4cG9ydGVyL2ltcG9ydGVyL3Rlc3QvVGVzdDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHBvcnRlci5pbXBvcnRlcjMvZXhwb3J0ZXIvaW1wb3J0ZXIvdGVzdC9UZXN0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjA2Zjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHBvcnRlci5pbXBvcnRlcjMvZXhwb3J0ZXIvaW1wb3J0ZXIvdGVzdC9UZXN0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGV4cG9ydGVyLmltcG9ydGVyLnRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MyB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHBvcnRlci5pbXBvcnRlcjQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXhwb3J0ZXIuaW1wb3J0ZXI0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDllZjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHBvcnRlci5pbXBvcnRlcjQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICBleHBvcnRlci5pbXBvcnRlcjQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGV4cG9ydGVyLmltcG9ydGVyNAotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1JbXBvcnQtUGFja2FnZTogZXhwb3J0ZXIuaW1wb3J0ZXIudGVzdDsgdmVyc2lvbj0xLjAKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hLmltcG9ydGVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5leHRjbGFzc3BhdGguYS5pbXBvcnRlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmMmUyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hLmltcG9ydGVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgZXh0LmV4dGNsYXNzcGF0aC5hLmltcG9ydGVyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBleHQuZXh0Y2xhc3NwYXRoLmEuaW1wb3J0ZXIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yaywKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gZXh0LmV4dGNsYXNzcGF0aC5hCi1CdW5kbGUtQWN0aXZhdG9yOiBleHQuZXh0Y2xhc3NwYXRoLmEuaW1wb3J0ZXIuQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hLmltcG9ydGVyL2V4dC9leHRjbGFzc3BhdGgvYS9pbXBvcnRlci9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZXh0Y2xhc3NwYXRoLmEuaW1wb3J0ZXIvZXh0L2V4dGNsYXNzcGF0aC9hL2ltcG9ydGVyL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE2Y2E5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZXh0Y2xhc3NwYXRoLmEuaW1wb3J0ZXIvZXh0L2V4dGNsYXNzcGF0aC9hL2ltcG9ydGVyL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGV4dC5leHRjbGFzc3BhdGguYS5pbXBvcnRlcjsKLQotaW1wb3J0IGV4dC5leHRjbGFzc3BhdGguYS5FeHRDbGFzc3BhdGhFeHRUZXN0OwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEV4dENsYXNzcGF0aEV4dFRlc3QoKS50b1N0cmluZygpKTsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KGdldFVSTENvbnRlbnQodGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvZXh0L2V4dGNsYXNzcGF0aC9hL2V4dHJlc291cmNlLnR4dCIpKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVUkxDb250ZW50KFVSTCByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHJlc291cmNlLm9wZW5TdHJlYW0oKSkpOwotCQl0cnkgewotCQkJcmV0dXJuIGJyLnJlYWRMaW5lKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlici5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5leHRjbGFzc3BhdGguYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzMGYwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgZXh0LmV4dGNsYXNzcGF0aC5hCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBleHQuZXh0Y2xhc3NwYXRoLmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRnJhZ21lbnQtSG9zdDogc3lzdGVtLmJ1bmRsZTsgZXh0ZW5zaW9uOj1leHRjbGFzc3BhdGgKLUV4cG9ydC1QYWNrYWdlOiBleHQuZXh0Y2xhc3NwYXRoLmEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZXh0Y2xhc3NwYXRoLmEvZXh0L2V4dGNsYXNzcGF0aC9hL0V4dENsYXNzcGF0aEV4dFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZXh0Y2xhc3NwYXRoLmEvZXh0L2V4dGNsYXNzcGF0aC9hL0V4dENsYXNzcGF0aEV4dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxNTUwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hL2V4dC9leHRjbGFzc3BhdGgvYS9FeHRDbGFzc3BhdGhFeHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgZXh0LmV4dGNsYXNzcGF0aC5hOwotCi1wdWJsaWMgY2xhc3MgRXh0Q2xhc3NwYXRoRXh0VGVzdCB7Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJzdWNjZXNzIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hL2V4dC9leHRjbGFzc3BhdGgvYS9leHRyZXNvdXJjZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmV4dGNsYXNzcGF0aC5hL2V4dC9leHRjbGFzc3BhdGgvYS9leHRyZXNvdXJjZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOWJhNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5leHRjbGFzc3BhdGguYS9leHQvZXh0Y2xhc3NwYXRoL2EvZXh0cmVzb3VyY2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3VjY2VzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYS5pbXBvcnRlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmEuaW1wb3J0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjc4YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYS5pbXBvcnRlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIGV4dC5mcmFtZXdvcmsuYS5pbXBvcnRlcgotQnVuZGxlLVN5bWJvbGljTmFtZTogZXh0LmZyYW1ld29yay5hLmltcG9ydGVyCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcmssCi0gZXh0LmZyYW1ld29yay5hLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcwotQnVuZGxlLUFjdGl2YXRvcjogZXh0LmZyYW1ld29yay5hLmltcG9ydGVyLkFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYS5pbXBvcnRlci9leHQvZnJhbWV3b3JrL2EvaW1wb3J0ZXIvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hLmltcG9ydGVyL2V4dC9mcmFtZXdvcmsvYS9pbXBvcnRlci9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyMWQ1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hLmltcG9ydGVyL2V4dC9mcmFtZXdvcmsvYS9pbXBvcnRlci9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBleHQuZnJhbWV3b3JrLmEuaW1wb3J0ZXI7Ci0KLWltcG9ydCBleHQuZnJhbWV3b3JrLmEuRnJhbWV3b3JrRXh0VGVzdDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBGcmFtZXdvcmtFeHRUZXN0KCkudGVzdEl0KCJzdWNjZXNzIikpOyAvLyROT04tTkxTLTEkCi0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChnZXRVUkxDb250ZW50KHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2V4dC9mcmFtZXdvcmsvYS9md2tyZXNvdXJjZS50eHQiKSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VVJMQ29udGVudChVUkwgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNvdXJjZS5vcGVuU3RyZWFtKCkpKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBici5yZWFkTGluZSgpOwotCQl9IGZpbmFsbHkgewotCQkJYnIuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYS5yZXF1aXJlcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmEucmVxdWlyZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NDRiM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYS5yZXF1aXJlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIGV4dC5mcmFtZXdvcmsuYS5yZXF1aXJlcwotQnVuZGxlLVN5bWJvbGljTmFtZTogZXh0LmZyYW1ld29yay5hLnJlcXVpcmVzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5vc2dpCi1CdW5kbGUtQWN0aXZhdG9yOiBleHQuZnJhbWV3b3JrLmEucmVxdWlyZXMuQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hLnJlcXVpcmVzL2V4dC9mcmFtZXdvcmsvYS9yZXF1aXJlcy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmEucmVxdWlyZXMvZXh0L2ZyYW1ld29yay9hL3JlcXVpcmVzL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgwNDFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmEucmVxdWlyZXMvZXh0L2ZyYW1ld29yay9hL3JlcXVpcmVzL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGV4dC5mcmFtZXdvcmsuYS5yZXF1aXJlczsKLQotaW1wb3J0IGV4dC5mcmFtZXdvcmsuYS5GcmFtZXdvcmtFeHRUZXN0OwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEZyYW1ld29ya0V4dFRlc3QoKS50ZXN0SXQoInN1Y2Nlc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KGdldFVSTENvbnRlbnQodGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvZXh0L2ZyYW1ld29yay9hL2Z3a3Jlc291cmNlLnR4dCIpKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVUkxDb250ZW50KFVSTCByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHJlc291cmNlLm9wZW5TdHJlYW0oKSkpOwotCQl0cnkgewotCQkJcmV0dXJuIGJyLnJlYWRMaW5lKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlici5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2ZTcyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgZXh0LmZyYW1ld29yay5hCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBleHQuZnJhbWV3b3JrLmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRnJhZ21lbnQtSG9zdDogc3lzdGVtLmJ1bmRsZTsgZXh0ZW5zaW9uOj1mcmFtZXdvcmsKLUV4cG9ydC1QYWNrYWdlOiBleHQuZnJhbWV3b3JrLmEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmEvZXh0L2ZyYW1ld29yay9hL0ZyYW1ld29ya0V4dFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmEvZXh0L2ZyYW1ld29yay9hL0ZyYW1ld29ya0V4dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzZTdhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hL2V4dC9mcmFtZXdvcmsvYS9GcmFtZXdvcmtFeHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgZXh0LmZyYW1ld29yay5hOwotCi1wdWJsaWMgY2xhc3MgRnJhbWV3b3JrRXh0VGVzdCB7Ci0JcHVibGljIFN0cmluZyB0ZXN0SXQoU3RyaW5nIHZhbHVlKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hL2V4dC9mcmFtZXdvcmsvYS9md2tyZXNvdXJjZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5hL2V4dC9mcmFtZXdvcmsvYS9md2tyZXNvdXJjZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOWJhNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYS9leHQvZnJhbWV3b3JrL2EvZndrcmVzb3VyY2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3VjY2VzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzg1YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2V4dC5mcmFtZXdvcmsuYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogZXh0LmZyYW1ld29yay5iCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBleHQuZnJhbWV3b3JrLmIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRnJhZ21lbnQtSG9zdDogc3lzdGVtLmJ1bmRsZTsgZXh0ZW5zaW9uOj1mcmFtZXdvcmsKLUV4cG9ydC1QYWNrYWdlOiBleHQuZnJhbWV3b3JrLmIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmIvZXh0L2ZyYW1ld29yay9iL1Rlc3RDb25kaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9leHQuZnJhbWV3b3JrLmIvZXh0L2ZyYW1ld29yay9iL1Rlc3RDb25kaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhNWFjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZXh0LmZyYW1ld29yay5iL2V4dC9mcmFtZXdvcmsvYi9UZXN0Q29uZGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBleHQuZnJhbWV3b3JrLmI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkNvbmRpdGlvbkluZm87Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Q29uZGl0aW9uIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtdXRhYmxlOwotCXByaXZhdGUgYm9vbGVhbiBjdXJNdXRhYmxlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBwb3N0cG9uZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGN1clBvc3Rwb25lZDsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2F0aXNmaWVkOwotCXByaXZhdGUgYm9vbGVhbiBjdXJTYXRpc2ZpZWQ7Ci0JcHJpdmF0ZSBmaW5hbCBCdW5kbGUgYnVuZGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBjb25kaXRpb25JRHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBUZXN0Q29uZGl0aW9uKFN0cmluZyBpZCwgYm9vbGVhbiBtdXRhYmxlLCBib29sZWFuIHBvc3Rwb25lZCwgYm9vbGVhbiBzYXRpc2ZpZWQsIEJ1bmRsZSBidW5kbGUpIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm11dGFibGUgPSB0aGlzLmN1ck11dGFibGUgPSBtdXRhYmxlOwotCQl0aGlzLnBvc3Rwb25lZCA9IHRoaXMuY3VyUG9zdHBvbmVkID0gcG9zdHBvbmVkOwotCQl0aGlzLnNhdGlzZmllZCA9IHRoaXMuY3VyU2F0aXNmaWVkID0gc2F0aXNmaWVkOwotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIENvbmRpdGlvbiBnZXRDb25kaXRpb24oZmluYWwgQnVuZGxlIGJ1bmRsZSwgQ29uZGl0aW9uSW5mbyBpbmZvKSB7Ci0JCWlmICghVGVzdENvbmRpdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGluZm8uZ2V0VHlwZSgpKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbmRpdGlvbkluZm8gbXVzdCBiZSBvZiB0eXBlIFwiIiArIFRlc3RDb25kaXRpb24uY2xhc3MuZ2V0TmFtZSgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmdbXSBhcmdzID0gaW5mby5nZXRBcmdzKCk7Ci0JCWlmIChhcmdzLmxlbmd0aCAhPSA0KQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBudW1iZXIgb2YgYXJnczogIiArIGFyZ3MubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgaWRlbnRpdHkgPSBhcmdzWzBdICsgJ18nICsgYnVuZGxlLmdldEJ1bmRsZUlkKCk7Ci0JCWJvb2xlYW4gbXV0ID0gQm9vbGVhbi52YWx1ZU9mKGFyZ3NbMV0pLmJvb2xlYW5WYWx1ZSgpOwotCQlib29sZWFuIHBvc3QgPSBCb29sZWFuLnZhbHVlT2YoYXJnc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCWJvb2xlYW4gc2F0ID0gQm9vbGVhbi52YWx1ZU9mKGFyZ3NbM10pLmJvb2xlYW5WYWx1ZSgpOwotCQlzeW5jaHJvbml6ZWQgKGNvbmRpdGlvbklEcykgewotCQkJVGVzdENvbmRpdGlvbiBjb25kaXRpb24gPSAoVGVzdENvbmRpdGlvbikgY29uZGl0aW9uSURzLmdldChpZGVudGl0eSk7Ci0JCQlpZiAoY29uZGl0aW9uID09IG51bGwpIHsKLQkJCQljb25kaXRpb24gPSBuZXcgVGVzdENvbmRpdGlvbihpZGVudGl0eSwgbXV0LCBwb3N0LCBzYXQsIGJ1bmRsZSk7Ci0JCQkJY29uZGl0aW9uSURzLnB1dChpZGVudGl0eSwgY29uZGl0aW9uKTsKLQkJCX0KLQkJCXJldHVybiBjb25kaXRpb247Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgcHVibGljIFRlc3RDb25kaXRpb24gZ2V0VGVzdENvbmRpdGlvbihTdHJpbmcgaWQpIHsKLQkJc3luY2hyb25pemVkIChjb25kaXRpb25JRHMpIHsKLQkJCXJldHVybiAoVGVzdENvbmRpdGlvbikgY29uZGl0aW9uSURzLmdldChpZCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgcHVibGljIHZvaWQgY2xlYXJDb25kaXRpb25zKCkgewotCQlzeW5jaHJvbml6ZWQgKGNvbmRpdGlvbklEcykgewotCQkJY29uZGl0aW9uSURzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011dGFibGUoKSB7Ci0JCXJldHVybiBjdXJNdXRhYmxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUG9zdHBvbmVkKCkgewotCQlyZXR1cm4gY3VyUG9zdHBvbmVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2F0aXNmaWVkKCkgewotCQlyZXR1cm4gY3VyU2F0aXNmaWVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2F0aXNmaWVkKENvbmRpdGlvbltdIGNvbmRpdGlvbnMsIERpY3Rpb25hcnkgY29udGV4dCkgewotCQlpZiAoIWlzUG9zdHBvbmVkKCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTaG91bGQgbm90IGNhbGwgaXNTYXRpc2ZpZWQoQ29uZGl0aW9uW10gY29uZGl0aW9ucywgRGljdGlvbmFyeSBjb250ZXh0KSIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJQm9vbGVhbiBpc1NhdGlzZmllZCA9IChCb29sZWFuKSBjb250ZXh0LmdldChjb25kaXRpb25zW2ldKTsKLQkJCWlmIChpc1NhdGlzZmllZCA9PSBudWxsKSB7Ci0JCQkJaXNTYXRpc2ZpZWQgPSBuZXcgQm9vbGVhbihjb25kaXRpb25zW2ldLmlzU2F0aXNmaWVkKCkpOwotCQkJCWNvbnRleHQucHV0KGNvbmRpdGlvbnNbaV0sIGlzU2F0aXNmaWVkKTsKLQkJCX0KLQkJCWlmICghaXNTYXRpc2ZpZWQuYm9vbGVhblZhbHVlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBpZC5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoIShvIGluc3RhbmNlb2YgVGVzdENvbmRpdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVRlc3RDb25kaXRpb24gb3RoZXJDb25kaXRpb24gPSAoVGVzdENvbmRpdGlvbikgbzsKLQkJcmV0dXJuIGlkLmVxdWFscyhvdGhlckNvbmRpdGlvbi5pZCkgJiYgcG9zdHBvbmVkID09IG90aGVyQ29uZGl0aW9uLnBvc3Rwb25lZCAmJiBzYXRpc2ZpZWQgPT0gb3RoZXJDb25kaXRpb24uc2F0aXNmaWVkICYmIG11dGFibGUgPT0gb3RoZXJDb25kaXRpb24ubXV0YWJsZSAmJiBidW5kbGUgPT0gb3RoZXJDb25kaXRpb24uYnVuZGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE11dGFibGUoYm9vbGVhbiBtdXRhYmxlKSB7Ci0JCXRoaXMuY3VyTXV0YWJsZSA9IG11dGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UG9zdHBvbmVkKGJvb2xlYW4gaXNQb3N0cG9uZWQpIHsKLQkJdGhpcy5jdXJQb3N0cG9uZWQgPSBpc1Bvc3Rwb25lZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTYXRpc2ZpZWQoYm9vbGVhbiBpc1NhdGlzZmllZCkgewotCQl0aGlzLmN1clNhdGlzZmllZCA9IGlzU2F0aXNmaWVkOwotCX0KLQotCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBpZCArICctJyArIHBvc3Rwb25lZCArICctJyArIG11dGFibGUgKyAnLScgKyBzYXRpc2ZpZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWcubXVsdGlwbGUuZXhwb3J0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnLm11bHRpcGxlLmV4cG9ydHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjgyYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWcubXVsdGlwbGUuZXhwb3J0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGZyYWcubXVsdGlwbGUuZXhwb3J0cwotQnVuZGxlLVN5bWJvbGljTmFtZTogZnJhZy5tdWx0aXBsZS5leHBvcnRzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUZyYWdtZW50LUhvc3Q6IGhvc3QubXVsdGlwbGUuZXhwb3J0cwotRXhwb3J0LVBhY2thZ2U6IGhvc3QubXVsdGlwbGUuZXhwb3J0czsgbWFuZGF0b3J5Oj0ic2NvcGUiOyBzY29wZT0icHJpdmF0ZSIsCi0gaG9zdC5tdWx0aXBsZS5leHBvcnRzLm9ubHlvbmU7Ci0gIHZlcnNpb249MS4wLjA7Ci0gIGluY2x1ZGU6PSJQdWJsaWMqIjsgCi0gIGV4Y2x1ZGU6PSJQdWJsaWNFeGNsdWRlKiI7Ci0gIHVzZXM6PSJob3N0Lm11bHRpcGxlLmV4cG9ydHMiOwotICBtYW50YXRvcnk6PSJ0ZXN0MSI7Ci0gIHRlc3QxPXZhbHVlOwotICB0ZXN0Mj12YWx1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWcubXVsdGlwbGUuZXhwb3J0cy9ob3N0L211bHRpcGxlL2V4cG9ydHMvUHJpdmF0ZUNsYXNzMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWcubXVsdGlwbGUuZXhwb3J0cy9ob3N0L211bHRpcGxlL2V4cG9ydHMvUHJpdmF0ZUNsYXNzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDExZGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnLm11bHRpcGxlLmV4cG9ydHMvaG9zdC9tdWx0aXBsZS9leHBvcnRzL1ByaXZhdGVDbGFzczEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBob3N0Lm11bHRpcGxlLmV4cG9ydHM7Ci0KLXB1YmxpYyBjbGFzcyBQcml2YXRlQ2xhc3MxIHsKLQkvLyBub3RoaW5nCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZy5tdWx0aXBsZS5leHBvcnRzL2hvc3QvbXVsdGlwbGUvZXhwb3J0cy9Qcml2YXRlQ2xhc3MyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZy5tdWx0aXBsZS5leHBvcnRzL2hvc3QvbXVsdGlwbGUvZXhwb3J0cy9Qcml2YXRlQ2xhc3MyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NmQwZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWcubXVsdGlwbGUuZXhwb3J0cy9ob3N0L211bHRpcGxlL2V4cG9ydHMvUHJpdmF0ZUNsYXNzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGhvc3QubXVsdGlwbGUuZXhwb3J0czsKLQotcHVibGljIGNsYXNzIFByaXZhdGVDbGFzczIgewotCS8vIG5vdGhpbmcKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5hL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNhODljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGZyYWdtZW50IHRlc3QgZnJhZyBhCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBmcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1GcmFnbWVudC1Ib3N0OiBmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmE7IG11bHRpcGxlLWhvc3RzOj10cnVlCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYS9mcmFnbWVudC90ZXN0L2F0dGFjaC9ob3N0L2EvaW50ZXJuYWwvdGVzdC9UZXN0UGFja2FnZUFjY2Vzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYS9mcmFnbWVudC90ZXN0L2F0dGFjaC9ob3N0L2EvaW50ZXJuYWwvdGVzdC9UZXN0UGFja2FnZUFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjMzZGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmEvZnJhZ21lbnQvdGVzdC9hdHRhY2gvaG9zdC9hL2ludGVybmFsL3Rlc3QvVGVzdFBhY2thZ2VBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEuaW50ZXJuYWwudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5JVGVzdFJ1bm5lcjsKLQotcHVibGljIGNsYXNzIFRlc3RQYWNrYWdlQWNjZXNzIGltcGxlbWVudHMgSVRlc3RSdW5uZXJ7Ci0KLQlwdWJsaWMgT2JqZWN0IHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgUGFja2FnZUFjY2Vzc1Rlc3QoKS5wYWNrYWdlTGV2ZWxBY2Nlc3MoVGVzdFBhY2thZ2VBY2Nlc3MuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYS9mcmFnbWVudC90ZXN0L2F0dGFjaC9ob3N0L2EvaW50ZXJuYWwvdGVzdC9UZXN0UGFja2FnZUFjY2VzczIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmEvZnJhZ21lbnQvdGVzdC9hdHRhY2gvaG9zdC9hL2ludGVybmFsL3Rlc3QvVGVzdFBhY2thZ2VBY2Nlc3MyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOWVkYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYS9mcmFnbWVudC90ZXN0L2F0dGFjaC9ob3N0L2EvaW50ZXJuYWwvdGVzdC9UZXN0UGFja2FnZUFjY2VzczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEuaW50ZXJuYWwudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5JVGVzdFJ1bm5lcjsKLQotcHVibGljIGNsYXNzIFRlc3RQYWNrYWdlQWNjZXNzMiBpbXBsZW1lbnRzIElUZXN0UnVubmVyIHsKLQotCXB1YmxpYyBPYmplY3QgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBQYWNrYWdlQWNjZXNzVGVzdDIoKS5wYWNrYWdlTGV2ZWxBY2Nlc3MoVGVzdFBhY2thZ2VBY2Nlc3MyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5iL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY3YWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGZyYWdtZW50IHRlc3QgZnJhZyBhCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBmcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1GcmFnbWVudC1Ib3N0OiBmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5iCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5iL2ZyYWdtZW50L3Rlc3QvYXR0YWNoL2ZyYWcvYi9UZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5iL2ZyYWdtZW50L3Rlc3QvYXR0YWNoL2ZyYWcvYi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTM3NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYi9mcmFnbWVudC90ZXN0L2F0dGFjaC9mcmFnL2IvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEucmVxdWlyZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEucmVxdWlyZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxMjJiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLnJlcXVpcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGZyYWdtZW50IHRlc3QgaG9zdCBhCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEucmVxdWlyZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotUmVxdWlyZS1CdW5kbGU6IGZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS52Mi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEudjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxODliZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS52Mi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGZyYWdtZW50IHRlc3QgaG9zdCBhCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMQotQnVuZGxlLUFjdGl2YXRvcjogZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLkFjdGl2YXRvcjIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS52Mi9mcmFnbWVudC90ZXN0L2F0dGFjaC9ob3N0L2EvQWN0aXZhdG9yMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS52Mi9mcmFnbWVudC90ZXN0L2F0dGFjaC9ob3N0L2EvQWN0aXZhdG9yMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTBlNjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEudjIvZnJhZ21lbnQvdGVzdC9hdHRhY2gvaG9zdC9hL0FjdGl2YXRvcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvcjIgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEudjIvZnJhZ21lbnQvdGVzdC9hdHRhY2gvaG9zdC9hL2ludGVybmFsL3Rlc3QvUGFja2FnZUFjY2Vzc1Rlc3QyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLnYyL2ZyYWdtZW50L3Rlc3QvYXR0YWNoL2hvc3QvYS9pbnRlcm5hbC90ZXN0L1BhY2thZ2VBY2Nlc3NUZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTFlYTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEudjIvZnJhZ21lbnQvdGVzdC9hdHRhY2gvaG9zdC9hL2ludGVybmFsL3Rlc3QvUGFja2FnZUFjY2Vzc1Rlc3QyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLmludGVybmFsLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VBY2Nlc3NUZXN0MiB7Ci0Jdm9pZCBwYWNrYWdlTGV2ZWxBY2Nlc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQoY2xhc3NOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiMTBkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogZnJhZ21lbnQgdGVzdCBob3N0IGEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEuQWN0aXZhdG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEvZnJhZ21lbnQvdGVzdC9hdHRhY2gvaG9zdC9hL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS9mcmFnbWVudC90ZXN0L2F0dGFjaC9ob3N0L2EvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzA5OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2ZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS9mcmFnbWVudC90ZXN0L2F0dGFjaC9ob3N0L2EvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEvZnJhZ21lbnQvdGVzdC9hdHRhY2gvaG9zdC9hL2ludGVybmFsL3Rlc3QvUGFja2FnZUFjY2Vzc1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9mcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEvZnJhZ21lbnQvdGVzdC9hdHRhY2gvaG9zdC9hL2ludGVybmFsL3Rlc3QvUGFja2FnZUFjY2Vzc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwMzk5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hL2ZyYWdtZW50L3Rlc3QvYXR0YWNoL2hvc3QvYS9pbnRlcm5hbC90ZXN0L1BhY2thZ2VBY2Nlc3NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLmludGVybmFsLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VBY2Nlc3NUZXN0IHsKLQl2b2lkIHBhY2thZ2VMZXZlbEFjY2VzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChjbGFzc05hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9ob3N0Lm11bHRpcGxlLmV4cG9ydHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvaG9zdC5tdWx0aXBsZS5leHBvcnRzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzY3MGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9ob3N0Lm11bHRpcGxlLmV4cG9ydHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBob3N0Lm11bHRpcGxlLmV4cG9ydHMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGhvc3QubXVsdGlwbGUuZXhwb3J0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1FeHBvcnQtUGFja2FnZTogaG9zdC5tdWx0aXBsZS5leHBvcnRzOyBpbmNsdWRlOj0iUHVibGljKiIsCi0gaG9zdC5tdWx0aXBsZS5leHBvcnRzLm9ubHlvbmU7Ci0gIHZlcnNpb249MS4wLjA7Ci0gIGluY2x1ZGU6PSJQdWJsaWMqIjsgCi0gIGV4Y2x1ZGU6PSJQdWJsaWNFeGNsdWRlKiI7Ci0gIHVzZXM6PSJob3N0Lm11bHRpcGxlLmV4cG9ydHMiOwotICBtYW50YXRvcnk6PSJ0ZXN0MSI7Ci0gIHRlc3QxPXZhbHVlOwotICB0ZXN0Mj12YWx1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2hvc3QubXVsdGlwbGUuZXhwb3J0cy9ob3N0L211bHRpcGxlL2V4cG9ydHMvUHVibGljQ2xhc3MxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvaG9zdC5tdWx0aXBsZS5leHBvcnRzL2hvc3QvbXVsdGlwbGUvZXhwb3J0cy9QdWJsaWNDbGFzczEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMTcxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvaG9zdC5tdWx0aXBsZS5leHBvcnRzL2hvc3QvbXVsdGlwbGUvZXhwb3J0cy9QdWJsaWNDbGFzczEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBob3N0Lm11bHRpcGxlLmV4cG9ydHM7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaWNDbGFzczEgewotCS8vIG5vdGhpbmcKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9ob3N0Lm11bHRpcGxlLmV4cG9ydHMvaG9zdC9tdWx0aXBsZS9leHBvcnRzL1B1YmxpY0NsYXNzMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2hvc3QubXVsdGlwbGUuZXhwb3J0cy9ob3N0L211bHRpcGxlL2V4cG9ydHMvUHVibGljQ2xhc3MyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzYzMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2hvc3QubXVsdGlwbGUuZXhwb3J0cy9ob3N0L211bHRpcGxlL2V4cG9ydHMvUHVibGljQ2xhc3MyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgaG9zdC5tdWx0aXBsZS5leHBvcnRzOwotCi1wdWJsaWMgY2xhc3MgUHVibGljQ2xhc3MyIHsKLQkvLyBub3RoaW5nCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvaG9zdC5tdWx0aXBsZS5leHBvcnRzL2hvc3QvbXVsdGlwbGUvZXhwb3J0cy9vbmx5b25lL1B1YmxpY0NsYXNzMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2hvc3QubXVsdGlwbGUuZXhwb3J0cy9ob3N0L211bHRpcGxlL2V4cG9ydHMvb25seW9uZS9QdWJsaWNDbGFzczEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkZjA4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvaG9zdC5tdWx0aXBsZS5leHBvcnRzL2hvc3QvbXVsdGlwbGUvZXhwb3J0cy9vbmx5b25lL1B1YmxpY0NsYXNzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGhvc3QubXVsdGlwbGUuZXhwb3J0cy5vbmx5b25lOwotCi1wdWJsaWMgY2xhc3MgUHVibGljQ2xhc3MxIHsKLQkvLyBub3RoaW5nCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5hL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlMWUyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5hL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogTGVnYWN5IHRlc3QKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGxlZ2FjeS5sYXp5c3RhcnQuYQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiAKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBsZWdhY3kubGF6eXN0YXJ0LmEKLUJ1bmRsZS1BY3RpdmF0b3I6IGxlZ2FjeS5sYXp5c3RhcnQuYS5BY3RpdmF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmEvbGVnYWN5L2xhenlzdGFydC9hL0FUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5hL2xlZ2FjeS9sYXp5c3RhcnQvYS9BVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGYzMGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmEvbGVnYWN5L2xhenlzdGFydC9hL0FUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbGVnYWN5LmxhenlzdGFydC5hOwotCi1wdWJsaWMgY2xhc3MgQVRlc3QgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5hL2xlZ2FjeS9sYXp5c3RhcnQvYS9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmEvbGVnYWN5L2xhenlzdGFydC9hL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTVlZDVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmEvbGVnYWN5L2xhenlzdGFydC9hL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGxlZ2FjeS5sYXp5c3RhcnQuYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY29udGV4dC5nZXRCdW5kbGUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5iL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlNWU5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5iL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogTGVnYWN5IHRlc3QKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGxlZ2FjeS5sYXp5c3RhcnQuYgotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiAKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWU7IGV4Y2VwdGlvbnM9ImxlZ2FjeS5sYXp5c3RhcnQuYi5leGNsdWRlZC5hLCBsZWdhY3kubGF6eXN0YXJ0LmIuZXhjbHVkZWQuYiIKLUV4cG9ydC1QYWNrYWdlOiBsZWdhY3kubGF6eXN0YXJ0LmIsCi0gbGVnYWN5LmxhenlzdGFydC5iLmV4Y2x1ZGVkLmEsCi0gbGVnYWN5LmxhenlzdGFydC5iLmV4Y2x1ZGVkLmIKLUJ1bmRsZS1BY3RpdmF0b3I6IGxlZ2FjeS5sYXp5c3RhcnQuYi5BY3RpdmF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmIvbGVnYWN5L2xhenlzdGFydC9iL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYi9sZWdhY3kvbGF6eXN0YXJ0L2IvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDA5OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYi9sZWdhY3kvbGF6eXN0YXJ0L2IvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbGVnYWN5LmxhenlzdGFydC5iOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmIvbGVnYWN5L2xhenlzdGFydC9iL0JUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5iL2xlZ2FjeS9sYXp5c3RhcnQvYi9CVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmNiOWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmIvbGVnYWN5L2xhenlzdGFydC9iL0JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbGVnYWN5LmxhenlzdGFydC5iOwotCi1wdWJsaWMgY2xhc3MgQlRlc3QgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5iL2xlZ2FjeS9sYXp5c3RhcnQvYi9leGNsdWRlZC9hL0JBRXhjbHVkZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmIvbGVnYWN5L2xhenlzdGFydC9iL2V4Y2x1ZGVkL2EvQkFFeGNsdWRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTIzM2M5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmIvbGVnYWN5L2xhenlzdGFydC9iL2V4Y2x1ZGVkL2EvQkFFeGNsdWRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGxlZ2FjeS5sYXp5c3RhcnQuYi5leGNsdWRlZC5hOwotCi1wdWJsaWMgY2xhc3MgQkFFeGNsdWRlZCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmIvbGVnYWN5L2xhenlzdGFydC9iL2V4Y2x1ZGVkL2IvQkJFeGNsdWRlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYi9sZWdhY3kvbGF6eXN0YXJ0L2IvZXhjbHVkZWQvYi9CQkV4Y2x1ZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZWY3ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYi9sZWdhY3kvbGF6eXN0YXJ0L2IvZXhjbHVkZWQvYi9CQkV4Y2x1ZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbGVnYWN5LmxhenlzdGFydC5iLmV4Y2x1ZGVkLmI7Ci0KLXB1YmxpYyBjbGFzcyBCQkV4Y2x1ZGVkIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MzBlY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IExlZ2FjeSB0ZXN0Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBsZWdhY3kubGF6eXN0YXJ0LmMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogCi0gb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiBmYWxzZTsgZXhjZXB0aW9ucz0ibGVnYWN5LmxhenlzdGFydC5jIgotRXhwb3J0LVBhY2thZ2U6IGxlZ2FjeS5sYXp5c3RhcnQuYywKLSBsZWdhY3kubGF6eXN0YXJ0LmMuZXhjbHVkZWQuYSwKLSBsZWdhY3kubGF6eXN0YXJ0LmMuZXhjbHVkZWQuYgotQnVuZGxlLUFjdGl2YXRvcjogbGVnYWN5LmxhenlzdGFydC5jLkFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYy9sZWdhY3kvbGF6eXN0YXJ0L2MvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5jL2xlZ2FjeS9sYXp5c3RhcnQvYy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NDk3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5jL2xlZ2FjeS9sYXp5c3RhcnQvYy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBsZWdhY3kubGF6eXN0YXJ0LmM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgY29udGV4dC5nZXRCdW5kbGUoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYy9sZWdhY3kvbGF6eXN0YXJ0L2MvQ1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmMvbGVnYWN5L2xhenlzdGFydC9jL0NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MTlkNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYy9sZWdhY3kvbGF6eXN0YXJ0L2MvQ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBsZWdhY3kubGF6eXN0YXJ0LmM7Ci0KLXB1YmxpYyBjbGFzcyBDVGVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0LmMvbGVnYWN5L2xhenlzdGFydC9jL2V4Y2x1ZGVkL2EvQ0FFeGNsdWRlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYy9sZWdhY3kvbGF6eXN0YXJ0L2MvZXhjbHVkZWQvYS9DQUV4Y2x1ZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGViZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYy9sZWdhY3kvbGF6eXN0YXJ0L2MvZXhjbHVkZWQvYS9DQUV4Y2x1ZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbGVnYWN5LmxhenlzdGFydC5jLmV4Y2x1ZGVkLmE7Ci0KLXB1YmxpYyBjbGFzcyBDQUV4Y2x1ZGVkIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQuYy9sZWdhY3kvbGF6eXN0YXJ0L2MvZXhjbHVkZWQvYi9DQkV4Y2x1ZGVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5jL2xlZ2FjeS9sYXp5c3RhcnQvYy9leGNsdWRlZC9iL0NCRXhjbHVkZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkM2FlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC5jL2xlZ2FjeS9sYXp5c3RhcnQvYy9leGNsdWRlZC9iL0NCRXhjbHVkZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBsZWdhY3kubGF6eXN0YXJ0LmMuZXhjbHVkZWQuYjsKLQotcHVibGljIGNsYXNzIENCRXhjbHVkZWQgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWRiOTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogTGVnYWN5IHRlc3QKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGxlZ2FjeS5sYXp5c3RhcnQKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogCi0gb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gbGVnYWN5LmxhenlzdGFydC5hLAotIGxlZ2FjeS5sYXp5c3RhcnQuYiwKLSBsZWdhY3kubGF6eXN0YXJ0LmIuZXhjbHVkZWQuYSwKLSBsZWdhY3kubGF6eXN0YXJ0LmIuZXhjbHVkZWQuYiwKLSBsZWdhY3kubGF6eXN0YXJ0LmMsCi0gbGVnYWN5LmxhenlzdGFydC5jLmV4Y2x1ZGVkLmEsCi0gbGVnYWN5LmxhenlzdGFydC5jLmV4Y2x1ZGVkLmIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L2xlZ2FjeS9sYXp5c3RhcnQvRmFsc2VFeGNlcHRpb25MZWdhY3kxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC9sZWdhY3kvbGF6eXN0YXJ0L0ZhbHNlRXhjZXB0aW9uTGVnYWN5MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE3N2Q5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L2xlZ2FjeS9sYXp5c3RhcnQvRmFsc2VFeGNlcHRpb25MZWdhY3kxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbGVnYWN5LmxhenlzdGFydDsKLQotaW1wb3J0IGxlZ2FjeS5sYXp5c3RhcnQuYy5leGNsdWRlZC5hLkNBRXhjbHVkZWQ7Ci1pbXBvcnQgbGVnYWN5LmxhenlzdGFydC5jLmV4Y2x1ZGVkLmIuQ0JFeGNsdWRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuSVRlc3RSdW5uZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYWxzZUV4Y2VwdGlvbkxlZ2FjeTEgaW1wbGVtZW50cyBJVGVzdFJ1bm5lciB7Ci0KLQlwdWJsaWMgT2JqZWN0IHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgQ0FFeGNsdWRlZCgpOwotCQlyZXR1cm4gbmV3IENCRXhjbHVkZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L2xlZ2FjeS9sYXp5c3RhcnQvRmFsc2VFeGNlcHRpb25MZWdhY3kyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC9sZWdhY3kvbGF6eXN0YXJ0L0ZhbHNlRXhjZXB0aW9uTGVnYWN5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzA0NDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L2xlZ2FjeS9sYXp5c3RhcnQvRmFsc2VFeGNlcHRpb25MZWdhY3kyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbGVnYWN5LmxhenlzdGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5JVGVzdFJ1bm5lcjsKLWltcG9ydCBsZWdhY3kubGF6eXN0YXJ0LmMuQ1Rlc3Q7Ci1wdWJsaWMgY2xhc3MgRmFsc2VFeGNlcHRpb25MZWdhY3kyIGltcGxlbWVudHMgSVRlc3RSdW5uZXIgewotCi0JcHVibGljIE9iamVjdCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBDVGVzdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQvbGVnYWN5L2xhenlzdGFydC9TaW1wbGVMZWdhY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L2xlZ2FjeS9sYXp5c3RhcnQvU2ltcGxlTGVnYWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDMyNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL2xlZ2FjeS5sYXp5c3RhcnQvbGVnYWN5L2xhenlzdGFydC9TaW1wbGVMZWdhY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBsZWdhY3kubGF6eXN0YXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLklUZXN0UnVubmVyOwotaW1wb3J0IGxlZ2FjeS5sYXp5c3RhcnQuYS5BVGVzdDsKLQotcHVibGljIGNsYXNzIFNpbXBsZUxlZ2FjeSBpbXBsZW1lbnRzIElUZXN0UnVubmVyIHsKLQotCXB1YmxpYyBPYmplY3QgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQVRlc3QoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L2xlZ2FjeS9sYXp5c3RhcnQvVHJ1ZUV4Y2VwdGlvbkxlZ2FjeTEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L2xlZ2FjeS9sYXp5c3RhcnQvVHJ1ZUV4Y2VwdGlvbkxlZ2FjeTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwM2ZkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC9sZWdhY3kvbGF6eXN0YXJ0L1RydWVFeGNlcHRpb25MZWdhY3kxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbGVnYWN5LmxhenlzdGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5JVGVzdFJ1bm5lcjsKLWltcG9ydCBsZWdhY3kubGF6eXN0YXJ0LmIuZXhjbHVkZWQuYS5CQUV4Y2x1ZGVkOwotaW1wb3J0IGxlZ2FjeS5sYXp5c3RhcnQuYi5leGNsdWRlZC5iLkJCRXhjbHVkZWQ7Ci1wdWJsaWMgY2xhc3MgVHJ1ZUV4Y2VwdGlvbkxlZ2FjeTEgaW1wbGVtZW50cyBJVGVzdFJ1bm5lciB7Ci0KLQlwdWJsaWMgT2JqZWN0IHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgQkFFeGNsdWRlZCgpOwotCQlyZXR1cm4gbmV3IEJCRXhjbHVkZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L2xlZ2FjeS9sYXp5c3RhcnQvVHJ1ZUV4Y2VwdGlvbkxlZ2FjeTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9sZWdhY3kubGF6eXN0YXJ0L2xlZ2FjeS9sYXp5c3RhcnQvVHJ1ZUV4Y2VwdGlvbkxlZ2FjeTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmNzZkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbGVnYWN5LmxhenlzdGFydC9sZWdhY3kvbGF6eXN0YXJ0L1RydWVFeGNlcHRpb25MZWdhY3kyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbGVnYWN5LmxhenlzdGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5JVGVzdFJ1bm5lcjsKLWltcG9ydCBsZWdhY3kubGF6eXN0YXJ0LmIuQlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUcnVlRXhjZXB0aW9uTGVnYWN5MiBpbXBsZW1lbnRzIElUZXN0UnVubmVyIHsKLQotCXB1YmxpYyBPYmplY3QgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQlRlc3QoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmExL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNmVhMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBOYXRpdmVCdW5kbGUgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogTmF0aXZlQnVuZGxlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG5hdGl2ZXRlc3QuYTEuQWN0aXZhdG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcwotQnVuZGxlLU5hdGl2ZUNvZGU6IG5hdGl2ZWZpbGUxLnR4dDsKLSBwcm9jZXNzb3I9cHBjNjQ7Ci0gcHJvY2Vzc29yPXBwYzsKLSBvc25hbWU9QUlYLAotIG5hdGl2ZWZpbGUxLnR4dDsKLSBwcm9jZXNzb3I9UEFfUklTQzsKLSBwcm9jZXNzb3I9UEFfUklTQzIuMDsKLSBvc25hbWU9SFAtVVgsCi0gbmF0aXZlZmlsZTEudHh0OwotIHByb2Nlc3Nvcj1JQTY0TjsKLSBvc25hbWU9SFAtVVgsCi0gbmF0aXZlZmlsZTEudHh0OwotIHByb2Nlc3Nvcj14ODY7Ci0gcHJvY2Vzc29yPXg4Nl82NDsKLSBvc25hbWU9TGludXgsCi0gbmF0aXZlZmlsZTEudHh0OwotIHByb2Nlc3Nvcj1wcGM2NDsKLSBwcm9jZXNzb3I9cHBjOwotIG9zbmFtZT1MaW51eCwKLSBuYXRpdmVmaWxlMS50eHQ7Ci0gcHJvY2Vzc29yPXMzOTA7Ci0gcHJvY2Vzc29yPXMzOTB4OwotIG9zbmFtZT1MaW51eCwKLSBuYXRpdmVmaWxlMS50eHQ7Ci0gcHJvY2Vzc29yPVNwYXJjOwotIG9zbmFtZT1Tb2xhcmlzOwotIG9zbmFtZT1TdW5PUywKLSBuYXRpdmVmaWxlMS50eHQ7Ci0gcHJvY2Vzc29yPXg4NjsKLSBwcm9jZXNzb3I9eDg2XzY0OwotIG9zbmFtZT1XaW5kb3dzMjAwMDsKLSBvc25hbWU9IldpbmRvd3MgMjAwMyI7Ci0gb3NuYW1lPVdpbmRvd3M5NTsKLSBvc25hbWU9V2luZG93czk4OwotIG9zbmFtZT1XaW5kb3dzTlQ7Ci0gb3NuYW1lPVdpbmRvd3NYUDsKLSBvc25hbWU9IldpbmRvd3MgTlQgKHVua25vd24pIjsKLSBvc25hbWU9IldpbmRvd3MgVmlzdGEiOwotIG9zbmFtZT1XaW4zMiwKLSBuYXRpdmVmaWxlMS50eHQ7Ci0gcHJvY2Vzc29yPXg4NjsKLSBwcm9jZXNzb3I9eDg2XzY0OwotIHByb2Nlc3Nvcj1wcGM7Ci0gb3NuYW1lPW1hY29zeApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTEvbmF0aXZlZmlsZTEudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTEvbmF0aXZlZmlsZTEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE2MDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmExL25hdGl2ZWZpbGUxLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5hMS9uYXRpdmV0ZXN0L2ExL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTEvbmF0aXZldGVzdC9hMS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlMTkyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5hMS9uYXRpdmV0ZXN0L2ExL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG5hdGl2ZXRlc3QuYTE7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2QgZmluZExpYnJhcnkgPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZmluZExpYnJhcnkiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzfSk7Ci0JCWZpbmRMaWJyYXJ5LnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChmaW5kTGlicmFyeS5pbnZva2UodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXSB7Im5hdGl2ZWZpbGUxLnR4dCJ9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmEyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYzlmN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBOYXRpdmVCdW5kbGUgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogTmF0aXZlQnVuZGxlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG5hdGl2ZXRlc3QuYTIuQWN0aXZhdG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcwotQnVuZGxlLU5hdGl2ZUNvZGU6IG5hdGl2ZWZpbGUyLnR4dDsKLSBwcm9jZXNzb3I9cHBjNjQ7Ci0gcHJvY2Vzc29yPXBwYzsKLSBvc25hbWU9QUlYLAotIG5hdGl2ZWZpbGUyLnR4dDsKLSBwcm9jZXNzb3I9UEFfUklTQzsKLSBwcm9jZXNzb3I9UEFfUklTQzIuMDsKLSBvc25hbWU9SFAtVVgsCi0gbmF0aXZlZmlsZTIudHh0OwotIHByb2Nlc3Nvcj1JQTY0TjsKLSBvc25hbWU9SFAtVVgsCi0gbmF0aXZlZmlsZTIudHh0OwotIHByb2Nlc3Nvcj14ODY7Ci0gcHJvY2Vzc29yPXg4Nl82NDsKLSBvc25hbWU9TGludXgsCi0gbmF0aXZlZmlsZTIudHh0OwotIHByb2Nlc3Nvcj1wcGM2NDsKLSBwcm9jZXNzb3I9cHBjOwotIG9zbmFtZT1MaW51eCwKLSBuYXRpdmVmaWxlMi50eHQ7Ci0gcHJvY2Vzc29yPXMzOTA7Ci0gcHJvY2Vzc29yPXMzOTB4OwotIG9zbmFtZT1MaW51eCwKLSBuYXRpdmVmaWxlMi50eHQ7Ci0gcHJvY2Vzc29yPVNwYXJjOwotIG9zbmFtZT1Tb2xhcmlzOwotIG9zbmFtZT1TdW5PUywKLSBuYXRpdmVmaWxlMi50eHQ7Ci0gcHJvY2Vzc29yPXg4NjsKLSBwcm9jZXNzb3I9eDg2XzY0OwotIG9zbmFtZT1XaW5kb3dzMjAwMDsKLSBvc25hbWU9IldpbmRvd3MgMjAwMyI7Ci0gb3NuYW1lPVdpbmRvd3M5NTsKLSBvc25hbWU9V2luZG93czk4OwotIG9zbmFtZT1XaW5kb3dzTlQ7Ci0gb3NuYW1lPVdpbmRvd3NYUDsKLSBvc25hbWU9IldpbmRvd3MgTlQgKHVua25vd24pIjsKLSBvc25hbWU9IldpbmRvd3MgVmlzdGEiOwotIG9zbmFtZT1XaW4zMiwKLSBuYXRpdmVmaWxlMi50eHQ7Ci0gcHJvY2Vzc29yPXg4NjsKLSBwcm9jZXNzb3I9eDg2XzY0OwotIHByb2Nlc3Nvcj1wcGM7Ci0gb3NuYW1lPW1hY29zeApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTIvbmF0aXZlZmlsZTIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTIvbmF0aXZlZmlsZTIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE2MDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmEyL25hdGl2ZWZpbGUyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5hMi9uYXRpdmV0ZXN0L2EyL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYTIvbmF0aXZldGVzdC9hMi9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyYmNkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5hMi9uYXRpdmV0ZXN0L2EyL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG5hdGl2ZXRlc3QuYTI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2QgZmluZExpYnJhcnkgPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZmluZExpYnJhcnkiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzfSk7Ci0JCWZpbmRMaWJyYXJ5LnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChmaW5kTGlicmFyeS5pbnZva2UodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXSB7Im5hdGl2ZWZpbGUyLnR4dCJ9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmIxL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYjEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTJlYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYjEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBOYXRpdmVCdW5kbGUgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogTmF0aXZlQnVuZGxlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG5hdGl2ZXRlc3QuYjEuQWN0aXZhdG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcwotQnVuZGxlLU5hdGl2ZUNvZGU6IG5hdGl2ZWZpbGUudHh0OwotIHByb2Nlc3Nvcj1wcGM2NDsKLSBwcm9jZXNzb3I9cHBjOwotIG9zbmFtZT1BSVgsCi0gbmF0aXZlZmlsZS50eHQ7Ci0gcHJvY2Vzc29yPVBBX1JJU0M7Ci0gcHJvY2Vzc29yPVBBX1JJU0MyLjA7Ci0gb3NuYW1lPUhQLVVYLAotIG5hdGl2ZWZpbGUudHh0OwotIHByb2Nlc3Nvcj1JQTY0TjsKLSBvc25hbWU9SFAtVVgsCi0gbmF0aXZlZmlsZS50eHQ7Ci0gcHJvY2Vzc29yPXg4NjsKLSBwcm9jZXNzb3I9eDg2XzY0OwotIG9zbmFtZT1MaW51eCwKLSBuYXRpdmVmaWxlLnR4dDsKLSBwcm9jZXNzb3I9cHBjNjQ7Ci0gcHJvY2Vzc29yPXBwYzsKLSBvc25hbWU9TGludXgsCi0gbmF0aXZlZmlsZS50eHQ7Ci0gcHJvY2Vzc29yPXMzOTA7Ci0gcHJvY2Vzc29yPXMzOTB4OwotIG9zbmFtZT1MaW51eCwKLSBuYXRpdmVmaWxlLnR4dDsKLSBwcm9jZXNzb3I9U3BhcmM7Ci0gb3NuYW1lPVNvbGFyaXM7Ci0gb3NuYW1lPVN1bk9TLAotIG5hdGl2ZWZpbGUudHh0OwotIHByb2Nlc3Nvcj14ODY7Ci0gcHJvY2Vzc29yPXg4Nl82NDsKLSBvc25hbWU9V2luZG93czIwMDA7Ci0gb3NuYW1lPSJXaW5kb3dzIDIwMDMiOwotIG9zbmFtZT1XaW5kb3dzOTU7Ci0gb3NuYW1lPVdpbmRvd3M5ODsKLSBvc25hbWU9V2luZG93c05UOwotIG9zbmFtZT1XaW5kb3dzWFA7Ci0gb3NuYW1lPSJXaW5kb3dzIE5UICh1bmtub3duKSI7Ci0gb3NuYW1lPSJXaW5kb3dzIFZpc3RhIjsKLSBvc25hbWU9V2luMzIsCi0gbmF0aXZlZmlsZS50eHQ7Ci0gcHJvY2Vzc29yPXg4NjsKLSBwcm9jZXNzb3I9eDg2XzY0OwotIHByb2Nlc3Nvcj1wcGM7Ci0gb3NuYW1lPW1hY29zeApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYjEvbmF0aXZlZmlsZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5iMS9uYXRpdmVmaWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhNjA1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5iMS9uYXRpdmVmaWxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5iMS9uYXRpdmV0ZXN0L2IxL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYjEvbmF0aXZldGVzdC9iMS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkN2M2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5iMS9uYXRpdmV0ZXN0L2IxL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG5hdGl2ZXRlc3QuYjE7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2QgZmluZExpYnJhcnkgPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZmluZExpYnJhcnkiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzfSk7Ci0JCWZpbmRMaWJyYXJ5LnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChmaW5kTGlicmFyeS5pbnZva2UodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXSB7Im5hdGl2ZWZpbGUudHh0In0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5iMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3ZmQxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5iMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IE5hdGl2ZUJ1bmRsZSBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBOYXRpdmVCdW5kbGUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMAotQnVuZGxlLUFjdGl2YXRvcjogbmF0aXZldGVzdC5iMi5BY3RpdmF0b3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzCi1CdW5kbGUtTmF0aXZlQ29kZTogbmF0aXZlZmlsZS50eHQ7Ci0gcHJvY2Vzc29yPXBwYzY0OwotIHByb2Nlc3Nvcj1wcGM7Ci0gb3NuYW1lPUFJWCwKLSBuYXRpdmVmaWxlLnR4dDsKLSBwcm9jZXNzb3I9UEFfUklTQzsKLSBwcm9jZXNzb3I9UEFfUklTQzIuMDsKLSBvc25hbWU9SFAtVVgsCi0gbmF0aXZlZmlsZS50eHQ7Ci0gcHJvY2Vzc29yPUlBNjROOwotIG9zbmFtZT1IUC1VWCwKLSBuYXRpdmVmaWxlLnR4dDsKLSBwcm9jZXNzb3I9eDg2OwotIHByb2Nlc3Nvcj14ODZfNjQ7Ci0gb3NuYW1lPUxpbnV4LAotIG5hdGl2ZWZpbGUudHh0OwotIHByb2Nlc3Nvcj1wcGM2NDsKLSBwcm9jZXNzb3I9cHBjOwotIG9zbmFtZT1MaW51eCwKLSBuYXRpdmVmaWxlLnR4dDsKLSBwcm9jZXNzb3I9czM5MDsKLSBwcm9jZXNzb3I9czM5MHg7Ci0gb3NuYW1lPUxpbnV4LAotIG5hdGl2ZWZpbGUudHh0OwotIHByb2Nlc3Nvcj1TcGFyYzsKLSBvc25hbWU9U29sYXJpczsKLSBvc25hbWU9U3VuT1MsCi0gbmF0aXZlZmlsZS50eHQ7Ci0gcHJvY2Vzc29yPXg4NjsKLSBwcm9jZXNzb3I9eDg2XzY0OwotIG9zbmFtZT1XaW5kb3dzMjAwMDsKLSBvc25hbWU9IldpbmRvd3MgMjAwMyI7Ci0gb3NuYW1lPVdpbmRvd3M5NTsKLSBvc25hbWU9V2luZG93czk4OwotIG9zbmFtZT1XaW5kb3dzTlQ7Ci0gb3NuYW1lPVdpbmRvd3NYUDsKLSBvc25hbWU9IldpbmRvd3MgTlQgKHVua25vd24pIjsKLSBvc25hbWU9IldpbmRvd3MgVmlzdGEiOwotIG9zbmFtZT1XaW4zMiwKLSBuYXRpdmVmaWxlLnR4dDsKLSBwcm9jZXNzb3I9eDg2OwotIHByb2Nlc3Nvcj14ODZfNjQ7Ci0gcHJvY2Vzc29yPXBwYzsKLSBvc25hbWU9bWFjb3N4CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5iMi9uYXRpdmVmaWxlLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmIyL25hdGl2ZWZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE2MDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmIyL25hdGl2ZWZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmIyL25hdGl2ZXRlc3QvYjIvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5iMi9uYXRpdmV0ZXN0L2IyL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzYxMGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmIyL25hdGl2ZXRlc3QvYjIvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgbmF0aXZldGVzdC5iMjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCBmaW5kTGlicmFyeSA9IENsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJmaW5kTGlicmFyeSIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsKLQkJZmluZExpYnJhcnkuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KGZpbmRMaWJyYXJ5Lmludm9rZSh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgbmV3IE9iamVjdFtdIHsibmF0aXZlZmlsZS50eHQifSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5jL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiNDkyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5jL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogTmF0aXZlQnVuZGxlIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG5hdGl2ZXRlc3QuYwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBuYXRpdmV0ZXN0LmMuQWN0aXZhdG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcwotQnVuZGxlLU5hdGl2ZUNvZGU6IAotIGxpYnMvdGVzdDEvbmF0aXZlY29kZS50eHQ7Ci0gIHNlbGVjdGlvbi1maWx0ZXI9IihuYXRpdmVjb2RldGVzdD0xKSIsCi0gbGlicy90ZXN0Mi9uYXRpdmVjb2RlLnR4dDsKLSAgc2VsZWN0aW9uLWZpbHRlcj0iKG5hdGl2ZWNvZGV0ZXN0PTEpIiwKLSBsaWJzL3Rlc3QzL25hdGl2ZWNvZGUudHh0OwotICBzZWxlY3Rpb24tZmlsdGVyPSIobmF0aXZlY29kZXRlc3Q9MSkiLAotIGxpYnMvdGVzdDEvbmF0aXZlY29kZS50eHQ7Ci0gIHNlbGVjdGlvbi1maWx0ZXI9IihuYXRpdmVjb2RldGVzdD0yKSIsCi0gbGlicy90ZXN0Mi9uYXRpdmVjb2RlLnR4dDsKLSAgc2VsZWN0aW9uLWZpbHRlcj0iKG5hdGl2ZWNvZGV0ZXN0PTIpIiwKLSBsaWJzL3Rlc3QzL25hdGl2ZWNvZGUudHh0OwotICBvc3ZlcnNpb249IjAuMC4xIjsKLSAgc2VsZWN0aW9uLWZpbHRlcj0iKG5hdGl2ZWNvZGV0ZXN0PTIpIiwKLSBsaWJzL3Rlc3QxL25hdGl2ZWNvZGUudHh0OwotICBzZWxlY3Rpb24tZmlsdGVyPSIobmF0aXZlY29kZXRlc3Q9MykiLAotIGxpYnMvdGVzdDIvbmF0aXZlY29kZS50eHQ7Ci0gIG9zdmVyc2lvbj0iMC4wLjEiOwotICBsYW5ndWFnZT0iZW4iOwotICBzZWxlY3Rpb24tZmlsdGVyPSIobmF0aXZlY29kZXRlc3Q9MykiLAotIGxpYnMvdGVzdDMvbmF0aXZlY29kZS50eHQ7Ci0gIG9zdmVyc2lvbj0iMC4wLjEiOwotICBsYW5ndWFnZT0iZW4iOwotICBzZWxlY3Rpb24tZmlsdGVyPSIobmF0aXZlY29kZXRlc3Q9MykiLAotIGxpYnMvdGVzdDQvbmF0aXZlY29kZS50eHQ7Ci0gIHNlbGVjdGlvbi1maWx0ZXI9IihuYXRpdmVjb2RldGVzdD00KSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmMvbGlicy90ZXN0MS9uYXRpdmVjb2RlLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmMvbGlicy90ZXN0MS9uYXRpdmVjb2RlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0ZTdiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5jL2xpYnMvdGVzdDEvbmF0aXZlY29kZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1saWJzLnRlc3QxCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5jL2xpYnMvdGVzdDIvbmF0aXZlY29kZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5jL2xpYnMvdGVzdDIvbmF0aXZlY29kZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYzE3ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYy9saWJzL3Rlc3QyL25hdGl2ZWNvZGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotbGlicy50ZXN0MgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYy9saWJzL3Rlc3QzL25hdGl2ZWNvZGUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuYy9saWJzL3Rlc3QzL25hdGl2ZWNvZGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzY0M2YzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmMvbGlicy90ZXN0My9uYXRpdmVjb2RlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWxpYnMudGVzdDMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5jL25hdGl2ZXRlc3QvYy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmMvbmF0aXZldGVzdC9jL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzc3NzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmMvbmF0aXZldGVzdC9jL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG5hdGl2ZXRlc3QuYzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCBmaW5kTGlicmFyeSA9IENsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJmaW5kTGlicmFyeSIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsKLQkJZmluZExpYnJhcnkuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KGZpbmRMaWJyYXJ5Lmludm9rZSh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgbmV3IE9iamVjdFtdIHsibmF0aXZlY29kZS50eHQifSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9uYXRpdmV0ZXN0LmQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNWJkNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuZC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IE5hdGl2ZUJ1bmRsZSBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBuYXRpdmV0ZXN0LmQKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogbmF0aXZldGVzdC5kLkFjdGl2YXRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMKLUJ1bmRsZS1OYXRpdmVDb2RlOiAKLSBsaWJzL3Rlc3QxL25hdGl2ZWNvZGUudHh0OwotICBzZWxlY3Rpb24tZmlsdGVyPSIobmF0aXZlY29kZXRlc3Q9d2lsbG5vdHJlc29sdmUpIiwKLSAqCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5kL2xpYnMvdGVzdDEvbmF0aXZlY29kZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5kL2xpYnMvdGVzdDEvbmF0aXZlY29kZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGU3YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuZC9saWJzL3Rlc3QxL25hdGl2ZWNvZGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotbGlicy50ZXN0MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL25hdGl2ZXRlc3QuZC9uYXRpdmV0ZXN0L2QvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5kL25hdGl2ZXRlc3QvZC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5YzJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvbmF0aXZldGVzdC5kL25hdGl2ZXRlc3QvZC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBuYXRpdmV0ZXN0LmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2QgZmluZExpYnJhcnkgPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZmluZExpYnJhcnkiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzfSk7Ci0JCWZpbmRMaWJyYXJ5LnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChmaW5kTGlicmFyeS5pbnZva2UodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXSB7Im5hdGl2ZWNvZGUudHh0In0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5hL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmMxMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBvc2dpIHRlc3QKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9zZ2kubGF6eXN0YXJ0LmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogCi0gb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3NnaS5sYXp5c3RhcnQuYQotQnVuZGxlLUFjdGl2YXRvcjogb3NnaS5sYXp5c3RhcnQuYS5BY3RpdmF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5hL29zZ2kvbGF6eXN0YXJ0L2EvQVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5hL29zZ2kvbGF6eXN0YXJ0L2EvQVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYzUxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYS9vc2dpL2xhenlzdGFydC9hL0FUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3NnaS5sYXp5c3RhcnQuYTsKLQotcHVibGljIGNsYXNzIEFUZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmEvb3NnaS9sYXp5c3RhcnQvYS9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5hL29zZ2kvbGF6eXN0YXJ0L2EvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZDFkNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmEvb3NnaS9sYXp5c3RhcnQvYS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvc2dpLmxhenlzdGFydC5hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5iL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZWQ2YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBvc2dpIHRlc3QKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9zZ2kubGF6eXN0YXJ0LmIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogCi0gb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5OyBleGNsdWRlOj0ib3NnaS5sYXp5c3RhcnQuYi5leGNsdWRlZC5hLCBvc2dpLmxhenlzdGFydC5iLmV4Y2x1ZGVkLmIiCi1FeHBvcnQtUGFja2FnZTogb3NnaS5sYXp5c3RhcnQuYiwKLSBvc2dpLmxhenlzdGFydC5iLmV4Y2x1ZGVkLmEsCi0gb3NnaS5sYXp5c3RhcnQuYi5leGNsdWRlZC5iCi1CdW5kbGUtQWN0aXZhdG9yOiBvc2dpLmxhenlzdGFydC5iLkFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmIvb3NnaS9sYXp5c3RhcnQvYi9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5iL29zZ2kvbGF6eXN0YXJ0L2IvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYzk3YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmIvb3NnaS9sYXp5c3RhcnQvYi9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvc2dpLmxhenlzdGFydC5iOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5iL29zZ2kvbGF6eXN0YXJ0L2IvQlRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5iL29zZ2kvbGF6eXN0YXJ0L2IvQlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmZjAzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYi9vc2dpL2xhenlzdGFydC9iL0JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3NnaS5sYXp5c3RhcnQuYjsKLQotcHVibGljIGNsYXNzIEJUZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmIvb3NnaS9sYXp5c3RhcnQvYi9leGNsdWRlZC9hL0JBRXhjbHVkZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5iL29zZ2kvbGF6eXN0YXJ0L2IvZXhjbHVkZWQvYS9CQUV4Y2x1ZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNGJmOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmIvb3NnaS9sYXp5c3RhcnQvYi9leGNsdWRlZC9hL0JBRXhjbHVkZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvc2dpLmxhenlzdGFydC5iLmV4Y2x1ZGVkLmE7Ci0KLXB1YmxpYyBjbGFzcyBCQUV4Y2x1ZGVkIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmIvb3NnaS9sYXp5c3RhcnQvYi9leGNsdWRlZC9iL0JCRXhjbHVkZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5iL29zZ2kvbGF6eXN0YXJ0L2IvZXhjbHVkZWQvYi9CQkV4Y2x1ZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMWRmOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmIvb3NnaS9sYXp5c3RhcnQvYi9leGNsdWRlZC9iL0JCRXhjbHVkZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvc2dpLmxhenlzdGFydC5iLmV4Y2x1ZGVkLmI7Ci0KLXB1YmxpYyBjbGFzcyBCQkV4Y2x1ZGVkIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4OTFjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IG9zZ2kgdGVzdAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3NnaS5sYXp5c3RhcnQuYwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiAKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenk7IGluY2x1ZGU6PSJvc2dpLmxhenlzdGFydC5jIgotRXhwb3J0LVBhY2thZ2U6IG9zZ2kubGF6eXN0YXJ0LmMsCi0gb3NnaS5sYXp5c3RhcnQuYy5leGNsdWRlZC5hLAotIG9zZ2kubGF6eXN0YXJ0LmMuZXhjbHVkZWQuYgotQnVuZGxlLUFjdGl2YXRvcjogb3NnaS5sYXp5c3RhcnQuYy5BY3RpdmF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5jL29zZ2kvbGF6eXN0YXJ0L2MvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYy9vc2dpL2xhenlzdGFydC9jL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDI2Yjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5jL29zZ2kvbGF6eXN0YXJ0L2MvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3NnaS5sYXp5c3RhcnQuYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY29udGV4dC5nZXRCdW5kbGUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYy9vc2dpL2xhenlzdGFydC9jL0NUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYy9vc2dpL2xhenlzdGFydC9jL0NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzEyNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0LmMvb3NnaS9sYXp5c3RhcnQvYy9DVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9zZ2kubGF6eXN0YXJ0LmM7Ci0KLXB1YmxpYyBjbGFzcyBDVGVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5jL29zZ2kvbGF6eXN0YXJ0L2MvZXhjbHVkZWQvYS9DQUV4Y2x1ZGVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYy9vc2dpL2xhenlzdGFydC9jL2V4Y2x1ZGVkL2EvQ0FFeGNsdWRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTA1NWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5jL29zZ2kvbGF6eXN0YXJ0L2MvZXhjbHVkZWQvYS9DQUV4Y2x1ZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3NnaS5sYXp5c3RhcnQuYy5leGNsdWRlZC5hOwotCi1wdWJsaWMgY2xhc3MgQ0FFeGNsdWRlZCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5jL29zZ2kvbGF6eXN0YXJ0L2MvZXhjbHVkZWQvYi9DQkV4Y2x1ZGVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQuYy9vc2dpL2xhenlzdGFydC9jL2V4Y2x1ZGVkL2IvQ0JFeGNsdWRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTY0MDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC5jL29zZ2kvbGF6eXN0YXJ0L2MvZXhjbHVkZWQvYi9DQkV4Y2x1ZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3NnaS5sYXp5c3RhcnQuYy5leGNsdWRlZC5iOwotCi1wdWJsaWMgY2xhc3MgQ0JFeGNsdWRlZCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4Y2Y0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBvc2dpIGxhenkgdGVzdAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3NnaS5sYXp5c3RhcnQKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogCi0gb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3NnaS5sYXp5c3RhcnQuYSwKLSBvc2dpLmxhenlzdGFydC5iLAotIG9zZ2kubGF6eXN0YXJ0LmIuZXhjbHVkZWQuYSwKLSBvc2dpLmxhenlzdGFydC5iLmV4Y2x1ZGVkLmIsCi0gb3NnaS5sYXp5c3RhcnQuYywKLSBvc2dpLmxhenlzdGFydC5jLmV4Y2x1ZGVkLmEsCi0gb3NnaS5sYXp5c3RhcnQuYy5leGNsdWRlZC5iCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQvb3NnaS9sYXp5c3RhcnQvTGF6eUV4Y2x1ZGUxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQvb3NnaS9sYXp5c3RhcnQvTGF6eUV4Y2x1ZGUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhM2Y3ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0L29zZ2kvbGF6eXN0YXJ0L0xhenlFeGNsdWRlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9zZ2kubGF6eXN0YXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLklUZXN0UnVubmVyOwotaW1wb3J0IG9zZ2kubGF6eXN0YXJ0LmIuZXhjbHVkZWQuYS5CQUV4Y2x1ZGVkOwotaW1wb3J0IG9zZ2kubGF6eXN0YXJ0LmIuZXhjbHVkZWQuYi5CQkV4Y2x1ZGVkOwotcHVibGljIGNsYXNzIExhenlFeGNsdWRlMSBpbXBsZW1lbnRzIElUZXN0UnVubmVyIHsKLQotCXB1YmxpYyBPYmplY3QgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBCQUV4Y2x1ZGVkKCk7Ci0JCXJldHVybiBuZXcgQkJFeGNsdWRlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0L29zZ2kvbGF6eXN0YXJ0L0xhenlFeGNsdWRlMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0L29zZ2kvbGF6eXN0YXJ0L0xhenlFeGNsdWRlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjEwMmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC9vc2dpL2xhenlzdGFydC9MYXp5RXhjbHVkZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvc2dpLmxhenlzdGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5JVGVzdFJ1bm5lcjsKLWltcG9ydCBvc2dpLmxhenlzdGFydC5iLkJUZXN0OwotCi1wdWJsaWMgY2xhc3MgTGF6eUV4Y2x1ZGUyIGltcGxlbWVudHMgSVRlc3RSdW5uZXIgewotCi0JcHVibGljIE9iamVjdCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBCVGVzdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0L29zZ2kvbGF6eXN0YXJ0L0xhenlJbmNsdWRlMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0L29zZ2kvbGF6eXN0YXJ0L0xhenlJbmNsdWRlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzQ2ZmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC9vc2dpL2xhenlzdGFydC9MYXp5SW5jbHVkZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvc2dpLmxhenlzdGFydDsKLQotaW1wb3J0IG9zZ2kubGF6eXN0YXJ0LmMuZXhjbHVkZWQuYS5DQUV4Y2x1ZGVkOwotaW1wb3J0IG9zZ2kubGF6eXN0YXJ0LmMuZXhjbHVkZWQuYi5DQkV4Y2x1ZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5JVGVzdFJ1bm5lcjsKLQotcHVibGljIGNsYXNzIExhenlJbmNsdWRlMSBpbXBsZW1lbnRzIElUZXN0UnVubmVyIHsKLQotCXB1YmxpYyBPYmplY3QgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBDQUV4Y2x1ZGVkKCk7Ci0JCXJldHVybiBuZXcgQ0JFeGNsdWRlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0L29zZ2kvbGF6eXN0YXJ0L0xhenlJbmNsdWRlMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL29zZ2kubGF6eXN0YXJ0L29zZ2kvbGF6eXN0YXJ0L0xhenlJbmNsdWRlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk2MDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC9vc2dpL2xhenlzdGFydC9MYXp5SW5jbHVkZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvc2dpLmxhenlzdGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5JVGVzdFJ1bm5lcjsKLWltcG9ydCBvc2dpLmxhenlzdGFydC5jLkNUZXN0OwotcHVibGljIGNsYXNzIExhenlJbmNsdWRlMiBpbXBsZW1lbnRzIElUZXN0UnVubmVyIHsKLQotCXB1YmxpYyBPYmplY3QgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQ1Rlc3QoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC9vc2dpL2xhenlzdGFydC9MYXp5U2ltcGxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvb3NnaS5sYXp5c3RhcnQvb3NnaS9sYXp5c3RhcnQvTGF6eVNpbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQ5OGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9vc2dpLmxhenlzdGFydC9vc2dpL2xhenlzdGFydC9MYXp5U2ltcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3NnaS5sYXp5c3RhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuSVRlc3RSdW5uZXI7Ci1pbXBvcnQgb3NnaS5sYXp5c3RhcnQuYS5BVGVzdDsKLQotcHVibGljIGNsYXNzIExhenlTaW1wbGUgaW1wbGVtZW50cyBJVGVzdFJ1bm5lciB7Ci0KLQlwdWJsaWMgT2JqZWN0IHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEFUZXN0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYS5mcmFnLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYS5mcmFnLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2VhMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3NlY3VyaXR5LmEuZnJhZy5hL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgc2VjdXJpdHkuYS5mcmFnLmEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHNlY3VyaXR5LmEuZnJhZy5hCi1GcmFnbWVudC1Ib3N0OiBzZWN1cml0eS5hCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5hLmZyYWcuYS9yZXNvdXJjZXMvSG9zdE1hbmlmZXN0X2VuX1VTLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYS5mcmFnLmEvcmVzb3VyY2VzL0hvc3RNYW5pZmVzdF9lbl9VUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAzMTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5hLmZyYWcuYS9yZXNvdXJjZXMvSG9zdE1hbmlmZXN0X2VuX1VTLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zZWN1cml0eS5hPWVuX1VTCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYS5mcmFnLmEvcmVzb3VyY2VzL2ZyYWcuYS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYS5mcmFnLmEvcmVzb3VyY2VzL2ZyYWcuYS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NDE1MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3NlY3VyaXR5LmEuZnJhZy5hL3Jlc291cmNlcy9mcmFnLmEudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2VjdXJpdHkuYS5mcmFnLmEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5hL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3NlY3VyaXR5LmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjY2MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3NlY3VyaXR5LmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICAlc2VjdXJpdHkuYQotQnVuZGxlLVN5bWJvbGljTmFtZTogc2VjdXJpdHkuYQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrCi1CdW5kbGUtQWN0aXZhdG9yOiBzZWN1cml0eS5hLkFjdGl2YXRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcmVzb3VyY2VzL0hvc3RNYW5pZmVzdAotRXhwb3J0LVBhY2thZ2U6IHNlY3VyaXR5LmEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5hL3Jlc291cmNlcy9Ib3N0TWFuaWZlc3QucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5hL3Jlc291cmNlcy9Ib3N0TWFuaWZlc3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjMTFjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYS9yZXNvdXJjZXMvSG9zdE1hbmlmZXN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zZWN1cml0eS5hPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5hL3NlY3VyaXR5L2EvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYS9zZWN1cml0eS9hL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTgxMDk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5hL3NlY3VyaXR5L2EvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc2VjdXJpdHkuYTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlFbnVtZXJhdGlvbiB1cmxzID0gY29udGV4dC5nZXRCdW5kbGUoKS5maW5kRW50cmllcygicmVzb3VyY2VzIiwgImZyYWcuYS50eHQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWlmICh1cmxzID09IG51bGwgfHwgIXVybHMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJEaWQgbm90IGZpbmQgYW55IHJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh1cmxzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlVUkwgdXJsID0gKFVSTCkgdXJscy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKHVybCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBVUkwgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3NlY3VyaXR5LmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0NTVhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogc2VjdXJpdHkuYgotQnVuZGxlLVN5bWJvbGljTmFtZTogc2VjdXJpdHkuYgotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiBzZWN1cml0eS5iLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5iL09TR0ktSU5GL3Blcm1pc3Npb25zLnBlcm0gYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc2VjdXJpdHkuYi9PU0dJLUlORi9wZXJtaXNzaW9ucy5wZXJtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTYyMjA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5iL09TR0ktSU5GL3Blcm1pc3Npb25zLnBlcm0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLShvcmcub3NnaS5mcmFtZXdvcmsuUGFja2FnZVBlcm1pc3Npb24gIm9yZy5vc2dpLmZyYW1ld29yayIgImltcG9ydCIpCi0ob3JnLm9zZ2kuZnJhbWV3b3JrLkFkbWluUGVybWlzc2lvbiAiKiIgIioiKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3NlY3VyaXR5LmIvc2VjdXJpdHkvYi9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zZWN1cml0eS5iL3NlY3VyaXR5L2IvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODhiNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3NlY3VyaXR5LmIvc2VjdXJpdHkvYi9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBQcm9TeXN0IFNvZnR3YXJlIEdtYkggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIHNlY3VyaXR5LmI7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgYmM7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBidW5kbGUgVGVzdDIhISIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgbWFuYWdlcjogIiArIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5iYyA9IGNvbnRleHQ7Ci0JCWRvVGVzdEFjdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9wcGluZyBidW5kbGUgVGVzdDIhISIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvVGVzdEFjdGlvbigpIHsKLQkJQnVuZGxlW10gYnVuZGxlcyA9IGJjLmdldEJ1bmRsZXMoKTsKLQkJQnVuZGxlIHRoaXNCdW5kbGUgPSBiYy5nZXRCdW5kbGUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpc0J1bmRsZS5nZXRCdW5kbGVJZCgpICE9IGJ1bmRsZXNbaV0uZ2V0QnVuZGxlSWQoKSkgewotCQkJCWNoZWNrQnVuZGxlKGJ1bmRsZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLQkJYnVuZGxlLmdldEhlYWRlcnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYS5mcmFnL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmEuZnJhZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiM2RhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYS5mcmFnL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgc3Vic3RpdHV0ZXMuYS5mcmFnCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBzdWJzdGl0dXRlcy5hLmZyYWcKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRnJhZ21lbnQtSG9zdDogc3Vic3RpdHV0ZXMuYQotRXhwb3J0LVBhY2thZ2U6IHN1YnN0aXR1dGVzLnE7IHZlcnNpb249MS4wCi1JbXBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMucTsgdmVyc2lvbj0iWzEuMCwyLjApIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmEuZnJhZy9zdWJzdGl0dXRlcy9xL0FGcS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmEuZnJhZy9zdWJzdGl0dXRlcy9xL0FGcS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY4MzdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5hLmZyYWcvc3Vic3RpdHV0ZXMvcS9BRnEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy5xOwotCi1wdWJsaWMgY2xhc3MgQUZxIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjNmViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIHN1YnN0aXR1dGVzLmEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHN1YnN0aXR1dGVzLmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRXhwb3J0LVBhY2thZ2U6IHN1YnN0aXR1dGVzLng7IHN1YnN0aXR1dGVzLnk7IHZlcnNpb249MS4wCi1JbXBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMueDsgc3Vic3RpdHV0ZXMueTsgdmVyc2lvbj0iWzEuMCwgMi4wKSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5hL2RhdGEvcmVzb3VyY2UxIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmEvZGF0YS9yZXNvdXJjZTEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZDA0N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmEvZGF0YS9yZXNvdXJjZTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1yb290IGNsYXNzcGF0aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5hL3N1YnN0aXR1dGVzL3gvQXguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5hL3N1YnN0aXR1dGVzL3gvQXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjNmU5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYS9zdWJzdGl0dXRlcy94L0F4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc3Vic3RpdHV0ZXMueDsKLQotcHVibGljIGNsYXNzIEF4IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmEvc3Vic3RpdHV0ZXMveS9BeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmEvc3Vic3RpdHV0ZXMveS9BeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjFiYjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5hL3N1YnN0aXR1dGVzL3kvQXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy55OwotCi1wdWJsaWMgY2xhc3MgQXkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYi5mcmFnL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmIuZnJhZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMThiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYi5mcmFnL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgc3Vic3RpdHV0ZXMuYi5mcmFnCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBzdWJzdGl0dXRlcy5iLmZyYWcKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRnJhZ21lbnQtSG9zdDogc3Vic3RpdHV0ZXMuYgotRXhwb3J0LVBhY2thZ2U6IHN1YnN0aXR1dGVzLnE7IHZlcnNpb249MS4wCi1JbXBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMucTsgdmVyc2lvbj0iWzEuMCwyLjApIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmIuZnJhZy9zdWJzdGl0dXRlcy9xL0JGcS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmIuZnJhZy9zdWJzdGl0dXRlcy9xL0JGcS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjFlM2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5iLmZyYWcvc3Vic3RpdHV0ZXMvcS9CRnEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy5xOwotCi1wdWJsaWMgY2xhc3MgQkZxIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiMzdiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIHN1YnN0aXR1dGVzLmIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHN1YnN0aXR1dGVzLmIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRXhwb3J0LVBhY2thZ2U6IHN1YnN0aXR1dGVzLng7IHN1YnN0aXR1dGVzLnk7IHZlcnNpb249MS4wCi1JbXBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMueDsgc3Vic3RpdHV0ZXMueTsgdmVyc2lvbj0iWzEuMCwgMi4wKSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5iL3N1YnN0aXR1dGVzL3gvQnguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5iL3N1YnN0aXR1dGVzL3gvQnguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkMmYwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYi9zdWJzdGl0dXRlcy94L0J4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc3Vic3RpdHV0ZXMueDsKLQotcHVibGljIGNsYXNzIEJ4IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmIvc3Vic3RpdHV0ZXMveS9CeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmIvc3Vic3RpdHV0ZXMveS9CeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjY2ZThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5iL3N1YnN0aXR1dGVzL3kvQnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy55OwotCi1wdWJsaWMgY2xhc3MgQnkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5jL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGZiNjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5jL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgc3Vic3RpdHV0ZXMuYwotQnVuZGxlLVN5bWJvbGljTmFtZTogc3Vic3RpdHV0ZXMuYwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1SZXF1aXJlLUJ1bmRsZTogc3Vic3RpdHV0ZXMuYQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllMWJmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuZC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIHN1YnN0aXR1dGVzLmQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHN1YnN0aXR1dGVzLmQKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotUmVxdWlyZS1CdW5kbGU6IHN1YnN0aXR1dGVzLmIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5lL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkN2UzYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICBzdWJzdGl0dXRlcy5lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBzdWJzdGl0dXRlcy5lCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUV4cG9ydC1QYWNrYWdlOiBzdWJzdGl0dXRlcy56Ci1SZXF1aXJlLUJ1bmRsZTogc3Vic3RpdHV0ZXMuYTsgdmlzaWJpbGl0eTo9cmVleHBvcnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5lL3N1YnN0aXR1dGVzL3ovRXouamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5lL3N1YnN0aXR1dGVzL3ovRXouamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiMzZiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuZS9zdWJzdGl0dXRlcy96L0V6LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc3Vic3RpdHV0ZXMuejsKLQotcHVibGljIGNsYXNzIEV6IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuZi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmZjliNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuZi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIHN1YnN0aXR1dGVzLmYKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHN1YnN0aXR1dGVzLmYKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRXhwb3J0LVBhY2thZ2U6IHN1YnN0aXR1dGVzLnoKLVJlcXVpcmUtQnVuZGxlOiBzdWJzdGl0dXRlcy5iOyB2aXNpYmlsaXR5Oj1yZWV4cG9ydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmYvc3Vic3RpdHV0ZXMvei9Gei5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmYvc3Vic3RpdHV0ZXMvei9Gei5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzAzMmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5mL3N1YnN0aXR1dGVzL3ovRnouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy56OwotCi1wdWJsaWMgY2xhc3MgRnogewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M3OGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgc3Vic3RpdHV0ZXMuZwotQnVuZGxlLVN5bWJvbGljTmFtZTogc3Vic3RpdHV0ZXMuZwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1SZXF1aXJlLUJ1bmRsZTogc3Vic3RpdHV0ZXMuZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmgvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxNTZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIHN1YnN0aXR1dGVzLmgKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHN1YnN0aXR1dGVzLmgKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotUmVxdWlyZS1CdW5kbGU6IHN1YnN0aXR1dGVzLmYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5pL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOGYzZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICBzdWJzdGl0dXRlcy5pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBzdWJzdGl0dXRlcy5pCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUV4cG9ydC1QYWNrYWdlOiBzdWJzdGl0dXRlcy54OyBzdWJzdGl0dXRlcy55OyB2ZXJzaW9uPTEuMDsgbWFuZGF0b3J5Oj1hOyBhPXNwbGl0Ci1JbXBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMueDsgc3Vic3RpdHV0ZXMueTsgdmVyc2lvbj0iWzEuMCwgMi4wKSI7IGE9c3BsaXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5pL3N1YnN0aXR1dGVzL3gvSXguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5pL3N1YnN0aXR1dGVzL3gvSXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNjA2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuaS9zdWJzdGl0dXRlcy94L0l4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc3Vic3RpdHV0ZXMueDsKLQotcHVibGljIGNsYXNzIEl4IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmkvc3Vic3RpdHV0ZXMveS9JeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmkvc3Vic3RpdHV0ZXMveS9JeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdkNjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5pL3N1YnN0aXR1dGVzL3kvSXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy55OwotCi1wdWJsaWMgY2xhc3MgSXkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuai9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5qL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTIwY2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5qL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgc3Vic3RpdHV0ZXMuagotQnVuZGxlLVN5bWJvbGljTmFtZTogc3Vic3RpdHV0ZXMuagotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1FeHBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMueDsgc3Vic3RpdHV0ZXMueTsgdmVyc2lvbj0xLjA7IG1hbmRhdG9yeTo9YTsgYT1zcGxpdAotSW1wb3J0LVBhY2thZ2U6IHN1YnN0aXR1dGVzLng7IHN1YnN0aXR1dGVzLnk7IHZlcnNpb249IlsxLjAsIDIuMCkiOyBhPXNwbGl0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuai9zdWJzdGl0dXRlcy94L0p4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuai9zdWJzdGl0dXRlcy94L0p4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NTc1MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmovc3Vic3RpdHV0ZXMveC9KeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHN1YnN0aXR1dGVzLng7Ci0KLXB1YmxpYyBjbGFzcyBKeCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5qL3N1YnN0aXR1dGVzL3kvSnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5qL3N1YnN0aXR1dGVzL3kvSnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkNDkwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuai9zdWJzdGl0dXRlcy95L0p5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc3Vic3RpdHV0ZXMueTsKLQotcHVibGljIGNsYXNzIEp5IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmsvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuay9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5YTI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuay9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIHN1YnN0aXR1dGVzLmsKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHN1YnN0aXR1dGVzLmsKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRXhwb3J0LVBhY2thZ2U6IHN1YnN0aXR1dGVzLng7IHN1YnN0aXR1dGVzLnk7IHZlcnNpb249MS4wOyBtYW5kYXRvcnk6PWI7IGI9c3BsaXQKLUltcG9ydC1QYWNrYWdlOiBzdWJzdGl0dXRlcy54OyBzdWJzdGl0dXRlcy55OyB2ZXJzaW9uPSJbMS4wLCAyLjApIjsgYj1zcGxpdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmsvc3Vic3RpdHV0ZXMveC9LeC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmsvc3Vic3RpdHV0ZXMveC9LeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWU2YmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5rL3N1YnN0aXR1dGVzL3gvS3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy54OwotCi1wdWJsaWMgY2xhc3MgS3ggewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuay9zdWJzdGl0dXRlcy95L0t5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMuay9zdWJzdGl0dXRlcy95L0t5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZDg4YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmsvc3Vic3RpdHV0ZXMveS9LeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHN1YnN0aXR1dGVzLnk7Ci0KLXB1YmxpYyBjbGFzcyBLeSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5sL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MmExMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICBzdWJzdGl0dXRlcy5sCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBzdWJzdGl0dXRlcy5sCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUV4cG9ydC1QYWNrYWdlOiBzdWJzdGl0dXRlcy54OyBzdWJzdGl0dXRlcy55OyB2ZXJzaW9uPTEuMDsgbWFuZGF0b3J5Oj1iOyBiPXNwbGl0Ci1JbXBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMueDsgc3Vic3RpdHV0ZXMueTsgdmVyc2lvbj0iWzEuMCwgMi4wKSI7IGI9c3BsaXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5sL3N1YnN0aXR1dGVzL3gvTHguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5sL3N1YnN0aXR1dGVzL3gvTHguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxMzQ1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMubC9zdWJzdGl0dXRlcy94L0x4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc3Vic3RpdHV0ZXMueDsKLQotcHVibGljIGNsYXNzIEx4IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmwvc3Vic3RpdHV0ZXMveS9MeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLmwvc3Vic3RpdHV0ZXMveS9MeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJmY2ZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5sL3N1YnN0aXR1dGVzL3kvTHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy55OwotCi1wdWJsaWMgY2xhc3MgTHkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMubS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5tL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjRlZDI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5tL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgc3Vic3RpdHV0ZXMubQotQnVuZGxlLVN5bWJvbGljTmFtZTogc3Vic3RpdHV0ZXMubQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1SZXF1aXJlLUJ1bmRsZTogc3Vic3RpdHV0ZXMuaSwgc3Vic3RpdHV0ZXMuawotRXhwb3J0LVBhY2thZ2U6IHN1YnN0aXR1dGVzLng7IHN1YnN0aXR1dGVzLnk7IHZlcnNpb249MS4wCi1JbXBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMueDsgc3Vic3RpdHV0ZXMueTsgdmVyc2lvbj0iWzEuMCwgMi4wKSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5tL3N1YnN0aXR1dGVzL3gvTXguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5tL3N1YnN0aXR1dGVzL3gvTXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmMTMxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMubS9zdWJzdGl0dXRlcy94L014LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc3Vic3RpdHV0ZXMueDsKLQotcHVibGljIGNsYXNzIE14IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLm0vc3Vic3RpdHV0ZXMveS9NeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLm0vc3Vic3RpdHV0ZXMveS9NeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDliNjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5tL3N1YnN0aXR1dGVzL3kvTXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy55OwotCi1wdWJsaWMgY2xhc3MgTXkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMubi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTViNTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgc3Vic3RpdHV0ZXMubgotQnVuZGxlLVN5bWJvbGljTmFtZTogc3Vic3RpdHV0ZXMubgotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1SZXF1aXJlLUJ1bmRsZTogc3Vic3RpdHV0ZXMuaiwgc3Vic3RpdHV0ZXMubAotRXhwb3J0LVBhY2thZ2U6IHN1YnN0aXR1dGVzLng7IHN1YnN0aXR1dGVzLnk7IHZlcnNpb249MS4wCi1JbXBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMueDsgc3Vic3RpdHV0ZXMueTsgdmVyc2lvbj0iWzEuMCwgMi4wKSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5uL3N1YnN0aXR1dGVzL3gvTnguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5uL3N1YnN0aXR1dGVzL3gvTnguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5YTM1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMubi9zdWJzdGl0dXRlcy94L054LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc3Vic3RpdHV0ZXMueDsKLQotcHVibGljIGNsYXNzIE54IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLm4vc3Vic3RpdHV0ZXMveS9OeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLm4vc3Vic3RpdHV0ZXMveS9OeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhhOWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5uL3N1YnN0aXR1dGVzL3kvTnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBzdWJzdGl0dXRlcy55OwotCi1wdWJsaWMgY2xhc3MgTnkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvc3Vic3RpdHV0ZXMucC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjZiYWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgc3Vic3RpdHV0ZXMucAotQnVuZGxlLVN5bWJvbGljTmFtZTogc3Vic3RpdHV0ZXMucAotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1JbXBvcnQtUGFja2FnZTogc3Vic3RpdHV0ZXMueDsgc3Vic3RpdHV0ZXMueTsgdmVyc2lvbj0iWzEuMCwgMi4wKSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy9zdWJzdGl0dXRlcy5xL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLnEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWJiOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3N1YnN0aXR1dGVzLnEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICBzdWJzdGl0dXRlcy5xCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBzdWJzdGl0dXRlcy5xCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLVJlcXVpcmUtQnVuZGxlOiBzdWJzdGl0dXRlcy5uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyMzU5NTgueC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzIzNTk1OC54L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDZhOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzIzNTk1OC54L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogWCBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmJ1ZzIzNTk1OC54Ci1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IHRlc3QuYnVnMjM1OTU4LnguaW50ZXJuYWwuQWN0aXZhdG9yCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUV4cG9ydC1QYWNrYWdlOiB0ZXN0LmJ1ZzIzNTk1OC54OyB2ZXJzaW9uPTEuMQotUmVxdWlyZS1CdW5kbGU6IHRlc3QuYnVnMjM1OTU4LnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzIzNTk1OC54L3Rlc3QvYnVnMjM1OTU4L3gvWDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzIzNTk1OC54L3Rlc3QvYnVnMjM1OTU4L3gvWDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4NjIzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyMzU5NTgueC90ZXN0L2J1ZzIzNTk1OC94L1gxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdC5idWcyMzU5NTgueDsKLQotcHVibGljIGNsYXNzIFgxIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LngvdGVzdC9idWcyMzU5NTgveC9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzIzNTk1OC54L3Rlc3QvYnVnMjM1OTU4L3gvaW50ZXJuYWwvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDhjMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LngvdGVzdC9idWcyMzU5NTgveC9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXBhY2thZ2UgdGVzdC5idWcyMzU5NTgueC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgdGVzdC5idWcyMzU5NTgueC5YMTsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFgxKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyMzU5NTgueS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzMzA2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyMzU5NTgueS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdC5idWcyMzU5NTgueQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiB0ZXN0LmJ1ZzIzNTk1OC55LmludGVybmFsLkFjdGl2YXRvcgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIHRlc3QuYnVnMjM1OTU4Lng7IHZlcnNpb249IlsxLjAsMi4wKSIKLUV4cG9ydC1QYWNrYWdlOiB0ZXN0LmJ1ZzIzNTk1OC54OyB2ZXJzaW9uPTEuMCwKLSB0ZXN0LmJ1ZzIzNTk1OC55OyB2ZXJzaW9uPTEuMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LnkvdGVzdC9idWcyMzU5NTgveC9YLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyMzU5NTgueS90ZXN0L2J1ZzIzNTk1OC94L1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkYzQ5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyMzU5NTgueS90ZXN0L2J1ZzIzNTk1OC94L1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0LmJ1ZzIzNTk1OC54OwotCi1wdWJsaWMgY2xhc3MgWCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzIzNTk1OC55L3Rlc3QvYnVnMjM1OTU4L3kvWS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LnkvdGVzdC9idWcyMzU5NTgveS9ZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTEwNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LnkvdGVzdC9idWcyMzU5NTgveS9ZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdC5idWcyMzU5NTgueTsKLQotcHVibGljIGNsYXNzIFkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyMzU5NTgueS90ZXN0L2J1ZzIzNTk1OC95L2ludGVybmFsL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjM1OTU4LnkvdGVzdC9idWcyMzU5NTgveS9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyNzFkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyMzU5NTgueS90ZXN0L2J1ZzIzNTk1OC95L2ludGVybmFsL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSB0ZXN0LmJ1ZzIzNTk1OC55LmludGVybmFsOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyNTk5MDMuYS51cGRhdGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyNTk5MDMuYS51cGRhdGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MTA0MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmEudXBkYXRlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmJ1ZzI1OTkwMy5hCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmJ1ZzI1OTkwMy5hCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEKLUV4cG9ydC1QYWNrYWdlOiB0ZXN0LmJ1ZzI1OTkwMy5hLCB0ZXN0LmJ1ZzI1OTkwMy5hLmIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5hL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjM5NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IHRlc3QuYnVnMjU5OTAzLmEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QuYnVnMjU5OTAzLmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRXhwb3J0LVBhY2thZ2U6IHRlc3QuYnVnMjU5OTAzLmEsIHRlc3QuYnVnMjU5OTAzLmEuYgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmEvdGVzdC9idWcyNTk5MDMvYS9TZXJ2aWNlMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmEvdGVzdC9idWcyNTk5MDMvYS9TZXJ2aWNlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGM3YzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5hL3Rlc3QvYnVnMjU5OTAzL2EvU2VydmljZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmJ1ZzI1OTkwMy5hOwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UxIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmEvdGVzdC9idWcyNTk5MDMvYS9iL1NlcnZpY2UyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyNTk5MDMuYS90ZXN0L2J1ZzI1OTkwMy9hL2IvU2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhNjVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyNTk5MDMuYS90ZXN0L2J1ZzI1OTkwMy9hL2IvU2VydmljZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmJ1ZzI1OTkwMy5hLmI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZTIgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyNTk5MDMuYi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5iL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzMwMjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5iL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmJ1ZzI1OTkwMy5iCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmJ1ZzI1OTkwMy5iCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUltcG9ydC1QYWNrYWdlOiB0ZXN0LmJ1ZzI1OTkwMy5hLAotIHRlc3QuYnVnMjU5OTAzLmEuYgotRXhwb3J0LVBhY2thZ2U6IHRlc3QuYnVnMjU5OTAzLmIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5iL3Rlc3QvYnVnMjU5OTAzL2IvU2VydmljZTMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5iL3Rlc3QvYnVnMjU5OTAzL2IvU2VydmljZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzNDUwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyNTk5MDMuYi90ZXN0L2J1ZzI1OTkwMy9iL1NlcnZpY2UzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdC5idWcyNTk5MDMuYjsKLQotaW1wb3J0IHRlc3QuYnVnMjU5OTAzLmEuU2VydmljZTE7Ci1pbXBvcnQgdGVzdC5idWcyNTk5MDMuYS5iLlNlcnZpY2UyOwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UzIGV4dGVuZHMgU2VydmljZTEsIFNlcnZpY2UyIHsKLQkvLyBub3RoaW5nCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyNTk5MDMuYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5jL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY0NmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5jL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5idWcyNTk5MDMuYwotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdC5idWcyNTk5MDMuYwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiB0ZXN0LmJ1ZzI1OTkwMy5jLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcmssCi0gdGVzdC5idWcyNTk5MDMuYSwKLSB0ZXN0LmJ1ZzI1OTkwMy5hLmIsCi0gdGVzdC5idWcyNTk5MDMuYgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmMvdGVzdC9idWcyNTk5MDMvYy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI1OTkwMy5jL3Rlc3QvYnVnMjU5OTAzL2MvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjU5OTAzLmMvdGVzdC9idWcyNTk5MDMvYy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmJ1ZzI1OTkwMy5jOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgdGVzdC5idWcyNTk5MDMuYi5TZXJ2aWNlMzsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW5ldyBTZXJ2aWNlMygpIHsvKiBub3RoaW5nKi99OwotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NjMwNy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NjMwNy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMjhlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyODYzMDcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IHRlc3QuYnVnMjg2MzA3Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmJ1ZzI4NjMwNwotQnVuZGxlLVZlcnNpb246IDEuMC4wCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyODYzMDcvT1NHSS1JTkYvcGVybWlzc2lvbnMucGVybSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NjMwNy9PU0dJLUlORi9wZXJtaXNzaW9ucy5wZXJtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDkwZWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NjMwNy9PU0dJLUlORi9wZXJtaXNzaW9ucy5wZXJtCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotKGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIjw8QUxMIEZJTEVTPj4iICJyZWFkIikKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NzYzNi5hMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI4NzYzNi5hMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyNmE2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyODc2MzYuYTEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IHRlc3QuYnVnMjg3NjM2LmEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QuYnVnMjg3NjM2LmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRXhwb3J0LVBhY2thZ2U6IHRlc3QuYnVnMjg3NjM2LmE7IHZlcnNpb249MS4wCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyODc2MzYuYTIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyODc2MzYuYTIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODgwYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NjM2LmEyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmJ1ZzI4NzYzNi5hCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmJ1ZzI4NzYzNi5hCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAKLUV4cG9ydC1QYWNrYWdlOiB0ZXN0LmJ1ZzI4NzYzNi5hOyB2ZXJzaW9uPTEuMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NjM2LmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyODc2MzYuYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxYjIxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWcyODc2MzYuYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5idWcyODc2MzYuYgotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdC5idWcyODc2MzYuYgotQnVuZGxlLVZlcnNpb246IDIuMC4wCi1JbXBvcnQtUGFja2FnZTogdGVzdC5idWcyODc2MzYuYTsgdmVyc2lvbj0iWzEuMCwyLjApIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NzUwL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NzUwL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjc3OTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI4Nzc1MC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5idWcyODc3NTAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QuYnVnMjg3NzUwCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IHRlc3QuYnVnMjg3NzUwLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yaywKLSBvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI4Nzc1MC9PU0dJLUlORi9wZXJtaXNzaW9ucy5wZXJtIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NzUwL09TR0ktSU5GL3Blcm1pc3Npb25zLnBlcm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGMxYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NzUwL09TR0ktSU5GL3Blcm1pc3Npb25zLnBlcm0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLShvcmcub3NnaS5mcmFtZXdvcmsuUGFja2FnZVBlcm1pc3Npb24gIioiICJpbXBvcnQiKQotKG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUGVybWlzc2lvbiAiKiIgIkdFVCIpCi0ob3JnLm9zZ2kuZnJhbWV3b3JrLkFkbWluUGVybWlzc2lvbiAiKiIgIioiKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NzUwL3Rlc3QvYnVnMjg3NzUwL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMjg3NzUwL3Rlc3QvYnVnMjg3NzUwL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDIzZGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzI4Nzc1MC90ZXN0L2J1ZzI4Nzc1MC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXBhY2thZ2UgdGVzdC5idWcyODc3NTA7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbC5TdGFydExldmVsOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0YXJ0TGV2ZWwgc2wgPSAoU3RhcnRMZXZlbCkgY29udGV4dC5nZXRTZXJ2aWNlKGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShTdGFydExldmVsLmNsYXNzLmdldE5hbWUoKSkpOwotCQlzbC5zZXRTdGFydExldmVsKDEwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMzA2MTgxYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzMwNjE4MWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkY2Y3MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMzA2MTgxYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5idWczMDYxODFhCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmJ1ZzMwNjE4MWEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogdGVzdC5idWczMDYxODFhLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yawpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMzA2MTgxYS90ZXN0L2J1ZzMwNjE4MWEvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWczMDYxODFhL3Rlc3QvYnVnMzA2MTgxYS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0OTZjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWczMDYxODFhL3Rlc3QvYnVnMzA2MTgxYS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmJ1ZzMwNjE4MWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcnZpY2VSZWZlcmVuY2VbXSByZWZzID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlcyhSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksICIodGVzdD1idWczMDYxODEpIik7Ci0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0JCWlmIChyZWZzID09IG51bGwpCi0JCQllcnJvciA9ICJEaWQgbm90IGZpbmQgZXhwZWN0ZWQgc2VydmljZSI7Ci0JCWVsc2UgaWYgKHJlZnMubGVuZ3RoICE9IDEpCi0JCQllcnJvciA9ICJGb3VuZCB3cm9uZyBudW1iZXIgb2Ygc2VydmljZXM6ICIgKyByZWZzLmxlbmd0aDsKLQkJaWYgKGVycm9yICE9IG51bGwpIHsKLQkJCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCXByb3BzLnB1dCgidGVzdCIsICJidWczMDYxODEiKTsKLQkJCWNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKFN0cmluZy5jbGFzcy5nZXROYW1lKCksIGVycm9yLCBwcm9wcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMzA2MTgxYi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzMwNjE4MWIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZjFiYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMzA2MTgxYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5idWczMDYxODFiCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmJ1ZzMwNjE4MWIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotU2VydmljZS1Db21wb25lbnQ6IGNvbXBvbmVudC54bWwKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWczMDYxODFiL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5idWczMDYxODFiL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTRlZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMzA2MTgxYi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNjcjpjb21wb25lbnQgeG1sbnM6c2NyPSJodHRwOi8vd3d3Lm9zZ2kub3JnL3htbG5zL3Njci92MS4xLjAiIG5hbWU9Im9yZy5lY2xpcHNlLm9zZ2kudGVzdHMiPgotICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJ0ZXN0LmJ1ZzMwNjE4MWIuQ29tcG9uZW50Ii8+Ci0gICA8cHJvcGVydHkgbmFtZT0idGVzdCIgdHlwZT0iU3RyaW5nIiB2YWx1ZT0iYnVnMzA2MTgxIi8+Ci0gICA8c2VydmljZT4KLSAgICAgIDxwcm92aWRlIGludGVyZmFjZT0iamF2YS5sYW5nLlJ1bm5hYmxlIi8+Ci0gICA8L3NlcnZpY2U+Ci0gICAKLTwvc2NyOmNvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmJ1ZzMwNjE4MWIvdGVzdC9idWczMDYxODFiL0NvbXBvbmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMzA2MTgxYi90ZXN0L2J1ZzMwNjE4MWIvQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZjQyMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuYnVnMzA2MTgxYi90ZXN0L2J1ZzMwNjE4MWIvQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QuYnVnMzA2MTgxYjsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuZmlsdGVyLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5maWx0ZXIuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0MmY4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5maWx0ZXIuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogIHRlc3QuZmlsdGVyLmEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QuZmlsdGVyLmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogdGVzdC5maWx0ZXIuYS5BY3RpdmF0b3IKLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcmssCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5maWx0ZXIuYS90ZXN0L2ZpbHRlci9hL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuZmlsdGVyLmEvdGVzdC9maWx0ZXIvYS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwY2IwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5maWx0ZXIuYS90ZXN0L2ZpbHRlci9hL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QuZmlsdGVyLmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXJDdXN0b21pemVyOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIGJvb2xlYW5bXSBzZXJ2aWNlQ2hhbmdlZCA9IHtmYWxzZX07Ci0JCVNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2aWNlQ2hhbmdlZChTZXJ2aWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXJ2aWNlQ2hhbmdlZFswXSA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0JCWNvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKGxpc3RlbmVyLCAiKCYob2JqZWN0Q2xhc3M9amF2YS5sYW5nLlN0cmluZykodGVzdD0qKSkiKTsKLQkJZmluYWwgYm9vbGVhbltdIG1vZGlmaWVkU2VydmljZSA9IHtmYWxzZX07Ci0JCVNlcnZpY2VUcmFja2VyIHRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgRnJhbWV3b3JrVXRpbC5jcmVhdGVGaWx0ZXIoIigmKG9iamVjdENsYXNzPWphdmEubGFuZy5TdHJpbmcpKHRlc3Q9KikpIiksIG5ldyBTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIoKSB7Ci0KLQkJCXB1YmxpYyBPYmplY3QgYWRkaW5nU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQkJCXJldHVybiByZWZlcmVuY2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCQltb2RpZmllZFNlcnZpY2VbMF0gPSB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQkJCX0KLQotCQl9KTsKLQkJdHJhY2tlci5vcGVuKCk7Ci0JCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KCJ0ZXN0IiwgInZhbHVlMSIpOwotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKFN0cmluZy5jbGFzcy5nZXROYW1lKCksICJ0ZXN0IiwgcHJvcHMpOwotCQlwcm9wcy5wdXQoInRlc3QiLCAidmFsdWUyIik7Ci0JCXJlZ2lzdHJhdGlvbi5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJaWYgKCFzZXJ2aWNlQ2hhbmdlZFswXSkKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oImRpZCBub3QgY2FsbCBzZXJ2aWNlIGxpc3RlbmVyIik7Ci0JCWlmICghbW9kaWZpZWRTZXJ2aWNlWzBdKQotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiZGlkIG5vdCBjYWxsIHRyYWNrZXIgY3VzdG9tZXIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vbm90aGluZzsgZnJhbWV3b3JrIHdpbGwgY2xlYW4gdXAgb3VyIGxpc3RlbmVycwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQxL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjUzODNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmZyYWdtZW50MS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5mcmFnbWVudDEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QuZnJhZ21lbnQxCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUZyYWdtZW50LUhvc3Q6IHRlc3QxCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5mcmFnbWVudDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5mcmFnbWVudDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDI5YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmZyYWdtZW50MgotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdC5mcmFnbWVudDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRnJhZ21lbnQtSG9zdDogdGVzdDEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmZyYWdtZW50My9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmZyYWdtZW50My9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViMjg2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5mcmFnbWVudDMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IHRlc3QuZnJhZ21lbnQzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmZyYWdtZW50MwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1GcmFnbWVudC1Ib3N0OiB0ZXN0MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQ0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQ0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDc2OGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmZyYWdtZW50NC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5mcmFnbWVudDQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QuZnJhZ21lbnQ0Ci1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUZyYWdtZW50LUhvc3Q6IHRlc3QxCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5mcmFnbWVudDUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5mcmFnbWVudDUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZmE0YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QuZnJhZ21lbnQ1L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmZyYWdtZW50NQotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdC5mcmFnbWVudDUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRnJhZ21lbnQtSG9zdDogdGVzdDEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYS5jbGllbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmEuY2xpZW50L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGNmOWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYS5jbGllbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICB0ZXN0LmxpbmsuYS5jbGllbnQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QubGluay5hLmNsaWVudAotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiB0ZXN0LmxpbmsuYS5jbGllbnQuQWN0aXZhdG9yCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrLCB0ZXN0LmxpbmsuYSwgdGVzdC5saW5rLmEucGFyYW1zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmEuY2xpZW50L3Rlc3QvbGluay9hL2NsaWVudC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYS5jbGllbnQvdGVzdC9saW5rL2EvY2xpZW50L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDBkMTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYS5jbGllbnQvdGVzdC9saW5rL2EvY2xpZW50L0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QubGluay5hLmNsaWVudDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCB0ZXN0LmxpbmsuYS5Tb21lQVBJOwotaW1wb3J0IHRlc3QubGluay5hLnBhcmFtcy5BUGFyYW07Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU29tZUFQSSBhcGkgPSBuZXcgU29tZUFQSSgpOwotCQlhcGkuZ2V0QnVuZGxlSUQoY29udGV4dC5nZXRCdW5kbGUoKSk7Ci0JCWFwaS5nZXRTdHJpbmcobmV3IEFQYXJhbSgpKTsKLQkJLy8gdGVzdCBjbGFzcyB0aGF0IGRvZXMgbm90IGV4aXN0Ci0JCXRyeSB7Ci0JCQlnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKCJ0ZXN0LmxpbmsuYS5Eb2VzTm90RXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2xhc3MgbG9hZCBzdWNjZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCS8vIHRlc3QgcmVzb3VyY2UKLQkJVVJMIHJlc291cmNlID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvdGVzdC9saW5rL2EvcmVzb3VyY2UudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRGlkIG5vdCBmaW5kIHJlc291cmNlLnR4dCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzb3VyY2Uub3BlblN0cmVhbSgpKSk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJaWYgKCEiVGVzdCBjb250ZW50Ii5lcXVhbHMoY29udGVudCkpIC8vJE5PTi1OTFMtMSQKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjb250ZW50IGluIHJlc291cmNlLnR4dDogIiArIGNvbnRlbnQpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlyZWFkZXIuY2xvc2UoKTsKLQkJfQotCQkvLyB0ZXN0IHJlc291cmNlIHRoYXQgZG9lcyBub3QgZXhpc3QKLQkJVVJMIG5vdEV4aXN0ID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvdGVzdC9saW5rL2IvRG9lc05vdEV4aXN0LnR4dCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub3RFeGlzdCAhPSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNob3VsZCBub3QgaGF2ZSBmb3VuZCByZXNvdXJjZTogIiArIG5vdEV4aXN0LmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmZjFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICB0ZXN0LmxpbmsuYQotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdC5saW5rLmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRXhwb3J0LVBhY2thZ2U6IHRlc3QubGluay5hOyBhdHRyMT0idmFsdWUxIjsgdXNlczo9Im9yZy5vc2dpLmZyYW1ld29yaywgdGVzdC5saW5rLmEucGFyYW1zIiwKLSB0ZXN0LmxpbmsuYS5wYXJhbXM7IGF0dHIyPSJ2YWx1ZTIiIAotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yawpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5hL3Rlc3QvbGluay9hL1NvbWVBUEkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYS90ZXN0L2xpbmsvYS9Tb21lQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjQ4M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5hL3Rlc3QvbGluay9hL1NvbWVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmxpbmsuYTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgdGVzdC5saW5rLmEucGFyYW1zLkFQYXJhbTsKLQotcHVibGljIGNsYXNzIFNvbWVBUEkgewotCXB1YmxpYyBMb25nIGdldEJ1bmRsZUlEKEJ1bmRsZSBidW5kbGUpIHsKLQkJcmV0dXJuIG5ldyBMb25nKGJ1bmRsZS5nZXRCdW5kbGVJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhBUGFyYW0gYXJnMCkgewotCQlyZXR1cm4gYXJnMC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYS90ZXN0L2xpbmsvYS9wYXJhbXMvQVBhcmFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmEvdGVzdC9saW5rL2EvcGFyYW1zL0FQYXJhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmQyNTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYS90ZXN0L2xpbmsvYS9wYXJhbXMvQVBhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdC5saW5rLmEucGFyYW1zOwotCi1wdWJsaWMgY2xhc3MgQVBhcmFtIHsKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFQYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmEvdGVzdC9saW5rL2EvcmVzb3VyY2UudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5hL3Rlc3QvbGluay9hL3Jlc291cmNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlYzU5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmEvdGVzdC9saW5rL2EvcmVzb3VyY2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGVzdCBjb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmIuY2xpZW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5iLmNsaWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1ZDM4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmIuY2xpZW50L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmxpbmsuYi5jbGllbnQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QubGluay5iLmNsaWVudAotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiB0ZXN0LmxpbmsuYi5jbGllbnQuQWN0aXZhdG9yCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrLCB0ZXN0LmxpbmsuYiwgdGVzdC5saW5rLmIucGFyYW1zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmIuY2xpZW50L3Rlc3QvbGluay9iL2NsaWVudC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYi5jbGllbnQvdGVzdC9saW5rL2IvY2xpZW50L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjY2YjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYi5jbGllbnQvdGVzdC9saW5rL2IvY2xpZW50L0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QubGluay5iLmNsaWVudDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCB0ZXN0LmxpbmsuYi5Tb21lQVBJOwotaW1wb3J0IHRlc3QubGluay5iLnBhcmFtcy5BUGFyYW07Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU29tZUFQSSBhcGkgPSBuZXcgU29tZUFQSSgpOwotCQlhcGkuZ2V0QnVuZGxlSUQoY29udGV4dC5nZXRCdW5kbGUoKSk7Ci0JCWFwaS5nZXRTdHJpbmcobmV3IEFQYXJhbSgpKTsKLQkJLy8gdGVzdCBjbGFzcyB0aGF0IGRvZXMgbm90IGV4aXN0Ci0JCXRyeSB7Ci0JCQlnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKCJ0ZXN0LmxpbmsuYi5Eb2VzTm90RXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2xhc3MgbG9hZCBzdWNjZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCS8vIHRlc3QgcmVzb3VyY2UKLQkJVVJMIHJlc291cmNlID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvdGVzdC9saW5rL2IvcmVzb3VyY2UudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRGlkIG5vdCBmaW5kIHJlc291cmNlLnR4dCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzb3VyY2Uub3BlblN0cmVhbSgpKSk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJaWYgKCEiVGVzdCBjb250ZW50Ii5lcXVhbHMoY29udGVudCkpIC8vJE5PTi1OTFMtMSQKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjb250ZW50IGluIHJlc291cmNlLnR4dDogIiArIGNvbnRlbnQpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlyZWFkZXIuY2xvc2UoKTsKLQkJfQotCQkvLyB0ZXN0IHJlc291cmNlIHRoYXQgZG9lcyBub3QgZXhpc3QKLQkJVVJMIG5vdEV4aXN0ID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCIvdGVzdC9saW5rL2IvRG9lc05vdEV4aXN0LnR4dCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub3RFeGlzdCAhPSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNob3VsZCBub3QgaGF2ZSBmb3VuZCByZXNvdXJjZTogIiArIG5vdEV4aXN0LmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMjllM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5iL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmxpbmsuYgotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdC5saW5rLmIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotRXhwb3J0LVBhY2thZ2U6IHRlc3QubGluay5iOyBhdHRyMT0idmFsdWUxIjsgdXNlczo9Im9yZy5vc2dpLmZyYW1ld29yaywgdGVzdC5saW5rLmIucGFyYW1zIiwKLSB0ZXN0LmxpbmsuYi5wYXJhbXM7IGF0dHIyPSJ2YWx1ZTIiIAotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yawpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5iL3Rlc3QvbGluay9iL1NvbWVBUEkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYi90ZXN0L2xpbmsvYi9Tb21lQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMjliZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5iL3Rlc3QvbGluay9iL1NvbWVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmxpbmsuYjsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgdGVzdC5saW5rLmIucGFyYW1zLkFQYXJhbTsKLQotcHVibGljIGNsYXNzIFNvbWVBUEkgewotCXB1YmxpYyBMb25nIGdldEJ1bmRsZUlEKEJ1bmRsZSBidW5kbGUpIHsKLQkJcmV0dXJuIG5ldyBMb25nKGJ1bmRsZS5nZXRCdW5kbGVJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhBUGFyYW0gYXJnMCkgewotCQlyZXR1cm4gYXJnMC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYi90ZXN0L2xpbmsvYi9wYXJhbXMvQVBhcmFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmIvdGVzdC9saW5rL2IvcGFyYW1zL0FQYXJhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDg3MTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYi90ZXN0L2xpbmsvYi9wYXJhbXMvQVBhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdC5saW5rLmIucGFyYW1zOwotCi1wdWJsaWMgY2xhc3MgQVBhcmFtIHsKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFQYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmIvdGVzdC9saW5rL2IvcmVzb3VyY2UudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5iL3Rlc3QvbGluay9iL3Jlc291cmNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlYzU5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmIvdGVzdC9saW5rL2IvcmVzb3VyY2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGVzdCBjb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmMuY2xpZW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5jLmNsaWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAwMTlmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmMuY2xpZW50L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmxpbmsuYy5jbGllbnQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QubGluay5jLmNsaWVudAotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiB0ZXN0LmxpbmsuYy5jbGllbnQuQWN0aXZhdG9yCi1JbXBvcnQtUGFja2FnZTogdGVzdC5saW5rLmMuc2VydmljZTEsIHRlc3QubGluay5jLnNlcnZpY2UyLCB0ZXN0LmxpbmsuYy5zZXJ2aWNlMywgb3JnLm9zZ2kuZnJhbWV3b3JrCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmMuY2xpZW50L3Rlc3QvbGluay9jL2NsaWVudC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy5jbGllbnQvdGVzdC9saW5rL2MvY2xpZW50L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ5ODE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy5jbGllbnQvdGVzdC9saW5rL2MvY2xpZW50L0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QubGluay5jLmNsaWVudDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IHRlc3QubGluay5jLnNlcnZpY2UxLlNlcnZpY2UxOwotaW1wb3J0IHRlc3QubGluay5jLnNlcnZpY2UyLlNlcnZpY2UyOwotaW1wb3J0IHRlc3QubGluay5jLnNlcnZpY2UzLlNlcnZpY2UzOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcnZpY2UxIHNlcnZpY2UxID0gKFNlcnZpY2UxKSBjaGVja1NlcnZpY2UoU2VydmljZTEuY2xhc3MuZ2V0TmFtZSgpLCBjb250ZXh0KTsKLQkJaWYgKHNlcnZpY2UxID09IG51bGwpCi0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJtaXNzaW5nIFNlcnZpY2UxIik7IC8vJE5PTi1OTFMtMSQKLQkJU2VydmljZTIgc2VydmljZTIgPSAoU2VydmljZTIpIGNoZWNrU2VydmljZShTZXJ2aWNlMi5jbGFzcy5nZXROYW1lKCksIGNvbnRleHQpOwotCQlpZiAoc2VydmljZTIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIm1pc3NpbmcgU2VydmljZTIiKTsgLy8kTk9OLU5MUy0xJAotCQlTZXJ2aWNlMyBzZXJ2aWNlMyA9IChTZXJ2aWNlMykgY2hlY2tTZXJ2aWNlKFNlcnZpY2UzLmNsYXNzLmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCWlmIChzZXJ2aWNlMyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigibWlzc2luZyBTZXJ2aWNlMyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBPYmplY3QgY2hlY2tTZXJ2aWNlKFN0cmluZyBuYW1lLCBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShuYW1lKTsKLQkJaWYgKHJlZiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJ1bmRsZUV4Y2VwdGlvbigiTWlzc2luZyBzZXJ2aWNlICIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3Qgc2VydmljZSA9IGNvbnRleHQuZ2V0U2VydmljZShyZWYpOwotCQlpZiAoc2VydmljZSAhPSBudWxsKQotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmKTsKLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExNTQ1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmxpbmsuYwotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdC5saW5rLmMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogdGVzdC5saW5rLmMuQWN0aXZhdG9yCi1FeHBvcnQtUGFja2FnZTogCi0gdGVzdC5saW5rLmMuc2VydmljZTE7IGF0dHIxPSJ2YWx1ZTEiLAotIHRlc3QubGluay5jLnNlcnZpY2UyOyBhdHRyMj0idmFsdWUyIjsgdXNlczo9InRlc3QubGluay5jLnNlcnZpY2UxIiwKLSB0ZXN0LmxpbmsuYy5zZXJ2aWNlMzsgYXR0cjM9InZhbHVlMyI7IHVzZXM6PSJ0ZXN0LmxpbmsuYy5zZXJ2aWNlMiIKLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcmsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy90ZXN0L2xpbmsvYy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy90ZXN0L2xpbmsvYy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ZDE5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmMvdGVzdC9saW5rL2MvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdC5saW5rLmM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IHRlc3QubGluay5jLnNlcnZpY2UxLlNlcnZpY2UxOwotaW1wb3J0IHRlc3QubGluay5jLnNlcnZpY2UyLlNlcnZpY2UyOwotaW1wb3J0IHRlc3QubGluay5jLnNlcnZpY2UzLlNlcnZpY2UzOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKFNlcnZpY2UxLmNsYXNzLmdldE5hbWUoKSwgbmV3IFNlcnZpY2UxKCkge30sIG51bGwpOwotCQljb250ZXh0LnJlZ2lzdGVyU2VydmljZShuZXcgU3RyaW5nW10ge1NlcnZpY2UxLmNsYXNzLmdldE5hbWUoKSwgU2VydmljZTIuY2xhc3MuZ2V0TmFtZSgpfSwgbmV3IFNlcnZpY2UyKCkge30sIG51bGwpOwotCQljb250ZXh0LnJlZ2lzdGVyU2VydmljZShuZXcgU3RyaW5nW10ge1NlcnZpY2UxLmNsYXNzLmdldE5hbWUoKSwgU2VydmljZTIuY2xhc3MuZ2V0TmFtZSgpLCBTZXJ2aWNlMy5jbGFzcy5nZXROYW1lKCl9LCBuZXcgU2VydmljZTMoKSB7fSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmMvdGVzdC9saW5rL2Mvc2VydmljZTEvU2VydmljZTEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy90ZXN0L2xpbmsvYy9zZXJ2aWNlMS9TZXJ2aWNlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjg2YjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy90ZXN0L2xpbmsvYy9zZXJ2aWNlMS9TZXJ2aWNlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QubGluay5jLnNlcnZpY2UxOwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UxIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5jL3Rlc3QvbGluay9jL3NlcnZpY2UyL1NlcnZpY2UyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmMvdGVzdC9saW5rL2Mvc2VydmljZTIvU2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4NmUxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmMvdGVzdC9saW5rL2Mvc2VydmljZTIvU2VydmljZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmxpbmsuYy5zZXJ2aWNlMjsKLQotaW1wb3J0IHRlc3QubGluay5jLnNlcnZpY2UxLlNlcnZpY2UxOwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UyIGV4dGVuZHMgU2VydmljZTEgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmMvdGVzdC9saW5rL2Mvc2VydmljZTMvU2VydmljZTMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy90ZXN0L2xpbmsvYy9zZXJ2aWNlMy9TZXJ2aWNlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM3YmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuYy90ZXN0L2xpbmsvYy9zZXJ2aWNlMy9TZXJ2aWNlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QubGluay5jLnNlcnZpY2UzOwotCi1pbXBvcnQgdGVzdC5saW5rLmMuc2VydmljZTIuU2VydmljZTI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZTMgZXh0ZW5kcyBTZXJ2aWNlMiB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyZDZhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmxpbmsuZAotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdC5saW5rLmQKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogdGVzdC5saW5rLmQuQWN0aXZhdG9yCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5zZXJ2aWNlLmZyYW1ld29yaywKLSBvcmcub3NnaS5mcmFtZXdvcmsubGF1bmNoLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5kL3Rlc3QvbGluay9kL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5kL3Rlc3QvbGluay9kL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWRlMGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuZC90ZXN0L2xpbmsvZC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLXBhY2thZ2UgdGVzdC5saW5rLmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5CdW5kbGVJbnN0YWxsZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5mcmFtZXdvcmsuQ29tcG9zaXRlQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZnJhbWV3b3JrLkNvbXBvc2l0ZUJ1bmRsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgaW5zdGFsbGVyUmVmID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKEJ1bmRsZUluc3RhbGxlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoaW5zdGFsbGVyUmVmID09IG51bGwpCi0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJNaXNzaW5nIFNlcnZpY2UgUGVybWlzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZUluc3RhbGxlciBpbnN0YWxsZXIgPSAoQnVuZGxlSW5zdGFsbGVyKSBjb250ZXh0LmdldFNlcnZpY2UoaW5zdGFsbGVyUmVmKTsKLQkJaWYgKGluc3RhbGxlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTWlzc2luZyBTZXJ2aWNlIFBlcm1pc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0LnVuZ2V0U2VydmljZShpbnN0YWxsZXJSZWYpOwotCi0JCVNlcnZpY2VSZWZlcmVuY2UgZmFjdG9yeVJlZiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShDb21wb3NpdGVCdW5kbGVGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChmYWN0b3J5UmVmID09IG51bGwpCi0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJNaXNzaW5nIFNlcnZpY2UgUGVybWlzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkgZmFjdG9yeSA9IChDb21wb3NpdGVCdW5kbGVGYWN0b3J5KSBjb250ZXh0LmdldFNlcnZpY2UoZmFjdG9yeVJlZik7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJNaXNzaW5nIFNlcnZpY2UgUGVybWlzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJTWFwIGxpbmtNYW5pZmVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJjaGlsZENvbXBvc2l0ZSIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIm9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcyIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29tcG9zaXRlQnVuZGxlRmFjdG9yeS5DT01QT1NJVEVfU0VSVklDRV9GSUxURVJfSU1QT1JULCAiKG9iamVjdENsYXNzPW9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5CdW5kbGVJbnN0YWxsZXIpIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlIGNoaWxkQ29tcG9zaXRlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNoaWxkQ29tcG9zaXRlID0gZmFjdG9yeS5pbnN0YWxsQ29tcG9zaXRlQnVuZGxlKG51bGwsICJjaGlsZENvbXBvc2l0ZSIsIGxpbmtNYW5pZmVzdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTWlzc2luZyBBbGxQZXJtaXNzaW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlCdW5kbGUgdGVzdCA9IGNoaWxkQ29tcG9zaXRlLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldEJ1bmRsZUNvbnRleHQoKS5pbnN0YWxsQnVuZGxlKGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigidGVzdCIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVzdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW5zdGFsbCBvZiB0ZXN0IGJ1bmRsZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotCQljaGlsZENvbXBvc2l0ZS5zdGFydCgpOwotCi0JCVNlcnZpY2VUcmFja2VyIHRyYWNrSW5zdGFsbGVyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNoaWxkQ29tcG9zaXRlLmdldEJ1bmRsZUNvbnRleHQoKSwgQnVuZGxlSW5zdGFsbGVyLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCXRyYWNrSW5zdGFsbGVyLm9wZW4oKTsKLQkJQnVuZGxlSW5zdGFsbGVyIGNoaWxkSW5zdGFsbGVyID0gKEJ1bmRsZUluc3RhbGxlcikgdHJhY2tJbnN0YWxsZXIud2FpdEZvclNlcnZpY2UoNTAwMCk7Ci0JCWlmIChjaGlsZEluc3RhbGxlciAhPSBpbnN0YWxsZXIpCi0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNoaWxkSW5zdGFsbGVyOiAiICsgY2hpbGRJbnN0YWxsZXIpOwotCQl0ZXN0LnN0YXJ0KCk7Ci0JCU9iamVjdFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgdGVzdCk7Ci0JCUFic3RyYWN0QnVuZGxlVGVzdHMuY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIEFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5lLmNsaWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuZS5jbGllbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZTc2YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5lLmNsaWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5saW5rLmUuY2xpZW50Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmxpbmsuZS5jbGllbnQKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogdGVzdC5saW5rLmUuY2xpZW50LkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IHRlc3QubGluay5lLnNlcnZpY2UxLCB0ZXN0LmxpbmsuZS5zZXJ2aWNlMiwgdGVzdC5saW5rLmUuc2VydmljZTMsIG9yZy5vc2dpLmZyYW1ld29yawpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5lLmNsaWVudC90ZXN0L2xpbmsvZS9jbGllbnQvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUuY2xpZW50L3Rlc3QvbGluay9lL2NsaWVudC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDliM2UyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUuY2xpZW50L3Rlc3QvbGluay9lL2NsaWVudC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmxpbmsuZS5jbGllbnQ7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCB0ZXN0LmxpbmsuZS5zZXJ2aWNlMS5TZXJ2aWNlMTsKLWltcG9ydCB0ZXN0LmxpbmsuZS5zZXJ2aWNlMi5TZXJ2aWNlMjsKLWltcG9ydCB0ZXN0LmxpbmsuZS5zZXJ2aWNlMy5TZXJ2aWNlMzsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXJ2aWNlMSBzZXJ2aWNlMSA9IChTZXJ2aWNlMSkgY2hlY2tTZXJ2aWNlKFNlcnZpY2UxLmNsYXNzLmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCWlmIChzZXJ2aWNlMSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigibWlzc2luZyBTZXJ2aWNlMSIpOyAvLyROT04tTkxTLTEkCi0JCVNlcnZpY2UyIHNlcnZpY2UyID0gKFNlcnZpY2UyKSBjaGVja1NlcnZpY2UoU2VydmljZTIuY2xhc3MuZ2V0TmFtZSgpLCBjb250ZXh0KTsKLQkJaWYgKHNlcnZpY2UyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJtaXNzaW5nIFNlcnZpY2UyIik7IC8vJE5PTi1OTFMtMSQKLQkJU2VydmljZTMgc2VydmljZTMgPSAoU2VydmljZTMpIGNoZWNrU2VydmljZShTZXJ2aWNlMy5jbGFzcy5nZXROYW1lKCksIGNvbnRleHQpOwotCQlpZiAoc2VydmljZTMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIm1pc3NpbmcgU2VydmljZTMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgT2JqZWN0IGNoZWNrU2VydmljZShTdHJpbmcgbmFtZSwgQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU2VydmljZVJlZmVyZW5jZSByZWYgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UobmFtZSk7Ci0JCWlmIChyZWYgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCdW5kbGVFeGNlcHRpb24oIk1pc3Npbmcgc2VydmljZSAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IHNlcnZpY2UgPSBjb250ZXh0LmdldFNlcnZpY2UocmVmKTsKLQkJaWYgKHNlcnZpY2UgIT0gbnVsbCkKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZik7Ci0JCXJldHVybiBzZXJ2aWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNzBkZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5lL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5saW5rLmUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QubGluay5lCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IHRlc3QubGluay5lLkFjdGl2YXRvcgotRXhwb3J0LVBhY2thZ2U6IAotIHRlc3QubGluay5lLnNlcnZpY2UxOyBhdHRyMT0idmFsdWUxIiwKLSB0ZXN0LmxpbmsuZS5zZXJ2aWNlMjsgYXR0cjI9InZhbHVlMiI7IHVzZXM6PSJ0ZXN0LmxpbmsuZS5zZXJ2aWNlMSIsCi0gdGVzdC5saW5rLmUuc2VydmljZTM7IGF0dHIzPSJ2YWx1ZTMiOyB1c2VzOj0idGVzdC5saW5rLmUuc2VydmljZTIiCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUvdGVzdC9saW5rL2UvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUvdGVzdC9saW5rL2UvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzVhYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5lL3Rlc3QvbGluay9lL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QubGluay5lOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCB0ZXN0LmxpbmsuZS5zZXJ2aWNlMS5TZXJ2aWNlMTsKLWltcG9ydCB0ZXN0LmxpbmsuZS5zZXJ2aWNlMi5TZXJ2aWNlMjsKLWltcG9ydCB0ZXN0LmxpbmsuZS5zZXJ2aWNlMy5TZXJ2aWNlMzsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQljb250ZXh0LnJlZ2lzdGVyU2VydmljZShTZXJ2aWNlMS5jbGFzcy5nZXROYW1lKCksIG5ldyBTZXJ2aWNlMSgpIHt9LCBudWxsKTsKLQkJY29udGV4dC5yZWdpc3RlclNlcnZpY2UobmV3IFN0cmluZ1tdIHtTZXJ2aWNlMS5jbGFzcy5nZXROYW1lKCksIFNlcnZpY2UyLmNsYXNzLmdldE5hbWUoKX0sIG5ldyBTZXJ2aWNlMigpIHt9LCBudWxsKTsKLQkJY29udGV4dC5yZWdpc3RlclNlcnZpY2UobmV3IFN0cmluZ1tdIHtTZXJ2aWNlMS5jbGFzcy5nZXROYW1lKCksIFNlcnZpY2UyLmNsYXNzLmdldE5hbWUoKSwgU2VydmljZTMuY2xhc3MuZ2V0TmFtZSgpfSwgbmV3IFNlcnZpY2UzKCkge30sIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5lL3Rlc3QvbGluay9lL3NlcnZpY2UxL1NlcnZpY2UxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUvdGVzdC9saW5rL2Uvc2VydmljZTEvU2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyMTUyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUvdGVzdC9saW5rL2Uvc2VydmljZTEvU2VydmljZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmxpbmsuZS5zZXJ2aWNlMTsKLQotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlMSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsuZS90ZXN0L2xpbmsvZS9zZXJ2aWNlMi9TZXJ2aWNlMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5lL3Rlc3QvbGluay9lL3NlcnZpY2UyL1NlcnZpY2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Yjk1OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5lL3Rlc3QvbGluay9lL3NlcnZpY2UyL1NlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdC5saW5rLmUuc2VydmljZTI7Ci0KLWltcG9ydCB0ZXN0LmxpbmsuZS5zZXJ2aWNlMS5TZXJ2aWNlMTsKLQotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlMiBleHRlbmRzIFNlcnZpY2UxIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubGluay5lL3Rlc3QvbGluay9lL3NlcnZpY2UzL1NlcnZpY2UzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUvdGVzdC9saW5rL2Uvc2VydmljZTMvU2VydmljZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1YmNkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLmUvdGVzdC9saW5rL2Uvc2VydmljZTMvU2VydmljZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LmxpbmsuZS5zZXJ2aWNlMzsKLQotaW1wb3J0IHRlc3QubGluay5lLnNlcnZpY2UyLlNlcnZpY2UyOwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UzIGV4dGVuZHMgU2VydmljZTIgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLnBvc3Rwb25lZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsucG9zdHBvbmVkL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjMxZDViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsucG9zdHBvbmVkL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LmxpbmsucG9zdHBvbmVkCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB0ZXN0LmxpbmsucG9zdHBvbmVkCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUZyYWdtZW50LUhvc3Q6IHN5c3RlbS5idW5kbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsucG9zdHBvbmVkL3Rlc3QvbGluay9wb3N0cG9uZWQvUG9zdFBvbmVkQ29uZGl0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5saW5rLnBvc3Rwb25lZC90ZXN0L2xpbmsvcG9zdHBvbmVkL1Bvc3RQb25lZENvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAyNmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0LmxpbmsucG9zdHBvbmVkL3Rlc3QvbGluay9wb3N0cG9uZWQvUG9zdFBvbmVkQ29uZGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1wYWNrYWdlIHRlc3QubGluay5wb3N0cG9uZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkNvbmRpdGlvbkluZm87Ci0KLXB1YmxpYyBjbGFzcyBQb3N0UG9uZWRDb25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24gewotCi0Jc3RhdGljIHB1YmxpYyBDb25kaXRpb24gZ2V0Q29uZGl0aW9uKGZpbmFsIEJ1bmRsZSBidW5kbGUsIGZpbmFsIENvbmRpdGlvbkluZm8gaW5mbykgewotCQlyZXR1cm4gbmV3IFBvc3RQb25lZENvbmRpdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQb3N0cG9uZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2F0aXNmaWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdGlzZmllZChDb25kaXRpb25bXSBjb25kaXRpb25zLCBEaWN0aW9uYXJ5IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5tYW5pZmVzdHBhY2thZ2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5tYW5pZmVzdHBhY2thZ2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTMyY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubWFuaWZlc3RwYWNrYWdlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogdGVzdC5tYW5pZmVzdHBhY2thZ2UKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QubWFuaWZlc3RwYWNrYWdlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IHRlc3QubWFuaWZlc3RwYWNrYWdlLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yawotCi1OYW1lOiB0ZXN0L21hbmlmZXN0cGFja2FnZS9hLwotU3BlY2lmaWNhdGlvbi1UaXRsZTogYQotU3BlY2lmaWNhdGlvbi1WZXJzaW9uOiAxLjEKLVNwZWNpZmljYXRpb24tVmVuZG9yOiBlcXVpbm94Ci1JbXBsZW1lbnRhdGlvbi1UaXRsZTogQQotSW1wbGVtZW50YXRpb24tVmVyc2lvbjogMTEuMAotSW1wbGVtZW50YXRpb24tVmVuZG9yOiBlcXVpbm94Ci0KLU5hbWU6IHRlc3QvbWFuaWZlc3RwYWNrYWdlL2IvCi1TcGVjaWZpY2F0aW9uLVRpdGxlOiBiCi1TcGVjaWZpY2F0aW9uLVZlcnNpb246IDEuMgotU3BlY2lmaWNhdGlvbi1WZW5kb3I6IGVxdWlub3gKLUltcGxlbWVudGF0aW9uLVRpdGxlOiBCCi1JbXBsZW1lbnRhdGlvbi1WZXJzaW9uOiAxMi4wCi1JbXBsZW1lbnRhdGlvbi1WZW5kb3I6IGVxdWlub3gKLQotTmFtZTogdGVzdC9tYW5pZmVzdHBhY2thZ2UvYy8KLVNwZWNpZmljYXRpb24tVGl0bGU6IGMKLVNwZWNpZmljYXRpb24tVmVyc2lvbjogMS4zCi1TcGVjaWZpY2F0aW9uLVZlbmRvcjogZXF1aW5veAotSW1wbGVtZW50YXRpb24tVGl0bGU6IEMKLUltcGxlbWVudGF0aW9uLVZlcnNpb246IDEzLjAKLUltcGxlbWVudGF0aW9uLVZlbmRvcjogZXF1aW5veApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubWFuaWZlc3RwYWNrYWdlL3Rlc3QvbWFuaWZlc3RwYWNrYWdlL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubWFuaWZlc3RwYWNrYWdlL3Rlc3QvbWFuaWZlc3RwYWNrYWdlL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM5MDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0Lm1hbmlmZXN0cGFja2FnZS90ZXN0L21hbmlmZXN0cGFja2FnZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0Lm1hbmlmZXN0cGFja2FnZTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgdGVzdC5tYW5pZmVzdHBhY2thZ2UuYS5BOwotaW1wb3J0IHRlc3QubWFuaWZlc3RwYWNrYWdlLmIuQjsKLWltcG9ydCB0ZXN0Lm1hbmlmZXN0cGFja2FnZS5jLkM7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGFja2FnZSBhUGtnID0gQS5jbGFzcy5nZXRQYWNrYWdlKCk7Ci0JCWFzc2VydE5vdE51bGwoImFQa2ciLCBhUGtnKTsKLQkJY2hlY2tQYWNrYWdlKGFQa2csICJhIiwgIjEuMSIsICJlcXVpbm94IiwgIkEiLCAiMTEuMCIsICJlcXVpbm94Iik7Ci0JCVBhY2thZ2UgYlBrZyA9IEIuY2xhc3MuZ2V0UGFja2FnZSgpOwotCQlhc3NlcnROb3ROdWxsKCJiUGtnIiwgYlBrZyk7Ci0JCWNoZWNrUGFja2FnZShiUGtnLCAiYiIsICIxLjIiLCAiZXF1aW5veCIsICJCIiwgIjEyLjAiLCAiZXF1aW5veCIpOwotCQlQYWNrYWdlIGNQa2cgPSBDLmNsYXNzLmdldFBhY2thZ2UoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiY1BrZyIsIGNQa2cpOwotCQljaGVja1BhY2thZ2UoY1BrZywgImMiLCAiMS4zIiwgImVxdWlub3giLCAiQyIsICIxMy4wIiwgImVxdWlub3giKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tQYWNrYWdlKFBhY2thZ2UgcGtnLCBTdHJpbmcgc3BlY1RpdGxlLCBTdHJpbmcgc3BlY1ZlcnNpb24sIFN0cmluZyBzcGVjVmVuZG9yLCBTdHJpbmcgaW1wbFRpdGxlLCBTdHJpbmcgaW1wbFZlcnNpb24sIFN0cmluZyBpbXBsVmVuZG9yKSB7Ci0JCWFzc2VydEVxdWFscyhzcGVjVGl0bGUsIHBrZy5nZXRTcGVjaWZpY2F0aW9uVGl0bGUoKSk7Ci0JCWFzc2VydEVxdWFscyhzcGVjVmVyc2lvbiwgcGtnLmdldFNwZWNpZmljYXRpb25WZXJzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoc3BlY1ZlbmRvciwgcGtnLmdldFNwZWNpZmljYXRpb25WZW5kb3IoKSk7Ci0JCWFzc2VydEVxdWFscyhpbXBsVGl0bGUsIHBrZy5nZXRJbXBsZW1lbnRhdGlvblRpdGxlKCkpOwotCQlhc3NlcnRFcXVhbHMoaW1wbFZlcnNpb24sIHBrZy5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhpbXBsVmVuZG9yLCBwa2cuZ2V0SW1wbGVtZW50YXRpb25WZW5kb3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwpIHsKLQkJaWYgKCFleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZDogXCIiICsgZXhwZWN0ZWQgKyAiXCIgYnV0IGdvdDogXCIiICsgYWN0dWFsICsgIlwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFzc2VydE5vdE51bGwoU3RyaW5nIG1zZywgUGFja2FnZSBwa2cpIHsKLQkJaWYgKHBrZyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5tYW5pZmVzdHBhY2thZ2UvdGVzdC9tYW5pZmVzdHBhY2thZ2UvYS9BLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5tYW5pZmVzdHBhY2thZ2UvdGVzdC9tYW5pZmVzdHBhY2thZ2UvYS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTdhY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubWFuaWZlc3RwYWNrYWdlL3Rlc3QvbWFuaWZlc3RwYWNrYWdlL2EvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QubWFuaWZlc3RwYWNrYWdlLmE7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubWFuaWZlc3RwYWNrYWdlL3Rlc3QvbWFuaWZlc3RwYWNrYWdlL2IvQi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QubWFuaWZlc3RwYWNrYWdlL3Rlc3QvbWFuaWZlc3RwYWNrYWdlL2IvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYThjZTU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0Lm1hbmlmZXN0cGFja2FnZS90ZXN0L21hbmlmZXN0cGFja2FnZS9iL0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0Lm1hbmlmZXN0cGFja2FnZS5iOwotCi1wdWJsaWMgY2xhc3MgQiB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0Lm1hbmlmZXN0cGFja2FnZS90ZXN0L21hbmlmZXN0cGFja2FnZS9jL0MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0Lm1hbmlmZXN0cGFja2FnZS90ZXN0L21hbmlmZXN0cGFja2FnZS9jL0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZlNzVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC5tYW5pZmVzdHBhY2thZ2UvdGVzdC9tYW5pZmVzdHBhY2thZ2UvYy9DLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdC5tYW5pZmVzdHBhY2thZ2UuYzsKLQotcHVibGljIGNsYXNzIEMgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC50Y2NsL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QudGNjbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxMGRmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC50Y2NsL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0LnRjY2wKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHR0ZXN0LnRjY2wKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogdGVzdC50Y2NsLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yawpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QudGNjbC90ZXN0L3RjY2wvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC50Y2NsL3Rlc3QvdGNjbC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyZTA5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC50Y2NsL3Rlc3QvdGNjbC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0LnRjY2w7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlDbGFzc0xvYWRlciB0Y2NsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJQ2xhc3NMb2FkZXIgc2VydmljZVRDQ0wgPSAoQ2xhc3NMb2FkZXIpIGNvbnRleHQuZ2V0U2VydmljZShjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2VzKENsYXNzTG9hZGVyLmNsYXNzLmdldE5hbWUoKSwgIihlcXVpbm94LmNsYXNzbG9hZGVyLnR5cGU9Y29udGV4dENsYXNzTG9hZGVyKSIpWzBdKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGNjbCAhPSBzZXJ2aWNlVENDTCkKLQkJCXRocm93IG5ldyBCdW5kbGVFeGNlcHRpb24oIldyb25nIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlciBmb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlDbGFzc0xvYWRlciB0Y2NsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJQ2xhc3NMb2FkZXIgc2VydmljZVRDQ0wgPSAoQ2xhc3NMb2FkZXIpIGNvbnRleHQuZ2V0U2VydmljZShjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2VzKENsYXNzTG9hZGVyLmNsYXNzLmdldE5hbWUoKSwgIihlcXVpbm94LmNsYXNzbG9hZGVyLnR5cGU9Y29udGV4dENsYXNzTG9hZGVyKSIpWzBdKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGNjbCAhPSBzZXJ2aWNlVENDTCkKLQkJCXRocm93IG5ldyBCdW5kbGVFeGNlcHRpb24oIldyb25nIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlciBmb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NzA4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IHRlc3QxIGJ1bmRsZQotQnVuZGxlLVN5bWJvbGljTmFtZTogdGVzdDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogdGVzdDEuQWN0aXZhdG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotQnVuZGxlLUNsYXNzUGF0aDogLiwgc3R1ZmYvCi1FeHBvcnQtUGFja2FnZTogZGF0YSwKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmFwcGFkbWluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC9hL2IvYy9kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QvYS9iL2MvZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC9hL2IvYy9kCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0L2RhdGEvcmVzb3VyY2UxIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QvZGF0YS9yZXNvdXJjZTEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZDA0N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QvZGF0YS9yZXNvdXJjZTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1yb290IGNsYXNzcGF0aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0L3N0dWZmL2RhdGEvcmVzb3VyY2UxIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3Qvc3R1ZmYvZGF0YS9yZXNvdXJjZTEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMDgyYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3Qvc3R1ZmYvZGF0YS9yZXNvdXJjZTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdHVmZiBjbGFzc3BhdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdC90ZXN0MS9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0L3Rlc3QxL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2VlOGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0L3Rlc3QxL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3QxOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0Mi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0Mi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlNTdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGVzdDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiB0ZXN0MiBidW5kbGUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRlc3QyCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcywKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1CdW5kbGUtQ2xhc3NQYXRoOiAuLCBzdHVmZi8KLVJlcXVpcmUtQnVuZGxlOiB0ZXN0MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QyL2RhdGEvcmVzb3VyY2UxIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QyL2RhdGEvcmVzb3VyY2UxCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI4ZjFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0Mi9kYXRhL3Jlc291cmNlMQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXJvb3QgY2xhc3NwYXRoIHRlc3QyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QyL3N0dWZmL2RhdGEvcmVzb3VyY2UxIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3Rlc3QyL3N0dWZmL2RhdGEvcmVzb3VyY2UxCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThhZWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90ZXN0Mi9zdHVmZi9kYXRhL3Jlc291cmNlMQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN0dWZmIGNsYXNzcGF0aCB0ZXN0MgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90aHJlYWQubG9ja3Rlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGhyZWFkLmxvY2t0ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQxNWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90aHJlYWQubG9ja3Rlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBvc2dpIHRlc3QKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHRocmVhZC5sb2NrdGVzdAotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiAKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1BY3RpdmF0b3I6IHRocmVhZC5sb2NrdGVzdC5BY3RpdmF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90aHJlYWQubG9ja3Rlc3QvdGhyZWFkL2xvY2t0ZXN0L0FUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGhyZWFkLmxvY2t0ZXN0L3RocmVhZC9sb2NrdGVzdC9BVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgyMmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90aHJlYWQubG9ja3Rlc3QvdGhyZWFkL2xvY2t0ZXN0L0FUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGhyZWFkLmxvY2t0ZXN0OwotCi1wdWJsaWMgY2xhc3MgQVRlc3QgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGhyZWFkLmxvY2t0ZXN0L3RocmVhZC9sb2NrdGVzdC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90aHJlYWQubG9ja3Rlc3QvdGhyZWFkL2xvY2t0ZXN0L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWE3ZWVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90aHJlYWQubG9ja3Rlc3QvdGhyZWFkL2xvY2t0ZXN0L0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRocmVhZC5sb2NrdGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yLCBSdW5uYWJsZSB7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCAidGhyZWFkLmxvY2t0ZXN0Iik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYWJvdXQgdG8gc3RhcnQgdGhyZWFkIik7Ci0JCXRocmVhZC5zdGFydCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImFib3V0IHRvIGpvaW4gdGhlIHRocmVhZCIpOwotCQl0aHJlYWQuam9pbigxMDAwMCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYWZ0ZXIgam9pbmluZyB0aHJlYWQiKTsKLQkJQWJzdHJhY3RCdW5kbGVUZXN0cy5zaW1wbGVSZXN1bHRzLmFkZEV2ZW50KG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjb250ZXh0LmdldEJ1bmRsZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQobmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNvbnRleHQuZ2V0QnVuZGxlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYWJvdXQgdG8gbG9hZCBDbGFzczEiKTsKLQkJbmV3IENsYXNzMSgpOwotCQlsb25nIHRvdGFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvYWRlZCBDbGFzczEgIiArIHRvdGFsVGltZSk7Ci0JCWlmICh0b3RhbFRpbWUgPCAxMDAwMCkKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChuZXcgTG9uZyg1MDAwKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMvdGhyZWFkLmxvY2t0ZXN0L3RocmVhZC9sb2NrdGVzdC9DbGFzczEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90aHJlYWQubG9ja3Rlc3QvdGhyZWFkL2xvY2t0ZXN0L0NsYXNzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjIwM2NhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy90aHJlYWQubG9ja3Rlc3QvdGhyZWFkL2xvY2t0ZXN0L0NsYXNzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRocmVhZC5sb2NrdGVzdDsKLQotcHVibGljIGNsYXNzIENsYXNzMSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0MS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0MS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkMjdjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMveGZyaWVuZHMudGVzdDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IHhmcmllbmRzLnRlc3QxCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB4ZnJpZW5kcy50ZXN0MQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1FeHBvcnQtUGFja2FnZTogeGZyaWVuZHMudGVzdDEub25seWZvcmZyaWVuZHM7IHgtZnJpZW5kczo9InhmcmllbmRzLnRlc3QyIiwKLSB4ZnJpZW5kcy50ZXN0MS5leHRlcm5hbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3hmcmllbmRzLnRlc3QxL3hmcmllbmRzL3Rlc3QxL2V4dGVybmFsL1Rlc3RGcmllbmRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMveGZyaWVuZHMudGVzdDEveGZyaWVuZHMvdGVzdDEvZXh0ZXJuYWwvVGVzdEZyaWVuZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhMTRmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMveGZyaWVuZHMudGVzdDEveGZyaWVuZHMvdGVzdDEvZXh0ZXJuYWwvVGVzdEZyaWVuZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB4ZnJpZW5kcy50ZXN0MS5leHRlcm5hbDsKLQotcHVibGljIGNsYXNzIFRlc3RGcmllbmRzIHsKLQkvLyBub3RoaW5nCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMveGZyaWVuZHMudGVzdDEveGZyaWVuZHMvdGVzdDEvb25seWZvcmZyaWVuZHMvVGVzdEZyaWVuZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0MS94ZnJpZW5kcy90ZXN0MS9vbmx5Zm9yZnJpZW5kcy9UZXN0RnJpZW5kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQ1MmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0MS94ZnJpZW5kcy90ZXN0MS9vbmx5Zm9yZnJpZW5kcy9UZXN0RnJpZW5kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHhmcmllbmRzLnRlc3QxLm9ubHlmb3JmcmllbmRzOwotCi1wdWJsaWMgY2xhc3MgVGVzdEZyaWVuZHMgewotCS8vIG5vdGhpbmcKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0Mi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0Mi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3YWQ1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMveGZyaWVuZHMudGVzdDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IHhmcmllbmRzLnRlc3QyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiB4ZnJpZW5kcy50ZXN0MgotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQWN0aXZhdG9yOiB4ZnJpZW5kcy50ZXN0Mi5BY3RpdmF0b3IKLVJlcXVpcmUtQnVuZGxlOiB4ZnJpZW5kcy50ZXN0MQotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yaywKLSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0Mi94ZnJpZW5kcy90ZXN0Mi9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0Mi94ZnJpZW5kcy90ZXN0Mi9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2NDljMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvYnVuZGxlc19zcmMveGZyaWVuZHMudGVzdDIveGZyaWVuZHMvdGVzdDIvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgeGZyaWVuZHMudGVzdDI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQoQ2xhc3MuZm9yTmFtZSgieGZyaWVuZHMudGVzdDEub25seWZvcmZyaWVuZHMuVGVzdEZyaWVuZHMiKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlBYnN0cmFjdEJ1bmRsZVRlc3RzLnNpbXBsZVJlc3VsdHMuYWRkRXZlbnQodCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChDbGFzcy5mb3JOYW1lKCJ4ZnJpZW5kcy50ZXN0MS5leHRlcm5hbC5UZXN0RnJpZW5kcyIpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudCh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3hmcmllbmRzLnRlc3QzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3hmcmllbmRzLnRlc3QzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjBhY2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0My9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogeGZyaWVuZHMudGVzdDMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IHhmcmllbmRzLnRlc3QzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IHhmcmllbmRzLnRlc3QzLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IHhmcmllbmRzLnRlc3QxCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrLAotIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3hmcmllbmRzLnRlc3QzL3hmcmllbmRzL3Rlc3QzL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL2J1bmRsZXNfc3JjL3hmcmllbmRzLnRlc3QzL3hmcmllbmRzL3Rlc3QzL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDNkNDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9idW5kbGVzX3NyYy94ZnJpZW5kcy50ZXN0My94ZnJpZW5kcy90ZXN0My9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB4ZnJpZW5kcy50ZXN0MzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChDbGFzcy5mb3JOYW1lKCJ4ZnJpZW5kcy50ZXN0MS5vbmx5Zm9yZnJpZW5kcy5UZXN0RnJpZW5kcyIpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudCgic3VjY2VzcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudChDbGFzcy5mb3JOYW1lKCJ4ZnJpZW5kcy50ZXN0MS5leHRlcm5hbC5UZXN0RnJpZW5kcyIpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUFic3RyYWN0QnVuZGxlVGVzdHMuc2ltcGxlUmVzdWx0cy5hZGRFdmVudCh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllNmRiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InNpbXBsZUFwcCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgY2FyZGluYWxpdHk9IjEiCi0gICAgICAgICAgICB0aHJlYWQ9ImFueSIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYXBwYWRtaW4uU2ltcGxlQXBwIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Imdsb2JhbFNpbmdsZXRvbkFwcCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5hcHBhZG1pbi5TaW1wbGVBcHAiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdENhcmRpbmFsaXR5MDEiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGNhcmRpbmFsaXR5PSIxMCIKLSAgICAgICAgICAgIHRocmVhZD0iYW55IgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5hcHBhZG1pbi5TaW1wbGVBcHAiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdENhcmRpbmFsaXR5MDIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGNhcmRpbmFsaXR5PSIqIgotICAgICAgICAgICAgdGhyZWFkPSJhbnkiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmFwcGFkbWluLlNpbXBsZUFwcCI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ0ZXN0TWFpblRocmVhZGVkMDEiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGNhcmRpbmFsaXR5PSIqIgotICAgICAgICAgICAgdGhyZWFkPSJtYWluIgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5hcHBhZG1pbi5TaW1wbGVBcHAiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVzdE1haW5UaHJlYWRlZDAyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBjYXJkaW5hbGl0eT0iMSIKLSAgICAgICAgICAgIHRocmVhZD0ibWFpbiIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYXBwYWRtaW4uU2ltcGxlQXBwIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImZhaWxlZEFwcCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgY2FyZGluYWxpdHk9IjEiCi0gICAgICAgICAgICB0aHJlYWQ9ImFueSIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYXBwYWRtaW4uRmFpbGVkQXBwIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImV4aXRWYWx1ZUFwcCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgY2FyZGluYWxpdHk9IjEiCi0gICAgICAgICAgICB0aHJlYWQ9ImFueSIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYXBwYWRtaW4uRXhpdFZhbHVlQXBwIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvQXV0b21hdGVkVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9BdXRvbWF0ZWRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM2OGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9BdXRvbWF0ZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5jb21wb3NpdGVzLkFsbENvbXBvc2l0ZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuZGVidWdvcHRpb25zLkRlYnVnT3B0aW9uc1Rlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuZXZlbnRtZ3IuRXZlbnRNYW5hZ2VyVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5maWx0ZXIuRmlsdGVyVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5pbnRlcm5hbC5wbHVnaW5zLkluc3RhbGxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmxpc3RlbmVycy5FeGNlcHRpb25IYW5kbGVyVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5taXNjLk1pc2NUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnBlcm1pc3Npb25zLlBlcm1pc3Npb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VyZWdpc3RyeS5TZXJ2aWNlUmVnaXN0cnlUZXN0czsKLQotcHVibGljIGNsYXNzIEF1dG9tYXRlZFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBJX09TR0lfVEVTVFMgPSAib3JnLmVjbGlwc2Uub3NnaS50ZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFsbFRlc3RzIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBBdXRvbWF0ZWRUZXN0cygpIHsKLQkJc3VwZXIobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQWxsVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEF1dG9tYXRlZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBdXRvbWF0ZWRUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQkvLwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFNpbXBsZVRlc3RzLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShJbnN0YWxsVGVzdHMuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmVjbGlwc2VhZGFwdG9yLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRGVidWdPcHRpb25zVGVzdENhc2Uuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZWN1cml0eS5TZWN1cml0eVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmFwcGFkbWluLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoRXhjZXB0aW9uSGFuZGxlclRlc3RzLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5jb25maWd1cmF0aW9uLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMuZGF0YWxvY2F0aW9uLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMudXRpbC5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChNaXNjVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQnVuZGxlVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoU2VydmljZVJlZ2lzdHJ5VGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRXZlbnRNYW5hZ2VyVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRmlsdGVyVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoUGVybWlzc2lvblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFsbENvbXBvc2l0ZVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VjdXJpdHlhZG1pbi5BbGxTZWN1cml0eUFkbWluVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvT1NHaVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9PU0dpVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTNiMTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9PU0dpVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLkNvcmVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE9TR2lUZXN0IGV4dGVuZHMgQ29yZVRlc3QgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfT1NHSV9URVNUUyA9ICJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzIjsKLQotCXB1YmxpYyBPU0dpVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT1NHaVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9PU0dpVGVzdHNBY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9PU0dpVGVzdHNBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5YTU0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvT1NHaVRlc3RzQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgT1NHaVRlc3RzQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZJTEVTX1JPT1QgPSAidGVzdF9maWxlcy8iOwotCi0JcHJpdmF0ZSBzdGF0aWMgT1NHaVRlc3RzQWN0aXZhdG9yIGluc3RhbmNlOwotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JcHVibGljIE9TR2lUZXN0c0FjdGl2YXRvcigpIHsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbnRleHQgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gaW5zdGFuY2UgIT0gbnVsbCA/IGluc3RhbmNlLmNvbnRleHQgOiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9hcHBhZG1pbi9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2FwcGFkbWluL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTBiYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2FwcGFkbWluL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYXBwYWRtaW47Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFwcGxpY2F0aW9uQWRtaW5UZXN0LnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2FwcGFkbWluL0FwcGxpY2F0aW9uQWRtaW5UZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYXBwYWRtaW4vQXBwbGljYXRpb25BZG1pblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwOWQ4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYXBwYWRtaW4vQXBwbGljYXRpb25BZG1pblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmFwcGFkbWluOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLnNlc3Npb24uQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5zZXNzaW9uLlNldHVwTWFuYWdlci5TZXR1cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5CdW5kbGVJbnN0YWxsZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5hcHBsaWNhdGlvbi4qOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXJDdXN0b21pemVyOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25BZG1pblRlc3QgZXh0ZW5kcyBPU0dpVGVzdCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVzdFJ1bm5lckFwcCA9ICJvcmcuZWNsaXBzZS5wZGUuanVuaXQucnVudGltZS5jb3JldGVzdGFwcGxpY2F0aW9ubm9ubWFpbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0UmVzdWx0cyA9ICJ0ZXN0LnJlc3VsdHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VDQ0VTUyA9ICJzdWNjZXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEREVEID0gImFkZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEID0gIm1vZGlmaWVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRUQgPSAicmVtb3ZlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBzaW1wbGVSZXN1bHRzID0gInRlc3Quc2ltcGxlUmVzdWx0cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRlc3RzID0gbmV3IFN0cmluZ1tdIHsKLQkJCSJ0ZXN0U2ltcGxlQXBwIiwgInRlc3RJbnZhbGlkQXJncyIsICJ0ZXN0QXN5bmNWYWx1ZTAxIiwgInRlc3RBc3luY1ZhbHVlMDIiLCAidGVzdEFzeW5jVmFsdWUwMyIsICJ0ZXN0QXN5bmNWYWx1ZTA0IiwgInRlc3RBc3luY1ZhbHVlMDUiLCAidGVzdEFzeW5jVmFsdWUwNiIsICJ0ZXN0RXhpdFZhbHVlMDEiLCAidGVzdEV4aXRWYWx1ZTAyIiwgInRlc3RFeGl0VmFsdWUwMyIsICJ0ZXN0RXhpdFZhbHVlMDQiLCAidGVzdEV4aXRWYWx1ZTA1IiwgInRlc3RFeGl0VmFsdWUwNiIsICJ0ZXN0RXhpdFZhbHVlMDciLCAidGVzdEV4aXRWYWx1ZTA4IiwgInRlc3RFeGl0VmFsdWUwOSIsICJ0ZXN0RXhpdFZhbHVlMTAiLCAidGVzdEdsb2JhbFNpbmdsZXRvbiIsICJ0ZXN0Q2FyZGluYWxpdHkwMSIsICJ0ZXN0Q2FyZGluYWxpdHkwMiIsICJ0ZXN0TWFpblRocmVhZGVkMDEiLCAidGVzdE1haW5UaHJlYWRlZDAyIiwgInRlc3RIYW5kbGVFdmVudHMwMSIsICJ0ZXN0RGVzY3JpcHRvckV2ZW50czAxIiwgInRlc3RQZXJzaXN0ZW50TG9jazAxIiwgInRlc3RQZXJzaXN0ZW50TG9jazAyIiwgInRlc3RQZXJzaXN0ZW50TG9jazAzIiwgInRlc3RQZXJzaXN0ZW50U2NoZWR1bGUwMSIsICJ0ZXN0UGVyc2lzdGVudFNjaGVkdWxlMDIiLCAidGVzdFBlcnNpc3RlbnRTY2hlZHVsZTAzIiwgInRlc3RQZXJzaXN0ZW50U2NoZWR1bGUwNCIsICJ0ZXN0UGVyc2lzdGVudFNjaGVkdWxlMDUiLCAidGVzdFBlcnNpc3RlbnRTY2hlZHVsZTA2IiwgInRlc3RQZXJzaXN0ZW50U2NoZWR1bGUwNyIsICJ0ZXN0UGVyc2lzdGVudFNjaGVkdWxlMDgiLCAidGVzdEZhaWxlZEFwcGxpY2F0aW9uMDEiLCAidGVzdERlc3Ryb3lCZWZvcmVTdGFydDAxIiwgInRlc3REZXN0cm95QmVmb3JlU3RhcnQwMiJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJCAvLyROT04tTkxTLTExJCAvLyROT04tTkxTLTEyJCAvLyROT04tTkxTLTEzJCAvLyROT04tTkxTLTE0JCAvLyROT04tTkxTLTE1JCAvLyROT04tTkxTLTE2JCAvLyROT04tTkxTLTE3JCAvLyROT04tTkxTLTE4JCAvLyROT04tTkxTLTE5JCAvLyROT04tTkxTLTIwJCAvLyROT04tTkxTLTIxJCAvLyROT04tTkxTLTIyJCAvLyROT04tTkxTLTIzJCAvLyROT04tTkxTLTI0JCAvLyROT04tTkxTLTI1JCAvLyROT04tTkxTLTI2JCAvLyROT04tTkxTLTI3JCAvLyROT04tTkxTLTI4JCAvLyROT04tTkxTLTI5JAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9PU0dJX1NFUlZJQ0VTID0gIm9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQXBwbGljYXRpb25BZG1pblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCQlDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZSBhcHBBZG1pblNlc3Npb25UZXN0ID0gbmV3IENvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlKFBJX09TR0lfVEVTVFMsIEFwcGxpY2F0aW9uQWRtaW5UZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCVN0cmluZ1tdIGlkcyA9IENvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlLk1JTklNQUxfQlVORExFX1NFVDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCi0JCQlhcHBBZG1pblNlc3Npb25UZXN0LmFkZEJ1bmRsZShpZHNbaV0pOwotCQlhcHBBZG1pblNlc3Npb25UZXN0LmFkZEJ1bmRsZShQSV9PU0dJX1NFUlZJQ0VTKTsKLQkJYXBwQWRtaW5TZXNzaW9uVGVzdC5hZGRCdW5kbGUoUElfT1NHSV9URVNUUyk7Ci0JCWFwcEFkbWluU2Vzc2lvblRlc3Quc2V0QXBwbGljYXRpb25JZCh0ZXN0UnVubmVyQXBwKTsKLQkJdHJ5IHsKLQkJCWFwcEFkbWluU2Vzc2lvblRlc3QuZ2V0U2V0dXAoKS5zZXRTeXN0ZW1Qcm9wZXJ0eSgiZWNsaXBzZS5hcHBsaWNhdGlvbi5yZWdpc3RlckRlc2NyaXB0b3JzIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoU2V0dXBFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJLy8gd2UgYWRkIHRlc3RzIHRoZSBoYXJkIHdheSBzbyB3ZSBjYW4gY29udHJvbCB0aGUgb3JkZXIgb2YgdGhlIHRlc3RzLgotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgaSsrKQotCQkJYXBwQWRtaW5TZXNzaW9uVGVzdC5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvbkFkbWluVGVzdCh0ZXN0c1tpXSkpOwotCQlzdWl0ZS5hZGRUZXN0KGFwcEFkbWluU2Vzc2lvblRlc3QpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uQWRtaW5UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgQXBwbGljYXRpb25EZXNjcmlwdG9yIGdldEFwcGxpY2F0aW9uKFN0cmluZyBhcHBOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJCdW5kbGVDb250ZXh0IGlzIG51bGwhISIsIGNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCQlDbGFzcyBhcHBEZXNjQ2xhc3MgPSBBcHBsaWNhdGlvbkRlc2NyaXB0b3IuY2xhc3M7Ci0JCQlhc3NlcnROb3ROdWxsKCJBcHBsaWNhdGlvbkRlc2NyaXB0b3IuY2xhc3MgaXMgbnVsbCEhIiwgYXBwRGVzY0NsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJU2VydmljZVJlZmVyZW5jZVtdIHJlZnMgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2VzKGFwcERlc2NDbGFzcy5nZXROYW1lKCksICIoIiArIEFwcGxpY2F0aW9uRGVzY3JpcHRvci5BUFBMSUNBVElPTl9QSUQgKyAiPSIgKyBhcHBOYW1lICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWlmIChyZWZzID09IG51bGwgfHwgcmVmcy5sZW5ndGggPT0gMCkgewotCQkJCXJlZnMgPSBnZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZXMoQXBwbGljYXRpb25EZXNjcmlwdG9yLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCQkJU3RyaW5nIGF2YWlsYWJsZUFwcHMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZWZzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlhdmFpbGFibGVBcHBzICs9IHJlZnNbaV0uZ2V0UHJvcGVydHkoQXBwbGljYXRpb25EZXNjcmlwdG9yLkFQUExJQ0FUSU9OX1BJRCk7Ci0JCQkJCQlpZiAoaSA8IHJlZnMubGVuZ3RoIC0gMSkKLQkJCQkJCQlhdmFpbGFibGVBcHBzICs9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWZhaWwoIkNvdWxkIG5vdCBmaW5kIGFwcCBwaWQ6ICIgKyBhcHBOYW1lICsgIiBhdmFpbGFibGUgYXBwcyBhcmU6ICIgKyBhdmFpbGFibGVBcHBzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgcmVzdWx0ID0gKEFwcGxpY2F0aW9uRGVzY3JpcHRvcikgZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UocmVmc1swXSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShyZWZzWzBdKTsKLQkJCWVsc2UKLQkJCQlmYWlsKCJDb3VsZCBub3QgZ2V0IGFwcGxpY2F0aW9uIGRlc2NyaXB0b3Igc2VydmljZTogIiArIGFwcE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkNvdWxkIG5vdCBjcmVhdGUgYXBwIGZpbHRlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEFyZ3VtZW50cygpIHsKLQkJSGFzaE1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXJncy5wdXQodGVzdFJlc3VsdHMsIG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gYXJnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQXBwKCkgewotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuc2ltcGxlQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJSGFzaE1hcCBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0JCUhhc2hNYXAgcmVzdWx0cyA9IChIYXNoTWFwKSBhcmdzLmdldCh0ZXN0UmVzdWx0cyk7Ci0JCXRyeSB7Ci0JCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBhcHAubGF1bmNoKGFyZ3MpOwotCQkJaGFuZGxlLmRlc3Ryb3koKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBsYXVuY2ggc2ltcGxlQXBwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgcmVzdWx0cy5nZXQoc2ltcGxlUmVzdWx0cyk7Ci0JCWFzc2VydEVxdWFscygiQ2hlY2sgYXBwbGljYXRpb24gcmVzdWx0IiwgU1VDQ0VTUywgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBkb0ludmFsaWRTY2hlZHVsZUFyZ3MoQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCwgU3RyaW5nIGlkLCBNYXAgaW52YWxpZEFyZ3MsIFN0cmluZyB0b3BpYywgU3RyaW5nIGV2ZW50RmlsdGVyLCBib29sZWFuIHJlY3VycmluZywgYm9vbGVhbiBpbnZhbGlkS2V5cywgYm9vbGVhbiBpbnZhbGlkVmFsdWVzKSB7Ci0JCVNjaGVkdWxlZEFwcGxpY2F0aW9uIHNjaGVkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNjaGVkID0gYXBwLnNjaGVkdWxlKGlkLCBpbnZhbGlkQXJncywgdG9waWMsIGV2ZW50RmlsdGVyLCByZWN1cnJpbmcpOwotCQkJdHJ5IHsKLQkJCQlzY2hlZC5yZW1vdmUoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQkJaWYgKGludmFsaWRLZXlzIHx8IGludmFsaWRWYWx1ZXMpCi0JCQkJZmFpbCgiU2hvdWxkIGhhdmUgZmFpbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzY2hlZHVsZSBhbiBhcHBsaWNhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoIWludmFsaWRLZXlzKQotCQkJCWZhaWwoIkZhaWxlZCB0byBzY2hlZHVsZSBhbiBhcHBsaWNhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWlmICghaW52YWxpZFZhbHVlcykKLQkJCQlmYWlsKCJGYWlsZWQgdG8gc2NoZWR1bGUgYW4gYXBwbGljYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGUuZ2V0RXJyb3JDb2RlKCkgIT0gQXBwbGljYXRpb25FeGNlcHRpb24uQVBQTElDQVRJT05fSU5WQUxJRF9TVEFSVFVQX0FSR1VNRU5UKQotCQkJCWZhaWwoIkZhaWxlZCB0byBzY2hlZHVsZSBhbiBhcHBsaWNhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFyZ3MoKSB7Ci0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5zaW1wbGVBcHAiKTsgLy8kTk9OLU5MUy0xJAotCQlIYXNoTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlhcmdzLnB1dCgidGVzdC5hcmcxIiwgQm9vbGVhbi5UUlVFKTsgLy8kTk9OLU5MUy0xJAotCQlhcmdzLnB1dCgidGVzdC5hcmcyIiwgbmV3IEludGVnZXIoMzQpKTsgLy8kTk9OLU5MUy0xJAotCQlhcmdzLnB1dCgidGVzdC5hcmczIiwgbmV3IExvbmcoMzQpKTsgLy8kTk9OLU5MUy0xJAotCQlkb0ludmFsaWRTY2hlZHVsZUFyZ3MoYXBwLCAic2NoZWR1bGUudGVzdGFyZ3MiLCBhcmdzLCAib3JnL29zZ2kvYXBwbGljYXRpb24vdGltZXIiLCAiKG1pbnV0ZT0qKSIsIHRydWUsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJYXJncy5wdXQoInRlc3QuYXJnNCIsIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCWRvSW52YWxpZFNjaGVkdWxlQXJncyhhcHAsICJzY2hlZHVsZS50ZXN0YXJncyIsIGFyZ3MsICJvcmcvb3NnaS9hcHBsaWNhdGlvbi90aW1lciIsICIobWludXRlPSopIiwgdHJ1ZSwgZmFsc2UsIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCUNvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYXJncy5wdXQoInRlc3QuYXJnNCIsIGxpc3QpOyAvLyROT04tTkxTLTEkCi0JCWRvSW52YWxpZFNjaGVkdWxlQXJncyhhcHAsICJzY2hlZHVsZS50ZXN0YXJncyIsIGFyZ3MsICJvcmcvb3NnaS9hcHBsaWNhdGlvbi90aW1lciIsICIobWludXRlPSopIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQlsaXN0LmFkZCh0aGlzKTsKLQkJYXJncy5wdXQoInRlc3QuYXJnNCIsIGxpc3QpOyAvLyROT04tTkxTLTEkCi0JCWRvSW52YWxpZFNjaGVkdWxlQXJncyhhcHAsICJzY2hlZHVsZS50ZXN0YXJncyIsIGFyZ3MsICJvcmcvb3NnaS9hcHBsaWNhdGlvbi90aW1lciIsICIobWludXRlPSopIiwgdHJ1ZSwgZmFsc2UsIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCWxpc3QuY2xlYXIoKTsKLQkJbGlzdC5hZGQoInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlsaXN0LmFkZChuZXcgSW50ZWdlcigwKSk7Ci0JCWxpc3QuYWRkKG5ldyBMb25nKDApKTsKLQkJbGlzdC5hZGQobmV3IEZsb2F0KDApKTsKLQkJbGlzdC5hZGQobmV3IERvdWJsZSgwKSk7Ci0JCWxpc3QuYWRkKG5ldyBCeXRlKChieXRlKSAwKSk7Ci0JCWxpc3QuYWRkKG5ldyBTaG9ydCgoc2hvcnQpIDEpKTsKLQkJbGlzdC5hZGQobmV3IENoYXJhY3RlcigoY2hhcikgMCkpOwotCQlsaXN0LmFkZChuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCWRvSW52YWxpZFNjaGVkdWxlQXJncyhhcHAsICJzY2hlZHVsZS50ZXN0YXJncyIsIGFyZ3MsICJvcmcvb3NnaS9hcHBsaWNhdGlvbi90aW1lciIsICIobWludXRlPSopIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQlhcmdzLnB1dCgidGVzdC5hcmc1IiwgbmV3IFN0cmluZ1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXJncy5wdXQoInRlc3QuYXJnNiIsIG5ldyBpbnRbMF0pOyAvLyROT04tTkxTLTEkCi0JCWFyZ3MucHV0KCJ0ZXN0LmFyZzciLCBuZXcgbG9uZ1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXJncy5wdXQoInRlc3QuYXJnOCIsIG5ldyBmbG9hdFswXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXJncy5wdXQoInRlc3QuYXJnOSIsIG5ldyBkb3VibGVbMF0pOyAvLyROT04tTkxTLTEkCi0JCWFyZ3MucHV0KCJ0ZXN0LmFyZzEwIiwgbmV3IGJ5dGVbMF0pOyAvLyROT04tTkxTLTEkCi0JCWFyZ3MucHV0KCJ0ZXN0LmFyZzExIiwgbmV3IHNob3J0WzBdKTsgLy8kTk9OLU5MUy0xJAotCQlhcmdzLnB1dCgidGVzdC5hcmcxMiIsIG5ldyBjaGFyWzBdKTsgLy8kTk9OLU5MUy0xJAotCQlhcmdzLnB1dCgidGVzdC5hcmcxMiIsIG5ldyBib29sZWFuWzBdKTsgLy8kTk9OLU5MUy0xJAotCQlkb0ludmFsaWRTY2hlZHVsZUFyZ3MoYXBwLCAic2NoZWR1bGUudGVzdGFyZ3MiLCBhcmdzLCAib3JnL29zZ2kvYXBwbGljYXRpb24vdGltZXIiLCAiKG1pbnV0ZT0qKSIsIHRydWUsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJYXJncy5wdXQoInRlc3QuYXJnMTMiLCAidGVzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXJncy5wdXQoInRlc3QuYXJnMTQiLCBuZXcgSW50ZWdlcigwKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXJncy5wdXQoInRlc3QuYXJnMTUiLCBuZXcgTG9uZygwKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXJncy5wdXQoInRlc3QuYXJnMTYiLCBuZXcgRmxvYXQoMCkpOyAvLyROT04tTkxTLTEkCi0JCWFyZ3MucHV0KCJ0ZXN0LmFyZzE3IiwgbmV3IERvdWJsZSgwKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXJncy5wdXQoInRlc3QuYXJnMTgiLCBuZXcgQnl0ZSgoYnl0ZSkgMCkpOyAvLyROT04tTkxTLTEkCi0JCWFyZ3MucHV0KCJ0ZXN0LmFyZzE5IiwgbmV3IFNob3J0KChzaG9ydCkgMSkpOyAvLyROT04tTkxTLTEkCi0JCWFyZ3MucHV0KCJ0ZXN0LmFyZzIwIiwgbmV3IENoYXJhY3RlcigoY2hhcikgMCkpOyAvLyROT04tTkxTLTEkCi0JCWFyZ3MucHV0KCJ0ZXN0LmFyZzIxIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCWRvSW52YWxpZFNjaGVkdWxlQXJncyhhcHAsICJzY2hlZHVsZS50ZXN0YXJncyIsIGFyZ3MsICJvcmcvb3NnaS9hcHBsaWNhdGlvbi90aW1lciIsICIobWludXRlPSopIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQlNYXAgdGVzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFyZ3MucHV0KCJ0ZXN0LmFyZzIyIiwgdGVzdE1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJZG9JbnZhbGlkU2NoZWR1bGVBcmdzKGFwcCwgInNjaGVkdWxlLnRlc3RhcmdzIiwgYXJncywgIm9yZy9vc2dpL2FwcGxpY2F0aW9uL3RpbWVyIiwgIihtaW51dGU9KikiLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJYXJncy5jbGVhcigpOwotCQlhcmdzLnB1dChuZXcgTG9uZygwKSwgInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlkb0ludmFsaWRTY2hlZHVsZUFyZ3MoYXBwLCAic2NoZWR1bGUudGVzdGFyZ3MiLCBhcmdzLCAib3JnL29zZ2kvYXBwbGljYXRpb24vdGltZXIiLCAiKG1pbnV0ZT0qKSIsIHRydWUsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlMDEoKSB7Ci0JCS8vIHNpbXBsZSBnZXRFeGl0VmFsdWUgdGVzdAotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuZXhpdFZhbHVlQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJQXBwbGljYXRpb25IYW5kbGUgaGFuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWhhbmRsZSA9IGFwcC5sYXVuY2gobnVsbCk7Ci0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBsYXVuY2ggc2ltcGxlQXBwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJhcHAgaGFuZGxlIGlzIG51bGwiLCBoYW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2YWx1ZSA9IChTdHJpbmcpIGhhbmRsZS5nZXRFeGl0VmFsdWUoMTAwMDApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gd2FpdGluZyBmb3IgZXhpdCB2YWx1ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgidmFsdWUgaXMgbnVsbCIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImV4aXQgdmFsdWUgaXMgaW5jb3JyZWN0IiwgRXhpdFZhbHVlQXBwLmV4aXRWYWx1ZSwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZTAyKCkgewotCQkvLyBnZXRFeGl0VmFsdWUgdGVzdCB3aGVuIGNhbGxlZCBmcm9tIGEgc2VydmljZSBsaXN0ZW5lciBkdXJpbmcgc2VydmljZSB1bnJlZ2lzdHJhdGlvbgotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuZXhpdFZhbHVlQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU2VydmljZVRyYWNrZXJDdXN0b21pemVyIHRyYWNrZXJDdXN0b21pemVyID0gbmV3IFNlcnZpY2VUcmFja2VyQ3VzdG9taXplcigpIHsKLQkJCXB1YmxpYyBPYmplY3QgYWRkaW5nU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQkJCXJldHVybiBnZXRDb250ZXh0KCkuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZmllZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBzZXJ2aWNlKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHRbMF0gPSAoKEFwcGxpY2F0aW9uSGFuZGxlKSBzZXJ2aWNlKS5nZXRFeGl0VmFsdWUoMTAwMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGU7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlTZXJ2aWNlVHJhY2tlciB0cmFja2VyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoZ2V0Q29udGV4dCgpLCBGcmFtZXdvcmtVdGlsLmNyZWF0ZUZpbHRlcigiKCYob2JqZWN0Q2xhc3M9IiArIEFwcGxpY2F0aW9uSGFuZGxlLmNsYXNzLmdldE5hbWUoKSArICIpKCIgKyBBcHBsaWNhdGlvbkhhbmRsZS5BUFBMSUNBVElPTl9ERVNDUklQVE9SICsgIj0iICsgYXBwLmdldEFwcGxpY2F0aW9uSWQoKSArICIpKSIpLCB0cmFja2VyQ3VzdG9taXplcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIHN5bnRheCBleGNlcHRpb24gZm9yIHRyYWNrZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyYWNrZXIub3BlbigpOwotCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJaGFuZGxlID0gYXBwLmxhdW5jaChudWxsKTsKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxhdW5jaCBzaW1wbGVBcHAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoImFwcCBoYW5kbGUgaXMgbnVsbCIsIGhhbmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXZhbHVlID0gKFN0cmluZykgaGFuZGxlLmdldEV4aXRWYWx1ZSgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3YWl0aW5nIGZvciBleGl0IHZhbHVlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJ2YWx1ZSBpcyBudWxsIiwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZXhpdCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCBFeGl0VmFsdWVBcHAuZXhpdFZhbHVlLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZSBmcm9tIHNlcnZpY2UgdW5yZWdpc3RlciBpcyBkaWZmZXJlbnQiLCB2YWx1ZSwgcmVzdWx0WzBdKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUwMygpIHsKLQkJLy8gZ2V0RXhpdFZhbHVlIHRlc3Qgd2hlbiBjYWxsZWQgZnJvbSBhIHNlcnZpY2UgbGlzdGVuZXIgZHVyaW5nIHNlcnZpY2UgcHJvcGVydHkgbW9kaWZpZWQgKFNUT1BQSU5HKQotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuZXhpdFZhbHVlQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU2VydmljZVRyYWNrZXJDdXN0b21pemVyIHRyYWNrZXJDdXN0b21pemVyID0gbmV3IFNlcnZpY2VUcmFja2VyQ3VzdG9taXplcigpIHsKLQkJCXB1YmxpYyBPYmplY3QgYWRkaW5nU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQkJCXJldHVybiBnZXRDb250ZXh0KCkuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZmllZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBzZXJ2aWNlKSB7Ci0JCQkJaWYgKCEib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuc3RvcHBlZCIuZXF1YWxzKHJlZmVyZW5jZS5nZXRQcm9wZXJ0eShBcHBsaWNhdGlvbkhhbmRsZS5BUFBMSUNBVElPTl9TVEFURSkpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybjsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHRbMF0gPSAoKEFwcGxpY2F0aW9uSGFuZGxlKSBzZXJ2aWNlKS5nZXRFeGl0VmFsdWUoMTAwMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGU7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCQkvLyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JCVNlcnZpY2VUcmFja2VyIHRyYWNrZXIgPSBudWxsOwotCQl0cnkgewotCQkJdHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihnZXRDb250ZXh0KCksIEZyYW1ld29ya1V0aWwuY3JlYXRlRmlsdGVyKCIoJihvYmplY3RDbGFzcz0iICsgQXBwbGljYXRpb25IYW5kbGUuY2xhc3MuZ2V0TmFtZSgpICsgIikoIiArIEFwcGxpY2F0aW9uSGFuZGxlLkFQUExJQ0FUSU9OX0RFU0NSSVBUT1IgKyAiPSIgKyBhcHAuZ2V0QXBwbGljYXRpb25JZCgpICsgIikpIiksIHRyYWNrZXJDdXN0b21pemVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgc3ludGF4IGV4Y2VwdGlvbiBmb3IgdHJhY2tlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJhY2tlci5vcGVuKCk7Ci0JCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloYW5kbGUgPSBhcHAubGF1bmNoKG51bGwpOwotCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gbGF1bmNoIHNpbXBsZUFwcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiYXBwIGhhbmRsZSBpcyBudWxsIiwgaGFuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJdmFsdWUgPSAoU3RyaW5nKSBoYW5kbGUuZ2V0RXhpdFZhbHVlKDEwMDAwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhaXRpbmcgZm9yIGV4aXQgdmFsdWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoInZhbHVlIGlzIG51bGwiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJleGl0IHZhbHVlIGlzIGluY29ycmVjdCIsIEV4aXRWYWx1ZUFwcC5leGl0VmFsdWUsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoInZhbHVlIGZyb20gc2VydmljZSB1bnJlZ2lzdGVyIGlzIGRpZmZlcmVudCIsIHZhbHVlLCByZXN1bHRbMF0pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZTA0KCkgewotCQkvLyBnZXRFeGl0VmFsdWUgdGVzdCB3aXRoIGRlc3Ryb3kgY2FsbGVkIHdoaWxlIHdhaXRpbmcgZm9yIGFuIGV4aXQgdmFsdWUKLQkJQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCA9IGdldEFwcGxpY2F0aW9uKFBJX09TR0lfVEVTVFMgKyAiLmV4aXRWYWx1ZUFwcCIpOyAvLyROT04tTkxTLTEkCi0JCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloYW5kbGUgPSBhcHAubGF1bmNoKG51bGwpOwotCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gbGF1bmNoIHNpbXBsZUFwcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiYXBwIGhhbmRsZSBpcyBudWxsIiwgaGFuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZSBkZXN0cm95SGFuZGxlID0gaGFuZGxlOwotCQluZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCWRlc3Ryb3lIYW5kbGUuZGVzdHJveSgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aGluZwotCQkJCX0KLQotCQkJfQotCQl9KS5zdGFydCgpOwotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJdmFsdWUgPSAoU3RyaW5nKSBoYW5kbGUuZ2V0RXhpdFZhbHVlKDEwMDAwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhaXRpbmcgZm9yIGV4aXQgdmFsdWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoInZhbHVlIGlzIG51bGwiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJleGl0IHZhbHVlIGlzIGluY29ycmVjdCIsIEV4aXRWYWx1ZUFwcC5leGl0VmFsdWUsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUwNSgpIHsKLQkJLy8gZ2V0RXhpdFZhbHVlIHRlc3Qgd2l0aCBkZXN0cm95IGNhbGxlZCBiZWZvcmUgZ2V0dGluZyBhbiBleGl0IHZhbHVlCi0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5leGl0VmFsdWVBcHAiKTsgLy8kTk9OLU5MUy0xJAotCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJaGFuZGxlID0gYXBwLmxhdW5jaChudWxsKTsKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxhdW5jaCBzaW1wbGVBcHAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoImFwcCBoYW5kbGUgaXMgbnVsbCIsIGhhbmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJaGFuZGxlLmRlc3Ryb3koKTsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXZhbHVlID0gKFN0cmluZykgaGFuZGxlLmdldEV4aXRWYWx1ZSgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3YWl0aW5nIGZvciBleGl0IHZhbHVlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJ2YWx1ZSBpcyBudWxsIiwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZXhpdCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCBFeGl0VmFsdWVBcHAuZXhpdFZhbHVlLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlMDYoKSB7Ci0JCS8vIGdldEV4aXRWYWx1ZSB0ZXN0OyBleHBlY3RpbmcgYW4gQXBwbGljYXRpb25FeGNlcHRpb24gYmVjYXVzZSB0aGUgZXhpdCB2YWx1ZSBpcyBub3QgYXZhaWxhYmxlCi0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5leGl0VmFsdWVBcHAiKTsgLy8kTk9OLU5MUy0xJAotCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJaGFuZGxlID0gYXBwLmxhdW5jaChudWxsKTsKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxhdW5jaCBzaW1wbGVBcHAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoImFwcCBoYW5kbGUgaXMgbnVsbCIsIGhhbmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWhhbmRsZS5nZXRFeGl0VmFsdWUoMTAwKTsKLQkJCWZhaWwoIkV4cGVjdGVkIGFuIEFwcGxpY2F0aW9uRXhjZXB0aW9uIGZvciBleGl0IHZhbHVlIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXJyb3IgdHlwZSIsIEFwcGxpY2F0aW9uRXhjZXB0aW9uLkFQUExJQ0FUSU9OX0VYSVRWQUxVRV9OT1RfQVZBSUxBQkxFLCBlLmdldEVycm9yQ29kZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiB3YWl0aW5nIGZvciBleGl0IHZhbHVlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUwNygpIHsKLQkJLy9nZXRFeGl0VmFsdWUgdGVzdDsgY2FsbGVkIHdpdGggdGltZW91dCAwCi0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5leGl0VmFsdWVBcHAiKTsgLy8kTk9OLU5MUy0xJAotCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJaGFuZGxlID0gYXBwLmxhdW5jaChudWxsKTsKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxhdW5jaGVyIHNpbXBsZUFwcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlhc3NlcnROb3ROdWxsKCJhcHAgaGFuZGxlIGlzIG51bGwiLCBoYW5kbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXZhbHVlID0gKFN0cmluZykgaGFuZGxlLmdldEV4aXRWYWx1ZSgwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhaXRpbmcgZm9yIGV4aXQgdmFsdWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJYXNzZXJ0Tm90TnVsbCgidmFsdWUgaXMgbnVsbCIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImV4aXQgdmFsdWUgaXMgaW5jb3JyZWN0IiwgRXhpdFZhbHVlQXBwLmV4aXRWYWx1ZSwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZTA4KCkgewotCQkvL2dldEV4aXRWYWx1ZSB0ZXN0OyBjYWxsZWQgd2l0aCB0aW1lb3V0IC0xCi0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5leGl0VmFsdWVBcHAiKTsgLy8kTk9OLU5MUy0xJAotCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJaGFuZGxlID0gYXBwLmxhdW5jaChudWxsKTsKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxhdW5jaGVyIHNpbXBsZUFwcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlhc3NlcnROb3ROdWxsKCJhcHAgaGFuZGxlIGlzIG51bGwiLCBoYW5kbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCWhhbmRsZS5nZXRFeGl0VmFsdWUoLTEpOwotCQkJZmFpbCgiRXhwZWN0ZWQgYW4gQXBwbGljYXRpb25FeGNlcHRpb24gZm9yIGV4aXQgdmFsdWUgbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlcnJvciB0eXBlIiwgQXBwbGljYXRpb25FeGNlcHRpb24uQVBQTElDQVRJT05fRVhJVFZBTFVFX05PVF9BVkFJTEFCTEUsIGUuZ2V0RXJyb3JDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIHdhaXRpbmcgZm9yIGV4aXQgdmFsdWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZTA5KCkgewotCQkvL2dldEV4aXRWYWx1ZSB0ZXN0OyBhcHBsaWNhdGlvbiByZXR1cm5zIG51bGwKLQkJQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCA9IGdldEFwcGxpY2F0aW9uKFBJX09TR0lfVEVTVFMgKyAiLmV4aXRWYWx1ZUFwcCIpOyAvLyROT04tTkxTLTEkCi0JCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IG51bGw7Ci0KLQkJSGFzaE1hcCBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0JCWFyZ3MucHV0KEV4aXRWYWx1ZUFwcC5yZXR1cm5OdWxsUmVzdWx0LCBCb29sZWFuLlRSVUUpOwotCi0JCXRyeSB7Ci0JCQloYW5kbGUgPSBhcHAubGF1bmNoKGFyZ3MpOwotCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gbGF1bmNoZXIgc2ltcGxlQXBwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFzc2VydE5vdE51bGwoImFwcCBoYW5kbGUgaXMgbnVsbCIsIGhhbmRsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJYXNzZXJ0TnVsbCgiZXhwZWN0ZWQgbnVsbCByZXR1cm4gdmFsdWUiLCBoYW5kbGUuZ2V0RXhpdFZhbHVlKDApKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhaXRpbmcgZm9yIGV4aXQgdmFsdWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZTEwKCkgewotCQkvL2dldEV4aXRWYWx1ZSB0ZXN0OyBjYWxsZWQgd2l0aCB0aW1lb3V0IDAgYWZ0ZXIgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUKLQkJQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCA9IGdldEFwcGxpY2F0aW9uKFBJX09TR0lfVEVTVFMgKyAiLmV4aXRWYWx1ZUFwcCIpOyAvLyROT04tTkxTLTEkCi0JCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloYW5kbGUgPSBhcHAubGF1bmNoKG51bGwpOwotCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gbGF1bmNoIHNpbXBsZUFwcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiYXBwIGhhbmRsZSBpcyBudWxsIiwgaGFuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gd2FpdGluZyBmb3IgYXBwIHRvIGV4aXQKLQkJCWhhbmRsZS5nZXRFeGl0VmFsdWUoMTAwMDApOwotCQkJLy8gYXBwIGV4aXRlZCBub3cgZ2V0IHRoZSByZXN1bHQgd2l0aCAwIHRpbWVvdXQKLQkJCXZhbHVlID0gKFN0cmluZykgaGFuZGxlLmdldEV4aXRWYWx1ZSgwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhaXRpbmcgZm9yIGV4aXQgdmFsdWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoInZhbHVlIGlzIG51bGwiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJleGl0IHZhbHVlIGlzIGluY29ycmVjdCIsIEV4aXRWYWx1ZUFwcC5leGl0VmFsdWUsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQkvLyBhcHAgZXhpdGVkIG5vdyBnZXQgdGhlIHJlc3VsdCB3aXRoIC0xIHRpbWVvdXQ7IHdlIGtub3cgdGhlIHZhbHVlIGlzIHJlYWR5IGZyb20gYWJvdmUKLQkJCXZhbHVlID0gKFN0cmluZykgaGFuZGxlLmdldEV4aXRWYWx1ZSgtMSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3YWl0aW5nIGZvciBleGl0IHZhbHVlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJ2YWx1ZSBpcyBudWxsIiwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZXhpdCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCBFeGl0VmFsdWVBcHAuZXhpdFZhbHVlLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXN5bmNWYWx1ZTAxKCkgewotCQkvL3NldFZhbHVlIHRlc3Q7IGNhbGxlZCB3aXRoIHRpbWVvdXQgMCBhZnRlciB0aGUgcmVzdWx0IGlzIGF2YWlsYWJsZQotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuZXhpdFZhbHVlQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlhcmdzLnB1dChFeGl0VmFsdWVBcHAucmV0dXJuQXN5bmNSZXN1bHQsIEJvb2xlYW4uVFJVRSk7Ci0JCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloYW5kbGUgPSBhcHAubGF1bmNoKGFyZ3MpOwotCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gbGF1bmNoIHNpbXBsZUFwcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiYXBwIGhhbmRsZSBpcyBudWxsIiwgaGFuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gd2FpdGluZyBmb3IgYXBwIHRvIGV4aXQKLQkJCWhhbmRsZS5nZXRFeGl0VmFsdWUoMTAwMDApOwotCQkJLy8gYXBwIGV4aXRlZCBub3cgZ2V0IHRoZSByZXN1bHQgd2l0aCAwIHRpbWVvdXQKLQkJCXZhbHVlID0gKFN0cmluZykgaGFuZGxlLmdldEV4aXRWYWx1ZSgwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhaXRpbmcgZm9yIGV4aXQgdmFsdWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoInZhbHVlIGlzIG51bGwiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJleGl0IHZhbHVlIGlzIGluY29ycmVjdCIsIEV4aXRWYWx1ZUFwcC5leGl0VmFsdWUsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQkvLyBhcHAgZXhpdGVkIG5vdyBnZXQgdGhlIHJlc3VsdCB3aXRoIC0xIHRpbWVvdXQ7IHdlIGtub3cgdGhlIHZhbHVlIGlzIHJlYWR5IGZyb20gYWJvdmUKLQkJCXZhbHVlID0gKFN0cmluZykgaGFuZGxlLmdldEV4aXRWYWx1ZSgtMSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3YWl0aW5nIGZvciBleGl0IHZhbHVlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJ2YWx1ZSBpcyBudWxsIiwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZXhpdCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCBFeGl0VmFsdWVBcHAuZXhpdFZhbHVlLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXN5bmNWYWx1ZTAyKCkgewotCQkvL3NldFZhbHVlIHRlc3Q7IGNhbGxlZCB3aXRoIHRpbWVvdXQgLTEKLQkJQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCA9IGdldEFwcGxpY2F0aW9uKFBJX09TR0lfVEVTVFMgKyAiLmV4aXRWYWx1ZUFwcCIpOyAvLyROT04tTkxTLTEkCi0JCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IG51bGw7Ci0JCU1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXJncy5wdXQoRXhpdFZhbHVlQXBwLnJldHVybkFzeW5jUmVzdWx0LCBCb29sZWFuLlRSVUUpOwotCQl0cnkgewotCQkJaGFuZGxlID0gYXBwLmxhdW5jaChhcmdzKTsKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxhdW5jaGVyIHNpbXBsZUFwcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlhc3NlcnROb3ROdWxsKCJhcHAgaGFuZGxlIGlzIG51bGwiLCBoYW5kbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCWhhbmRsZS5nZXRFeGl0VmFsdWUoLTEpOwotCQkJZmFpbCgiRXhwZWN0ZWQgYW4gQXBwbGljYXRpb25FeGNlcHRpb24gZm9yIGV4aXQgdmFsdWUgbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlcnJvciB0eXBlIiwgQXBwbGljYXRpb25FeGNlcHRpb24uQVBQTElDQVRJT05fRVhJVFZBTFVFX05PVF9BVkFJTEFCTEUsIGUuZ2V0RXJyb3JDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIHdhaXRpbmcgZm9yIGV4aXQgdmFsdWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzeW5jVmFsdWUwMygpIHsKLQkJLy9zZXRWYWx1ZSB0ZXN0OyBhcHBsaWNhdGlvbiByZXR1cm5zIG51bGwKLQkJQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCA9IGdldEFwcGxpY2F0aW9uKFBJX09TR0lfVEVTVFMgKyAiLmV4aXRWYWx1ZUFwcCIpOyAvLyROT04tTkxTLTEkCi0JCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IG51bGw7Ci0KLQkJSGFzaE1hcCBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0JCWFyZ3MucHV0KEV4aXRWYWx1ZUFwcC5yZXR1cm5OdWxsUmVzdWx0LCBCb29sZWFuLlRSVUUpOwotCQlhcmdzLnB1dChFeGl0VmFsdWVBcHAucmV0dXJuQXN5bmNSZXN1bHQsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJdHJ5IHsKLQkJCWhhbmRsZSA9IGFwcC5sYXVuY2goYXJncyk7Ci0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBsYXVuY2hlciBzaW1wbGVBcHAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJYXNzZXJ0Tm90TnVsbCgiYXBwIGhhbmRsZSBpcyBudWxsIiwgaGFuZGxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQlhc3NlcnROdWxsKCJleHBlY3RlZCBudWxsIHJldHVybiB2YWx1ZSIsIGhhbmRsZS5nZXRFeGl0VmFsdWUoMCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gd2FpdGluZyBmb3IgZXhpdCB2YWx1ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXN5bmNWYWx1ZTA0KCkgewotCQkvLyBzZXRWYWx1ZSB0ZXN0IHdpdGggZGVzdHJveSBjYWxsZWQgd2hpbGUgd2FpdGluZyBmb3IgYW4gZXhpdCB2YWx1ZQotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuZXhpdFZhbHVlQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJSGFzaE1hcCBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0JCWFyZ3MucHV0KEV4aXRWYWx1ZUFwcC5yZXR1cm5Bc3luY1Jlc3VsdCwgQm9vbGVhbi5UUlVFKTsKLQkJQXBwbGljYXRpb25IYW5kbGUgaGFuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWhhbmRsZSA9IGFwcC5sYXVuY2gobnVsbCk7Ci0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBsYXVuY2ggc2ltcGxlQXBwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJhcHAgaGFuZGxlIGlzIG51bGwiLCBoYW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlIGRlc3Ryb3lIYW5kbGUgPSBoYW5kbGU7Ci0JCW5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJZGVzdHJveUhhbmRsZS5kZXN0cm95KCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3RoaW5nCi0JCQkJfQotCi0JCQl9Ci0JCX0pLnN0YXJ0KCk7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2YWx1ZSA9IChTdHJpbmcpIGhhbmRsZS5nZXRFeGl0VmFsdWUoMTAwMDApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gd2FpdGluZyBmb3IgZXhpdCB2YWx1ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgidmFsdWUgaXMgbnVsbCIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImV4aXQgdmFsdWUgaXMgaW5jb3JyZWN0IiwgRXhpdFZhbHVlQXBwLmV4aXRWYWx1ZSwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzeW5jVmFsdWUwNSgpIHsKLQkJLy8gdGVzdCBjYWxsaW5nIHNldFZhbHVlIHRvIGVhcmx5Ci0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5leGl0VmFsdWVBcHAiKTsgLy8kTk9OLU5MUy0xJAotCQlNYXAgYXJncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFyZ3MucHV0KEV4aXRWYWx1ZUFwcC5zZXRBc3luY0Vhcmx5LCBCb29sZWFuLlRSVUUpOwotCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJaGFuZGxlID0gYXBwLmxhdW5jaChhcmdzKTsKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxhdW5jaCBzaW1wbGVBcHAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoImFwcCBoYW5kbGUgaXMgbnVsbCIsIGhhbmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHdhaXRpbmcgZm9yIGFwcCB0byBleGl0Ci0JCQl2YWx1ZSA9IChTdHJpbmcpIGhhbmRsZS5nZXRFeGl0VmFsdWUoMTAwMDApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gd2FpdGluZyBmb3IgZXhpdCB2YWx1ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgidmFsdWUgaXMgbnVsbCIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImV4aXQgdmFsdWUgaXMgaW5jb3JyZWN0IiwgRXhpdFZhbHVlQXBwLmV4aXRWYWx1ZSwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzeW5jVmFsdWUwNigpIHsKLQkJLy8gdGVzdCBjYWxsaW5nIHNldFZhbHVlIHdpdGggd3JvbmcgYXBwbGljYXRpb24gaW5zdGFuY2UKLQkJQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCA9IGdldEFwcGxpY2F0aW9uKFBJX09TR0lfVEVTVFMgKyAiLmV4aXRWYWx1ZUFwcCIpOyAvLyROT04tTkxTLTEkCi0JCU1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXJncy5wdXQoRXhpdFZhbHVlQXBwLnJldHVybkFzeW5jUmVzdWx0LCBCb29sZWFuLlRSVUUpOwotCQlhcmdzLnB1dChFeGl0VmFsdWVBcHAuc2V0QXN5bmNXcm9uZ0FwcCwgQm9vbGVhbi5UUlVFKTsKLQkJQXBwbGljYXRpb25IYW5kbGUgaGFuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWhhbmRsZSA9IGFwcC5sYXVuY2goYXJncyk7Ci0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBsYXVuY2ggc2ltcGxlQXBwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJhcHAgaGFuZGxlIGlzIG51bGwiLCBoYW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyB3YWl0aW5nIGZvciBhcHAgdG8gZXhpdAotCQkJdmFsdWUgPSAoU3RyaW5nKSBoYW5kbGUuZ2V0RXhpdFZhbHVlKDEwMDAwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdhaXRpbmcgZm9yIGV4aXQgdmFsdWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoInZhbHVlIGlzIG51bGwiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJleGl0IHZhbHVlIGlzIGluY29ycmVjdCIsIEV4aXRWYWx1ZUFwcC5leGl0VmFsdWUsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHbG9iYWxTaW5nbGV0b24oKSB7Ci0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5nbG9iYWxTaW5nbGV0b25BcHAiKTsgLy8kTk9OLU5MUy0xJAotCQlIYXNoTWFwIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLQkJdHJ5IHsKLQkJCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IGFwcC5sYXVuY2goYXJncyk7Ci0JCQloYW5kbGUuZGVzdHJveSgpOwotCQkJZmFpbCgic2hvdWxkIG5vdCBiZSBhYmxlIHRvIGxhdW5jaCBhIGdsb2JhbCBzaW5nbGV0b24gYXBwOiAiICsgYXBwLmdldEFwcGxpY2F0aW9uSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBlcnJvciBjb2RlIiwgQXBwbGljYXRpb25FeGNlcHRpb24uQVBQTElDQVRJT05fTk9UX0xBVU5DSEFCTEUsIGUuZ2V0RXJyb3JDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9UZXN0Q2FyZGluYWxpdHkwMShTdHJpbmcgYXBwSUQsIGludCBjYXJkaW5hbGl0eSwgYm9vbGVhbiBoYXNNYXgpIHsKLQkJQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCA9IGdldEFwcGxpY2F0aW9uKGFwcElEKTsKLQkJQXJyYXlMaXN0IGluc3RhbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IGkgPSAwOwotCQl0cnkgewotCQkJZm9yICg7IGkgPD0gY2FyZGluYWxpdHk7IGkrKykKLQkJCQlpbnN0YW5jZXMuYWRkKGFwcC5sYXVuY2gobnVsbCkpOwotCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoIWhhc01heCB8fCBpICE9IGNhcmRpbmFsaXR5KQotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgQXBwbGljYXRpb25FeGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBlcnJvciBjb2RlIiwgQXBwbGljYXRpb25FeGNlcHRpb24uQVBQTElDQVRJT05fTk9UX0xBVU5DSEFCTEUsIGUuZ2V0RXJyb3JDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGhhbmRsZXMgPSBpbnN0YW5jZXMuaXRlcmF0b3IoKTsgaGFuZGxlcy5oYXNOZXh0KCk7KSB7Ci0JCQkJKChBcHBsaWNhdGlvbkhhbmRsZSkgaGFuZGxlcy5uZXh0KCkpLmRlc3Ryb3koKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoIkRpZCBub3QgbGF1bmNoIHRoZSBjb3JyZWN0ICMgb2YgY29uY3VycmVudCBpbnN0YW5jZXMiLCBpbnN0YW5jZXMuc2l6ZSgpLCBjYXJkaW5hbGl0eSArIChoYXNNYXggPyAwIDogMSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcmRpbmFsaXR5MDEoKSB7Ci0JCWRvVGVzdENhcmRpbmFsaXR5MDEoUElfT1NHSV9URVNUUyArICIudGVzdENhcmRpbmFsaXR5MDEiLCAxMCwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FyZGluYWxpdHkwMigpIHsKLQkJZG9UZXN0Q2FyZGluYWxpdHkwMShQSV9PU0dJX1RFU1RTICsgIi50ZXN0Q2FyZGluYWxpdHkwMiIsIDIwLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9UZXN0TWFpblRocmVhZGVkKFN0cmluZyBhcHBJRCkgewotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oYXBwSUQpOwotCQlBcnJheUxpc3QgaW5zdGFuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaW5zdGFuY2VzLmFkZChhcHAubGF1bmNoKG51bGwpKTsKLQkJCWluc3RhbmNlcy5hZGQoYXBwLmxhdW5jaChudWxsKSk7Ci0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChpbnN0YW5jZXMuc2l6ZSgpID09IDApCi0JCQkJZmFpbCgiVW5hYmxlIHRvIGxhdW5jaCBhIG1haW4gdGhyZWFkZWQgYXBwbGljYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBlcnJvciBjb2RlIiwgQXBwbGljYXRpb25FeGNlcHRpb24uQVBQTElDQVRJT05fTk9UX0xBVU5DSEFCTEUsIGUuZ2V0RXJyb3JDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGhhbmRsZXMgPSBpbnN0YW5jZXMuaXRlcmF0b3IoKTsgaGFuZGxlcy5oYXNOZXh0KCk7KSB7Ci0JCQkJKChBcHBsaWNhdGlvbkhhbmRsZSkgaGFuZGxlcy5uZXh0KCkpLmRlc3Ryb3koKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoIkRpZCBub3QgbGF1bmNoIHRoZSBjb3JyZWN0ICMgb2YgbWFpbiBhcHAgaW5zdGFuY2VzIiwgaW5zdGFuY2VzLnNpemUoKSwgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFpblRocmVhZGVkMDEoKSB7Ci0JCWRvVGVzdE1haW5UaHJlYWRlZChQSV9PU0dJX1RFU1RTICsgIi50ZXN0TWFpblRocmVhZGVkMDEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWluVGhyZWFkZWQwMigpIHsKLQkJZG9UZXN0TWFpblRocmVhZGVkKFBJX09TR0lfVEVTVFMgKyAiLnRlc3RNYWluVGhyZWFkZWQwMiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhbmRsZUV2ZW50czAxKCkgdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb24gewotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuc2ltcGxlQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJQXBwbGljYXRpb25IYW5kbGVUcmFja2VyIGhhbmRsZVRyYWNrZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVUcmFja2VyKGdldENvbnRleHQoKSk7Ci0JCVNlcnZpY2VUcmFja2VyIHRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoZ2V0Q29udGV4dCgpLCBGcmFtZXdvcmtVdGlsLmNyZWF0ZUZpbHRlcigiKCYob2JqZWN0Q2xhc3M9IiArIEFwcGxpY2F0aW9uSGFuZGxlLmNsYXNzLmdldE5hbWUoKSArICIpKCIgKyBBcHBsaWNhdGlvbkhhbmRsZS5BUFBMSUNBVElPTl9ERVNDUklQVE9SICsgIj0iICsgYXBwLmdldEFwcGxpY2F0aW9uSWQoKSArICIpKSIpLCBoYW5kbGVUcmFja2VyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl0cmFja2VyLm9wZW4oKTsKLQkJdHJ5IHsKLQkJCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IGFwcC5sYXVuY2gobnVsbCk7Ci0JCQloYW5kbGVUcmFja2VyLndhaXRGb3JFdmVudChoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCBBcHBsaWNhdGlvbkhhbmRsZS5SVU5OSU5HKTsKLQkJCWhhbmRsZS5kZXN0cm95KCk7Ci0JCQloYW5kbGVUcmFja2VyLndhaXRGb3JFdmVudChoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCBSRU1PVkVEKTsKLQkJCVN0cmluZ1tdW10gZXZlbnRzID0gaGFuZGxlVHJhY2tlci5nZXRFdmVudHMoKTsKLQkJCVN0cmluZ1tdW10gZXhwZWN0ZWQgPSBuZXcgU3RyaW5nW11bXSB7bmV3IFN0cmluZ1tdIHtoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCAib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuc3RhcnRpbmcifSwgbmV3IFN0cmluZ1tdIHtoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCBBcHBsaWNhdGlvbkhhbmRsZS5SVU5OSU5HfSwgbmV3IFN0cmluZ1tdIHtoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCBBcHBsaWNhdGlvbkhhbmRsZS5TVE9QUElOR30sIG5ldyBTdHJpbmdbXSB7aGFuZGxlLmdldEluc3RhbmNlSWQoKSwgIm9yZy5lY2xpcHNlLmVxdWlub3guYXBwLnN0b3BwZWQifSwgbmV3IFN0cmluZ1tdIHtoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCAicmVtb3ZlZCJ9fTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWFzc2VydEVxdWFscygiQ2hlY2sgZXhwZWN0ZWQgIyBldmVudHMiLCBleHBlY3RlZC5sZW5ndGgsIGV2ZW50cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWFzc2VydEVxdWFscygiQ2hlY2sgZXhwZWN0ZWQgZXZlbnQgaWQgZm9yICMiICsgaSwgZXhwZWN0ZWRbaV1bMF0sIGV2ZW50c1tpXVswXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIGV4cGVjdGVkIGV2ZW50IHN0YXRlIGZvciAjIiArIGksIGV4cGVjdGVkW2ldWzFdLCBldmVudHNbaV1bMV0pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBsYXVuY2ggYXBwbGljYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJdHJhY2tlci5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaXB0b3JFdmVudHMwMSgpIHRocm93cyBJbnZhbGlkU3ludGF4RXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGVJbnN0YWxsZXIgYnVuZGxlSW5zdGFsbGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJ1bmRsZUluc3RhbGxlciA9IG5ldyBCdW5kbGVJbnN0YWxsZXIoT1NHaVRlc3RzQWN0aXZhdG9yLlRFU1RfRklMRVNfUk9PVCArICJpbnRlcm5hbC9wbHVnaW5zL2FwcEFkbWluVGVzdHMiLCBnZXRDb250ZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBidW5kbGUgaW5zdGFsbGVyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgdGVzdEFwcFBJRCA9ICJhcHBhZG1pbi50ZXN0MDEuc2ltcGxlQXBwIjsgLy8kTk9OLU5MUy0xJAotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3JUcmFja2VyIGRlc2NyaXB0aW9uVHJhY2tlciA9IG5ldyBBcHBsaWNhdGlvbkRlc2NyaXB0b3JUcmFja2VyKGdldENvbnRleHQoKSk7Ci0JCVNlcnZpY2VUcmFja2VyIHRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoZ2V0Q29udGV4dCgpLCBGcmFtZXdvcmtVdGlsLmNyZWF0ZUZpbHRlcigiKCYob2JqZWN0Q2xhc3M9IiArIEFwcGxpY2F0aW9uRGVzY3JpcHRvci5jbGFzcy5nZXROYW1lKCkgKyAiKSgiICsgQXBwbGljYXRpb25EZXNjcmlwdG9yLkFQUExJQ0FUSU9OX1BJRCArICI9IiArIHRlc3RBcHBQSUQgKyAiKSkiKSwgZGVzY3JpcHRpb25UcmFja2VyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl0cmFja2VyLm9wZW4oKTsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSB0ZXN0MDEgPSBidW5kbGVJbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYXBwYWRtaW4udGVzdDAxIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIkNoZWNrIGlmIHRlc3QgYnVuZGxlIGlzIHJlc29sdmVkOiAiICsgdGVzdDAxLmdldFN5bWJvbGljTmFtZSgpLCBidW5kbGVJbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHt0ZXN0MDF9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlc2NyaXB0aW9uVHJhY2tlci53YWl0Rm9yRXZlbnQodGVzdEFwcFBJRCwgQURERUQsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSk7Ci0JCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24odGVzdEFwcFBJRCk7Ci0JCQlhcHAubG9jaygpOwotCQkJQm9vbGVhbiBsb2NrZWQgPSAoQm9vbGVhbikgYXBwLmdldFByb3BlcnRpZXMoIiIpLmdldChBcHBsaWNhdGlvbkRlc2NyaXB0b3IuQVBQTElDQVRJT05fTE9DS0VEKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiQXBwbGljYXRpb24gc2hvdWxkIGJlIGxvY2tlZCIsIGxvY2tlZC5ib29sZWFuVmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlc2NyaXB0aW9uVHJhY2tlci53YWl0Rm9yRXZlbnQodGVzdEFwcFBJRCwgTU9ESUZJRUQsIEJvb2xlYW4uVFJVRSwgQm9vbGVhbi5UUlVFKTsKLQkJCWFwcC51bmxvY2soKTsKLQkJCWRlc2NyaXB0aW9uVHJhY2tlci53YWl0Rm9yRXZlbnQodGVzdEFwcFBJRCwgTU9ESUZJRUQsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSk7Ci0JCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQloYW5kbGUgPSBhcHAubGF1bmNoKG51bGwpOwotCQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWZhaWwoImZhaWxlZCB0byBsYXVuY2ggYXBwOiAiICsgYXBwLmdldEFwcGxpY2F0aW9uSWQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWRlc2NyaXB0aW9uVHJhY2tlci53YWl0Rm9yRXZlbnQodGVzdEFwcFBJRCwgTU9ESUZJRUQsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uRkFMU0UpOwotCQkJaGFuZGxlLmRlc3Ryb3koKTsKLQkJCWRlc2NyaXB0aW9uVHJhY2tlci53YWl0Rm9yRXZlbnQodGVzdEFwcFBJRCwgTU9ESUZJRUQsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSk7Ci0JCQl0ZXN0MDEudW5pbnN0YWxsKCk7Ci0JCQlkZXNjcmlwdGlvblRyYWNrZXIud2FpdEZvckV2ZW50KHRlc3RBcHBQSUQsIFJFTU9WRUQsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlidW5kbGVJbnN0YWxsZXIuc2h1dGRvd24oKTsKLQkJCXRyYWNrZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50TG9jazAxKCkgewotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuc2ltcGxlQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJYXBwLmxvY2soKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudExvY2swMigpIHsKLQkJQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCA9IGdldEFwcGxpY2F0aW9uKFBJX09TR0lfVEVTVFMgKyAiLnNpbXBsZUFwcCIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBhcHAubGF1bmNoKG51bGwpOwotCQkJaGFuZGxlLmRlc3Ryb3koKTsKLQkJCWZhaWwoIlRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYmUgbG9ja2VkOiAiICsgYXBwLmdldEFwcGxpY2F0aW9uSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBlcnJvciBjb2RlIiwgQXBwbGljYXRpb25FeGNlcHRpb24uQVBQTElDQVRJT05fTE9DS0VELCBlLmdldEVycm9yQ29kZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcC51bmxvY2soKTsKLQkJdHJ5IHsKLQkJCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IGFwcC5sYXVuY2gobnVsbCk7Ci0JCQloYW5kbGUuZGVzdHJveSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxhdW5jaCBzaW1wbGVBcHAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRMb2NrMDMoKSB7Ci0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5zaW1wbGVBcHAiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJQXBwbGljYXRpb25IYW5kbGUgaGFuZGxlID0gYXBwLmxhdW5jaChudWxsKTsKLQkJCWhhbmRsZS5kZXN0cm95KCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gbGF1bmNoIHNpbXBsZUFwcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudFNjaGVkdWxlMDEoKSB7Ci0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5zaW1wbGVBcHAiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJSGFzaE1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWFyZ3MucHV0KCJ0ZXN0LmFyZzEiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0JCQlhcmdzLnB1dCgidGVzdC5hcmcyIiwgbmV3IEludGVnZXIoMzQpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXJncy5wdXQoInRlc3QuYXJnMyIsIG5ldyBMb25nKDM0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFwcC5zY2hlZHVsZSgic2NoZWR1bGUuMSIsIGFyZ3MsICJvcmcvb3NnaS9hcHBsaWNhdGlvbi90aW1lciIsICIobWludXRlPSopIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHNjaGVkdWxlIGFuIGFwcGxpY2F0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHNjaGVkdWxlIGFuIGFwcGxpY2F0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50U2NoZWR1bGUwMigpIHRocm93cyBJbnZhbGlkU3ludGF4RXhjZXB0aW9uIHsKLQkJU2NoZWR1bGVkQXBwbGljYXRpb24gc2NoZWR1bGVkQXBwID0gZ2V0U2NoZWR1bGVBcHBsaWNhdGlvbigic2NoZWR1bGUuMSIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCUFwcGxpY2F0aW9uSGFuZGxlVHJhY2tlciBoYW5kbGVUcmFja2VyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlVHJhY2tlcihnZXRDb250ZXh0KCkpOwotCQlTZXJ2aWNlVHJhY2tlciB0cmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGdldENvbnRleHQoKSwgRnJhbWV3b3JrVXRpbC5jcmVhdGVGaWx0ZXIoIigmKG9iamVjdENsYXNzPSIgKyBBcHBsaWNhdGlvbkhhbmRsZS5jbGFzcy5nZXROYW1lKCkgKyAiKSgiICsgQXBwbGljYXRpb25IYW5kbGUuQVBQTElDQVRJT05fREVTQ1JJUFRPUiArICI9IiArIHNjaGVkdWxlZEFwcC5nZXRBcHBsaWNhdGlvbkRlc2NyaXB0b3IoKS5nZXRBcHBsaWNhdGlvbklkKCkgKyAiKSkiKSwgaGFuZGxlVHJhY2tlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJdHJhY2tlci5vcGVuKCk7Ci0JCXRyeSB7Ci0JCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSAoQXBwbGljYXRpb25IYW5kbGUpIHRyYWNrZXIud2FpdEZvclNlcnZpY2UoNjEwMDApOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGZpbmQgYW4gYXBwbGljYXRpb24gaGFuZGxlIiwgaGFuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQkJaGFuZGxlVHJhY2tlci53YWl0Rm9yRXZlbnQoaGFuZGxlLmdldEluc3RhbmNlSWQoKSwgQXBwbGljYXRpb25IYW5kbGUuUlVOTklORyk7Ci0JCQloYW5kbGUuZGVzdHJveSgpOwotCQkJaGFuZGxlVHJhY2tlci53YWl0Rm9yRXZlbnQoaGFuZGxlLmdldEluc3RhbmNlSWQoKSwgUkVNT1ZFRCk7Ci0JCQlIYXNoTWFwIHJlc3VsdHMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXN1bHRzID0gKEhhc2hNYXApIGhhbmRsZS5nZXRFeGl0VmFsdWUoMTAwMCk7Ci0JCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBhcHBsaWNhdGlvbiBleGNlcHRpb24gd2FpdGluZyBmb3IgYW4gZXhpdCB2YWx1ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhc3NlcnROb3ROdWxsKCJOdWxsIHJlc3VsdHMiLCByZXN1bHRzKTsgLy8kTk9OLU5MUy0xJAotCQkJSGFzaE1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWFyZ3MucHV0KCJ0ZXN0LmFyZzEiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0JCQlhcmdzLnB1dCgidGVzdC5hcmcyIiwgbmV3IEludGVnZXIoMzQpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXJncy5wdXQoInRlc3QuYXJnMyIsIG5ldyBMb25nKDM0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaUVudHJpZXMgPSBhcmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaUVudHJpZXMuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGlFbnRyaWVzLm5leHQoKTsKLQkJCQlhc3NlcnRFcXVhbHMoImtleTogIiArIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCByZXN1bHRzLmdldChlbnRyeS5nZXRLZXkoKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImdvdCBpbnRlcnVwdGVkIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXRyYWNrZXIuY2xvc2UoKTsKLQkJCXNjaGVkdWxlZEFwcC5yZW1vdmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50U2NoZWR1bGUwMygpIHsKLQkJU2NoZWR1bGVkQXBwbGljYXRpb24gc2NoZWR1bGVkQXBwID0gZ2V0U2NoZWR1bGVBcHBsaWNhdGlvbigic2NoZWR1bGUuMSIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2NoZWR1bGVkQXBwICE9IG51bGwpIHsKLQkJCXNjaGVkdWxlZEFwcC5yZW1vdmUoKTsKLQkJCWZhaWwoIlNjaGVkdWxlZCBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGJlIGZvdW5kOiAiICsgc2NoZWR1bGVkQXBwLmdldFNjaGVkdWxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50U2NoZWR1bGUwNCgpIHsKLQkJQXBwbGljYXRpb25EZXNjcmlwdG9yIGFwcCA9IGdldEFwcGxpY2F0aW9uKFBJX09TR0lfVEVTVFMgKyAiLnNpbXBsZUFwcCIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQkvLyBsb2NrIHRoZSBhcHAgc28gdGhhdCBpdCBjYW5ub3QgYmUgbGF1bmNoZWQgd2l0aCBhIHNjaGVkdWxlZAotCQkJYXBwLmxvY2soKTsKLQkJCUhhc2hNYXAgYXJncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlhcmdzLnB1dCgidGVzdC5hcmcxIiwgQm9vbGVhbi5UUlVFKTsgLy8kTk9OLU5MUy0xJAotCQkJYXJncy5wdXQoInRlc3QuYXJnMiIsIG5ldyBJbnRlZ2VyKDM0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFyZ3MucHV0KCJ0ZXN0LmFyZzMiLCBuZXcgTG9uZygzNCkpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBtYWtlIGl0IG5vbi1yZWN1cnJpbmcKLQkJCWFwcC5zY2hlZHVsZSgic2NoZWR1bGUuMiIsIGFyZ3MsICJvcmcvb3NnaS9hcHBsaWNhdGlvbi90aW1lciIsICIobWludXRlPSopIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzY2hlZHVsZSBhbiBhcHBsaWNhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzY2hlZHVsZSBhbiBhcHBsaWNhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudFNjaGVkdWxlMDUoKSB0aHJvd3MgSW52YWxpZFN5bnRheEV4Y2VwdGlvbiB7Ci0JCVNjaGVkdWxlZEFwcGxpY2F0aW9uIHNjaGVkdWxlZEFwcCA9IGdldFNjaGVkdWxlQXBwbGljYXRpb24oInNjaGVkdWxlLjIiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlBcHBsaWNhdGlvbkhhbmRsZVRyYWNrZXIgaGFuZGxlVHJhY2tlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZVRyYWNrZXIoZ2V0Q29udGV4dCgpKTsKLQkJU2VydmljZVRyYWNrZXIgdHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihnZXRDb250ZXh0KCksIEZyYW1ld29ya1V0aWwuY3JlYXRlRmlsdGVyKCIoJihvYmplY3RDbGFzcz0iICsgQXBwbGljYXRpb25IYW5kbGUuY2xhc3MuZ2V0TmFtZSgpICsgIikoIiArIEFwcGxpY2F0aW9uSGFuZGxlLkFQUExJQ0FUSU9OX0RFU0NSSVBUT1IgKyAiPSIgKyBzY2hlZHVsZWRBcHAuZ2V0QXBwbGljYXRpb25EZXNjcmlwdG9yKCkuZ2V0QXBwbGljYXRpb25JZCgpICsgIikpIiksIGhhbmRsZVRyYWNrZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCXRyYWNrZXIub3BlbigpOwotCQlBcHBsaWNhdGlvbkhhbmRsZSBiYWRIYW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJYmFkSGFuZGxlID0gKEFwcGxpY2F0aW9uSGFuZGxlKSB0cmFja2VyLndhaXRGb3JTZXJ2aWNlKDYxMDAwKTsKLQkJCWFzc2VydE51bGwoIlNob3VsZCBub3QgZmluZCBhbiBhcHBsaWNhdGlvbiBoYW5kbGUiLCBiYWRIYW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB1bmxvY2sgYXBwIHRoZW4gdHJ5IGFnYWluCi0JCQlzY2hlZHVsZWRBcHAuZ2V0QXBwbGljYXRpb25EZXNjcmlwdG9yKCkudW5sb2NrKCk7Ci0JCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSAoQXBwbGljYXRpb25IYW5kbGUpIHRyYWNrZXIud2FpdEZvclNlcnZpY2UoNjEwMDApOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGZpbmQgYW4gYXBwbGljYXRpb24gaGFuZGxlIiwgaGFuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQkJaGFuZGxlVHJhY2tlci53YWl0Rm9yRXZlbnQoaGFuZGxlLmdldEluc3RhbmNlSWQoKSwgQXBwbGljYXRpb25IYW5kbGUuUlVOTklORyk7Ci0JCQloYW5kbGUuZGVzdHJveSgpOwotCQkJaGFuZGxlVHJhY2tlci53YWl0Rm9yRXZlbnQoaGFuZGxlLmdldEluc3RhbmNlSWQoKSwgUkVNT1ZFRCk7Ci0JCQlIYXNoTWFwIHJlc3VsdHMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXN1bHRzID0gKEhhc2hNYXApIGhhbmRsZS5nZXRFeGl0VmFsdWUoMTAwMCk7Ci0JCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBhcHBsaWNhdGlvbiBleGNlcHRpb24gd2FpdGluZyBmb3IgYW4gZXhpdCB2YWx1ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhc3NlcnROb3ROdWxsKCJOdWxsIHJlc3VsdHMiLCByZXN1bHRzKTsgLy8kTk9OLU5MUy0xJAotCQkJSGFzaE1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWFyZ3MucHV0KCJ0ZXN0LmFyZzEiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0JCQlhcmdzLnB1dCgidGVzdC5hcmcyIiwgbmV3IEludGVnZXIoMzQpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXJncy5wdXQoInRlc3QuYXJnMyIsIG5ldyBMb25nKDM0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaUVudHJpZXMgPSBhcmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaUVudHJpZXMuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGlFbnRyaWVzLm5leHQoKTsKLQkJCQlhc3NlcnRFcXVhbHMoImtleTogIiArIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCByZXN1bHRzLmdldChlbnRyeS5nZXRLZXkoKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBzaG91bGQgbm90IGZpbmQgdGhlIHNjaGVkdWxlZCBhcHAgYW55bW9yZQotCQkJLy8gc2xlZXBpbmcgaGVyZSB0byBhbGxvdyBmb3IgdGhlIHNjaGVkdWxlZCBhcHAgdG8gZGlzYXBwZWFyOyBjb3VsZCB1c2Ugc2VydmljZSBldmVudHMgaW5zdGVhZAotCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJc2NoZWR1bGVkQXBwID0gZ2V0U2NoZWR1bGVBcHBsaWNhdGlvbigic2NoZWR1bGUuMiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHNjaGVkdWxlZEFwcCAhPSBudWxsKSB7Ci0JCQkJZmFpbCgiU2NoZWR1bGVkIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYmUgZm91bmQ6ICIgKyBzY2hlZHVsZWRBcHAuZ2V0U2NoZWR1bGVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJnb3QgaW50ZXJ1cHRlZCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYmFkSGFuZGxlICE9IG51bGwpCi0JCQkJYmFkSGFuZGxlLmRlc3Ryb3koKTsKLQkJCXRyYWNrZXIuY2xvc2UoKTsKLQkJCWlmIChzY2hlZHVsZWRBcHAgIT0gbnVsbCkKLQkJCQlzY2hlZHVsZWRBcHAucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudFNjaGVkdWxlMDYoKSB7Ci0JCVNjaGVkdWxlZEFwcGxpY2F0aW9uIHNjaGVkdWxlZEFwcCA9IGdldFNjaGVkdWxlQXBwbGljYXRpb24oInNjaGVkdWxlLjIiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNjaGVkdWxlZEFwcCAhPSBudWxsKSB7Ci0JCQlzY2hlZHVsZWRBcHAucmVtb3ZlKCk7Ci0JCQlmYWlsKCJTY2hlZHVsZWQgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBiZSBmb3VuZDogIiArIHNjaGVkdWxlZEFwcC5nZXRTY2hlZHVsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudFNjaGVkdWxlMDcoKSB7Ci0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi5zaW1wbGVBcHAiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJYXBwLnNjaGVkdWxlKCJzY2hlZHVsZS5kdXBsaWNhdGUxIiwgbnVsbCwgIm9yZy9vc2dpL2FwcGxpY2F0aW9uL3RpbWVyIiwgIihtaW51dGU9KikiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc2NoZWR1bGUgYW4gYXBwbGljYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc2NoZWR1bGUgYW4gYXBwbGljYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlhcHAuc2NoZWR1bGUoInNjaGVkdWxlLmR1cGxpY2F0ZTEiLCBudWxsLCAib3JnL29zZ2kvYXBwbGljYXRpb24vdGltZXIiLCAiKG1pbnV0ZT0qKSIsIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJZmFpbCgic2hvdWxkIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBhIGR1cGxpY2F0ZSBzY2hlZHVsZWQgYXBwbGljYXRpb24gaWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzY2hlZHVsZSBhbiBhcHBsaWNhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiY2hlY2sgZXJyb3IgY29kZSIsIEFwcGxpY2F0aW9uRXhjZXB0aW9uLkFQUExJQ0FUSU9OX0RVUExJQ0FURV9TQ0hFRFVMRV9JRCwgZS5nZXRFcnJvckNvZGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50U2NoZWR1bGUwOCgpIHsKLQkJU2NoZWR1bGVkQXBwbGljYXRpb24gc2NoZWR1bGVkQXBwID0gZ2V0U2NoZWR1bGVBcHBsaWNhdGlvbigic2NoZWR1bGUuZHVwbGljYXRlMSIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlzY2hlZHVsZWRBcHAuZ2V0QXBwbGljYXRpb25EZXNjcmlwdG9yKCkuc2NoZWR1bGUoInNjaGVkdWxlLmR1cGxpY2F0ZTEiLCBudWxsLCAib3JnL29zZ2kvYXBwbGljYXRpb24vdGltZXIiLCAiKG1pbnV0ZT0qKSIsIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJZmFpbCgic2hvdWxkIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBhIGR1cGxpY2F0ZSBzY2hlZHVsZWQgYXBwbGljYXRpb24gaWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzY2hlZHVsZSBhbiBhcHBsaWNhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiY2hlY2sgZXJyb3IgY29kZSIsIEFwcGxpY2F0aW9uRXhjZXB0aW9uLkFQUExJQ0FUSU9OX0RVUExJQ0FURV9TQ0hFRFVMRV9JRCwgZS5nZXRFcnJvckNvZGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXNjaGVkdWxlZEFwcC5yZW1vdmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWlsZWRBcHBsaWNhdGlvbjAxKCkgdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb24gewotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuZmFpbGVkQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJQXBwbGljYXRpb25IYW5kbGVUcmFja2VyIGhhbmRsZVRyYWNrZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVUcmFja2VyKGdldENvbnRleHQoKSk7Ci0JCVNlcnZpY2VUcmFja2VyIHRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoZ2V0Q29udGV4dCgpLCBGcmFtZXdvcmtVdGlsLmNyZWF0ZUZpbHRlcigiKCYob2JqZWN0Q2xhc3M9IiArIEFwcGxpY2F0aW9uSGFuZGxlLmNsYXNzLmdldE5hbWUoKSArICIpKCIgKyBBcHBsaWNhdGlvbkhhbmRsZS5BUFBMSUNBVElPTl9ERVNDUklQVE9SICsgIj0iICsgYXBwLmdldEFwcGxpY2F0aW9uSWQoKSArICIpKSIpLCBoYW5kbGVUcmFja2VyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl0cmFja2VyLm9wZW4oKTsKLQkJdHJ5IHsKLQkJCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IGFwcC5sYXVuY2gobnVsbCk7Ci0JCQloYW5kbGVUcmFja2VyLndhaXRGb3JFdmVudChoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCBSRU1PVkVEKTsKLQkJCVN0cmluZ1tdW10gZXZlbnRzID0gaGFuZGxlVHJhY2tlci5nZXRFdmVudHMoKTsKLQkJCVN0cmluZ1tdW10gZXhwZWN0ZWQgPSBuZXcgU3RyaW5nW11bXSB7bmV3IFN0cmluZ1tdIHtoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCAib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuc3RhcnRpbmcifSwgbmV3IFN0cmluZ1tdIHtoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCBBcHBsaWNhdGlvbkhhbmRsZS5TVE9QUElOR30sIG5ldyBTdHJpbmdbXSB7aGFuZGxlLmdldEluc3RhbmNlSWQoKSwgIm9yZy5lY2xpcHNlLmVxdWlub3guYXBwLnN0b3BwZWQifSwgbmV3IFN0cmluZ1tdIHtoYW5kbGUuZ2V0SW5zdGFuY2VJZCgpLCAicmVtb3ZlZCJ9fTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWFzc2VydEVxdWFscygiQ2hlY2sgZXhwZWN0ZWQgIyBldmVudHMiLCBleHBlY3RlZC5sZW5ndGgsIGV2ZW50cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWFzc2VydEVxdWFscygiQ2hlY2sgZXhwZWN0ZWQgZXZlbnQgaWQgZm9yICMiICsgaSwgZXhwZWN0ZWRbaV1bMF0sIGV2ZW50c1tpXVswXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIGV4cGVjdGVkIGV2ZW50IHN0YXRlIGZvciAjIiArIGksIGV4cGVjdGVkW2ldWzFdLCBldmVudHNbaV1bMV0pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBsYXVuY2ggYXBwbGljYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJdHJhY2tlci5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc3Ryb3lCZWZvcmVTdGFydDAxKCkgdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb24gewotCQlBcHBsaWNhdGlvbkRlc2NyaXB0b3IgYXBwID0gZ2V0QXBwbGljYXRpb24oUElfT1NHSV9URVNUUyArICIuc2ltcGxlQXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJSGFzaE1hcCBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0JCUhhc2hNYXAgcmVzdWx0cyA9IChIYXNoTWFwKSBhcmdzLmdldCh0ZXN0UmVzdWx0cyk7Ci0JCVNlcnZpY2VUcmFja2VyQ3VzdG9taXplciB0cmFja2VyQ3VzdG9taXplciA9IG5ldyBTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGFkZGluZ1NlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSAoQXBwbGljYXRpb25IYW5kbGUpIGdldENvbnRleHQoKS5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCQkJaGFuZGxlLmRlc3Ryb3koKTsKLQkJCQlyZXR1cm4gaGFuZGxlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZmllZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBzZXJ2aWNlKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCQkvLyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JCVNlcnZpY2VUcmFja2VyIHRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoZ2V0Q29udGV4dCgpLCBGcmFtZXdvcmtVdGlsLmNyZWF0ZUZpbHRlcigiKCYob2JqZWN0Q2xhc3M9IiArIEFwcGxpY2F0aW9uSGFuZGxlLmNsYXNzLmdldE5hbWUoKSArICIpKCIgKyBBcHBsaWNhdGlvbkhhbmRsZS5BUFBMSUNBVElPTl9ERVNDUklQVE9SICsgIj0iICsgYXBwLmdldEFwcGxpY2F0aW9uSWQoKSArICIpKSIpLCB0cmFja2VyQ3VzdG9taXplcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJdHJhY2tlci5vcGVuKCk7Ci0JCXRyeSB7Ci0JCQlBcHBsaWNhdGlvbkhhbmRsZSBoYW5kbGUgPSBhcHAubGF1bmNoKGFyZ3MpOwotCQkJaGFuZGxlLmRlc3Ryb3koKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBsYXVuY2ggc2ltcGxlQXBwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXRyYWNrZXIuY2xvc2UoKTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgcmVzdWx0cy5nZXQoc2ltcGxlUmVzdWx0cyk7Ci0JCWFzc2VydE51bGwoIkNoZWNrIGFwcGxpY2F0aW9uIHJlc3VsdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzdHJveUJlZm9yZVN0YXJ0MDIoKSB0aHJvd3MgSW52YWxpZFN5bnRheEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uRGVzY3JpcHRvciBhcHAgPSBnZXRBcHBsaWNhdGlvbihQSV9PU0dJX1RFU1RTICsgIi50ZXN0TWFpblRocmVhZGVkMDEiKTsgLy8kTk9OLU5MUy0xJAotCQlIYXNoTWFwIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLQkJSGFzaE1hcCByZXN1bHRzID0gKEhhc2hNYXApIGFyZ3MuZ2V0KHRlc3RSZXN1bHRzKTsKLQkJU2VydmljZVRyYWNrZXJDdXN0b21pemVyIHRyYWNrZXJDdXN0b21pemVyID0gbmV3IFNlcnZpY2VUcmFja2VyQ3VzdG9taXplcigpIHsKLQkJCXB1YmxpYyBPYmplY3QgYWRkaW5nU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQkJCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IChBcHBsaWNhdGlvbkhhbmRsZSkgZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJCQloYW5kbGUuZGVzdHJveSgpOwotCQkJCXJldHVybiBoYW5kbGU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCQkvLyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQkJU2VydmljZVRyYWNrZXIgdHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihnZXRDb250ZXh0KCksIEZyYW1ld29ya1V0aWwuY3JlYXRlRmlsdGVyKCIoJihvYmplY3RDbGFzcz0iICsgQXBwbGljYXRpb25IYW5kbGUuY2xhc3MuZ2V0TmFtZSgpICsgIikoIiArIEFwcGxpY2F0aW9uSGFuZGxlLkFQUExJQ0FUSU9OX0RFU0NSSVBUT1IgKyAiPSIgKyBhcHAuZ2V0QXBwbGljYXRpb25JZCgpICsgIikpIiksIHRyYWNrZXJDdXN0b21pemVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl0cmFja2VyLm9wZW4oKTsKLQkJdHJ5IHsKLQkJCUFwcGxpY2F0aW9uSGFuZGxlIGhhbmRsZSA9IGFwcC5sYXVuY2goYXJncyk7Ci0JCQloYW5kbGUuZGVzdHJveSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxhdW5jaCBzaW1wbGVBcHAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJdHJhY2tlci5jbG9zZSgpOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSByZXN1bHRzLmdldChzaW1wbGVSZXN1bHRzKTsKLQkJYXNzZXJ0TnVsbCgiQ2hlY2sgYXBwbGljYXRpb24gcmVzdWx0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU2NoZWR1bGVkQXBwbGljYXRpb24gZ2V0U2NoZWR1bGVBcHBsaWNhdGlvbihTdHJpbmcgc2NoZWR1bGVJRCwgYm9vbGVhbiBmYWlsT25NaXNzaW5nKSB7Ci0JCXRyeSB7Ci0JCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJCdW5kbGVDb250ZXh0IGlzIG51bGwhISIsIGNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCQlDbGFzcyBzY2hlZEFwcENsYXNzID0gU2NoZWR1bGVkQXBwbGljYXRpb24uY2xhc3M7Ci0JCQlhc3NlcnROb3ROdWxsKCJTY2hlZHVsZWRBcHBsaWNhdGlvbi5jbGFzcyBpcyBudWxsISEiLCBzY2hlZEFwcENsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJU2VydmljZVJlZmVyZW5jZVtdIHJlZnMgPSBnZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZXMoc2NoZWRBcHBDbGFzcy5nZXROYW1lKCksICIoIiArIFNjaGVkdWxlZEFwcGxpY2F0aW9uLlNDSEVEVUxFX0lEICsgIj0iICsgc2NoZWR1bGVJRCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlpZiAocmVmcyA9PSBudWxsIHx8IHJlZnMubGVuZ3RoID09IDApIHsKLQkJCQlpZiAoIWZhaWxPbk1pc3NpbmcpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJlZnMgPSBnZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZXMoU2NoZWR1bGVkQXBwbGljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJCQlTdHJpbmcgYXZhaWxhYmxlU2NoZWRzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVmcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCQkJYXZhaWxhYmxlU2NoZWRzICs9IHJlZnNbaV0uZ2V0UHJvcGVydHkoU2NoZWR1bGVkQXBwbGljYXRpb24uU0NIRURVTEVfSUQpOwotCQkJCQkJaWYgKGkgPCByZWZzLmxlbmd0aCAtIDEpCi0JCQkJCQkJYXZhaWxhYmxlU2NoZWRzICs9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWZhaWwoIkNvdWxkIG5vdCBmaW5kIHNjaGVkdWxlOiAiICsgc2NoZWR1bGVJRCArICIgYXZhaWxhYmxlIGFwcHMgYXJlOiAiICsgYXZhaWxhYmxlU2NoZWRzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlTY2hlZHVsZWRBcHBsaWNhdGlvbiByZXN1bHQgPSAoU2NoZWR1bGVkQXBwbGljYXRpb24pIGdldENvbnRleHQoKS5nZXRTZXJ2aWNlKHJlZnNbMF0pOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCWdldENvbnRleHQoKS51bmdldFNlcnZpY2UocmVmc1swXSk7Ci0JCQllbHNlCi0JCQkJZmFpbCgiQ291bGQgbm90IGdldCBzY2hlZHVsZWQgYXBwbGljYXRpb246ICIgKyBzY2hlZHVsZUlEKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJDb3VsZCBub3QgY3JlYXRlIGFwcCBmaWx0ZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQXBwbGljYXRpb25IYW5kbGVUcmFja2VyIGltcGxlbWVudHMgU2VydmljZVRyYWNrZXJDdXN0b21pemVyIHsKLQkJcHJpdmF0ZSBBcnJheUxpc3QgZXZlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgYmM7Ci0KLQkJcHVibGljIEFwcGxpY2F0aW9uSGFuZGxlVHJhY2tlcihCdW5kbGVDb250ZXh0IGJjKSB7Ci0JCQl0aGlzLmJjID0gYmM7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBhZGRpbmdTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCQlTdHJpbmcgaW5zdGFuY2UgPSAoU3RyaW5nKSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoQXBwbGljYXRpb25IYW5kbGUuQVBQTElDQVRJT05fUElEKTsKLQkJCVN0cmluZyBzdGF0ZSA9IChTdHJpbmcpIHJlZmVyZW5jZS5nZXRQcm9wZXJ0eShBcHBsaWNhdGlvbkhhbmRsZS5BUFBMSUNBVElPTl9TVEFURSk7Ci0JCQlldmVudHMuYWRkKG5ldyBTdHJpbmdbXSB7aW5zdGFuY2UsIHN0YXRlfSk7Ci0JCQlPYmplY3QgcmVzdWx0ID0gYmMuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQkJbm90aWZ5QWxsKCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vZGlmaWVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCVN0cmluZyBpbnN0YW5jZSA9IChTdHJpbmcpIHJlZmVyZW5jZS5nZXRQcm9wZXJ0eShBcHBsaWNhdGlvbkhhbmRsZS5BUFBMSUNBVElPTl9QSUQpOwotCQkJU3RyaW5nIHN0YXRlID0gKFN0cmluZykgcmVmZXJlbmNlLmdldFByb3BlcnR5KEFwcGxpY2F0aW9uSGFuZGxlLkFQUExJQ0FUSU9OX1NUQVRFKTsKLQkJCWV2ZW50cy5hZGQobmV3IFN0cmluZ1tdIHtpbnN0YW5jZSwgc3RhdGV9KTsKLQkJCW5vdGlmeUFsbCgpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewotCQkJU3RyaW5nIGluc3RhbmNlID0gKFN0cmluZykgcmVmZXJlbmNlLmdldFByb3BlcnR5KEFwcGxpY2F0aW9uSGFuZGxlLkFQUExJQ0FUSU9OX1BJRCk7Ci0JCQlldmVudHMuYWRkKG5ldyBTdHJpbmdbXSB7aW5zdGFuY2UsIFJFTU9WRUR9KTsKLQkJCW5vdGlmeUFsbCgpOwotCQl9Ci0KLQkJLy8gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGFzc3VtZXMgeW91IGNhbGwgaXQgYmVmb3JlIHRoZSBldmVudCBhY3R1YWxseSBnZXRzIHBvc3RlZC4KLQkJLy8gSXQgb25seSBsb29rcyBhdCB0aGUgbGFzdCBldmVudCB0aGF0IHdhcyBzYXZlZC4KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdhaXRGb3JFdmVudChTdHJpbmcgaW5zdGFuY2UsIFN0cmluZyBzdGF0ZSkgewotCQkJbG9uZyBkZWxheSA9IDUwMDA7Ci0JCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGV2ZW50Rm91bmQoaW5zdGFuY2UsIHN0YXRlKTsKLQkJCXdoaWxlIChkZWxheSA+IDAgJiYgIWZvdW5kKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd2FpdCg1MDAwKTsKLQkJCQkJZGVsYXkgLT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJCWZvdW5kID0gZXZlbnRGb3VuZChpbnN0YW5jZSwgc3RhdGUpOwotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCU9iamVjdFtdW10gZm91bmRFdmVudHMgPSBnZXRFdmVudHMoKTsKLQkJCQlTdHJpbmcgZm91bmRFdmVudHNNc2c7Ci0JCQkJaWYgKGZvdW5kRXZlbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGV2ZW50c0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZXZlbnRzQnVmZmVyLmFwcGVuZCgiXG5Gb3VuZCB0aGUgZm9sbG93aW5nIGV2ZW50czogXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvdW5kRXZlbnRzLmxlbmd0aDsgaSsrKQotCQkJCQkJZXZlbnRzQnVmZmVyLmFwcGVuZCgiIGhhbmRsZSBldmVudDogIikuYXBwZW5kKGZvdW5kRXZlbnRzW2ldWzBdKS5hcHBlbmQoIiAiKS5hcHBlbmQoZm91bmRFdmVudHNbaV1bMV0pLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJZm91bmRFdmVudHNNc2cgPSBldmVudHNCdWZmZXIudG9TdHJpbmcoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3VuZEV2ZW50c01zZyA9ICJcbk5vIGV2ZW50cyByZWNvcmRlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZmFpbCgiZmFpbGVkIHdhaXRpbmcgZm9yIGhhbmRsZSBldmVudDogIiArIGluc3RhbmNlICsgIiAiICsgc3RhdGUgKyBmb3VuZEV2ZW50c01zZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdbXVtdIGdldEV2ZW50cygpIHsKLQkJCXJldHVybiAoU3RyaW5nW11bXSkgZXZlbnRzLnRvQXJyYXkobmV3IFN0cmluZ1tldmVudHMuc2l6ZSgpXVtdKTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBldmVudEZvdW5kKFN0cmluZyBpbnN0YW5jZSwgU3RyaW5nIHN0YXRlKSB7Ci0JCQlpZiAoZXZlbnRzLnNpemUoKSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZ1tdIGV2ZW50ID0gKFN0cmluZ1tdKSBldmVudHMuZ2V0KGV2ZW50cy5zaXplKCkgLSAxKTsKLQkJCWlmIChpbnN0YW5jZS5lcXVhbHMoZXZlbnRbMF0pICYmIHN0YXRlLmVxdWFscyhldmVudFsxXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGxpY2F0aW9uRGVzY3JpcHRvclRyYWNrZXIgaW1wbGVtZW50cyBTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIgewotCQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgYmM7Ci0JCXByaXZhdGUgQXJyYXlMaXN0IGV2ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQXBwbGljYXRpb25EZXNjcmlwdG9yVHJhY2tlcihCdW5kbGVDb250ZXh0IGJjKSB7Ci0JCQl0aGlzLmJjID0gYmM7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBhZGRpbmdTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCQlTdHJpbmcgcGlkID0gKFN0cmluZykgcmVmZXJlbmNlLmdldFByb3BlcnR5KEFwcGxpY2F0aW9uRGVzY3JpcHRvci5BUFBMSUNBVElPTl9QSUQpOwotCQkJQm9vbGVhbiBsb2NrZWQgPSAoQm9vbGVhbikgcmVmZXJlbmNlLmdldFByb3BlcnR5KEFwcGxpY2F0aW9uRGVzY3JpcHRvci5BUFBMSUNBVElPTl9MT0NLRUQpOwotCQkJQm9vbGVhbiBsYXVuY2hhYmxlID0gKEJvb2xlYW4pIHJlZmVyZW5jZS5nZXRQcm9wZXJ0eShBcHBsaWNhdGlvbkRlc2NyaXB0b3IuQVBQTElDQVRJT05fTEFVTkNIQUJMRSk7Ci0JCQlldmVudHMuYWRkKG5ldyBPYmplY3RbXSB7cGlkLCBBRERFRCwgbG9ja2VkLCBsYXVuY2hhYmxlfSk7Ci0JCQlPYmplY3QgcmVzdWx0ID0gYmMuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQkJbm90aWZ5QWxsKCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vZGlmaWVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCVN0cmluZyBwaWQgPSAoU3RyaW5nKSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoQXBwbGljYXRpb25EZXNjcmlwdG9yLkFQUExJQ0FUSU9OX1BJRCk7Ci0JCQlCb29sZWFuIGxvY2tlZCA9IChCb29sZWFuKSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoQXBwbGljYXRpb25EZXNjcmlwdG9yLkFQUExJQ0FUSU9OX0xPQ0tFRCk7Ci0JCQlCb29sZWFuIGxhdW5jaGFibGUgPSAoQm9vbGVhbikgcmVmZXJlbmNlLmdldFByb3BlcnR5KEFwcGxpY2F0aW9uRGVzY3JpcHRvci5BUFBMSUNBVElPTl9MQVVOQ0hBQkxFKTsKLQkJCWV2ZW50cy5hZGQobmV3IE9iamVjdFtdIHtwaWQsIE1PRElGSUVELCBsb2NrZWQsIGxhdW5jaGFibGV9KTsKLQkJCW5vdGlmeUFsbCgpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewotCQkJU3RyaW5nIHBpZCA9IChTdHJpbmcpIHJlZmVyZW5jZS5nZXRQcm9wZXJ0eShBcHBsaWNhdGlvbkRlc2NyaXB0b3IuQVBQTElDQVRJT05fUElEKTsKLQkJCUJvb2xlYW4gbG9ja2VkID0gKEJvb2xlYW4pIHJlZmVyZW5jZS5nZXRQcm9wZXJ0eShBcHBsaWNhdGlvbkRlc2NyaXB0b3IuQVBQTElDQVRJT05fTE9DS0VEKTsKLQkJCUJvb2xlYW4gbGF1bmNoYWJsZSA9IChCb29sZWFuKSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoQXBwbGljYXRpb25EZXNjcmlwdG9yLkFQUExJQ0FUSU9OX0xBVU5DSEFCTEUpOwotCQkJZXZlbnRzLmFkZChuZXcgT2JqZWN0W10ge3BpZCwgUkVNT1ZFRCwgbG9ja2VkLCBsYXVuY2hhYmxlfSk7Ci0JCQlub3RpZnlBbGwoKTsKLQkJfQotCi0JCS8vIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBhc3N1bWVzIHlvdSBjYWxsIGl0IGJlZm9yZSB0aGUgZXZlbnQgYWN0dWFsbHkgZ2V0cyBwb3N0ZWQuCi0JCS8vIEl0IG9ubHkgbG9va3MgYXQgdGhlIGxhc3QgZXZlbnQgdGhhdCB3YXMgc2F2ZWQuCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3YWl0Rm9yRXZlbnQoU3RyaW5nIHBpZCwgU3RyaW5nIHR5cGUsIEJvb2xlYW4gbG9ja2VkLCBCb29sZWFuIGxhdW5jaGFibGUpIHsKLQkJCWxvbmcgZGVsYXkgPSA1MDAwOwotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBldmVudEZvdW5kKHBpZCwgdHlwZSwgbG9ja2VkLCBsYXVuY2hhYmxlKTsKLQkJCXdoaWxlIChkZWxheSA+IDAgJiYgIWZvdW5kKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd2FpdCg1MDAwKTsKLQkJCQkJZGVsYXkgLT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJCWZvdW5kID0gZXZlbnRGb3VuZChwaWQsIHR5cGUsIGxvY2tlZCwgbGF1bmNoYWJsZSk7Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJT2JqZWN0W11bXSBmb3VuZEV2ZW50cyA9IGdldEV2ZW50cygpOwotCQkJCVN0cmluZyBmb3VuZEV2ZW50c01zZzsKLQkJCQlpZiAoZm91bmRFdmVudHMubGVuZ3RoID4gMCkgewotCQkJCQlTdHJpbmdCdWZmZXIgZXZlbnRzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlldmVudHNCdWZmZXIuYXBwZW5kKCJcbkZvdW5kIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiBcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZm91bmRFdmVudHMubGVuZ3RoOyBpKyspCi0JCQkJCQlldmVudHNCdWZmZXIuYXBwZW5kKCIgZGVzY3JpcHRvciBldmVudDogIikuYXBwZW5kKGZvdW5kRXZlbnRzW2ldWzBdKS5hcHBlbmQoIiAiKS5hcHBlbmQoZm91bmRFdmVudHNbaV1bMV0pLmFwcGVuZCgiICIpLmFwcGVuZChmb3VuZEV2ZW50c1tpXVsyXSkuYXBwZW5kKCIgIikuYXBwZW5kKGZvdW5kRXZlbnRzW2ldWzNdKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQlmb3VuZEV2ZW50c01zZyA9IGV2ZW50c0J1ZmZlci50b1N0cmluZygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvdW5kRXZlbnRzTXNnID0gIlxuTm8gZXZlbnRzIHJlY29yZGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlmYWlsKCJmYWlsZWQgd2FpdGluZyBmb3IgZGVzY3JpcHRvciBldmVudDogIiArIHBpZCArICIgIiArIHR5cGUgKyAiICIgKyBsb2NrZWQgKyAiICIgKyBsYXVuY2hhYmxlICsgZm91bmRFdmVudHNNc2cpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdFtdW10gZ2V0RXZlbnRzKCkgewotCQkJcmV0dXJuIChPYmplY3RbXVtdKSBldmVudHMudG9BcnJheShuZXcgT2JqZWN0W2V2ZW50cy5zaXplKCldW10pOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGV2ZW50Rm91bmQoU3RyaW5nIHBpZCwgU3RyaW5nIHR5cGUsIEJvb2xlYW4gbG9ja2VkLCBCb29sZWFuIGxhdW5jaGFibGUpIHsKLQkJCWlmIChldmVudHMuc2l6ZSgpID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJT2JqZWN0W10gZXZlbnQgPSAoT2JqZWN0W10pIGV2ZW50cy5nZXQoZXZlbnRzLnNpemUoKSAtIDEpOwotCQkJaWYgKHBpZC5lcXVhbHMoZXZlbnRbMF0pICYmIHR5cGUuZXF1YWxzKGV2ZW50WzFdKSAmJiBsb2NrZWQuZXF1YWxzKGV2ZW50WzJdKSAmJiBsYXVuY2hhYmxlLmVxdWFscyhldmVudFszXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYXBwYWRtaW4vRXhpdFZhbHVlQXBwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYXBwYWRtaW4vRXhpdFZhbHVlQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWZjYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2FwcGFkbWluL0V4aXRWYWx1ZUFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5hcHBhZG1pbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRXhpdFZhbHVlQXBwIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uLCBSdW5uYWJsZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmV0dXJuTnVsbFJlc3VsdCA9ICJyZXR1cm4ubnVsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyByZXR1cm5Bc3luY1Jlc3VsdCA9ICJyZXR1cm4uYXN5bmMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHNldEFzeW5jRWFybHkgPSAic2V0LmFzeW5jLmVhcmx5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBzZXRBc3luY1dyb25nQXBwID0gInNldC5hc3luYy53cm9uZ0FwcCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhpdFZhbHVlID0gIkV4aXQgVmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGJvb2xlYW4gYWN0aXZlID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gc3RvcHBlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiB1c2VBc3luYyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiByZXR1cm5OdWxsID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHNldFdyb25nQXBwID0gZmFsc2U7Ci0JcHJpdmF0ZSBJQXBwbGljYXRpb25Db250ZXh0IGFwcENvbnRleHQ7Ci0JZmluYWwgT2JqZWN0IGd1YXJkT2JqID0gbmV3IE9iamVjdCgpOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCWFwcENvbnRleHQgPSBjb250ZXh0OwotCQljb250ZXh0LmFwcGxpY2F0aW9uUnVubmluZygpOwotCQlCb29sZWFuIG51bGxWYWx1ZSA9IChCb29sZWFuKSBjb250ZXh0LmdldEFyZ3VtZW50cygpLmdldChyZXR1cm5OdWxsUmVzdWx0KTsKLQkJcmV0dXJuTnVsbCA9IG51bGxWYWx1ZSA9PSBudWxsID8gZmFsc2UgOiBudWxsVmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JCUJvb2xlYW4gYXN5bmNWYWx1ZSA9IChCb29sZWFuKSBjb250ZXh0LmdldEFyZ3VtZW50cygpLmdldChyZXR1cm5Bc3luY1Jlc3VsdCk7Ci0JCXVzZUFzeW5jID0gYXN5bmNWYWx1ZSA9PSBudWxsID8gZmFsc2UgOiBhc3luY1ZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotCi0JCUJvb2xlYW4gYXN5bmNFYXJseVZhbHVlID0gKEJvb2xlYW4pIGNvbnRleHQuZ2V0QXJndW1lbnRzKCkuZ2V0KHNldEFzeW5jRWFybHkpOwotCQlib29sZWFuIHNldEVhcmx5ID0gYXN5bmNFYXJseVZhbHVlID09IG51bGwgPyBmYWxzZSA6IGFzeW5jRWFybHlWYWx1ZS5ib29sZWFuVmFsdWUoKTsKLQkJQm9vbGVhbiB3cm9uZ0FwcFZhbHVlID0gKEJvb2xlYW4pIGNvbnRleHQuZ2V0QXJndW1lbnRzKCkuZ2V0KHNldEFzeW5jV3JvbmdBcHApOwotCQlzZXRXcm9uZ0FwcCA9IHdyb25nQXBwVmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogd3JvbmdBcHBWYWx1ZS5ib29sZWFuVmFsdWUoKTsKLQkJaWYgKHNldEVhcmx5KSB7Ci0JCQl0cnkgewotCQkJCWNvbnRleHQuc2V0UmVzdWx0KCJmYWlsZWQiLCB0aGlzKTsKLQkJCQkvLyBmYWlsZWQKLQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcGFzc2VkCi0JCQkJcmV0dXJuIGV4aXRWYWx1ZTsKLQkJCX0KLQkJfQotCQlpZiAodXNlQXN5bmMpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYXN5bmMgcmVzdWx0Iik7Ci0JCQluZXcgVGhyZWFkKHRoaXMsICJFeGl0VmFsdWVBcHAgVGVzdCIpLnN0YXJ0KCk7Ci0JCQlyZXR1cm4gSUFwcGxpY2F0aW9uQ29udGV4dC5FWElUX0FTWU5DX1JFU1VMVDsKLQkJfQotCQlydW4oKTsKLQkJcmV0dXJuIHJldHVybk51bGwgPyBudWxsIDogZXhpdFZhbHVlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlhY3RpdmUgPSBmYWxzZTsKLQkJbm90aWZ5QWxsKCk7Ci0JCXdoaWxlICghc3RvcHBlZCkKLQkJCXRyeSB7Ci0JCQkJd2FpdCgxMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcnVuKCkgewotCQlpZiAoYWN0aXZlKSB7Ci0JCQl0cnkgewotCQkJCXdhaXQoNTAwMCk7IC8vIG9ubHkgcnVuIGZvciA1IHNlY29uZHMgYXQgbW9zdAotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfQotCQlzdG9wcGVkID0gdHJ1ZTsKLQkJaWYgKHVzZUFzeW5jKSB7Ci0JCQlJQXBwbGljYXRpb24gYXBwID0gdGhpczsKLQkJCU9iamVjdCByZXN1bHQgPSByZXR1cm5OdWxsID8gbnVsbCA6IGV4aXRWYWx1ZTsKLQkJCWlmIChzZXRXcm9uZ0FwcCkgewotCQkJCXJlc3VsdCA9ICJmYWlsZWQiOwotCQkJCWFwcCA9IG5ldyBJQXBwbGljYXRpb24oKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJCQkJCS8vIG5vdGhpbmcKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJYXBwQ29udGV4dC5zZXRSZXN1bHQocmVzdWx0LCBhcHApOwotCQkJCS8vIGZhaWxlZAotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwYXNzZWQKLQkJCQlhcHBDb250ZXh0LnNldFJlc3VsdChyZXR1cm5OdWxsID8gbnVsbCA6IGV4aXRWYWx1ZSwgdGhpcyk7Ci0JCQl9Ci0JCX0KLQkJbm90aWZ5QWxsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYXBwYWRtaW4vRmFpbGVkQXBwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYXBwYWRtaW4vRmFpbGVkQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDkzNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2FwcGFkbWluL0ZhaWxlZEFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmFwcGFkbWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBGYWlsZWRBcHAgaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCi0JcHVibGljIE9iamVjdCBzdGFydChJQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJHZW5lcmF0ZWQgRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkvLyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYXBwYWRtaW4vU2ltcGxlQXBwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYXBwYWRtaW4vU2ltcGxlQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjQ3NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2FwcGFkbWluL1NpbXBsZUFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmFwcGFkbWluOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBcHAgaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCi0JcHJpdmF0ZSBib29sZWFuIGFjdGl2ZSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIHN0b3BwZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0ZWQgc2ltcGxlIGFwcCIpOwotCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCUhhc2hNYXAgcmVzdWx0cyA9IChIYXNoTWFwKSBjb250ZXh0LmdldEFyZ3VtZW50cygpLmdldChBcHBsaWNhdGlvbkFkbWluVGVzdC50ZXN0UmVzdWx0cyk7Ci0JCWlmIChyZXN1bHRzICE9IG51bGwpCi0JCQlyZXN1bHRzLnB1dChBcHBsaWNhdGlvbkFkbWluVGVzdC5zaW1wbGVSZXN1bHRzLCBBcHBsaWNhdGlvbkFkbWluVGVzdC5TVUNDRVNTKTsKLQkJY29udGV4dC5hcHBsaWNhdGlvblJ1bm5pbmcoKTsKLQkJd2hpbGUgKGFjdGl2ZSkgewotCQkJdHJ5IHsKLQkJCQl3YWl0KDEwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9Ci0JCXN0b3BwZWQgPSB0cnVlOwotCQlub3RpZnlBbGwoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJzdG9wcGVkIHNpbXBsZSBhcHAiKTsKLQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQlyZXR1cm4gY29udGV4dC5nZXRBcmd1bWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJYWN0aXZlID0gZmFsc2U7Ci0JCW5vdGlmeUFsbCgpOwotCQl3aGlsZSAoIXN0b3BwZWQpCi0JCQl0cnkgewotCQkJCXdhaXQoMTAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9BYnN0cmFjdEJ1bmRsZVRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9BYnN0cmFjdEJ1bmRsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTEyNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvQWJzdHJhY3RCdW5kbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLkNvcmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwuYmFzZWFkYXB0b3IuU3RhdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RCdW5kbGVUZXN0cyBleHRlbmRzIENvcmVUZXN0IHsKLQlwdWJsaWMgc3RhdGljIGludCBCVU5ETEVfTElTVEVORVIgPSAweDAxOwotCXB1YmxpYyBzdGF0aWMgaW50IFNZTkNfQlVORExFX0xJU1RFTkVSID0gMHgwMjsKLQlwdWJsaWMgc3RhdGljIGludCBTSU1QTEVfUkVTVUxUUyA9IDB4MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFU19ST09UID0gImJ1bmRsZV90ZXN0cyI7Ci0JcHVibGljIHN0YXRpYyBUZXN0UmVzdWx0cyBzaW1wbGVSZXN1bHRzOwotCXB1YmxpYyBzdGF0aWMgRXZlbnRMaXN0ZW5lclRlc3RSZXN1bHRzIGxpc3RlbmVyUmVzdWx0czsKLQlwdWJsaWMgc3RhdGljIFN5bmNFdmVudExpc3RlbmVyVGVzdFJlc3VsdHMgc3luY0xpc3RlbmVyUmVzdWx0czsKLQlwdWJsaWMgc3RhdGljIEV2ZW50TGlzdGVuZXJUZXN0UmVzdWx0cyBmcmFtZXdvcmtMaXN0ZW5lclJlc3VsdHM7Ci0JcHVibGljIHN0YXRpYyBCdW5kbGVJbnN0YWxsZXIgaW5zdGFsbGVyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5zdGFsbGVyID0gbmV3IEJ1bmRsZUluc3RhbGxlcihCVU5ETEVTX1JPT1QsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkpOwotCQlpbnN0YWxsZXIucmVmcmVzaFBhY2thZ2VzKG51bGwpOwotCQlsaXN0ZW5lclJlc3VsdHMgPSBuZXcgRXZlbnRMaXN0ZW5lclRlc3RSZXN1bHRzKCk7Ci0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuYWRkQnVuZGxlTGlzdGVuZXIobGlzdGVuZXJSZXN1bHRzKTsKLQkJc3luY0xpc3RlbmVyUmVzdWx0cyA9IG5ldyBTeW5jRXZlbnRMaXN0ZW5lclRlc3RSZXN1bHRzKCk7Ci0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuYWRkQnVuZGxlTGlzdGVuZXIoc3luY0xpc3RlbmVyUmVzdWx0cyk7Ci0JCXNpbXBsZVJlc3VsdHMgPSBuZXcgVGVzdFJlc3VsdHMoKTsKLQkJZnJhbWV3b3JrTGlzdGVuZXJSZXN1bHRzID0gbmV3IEV2ZW50TGlzdGVuZXJUZXN0UmVzdWx0cygpOwotCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmFkZEZyYW1ld29ya0xpc3RlbmVyKGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5zdGFsbGVyLnNodXRkb3duKCk7Ci0JCWluc3RhbGxlciA9IG51bGw7Ci0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVtb3ZlQnVuZGxlTGlzdGVuZXIobGlzdGVuZXJSZXN1bHRzKTsKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZW1vdmVCdW5kbGVMaXN0ZW5lcihzeW5jTGlzdGVuZXJSZXN1bHRzKTsKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZW1vdmVGcmFtZXdvcmtMaXN0ZW5lcihmcmFtZXdvcmtMaXN0ZW5lclJlc3VsdHMpOwotCQlsaXN0ZW5lclJlc3VsdHMgPSBudWxsOwotCQlzeW5jTGlzdGVuZXJSZXN1bHRzID0gbnVsbDsKLQkJc2ltcGxlUmVzdWx0cyA9IG51bGw7Ci0JCWZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cyA9IG51bGw7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCk7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGNvbXBhcmVSZXN1bHRzKE9iamVjdFtdIGV4cGVjdGVkRXZlbnRzLCBPYmplY3RbXSBhY3R1YWxFdmVudHMpIHsKLQkJYXNzZXJ0RXF1YWxzKCJjb21wYXJlUmVzdWx0cyBsZW5ndGgiLCBleHBlY3RlZEV2ZW50cy5sZW5ndGgsIGFjdHVhbEV2ZW50cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkRXZlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImNvbXBhcmVSZXN1bHRzICIgKyBpLCBleHBlY3RlZEV2ZW50c1tpXSwgYWN0dWFsRXZlbnRzW2ldKTsKLQkJfQotCX0KLQotCXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgewotCQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKChleHBlY3RlZCA9PSBudWxsIHx8IGFjdHVhbCA9PSBudWxsKSAmJiBleHBlY3RlZCAhPSBhY3R1YWwpCi0JCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIHRvU3RyaW5nKGV4cGVjdGVkKSwgdG9TdHJpbmcoYWN0dWFsKSk7Ci0JCWlmIChpc0VxdWFsKGV4cGVjdGVkLCBhY3R1YWwpKQotCQkJcmV0dXJuOwotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIHRvU3RyaW5nKGV4cGVjdGVkKSwgdG9TdHJpbmcoYWN0dWFsKSk7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgaW50W10gZXhwZWN0ZWQsIGludFtdIGFjdHVhbCkgewotCQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKChleHBlY3RlZCA9PSBudWxsIHx8IGFjdHVhbCA9PSBudWxsKSAmJiBleHBlY3RlZCAhPSBhY3R1YWwpCi0JCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIHRvU3RyaW5nKGV4cGVjdGVkKSwgdG9TdHJpbmcoYWN0dWFsKSk7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggIT0gYWN0dWFsLmxlbmd0aCkKLQkJCWZhaWxOb3RFcXVhbHMobWVzc2FnZSwgdG9TdHJpbmcoZXhwZWN0ZWQpLCB0b1N0cmluZyhhY3R1YWwpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykKLQkJCWlmIChleHBlY3RlZFtpXSAhPSBhY3R1YWxbaV0pCi0JCQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCB0b1N0cmluZyhleHBlY3RlZCksIHRvU3RyaW5nKGFjdHVhbCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKLQkJaWYgKCFleHBlY3RlZC5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oYWN0dWFsLmdldENsYXNzKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZXhwZWN0ZWQgaW5zdGFuY2VvZiBCdW5kbGVFdmVudCkKLQkJCXJldHVybiBpc0VxdWFsKChCdW5kbGVFdmVudCkgZXhwZWN0ZWQsIChCdW5kbGVFdmVudCkgYWN0dWFsKTsKLQkJZWxzZSBpZiAoZXhwZWN0ZWQgaW5zdGFuY2VvZiBGcmFtZXdvcmtFdmVudCkKLQkJCXJldHVybiBpc0VxdWFsKChGcmFtZXdvcmtFdmVudCkgZXhwZWN0ZWQsIChGcmFtZXdvcmtFdmVudCkgYWN0dWFsKTsKLQkJcmV0dXJuIGV4cGVjdGVkLmVxdWFscyhhY3R1YWwpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChCdW5kbGVFdmVudCBleHBlY3RlZCwgQnVuZGxlRXZlbnQgYWN0dWFsKSB7Ci0JCXJldHVybiBleHBlY3RlZC5nZXRTb3VyY2UoKSA9PSBhY3R1YWwuZ2V0U291cmNlKCkgJiYgZXhwZWN0ZWQuZ2V0VHlwZSgpID09IGFjdHVhbC5nZXRUeXBlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VxdWFsKEZyYW1ld29ya0V2ZW50IGV4cGVjdGVkLCBGcmFtZXdvcmtFdmVudCBhY3R1YWwpIHsKLQkJcmV0dXJuIGV4cGVjdGVkLmdldFNvdXJjZSgpID09IGFjdHVhbC5nZXRTb3VyY2UoKSAmJiBleHBlY3RlZC5nZXRUeXBlKCkgPT0gYWN0dWFsLmdldFR5cGUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoaW50W10gYXJyYXkpIHsKLQkJaWYgKGFycmF5ID09IG51bGwpCi0JCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSAiWyI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlyZXN1bHQgKz0gJywnOwotCQkJcmVzdWx0ICs9IGFycmF5W2ldOwotCQl9Ci0JCXJlc3VsdCArPSAiXSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgdG9TdHJpbmcoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnVuZGxlRXZlbnQpCi0JCQlyZXR1cm4gdG9TdHJpbmcoKEJ1bmRsZUV2ZW50KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGcmFtZXdvcmtFdmVudCkKLQkJCXJldHVybiB0b1N0cmluZygoRnJhbWV3b3JrRXZlbnQpIG9iamVjdCk7Ci0JCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgdG9TdHJpbmcoRnJhbWV3b3JrRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkZyYW1ld29ya0V2ZW50IFsiKTsKLQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgRnJhbWV3b3JrRXZlbnQuRVJST1IgOgotCQkJCXJlc3VsdC5hcHBlbmQoIkVSUk9SIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZyYW1ld29ya0V2ZW50LklORk8gOgotCQkJCXJlc3VsdC5hcHBlbmQoIklORk8iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRnJhbWV3b3JrRXZlbnQuUEFDS0FHRVNfUkVGUkVTSEVEIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJQQUNLQUdFU19SRUZSRVNIRUQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRnJhbWV3b3JrRXZlbnQuU1RBUlRFRCA6Ci0JCQkJcmVzdWx0LmFwcGVuZCgiU1RBUlRFRCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQgOgotCQkJCXJlc3VsdC5hcHBlbmQoIlNUQVJUTEVWRUxfQ0hBTkdFRCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGcmFtZXdvcmtFdmVudC5XQVJOSU5HIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJXQVJOSU5HIik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXN1bHQuYXBwZW5kKCJdICIpLmFwcGVuZChldmVudC5nZXRTb3VyY2UoKSk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgdG9TdHJpbmcoQnVuZGxlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkJ1bmRsZUV2ZW50IFsiKTsKLQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgQnVuZGxlRXZlbnQuSU5TVEFMTEVEIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJJTlNUQUxMRUQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJMQVpZX0FDVElWQVRJT04iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQnVuZGxlRXZlbnQuUkVTT0xWRUQgOgotCQkJCXJlc3VsdC5hcHBlbmQoIlJFU09MVkVEIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJ1bmRsZUV2ZW50LlNUQVJURUQgOgotCQkJCXJlc3VsdC5hcHBlbmQoIlNUQVJURUQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQnVuZGxlRXZlbnQuU1RBUlRJTkcgOgotCQkJCXJlc3VsdC5hcHBlbmQoIlNUQVJUSU5HIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJ1bmRsZUV2ZW50LlNUT1BQRUQgOgotCQkJCXJlc3VsdC5hcHBlbmQoIlNUT1BQRUQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQnVuZGxlRXZlbnQuU1RPUFBJTkcgOgotCQkJCXJlc3VsdC5hcHBlbmQoIlNUT1BQSU5HIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJ1bmRsZUV2ZW50LlVOSU5TVEFMTEVEIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJVTklOU1RBTExFRCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCdW5kbGVFdmVudC5VTlJFU09MVkVEIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJVTlJFU09MVkVEIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJ1bmRsZUV2ZW50LlVQREFURUQgOgotCQkJCXJlc3VsdC5hcHBlbmQoIlVQREFURUQiKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCXJlc3VsdC5hcHBlbmQoIl0gIikuYXBwZW5kKGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBsYXRmb3JtUHJvcGVydGllcygpIHsKLQkJU3RhdGVNYW5hZ2VyIHN0YXRlTWFuYWdlciA9IChTdGF0ZU1hbmFnZXIpIGluc3RhbGxlci5nZXRQbGF0Zm9ybUFkbWluKCk7Ci0JCXN0YXRlTWFuYWdlci5nZXRTeXN0ZW1TdGF0ZSgpLnNldFBsYXRmb3JtUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvQXJyYXlUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9BcnJheVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjZTU1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9BcnJheVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXM7Ci0KLXB1YmxpYyBjbGFzcyBBcnJheVRlc3QgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9CdW5kbGVFeGNlcHRpb25UZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvQnVuZGxlRXhjZXB0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzZWU3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9CdW5kbGVFeGNlcHRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdHNBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQnVuZGxlRXhjZXB0aW9uVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEJ1bmRsZUV4Y2VwdGlvblRlc3RzLmNsYXNzKTsKLQl9Ci0KLQkvLyB0ZXN0IHRocm93aW5nIGV4Y2VwdGlvbiBmcm9tIGFjdGl2YXRvciBjb25zdHJ1Y3RvcgotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnVuZGxlQWN0aXZhdG9yMDEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGVycm9yMSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJhY3RpdmF0b3IuZXJyb3IxIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWVycm9yMS5zdGFydCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgYSBzdGFydCBmYWlsdXJlIG9uIGludmFsaWQgYWN0aXZhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgYWN0aXZhdG9yIGVycm9yIiwgQnVuZGxlRXhjZXB0aW9uLkFDVElWQVRPUl9FUlJPUiwgZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyB0ZXN0IHRocm93aW5nIGV4Y2VwdGlvbiBmcm9tIGFjdGl2YXRvciBzdGFydAotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnVuZGxlQWN0aXZhdG9yMDIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGVycm9yMSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJhY3RpdmF0b3IuZXJyb3IyIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWVycm9yMS5zdGFydCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgYSBzdGFydCBmYWlsdXJlIG9uIGludmFsaWQgYWN0aXZhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgYWN0aXZhdG9yIGVycm9yIiwgQnVuZGxlRXhjZXB0aW9uLkFDVElWQVRPUl9FUlJPUiwgZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyB0ZXN0IHRocm93aW5nIGV4Y2VwdGlvbiBmcm9tIGFjdGl2YXRvciBzdG9wCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRCdW5kbGVBY3RpdmF0b3IwMygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgZXJyb3IxID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImFjdGl2YXRvci5lcnJvcjMiKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvcjEuc3RhcnQoKTsKLQkJdHJ5IHsKLQkJCWVycm9yMS5zdG9wKCk7Ci0JCQlmYWlsKCJFeHBlY3RlZCBhIHN0b3AgZmFpbHVyZSBvbiBpbnZhbGlkIGFjdGl2YXRvciIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGFjdGl2YXRvciBlcnJvciIsIEJ1bmRsZUV4Y2VwdGlvbi5BQ1RJVkFUT1JfRVJST1IsIGUuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLy8gdGVzdCB0aHJvd2luZyBleGNlcHRpb24gd2hlbiBpbnN0YWxsaW5nIGR1cGxpY2F0ZSBidW5kbGVzCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUVycm9yMDEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImFjdGl2YXRvci5lcnJvcjEiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImFjdGl2YXRvci5lcnJvcjQiKTsgLy8kTk9OLU5MUy0xJDsKLQkJCWZhaWwoIkV4cGVjdGVkIGFuIGluc3RhbGwgZmFpbHVyZSBvbiBkdXBsaWNhdGUgYnVuZGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgZHVwbGljYXRlIGVycm9yIiwgQnVuZGxlRXhjZXB0aW9uLkRVUExJQ0FURV9CVU5ETEVfRVJST1IsIGUuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLy8gdGVzdCB0aHJvd2luZyBleGNlcHRpb24gd2hlbiB1cGRhdGluZyB0byBhIGR1cGxpY2F0ZSBidW5kbGUKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlRXJyb3IwMigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYWN0aXZhdG9yLmVycm9yMSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBlcnJvcjIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYWN0aXZhdG9yLmVycm9yMiIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlVUkwgdXBkYXRlVVJMID0gbmV3IFVSTChpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oImFjdGl2YXRvci5lcnJvcjQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVycm9yMi51cGRhdGUodXBkYXRlVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlmYWlsKCJFeHBlY3RlZCBhbiB1cGRhdGUgZmFpbHVyZSBvbiBkdXBsaWNhdGUgYnVuZGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgZHVwbGljYXRlIGVycm9yIiwgQnVuZGxlRXhjZXB0aW9uLkRVUExJQ0FURV9CVU5ETEVfRVJST1IsIGUuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGlvIGV4Y2VwdGlvbiB1cGRhdGluZyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyB0ZXN0IHVuaW5zdGFsbGluZyB0aGUgc3lzdGVtIGJ1bmRsZQotCXB1YmxpYyB2b2lkIHRlc3RVbmluc3RhbGxTeXN0ZW1CdW5kbGUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIHN5c3RlbUJ1bmRsZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApOwotCQlhc3NlcnROb3ROdWxsKCJTeXN0ZW0gQnVuZGxlIGlzIG51bGwhISIsIHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXN5c3RlbUJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCWZhaWwoIkV4cGVjdGVkIGVycm9yIG9uIHVuaW5zdGFsbCBvZiBzeXN0ZW0gYnVuZGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgaW52YWxpZCBlcnJvciIsIEJ1bmRsZUV4Y2VwdGlvbi5JTlZBTElEX09QRVJBVElPTiwgZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9CdW5kbGVJbnN0YWxsVXBkYXRlVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL0J1bmRsZUluc3RhbGxVcGRhdGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDIxYzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL0J1bmRsZUluc3RhbGxVcGRhdGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5iYXNlYWRhcHRvci5BZGFwdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBCdW5kbGVJbnN0YWxsVXBkYXRlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEJ1bmRsZUluc3RhbGxVcGRhdGVUZXN0cy5jbGFzcyk7Ci0JfQotCi0JLy8gdGVzdCBpbnN0YWxsaW5nIHdpdGggbG9jYXRpb24KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFdpdGhMb2NhdGlvbjAxKCkgewotCQlCdW5kbGUgdGVzdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGVzdCA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuaW5zdGFsbEJ1bmRsZShsb2NhdGlvbik7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIEJTTiIsICJ0ZXN0MSIsIHRlc3QuZ2V0U3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZmFpbHVyZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh0ZXN0ICE9IG51bGwpCi0JCQkJCXRlc3QudW5pbnN0YWxsKCk7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0KLQkJfQotCX0KLQotCS8vIHRlc3QgaW5zdGFsbGluZyB3aXRoIGxvY2F0aW9uIGFuZCBudWxsIHN0cmVhbQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsV2l0aExvY2F0aW9uMDIoKSB7Ci0JCUJ1bmRsZSB0ZXN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigidGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCQl0ZXN0ID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5pbnN0YWxsQnVuZGxlKGxvY2F0aW9uLCBudWxsKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgQlNOIiwgInRlc3QxIiwgdGVzdC5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBmYWlsdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRlc3QgIT0gbnVsbCkKLQkJCQkJdGVzdC51bmluc3RhbGwoKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQl9Ci0JfQotCi0JLy8gdGVzdCBpbnN0YWxsaW5nIHdpdGggbG9jYXRpb24gYW5kIG5vbi1udWxsIHN0cmVhbQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsV2l0aFN0cmVhbTAzKCkgewotCQlCdW5kbGUgdGVzdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24xID0gaW5zdGFsbGVyLmdldEJ1bmRsZUxvY2F0aW9uKCJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBsb2NhdGlvbjIgPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRlc3QgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmluc3RhbGxCdW5kbGUobG9jYXRpb24xLCBuZXcgVVJMKGxvY2F0aW9uMikub3BlblN0cmVhbSgpKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgQlNOIiwgInRlc3QyIiwgdGVzdC5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBmYWlsdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRlc3QgIT0gbnVsbCkKLQkJCQkJdGVzdC51bmluc3RhbGwoKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQl9Ci0JfQotCi0JLy8gdGVzdCB1cGRhdGUgd2l0aCBudWxsIHN0cmVhbQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOb1N0cmVhbTAxKCkgewotCQlCdW5kbGUgdGVzdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGVzdCA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuaW5zdGFsbEJ1bmRsZShsb2NhdGlvbik7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIEJTTiIsICJ0ZXN0MSIsIHRlc3QuZ2V0U3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRlc3QudXBkYXRlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIEJTTiIsICJ0ZXN0MSIsIHRlc3QuZ2V0U3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZmFpbHVyZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh0ZXN0ICE9IG51bGwpCi0JCQkJCXRlc3QudW5pbnN0YWxsKCk7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0KLQkJfQotCX0KLQotCS8vIHRlc3QgdXBkYXRlIHdpdGggbnVsbCBzdHJlYW0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTm9TdHJlYW0wMigpIHsKLQkJQnVuZGxlIHRlc3QgPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gaW5zdGFsbGVyLmdldEJ1bmRsZUxvY2F0aW9uKCJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXRlc3QgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmluc3RhbGxCdW5kbGUobG9jYXRpb24pOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBCU04iLCAidGVzdDEiLCB0ZXN0LmdldFN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXN0LnVwZGF0ZShudWxsKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgQlNOIiwgInRlc3QxIiwgdGVzdC5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBmYWlsdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRlc3QgIT0gbnVsbCkKLQkJCQkJdGVzdC51bmluc3RhbGwoKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQl9Ci0JfQotCi0JLy8gdGVzdCB1cGRhdGUgd2l0aCBudWxsIHN0cmVhbQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVXaXRoU3RyZWFtMDEoKSB7Ci0JCUJ1bmRsZSB0ZXN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsb2NhdGlvbjEgPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGxvY2F0aW9uMiA9IGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigidGVzdDIiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGVzdCA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuaW5zdGFsbEJ1bmRsZShsb2NhdGlvbjEpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBCU04iLCAidGVzdDEiLCB0ZXN0LmdldFN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXN0LnVwZGF0ZShuZXcgVVJMKGxvY2F0aW9uMikub3BlblN0cmVhbSgpKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgQlNOIiwgInRlc3QyIiwgdGVzdC5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBmYWlsdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRlc3QgIT0gbnVsbCkKLQkJCQkJdGVzdC51bmluc3RhbGwoKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQl9Ci0JfQotCi0JLy8gdGVzdCB1cGRhdGUgd2l0aCBudWxsIHN0cmVhbQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVXaXRoU3RyZWFtMDIoKSB7Ci0JCUJ1bmRsZSB0ZXN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsb2NhdGlvbjEgPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGxvY2F0aW9uMiA9IGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigidGVzdDIiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGVzdCA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuaW5zdGFsbEJ1bmRsZShsb2NhdGlvbjEpOwotCQkJQnVuZGxlIGIxID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBCU04iLCAidGVzdDEiLCB0ZXN0LmdldFN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXN0LnVwZGF0ZShuZXcgVVJMKGxvY2F0aW9uMikub3BlblN0cmVhbSgpKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgQlNOIiwgInRlc3QyIiwgdGVzdC5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy8gbWFrZSBzdXJlIGIxIGlzIHN0aWxsIGxhc3QgYnVuZGxlIGluIGJ1bmRsZXMgbGlzdAotCQkJQnVuZGxlW10gYnVuZGxlcyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlcygpOwotCQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgYnVuZGxlIGF0IHRoZSBlbmQ6ICIgKyBidW5kbGVzW2J1bmRsZXMubGVuZ3RoIC0gMV0sIGJ1bmRsZXNbYnVuZGxlcy5sZW5ndGggLSAxXSA9PSBiMSk7IC8vJE5PTi1OTFMtMSQKLQkJCUJ1bmRsZVtdIHRlc3RzID0gaW5zdGFsbGVyLmdldFBhY2thZ2VBZG1pbigpLmdldEJ1bmRsZXModGVzdC5nZXRTeW1ib2xpY05hbWUoKSwgbnVsbCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJudWxsIHRlc3RzIiwgdGVzdHMpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciIsIDEsIHRlc3RzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIldyb25nIGJ1bmRsZTogIiArIHRlc3RzWzBdLCB0ZXN0c1swXSA9PSB0ZXN0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBmYWlsdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRlc3QgIT0gbnVsbCkKLQkJCQkJdGVzdC51bmluc3RhbGwoKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI5MDE5MygpIHsKLQkJQnVuZGxlIHRlc3QgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIHRlc3RCdW5kbGUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJ0ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkLmphciIpOwotCQkJRmlsZSB0ZXN0RmlsZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3Qgd2l0aCBzcGFjZS90ZXN0LmphciIpOwotCQkJYXNzZXJ0VHJ1ZSh0ZXN0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCkpOwotCQkJQWRhcHRvclV0aWwucmVhZEZpbGUodGVzdEJ1bmRsZS5vcGVuU3RyZWFtKCksIHRlc3RGaWxlKTsKLQkJCXRlc3QgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmluc3RhbGxCdW5kbGUoInJlZmVyZW5jZToiICsgdGVzdEZpbGUudG9VUkkoKS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZmFpbHVyZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh0ZXN0ICE9IG51bGwpCi0JCQkJCXRlc3QudW5pbnN0YWxsKCk7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL0J1bmRsZUluc3RhbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvQnVuZGxlSW5zdGFsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTY0MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvQnVuZGxlSW5zdGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuUGxhdGZvcm1BZG1pbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UudXJsY29udmVyc2lvbi5VUkxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbC5TdGFydExldmVsOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotcHVibGljIGNsYXNzIEJ1bmRsZUluc3RhbGxlciB7Ci0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcm9vdExvY2F0aW9uOwotCXByaXZhdGUgSGFzaE1hcCBidW5kbGVzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIFNlcnZpY2VUcmFja2VyIHBhY2thZ2VBZG1pbjsKLQlwcml2YXRlIFNlcnZpY2VUcmFja2VyIHN0YXJ0bGV2ZWw7Ci0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBjb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBwbGF0Zm9ybUFkbWluOwotCi0JcHVibGljIEJ1bmRsZUluc3RhbGxlcihTdHJpbmcgYnVuZGxlc1Jvb3QsIEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb24gewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQlyb290TG9jYXRpb24gPSBidW5kbGVzUm9vdDsKLQkJY29udmVydGVyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIGNvbnRleHQuY3JlYXRlRmlsdGVyKCIoJihvYmplY3RDbGFzcz0iICsgVVJMQ29udmVydGVyLmNsYXNzLmdldE5hbWUoKSArICIpKHByb3RvY29sPWJ1bmRsZWVudHJ5KSkiKSwgbnVsbCk7Ci0JCWNvbnZlcnRlci5vcGVuKCk7Ci0JCXN0YXJ0bGV2ZWwgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgU3RhcnRMZXZlbC5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQlzdGFydGxldmVsLm9wZW4oKTsKLQkJcGFja2FnZUFkbWluID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQlwYWNrYWdlQWRtaW4ub3BlbigpOwotCQlwbGF0Zm9ybUFkbWluID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIFBsYXRmb3JtQWRtaW4uY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJcGxhdGZvcm1BZG1pbi5vcGVuKCk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHB1YmxpYyBCdW5kbGUgaW5zdGFsbEJ1bmRsZShTdHJpbmcgbmFtZSkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnN0YWxsQnVuZGxlKG5hbWUsIHRydWUpOwotCX0KLQotCXN5bmNocm9uaXplZCBwdWJsaWMgQnVuZGxlIGluc3RhbGxCdW5kbGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdHJhY2spIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlpZiAoYnVuZGxlcyA9PSBudWxsICYmIHRyYWNrKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IGdldEJ1bmRsZUxvY2F0aW9uKG5hbWUpOwotCQlCdW5kbGUgYnVuZGxlID0gY29udGV4dC5pbnN0YWxsQnVuZGxlKGxvY2F0aW9uKTsKLQkJaWYgKHRyYWNrKQotCQkJYnVuZGxlcy5wdXQobmFtZSwgYnVuZGxlKTsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZUxvY2F0aW9uKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGdldEJ1bmRsZUxvY2F0aW9uMChuYW1lKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU3RyaW5nKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQlyZXR1cm4gZ2V0QnVuZGxlTG9jYXRpb24wKG5hbWUpOwotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChCdW5kbGVFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlTdHJpbmcgZ2V0QnVuZGxlTG9jYXRpb24wKFN0cmluZyBuYW1lKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGJ1bmRsZUZpbGVOYW1lID0gcm9vdExvY2F0aW9uICsgIi8iICsgbmFtZTsKLQkJVVJMIGJ1bmRsZVVSTCA9IGNvbnRleHQuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoYnVuZGxlRmlsZU5hbWUpOwotCQlpZiAoYnVuZGxlVVJMID09IG51bGwpCi0JCQlidW5kbGVVUkwgPSBjb250ZXh0LmdldEJ1bmRsZSgpLmdldEVudHJ5KGJ1bmRsZUZpbGVOYW1lICsgIi5qYXIiKTsKLQkJaWYgKGJ1bmRsZVVSTCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJ1bmRsZUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgYnVuZGxlIHRvIGluc3RhbGwgYXQ6ICIgKyBuYW1lKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZVVSTCA9ICgoVVJMQ29udmVydGVyKSBjb252ZXJ0ZXIuZ2V0U2VydmljZSgpKS5yZXNvbHZlKGJ1bmRsZVVSTCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCdW5kbGVFeGNlcHRpb24oIkNvbnZlcnRlciBlcnJvciIsIGUpOwotCQl9Ci0JCVN0cmluZyBsb2NhdGlvbiA9IGJ1bmRsZVVSTC50b0V4dGVybmFsRm9ybSgpOwotCQlpZiAoImZpbGUiLmVxdWFscyhidW5kbGVVUkwuZ2V0UHJvdG9jb2woKSkpCi0JCQlsb2NhdGlvbiA9ICJyZWZlcmVuY2U6IiArIGxvY2F0aW9uOwotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0Jc3luY2hyb25pemVkIHB1YmxpYyBCdW5kbGUgdXBkYXRlQnVuZGxlKFN0cmluZyBmcm9tTmFtZSwgU3RyaW5nIHRvTmFtZSkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCWlmIChidW5kbGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQnVuZGxlIGZyb21CdW5kbGUgPSAoQnVuZGxlKSBidW5kbGVzLmdldChmcm9tTmFtZSk7Ci0JCWlmIChmcm9tQnVuZGxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQnVuZGxlRXhjZXB0aW9uKCJUaGUgYnVuZGxlIHRvIHVwZGF0ZSBkb2VzIG5vdCBleGlzdCEhICIgKyBmcm9tTmFtZSk7Ci0JCVN0cmluZyBidW5kbGVGaWxlTmFtZSA9IHJvb3RMb2NhdGlvbiArICIvIiArIHRvTmFtZTsKLQkJVVJMIGJ1bmRsZVVSTCA9IGNvbnRleHQuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoYnVuZGxlRmlsZU5hbWUpOwotCQlpZiAoYnVuZGxlVVJMID09IG51bGwpCi0JCQlidW5kbGVVUkwgPSBjb250ZXh0LmdldEJ1bmRsZSgpLmdldEVudHJ5KGJ1bmRsZUZpbGVOYW1lICsgIi5qYXIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZVVSTCA9ICgoVVJMQ29udmVydGVyKSBjb252ZXJ0ZXIuZ2V0U2VydmljZSgpKS5yZXNvbHZlKGJ1bmRsZVVSTCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCdW5kbGVFeGNlcHRpb24oIkNvbnZlcnRlciBlcnJvciIsIGUpOwotCQl9Ci0JCVN0cmluZyBsb2NhdGlvbiA9IGJ1bmRsZVVSTC50b0V4dGVybmFsRm9ybSgpOwotCQlpZiAoImZpbGUiLmVxdWFscyhidW5kbGVVUkwuZ2V0UHJvdG9jb2woKSkpCi0JCQlsb2NhdGlvbiA9ICJyZWZlcmVuY2U6IiArIGxvY2F0aW9uOwotCQl0cnkgewotCQkJZnJvbUJ1bmRsZS51cGRhdGUobmV3IFVSTChsb2NhdGlvbikub3BlblN0cmVhbSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCdW5kbGVFeGNlcHRpb24oIkVycm9ycyB3aGVuIHVwZGF0aW5nIGJ1bmRsZSAiICsgZnJvbUJ1bmRsZSwgZSk7Ci0JCX0KLQkJYnVuZGxlcy5yZW1vdmUoZnJvbU5hbWUpOwotCQlidW5kbGVzLnB1dCh0b05hbWUsIGZyb21CdW5kbGUpOwotCQlyZXR1cm4gZnJvbUJ1bmRsZTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIEJ1bmRsZSB1bmluc3RhbGxCdW5kbGUoU3RyaW5nIG5hbWUpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlpZiAoYnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKSBidW5kbGVzLnJlbW92ZShuYW1lKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWJ1bmRsZS51bmluc3RhbGwoKTsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIEJ1bmRsZVtdIHVuaW5zdGFsbEFsbEJ1bmRsZXMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJaWYgKGJ1bmRsZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChidW5kbGVzLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGJ1bmRsZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSkgaXRlci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCWJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlOyBidW5kbGUgcHJvYmFibHkgYWxyZWFkeSB1bmluc3RhbGxlZAotCQkJfQotCQkJcmVzdWx0LmFkZChidW5kbGUpOwotCQl9Ci0JCWJ1bmRsZXMuY2xlYXIoKTsKLQkJcmV0dXJuIChCdW5kbGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IEJ1bmRsZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHB1YmxpYyBCdW5kbGVbXSBzaHV0ZG93bigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlpZiAoYnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUJ1bmRsZVtdIHJlc3VsdCA9IHVuaW5zdGFsbEFsbEJ1bmRsZXMoKTsKLQkJcmVmcmVzaFBhY2thZ2VzKHJlc3VsdCk7Ci0JCXBhY2thZ2VBZG1pbi5jbG9zZSgpOwotCQlzdGFydGxldmVsLmNsb3NlKCk7Ci0JCWNvbnZlcnRlci5jbG9zZSgpOwotCQlwbGF0Zm9ybUFkbWluLmNsb3NlKCk7Ci0JCWJ1bmRsZXMgPSBudWxsOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN5bmNocm9uaXplZCBwdWJsaWMgQnVuZGxlW10gcmVmcmVzaFBhY2thZ2VzKEJ1bmRsZVtdIHJlZnJlc2gpIHsKLQkJaWYgKGJ1bmRsZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlQYWNrYWdlQWRtaW4gcGEgPSAoUGFja2FnZUFkbWluKSBwYWNrYWdlQWRtaW4uZ2V0U2VydmljZSgpOwotCQlmaW5hbCBib29sZWFuW10gZmxhZyA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkJRnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRnJhbWV3b3JrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gRnJhbWV3b3JrRXZlbnQuUEFDS0FHRVNfUkVGUkVTSEVEKQotCQkJCQlzeW5jaHJvbml6ZWQgKGZsYWcpIHsKLQkJCQkJCWZsYWdbMF0gPSB0cnVlOwotCQkJCQkJZmxhZy5ub3RpZnlBbGwoKTsKLQkJCQkJfQotCQkJfQotCQl9OwotCQljb250ZXh0LmFkZEZyYW1ld29ya0xpc3RlbmVyKGxpc3RlbmVyKTsKLQkJZmluYWwgSGFzaFNldCByZWZyZXNoZWQgPSBuZXcgSGFzaFNldCgpOwotCQlCdW5kbGVMaXN0ZW5lciByZWZyZXNoQnVuZGxlTGlzdGVuZXIgPSBuZXcgU3luY2hyb25vdXNCdW5kbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGJ1bmRsZUNoYW5nZWQoQnVuZGxlRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWZyZXNoZWQuYWRkKGV2ZW50LmdldEJ1bmRsZSgpKTsKLQkJCX0KLQkJfTsKLQkJY29udGV4dC5hZGRCdW5kbGVMaXN0ZW5lcihyZWZyZXNoQnVuZGxlTGlzdGVuZXIpOwotCQl0cnkgewotCQkJcGEucmVmcmVzaFBhY2thZ2VzKHJlZnJlc2gpOwotCQkJc3luY2hyb25pemVkIChmbGFnKSB7Ci0JCQkJd2hpbGUgKCFmbGFnWzBdKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmbGFnLndhaXQoNTAwMCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQucmVtb3ZlRnJhbWV3b3JrTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJY29udGV4dC5yZW1vdmVCdW5kbGVMaXN0ZW5lcihyZWZyZXNoQnVuZGxlTGlzdGVuZXIpOwotCQl9Ci0JCXJldHVybiAoQnVuZGxlW10pIHJlZnJlc2hlZC50b0FycmF5KG5ldyBCdW5kbGVbcmVmcmVzaGVkLnNpemUoKV0pOwotCX0KLQotCXN5bmNocm9uaXplZCBwdWJsaWMgYm9vbGVhbiByZXNvbHZlQnVuZGxlcyhCdW5kbGVbXSByZXNvbHZlKSB7Ci0JCWlmIChidW5kbGVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVBhY2thZ2VBZG1pbiBwYSA9IChQYWNrYWdlQWRtaW4pIHBhY2thZ2VBZG1pbi5nZXRTZXJ2aWNlKCk7Ci0JCXJldHVybiBwYS5yZXNvbHZlQnVuZGxlcyhyZXNvbHZlKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGJ1bmRsZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEJ1bmRsZSkgYnVuZGxlcy5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIFN0YXJ0TGV2ZWwgZ2V0U3RhcnRMZXZlbCgpIHsKLQkJcmV0dXJuIChTdGFydExldmVsKSBzdGFydGxldmVsLmdldFNlcnZpY2UoKTsKLQl9Ci0KLQlwdWJsaWMgUGFja2FnZUFkbWluIGdldFBhY2thZ2VBZG1pbigpIHsKLQkJcmV0dXJuIChQYWNrYWdlQWRtaW4pIHBhY2thZ2VBZG1pbi5nZXRTZXJ2aWNlKCk7Ci0JfQotCi0JcHVibGljIFBsYXRmb3JtQWRtaW4gZ2V0UGxhdGZvcm1BZG1pbigpIHsKLQkJcmV0dXJuIChQbGF0Zm9ybUFkbWluKSBwbGF0Zm9ybUFkbWluLmdldFNlcnZpY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9CdW5kbGVUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvQnVuZGxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiYjcyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9CdW5kbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBCdW5kbGVUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEJ1bmRsZVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQnVuZGxlSW5zdGFsbFVwZGF0ZVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFN5c3RlbUJ1bmRsZVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEJ1bmRsZUV4Y2VwdGlvblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFN1YnN0aXR1dGVFeHBvcnRzQnVuZGxlVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoUGFja2FnZUFkbWluQnVuZGxlVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoUGxhdGZvcm1BZG1pbkJ1bmRsZVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEV4dGVuc2lvbkJ1bmRsZVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KENsYXNzTG9hZGluZ0J1bmRsZVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KE5hdGl2ZUNvZGVCdW5kbGVUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL0NsYXNzTG9hZGluZ0J1bmRsZVRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9DbGFzc0xvYWRpbmdCdW5kbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzkzMDhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL0NsYXNzTG9hZGluZ0J1bmRsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5FeHBvcnRlZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbC5TdGFydExldmVsOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NMb2FkaW5nQnVuZGxlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENsYXNzTG9hZGluZ0J1bmRsZVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSB0ZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXN0LnN0YXJ0KCk7Ci0JCWluc3RhbGxlci5zaHV0ZG93bigpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFs2XTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuSU5TVEFMTEVELCB0ZXN0KTsKLQkJZXhwZWN0ZWRFdmVudHNbMV0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuUkVTT0xWRUQsIHRlc3QpOwotCQlleHBlY3RlZEV2ZW50c1syXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCB0ZXN0KTsKLQkJZXhwZWN0ZWRFdmVudHNbM10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgdGVzdCk7Ci0JCWV4cGVjdGVkRXZlbnRzWzRdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlVOUkVTT0xWRUQsIHRlc3QpOwotCQlleHBlY3RlZEV2ZW50c1s1XSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5VTklOU1RBTExFRCwgdGVzdCk7Ci0KLQkJT2JqZWN0W10gYWN0dWFsRXZlbnRzID0gbGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoZXhwZWN0ZWRFdmVudHMubGVuZ3RoKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvYWRUcmlnZ2VyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGNoYWluVGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuYiIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmMiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5kIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCByZXNvbHZlIGNoYWluVGVzdCIsIGluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2NoYWluVGVzdH0pKTsgLy8kTk9OLU5MUy0xJAotCQljaGFpblRlc3Quc3RhcnQoQnVuZGxlLlNUQVJUX0FDVElWQVRJT05fUE9MSUNZKTsKLQkJY2hhaW5UZXN0QS5zdGFydChCdW5kbGUuU1RBUlRfQUNUSVZBVElPTl9QT0xJQ1kpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIiwgQnVuZGxlLlNUQVJUSU5HLCBjaGFpblRlc3QuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hhaW5UZXN0LmxvYWRDbGFzcygib3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUiLCBCdW5kbGUuU1RBUlRJTkcsIGNoYWluVGVzdC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIiwgQnVuZGxlLlNUQVJUSU5HLCBjaGFpblRlc3RBLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWNoYWluVGVzdC5sb2FkQ2xhc3MoImNoYWluLnRlc3QuYS5BQ2hhaW4iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIiwgQnVuZGxlLlNUQVJUSU5HLCBjaGFpblRlc3QuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSIsIEJ1bmRsZS5BQ1RJVkUsIGNoYWluVGVzdEEuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhaW5EZXBlZGVuY2llcygpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgY2hhaW5UZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgY2hhaW5UZXN0QSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgY2hhaW5UZXN0QiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmIiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5jIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuZCIpOyAvLyROT04tTkxTLTEkCi0JCSgoSVRlc3RSdW5uZXIpIGNoYWluVGVzdC5sb2FkQ2xhc3MoImNoYWluLnRlc3QuVGVzdFNpbmdsZUNoYWluIikubmV3SW5zdGFuY2UoKSkudGVzdEl0KCk7IC8vJE5PTi1OTFMtMSQKLQotCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbNl07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNoYWluVGVzdEIpOwotCQlleHBlY3RlZEV2ZW50c1sxXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjaGFpblRlc3RBKTsKLQkJZXhwZWN0ZWRFdmVudHNbMl0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgY2hhaW5UZXN0QSk7Ci0JCWV4cGVjdGVkRXZlbnRzWzNdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNoYWluVGVzdEIpOwotCQlleHBlY3RlZEV2ZW50c1s0XSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjaGFpblRlc3RCKTsKLQkJZXhwZWN0ZWRFdmVudHNbNV0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY2hhaW5UZXN0QSk7Ci0KLQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhuZXcgQnVuZGxlW10ge2NoYWluVGVzdEJ9KTsKLQotCQkoKElUZXN0UnVubmVyKSBjaGFpblRlc3QubG9hZENsYXNzKCJjaGFpbi50ZXN0LlRlc3RTaW5nbGVDaGFpbiIpLm5ld0luc3RhbmNlKCkpLnRlc3RJdCgpOyAvLyROT04tTkxTLTEkCi0KLQkJT2JqZWN0W10gYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDYpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlDaGFpbkRlcGVkZW5jaWVzMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGNoYWluVGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEMgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5jIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5kIik7IC8vJE5PTi1OTFMtMSQKLQkJY2hhaW5UZXN0LmxvYWRDbGFzcygiY2hhaW4udGVzdC5UZXN0TXVsdGlDaGFpbiIpLm5ld0luc3RhbmNlKCk7IC8vJE5PTi1OTFMtMSQKLQotCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMTJdOwotCQlleHBlY3RlZEV2ZW50c1swXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjaGFpblRlc3REKTsKLQkJZXhwZWN0ZWRFdmVudHNbMV0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY2hhaW5UZXN0Qik7Ci0JCWV4cGVjdGVkRXZlbnRzWzJdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNoYWluVGVzdEMpOwotCQlleHBlY3RlZEV2ZW50c1szXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjaGFpblRlc3RBKTsKLQkJZXhwZWN0ZWRFdmVudHNbNF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgY2hhaW5UZXN0QSk7Ci0JCWV4cGVjdGVkRXZlbnRzWzVdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGNoYWluVGVzdEIpOwotCQlleHBlY3RlZEV2ZW50c1s2XSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjaGFpblRlc3RDKTsKLQkJZXhwZWN0ZWRFdmVudHNbN10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgY2hhaW5UZXN0RCk7Ci0JCWV4cGVjdGVkRXZlbnRzWzhdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNoYWluVGVzdEQpOwotCQlleHBlY3RlZEV2ZW50c1s5XSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjaGFpblRlc3RDKTsKLQkJZXhwZWN0ZWRFdmVudHNbMTBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNoYWluVGVzdEIpOwotCQlleHBlY3RlZEV2ZW50c1sxMV0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY2hhaW5UZXN0QSk7Ci0KLQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhuZXcgQnVuZGxlW10ge2NoYWluVGVzdEMsIGNoYWluVGVzdER9KTsKLQotCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoOCk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aUNoYWluRGVwZWRlbmNpZXMwMigpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgY2hhaW5UZXN0QSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgY2hhaW5UZXN0QiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgY2hhaW5UZXN0QyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmMiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgY2hhaW5UZXN0RCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmQiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMCk7Ci0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2NoYWluVGVzdEEsIGNoYWluVGVzdEIsIGNoYWluVGVzdEMsIGNoYWluVGVzdER9KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbOF07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3REKTsKLQkJZXhwZWN0ZWRFdmVudHNbMV0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuUkVTT0xWRUQsIGNoYWluVGVzdEMpOwotCQlleHBlY3RlZEV2ZW50c1syXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgY2hhaW5UZXN0Qik7Ci0JCWV4cGVjdGVkRXZlbnRzWzNdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3RBKTsKLQkJZXhwZWN0ZWRFdmVudHNbNF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBjaGFpblRlc3REKTsKLQkJZXhwZWN0ZWRFdmVudHNbNV0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBjaGFpblRlc3RDKTsKLQkJZXhwZWN0ZWRFdmVudHNbNl0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBjaGFpblRlc3RCKTsKLQkJZXhwZWN0ZWRFdmVudHNbN10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBjaGFpblRlc3RBKTsKLQotCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzeW5jTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoOCk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCWluc3RhbGxlci5yZWZyZXNoUGFja2FnZXMobmV3IEJ1bmRsZVtdIHtjaGFpblRlc3RDLCBjaGFpblRlc3REfSk7Ci0KLQkJZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzIwXTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBJTkcsIGNoYWluVGVzdEEpOwotCQlleHBlY3RlZEV2ZW50c1sxXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjaGFpblRlc3RBKTsKLQkJZXhwZWN0ZWRFdmVudHNbMl0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBJTkcsIGNoYWluVGVzdEIpOwotCQlleHBlY3RlZEV2ZW50c1szXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjaGFpblRlc3RCKTsKLQkJZXhwZWN0ZWRFdmVudHNbNF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBJTkcsIGNoYWluVGVzdEMpOwotCQlleHBlY3RlZEV2ZW50c1s1XSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjaGFpblRlc3RDKTsKLQkJZXhwZWN0ZWRFdmVudHNbNl0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBJTkcsIGNoYWluVGVzdEQpOwotCQlleHBlY3RlZEV2ZW50c1s3XSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBjaGFpblRlc3REKTsKLQkJZXhwZWN0ZWRFdmVudHNbOF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuVU5SRVNPTFZFRCwgY2hhaW5UZXN0QSk7Ci0JCWV4cGVjdGVkRXZlbnRzWzldID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlVOUkVTT0xWRUQsIGNoYWluVGVzdEIpOwotCQlleHBlY3RlZEV2ZW50c1sxMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuVU5SRVNPTFZFRCwgY2hhaW5UZXN0Qyk7Ci0JCWV4cGVjdGVkRXZlbnRzWzExXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5VTlJFU09MVkVELCBjaGFpblRlc3REKTsKLQkJZXhwZWN0ZWRFdmVudHNbMTJdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3REKTsKLQkJZXhwZWN0ZWRFdmVudHNbMTNdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3RDKTsKLQkJZXhwZWN0ZWRFdmVudHNbMTRdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3RCKTsKLQkJZXhwZWN0ZWRFdmVudHNbMTVdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3RBKTsKLQkJZXhwZWN0ZWRFdmVudHNbMTZdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LkxBWllfQUNUSVZBVElPTiwgY2hhaW5UZXN0RCk7Ci0JCWV4cGVjdGVkRXZlbnRzWzE3XSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5MQVpZX0FDVElWQVRJT04sIGNoYWluVGVzdEMpOwotCQlleHBlY3RlZEV2ZW50c1sxOF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBjaGFpblRlc3RCKTsKLQkJZXhwZWN0ZWRFdmVudHNbMTldID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LkxBWllfQUNUSVZBVElPTiwgY2hhaW5UZXN0QSk7Ci0KLQkJYWN0dWFsRXZlbnRzID0gc3luY0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEyKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzMwMDY5Ml8wMSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgY2hhaW5UZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgY2hhaW5UZXN0QSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgY2hhaW5UZXN0QiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgY2hhaW5UZXN0QyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmMiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgY2hhaW5UZXN0RCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmQiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMCk7Ci0KLQkJU3RhcnRMZXZlbCBzbCA9IGluc3RhbGxlci5nZXRTdGFydExldmVsKCk7Ci0JCWludCBjdXJyZW50U0wgPSBzbC5nZXRTdGFydExldmVsKCk7Ci0JCWludCB0ZXN0U0wgPSBjdXJyZW50U0wgKyAxOwotCQlzbC5zZXRCdW5kbGVTdGFydExldmVsKGNoYWluVGVzdCwgdGVzdFNMKTsKLQkJc2wuc2V0QnVuZGxlU3RhcnRMZXZlbChjaGFpblRlc3RBLCB0ZXN0U0wpOwotCQlzbC5zZXRCdW5kbGVTdGFydExldmVsKGNoYWluVGVzdEIsIHRlc3RTTCk7Ci0JCXNsLnNldEJ1bmRsZVN0YXJ0TGV2ZWwoY2hhaW5UZXN0QywgdGVzdFNMKTsKLQkJc2wuc2V0QnVuZGxlU3RhcnRMZXZlbChjaGFpblRlc3RELCB0ZXN0U0wpOwotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtjaGFpblRlc3QsIGNoYWluVGVzdEEsIGNoYWluVGVzdEIsIGNoYWluVGVzdEMsIGNoYWluVGVzdER9KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbNV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3REKTsKLQkJZXhwZWN0ZWRFdmVudHNbMV0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuUkVTT0xWRUQsIGNoYWluVGVzdEMpOwotCQlleHBlY3RlZEV2ZW50c1syXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgY2hhaW5UZXN0Qik7Ci0JCWV4cGVjdGVkRXZlbnRzWzNdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3RBKTsKLQkJZXhwZWN0ZWRFdmVudHNbNF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuUkVTT0xWRUQsIGNoYWluVGVzdCk7Ci0KLQkJT2JqZWN0W10gYWN0dWFsRXZlbnRzID0gc3luY0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDUpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgidGVzdC5idWczMDA2OTIiLCAidHJ1ZSIpOwotCQkJY2hhaW5UZXN0LnN0YXJ0KCk7Ci0JCQlzbC5zZXRTdGFydExldmVsKHRlc3RTTCk7Ci0JCQlPYmplY3RbXSBleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJCU9iamVjdFtdIGFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0KLQkJCWV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxNF07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LkxBWllfQUNUSVZBVElPTiwgY2hhaW5UZXN0QSk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LkxBWllfQUNUSVZBVElPTiwgY2hhaW5UZXN0Qik7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LkxBWllfQUNUSVZBVElPTiwgY2hhaW5UZXN0Qyk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LkxBWllfQUNUSVZBVElPTiwgY2hhaW5UZXN0RCk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJUSU5HLCBjaGFpblRlc3QpOwotCQkJZXhwZWN0ZWRFdmVudHNbaSsrXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVElORywgY2hhaW5UZXN0Qik7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNoYWluVGVzdEIpOwotCQkJZXhwZWN0ZWRFdmVudHNbaSsrXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVElORywgY2hhaW5UZXN0Qyk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNoYWluVGVzdEMpOwotCQkJZXhwZWN0ZWRFdmVudHNbaSsrXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVElORywgY2hhaW5UZXN0QSk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNoYWluVGVzdEEpOwotCQkJZXhwZWN0ZWRFdmVudHNbaSsrXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVElORywgY2hhaW5UZXN0RCk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNoYWluVGVzdEQpOwotCQkJZXhwZWN0ZWRFdmVudHNbaSsrXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBjaGFpblRlc3QpOwotCi0JCQlhY3R1YWxGcmFtZXdvcmtFdmVudHMgPSBzeW5jTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMTQpOwotCQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZSgidGVzdC5idWczMDA2OTIiKTsKLQkJCXNsLnNldFN0YXJ0TGV2ZWwoY3VycmVudFNMKTsKLQkJCU9iamVjdFtdIGV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzWzBdID0gbmV3IEZyYW1ld29ya0V2ZW50KEZyYW1ld29ya0V2ZW50LlNUQVJUTEVWRUxfQ0hBTkdFRCwgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoMCksIG51bGwpOwotCQkJT2JqZWN0W10gYWN0dWFsRnJhbWV3b3JrRXZlbnRzID0gZnJhbWV3b3JrTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEZyYW1ld29ya0V2ZW50cywgYWN0dWFsRnJhbWV3b3JrRXZlbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWczMDA2OTJfMDIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGNoYWluVGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEMgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5jIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5kIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDApOwotCi0JCVN0YXJ0TGV2ZWwgc2wgPSBpbnN0YWxsZXIuZ2V0U3RhcnRMZXZlbCgpOwotCQlpbnQgY3VycmVudFNMID0gc2wuZ2V0U3RhcnRMZXZlbCgpOwotCQlpbnQgdGVzdFNMID0gY3VycmVudFNMICsgMTsKLQkJc2wuc2V0QnVuZGxlU3RhcnRMZXZlbChjaGFpblRlc3QsIHRlc3RTTCk7Ci0JCXNsLnNldEJ1bmRsZVN0YXJ0TGV2ZWwoY2hhaW5UZXN0QSwgdGVzdFNMKTsKLQkJc2wuc2V0QnVuZGxlU3RhcnRMZXZlbChjaGFpblRlc3RCLCB0ZXN0U0wpOwotCQlzbC5zZXRCdW5kbGVTdGFydExldmVsKGNoYWluVGVzdEMsIHRlc3RTTCk7Ci0JCXNsLnNldEJ1bmRsZVN0YXJ0TGV2ZWwoY2hhaW5UZXN0RCwgdGVzdFNMKTsKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7Y2hhaW5UZXN0LCBjaGFpblRlc3RBLCBjaGFpblRlc3RCLCBjaGFpblRlc3RDLCBjaGFpblRlc3REfSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzVdOwotCQlleHBlY3RlZEV2ZW50c1swXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgY2hhaW5UZXN0RCk7Ci0JCWV4cGVjdGVkRXZlbnRzWzFdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3RDKTsKLQkJZXhwZWN0ZWRFdmVudHNbMl0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuUkVTT0xWRUQsIGNoYWluVGVzdEIpOwotCQlleHBlY3RlZEV2ZW50c1szXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgY2hhaW5UZXN0QSk7Ci0JCWV4cGVjdGVkRXZlbnRzWzRdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlJFU09MVkVELCBjaGFpblRlc3QpOwotCi0JCU9iamVjdFtdIGFjdHVhbEV2ZW50cyA9IHN5bmNMaXN0ZW5lclJlc3VsdHMuZ2V0UmVzdWx0cyg1KTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoInRlc3QuYnVnMzAwNjkyIiwgInRydWUiKTsKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgidGVzdC5idWczMDA2OTIubGlzdGVuZXIiLCAidHJ1ZSIpOwotCQkJY2hhaW5UZXN0LnN0YXJ0KCk7Ci0JCQlzbC5zZXRTdGFydExldmVsKHRlc3RTTCk7Ci0JCQlPYmplY3RbXSBleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJCU9iamVjdFtdIGFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0KLQkJCWV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxNF07Ci0JCQlpbnQgaSA9IDA7Ci0KLQkJCWV4cGVjdGVkRXZlbnRzW2krK10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBjaGFpblRlc3RBKTsKLQkJCWV4cGVjdGVkRXZlbnRzW2krK10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBjaGFpblRlc3RCKTsKLQkJCWV4cGVjdGVkRXZlbnRzW2krK10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBjaGFpblRlc3RDKTsKLQkJCWV4cGVjdGVkRXZlbnRzW2krK10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBjaGFpblRlc3REKTsKLQkJCWV4cGVjdGVkRXZlbnRzW2krK10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRJTkcsIGNoYWluVGVzdCk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJUSU5HLCBjaGFpblRlc3RCKTsKLQkJCWV4cGVjdGVkRXZlbnRzW2krK10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY2hhaW5UZXN0Qik7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJUSU5HLCBjaGFpblRlc3RDKTsKLQkJCWV4cGVjdGVkRXZlbnRzW2krK10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY2hhaW5UZXN0Qyk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJUSU5HLCBjaGFpblRlc3RBKTsKLQkJCWV4cGVjdGVkRXZlbnRzW2krK10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY2hhaW5UZXN0QSk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJUSU5HLCBjaGFpblRlc3REKTsKLQkJCWV4cGVjdGVkRXZlbnRzW2krK10gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgY2hhaW5UZXN0RCk7Ci0JCQlleHBlY3RlZEV2ZW50c1tpKytdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNoYWluVGVzdCk7Ci0KLQkJCWFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IHN5bmNMaXN0ZW5lclJlc3VsdHMuZ2V0UmVzdWx0cygxNCk7Ci0JCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRnJhbWV3b3JrRXZlbnRzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKCJ0ZXN0LmJ1ZzMwMDY5MiIpOwotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoInRlc3QuYnVnMzAwNjkyLmxpc3RlbmVyIik7Ci0JCQlzbC5zZXRTdGFydExldmVsKGN1cnJlbnRTTCk7Ci0JCQlPYmplY3RbXSBleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJCU9iamVjdFtdIGFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NDaXJjdWxhcml0eUVycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBjaXJjdWxhcml0eVRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2lyY3VsYXJpdHkudGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBjaXJjdWxhcml0eVRlc3RBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNpcmN1bGFyaXR5LnRlc3QuYSIpOyAvLyROT04tTkxTLTEkCi0JCWNpcmN1bGFyaXR5VGVzdC5sb2FkQ2xhc3MoImNpcmN1bGFyaXR5LnRlc3QuVGVzdENpcmN1bGFyaXR5Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMl07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNpcmN1bGFyaXR5VGVzdCk7Ci0JCWV4cGVjdGVkRXZlbnRzWzFdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGNpcmN1bGFyaXR5VGVzdEEpOwotCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMik7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGcmFnbWVudFBhY2thZ2VBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGhvc3RBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmcmFnQSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJmcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJIb3N0L0ZyYWcgcmVzb2x2ZSIsIGluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2hvc3RBLCBmcmFnQX0pKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlUZXN0UnVubmVyIHRlc3RSdW5uZXIgPSAoSVRlc3RSdW5uZXIpIGhvc3RBLmxvYWRDbGFzcygiZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLmludGVybmFsLnRlc3QuVGVzdFBhY2thZ2VBY2Nlc3MiKS5uZXdJbnN0YW5jZSgpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQl0ZXN0UnVubmVyLnRlc3RJdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHBhY2thZ2UgYWNjZXNzIHRlc3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGcmFnbWVudE11bHRpSG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgaG9zdEExID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBob3N0QTIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLnYyIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGZyYWdBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImZyYWdtZW50LnRlc3QuYXR0YWNoLmZyYWcuYSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkhvc3QvRnJhZyByZXNvbHZlIiwgaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7aG9zdEExLCBob3N0QTIsIGZyYWdBfSkpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgaG9zdHMiLCAyLCBpbnN0YWxsZXIuZ2V0UGFja2FnZUFkbWluKCkuZ2V0SG9zdHMoZnJhZ0EpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJcnVuVGVzdFJ1bm5lcihob3N0QTEsICJmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEuaW50ZXJuYWwudGVzdC5UZXN0UGFja2FnZUFjY2VzcyIpOyAvLyROT04tTkxTLTEkCi0JCXJ1blRlc3RSdW5uZXIoaG9zdEEyLCAiZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hLmludGVybmFsLnRlc3QuVGVzdFBhY2thZ2VBY2Nlc3MyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcnVuVGVzdFJ1bm5lcihCdW5kbGUgaG9zdCwgU3RyaW5nIGNsYXNzbmFtZSkgewotCQl0cnkgewotCQkJSVRlc3RSdW5uZXIgdGVzdFJ1bm5lciA9IChJVGVzdFJ1bm5lcikgaG9zdC5sb2FkQ2xhc3MoY2xhc3NuYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJdGVzdFJ1bm5lci50ZXN0SXQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCBwYWNrYWdlIGFjY2VzcyB0ZXN0IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50RXhwb3J0UGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgaG9zdEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiZnJhZ21lbnQudGVzdC5hdHRhY2guaG9zdC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiSG9zdCByZXNvbHZlIiwgaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7aG9zdEF9KSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBtYWtlIHN1cmUgY2xhc3MgbG9hZGVyIGZvciBob3N0QSBpcyBpbml0aWFsaXplZAotCQlob3N0QS5sb2FkQ2xhc3MoImZyYWdtZW50LnRlc3QuYXR0YWNoLmhvc3QuYS5pbnRlcm5hbC50ZXN0LlBhY2thZ2VBY2Nlc3NUZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgZnJhZ0IgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiZnJhZ21lbnQudGVzdC5hdHRhY2guZnJhZy5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGhvc3RBUmVxdWlyZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJmcmFnbWVudC50ZXN0LmF0dGFjaC5ob3N0LmEucmVxdWlyZSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlJlcXVpcmVBL0ZyYWciLCBpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtob3N0QVJlcXVpcmUsIGZyYWdCfSkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlob3N0QVJlcXVpcmUubG9hZENsYXNzKCJmcmFnbWVudC50ZXN0LmF0dGFjaC5mcmFnLmIuVGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBjbGFzcyBsb2FkaW5nIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGVnYWN5TGF6eVN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBsZWdhY3kgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgibGVnYWN5LmxhenlzdGFydCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBsZWdhY3lBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImxlZ2FjeS5sYXp5c3RhcnQuYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBsZWdhY3lCID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImxlZ2FjeS5sYXp5c3RhcnQuYiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBsZWdhY3lDID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImxlZ2FjeS5sYXp5c3RhcnQuYyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImxlZ2FjeSBsYXp5IHN0YXJ0IHJlc29sdmUiLCBpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtsZWdhY3ksIGxlZ2FjeUEsIGxlZ2FjeUIsIGxlZ2FjeUN9KSk7IC8vJE5PTi1OTFMtMSQKLQotCQkoKElUZXN0UnVubmVyKSBsZWdhY3kubG9hZENsYXNzKCJsZWdhY3kubGF6eXN0YXJ0LlNpbXBsZUxlZ2FjeSIpLm5ld0luc3RhbmNlKCkpLnRlc3RJdCgpOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgbGVnYWN5QSk7Ci0JCU9iamVjdFtdIGFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0KLQkJKChJVGVzdFJ1bm5lcikgbGVnYWN5LmxvYWRDbGFzcygibGVnYWN5LmxhenlzdGFydC5UcnVlRXhjZXB0aW9uTGVnYWN5MSIpLm5ld0luc3RhbmNlKCkpLnRlc3RJdCgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImV4Y2VwdGlvbnMgbm8gZXZlbnQiLCBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMCkubGVuZ3RoID09IDApOyAvLyROT04tTkxTLTEkCi0JCSgoSVRlc3RSdW5uZXIpIGxlZ2FjeS5sb2FkQ2xhc3MoImxlZ2FjeS5sYXp5c3RhcnQuVHJ1ZUV4Y2VwdGlvbkxlZ2FjeTIiKS5uZXdJbnN0YW5jZSgpKS50ZXN0SXQoKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGxlZ2FjeUIpOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCSgoSVRlc3RSdW5uZXIpIGxlZ2FjeS5sb2FkQ2xhc3MoImxlZ2FjeS5sYXp5c3RhcnQuRmFsc2VFeGNlcHRpb25MZWdhY3kxIikubmV3SW5zdGFuY2UoKSkudGVzdEl0KCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiZXhjZXB0aW9ucyBubyBldmVudCIsIHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygwKS5sZW5ndGggPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJKChJVGVzdFJ1bm5lcikgbGVnYWN5LmxvYWRDbGFzcygibGVnYWN5LmxhenlzdGFydC5GYWxzZUV4Y2VwdGlvbkxlZ2FjeTIiKS5uZXdJbnN0YW5jZSgpKS50ZXN0SXQoKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGxlZ2FjeUMpOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMZWdhY3lMb2FkQWN0aXZhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyB0ZXN0IHRoYXQgY2FsbGluZyBsb2FkQ2xhc3MgZnJvbSBhIG5vbi1sYXp5IHN0YXJ0IGJ1bmRsZSBkb2VzIG5vdCBhY3RpdmF0ZSB0aGUgYnVuZGxlCi0JCUJ1bmRsZSB0ZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJdGVzdC5sb2FkQ2xhc3MoImRvZXMubm90LmV4aXN0LlRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJT2JqZWN0W10gZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMCk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCS8vIHRlc3QgdGhhdCBjYWxsaW5nIGxvYWRDbGFzcyBmcm9tIGEgbGF6eSBzdGFydCBidW5kbGUgYWN0aXZhdGVzIGEgYnVuZGxlCi0JCUJ1bmRsZSBsZWdhY3lBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImxlZ2FjeS5sYXp5c3RhcnQuYSIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlsZWdhY3lBLmxvYWRDbGFzcygiZG9lcy5ub3QuZXhpc3QuVGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGxlZ2FjeUEpOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPU0dpTGF6eVN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBvc2dpID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoIm9zZ2kubGF6eXN0YXJ0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIG9zZ2lBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoIm9zZ2kubGF6eXN0YXJ0LmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgb3NnaUIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgib3NnaS5sYXp5c3RhcnQuYiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBvc2dpQyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJvc2dpLmxhenlzdGFydC5jIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgib3NnaSBsYXp5IHN0YXJ0IHJlc29sdmUiLCBpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtvc2dpLCBvc2dpQSwgb3NnaUIsIG9zZ2lDfSkpOyAvLyROT04tTkxTLTEkCi0KLQkJKChJVGVzdFJ1bm5lcikgb3NnaS5sb2FkQ2xhc3MoIm9zZ2kubGF6eXN0YXJ0LkxhenlTaW1wbGUiKS5uZXdJbnN0YW5jZSgpKS50ZXN0SXQoKTsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIG9zZ2lBKTsKLQkJT2JqZWN0W10gYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQotCQkoKElUZXN0UnVubmVyKSBvc2dpLmxvYWRDbGFzcygib3NnaS5sYXp5c3RhcnQuTGF6eUV4Y2x1ZGUxIikubmV3SW5zdGFuY2UoKSkudGVzdEl0KCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiZXhjZXB0aW9ucyBubyBldmVudCIsIHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygwKS5sZW5ndGggPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJKChJVGVzdFJ1bm5lcikgb3NnaS5sb2FkQ2xhc3MoIm9zZ2kubGF6eXN0YXJ0LkxhenlFeGNsdWRlMiIpLm5ld0luc3RhbmNlKCkpLnRlc3RJdCgpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgb3NnaUIpOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCSgoSVRlc3RSdW5uZXIpIG9zZ2kubG9hZENsYXNzKCJvc2dpLmxhenlzdGFydC5MYXp5SW5jbHVkZTEiKS5uZXdJbnN0YW5jZSgpKS50ZXN0SXQoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJleGNlcHRpb25zIG5vIGV2ZW50Iiwgc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDApLmxlbmd0aCA9PSAwKTsgLy8kTk9OLU5MUy0xJAotCQkoKElUZXN0UnVubmVyKSBvc2dpLmxvYWRDbGFzcygib3NnaS5sYXp5c3RhcnQuTGF6eUluY2x1ZGUyIikubmV3SW5zdGFuY2UoKSkudGVzdEl0KCk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQlleHBlY3RlZEV2ZW50c1swXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBvc2dpQyk7Ci0JCWFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YXJ0VHJhbnNpZW50QnlMb2FkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gaW5zdGFsbCBhIGJ1bmRsZSBhbmQgc2V0IGl0cyBzdGFydC1sZXZlbCBoaWdoLCB0aGVuIGNyYW5rIHVwIHRoZSBmcmFtZXdvcmsgc3RhcnQtbGV2ZWwuICBUaGlzIHNob3VsZCByZXN1bHQgaW4gbm8gZXZlbnRzCi0JCUJ1bmRsZSBvc2dpQSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJvc2dpLmxhenlzdGFydC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7b3NnaUF9KTsKLQkJU3RhcnRMZXZlbCBzdGFydExldmVsID0gaW5zdGFsbGVyLmdldFN0YXJ0TGV2ZWwoKTsKLQkJc3RhcnRMZXZlbC5zZXRCdW5kbGVTdGFydExldmVsKG9zZ2lBLCBzdGFydExldmVsLmdldFN0YXJ0TGV2ZWwoKSArIDEwKTsKLQotCQkvLyB0ZXN0IHRyYW5zaWVudCBzdGFydCBieSBsb2FkQ2xhc3MKLQkJc3RhcnRMZXZlbC5zZXRTdGFydExldmVsKHN0YXJ0TGV2ZWwuZ2V0U3RhcnRMZXZlbCgpICsgMTUpOwotCQlPYmplY3RbXSBleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzWzBdID0gbmV3IEZyYW1ld29ya0V2ZW50KEZyYW1ld29ya0V2ZW50LlNUQVJUTEVWRUxfQ0hBTkdFRCwgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoMCksIG51bGwpOwotCQlPYmplY3RbXSBhY3R1YWxGcmFtZXdvcmtFdmVudHMgPSBmcmFtZXdvcmtMaXN0ZW5lclJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0KLQkJc3RhcnRMZXZlbC5zZXRTdGFydExldmVsKHN0YXJ0TGV2ZWwuZ2V0U3RhcnRMZXZlbCgpIC0gMTUpOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzWzBdID0gbmV3IEZyYW1ld29ya0V2ZW50KEZyYW1ld29ya0V2ZW50LlNUQVJUTEVWRUxfQ0hBTkdFRCwgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoMCksIG51bGwpOwotCQlhY3R1YWxGcmFtZXdvcmtFdmVudHMgPSBmcmFtZXdvcmtMaXN0ZW5lclJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMCk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCS8vIG5vdyBsb2FkIGEgY2xhc3MgZnJvbSBpdCBiZWZvcmUgdGhlIHN0YXJ0LWxldmVsIGlzIG1ldC4gIFRoaXMgc2hvdWxkIHJlc3VsdCBpbiBubyBldmVudHMKLQkJb3NnaUEubG9hZENsYXNzKCJvc2dpLmxhenlzdGFydC5hLkFUZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzBdOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMCk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCXN0YXJ0TGV2ZWwuc2V0U3RhcnRMZXZlbChzdGFydExldmVsLmdldFN0YXJ0TGV2ZWwoKSArIDE1KTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJYWN0dWFsRnJhbWV3b3JrRXZlbnRzID0gZnJhbWV3b3JrTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzLCBhY3R1YWxGcmFtZXdvcmtFdmVudHMpOwotCi0JCWV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgb3NnaUEpOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCXN0YXJ0TGV2ZWwuc2V0U3RhcnRMZXZlbChzdGFydExldmVsLmdldFN0YXJ0TGV2ZWwoKSAtIDE1KTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJYWN0dWFsRnJhbWV3b3JrRXZlbnRzID0gZnJhbWV3b3JrTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzLCBhY3R1YWxGcmFtZXdvcmtFdmVudHMpOwotCi0JCWV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgb3NnaUEpOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCS8vIG5vdyBsb2FkIGEgY2xhc3Mgd2hpbGUgc3RhcnQtbGV2ZWwgaXMgbWV0LgotCQlzdGFydExldmVsLnNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbC5nZXRTdGFydExldmVsKCkgKyAxNSk7Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHNbMF0gPSBuZXcgRnJhbWV3b3JrRXZlbnQoRnJhbWV3b3JrRXZlbnQuU1RBUlRMRVZFTF9DSEFOR0VELCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgwKSwgbnVsbCk7Ci0JCWFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEZyYW1ld29ya0V2ZW50cywgYWN0dWFsRnJhbWV3b3JrRXZlbnRzKTsKLQotCQlvc2dpQS5sb2FkQ2xhc3MoIm9zZ2kubGF6eXN0YXJ0LmEuQVRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIG9zZ2lBKTsKLQkJYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQotCQlzdGFydExldmVsLnNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbC5nZXRTdGFydExldmVsKCkgLSAxNSk7Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHNbMF0gPSBuZXcgRnJhbWV3b3JrRXZlbnQoRnJhbWV3b3JrRXZlbnQuU1RBUlRMRVZFTF9DSEFOR0VELCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgwKSwgbnVsbCk7Ci0JCWFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEZyYW1ld29ya0V2ZW50cywgYWN0dWFsRnJhbWV3b3JrRXZlbnRzKTsKLQotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIG9zZ2lBKTsKLQkJYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnRUcmFuc2llbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gaW5zdGFsbCBhIGJ1bmRsZSBhbmQgc2V0IGl0cyBzdGFydC1sZXZlbCBoaWdoLCB0aGVuIGNyYW5rIHVwIHRoZSBmcmFtZXdvcmsgc3RhcnQtbGV2ZWwuICBUaGlzIHNob3VsZCByZXN1bHQgaW4gbm8gZXZlbnRzCi0JCUJ1bmRsZSBvc2dpQSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJvc2dpLmxhenlzdGFydC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7b3NnaUF9KTsKLQkJU3RhcnRMZXZlbCBzdGFydExldmVsID0gaW5zdGFsbGVyLmdldFN0YXJ0TGV2ZWwoKTsKLQkJc3RhcnRMZXZlbC5zZXRCdW5kbGVTdGFydExldmVsKG9zZ2lBLCBzdGFydExldmVsLmdldFN0YXJ0TGV2ZWwoKSArIDEwKTsKLQotCQkvLyB0ZXN0IHRyYW5zaWVudCBzdGFydCBCdW5kbGUuc3RhcnQoU1RBUlRfVFJBTlNJRU5UKQotCQlzdGFydExldmVsLnNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbC5nZXRTdGFydExldmVsKCkgKyAxNSk7Ci0JCU9iamVjdFtdIGV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHNbMF0gPSBuZXcgRnJhbWV3b3JrRXZlbnQoRnJhbWV3b3JrRXZlbnQuU1RBUlRMRVZFTF9DSEFOR0VELCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgwKSwgbnVsbCk7Ci0JCU9iamVjdFtdIGFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEZyYW1ld29ya0V2ZW50cywgYWN0dWFsRnJhbWV3b3JrRXZlbnRzKTsKLQotCQlzdGFydExldmVsLnNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbC5nZXRTdGFydExldmVsKCkgLSAxNSk7Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHNbMF0gPSBuZXcgRnJhbWV3b3JrRXZlbnQoRnJhbWV3b3JrRXZlbnQuU1RBUlRMRVZFTF9DSEFOR0VELCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgwKSwgbnVsbCk7Ci0JCWFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEZyYW1ld29ya0V2ZW50cywgYWN0dWFsRnJhbWV3b3JrRXZlbnRzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMF07Ci0JCU9iamVjdFtdIGFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygwKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0KLQkJLy8gbm93IGNhbGwgc3RhcnQoU1RBUlRfVFJBTlNJRU5UKSBiZWZvcmUgdGhlIHN0YXJ0LWxldmVsIGlzIG1ldC4gIFRoaXMgc2hvdWxkIHJlc3VsdCBpbiBubyBldmVudHMKLQkJdHJ5IHsKLQkJCW9zZ2lBLnN0YXJ0KEJ1bmRsZS5TVEFSVF9UUkFOU0lFTlQpOwotCQkJYXNzZXJ0RmFsc2UoIkJ1bmRsZSBpcyBzdGFydGVkISEiLCBvc2dpQS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGludmFsaWQgb3BlcmF0aW9uIiwgQnVuZGxlRXhjZXB0aW9uLklOVkFMSURfT1BFUkFUSU9OLCBlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMF07Ci0JCWFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygwKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0KLQkJc3RhcnRMZXZlbC5zZXRTdGFydExldmVsKHN0YXJ0TGV2ZWwuZ2V0U3RhcnRMZXZlbCgpICsgMTUpOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzWzBdID0gbmV3IEZyYW1ld29ya0V2ZW50KEZyYW1ld29ya0V2ZW50LlNUQVJUTEVWRUxfQ0hBTkdFRCwgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoMCksIG51bGwpOwotCQlhY3R1YWxGcmFtZXdvcmtFdmVudHMgPSBmcmFtZXdvcmtMaXN0ZW5lclJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0KLQkJc3RhcnRMZXZlbC5zZXRTdGFydExldmVsKHN0YXJ0TGV2ZWwuZ2V0U3RhcnRMZXZlbCgpIC0gMTUpOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzWzBdID0gbmV3IEZyYW1ld29ya0V2ZW50KEZyYW1ld29ya0V2ZW50LlNUQVJUTEVWRUxfQ0hBTkdFRCwgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoMCksIG51bGwpOwotCQlhY3R1YWxGcmFtZXdvcmtFdmVudHMgPSBmcmFtZXdvcmtMaXN0ZW5lclJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0KLQkJZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzBdOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMCk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCS8vIG5vdyBjYWxsIHN0YXJ0KFNUQVJUX1RSQU5TSUVOVCkgd2hpbGUgc3RhcnQtbGV2ZWwgaXMgbWV0LgotCQlzdGFydExldmVsLnNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbC5nZXRTdGFydExldmVsKCkgKyAxNSk7Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHNbMF0gPSBuZXcgRnJhbWV3b3JrRXZlbnQoRnJhbWV3b3JrRXZlbnQuU1RBUlRMRVZFTF9DSEFOR0VELCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgwKSwgbnVsbCk7Ci0JCWFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEZyYW1ld29ya0V2ZW50cywgYWN0dWFsRnJhbWV3b3JrRXZlbnRzKTsKLQotCQlvc2dpQS5zdGFydChCdW5kbGUuU1RBUlRfVFJBTlNJRU5UKTsKLQotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIG9zZ2lBKTsKLQkJYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQotCQlzdGFydExldmVsLnNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbC5nZXRTdGFydExldmVsKCkgLSAxNSk7Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHNbMF0gPSBuZXcgRnJhbWV3b3JrRXZlbnQoRnJhbWV3b3JrRXZlbnQuU1RBUlRMRVZFTF9DSEFOR0VELCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgwKSwgbnVsbCk7Ci0JCWFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEZyYW1ld29ya0V2ZW50cywgYWN0dWFsRnJhbWV3b3JrRXZlbnRzKTsKLQotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIG9zZ2lBKTsKLQkJYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnRSZXNvbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGluc3RhbGwgYSBidW5kbGUgYW5kIHNldCBpdHMgc3RhcnQtbGV2ZWwgaGlnaCwgdGhlbiBjcmFuayB1cCB0aGUgZnJhbWV3b3JrIHN0YXJ0LWxldmVsLiAgVGhpcyBzaG91bGQgcmVzdWx0IGluIG5vIGV2ZW50cwotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RhcnRMZXZlbCBzdGFydExldmVsID0gaW5zdGFsbGVyLmdldFN0YXJ0TGV2ZWwoKTsKLQkJc3RhcnRMZXZlbC5zZXRCdW5kbGVTdGFydExldmVsKHRlc3QsIHN0YXJ0TGV2ZWwuZ2V0U3RhcnRMZXZlbCgpICsgMTApOwotCQl0cnkgewotCQkJdGVzdC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUiLCBCdW5kbGUuSU5TVEFMTEVELCB0ZXN0LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCXN0YXJ0TGV2ZWwuc2V0U3RhcnRMZXZlbChzdGFydExldmVsLmdldFN0YXJ0TGV2ZWwoKSArIDE1KTsKLQkJT2JqZWN0W10gZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJT2JqZWN0W10gYWN0dWFsRnJhbWV3b3JrRXZlbnRzID0gZnJhbWV3b3JrTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzLCBhY3R1YWxGcmFtZXdvcmtFdmVudHMpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIiwgQnVuZGxlLkFDVElWRSwgdGVzdC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdG9wVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBvc2dpQSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJvc2dpLmxhenlzdGFydC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7b3NnaUF9KTsKLQkJU3RhcnRMZXZlbCBzdGFydExldmVsID0gaW5zdGFsbGVyLmdldFN0YXJ0TGV2ZWwoKTsKLQkJc3RhcnRMZXZlbC5zZXRCdW5kbGVTdGFydExldmVsKG9zZ2lBLCBzdGFydExldmVsLmdldFN0YXJ0TGV2ZWwoKSArIDEwKTsKLQkJLy8gcGVyc2lzdGVudGx5IHN0YXJ0IHRoZSBidW5kbGUKLQkJb3NnaUEuc3RhcnQoKTsKLQotCQkvLyB0ZXN0IHRoYXQgdGhlIGJ1bmRsZSBpcyBzdGFydGVkIHdoZW4gc3RhcnQtbGV2ZWwgaXMgbWV0Ci0JCXN0YXJ0TGV2ZWwuc2V0U3RhcnRMZXZlbChzdGFydExldmVsLmdldFN0YXJ0TGV2ZWwoKSArIDE1KTsKLQkJT2JqZWN0W10gZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJT2JqZWN0W10gYWN0dWFsRnJhbWV3b3JrRXZlbnRzID0gZnJhbWV3b3JrTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzLCBhY3R1YWxGcmFtZXdvcmtFdmVudHMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgb3NnaUEpOwotCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCXN0YXJ0TGV2ZWwuc2V0U3RhcnRMZXZlbChzdGFydExldmVsLmdldFN0YXJ0TGV2ZWwoKSAtIDE1KTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJYWN0dWFsRnJhbWV3b3JrRXZlbnRzID0gZnJhbWV3b3JrTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzLCBhY3R1YWxGcmFtZXdvcmtFdmVudHMpOwotCi0JCWV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgb3NnaUEpOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCS8vIG5vdyBjYWxsIHN0b3AoU1RPUF9UUkFOU0lFTlQpIHdoaWxlIHRoZSBzdGFydC1sZXZlbCBpcyBtZXQuCi0JCXN0YXJ0TGV2ZWwuc2V0U3RhcnRMZXZlbChzdGFydExldmVsLmdldFN0YXJ0TGV2ZWwoKSArIDE1KTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJYWN0dWFsRnJhbWV3b3JrRXZlbnRzID0gZnJhbWV3b3JrTGlzdGVuZXJSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzLCBhY3R1YWxGcmFtZXdvcmtFdmVudHMpOwotCi0JCWV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgb3NnaUEpOwotCQlhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCW9zZ2lBLnN0b3AoQnVuZGxlLlNUT1BfVFJBTlNJRU5UKTsKLQotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIG9zZ2lBKTsKLQkJYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQotCQlzdGFydExldmVsLnNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbC5nZXRTdGFydExldmVsKCkgLSAxNSk7Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHNbMF0gPSBuZXcgRnJhbWV3b3JrRXZlbnQoRnJhbWV3b3JrRXZlbnQuU1RBUlRMRVZFTF9DSEFOR0VELCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgwKSwgbnVsbCk7Ci0JCWFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEZyYW1ld29ya0V2ZW50cywgYWN0dWFsRnJhbWV3b3JrRXZlbnRzKTsKLQotCQkvLyBub3cgbWFrZSBzdXJlIHRoZSBidW5kbGUgc3RpbGwgcmVzdGFydHMgd2hlbiBzdGFydC1sZXZlbCBpcyBtZXQKLQkJc3RhcnRMZXZlbC5zZXRTdGFydExldmVsKHN0YXJ0TGV2ZWwuZ2V0U3RhcnRMZXZlbCgpICsgMTUpOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzWzBdID0gbmV3IEZyYW1ld29ya0V2ZW50KEZyYW1ld29ya0V2ZW50LlNUQVJUTEVWRUxfQ0hBTkdFRCwgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoMCksIG51bGwpOwotCQlhY3R1YWxGcmFtZXdvcmtFdmVudHMgPSBmcmFtZXdvcmtMaXN0ZW5lclJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0KLQkJZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQlleHBlY3RlZEV2ZW50c1swXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBvc2dpQSk7Ci0JCWFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0KLQkJc3RhcnRMZXZlbC5zZXRTdGFydExldmVsKHN0YXJ0TGV2ZWwuZ2V0U3RhcnRMZXZlbCgpIC0gMTUpOwotCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzWzBdID0gbmV3IEZyYW1ld29ya0V2ZW50KEZyYW1ld29ya0V2ZW50LlNUQVJUTEVWRUxfQ0hBTkdFRCwgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoMCksIG51bGwpOwotCQlhY3R1YWxGcmFtZXdvcmtFdmVudHMgPSBmcmFtZXdvcmtMaXN0ZW5lclJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0KLQkJZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQlleHBlY3RlZEV2ZW50c1swXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBvc2dpQSk7Ci0JCWFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI1ODY1OV8wMSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBpbnN0YWxsIGEgYnVuZGxlCi0JCUJ1bmRsZSBvc2dpQSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJvc2dpLmxhenlzdGFydC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJU3luY2hyb25vdXNCdW5kbGVMaXN0ZW5lciB0ZXN0TG9hZENsYXNzTGlzdGVuZXIgPSBuZXcgU3luY2hyb25vdXNCdW5kbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGJ1bmRsZUNoYW5nZWQoQnVuZGxlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IEJ1bmRsZUV2ZW50LkxBWllfQUNUSVZBVElPTikKLQkJCQkJdHJ5IHsKLQkJCQkJCWV2ZW50LmdldEJ1bmRsZSgpLmxvYWRDbGFzcygib3NnaS5sYXp5c3RhcnQuYS5BVGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJc2ltcGxlUmVzdWx0cy5hZGRFdmVudChlKTsKLQkJCQkJfQotCQkJfQotCi0JCX07Ci0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuYWRkQnVuZGxlTGlzdGVuZXIodGVzdExvYWRDbGFzc0xpc3RlbmVyKTsKLQkJdHJ5IHsKLQkJCW9zZ2lBLnN0YXJ0KEJ1bmRsZS5TVEFSVF9BQ1RJVkFUSU9OX1BPTElDWSk7Ci0JCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCQlleHBlY3RlZEV2ZW50c1swXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBvc2dpQSk7Ci0JCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVtb3ZlQnVuZGxlTGlzdGVuZXIodGVzdExvYWRDbGFzc0xpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyNTg2NTlfMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gaW5zdGFsbCBhIGJ1bmRsZQotCQlCdW5kbGUgb3NnaUEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgib3NnaS5sYXp5c3RhcnQuYSIpOyAvLyROT04tTkxTLTEkCi0JCW9zZ2lBLnN0YXJ0KEJ1bmRsZS5TVEFSVF9BQ1RJVkFUSU9OX1BPTElDWSk7Ci0JCVN5bmNocm9ub3VzQnVuZGxlTGlzdGVuZXIgdGVzdExvYWRDbGFzc0xpc3RlbmVyID0gbmV3IFN5bmNocm9ub3VzQnVuZGxlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBidW5kbGVDaGFuZ2VkKEJ1bmRsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBCdW5kbGVFdmVudC5MQVpZX0FDVElWQVRJT04pCi0JCQkJCXRyeSB7Ci0JCQkJCQlldmVudC5nZXRCdW5kbGUoKS5sb2FkQ2xhc3MoIm9zZ2kubGF6eXN0YXJ0LmEuQVRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXNpbXBsZVJlc3VsdHMuYWRkRXZlbnQoZSk7Ci0JCQkJCX0KLQkJCX0KLQotCQl9OwotCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmFkZEJ1bmRsZUxpc3RlbmVyKHRlc3RMb2FkQ2xhc3NMaXN0ZW5lcik7Ci0JCXRyeSB7Ci0JCQlpbnN0YWxsZXIucmVmcmVzaFBhY2thZ2VzKG5ldyBCdW5kbGVbXSB7b3NnaUF9KTsKLQkJCU9iamVjdFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFsxXTsKLQkJCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIG9zZ2lBKTsKLQkJCU9iamVjdFtdIGFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCQl9IGZpbmFsbHkgewotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZW1vdmVCdW5kbGVMaXN0ZW5lcih0ZXN0TG9hZENsYXNzTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI1ODY1OV8wMygpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBpbnN0YWxsIGEgYnVuZGxlCi0JCUJ1bmRsZSB0ZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlTeW5jaHJvbm91c0J1bmRsZUxpc3RlbmVyIHRlc3RMb2FkQ2xhc3NMaXN0ZW5lciA9IG5ldyBTeW5jaHJvbm91c0J1bmRsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgYnVuZGxlQ2hhbmdlZChCdW5kbGVFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gQnVuZGxlRXZlbnQuU1RBUlRFRCkKLQkJCQkJdHJ5IHsKLQkJCQkJCWV2ZW50LmdldEJ1bmRsZSgpLnN0b3AoKTsKLQkJCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXNpbXBsZVJlc3VsdHMuYWRkRXZlbnQoZSk7Ci0JCQkJCX0KLQkJCX0KLQotCQl9OwotCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmFkZEJ1bmRsZUxpc3RlbmVyKHRlc3RMb2FkQ2xhc3NMaXN0ZW5lcik7Ci0JCXRyeSB7Ci0JCQl0ZXN0LnN0YXJ0KCk7Ci0JCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMl07Ci0JCQlleHBlY3RlZEV2ZW50c1swXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCB0ZXN0KTsKLQkJCWV4cGVjdGVkRXZlbnRzWzFdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIHRlc3QpOwotCQkJT2JqZWN0W10gYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDIpOwotCQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlbW92ZUJ1bmRsZUxpc3RlbmVyKHRlc3RMb2FkQ2xhc3NMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjU4NjU5XzA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGluc3RhbGwgYSBidW5kbGUKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCXRlc3Quc3RhcnQoKTsKLQkJU3luY2hyb25vdXNCdW5kbGVMaXN0ZW5lciB0ZXN0TG9hZENsYXNzTGlzdGVuZXIgPSBuZXcgU3luY2hyb25vdXNCdW5kbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGJ1bmRsZUNoYW5nZWQoQnVuZGxlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IEJ1bmRsZUV2ZW50LlNUQVJURUQpCi0JCQkJCXRyeSB7Ci0JCQkJCQlldmVudC5nZXRCdW5kbGUoKS5zdG9wKCk7Ci0JCQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlzaW1wbGVSZXN1bHRzLmFkZEV2ZW50KGUpOwotCQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJLy8gY2xlYXIgdGhlIHJlc3VsdHMgZnJvbSB0aGUgaW5pdGlhbCBzdGFydAotCQlzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMCk7Ci0JCS8vIGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBmcm9tIHJlZnJlc2hpbmcKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5hZGRCdW5kbGVMaXN0ZW5lcih0ZXN0TG9hZENsYXNzTGlzdGVuZXIpOwotCQl0cnkgewotCQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhuZXcgQnVuZGxlW10ge3Rlc3R9KTsKLQkJCU9iamVjdFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFszXTsKLQkJCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIHRlc3QpOwotCQkJZXhwZWN0ZWRFdmVudHNbMV0gPSBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgdGVzdCk7Ci0JCQlleHBlY3RlZEV2ZW50c1syXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCB0ZXN0KTsKLQkJCU9iamVjdFtdIGFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygzKTsKLQkJCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCQl9IGZpbmFsbHkgewotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZW1vdmVCdW5kbGVMaXN0ZW5lcih0ZXN0TG9hZENsYXNzTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzIxMzc5MSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBpbnN0YWxsIGEgYnVuZGxlIGFuZCBjYWxsIHN0YXJ0KFNUQVJUX0FDVElWQVRJT05fUE9MSUNZKSB0d2ljZQotCQlCdW5kbGUgb3NnaUEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgib3NnaS5sYXp5c3RhcnQuYSIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge29zZ2lBfSk7Ci0JCWlmIChvc2dpQS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5TVEFSVElORykKLQkJCW9zZ2lBLnN0b3AoKTsKLQkJb3NnaUEuc3RhcnQoQnVuZGxlLlNUQVJUX0FDVElWQVRJT05fUE9MSUNZKTsKLQkJT2JqZWN0W10gZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMCk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCi0JCW9zZ2lBLnN0YXJ0KEJ1bmRsZS5TVEFSVF9BQ1RJVkFUSU9OX1BPTElDWSk7Ci0JCWV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFswXTsKLQkJYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDApOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQotCQlvc2dpQS5sb2FkQ2xhc3MoIm9zZ2kubGF6eXN0YXJ0LmEuQVRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIG9zZ2lBKTsKLQkJYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWRMb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSB0aHJlYWRMb2NrVGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0aHJlYWQubG9ja3Rlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl0aHJlYWRMb2NrVGVzdC5sb2FkQ2xhc3MoInRocmVhZC5sb2NrdGVzdC5BVGVzdCIpOyAvLyROT04tTkxTLTEkCi0KLQkJT2JqZWN0W10gZXhwZWN0ZWRFdmVudHMgPSBuZXcgT2JqZWN0WzJdOwotCQlleHBlY3RlZEV2ZW50c1swXSA9IG5ldyBMb25nKDUwMDApOwotCQlleHBlY3RlZEV2ZW50c1sxXSA9IG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCB0aHJlYWRMb2NrVGVzdCk7Ci0JCU9iamVjdFtdIGFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygyKTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VVJMc0J1ZzE2NDA3NygpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7dGVzdH0pOwotCQlVUkxbXSB1cmxzID0gbmV3IFVSTFsyXTsKLQkJdXJsc1swXSA9IHRlc3QuZ2V0UmVzb3VyY2UoImEvYi9jL2QiKTsgLy8kTk9OLU5MUy0xJAotCQl1cmxzWzFdID0gdGVzdC5nZXRFbnRyeSgiYS9iL2MvZCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoInJlc291cmNlIiwgdXJsc1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZW50cnkiLCB1cmxzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCVVSTCB0ZXN0VVJMID0gbmV3IFVSTCh1cmxzW2ldLCAiZyIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoImciLCAiL2EvYi9jL2ciLCB0ZXN0VVJMLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGVzdFVSTCA9IG5ldyBVUkwodXJsc1tpXSwgIi4vZyIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIi4vZyIsICIvYS9iL2MvZyIsIHRlc3RVUkwuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXN0VVJMID0gbmV3IFVSTCh1cmxzW2ldLCAiZy8iKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJnLyIsICIvYS9iL2MvZy8iLCB0ZXN0VVJMLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGVzdFVSTCA9IG5ldyBVUkwodXJsc1tpXSwgIi9nIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiL2ciLCAiL2ciLCB0ZXN0VVJMLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGVzdFVSTCA9IG5ldyBVUkwodXJsc1tpXSwgIj95Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiP3kiLCAiL2EvYi9jLz95IiwgdGVzdFVSTC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRlc3RVUkwgPSBuZXcgVVJMKHVybHNbaV0sICJnP3kiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJnP3kiLCAiL2EvYi9jL2c/eSIsIHRlc3RVUkwuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXN0VVJMID0gbmV3IFVSTCh1cmxzW2ldLCAiZyNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiZyNzIiwgIi9hL2IvYy9nI3MiLCB0ZXN0VVJMLmdldFBhdGgoKSArICIjcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdGVzdFVSTCA9IG5ldyBVUkwodXJsc1tpXSwgImc/eSNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiZz95I3MiLCAiL2EvYi9jL2c/eSNzIiwgdGVzdFVSTC5nZXRQYXRoKCkgKyAiI3MiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXRlc3RVUkwgPSBuZXcgVVJMKHVybHNbaV0sICI7eCIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIjt4IiwgIi9hL2IvYy87eCIsIHRlc3RVUkwuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXN0VVJMID0gbmV3IFVSTCh1cmxzW2ldLCAiZzt4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiZzt4IiwgIi9hL2IvYy9nO3giLCB0ZXN0VVJMLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGVzdFVSTCA9IG5ldyBVUkwodXJsc1tpXSwgImc7eD95I3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJnO3g/eSNzIiwgIi9hL2IvYy9nO3g/eSNzIiwgdGVzdFVSTC5nZXRQYXRoKCkgKyAiI3MiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXRlc3RVUkwgPSBuZXcgVVJMKHVybHNbaV0sICIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiLiIsICIvYS9iL2MvIiwgdGVzdFVSTC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRlc3RVUkwgPSBuZXcgVVJMKHVybHNbaV0sICIuLyIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIi4vIiwgIi9hL2IvYy8iLCB0ZXN0VVJMLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGVzdFVSTCA9IG5ldyBVUkwodXJsc1tpXSwgIi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiLi4iLCAiL2EvYi8iLCB0ZXN0VVJMLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGVzdFVSTCA9IG5ldyBVUkwodXJsc1tpXSwgIi4uLyIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIi4uLyIsICIvYS9iLyIsIHRlc3RVUkwuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXN0VVJMID0gbmV3IFVSTCh1cmxzW2ldLCAiLi4vZyIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIi4uL2ciLCAiL2EvYi9nIiwgdGVzdFVSTC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRlc3RVUkwgPSBuZXcgVVJMKHVybHNbaV0sICIuLi8uLiIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIi4uLy4uIiwgIi9hLyIsIHRlc3RVUkwuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXN0VVJMID0gbmV3IFVSTCh1cmxzW2ldLCAiLi4vLi4vIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiLi4vLi4vIiwgIi9hLyIsIHRlc3RVUkwuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXN0VVJMID0gbmV3IFVSTCh1cmxzW2ldLCAiLi4vLi4vZyIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIi4uLy4uL2ciLCAiL2EvZyIsIHRlc3RVUkwuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cnlVUkxFcXVhbHNIYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7dGVzdH0pOwotCQlVUkwgdGVzdEVudHJ5MSA9IHRlc3QuZ2V0RW50cnkoImEvYi9jL2QiKTsgLy8kTk9OLU5MUy0xJAotCQlVUkwgdGVzdEVudHJ5MiA9IHRlc3QuZ2V0RW50cnkoImEvYi9jL2QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoInVybCBlcXVhbHMgMS4wIiwgdGVzdEVudHJ5MSwgdGVzdEVudHJ5Mik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSBlcXVhbHMgMS4xIiwgdGVzdEVudHJ5MS5oYXNoQ29kZSgpLCB0ZXN0RW50cnkyLmhhc2hDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJVVJMIHRlc3RFbnRyeTMgPSBuZXcgVVJMKHRlc3RFbnRyeTEsICIuL2QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoInVybCBlcXVhbHMgMi4wIiwgdGVzdEVudHJ5MSwgdGVzdEVudHJ5Myk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSBlcXVhbHMgMi4xIiwgdGVzdEVudHJ5MS5oYXNoQ29kZSgpLCB0ZXN0RW50cnkzLmhhc2hDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJVVJMIHRlc3RFbnRyeTQgPSBuZXcgVVJMKHRlc3RFbnRyeTMudG9TdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygidXJsIGVxdWFscyAzLjAiLCB0ZXN0RW50cnk0LCB0ZXN0RW50cnkzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImhhc2hjb2RlIGVxdWFscyAzLjEiLCB0ZXN0RW50cnk0Lmhhc2hDb2RlKCksIHRlc3RFbnRyeTMuaGFzaENvZGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VVUkxFcXVhbHNIYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7dGVzdH0pOwotCQlVUkwgdGVzdFJlc291cmNlMSA9IHRlc3QuZ2V0UmVzb3VyY2UoImEvYi9jL2QiKTsgLy8kTk9OLU5MUy0xJAotCQlVUkwgdGVzdFJlc291cmNlMiA9IHRlc3QuZ2V0UmVzb3VyY2UoImEvYi9jL2QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoInVybCBlcXVhbHMgMS4wIiwgdGVzdFJlc291cmNlMSwgdGVzdFJlc291cmNlMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSBlcXVhbHMgMS4xIiwgdGVzdFJlc291cmNlMS5oYXNoQ29kZSgpLCB0ZXN0UmVzb3VyY2UyLmhhc2hDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJVVJMIHRlc3RSZXNvdXJjZTMgPSBuZXcgVVJMKHRlc3RSZXNvdXJjZTEsICIuL2QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoInVybCBlcXVhbHMgMi4wIiwgdGVzdFJlc291cmNlMSwgdGVzdFJlc291cmNlMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSBlcXVhbHMgMi4xIiwgdGVzdFJlc291cmNlMS5oYXNoQ29kZSgpLCB0ZXN0UmVzb3VyY2UzLmhhc2hDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJVVJMIHRlc3RSZXNvdXJjZTQgPSBuZXcgVVJMKHRlc3RSZXNvdXJjZTMudG9TdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygidXJsIGVxdWFscyAzLjAiLCB0ZXN0UmVzb3VyY2U0LCB0ZXN0UmVzb3VyY2UzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImhhc2hjb2RlIGVxdWFscyAzLjEiLCB0ZXN0UmVzb3VyY2U0Lmhhc2hDb2RlKCksIHRlc3RSZXNvdXJjZTMuaGFzaENvZGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW50cnlEaXIwMSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7dGVzdH0pOwotCQlVUkwgYURpciA9IHRlc3QuZ2V0RW50cnkoImEiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJhRGlyIiwgYURpcik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShhRGlyLnRvRXh0ZXJuYWxGb3JtKCksIGFEaXIuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0JCVVSTCBiRGlyID0gdGVzdC5nZXRFbnRyeSgiYS9iIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYkRpciIsIGJEaXIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoYkRpci50b0V4dGVybmFsRm9ybSgpLCBiRGlyLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFEaXIgPSB0ZXN0LmdldEVudHJ5KCJhLyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImFEaXIiLCBhRGlyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFEaXIudG9FeHRlcm5hbEZvcm0oKSwgYURpci5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYkRpciA9IHRlc3QuZ2V0RW50cnkoImEvYi8iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJiRGlyIiwgYkRpcik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShiRGlyLnRvRXh0ZXJuYWxGb3JtKCksIGJEaXIuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0KLQkJVVJMIGRSZXNvdXJjZSA9IHRlc3QuZ2V0RW50cnkoImEvYi9jL2QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJkUmVzb3VyY2UiLCBkUmVzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKGRSZXNvdXJjZS50b0V4dGVybmFsRm9ybSgpLCBkUmVzb3VyY2UuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZFJlc291cmNlID0gdGVzdC5nZXRFbnRyeSgiYS9iL2MvZC8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZFJlc291cmNlICE9IG51bGwpIC8vIG5vdGUgdGhhdCBGaWxlIGJ1bmRsZXMgd2lsbCByZXR1cm4gbm9uLW51bGwgd2hpbGMgamFyJ2VkIGJ1bmRsZXMgd2lsbCByZXR1cm4gbnVsbAotCQkJYXNzZXJ0RmFsc2UoZFJlc291cmNlLnRvRXh0ZXJuYWxGb3JtKCksIGRSZXNvdXJjZS5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZURpcjAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSB0ZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHt0ZXN0fSk7Ci0JCVVSTCBhRGlyID0gdGVzdC5nZXRSZXNvdXJjZSgiYSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImFEaXIiLCBhRGlyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFEaXIudG9FeHRlcm5hbEZvcm0oKSwgYURpci5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJVVJMIGJEaXIgPSB0ZXN0LmdldFJlc291cmNlKCJhL2IiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJiRGlyIiwgYkRpcik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShiRGlyLnRvRXh0ZXJuYWxGb3JtKCksIGJEaXIuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0KLQkJYURpciA9IHRlc3QuZ2V0UmVzb3VyY2UoImEvIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYURpciIsIGFEaXIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoYURpci50b0V4dGVybmFsRm9ybSgpLCBhRGlyLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCQliRGlyID0gdGVzdC5nZXRSZXNvdXJjZSgiYS9iLyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImJEaXIiLCBiRGlyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGJEaXIudG9FeHRlcm5hbEZvcm0oKSwgYkRpci5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlVUkwgZFJlc291cmNlID0gdGVzdC5nZXRSZXNvdXJjZSgiYS9iL2MvZCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRSZXNvdXJjZSIsIGRSZXNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoZFJlc291cmNlLnRvRXh0ZXJuYWxGb3JtKCksIGRSZXNvdXJjZS5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlkUmVzb3VyY2UgPSB0ZXN0LmdldFJlc291cmNlKCJhL2IvYy9kLyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkUmVzb3VyY2UgIT0gbnVsbCkgLy8gbm90ZSB0aGF0IEZpbGUgYnVuZGxlcyB3aWxsIHJldHVybiBub24tbnVsbCB3aGlsYyBqYXInZWQgYnVuZGxlcyB3aWxsIHJldHVybiBudWxsCi0JCQlhc3NlcnRGYWxzZShkUmVzb3VyY2UudG9FeHRlcm5hbEZvcm0oKSwgZFJlc291cmNlLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvb3RHZXRSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShDb25zdGFudHMuRlJBTUVXT1JLX0JPT1RERUxFR0FUSU9OKSAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBjYW5ub3QgcmVhbGx5IHRlc3QgdGhpcyBpZiB0aGlzIHByb3BlcnR5IGlzIHNldAotCQkvLyBtYWtlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUgbWFuaWZlc3QgZm91bmQKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCUVudW1lcmF0aW9uIG1hbmlmZXN0cyA9IHRlc3QuZ2V0UmVzb3VyY2VzKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIm1hbmlmZXN0cyIsIG1hbmlmZXN0cyk7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlMaXN0IG1hbmlmZXN0VVJMcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKG1hbmlmZXN0cy5oYXNNb3JlRWxlbWVudHMoKSkKLQkJCW1hbmlmZXN0VVJMcy5hZGQobWFuaWZlc3RzLm5leHRFbGVtZW50KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbmlmZXN0IG51bWJlciIsIDEsIG1hbmlmZXN0VVJMcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVVSTCBtYW5pZmVzdCA9IChVUkwpIG1hbmlmZXN0VVJMcy5nZXQoMCk7Ci0JCWludCBkb3RJbmRleCA9IG1hbmlmZXN0LmdldEhvc3QoKS5pbmRleE9mKCcuJyk7Ci0JCWxvbmcgYnVuZGxlSWQgPSBkb3RJbmRleCA+PSAwICYmIGRvdEluZGV4IDwgbWFuaWZlc3QuZ2V0SG9zdCgpLmxlbmd0aCgpIC0gMSA/IExvbmcucGFyc2VMb25nKG1hbmlmZXN0LmdldEhvc3QoKS5zdWJzdHJpbmcoMCwgZG90SW5kZXgpKSA6IExvbmcucGFyc2VMb25nKG1hbmlmZXN0LmdldEhvc3QoKSk7Ci0JCWFzc2VydEVxdWFscygiaG9zdCBpZCIsIHRlc3QuZ2V0QnVuZGxlSWQoKSwgYnVuZGxlSWQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlR2V0UmVzb3VyY2VzMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRlc3QgdGhhdCB3ZSBjYW4gZ2V0IG11bHRpcGxlIHJlc291cmNlcyBmcm9tIGEgYnVuZGxlCi0JCUVudW1lcmF0aW9uIHJlc291cmNlcyA9IHRlc3QuZ2V0UmVzb3VyY2VzKCJkYXRhL3Jlc291cmNlMSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoInJlc291cmNlcyIsIHJlc291cmNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlMaXN0IHJlc291cmNlVVJMcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkKLQkJCXJlc291cmNlVVJMcy5hZGQocmVzb3VyY2VzLm5leHRFbGVtZW50KCkpOwotCQlhc3NlcnRFcXVhbHMoInJlc291cmNlIG51bWJlciIsIDIsIHJlc291cmNlVVJMcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygicm9vdCByZXNvdXJjZSIsICJyb290IGNsYXNzcGF0aCIsIHJlYWRVUkwoKFVSTCkgcmVzb3VyY2VVUkxzLmdldCgwKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJzdHVmZiByZXNvdXJjZSIsICJzdHVmZiBjbGFzc3BhdGgiLCByZWFkVVJMKChVUkwpIHJlc291cmNlVVJMcy5nZXQoMSkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlR2V0UmVzb3VyY2VzMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgdGVzdDIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdDIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyB0ZXN0IHRoYXQgd2UgY2FuIGdldCBtdWx0aXBsZSByZXNvdXJjZXMgZnJvbSBhIGJ1bmRsZQotCQlFbnVtZXJhdGlvbiByZXNvdXJjZXMgPSB0ZXN0Mi5nZXRSZXNvdXJjZXMoImRhdGEvcmVzb3VyY2UxIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgicmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheUxpc3QgcmVzb3VyY2VVUkxzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAocmVzb3VyY2VzLmhhc01vcmVFbGVtZW50cygpKQotCQkJcmVzb3VyY2VVUkxzLmFkZChyZXNvdXJjZXMubmV4dEVsZW1lbnQoKSk7Ci0JCWFzc2VydEVxdWFscygicmVzb3VyY2UgbnVtYmVyIiwgNCwgcmVzb3VyY2VVUkxzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJyb290IHJlc291cmNlIiwgInJvb3QgY2xhc3NwYXRoIiwgcmVhZFVSTCgoVVJMKSByZXNvdXJjZVVSTHMuZ2V0KDApKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoInN0dWZmIHJlc291cmNlIiwgInN0dWZmIGNsYXNzcGF0aCIsIHJlYWRVUkwoKFVSTCkgcmVzb3VyY2VVUkxzLmdldCgxKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJyb290IHJlc291cmNlIiwgInJvb3QgY2xhc3NwYXRoIHRlc3QyIiwgcmVhZFVSTCgoVVJMKSByZXNvdXJjZVVSTHMuZ2V0KDIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoInN0dWZmIHJlc291cmNlIiwgInN0dWZmIGNsYXNzcGF0aCB0ZXN0MiIsIHJlYWRVUkwoKFVSTCkgcmVzb3VyY2VVUkxzLmdldCgzKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVHZXRSZXNvdXJjZXMwMygpIHRocm93cyBFeGNlcHRpb24gewotCQlpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSB0ZXN0MiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0MiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRlc3QgdGhhdCB3ZSBjYW4gZ2V0IG11bHRpcGxlIHJlc291cmNlcyBmcm9tIGEgYnVuZGxlCi0JCS8vIHRlc3QgdGhhdCB1c2luZyBhIGNvbnRleHQgZ2l2ZXMgY29ycmVjdCByZXN1bHRzIGZvciBtdWx0aXBsZSByZXNvdXJjZXMgKGJ1ZyAyNjE4NTMpCi0JCUVudW1lcmF0aW9uIHJlc291cmNlcyA9IHRlc3QyLmdldFJlc291cmNlcygiZGF0YS8iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJyZXNvdXJjZXMiLCByZXNvdXJjZXMpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5TGlzdCByZXNvdXJjZVVSTHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChyZXNvdXJjZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQlyZXNvdXJjZVVSTHMuYWRkKHJlc291cmNlcy5uZXh0RWxlbWVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJyZXNvdXJjZSBudW1iZXIiLCA0LCByZXNvdXJjZVVSTHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoInJvb3QgcmVzb3VyY2UiLCAicm9vdCBjbGFzc3BhdGgiLCByZWFkVVJMKG5ldyBVUkwoKFVSTCkgcmVzb3VyY2VVUkxzLmdldCgwKSwgInJlc291cmNlMSIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWFzc2VydEVxdWFscygic3R1ZmYgcmVzb3VyY2UiLCAic3R1ZmYgY2xhc3NwYXRoIiwgcmVhZFVSTChuZXcgVVJMKChVUkwpIHJlc291cmNlVVJMcy5nZXQoMSksICJyZXNvdXJjZTEiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlhc3NlcnRFcXVhbHMoInJvb3QgcmVzb3VyY2UiLCAicm9vdCBjbGFzc3BhdGggdGVzdDIiLCByZWFkVVJMKG5ldyBVUkwoKFVSTCkgcmVzb3VyY2VVUkxzLmdldCgyKSwgInJlc291cmNlMSIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWFzc2VydEVxdWFscygic3R1ZmYgcmVzb3VyY2UiLCAic3R1ZmYgY2xhc3NwYXRoIHRlc3QyIiwgcmVhZFVSTChuZXcgVVJMKChVUkwpIHJlc291cmNlVVJMcy5nZXQoMyksICJyZXNvdXJjZTEiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVUkxFeHRlcm5hbEZvcm1hdDAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSB0ZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyB0ZXN0IHRoZSBleHRlcm5hbCBmb3JtYXQgb2YgYnVuZGxlIGVudHJ5IFVSTHMKLQkJVVJMIGVudHJ5ID0gdGVzdC5nZXRFbnRyeSgiZGF0YS9yZXNvdXJjZTEiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJlbnRyeSIsIGVudHJ5KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoInJvb3QgcmVzb3VyY2UiLCAicm9vdCBjbGFzc3BhdGgiLCByZWFkVVJMKGVudHJ5KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlVUkwgZW50cnlDb3B5ID0gbmV3IFVSTChlbnRyeS50b0V4dGVybmFsRm9ybSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJleHRlcm5hbCBmb3JtYXQiLCBlbnRyeS50b0V4dGVybmFsRm9ybSgpLCBlbnRyeUNvcHkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJyb290IHJlc291cmNlIiwgInJvb3QgY2xhc3NwYXRoIiwgcmVhZFVSTChlbnRyeUNvcHkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVSTEV4dGVybmFsRm9ybWF0MDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRlc3QgdGhlIGV4dGVybmFsIGZvcm1hdCBvZiBidW5kbGUgZW50cnkgVVJMcwotCQlVUkwgZW50cnkgPSB0ZXN0LmdldFJlc291cmNlKCJkYXRhL3Jlc291cmNlMSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImVudHJ5IiwgZW50cnkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygicm9vdCByZXNvdXJjZSIsICJyb290IGNsYXNzcGF0aCIsIHJlYWRVUkwoZW50cnkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVVSTCBlbnRyeUNvcHkgPSBuZXcgVVJMKGVudHJ5LnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlhc3NlcnRFcXVhbHMoImV4dGVybmFsIGZvcm1hdCIsIGVudHJ5LnRvRXh0ZXJuYWxGb3JtKCksIGVudHJ5Q29weS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoInJvb3QgcmVzb3VyY2UiLCAicm9vdCBjbGFzc3BhdGgiLCByZWFkVVJMKGVudHJ5Q29weSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VVJMRXh0ZXJuYWxGb3JtYXQwMygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdGVzdCB0aGUgZXh0ZXJuYWwgZm9ybWF0IG9mIGJ1bmRsZSByZXNvdXJjZSBVUkxzCi0JCVVSTCBlbnRyeSA9IHRlc3QuZ2V0RW50cnkoImRhdGEvcmVzb3VyY2UxIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZW50cnkiLCBlbnRyeSk7IC8vJE5PTi1OTFMtMSQKLQkJVVJJIHVyaTEgPSBudWxsOwotCQlVUkkgdXJpMiA9IG51bGw7Ci0JCVVSSSB1cmkzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVyaTEgPSBuZXcgVVJJKGVudHJ5LmdldFByb3RvY29sKCksIG51bGwsIGVudHJ5LmdldEhvc3QoKSwgZW50cnkuZ2V0UG9ydCgpLCBlbnRyeS5nZXRQYXRoKCksIG51bGwsIGVudHJ5LmdldFF1ZXJ5KCkpOwotCQkJdXJpMiA9IG5ldyBVUkkoZW50cnkuZ2V0UHJvdG9jb2woKSwgZW50cnkuZ2V0SG9zdCgpLCBlbnRyeS5nZXRQYXRoKCksIGVudHJ5LmdldFF1ZXJ5KCkpOwotCQkJdXJpMyA9IG5ldyBVUkkoZW50cnkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIFVSSSBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVVSTCB1cmwxID0gbnVsbDsKLQkJVVJMIHVybDIgPSBudWxsOwotCQlVUkwgdXJsMyA9IG51bGw7Ci0JCVVSTCB1cmw0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybDEgPSB1cmkxLnRvVVJMKCk7Ci0JCQl1cmwyID0gdXJpMi50b1VSTCgpOwotCQkJdXJsMyA9IHVyaTMudG9VUkwoKTsKLQkJCXVybDQgPSBuZXcgVVJMKHVyaTEudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIFVSTCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNoZWNrVVJMKCJyb290IGNsYXNzcGF0aCIsIGVudHJ5LCB1cmwxKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1VSTCgicm9vdCBjbGFzc3BhdGgiLCBlbnRyeSwgdXJsMik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tVUkwoInJvb3QgY2xhc3NwYXRoIiwgZW50cnksIHVybDMpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrVVJMKCJyb290IGNsYXNzcGF0aCIsIGVudHJ5LCB1cmw0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVUkxFeHRlcm5hbEZvcm1hdDA0KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSB0ZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyB0ZXN0IHRoZSBleHRlcm5hbCBmb3JtYXQgb2YgYnVuZGxlIHJlc291cmNlIFVSTHMKLQkJVVJMIGVudHJ5ID0gdGVzdC5nZXRSZXNvdXJjZSgiZGF0YS9yZXNvdXJjZTEiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJlbnRyeSIsIGVudHJ5KTsgLy8kTk9OLU5MUy0xJAotCQlVUkkgdXJpMSA9IG51bGw7Ci0JCVVSSSB1cmkyID0gbnVsbDsKLQkJVVJJIHVyaTMgPSBudWxsOwotCQl0cnkgewotCQkJdXJpMSA9IG5ldyBVUkkoZW50cnkuZ2V0UHJvdG9jb2woKSwgbnVsbCwgZW50cnkuZ2V0SG9zdCgpLCBlbnRyeS5nZXRQb3J0KCksIGVudHJ5LmdldFBhdGgoKSwgbnVsbCwgZW50cnkuZ2V0UXVlcnkoKSk7Ci0JCQl1cmkyID0gbmV3IFVSSShlbnRyeS5nZXRQcm90b2NvbCgpLCBlbnRyeS5nZXRIb3N0KCksIGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0UXVlcnkoKSk7Ci0JCQl1cmkzID0gbmV3IFVSSShlbnRyeS50b0V4dGVybmFsRm9ybSgpKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgVVJJIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJVVJMIHVybDEgPSBudWxsOwotCQlVUkwgdXJsMiA9IG51bGw7Ci0JCVVSTCB1cmwzID0gbnVsbDsKLQkJVVJMIHVybDQgPSBudWxsOwotCQl0cnkgewotCQkJdXJsMSA9IHVyaTEudG9VUkwoKTsKLQkJCXVybDIgPSB1cmkyLnRvVVJMKCk7Ci0JCQl1cmwzID0gdXJpMy50b1VSTCgpOwotCQkJdXJsNCA9IG5ldyBVUkwodXJpMS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgVVJMIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2hlY2tVUkwoInJvb3QgY2xhc3NwYXRoIiwgZW50cnksIHVybDEpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrVVJMKCJyb290IGNsYXNzcGF0aCIsIGVudHJ5LCB1cmwyKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1VSTCgicm9vdCBjbGFzc3BhdGgiLCBlbnRyeSwgdXJsMyk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tVUkwoInJvb3QgY2xhc3NwYXRoIiwgZW50cnksIHVybDQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrVVJMKFN0cmluZyBjb250ZW50LCBVUkwgb3JpZywgVVJMIGNvcHkpIHsKLQkJYXNzZXJ0RXF1YWxzKCJleHRlcm5hbCBmb3JtYXQiLCBvcmlnLnRvRXh0ZXJuYWxGb3JtKCksIGNvcHkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKGNvbnRlbnQsIGNvbnRlbnQsIHJlYWRVUkwoY29weSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVUkkoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJbmV3IFVSSSgiYnVuZGxlZW50cnkiLCAiMSIsICIvdGVzdCIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUV4cG9ydEZyYWdtZW50czAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBob3N0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImhvc3QubXVsdGlwbGUuZXhwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmcmFnID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImZyYWcubXVsdGlwbGUuZXhwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2hvc3QsIGZyYWd9KTsKLQkJUGFja2FnZUFkbWluIHBhY2thZ2VBZG1pbiA9IGluc3RhbGxlci5nZXRQYWNrYWdlQWRtaW4oKTsKLQkJRXhwb3J0ZWRQYWNrYWdlW10gaG9zdEV4cG9ydHMgPSBwYWNrYWdlQWRtaW4uZ2V0RXhwb3J0ZWRQYWNrYWdlcyhob3N0KTsKLQkJYXNzZXJ0RXF1YWxzKCJOdW1iZXIgaG9zdCBleHBvcnRzIiwgMywgaG9zdEV4cG9ydHMgPT0gbnVsbCA/IDAgOiBob3N0RXhwb3J0cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJUGxhdGZvcm1BZG1pbiBwbGF0Zm9ybUFkbWluID0gaW5zdGFsbGVyLmdldFBsYXRmb3JtQWRtaW4oKTsKLQkJU3RhdGUgc3lzdGVtU3RhdGUgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlKGZhbHNlKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaG9zdERlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoaG9zdC5nZXRCdW5kbGVJZCgpKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaG9zdEV4cG9ydERlc2NzID0gaG9zdERlc2MuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiTnVtYmVyIGhvc3QgZXhwb3J0IGRlc2NyaXB0aW9ucyIsIDMsIGhvc3RFeHBvcnREZXNjcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJDaGVjayBleHBvcnQgbmFtZSIsICJob3N0Lm11bHRpcGxlLmV4cG9ydHMiLCBob3N0RXhwb3J0RGVzY3NbMF0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJDaGVjayBpbmNsdWRlIGRpcmVjdGl2ZSIsICJQdWJsaWMqIiwgKFN0cmluZykgaG9zdEV4cG9ydERlc2NzWzBdLmdldERpcmVjdGl2ZSgiaW5jbHVkZSIpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCWFzc2VydEVxdWFscygiQ2hlY2sgZXhwb3J0IG5hbWUiLCAiaG9zdC5tdWx0aXBsZS5leHBvcnRzLm9ubHlvbmUiLCBob3N0RXhwb3J0RGVzY3NbMV0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJYXNzZXJ0RXF1YWxzKCJDaGVjayBleHBvcnQgbmFtZSIsICJob3N0Lm11bHRpcGxlLmV4cG9ydHMiLCBob3N0RXhwb3J0RGVzY3NbMl0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiQ2hlY2sgaW5jbHVkZSBkaXJlY3RpdmUiLCAicHJpdmF0ZSIsIChTdHJpbmcpIGhvc3RFeHBvcnREZXNjc1syXS5nZXRBdHRyaWJ1dGVzKCkuZ2V0KCJzY29wZSIpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUV4cG9ydEZyYWdtZW50czAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBob3N0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImhvc3QubXVsdGlwbGUuZXhwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmcmFnID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImZyYWcubXVsdGlwbGUuZXhwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBjbGllbnQxID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNsaWVudDEubXVsdGlwbGUuZXhwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7aG9zdCwgZnJhZywgY2xpZW50MX0pOwotCQljbGllbnQxLnN0YXJ0KCk7Ci0JCWNsaWVudDEuc3RvcCgpOwotCQlPYmplY3RbXSBleHBlY3RlZEV2ZW50cyA9IG5ldyBPYmplY3RbNF07Ci0JCWV4cGVjdGVkRXZlbnRzWzBdID0gImhvc3QubXVsdGlwbGUuZXhwb3J0cy5QdWJsaWNDbGFzczEiOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkRXZlbnRzWzFdID0gImhvc3QubXVsdGlwbGUuZXhwb3J0cy5QdWJsaWNDbGFzczIiOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkRXZlbnRzWzJdID0gInN1Y2Nlc3MiOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkRXZlbnRzWzNdID0gInN1Y2Nlc3MiOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdFtdIGFjdHVhbEV2ZW50cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cyg0KTsKLQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRFdmVudHMsIGFjdHVhbEV2ZW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRXhwb3J0RnJhZ21lbnRzMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGhvc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiaG9zdC5tdWx0aXBsZS5leHBvcnRzIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGZyYWcgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiZnJhZy5tdWx0aXBsZS5leHBvcnRzIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNsaWVudDIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2xpZW50Mi5tdWx0aXBsZS5leHBvcnRzIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtob3N0LCBmcmFnLCBjbGllbnQyfSk7Ci0JCWNsaWVudDIuc3RhcnQoKTsKLQkJY2xpZW50Mi5zdG9wKCk7Ci0JCU9iamVjdFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFs0XTsKLQkJZXhwZWN0ZWRFdmVudHNbMF0gPSAiaG9zdC5tdWx0aXBsZS5leHBvcnRzLlB1YmxpY0NsYXNzMSI7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0ZWRFdmVudHNbMV0gPSAiaG9zdC5tdWx0aXBsZS5leHBvcnRzLlB1YmxpY0NsYXNzMiI7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0ZWRFdmVudHNbMl0gPSAiaG9zdC5tdWx0aXBsZS5leHBvcnRzLlByaXZhdGVDbGFzczEiOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkRXZlbnRzWzNdID0gImhvc3QubXVsdGlwbGUuZXhwb3J0cy5Qcml2YXRlQ2xhc3MyIjsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoNCk7Ci0JCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLCBhY3R1YWxFdmVudHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYRnJpZW5kcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9zZ2kucmVzb2x2ZXJNb2RlIiwgInN0cmljdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlCdW5kbGUgdGVzdDEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgieGZyaWVuZHMudGVzdDEiKTsgLy8kTk9OLU5MUy0xJAotCQkJQnVuZGxlIHRlc3QyID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInhmcmllbmRzLnRlc3QyIik7IC8vJE5PTi1OTFMtMSQKLQkJCUJ1bmRsZSB0ZXN0MyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ4ZnJpZW5kcy50ZXN0MyIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHt0ZXN0MSwgdGVzdDIsIHRlc3QzfSk7Ci0JCQl0ZXN0Mi5zdGFydCgpOwotCQkJdGVzdDIuc3RvcCgpOwotCQkJdGVzdDMuc3RhcnQoKTsKLQkJCXRlc3QzLnN0b3AoKTsKLQkJCU9iamVjdFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFs0XTsKLQkJCWV4cGVjdGVkRXZlbnRzWzBdID0gInhmcmllbmRzLnRlc3QxLm9ubHlmb3JmcmllbmRzLlRlc3RGcmllbmRzIjsgLy8kTk9OLU5MUy0xJAotCQkJZXhwZWN0ZWRFdmVudHNbMV0gPSAieGZyaWVuZHMudGVzdDEuZXh0ZXJuYWwuVGVzdEZyaWVuZHMiOyAvLyROT04tTkxTLTEkCi0JCQlleHBlY3RlZEV2ZW50c1syXSA9ICJzdWNjZXNzIjsgLy8kTk9OLU5MUy0xJAotCQkJZXhwZWN0ZWRFdmVudHNbM10gPSAieGZyaWVuZHMudGVzdDEuZXh0ZXJuYWwuVGVzdEZyaWVuZHMiOyAvLyROT04tTkxTLTEkCi0JCQlPYmplY3RbXSBhY3R1YWxFdmVudHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoNCk7Ci0JCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKCJvc2dpLnJlc29sdmVyTW9kZSIpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRQbGF0Zm9ybVByb3BlcnRpZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRlckV4cG9ydGVyMDEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGltcG9ydGVyRXhwb3J0ZXIxID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImV4cG9ydGVyLmltcG9ydGVyMSIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2ltcG9ydGVyRXhwb3J0ZXIxfSk7Ci0JCVBhY2thZ2VBZG1pbiBwYSA9IGluc3RhbGxlci5nZXRQYWNrYWdlQWRtaW4oKTsKLQkJRXhwb3J0ZWRQYWNrYWdlW10gb3JpZ0V4cG9ydGVkUGFja2FnZXMgPSBwYS5nZXRFeHBvcnRlZFBhY2thZ2VzKCJleHBvcnRlci5pbXBvcnRlci50ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gZXhwb3J0ZXIuaW1wb3J0ZXIudGVzdCBmb3VuZCIsIG9yaWdFeHBvcnRlZFBhY2thZ2VzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBleHBvcnRzIiwgMSwgb3JpZ0V4cG9ydGVkUGFja2FnZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgZXhwb3J0ZXIgPSBvcmlnRXhwb3J0ZWRQYWNrYWdlc1swXS5nZXRFeHBvcnRpbmdCdW5kbGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBleHBvcnRlciIsIGltcG9ydGVyRXhwb3J0ZXIxLCBleHBvcnRlcik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVE9ETyBuZWVkIHRvIGdldCBjbGFyaWZpY2F0aW9uIGZyb20gT1NHaSBvbiB3aGF0IGlzIHJldHVybmVkIGJ5IGdldEltcG9ydGluZ0J1bmRsZXMgd2hlbiB0aGVyZSBpcyBubyBpbXBvcnRlcnMKLQkJQnVuZGxlW10gb3JpZ0ltcG9ydGVycyA9IG9yaWdFeHBvcnRlZFBhY2thZ2VzWzBdLmdldEltcG9ydGluZ0J1bmRsZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgbm8gaW1wb3J0ZXJzIiwgb3JpZ0ltcG9ydGVycyA9PSBudWxsIHx8IG9yaWdJbXBvcnRlcnMubGVuZ3RoID09IDApOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaW5zdGFsbCBhbm90aGVyIGltcG9ydGVyL2V4cG9ydGVyLiAgVGhpcyBidW5kbGUgc2hvdWxkIHdpcmUgdG8gdGhlIG9yaWdpbmFsIGV4cG9ydGVyCi0JCUJ1bmRsZSBpbXBvcnRlckV4cG9ydGVyMiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJleHBvcnRlci5pbXBvcnRlcjIiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtpbXBvcnRlckV4cG9ydGVyMn0pOwotCi0JCW9yaWdJbXBvcnRlcnMgPSBvcmlnRXhwb3J0ZWRQYWNrYWdlc1swXS5nZXRJbXBvcnRpbmdCdW5kbGVzKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGltcG9ydGVycyBmb3VuZCIsIG9yaWdJbXBvcnRlcnMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGltcG9ydGVycyIsIDEsIG9yaWdJbXBvcnRlcnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGltcG9ydGVyIiwgaW1wb3J0ZXJFeHBvcnRlcjIsIG9yaWdJbXBvcnRlcnNbMF0pOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0ZWRQYWNrYWdlW10gbmV3RXhwb3J0ZWRQYWNrYWdlcyA9IHBhLmdldEV4cG9ydGVkUGFja2FnZXMoImV4cG9ydGVyLmltcG9ydGVyLnRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyBleHBvcnRlci5pbXBvcnRlci50ZXN0IGZvdW5kIiwgbmV3RXhwb3J0ZWRQYWNrYWdlcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgZXhwb3J0cyIsIDEsIG5ld0V4cG9ydGVkUGFja2FnZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlleHBvcnRlciA9IG5ld0V4cG9ydGVkUGFja2FnZXNbMF0uZ2V0RXhwb3J0aW5nQnVuZGxlKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZXhwb3J0ZXIiLCBpbXBvcnRlckV4cG9ydGVyMSwgZXhwb3J0ZXIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZVtdIG5ld0ltcG9ydGVycyA9IG5ld0V4cG9ydGVkUGFja2FnZXNbMF0uZ2V0SW1wb3J0aW5nQnVuZGxlcygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBpbXBvcnRlcnMgZm91bmQiLCBuZXdJbXBvcnRlcnMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGltcG9ydGVycyIsIDEsIG5ld0ltcG9ydGVycy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgaW1wb3J0ZXIiLCBpbXBvcnRlckV4cG9ydGVyMiwgbmV3SW1wb3J0ZXJzWzBdKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRlckV4cG9ydGVyMDIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGltcG9ydGVyRXhwb3J0ZXIzID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImV4cG9ydGVyLmltcG9ydGVyMyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBpbXBvcnRlckV4cG9ydGVyNCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJleHBvcnRlci5pbXBvcnRlcjQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtpbXBvcnRlckV4cG9ydGVyMywgaW1wb3J0ZXJFeHBvcnRlcjR9KTsKLQotCQlpbXBvcnRlckV4cG9ydGVyMy5zdGFydCgpOwotCQlpbXBvcnRlckV4cG9ydGVyMy5zdG9wKCk7Ci0JCWltcG9ydGVyRXhwb3J0ZXIzLnVwZGF0ZSgpOwotCQl0cnkgewotCQkJaW1wb3J0ZXJFeHBvcnRlcjMuc3RhcnQoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgdCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyMDc4NDcoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge3Rlc3R9KTsKLQkJdGVzdC5zdGFydCgpOwotCi0JCUJ1bmRsZSBmcmFnMSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0LmZyYWdtZW50MSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmcmFnMiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0LmZyYWdtZW50MiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmcmFnMyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0LmZyYWdtZW50MyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmcmFnNCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0LmZyYWdtZW50NCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmcmFnNSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0LmZyYWdtZW50NSIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2ZyYWcxLCBmcmFnMiwgZnJhZzMsIGZyYWc0LCBmcmFnNX0pOwotCi0JCWFzc2VydFRydWUoImhvc3QgaXMgbm90IHJlc29sdmVkIiwgKHRlc3QuZ2V0U3RhdGUoKSAmIEJ1bmRsZS5BQ1RJVkUpICE9IDApOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImZyYWcxIGlzIG5vdCByZXNvbHZlZCIsIChmcmFnMS5nZXRTdGF0ZSgpICYgQnVuZGxlLlJFU09MVkVEKSAhPSAwKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJmcmFnMiBpcyBub3QgcmVzb2x2ZWQiLCAoZnJhZzIuZ2V0U3RhdGUoKSAmIEJ1bmRsZS5SRVNPTFZFRCkgIT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiZnJhZzMgaXMgbm90IHJlc29sdmVkIiwgKGZyYWczLmdldFN0YXRlKCkgJiBCdW5kbGUuUkVTT0xWRUQpICE9IDApOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImZyYWc0IGlzIG5vdCByZXNvbHZlZCIsIChmcmFnNC5nZXRTdGF0ZSgpICYgQnVuZGxlLlJFU09MVkVEKSAhPSAwKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJmcmFnNSBpcyBub3QgcmVzb2x2ZWQiLCAoZnJhZzUuZ2V0U3RhdGUoKSAmIEJ1bmRsZS5SRVNPTFZFRCkgIT0gMCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjM1OTU4KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSB0ZXN0WCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0LmJ1ZzIzNTk1OC54Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHRlc3RZID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QuYnVnMjM1OTU4LnkiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHt0ZXN0WCwgdGVzdFl9KTsKLQkJdHJ5IHsKLQkJCXRlc3RYLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVkZHlDbGFzc0xvYWRpbmdSZWdpc3RlcmVkMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgcmVnaXN0ZXJlZEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYnVkZHkucmVnaXN0ZXJlZC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7cmVnaXN0ZXJlZEF9KTsKLQkJRW51bWVyYXRpb24gdGVzdEZpbGVzID0gcmVnaXN0ZXJlZEEuZ2V0UmVzb3VyY2VzKCJyZXNvdXJjZXMvdGVzdC50eHQiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0RmlsZXMiLCB0ZXN0RmlsZXMpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5TGlzdCB0ZXh0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHRlc3RGaWxlcy5oYXNNb3JlRWxlbWVudHMoKSkKLQkJCXRleHRzLmFkZChyZWFkVVJMKChVUkwpIHRlc3RGaWxlcy5uZXh0RWxlbWVudCgpKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC50eHQgbnVtYmVyIiwgMSwgdGV4dHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJidWRkeS5yZWdpc3RlcmVkLmEiLCB0ZXh0cy5jb250YWlucygiYnVkZHkucmVnaXN0ZXJlZC5hIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlCdW5kbGUgcmVnaXN0ZXJlZEFUZXN0MSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJidWRkeS5yZWdpc3RlcmVkLmEudGVzdDEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgcmVnaXN0ZXJlZEFUZXN0MiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJidWRkeS5yZWdpc3RlcmVkLmEudGVzdDIiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtyZWdpc3RlcmVkQVRlc3QxLCByZWdpc3RlcmVkQVRlc3QyfSk7Ci0JCXRlc3RGaWxlcyA9IHJlZ2lzdGVyZWRBLmdldFJlc291cmNlcygicmVzb3VyY2VzL3Rlc3QudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdEZpbGVzIiwgdGVzdEZpbGVzKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHRlc3RGaWxlcy5oYXNNb3JlRWxlbWVudHMoKSkKLQkJCXRleHRzLmFkZChyZWFkVVJMKChVUkwpIHRlc3RGaWxlcy5uZXh0RWxlbWVudCgpKSk7Ci0KLQkJLy8gVGhlIHJlYWwgdGVzdAotCQlhc3NlcnRFcXVhbHMoInRlc3QudHh0IG51bWJlciIsIDMsIHRleHRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiYnVkZHkucmVnaXN0ZXJlZC5hIiwgdGV4dHMuY29udGFpbnMoImJ1ZGR5LnJlZ2lzdGVyZWQuYSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoImJ1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MSIsIHRleHRzLmNvbnRhaW5zKCJidWRkeS5yZWdpc3RlcmVkLmEudGVzdDEiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCJidWRkeS5yZWdpc3RlcmVkLmEudGVzdDIiLCB0ZXh0cy5jb250YWlucygiYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVkZHlDbGFzc0xvYWRpbmdSZWdpc3RlcmVkMigpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgcmVnaXN0ZXJlZEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYnVkZHkucmVnaXN0ZXJlZC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7cmVnaXN0ZXJlZEF9KTsKLQkJVVJMIHRlc3RGaWxlID0gcmVnaXN0ZXJlZEEuZ2V0UmVzb3VyY2UoInJlc291cmNlcy90ZXN0MS50eHQiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJ0ZXN0MS50eHQiLCB0ZXN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQl0ZXN0RmlsZSA9IHJlZ2lzdGVyZWRBLmdldFJlc291cmNlKCJyZXNvdXJjZXMvdGVzdDIudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgidGVzdDIudHh0IiwgdGVzdEZpbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlIHJlZ2lzdGVyZWRBVGVzdDEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QxIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHJlZ2lzdGVyZWRBVGVzdDIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QyIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7cmVnaXN0ZXJlZEFUZXN0MSwgcmVnaXN0ZXJlZEFUZXN0Mn0pOwotCi0JCXRlc3RGaWxlID0gcmVnaXN0ZXJlZEEuZ2V0UmVzb3VyY2UoInJlc291cmNlcy90ZXN0MS50eHQiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0MS50eHQiLCB0ZXN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJidWRkeS5yZWdpc3RlcmVkLmEudGVzdDEiLCAiYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QxIiwgcmVhZFVSTCh0ZXN0RmlsZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl0ZXN0RmlsZSA9IHJlZ2lzdGVyZWRBLmdldFJlc291cmNlKCJyZXNvdXJjZXMvdGVzdDIudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdDIudHh0IiwgdGVzdEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVkZHkucmVnaXN0ZXJlZC5hLnRlc3QyIiwgImJ1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MiIsIHJlYWRVUkwodGVzdEZpbGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZGR5Q2xhc3NMb2FkaW5nUmVnaXN0ZXJlZDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIHJlZ2lzdGVyZWRBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImJ1ZGR5LnJlZ2lzdGVyZWQuYSIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge3JlZ2lzdGVyZWRBfSk7Ci0JCXRyeSB7Ci0JCQlyZWdpc3RlcmVkQS5sb2FkQ2xhc3MoImJ1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MS5BVGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCQlmYWlsKCJleHBlY3RlZCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlyZWdpc3RlcmVkQS5sb2FkQ2xhc3MoImJ1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0Mi5BVGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCQlmYWlsKCJleHBlY3RlZCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCUJ1bmRsZSByZWdpc3RlcmVkQVRlc3QxID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImJ1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSByZWdpc3RlcmVkQVRlc3QyID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImJ1ZGR5LnJlZ2lzdGVyZWQuYS50ZXN0MiIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge3JlZ2lzdGVyZWRBVGVzdDEsIHJlZ2lzdGVyZWRBVGVzdDJ9KTsKLQotCQl0cnkgewotCQkJQ2xhc3MgdGVzdENsYXNzID0gcmVnaXN0ZXJlZEEubG9hZENsYXNzKCJidWRkeS5yZWdpc3RlcmVkLmEudGVzdDEuQVRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0Tm90TnVsbCgidGVzdENsYXNzIiwgdGVzdENsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJQ2xhc3MgdGVzdENsYXNzID0gcmVnaXN0ZXJlZEEubG9hZENsYXNzKCJidWRkeS5yZWdpc3RlcmVkLmEudGVzdDIuQVRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0Tm90TnVsbCgidGVzdENsYXNzIiwgdGVzdENsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVkZHlDbGFzc0xvYWRpbmdEZXBlbmRlbnQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBkZXBlbmRlbnRBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImJ1ZGR5LmRlcGVuZGVudC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7ZGVwZW5kZW50QX0pOwotCQlFbnVtZXJhdGlvbiB0ZXN0RmlsZXMgPSBkZXBlbmRlbnRBLmdldFJlc291cmNlcygicmVzb3VyY2VzL3Rlc3QudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdEZpbGVzIiwgdGVzdEZpbGVzKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheUxpc3QgdGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICh0ZXN0RmlsZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQl0ZXh0cy5hZGQocmVhZFVSTCgoVVJMKSB0ZXN0RmlsZXMubmV4dEVsZW1lbnQoKSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QudHh0IG51bWJlciIsIDEsIHRleHRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiYnVkZHkuZGVwZW5kZW50LmEiLCB0ZXh0cy5jb250YWlucygiYnVkZHkuZGVwZW5kZW50LmEiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCUJ1bmRsZSBkZXBlbmRlbnRBVGVzdDEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYnVkZHkuZGVwZW5kZW50LmEudGVzdDEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgZGVwZW5kZW50QVRlc3QyID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QyIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7ZGVwZW5kZW50QVRlc3QxLCBkZXBlbmRlbnRBVGVzdDJ9KTsKLQkJdGVzdEZpbGVzID0gZGVwZW5kZW50QS5nZXRSZXNvdXJjZXMoInJlc291cmNlcy90ZXN0LnR4dCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoInRlc3RGaWxlcyIsIHRlc3RGaWxlcyk7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICh0ZXN0RmlsZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQl0ZXh0cy5hZGQocmVhZFVSTCgoVVJMKSB0ZXN0RmlsZXMubmV4dEVsZW1lbnQoKSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QudHh0IG51bWJlciIsIDMsIHRleHRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiYnVkZHkuZGVwZW5kZW50LmEiLCB0ZXh0cy5jb250YWlucygiYnVkZHkuZGVwZW5kZW50LmEiKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoImJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QxIiwgdGV4dHMuY29udGFpbnMoImJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QxIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiYnVkZHkuZGVwZW5kZW50LmEudGVzdDIiLCB0ZXh0cy5jb250YWlucygiYnVkZHkuZGVwZW5kZW50LmEudGVzdDIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWRkeUNsYXNzTG9hZGluZ0RlcGVuZGVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGRlcGVuZGVudEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYnVkZHkuZGVwZW5kZW50LmEiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtkZXBlbmRlbnRBfSk7Ci0JCVVSTCB0ZXN0RmlsZSA9IGRlcGVuZGVudEEuZ2V0UmVzb3VyY2UoInJlc291cmNlcy90ZXN0MS50eHQiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJ0ZXN0MS50eHQiLCB0ZXN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQl0ZXN0RmlsZSA9IGRlcGVuZGVudEEuZ2V0UmVzb3VyY2UoInJlc291cmNlcy90ZXN0Mi50eHQiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJ0ZXN0Mi50eHQiLCB0ZXN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgZGVwZW5kZW50QVRlc3QxID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QxIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGRlcGVuZGVudEFUZXN0MiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJidWRkeS5kZXBlbmRlbnQuYS50ZXN0MiIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2RlcGVuZGVudEFUZXN0MSwgZGVwZW5kZW50QVRlc3QyfSk7Ci0KLQkJdGVzdEZpbGUgPSBkZXBlbmRlbnRBLmdldFJlc291cmNlKCJyZXNvdXJjZXMvdGVzdDEudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdDEudHh0IiwgdGVzdEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVkZHkuZGVwZW5kZW50LmEudGVzdDEiLCAiYnVkZHkuZGVwZW5kZW50LmEudGVzdDEiLCByZWFkVVJMKHRlc3RGaWxlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXRlc3RGaWxlID0gZGVwZW5kZW50QS5nZXRSZXNvdXJjZSgicmVzb3VyY2VzL3Rlc3QyLnR4dCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoInRlc3QyLnR4dCIsIHRlc3RGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QyIiwgImJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QyIiwgcmVhZFVSTCh0ZXN0RmlsZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVkZHlDbGFzc0xvYWRpbmdEZXBlbmRlbnQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBkZXBlbmRlbnRBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImJ1ZGR5LmRlcGVuZGVudC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7ZGVwZW5kZW50QX0pOwotCi0JCXRyeSB7Ci0JCQlkZXBlbmRlbnRBLmxvYWRDbGFzcygiYnVkZHkuZGVwZW5kZW50LmEudGVzdDEuQVRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmFpbCgiZXhwZWN0ZWQgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCi0JCXRyeSB7Ci0JCQlkZXBlbmRlbnRBLmxvYWRDbGFzcygiYnVkZHkuZGVwZW5kZW50LmEudGVzdDIuQVRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmFpbCgiZXhwZWN0ZWQgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCi0JCUJ1bmRsZSBkZXBlbmRlbnRBVGVzdDEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiYnVkZHkuZGVwZW5kZW50LmEudGVzdDEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgZGVwZW5kZW50QVRlc3QyID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QyIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7ZGVwZW5kZW50QVRlc3QxLCBkZXBlbmRlbnRBVGVzdDJ9KTsKLQotCQl0cnkgewotCQkJQ2xhc3MgdGVzdENsYXNzID0gZGVwZW5kZW50QS5sb2FkQ2xhc3MoImJ1ZGR5LmRlcGVuZGVudC5hLnRlc3QxLkFUZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydE5vdE51bGwoInRlc3RDbGFzcyIsIHRlc3RDbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIENsYXNzTm90Rm91bmRFeGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlDbGFzcyB0ZXN0Q2xhc3MgPSBkZXBlbmRlbnRBLmxvYWRDbGFzcygiYnVkZHkuZGVwZW5kZW50LmEudGVzdDIuQVRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0Tm90TnVsbCgidGVzdENsYXNzIiwgdGVzdENsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlUmVmZXJlbmNlMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCUNsYXNzIGNsYXp6ID0gdGVzdC5sb2FkQ2xhc3MoInRlc3QxLkFjdGl2YXRvciIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBidW5kbGUgPSBGcmFtZXdvcmtVdGlsLmdldEJ1bmRsZShjbGF6eik7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgYnVuZGxlIiwgdGVzdCwgYnVuZGxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdW5kbGVSZWZlcmVuY2UwMigpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQ2xhc3MgY2xhenogPSB0ZXN0LmxvYWRDbGFzcygidGVzdDEuQWN0aXZhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJQ2xhc3NMb2FkZXIgY2wgPSBjbGF6ei5nZXRDbGFzc0xvYWRlcigpOwotCQlpZiAoIShjbCBpbnN0YW5jZW9mIEJ1bmRsZVJlZmVyZW5jZSkpCi0JCQlmYWlsKCJDbGFzc0xvYWRlciBpcyBub3Qgb2YgdHlwZSBCdW5kbGVSZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGJ1bmRsZSIsIHRlc3QsICgoQnVuZGxlUmVmZXJlbmNlKSBjbCkuZ2V0QnVuZGxlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVVUkxSZWxhdGl2ZUJ1bmRsZVJlc291cmNlV2l0aFBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIGRpcmVjdG9yeSA9IG5ldyBVUkwoImJ1bmRsZXJlc291cmNlOi8vODI6MS9kaWN0aW9uYXJpZXMvIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDEsIGRpcmVjdG9yeS5nZXRQb3J0KCkpOwotCi0JCVVSTCByZXNvdXJjZSA9IG5ldyBVUkwoZGlyZWN0b3J5LCAiZW5fR0IuZGljdGlvbmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZS5nZXRQb3J0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYW5pZmVzdFBhY2thZ2VTcGVjKCkgewotCQl0cnkgewotCQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdC5tYW5pZmVzdHBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGVzdC5zdGFydCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5VHlwZUxvYWQoKSB7Ci0JCWRvVGVzdEFycmF5VHlwZUxvYWQoIltCIik7IC8vJE5PTi1OTFMtMSQKLQkJZG9UZXN0QXJyYXlUeXBlTG9hZCgiW0MiKTsgLy8kTk9OLU5MUy0xJAotCQlkb1Rlc3RBcnJheVR5cGVMb2FkKCJbRCIpOyAvLyROT04tTkxTLTEkCi0JCWRvVGVzdEFycmF5VHlwZUxvYWQoIltGIik7IC8vJE5PTi1OTFMtMSQKLQkJZG9UZXN0QXJyYXlUeXBlTG9hZCgiW0kiKTsgLy8kTk9OLU5MUy0xJAotCQlkb1Rlc3RBcnJheVR5cGVMb2FkKCJbSiIpOyAvLyROT04tTkxTLTEkCi0JCWRvVGVzdEFycmF5VHlwZUxvYWQoIltTIik7IC8vJE5PTi1OTFMtMSQKLQkJZG9UZXN0QXJyYXlUeXBlTG9hZCgiW1oiKTsgLy8kTk9OLU5MUy0xJAotCQlkb1Rlc3RBcnJheVR5cGVMb2FkKCJbTG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BcnJheVRlc3Q7Iik7IC8vJE5PTi1OTFMtMSQKLQkJZG9UZXN0QXJyYXlUeXBlTG9hZCgiW1tEIik7IC8vJE5PTi1OTFMtMSQKLQkJZG9UZXN0QXJyYXlUeXBlTG9hZCgiW1tMb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFycmF5VGVzdDsiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1CdW5kbGVHZXRSZXNvdXJjZXMwMSgpIHsKLQkJQnVuZGxlIHN5c3RlbUJ1bmRsZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApOwotCQlFbnVtZXJhdGlvbiByZXNvdXJjZXMgPSBudWxsOwotCQl0cnkgewotCQkJcmVzb3VyY2VzID0gc3lzdGVtQnVuZGxlLmdldFJlc291cmNlcygiaG9va2NvbmZpZ3VyYXRvcnMucHJvcGVydGllcyIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gZ2V0IHJlc291cmNlcyIsIGUpOwotCQl9Ci0JCWFzc2VydE5vdE51bGwoIlJlc291cmNlcyBpcyBudWxsIiwgcmVzb3VyY2VzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQnVuZGxlR2V0UmVzb3VyY2VzMDIoKSB7Ci0JCUJ1bmRsZSBzeXN0ZW1CdW5kbGUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgwKTsKLQkJRW51bWVyYXRpb24gcmVzb3VyY2VzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc291cmNlcyA9IHN5c3RlbUJ1bmRsZS5nZXRSZXNvdXJjZXMoImphdmEvbGFuZy90ZXN0LnJlc291cmNlIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBnZXQgcmVzb3VyY2VzIiwgZSk7Ci0JCX0KLQkJYXNzZXJ0TnVsbCgiUmVzb3VyY2VzIGlzIG5vdCBudWxsIiwgcmVzb3VyY2VzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjk5OTIxKCkgewotCQlDbGFzc0xvYWRlciBjbCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQlFbnVtZXJhdGlvbiByZXNvdXJjZXMgPSBudWxsOwotCQl0cnkgewotCQkJTWV0aG9kIGZpbmRNZXRob2QgPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZmluZFJlc291cmNlcyIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsKLQkJCWZpbmRNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQotCQkJcmVzb3VyY2VzID0gKEVudW1lcmF0aW9uKSBmaW5kTWV0aG9kLmludm9rZShjbCwgbmV3IE9iamVjdFtdIHsidGVzdC9kb2Vzbm90ZXhpc3QudHh0In0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcnJvciBjYWxsaW5nIGdldFJlc291cmNlcyIsIGUpOwotCQl9Ci0JCWFzc2VydE5vdE51bGwoIlNob3VsZCBub3QgYmUgbnVsbCIsIHJlc291cmNlcyk7Ci0JCWFzc2VydEZhbHNlKCJGb3VuZCByZXNvdXJjZXMhIiwgcmVzb3VyY2VzLmhhc01vcmVFbGVtZW50cygpKTsKLQkJdHJ5IHsKLQkJCXJlc291cmNlcyA9IGNsLmdldFJlc291cmNlcygidGVzdC9kb2Vzbm90ZXhpc3QudHh0Iik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24iLCBlKTsKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJTaG91bGQgbm90IGJlIG51bGwiLCByZXNvdXJjZXMpOwotCQlhc3NlcnRGYWxzZSgiRm91bmQgcmVzb3VyY2VzISIsIHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzMwNjE4MSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGFydExldmVsIHNsID0gaW5zdGFsbGVyLmdldFN0YXJ0TGV2ZWwoKTsKLQkJaW50IG9yaWdTTCA9IHNsLmdldFN0YXJ0TGV2ZWwoKTsKLQkJaW50IG9yaWdCdW5kbGVTTCA9IHNsLmdldEluaXRpYWxCdW5kbGVTdGFydExldmVsKCk7Ci0JCWludCBuZXdTTCA9IG9yaWdTTCArIDE7Ci0JCXNsLnNldEluaXRpYWxCdW5kbGVTdGFydExldmVsKG5ld1NMKTsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBhID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QuYnVnMzA2MTgxYSIpOwotCQkJQnVuZGxlIGIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdC5idWczMDYxODFiIik7Ci0KLQkJCXNsLnNldEJ1bmRsZVN0YXJ0TGV2ZWwoYSwgbmV3U0wpOwotCQkJc2wuc2V0QnVuZGxlU3RhcnRMZXZlbChiLCBuZXdTTCk7Ci0JCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHthLCBifSk7Ci0JCQlhLnN0YXJ0KCk7Ci0JCQliLnN0YXJ0KEJ1bmRsZS5TVEFSVF9BQ1RJVkFUSU9OX1BPTElDWSk7Ci0KLQkJCXNsLnNldFN0YXJ0TGV2ZWwobmV3U0wpOwotCQkJT2JqZWN0W10gZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMgPSBuZXcgT2JqZWN0WzFdOwotCQkJZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHNbMF0gPSBuZXcgRnJhbWV3b3JrRXZlbnQoRnJhbWV3b3JrRXZlbnQuU1RBUlRMRVZFTF9DSEFOR0VELCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgwKSwgbnVsbCk7Ci0JCQlPYmplY3RbXSBhY3R1YWxGcmFtZXdvcmtFdmVudHMgPSBmcmFtZXdvcmtMaXN0ZW5lclJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQkJCWNvbXBhcmVSZXN1bHRzKGV4cGVjdGVkRnJhbWV3b3JrRXZlbnRzLCBhY3R1YWxGcmFtZXdvcmtFdmVudHMpOwotCi0JCQlhc3NlcnRFcXVhbHMoIkJ1bmRsZSBBIGlzIG5vdCBhY3RpdmUiLCBCdW5kbGUuQUNUSVZFLCBhLmdldFN0YXRlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJCdW5kbGUgQiBpcyBub3QgYWN0aXZlIiwgQnVuZGxlLlNUQVJUSU5HLCBiLmdldFN0YXRlKCkpOwotCQkJU2VydmljZVJlZmVyZW5jZVtdIHJlZ3MgPSBhLmdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpOwotCQkJaWYgKHJlZ3MgIT0gbnVsbCAmJiByZWdzLmxlbmd0aCA+IDApIHsKLQkJCQlmYWlsKE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZShyZWdzWzBdKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXNsLnNldEluaXRpYWxCdW5kbGVTdGFydExldmVsKG9yaWdCdW5kbGVTTCk7Ci0JCQlzbC5zZXRTdGFydExldmVsKG9yaWdTTCk7Ci0JCQlPYmplY3RbXSBleHBlY3RlZEZyYW1ld29ya0V2ZW50cyA9IG5ldyBPYmplY3RbMV07Ci0JCQlleHBlY3RlZEZyYW1ld29ya0V2ZW50c1swXSA9IG5ldyBGcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudC5TVEFSVExFVkVMX0NIQU5HRUQsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKDApLCBudWxsKTsKLQkJCU9iamVjdFtdIGFjdHVhbEZyYW1ld29ya0V2ZW50cyA9IGZyYW1ld29ya0xpc3RlbmVyUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCQkJY29tcGFyZVJlc3VsdHMoZXhwZWN0ZWRGcmFtZXdvcmtFdmVudHMsIGFjdHVhbEZyYW1ld29ya0V2ZW50cyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9UZXN0QXJyYXlUeXBlTG9hZChTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJQ2xhc3MgYXJyYXlUeXBlID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5sb2FkQ2xhc3MobmFtZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJOdWxsIGNsYXNzIiwgYXJyYXlUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiQ2xhc3MgaXMgbm90IGFuIGFycmF5OiAiICsgYXJyYXlUeXBlLCBhcnJheVR5cGUuaXNBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlYWRVUkwoVVJMIHVybCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyeSB7Ci0JCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCkpKTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOyBsaW5lICE9IG51bGw7KSB7Ci0JCQkJCXNiLmFwcGVuZChsaW5lKTsKLQkJCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCQlpZiAobGluZSAhPSBudWxsKQotCQkJCQkJc2IuYXBwZW5kKCdcbicpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHJlYWRpbmcgdXJsOiAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvRXZlbnRMaXN0ZW5lclRlc3RSZXN1bHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9FdmVudExpc3RlbmVyVGVzdFJlc3VsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5NDFiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9FdmVudExpc3RlbmVyVGVzdFJlc3VsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEV2ZW50TGlzdGVuZXJUZXN0UmVzdWx0cyBleHRlbmRzIFRlc3RSZXN1bHRzIGltcGxlbWVudHMgQnVuZGxlTGlzdGVuZXIsIEZyYW1ld29ya0xpc3RlbmVyIHsKLQlwdWJsaWMgdm9pZCBidW5kbGVDaGFuZ2VkKEJ1bmRsZUV2ZW50IGV2ZW50KSB7Ci0JCWFkZEV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudCBldmVudCkgewotCQlhZGRFdmVudChldmVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL0V4dGVuc2lvbkJ1bmRsZVRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9FeHRlbnNpb25CdW5kbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ1ZGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL0V4dGVuc2lvbkJ1bmRsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uQnVuZGxlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEV4dGVuc2lvbkJ1bmRsZVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RnJhbWV3b3JrRXh0ZW5zaW9uMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGZ3a2V4dCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJleHQuZnJhbWV3b3JrLmEiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGltcG9ydGVyID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImV4dC5mcmFtZXdvcmsuYS5pbXBvcnRlciIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2Z3a2V4dCwgaW1wb3J0ZXJ9KTsKLQotCQlpbXBvcnRlci5zdGFydCgpOwotCQlpbXBvcnRlci5zdG9wKCk7Ci0JCU9iamVjdFtdIHJlc3VsdHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMik7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdHMubGVuZ3RoID09IDIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMS4xIiwgInN1Y2Nlc3MiLCByZXN1bHRzWzBdKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiMS4yIiwgInN1Y2Nlc3MiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYW1ld29ya0V4dGVuc2lvbjAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBmd2tleHQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiZXh0LmZyYW1ld29yay5hIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBpbXBvcnRlciA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJleHQuZnJhbWV3b3JrLmEucmVxdWlyZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtmd2tleHQsIGltcG9ydGVyfSk7Ci0KLQkJaW1wb3J0ZXIuc3RhcnQoKTsKLQkJaW1wb3J0ZXIuc3RvcCgpOwotCQlPYmplY3RbXSByZXN1bHRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDIpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCByZXN1bHRzLmxlbmd0aCA9PSAyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjEuMSIsICJzdWNjZXNzIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIjEuMiIsICJzdWNjZXNzIiwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRDbGFzc3BhdGhFeHRlbnNpb24wMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgZndrZXh0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImV4dC5leHRjbGFzc3BhdGguYSIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgaW1wb3J0ZXIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiZXh0LmV4dGNsYXNzcGF0aC5hLmltcG9ydGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7ZndrZXh0LCBpbXBvcnRlcn0pOwotCi0JCWltcG9ydGVyLnN0YXJ0KCk7Ci0JCWltcG9ydGVyLnN0b3AoKTsKLQkJT2JqZWN0W10gcmVzdWx0cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygyKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgcmVzdWx0cy5sZW5ndGggPT0gMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCAic3VjY2VzcyIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCAic3VjY2VzcyIsIHJlc3VsdHNbMV0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9JVGVzdFJ1bm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvSVRlc3RSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhYjgzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9JVGVzdFJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlczsKLQotcHVibGljIGludGVyZmFjZSBJVGVzdFJ1bm5lciB7Ci0JcHVibGljIE9iamVjdCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvTmF0aXZlQ29kZUJ1bmRsZVRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9OYXRpdmVDb2RlQnVuZGxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzZWZhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9OYXRpdmVDb2RlQnVuZGxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTmF0aXZlQ29kZUJ1bmRsZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShOYXRpdmVDb2RlQnVuZGxlVGVzdHMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYXRpdmVDb2RlMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIG5hdGl2ZXRlc3RBMSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJuYXRpdmV0ZXN0LmExIik7Ci0JCW5hdGl2ZXRlc3RBMS5zdGFydCgpOwotCQluYXRpdmV0ZXN0QTEuc3RvcCgpOwotCQlPYmplY3RbXSBhMVJlc3VsdHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0KLQkJaW5zdGFsbGVyLnVwZGF0ZUJ1bmRsZSgibmF0aXZldGVzdC5hMSIsICJuYXRpdmV0ZXN0LmEyIik7Ci0JCW5hdGl2ZXRlc3RBMS5zdGFydCgpOwotCQluYXRpdmV0ZXN0QTEuc3RvcCgpOwotCQlPYmplY3RbXSBhMlJlc3VsdHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIGExUmVzdWx0cy5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIjEuMSIsIGEyUmVzdWx0cy5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydE5vdE51bGwoIjEuMiIsIGExUmVzdWx0c1swXSk7Ci0JCWFzc2VydE5vdE51bGwoIjEuMyIsIGEyUmVzdWx0c1swXSk7Ci0JCWFzc2VydEZhbHNlKCIxLjQiLCBhMVJlc3VsdHNbMF0uZXF1YWxzKGEyUmVzdWx0c1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYXRpdmVDb2RlMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIG5hdGl2ZXRlc3RCMSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJuYXRpdmV0ZXN0LmIxIik7Ci0JCW5hdGl2ZXRlc3RCMS5zdGFydCgpOwotCQluYXRpdmV0ZXN0QjEuc3RvcCgpOwotCQlPYmplY3RbXSBiMVJlc3VsdHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0KLQkJaW5zdGFsbGVyLnVwZGF0ZUJ1bmRsZSgibmF0aXZldGVzdC5iMSIsICJuYXRpdmV0ZXN0LmIyIik7Ci0JCW5hdGl2ZXRlc3RCMS5zdGFydCgpOwotCQluYXRpdmV0ZXN0QjEuc3RvcCgpOwotCQlPYmplY3RbXSBiMlJlc3VsdHMgPSBzaW1wbGVSZXN1bHRzLmdldFJlc3VsdHMoMSk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIGIxUmVzdWx0cy5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIjEuMSIsIGIyUmVzdWx0cy5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydE5vdE51bGwoIjEuMiIsIGIxUmVzdWx0c1swXSk7Ci0JCWFzc2VydE5vdE51bGwoIjEuMyIsIGIyUmVzdWx0c1swXSk7Ci0JCWFzc2VydEZhbHNlKCIxLjQiLCBiMVJlc3VsdHNbMF0uZXF1YWxzKGIyUmVzdWx0c1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYXRpdmVDb2RlMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJuYXRpdmVjb2RldGVzdCIsICIxIik7Ci0JCXNldFBsYXRmb3JtUHJvcGVydGllcygpOwotCQlCdW5kbGUgbmF0aXZldGVzdEMgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgibmF0aXZldGVzdC5jIik7Ci0JCW5hdGl2ZXRlc3RDLnN0YXJ0KCk7Ci0JCW5hdGl2ZXRlc3RDLnN0b3AoKTsKLQkJT2JqZWN0W10gcmVzdWx0cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQotCQlhc3NlcnRUcnVlKCIxLjAiLCByZXN1bHRzLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCAibGlicy50ZXN0MSIsIGdldENvbnRlbnQoKFN0cmluZykgcmVzdWx0c1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYXRpdmVDb2RlMDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJuYXRpdmVjb2RldGVzdCIsICJ1bnJlc29sdmVkIik7Ci0JCXNldFBsYXRmb3JtUHJvcGVydGllcygpOwotCQlCdW5kbGUgbmF0aXZldGVzdEMgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgibmF0aXZldGVzdC5jIik7Ci0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge25hdGl2ZXRlc3RDfSk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIG5hdGl2ZXRlc3RDLmdldFN0YXRlKCkgPT0gQnVuZGxlLklOU1RBTExFRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdGl2ZUNvZGUwNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm5hdGl2ZWNvZGV0ZXN0IiwgIjIiKTsKLQkJc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZSBuYXRpdmV0ZXN0QyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJuYXRpdmV0ZXN0LmMiKTsKLQkJbmF0aXZldGVzdEMuc3RhcnQoKTsKLQkJbmF0aXZldGVzdEMuc3RvcCgpOwotCQlPYmplY3RbXSByZXN1bHRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCi0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdHMubGVuZ3RoID09IDEpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsICJsaWJzLnRlc3QzIiwgZ2V0Q29udGVudCgoU3RyaW5nKSByZXN1bHRzWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdGl2ZUNvZGUwNigpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm5hdGl2ZWNvZGV0ZXN0IiwgIjMiKTsKLQkJc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZSBuYXRpdmV0ZXN0QyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJuYXRpdmV0ZXN0LmMiKTsKLQkJbmF0aXZldGVzdEMuc3RhcnQoKTsKLQkJbmF0aXZldGVzdEMuc3RvcCgpOwotCQlPYmplY3RbXSByZXN1bHRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKDEpOwotCi0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdHMubGVuZ3RoID09IDEpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsICJsaWJzLnRlc3QyIiwgZ2V0Q29udGVudCgoU3RyaW5nKSByZXN1bHRzWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdGl2ZUNvZGUwNygpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgbmF0aXZldGVzdEMgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgibmF0aXZldGVzdC5kIik7Ci0JCW5hdGl2ZXRlc3RDLnN0YXJ0KCk7Ci0JCW5hdGl2ZXRlc3RDLnN0b3AoKTsKLQkJT2JqZWN0W10gcmVzdWx0cyA9IHNpbXBsZVJlc3VsdHMuZ2V0UmVzdWx0cygxKTsKLQotCQlhc3NlcnRUcnVlKCIxLjAiLCByZXN1bHRzLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0TnVsbCgiMS4xIiwgcmVzdWx0c1swXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdGl2ZUNvZGUwOCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm5hdGl2ZWNvZGV0ZXN0IiwgIjQiKTsKLQkJc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZSBuYXRpdmV0ZXN0QyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJuYXRpdmV0ZXN0LmMiKTsKLQkJdHJ5IHsKLQkJCW5hdGl2ZXRlc3RDLnN0YXJ0KCk7Ci0JCQlmYWlsKCJTaG91bGQgbm90IGJlIGFibGUgdG8gc3RhcnQgYnVuZGxlIHdpdGggbWlzc2luZyBuYXRpdmUgY29kZSBwYXRoIik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBleGNlcHRpb24gdHlwZSIsIEJ1bmRsZUV4Y2VwdGlvbi5OQVRJVkVDT0RFX0VSUk9SLCBlLmdldFR5cGUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDb250ZW50KFN0cmluZyBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSkpOwotCQl0cnkgewotCQkJcmV0dXJuIGJyLnJlYWRMaW5lKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlici5jbG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvUGFja2FnZUFkbWluQnVuZGxlVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1BhY2thZ2VBZG1pbkJ1bmRsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjNjMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvUGFja2FnZUFkbWluQnVuZGxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdHNBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uRXhwb3J0ZWRQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgUGFja2FnZUFkbWluQnVuZGxlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwdWJsaWMgY2xhc3MgVGVzdExpc3RlbmVyIGltcGxlbWVudHMgU3luY2hyb25vdXNCdW5kbGVMaXN0ZW5lciB7Ci0JCUFycmF5TGlzdCBldmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGJ1bmRsZUNoYW5nZWQoQnVuZGxlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50cy5hZGQoZXZlbnQpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBCdW5kbGVFdmVudFtdIGdldEV2ZW50cygpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChCdW5kbGVFdmVudFtdKSBldmVudHMudG9BcnJheShuZXcgQnVuZGxlRXZlbnRbMF0pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlldmVudHMuY2xlYXIoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBCdWcyODk3MTlMaXN0ZW5lciBpbXBsZW1lbnRzIFN5bmNocm9ub3VzQnVuZGxlTGlzdGVuZXIgewotCi0JCUFycmF5TGlzdCBleHBlY3RlZEV2ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IGZhaWx1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgaSA9IDA7Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEV4cGVjdGVkRXZlbnRzKEJ1bmRsZUV2ZW50W10gZXZlbnRzKSB7Ci0JCQlpID0gMDsKLQkJCWZhaWx1cmVzLmNsZWFyKCk7Ci0JCQlleHBlY3RlZEV2ZW50cy5jbGVhcigpOwotCQkJZXhwZWN0ZWRFdmVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZXZlbnRzKSk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYnVuZGxlQ2hhbmdlZChCdW5kbGVFdmVudCBldmVudCkgewotCQkJQnVuZGxlRXZlbnQgZXhwZWN0ZWQgPSBleHBlY3RlZEV2ZW50cy5zaXplKCkgPT0gMCA/IG51bGwgOiAoQnVuZGxlRXZlbnQpIGV4cGVjdGVkRXZlbnRzLnJlbW92ZSgwKTsKLQkJCXRyeSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJDb21wYXJlIHJlc3VsdHM6ICIgKyBpLCBleHBlY3RlZCwgZXZlbnQpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlmYWlsdXJlcy5hZGQodCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgVGhyb3dhYmxlW10gZ2V0RmFpbHVyZXMoKSB7Ci0JCQlUaHJvd2FibGVbXSByZXN1bHRzID0gKFRocm93YWJsZVtdKSBmYWlsdXJlcy50b0FycmF5KG5ldyBUaHJvd2FibGVbZmFpbHVyZXMuc2l6ZSgpXSk7Ci0JCQlzZXRFeHBlY3RlZEV2ZW50cyhuZXcgQnVuZGxlRXZlbnRbMF0pOwotCQkJcmV0dXJuIHJlc3VsdHM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFBhY2thZ2VBZG1pbkJ1bmRsZVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlRXZlbnRzMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGNoYWluVGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEMgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5jIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5kIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlW10gcmVzb2x2ZUJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2NoYWluVGVzdEMsIGNoYWluVGVzdEEsIGNoYWluVGVzdEIsIGNoYWluVGVzdCwgY2hhaW5UZXN0RH07Ci0JCUJ1bmRsZVtdIGRlcGVuZGVuY3lPcmRlciA9IG5ldyBCdW5kbGVbXSB7Y2hhaW5UZXN0LCBjaGFpblRlc3RBLCBjaGFpblRlc3RCLCBjaGFpblRlc3RDLCBjaGFpblRlc3REfTsKLQkJVGVzdExpc3RlbmVyIHRlc3RMaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKTsKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5hZGRCdW5kbGVMaXN0ZW5lcih0ZXN0TGlzdGVuZXIpOwotCQl0cnkgewotCQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKHJlc29sdmVCdW5kbGVzKTsKLQkJCUJ1bmRsZUV2ZW50W10gZXZlbnRzID0gdGVzdExpc3RlbmVyLmdldEV2ZW50cygpOwotCQkJYXNzZXJ0RXF1YWxzKCJFdmVudCBjb3VudCIsIDEwLCBldmVudHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGogPSAwOwotCQkJZm9yIChpbnQgaSA9IGRlcGVuZGVuY3lPcmRlci5sZW5ndGggLSAxOyBpID49IDA7IGktLSwgaisrKSB7Ci0JCQkJYXNzZXJ0VHJ1ZSgiUmVzb2x2ZWQgRXZlbnQgQnVuZGxlOiAiICsgZGVwZW5kZW5jeU9yZGVyW2ldLmdldFN5bWJvbGljTmFtZSgpLCBkZXBlbmRlbmN5T3JkZXJbaV0gPT0gZXZlbnRzW2pdLmdldEJ1bmRsZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFzc2VydEVxdWFscygiRXhwZWN0aW5nIFJlc29sdmVkIGV2ZW50IiwgQnVuZGxlRXZlbnQuUkVTT0xWRUQsIGV2ZW50c1tqXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlqID0gNTsKLQkJCWZvciAoaW50IGkgPSBkZXBlbmRlbmN5T3JkZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0sIGorKykgewotCQkJCWFzc2VydFRydWUoIkxhenkgU3RhcnRpbmcgQnVuZGxlOiAiICsgZGVwZW5kZW5jeU9yZGVyW2ldLmdldFN5bWJvbGljTmFtZSgpLCBkZXBlbmRlbmN5T3JkZXJbaV0gPT0gZXZlbnRzW2pdLmdldEJ1bmRsZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFzc2VydEVxdWFscygiRXhwZWN0aW5nIExhenkgU3RhcnRpbmcgZXZlbnQiLCBCdW5kbGVFdmVudC5MQVpZX0FDVElWQVRJT04sIGV2ZW50c1tqXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlbW92ZUJ1bmRsZUxpc3RlbmVyKHRlc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlRXZlbnRzMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGNoYWluVGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5hIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEMgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5jIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGNoYWluVGVzdEQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5kIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlW10gcmVzb2x2ZUJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2NoYWluVGVzdEMsIGNoYWluVGVzdEEsIGNoYWluVGVzdEIsIGNoYWluVGVzdCwgY2hhaW5UZXN0RH07Ci0JCUJ1bmRsZVtdIGRlcGVuZGVuY3lPcmRlciA9IG5ldyBCdW5kbGVbXSB7Y2hhaW5UZXN0LCBjaGFpblRlc3RBLCBjaGFpblRlc3RCLCBjaGFpblRlc3RDLCBjaGFpblRlc3REfTsKLQkJVGVzdExpc3RlbmVyIHRlc3RMaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKTsKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5hZGRCdW5kbGVMaXN0ZW5lcih0ZXN0TGlzdGVuZXIpOwotCQl0cnkgewotCQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKHJlc29sdmVCdW5kbGVzKTsKLQkJCUJ1bmRsZUV2ZW50W10gZXZlbnRzID0gdGVzdExpc3RlbmVyLmdldEV2ZW50cygpOwotCQkJLy8gdGhyb3cgYXdheSB0aGUgZXZlbnRzLiAgVGhpcyB3YXMgYWxyZWFkeSB0ZXN0ZWQKLQkJCWluc3RhbGxlci5yZWZyZXNoUGFja2FnZXMocmVzb2x2ZUJ1bmRsZXMpOwotCQkJZXZlbnRzID0gdGVzdExpc3RlbmVyLmdldEV2ZW50cygpOwotCQkJYXNzZXJ0RXF1YWxzKCJFdmVudCBjb3VudCIsIDI1LCBldmVudHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGogPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5T3JkZXIubGVuZ3RoOyBpKyssIGogKz0gMikgewotCQkJCWFzc2VydFRydWUoIlN0b3BwaW5nIEV2ZW50IEJ1bmRsZTogIiArIGRlcGVuZGVuY3lPcmRlcltpXS5nZXRTeW1ib2xpY05hbWUoKSwgZGVwZW5kZW5jeU9yZGVyW2ldID09IGV2ZW50c1tqXS5nZXRCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGluZyBTdG9wcGluZyBldmVudCIsIEJ1bmRsZUV2ZW50LlNUT1BQSU5HLCBldmVudHNbal0uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFzc2VydFRydWUoIlN0b3BwZWQgRXZlbnQgQnVuZGxlOiAiICsgZGVwZW5kZW5jeU9yZGVyW2ldLmdldFN5bWJvbGljTmFtZSgpLCBkZXBlbmRlbmN5T3JkZXJbaV0gPT0gZXZlbnRzW2ogKyAxXS5nZXRCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGluZyBTdG9wcGluZyBldmVudCIsIEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGV2ZW50c1tqICsgMV0uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaiA9IDEwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5T3JkZXIubGVuZ3RoOyBpKyssIGorKykgewotCQkJCWFzc2VydFRydWUoIlVucmVzb2x2ZWQgRXZlbnQgQnVuZGxlOiAiICsgZGVwZW5kZW5jeU9yZGVyW2ldLmdldFN5bWJvbGljTmFtZSgpLCBkZXBlbmRlbmN5T3JkZXJbaV0gPT0gZXZlbnRzW2pdLmdldEJ1bmRsZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFzc2VydEVxdWFscygiRXhwZWN0aW5nIFVucmVzb2x2ZWQgZXZlbnQiLCBCdW5kbGVFdmVudC5VTlJFU09MVkVELCBldmVudHNbal0uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaiA9IDE1OwotCQkJZm9yIChpbnQgaSA9IGRlcGVuZGVuY3lPcmRlci5sZW5ndGggLSAxOyBpID49IDA7IGktLSwgaisrKSB7Ci0JCQkJYXNzZXJ0VHJ1ZSgiUmVzb2x2ZWQgRXZlbnQgQnVuZGxlOiAiICsgZGVwZW5kZW5jeU9yZGVyW2ldLmdldFN5bWJvbGljTmFtZSgpLCBkZXBlbmRlbmN5T3JkZXJbaV0gPT0gZXZlbnRzW2pdLmdldEJ1bmRsZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFzc2VydEVxdWFscygiRXhwZWN0aW5nIFJlc29sdmVkIGV2ZW50IiwgQnVuZGxlRXZlbnQuUkVTT0xWRUQsIGV2ZW50c1tqXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlqID0gMjA7Ci0JCQlmb3IgKGludCBpID0gZGVwZW5kZW5jeU9yZGVyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tLCBqKyspIHsKLQkJCQlhc3NlcnRUcnVlKCJMYXp5IFN0YXJ0aW5nIEV2ZW50IEJ1bmRsZTogIiArIGRlcGVuZGVuY3lPcmRlcltpXS5nZXRTeW1ib2xpY05hbWUoKSwgZGVwZW5kZW5jeU9yZGVyW2ldID09IGV2ZW50c1tqXS5nZXRCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGluZyBMYXp5IFN0YXJ0aW5nIGV2ZW50IiwgQnVuZGxlRXZlbnQuTEFaWV9BQ1RJVkFUSU9OLCBldmVudHNbal0uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0gZmluYWxseSB7Ci0JCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlbW92ZUJ1bmRsZUxpc3RlbmVyKHRlc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjU5OTAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBidWcyNTk5MDNhID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QuYnVnMjU5OTAzLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYnVnMjU5OTAzYiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0LmJ1ZzI1OTkwMy5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGJ1ZzI1OTkwM2MgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdC5idWcyNTk5MDMuYyIpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2J1ZzI1OTkwM2EsIGJ1ZzI1OTkwM2IsIGJ1ZzI1OTkwM2N9KTsKLQkJCWJ1ZzI1OTkwM2Muc3RhcnQoKTsKLQkJCWJ1ZzI1OTkwM2EudW5pbnN0YWxsKCk7Ci0JCQlpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdC5idWcyNTk5MDMuYS51cGRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhuZXcgQnVuZGxlW10ge2J1ZzI1OTkwM2F9KTsKLQkJCU9iamVjdFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IE9iamVjdFtdIHtuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgYnVnMjU5OTAzYyl9OwotCQkJT2JqZWN0W10gYWN0dWFsRXZlbnRzID0gc2ltcGxlUmVzdWx0cy5nZXRSZXN1bHRzKGV4cGVjdGVkRXZlbnRzLmxlbmd0aCk7Ci0JCQljb21wYXJlUmVzdWx0cyhleHBlY3RlZEV2ZW50cywgYWN0dWFsRXZlbnRzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyODc2MzYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGJ1ZzI4NzYzNmEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdC5idWcyODc2MzYuYTEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYnVnMjg3NjM2YiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0LmJ1ZzI4NzYzNi5iIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWJ1ZzI4NzYzNmEuc3RhcnQoKTsKLQkJCWJ1ZzI4NzYzNmIuc3RhcnQoKTsKLQkJCWFzc2VydFRydWUoIkJ1bmRsZXMgYXJlIG5vdCByZXNvbHZlZCIsIGluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2J1ZzI4NzYzNmEsIGJ1ZzI4NzYzNmJ9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCUV4cG9ydGVkUGFja2FnZSBlcCA9IGluc3RhbGxlci5nZXRQYWNrYWdlQWRtaW4oKS5nZXRFeHBvcnRlZFBhY2thZ2UoInRlc3QuYnVnMjg3NjM2LmEiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGZpbmQgZXhwb3J0ZWQgcGFja2FnZSIsIGVwKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB2ZXJzaW9uIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIGVwLmdldFZlcnNpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHVwZGF0ZSBidW5kbGUgdG8gZXhwb3J0IG5ldyAxLjEuMCB2ZXJzaW9uIG9mIHRoZSBwYWNha2dlCi0JCQlTdHJpbmcgdXBkYXRlTG9jYXRpb24gPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QuYnVnMjg3NjM2LmEyIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZzI4NzYzNmEudXBkYXRlKG5ldyBVUkwodXBkYXRlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSk7Ci0JCQlidWcyODc2MzZiLnVwZGF0ZSgpOwotCQkJdXBkYXRlTG9jYXRpb24gPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QuYnVnMjg3NjM2LmExIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZzI4NzYzNmEudXBkYXRlKG5ldyBVUkwodXBkYXRlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSk7Ci0JCQlidWcyODc2MzZiLnVwZGF0ZSgpOwotCQkJdXBkYXRlTG9jYXRpb24gPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QuYnVnMjg3NjM2LmEyIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZzI4NzYzNmEudXBkYXRlKG5ldyBVUkwodXBkYXRlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSk7Ci0JCQlidWcyODc2MzZiLnVwZGF0ZSgpOwotCQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhudWxsKTsKLQkJCWVwID0gaW5zdGFsbGVyLmdldFBhY2thZ2VBZG1pbigpLmdldEV4cG9ydGVkUGFja2FnZSgidGVzdC5idWcyODc2MzYuYSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBmaW5kIGV4cG9ydGVkIHBhY2thZ2UiLCBlcCk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgdmVyc2lvbiIsIG5ldyBWZXJzaW9uKDEsIDEsIDApLCBlcC5nZXRWZXJzaW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQlFeHBvcnRlZFBhY2thZ2UgZXBzW10gPSBpbnN0YWxsZXIuZ2V0UGFja2FnZUFkbWluKCkuZ2V0RXhwb3J0ZWRQYWNrYWdlcygidGVzdC5idWcyODc2MzYuYSIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgZmluZCBleHBvcnRlZCBwYWNrYWdlIiwgZXBzKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgZXhwb3J0cyIsIDEsIGVwcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIldyb25nIHZlcnNpb24iLCBuZXcgVmVyc2lvbigxLCAxLCAwKSwgZXBzWzBdLmdldFZlcnNpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVwcyA9IGluc3RhbGxlci5nZXRQYWNrYWdlQWRtaW4oKS5nZXRFeHBvcnRlZFBhY2thZ2VzKGJ1ZzI4NzYzNmEpOwotCQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGZpbmQgZXhwb3J0ZWQgcGFja2FnZSIsIGVwcyk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGV4cG9ydHMiLCAxLCBlcHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB2ZXJzaW9uIiwgbmV3IFZlcnNpb24oMSwgMSwgMCksIGVwc1swXS5nZXRWZXJzaW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjg5NzE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBidWcyNTk5MDNhID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInRlc3QuYnVnMjU5OTAzLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYnVnMjU5OTAzYiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0LmJ1ZzI1OTkwMy5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGJ1ZzI1OTkwM2MgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgidGVzdC5idWcyNTk5MDMuYyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1ZzI4OTcxOUxpc3RlbmVyIHRlc3RMaXN0ZW5lciA9IG5ldyBCdWcyODk3MTlMaXN0ZW5lcigpOwotCi0JCXRyeSB7Ci0JCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtidWcyNTk5MDNhLCBidWcyNTk5MDNiLCBidWcyNTk5MDNjfSk7Ci0JCQlidWcyNTk5MDNhLnN0YXJ0KCk7Ci0JCQlidWcyNTk5MDNiLnN0YXJ0KCk7Ci0JCQlidWcyNTk5MDNjLnN0YXJ0KCk7Ci0JCQlpbnN0YWxsZXIuZ2V0U3RhcnRMZXZlbCgpLnNldEJ1bmRsZVN0YXJ0TGV2ZWwoYnVnMjU5OTAzYywgMik7Ci0JCQlpbnN0YWxsZXIuZ2V0U3RhcnRMZXZlbCgpLnNldEJ1bmRsZVN0YXJ0TGV2ZWwoYnVnMjU5OTAzYiwgMyk7Ci0JCQlpbnN0YWxsZXIuZ2V0U3RhcnRMZXZlbCgpLnNldEJ1bmRsZVN0YXJ0TGV2ZWwoYnVnMjU5OTAzYSwgNCk7Ci0JCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmFkZEJ1bmRsZUxpc3RlbmVyKHRlc3RMaXN0ZW5lcik7Ci0JCQlCdW5kbGVFdmVudFtdIGV4cGVjdGVkRXZlbnRzID0gbmV3IEJ1bmRsZUV2ZW50W10ge25ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUElORywgYnVnMjU5OTAzYSksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBidWcyNTk5MDNhKSwgbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQSU5HLCBidWcyNTk5MDNiKSwgbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGJ1ZzI1OTkwM2IpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBJTkcsIGJ1ZzI1OTkwM2MpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgYnVnMjU5OTAzYyksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5VTlJFU09MVkVELCBidWcyNTk5MDNhKSwgbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlVOUkVTT0xWRUQsIGJ1ZzI1OTkwM2IpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuVU5SRVNPTFZFRCwgYnVnMjU5OTAzYyksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgYnVnMjU5OTAzYyksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgYnVnMjU5OTAzYiksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgYnVnMjU5OTAzYSksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVElORywgYnVnMjU5OTAzYyksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBidWcyNTk5MDNjKSwKLQkJCQkJbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJUSU5HLCBidWcyNTk5MDNiKSwgbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGJ1ZzI1OTkwM2IpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRJTkcsIGJ1ZzI1OTkwM2EpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgYnVnMjU5OTAzYSl9OwotCQkJdGVzdExpc3RlbmVyLnNldEV4cGVjdGVkRXZlbnRzKGV4cGVjdGVkRXZlbnRzKTsKLQkJCS8vIGFkZCBhIHNtYWxsIGRlbGF5IHRvIGVuc3VyZSB0aGUgYXN5bmMgYnVuZGxlIHN0YXJ0LWxldmVsIGNoYW5nZXMgYWJvdmUgYXJlIGRvbmUgKGJ1ZyAzMDA4MjApCi0JCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCWluc3RhbGxlci5yZWZyZXNoUGFja2FnZXMobmV3IEJ1bmRsZVtdIHtidWcyNTk5MDNhfSk7Ci0JCQlUaHJvd2FibGVbXSByZXN1bHRzID0gdGVzdExpc3RlbmVyLmdldEZhaWx1cmVzKCk7Ci0JCQlpZiAocmVzdWx0cy5sZW5ndGggPiAwKQotCQkJCWZhaWwoZ2V0TWVzc2FnZShyZXN1bHRzKSk7Ci0KLQkJCWV4cGVjdGVkRXZlbnRzID0gbmV3IEJ1bmRsZUV2ZW50W10ge25ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUElORywgYnVnMjU5OTAzYyksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVE9QUEVELCBidWcyNTk5MDNjKSwgbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQSU5HLCBidWcyNTk5MDNiKSwgbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUT1BQRUQsIGJ1ZzI1OTkwM2IpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBJTkcsIGJ1ZzI1OTkwM2EpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RPUFBFRCwgYnVnMjU5OTAzYSksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5VTlJFU09MVkVELCBidWcyNTk5MDNjKSwgbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlVOUkVTT0xWRUQsIGJ1ZzI1OTkwM2IpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuVU5SRVNPTFZFRCwgYnVnMjU5OTAzYSksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgYnVnMjU5OTAzYSksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgYnVnMjU5OTAzYiksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5SRVNPTFZFRCwgYnVnMjU5OTAzYyksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVElORywgYnVnMjU5OTAzYSksIG5ldyBCdW5kbGVFdmVudChCdW5kbGVFdmVudC5TVEFSVEVELCBidWcyNTk5MDNhKSwKLQkJCQkJbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJUSU5HLCBidWcyNTk5MDNiKSwgbmV3IEJ1bmRsZUV2ZW50KEJ1bmRsZUV2ZW50LlNUQVJURUQsIGJ1ZzI1OTkwM2IpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRJTkcsIGJ1ZzI1OTkwM2MpLCBuZXcgQnVuZGxlRXZlbnQoQnVuZGxlRXZlbnQuU1RBUlRFRCwgYnVnMjU5OTAzYyl9OwotCQkJdGVzdExpc3RlbmVyLnNldEV4cGVjdGVkRXZlbnRzKGV4cGVjdGVkRXZlbnRzKTsKLQkJCWluc3RhbGxlci5nZXRTdGFydExldmVsKCkuc2V0QnVuZGxlU3RhcnRMZXZlbChidWcyNTk5MDNjLCA0KTsKLQkJCWluc3RhbGxlci5nZXRTdGFydExldmVsKCkuc2V0QnVuZGxlU3RhcnRMZXZlbChidWcyNTk5MDNiLCA0KTsKLQkJCWluc3RhbGxlci5nZXRTdGFydExldmVsKCkuc2V0QnVuZGxlU3RhcnRMZXZlbChidWcyNTk5MDNhLCA0KTsKLQkJCS8vIGFkZCBhIHNtYWxsIGRlbGF5IHRvIGVuc3VyZSB0aGUgYXN5bmMgYnVuZGxlIHN0YXJ0LWxldmVsIGNoYW5nZXMgYWJvdmUgYXJlIGRvbmUgKGJ1ZyAzMDA4MjApCi0JCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCWluc3RhbGxlci5yZWZyZXNoUGFja2FnZXMobmV3IEJ1bmRsZVtdIHtidWcyNTk5MDNhfSk7Ci0JCQlyZXN1bHRzID0gdGVzdExpc3RlbmVyLmdldEZhaWx1cmVzKCk7Ci0JCQlpZiAocmVzdWx0cy5sZW5ndGggPiAwKQotCQkJCWZhaWwoZ2V0TWVzc2FnZShyZXN1bHRzKSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVtb3ZlQnVuZGxlTGlzdGVuZXIodGVzdExpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoVGhyb3dhYmxlW10gcmVzdWx0cykgewotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKQotCQkJcmVzdWx0c1tpXS5wcmludFN0YWNrVHJhY2UocHcpOwotCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9QbGF0Zm9ybUFkbWluQnVuZGxlVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1BsYXRmb3JtQWRtaW5CdW5kbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDE2N2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1BsYXRmb3JtQWRtaW5CdW5kbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybUFkbWluQnVuZGxlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFBsYXRmb3JtQWRtaW5CdW5kbGVUZXN0cy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkSW5mbzAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXN0UG9saWN5ID0gInRlc3REaXNhYmxlZEluZm8wMSI7Ci0JCUJ1bmRsZSBjaGFpblRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdCIpOwotCQlCdW5kbGUgY2hhaW5UZXN0QSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmEiKTsKLQkJQnVuZGxlIGNoYWluVGVzdEIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5iIik7Ci0JCUJ1bmRsZSBjaGFpblRlc3RDID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuYyIpOwotCQlCdW5kbGUgY2hhaW5UZXN0RCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmQiKTsKLQkJQnVuZGxlW10gYWxsQnVuZGxlcyA9IG5ldyBCdW5kbGVbXSB7Y2hhaW5UZXN0LCBjaGFpblRlc3RBLCBjaGFpblRlc3RCLCBjaGFpblRlc3RDLCBjaGFpblRlc3REfTsKLQotCQlQbGF0Zm9ybUFkbWluIHBhID0gaW5zdGFsbGVyLmdldFBsYXRmb3JtQWRtaW4oKTsKLQkJU3RhdGUgc3lzdGVtU3RhdGUgPSBwYS5nZXRTdGF0ZShmYWxzZSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3REZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdC5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEFEZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEEuZ2V0QnVuZGxlSWQoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RCRGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3RCLmdldEJ1bmRsZUlkKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0Q0Rlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoY2hhaW5UZXN0Qy5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEREZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEQuZ2V0QnVuZGxlSWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3REZXNjIG51bGwhISIsIHRlc3REZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdEFEZXNjIG51bGwhISIsIHRlc3RBRGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3RCRGVzYyBudWxsISEiLCB0ZXN0QkRlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0Q0Rlc2MgbnVsbCEhIiwgdGVzdENEZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdEREZXNjIG51bGwhISIsIHRlc3RERGVzYyk7Ci0KLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKGFsbEJ1bmRsZXMpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0RGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3REZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RBRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RBRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0QkRlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0QkRlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdENEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdENEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RERGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RERGVzYy5pc1Jlc29sdmVkKCkpOwotCi0JCS8vIG9rIGZpbmFsbHkgd2UgY2FuIHN0YXJ0IHRlc3RpbmchISEKLQkJLy8gZGlzYWJsZSB0aGUgdG9wbGV2ZWwgdGVzdERlc2MgYnVuZGxlCi0JCXBhLmFkZERpc2FibGVkSW5mbyhuZXcgRGlzYWJsZWRJbmZvKHRlc3RQb2xpY3ksICJyZWFzb24gMSIsIHRlc3REZXNjKSk7Ci0JCS8vIGZvcmNlIHRoZSBidW5kbGVzIHRvIHJlLXJlc29sdmUKLQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhhbGxCdW5kbGVzKTsKLQkJLy8gb25seSB0ZXN0RGVzYyBzaG91bGQgYmUgdW5yZXNvbHZlZAotCQlhc3NlcnRGYWxzZSgidGVzdERlc2MgaXMgcmVzb2x2ZWQhISIsIHRlc3REZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RBRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RBRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0QkRlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0QkRlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdENEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdENEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RERGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RERGVzYy5pc1Jlc29sdmVkKCkpOwotCQkvLyBub3cgZW5hYmxlIHRoZSBidW5kbGUKLQkJRGlzYWJsZWRJbmZvIGluZm8gPSBzeXN0ZW1TdGF0ZS5nZXREaXNhYmxlZEluZm8odGVzdERlc2MsIHRlc3RQb2xpY3kpOwotCQlhc3NlcnROb3ROdWxsKCJpbmZvIGlzIG51bGwhISIsIGluZm8pOwotCQlwYS5yZW1vdmVEaXNhYmxlZEluZm8oaW5mbyk7Ci0JCS8vIGp1c3QgZG8gbm9ybWFsIHJlc29sdmUKLQkJYXNzZXJ0VHJ1ZSgicmVzb2x2ZUJ1bmRsZXMgcmV0dXJuZWQgZmFsc2UhIiwgaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7Y2hhaW5UZXN0fSkpOwotCQkvLyBhbGwgYnVuZGxlcyBzaG91bGQgYmUgcmVzb2x2ZWQKLQkJYXNzZXJ0VHJ1ZSgidGVzdERlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0RGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0QURlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0QURlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEJEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEJEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RDRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RDRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0RERlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0RERlc2MuaXNSZXNvbHZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRJbmZvMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRlc3RQb2xpY3kxID0gInRlc3REaXNhYmxlZEluZm8wMSI7Ci0JCVN0cmluZyB0ZXN0UG9saWN5MiA9ICJ0ZXN0RGlzYWJsZWRJbmZvMDIiOwotCQlCdW5kbGUgY2hhaW5UZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QiKTsKLQkJQnVuZGxlIGNoYWluVGVzdEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5hIik7Ci0JCUJ1bmRsZSBjaGFpblRlc3RCID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuYiIpOwotCQlCdW5kbGUgY2hhaW5UZXN0QyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmMiKTsKLQkJQnVuZGxlIGNoYWluVGVzdEQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5kIik7Ci0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2NoYWluVGVzdCwgY2hhaW5UZXN0QSwgY2hhaW5UZXN0QiwgY2hhaW5UZXN0QywgY2hhaW5UZXN0RH07Ci0KLQkJUGxhdGZvcm1BZG1pbiBwYSA9IGluc3RhbGxlci5nZXRQbGF0Zm9ybUFkbWluKCk7Ci0JCVN0YXRlIHN5c3RlbVN0YXRlID0gcGEuZ2V0U3RhdGUoZmFsc2UpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0RGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3QuZ2V0QnVuZGxlSWQoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RBRGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3RBLmdldEJ1bmRsZUlkKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0QkRlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoY2hhaW5UZXN0Qi5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdENEZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEMuZ2V0QnVuZGxlSWQoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RERGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3RELmdldEJ1bmRsZUlkKCkpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0RGVzYyBudWxsISEiLCB0ZXN0RGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3RBRGVzYyBudWxsISEiLCB0ZXN0QURlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0QkRlc2MgbnVsbCEhIiwgdGVzdEJEZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdENEZXNjIG51bGwhISIsIHRlc3RDRGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3RERGVzYyBudWxsISEiLCB0ZXN0RERlc2MpOwotCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhhbGxCdW5kbGVzKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdERlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0RGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0QURlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0QURlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEJEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEJEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RDRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RDRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0RERlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0RERlc2MuaXNSZXNvbHZlZCgpKTsKLQotCQkvLyBvayBmaW5hbGx5IHdlIGNhbiBzdGFydCB0ZXN0aW5nISEhCi0JCS8vIGRpc2FibGUgdGhlIHRvcGxldmVsIHRlc3REZXNjIGJ1bmRsZSB3aXRoIHR3byBEaXNhYmxlZEluZm9zCi0JCXBhLmFkZERpc2FibGVkSW5mbyhuZXcgRGlzYWJsZWRJbmZvKHRlc3RQb2xpY3kxLCAicmVhc29uIDEiLCB0ZXN0RGVzYykpOwotCQlwYS5hZGREaXNhYmxlZEluZm8obmV3IERpc2FibGVkSW5mbyh0ZXN0UG9saWN5MiwgInJlYXNvbiAyIiwgdGVzdERlc2MpKTsKLQkJLy8gZm9yY2UgdGhlIGJ1bmRsZXMgdG8gcmUtcmVzb2x2ZQotCQlpbnN0YWxsZXIucmVmcmVzaFBhY2thZ2VzKGFsbEJ1bmRsZXMpOwotCQkvLyBvbmx5IHRlc3REZXNjIHNob3VsZCBiZSB1bnJlc29sdmVkCi0JCWFzc2VydEZhbHNlKCJ0ZXN0RGVzYyBpcyByZXNvbHZlZCEhIiwgdGVzdERlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEFEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEFEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RCRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RCRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0Q0Rlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0Q0Rlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEREZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEREZXNjLmlzUmVzb2x2ZWQoKSk7Ci0KLQkJRGlzYWJsZWRJbmZvIGluZm8xID0gc3lzdGVtU3RhdGUuZ2V0RGlzYWJsZWRJbmZvKHRlc3REZXNjLCB0ZXN0UG9saWN5MSk7Ci0JCURpc2FibGVkSW5mbyBpbmZvMiA9IHN5c3RlbVN0YXRlLmdldERpc2FibGVkSW5mbyh0ZXN0RGVzYywgdGVzdFBvbGljeTIpOwotCQlhc3NlcnROb3ROdWxsKCJpbmZvMSBpcyBudWxsISEiLCBpbmZvMSk7Ci0JCWFzc2VydE5vdE51bGwoImluZm8yIGlzIG51bGwhISIsIGluZm8yKTsKLQkJLy8gbm93IHJlbW92ZSB0aGUgZmlyc3QgcG9saWN5Ci0JCXBhLnJlbW92ZURpc2FibGVkSW5mbyhpbmZvMSk7Ci0JCS8vIGp1c3QgZG8gbm9ybWFsIHJlc29sdmUKLQkJYXNzZXJ0RmFsc2UoInJlc29sdmVCdW5kbGVzIHJldHVybmVkIHRydWUhIiwgaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7Y2hhaW5UZXN0fSkpOwotCQkvLyB0ZXN0RGVzYyBzaG91bGQgc3RpbGwgYmUgdW5yZXNvbHZlZAotCQlhc3NlcnRGYWxzZSgidGVzdERlc2MgaXMgcmVzb2x2ZWQhISIsIHRlc3REZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RBRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RBRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0QkRlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0QkRlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdENEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdENEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RERGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RERGVzYy5pc1Jlc29sdmVkKCkpOwotCi0JCS8vIG5vdyByZW1vdmUgdGhlIHNlY29uZCBwb2xpY3kKLQkJcGEucmVtb3ZlRGlzYWJsZWRJbmZvKGluZm8yKTsKLQkJLy8ganVzdCBkbyBub3JtYWwgcmVzb2x2ZQotCQlhc3NlcnRUcnVlKCJyZXNvbHZlQnVuZGxlcyByZXR1cm5lZCBmYWxzZSEiLCBpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtjaGFpblRlc3R9KSk7Ci0JCS8vIHRlc3REZXNjIHNob3VsZCBzdGlsbCBiZSB1bnJlc29sdmVkCi0JCWFzc2VydFRydWUoInRlc3REZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdERlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEFEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEFEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RCRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RCRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0Q0Rlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0Q0Rlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEREZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEREZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkSW5mbzAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXN0UG9saWN5MSA9ICJ0ZXN0RGlzYWJsZWRJbmZvMDEiOwotCQlTdHJpbmcgdGVzdFBvbGljeTIgPSAidGVzdERpc2FibGVkSW5mbzAyIjsKLQkJQnVuZGxlIGNoYWluVGVzdCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0Iik7Ci0JCUJ1bmRsZSBjaGFpblRlc3RBID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuYSIpOwotCQlCdW5kbGUgY2hhaW5UZXN0QiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmIiKTsKLQkJQnVuZGxlIGNoYWluVGVzdEMgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5jIik7Ci0JCUJ1bmRsZSBjaGFpblRlc3REID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuZCIpOwotCQlCdW5kbGVbXSBhbGxCdW5kbGVzID0gbmV3IEJ1bmRsZVtdIHtjaGFpblRlc3QsIGNoYWluVGVzdEEsIGNoYWluVGVzdEIsIGNoYWluVGVzdEMsIGNoYWluVGVzdER9OwotCi0JCVBsYXRmb3JtQWRtaW4gcGEgPSBpbnN0YWxsZXIuZ2V0UGxhdGZvcm1BZG1pbigpOwotCQlTdGF0ZSBzeXN0ZW1TdGF0ZSA9IHBhLmdldFN0YXRlKGZhbHNlKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdERlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoY2hhaW5UZXN0LmdldEJ1bmRsZUlkKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0QURlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoY2hhaW5UZXN0QS5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEJEZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEIuZ2V0QnVuZGxlSWQoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RDRGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3RDLmdldEJ1bmRsZUlkKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0RERlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoY2hhaW5UZXN0RC5nZXRCdW5kbGVJZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdERlc2MgbnVsbCEhIiwgdGVzdERlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0QURlc2MgbnVsbCEhIiwgdGVzdEFEZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdEJEZXNjIG51bGwhISIsIHRlc3RCRGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3RDRGVzYyBudWxsISEiLCB0ZXN0Q0Rlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0RERlc2MgbnVsbCEhIiwgdGVzdEREZXNjKTsKLQotCQlpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMoYWxsQnVuZGxlcyk7Ci0JCWFzc2VydFRydWUoInRlc3REZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdERlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEFEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEFEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RCRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RCRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0Q0Rlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0Q0Rlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEREZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEREZXNjLmlzUmVzb2x2ZWQoKSk7Ci0KLQkJLy8gb2sgZmluYWxseSB3ZSBjYW4gc3RhcnQgdGVzdGluZyEhIQotCQkvLyBkaXNhYmxlIHRoZSB0b3BsZXZlbCB0ZXN0RGVzYyBidW5kbGUKLQkJcGEuYWRkRGlzYWJsZWRJbmZvKG5ldyBEaXNhYmxlZEluZm8odGVzdFBvbGljeTEsICJyZWFzb24gMSIsIHRlc3REZXNjKSk7Ci0JCXBhLmFkZERpc2FibGVkSW5mbyhuZXcgRGlzYWJsZWRJbmZvKHRlc3RQb2xpY3kyLCAicmVhc29uIDIiLCB0ZXN0RGVzYykpOwotCQkvLyBmb3JjZSB0aGUgYnVuZGxlcyB0byByZS1yZXNvbHZlCi0JCWluc3RhbGxlci5yZWZyZXNoUGFja2FnZXMoYWxsQnVuZGxlcyk7Ci0JCS8vIG9ubHkgdGVzdERlc2Mgc2hvdWxkIGJlIHVucmVzb2x2ZWQKLQkJYXNzZXJ0RmFsc2UoInRlc3REZXNjIGlzIHJlc29sdmVkISEiLCB0ZXN0RGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0QURlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0QURlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEJEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEJEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RDRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RDRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0RERlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0RERlc2MuaXNSZXNvbHZlZCgpKTsKLQotCQlSZXNvbHZlckVycm9yW10gZXJyb3JzID0gc3lzdGVtU3RhdGUuZ2V0UmVzb2x2ZXJFcnJvcnModGVzdERlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJyZXNvbHZlciBlcnJvcnMgaXMgbnVsbCEhIiwgZXJyb3JzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG51bWJlciBvZiBlcnJvcnMiLCAxLCBlcnJvcnMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yIHR5cGUiLCBSZXNvbHZlckVycm9yLkRJU0FCTEVEX0JVTkRMRSwgZXJyb3JzWzBdLmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkSW5mbzA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXN0UG9saWN5MSA9ICJ0ZXN0RGlzYWJsZWRJbmZvMDEiOwotCQlCdW5kbGUgY2hhaW5UZXN0ID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QiKTsKLQkJQnVuZGxlIGNoYWluVGVzdEEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5hIik7Ci0JCUJ1bmRsZSBjaGFpblRlc3RCID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuYiIpOwotCQlCdW5kbGUgY2hhaW5UZXN0QyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmMiKTsKLQkJQnVuZGxlIGNoYWluVGVzdEQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5kIik7Ci0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2NoYWluVGVzdCwgY2hhaW5UZXN0QSwgY2hhaW5UZXN0QiwgY2hhaW5UZXN0QywgY2hhaW5UZXN0RH07Ci0KLQkJUGxhdGZvcm1BZG1pbiBwYSA9IGluc3RhbGxlci5nZXRQbGF0Zm9ybUFkbWluKCk7Ci0JCVN0YXRlIHN5c3RlbVN0YXRlID0gcGEuZ2V0U3RhdGUoZmFsc2UpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0RGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3QuZ2V0QnVuZGxlSWQoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RBRGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3RBLmdldEJ1bmRsZUlkKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0QkRlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoY2hhaW5UZXN0Qi5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdENEZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEMuZ2V0QnVuZGxlSWQoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RERGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3RELmdldEJ1bmRsZUlkKCkpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0RGVzYyBudWxsISEiLCB0ZXN0RGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3RBRGVzYyBudWxsISEiLCB0ZXN0QURlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0QkRlc2MgbnVsbCEhIiwgdGVzdEJEZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdENEZXNjIG51bGwhISIsIHRlc3RDRGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3RERGVzYyBudWxsISEiLCB0ZXN0RERlc2MpOwotCi0JCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhhbGxCdW5kbGVzKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdERlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0RGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0QURlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0QURlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEJEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEJEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RDRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RDRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0RERlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0RERlc2MuaXNSZXNvbHZlZCgpKTsKLQotCQkvLyBvayBmaW5hbGx5IHdlIGNhbiBzdGFydCB0ZXN0aW5nISEhCi0JCS8vIGRpc2FibGUgdGhlIGJvdHRvbSBsZXZlbCBidW5kbGUsIHRoaXMgc2hvdWxkIGNhdXNlIGFsbCBidW5kbGVzIHRvIGJlIHVucmVzb2x2ZWQKLQkJcGEuYWRkRGlzYWJsZWRJbmZvKG5ldyBEaXNhYmxlZEluZm8odGVzdFBvbGljeTEsICJyZWFzb24gMSIsIHRlc3RERGVzYykpOwotCQkvLyBmb3JjZSB0aGUgYnVuZGxlcyB0byByZS1yZXNvbHZlCi0JCWluc3RhbGxlci5yZWZyZXNoUGFja2FnZXMoYWxsQnVuZGxlcyk7Ci0JCS8vIG9ubHkgdGVzdERlc2Mgc2hvdWxkIGJlIHVucmVzb2x2ZWQKLQkJYXNzZXJ0RmFsc2UoInRlc3REZXNjIGlzIHJlc29sdmVkISEiLCB0ZXN0RGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRGYWxzZSgidGVzdEFEZXNjIGlzIHJlc29sdmVkISEiLCB0ZXN0QURlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RmFsc2UoInRlc3RCRGVzYyBpcyByZXNvbHZlZCEhIiwgdGVzdEJEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKCJ0ZXN0Q0Rlc2MgaXMgcmVzb2x2ZWQhISIsIHRlc3RDRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRGYWxzZSgidGVzdEREZXNjIGlzIHJlc29sdmVkISEiLCB0ZXN0RERlc2MuaXNSZXNvbHZlZCgpKTsKLQotCQkvLyBjaGVjayB0aGF0IHRoZSByZXNvbHZlciBlcnJvcnMgYXJlIHRoZSBjb3JyZWN0IHR5cGUKLQkJUmVzb2x2ZXJFcnJvcltdIGVycm9ycyA9IHN5c3RlbVN0YXRlLmdldFJlc29sdmVyRXJyb3JzKHRlc3RERGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInJlc29sdmVyIGVycm9ycyBpcyBudWxsISEiLCBlcnJvcnMpOwotCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbnVtYmVyIG9mIGVycm9ycyIsIDEsIGVycm9ycy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3IgdHlwZSIsIFJlc29sdmVyRXJyb3IuRElTQUJMRURfQlVORExFLCBlcnJvcnNbMF0uZ2V0VHlwZSgpKTsKLQotCQkvLyBhbGwgb3RoZXIgZXJyb3JzIHNob3VsZCBiZSBtaXNzaW5nIGltcG9ydCBlcnJvcnMKLQkJZXJyb3JzID0gc3lzdGVtU3RhdGUuZ2V0UmVzb2x2ZXJFcnJvcnModGVzdERlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJyZXNvbHZlciBlcnJvcnMgaXMgbnVsbCEhIiwgZXJyb3JzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG51bWJlciBvZiBlcnJvcnMiLCAxLCBlcnJvcnMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yIHR5cGUiLCBSZXNvbHZlckVycm9yLk1JU1NJTkdfSU1QT1JUX1BBQ0tBR0UsIGVycm9yc1swXS5nZXRUeXBlKCkpOwotCi0JCWVycm9ycyA9IHN5c3RlbVN0YXRlLmdldFJlc29sdmVyRXJyb3JzKHRlc3RBRGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInJlc29sdmVyIGVycm9ycyBpcyBudWxsISEiLCBlcnJvcnMpOwotCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbnVtYmVyIG9mIGVycm9ycyIsIDEsIGVycm9ycy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3IgdHlwZSIsIFJlc29sdmVyRXJyb3IuTUlTU0lOR19JTVBPUlRfUEFDS0FHRSwgZXJyb3JzWzBdLmdldFR5cGUoKSk7Ci0KLQkJZXJyb3JzID0gc3lzdGVtU3RhdGUuZ2V0UmVzb2x2ZXJFcnJvcnModGVzdEJEZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgicmVzb2x2ZXIgZXJyb3JzIGlzIG51bGwhISIsIGVycm9ycyk7Ci0JCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBudW1iZXIgb2YgZXJyb3JzIiwgMSwgZXJyb3JzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvciB0eXBlIiwgUmVzb2x2ZXJFcnJvci5NSVNTSU5HX0lNUE9SVF9QQUNLQUdFLCBlcnJvcnNbMF0uZ2V0VHlwZSgpKTsKLQotCQllcnJvcnMgPSBzeXN0ZW1TdGF0ZS5nZXRSZXNvbHZlckVycm9ycyh0ZXN0Q0Rlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJyZXNvbHZlciBlcnJvcnMgaXMgbnVsbCEhIiwgZXJyb3JzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG51bWJlciBvZiBlcnJvcnMiLCAxLCBlcnJvcnMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yIHR5cGUiLCBSZXNvbHZlckVycm9yLk1JU1NJTkdfSU1QT1JUX1BBQ0tBR0UsIGVycm9yc1swXS5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEluZm8wNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdGVzdFBvbGljeTEgPSAidGVzdERpc2FibGVkSW5mbzAxIjsKLQkJU3RyaW5nIHRlc3RQb2xpY3kyID0gInRlc3REaXNhYmxlZEluZm8wMiI7Ci0JCUJ1bmRsZSBjaGFpblRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdCIpOwotCQlCdW5kbGUgY2hhaW5UZXN0QSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmEiKTsKLQkJQnVuZGxlIGNoYWluVGVzdEIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5iIik7Ci0JCUJ1bmRsZSBjaGFpblRlc3RDID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuYyIpOwotCQlCdW5kbGUgY2hhaW5UZXN0RCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmQiKTsKLQkJQnVuZGxlW10gYWxsQnVuZGxlcyA9IG5ldyBCdW5kbGVbXSB7Y2hhaW5UZXN0LCBjaGFpblRlc3RBLCBjaGFpblRlc3RCLCBjaGFpblRlc3RDLCBjaGFpblRlc3REfTsKLQotCQlQbGF0Zm9ybUFkbWluIHBhID0gaW5zdGFsbGVyLmdldFBsYXRmb3JtQWRtaW4oKTsKLQkJU3RhdGUgc3lzdGVtU3RhdGUgPSBwYS5nZXRTdGF0ZShmYWxzZSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3REZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdC5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEFEZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEEuZ2V0QnVuZGxlSWQoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RCRGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3RCLmdldEJ1bmRsZUlkKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0Q0Rlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoY2hhaW5UZXN0Qy5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEREZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEQuZ2V0QnVuZGxlSWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3REZXNjIG51bGwhISIsIHRlc3REZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdEFEZXNjIG51bGwhISIsIHRlc3RBRGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3RCRGVzYyBudWxsISEiLCB0ZXN0QkRlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0Q0Rlc2MgbnVsbCEhIiwgdGVzdENEZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdEREZXNjIG51bGwhISIsIHRlc3RERGVzYyk7Ci0KLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKGFsbEJ1bmRsZXMpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0RGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3REZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RBRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RBRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0QkRlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0QkRlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdENEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdENEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RERGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RERGVzYy5pc1Jlc29sdmVkKCkpOwotCi0JCS8vIG9rIGZpbmFsbHkgd2UgY2FuIHN0YXJ0IHRlc3RpbmchISEKLQkJLy8gYWRkIG1hbnkgZGlzYWJsZWQgaW5mb3MgdG8gdGVzdCB0aGUgZ2V0RGlzYWJsZWRJbmZvIG1ldGhvZHMKLQkJRGlzYWJsZWRJbmZvIGluZm8xID0gbmV3IERpc2FibGVkSW5mbyh0ZXN0UG9saWN5MSwgInJlYXNvbiAxIiwgdGVzdERlc2MpOwotCQlEaXNhYmxlZEluZm8gaW5mbzIgPSBuZXcgRGlzYWJsZWRJbmZvKHRlc3RQb2xpY3kyLCAicmVhc29uIDIiLCB0ZXN0RGVzYyk7Ci0JCURpc2FibGVkSW5mbyBpbmZvMyA9IG5ldyBEaXNhYmxlZEluZm8odGVzdFBvbGljeTEsICJyZWFzb24gMyIsIHRlc3RERGVzYyk7Ci0JCURpc2FibGVkSW5mbyBpbmZvNCA9IG5ldyBEaXNhYmxlZEluZm8odGVzdFBvbGljeTIsICJyZWFzb24gNCIsIHRlc3RERGVzYyk7Ci0JCXBhLmFkZERpc2FibGVkSW5mbyhpbmZvMSk7Ci0JCXBhLmFkZERpc2FibGVkSW5mbyhpbmZvMik7Ci0JCXBhLmFkZERpc2FibGVkSW5mbyhpbmZvMyk7Ci0JCXBhLmFkZERpc2FibGVkSW5mbyhpbmZvNCk7Ci0JCS8vIGZvcmNlIHRoZSBidW5kbGVzIHRvIHJlLXJlc29sdmUKLQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhhbGxCdW5kbGVzKTsKLQotCQkvLyBjaGVjayB0aGUgZXJyb3JzIG9ubHksIHJlc29sdXRpb24gd2FzIGNoZWNrZWQgaW4gb3RoZXIgdGVzdHMKLQkJUmVzb2x2ZXJFcnJvcltdIGVycm9ycyA9IHN5c3RlbVN0YXRlLmdldFJlc29sdmVyRXJyb3JzKHRlc3REZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgicmVzb2x2ZXIgZXJyb3JzIGlzIG51bGwhISIsIGVycm9ycyk7Ci0JCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBudW1iZXIgb2YgZXJyb3JzIiwgMSwgZXJyb3JzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvciB0eXBlIiwgUmVzb2x2ZXJFcnJvci5ESVNBQkxFRF9CVU5ETEUsIGVycm9yc1swXS5nZXRUeXBlKCkpOwotCi0JCWVycm9ycyA9IHN5c3RlbVN0YXRlLmdldFJlc29sdmVyRXJyb3JzKHRlc3RERGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInJlc29sdmVyIGVycm9ycyBpcyBudWxsISEiLCBlcnJvcnMpOwotCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbnVtYmVyIG9mIGVycm9ycyIsIDEsIGVycm9ycy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3IgdHlwZSIsIFJlc29sdmVyRXJyb3IuRElTQUJMRURfQlVORExFLCBlcnJvcnNbMF0uZ2V0VHlwZSgpKTsKLQotCQlEaXNhYmxlZEluZm8gZ2V0SW5mbzEgPSBzeXN0ZW1TdGF0ZS5nZXREaXNhYmxlZEluZm8odGVzdERlc2MsIHRlc3RQb2xpY3kxKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbmZvMSBub3QgZXF1YWwhIiwgaW5mbzEsIGdldEluZm8xKTsKLQkJRGlzYWJsZWRJbmZvIGdldEluZm8yID0gc3lzdGVtU3RhdGUuZ2V0RGlzYWJsZWRJbmZvKHRlc3REZXNjLCB0ZXN0UG9saWN5Mik7Ci0JCWFzc2VydEVxdWFscygiaW5mbzIgbm90IGVxdWFsISIsIGluZm8yLCBnZXRJbmZvMik7Ci0JCURpc2FibGVkSW5mbyBnZXRJbmZvMyA9IHN5c3RlbVN0YXRlLmdldERpc2FibGVkSW5mbyh0ZXN0RERlc2MsIHRlc3RQb2xpY3kxKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbmZvMyBub3QgZXF1YWwhIiwgaW5mbzMsIGdldEluZm8zKTsKLQkJRGlzYWJsZWRJbmZvIGdldEluZm80ID0gc3lzdGVtU3RhdGUuZ2V0RGlzYWJsZWRJbmZvKHRlc3RERGVzYywgdGVzdFBvbGljeTIpOwotCQlhc3NlcnRFcXVhbHMoImluZm80IG5vdCBlcXVhbCEiLCBpbmZvNCwgZ2V0SW5mbzQpOwotCi0JCURpc2FibGVkSW5mb1tdIGluZm9zMSA9IHN5c3RlbVN0YXRlLmdldERpc2FibGVkSW5mb3ModGVzdERlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJpbmZvczEgaXMgbnVsbCEhIiwgaW5mb3MxKTsKLQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGluZm8xIHNpemUiLCAyLCBpbmZvczEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgiaW5mbzEgbm90IGZvdW5kIiwgaW5mb3MxWzBdID09IGluZm8xIHx8IGluZm9zMVsxXSA9PSBpbmZvMSk7Ci0JCWFzc2VydFRydWUoImluZm8yIG5vdCBmb3VuZCIsIGluZm9zMVswXSA9PSBpbmZvMiB8fCBpbmZvczFbMV0gPT0gaW5mbzIpOwotCQlEaXNhYmxlZEluZm9bXSBpbmZvczIgPSBzeXN0ZW1TdGF0ZS5nZXREaXNhYmxlZEluZm9zKHRlc3RERGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoImluZm9zMiBpcyBudWxsISEiLCBpbmZvczIpOwotCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgaW5mbzIgc2l6ZSIsIDIsIGluZm9zMi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJpbmZvMyBub3QgZm91bmQiLCBpbmZvczJbMF0gPT0gaW5mbzMgfHwgaW5mb3MyWzFdID09IGluZm8zKTsKLQkJYXNzZXJ0VHJ1ZSgiaW5mbzQgbm90IGZvdW5kIiwgaW5mb3MyWzBdID09IGluZm80IHx8IGluZm9zMlsxXSA9PSBpbmZvNCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkSW5mbzA2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXN0UG9saWN5ID0gInRlc3REaXNhYmxlZEluZm8wMSI7Ci0JCUJ1bmRsZSBjaGFpblRlc3QgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdCIpOwotCQlCdW5kbGUgY2hhaW5UZXN0QSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmEiKTsKLQkJQnVuZGxlIGNoYWluVGVzdEIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5iIik7Ci0JCUJ1bmRsZSBjaGFpblRlc3RDID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuYyIpOwotCQlCdW5kbGUgY2hhaW5UZXN0RCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmQiKTsKLQkJQnVuZGxlW10gYWxsQnVuZGxlcyA9IG5ldyBCdW5kbGVbXSB7Y2hhaW5UZXN0LCBjaGFpblRlc3RBLCBjaGFpblRlc3RCLCBjaGFpblRlc3RDLCBjaGFpblRlc3REfTsKLQotCQlQbGF0Zm9ybUFkbWluIHBhID0gaW5zdGFsbGVyLmdldFBsYXRmb3JtQWRtaW4oKTsKLQkJU3RhdGUgc3lzdGVtU3RhdGUgPSBwYS5nZXRTdGF0ZShmYWxzZSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3REZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdC5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEFEZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEEuZ2V0QnVuZGxlSWQoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RCRGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3RCLmdldEJ1bmRsZUlkKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0Q0Rlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoY2hhaW5UZXN0Qy5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEREZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEQuZ2V0QnVuZGxlSWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3REZXNjIG51bGwhISIsIHRlc3REZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdEFEZXNjIG51bGwhISIsIHRlc3RBRGVzYyk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3RCRGVzYyBudWxsISEiLCB0ZXN0QkRlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0Q0Rlc2MgbnVsbCEhIiwgdGVzdENEZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdEREZXNjIG51bGwhISIsIHRlc3RERGVzYyk7Ci0KLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKGFsbEJ1bmRsZXMpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0RGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3REZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RBRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RBRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0QkRlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0QkRlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdENEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdENEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RERGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RERGVzYy5pc1Jlc29sdmVkKCkpOwotCi0JCS8vIG9rIGZpbmFsbHkgd2UgY2FuIHN0YXJ0IHRlc3RpbmchISEKLQkJLy8gZGlzYWJsZSB0aGUgdG9wbGV2ZWwgdGVzdERlc2MgYnVuZGxlCi0JCURpc2FibGVkSW5mbyBpbmZvID0gbmV3IERpc2FibGVkSW5mbyh0ZXN0UG9saWN5LCAicmVhc29uIDEiLCB0ZXN0RGVzYyk7Ci0JCXBhLmFkZERpc2FibGVkSW5mbyhpbmZvKTsKLQkJLy8gZm9yY2UgdGhlIGJ1bmRsZXMgdG8gcmUtcmVzb2x2ZQotCQlpbnN0YWxsZXIucmVmcmVzaFBhY2thZ2VzKGFsbEJ1bmRsZXMpOwotCQkvLyBvbmx5IHRlc3REZXNjIHNob3VsZCBiZSB1bnJlc29sdmVkCi0JCWFzc2VydEZhbHNlKCJ0ZXN0RGVzYyBpcyByZXNvbHZlZCEhIiwgdGVzdERlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEFEZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEFEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInRlc3RCRGVzYyBub3QgcmVzb2x2ZWQhISIsIHRlc3RCRGVzYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZXN0Q0Rlc2Mgbm90IHJlc29sdmVkISEiLCB0ZXN0Q0Rlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVzdEREZXNjIG5vdCByZXNvbHZlZCEhIiwgdGVzdEREZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCS8vIHVuaW5zdGFsbCB0aGUgYnVuZGxlIHRlc3REZXNjCi0JCUJ1bmRsZSB1bmluc3RhbGxlZENoYWluVGVzdCA9IGluc3RhbGxlci51bmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QiKTsKLQkJYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCB1bmluc3RhbGwgcmVzdWx0IiwgdW5pbnN0YWxsZWRDaGFpblRlc3QgPT0gY2hhaW5UZXN0KTsKLQotCQkvLyBub3cgdHJ5IHRvIGdldCB0aGUgRGlzYWJsZWRJbmZvCi0JCURpc2FibGVkSW5mbyBnZXRJbmZvID0gc3lzdGVtU3RhdGUuZ2V0RGlzYWJsZWRJbmZvKHRlc3REZXNjLCB0ZXN0UG9saWN5KTsKLQkJYXNzZXJ0TnVsbCgiaW5mbyBpcyBub3QgbnVsbCEhIiwgZ2V0SW5mbyk7Ci0JCS8vIHRyeSB0byBhZGQgdGhlIGluZm8gYWdhaW4uICBUaGlzIHNob3VsZCBmYWlsCi0JCXRyeSB7Ci0JCQlwYS5hZGREaXNhYmxlZEluZm8oaW5mbyk7Ci0JCQlwYS5yZW1vdmVEaXNhYmxlZEluZm8oaW5mbyk7Ci0JCQlmYWlsKCJzaG91bGQgbm90IGJlIGFibGUgdG8gYWRkIGEgRGlzYWJsZWRJbmZvIGZvciBhIGJ1bmRsZSBub3QgaW4gdGhlIHN0YXRlIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVucmVzb2x2ZWRMZWF2ZXMwMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlCdW5kbGUgY2hhaW5UZXN0QSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJjaGFpbi50ZXN0LmEiKTsKLQkJQnVuZGxlIGNoYWluVGVzdEIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgiY2hhaW4udGVzdC5iIik7Ci0JCUJ1bmRsZSBjaGFpblRlc3RDID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImNoYWluLnRlc3QuYyIpOwotCQlCdW5kbGVbXSBhbGxCdW5kbGVzID0gbmV3IEJ1bmRsZVtdIHtjaGFpblRlc3RBLCBjaGFpblRlc3RCLCBjaGFpblRlc3RDfTsKLQotCQlQbGF0Zm9ybUFkbWluIHBhID0gaW5zdGFsbGVyLmdldFBsYXRmb3JtQWRtaW4oKTsKLQkJU3RhdGUgc3lzdGVtU3RhdGUgPSBwYS5nZXRTdGF0ZShmYWxzZSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RBRGVzYyA9IHN5c3RlbVN0YXRlLmdldEJ1bmRsZShjaGFpblRlc3RBLmdldEJ1bmRsZUlkKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0QkRlc2MgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoY2hhaW5UZXN0Qi5nZXRCdW5kbGVJZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdENEZXNjID0gc3lzdGVtU3RhdGUuZ2V0QnVuZGxlKGNoYWluVGVzdEMuZ2V0QnVuZGxlSWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoInRlc3RBRGVzYyBudWxsISEiLCB0ZXN0QURlc2MpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0QkRlc2MgbnVsbCEhIiwgdGVzdEJEZXNjKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGVzdENEZXNjIG51bGwhISIsIHRlc3RDRGVzYyk7Ci0KLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKGFsbEJ1bmRsZXMpOwotCQlhc3NlcnRGYWxzZSgidGVzdEFEZXNjIGlzIHJlc29sdmVkISEiLCB0ZXN0QURlc2MuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RmFsc2UoInRlc3RCRGVzYyBpcyByZXNvbHZlZCEhIiwgdGVzdEJEZXNjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKCJ0ZXN0Q0Rlc2MgaXMgcmVzb2x2ZWQhISIsIHRlc3RDRGVzYy5pc1Jlc29sdmVkKCkpOwotCi0JCS8vIG9rIGZpbmFsbHkgd2UgY2FuIHN0YXJ0IHRlc3RpbmchIQotCQlWZXJzaW9uQ29uc3RyYWludFtdIHVuc2F0aWZpZWRMZWF2ZXMgPSBwYS5nZXRTdGF0ZUhlbHBlcigpLmdldFVuc2F0aXNmaWVkTGVhdmVzKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHt0ZXN0QURlc2N9KTsKLQkJYXNzZXJ0Tm90TnVsbCgiVW5zYXRpZmllZCBjb25zdHJhaW50cyBpcyBudWxsISEiLCB1bnNhdGlmaWVkTGVhdmVzKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uc3RyYWludHMhISIsIDIsIHVuc2F0aWZpZWRMZWF2ZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bnNhdGlmaWVkTGVhdmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRUcnVlKCJDb25zdHJhaW50IHR5cGUgaXMgbm90IGltcG9ydCBwYWNrYWdlOiAiICsgdW5zYXRpZmllZExlYXZlc1tpXSwgdW5zYXRpZmllZExlYXZlc1tpXSBpbnN0YW5jZW9mIEltcG9ydFBhY2thZ2VTcGVjaWZpY2F0aW9uKTsKLQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBuYW1lIGlzIHdyb25nOiAiICsgaSwgImNoYWluLnRlc3QuZCIsIHVuc2F0aWZpZWRMZWF2ZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCWlmICh1bnNhdGlmaWVkTGVhdmVzW2ldLmdldEJ1bmRsZSgpICE9IHRlc3RCRGVzYyAmJiB1bnNhdGlmaWVkTGVhdmVzW2ldLmdldEJ1bmRsZSgpICE9IHRlc3RDRGVzYykKLQkJCQlmYWlsKCJXcm9uZyBidW5kbGUgZm9yIHRoZSBjb25zdHJhaW50OiAiICsgdW5zYXRpZmllZExlYXZlc1tpXS5nZXRCdW5kbGUoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1N1YnN0aXR1dGVFeHBvcnRzQnVuZGxlVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1N1YnN0aXR1dGVFeHBvcnRzQnVuZGxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyNmNlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9TdWJzdGl0dXRlRXhwb3J0c0J1bmRsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLkV4cG9ydGVkUGFja2FnZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47Ci0KLXB1YmxpYyBjbGFzcyBTdWJzdGl0dXRlRXhwb3J0c0J1bmRsZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTdWJzdGl0dXRlRXhwb3J0c0J1bmRsZVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0ZUV4cG9ydHMwMXgoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBiID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5jIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuZCIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9ICJzdWJzdGl0dXRlcy54LkF4IjsgLy8kTk9OLU5MUy0xJAotCQlDbGFzcyBheCA9IG51bGw7Ci0JCUNsYXNzIGJ4ID0gbnVsbDsKLQkJQ2xhc3MgY3ggPSBudWxsOwotCQlDbGFzcyBkeCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlheCA9IGEubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQlieCA9IGIubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQljeCA9IGMubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQlkeCA9IGQubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiY2xhc3MgZnJvbSBiIGlzIHdyb25nIiwgYXgsIGJ4KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gYyBpcyB3cm9uZyIsIGF4LCBjeCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGQgaXMgd3JvbmciLCBheCwgZHgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGVFeHBvcnRzMDF5KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBhID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGMgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuYyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBkID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBjbGFzc05hbWUgPSAic3Vic3RpdHV0ZXMueS5BeSI7IC8vJE5PTi1OTFMtMSQKLQkJQ2xhc3MgYXggPSBudWxsOwotCQlDbGFzcyBieCA9IG51bGw7Ci0JCUNsYXNzIGN4ID0gbnVsbDsKLQkJQ2xhc3MgZHggPSBudWxsOwotCQl0cnkgewotCQkJYXggPSBhLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJYnggPSBiLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJY3ggPSBjLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJZHggPSBkLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gYiBpcyB3cm9uZyIsIGF4LCBieCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGMgaXMgd3JvbmciLCBheCwgY3gpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgZnJvbSBkIGlzIHdyb25nIiwgYXgsIGR4KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRlRXhwb3J0czAyKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBhID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmYiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBjbGFzc05hbWUgPSAic3Vic3RpdHV0ZXMueC5BeCI7IC8vJE5PTi1OTFMtMSQKLQkJQ2xhc3MgYXggPSBudWxsOwotCQlDbGFzcyBieCA9IG51bGw7Ci0JCUNsYXNzIGV4ID0gbnVsbDsKLQkJQ2xhc3MgZnggPSBudWxsOwotCQl0cnkgewotCQkJYXggPSBhLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJYnggPSBiLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJZXggPSBlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJZnggPSBmLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgY25mZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gYiBpcyB3cm9uZyIsIGF4LCBieCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGMgaXMgd3JvbmciLCBheCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgZnJvbSBkIGlzIHdyb25nIiwgYXgsIGZ4KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRlRXhwb3J0czAzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBhID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmYiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgZyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5nIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGggPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuaCIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9ICJzdWJzdGl0dXRlcy54LkF4IjsgLy8kTk9OLU5MUy0xJAotCQlDbGFzcyBheCA9IG51bGw7Ci0JCUNsYXNzIGJ4ID0gbnVsbDsKLQkJQ2xhc3MgZXggPSBudWxsOwotCQlDbGFzcyBmeCA9IG51bGw7Ci0JCUNsYXNzIGd4ID0gbnVsbDsKLQkJQ2xhc3MgaHggPSBudWxsOwotCQl0cnkgewotCQkJYXggPSBhLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJYnggPSBiLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJZXggPSBlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJZnggPSBmLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJZ3ggPSBnLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJaHggPSBoLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgY25mZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gYiBpcyB3cm9uZyIsIGF4LCBieCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGMgaXMgd3JvbmciLCBheCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgZnJvbSBkIGlzIHdyb25nIiwgYXgsIGZ4KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gZCBpcyB3cm9uZyIsIGF4LCBneCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGQgaXMgd3JvbmciLCBheCwgaHgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGVFeHBvcnRzMDQoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuYSIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5hLmZyYWciKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5iIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmIuZnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBjID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmMiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgZCA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5kIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgY2xhc3NOYW1lID0gInN1YnN0aXR1dGVzLnguQXgiOyAvLyROT04tTkxTLTEkCi0JCUNsYXNzIGF4ID0gbnVsbDsKLQkJQ2xhc3MgYnggPSBudWxsOwotCQlDbGFzcyBjeCA9IG51bGw7Ci0JCUNsYXNzIGR4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWF4ID0gYS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCWJ4ID0gYi5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCWN4ID0gYy5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCWR4ID0gZC5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGIgaXMgd3JvbmciLCBheCwgYngpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgZnJvbSBjIGlzIHdyb25nIiwgYXgsIGN4KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gZCBpcyB3cm9uZyIsIGF4LCBkeCk7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgY2xhc3NOYW1lMiA9ICJzdWJzdGl0dXRlcy5xLkFGcSI7IC8vJE5PTi1OTFMtMSQKLQkJQ2xhc3MgYXEgPSBudWxsOwotCQlDbGFzcyBicSA9IG51bGw7Ci0JCUNsYXNzIGNxID0gbnVsbDsKLQkJQ2xhc3MgZHEgPSBudWxsOwotCQl0cnkgewotCQkJYXEgPSBhLmxvYWRDbGFzcyhjbGFzc05hbWUyKTsKLQkJCWJxID0gYi5sb2FkQ2xhc3MoY2xhc3NOYW1lMik7Ci0JCQljcSA9IGMubG9hZENsYXNzKGNsYXNzTmFtZTIpOwotCQkJZHEgPSBkLmxvYWRDbGFzcyhjbGFzc05hbWUyKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGIgaXMgd3JvbmciLCBhcSwgYnEpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgZnJvbSBjIGlzIHdyb25nIiwgYXEsIGNxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gZCBpcyB3cm9uZyIsIGFxLCBkcSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0ZUV4cG9ydHMwNSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgYSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5hIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmEuZnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBiID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmIiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuYi5mcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmYiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgZyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5nIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGggPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuaCIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9ICJzdWJzdGl0dXRlcy54LkF4IjsgLy8kTk9OLU5MUy0xJAotCQlDbGFzcyBheCA9IG51bGw7Ci0JCUNsYXNzIGJ4ID0gbnVsbDsKLQkJQ2xhc3MgZXggPSBudWxsOwotCQlDbGFzcyBmeCA9IG51bGw7Ci0JCUNsYXNzIGd4ID0gbnVsbDsKLQkJQ2xhc3MgaHggPSBudWxsOwotCQl0cnkgewotCQkJYXggPSBhLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJYnggPSBiLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJZXggPSBlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJZnggPSBmLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJZ3ggPSBnLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJaHggPSBoLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgY25mZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gYiBpcyB3cm9uZyIsIGF4LCBieCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGMgaXMgd3JvbmciLCBheCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgZnJvbSBkIGlzIHdyb25nIiwgYXgsIGZ4KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gZCBpcyB3cm9uZyIsIGF4LCBneCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGQgaXMgd3JvbmciLCBheCwgaHgpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGNsYXNzTmFtZTIgPSAic3Vic3RpdHV0ZXMucS5BRnEiOyAvLyROT04tTkxTLTEkCi0JCUNsYXNzIGFxID0gbnVsbDsKLQkJQ2xhc3MgYnEgPSBudWxsOwotCQlDbGFzcyBlcSA9IG51bGw7Ci0JCUNsYXNzIGZxID0gbnVsbDsKLQkJQ2xhc3MgZ3EgPSBudWxsOwotCQlDbGFzcyBocSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcSA9IGEubG9hZENsYXNzKGNsYXNzTmFtZTIpOwotCQkJYnEgPSBiLmxvYWRDbGFzcyhjbGFzc05hbWUyKTsKLQkJCWVxID0gZS5sb2FkQ2xhc3MoY2xhc3NOYW1lMik7Ci0JCQlmcSA9IGYubG9hZENsYXNzKGNsYXNzTmFtZTIpOwotCQkJZ3EgPSBnLmxvYWRDbGFzcyhjbGFzc05hbWUyKTsKLQkJCWhxID0gaC5sb2FkQ2xhc3MoY2xhc3NOYW1lMik7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBjbmZlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiY2xhc3MgZnJvbSBiIGlzIHdyb25nIiwgYXEsIGJxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gYyBpcyB3cm9uZyIsIGFxLCBlcSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBmcm9tIGQgaXMgd3JvbmciLCBhcSwgZnEpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgZnJvbSBkIGlzIHdyb25nIiwgYXEsIGdxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIGZyb20gZCBpcyB3cm9uZyIsIGFxLCBocSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0ZUV4cG9ydHMwNigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgaUJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5pIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGpCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuaiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBrQnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmsiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgbEJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5sIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIG1CdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMubSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBuQnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLm4iKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgcEJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHFCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMucSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2lCdW5kbGUsIGpCdW5kbGUsIGtCdW5kbGUsIGxCdW5kbGUsIG1CdW5kbGUsIG5CdW5kbGUsIHBCdW5kbGUsIHFCdW5kbGV9OwotCi0JCVN0cmluZyBjbGFzc05hbWVJeCA9ICJzdWJzdGl0dXRlcy54Lkl4IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NOYW1lS3ggPSAic3Vic3RpdHV0ZXMueC5LeCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNsYXNzTmFtZU14ID0gInN1YnN0aXR1dGVzLnguTXgiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjbGFzc05hbWVJeSA9ICJzdWJzdGl0dXRlcy55Lkl5IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NOYW1lS3kgPSAic3Vic3RpdHV0ZXMueS5LeSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNsYXNzTmFtZU15ID0gInN1YnN0aXR1dGVzLnkuTXkiOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCUNsYXNzIGlYID0gaUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lSXgpOwotCQkJYXNzZXJ0RXF1YWxzKCJqQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBpWCIsIGlYLCBqQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVJeCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIm1CdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIGlYIiwgaVgsIG1CdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUl4KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygibkJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgaVgiLCBpWCwgbkJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lSXgpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJwQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBpWCIsIGlYLCBwQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVJeCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInFCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIGlYIiwgaVgsIHFCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUl4KSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGNuZmUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCUNsYXNzIGlZID0gaUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lSXkpOwotCQkJYXNzZXJ0RXF1YWxzKCJqQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBpWSIsIGlZLCBqQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVJeSkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIm1CdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIGlZIiwgaVksIG1CdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUl5KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygibkJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgaVkiLCBpWSwgbkJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lSXkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJwQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBpWSIsIGlZLCBwQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVJeSkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInFCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIGlZIiwgaVksIHFCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUl5KSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGNuZmUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJQ2xhc3Mga1ggPSBrQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVLeCk7Ci0JCQlhc3NlcnRFcXVhbHMoImxCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEt4Iiwga1gsIGxCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUt4KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygibUJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgS3giLCBrWCwgbUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lS3gpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJuQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBLeCIsIGtYLCBuQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVLeCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInBCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEt4Iiwga1gsIHBCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUt4KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygicUJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgS3giLCBrWCwgcUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lS3gpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgY25mZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlDbGFzcyBrWSA9IGtCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUt5KTsKLQkJCWFzc2VydEVxdWFscygibEJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgS3kiLCBrWSwgbEJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lS3kpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJtQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBLeSIsIGtZLCBtQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVLeSkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIm5CdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEt5Iiwga1ksIG5CdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUt5KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygicEJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgS3kiLCBrWSwgcEJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lS3kpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJxQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBLeSIsIGtZLCBxQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVLeSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBjbmZlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCUNsYXNzIG1YID0gbUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTXgpOwotCQkJYXNzZXJ0RXF1YWxzKCJuQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBtWCIsIG1YLCBuQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVNeCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInBCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIG1YIiwgbVgsIHBCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZU14KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygicUJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgbVgiLCBtWCwgcUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTXgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgY25mZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlDbGFzcyBtWSA9IG1CdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZU15KTsKLQkJCWFzc2VydEVxdWFscygibkJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgbVkiLCBtWSwgbkJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTXkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJwQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBtWSIsIG1ZLCBwQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVNeSkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInFCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIG1ZIiwgbVksIHFCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZU15KSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGNuZmUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmdbXSB1bmV4cGVjdGVkQ2xhc3NlTmFtZXMgPSBuZXcgU3RyaW5nW10geyJzdWJzdGl0dXRlcy54Lkp4IiwgInN1YnN0aXR1dGVzLnguTHgiLCAic3Vic3RpdHV0ZXMueC5OeCIsICJzdWJzdGl0dXRlcy55Lkp5IiwgInN1YnN0aXR1dGVzLnkuTHkiLCAic3Vic3RpdHV0ZXMueS5OeSJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuZXhwZWN0ZWRDbGFzc2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbGxCdW5kbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQ2xhc3MgZm91bmQgPSBhbGxCdW5kbGVzW2pdLmxvYWRDbGFzcyh1bmV4cGVjdGVkQ2xhc3NlTmFtZXNbaV0pOwotCQkJCQlmYWlsKCJGb3VuZCBjbGFzcyAiICsgZm91bmQgKyAiIGluIGJ1bmRsZSAiICsgYWxsQnVuZGxlc1tqXSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQkJCS8vIGV4cGVjdGVkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGVFeHBvcnRzMDcoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJLy8gc2FtZSBhcyBwcmV2aW91cyBzcGxpdCB0ZXN0IGJ1dCBidW5kbGVzIGFyZSBpbnN0YWxsZWQgaW4gb3Bwb3NpdGUgb3JkZXIgdG8gZm9yY2UgdGhlIG9wcG9zaXRlIGNsYXNzZXMgdG8gbG9hZAotCQlCdW5kbGUgakJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5qIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGlCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuaSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBsQnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmwiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUga0J1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5rIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIG5CdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMubiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBtQnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLm0iKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgcUJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5xIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHBCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMucCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2lCdW5kbGUsIGpCdW5kbGUsIGtCdW5kbGUsIGxCdW5kbGUsIG1CdW5kbGUsIG5CdW5kbGUsIHBCdW5kbGUsIHFCdW5kbGV9OwotCi0JCVN0cmluZyBjbGFzc05hbWVKeCA9ICJzdWJzdGl0dXRlcy54Lkp4IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NOYW1lTHggPSAic3Vic3RpdHV0ZXMueC5MeCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNsYXNzTmFtZU54ID0gInN1YnN0aXR1dGVzLnguTngiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjbGFzc05hbWVKeSA9ICJzdWJzdGl0dXRlcy55Lkp5IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NOYW1lTHkgPSAic3Vic3RpdHV0ZXMueS5MeSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNsYXNzTmFtZU55ID0gInN1YnN0aXR1dGVzLnkuTnkiOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCUNsYXNzIGpYID0gakJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lSngpOwotCQkJYXNzZXJ0RXF1YWxzKCJpQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBKeCIsIGpYLCBpQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVKeCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIm1CdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEp4IiwgalgsIG1CdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUp4KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygibkJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgSngiLCBqWCwgbkJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lSngpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJwQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBKeCIsIGpYLCBwQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVKeCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInFCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEp4IiwgalgsIHFCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUp4KSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGNuZmUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCUNsYXNzIGpZID0gakJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lSnkpOwotCQkJYXNzZXJ0RXF1YWxzKCJqQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBKeSIsIGpZLCBpQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVKeSkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIm1CdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEp5IiwgalksIG1CdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUp5KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygibkJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgSnkiLCBqWSwgbkJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lSnkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJwQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBKeSIsIGpZLCBwQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVKeSkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInFCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEp5IiwgalksIHFCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUp5KSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGNuZmUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJQ2xhc3MgbFggPSBsQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVMeCk7Ci0JCQlhc3NlcnRFcXVhbHMoImxCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEx4IiwgbFgsIGtCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUx4KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygibUJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgTHgiLCBsWCwgbUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTHgpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJuQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBMeCIsIGxYLCBuQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVMeCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInBCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEx4IiwgbFgsIHBCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUx4KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygicUJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgTHgiLCBsWCwgcUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTHgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgY25mZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlDbGFzcyBsWSA9IGxCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUx5KTsKLQkJCWFzc2VydEVxdWFscygibEJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgTHkiLCBsWSwga0J1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTHkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJtQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBMeSIsIGxZLCBtQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVMeSkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIm5CdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIEx5IiwgbFksIG5CdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZUx5KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygicEJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgTHkiLCBsWSwgcEJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTHkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJxQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBMeSIsIGxZLCBxQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVMeSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBjbmZlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCUNsYXNzIG5YID0gbkJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTngpOwotCQkJYXNzZXJ0RXF1YWxzKCJuQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBOeCIsIG5YLCBtQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVOeCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInBCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIE54IiwgblgsIHBCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZU54KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygicUJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgTngiLCBuWCwgcUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTngpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgY25mZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlDbGFzcyBuWSA9IG5CdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZU55KTsKLQkJCWFzc2VydEVxdWFscygibkJ1bmRsZSBoYXMgZGlmZmVyZW50IGNvcHkgb2YgTnkiLCBuWSwgbUJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lTnkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJwQnVuZGxlIGhhcyBkaWZmZXJlbnQgY29weSBvZiBOeSIsIG5ZLCBwQnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWVOeSkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInFCdW5kbGUgaGFzIGRpZmZlcmVudCBjb3B5IG9mIE55IiwgblksIHFCdW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZU55KSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGNuZmUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmdbXSB1bmV4cGVjdGVkQ2xhc3NlTmFtZXMgPSBuZXcgU3RyaW5nW10geyJzdWJzdGl0dXRlcy54Lkl4IiwgInN1YnN0aXR1dGVzLnguS3giLCAic3Vic3RpdHV0ZXMueC5NeCIsICJzdWJzdGl0dXRlcy55Lkl5IiwgInN1YnN0aXR1dGVzLnkuS3kiLCAic3Vic3RpdHV0ZXMueS5NeSJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuZXhwZWN0ZWRDbGFzc2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbGxCdW5kbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQ2xhc3MgZm91bmQgPSBhbGxCdW5kbGVzW2pdLmxvYWRDbGFzcyh1bmV4cGVjdGVkQ2xhc3NlTmFtZXNbaV0pOwotCQkJCQlmYWlsKCJGb3VuZCBjbGFzcyAiICsgZm91bmQgKyAiIGluIGJ1bmRsZSAiICsgYWxsQnVuZGxlc1tqXSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQkJCS8vIGV4cGVjdGVkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGVFeHBvcnRzMDgoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBiID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5jIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuZCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2EsIGIsIGMsIGR9OwotCQlkb1JlZnJlc2hUZXN0KGFsbEJ1bmRsZXMsIGEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRlRXhwb3J0czA5KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBhID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBmID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmYiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVbXSBhbGxCdW5kbGVzID0gbmV3IEJ1bmRsZVtdIHthLCBiLCBlLCBmfTsKLQkJZG9SZWZyZXNoVGVzdChhbGxCdW5kbGVzLCBhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0ZUV4cG9ydHMxMCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgYSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5hIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGIgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuYiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmUiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgZiA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5mIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGcgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuZyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBoID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmgiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVbXSBhbGxCdW5kbGVzID0gbmV3IEJ1bmRsZVtdIHthLCBiLCBlLCBmLCBnLCBofTsKLQkJZG9SZWZyZXNoVGVzdChhbGxCdW5kbGVzLCBhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0ZUV4cG9ydHMxMSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgaUJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5pIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGpCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuaiIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5rIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmwiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgbUJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5tIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIG5CdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMubiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBwQnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLnAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgcUJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5xIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlW10gYWxsQnVuZGxlcyA9IG5ldyBCdW5kbGVbXSB7aUJ1bmRsZSwgakJ1bmRsZSwgbUJ1bmRsZSwgbkJ1bmRsZSwgcEJ1bmRsZSwgcUJ1bmRsZX07IC8vIGsgYW5kIGwgZG8gbm90IGRlcGVuZCBvbiBpCi0JCWRvUmVmcmVzaFRlc3QoYWxsQnVuZGxlcywgaUJ1bmRsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGVFeHBvcnRzMTIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGpCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuaiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBpQnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmkiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMubCIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5rIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIG5CdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMubiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBtQnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLm0iKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgcUJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5xIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHBCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMucCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2lCdW5kbGUsIGpCdW5kbGUsIG1CdW5kbGUsIG5CdW5kbGUsIHBCdW5kbGUsIHFCdW5kbGV9OyAvLyBrIGFuZCBsIGRvIG5vdCBkZXBlbmQgb24gagotCQlkb1JlZnJlc2hUZXN0KGFsbEJ1bmRsZXMsIGpCdW5kbGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1JlZnJlc2hUZXN0KEJ1bmRsZVtdIGFsbEJ1bmRsZXMsIEJ1bmRsZSB0b1JlZnJlc2gpIHsKLQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKGFsbEJ1bmRsZXMpOwotCQlCdW5kbGVbXSByZWZyZXNoZWQgPSBpbnN0YWxsZXIucmVmcmVzaFBhY2thZ2VzKG5ldyBCdW5kbGVbXSB7dG9SZWZyZXNofSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsQnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZyZXNoZWQubGVuZ3RoICYmICFmb3VuZDsgaisrKQotCQkJCWZvdW5kID0gYWxsQnVuZGxlc1tpXSA9PSByZWZyZXNoZWRbal07Ci0JCQlpZiAoIWZvdW5kKQotCQkJCWZhaWwoImJ1bmRsZSBkaWQgbm90IGdldCByZWZyZXNoZWQ6ICIgKyBhbGxCdW5kbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGJ1bmRsZXMgcmVmcmVzaGVkIiwgYWxsQnVuZGxlcy5sZW5ndGgsIHJlZnJlc2hlZC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGVFeHBvcnRzMTMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGEgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBiID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgYyA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5jIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGQgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuZCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2EsIGIsIGMsIGR9OwotCQlhc3NlcnRUcnVlKCJCdW5kbGVzIGFyZSBub3QgcmVzb2x2ZWQiLCBpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMoYWxsQnVuZGxlcykpOyAvLyROT04tTkxTLTEkCi0KLQkJUGFja2FnZUFkbWluIHBhID0gaW5zdGFsbGVyLmdldFBhY2thZ2VBZG1pbigpOwotCi0JCUV4cG9ydGVkUGFja2FnZVtdIHhQYWNrYWdlcyA9IHBhLmdldEV4cG9ydGVkUGFja2FnZXMoInN1YnN0aXR1dGVzLngiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJ4UGFja2FnZXMgaXMgbnVsbCIsIHhQYWNrYWdlcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ4UGFja2FnZXMgd3JvbmcgbnVtYmVyIiwgMSwgeFBhY2thZ2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBleHBvcnRlciIsIGEsIHhQYWNrYWdlc1swXS5nZXRFeHBvcnRpbmdCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlW10geEltcG9ydGVycyA9IHhQYWNrYWdlc1swXS5nZXRJbXBvcnRpbmdCdW5kbGVzKCk7Ci0JCWFzc2VydE5vdE51bGwoInhJbXBvcnRlcnMgaXMgbnVsbCIsIHhJbXBvcnRlcnMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHhJbXBvcnRlcnMiLCAzLCB4SW1wb3J0ZXJzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRlZFBhY2thZ2VbXSB5UGFja2FnZXMgPSBwYS5nZXRFeHBvcnRlZFBhY2thZ2VzKCJzdWJzdGl0dXRlcy55Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgieVBhY2thZ2VzIGlzIG51bGwiLCB5UGFja2FnZXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygieVBhY2thZ2VzIHdyb25nIG51bWJlciIsIDEsIHlQYWNrYWdlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgZXhwb3J0ZXIiLCBhLCB5UGFja2FnZXNbMF0uZ2V0RXhwb3J0aW5nQnVuZGxlKCkpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZVtdIHlJbXBvcnRlcnMgPSB5UGFja2FnZXNbMF0uZ2V0SW1wb3J0aW5nQnVuZGxlcygpOwotCQlhc3NlcnROb3ROdWxsKCJ5SW1wb3J0ZXJzIGlzIG51bGwiLCB5SW1wb3J0ZXJzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB5SW1wb3J0ZXJzIiwgMywgeUltcG9ydGVycy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlW10gZXhwZWN0ZWRJbXBvcnRlcnMgPSBuZXcgQnVuZGxlW10ge2IsIGMsIGR9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkSW1wb3J0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250YWlucygieFBhY2thZ2VzIGltcG9ydGVycyBkb2VzIG5vdCBjb250YWluIiwgeEltcG9ydGVycywgZXhwZWN0ZWRJbXBvcnRlcnNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQljb250YWlucygieVBhY2thZ2VzIGltcG9ydGVycyBkb2VzIG5vdCBjb250YWluIiwgeUltcG9ydGVycywgZXhwZWN0ZWRJbXBvcnRlcnNbaV0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0ZUV4cG9ydHMxNCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgaUJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5pIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGpCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMuaiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBrQnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLmsiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgbEJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5sIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIG1CdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMubSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBuQnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoInN1YnN0aXR1dGVzLm4iKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgcEJ1bmRsZSA9IGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKCJzdWJzdGl0dXRlcy5wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHFCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZSgic3Vic3RpdHV0ZXMucSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBuZXcgQnVuZGxlW10ge2lCdW5kbGUsIGpCdW5kbGUsIGtCdW5kbGUsIGxCdW5kbGUsIG1CdW5kbGUsIG5CdW5kbGUsIHBCdW5kbGUsIHFCdW5kbGV9OyAvLyBrIGFuZCBsIGRvIG5vdCBkZXBlbmQgb24gaQotCQlhc3NlcnRUcnVlKCJCdW5kbGVzIGFyZSBub3QgcmVzb2x2ZWQiLCBpbnN0YWxsZXIucmVzb2x2ZUJ1bmRsZXMoYWxsQnVuZGxlcykpOyAvLyROT04tTkxTLTEkCi0KLQkJUGFja2FnZUFkbWluIHBhID0gaW5zdGFsbGVyLmdldFBhY2thZ2VBZG1pbigpOwotCi0JCUV4cG9ydGVkUGFja2FnZVtdIHhQYWNrYWdlcyA9IHBhLmdldEV4cG9ydGVkUGFja2FnZXMoInN1YnN0aXR1dGVzLngiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJ4UGFja2FnZXMgaXMgbnVsbCIsIHhQYWNrYWdlcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ4UGFja2FnZXMgd3JvbmcgbnVtYmVyIiwgMywgeFBhY2thZ2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRlZFBhY2thZ2VbXSB5UGFja2FnZXMgPSBwYS5nZXRFeHBvcnRlZFBhY2thZ2VzKCJzdWJzdGl0dXRlcy55Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgieVBhY2thZ2VzIGlzIG51bGwiLCB5UGFja2FnZXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygieVBhY2thZ2VzIHdyb25nIG51bWJlciIsIDMsIHlQYWNrYWdlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlW10gZXhwZWN0ZWRFeHBvcnRlcnMgPSBuZXcgQnVuZGxlW10ge2lCdW5kbGUsIGtCdW5kbGUsIG1CdW5kbGV9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkRXhwb3J0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHhQYWNrYWdlcy5sZW5ndGggJiYgIWZvdW5kOyBqKyspIHsKLQkJCQlmb3VuZCA9IGV4cGVjdGVkRXhwb3J0ZXJzW2ldID09IHhQYWNrYWdlc1tqXS5nZXRFeHBvcnRpbmdCdW5kbGUoKTsKLQkJCQlpZiAoZm91bmQpIHsKLQkJCQkJQnVuZGxlW10gaW1wb3J0aW5nQnVuZGxlcyA9IHhQYWNrYWdlc1tqXS5nZXRJbXBvcnRpbmdCdW5kbGVzKCk7Ci0JCQkJCUJ1bmRsZVtdIGV4cGVjdGVkSW1wb3J0ZXJzID0gbnVsbDsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQkJCQlpZiAoZXhwZWN0ZWRFeHBvcnRlcnNbaV0gPT0gaUJ1bmRsZSkgewotCQkJCQkJZXhwZWN0ZWRJbXBvcnRlcnMgPSBuZXcgQnVuZGxlW10ge2pCdW5kbGUsIG1CdW5kbGUsIG5CdW5kbGUsIHBCdW5kbGUsIHFCdW5kbGV9OwotCQkJCQkJbWVzc2FnZSA9ICJpQnVuZGxlICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIGlmIChleHBlY3RlZEV4cG9ydGVyc1tpXSA9PSBrQnVuZGxlKSB7Ci0JCQkJCQlleHBlY3RlZEltcG9ydGVycyA9IG5ldyBCdW5kbGVbXSB7bEJ1bmRsZSwgbUJ1bmRsZSwgbkJ1bmRsZSwgcEJ1bmRsZSwgcUJ1bmRsZX07Ci0JCQkJCQltZXNzYWdlID0gImtCdW5kbGUgIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgaWYgKGV4cGVjdGVkRXhwb3J0ZXJzW2ldID09IG1CdW5kbGUpIHsKLQkJCQkJCWV4cGVjdGVkSW1wb3J0ZXJzID0gbmV3IEJ1bmRsZVtdIHtuQnVuZGxlLCBwQnVuZGxlLCBxQnVuZGxlfTsKLQkJCQkJCW1lc3NhZ2UgPSAibUJ1bmRsZSAiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkSW1wb3J0ZXJzLmxlbmd0aCwgaW1wb3J0aW5nQnVuZGxlcy5sZW5ndGgpOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGV4cGVjdGVkSW1wb3J0ZXJzLmxlbmd0aDsgaysrKQotCQkJCQkJY29udGFpbnMobWVzc2FnZSwgaW1wb3J0aW5nQnVuZGxlcywgZXhwZWN0ZWRJbXBvcnRlcnNba10pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRhaW5zKFN0cmluZyBtZXNzYWdlLCBCdW5kbGVbXSBidW5kbGVzLCBCdW5kbGUgYikgewotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGggJiYgIWZvdW5kOyBpKyspCi0JCQlmb3VuZCA9IGJ1bmRsZXNbaV0gPT0gYjsKLQkJaWYgKCFmb3VuZCkKLQkJCWZhaWwobWVzc2FnZSArIGIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1N5bmNFdmVudExpc3RlbmVyVGVzdFJlc3VsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1N5bmNFdmVudExpc3RlbmVyVGVzdFJlc3VsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwZmZmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9TeW5jRXZlbnRMaXN0ZW5lclRlc3RSZXN1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlN5bmNocm9ub3VzQnVuZGxlTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBTeW5jRXZlbnRMaXN0ZW5lclRlc3RSZXN1bHRzIGV4dGVuZHMgRXZlbnRMaXN0ZW5lclRlc3RSZXN1bHRzIGltcGxlbWVudHMgU3luY2hyb25vdXNCdW5kbGVMaXN0ZW5lcnsKLQkvLyBpbXBsZW1lbnRzIFN5bmNocm9ub3VzQnVuZGxlTGlzdGVuZXIKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1N5c3RlbUJ1bmRsZVRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvYnVuZGxlcy9TeXN0ZW1CdW5kbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWRjMGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1N5c3RlbUJ1bmRsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kubGF1bmNoLkVxdWlub3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5FeHBvcnRlZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbC5TdGFydExldmVsOwotCi1wdWJsaWMgY2xhc3MgU3lzdGVtQnVuZGxlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFN5c3RlbUJ1bmRsZVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQnVuZGxlMDEoKSB7Ci0JCS8vIHNpbXBsZSB0ZXN0IHRvIGNyZWF0ZSBhbiBlbWJlZGRlZCBmcmFtZXdvcmsKLQkJRmlsZSBjb25maWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZXN0U3lzdGVtQnVuZGxlMDEiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUVxdWlub3ggZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5pbml0KCk7Ci0JCQllcXVpbm94LnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGhlIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtQnVuZGxlIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJU2VydmljZVJlZmVyZW5jZVtdIHJlZnMgPSBudWxsOwotCQl0cnkgewotCQkJcmVmcyA9IHN5c3RlbUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZXMoTG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCAiKHR5cGU9b3NnaS5jb25maWd1cmF0aW9uLmFyZWEpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIHN5bnRheCBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiQ29uZmlndXJhdGlvbiBMb2NhdGlvbiByZWZzIGlzIG51bGwiLCByZWZzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNvbmZpZyByZWZzIGxlbmd0aCBpcyB3cm9uZyIsIDEsIHJlZnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlMb2NhdGlvbiBjb25maWdMb2NhdGlvbiA9IChMb2NhdGlvbikgc3lzdGVtQ29udGV4dC5nZXRTZXJ2aWNlKHJlZnNbMF0pOwotCQlVUkwgY29uZmlnVVJMID0gY29uZmlnTG9jYXRpb24uZ2V0VVJMKCk7Ci0JCWFzc2VydFRydWUoImluY29ycmVjdCBjb25maWd1cmF0aW9uIGxvY2F0aW9uIiwgY29uZmlnVVJMLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoInRlc3RTeXN0ZW1CdW5kbGUwMS8iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJvcnIgc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQnVuZGxlMDIoKSB7Ci0JCS8vIGNyZWF0ZS9zdGFydC9zdG9wL3N0YXJ0L3N0b3AgdGVzdAotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RTeXN0ZW1CdW5kbGUwMiIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0KLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGhlIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZXF1aW5veC5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVyb3JyIHN0b3BwaW5nIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3gud2FpdEZvclN0b3AoMTAwMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5c3RlbUJ1bmRsZTAzKCkgewotCQkvLyBjcmVhdGUvc3RvcC8gdGVzdAotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RTeXN0ZW1CdW5kbGUwMyIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0JCXRyeSB7Ci0JCQllcXVpbm94LmluaXQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGluIGluaXQoKSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gc2hvdWxkIGJlIGluIHRoZSBTVEFSVElORyBzdGF0ZQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuU1RBUlRJTkcsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlQ29udGV4dCBzeXN0ZW1Db250ZXh0ID0gZXF1aW5veC5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoIlN5c3RlbSBjb250ZXh0IGlzIG51bGwiLCBzeXN0ZW1Db250ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29uZmlnQXJlYSA9IHN5c3RlbUNvbnRleHQuZ2V0UHJvcGVydHkoIm9zZ2kuY29uZmlndXJhdGlvbi5hcmVhIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY29uZmlnIHByb3BlcnR5IGlzIG51bGwiLCBjb25maWdBcmVhKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJXcm9uZyBjb25maWd1cmF0aW9uIGFyZWEiLCBjb25maWdBcmVhLmVuZHNXaXRoKCJ0ZXN0U3lzdGVtQnVuZGxlMDMvIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJLy8gZG9uJ3QgZG8gYW55dGhpbmc7IGp1c3QgcHV0IHRoZSBmcmFtZXdvcmsgYmFjayB0byB0aGUgUkVTT0xWRUQgc3RhdGUKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcnJvciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1CdW5kbGUwNCgpIHsKLQkJLy8gY3JlYXRlL3N0YXJ0L3N0b3Avc3RhcnQvc3RvcCB0ZXN0Ci0JCUZpbGUgY29uZmlnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdFN5c3RlbUJ1bmRsZTA0Iik7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydGllcyBjb25maWd1cmF0aW9uID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TVE9SQUdFLCBjb25maWcuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlFcXVpbm94IGVxdWlub3ggPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaW5pdCgpIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBzaG91bGQgYmUgaW4gdGhlIFNUQVJUSU5HIHN0YXRlCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5TVEFSVElORywgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRyeSBpbnN0YWxsaW5nIGEgYnVuZGxlIGJlZm9yZSBzdGFydGluZwotCQlCdW5kbGUgc3Vic3RpdHV0ZXNBID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN1YnN0aXR1dGVzQSA9IHN5c3RlbUNvbnRleHQuaW5zdGFsbEJ1bmRsZShpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInN1YnN0aXR1dGVzLmEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUxKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gaW5zdGFsbCBhIGJ1bmRsZSIsIGUxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlzdWJzdGl0dXRlc0Euc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgYnVuZGxlIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgaW5zdGFsbGVkIGJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIHN1YnN0aXR1dGVzQS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdXQgdGhlIGZyYW1ld29yayBiYWNrIHRvIHRoZSBSRVNPTFZFRCBzdGF0ZQotCQl0cnkgewotCQkJZXF1aW5veC5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVyb3JyIHN0b3BwaW5nIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3gud2FpdEZvclN0b3AoMTAwMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5c3RlbUJ1bmRsZTA1XzEoKSB7Ci0JCS8vIGNyZWF0ZS9pbnN0YWxsL3N0YXJ0L3N0b3AgdGVzdAotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RTeXN0ZW1CdW5kbGUwNV8xIik7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydGllcyBjb25maWd1cmF0aW9uID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TVE9SQUdFLCBjb25maWcuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlFcXVpbm94IGVxdWlub3ggPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaW5pdCgpIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBzaG91bGQgYmUgaW4gdGhlIFNUQVJUSU5HIHN0YXRlCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5TVEFSVElORywgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRyeSBpbnN0YWxsaW5nIGEgYnVuZGxlIGJlZm9yZSBzdGFydGluZwotCQlCdW5kbGUgc3Vic3RpdHV0ZXNBID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN1YnN0aXR1dGVzQSA9IHN5c3RlbUNvbnRleHQuaW5zdGFsbEJ1bmRsZShpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInN1YnN0aXR1dGVzLmEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUxKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gaW5zdGFsbCBhIGJ1bmRsZSIsIGUxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHN0YXJ0IGZyYW1ld29yayBmaXJzdAotCQl0cnkgewotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgaW5zdGFsbGVkIGJ1bmRsZSIsIEJ1bmRsZS5JTlNUQUxMRUQsIHN1YnN0aXR1dGVzQS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJc3Vic3RpdHV0ZXNBLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlMSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IGEgYnVuZGxlIiwgZTEpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgYWN0aXZlIGJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIHN1YnN0aXR1dGVzQS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdXQgdGhlIGZyYW1ld29yayBiYWNrIHRvIHRoZSBSRVNPTFZFRCBzdGF0ZQotCQl0cnkgewotCQkJZXF1aW5veC5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVyb3JyIHN0b3BwaW5nIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3gud2FpdEZvclN0b3AoMTAwMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5c3RlbUJ1bmRsZTA1XzIoKSB7Ci0JCS8vIGNyZWF0ZS9pbnN0YWxsL3N0YXJ0L3N0b3Avc3RhcnQvc3RvcCB0ZXN0Ci0JCUZpbGUgY29uZmlnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdFN5c3RlbUJ1bmRsZTA1XzIiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUVxdWlub3ggZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5pbml0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBpbml0KCkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHNob3VsZCBiZSBpbiB0aGUgU1RBUlRJTkcgc3RhdGUKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlNUQVJUSU5HLCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZUNvbnRleHQgc3lzdGVtQ29udGV4dCA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlhc3NlcnROb3ROdWxsKCJTeXN0ZW0gY29udGV4dCBpcyBudWxsIiwgc3lzdGVtQ29udGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdHJ5IGluc3RhbGxpbmcgYSBidW5kbGUgYmVmb3JlIHN0YXJ0aW5nCi0JCUJ1bmRsZSBzdWJzdGl0dXRlc0EgPSBudWxsOwotCQl0cnkgewotCQkJc3Vic3RpdHV0ZXNBID0gc3lzdGVtQ29udGV4dC5pbnN0YWxsQnVuZGxlKGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigic3Vic3RpdHV0ZXMuYSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZTEpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBpbnN0YWxsIGEgYnVuZGxlIiwgZTEpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gc3RhcnQgZnJhbWV3b3JrIGZpcnN0Ci0JCXRyeSB7Ci0JCQllcXVpbm94LnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGhlIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBpbnN0YWxsZWQgYnVuZGxlIiwgQnVuZGxlLklOU1RBTExFRCwgc3Vic3RpdHV0ZXNBLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlzdWJzdGl0dXRlc0Euc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUxKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgYSBidW5kbGUiLCBlMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBhY3RpdmUgYnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgc3Vic3RpdHV0ZXNBLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIHB1dCB0aGUgZnJhbWV3b3JrIGJhY2sgdG8gdGhlIFJFU09MVkVEIHN0YXRlCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJvcnIgc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHN1YnN0aXR1dGVzQTIgPSBudWxsOwotCQl0cnkgewotCQkJc3Vic3RpdHV0ZXNBMiA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpLmluc3RhbGxCdW5kbGUoaW5zdGFsbGVyLmdldEJ1bmRsZUxvY2F0aW9uKCJzdWJzdGl0dXRlcy5hIikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbnN0YWxsaW5nIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBhc3NlcnQgdGhlIHNhbWUgYnVuZGxlIElECi0JCWFzc2VydEVxdWFscygiQnVuZGxlIGlkcyBhcmUgbm90IHRoZSBzYW1lIiwgc3Vic3RpdHV0ZXNBLmdldEJ1bmRsZUlkKCksIHN1YnN0aXR1dGVzQTIuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbm8gbmVlZCB0byBzdGFydCB0aGUgYnVuZGxlIGFnYWluIGl0IHNob3VsZCBoYXZlIGJlZW4gcGVyc2lzdGVudGx5IHN0YXJ0ZWQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgYWN0aXZlIGJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIHN1YnN0aXR1dGVzQTIuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcHV0IHRoZSBmcmFtZXdvcmsgYmFjayB0byB0aGUgUkVTT0xWRUQgc3RhdGUKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5c3RlbUJ1bmRsZTA2KCkgewotCQkvLyBjcmVhdGUgbXVsdGlwbGUgaW5zdGFuY2VzIHRlc3QKLQkJRmlsZSBjb25maWcxID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdFN5c3RlbUJ1bmRsZTA2XzEiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24xID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJY29uZmlndXJhdGlvbjEucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnMS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUVxdWlub3ggZXF1aW5veDEgPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uMSk7Ci0JCXRyeSB7Ci0JCQllcXVpbm94MS5pbml0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBpbml0KCkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHNob3VsZCBiZSBpbiB0aGUgU1RBUlRJTkcgc3RhdGUKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlNUQVJUSU5HLCBlcXVpbm94MS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgY29uZmlnMiA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RTeXN0ZW1CdW5kbGUwNl8yIik7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydGllcyBjb25maWd1cmF0aW9uMiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24yLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZzIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlFcXVpbm94IGVxdWlub3gyID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbjIpOwotCQl0cnkgewotCQkJZXF1aW5veDIuaW5pdCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaW5pdCgpIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBzaG91bGQgYmUgaW4gdGhlIFNUQVJUSU5HIHN0YXRlCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5TVEFSVElORywgZXF1aW5veDIuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQxID0gZXF1aW5veDEuZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlhc3NlcnROb3ROdWxsKCJTeXN0ZW0gY29udGV4dCBpcyBudWxsIiwgc3lzdGVtQ29udGV4dDEpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZUNvbnRleHQgc3lzdGVtQ29udGV4dDIgPSBlcXVpbm94Mi5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoIlN5c3RlbSBjb250ZXh0IGlzIG51bGwiLCBzeXN0ZW1Db250ZXh0Mik7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnROb3RTYW1lKHN5c3RlbUNvbnRleHQxLCBzeXN0ZW1Db250ZXh0Mik7Ci0KLQkJLy8gc3RhcnQgZnJhbWV3b3JrIDEgZmlyc3QKLQkJdHJ5IHsKLQkJCWVxdWlub3gxLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGhlIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgZXF1aW5veDEuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc3RhcnQgZnJhbWV3b3JrIDIgZmlyc3QKLQkJdHJ5IHsKLQkJCWVxdWlub3gyLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGhlIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgZXF1aW5veDIuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBwdXQgdGhlIGZyYW1ld29yayAxIGJhY2sgdG8gdGhlIFJFU09MVkVEIHN0YXRlCi0JCXRyeSB7Ci0JCQllcXVpbm94MS5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVyb3JyIHN0b3BwaW5nIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3gxLndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veDEuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBwdXQgdGhlIGZyYW1ld29yayAyIGJhY2sgdG8gdGhlIFJFU09MVkVEIHN0YXRlCi0JCXRyeSB7Ci0JCQllcXVpbm94Mi5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVyb3JyIHN0b3BwaW5nIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3gyLndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veDIuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQnVuZGxlMDcoKSB7Ci0JCS8vIHRlc3QgaW5pdCB0d2ljZQotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RTeXN0ZW1CdW5kbGUwN18wMSIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0JCXRyeSB7Ci0JCQllcXVpbm94LmluaXQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGluIGluaXQoKSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaW5pdCgpIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGhlIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtQnVuZGxlIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaW5pdCgpIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVNlcnZpY2VSZWZlcmVuY2VbXSByZWZzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZnMgPSBzeXN0ZW1Db250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2VzKExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwgIih0eXBlPW9zZ2kuY29uZmlndXJhdGlvbi5hcmVhKSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBzeW50YXggZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoIkNvbmZpZ3VyYXRpb24gTG9jYXRpb24gcmVmcyBpcyBudWxsIiwgcmVmcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjb25maWcgcmVmcyBsZW5ndGggaXMgd3JvbmciLCAxLCByZWZzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJTG9jYXRpb24gY29uZmlnTG9jYXRpb24gPSAoTG9jYXRpb24pIHN5c3RlbUNvbnRleHQuZ2V0U2VydmljZShyZWZzWzBdKTsKLQkJVVJMIGNvbmZpZ1VSTCA9IGNvbmZpZ0xvY2F0aW9uLmdldFVSTCgpOwotCQlhc3NlcnRUcnVlKCJpbmNvcnJlY3QgY29uZmlndXJhdGlvbiBsb2NhdGlvbiIsIGNvbmZpZ1VSTC50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJ0ZXN0U3lzdGVtQnVuZGxlMDdfMDEvIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl0cnkgewotCQkJZXF1aW5veC5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVyb3JyIHN0b3BwaW5nIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3gud2FpdEZvclN0b3AoMTAwMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5c3RlbUJ1bmRsZTA4KCkgewotCQkvLyBjcmVhdGUvc3RhcnQvc3RvcC9zdGFydC9zdG9wIHRlc3QKLQkJRmlsZSBjb25maWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZXN0U3lzdGVtQnVuZGxlMDhfMSIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0JCXRyeSB7Ci0JCQllcXVpbm94LmluaXQoKTsKLQkJCWVxdWlub3guc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdGFydCB0aGUgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJvcnIgc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb25maWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZXN0U3lzdGVtQnVuZGxlMDhfMiIpOyAvLyROT04tTkxTLTEkCi0JCWNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWVxdWlub3ggPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlTZXJ2aWNlUmVmZXJlbmNlW10gcmVmcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWZzID0gZXF1aW5veC5nZXRCdW5kbGVDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZXMoTG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCAiKHR5cGU9b3NnaS5jb25maWd1cmF0aW9uLmFyZWEpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIHN5bnRheCBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiQ29uZmlndXJhdGlvbiBMb2NhdGlvbiByZWZzIGlzIG51bGwiLCByZWZzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNvbmZpZyByZWZzIGxlbmd0aCBpcyB3cm9uZyIsIDEsIHJlZnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlMb2NhdGlvbiBjb25maWdMb2NhdGlvbiA9IChMb2NhdGlvbikgZXF1aW5veC5nZXRCdW5kbGVDb250ZXh0KCkuZ2V0U2VydmljZShyZWZzWzBdKTsKLQkJVVJMIGNvbmZpZ1VSTCA9IGNvbmZpZ0xvY2F0aW9uLmdldFVSTCgpOwotCQlhc3NlcnRUcnVlKCJpbmNvcnJlY3QgY29uZmlndXJhdGlvbiBsb2NhdGlvbiIsIGNvbmZpZ1VSTC50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJ0ZXN0U3lzdGVtQnVuZGxlMDhfMi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJvcnIgc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQnVuZGxlMDkoKSB7Ci0JCS8vIHRlc3QgRnJhbWV3b3JrVXRpbC5jcmVhdGVGaWx0ZXIKLQkJRmlsZSBjb25maWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZXN0U3lzdGVtQnVuZGxlMDkiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUVxdWlub3ggZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgdGVzdEZpbHRlckEgPSBudWxsOwotCQl0cnkgewotCQkJdGVzdEZpbHRlckEgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKS5pbnN0YWxsQnVuZGxlKGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigidGVzdC5maWx0ZXIuYSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gaW5zdGFsbGluZyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCXRlc3RGaWx0ZXJBLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBzdGFydGluZyB0ZXN0IGJ1bmRsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1CdW5kbGUxMCgpIHsKLQkJLy8gY3JlYXRlL3N0YXJ0L3VwZGF0ZS9zdG9wIHRlc3QKLQkJRmlsZSBjb25maWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZXN0U3lzdGVtQnVuZGxlMTAiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWZpbmFsIEVxdWlub3ggZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgRXhjZXB0aW9uW10gZmFpbHVyZUV4Y2VwdGlvbiA9IG5ldyBCdW5kbGVFeGNlcHRpb25bMV07Ci0JCWZpbmFsIEZyYW1ld29ya0V2ZW50W10gc3VjY2VzcyA9IG5ldyBGcmFtZXdvcmtFdmVudFtdIHtudWxsfTsKLQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlzdWNjZXNzWzBdID0gZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlmYWlsdXJlRXhjZXB0aW9uWzBdID0gZTsKLQkJCQl9Ci0JCQl9Ci0JCX0sICJ0ZXN0IHdhaXRGb3JTdG9wIHRocmVhZCIpOyAvLyROT04tTkxTLTEkCi0JCXQuc3RhcnQoKTsKLQkJdHJ5IHsKLQkJCS8vIGRlbGF5IGhhY2sgdG8gYWxsb3cgdCB0aHJlYWQgdG8gYmxvY2sgb24gd2FpdEZvclN0b3AgYmVmb3JlIHdlIHVwZGF0ZS4KLQkJCVRocmVhZC5zbGVlcCg1MDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGludGVydXB0aW9uIiwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3gudXBkYXRlKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gdXBkYXRlIHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQl0LmpvaW4oKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBpbnRlcnVwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGZhaWx1cmVFeGNlcHRpb25bMF0gIT0gbnVsbCkKLQkJCWZhaWwoIkVycm9yIG9jY3VycmVkIHdoaWxlIHdhaXRpbmciLCBmYWlsdXJlRXhjZXB0aW9uWzBdKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJXYWl0IGZvciBzdG9wIGV2ZW50IGlzIG51bGwiLCBzdWNjZXNzWzBdKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldhaXQgZm9yIHN0b3AgZXZlbnQgdHlwZSBpcyB3cm9uZyIsIEZyYW1ld29ya0V2ZW50LlNUT1BQRURfVVBEQVRFLCBzdWNjZXNzWzBdLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVE9ETyBkZWxheSBoYWNrIHRvIGFsbG93IHRoZSBmcmFtZXdvcmsgdG8gZ2V0IHN0YXJ0ZWQgYWdhaW4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1ICYmIEJ1bmRsZS5BQ1RJVkUgIT0gZXF1aW5veC5nZXRTdGF0ZSgpOyBpKyspCi0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBub3RoaW5nCi0JCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1CdW5kbGUxMSgpIHsKLQkJLy8gdGVzdCBleHRyYSBwYWNrYWdlcyBwcm9wZXJ0eQotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RTeXN0ZW1CdW5kbGUxMSIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TWVNURU1QQUNLQUdFU19FWFRSQSwgInRlc3QucGtnMSwgdGVzdC5wa2cyIik7IC8vJE5PTi1OTFMtMSQKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0JCXRyeSB7Ci0JCQllcXVpbm94LmluaXQoKTsKLQkJCWVxdWlub3guc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdGFydCB0aGUgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZUNvbnRleHQgc3lzdGVtQ29udGV4dCA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlhc3NlcnROb3ROdWxsKCJTeXN0ZW1CdW5kbGUgY29udGV4dCBpcyBudWxsIiwgc3lzdGVtQ29udGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQlQYWNrYWdlQWRtaW4gcGEgPSAoUGFja2FnZUFkbWluKSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKS5nZXRTZXJ2aWNlKGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSkpOwotCQlFeHBvcnRlZFBhY2thZ2VbXSBwa2cxID0gcGEuZ2V0RXhwb3J0ZWRQYWNrYWdlcygidGVzdC5wa2cxIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChwa2cxKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgZXhwb3J0cyIsIDEsIHBrZzEubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHBhY2thZ2UgbmFtZSIsICJ0ZXN0LnBrZzEiLCBwa2cxWzBdLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlFeHBvcnRlZFBhY2thZ2VbXSBwa2cyID0gcGEuZ2V0RXhwb3J0ZWRQYWNrYWdlcygidGVzdC5wa2cyIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChwa2cyKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgZXhwb3J0cyIsIDEsIHBrZzIubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHBhY2thZ2UgbmFtZSIsICJ0ZXN0LnBrZzIiLCBwa2cyWzBdLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJvcnIgc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQnVuZGxlMTIoKSB7Ci0JCS8vIFRlc3Qgc3RvcCBGcmFtZXdvcmtFdmVudAotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RTeXN0ZW1CdW5kbGUxMiIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0KLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHRlc3QgdGltZW91dCB3YWl0aW5nIGZvciBmcmFtZXdvcmsgc3RvcAotCQlGcmFtZXdvcmtFdmVudCBzdG9wRXZlbnQgPSBudWxsOwotCQl0cnkgewotCQkJc3RvcEV2ZW50ID0gZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoIlN0b3AgZXZlbnQgaXMgbnVsbCIsIHN0b3BFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdG9wRXZlbnQiLCBGcmFtZXdvcmtFdmVudC5XQUlUX1RJTUVET1VULCBzdG9wRXZlbnQuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlzdG9wRXZlbnQgPSBlcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoIlN0b3AgZXZlbnQgaXMgbnVsbCIsIHN0b3BFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdG9wRXZlbnQiLCBGcmFtZXdvcmtFdmVudC5TVE9QUEVELCBzdG9wRXZlbnQuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1CdW5kbGUxMygpIHsKLQkJLy8gY3JlYXRlL2luc3RhbGwvc3RhcnQvc3RvcCBjbGVhbiB0ZXN0Ci0JCUZpbGUgY29uZmlnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdFN5c3RlbUJ1bmRsZTEzIik7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydGllcyBjb25maWd1cmF0aW9uID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TVE9SQUdFLCBjb25maWcuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlFcXVpbm94IGVxdWlub3ggPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaW5pdCgpIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBzaG91bGQgYmUgaW4gdGhlIFNUQVJUSU5HIHN0YXRlCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5TVEFSVElORywgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRyeSBpbnN0YWxsaW5nIGEgYnVuZGxlIGJlZm9yZSBzdGFydGluZwotCQlCdW5kbGUgc3Vic3RpdHV0ZXNBID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN1YnN0aXR1dGVzQSA9IHN5c3RlbUNvbnRleHQuaW5zdGFsbEJ1bmRsZShpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInN1YnN0aXR1dGVzLmEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUxKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gaW5zdGFsbCBhIGJ1bmRsZSIsIGUxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHN0YXJ0IGZyYW1ld29yayBmaXJzdAotCQl0cnkgewotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgaW5zdGFsbGVkIGJ1bmRsZSIsIEJ1bmRsZS5JTlNUQUxMRUQsIHN1YnN0aXR1dGVzQS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJc3Vic3RpdHV0ZXNBLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlMSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IGEgYnVuZGxlIiwgZTEpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgYWN0aXZlIGJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIHN1YnN0aXR1dGVzQS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdXQgdGhlIGZyYW1ld29yayBiYWNrIHRvIHRoZSBSRVNPTFZFRCBzdGF0ZQotCQl0cnkgewotCQkJZXF1aW5veC5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVyb3JyIHN0b3BwaW5nIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3gud2FpdEZvclN0b3AoMTAwMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaW5pdGlhbGl6ZSB0aGUgZnJhbWV3b3JrIGFnYWluIHRvIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5pbml0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBpbml0KCkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXN1YnN0aXR1dGVzQSA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpLmdldEJ1bmRsZSgxKTsKLQotCQkvLyBtYWtlIHN1cmUgdGhlIGJ1bmRsZSBpcyB0aGVyZQotCQlhc3NlcnROb3ROdWxsKCJtaXNzaW5nIGluc3RhbGxlZCBidW5kbGUiLCBzdWJzdGl0dXRlc0EpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzeW1ib2xpYyBuYW1lIiwgInN1YnN0aXR1dGVzLmEiLCBzdWJzdGl0dXRlc0EuZ2V0U3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGluaXRpYWxpemUgdGhlIGZyYW1ld29yayBhZ2FpbiB0byB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGJ1dCB1c2UgY2xlYW4gb3B0aW9uCi0JCWNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRV9DTEVBTiwgQ29uc3RhbnRzLkZSQU1FV09SS19TVE9SQUdFX0NMRUFOX09ORklSU1RJTklUKTsKLQkJZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5pbml0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBpbml0KCkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXN1YnN0aXR1dGVzQSA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpLmdldEJ1bmRsZSgxKTsKLQotCQkvLyBtYWtlIHN1cmUgdGhlIGJ1bmRsZSBpcyB0aGVyZQotCQlhc3NlcnROdWxsKCJVbmV4cGVjdGVkIGJ1bmRsZSBpcyBpbnN0YWxsZWQiLCBzdWJzdGl0dXRlc0EpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJvcnIgc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQnVuZGxlMTQoKSB7Ci0JCS8vIFRlc3Qgc3RhcnRsZXZlbCBwcm9wZXJ0eQotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RTeXN0ZW1CdW5kbGUxNCIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19CRUdJTk5JTkdfU1RBUlRMRVZFTCwgIjEwIik7IC8vJE5PTi1OTFMtMSQKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0KLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RhcnRMZXZlbCBzdCA9IChTdGFydExldmVsKSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKS5nZXRTZXJ2aWNlKGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoU3RhcnRMZXZlbC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3RhcnRMZXZlbCBzZXJ2aWNlIGlzIG51bGwiLCBzdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHN0YXJ0IGxldmVsIiwgMTAsIHN0LmdldFN0YXJ0TGV2ZWwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZXF1aW5veC5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVyb3JyIHN0b3BwaW5nIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlGcmFtZXdvcmtFdmVudCBzdG9wRXZlbnQgPSBudWxsOwotCQl0cnkgewotCQkJc3RvcEV2ZW50ID0gZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJTdG9wIGV2ZW50IGlzIG51bGwiLCBzdG9wRXZlbnQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RvcEV2ZW50IiwgRnJhbWV3b3JrRXZlbnQuU1RPUFBFRCwgc3RvcEV2ZW50LmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQnVuZGxlMTYoKSB7Ci0JCS8vIHRlc3QgcGFyZW50IGJvb3QKLQkJRmlsZSBjb25maWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKGdldE5hbWUoKSk7Ci0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19CVU5ETEVfUEFSRU5ULCBDb25zdGFudHMuRlJBTUVXT1JLX0JVTkRMRV9QQVJFTlRfQk9PVCk7Ci0JCWNoZWNrUGFyZW50Q2xhc3NMb2FkZXIoY29uZmlndXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5c3RlbUJ1bmRsZTE3KCkgewotCQkvLyB0ZXN0IHBhcmVudCBhcHAKLQkJRmlsZSBjb25maWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKGdldE5hbWUoKSk7Ci0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19CVU5ETEVfUEFSRU5ULCBDb25zdGFudHMuRlJBTUVXT1JLX0JVTkRMRV9QQVJFTlRfQVBQKTsKLQkJY2hlY2tQYXJlbnRDbGFzc0xvYWRlcihjb25maWd1cmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQnVuZGxlMTgoKSB7Ci0JCS8vIHRlc3QgcGFyZW50IGV4dAotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoZ2V0TmFtZSgpKTsKLQkJUHJvcGVydGllcyBjb25maWd1cmF0aW9uID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TVE9SQUdFLCBjb25maWcuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX0JVTkRMRV9QQVJFTlQsIENvbnN0YW50cy5GUkFNRVdPUktfQlVORExFX1BBUkVOVF9FWFQpOwotCQljaGVja1BhcmVudENsYXNzTG9hZGVyKGNvbmZpZ3VyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1CdW5kbGUxOSgpIHsKLQkJLy8gdGVzdCBwYXJlbnQgZnJhbWV3b3JrCi0JCUZpbGUgY29uZmlnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZShnZXROYW1lKCkpOwotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfQlVORExFX1BBUkVOVCwgQ29uc3RhbnRzLkZSQU1FV09SS19CVU5ETEVfUEFSRU5UX0ZSQU1FV09SSyk7Ci0JCWNoZWNrUGFyZW50Q2xhc3NMb2FkZXIoY29uZmlndXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFyZW50Q2xhc3NMb2FkZXIoUHJvcGVydGllcyBjb25maWd1cmF0aW9uKSB7Ci0JCUVxdWlub3ggZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5pbml0KCk7Ci0JCQllcXVpbm94LnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGhlIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlIHRlc3QgPSBudWxsOwotCQl0cnkgewotCQkJdGVzdCA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpLmluc3RhbGxCdW5kbGUoaW5zdGFsbGVyLmdldEJ1bmRsZUxvY2F0aW9uKCJzdWJzdGl0dXRlcy5hIikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gaW5zdGFsbCBidW5kbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlDbGFzcyBhY3RpdmF0b3JDbGF6eiA9IHRlc3QubG9hZENsYXNzKCJzdWJzdGl0dXRlcy54LkF4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUNsYXNzTG9hZGVyIHBhcmVudENMID0gYWN0aXZhdG9yQ2xhenouZ2V0Q2xhc3NMb2FkZXIoKS5nZXRQYXJlbnQoKTsKLQkJCVN0cmluZyBjb25maWdQYXJlbnQgPSBjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KENvbnN0YW50cy5GUkFNRVdPUktfQlVORExFX1BBUkVOVCk7Ci0JCQlpZiAoQ29uc3RhbnRzLkZSQU1FV09SS19CVU5ETEVfUEFSRU5UX0FQUC5lcXVhbHMoY29uZmlnUGFyZW50KSkKLQkJCQlhc3NlcnRUcnVlKCJXcm9uZyBwYXJlbnQiLCBwYXJlbnRDTCA9PSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoQ29uc3RhbnRzLkZSQU1FV09SS19CVU5ETEVfUEFSRU5UX0VYVC5lcXVhbHMoY29uZmlnUGFyZW50KSkKLQkJCQlhc3NlcnRUcnVlKCJXcm9uZyBwYXJlbnQiLCBwYXJlbnRDTCA9PSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLmdldFBhcmVudCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoQ29uc3RhbnRzLkZSQU1FV09SS19CVU5ETEVfUEFSRU5UX0ZSQU1FV09SSy5lcXVhbHMoY29uZmlnUGFyZW50KSkKLQkJCQlhc3NlcnRUcnVlKCJXcm9uZyBwYXJlbnQiLCBwYXJlbnRDTCA9PSBlcXVpbm94LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gbG9hZCBjbGFzcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRnJhbWV3b3JrRXZlbnQgc3RvcEV2ZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0b3BFdmVudCA9IGVxdWlub3gud2FpdEZvclN0b3AoMTAwMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiU3RvcCBldmVudCBpcyBudWxsIiwgc3RvcEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0b3BFdmVudCIsIEZyYW1ld29ya0V2ZW50LlNUT1BQRUQsIHN0b3BFdmVudC5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI1Mzk0MigpIHsKLQkJLy8gY3JlYXRlL3N0YXJ0L3N0b3Avc3RhcnQvc3RvcCB0ZXN0Ci0JCUZpbGUgY29uZmlnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdEJ1ZzI1Mzk0MiIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoIm9zZ2kuYnVuZGxlZmlsZS5saW1pdCIsICIxMCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCi0JCUVxdWlub3ggZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5pbml0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBpbml0KCkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHNob3VsZCBiZSBpbiB0aGUgU1RBUlRJTkcgc3RhdGUKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlNUQVJUSU5HLCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZUNvbnRleHQgc3lzdGVtQ29udGV4dCA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlhc3NlcnROb3ROdWxsKCJTeXN0ZW0gY29udGV4dCBpcyBudWxsIiwgc3lzdGVtQ29udGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdGFydCB0aGUgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJRmlsZVtdIHRlc3RCdW5kbGVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRlc3RCdW5kbGVzID0gY3JlYXRlQnVuZGxlcyhuZXcgRmlsZShjb25maWcsICJidW5kbGVzIiksIDIwKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVycm9yIGNyZWF0aW5nIGJ1ZG5sZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdEJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJc3lzdGVtQ29udGV4dC5pbnN0YWxsQnVuZGxlKCJyZWZlcmVuY2U6ZmlsZTovLy8iICsgdGVzdEJ1bmRsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW5zdGFsbCBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJLy8gcHV0IHRoZSBmcmFtZXdvcmsgYmFjayB0byB0aGUgUkVTT0xWRUQgc3RhdGUKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdGFydCB0aGUgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzeXN0ZW1Db250ZXh0ID0gZXF1aW5veC5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBzeXN0ZW1Db250ZXh0LmdldEJ1bmRsZXMoKTsKLQkJLy8gZ2V0IGFuIGVudHJ5IGZyb20gZWFjaCBidW5kbGUgdG8gZW5zdXJlIGVhY2ggb25lIGdldHMgb3BlbmVkLgotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVuZGxlc1tpXS5nZXRFbnRyeSgiL01FVEEtSU5GL01BTklGRVNULk1GIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCS8vIEFuIGV4Y2VwdGlvbiB1c2VkIHRvIGdldCB0aHJvd24gaGVyZSB3aGVuIHdlIHRyaWVkIHRvIGNsb3NlIAotCQkJLy8gdGhlIGxlYXN0IHVzZWQgYnVuZGxlIGZpbGUKLQkJCWZhaWwoIkZhaWxlZCB0byBnZXQgYnVuZGxlIGVudHJpZXMiLCB0KTsKLQkJfQotCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJvcnIgc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VVJMRXh0ZXJuYWxGb3JtYXQwMSgpIHsKLQkJLy8gY3JlYXRlIG11bHRpcGxlIGluc3RhbmNlcyB0ZXN0Ci0JCUZpbGUgY29uZmlnMSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RVUkxFeHRlcm5hbEZvcm1hdDAxXzEiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24xID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJY29uZmlndXJhdGlvbjEucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnMS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUVxdWlub3ggZXF1aW5veDEgPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uMSk7Ci0JCXRyeSB7Ci0JCQllcXVpbm94MS5pbml0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBpbml0KCkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHNob3VsZCBiZSBpbiB0aGUgU1RBUlRJTkcgc3RhdGUKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlNUQVJUSU5HLCBlcXVpbm94MS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgY29uZmlnMiA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RVUkxFeHRlcm5hbEZvcm1hdDAxXzIiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24yID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJY29uZmlndXJhdGlvbjIucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnMi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUVxdWlub3ggZXF1aW5veDIgPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uMik7Ci0JCXRyeSB7Ci0JCQllcXVpbm94Mi5pbml0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBpbml0KCkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHNob3VsZCBiZSBpbiB0aGUgU1RBUlRJTkcgc3RhdGUKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlNUQVJUSU5HLCBlcXVpbm94Mi5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZUNvbnRleHQgc3lzdGVtQ29udGV4dDEgPSBlcXVpbm94MS5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoIlN5c3RlbSBjb250ZXh0IGlzIG51bGwiLCBzeXN0ZW1Db250ZXh0MSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlQ29udGV4dCBzeXN0ZW1Db250ZXh0MiA9IGVxdWlub3gyLmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQyKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydE5vdFNhbWUoc3lzdGVtQ29udGV4dDEsIHN5c3RlbUNvbnRleHQyKTsKLQotCQlCdW5kbGUgdGVzdDEgPSBudWxsOwotCQlCdW5kbGUgdGVzdDIgPSBudWxsOwotCQl0cnkgewotCQkJdGVzdDEgPSBzeXN0ZW1Db250ZXh0MS5pbnN0YWxsQnVuZGxlKGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigidGVzdCIpKTsvLyROT04tTkxTLTEkCi0JCQl0ZXN0MiA9IHN5c3RlbUNvbnRleHQyLmluc3RhbGxCdW5kbGUoaW5zdGFsbGVyLmdldEJ1bmRsZUxvY2F0aW9uKCJ0ZXN0IikpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJyb3IgaW5zdGFsbGluZyBidW5kbGUiLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJVVJMIGVudHJ5MSA9IHRlc3QxLmdldEVudHJ5KCJkYXRhL3Jlc291cmNlMSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImVudHJ5MSIsIGVudHJ5MSk7IC8vJE5PTi1OTFMtMSQKLQkJVVJMIGVudHJ5MiA9IHRlc3QyLmdldEVudHJ5KCJkYXRhL3Jlc291cmNlMSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImVudHJ5MiIsIGVudHJ5Mik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIkV4dGVybmFsIGZvcm0gaXMgZXF1YWw6ICIgKyBlbnRyeTEudG9FeHRlcm5hbEZvcm0oKSwgZW50cnkxLnRvRXh0ZXJuYWxGb3JtKCkuZXF1YWxzKGVudHJ5Mi50b0V4dGVybmFsRm9ybSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIkhvc3QgaXMgZXF1YWw6ICIgKyBlbnRyeTEuZ2V0SG9zdCgpLCBlbnRyeTEuZ2V0SG9zdCgpLmVxdWFscyhlbnRyeTIuZ2V0SG9zdCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIlVSTCBpcyBlcXVhbDogIiArIGVudHJ5MS50b0V4dGVybmFsRm9ybSgpLCBlbnRyeTEuZXF1YWxzKGVudHJ5MikpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlIHN1YnN0aXR1dGVzMSA9IG51bGw7Ci0JCUJ1bmRsZSBzdWJzdGl0dXRlczIgPSBudWxsOwotCQl0cnkgewotCQkJc3Vic3RpdHV0ZXMxID0gc3lzdGVtQ29udGV4dDEuaW5zdGFsbEJ1bmRsZShpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInN1YnN0aXR1dGVzLmEiKSk7Ly8kTk9OLU5MUy0xJAotCQkJc3Vic3RpdHV0ZXMyID0gc3lzdGVtQ29udGV4dDIuaW5zdGFsbEJ1bmRsZShpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInN1YnN0aXR1dGVzLmEiKSk7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcnJvciBpbnN0YWxsaW5nIGJ1bmRsZSIsIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVudHJ5MSA9IHN1YnN0aXR1dGVzMS5nZXRSZXNvdXJjZSgiZGF0YS9yZXNvdXJjZTEiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJlbnRyeTEiLCBlbnRyeTEpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5MiA9IHN1YnN0aXR1dGVzMi5nZXRSZXNvdXJjZSgiZGF0YS9yZXNvdXJjZTEiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJlbnRyeTIiLCBlbnRyeTIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCJFeHRlcm5hbCBmb3JtIGlzIGVxdWFsOiAiICsgZW50cnkxLnRvRXh0ZXJuYWxGb3JtKCksIGVudHJ5MS50b0V4dGVybmFsRm9ybSgpLmVxdWFscyhlbnRyeTIudG9FeHRlcm5hbEZvcm0oKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCJIb3N0IGlzIGVxdWFsOiAiICsgZW50cnkxLmdldEhvc3QoKSwgZW50cnkxLmdldEhvc3QoKS5lcXVhbHMoZW50cnkyLmdldEhvc3QoKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCJVUkwgaXMgZXF1YWw6ICIgKyBlbnRyeTEudG9FeHRlcm5hbEZvcm0oKSwgZW50cnkxLmVxdWFscyhlbnRyeTIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHB1dCB0aGUgZnJhbWV3b3JrIDEgYmFjayB0byB0aGUgUkVTT0xWRUQgc3RhdGUKLQkJdHJ5IHsKLQkJCWVxdWlub3gxLnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJyb3Igc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veDEud2FpdEZvclN0b3AoMTAwMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94MS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHB1dCB0aGUgZnJhbWV3b3JrIDIgYmFjayB0byB0aGUgUkVTT0xWRUQgc3RhdGUKLQkJdHJ5IHsKLQkJCWVxdWlub3gyLnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJvcnIgc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veDIud2FpdEZvclN0b3AoMTAwMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94Mi5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVbXSBjcmVhdGVCdW5kbGVzKEZpbGUgb3V0cHV0RGlyLCBpbnQgYnVuZGxlQ291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dHB1dERpci5ta2RpcnMoKTsKLQotCQlGaWxlW10gYnVuZGxlcyA9IG5ldyBGaWxlW2J1bmRsZUNvdW50XTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZUNvdW50OyBpKyspCi0JCQlidW5kbGVzW2ldID0gY3JlYXRlQnVuZGxlKG91dHB1dERpciwgIi1iIiArIGkpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGJ1bmRsZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBjcmVhdGVCdW5kbGUoRmlsZSBvdXRwdXREaXIsIFN0cmluZyBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUob3V0cHV0RGlyLCAiYnVuZGxlIiArIGlkICsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUphck91dHB1dFN0cmVhbSBqb3MgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpLCBjcmVhdGVNYW5pZmVzdChpZCkpOwotCQlqb3MuZmx1c2goKTsKLQkJam9zLmNsb3NlKCk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hbmlmZXN0IGNyZWF0ZU1hbmlmZXN0KFN0cmluZyBpZCkgewotCQlNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdCgpOwotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpOwotCQlhdHRyaWJ1dGVzLnB1dFZhbHVlKCJNYW5pZmVzdC1WZXJzaW9uIiwgIjEuMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXR0cmlidXRlcy5wdXRWYWx1ZSgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhdHRyaWJ1dGVzLnB1dFZhbHVlKCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgImJ1bmRsZSIgKyBpZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvVGVzdFJlc3VsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9idW5kbGVzL1Rlc3RSZXN1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTY3NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2J1bmRsZXMvVGVzdFJlc3VsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotcHVibGljIGNsYXNzIFRlc3RSZXN1bHRzIHsKLQlBcnJheUxpc3QgZXZlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBhZGRFdmVudChPYmplY3QgZXZlbnQpIHsKLQkJZXZlbnRzLmFkZChldmVudCk7Ci0JCW5vdGlmeUFsbCgpOwotCX0KLQlzeW5jaHJvbml6ZWQgcHVibGljIE9iamVjdFtdIGdldFJlc3VsdHMoaW50IGV4cGVjdGVkUmVzdWx0c051bWJlcikgewotCQl3aGlsZSAoZXZlbnRzLnNpemUoKSA8IGV4cGVjdGVkUmVzdWx0c051bWJlcikgewotCQkJaW50IGN1cnJlbnRTaXplID0gZXZlbnRzLnNpemUoKTsKLQkJCXRyeSB7Ci0JCQkJd2FpdCg1MDAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlpZiAoY3VycmVudFNpemUgPT0gZXZlbnRzLnNpemUoKSkKLQkJCQlicmVhazsgLy8gbm8gbmV3IGV2ZW50cyBvY2N1cnJlZDsgYnJlYWsgb3V0Ci0JCX0KLQkJT2JqZWN0W10gcmVzdWx0ID0gZXZlbnRzLnRvQXJyYXkoKTsKLQkJZXZlbnRzLmNsZWFyKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9jb21wb3NpdGVzL0Fic3RyYWN0Q29tcG9zaXRlVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9jb21wb3NpdGVzL0Fic3RyYWN0Q29tcG9zaXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxM2JhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29tcG9zaXRlcy9BYnN0cmFjdENvbXBvc2l0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuY29tcG9zaXRlczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5CdW5kbGVJbnN0YWxsZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLmxhdW5jaC5GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyQ3VzdG9taXplcjsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0Q29tcG9zaXRlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEFic3RyYWN0Q29tcG9zaXRlVGVzdHMuY2xhc3MpOwotCX0KLQotCVNlcnZpY2VSZWdpc3RyYXRpb24gaW5zdGFsbGVyUmVnOwotCVNlcnZpY2VSZWZlcmVuY2UgbGlua0J1bmRsZUZhY3RvcnlSZWY7Ci0JQ29tcG9zaXRlQnVuZGxlRmFjdG9yeSBsaW5rQnVuZGxlRmFjdG9yeTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWxpbmtCdW5kbGVGYWN0b3J5UmVmID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKENvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTGlua0J1bmRsZUZhY3RvcnkgcmVmZXJlbmNlIGlzIG51bGwiLCBsaW5rQnVuZGxlRmFjdG9yeVJlZik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua0J1bmRsZUZhY3RvcnkgPSAoQ29tcG9zaXRlQnVuZGxlRmFjdG9yeSkgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlKGxpbmtCdW5kbGVGYWN0b3J5UmVmKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTGlua0J1bmRsZUZhY3Rvcnkgc2VydmljZSBpcyBudWxsIiwgbGlua0J1bmRsZUZhY3RvcnkpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5zdGFsbGVyUmVnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoQnVuZGxlSW5zdGFsbGVyLmNsYXNzLmdldE5hbWUoKSwgaW5zdGFsbGVyLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlpZiAobGlua0J1bmRsZUZhY3RvcnlSZWYgIT0gbnVsbCkgewotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UobGlua0J1bmRsZUZhY3RvcnlSZWYpOwotCQkJbGlua0J1bmRsZUZhY3RvcnlSZWYgPSBudWxsOwotCQkJbGlua0J1bmRsZUZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCWlmIChpbnN0YWxsZXJSZWcgIT0gbnVsbCkKLQkJCWluc3RhbGxlclJlZy51bnJlZ2lzdGVyKCk7Ci0JfQotCi0JQ29tcG9zaXRlQnVuZGxlIGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShDb21wb3NpdGVCdW5kbGVGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBsb2NhdGlvbiwgTWFwIGNvbmZpZ3VyYXRpb24sIE1hcCBsaW5rTWFuaWZlc3QsIGJvb2xlYW4gc3RhcnQsIGJvb2xlYW4gc2VjdXJpdHkpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoc2VjdXJpdHkpCi0JCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NFQ1VSSVRZLCAib3NnaSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsaW5rTWFuaWZlc3QgPT0gbnVsbCkgewotCQkJbGlua01hbmlmZXN0ID0gbmV3IEhhc2hNYXAoKTsKLQkJCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIGxvY2F0aW9uKTsKLQkJfQotCQlDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbXBvc2l0ZSA9IGZhY3RvcnkuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShjb25maWd1cmF0aW9uLCBsb2NhdGlvbiwgbGlua01hbmlmZXN0KTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNyZWF0aW5nIGNvbXBvc2l0ZSBidW5kbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoIkNvbXBvc2l0ZSBpcyBudWxsIiwgY29tcG9zaXRlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbXBvc2l0ZSBsb2NhdGlvbiIsIGxvY2F0aW9uLCBjb21wb3NpdGUuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlNUQVJUSU5HLCBjb21wb3NpdGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3Vycm9nYXRlQnVuZGxlIHN1cnJvZ2F0ZSA9IGNvbXBvc2l0ZS5nZXRTdXJyb2dhdGVCdW5kbGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3Vycm9nYXRlIGlzIG51bGwiLCBzdXJyb2dhdGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3Vycm9ndGUgbG9jYXRpb24iLCBsb2NhdGlvbiwgc3Vycm9nYXRlLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzdGFydCkKLQkJCXN0YXJ0Q29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZSwgZmFsc2UpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUlucHV0U3RyZWFtIGdldEJ1bmRsZUlucHV0KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVVSTCBidW5kbGVqYXIgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJ0ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkLmphciIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChidW5kbGVqYXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCdW5kbGVFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHRlc3QgYnVuZGxlIGphciIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlyZXR1cm4gYnVuZGxlamFyLm9wZW5TdHJlYW0oKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJ1bmRsZUV4Y2VwdGlvbigiQ2Fubm90IG9wZW4gdGVzdCBidW5kbGUgc3RyZWFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXZvaWQgd2FpdEZvclN0YXRlQ2hhbmdlKEJ1bmRsZSBidW5kbGUsIGludCBjaGFuZ2VGcm9tKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAgJiYgKGJ1bmRsZS5nZXRTdGF0ZSgpICYgY2hhbmdlRnJvbSkgIT0gMDsgaSsrKQotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBub3RoaW5nCi0JCQl9Ci0JCWFzc2VydFRydWUoIldyb25nIGJ1bmRsZSBzdGF0ZTogIiArIGJ1bmRsZS5nZXRTdGF0ZSgpLCAoYnVuZGxlLmdldFN0YXRlKCkgJiBjaGFuZ2VGcm9tKSA9PSAwKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JQnVuZGxlIGluc3RhbGxJbnRvQ3VycmVudChTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZShuYW1lKTsKLQkJCWluc3RhbGxlci5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge3Rlc3RCdW5kbGV9KTsKLQkJCXJldHVybiB0ZXN0QnVuZGxlOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGluc3RhbGwgdGVzdCBidW5kbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUJ1bmRsZSBpbnN0YWxsSW50b0NoaWxkKEZyYW1ld29yayBmcmFtZXdvcmssIFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZnJhbWV3b3JrLmdldEJ1bmRsZUNvbnRleHQoKS5pbnN0YWxsQnVuZGxlKGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbihuYW1lKSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gaW5zdGFsbCB0ZXN0IGJ1bmRsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jdm9pZCBzdGFydENvbXBvc2l0ZUJ1bmRsZShDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlLCBib29sZWFuIGV4cGVjdEZhaWx1cmUpIHsKLQkJYm9vbGVhbiBjaGlsZEZyYW1ld29ya0FjdGl2ZSA9IGNvbXBvc2l0ZS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkU7Ci0JCXRyeSB7Ci0JCQljb21wb3NpdGUuc3RhcnQoKTsKLQkJCWlmIChleHBlY3RGYWlsdXJlKQotCQkJCWZhaWwoIkV4cGVjdGVkIGFuIGV4Y2VwdGlvbiBzdGFydGluZyBjb21wb3NpdGUgYnVuZGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWlmICghZXhwZWN0RmFpbHVyZSkKLQkJCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgY29tcG9zaXRlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlGcmFtZXdvcmsgY2hpbGRGcmFtZXdvcmsgPSBjb21wb3NpdGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCk7Ci0JCWludCBleHBlY3RlZFN0YXRlID0gZXhwZWN0RmFpbHVyZSAmJiAhY2hpbGRGcmFtZXdvcmtBY3RpdmUgPyBCdW5kbGUuU1RBUlRJTkcgOiBCdW5kbGUuQUNUSVZFOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBleHBlY3RlZFN0YXRlLCBjaGlsZEZyYW1ld29yay5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXZvaWQgc3RvcENvbXBvc2l0ZUJ1bmRsZShDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlKSB7Ci0JCUZyYW1ld29yayBjaGlsZEZyYW1ld29yayA9IGNvbXBvc2l0ZS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKTsKLQkJdHJ5IHsKLQkJCWNvbXBvc2l0ZS5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVycm9yIHN0b3BwaW5nIGNvbXBvc2l0ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJRnJhbWV3b3JrRXZlbnQgc3RvcEV2ZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0b3BFdmVudCA9IGNoaWxkRnJhbWV3b3JrLndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoIlN0b3AgZXZlbnQgaXMgbnVsbCIsIHN0b3BFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdG9wRXZlbnQiLCBGcmFtZXdvcmtFdmVudC5TVE9QUEVELCBzdG9wRXZlbnQuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgY2hpbGRGcmFtZXdvcmsuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQl2b2lkIHVuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlKSB7Ci0JCUZyYW1ld29yayBjaGlsZEZyYW1ld29yayA9IGNvbXBvc2l0ZS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKTsKLQkJdHJ5IHsKLQkJCWNvbXBvc2l0ZS51bmluc3RhbGwoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJyb3IgdW5pbnN0YWxsaW5nIGNvbXBvc2l0ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBjaGlsZEZyYW1ld29yay5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCVBhY2thZ2VBZG1pbiBnZXRQYWNrYWdlQWRtaW4oQnVuZGxlIGZyYW1ld29yaykgewotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBmcmFtZXdvcmsuZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlyZXR1cm4gKFBhY2thZ2VBZG1pbikgY29udGV4dC5nZXRTZXJ2aWNlKGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JQ29tcG9zaXRlQnVuZGxlRmFjdG9yeSBnZXRGYWN0b3J5KEJ1bmRsZSBmcmFtZXdvcmspIHsKLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gZnJhbWV3b3JrLmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQ2hpbGQgY29udGV4dCBpcyBudWxsLiIsIGNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKENvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRmFjdG9yeSByZWZlcmVuY2UgaXMgbnVsbCIsIHJlZik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlRmFjdG9yeSBmYWN0b3J5ID0gKENvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkpIGNvbnRleHQuZ2V0U2VydmljZShyZWYpOwotCQlhc3NlcnROb3ROdWxsKCJmYWN0b3J5IHNlcnZpY2UgaXMgbnVsbCIsIGZhY3RvcnkpOyAvLyROT04tTkxTLTEkCi0JCS8vIGp1c3QgcmVsZWFzZSBub3cgdG8gbWFrZSB0ZXN0Y29kZSBzaW1wbGUKLQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmKTsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JY2xhc3MgVGVzdFNlcnZpY2VMaXN0ZW5lciBpbXBsZW1lbnRzIFNlcnZpY2VMaXN0ZW5lciB7Ci0JCWZpbmFsIGludFtdIHJlc3VsdHMgPSBuZXcgaW50WzRdOwotCi0JCXB1YmxpYyBpbnRbXSBnZXRSZXN1bHRzKCkgewotCQkJcmV0dXJuIHJlc3VsdHM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXJ2aWNlQ2hhbmdlZChTZXJ2aWNlRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCA6Ci0JCQkJCSsrcmVzdWx0c1swXTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQgOgotCQkJCQkrK3Jlc3VsdHNbMV07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIDoKLQkJCQkJKytyZXN1bHRzWzJdOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIDoKLQkJCQkJKytyZXN1bHRzWzNdOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBUZXN0VHJhY2tlckN1c3RvbWl6ZXIgaW1wbGVtZW50cyBTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIgewotCQlmaW5hbCBpbnRbXSByZXN1bHRzID0gbmV3IGludFszXTsKLQotCQlwdWJsaWMgaW50W10gZ2V0UmVzdWx0cygpIHsKLQkJCXJldHVybiByZXN1bHRzOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBhZGRpbmdTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCQkrK3Jlc3VsdHNbMF07Ci0JCQlyZXR1cm4gcmVmZXJlbmNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZpZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewotCQkJKytyZXN1bHRzWzFdOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBzZXJ2aWNlKSB7Ci0JCQkrK3Jlc3VsdHNbMl07Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29tcG9zaXRlcy9BbGxDb21wb3NpdGVUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2NvbXBvc2l0ZXMvQWxsQ29tcG9zaXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwMWExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29tcG9zaXRlcy9BbGxDb21wb3NpdGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuY29tcG9zaXRlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxDb21wb3NpdGVUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbENvbXBvc2l0ZVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQ29tcG9zaXRlQ3JlYXRlVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQ29tcG9zaXRlU2hhcmVUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChDb21wb3NpdGVTZWN1cml0eVRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2NvbXBvc2l0ZXMvQ29tcG9zaXRlQ3JlYXRlVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9jb21wb3NpdGVzL0NvbXBvc2l0ZUNyZWF0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTJiMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2NvbXBvc2l0ZXMvQ29tcG9zaXRlQ3JlYXRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5jb21wb3NpdGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZnJhbWV3b3JrLkNvbXBvc2l0ZUJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmZyYW1ld29yay5Db21wb3NpdGVCdW5kbGVGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQ3JlYXRlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdENvbXBvc2l0ZVRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENvbXBvc2l0ZUNyZWF0ZVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ29tcG9zaXRlMDEoKSB7Ci0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJ0ZXN0Q3JlYXRlQ29tcG9zaXRlMDEiLCBudWxsLCBudWxsLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJc3RhcnRDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlLCBmYWxzZSk7Ci0JCXN0b3BDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlKTsKLQkJdW5pbnN0YWxsQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBvc2l0ZTAyKCkgewotCQlDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlTGV2ZWwwID0gY3JlYXRlQ29tcG9zaXRlQnVuZGxlKGxpbmtCdW5kbGVGYWN0b3J5LCAiY29tcG9zaXRlTGV2ZWwwIiwgbnVsbCwgbnVsbCwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoY29tcG9zaXRlTGV2ZWwwLmdldENvbXBvc2l0ZUZyYW1ld29yaygpKTsKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZUxldmVsMV8xID0gY3JlYXRlQ29tcG9zaXRlQnVuZGxlKGZhY3RvcnksICJjb21wb3NpdGVMZXZlbDFfMSIsIG51bGwsIG51bGwsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlTGV2ZWwxXzIgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUoZmFjdG9yeSwgImNvbXBvc2l0ZUxldmVsMV8yIiwgbnVsbCwgbnVsbCwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgaWRMZXZlbDFfMSA9IGNvbXBvc2l0ZUxldmVsMV8xLmdldEJ1bmRsZUlkKCk7Ci0JCWxvbmcgaWRMZXZlbDFfMiA9IGNvbXBvc2l0ZUxldmVsMV8yLmdldEJ1bmRsZUlkKCk7Ci0KLQkJc3RvcENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVMZXZlbDApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGNvbXBvc2l0ZUxldmVsMV8xLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgY29tcG9zaXRlTGV2ZWwxXzIuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVMZXZlbDAsIGZhbHNlKTsKLQkJLy8gbmVlZCB0byByZWdldCB0aGUgYnVuZGxlcyBmcm9tIGNoaWxkIGZyYW1ld29ya3MgdGhhdCB3ZXJlIHJlc3RhcnRlZAotCQljb21wb3NpdGVMZXZlbDFfMSA9IChDb21wb3NpdGVCdW5kbGUpIGNvbXBvc2l0ZUxldmVsMC5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRCdW5kbGVDb250ZXh0KCkuZ2V0QnVuZGxlKGlkTGV2ZWwxXzEpOwotCQljb21wb3NpdGVMZXZlbDFfMiA9IChDb21wb3NpdGVCdW5kbGUpIGNvbXBvc2l0ZUxldmVsMC5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRCdW5kbGVDb250ZXh0KCkuZ2V0QnVuZGxlKGlkTGV2ZWwxXzIpOwotCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGNvbXBvc2l0ZUxldmVsMV8xLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGNvbXBvc2l0ZUxldmVsMV8yLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJdW5pbnN0YWxsQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUxldmVsMCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgY29tcG9zaXRlTGV2ZWwxXzEuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBjb21wb3NpdGVMZXZlbDFfMS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDb21wb3NpdGUwMygpIHsKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZUxldmVsMCA9IGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShsaW5rQnVuZGxlRmFjdG9yeSwgImNvbXBvc2l0ZUxldmVsMCIsIG51bGwsIG51bGwsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wb3NpdGVCdW5kbGVGYWN0b3J5IGZhY3RvcnlMZXZlbDEgPSBnZXRGYWN0b3J5KGNvbXBvc2l0ZUxldmVsMC5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKSk7Ci0JCS8vIGNyZWF0ZSB0d28gbGV2ZWwgMSBjb21wb3NpdGVzCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGVMZXZlbDFfMSA9IGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShmYWN0b3J5TGV2ZWwxLCAiY29tcG9zaXRlTGV2ZWwxXzEiLCBudWxsLCBudWxsLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZUxldmVsMV8yID0gY3JlYXRlQ29tcG9zaXRlQnVuZGxlKGZhY3RvcnlMZXZlbDEsICJjb21wb3NpdGVMZXZlbDFfMiIsIG51bGwsIG51bGwsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNyZWF0ZSB0d28gbGV2ZWwgMiBjb21wb3NpdGVzIHVuZGVyIDFfMQotCQlDb21wb3NpdGVCdW5kbGVGYWN0b3J5IGZhY3RvcnlMZXZlbDJfMSA9IGdldEZhY3RvcnkoY29tcG9zaXRlTGV2ZWwxXzEuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkpOwotCQlDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlTGV2ZWwyXzEgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUoZmFjdG9yeUxldmVsMl8xLCAiY29tcG9zaXRlTGV2ZWwyXzEiLCBudWxsLCBudWxsLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZUxldmVsMl8yID0gY3JlYXRlQ29tcG9zaXRlQnVuZGxlKGZhY3RvcnlMZXZlbDJfMSwgImNvbXBvc2l0ZUxldmVsMl8yIiwgbnVsbCwgbnVsbCwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgaWRMZXZlbDJfMSA9IGNvbXBvc2l0ZUxldmVsMl8xLmdldEJ1bmRsZUlkKCk7Ci0JCWxvbmcgaWRMZXZlbDJfMiA9IGNvbXBvc2l0ZUxldmVsMl8yLmdldEJ1bmRsZUlkKCk7Ci0KLQkJLy8gY3JlYXRlIHR3byBsZXZlbCAyIGNvbXBvc2l0ZXMgdW5kZXIgMV8yCi0JCUNvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkgZmFjdG9yeUxldmVsMl8yID0gZ2V0RmFjdG9yeShjb21wb3NpdGVMZXZlbDFfMi5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKSk7Ci0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGVMZXZlbDJfMyA9IGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShmYWN0b3J5TGV2ZWwyXzIsICJjb21wb3NpdGVMZXZlbDJfMyIsIG51bGwsIG51bGwsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlTGV2ZWwyXzQgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUoZmFjdG9yeUxldmVsMl8yLCAiY29tcG9zaXRlTGV2ZWwyXzQiLCBudWxsLCBudWxsLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJbG9uZyBpZExldmVsMl8zID0gY29tcG9zaXRlTGV2ZWwyXzMuZ2V0QnVuZGxlSWQoKTsKLQkJbG9uZyBpZExldmVsMl80ID0gY29tcG9zaXRlTGV2ZWwyXzQuZ2V0QnVuZGxlSWQoKTsKLQotCQlzdG9wQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUxldmVsMV8xKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBjb21wb3NpdGVMZXZlbDJfMS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGNvbXBvc2l0ZUxldmVsMl8yLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGNvbXBvc2l0ZUxldmVsMl8zLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGNvbXBvc2l0ZUxldmVsMl80LmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhcnRDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlTGV2ZWwxXzEsIGZhbHNlKTsKLQkJLy8gbmVlZCB0byByZWdldCB0aGUgYnVuZGxlcyBmcm9tIGNoaWxkIGZyYW1ld29ya3MgdGhhdCB3ZXJlIHJlc3RhcnRlZAotCQljb21wb3NpdGVMZXZlbDJfMSA9IChDb21wb3NpdGVCdW5kbGUpIGNvbXBvc2l0ZUxldmVsMV8xLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldEJ1bmRsZUNvbnRleHQoKS5nZXRCdW5kbGUoaWRMZXZlbDJfMSk7Ci0JCWNvbXBvc2l0ZUxldmVsMl8yID0gKENvbXBvc2l0ZUJ1bmRsZSkgY29tcG9zaXRlTGV2ZWwxXzEuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0QnVuZGxlQ29udGV4dCgpLmdldEJ1bmRsZShpZExldmVsMl8yKTsKLQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBjb21wb3NpdGVMZXZlbDJfMS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBjb21wb3NpdGVMZXZlbDJfMi5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBjb21wb3NpdGVMZXZlbDJfMy5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBjb21wb3NpdGVMZXZlbDJfNC5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0b3BDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlTGV2ZWwxXzIpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBjb21wb3NpdGVMZXZlbDJfMS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuQUNUSVZFLCBjb21wb3NpdGVMZXZlbDJfMi5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGNvbXBvc2l0ZUxldmVsMl8zLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgY29tcG9zaXRlTGV2ZWwyXzQuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVMZXZlbDFfMiwgZmFsc2UpOwotCQkvLyBuZWVkIHRvIHJlZ2V0IHRoZSBidW5kbGVzIGZyb20gY2hpbGQgZnJhbWV3b3JrcyB0aGF0IHdlcmUgcmVzdGFydGVkCi0JCWNvbXBvc2l0ZUxldmVsMl8zID0gKENvbXBvc2l0ZUJ1bmRsZSkgY29tcG9zaXRlTGV2ZWwxXzIuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0QnVuZGxlQ29udGV4dCgpLmdldEJ1bmRsZShpZExldmVsMl8zKTsKLQkJY29tcG9zaXRlTGV2ZWwyXzQgPSAoQ29tcG9zaXRlQnVuZGxlKSBjb21wb3NpdGVMZXZlbDFfMi5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRCdW5kbGVDb250ZXh0KCkuZ2V0QnVuZGxlKGlkTGV2ZWwyXzQpOwotCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGNvbXBvc2l0ZUxldmVsMl8xLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGNvbXBvc2l0ZUxldmVsMl8yLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGNvbXBvc2l0ZUxldmVsMl8zLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGNvbXBvc2l0ZUxldmVsMl80LmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJdW5pbnN0YWxsQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUxldmVsMCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgY29tcG9zaXRlTGV2ZWwyXzEuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBjb21wb3NpdGVMZXZlbDJfMi5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGNvbXBvc2l0ZUxldmVsMl8zLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgY29tcG9zaXRlTGV2ZWwyXzQuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBjb21wb3NpdGVMZXZlbDFfMS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGNvbXBvc2l0ZUxldmVsMV8yLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2NvbXBvc2l0ZXMvQ29tcG9zaXRlU2VjdXJpdHlUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2NvbXBvc2l0ZXMvQ29tcG9zaXRlU2VjdXJpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGVhMWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9jb21wb3NpdGVzL0NvbXBvc2l0ZVNlY3VyaXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5jb21wb3NpdGVzOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5mcmFtZXdvcmsuQ29tcG9zaXRlQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZnJhbWV3b3JrLkNvbXBvc2l0ZUJ1bmRsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wZXJtaXNzaW9uYWRtaW4uUGVybWlzc2lvbkluZm87Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVTZWN1cml0eVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RDb21wb3NpdGVUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDb21wb3NpdGVTZWN1cml0eVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFBvbGljeSBwcmV2aW91c1BvbGljeTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWZhaWwoIkNhbm5vdCB0ZXN0IHdpdGggc2VjdXJpdHkgbWFuYWdlciBzZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlwcmV2aW91c1BvbGljeSA9IFBvbGljeS5nZXRQb2xpY3koKTsKLQkJZmluYWwgUGVybWlzc2lvbiBhbGxQZXJtaXNzaW9uID0gbmV3IEFsbFBlcm1pc3Npb24oKTsKLQkJZmluYWwgUGVybWlzc2lvbkNvbGxlY3Rpb24gYWxsUGVybWlzc2lvbnMgPSBuZXcgUGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4MTMxMzQ5NDk0NzA4Mjc3TDsKLQotCQkJLy8gQSBzaW1wbGUgUGVybWlzc2lvbkNvbGxlY3Rpb24gdGhhdCBvbmx5IGhhcyBBbGxQZXJtaXNzaW9uCi0JCQlwdWJsaWMgdm9pZCBhZGQoUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7Ci0JCQkJLy9ubyBhZGRpbmcgdG8gdGhpcyBwb2xpY3kKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQkJCXJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7Ci0JCQkJCWludCBjdXIgPSAwOwotCi0JCQkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCQkJCXJldHVybiBjdXIgPCAxOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJCQkJCWlmIChjdXIgPT0gMCkgewotCQkJCQkJCWN1ciA9IDE7Ci0JCQkJCQkJcmV0dXJuIGFsbFBlcm1pc3Npb247Ci0JCQkJCQl9Ci0JCQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQotCQlQb2xpY3kuc2V0UG9saWN5KG5ldyBQb2xpY3koKSB7Ci0KLQkJCXB1YmxpYyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBnZXRQZXJtaXNzaW9ucyhDb2RlU291cmNlIGNvZGVzb3VyY2UpIHsKLQkJCQlyZXR1cm4gYWxsUGVybWlzc2lvbnM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCi0JCX0pOwotCQlzdXBlci5zZXRVcCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7Ci0JCVBvbGljeS5zZXRQb2xpY3kocHJldmlvdXNQb2xpY3kpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaW5rU2VjdXJpdHkwMSgpIHsKLQkJTWFwIGxpbmtNYW5pZmVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0TGlua1NlY3VyaXR5MDEiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkuQ09NUE9TSVRFX1NFUlZJQ0VfRklMVEVSX0lNUE9SVCwgIihvYmplY3RDbGFzcz1vcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQnVuZGxlSW5zdGFsbGVyKSIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJ0ZXN0TGlua1NlY3VyaXR5MDEiLCBudWxsLCBsaW5rTWFuaWZlc3QsIHRydWUsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhcnRDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlLCBmYWxzZSk7Ci0KLQkJc3RvcENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGUpOwotCi0JCXVuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaW5rU2VjdXJpdHkwMigpIHsKLQkJTWFwIGxpbmtNYW5pZmVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0TGlua1NlY3VyaXR5MDIiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkuQ09NUE9TSVRFX1NFUlZJQ0VfRklMVEVSX0lNUE9SVCwgIihvYmplY3RDbGFzcz1vcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQnVuZGxlSW5zdGFsbGVyKSIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJ0ZXN0TGlua1NlY3VyaXR5MDIiLCBudWxsLCBsaW5rTWFuaWZlc3QsIHRydWUsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSBsaW5rRCA9IGluc3RhbGxJbnRvQ2hpbGQoY29tcG9zaXRlLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLCAidGVzdC5saW5rLmQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNvbmRpdGlvbkluZm9bXSBjb25kaXRpb25zID0gbmV3IENvbmRpdGlvbkluZm9bXSB7bmV3IENvbmRpdGlvbkluZm8oQnVuZGxlTG9jYXRpb25Db25kaXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBuZXcgU3RyaW5nW10ge2xpbmtELmdldExvY2F0aW9uKCl9KX07Ci0JCUNvbmRpdGlvbmFsUGVybWlzc2lvbkFkbWluIGNoaWxkQ29uZEFkbWluID0gZ2V0Q29uZFBlcm1BZG1pbihjb21wb3NpdGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0QnVuZGxlQ29udGV4dCgpKTsKLQkJY2hpbGRDb25kQWRtaW4uYWRkQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhjb25kaXRpb25zLCBuZXcgUGVybWlzc2lvbkluZm9bXSB7bmV3IFBlcm1pc3Npb25JbmZvKCIodGVzdCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlsaW5rRC5zdGFydCgpOwotCQkJZmFpbCgiU2hvdWxkIGZhaWwgdG8gc3RhcnQgdGVzdC5saW5rLmQiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBleGNlcHRpb24gdHlwZSIsIEJ1bmRsZUV4Y2VwdGlvbi5SRVNPTFZFX0VSUk9SLCBlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUgPSBjaGlsZENvbmRBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCBpbmZvcyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBpbmZvcyIsIDEsIGluZm9zLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5mb3MuY2xlYXIoKTsKLQotCQlQZXJtaXNzaW9uSW5mbyBwYWNrYWdlUGVybSA9IG5ldyBQZXJtaXNzaW9uSW5mbyhQYWNrYWdlUGVybWlzc2lvbi5jbGFzcy5nZXROYW1lKCksICIqIiwgUGFja2FnZVBlcm1pc3Npb24uSU1QT1JUKTsgLy8kTk9OLU5MUy0xJAotCQlQZXJtaXNzaW9uSW5mbyBzZXJ2aWNlUGVybSA9IG5ldyBQZXJtaXNzaW9uSW5mbyhTZXJ2aWNlUGVybWlzc2lvbi5jbGFzcy5nZXROYW1lKCksICIqIiwgU2VydmljZVBlcm1pc3Npb24uR0VUICsgJywnICsgU2VydmljZVBlcm1pc3Npb24uUkVHSVNURVIpOyAvLyROT04tTkxTLTEkCi0JCVBlcm1pc3Npb25JbmZvIGFsbFBlcm0gPSBuZXcgUGVybWlzc2lvbkluZm8oQWxsUGVybWlzc2lvbi5jbGFzcy5nZXROYW1lKCksICIqIiwgIioiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVBlcm1pc3Npb25JbmZvW10gcGVybWlzc2lvbnMgPSBuZXcgUGVybWlzc2lvbkluZm9bXSB7cGFja2FnZVBlcm19OwotCQlpbmZvcy5hZGQoY2hpbGRDb25kQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbygidGVzdC5saW5rLmQiLCBjb25kaXRpb25zLCBwZXJtaXNzaW9ucywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZS5jb21taXQoKTsKLQotCQl0cnkgewotCQkJbGlua0Quc3RhcnQoKTsKLQkJCWZhaWwoIlNob3VsZCBmYWlsIHRvIHN0YXJ0IHRlc3QubGluay5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uQUNUSVZBVE9SX0VSUk9SLCBlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZSIsICJNaXNzaW5nIFNlcnZpY2UgUGVybWlzc2lvbiIsIGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJdXBkYXRlID0gY2hpbGRDb25kQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7Ci0JCWluZm9zID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGluZm9zIiwgMSwgaW5mb3Muc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZvcy5jbGVhcigpOwotCQlwZXJtaXNzaW9ucyA9IG5ldyBQZXJtaXNzaW9uSW5mb1tdIHtwYWNrYWdlUGVybSwgc2VydmljZVBlcm19OwotCQlpbmZvcy5hZGQoY2hpbGRDb25kQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbygidGVzdC5saW5rLmQiLCBjb25kaXRpb25zLCBwZXJtaXNzaW9ucywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZS5jb21taXQoKTsKLQotCQl0cnkgewotCQkJbGlua0Quc3RhcnQoKTsKLQkJCWZhaWwoIlNob3VsZCBmYWlsIHRvIHN0YXJ0IHRlc3QubGluay5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uQUNUSVZBVE9SX0VSUk9SLCBlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZSIsICJNaXNzaW5nIEFsbFBlcm1pc3Npb25zIiwgZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQotCQl1cGRhdGUgPSBjaGlsZENvbmRBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJaW5mb3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgaW5mb3MiLCAxLCBpbmZvcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCWluZm9zLmNsZWFyKCk7Ci0JCXBlcm1pc3Npb25zID0gbmV3IFBlcm1pc3Npb25JbmZvW10ge2FsbFBlcm19OwotCQlpbmZvcy5hZGQoY2hpbGRDb25kQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbygidGVzdC5saW5rLmQiLCBjb25kaXRpb25zLCBwZXJtaXNzaW9ucywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZS5jb21taXQoKTsKLQotCQl0cnkgewotCQkJbGlua0Quc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXVuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaW5rU2VjdXJpdHkwMygpIHsKLQkJTWFwIGxpbmtNYW5pZmVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0TGlua1NlY3VyaXR5MDMiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkuQ09NUE9TSVRFX1NFUlZJQ0VfRklMVEVSX0lNUE9SVCwgIihvYmplY3RDbGFzcz1vcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQnVuZGxlSW5zdGFsbGVyKSIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJ0ZXN0TGlua1NlY3VyaXR5MDMiLCBudWxsLCBsaW5rTWFuaWZlc3QsIHRydWUsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlIGNvbmRpdGlvbkJ1bmRsZSA9IGluc3RhbGxJbnRvQ2hpbGQoY29tcG9zaXRlLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLCAidGVzdC5saW5rLnBvc3Rwb25lZCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkNvbmRpdGlvbiBidW5kbGUgbm90IHJlc29sdmVkIiwgZ2V0UGFja2FnZUFkbWluKGNvbXBvc2l0ZS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKSkucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtjb25kaXRpb25CdW5kbGV9KSk7Ci0JCUJ1bmRsZSBsaW5rRCA9IGluc3RhbGxJbnRvQ2hpbGQoY29tcG9zaXRlLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLCAidGVzdC5saW5rLmQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNvbmRpdGlvbkluZm9bXSBjb25kaXRpb25zID0gbmV3IENvbmRpdGlvbkluZm9bXSB7bmV3IENvbmRpdGlvbkluZm8oQnVuZGxlTG9jYXRpb25Db25kaXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBuZXcgU3RyaW5nW10ge2xpbmtELmdldExvY2F0aW9uKCl9KX07Ci0JCUNvbmRpdGlvbmFsUGVybWlzc2lvbkFkbWluIGNoaWxkQ29uZEFkbWluID0gZ2V0Q29uZFBlcm1BZG1pbihjb21wb3NpdGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0QnVuZGxlQ29udGV4dCgpKTsKLQkJY2hpbGRDb25kQWRtaW4uYWRkQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhjb25kaXRpb25zLCBuZXcgUGVybWlzc2lvbkluZm9bXSB7bmV3IFBlcm1pc3Npb25JbmZvKCIodGVzdCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlsaW5rRC5zdGFydCgpOwotCQkJZmFpbCgiU2hvdWxkIGZhaWwgdG8gc3RhcnQgdGVzdC5saW5rLmQiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBleGNlcHRpb24gdHlwZSIsIEJ1bmRsZUV4Y2VwdGlvbi5SRVNPTFZFX0VSUk9SLCBlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUgPSBjaGlsZENvbmRBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCBpbmZvcyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBpbmZvcyIsIDEsIGluZm9zLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5mb3MuY2xlYXIoKTsKLQotCQlQZXJtaXNzaW9uSW5mbyBwYWNrYWdlUGVybSA9IG5ldyBQZXJtaXNzaW9uSW5mbyhQYWNrYWdlUGVybWlzc2lvbi5jbGFzcy5nZXROYW1lKCksICIqIiwgUGFja2FnZVBlcm1pc3Npb24uSU1QT1JUKTsgLy8kTk9OLU5MUy0xJAotCQlQZXJtaXNzaW9uSW5mbyBzZXJ2aWNlUGVybSA9IG5ldyBQZXJtaXNzaW9uSW5mbyhTZXJ2aWNlUGVybWlzc2lvbi5jbGFzcy5nZXROYW1lKCksICIqIiwgU2VydmljZVBlcm1pc3Npb24uR0VUICsgJywnICsgU2VydmljZVBlcm1pc3Npb24uUkVHSVNURVIpOyAvLyROT04tTkxTLTEkCi0JCVBlcm1pc3Npb25JbmZvIGFsbFBlcm0gPSBuZXcgUGVybWlzc2lvbkluZm8oQWxsUGVybWlzc2lvbi5jbGFzcy5nZXROYW1lKCksICIqIiwgIioiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVBlcm1pc3Npb25JbmZvW10gcGVybWlzc2lvbnMgPSBuZXcgUGVybWlzc2lvbkluZm9bXSB7cGFja2FnZVBlcm19OwotCQlpbmZvcy5hZGQoY2hpbGRDb25kQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbygidGVzdC5saW5rLmQiLCBjb25kaXRpb25zLCBwZXJtaXNzaW9ucywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZS5jb21taXQoKTsKLQotCQl0cnkgewotCQkJbGlua0Quc3RhcnQoKTsKLQkJCWZhaWwoIlNob3VsZCBmYWlsIHRvIHN0YXJ0IHRlc3QubGluay5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uQUNUSVZBVE9SX0VSUk9SLCBlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZSIsICJNaXNzaW5nIFNlcnZpY2UgUGVybWlzc2lvbiIsIGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJdXBkYXRlID0gY2hpbGRDb25kQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7Ci0JCWluZm9zID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGluZm9zIiwgMSwgaW5mb3Muc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZvcy5jbGVhcigpOwotCQlwZXJtaXNzaW9ucyA9IG5ldyBQZXJtaXNzaW9uSW5mb1tdIHtwYWNrYWdlUGVybSwgc2VydmljZVBlcm19OwotCQlpbmZvcy5hZGQoY2hpbGRDb25kQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbygidGVzdC5saW5rLmQiLCBjb25kaXRpb25zLCBwZXJtaXNzaW9ucywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZS5jb21taXQoKTsKLQotCQl0cnkgewotCQkJbGlua0Quc3RhcnQoKTsKLQkJCWZhaWwoIlNob3VsZCBmYWlsIHRvIHN0YXJ0IHRlc3QubGluay5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uQUNUSVZBVE9SX0VSUk9SLCBlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZSIsICJNaXNzaW5nIEFsbFBlcm1pc3Npb25zIiwgZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQotCQl1cGRhdGUgPSBjaGlsZENvbmRBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJaW5mb3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgaW5mb3MiLCAxLCBpbmZvcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCWluZm9zLmNsZWFyKCk7Ci0JCXBlcm1pc3Npb25zID0gbmV3IFBlcm1pc3Npb25JbmZvW10ge2FsbFBlcm19OwotCQlpbmZvcy5hZGQoY2hpbGRDb25kQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbygidGVzdC5saW5rLmQiLCBjb25kaXRpb25zLCBwZXJtaXNzaW9ucywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZS5jb21taXQoKTsKLQotCQl0cnkgewotCQkJbGlua0Quc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0KLQotCQl1bmluc3RhbGxDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIENvbmRpdGlvbmFsUGVybWlzc2lvbkFkbWluIGdldENvbmRQZXJtQWRtaW4oQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcGVybUFkbWluUmVmID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKENvbmRpdGlvbmFsUGVybWlzc2lvbkFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwZXJtQWRtaW5SZWYgPT0gbnVsbCkgewotCQkJZmFpbCgiTm8gQ29uZGl0aW9uYWwgUGVybWlzc2lvbiBBZG1pbiBzZXJ2aWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbiBwZXJtQWRtaW4gPSAoQ29uZGl0aW9uYWxQZXJtaXNzaW9uQWRtaW4pIGNvbnRleHQuZ2V0U2VydmljZShwZXJtQWRtaW5SZWYpOwotCQkJaWYgKHBlcm1BZG1pbiA9PSBudWxsKQotCQkJCWZhaWwoIk5vIENvbmRpdGlvbmFsIFBlcm1pc3Npb24gQWRtaW4gc2VydmljZSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcGVybUFkbWluOwotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocGVybUFkbWluUmVmKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9jb21wb3NpdGVzL0NvbXBvc2l0ZVNoYXJlVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9jb21wb3NpdGVzL0NvbXBvc2l0ZVNoYXJlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyZDI3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29tcG9zaXRlcy9Db21wb3NpdGVTaGFyZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuY29tcG9zaXRlczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdHNBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLmxhdW5jaC5GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlU2hhcmVUZXN0cyBleHRlbmRzIEFic3RyYWN0Q29tcG9zaXRlVGVzdHMgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29tcG9zaXRlU2hhcmVUZXN0cy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvc2l0ZVNoYXJlMDEoKSB7Ci0JCS8vIHNpbXBsZSB0ZXN0IHRvIGNyZWF0ZSBhbiBlbXB0eSBjb21wb3NpdGUgYnVuZGxlCi0JCS8vIHNoYXJpbmcgb25lIHBhY2thZ2UgZnJvbSB0aGUgcGFyZW50Ci0JCU1hcCBsaW5rTWFuaWZlc3QgPSBuZXcgSGFzaE1hcCgpOwotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdENvbXBvc2l0ZVNoYXJlMDEiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJvcmcub3NnaS5zZXJ2aWNlLmFwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZUJ1bmRsZSA9IGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShsaW5rQnVuZGxlRmFjdG9yeSwgInRlc3RDb21wb3NpdGVTaGFyZTAxIiwgbnVsbCwgbGlua01hbmlmZXN0LCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCXN0YXJ0Q29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSwgZmFsc2UpOwotCQlTdXJyb2dhdGVCdW5kbGUgc3Vycm9nYXRlID0gY29tcG9zaXRlQnVuZGxlLmdldFN1cnJvZ2F0ZUJ1bmRsZSgpOwotCQlhc3NlcnROb3ROdWxsKCJTdXJyb2dhdGUgaXMgbnVsbCIsIHN1cnJvZ2F0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXN1cnJvZ2F0ZS5sb2FkQ2xhc3MoIm9yZy5vc2dpLnNlcnZpY2UuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGNsYXNzIGxvYWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBtYWtlIHN1cmUgbWlzc2luZyBjbGFzc2VzIGRvIG5vdCBlbmRsZXNzbHkgbG9vcAotCQl0cnkgewotCQkJc3Vycm9nYXRlLmxvYWRDbGFzcygiZG9lcy5ub3QuZXhpc3QuSGVyZSIpOyAvLyROT04tTkxTLTEkCi0JCQlmYWlsKCJFeHBlY3RlZCBhIGxvYWRDbGFzcyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJdW5pbnN0YWxsQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvc2l0ZVNoYXJlMDFhKCkgewotCQkvLyBzaW1wbGUgdGVzdCB0byBjcmVhdGUgYW4gZW1wdHkgY29tcG9zaXRlIGJ1bmRsZQotCQkvLyBzaGFyaW5nIG9uZSBwYWNrYWdlIGZyb20gdGhlIHBhcmVudAotCQlNYXAgbGlua01hbmlmZXN0ID0gbmV3IEhhc2hNYXAoKTsKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgZ2V0TmFtZSgpKTsKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAib3JnLm9zZ2kuc2VydmljZS5hcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGVCdW5kbGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksIGdldE5hbWUoKSwgbnVsbCwgbGlua01hbmlmZXN0LCBmYWxzZSwgZmFsc2UpOwotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIGZhbHNlKTsKLQotCQlzdG9wQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSk7Ci0JCXVuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVTaGFyZTAyKCkgewotCQkvLyBzaW1wbGUgdGVzdCB0byBjcmVhdGUgYW4gZW1wdHkgY29tcG9zaXRlIGJ1bmRsZQotCQkvLyBzaGFyaW5nIG9uZSBwYWNrYWdlIGZyb20gdGhlIHBhcmVudCBhbmQgc2hhcmluZyBvbmUgbm9uLWV4aXN0aW5nIHBhY2thZ2UgZnJvbSBjaGlsZAotCQlNYXAgbGlua01hbmlmZXN0ID0gbmV3IEhhc2hNYXAoKTsKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3RDb21wb3NpdGVTaGFyZTAyIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAib3JnLm9zZ2kuc2VydmljZS5hcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZUJ1bmRsZSA9IGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShsaW5rQnVuZGxlRmFjdG9yeSwgInRlc3RDb21wb3NpdGVTaGFyZTAyIiwgbnVsbCwgbGlua01hbmlmZXN0LCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhcnRDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlQnVuZGxlLCB0cnVlKTsKLQkJU3Vycm9nYXRlQnVuZGxlIHN1cnJvZ2F0ZSA9IGNvbXBvc2l0ZUJ1bmRsZS5nZXRTdXJyb2dhdGVCdW5kbGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQ29tcGFuaW9uIGlzIG51bGwiLCBzdXJyb2dhdGUpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlzdXJyb2dhdGUubG9hZENsYXNzKCJvcmcub3NnaS5zZXJ2aWNlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVzY3JpcHRvciIpOyAvLyROT04tTkxTLTEkCi0JCQlmYWlsKCJFeHBlY3RlZCBhIGxvYWRDbGFzcyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJdW5pbnN0YWxsQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvc2l0ZVNoYXJlMDMoKSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSBidW5kbGUgd2l0aCBvbmUgYnVuZGxlIHRoYXQgZXhwb3J0cyBzb21lIGFwaSB0byBwYXJlbnQKLQkJTWFwIGxpbmtNYW5pZmVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0Q29tcG9zaXRlU2hhcmUwMyIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInRlc3QubGluay5hOyBhdHRyMT1cInZhbHVlMVwiOyB1c2VzOj1cIm9yZy5vc2dpLmZyYW1ld29yaywgdGVzdC5saW5rLmEucGFyYW1zXCIsIHRlc3QubGluay5hLnBhcmFtczsgYXR0cjI9XCJ2YWx1ZTJcIiIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGVCdW5kbGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJ0ZXN0Q29tcG9zaXRlU2hhcmUwMyIsIG51bGwsIGxpbmtNYW5pZmVzdCwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsSW50b0NoaWxkKGNvbXBvc2l0ZUJ1bmRsZS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKSwgInRlc3QubGluay5hIik7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCWNvbXBvc2l0ZUJ1bmRsZS5sb2FkQ2xhc3MoInRlc3QubGluay5hLlNvbWVBUEkiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgYSBsb2FkQ2xhc3MgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvL21ha2Ugc3VyZSBtaXNzaW5nIGNsYXNzZXMgZG8gbm90IGVuZGxlc3NseSBsb29wCi0JCXRyeSB7Ci0JCQljb21wb3NpdGVCdW5kbGUubG9hZENsYXNzKCJkb2VzLm5vdC5leGlzdC5IZXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZhaWwoIkV4cGVjdGVkIGEgbG9hZENsYXNzIGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQl1bmluc3RhbGxDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlQnVuZGxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlU2hhcmUwNGEoKSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSBidW5kbGUgd2l0aCBvbmUgYnVuZGxlIHRoYXQgZXhwb3J0cyBzb21lIGFwaSB0byBwYXJlbnQKLQkJLy8gaW5zdGFsbCBvbmUgYnVuZGxlIGludG8gcGFyZW50IHRoYXQgdXNlcyBBUEkgZnJvbSBjaGlsZAotCQlNYXAgbGlua01hbmlmZXN0ID0gbmV3IEhhc2hNYXAoKTsKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3RDb21wb3NpdGVTaGFyZTA0YSIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInRlc3QubGluay5hOyBhdHRyMT1cImJhZCB2YWx1ZVwiOyB1c2VzOj1cIm9yZy5vc2dpLmZyYW1ld29yaywgdGVzdC5saW5rLmEucGFyYW1zXCIsIHRlc3QubGluay5hLnBhcmFtczsgYXR0cjI9XCJiYWQgdmFsdWVcIiIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGVCdW5kbGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJ0ZXN0Q29tcG9zaXRlU2hhcmUwNGEiLCBudWxsLCBsaW5rTWFuaWZlc3QsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbEludG9DaGlsZChjb21wb3NpdGVCdW5kbGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCksICJ0ZXN0LmxpbmsuYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSB0ZXN0Q2xpZW50ID0gaW5zdGFsbEludG9DdXJyZW50KCJ0ZXN0LmxpbmsuYS5jbGllbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN1cnJvZ2F0ZUJ1bmRsZSBzdXJyb2dhdGUgPSBjb21wb3NpdGVCdW5kbGUuZ2V0U3Vycm9nYXRlQnVuZGxlKCk7Ci0JCWFzc2VydE5vdE51bGwoIkNvbXBhbmlvbiBpcyBudWxsIiwgc3Vycm9nYXRlKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIHRydWUpOwotCQl0cnkgewotCQkJdGVzdENsaWVudC5zdGFydCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgc3RhcnQgZmFpbHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uUkVTT0xWRV9FUlJPUiwgZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gcHV0IGdvb2QgdmFsdWUgYmFjawotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInRlc3QubGluay5hOyBhdHRyMT1cInZhbHVlMVwiOyB1c2VzOj1cIm9yZy5vc2dpLmZyYW1ld29yaywgdGVzdC5saW5rLmEucGFyYW1zXCIsIHRlc3QubGluay5hLnBhcmFtczsgYXR0cjI9XCJ2YWx1ZTJcIiIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQljb21wb3NpdGVCdW5kbGUudXBkYXRlKGxpbmtNYW5pZmVzdCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGNvbXBvc2l0ZSB1cGRhdGUgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXN0YXJ0Q29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSwgZmFsc2UpOwotCQl0cnkgewotCQkJdGVzdENsaWVudC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gcHV0IGJhZCB2YWx1ZSBiYWNrCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmE7IGF0dHIxPVwiYmFkIHZhbHVlXCI7IHVzZXM6PVwib3JnLm9zZ2kuZnJhbWV3b3JrLCB0ZXN0LmxpbmsuYS5wYXJhbXNcIiwgdGVzdC5saW5rLmEucGFyYW1zOyBhdHRyMj1cImJhZCB2YWx1ZVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWNvbXBvc2l0ZUJ1bmRsZS51cGRhdGUobGlua01hbmlmZXN0KTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgY29tcG9zaXRlIHVwZGF0ZSBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWluc3RhbGxlci5yZWZyZXNoUGFja2FnZXMobmV3IEJ1bmRsZVtdIHtjb21wb3NpdGVCdW5kbGV9KTsKLQkJc3RhcnRDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlQnVuZGxlLCB0cnVlKTsKLQkJdHJ5IHsKLQkJCXRlc3RDbGllbnQuc3RhcnQoKTsKLQkJCWZhaWwoIkV4cGVjdGVkIHN0YXJ0IGZhaWx1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB0eXBlIiwgQnVuZGxlRXhjZXB0aW9uLlJFU09MVkVfRVJST1IsIGUuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdW5pbnN0YWxsQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvc2l0ZVNoYXJlMDRiKCkgewotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgYnVuZGxlIHdpdGggb25lIGJ1bmRsZSB0aGF0IGV4cG9ydHMgc29tZSBhcGkgdG8gcGFyZW50Ci0JCS8vIGluc3RhbGwgb25lIGJ1bmRsZSBpbnRvIHBhcmVudCB0aGF0IHVzZXMgQVBJIGZyb20gY2hpbGQKLQkJLy8gdGVzdCBsYXp5IHVuaW5zdGFsbAotCQlNYXAgbGlua01hbmlmZXN0ID0gbmV3IEhhc2hNYXAoKTsKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3RDb21wb3NpdGVTaGFyZTA0YiIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInRlc3QubGluay5hOyBhdHRyMT1cImJhZCB2YWx1ZVwiOyB1c2VzOj1cIm9yZy5vc2dpLmZyYW1ld29yaywgdGVzdC5saW5rLmEucGFyYW1zXCIsIHRlc3QubGluay5hLnBhcmFtczsgYXR0cjI9XCJiYWQgdmFsdWVcIiIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGVCdW5kbGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJ0ZXN0Q29tcG9zaXRlU2hhcmUwNGIiLCBudWxsLCBsaW5rTWFuaWZlc3QsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbEludG9DaGlsZChjb21wb3NpdGVCdW5kbGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCksICJ0ZXN0LmxpbmsuYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSB0ZXN0Q2xpZW50ID0gaW5zdGFsbEludG9DdXJyZW50KCJ0ZXN0LmxpbmsuYS5jbGllbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN1cnJvZ2F0ZUJ1bmRsZSBzdXJyb2dhdGUgPSBjb21wb3NpdGVCdW5kbGUuZ2V0U3Vycm9nYXRlQnVuZGxlKCk7Ci0JCWFzc2VydE5vdE51bGwoIlN1cnJvZ2F0ZSBpcyBudWxsIiwgc3Vycm9nYXRlKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIHRydWUpOwotCQl0cnkgewotCQkJdGVzdENsaWVudC5zdGFydCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgc3RhcnQgZmFpbHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uUkVTT0xWRV9FUlJPUiwgZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gcHV0IGdvb2QgdmFsdWUgYmFjawotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInRlc3QubGluay5hOyBhdHRyMT1cInZhbHVlMVwiOyB1c2VzOj1cIm9yZy5vc2dpLmZyYW1ld29yaywgdGVzdC5saW5rLmEucGFyYW1zXCIsIHRlc3QubGluay5hLnBhcmFtczsgYXR0cjI9XCJ2YWx1ZTJcIiIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQljb21wb3NpdGVCdW5kbGUudXBkYXRlKGxpbmtNYW5pZmVzdCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGNvbXBvc2l0ZSB1cGRhdGUgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXN0YXJ0Q29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSwgZmFsc2UpOwotCQl0cnkgewotCQkJdGVzdENsaWVudC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHJlZnJlc2ggY2xpZW50IHRvIGNsZWFyIGNsYXNzIGxhb2RlcgotCQlpbnN0YWxsZXIucmVmcmVzaFBhY2thZ2VzKG5ldyBCdW5kbGVbXSB7dGVzdENsaWVudH0pOwotCi0JCS8vIHB1dCBiYWQgdmFsdWUgYmFjawotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInRlc3QubGluay5hOyBhdHRyMT1cImJhZCB2YWx1ZVwiOyB1c2VzOj1cIm9yZy5vc2dpLmZyYW1ld29yaywgdGVzdC5saW5rLmEucGFyYW1zXCIsIHRlc3QubGluay5hLnBhcmFtczsgYXR0cjI9XCJiYWQgdmFsdWVcIiIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQljb21wb3NpdGVCdW5kbGUudXBkYXRlKGxpbmtNYW5pZmVzdCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGNvbXBvc2l0ZSB1cGRhdGUgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIG1ha2Ugc3VyZSB0ZXN0Q2xpZW50IGNhbiBzdGlsbCBzdGFydCBiZWZvcmUgcmVmcmVzaAotCQl0cnkgewotCQkJdGVzdENsaWVudC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhuZXcgQnVuZGxlW10ge2NvbXBvc2l0ZUJ1bmRsZX0pOwotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIHRydWUpOwotCQl0cnkgewotCQkJdGVzdENsaWVudC5zdGFydCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgc3RhcnQgZmFpbHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uUkVTT0xWRV9FUlJPUiwgZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBwdXQgZ29vZCB2YWx1ZSBiYWNrCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmE7IGF0dHIxPVwidmFsdWUxXCI7IHVzZXM6PVwib3JnLm9zZ2kuZnJhbWV3b3JrLCB0ZXN0LmxpbmsuYS5wYXJhbXNcIiwgdGVzdC5saW5rLmEucGFyYW1zOyBhdHRyMj1cInZhbHVlMlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWNvbXBvc2l0ZUJ1bmRsZS51cGRhdGUobGlua01hbmlmZXN0KTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgY29tcG9zaXRlIHVwZGF0ZSBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJc3RhcnRDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlQnVuZGxlLCBmYWxzZSk7Ci0JCXVuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUpOwotCQkvLyBtYWtlIHN1cmUgdGVzdENsaWVudCBjYW4gc3RpbGwgc3RhcnQgYWZ0ZXIgdW5pbnN0YWxsCi0JCXRyeSB7Ci0JCQl0ZXN0Q2xpZW50LnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnN0YWxsZXIucmVmcmVzaFBhY2thZ2VzKG5ldyBCdW5kbGVbXSB7Y29tcG9zaXRlQnVuZGxlfSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0Q2xpZW50LnN0YXJ0KCk7Ci0JCQlmYWlsKCJFeHBlY3RlZCBzdGFydCBmYWlsdXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNlcHRpb24gdHlwZSIsIEJ1bmRsZUV4Y2VwdGlvbi5SRVNPTFZFX0VSUk9SLCBlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVTaGFyZTA1KCkgewotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgYnVuZGxlIHdpdGggb25lIGJ1bmRsZSB0aGF0IGV4cG9ydHMgc29tZSBhcGkgdG8gY2hpbGQKLQkJLy8gaW5zdGFsbCBvbmUgYnVuZGxlIGludG8gY2hpbGQgdGhhdCB1c2VzIEFQSSBmcm9tIHBhcmVudAotCQlNYXAgbGlua01hbmlmZXN0ID0gbmV3IEhhc2hNYXAoKTsKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3RDb21wb3NpdGVTaGFyZTA1Iik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmE7IGF0dHIxPVwiYmFkIHZhbHVlXCIsIHRlc3QubGluay5hLnBhcmFtczsgIGF0dHIyPVwiYmFkIHZhbHVlXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlQnVuZGxlID0gY3JlYXRlQ29tcG9zaXRlQnVuZGxlKGxpbmtCdW5kbGVGYWN0b3J5LCAidGVzdENvbXBvc2l0ZVNoYXJlMDMiLCBudWxsLCBsaW5rTWFuaWZlc3QsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbEludG9DdXJyZW50KCJ0ZXN0LmxpbmsuYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZSB0ZXN0Q2xpZW50ID0gaW5zdGFsbEludG9DaGlsZChjb21wb3NpdGVCdW5kbGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCksICJ0ZXN0LmxpbmsuYS5jbGllbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN1cnJvZ2F0ZUJ1bmRsZSBzdXJyb2dhdGUgPSBjb21wb3NpdGVCdW5kbGUuZ2V0U3Vycm9nYXRlQnVuZGxlKCk7Ci0JCWFzc2VydE5vdE51bGwoIlN1cnJvZ2F0ZSBpcyBudWxsIiwgc3Vycm9nYXRlKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIHRydWUpOwotCQlhc3NlcnRGYWxzZSgiQnVuZGxlIHNob3VsZCBub3QgYmUgcmVzb2x2ZWQiLCByZXNvbHZlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKSwgdGVzdENsaWVudCkpOwotCQl0cnkgewotCQkJdGVzdENsaWVudC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gdHlwZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBwdXQgZ29vZCB2YWx1ZSBiYWNrCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmE7IGF0dHIxPVwidmFsdWUxXCIsIHRlc3QubGluay5hLnBhcmFtczsgYXR0cjI9XCJ2YWx1ZTJcIiIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQljb21wb3NpdGVCdW5kbGUudXBkYXRlKGxpbmtNYW5pZmVzdCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGNvbXBvc2l0ZSB1cGRhdGUgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXN0YXJ0Q29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSwgZmFsc2UpOwotCQl0cnkgewotCQkJdGVzdENsaWVudC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gcHV0IGJhZCB2YWx1ZSBiYWNrCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmE7IGF0dHIxPVwiYmFkIHZhbHVlXCIsIHRlc3QubGluay5hLnBhcmFtczsgIGF0dHIyPVwiYmFkIHZhbHVlXCIiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJY29tcG9zaXRlQnVuZGxlLnVwZGF0ZShsaW5rTWFuaWZlc3QpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBjb21wb3NpdGUgdXBkYXRlIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhuZXcgQnVuZGxlW10ge2NvbXBvc2l0ZUJ1bmRsZX0pOwotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIHRydWUpOwotCQl0cnkgewotCQkJdGVzdENsaWVudC5zdGFydCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgc3RhcnQgZmFpbHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uUkVTT0xWRV9FUlJPUiwgZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl1bmluc3RhbGxDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlQnVuZGxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlU2hhcmUwNigpIHsKLQkJLy8gc2ltcGxlIHRlc3QgdG8gY3JlYXRlIGFuIGVtcHR5IGNvbXBvc2l0ZSBidW5kbGUKLQkJLy8gc2hhcmluZyBvbmUgcGFja2FnZSBmcm9tIGEgYnVuZGxlIGluIHRoZSBwYXJlbnQgYW5kIAotCQkvLyBvbmUgcGFja2FnZSBmcm9tIHRoZSBzeXN0ZW0gYnVuZGxlIGluIHRoZSBwYXJlbnQKLQkJTWFwIGxpbmtNYW5pZmVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0Q29tcG9zaXRlU2hhcmUwNiIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIm9yZy5vc2dpLnNlcnZpY2UuYXBwbGljYXRpb24sIG9yZy5vc2dpLmZyYW1ld29yayIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGVCdW5kbGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJ0ZXN0Q29tcG9zaXRlU2hhcmUwNiIsIG51bGwsIGxpbmtNYW5pZmVzdCwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIGZhbHNlKTsKLQkJU3Vycm9nYXRlQnVuZGxlIHN1cnJvZ2F0ZSA9IGNvbXBvc2l0ZUJ1bmRsZS5nZXRTdXJyb2dhdGVCdW5kbGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3Vycm9nYXRlIGlzIG51bGwiLCBzdXJyb2dhdGUpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlzdXJyb2dhdGUubG9hZENsYXNzKCJvcmcub3NnaS5zZXJ2aWNlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVzY3JpcHRvciIpOyAvLyROT04tTkxTLTEkCi0JCQlDbGFzcyBidW5kbGVDbGFzcyA9IHN1cnJvZ2F0ZS5sb2FkQ2xhc3MoIm9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJCdW5kbGUgY2xhc3NlcyBhcmUgbm90IHRoZSBzYW1lIiwgQnVuZGxlLmNsYXNzLCBidW5kbGVDbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGNsYXNzIGxvYWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXVuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVTaGFyZTA3YSgpIHsKLQkJLy8gdGVzdCB0d28gd2F5IHNoYXJpbmcKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIGJ1bmRsZSB3aXRoIG9uZSBidW5kbGUgdGhhdCBleHBvcnRzIHNvbWUgYXBpIHRvIGNoaWxkCi0JCS8vIGluc3RhbGwgb25lIGJ1bmRsZSBpbnRvIGNoaWxkIHRoYXQgdXNlcyBBUEkgZnJvbSBwYXJlbnQKLQkJLy8gaW5zdGFsbCBhIGNoaWxkIGJ1bmRsZSB0aGF0IGV4cG9ydHMgc29tZSBhcGkgdG8gcGFyZW50Ci0JCS8vIGluc3RhbGwgb25lIGJ1bmRsZSBpbnRvIHBhcmVudCB0aGF0IHVzZXMgQVBJIGZyb20gY2hpbGQKLQkJTWFwIGxpbmtNYW5pZmVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0Q29tcG9zaXRlU2hhcmUwN2EiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ0ZXN0LmxpbmsuYTsgYXR0cjE9XCJ2YWx1ZTFcIiwgdGVzdC5saW5rLmEucGFyYW1zOyBhdHRyMj1cInZhbHVlMlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ0ZXN0LmxpbmsuYjsgYXR0cjE9XCJ2YWx1ZTFcIjsgdXNlczo9XCJvcmcub3NnaS5mcmFtZXdvcmssIHRlc3QubGluay5iLnBhcmFtc1wiLCB0ZXN0LmxpbmsuYi5wYXJhbXM7IGF0dHIyPVwidmFsdWUyXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlQnVuZGxlID0gY3JlYXRlQ29tcG9zaXRlQnVuZGxlKGxpbmtCdW5kbGVGYWN0b3J5LCAidGVzdENvbXBvc2l0ZVNoYXJlMDdhIiwgbnVsbCwgbGlua01hbmlmZXN0LCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxJbnRvQ3VycmVudCgidGVzdC5saW5rLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgdGVzdENsaWVudEEgPSBpbnN0YWxsSW50b0NoaWxkKGNvbXBvc2l0ZUJ1bmRsZS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKSwgInRlc3QubGluay5hLmNsaWVudCIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxJbnRvQ2hpbGQoY29tcG9zaXRlQnVuZGxlLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLCAidGVzdC5saW5rLmIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgdGVzdENsaWVudEIgPSBpbnN0YWxsSW50b0N1cnJlbnQoInRlc3QubGluay5iLmNsaWVudCIpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhcnRDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlQnVuZGxlLCBmYWxzZSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0Q2xpZW50QS5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCXRlc3RDbGllbnRCLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyB1c2UgYmFkIGltcG9ydCBwYWNrYWdlIHZhbHVlCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmE7IGF0dHIxPVwiYmFkIHZhbHVlXCIsIHRlc3QubGluay5hLnBhcmFtczsgIGF0dHIyPVwiYmFkIHZhbHVlXCIiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJY29tcG9zaXRlQnVuZGxlLnVwZGF0ZShsaW5rTWFuaWZlc3QpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBjb21wb3NpdGUgdXBkYXRlIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaW5zdGFsbGVyLnJlZnJlc2hQYWNrYWdlcyhuZXcgQnVuZGxlW10ge2NvbXBvc2l0ZUJ1bmRsZX0pOwotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIHRydWUpOwotCQl0cnkgewotCQkJdGVzdENsaWVudEEuc3RhcnQoKTsKLQkJCWZhaWwoIkV4cGVjdGVkIHN0YXJ0IGZhaWx1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB0eXBlIiwgQnVuZGxlRXhjZXB0aW9uLlJFU09MVkVfRVJST1IsIGUuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQl0ZXN0Q2xpZW50Qi5zdGFydCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgc3RhcnQgZmFpbHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uUkVTT0xWRV9FUlJPUiwgZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBwdXQgZ29vZCB2YWx1ZSBiYWNrCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmE7IGF0dHIxPVwidmFsdWUxXCIsIHRlc3QubGluay5hLnBhcmFtczsgYXR0cjI9XCJ2YWx1ZTJcIiIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQljb21wb3NpdGVCdW5kbGUudXBkYXRlKGxpbmtNYW5pZmVzdCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGNvbXBvc2l0ZSB1cGRhdGUgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXN0YXJ0Q29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSwgZmFsc2UpOwotCQl0cnkgewotCQkJdGVzdENsaWVudEEuc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQl0ZXN0Q2xpZW50Qi5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXVuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVTaGFyZTA3YigpIHsKLQkJLy8gdGVzdCB0d28gd2F5IHNoYXJpbmcgQU5EIGxhenkgdXBkYXRlCi0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSBidW5kbGUgd2l0aCBvbmUgYnVuZGxlIHRoYXQgZXhwb3J0cyBzb21lIGFwaSB0byBjaGlsZAotCQkvLyBpbnN0YWxsIG9uZSBidW5kbGUgaW50byBjaGlsZCB0aGF0IHVzZXMgQVBJIGZyb20gcGFyZW50Ci0JCS8vIGluc3RhbGwgYSBjaGlsZCBidW5kbGUgdGhhdCBleHBvcnRzIHNvbWUgYXBpIHRvIHBhcmVudAotCQkvLyBpbnN0YWxsIG9uZSBidW5kbGUgaW50byBwYXJlbnQgdGhhdCB1c2VzIEFQSSBmcm9tIGNoaWxkCi0JCU1hcCBsaW5rTWFuaWZlc3QgPSBuZXcgSGFzaE1hcCgpOwotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdENvbXBvc2l0ZVNoYXJlMDdiIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmE7IGF0dHIxPVwidmFsdWUxXCIsIHRlc3QubGluay5hLnBhcmFtczsgYXR0cjI9XCJ2YWx1ZTJcIiIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmI7IGF0dHIxPVwidmFsdWUxXCI7IHVzZXM6PVwib3JnLm9zZ2kuZnJhbWV3b3JrLCB0ZXN0LmxpbmsuYi5wYXJhbXNcIiwgdGVzdC5saW5rLmIucGFyYW1zOyBhdHRyMj1cInZhbHVlMlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZUJ1bmRsZSA9IGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShsaW5rQnVuZGxlRmFjdG9yeSwgInRlc3RDb21wb3NpdGVTaGFyZTA3YiIsIG51bGwsIGxpbmtNYW5pZmVzdCwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsSW50b0N1cnJlbnQoInRlc3QubGluay5hIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHRlc3RDbGllbnRBID0gaW5zdGFsbEludG9DaGlsZChjb21wb3NpdGVCdW5kbGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCksICJ0ZXN0LmxpbmsuYS5jbGllbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsSW50b0NoaWxkKGNvbXBvc2l0ZUJ1bmRsZS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKSwgInRlc3QubGluay5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHRlc3RDbGllbnRCID0gaW5zdGFsbEludG9DdXJyZW50KCJ0ZXN0LmxpbmsuYi5jbGllbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXJ0Q29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSwgZmFsc2UpOwotCQl0cnkgewotCQkJdGVzdENsaWVudEEuc3RhcnQoKTsKLQkJCXRlc3RDbGllbnRBLnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQl0ZXN0Q2xpZW50Qi5zdGFydCgpOwotCQkJdGVzdENsaWVudEIuc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gZm9yY2UgYSByZWZyZXNoIHBhY2thZ2VzIG9mIHRoZSBjb21wb3NpdGUgdG8gZ2V0IG5ldyBjbGFzcyBsb2FkZXJzIGZvciB0aGUgY2xpZW50cwotCQlpbnN0YWxsZXIucmVmcmVzaFBhY2thZ2VzKG5ldyBCdW5kbGVbXSB7Y29tcG9zaXRlQnVuZGxlfSk7Ci0KLQkJLy8gdXNlIGJhZCBpbXBvcnQgcGFja2FnZSB2YWx1ZQotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInRlc3QubGluay5hOyBhdHRyMT1cImJhZCB2YWx1ZVwiLCB0ZXN0LmxpbmsuYS5wYXJhbXM7ICBhdHRyMj1cImJhZCB2YWx1ZVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWNvbXBvc2l0ZUJ1bmRsZS51cGRhdGUobGlua01hbmlmZXN0KTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgY29tcG9zaXRlIHVwZGF0ZSBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gbWFrZSBzdXJlIHdlIGNhbiBzdGlsbCBzdGFydCB0aGUgY2xpZW50cyBiZWZvcmUgYSByZWZyZXNoOyAKLQkJLy8gdGhleSBzaG91bGQgc3RpbGwgYmUgd2lyZWQgdG8gdGhlIG9sZCBjb250ZW50Ci0JCXRyeSB7Ci0JCQl0ZXN0Q2xpZW50QS5zdGFydCgpOwotCQkJdGVzdENsaWVudEEuc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCXRlc3RDbGllbnRCLnN0YXJ0KCk7Ci0JCQl0ZXN0Q2xpZW50Qi5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnN0YWxsZXIucmVmcmVzaFBhY2thZ2VzKG5ldyBCdW5kbGVbXSB7Y29tcG9zaXRlQnVuZGxlfSk7Ci0JCXN0YXJ0Q29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSwgdHJ1ZSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0Q2xpZW50QS5zdGFydCgpOwotCQkJZmFpbCgiRXhwZWN0ZWQgc3RhcnQgZmFpbHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUiLCBCdW5kbGVFeGNlcHRpb24uUkVTT0xWRV9FUlJPUiwgZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCXRlc3RDbGllbnRCLnN0YXJ0KCk7Ci0JCQlmYWlsKCJFeHBlY3RlZCBzdGFydCBmYWlsdXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNlcHRpb24gdHlwZSIsIEJ1bmRsZUV4Y2VwdGlvbi5SRVNPTFZFX0VSUk9SLCBlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXVuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVTaGFyZTA4KCkgewotCQkvLyBDcmVhdGUgYSBjaGlsZCBmcmFtZXdvcmsgdG8gaW5zdGFsbCBjb21wb3NpdGVzIGludG8gdG8gdGVzdCBwZXJzaXN0ZW5jZQotCQlDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlTGV2ZWwwID0gY3JlYXRlQ29tcG9zaXRlQnVuZGxlKGxpbmtCdW5kbGVGYWN0b3J5LCAidGVzdENvbXBvc2l0ZVNoYXJlMDhMVjAiLCBudWxsLCBudWxsLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlRmFjdG9yeSBmYWN0b3J5TGV2ZWwxID0gZ2V0RmFjdG9yeShjb21wb3NpdGVMZXZlbDAuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkpOwotCQkvLyBjcmVhdGUgYSBsZXZlbCAxIGNvbXBvc2l0ZXMKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZUxldmVsMSA9IGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShmYWN0b3J5TGV2ZWwxLCAidGVzdENvbXBvc2l0ZVNoYXJlMDhMVjEiLCBudWxsLCBudWxsLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlRmFjdG9yeSBmYWN0b3J5TGV2ZWwyID0gZ2V0RmFjdG9yeShjb21wb3NpdGVMZXZlbDEuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkpOwotCQlsb25nIGxldmVsMUlEID0gY29tcG9zaXRlTGV2ZWwxLmdldEJ1bmRsZUlkKCk7Ci0KLQkJLy8gdGVzdCB0d28gd2F5IHNoYXJpbmcKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIGJ1bmRsZSB3aXRoIG9uZSBidW5kbGUgdGhhdCBleHBvcnRzIHNvbWUgYXBpIHRvIGNoaWxkCi0JCS8vIGluc3RhbGwgb25lIGJ1bmRsZSBpbnRvIGNoaWxkIHRoYXQgdXNlcyBBUEkgZnJvbSBwYXJlbnQKLQkJLy8gaW5zdGFsbCBhIGNoaWxkIGJ1bmRsZSB0aGF0IGV4cG9ydHMgc29tZSBhcGkgdG8gcGFyZW50Ci0JCS8vIGluc3RhbGwgb25lIGJ1bmRsZSBpbnRvIHBhcmVudCB0aGF0IHVzZXMgQVBJIGZyb20gY2hpbGQKLQkJTWFwIGxpbmtNYW5pZmVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0Q29tcG9zaXRlU2hhcmUwOExWMiIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInRlc3QubGluay5hOyBhdHRyMT1cInZhbHVlMVwiLCB0ZXN0LmxpbmsuYS5wYXJhbXM7IGF0dHIyPVwidmFsdWUyXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInRlc3QubGluay5iOyBhdHRyMT1cInZhbHVlMVwiOyB1c2VzOj1cIm9yZy5vc2dpLmZyYW1ld29yaywgdGVzdC5saW5rLmIucGFyYW1zXCIsIHRlc3QubGluay5iLnBhcmFtczsgYXR0cjI9XCJ2YWx1ZTJcIiIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGVMZXZlbDIgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUoZmFjdG9yeUxldmVsMiwgInRlc3RDb21wb3NpdGVTaGFyZTA4TFYyIiwgbnVsbCwgbGlua01hbmlmZXN0LCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgbGV2ZWwySUQgPSBjb21wb3NpdGVMZXZlbDIuZ2V0QnVuZGxlSWQoKTsKLQotCQlpbnN0YWxsSW50b0NoaWxkKGNvbXBvc2l0ZUxldmVsMS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKSwgInRlc3QubGluay5hIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHRlc3RDbGllbnRBID0gaW5zdGFsbEludG9DaGlsZChjb21wb3NpdGVMZXZlbDIuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCksICJ0ZXN0LmxpbmsuYS5jbGllbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlsb25nIGNsaWVudEFJRCA9IHRlc3RDbGllbnRBLmdldEJ1bmRsZUlkKCk7Ci0JCWluc3RhbGxJbnRvQ2hpbGQoY29tcG9zaXRlTGV2ZWwyLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLCAidGVzdC5saW5rLmIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGUgdGVzdENsaWVudEIgPSBpbnN0YWxsSW50b0NoaWxkKGNvbXBvc2l0ZUxldmVsMS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKSwgInRlc3QubGluay5iLmNsaWVudCIpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgY2xpZW50QklEID0gdGVzdENsaWVudEIuZ2V0QnVuZGxlSWQoKTsKLQotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVMZXZlbDIsIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCXRlc3RDbGllbnRBLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJdGVzdENsaWVudEIuc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHN0b3AgbGV2ZWwgMCBjb21wb3NpdGUKLQkJc3RvcENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVMZXZlbDApOwotCi0JCS8vIGNoZWNrIHRoZSBzdGF0ZSBvZiBidW5kbGVzIGluc3RhbGxlZCBpbnRvIGNvbXBvc2l0ZSBmcmFtZXdvcmtzCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIGNsaWVudCBBIiwgQnVuZGxlLlVOSU5TVEFMTEVELCB0ZXN0Q2xpZW50QS5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBjbGllbnQgQiIsIEJ1bmRsZS5VTklOU1RBTExFRCwgdGVzdENsaWVudEIuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzdGFydCBsZXZlbCAwIGNvbXBvc2l0ZSBhZ2FpbgotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVMZXZlbDAsIGZhbHNlKTsKLQotCQkvLyBnZXQgcmVpZmllZCBsZXZlbCAxIGFuZCAyIGNvbXBvc2l0ZXMgYW5kIGNsaWVudCBBIGFuZCBCIGJ1bmRsZXMgCi0JCWNvbXBvc2l0ZUxldmVsMSA9IChDb21wb3NpdGVCdW5kbGUpIGNvbXBvc2l0ZUxldmVsMC5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRCdW5kbGVDb250ZXh0KCkuZ2V0QnVuZGxlKGxldmVsMUlEKTsKLQkJY29tcG9zaXRlTGV2ZWwyID0gKENvbXBvc2l0ZUJ1bmRsZSkgY29tcG9zaXRlTGV2ZWwxLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldEJ1bmRsZUNvbnRleHQoKS5nZXRCdW5kbGUobGV2ZWwySUQpOwotCQl0ZXN0Q2xpZW50QSA9IGNvbXBvc2l0ZUxldmVsMi5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRCdW5kbGVDb250ZXh0KCkuZ2V0QnVuZGxlKGNsaWVudEFJRCk7Ci0JCXRlc3RDbGllbnRCID0gY29tcG9zaXRlTGV2ZWwxLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldEJ1bmRsZUNvbnRleHQoKS5nZXRCdW5kbGUoY2xpZW50QklEKTsKLQotCQkvLyBjaGVjayB0aGUgc3RhdGUgb2YgYnVuZGxlcyBpbnN0YWxsZWQgaW50byBjb21wb3NpdGUgZnJhbWV3b3JrcwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBjbGllbnQgQSIsIEJ1bmRsZS5BQ1RJVkUsIHRlc3RDbGllbnRBLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIGNsaWVudCBCIiwgQnVuZGxlLkFDVElWRSwgdGVzdENsaWVudEIuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl1bmluc3RhbGxDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlTGV2ZWwwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlU2hhcmUwOWEoKSB7Ci0JCS8vIGV4cG9ydHMgcGFja2FnZXMgZnJvbSBhIGJ1bmRsZSBpbnN0YWxsZWQgaW50byB0aGUgcGFyZW50Ci0JCS8vIGFuZCBpbXBvcnRzIHRoZSBwYWNrYWdlcyBmcm9tIGEgYnVuZGxlIGluc3RhbGxlZCBpbnRvIHRoZSBjaGlsZAotCQkvLyBhbmQgc2VydmljZXMgcmVnaXN0ZXJlZCBpbiB0aGUgcGFyZW50IGFyZSBwcm9wYWdhdGVkIHRvIHRoZSBjaGlsZAotCQlCdW5kbGUgY1NlcnZpY2UgPSBpbnN0YWxsSW50b0N1cnJlbnQoInRlc3QubGluay5jIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWNTZXJ2aWNlLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGVzdC5saW5rLmMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCU1hcCBsaW5rTWFuaWZlc3QgPSBuZXcgSGFzaE1hcCgpOwotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdENvbXBvc2l0ZVNoYXJlMDlhIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAidGVzdC5saW5rLmMuc2VydmljZTEsdGVzdC5saW5rLmMuc2VydmljZTIsdGVzdC5saW5rLmMuc2VydmljZTMiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkuQ09NUE9TSVRFX1NFUlZJQ0VfRklMVEVSX0lNUE9SVCwgIihvYmplY3RDbGFzcz10ZXN0LmxpbmsuYy5zZXJ2aWNlMS5TZXJ2aWNlMSksKG9iamVjdENsYXNzPXRlc3QubGluay5jLnNlcnZpY2UyLlNlcnZpY2UyKSwob2JqZWN0Q2xhc3M9dGVzdC5saW5rLmMuc2VydmljZTMuU2VydmljZTMpIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShsaW5rQnVuZGxlRmFjdG9yeSwgInRlc3RDb21wb3NpdGVTaGFyZTA5YSIsIG51bGwsIGxpbmtNYW5pZmVzdCwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhcnRDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlLCBmYWxzZSk7Ci0KLQkJU2VydmljZVJlZmVyZW5jZVtdIHRhcmdldFNlcnZpY2VzID0gY29tcG9zaXRlLmdldFN1cnJvZ2F0ZUJ1bmRsZSgpLmdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0YXJnZXQgc2VydmljZXMgZm91bmQiLCB0YXJnZXRTZXJ2aWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdGFyZ2V0IHNlcnZpY2VzIiwgMywgdGFyZ2V0U2VydmljZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZSBjQ2xpZW50ID0gaW5zdGFsbEludG9DaGlsZChjb21wb3NpdGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCksICJ0ZXN0LmxpbmsuYy5jbGllbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQljQ2xpZW50LnN0YXJ0KCk7Ci0JCQljQ2xpZW50LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdGFydC9zdG9wIHRoZSBjbGllbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWNTZXJ2aWNlLnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdG9wIGNTZXJ2aWNlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQljQ2xpZW50LnN0YXJ0KCk7Ci0JCQlmYWlsKCJTaG91bGQgaGF2ZSBmYWlsZWQgdG8gc3RhcnQgY0NsaWVudCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQljU2VydmljZS5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRlc3QubGluay5jIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJY0NsaWVudC5zdGFydCgpOwotCQkJY0NsaWVudC5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQvc3RvcCB0aGUgY2xpZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl1bmluc3RhbGxDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlU2hhcmUwOWIoKSB7Ci0JCS8vIHR3byB3YXkgcGFja2FnZSBhbmQgc2VydmljZSB0ZXN0cwotCQkvLyBleHBvcnRzIHBhY2thZ2VzIGZyb20gYSBidW5kbGUgaW5zdGFsbGVkIGludG8gdGhlIHBhcmVudAotCQkvLyBhbmQgaW1wb3J0cyB0aGUgcGFja2FnZXMgZnJvbSBhIGJ1bmRsZSBpbnN0YWxsZWQgaW50byB0aGUgY2hpbGQKLQkJLy8gYW5kIHNlcnZpY2VzIHJlZ2lzdGVyZWQgaW4gdGhlIHBhcmVudCBhcmUgcHJvcGFnYXRlZCB0byB0aGUgY2hpbGQKLQkJLy8gYW5kIHNlcnZpY2VzIHJlZ2lzdGVyZWQgaW4gdGhlIGNoaWxkIGFyZSBwcm9wYWdhdGVkIHRvIHRoZSBwYXJlbnQKLQkJQnVuZGxlIGNTZXJ2aWNlID0gaW5zdGFsbEludG9DdXJyZW50KCJ0ZXN0LmxpbmsuYyIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQljU2VydmljZS5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRlc3QubGluay5jIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlNYXAgbGlua01hbmlmZXN0ID0gbmV3IEhhc2hNYXAoKTsKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3RDb21wb3NpdGVTaGFyZTA5YiIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInRlc3QubGluay5jLnNlcnZpY2UxLHRlc3QubGluay5jLnNlcnZpY2UyLHRlc3QubGluay5jLnNlcnZpY2UzIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ0ZXN0LmxpbmsuZS5zZXJ2aWNlMTsgYXR0cjE9XCJ2YWx1ZTFcIiwgdGVzdC5saW5rLmUuc2VydmljZTI7IGF0dHIyPVwidmFsdWUyXCI7IHVzZXM6PVwidGVzdC5saW5rLmUuc2VydmljZTFcIiwgdGVzdC5saW5rLmUuc2VydmljZTM7IGF0dHIzPVwidmFsdWUzXCI7IHVzZXM6PVwidGVzdC5saW5rLmUuc2VydmljZTJcIiIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29tcG9zaXRlQnVuZGxlRmFjdG9yeS5DT01QT1NJVEVfU0VSVklDRV9GSUxURVJfSU1QT1JULCAiKG9iamVjdENsYXNzPXRlc3QubGluay5jLnNlcnZpY2UxLlNlcnZpY2UxKSwob2JqZWN0Q2xhc3M9dGVzdC5saW5rLmMuc2VydmljZTIuU2VydmljZTIpLChvYmplY3RDbGFzcz10ZXN0LmxpbmsuYy5zZXJ2aWNlMy5TZXJ2aWNlMykiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkuQ09NUE9TSVRFX1NFUlZJQ0VfRklMVEVSX0VYUE9SVCwgIihvYmplY3RDbGFzcz10ZXN0LmxpbmsuZS5zZXJ2aWNlMS5TZXJ2aWNlMSksKG9iamVjdENsYXNzPXRlc3QubGluay5lLnNlcnZpY2UyLlNlcnZpY2UyKSwob2JqZWN0Q2xhc3M9dGVzdC5saW5rLmUuc2VydmljZTMuU2VydmljZTMpIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlQnVuZGxlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZUJ1bmRsZShsaW5rQnVuZGxlRmFjdG9yeSwgInRlc3RDb21wb3NpdGVTaGFyZTA5YiIsIG51bGwsIGxpbmtNYW5pZmVzdCwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZSBlU2VydmljZSA9IGluc3RhbGxJbnRvQ2hpbGQoY29tcG9zaXRlLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLCAidGVzdC5saW5rLmUiKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGUsIGZhbHNlKTsKLQotCQl0cnkgewotCQkJZVNlcnZpY2Uuc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdGFydCB0ZXN0LmxpbmsuZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTZXJ2aWNlUmVmZXJlbmNlW10gY2hpbGRTZXJ2aWNlcyA9IGNvbXBvc2l0ZS5nZXRTdXJyb2dhdGVCdW5kbGUoKS5nZXRSZWdpc3RlcmVkU2VydmljZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY2hpbGQgc2VydmljZXMgZm91bmQiLCBjaGlsZFNlcnZpY2VzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjaGlsZCBzZXJ2aWNlcyIsIDMsIGNoaWxkU2VydmljZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCVNlcnZpY2VSZWZlcmVuY2VbXSBwYXJlbnRTZXJ2aWNlcyA9IGNvbXBvc2l0ZS5nZXRSZWdpc3RlcmVkU2VydmljZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gcGFyZW50IHNlcnZpY2VzIGZvdW5kIiwgcGFyZW50U2VydmljZXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHBhcmVudCBzZXJ2aWNlcyIsIDMsIHBhcmVudFNlcnZpY2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgY0NsaWVudCA9IGluc3RhbGxJbnRvQ2hpbGQoY29tcG9zaXRlLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLCAidGVzdC5saW5rLmMuY2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIGVDbGllbnQgPSBpbnN0YWxsSW50b0N1cnJlbnQoInRlc3QubGluay5lLmNsaWVudCIpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCWNDbGllbnQuc3RhcnQoKTsKLQkJCWNDbGllbnQuc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0L3N0b3AgdGhlIGNsaWVudCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJY1NlcnZpY2Uuc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0b3AgY1NlcnZpY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWNDbGllbnQuc3RhcnQoKTsKLQkJCWZhaWwoIlNob3VsZCBoYXZlIGZhaWxlZCB0byBzdGFydCBjQ2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWNTZXJ2aWNlLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGVzdC5saW5rLmMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQljQ2xpZW50LnN0YXJ0KCk7Ci0JCQljQ2xpZW50LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdGFydC9zdG9wIHRoZSBjbGllbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWVDbGllbnQuc3RhcnQoKTsKLQkJCWVDbGllbnQuc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0L3N0b3AgdGhlIGNsaWVudCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJZVNlcnZpY2Uuc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0b3AgZVNlcnZpY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWVDbGllbnQuc3RhcnQoKTsKLQkJCWZhaWwoIlNob3VsZCBoYXZlIGZhaWxlZCB0byBzdGFydCBlQ2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWVTZXJ2aWNlLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGVzdC5saW5rLmUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllQ2xpZW50LnN0YXJ0KCk7Ci0JCQllQ2xpZW50LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdGFydC9zdG9wIHRoZSBjbGllbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXVuaW5zdGFsbENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVTaGFyZTEwKCkgewotCQkvLyB0ZXN0IHNlcnZpY2UgbGlzdGVuZXJzIHdpdGggc2VydmljZXMgc2hhcmVkIHRvIGNoaWxkCi0JCVN0cmluZyBmaWx0ZXIxID0gIihrZXkxPTEpIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZmlsdGVyMiA9ICIoa2V5Mj12YWx1ZTEpIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZmlsdGVyMyA9ICIoa2V5Mz10cnVlKSI7IC8vJE5PTi1OTFMtMSQKLQotCQlNYXAgbGlua01hbmlmZXN0ID0gbmV3IEhhc2hNYXAoKTsKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3RDb21wb3NpdGVTaGFyZTEwIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29tcG9zaXRlQnVuZGxlRmFjdG9yeS5DT01QT1NJVEVfU0VSVklDRV9GSUxURVJfSU1QT1JULCBmaWx0ZXIxICsgJywnICsgZmlsdGVyMik7Ci0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJ0ZXN0Q29tcG9zaXRlU2hhcmUxMCIsIG51bGwsIGxpbmtNYW5pZmVzdCwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhcnRDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlLCBmYWxzZSk7Ci0KLQkJSGFzaHRhYmxlIHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQoImtleTEiLCBuZXcgSW50ZWdlcigxKSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJvcHMucHV0KCJrZXkyIiwgInZhbHVlMSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlwcm9wcy5wdXQoImtleTMiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaW5zdGFsbCBsaXN0ZW5lciB0byB0ZXN0IHdpdGggYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBzZXJ2aWNlIHNvIHdlIGNhbiBnZXQgdGhlIFJFR0lTVEVSRUQgZXZlbnQKLQkJVGVzdFNlcnZpY2VMaXN0ZW5lciByZXN1bHRMaXN0ZW5lciA9IG5ldyBUZXN0U2VydmljZUxpc3RlbmVyKCk7Ci0JCXRyeSB7Ci0JCQljb21wb3NpdGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0QnVuZGxlQ29udGV4dCgpLmFkZFNlcnZpY2VMaXN0ZW5lcihyZXN1bHRMaXN0ZW5lciwgIigmIiArIGZpbHRlcjEgKyBmaWx0ZXIyICsgZmlsdGVyMyArICIpIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGFkZCBsaXN0ZW5lciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyByZWdpc3RlciBhIHNlcnZpY2UgdGhhdCBzaG91bGQgbWF0Y2ggdGhlIGxpc3RlbmVyIGZpbHRlcgotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTdHJpbmdbXSB7T2JqZWN0LmNsYXNzLmdldE5hbWUoKX0sIG5ldyBPYmplY3QoKSwgcHJvcHMpOwotCQl0cnkgewotCQkJLy8gZXhwZWN0aW5nIHRvIGhhdmUgZ290dGVuIDEgUkVHSVNURVJFRCBldmVudAotCQkJaW50W10gcmVzdWx0cyA9IHJlc3VsdExpc3RlbmVyLmdldFJlc3VsdHMoKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbGlzdGVuZXIgcmVzdWx0cyIsIG5ldyBpbnRbXSB7MSwgMCwgMCwgMH0sIHJlc3VsdHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCVNlcnZpY2VSZWZlcmVuY2VbXSB0YXJnZXRTZXJ2aWNlcyA9IGNvbXBvc2l0ZS5nZXRTdXJyb2dhdGVCdW5kbGUoKS5nZXRSZWdpc3RlcmVkU2VydmljZXMoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIHRhcmdldCBzZXJ2aWNlcyBmb3VuZCIsIHRhcmdldFNlcnZpY2VzKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdGFyZ2V0IHNlcnZpY2VzIiwgMSwgdGFyZ2V0U2VydmljZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBtb2RpZnkgdGhlIHNlcnZpY2UgcHJvcGVydGllcyBzbyB0aGV5IG1hdGNoIGJvdGggdGhlIGxpbmsgZGVzY3JpcHRpb24KLQkJCS8vIGFuZCB0aGUgdGVzdCBsaXN0ZW5lciBmaWx0ZXIKLQkJCXByb3BzLnB1dCgia2V5NCIsICJ2YWx1ZTEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZWdpc3RyYXRpb24uc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQkvLyBleHBlY3RpbmcgdG8gZ2V0IGEgTU9ESUZJRUQgZXZlbnQKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbGlzdGVuZXIgcmVzdWx0cyIsIG5ldyBpbnRbXSB7MSwgMSwgMCwgMH0sIHJlc3VsdHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIG1vZGlmeSB0aGUgc2VydmljZSBwcm9wZXJ0aWVzIHNvIHRoZXkgbWF0Y2ggdGhlIGxpbmsgZGVzY3JpcHRpb24KLQkJCS8vIGJ1dCBub3QgdGhlIHRlc3QgbGlzdGVuZXIgZmlsdGVyCi0JCQlwcm9wcy5wdXQoImtleTMiLCBCb29sZWFuLkZBTFNFKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVnaXN0cmF0aW9uLnNldFByb3BlcnRpZXMocHJvcHMpOwotCQkJLy8gZXhwZWN0aW5nIHRvIGdldCBhIE1PRElGSUVEX0VORE1BVENIIGV2ZW50Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIGxpc3RlbmVyIHJlc3VsdHMiLCBuZXcgaW50W10gezEsIDEsIDEsIDB9LCByZXN1bHRzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBtb2RpZnkgdGhlIHNlcnZpY2UgcHJvcGVydGllcyBzbyB0aGV5IHN0aWxsIG1hdGNoIHRlaCBsaW5rIGRlc2NyaXB0aW9uCi0JCQkvLyBidXQgc3RpbGwgZG8gbm90IG1hdGNoIHRoZSB0ZXN0IGxpc3RlbmVyIGZpbHRlcgotCQkJcHJvcHMucHV0KCJrZXk0IiwgInZhbHVlMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlZ2lzdHJhdGlvbi5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCS8vIGV4cGVjdGluZyBubyBuZXcgZXZlbnRzCi0JCQlhc3NlcnRFcXVhbHMoIldyb25nIGxpc3RlbmVyIHJlc3VsdHMiLCBuZXcgaW50W10gezEsIDEsIDEsIDB9LCByZXN1bHRzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBtb2RpZnkgdGhlIHNlcnZpY2UgcHJvcGVydGllcyBzbyB0aGV5IG1hdGNoIHRoZSBsaW5rIGRlc2NyaXB0aW9uCi0JCQkvLyBhbmQgYWdhaW4gbWF0Y2ggdGhlIHRlc3QgbGlzdGVuZXIgZmlsdGVyCi0JCQlwcm9wcy5wdXQoImtleTMiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0JCQlyZWdpc3RyYXRpb24uc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQkvLyBleHBlY3RpbmcgdG8gZ2V0IGEgTU9ESUZJRUQgZXZlbnQKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbGlzdGVuZXIgcmVzdWx0cyIsIG5ldyBpbnRbXSB7MSwgMiwgMSwgMH0sIHJlc3VsdHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIG1vZGlmeSB0aGUgc2VydmljZSBwcm9wZXJ0aWVzIHNvIHRoZXkgZG8gbm90IG1hdGNoIHRoZSBsaW5rIGRlc2NyaXB0aW9uCi0JCQkvLyBvciB0aGUgdGVzdCBsaXN0ZW5lciBmaWx0ZXIKLQkJCXByb3BzLnB1dCgia2V5MSIsIG5ldyBJbnRlZ2VyKDIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJvcHMucHV0KCJrZXkyIiwgInZhbHVlMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlZ2lzdHJhdGlvbi5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCS8vIGV4cGVjdGluZyB0byBnZXQgYW4gVU5SRUdJU1RFUklORyBldmVudCAKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbGlzdGVuZXIgcmVzdWx0cyIsIG5ldyBpbnRbXSB7MSwgMiwgMSwgMX0sIHJlc3VsdHMpOyAvLyROT04tTkxTLTEkCi0KLQkJfSBmaW5hbGx5IHsKLQkJCWNvbXBvc2l0ZS5nZXRDb21wb3NpdGVGcmFtZXdvcmsoKS5nZXRCdW5kbGVDb250ZXh0KCkucmVtb3ZlU2VydmljZUxpc3RlbmVyKHJlc3VsdExpc3RlbmVyKTsKLQkJCWlmIChyZWdpc3RyYXRpb24gIT0gbnVsbCkKLQkJCQlyZWdpc3RyYXRpb24udW5yZWdpc3RlcigpOwotCQl9Ci0KLQkJdW5pbnN0YWxsQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvc2l0ZVNoYXJlMTEoKSB7Ci0JCS8vIFRlc3Qgc2VydmljZSB0cmFja2VycyB3aXRoIHNoYXJlZCBzZXJ2aWNlcyB0byBjaGlsZAotCQlTdHJpbmcgZmlsdGVyMSA9ICIoa2V5MT0xKSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZpbHRlcjIgPSAiKGtleTI9dmFsdWUxKSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZpbHRlcjMgPSAiKGtleTM9dHJ1ZSkiOyAvLyROT04tTkxTLTEkCi0KLQkJTWFwIGxpbmtNYW5pZmVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0Q29tcG9zaXRlU2hhcmUxMSIpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rTWFuaWZlc3QucHV0KENvbXBvc2l0ZUJ1bmRsZUZhY3RvcnkuQ09NUE9TSVRFX1NFUlZJQ0VfRklMVEVSX0lNUE9SVCwgZmlsdGVyMSArICcsJyArIGZpbHRlcjIpOwotCQlDb21wb3NpdGVCdW5kbGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlQnVuZGxlKGxpbmtCdW5kbGVGYWN0b3J5LCAidGVzdENvbXBvc2l0ZVNoYXJlMTAiLCBudWxsLCBsaW5rTWFuaWZlc3QsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXJ0Q29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZSwgZmFsc2UpOwotCi0JCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KCJrZXkxIiwgbmV3IEludGVnZXIoMSkpOyAvLyROT04tTkxTLTEkCi0JCXByb3BzLnB1dCgia2V5MiIsICJ2YWx1ZTEiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJcHJvcHMucHV0KCJrZXkzIiwgQm9vbGVhbi5UUlVFKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG9wZW4gdHJhY2tlciB0byB0ZXN0IHdpdGggYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBzZXJ2aWNlIHNvIHdlIGNhbiBnZXQgdGhlIFJFR0lTVEVSRUQgZXZlbnQKLQkJU2VydmljZVRyYWNrZXIgdHJhY2tlciA9IG51bGw7Ci0JCVRlc3RUcmFja2VyQ3VzdG9taXplciByZXN1bHRMaXN0ZW5lciA9IG5ldyBUZXN0VHJhY2tlckN1c3RvbWl6ZXIoKTsKLQkJdHJ5IHsKLQkJCXRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29tcG9zaXRlLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldEJ1bmRsZUNvbnRleHQoKSwgY29tcG9zaXRlLmdldENvbXBvc2l0ZUZyYW1ld29yaygpLmdldEJ1bmRsZUNvbnRleHQoKS5jcmVhdGVGaWx0ZXIoIigmIiArIGZpbHRlcjEgKyBmaWx0ZXIyICsgZmlsdGVyMyArICIpIiksIHJlc3VsdExpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0cmFja2VyLm9wZW4oKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gYWRkIGxpc3RlbmVyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHJlZ2lzdGVyIGEgc2VydmljZSB0aGF0IHNob3VsZCBtYXRjaCB0aGUgbGlzdGVuZXIgZmlsdGVyCi0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UobmV3IFN0cmluZ1tdIHtPYmplY3QuY2xhc3MuZ2V0TmFtZSgpfSwgbmV3IE9iamVjdCgpLCBwcm9wcyk7Ci0JCXRyeSB7Ci0JCQkvLyBleHBlY3RpbmcgdG8gaGF2ZSBnb3R0ZW4gMSBhZGRpbmdTZXJ2aWNlIGNhbGwKLQkJCWludFtdIHJlc3VsdHMgPSByZXN1bHRMaXN0ZW5lci5nZXRSZXN1bHRzKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIGxpc3RlbmVyIHJlc3VsdHMiLCBuZXcgaW50W10gezEsIDAsIDB9LCByZXN1bHRzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlTZXJ2aWNlUmVmZXJlbmNlW10gdGFyZ2V0U2VydmljZXMgPSBjb21wb3NpdGUuZ2V0U3Vycm9nYXRlQnVuZGxlKCkuZ2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyB0YXJnZXQgc2VydmljZXMgZm91bmQiLCB0YXJnZXRTZXJ2aWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHRhcmdldCBzZXJ2aWNlcyIsIDEsIHRhcmdldFNlcnZpY2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gbW9kaWZ5IHRoZSBzZXJ2aWNlIHByb3BlcnRpZXMgc28gdGhleSBtYXRjaCBib3RoIHRoZSBsaW5rIGRlc2NyaXB0aW9uCi0JCQkvLyBhbmQgdGhlIHRlc3QgdHJhY2tlciBmaWx0ZXIKLQkJCXByb3BzLnB1dCgia2V5NCIsICJ2YWx1ZTEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZWdpc3RyYXRpb24uc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQkvLyBleHBlY3RpbmcgdG8gZ2V0IDEgbW9kaWZpZWRTZXJ2aWNlIGNhbGwKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbGlzdGVuZXIgcmVzdWx0cyIsIG5ldyBpbnRbXSB7MSwgMSwgMH0sIHJlc3VsdHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIG1vZGlmeSB0aGUgc2VydmljZSBwcm9wZXJ0aWVzIHNvIHRoZXkgbWF0Y2ggdGhlIGxpbmsgZGVzY3JpcHRpb24KLQkJCS8vIGJ1dCBub3QgdGhlIHRlc3QgdHJhY2tlciBmaWx0ZXIKLQkJCXByb3BzLnB1dCgia2V5MyIsIEJvb2xlYW4uRkFMU0UpOyAvLyROT04tTkxTLTEkCi0JCQlyZWdpc3RyYXRpb24uc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQkvLyBleHBlY3RpbmcgdG8gZ2V0IGEgcmVtb3ZlZFNlcnZpY2UgY2FsbAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBsaXN0ZW5lciByZXN1bHRzIiwgbmV3IGludFtdIHsxLCAxLCAxfSwgcmVzdWx0cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gbW9kaWZ5IHRoZSBzZXJ2aWNlIHByb3BlcnRpZXMgc28gdGhleSBzdGlsbCBtYXRjaCB0aGUgbGluayBkZXNjcmlwdGlvbgotCQkJLy8gYnV0IHN0aWxsIGRvIG5vdCBtYXRjaCB0aGUgdGVzdCBsaXN0ZW5lciBmaWx0ZXIKLQkJCXByb3BzLnB1dCgia2V5NCIsICJ2YWx1ZTIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZWdpc3RyYXRpb24uc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQkvLyBleHBlY3Rpbmcgbm8gbmV3IG1ldGhvZCBjYWxscwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBsaXN0ZW5lciByZXN1bHRzIiwgbmV3IGludFtdIHsxLCAxLCAxfSwgcmVzdWx0cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gbW9kaWZ5IHRoZSBzZXJ2aWNlIHByb3BlcnRpZXMgc28gdGhleSBtYXRjaCB0aGUgbGluayBkZXNjcmlwdGlvbgotCQkJLy8gYW5kIGFnYWluIG1hdGNoIHRoZSB0ZXN0IHRyYWNrZXIgZmlsdGVyCi0JCQlwcm9wcy5wdXQoImtleTMiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0JCQlyZWdpc3RyYXRpb24uc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQkvLyBleHBlY3RpbmcgdG8gZ2V0IGFuIGFkZGluZ1NlcnZpY2UgY2FsbAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBsaXN0ZW5lciByZXN1bHRzIiwgbmV3IGludFtdIHsyLCAxLCAxfSwgcmVzdWx0cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gbW9kaWZ5IHRoZSBzZXJ2aWNlIHByb3BlcnRpZXMgc28gdGhleSBkbyBub3QgbWF0Y2ggdGhlIGxpbmsgZGVzY3JpcHRpb24KLQkJCS8vIG9yIHRoZSB0ZXN0IHRyYWNrZXIgZmlsdGVyCi0JCQlwcm9wcy5wdXQoImtleTEiLCBuZXcgSW50ZWdlcigyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3BzLnB1dCgia2V5MiIsICJ2YWx1ZTIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZWdpc3RyYXRpb24uc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQkvLyBleHBlY3RpbmcgdG8gZ2V0IGEgcmVtb3ZlZFNlcnZpY2UgY2FsbCAKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbGlzdGVuZXIgcmVzdWx0cyIsIG5ldyBpbnRbXSB7MiwgMSwgMn0sIHJlc3VsdHMpOyAvLyROT04tTkxTLTEkCi0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFja2VyICE9IG51bGwpCi0JCQkJdHJhY2tlci5jbG9zZSgpOwotCQkJaWYgKHJlZ2lzdHJhdGlvbiAhPSBudWxsKQotCQkJCXJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyKCk7Ci0JCX0KLQotCQl1bmluc3RhbGxDb21wb3NpdGVCdW5kbGUoY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjU4MjA5XzEoKSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSBidW5kbGUgdG8gdGVzdCB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXJzCi0JCU1hcCBsaW5rTWFuaWZlc3QgPSBuZXcgSGFzaE1hcCgpOwotCQlsaW5rTWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQnVnMjU4MjA5LjAxIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlua01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZUJ1bmRsZSBjb21wb3NpdGVCdW5kbGUgPSBjcmVhdGVDb21wb3NpdGVCdW5kbGUobGlua0J1bmRsZUZhY3RvcnksICJCdWcyNTgyMDkuMDEiLCBudWxsLCBsaW5rTWFuaWZlc3QsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlIHRlc3RUQ0NMID0gaW5zdGFsbEludG9DaGlsZChjb21wb3NpdGVCdW5kbGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCksICJ0ZXN0LnRjY2wiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJCdW5kbGUgc2hvdWxkIGJlIHJlc29sdmVkIiwgcmVzb2x2ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCksIHRlc3RUQ0NMKSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0VENDTC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gc3RhcnRpbmcgYnVuZGxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc3RhdGUiLCBCdW5kbGUuUkVTT0xWRUQsIHRlc3RUQ0NMLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRoaXMgd2lsbCBzdGFydCB0aGUgZnJhbWV3b3JrIG9uIHRoZSBjdXJyZW50IHRocmVhZDsgdGVzdCB0aGF0IHRoZSBjb3JyZWN0IHRjY2wgaXMgdXNlZAotCQlzdGFydENvbXBvc2l0ZUJ1bmRsZShjb21wb3NpdGVCdW5kbGUsIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHN0YXRlIiwgQnVuZGxlLkFDVElWRSwgdGVzdFRDQ0wuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0ZXN0IHRoYXQgdGhlIGNvcnJlY3QgdGNjbCBpcyB1c2VkIGZvciBmcmFtZXdvcmsgdXBkYXRlCi0JCUZyYW1ld29yayBmcmFtZXdvcmsgPSBjb21wb3NpdGVCdW5kbGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCk7Ci0JCXRyeSB7Ci0JCQlmcmFtZXdvcmsudXBkYXRlKCk7Ci0JCQljaGVja0FjdGl2ZSh0ZXN0VENDTCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHN0YXRlIiwgQnVuZGxlLkFDVElWRSwgdGVzdFRDQ0wuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0ZXN0IHRoYXQgdGhlIGNvcnJlY3QgdGNjbCBpcyB1c2VkIGZvciByZWZyZXNoIHBhY2thZ2VzCi0JCVBhY2thZ2VBZG1pbiBwYSA9IGdldFBhY2thZ2VBZG1pbihjb21wb3NpdGVCdW5kbGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkpOwotCQlwYS5yZWZyZXNoUGFja2FnZXMobmV3IEJ1bmRsZVtdIHt0ZXN0VENDTH0pOwotCQljaGVja0FjdGl2ZSh0ZXN0VENDTCk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzdGF0ZSIsIEJ1bmRsZS5BQ1RJVkUsIHRlc3RUQ0NMLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdXNlIHRoZSB0Y2NsIHNlcnZpY2UgdG8gc3RhcnQgdGhlIHRlc3QgYnVuZGxlLgotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBjb21wb3NpdGVCdW5kbGUuZ2V0Q29tcG9zaXRlRnJhbWV3b3JrKCkuZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlDbGFzc0xvYWRlciBzZXJ2aWNlVENDTCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzZXJ2aWNlVENDTCA9IChDbGFzc0xvYWRlcikgY29udGV4dC5nZXRTZXJ2aWNlKGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZXMoQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0TmFtZSgpLCAiKGVxdWlub3guY2xhc3Nsb2FkZXIudHlwZT1jb250ZXh0Q2xhc3NMb2FkZXIpIilbMF0pOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIiwgZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCUNsYXNzTG9hZGVyIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihzZXJ2aWNlVENDTCk7Ci0JCXRyeSB7Ci0JCQl0ZXN0VENDTC5zdG9wKCk7Ci0JCQl0ZXN0VENDTC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5lcGVjdGVkIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cnJlbnQpOwotCQl9Ci0JCS8vIHRlc3QgdGhhdCBzdGFydGluZyBkaXJlY3RseSB3b3JrcwotCQl0cnkgewotCQkJdGVzdFRDQ0wuc3RvcCgpOwotCQkJdGVzdFRDQ0wuc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXBlY3RlZCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdW5pbnN0YWxsQ29tcG9zaXRlQnVuZGxlKGNvbXBvc2l0ZUJ1bmRsZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQWN0aXZlKEJ1bmRsZSBiKSB7Ci0JCXRyeSB7Ci0JCQkvLyBqdXN0IGEgaGFjayB0byBtYWtlIHN1cmUgd2UgYXJlIHJlc3RhcnRlZAotCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQlpZiAoYi5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpCi0JCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZUJ1bmRsZShCdW5kbGUgZnJhbWV3b3JrLCBCdW5kbGUgYnVuZGxlKSB7Ci0JCVBhY2thZ2VBZG1pbiBwYSA9IGdldFBhY2thZ2VBZG1pbihmcmFtZXdvcmspOwotCQlyZXR1cm4gcGEucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtidW5kbGV9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29uZmlndXJhdGlvbi9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2NvbmZpZ3VyYXRpb24vQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2ZDZlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29uZmlndXJhdGlvbi9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFJlYWRPbmx5Q29uZmlndXJhdGlvbkFyZWFUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KE1vdmFibGVDb25maWd1cmF0aW9uQXJlYVRlc3Quc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29uZmlndXJhdGlvbi9Nb3ZhYmxlQ29uZmlndXJhdGlvbkFyZWFUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29uZmlndXJhdGlvbi9Nb3ZhYmxlQ29uZmlndXJhdGlvbkFyZWFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNDdhMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2NvbmZpZ3VyYXRpb24vTW92YWJsZUNvbmZpZ3VyYXRpb25BcmVhVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLnNlc3Npb24uQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBNb3ZhYmxlQ29uZmlndXJhdGlvbkFyZWFUZXN0IGV4dGVuZHMgT1NHaVRlc3QgewotCi0Jc3RhdGljIHZvaWQgZG9Nb3ZlKGZpbmFsIElQYXRoIHNvdXJjZVBhdGgsIGZpbmFsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCkgewotCQlhc3NlcnRUcnVlKCJGYWlsZWQgbW92aW5nICIgKyBzb3VyY2VQYXRoICsgIiB0byAiICsgZGVzdGluYXRpb25QYXRoLCBzb3VyY2VQYXRoLnRvRmlsZSgpLnJlbmFtZVRvKGRlc3RpbmF0aW9uUGF0aC50b0ZpbGUoKSkpOwotCX0KLQotCXN0YXRpYyB2b2lkIGRvVGFrZVNuYXBzaG90KGZpbmFsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCkgewotCQkvLyBjb21wdXRlIGFuZCBzYXZlIHRyZWUgaW1hZ2UKLQkJRmlsZSBjb25maWd1cmF0aW9uRGlyID0gZGVzdGluYXRpb25QYXRoLnRvRmlsZSgpOwotCQlGaWxlU3lzdGVtQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IEZpbGVTeXN0ZW1Db21wYXJhdG9yKCk7Ci0JCU9iamVjdCBzbmFwc2hvdCA9IGNvbXBhcmF0b3IudGFrZVNuYXBzaG90KGNvbmZpZ3VyYXRpb25EaXIsIHRydWUpOwotCQl0cnkgewotCQkJY29tcGFyYXRvci5zYXZlU25hcHNob3Qoc25hcHNob3QsIGNvbmZpZ3VyYXRpb25EaXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIxLjAiKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShNb3ZhYmxlQ29uZmlndXJhdGlvbkFyZWFUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLQkJQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUgaW5pdGlhbGl6YXRpb24gPSBuZXcgQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUoUElfT1NHSV9URVNUUywgTW92YWJsZUNvbmZpZ3VyYXRpb25BcmVhVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlTdHJpbmdbXSBpZHMgPSBDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZS5NSU5JTUFMX0JVTkRMRV9TRVQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKQotCQkJaW5pdGlhbGl6YXRpb24uYWRkQnVuZGxlKGlkc1tpXSk7Ci0JCWluaXRpYWxpemF0aW9uLmFkZEJ1bmRsZShQSV9PU0dJX1RFU1RTKTsKLQkJaW5pdGlhbGl6YXRpb24uc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCS8vIGRpc2FibGUgY2xlYW4tdXAsIHdlIHdhbnQgdG8gcmV1c2UgdGhlIGNvbmZpZ3VyYXRpb24KLQkJaW5pdGlhbGl6YXRpb24uc2V0Q2xlYW51cChmYWxzZSk7Ci0JCWluaXRpYWxpemF0aW9uLmFkZFRlc3QobmV3IE1vdmFibGVDb25maWd1cmF0aW9uQXJlYVRlc3QoInRlc3RJbml0aWFsaXphdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChpbml0aWFsaXphdGlvbik7Ci0KLQkJLy8gYWRkIGEgaGVscGVyIHRlc3QgdGhhdCBqdXN0IG1vdmVzIHRoZSBjb25maWd1cmF0aW9uIGFyZWEKLQkJZmluYWwgSVBhdGggc291cmNlUGF0aCA9IGluaXRpYWxpemF0aW9uLmdldENvbmZpZ3VyYXRpb25QYXRoKCk7Ci0JCWZpbmFsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCA9IEZpbGVTeXN0ZW1IZWxwZXIuZ2V0UmFuZG9tTG9jYXRpb24oRmlsZVN5c3RlbUhlbHBlci5nZXRUZW1wRGlyKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0Q2FzZSgidGVzdE1vdmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCQkJZG9Nb3ZlKHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uUGF0aCk7Ci0JCQl9Ci0JCX0pOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0Q2FzZSgidGVzdFRha2VTbmFwc2hvdCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCQlkb1Rha2VTbmFwc2hvdChkZXN0aW5hdGlvblBhdGgpOwotCQkJfQotCQl9KTsKLQotCQlDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZSBhZnRlck1vdmluZyA9IG5ldyBDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZShQSV9PU0dJX1RFU1RTLCBNb3ZhYmxlQ29uZmlndXJhdGlvbkFyZWFUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWFmdGVyTW92aW5nLnNldENvbmZpZ3VyYXRpb25QYXRoKGRlc3RpbmF0aW9uUGF0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKQotCQkJYWZ0ZXJNb3ZpbmcuYWRkQnVuZGxlKGlkc1tpXSk7Ci0JCWFmdGVyTW92aW5nLnNldFJlYWRPbmx5KHRydWUpOwotCQkvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgYWxsb3cgcHJpbWluZyBmb3IgdGhlIGZpcnN0IHJ1bgotCQlhZnRlck1vdmluZy5zZXRQcmltZShmYWxzZSk7Ci0JCWFmdGVyTW92aW5nLmFkZFRlc3QobmV3IE1vdmFibGVDb25maWd1cmF0aW9uQXJlYVRlc3QoInRlc3RBZnRlck1vdmluZyIpKTsKLQkJYWZ0ZXJNb3ZpbmcuYWRkVGVzdChuZXcgTW92YWJsZUNvbmZpZ3VyYXRpb25BcmVhVGVzdCgidGVzdFZlcmlmeVNuYXBzaG90IikpOwotCQlzdWl0ZS5hZGRUZXN0KGFmdGVyTW92aW5nKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyBNb3ZhYmxlQ29uZmlndXJhdGlvbkFyZWFUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRyaWVzIHRvIGluc3RhbGwgYSBwbHVnLWluIHRoYXQgaGFzIG5vIG1hbmlmZXN0LiBTaG91bGQgZmFpbCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIG1hbmlmZXN0IGdlbmVyYXRpb24gYXJlYQotCSAqIGlzIHVuZGVyIHRoZSBjb25maWd1cmF0aW9uIGFyZWEgKHdoaWNoIGlzIHJlYWQtb25seSBoZXJlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZnRlck1vdmluZygpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQkvLyB0cnkgdG8gaW5zdGFsbCBwbHVnLWluCi0JCS8vIGVuc3VyZSBpdCBpcyBub3QgaW5zdGFsbGVkCQkKLQkJQnVuZGxlIGluc3RhbGxlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImNvbmZpZ3VyYXRpb24vYnVuZGxlMDIiKTsKLQkJCS8vIHNob3VsZCBoYXZlIGZhaWxlZCB3aXRoIEJ1bmRsZUV4Y2VwdGlvbiwgZG9lcyBub3QgaGF2ZSBhIGJ1bmRsZSBtYW5pZmVzdAotCQkJZmFpbCgiMS4wIik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJLy8gc3VjY2VzcwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluc3RhbGxlZCAhPSBudWxsKQotCQkJCS8vIGNsZWFuLXVwIC0gb25seSBydW5zIGlmIHdlIGVuZC11cCBhY2NlcHRpbmcgYW4gaW52YWxpZCBtYW5pZmVzdAkJCQkKLQkJCQlpbnN0YWxsZWQudW5pbnN0YWxsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb24oKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGluaXRpYWxpemF0aW9uIHNlc3Npb24JCQotCQl0cnkgewotCQkJQnVuZGxlIGluc3RhbGxlZCA9IEJ1bmRsZVRlc3RpbmdIZWxwZXIuaW5zdGFsbEJ1bmRsZSgiMS4wIiwgZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImNvbmZpZ3VyYXRpb24vYnVuZGxlMDEiKTsKLQkJCS8vIG5vdCByZWFkLW9ubHkgeWV0LCBzaG91bGQgd29yayBmaW5lCi0JCQlpZiAoIUJ1bmRsZVRlc3RpbmdIZWxwZXIucmVzb2x2ZUJ1bmRsZXMoZ2V0Q29udGV4dCgpLCBuZXcgQnVuZGxlW10ge2luc3RhbGxlZH0pKQotCQkJCWZhaWwoIjEuMSIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoIjEuMiIsIGJlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZXJpZnlTbmFwc2hvdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVTeXN0ZW1Db21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgRmlsZVN5c3RlbUNvbXBhcmF0b3IoKTsKLQkJRmlsZSBjb25maWd1cmF0aW9uRGlyID0gQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUuZ2V0Q29uZmlndXJhdGlvbkRpcigpOwotCQlPYmplY3Qgb2xkU25hcGhvdCA9IGNvbXBhcmF0b3IubG9hZFNuYXBzaG90KGNvbmZpZ3VyYXRpb25EaXIpOwotCQlPYmplY3QgbmV3U25hcHNob3QgPSBjb21wYXJhdG9yLnRha2VTbmFwc2hvdChjb25maWd1cmF0aW9uRGlyLCB0cnVlKTsKLQkJY29tcGFyYXRvci5jb21wYXJlU25hcHNob3RzKCIxLjAiLCBvbGRTbmFwaG90LCBuZXdTbmFwc2hvdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29uZmlndXJhdGlvbi9SZWFkT25seUNvbmZpZ3VyYXRpb25BcmVhVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2NvbmZpZ3VyYXRpb24vUmVhZE9ubHlDb25maWd1cmF0aW9uQXJlYVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFhMjM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvY29uZmlndXJhdGlvbi9SZWFkT25seUNvbmZpZ3VyYXRpb25BcmVhVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuaGFybmVzcy5CdW5kbGVUZXN0aW5nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuaGFybmVzcy5GaWxlU3lzdGVtQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLnNlc3Npb24uQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZWFkT25seUNvbmZpZ3VyYXRpb25BcmVhVGVzdCBleHRlbmRzIE9TR2lUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUgc3VpdGUgPSBuZXcgQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUoUElfT1NHSV9URVNUUywgUmVhZE9ubHlDb25maWd1cmF0aW9uQXJlYVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJU3RyaW5nW10gaWRzID0gQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUuTUlOSU1BTF9CVU5ETEVfU0VUOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLQkJCXN1aXRlLmFkZEJ1bmRsZShpZHNbaV0pOwotCQlzdWl0ZS5hZGRCdW5kbGUoUElfT1NHSV9URVNUUyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlDb25maWd1cmF0aW9uQXJlYVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDB0aFNlc3Npb24oKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGluaXRpYWxpemF0aW9uIHNlc3Npb24JCQotCQl0cnkgewotCQkJQnVuZGxlIGluc3RhbGxlZCA9IEJ1bmRsZVRlc3RpbmdIZWxwZXIuaW5zdGFsbEJ1bmRsZSgiMS4wIiwgZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImNvbmZpZ3VyYXRpb24vYnVuZGxlMDEiKTsKLQkJCS8vIG5vdCByZWFkLW9ubHkgeWV0LCBzaG91bGQgd29yayBmaW5lCi0JCQlpZiAoIUJ1bmRsZVRlc3RpbmdIZWxwZXIucmVzb2x2ZUJ1bmRsZXMoZ2V0Q29udGV4dCgpLCBuZXcgQnVuZGxlW10ge2luc3RhbGxlZH0pKQotCQkJCWZhaWwoIjEuMSIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoIjEuMiIsIGJlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRha2VzIGEgc25hcHNob3Qgb2YgdGhlIGZpbGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Qxc3RTZXNzaW9uKCkgewotCQkvLyBjb21wdXRlIGFuZCBzYXZlIHRyZWUgaW1hZ2UKLQkJRmlsZSBjb25maWd1cmF0aW9uRGlyID0gQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUuZ2V0Q29uZmlndXJhdGlvbkRpcigpOwotCQlGaWxlU3lzdGVtQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IEZpbGVTeXN0ZW1Db21wYXJhdG9yKCk7Ci0JCU9iamVjdCBzbmFwc2hvdCA9IGNvbXBhcmF0b3IudGFrZVNuYXBzaG90KGNvbmZpZ3VyYXRpb25EaXIsIHRydWUpOwotCQl0cnkgewotCQkJY29tcGFyYXRvci5zYXZlU25hcHNob3Qoc25hcHNob3QsIGNvbmZpZ3VyYXRpb25EaXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIxLjAiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Qxc3RTZXNzaW9uRm9sbG93VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlU3lzdGVtQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IEZpbGVTeXN0ZW1Db21wYXJhdG9yKCk7Ci0JCUZpbGUgY29uZmlndXJhdGlvbkRpciA9IENvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlLmdldENvbmZpZ3VyYXRpb25EaXIoKTsKLQkJT2JqZWN0IG9sZFNuYXBob3QgPSBjb21wYXJhdG9yLmxvYWRTbmFwc2hvdChjb25maWd1cmF0aW9uRGlyKTsKLQkJT2JqZWN0IG5ld1NuYXBzaG90ID0gY29tcGFyYXRvci50YWtlU25hcHNob3QoY29uZmlndXJhdGlvbkRpciwgdHJ1ZSk7Ci0JCWNvbXBhcmF0b3IuY29tcGFyZVNuYXBzaG90cygiMS4wIiwgb2xkU25hcGhvdCwgbmV3U25hcHNob3QpOwotCX0KLQotCS8qKgotCSAqIFRyaWVzIHRvIGluc3RhbGwgYSBwbHVnLWluIHRoYXQgaGFzIG5vIG1hbmlmZXN0LiBTaG91bGQgZmFpbCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIG1hbmlmZXN0IGdlbmVyYXRpb24gYXJlYQotCSAqIGlzIHVuZGVyIHRoZSBjb25maWd1cmF0aW9uIGFyZWEgKHdoaWNoIGlzIHJlYWQtb25seSBoZXJlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QybmRTZXNzaW9uKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyB0cnkgdG8gaW5zdGFsbCBwbHVnLWluCi0JCS8vIGVuc3VyZSBpdCBpcyBub3QgaW5zdGFsbGVkCQkKLQkJQnVuZGxlIGluc3RhbGxlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImNvbmZpZ3VyYXRpb24vYnVuZGxlMDIiKTsKLQkJCS8vIHNob3VsZCBoYXZlIGZhaWxlZCB3aXRoIEJ1bmRsZUV4Y2VwdGlvbiwgZG9lcyBub3QgaGF2ZSBhIGJ1bmRsZSBtYW5pZmVzdAotCQkJZmFpbCgiMS4wIik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJLy8gc3VjY2VzcwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluc3RhbGxlZCAhPSBudWxsKQotCQkJCS8vIGNsZWFuLXVwIC0gb25seSBydW5zIGlmIHdlIGVuZC11cCBhY2NlcHRpbmcgYW4gaW52YWxpZCBtYW5pZmVzdAkJCQkKLQkJCQlpbnN0YWxsZWQudW5pbnN0YWxsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Mm5kU2Vzc2lvbkZvbGxvd1VwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVN5c3RlbUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBGaWxlU3lzdGVtQ29tcGFyYXRvcigpOwotCQlGaWxlIGNvbmZpZ3VyYXRpb25EaXIgPSBDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZS5nZXRDb25maWd1cmF0aW9uRGlyKCk7Ci0JCU9iamVjdCBvbGRTbmFwaG90ID0gY29tcGFyYXRvci5sb2FkU25hcHNob3QoY29uZmlndXJhdGlvbkRpcik7Ci0JCU9iamVjdCBuZXdTbmFwc2hvdCA9IGNvbXBhcmF0b3IudGFrZVNuYXBzaG90KGNvbmZpZ3VyYXRpb25EaXIsIHRydWUpOwotCQljb21wYXJhdG9yLmNvbXBhcmVTbmFwc2hvdHMoIjEuMCIsIG9sZFNuYXBob3QsIG5ld1NuYXBzaG90KTsKLQl9Ci0KLQkvKioKLQkgKiBUcmllcyB0byBpbnN0YWxsIGEgcGx1Zy1pbiB0aGF0IGhhcyBtYW5pZmVzdC4gU2hvdWxkIGZhaWwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZSBtYW5pZmVzdCBnZW5lcmF0aW9uIGFyZWEKLQkgKiBpcyB1bmRlciB0aGUgY29uZmlndXJhdGlvbiBhcmVhICh3aGljaCBpcyByZWFkLW9ubHkgaGVyZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0M3JkU2Vzc2lvbigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gaW5zdGFsbCBwbHVnLWluCi0JCS8vIGVuc3VyZSBpdCBpcyBub3QgaW5zdGFsbGVkCQkKLQkJQnVuZGxlIGluc3RhbGxlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImNvbmZpZ3VyYXRpb24vYnVuZGxlMDMiKTsKLQkJCS8vIHNob3VsZCBoYXZlIGZhaWxlZCAtIGNhbm5vdCBpbnN0YWxsIGEgYnVuZGxlIGluIHJlYWQtb25seSBtb2RlCi0JCQlmYWlsKCIxLjAiKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQkvLyBzdWNjZXNzIAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluc3RhbGxlZCAhPSBudWxsKQotCQkJCS8vIGNsZWFuLXVwIC0gb25seSBydW5zIGlmIHdlIGVuZC11cCBhY2NlcHRpbmcgYW4gaW52YWxpZCBtYW5pZmVzdAkJCQkKLQkJCQlpbnN0YWxsZWQudW5pbnN0YWxsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0M3JkU2Vzc2lvbkZvbGxvd1VwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVN5c3RlbUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBGaWxlU3lzdGVtQ29tcGFyYXRvcigpOwotCQlGaWxlIGNvbmZpZ3VyYXRpb25EaXIgPSBDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZS5nZXRDb25maWd1cmF0aW9uRGlyKCk7Ci0JCU9iamVjdCBvbGRTbmFwaG90ID0gY29tcGFyYXRvci5sb2FkU25hcHNob3QoY29uZmlndXJhdGlvbkRpcik7Ci0JCU9iamVjdCBuZXdTbmFwc2hvdCA9IGNvbXBhcmF0b3IudGFrZVNuYXBzaG90KGNvbmZpZ3VyYXRpb25EaXIsIHRydWUpOwotCQljb21wYXJhdG9yLmNvbXBhcmVTbmFwc2hvdHMoIjEuMCIsIG9sZFNuYXBob3QsIG5ld1NuYXBzaG90KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9kZWJ1Z29wdGlvbnMvRGVidWdPcHRpb25zVGVzdENhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9kZWJ1Z29wdGlvbnMvRGVidWdPcHRpb25zVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhNmIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvZGVidWdvcHRpb25zL0RlYnVnT3B0aW9uc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5kZWJ1Z29wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MuQ29yZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuZGVidWcuRnJhbWV3b3JrRGVidWdPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmRlYnVnLkZyYW1ld29ya0RlYnVnVHJhY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZ2lzdHJhdGlvbjsKLQotcHVibGljIGNsYXNzIERlYnVnT3B0aW9uc1Rlc3RDYXNlIGV4dGVuZHMgQ29yZVRlc3QgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGVidWdPcHRpb25zVGVzdENhc2UuY2xhc3MpOwotCX0KLQotCURlYnVnT3B0aW9ucyBkZWJ1Z09wdGlvbnM7Ci0JU2VydmljZVJlZmVyZW5jZSByZWY7Ci0JRGljdGlvbmFyeSBwcm9wcyA9IG51bGw7Ci0JVGVzdERlYnVnT3B0aW9uc0xpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKLQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSQUNFX0VMRU1FTlRfREVMSU1JVEVSID0gInwiOyAvLyROT04tTkxTLTEkIC8vIHRoaXMgdmFsdWUgbmVlZHMgdG8gbWF0Y2ggRWNsaXBzZURlYnVnVHJhY2UjVFJBQ0VfRUxFTUVOVF9ERUxJTUlURVIKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFJBQ0VfRUxFTUVOVF9ERUxJTUlURVJfRU5DT0RFRCA9ICImIzEyNDsiOyAvLyROT04tTkxTLTEkIC8vIHRoaXMgdmFsdWUgbmVlZHMgdG8gbWF0Y2ggRWNsaXBzZURlYnVnVHJhY2UjVFJBQ0VfRUxFTUVOVF9ERUxJTUlURVJfRU5DT0RFRAotCXByaXZhdGUgZmluYWwgc3RhdGljIFNpbXBsZURhdGVGb3JtYXQgVFJBQ0VfRklMRV9EQVRFX0ZPUk1BVFRFUiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExJTkVfU0VQQVJBVE9SOwotCXByaXZhdGUgYm9vbGVhbiB2ZXJib3NlRGVidWcgPSB0cnVlOyAvLyBkZWZhdWx0IGlzIHRydWUKLQlzdGF0aWMgewotCQlTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlMSU5FX1NFUEFSQVRPUiA9IHMgPT0gbnVsbCA/ICJcbiIgOiBzOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmVmID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKERlYnVnT3B0aW9ucy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKCJEZWJ1Z09wdGlvbnMgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlIiwgcmVmKTsgLy8kTk9OLU5MUy0xJAotCQlkZWJ1Z09wdGlvbnMgPSAoRGVidWdPcHRpb25zKSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UocmVmKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRGVidWdPcHRpb25zIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSIsIGRlYnVnT3B0aW9ucyk7IC8vJE5PTi1OTFMtMSQKLQkJcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dChEZWJ1Z09wdGlvbnMuTElTVEVORVJfU1lNQk9MSUNOQU1FLCBnZXROYW1lKCkpOwotCQlsaXN0ZW5lciA9IG5ldyBUZXN0RGVidWdPcHRpb25zTGlzdGVuZXIoKTsKLQkJcmVnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoRGVidWdPcHRpb25zTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpLCBsaXN0ZW5lciwgcHJvcHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1Z09wdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZGVidWdPcHRpb25zLnNldERlYnVnRW5hYmxlZChmYWxzZSk7Ci0JCWRlYnVnT3B0aW9ucyA9IG51bGw7Ci0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkudW5nZXRTZXJ2aWNlKHJlZik7Ci0JCWlmIChyZWcgIT0gbnVsbCkKLQkJCXJlZy51bnJlZ2lzdGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlZ2lzdHJhdGlvbjAxKCkgewotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBkaWQgbm90IGdldCBjYWxsZWQiLCBsaXN0ZW5lci5nb3RDYWxsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHRoYXQgYSBuZXcge0BsaW5rIEZyYW1ld29ya0RlYnVnVHJhY2VFbnRyeX0gb2JqZWN0IGNyZWF0ZWQgd2l0aG91dCBhIHRyYWNlIGNsYXNzCi0JICogaGFzICdvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmRlYnVnb3B0aW9ucy5EZWJ1Z09wdGlvbnNUZXN0Q2FzZScgYXMgdGhlIGNsYXNzIG5hbWUgYW5kCi0JICogJ3Rlc3RUcmFjaW5nRW50cnkwMScgYXMgdGhlIG1ldGhvZCBuYW1lIHRoYXQgaXQgZGV0ZXJtaW5lZCBhcyB0aGUgY2FsbGVyIG9mIGl0LgotCSAqIAotCSAqIFRoaXMgdGVzdCBtaW1pY3MgdGhlIHRyYWNpbmcgZnJhbWV3b3JrIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGNsYXNzIG5hbWUgYW5kIG1ldGhvZCBuYW1lCi0JICogYXJlIHJldHVybmVkIGFuZCB3cml0dGVuIHRvIHRoZSB0cmFjZSBmaWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RUcmFjaW5nRW50cnkwMSgpIHsKLQotCQlTdHJpbmcgYnVuZGxlTmFtZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCVN0cmluZyBvcHRpb25QYXRoID0gIi9kZWJ1ZyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGVzdCBtZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCQlGcmFtZXdvcmtEZWJ1Z1RyYWNlRW50cnkgdHJhY2VFbnRyeSA9IG5ldyBGcmFtZXdvcmtEZWJ1Z1RyYWNlRW50cnkoYnVuZGxlTmFtZSwgb3B0aW9uUGF0aCwgbWVzc2FnZSwgbnVsbCk7Ci0JCVN0cmluZyBjb3JyZWN0Q2xhc3NOYW1lID0gIm9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuZGVidWdvcHRpb25zLkRlYnVnT3B0aW9uc1Rlc3RDYXNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29ycmVjdE1ldGhvZE5hbWUgPSAidGVzdFRyYWNpbmdFbnRyeTAxIjsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZSBjbGFzcyBjYWxsaW5nIHRoZSB0cmFjZSBBUEkgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlLiIsIGNvcnJlY3RDbGFzc05hbWUsIHRyYWNlRW50cnkuZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkICAKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbWV0aG9kIGNhbGxpbmcgdGhlIHRyYWNlIEFQSSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUuIiwgY29ycmVjdE1ldGhvZE5hbWUsIHRyYWNlRW50cnkuZ2V0TWV0aG9kTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhhdCBhIG5ldyB7QGxpbmsgRnJhbWV3b3JrRGVidWdUcmFjZUVudHJ5fSBvYmplY3QgY3JlYXRlZCB3aXRoIGEgdHJhY2UgY2xhc3MKLQkgKiBvZiAnb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5kZWJ1Z29wdGlvbnMuRGVidWdPcHRpb25zVGVzdENhc2UnIGhhcyB0aGUgY29ycmVjdCBjbGFzcyBuYW1lIGFuZAotCSAqIG1ldGhvZCBuYW1lIG9mIHRoZSBjYWxsZXIuCi0JICogCi0JICogVGhpcyB0ZXN0IG1pbWljcyB0aGUgdHJhY2luZyBmcmFtZXdvcmsgdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgY2xhc3MgbmFtZSBhbmQgbWV0aG9kIG5hbWUKLQkgKiBhcmUgcmV0dXJuZWQgYW5kIHdyaXR0ZW4gdG8gdGhlIHRyYWNlIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRyYWNpbmdFbnRyeTAyKCkgewotCi0JCVN0cmluZyBjb3JyZWN0Q2xhc3NOYW1lID0gUnVubmVyMS5jbGFzcy5nZXROYW1lKCk7Ci0JCVN0cmluZyBjb3JyZWN0TWV0aG9kTmFtZSA9ICJydW4iOyAvLyROT04tTkxTLTEkCi0JCUZyYW1ld29ya0RlYnVnVHJhY2VFbnRyeSB0cmFjZUVudHJ5ID0gbmV3IFJ1bm5lcjEoKS5ydW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgY2xhc3MgY2FsbGluZyB0aGUgdHJhY2UgQVBJIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCB2YWx1ZS4iLCBjb3JyZWN0Q2xhc3NOYW1lLCB0cmFjZUVudHJ5LmdldENsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAgCi0JCWFzc2VydEVxdWFscygiVGhlIG1ldGhvZCBjYWxsaW5nIHRoZSB0cmFjZSBBUEkgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlLiIsIGNvcnJlY3RNZXRob2ROYW1lLCB0cmFjZUVudHJ5LmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUnVubmVyMSB7Ci0JCXB1YmxpYyBGcmFtZXdvcmtEZWJ1Z1RyYWNlRW50cnkgcnVuKCkgewotCQkJcmV0dXJuIG5ldyBSdW5uZXIyKCkucnVuKCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUnVubmVyMiB7Ci0JCXB1YmxpYyBGcmFtZXdvcmtEZWJ1Z1RyYWNlRW50cnkgcnVuKCkgewotCQkJU3RyaW5nIGJ1bmRsZU5hbWUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQkJU3RyaW5nIG9wdGlvblBhdGggPSAiL2RlYnVnIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGVzdCBtZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHRyYWNpbmdDbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gbmV3IEZyYW1ld29ya0RlYnVnVHJhY2VFbnRyeShidW5kbGVOYW1lLCBvcHRpb25QYXRoLCBtZXNzYWdlLCB0cmFjaW5nQ2xhc3MpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdER5YW5taWNFbmFibGVtZW50MDEoKSB7Ci0JCWlmIChkZWJ1Z09wdGlvbnMuaXNEZWJ1Z0VuYWJsZWQoKSkKLQkJCXJldHVybjsgLy8gY2Fubm90IHRlc3QKLQkJZGVidWdPcHRpb25zLnNldERlYnVnRW5hYmxlZCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiRGVidWcgaXMgbm90IGVuYWJsZWQiLCBkZWJ1Z09wdGlvbnMuaXNEZWJ1Z0VuYWJsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQkJTWFwIGNoZWNrVmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJY2hlY2tWYWx1ZXMucHV0KGdldE5hbWUoKSArICIvZGVidWciLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbGlzdGVuZXIuc2V0Q2hlY2tWYWx1ZXMoY2hlY2tWYWx1ZXMpOwotCQlkZWJ1Z09wdGlvbnMuc2V0T3B0aW9uKGdldE5hbWUoKSArICIvZGVidWciLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgZGlkIG5vdCBnZXQgY2FsbGVkIiwgbGlzdGVuZXIuZ290Q2FsbGVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoIkZvdW5kIGJhZCB2YWx1ZTogIiArIGxpc3RlbmVyLmdldEluY29ycmVjdFZhbHVlKCksIGxpc3RlbmVyLmdldEluY29ycmVjdFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdER5YW5taWNFbmFibGVtZW50MDIoKSB7Ci0JCWlmIChkZWJ1Z09wdGlvbnMuaXNEZWJ1Z0VuYWJsZWQoKSkKLQkJCXJldHVybjsgLy8gY2Fubm90IHRlc3QKLQkJZGVidWdPcHRpb25zLnNldERlYnVnRW5hYmxlZCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiRGVidWcgaXMgbm90IGVuYWJsZWQiLCBkZWJ1Z09wdGlvbnMuaXNEZWJ1Z0VuYWJsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQkJTWFwIGNoZWNrVmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJY2hlY2tWYWx1ZXMucHV0KGdldE5hbWUoKSArICIvZGVidWciLCAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWxpc3RlbmVyLnNldENoZWNrVmFsdWVzKGNoZWNrVmFsdWVzKTsKLQkJZGVidWdPcHRpb25zLnNldE9wdGlvbihnZXROYW1lKCkgKyAiL2RlYnVnIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIkxpc3RlbmVyIGRpZCBub3QgZ2V0IGNhbGxlZCIsIGxpc3RlbmVyLmdvdENhbGxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJTaG91bGQgZmluZCBiYWQgdmFsdWU6ICIgKyBsaXN0ZW5lci5nZXRJbmNvcnJlY3RWYWx1ZSgpLCBsaXN0ZW5lci5nZXRJbmNvcnJlY3RWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REeWFubWljRW5hYmxlbWVudDAzKCkgewotCQlsaXN0ZW5lci5jbGVhcigpOwotCQlpZiAoZGVidWdPcHRpb25zLmlzRGVidWdFbmFibGVkKCkpCi0JCQlyZXR1cm47IC8vIGNhbm5vdCB0ZXN0Ci0JCVRlc3REZWJ1Z09wdGlvbnNMaXN0ZW5lciBhbm90aGVyTGlzdGVuZXIgPSBuZXcgVGVzdERlYnVnT3B0aW9uc0xpc3RlbmVyKCk7Ci0JCURpY3Rpb25hcnkgYW5vdGhlclByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlhbm90aGVyUHJvcHMucHV0KERlYnVnT3B0aW9ucy5MSVNURU5FUl9TWU1CT0xJQ05BTUUsICJhbm90aGVyTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIGFub3RoZXJSZWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShEZWJ1Z09wdGlvbnNMaXN0ZW5lci5jbGFzcy5nZXROYW1lKCksIGFub3RoZXJMaXN0ZW5lciwgYW5vdGhlclByb3BzKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGNhbGxlZCIsIGFub3RoZXJMaXN0ZW5lci5nb3RDYWxsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlkZWJ1Z09wdGlvbnMuc2V0RGVidWdFbmFibGVkKHRydWUpOwotCQlhc3NlcnRUcnVlKCJEZWJ1ZyBpcyBub3QgZW5hYmxlZCIsIGRlYnVnT3B0aW9ucy5pc0RlYnVnRW5hYmxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0JCWFub3RoZXJMaXN0ZW5lci5jbGVhcigpOwotCi0JCU1hcCBjaGVja1ZhbHVlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNoZWNrVmFsdWVzLnB1dChnZXROYW1lKCkgKyAiL2RlYnVnIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWxpc3RlbmVyLnNldENoZWNrVmFsdWVzKGNoZWNrVmFsdWVzKTsKLQkJZGVidWdPcHRpb25zLnNldE9wdGlvbihnZXROYW1lKCkgKyAiL2RlYnVnIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEZhbHNlKCJTaG91bGQgbm90IGNhbGwgd3JvbmcgbGlzdGVuZXIiLCBhbm90aGVyTGlzdGVuZXIuZ290Q2FsbGVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkxpc3RlbmVyIGRpZCBub3QgZ2V0IGNhbGxlZCIsIGxpc3RlbmVyLmdvdENhbGxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJGb3VuZCBiYWQgdmFsdWU6ICIgKyBsaXN0ZW5lci5nZXRJbmNvcnJlY3RWYWx1ZSgpLCBsaXN0ZW5lci5nZXRJbmNvcnJlY3RWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlsaXN0ZW5lci5jbGVhcigpOwotCQlhbm90aGVyTGlzdGVuZXIuY2xlYXIoKTsKLQkJZGVidWdPcHRpb25zLnNldE9wdGlvbigiYW5vdGhlckxpc3RlbmVyL3Rlc3QiLCAiYmxhaCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RmFsc2UoIkxpc3RlbmVyIHNob3VsZCBub3QgaGF2ZSBiZWVuIGNhbGxlZCIsIGxpc3RlbmVyLmdvdENhbGxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBbm90aGVyIGxpc3RlbmVyIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIiwgYW5vdGhlckxpc3RlbmVyLmdvdENhbGxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0JCWFub3RoZXJMaXN0ZW5lci5jbGVhcigpOwotCQlhbm90aGVyUHJvcHMucHV0KERlYnVnT3B0aW9ucy5MSVNURU5FUl9TWU1CT0xJQ05BTUUsIGdldE5hbWUoKSk7Ci0JCWFub3RoZXJSZWcuc2V0UHJvcGVydGllcyhhbm90aGVyUHJvcHMpOwotCQlkZWJ1Z09wdGlvbnMuc2V0T3B0aW9uKGdldE5hbWUoKSArICIvZGVidWciLCAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIkxpc3RlbmVyIGRpZCBub3QgZ2V0IGNhbGxlZCIsIGxpc3RlbmVyLmdvdENhbGxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBbm90aGVyIGxpc3RlbmVyIGRpZCBub3QgZ2V0IGNhbGxlZCIsIGFub3RoZXJMaXN0ZW5lci5nb3RDYWxsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhbm90aGVyUmVnLnVucmVnaXN0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RHlhbm1pY0VuYWJsZW1lbnQwNCgpIHsKLQkJaWYgKGRlYnVnT3B0aW9ucy5pc0RlYnVnRW5hYmxlZCgpKQotCQkJcmV0dXJuOyAvLyBjYW5ub3QgdGVzdAotCQlkZWJ1Z09wdGlvbnMuc2V0RGVidWdFbmFibGVkKHRydWUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCQlhc3NlcnRUcnVlKCJEZWJ1ZyBpcyBub3QgZW5hYmxlZCIsIGRlYnVnT3B0aW9ucy5pc0RlYnVnRW5hYmxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlNYXAgY2hlY2tWYWx1ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQljaGVja1ZhbHVlcy5wdXQoZ2V0TmFtZSgpICsgIi9kZWJ1ZyIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlsaXN0ZW5lci5zZXRDaGVja1ZhbHVlcyhjaGVja1ZhbHVlcyk7Ci0JCWRlYnVnT3B0aW9ucy5zZXRPcHRpb24oZ2V0TmFtZSgpICsgIi9kZWJ1ZyIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBkaWQgbm90IGdldCBjYWxsZWQiLCBsaXN0ZW5lci5nb3RDYWxsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiRm91bmQgYmFkIHZhbHVlOiAiICsgbGlzdGVuZXIuZ2V0SW5jb3JyZWN0VmFsdWUoKSwgbGlzdGVuZXIuZ2V0SW5jb3JyZWN0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlsaXN0ZW5lci5jbGVhcigpOwotCQljaGVja1ZhbHVlcy5wdXQoZ2V0TmFtZSgpICsgIi9kZWJ1ZyIsIG51bGwpOyAvLyROT04tTkxTLTEkIAotCQlsaXN0ZW5lci5zZXRDaGVja1ZhbHVlcyhjaGVja1ZhbHVlcyk7Ci0JCWRlYnVnT3B0aW9ucy5zZXREZWJ1Z0VuYWJsZWQoZmFsc2UpOwotCQlhc3NlcnRGYWxzZSgiRGVidWcgaXMgZW5hYmxlZCIsIGRlYnVnT3B0aW9ucy5pc0RlYnVnRW5hYmxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBkaWQgbm90IGdldCBjYWxsZWQiLCBsaXN0ZW5lci5nb3RDYWxsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiRm91bmQgYmFkIHZhbHVlOiAiICsgbGlzdGVuZXIuZ2V0SW5jb3JyZWN0VmFsdWUoKSwgbGlzdGVuZXIuZ2V0SW5jb3JyZWN0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlsaXN0ZW5lci5jbGVhcigpOwotCQljaGVja1ZhbHVlcy5wdXQoZ2V0TmFtZSgpICsgIi9kZWJ1ZyIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlsaXN0ZW5lci5zZXRDaGVja1ZhbHVlcyhjaGVja1ZhbHVlcyk7Ci0JCWRlYnVnT3B0aW9ucy5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7Ci0JCWFzc2VydFRydWUoIkRlYnVnIGlzIG5vdCBlbmFibGVkIiwgZGVidWdPcHRpb25zLmlzRGVidWdFbmFibGVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkxpc3RlbmVyIGRpZCBub3QgZ2V0IGNhbGxlZCIsIGxpc3RlbmVyLmdvdENhbGxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJGb3VuZCBiYWQgdmFsdWU6ICIgKyBsaXN0ZW5lci5nZXRJbmNvcnJlY3RWYWx1ZSgpLCBsaXN0ZW5lci5nZXRJbmNvcnJlY3RWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhdGNoU2V0T3B0aW9uc1doZW5FbmFibGVkKCkgewotCi0JCWlmICghZGVidWdPcHRpb25zLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCWRlYnVnT3B0aW9ucy5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJU3RyaW5nIGtleTEgPSBnZXROYW1lKCkgKyAiL2RlYnVnL2Rpc2FibGVDaGVjazEiOwotCQlTdHJpbmcga2V5MiA9IGdldE5hbWUoKSArICIvZGVidWcvZGlzYWJsZUNoZWNrMiI7Ci0JCVN0cmluZyBrZXkzID0gZ2V0TmFtZSgpICsgIi9kZWJ1Zy9kaXNhYmxlQ2hlY2szIjsKLQkJTWFwIC8qIDxTdHJpbmcsIFN0cmluZz4gKi9uZXdPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJbmV3T3B0aW9ucy5wdXQoa2V5MSwgIm9rMSIpOwotCQluZXdPcHRpb25zLnB1dChrZXkyLCAib2syIik7Ci0JCW5ld09wdGlvbnMucHV0KGtleTMsICJvazMiKTsKLQkJLy8gY3JlYXRlIHRoZSBuZXcgc2V0IG9mIG9wdGlvbnMKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQkJLy8gY3JlYXRlIHRoZSBuZXcgc2V0IG9mIG9wdGlvbnMKLQkJZGVidWdPcHRpb25zLnNldE9wdGlvbnMobmV3T3B0aW9ucyk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgbGlzdGVuZXIgZ290IGNhbGxlZAotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBkaWQgbm90IGdldCBjYWxsZWQgd2hlbiBzZXR0aW5nIGJhdGNoIG9wdGlvbnMgd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQiLCBsaXN0ZW5lci5nb3RDYWxsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZ2V0IGFsbCBvZiB0aGUgb3B0aW9ucwotCQlNYXAvKiA8U3RyaW5nLCBTdHJpbmc+ICovY3VycmVudE9wdGlvbnMgPSBkZWJ1Z09wdGlvbnMuZ2V0T3B0aW9ucygpOwotCQkvLyBtYWtlIHN1cmUgdGhlIE1hcCBvYmplY3QgcmV0dXJuZWQgaXMgbm90IHRoZSBzYW1lIE1hcCBvYmplY3QgdGhhdCB3YXMgc2V0Ci0JCWFzc2VydE5vdFNhbWUoIlRoZSBNYXAgb2JqZWN0IHNldCBpcyB0aGUgZXhhY3Qgc2FtZSBNYXAgb2JqZWN0IHJldHVybmVkIiwgbmV3T3B0aW9ucywgY3VycmVudE9wdGlvbnMpOwotCQkvLyBtYWtlIHN1cmUgdGhlIHNpemUgaXMgY29ycmVjdCAoaXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBNYXApCi0JCWFzc2VydEVxdWFscygiVGhlIGFtb3VudCBvZiBvcHRpb25zIHJldHJpZXZlZCBpcyBub3QgY29ycmVjdCIsIG5ld09wdGlvbnMuc2l6ZSgpLCBjdXJyZW50T3B0aW9ucy5zaXplKCkpOwotCQkvLyBtYWtlIHN1cmUgdGhlIHZhbHVlcyBhcmUgY29ycmVjdAotCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSAoU3RyaW5nKSBjdXJyZW50T3B0aW9ucy5nZXQoa2V5MSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIG9yaWdpbmFsIG9wdGlvbiBmb3Iga2V5MSBkb2VzIG5vdCBtYXRjaCB0aGUgcmV0cmlldmVkIG9wdGlvbiB3aGVuIHRyYWNpbmcgaXMgZW5hYmxlZCIsICJvazEiLCBhY3R1YWxWYWx1ZSk7Ci0JCWFjdHVhbFZhbHVlID0gKFN0cmluZykgY3VycmVudE9wdGlvbnMuZ2V0KGtleTIpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBvcmlnaW5hbCBvcHRpb24gZm9yIGtleTEgZG9lcyBub3QgbWF0Y2ggdGhlIHJldHJpZXZlZCBvcHRpb24gd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQiLCAib2syIiwgYWN0dWFsVmFsdWUpOwotCQlhY3R1YWxWYWx1ZSA9IChTdHJpbmcpIGN1cnJlbnRPcHRpb25zLmdldChrZXkzKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgb3JpZ2luYWwgb3B0aW9uIGZvciBrZXkxIGRvZXMgbm90IG1hdGNoIHRoZSByZXRyaWV2ZWQgb3B0aW9uIHdoZW4gdHJhY2luZyBpcyBlbmFibGVkIiwgIm9rMyIsIGFjdHVhbFZhbHVlKTsKLQkJLy8gYWRkIGEgbmV3IGJhdGNoIG9mIG9wdGlvbnMKLQkJU3RyaW5nIGtleTQgPSBnZXROYW1lKCkgKyAiL2RlYnVnL2Rpc2FibGVDaGVjazQiOwotCQlTdHJpbmcga2V5NSA9IGdldE5hbWUoKSArICIvZGVidWcvZGlzYWJsZUNoZWNrNSI7Ci0JCVN0cmluZyBrZXk2ID0gZ2V0TmFtZSgpICsgIi9kZWJ1Zy9kaXNhYmxlQ2hlY2s2IjsKLQkJTWFwIC8qIDxTdHJpbmcsIFN0cmluZz4gKi9uZXdPcHRpb25zMiA9IG5ldyBIYXNoTWFwKCk7Ci0JCW5ld09wdGlvbnMyLnB1dChrZXk0LCAib2s0Iik7Ci0JCW5ld09wdGlvbnMyLnB1dChrZXk1LCAib2s1Iik7Ci0JCW5ld09wdGlvbnMyLnB1dChrZXk2LCAib2s2Iik7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0JCS8vIGNyZWF0ZSB0aGUgbmV3IHNldCBvZiBvcHRpb25zCi0JCWRlYnVnT3B0aW9ucy5zZXRPcHRpb25zKG5ld09wdGlvbnMyKTsKLQkJLy8gbWFrZSBzdXJlIHRoZSBsaXN0ZW5lciBnb3QgY2FsbGVkCi0JCWFzc2VydFRydWUoIkxpc3RlbmVyIGRpZCBub3QgZ2V0IGNhbGxlZCB3aGVuIHNldHRpbmcgYmF0Y2ggb3B0aW9ucyB3aGVuIHRyYWNpbmcgaXMgZW5hYmxlZCIsIGxpc3RlbmVyLmdvdENhbGxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBtYWtlIHN1cmUgdGhlIE1hcCBvYmplY3QgcmV0dXJuZWQgaXMgbm90IHRoZSBzYW1lIE1hcCBvYmplY3QgdGhhdCB3YXMgc2V0Ci0JCU1hcCBjdXJyZW50T3B0aW9uczIgPSBkZWJ1Z09wdGlvbnMuZ2V0T3B0aW9ucygpOwotCQlhc3NlcnROb3RTYW1lKCJUaGUgTWFwIG9iamVjdCBzZXQgaXMgdGhlIGV4YWN0IHNhbWUgTWFwIG9iamVjdCByZXR1cm5lZCIsIG5ld09wdGlvbnMsIGN1cnJlbnRPcHRpb25zMik7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgc2l6ZSBpcyBjb3JyZWN0IChpdCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIE1hcCkKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgYW1vdW50IG9mIG9wdGlvbnMgcmV0cmlldmVkIGlzIG5vdCBjb3JyZWN0IiwgbmV3T3B0aW9ucy5zaXplKCksIGN1cnJlbnRPcHRpb25zMi5zaXplKCkpOwotCQkvLyBtYWtlIHN1cmUgdGhlIG9sZCB2YWx1ZXMgZG8gbm90IGV4aXN0Ci0JCWFjdHVhbFZhbHVlID0gKFN0cmluZykgY3VycmVudE9wdGlvbnMyLmdldChrZXkxKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIG9yaWdpbmFsIG9wdGlvbiBmb3Iga2V5MSBpcyBpbiB0aGUgcmV0dXJuZWQgb3B0aW9ucyAoaXQgc2hvdWxkIG5vdCBiZSB0aGVyZSkiLCBhY3R1YWxWYWx1ZSk7Ci0JCWFjdHVhbFZhbHVlID0gKFN0cmluZykgY3VycmVudE9wdGlvbnMyLmdldChrZXkyKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIG9yaWdpbmFsIG9wdGlvbiBmb3Iga2V5MiBpcyBpbiB0aGUgcmV0dXJuZWQgb3B0aW9ucyAoaXQgc2hvdWxkIG5vdCBiZSB0aGVyZSkiLCBhY3R1YWxWYWx1ZSk7Ci0JCWFjdHVhbFZhbHVlID0gKFN0cmluZykgY3VycmVudE9wdGlvbnMyLmdldChrZXkzKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIG9yaWdpbmFsIG9wdGlvbiBmb3Iga2V5MyBpcyBpbiB0aGUgcmV0dXJuZWQgb3B0aW9ucyAoaXQgc2hvdWxkIG5vdCBiZSB0aGVyZSkiLCBhY3R1YWxWYWx1ZSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgbmV3IHZhbHVlcyBhcmUgY29ycmVjdAotCQlhY3R1YWxWYWx1ZSA9IChTdHJpbmcpIGN1cnJlbnRPcHRpb25zMi5nZXQoa2V5NCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5ldyBvcHRpb24gZm9yIGtleTQgZG9lcyBub3QgbWF0Y2ggdGhlIHJldHJpZXZlZCBvcHRpb24gd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQiLCAib2s0IiwgYWN0dWFsVmFsdWUpOwotCQlhY3R1YWxWYWx1ZSA9IChTdHJpbmcpIGN1cnJlbnRPcHRpb25zMi5nZXQoa2V5NSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5ldyBvcHRpb24gZm9yIGtleTUgZG9lcyBub3QgbWF0Y2ggdGhlIHJldHJpZXZlZCBvcHRpb24gd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQiLCAib2s1IiwgYWN0dWFsVmFsdWUpOwotCQlhY3R1YWxWYWx1ZSA9IChTdHJpbmcpIGN1cnJlbnRPcHRpb25zMi5nZXQoa2V5Nik7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5ldyBvcHRpb24gZm9yIGtleTYgZG9lcyBub3QgbWF0Y2ggdGhlIHJldHJpZXZlZCBvcHRpb24gd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQiLCAib2s2IiwgYWN0dWFsVmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsT3B0aW9ucygpIHsKLQotCQkvLyBtYWtlIHN1cmUgc2V0T3B0aW9ucygpIGRvZXNuJ3QgbGlrZSBhbiBlbXB0eSBNYXAKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWRlYnVnT3B0aW9ucy5zZXRPcHRpb25zKG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQW4gZXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIHdoZW4gY2FsbGluZyBzZXRPcHRpb25zKCkgd2l0aCBhIG51bGwgcGFyYW1ldGVyIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJLy8gbWFrZSBzdXJlIHNldE9wdGlvbihrZXksdmFsdWUpIGRvZXNuJ3QgbGlrZSBhIG51bGwga2V5IG9yIHZhbHVlCi0JCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJZGVidWdPcHRpb25zLnNldE9wdGlvbigia2V5IiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJBbiBleGNlcHRpb24gd2FzIG5vdCB0aHJvd24gd2hlbiBjYWxsaW5nIHNldE9wdGlvbigpIHdpdGggYSBudWxsIHZhbHVlIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z09wdGlvbnMuc2V0T3B0aW9uKG51bGwsICJ2YWx1ZSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQW4gZXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIHdoZW4gY2FsbGluZyBzZXRPcHRpb24oKSB3aXRoIGEgbnVsbCBrZXkiLCBleGNlcHRpb25UaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYXRjaFNldE9wdGlvbnNXaGVuRGlzYWJsZWQoKSB7Ci0KLQkJLy8gZW5hYmxlIHRyYWNpbmcgaW5pdGlhbGx5LgotCQlpZiAoIWRlYnVnT3B0aW9ucy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQlkZWJ1Z09wdGlvbnMuc2V0RGVidWdFbmFibGVkKHRydWUpOwotCQl9Ci0KLQkJU3RyaW5nIGtleTEgPSBnZXROYW1lKCkgKyAiL2RlYnVnL2Rpc2FibGVDaGVjazEiOwotCQlTdHJpbmcga2V5MiA9IGdldE5hbWUoKSArICIvZGVidWcvZGlzYWJsZUNoZWNrMiI7Ci0JCVN0cmluZyBrZXkzID0gZ2V0TmFtZSgpICsgIi9kZWJ1Zy9kaXNhYmxlQ2hlY2szIjsKLQkJTWFwIC8qIDxTdHJpbmcsIFN0cmluZz4gKi9uZXdPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJbmV3T3B0aW9ucy5wdXQoa2V5MSwgIm9rMSIpOwotCQluZXdPcHRpb25zLnB1dChrZXkyLCAib2syIik7Ci0JCW5ld09wdGlvbnMucHV0KGtleTMsICJvazMiKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQkJLy8gY3JlYXRlIHRoZSBuZXcgc2V0IG9mIG9wdGlvbnMKLQkJZGVidWdPcHRpb25zLnNldE9wdGlvbnMobmV3T3B0aW9ucyk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgbGlzdGVuZXIgZ290IGNhbGxlZAotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBkaWQgbm90IGdldCBjYWxsZWQgd2hlbiBzZXR0aW5nIGJhdGNoIG9wdGlvbnMgd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQiLCBsaXN0ZW5lci5nb3RDYWxsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZGlzYWJsZSB0cmFjaW5nCi0JCWRlYnVnT3B0aW9ucy5zZXREZWJ1Z0VuYWJsZWQoZmFsc2UpOwotCQkvLyBnZXQgYWxsIG9mIHRoZSBvcHRpb25zIChzaG91bGQgYmUgdGhlIGRpc2FibGVkIG9wdGlvbiBzZXQgLSB3aGljaCBzaG91bGQgY29udGFpbiBvbmx5IHRoZSByZWNlbnRseSBzZXQgb3B0aW9ucykKLQkJTWFwIGN1cnJlbnRPcHRpb25zID0gZGVidWdPcHRpb25zLmdldE9wdGlvbnMoKTsKLQkJLy8gbWFrZSBzdXJlIHRoZSBNYXAgcmV0dXJuZWQgaXMgbm90IHRoZSBzYW1lIE1hcCBvYmplY3QgdGhhdCB3YXMgc2V0Ci0JCWFzc2VydE5vdFNhbWUoIlRoZSBNYXAgb2JqZWN0IHJldHJpZXZlZCBpcyB0aGUgZXhhY3Qgc2FtZSBNYXAgb2JqZWN0IHJldHVybmVkIHdoZW4gdHJhY2luZyBpcyBkaXNhYmxlZC4iLCBuZXdPcHRpb25zLCBjdXJyZW50T3B0aW9ucyk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgc2l6ZSBpcyBjb3JyZWN0IChpdCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIE1hcCkKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgYW1vdW50IG9mIG9wdGlvbnMgcmV0cmlldmVkIGlzIG5vdCB0aGUgc2FtZSBhZnRlciB0cmFjaW5nIGlzIGRpc2FibGVkIiwgbmV3T3B0aW9ucy5zaXplKCksIGN1cnJlbnRPcHRpb25zLnNpemUoKSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIGFyZSBjb3JyZWN0IC0gY2hlY2sga2V5MQotCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSAoU3RyaW5nKSBjdXJyZW50T3B0aW9ucy5nZXQoa2V5MSk7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSB2YWx1ZSBmb3Iga2V5MSBpcyBudWxsIiwgYWN0dWFsVmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBvcmlnaW5hbCBvcHRpb24gZm9yIGtleTEgZG9lcyBub3QgbWF0Y2ggdGhlIHJldHJpZXZlZCBvcHRpb24gd2hlbiB0cmFjaW5nIGlzIGRpc2FibGVkIiwgIm9rMSIsIGFjdHVhbFZhbHVlKTsKLQkJLy8gY2hlY2sga2V5MgotCQlhY3R1YWxWYWx1ZSA9IChTdHJpbmcpIGN1cnJlbnRPcHRpb25zLmdldChrZXkyKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHZhbHVlIGZvciBrZXkyIGlzIG51bGwiLCBhY3R1YWxWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIG9yaWdpbmFsIG9wdGlvbiBmb3Iga2V5MiBkb2VzIG5vdCBtYXRjaCB0aGUgcmV0cmlldmVkIG9wdGlvbiB3aGVuIHRyYWNpbmcgaXMgZGlzYWJsZWQiLCAib2syIiwgYWN0dWFsVmFsdWUpOwotCQkvLyBjaGVjayBrZXkzCi0JCWFjdHVhbFZhbHVlID0gKFN0cmluZykgY3VycmVudE9wdGlvbnMuZ2V0KGtleTMpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgdmFsdWUgZm9yIGtleTMgaXMgbnVsbCIsIGFjdHVhbFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgb3JpZ2luYWwgb3B0aW9uIGZvciBrZXkzIGRvZXMgbm90IG1hdGNoIHRoZSByZXRyaWV2ZWQgb3B0aW9uIHdoZW4gdHJhY2luZyBpcyBkaXNhYmxlZCIsICJvazMiLCBhY3R1YWxWYWx1ZSk7Ci0JCS8vIGFkZCBhIG5ldyBiYXRjaCBvZiBvcHRpb25zIHdoZW4gdHJhY2luZyBpcyBkaXNhYmxlZAotCQlTdHJpbmcga2V5NCA9IGdldE5hbWUoKSArICIvZGVidWcvZGlzYWJsZUNoZWNrNCI7Ci0JCVN0cmluZyBrZXk1ID0gZ2V0TmFtZSgpICsgIi9kZWJ1Zy9kaXNhYmxlQ2hlY2s1IjsKLQkJU3RyaW5nIGtleTYgPSBnZXROYW1lKCkgKyAiL2RlYnVnL2Rpc2FibGVDaGVjazYiOwotCQlNYXAgLyogPFN0cmluZywgU3RyaW5nPiAqL25ld09wdGlvbnMyID0gbmV3IEhhc2hNYXAoKTsKLQkJbmV3T3B0aW9uczIucHV0KGtleTQsICJvazQiKTsKLQkJbmV3T3B0aW9uczIucHV0KGtleTUsICJvazUiKTsKLQkJbmV3T3B0aW9uczIucHV0KGtleTYsICJvazYiKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQkJLy8gY3JlYXRlIHRoZSBuZXcgc2V0IG9mIG9wdGlvbnMKLQkJZGVidWdPcHRpb25zLnNldE9wdGlvbnMobmV3T3B0aW9uczIpOwotCQkvLyBtYWtlIHN1cmUgdGhlIGxpc3RlbmVyIGRpZCBub3QgZ2V0IGNhbGxlZAotCQlhc3NlcnRGYWxzZSgiTGlzdGVuZXIgZ290IGNhbGxlZCB3aGVuIHNldHRpbmdzIGJhdGNoIG9wdGlvbnMgd2l0aCB0cmFjaW5nIGRpc2FibGVkIiwgbGlzdGVuZXIuZ290Q2FsbGVkKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIG1ha2Ugc3VyZSB0aGUgTWFwIG9iamVjdCByZXR1cm5lZCBpcyBub3QgdGhlIHNhbWUgTWFwIG9iamVjdCB0aGF0IHdhcyBzZXQKLQkJTWFwIGN1cnJlbnRPcHRpb25zMiA9IGRlYnVnT3B0aW9ucy5nZXRPcHRpb25zKCk7Ci0JCWFzc2VydE5vdFNhbWUoIlRoZSBNYXAgb2JqZWN0IHNldCBpcyB0aGUgZXhhY3Qgc2FtZSBNYXAgb2JqZWN0IHJldHVybmVkIiwgbmV3T3B0aW9ucywgY3VycmVudE9wdGlvbnMyKTsKLQkJLy8gbWFrZSBzdXJlIHRoZSBzaXplIGlzIGNvcnJlY3QgKGl0IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwgTWFwKQotCQlhc3NlcnRFcXVhbHMoIlRoZSBhbW91bnQgb2Ygb3B0aW9ucyByZXRyaWV2ZWQgaXMgbm90IGNvcnJlY3QiLCBuZXdPcHRpb25zLnNpemUoKSwgY3VycmVudE9wdGlvbnMyLnNpemUoKSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgb2xkIHZhbHVlcyBkbyBub3QgZXhpc3QKLQkJYWN0dWFsVmFsdWUgPSAoU3RyaW5nKSBjdXJyZW50T3B0aW9uczIuZ2V0KGtleTEpOwotCQlhc3NlcnROdWxsKCJUaGUgb3JpZ2luYWwgb3B0aW9uIGZvciBrZXkxIGlzIGluIHRoZSByZXR1cm5lZCBvcHRpb25zIChpdCBzaG91bGQgbm90IGJlIHRoZXJlKSIsIGFjdHVhbFZhbHVlKTsKLQkJYWN0dWFsVmFsdWUgPSAoU3RyaW5nKSBjdXJyZW50T3B0aW9uczIuZ2V0KGtleTIpOwotCQlhc3NlcnROdWxsKCJUaGUgb3JpZ2luYWwgb3B0aW9uIGZvciBrZXkyIGlzIGluIHRoZSByZXR1cm5lZCBvcHRpb25zIChpdCBzaG91bGQgbm90IGJlIHRoZXJlKSIsIGFjdHVhbFZhbHVlKTsKLQkJYWN0dWFsVmFsdWUgPSAoU3RyaW5nKSBjdXJyZW50T3B0aW9uczIuZ2V0KGtleTMpOwotCQlhc3NlcnROdWxsKCJUaGUgb3JpZ2luYWwgb3B0aW9uIGZvciBrZXkzIGlzIGluIHRoZSByZXR1cm5lZCBvcHRpb25zIChpdCBzaG91bGQgbm90IGJlIHRoZXJlKSIsIGFjdHVhbFZhbHVlKTsKLQkJLy8gbWFrZSBzdXJlIHRoZSBuZXcgdmFsdWVzIGFyZSBjb3JyZWN0Ci0JCWFjdHVhbFZhbHVlID0gKFN0cmluZykgY3VycmVudE9wdGlvbnMyLmdldChrZXk0KTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IG9wdGlvbiBmb3Iga2V5NCBkb2VzIG5vdCBtYXRjaCB0aGUgcmV0cmlldmVkIG9wdGlvbiB3aGVuIHRyYWNpbmcgaXMgZGlzYWJsZWQiLCAib2s0IiwgYWN0dWFsVmFsdWUpOwotCQlhY3R1YWxWYWx1ZSA9IChTdHJpbmcpIGN1cnJlbnRPcHRpb25zMi5nZXQoa2V5NSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5ldyBvcHRpb24gZm9yIGtleTUgZG9lcyBub3QgbWF0Y2ggdGhlIHJldHJpZXZlZCBvcHRpb24gd2hlbiB0cmFjaW5nIGlzIGRpc2FibGVkIiwgIm9rNSIsIGFjdHVhbFZhbHVlKTsKLQkJYWN0dWFsVmFsdWUgPSAoU3RyaW5nKSBjdXJyZW50T3B0aW9uczIuZ2V0KGtleTYpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBuZXcgb3B0aW9uIGZvciBrZXk2IGRvZXMgbm90IG1hdGNoIHRoZSByZXRyaWV2ZWQgb3B0aW9uIHdoZW4gdHJhY2luZyBpcyBkaXNhYmxlZCIsICJvazYiLCBhY3R1YWxWYWx1ZSk7Ci0JCS8vIHRlc3Rpbmcgb2Ygb3B0aW9ucyB3aGVuIHRyYWNpbmcgaXMgcmUtZW5hYmxlZCBpcyBkb25lIGluIHRlc3RTZXRPcHRpb25zV2hlbkRpc2FibGVkIHNvIGl0IGlzIG5vdCBuZWVkZWQgaGVyZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25zV2hlbkRpc2FibGVkKCkgewotCi0JCS8vIGVuYWJsZSB0cmFjaW5nIGluaXRpYWxseS4KLQkJaWYgKCFkZWJ1Z09wdGlvbnMuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJZGVidWdPcHRpb25zLnNldERlYnVnRW5hYmxlZCh0cnVlKTsKLQkJfQotCQkvLyBjcmVhdGUgYSBuZXcga2V5IHRvIGFkZC4KLQkJU3RyaW5nIHRlc3RLZXkgPSBnZXROYW1lKCkgKyAiL2RlYnVnL2Rpc2FibGVDaGVjayI7Ci0JCS8vIHNldCBpdHMgdmFsdWUgdG8gJ29rJwotCQlkZWJ1Z09wdGlvbnMuc2V0T3B0aW9uKHRlc3RLZXksICJvayIpOwotCQkvLyBtYWtlIHN1cmUgdGhlIHJpZ2h0IHZhbHVlIGlzIGFkZGVkCi0JCVN0cmluZyBhY3R1YWxWYWx1ZSA9IGRlYnVnT3B0aW9ucy5nZXRPcHRpb24odGVzdEtleSwgIm5vdCBvayIpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBjb3JyZWN0IG9wdGlvbiB2YWx1ZSB3YXMgbm90IHJldHVybmVkIGZyb20gdGhlIGRlYnVnIG9wdGlvbjogIiArIHRlc3RLZXksICJvayIsIGFjdHVhbFZhbHVlKTsKLQkJLy8gZGlzYWJsZSB0cmFjaW5nCi0JCWRlYnVnT3B0aW9ucy5zZXREZWJ1Z0VuYWJsZWQoZmFsc2UpOwotCQkvLyBjaGVjayBmb3IgdGhlIHZhbHVlCi0JCWFjdHVhbFZhbHVlID0gZGVidWdPcHRpb25zLmdldE9wdGlvbih0ZXN0S2V5LCAibm90IG9rIik7Ci0JCWFzc2VydEVxdWFscygiVGhlICdkZWZhdWx0JyB2YWx1ZSBzdXBwbGllZCB3YXMgbm90IHJldHVybmVkIHdoZW4gdHJhY2luZyBpcyBkaXNhYmxlZC4iLCAibm90IG9rIiwgYWN0dWFsVmFsdWUpOwotCQkvLyB0cnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gIm9rIiAodGhpcyBzaG91bGQgYmUgYSBuby1vcCBhbmQgcmV0dXJuIHRoZSAnZGVmYXVsdCcgdmFsdWUpCi0JCWRlYnVnT3B0aW9ucy5zZXRPcHRpb24odGVzdEtleSwgIm9rIik7Ci0JCWFjdHVhbFZhbHVlID0gZGVidWdPcHRpb25zLmdldE9wdGlvbih0ZXN0S2V5LCAibm90IG9rIik7Ci0JCWFzc2VydEVxdWFscygiVGhlICdkZWZhdWx0JyB2YWx1ZSBzdXBwbGllZCB3YXMgbm90IHJldHVybmVkIHdoZW4gdHJhY2luZyBpcyBkaXNhYmxlZC4iLCAibm90IG9rIiwgYWN0dWFsVmFsdWUpOwotCQkvLyByZW1vdmUgdGhlIG9wdGlvbiBhbmQgY2hlY2sgZm9yIHRoZSB2YWx1ZSAoaXQgc2hvdWxkIHN0aWxsIGV4aXN0IGFmdGVyIHJlLWVuYWJsaW5nIHRyYWNpbmcpCi0JCWRlYnVnT3B0aW9ucy5yZW1vdmVPcHRpb24odGVzdEtleSk7Ci0JCS8vIHJlLWVuYWJsZSB0cmFjaW5nCi0JCWRlYnVnT3B0aW9ucy5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7Ci0JCS8vIGNoZWNrIHRoYXQgdGhlIHZhbHVlIGlzIHN0aWxsIHRoZSBpbml0aWFsICJvayIKLQkJYWN0dWFsVmFsdWUgPSBkZWJ1Z09wdGlvbnMuZ2V0T3B0aW9uKHRlc3RLZXksICJub3Qgb2siKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdmFsdWUgYWZ0ZXIgcmUtZW5hYmxpbmcgdHJhY2luZyBpcyBpbnZhbGlkLiIsICJvayIsIGFjdHVhbFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nVmFsdWVzKCkgewotCi0JCWlmICghZGVidWdPcHRpb25zLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCWRlYnVnT3B0aW9ucy5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJLy8gY3JlYXRlIGEgbmV3IGtleSB0byBhZGQuCi0JCVN0cmluZyB0ZXN0S2V5ID0gZ2V0TmFtZSgpICsgIi9kZWJ1Zy9zdHJpbmdWYWx1ZSI7Ci0JCS8vIHNldCBpdHMgdmFsdWUgdG8gJ3Rlc3QnCi0JCWRlYnVnT3B0aW9ucy5zZXRPcHRpb24odGVzdEtleSwgInRlc3QiKTsKLQkJLy8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBjb3JyZWN0Ci0JCVN0cmluZyBhY3R1YWxWYWx1ZSA9IGRlYnVnT3B0aW9ucy5nZXRPcHRpb24odGVzdEtleSwgImRlZmF1bHQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgY29ycmVjdCBvcHRpb24gdmFsdWUgd2FzIG5vdCByZXR1cm5lZCBmcm9tIHRoZSBkZWJ1ZyBvcHRpb246ICIgKyB0ZXN0S2V5LCAidGVzdCIsIGFjdHVhbFZhbHVlKTsKLQkJLy8gcmVtb3ZlIHRoZSBvcHRpb24gYW5kIGNoZWNrIGZvciB0aGUgdmFsdWUgKGl0IHNob3VsZCBub3QgZXhpc3Qgc28gdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkKQotCQlkZWJ1Z09wdGlvbnMucmVtb3ZlT3B0aW9uKHRlc3RLZXkpOwotCQlhY3R1YWxWYWx1ZSA9IGRlYnVnT3B0aW9ucy5nZXRPcHRpb24odGVzdEtleSwgImRlZmF1bHQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgJ2RlZmF1bHQnIHZhbHVlIHN1cHBsaWVkIHdhcyBub3QgcmV0dXJuZWQgd2hlbiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBEZWJ1Z09wdGlvbnMuIiwgImRlZmF1bHQiLCBhY3R1YWxWYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJWYWx1ZXMoKSB7Ci0KLQkJaWYgKCFkZWJ1Z09wdGlvbnMuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJZGVidWdPcHRpb25zLnNldERlYnVnRW5hYmxlZCh0cnVlKTsKLQkJfQotCQkvLyBjcmVhdGUgYSBuZXcga2V5IHRvIGFkZC4KLQkJU3RyaW5nIHRlc3RLZXkgPSBnZXROYW1lKCkgKyAiL2RlYnVnL2ludFZhbHVlIjsKLQkJLy8gc2V0IGl0cyB2YWx1ZSB0byA0Mi4KLQkJZGVidWdPcHRpb25zLnNldE9wdGlvbih0ZXN0S2V5LCAiNDIiKTsKLQkJLy8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBjb3JyZWN0Ci0JCWludCBhY3R1YWxWYWx1ZSA9IGRlYnVnT3B0aW9ucy5nZXRJbnRlZ2VyT3B0aW9uKHRlc3RLZXksIDApOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBjb3JyZWN0IG9wdGlvbiB2YWx1ZSB3YXMgbm90IHJldHVybmVkIGZyb20gdGhlIGRlYnVnIG9wdGlvbjogIiArIHRlc3RLZXksIDQyLCBhY3R1YWxWYWx1ZSk7Ci0JCS8vIHNldCB0aGUgdmFsdWUgb2YgdGhpcyBrZXkgc28gdGhhdCBhIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB3aWxsIG9jY3VyCi0JCWRlYnVnT3B0aW9ucy5zZXRPcHRpb24odGVzdEtleSwgInRlc3QiKTsKLQkJYWN0dWFsVmFsdWUgPSBkZWJ1Z09wdGlvbnMuZ2V0SW50ZWdlck9wdGlvbih0ZXN0S2V5LCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgJ2RlZmF1bHQnIHZhbHVlIHN1cHBsaWVkIHdhcyBub3QgcmV0dXJuZWQgd2hlbiBhIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBvY2N1cnMuIiwgMCwgYWN0dWFsVmFsdWUpOwotCQkvLyByZW1vdmUgdGhlIG9wdGlvbiBhbmQgY2hlY2sgZm9yIHRoZSB2YWx1ZSAoaXQgc2hvdWxkIG5vdCBleGlzdCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQpCi0JCWRlYnVnT3B0aW9ucy5yZW1vdmVPcHRpb24odGVzdEtleSk7Ci0JCWFjdHVhbFZhbHVlID0gZGVidWdPcHRpb25zLmdldEludGVnZXJPcHRpb24odGVzdEtleSwgMCk7Ci0JCWFzc2VydEVxdWFscygiVGhlICdkZWZhdWx0JyB2YWx1ZSBzdXBwbGllZCB3YXMgbm90IHJldHVybmVkIHdoZW4gdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgRGVidWdPcHRpb25zLiIsIDAsIGFjdHVhbFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhblZhbHVlcygpIHsKLQkJaWYgKCFkZWJ1Z09wdGlvbnMuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJZGVidWdPcHRpb25zLnNldERlYnVnRW5hYmxlZCh0cnVlKTsKLQkJfQotCQlTdHJpbmcgdGVzdEtleSA9IGdldE5hbWUoKSArICIvZGVidWciOwotCQlib29sZWFuIHRlc3RWYWx1ZSA9IGRlYnVnT3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKHRlc3RLZXksIGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UodGVzdEtleSArICIgaXMgdHJ1ZSIsIHRlc3RWYWx1ZSk7Ci0JCWRlYnVnT3B0aW9ucy5zZXRPcHRpb24odGVzdEtleSwgImZhbHNlIik7Ci0JCXRlc3RWYWx1ZSA9IGRlYnVnT3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKHRlc3RLZXksIHRydWUpOwotCQlhc3NlcnRGYWxzZSh0ZXN0S2V5ICsgIiBpcyB0cnVlIiwgdGVzdFZhbHVlKTsKLQotCQlkZWJ1Z09wdGlvbnMuc2V0T3B0aW9uKHRlc3RLZXksICJ0cnVlIik7Ci0JCXRlc3RWYWx1ZSA9IGRlYnVnT3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKHRlc3RLZXksIGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXN0S2V5ICsgIiBpcyBmYWxzZSIsIHRlc3RWYWx1ZSk7Ci0JCXRlc3RWYWx1ZSA9IGRlYnVnT3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKHRlc3RLZXksIHRydWUpOwotCQlhc3NlcnRUcnVlKHRlc3RLZXkgKyAiIGlzIGZhbHNlIiwgdGVzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3REZWJ1Z1RyYWNlIGNyZWF0ZURlYnVnVHJhY2UoZmluYWwgRmlsZSB0cmFjZUZpbGUpIHsKLQotCQlUZXN0RGVidWdUcmFjZSBkZWJ1Z1RyYWNlID0gbnVsbDsKLQkJaWYgKCFkZWJ1Z09wdGlvbnMuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJLyoqIFNldHVwIHRoZSBEZWJ1Z09wdGlvbnMgKi8KLQkJCWRlYnVnT3B0aW9ucy5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7Ci0JCQlhc3NlcnRUcnVlKCJEZWJ1ZyBpcyBub3QgZW5hYmxlZCIsIGRlYnVnT3B0aW9ucy5pc0RlYnVnRW5hYmxlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWRlYnVnT3B0aW9ucy5zZXRPcHRpb24oZ2V0TmFtZSgpICsgIi9kZWJ1ZyIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlkZWJ1Z09wdGlvbnMuc2V0RmlsZSh0cmFjZUZpbGUpOwotCQlEZWJ1Z1RyYWNlIHdyYXBwZWQgPSBkZWJ1Z09wdGlvbnMubmV3RGVidWdUcmFjZShnZXROYW1lKCksIFRlc3REZWJ1Z1RyYWNlLmNsYXNzKTsKLQkJZGVidWdUcmFjZSA9IG5ldyBUZXN0RGVidWdUcmFjZSh3cmFwcGVkKTsKLQkJcmV0dXJuIGRlYnVnVHJhY2U7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBhbGwgRGVidWdUcmFjZS50cmFjZSooKSBBUEkgd2hlbiB2ZXJib3NlIGRlYnVnZ2luZyBpcyBkaXNhYmxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RWZXJib3NlRGVidWdnaW5nKCkgewotCi0JCS8vIFRPRE86IENvbnZlcnQgdGhpcyBiYWNrIHRvIHtAbGluayBEZWJ1Z09wdGlvbnN9IG9uY2UgaXMvc2V0VmVyYm9zZSBiZWNvbWVzIEFQSQotCQlGcmFtZXdvcmtEZWJ1Z09wdGlvbnMgZndEZWJ1Z09wdGlvbnMgPSAoRnJhbWV3b3JrRGVidWdPcHRpb25zKSBkZWJ1Z09wdGlvbnM7Ci0JCWlmICghZGVidWdPcHRpb25zLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCWRlYnVnT3B0aW9ucy5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJLy8gY3JlYXRlIGEgdHJhY2luZyByZWNvcmQKLQkJZmluYWwgRmlsZSB0cmFjZUZpbGUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKGdldE5hbWUoKSArICIudHJhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlUZXN0RGVidWdUcmFjZSBkZWJ1Z1RyYWNlID0gdGhpcy5jcmVhdGVEZWJ1Z1RyYWNlKHRyYWNlRmlsZSk7Ci0JCVRyYWNlRW50cnlbXSB0cmFjZU91dHB1dCA9IG51bGw7Ci0JCWZpbmFsIFN0cmluZyBleGNlcHRpb25NZXNzYWdlMSA9ICJBbiBlcnJvciAxIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZndEZWJ1Z09wdGlvbnMuc2V0VmVyYm9zZShmYWxzZSk7Ci0JCQlkZWJ1Z1RyYWNlLnRyYWNlKCIvZGVidWciLCAidGVzdGluZyAxIiwgbmV3IEV4Y2VwdGlvbihleGNlcHRpb25NZXNzYWdlMSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZ3RGVidWdPcHRpb25zLnNldFZlcmJvc2UodHJ1ZSk7Ci0JCQlkZWJ1Z1RyYWNlLnRyYWNlKCIvZGVidWciLCAidGVzdGluZyAyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZndEZWJ1Z09wdGlvbnMuc2V0VmVyYm9zZShmYWxzZSk7Ci0JCQlkZWJ1Z1RyYWNlLnRyYWNlKCIvZGVidWciLCAidGVzdGluZyAzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZGVidWdUcmFjZS50cmFjZUVudHJ5KCIvZGVidWciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkZWJ1Z1RyYWNlLnRyYWNlRW50cnkoIi9kZWJ1ZyIsICJhcmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkZWJ1Z1RyYWNlLnRyYWNlRW50cnkoIi9kZWJ1ZyIsIG5ldyBTdHJpbmdbXSB7ImFyZzEiLCAiYXJnMiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWRlYnVnVHJhY2UudHJhY2VFeGl0KCIvZGVidWciKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVidWdUcmFjZS50cmFjZUV4aXQoIi9kZWJ1ZyIsICJyZXR1cm5WYWx1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRyYWNlT3V0cHV0ID0gcmVhZFRyYWNlRmlsZSh0cmFjZUZpbGUpOyAvLyBOb3RlOiB0aGlzIGNhbGwgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgdHJhY2UgZmlsZQotCQl9IGNhdGNoIChJbnZhbGlkVHJhY2VFbnRyeSBpbnZhbGlkRXgpIHsKLQkJCWZhaWwoIkZhaWxlZCAnRGVidWdUcmFjZS50cmFjZShvcHRpb24sIG1lc3NhZ2UpJyB0ZXN0IGFzIGFuIGludmFsaWQgdHJhY2UgZW50cnkgd2FzIGZvdW5kLiAgQWN0dWFsIFZhbHVlOiAnIiArIGludmFsaWRFeC5nZXRBY3R1YWxWYWx1ZSgpICsgIicuIiwgaW52YWxpZEV4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJLy8gbWFrZSBzdXJlIGFsbCAzIGVudHJpZXMgZXhpc3QKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdHJhY2UgZW50cmllcyIsIDgsIHRyYWNlT3V0cHV0Lmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdmFsaWRhdGUgdGhlIHRyYWNlKCIvZGVidWciLCAidGVzdGluZyAxIiwgbmV3IEV4Y2VwdGlvbihleGNlcHRpb25NZXNzYWdlMSkpIGNhbGwgd2hlbiB2ZXJib3NlIHRyYWNpbmcgaXMgZGlzYWJsZWQKLQkJYXNzZXJ0RXF1YWxzKCJUaHJlYWQgbmFtZSBpcyBpbmNvcnJlY3QiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0VGhyZWFkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJBIGJ1bmRsZSB3YXMgZm91bmQgd2hlbiBpdCBzaG91bGQgYmUgbnVsbCIsIHRyYWNlT3V0cHV0WzBdLmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJBIGNsYXNzIG5hbWUgd2FzIGZvdW5kIHdoZW4gaXQgc2hvdWxkIGJlIG51bGwiLCB0cmFjZU91dHB1dFswXS5nZXRDbGFzc05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiQSBtZXRob2QgbmFtZSB3YXMgZm91bmQgd2hlbiBpdCBzaG91bGQgYmUgbnVsbCIsIHRyYWNlT3V0cHV0WzBdLmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQSBsaW5lIG51bWJlciBvdGhlciB0aGFuIC0xIHdhcyByZWFkIGluIiwgdHJhY2VPdXRwdXRbMF0uZ2V0TGluZU51bWJlcigpID09IC0xKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoInRyYWNlIG1lc3NhZ2UgaXMgaW5jb3JyZWN0IiwgInRlc3RpbmcgMSIsIHRyYWNlT3V0cHV0WzBdLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmaW5hbCBTdHJpbmdCdWZmZXIgZXhwZWN0ZWRUaHJvd2FibGVUZXh0MSA9IG5ldyBTdHJpbmdCdWZmZXIoImphdmEubGFuZy5FeGNlcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkVGhyb3dhYmxlVGV4dDEuYXBwZW5kKGV4Y2VwdGlvbk1lc3NhZ2UxKTsKLQkJZXhwZWN0ZWRUaHJvd2FibGVUZXh0MS5hcHBlbmQoRGVidWdPcHRpb25zVGVzdENhc2UuTElORV9TRVBBUkFUT1IpOwotCQlleHBlY3RlZFRocm93YWJsZVRleHQxLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5UQUJfQ0hBUkFDVEVSKTsKLQkJZXhwZWN0ZWRUaHJvd2FibGVUZXh0MS5hcHBlbmQoImF0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuZGVidWdvcHRpb25zLkRlYnVnT3B0aW9uc1Rlc3RDYXNlLnRlc3RWZXJib3NlRGVidWdnaW5nKERlYnVnT3B0aW9uc1Rlc3RDYXNlLmphdmE6Iik7IC8vJE5PTi1OTFMtMSQJCQotCQlpZiAoIXRyYWNlT3V0cHV0WzBdLmdldFRocm93YWJsZVRleHQoKS5zdGFydHNXaXRoKGV4cGVjdGVkVGhyb3dhYmxlVGV4dDEudG9TdHJpbmcoKSkpIHsKLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBlcnJvck1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCJUaGUgZXhwZWN0ZWQgdGhyb3dhYmxlIHRleHQgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgYWN0dWFsIHRocm93YWJsZSB0ZXh0LiIpOyAvLyROT04tTkxTLTEkCi0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLkxJTkVfU0VQQVJBVE9SKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoRGVidWdPcHRpb25zVGVzdENhc2UuTElORV9TRVBBUkFUT1IpOwotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZCgiRXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKCItLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLkxJTkVfU0VQQVJBVE9SKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoZXhwZWN0ZWRUaHJvd2FibGVUZXh0MS50b1N0cmluZygpKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoRGVidWdPcHRpb25zVGVzdENhc2UuTElORV9TRVBBUkFUT1IpOwotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKCJBY3R1YWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKCItLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLkxJTkVfU0VQQVJBVE9SKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQodHJhY2VPdXRwdXRbMF0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsKLQkJCWZhaWwoZXJyb3JNZXNzYWdlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCS8vIHZhbGlkYXRlIHRoZSB0cmFjZSgiL2RlYnVnIiwgInRlc3RpbmcgMiIpIGNhbGwgd2hlbiB2ZXJib3NlIHRyYWNpbmcgaXMgcmUtZW5hYmxlZAotCQlhc3NlcnRFcXVhbHMoIlRocmVhZCBuYW1lIGlzIGluY29ycmVjdCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRUaHJlYWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiQnVuZGxlIG5hbWUgaXMgaW5jb3JyZWN0IiwgZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnIiwgdHJhY2VPdXRwdXRbMV0uZ2V0T3B0aW9uUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsIERlYnVnT3B0aW9uc1Rlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMV0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibWV0aG9kIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgInRlc3RWZXJib3NlRGVidWdnaW5nIiwgdHJhY2VPdXRwdXRbMV0uZ2V0TWV0aG9kTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygidHJhY2UgbWVzc2FnZSBpcyBpbmNvcnJlY3QiLCAidGVzdGluZyAyIiwgdHJhY2VPdXRwdXRbMV0uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydE51bGwoIlRoZSB0aHJvd2FibGUgdGV4dCB3YXMgZm91bmQgd2hlbiBpdCBzaG91bGQgYmUgbnVsbCIsIHRyYWNlT3V0cHV0WzFdLmdldFRocm93YWJsZVRleHQoKSk7Ci0JCS8vIHZhbGlkYXRlIHRoZSB0cmFjZSgiL2RlYnVnIiwgInRlc3RpbmcgMyIpIGNhbGwgd2hlbiB2ZXJib3NlIGlzIGRpc2FibGVkCi0JCWFzc2VydEVxdWFscygiVGhyZWFkIG5hbWUgaXMgaW5jb3JyZWN0IiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCksIHRyYWNlT3V0cHV0WzJdLmdldFRocmVhZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiQSBidW5kbGUgd2FzIGZvdW5kIHdoZW4gaXQgc2hvdWxkIGJlIG51bGwiLCB0cmFjZU91dHB1dFsyXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiQSBjbGFzcyBuYW1lIHdhcyBmb3VuZCB3aGVuIGl0IHNob3VsZCBiZSBudWxsIiwgdHJhY2VPdXRwdXRbMl0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoIkEgbWV0aG9kIG5hbWUgd2FzIGZvdW5kIHdoZW4gaXQgc2hvdWxkIGJlIG51bGwiLCB0cmFjZU91dHB1dFsyXS5nZXRNZXRob2ROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkEgbGluZSBudW1iZXIgb3RoZXIgdGhhbiAtMSB3YXMgcmVhZCBpbiIsIHRyYWNlT3V0cHV0WzJdLmdldExpbmVOdW1iZXIoKSA9PSAtMSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFjZSBtZXNzYWdlIGlzIGluY29ycmVjdCIsICJ0ZXN0aW5nIDMiLCB0cmFjZU91dHB1dFsyXS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0TnVsbCgiVGhlIHRocm93YWJsZSB0ZXh0IHdhcyBmb3VuZCB3aGVuIGl0IHNob3VsZCBiZSBudWxsIiwgdHJhY2VPdXRwdXRbMl0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsKLQkJLy8gdmFsaWRhdGUgdGhlIHRyYWNlRW50cnkoIi9kZWJ1ZyIpIGNhbGwgd2hlbiB2ZXJib3NlIGlzIGRpc2FibGVkCi0JCWFzc2VydEVxdWFscygidHJhY2UgbWVzc2FnZSBpcyBpbmNvcnJlY3QiLCAiRW50ZXJpbmcgbWV0aG9kIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuZGVidWdvcHRpb25zLkRlYnVnT3B0aW9uc1Rlc3RDYXNlI3Rlc3RWZXJib3NlRGVidWdnaW5nIHdpdGggbm8gcGFyYW1ldGVycyIsIHRyYWNlT3V0cHV0WzNdLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLyB2YWxpZGF0ZSB0aGUgdHJhY2VFbnRyeSgiL2RlYnVnIiwgImFyZyIpIGNhbGwgd2hlbiB2ZXJib3NlIGlzIGRpc2FibGVkCi0JCWFzc2VydEVxdWFscygidHJhY2UgbWVzc2FnZSBpcyBpbmNvcnJlY3QiLCAiRW50ZXJpbmcgbWV0aG9kIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuZGVidWdvcHRpb25zLkRlYnVnT3B0aW9uc1Rlc3RDYXNlI3Rlc3RWZXJib3NlRGVidWdnaW5nIHdpdGggcGFyYW1ldGVyczogKGFyZykiLCB0cmFjZU91dHB1dFs0XS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJLy8gdmFsaWRhdGUgdGhlIHRyYWNlRW50cnkoIi9kZWJ1ZyIsIG5ldyBTdHJpbmdbXSB7ImFyZzEiLCAiYXJnMiJ9KSBjYWxsIHdoZW4gdmVyYm9zZSBpcyBkaXNhYmxlZAotCQlhc3NlcnRFcXVhbHMoInRyYWNlIG1lc3NhZ2UgaXMgaW5jb3JyZWN0IiwgIkVudGVyaW5nIG1ldGhvZCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmRlYnVnb3B0aW9ucy5EZWJ1Z09wdGlvbnNUZXN0Q2FzZSN0ZXN0VmVyYm9zZURlYnVnZ2luZyB3aXRoIHBhcmFtZXRlcnM6IChhcmcxIGFyZzIpIiwgdHJhY2VPdXRwdXRbNV0uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIHZhbGlkYXRlIHRoZSB0cmFjZUV4aXQoIi9kZWJ1ZyIpIGNhbGwgd2hlbiB2ZXJib3NlIGlzIGRpc2FibGVkCi0JCWFzc2VydEVxdWFscygidHJhY2UgbWVzc2FnZSBpcyBpbmNvcnJlY3QiLCAiRXhpdGluZyBtZXRob2Qgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5kZWJ1Z29wdGlvbnMuRGVidWdPcHRpb25zVGVzdENhc2UjdGVzdFZlcmJvc2VEZWJ1Z2dpbmcgd2l0aCBhIHZvaWQgcmV0dXJuIiwgdHJhY2VPdXRwdXRbNl0uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIHZhbGlkYXRlIHRoZSB0cmFjZUV4aXQoIi9kZWJ1ZyIsICJyZXR1cm5WYWx1ZSIpIGNhbGwgd2hlbiB2ZXJib3NlIGlzIGRpc2FibGVkCi0JCWFzc2VydEVxdWFscygidHJhY2UgbWVzc2FnZSBpcyBpbmNvcnJlY3QiLCAiRXhpdGluZyBtZXRob2Qgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5kZWJ1Z29wdGlvbnMuRGVidWdPcHRpb25zVGVzdENhc2UjdGVzdFZlcmJvc2VEZWJ1Z2dpbmcgd2l0aCByZXN1bHQ6IHJldHVyblZhbHVlIiwgdHJhY2VPdXRwdXRbN10uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBkZWxldGVkCi0JCXRyYWNlRmlsZS5kZWxldGUoKTsKLQkJLy8gcmVzZXQgdmVyYm9zZSBkZWJ1Z2dpbmcgdG8gdGhlIGRlZmF1bHQgKHRydWUpCi0JCWZ3RGVidWdPcHRpb25zLnNldFZlcmJvc2UodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBEZWJ1Z1RyYWNlLnRyYWNlKG9wdGlvbiwgbWVzc2FnZSk7Ci0JKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhY2VGaWxlMDEoKSB7Ci0KLQkJZmluYWwgRmlsZSB0cmFjZUZpbGUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKGdldE5hbWUoKSArICIudHJhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlUZXN0RGVidWdUcmFjZSBkZWJ1Z1RyYWNlID0gdGhpcy5jcmVhdGVEZWJ1Z1RyYWNlKHRyYWNlRmlsZSk7Ci0JCVRyYWNlRW50cnlbXSB0cmFjZU91dHB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z1RyYWNlLnRyYWNlKCIvZGVidWciLCAidGVzdGluZyAxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZGVidWdUcmFjZS50cmFjZSgiL25vdHNldCIsICJ0ZXN0aW5nIDIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkZWJ1Z1RyYWNlLnRyYWNlKCIvZGVidWciLCAidGVzdGluZyAzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdHJhY2VPdXRwdXQgPSByZWFkVHJhY2VGaWxlKHRyYWNlRmlsZSk7IC8vIE5vdGU6IHRoaXMgY2FsbCB3aWxsIGFsc28gZGVsZXRlIHRoZSB0cmFjZSBmaWxlCi0JCX0gY2F0Y2ggKEludmFsaWRUcmFjZUVudHJ5IGludmFsaWRFeCkgewotCQkJZmFpbCgiRmFpbGVkICdEZWJ1Z1RyYWNlLnRyYWNlKG9wdGlvbiwgbWVzc2FnZSknIHRlc3QgYXMgYW4gaW52YWxpZCB0cmFjZSBlbnRyeSB3YXMgZm91bmQuICBBY3R1YWwgVmFsdWU6ICciICsgaW52YWxpZEV4LmdldEFjdHVhbFZhbHVlKCkgKyAiJy4iLCBpbnZhbGlkRXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB0cmFjZSBlbnRyaWVzIiwgMiwgdHJhY2VPdXRwdXQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRocmVhZCBuYW1lIGlzIGluY29ycmVjdCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRUaHJlYWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiQnVuZGxlIG5hbWUgaXMgaW5jb3JyZWN0IiwgZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnIiwgdHJhY2VPdXRwdXRbMF0uZ2V0T3B0aW9uUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsIERlYnVnT3B0aW9uc1Rlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibWV0aG9kIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgInRlc3RUcmFjZUZpbGUwMSIsIHRyYWNlT3V0cHV0WzBdLmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoInRyYWNlIG1lc3NhZ2UgaXMgaW5jb3JyZWN0IiwgInRlc3RpbmcgMSIsIHRyYWNlT3V0cHV0WzBdLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROdWxsKCJ0aHJvd2FibGUgc2hvdWxkIGJlIG51bGwiLCB0cmFjZU91dHB1dFswXS5nZXRUaHJvd2FibGVUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHRyYWNlIGVudHJpZXMgZm9yIHRyYWNlIHdpdGhvdXQgYW4gZXhjZXB0aW9uIiwgMiwgdHJhY2VPdXRwdXQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRocmVhZCBuYW1lIGlzIGluY29ycmVjdCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRUaHJlYWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiQnVuZGxlIG5hbWUgaXMgaW5jb3JyZWN0IiwgZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnIiwgdHJhY2VPdXRwdXRbMV0uZ2V0T3B0aW9uUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsIERlYnVnT3B0aW9uc1Rlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMV0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibWV0aG9kIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgInRlc3RUcmFjZUZpbGUwMSIsIHRyYWNlT3V0cHV0WzFdLmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoInRyYWNlIG1lc3NhZ2UgaXMgaW5jb3JyZWN0IiwgInRlc3RpbmcgMyIsIHRyYWNlT3V0cHV0WzFdLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROdWxsKCJ0aHJvd2FibGUgc2hvdWxkIGJlIG51bGwiLCB0cmFjZU91dHB1dFsxXS5nZXRUaHJvd2FibGVUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIGRlbGV0ZSB0aGUgdHJhY2UgZmlsZQotCQl0cmFjZUZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBEZWJ1Z1RyYWNlLnRyYWNlKG9wdGlvbiwgbWVzc2FnZSwgVGhyb3dhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RUcmFjZUZpbGUwMigpIHsKLQotCQlmaW5hbCBGaWxlIHRyYWNlRmlsZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoZ2V0TmFtZSgpICsgIi50cmFjZSIpOyAvLyROT04tTkxTLTEkCi0JCVRlc3REZWJ1Z1RyYWNlIGRlYnVnVHJhY2UgPSB0aGlzLmNyZWF0ZURlYnVnVHJhY2UodHJhY2VGaWxlKTsKLQkJVHJhY2VFbnRyeVtdIHRyYWNlT3V0cHV0ID0gbnVsbDsKLQkJZmluYWwgU3RyaW5nIGV4Y2VwdGlvbk1lc3NhZ2UxID0gIkFuIGVycm9yIDEiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBleGNlcHRpb25NZXNzYWdlMiA9ICJBbiBlcnJvciAyIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZTMgPSAiQW4gZXJyb3IgMyI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWRlYnVnVHJhY2UudHJhY2UoIi9kZWJ1ZyIsICJ0ZXN0aW5nIDEiLCBuZXcgRXhjZXB0aW9uKGV4Y2VwdGlvbk1lc3NhZ2UxKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCWRlYnVnVHJhY2UudHJhY2UoIi9ub3RzZXQiLCAidGVzdGluZyAyIiwgbmV3IEV4Y2VwdGlvbihleGNlcHRpb25NZXNzYWdlMikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRlYnVnVHJhY2UudHJhY2UoIi9kZWJ1ZyIsICJ0ZXN0aW5nIDMiLCBuZXcgRXhjZXB0aW9uKGV4Y2VwdGlvbk1lc3NhZ2UzKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdHJhY2VPdXRwdXQgPSByZWFkVHJhY2VGaWxlKHRyYWNlRmlsZSk7IC8vIE5vdGU6IHRoaXMgY2FsbCB3aWxsIGFsc28gZGVsZXRlIHRoZSB0cmFjZSBmaWxlCi0JCX0gY2F0Y2ggKEludmFsaWRUcmFjZUVudHJ5IGludmFsaWRFeCkgewotCQkJZmFpbCgiRmFpbGVkICdEZWJ1Z1RyYWNlLnRyYWNlKG9wdGlvbiwgbWVzc2FnZSwgVGhyb3dhYmxlKScgdGVzdCBhcyBhbiBpbnZhbGlkIHRyYWNlIGVudHJ5IHdhcyBmb3VuZC4gIEFjdHVhbCBWYWx1ZTogJyIgKyBpbnZhbGlkRXguZ2V0QWN0dWFsVmFsdWUoKSArICInLiIsIGludmFsaWRFeCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJZmluYWwgU3RyaW5nQnVmZmVyIGV4cGVjdGVkVGhyb3dhYmxlVGV4dDEgPSBuZXcgU3RyaW5nQnVmZmVyKCJqYXZhLmxhbmcuRXhjZXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZFRocm93YWJsZVRleHQxLmFwcGVuZChleGNlcHRpb25NZXNzYWdlMSk7Ci0JCWV4cGVjdGVkVGhyb3dhYmxlVGV4dDEuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLkxJTkVfU0VQQVJBVE9SKTsKLQkJZXhwZWN0ZWRUaHJvd2FibGVUZXh0MS5hcHBlbmQoRGVidWdPcHRpb25zVGVzdENhc2UuVEFCX0NIQVJBQ1RFUik7Ci0JCWV4cGVjdGVkVGhyb3dhYmxlVGV4dDEuYXBwZW5kKCJhdCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmRlYnVnb3B0aW9ucy5EZWJ1Z09wdGlvbnNUZXN0Q2FzZS50ZXN0VHJhY2VGaWxlMDIoRGVidWdPcHRpb25zVGVzdENhc2UuamF2YToiKTsgLy8kTk9OLU5MUy0xJAkJCi0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdHJhY2UgZW50cmllcyIsIDIsIHRyYWNlT3V0cHV0Lmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJUaHJlYWQgbmFtZSBpcyBpbmNvcnJlY3QiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0VGhyZWFkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIkJ1bmRsZSBuYW1lIGlzIGluY29ycmVjdCIsIGdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygib3B0aW9uLXBhdGggdmFsdWUgaXMgaW5jb3JyZWN0IiwgIi9kZWJ1ZyIsIHRyYWNlT3V0cHV0WzBdLmdldE9wdGlvblBhdGgoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgbmFtZSB2YWx1ZSBpcyBpbmNvcnJlY3QiLCBEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5jbGFzcy5nZXROYW1lKCksIHRyYWNlT3V0cHV0WzBdLmdldENsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZCBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsICJ0ZXN0VHJhY2VGaWxlMDIiLCB0cmFjZU91dHB1dFswXS5nZXRNZXRob2ROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFjZSBtZXNzYWdlIGlzIGluY29ycmVjdCIsICJ0ZXN0aW5nIDEiLCB0cmFjZU91dHB1dFswXS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0Tm90TnVsbCgidGhyb3dhYmxlIHRleHQgc2hvdWxkIG5vdCBiZSBudWxsIiwgdHJhY2VPdXRwdXRbMF0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXRyYWNlT3V0cHV0WzBdLmdldFRocm93YWJsZVRleHQoKS5zdGFydHNXaXRoKGV4cGVjdGVkVGhyb3dhYmxlVGV4dDEudG9TdHJpbmcoKSkpIHsKLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBlcnJvck1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCJUaGUgZXhwZWN0ZWQgdGhyb3dhYmxlIHRleHQgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgYWN0dWFsIHRocm93YWJsZSB0ZXh0LiIpOyAvLyROT04tTkxTLTEkCi0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLkxJTkVfU0VQQVJBVE9SKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoRGVidWdPcHRpb25zVGVzdENhc2UuTElORV9TRVBBUkFUT1IpOwotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZCgiRXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKCItLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLkxJTkVfU0VQQVJBVE9SKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoZXhwZWN0ZWRUaHJvd2FibGVUZXh0MS50b1N0cmluZygpKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoRGVidWdPcHRpb25zVGVzdENhc2UuTElORV9TRVBBUkFUT1IpOwotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKCJBY3R1YWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKCItLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLkxJTkVfU0VQQVJBVE9SKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQodHJhY2VPdXRwdXRbMF0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsKLQkJCWZhaWwoZXJyb3JNZXNzYWdlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWFzc2VydE5vdE51bGwoInRocm93YWJsZSBzaG91bGQgbm90IGJlIG51bGwiLCB0cmFjZU91dHB1dFswXS5nZXRUaHJvd2FibGVUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHRyYWNlIGVudHJpZXMgZm9yIHRyYWNlIHdpdGhvdXQgYW4gZXhjZXB0aW9uIiwgMiwgdHJhY2VPdXRwdXQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZ0J1ZmZlciBleHBlY3RlZFRocm93YWJsZVRleHQyID0gbmV3IFN0cmluZ0J1ZmZlcigiamF2YS5sYW5nLkV4Y2VwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0ZWRUaHJvd2FibGVUZXh0Mi5hcHBlbmQoZXhjZXB0aW9uTWVzc2FnZTMpOwotCQlleHBlY3RlZFRocm93YWJsZVRleHQyLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCWV4cGVjdGVkVGhyb3dhYmxlVGV4dDIuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLlRBQl9DSEFSQUNURVIpOwotCQlleHBlY3RlZFRocm93YWJsZVRleHQyLmFwcGVuZCgiYXQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5kZWJ1Z29wdGlvbnMuRGVidWdPcHRpb25zVGVzdENhc2UudGVzdFRyYWNlRmlsZTAyKERlYnVnT3B0aW9uc1Rlc3RDYXNlLmphdmE6Iik7IC8vJE5PTi1OTFMtMSQJCQotCi0JCWFzc2VydEVxdWFscygiVGhyZWFkIG5hbWUgaXMgaW5jb3JyZWN0IiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCksIHRyYWNlT3V0cHV0WzFdLmdldFRocmVhZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJCdW5kbGUgbmFtZSBpcyBpbmNvcnJlY3QiLCBnZXROYW1lKCksIHRyYWNlT3V0cHV0WzFdLmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm9wdGlvbi1wYXRoIHZhbHVlIGlzIGluY29ycmVjdCIsICIvZGVidWciLCB0cmFjZU91dHB1dFsxXS5nZXRPcHRpb25QYXRoKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgRGVidWdPcHRpb25zVGVzdENhc2UuY2xhc3MuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRDbGFzc05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QgbmFtZSB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAidGVzdFRyYWNlRmlsZTAyIiwgdHJhY2VPdXRwdXRbMV0uZ2V0TWV0aG9kTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygidHJhY2UgbWVzc2FnZSBpcyBpbmNvcnJlY3QiLCAidGVzdGluZyAzIiwgdHJhY2VPdXRwdXRbMV0uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydE5vdE51bGwoInRocm93YWJsZSB0ZXh0IHNob3VsZCBub3QgYmUgbnVsbCIsIHRyYWNlT3V0cHV0WzFdLmdldFRocm93YWJsZVRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCF0cmFjZU91dHB1dFsxXS5nZXRUaHJvd2FibGVUZXh0KCkuc3RhcnRzV2l0aChleHBlY3RlZFRocm93YWJsZVRleHQyLnRvU3RyaW5nKCkpKSB7Ci0JCQlmaW5hbCBTdHJpbmdCdWZmZXIgZXJyb3JNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigiVGhlIGV4cGVjdGVkIHRocm93YWJsZSB0ZXh0IGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGFjdHVhbCB0aHJvd2FibGUgdGV4dC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLkxJTkVfU0VQQVJBVE9SKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoIkV4cGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoRGVidWdPcHRpb25zVGVzdENhc2UuTElORV9TRVBBUkFUT1IpOwotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZCgiLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKGV4cGVjdGVkVGhyb3dhYmxlVGV4dDIudG9TdHJpbmcoKSk7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKERlYnVnT3B0aW9uc1Rlc3RDYXNlLkxJTkVfU0VQQVJBVE9SKTsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoRGVidWdPcHRpb25zVGVzdENhc2UuTElORV9TRVBBUkFUT1IpOwotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZCgiQWN0dWFsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoRGVidWdPcHRpb25zVGVzdENhc2UuTElORV9TRVBBUkFUT1IpOwotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZCgiLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5MSU5FX1NFUEFSQVRPUik7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKHRyYWNlT3V0cHV0WzFdLmdldFRocm93YWJsZVRleHQoKSk7Ci0JCQlmYWlsKGVycm9yTWVzc2FnZS50b1N0cmluZygpKTsKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJ0aHJvd2FibGUgc2hvdWxkIG5vdCBiZSBudWxsIiwgdHJhY2VPdXRwdXRbMV0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBkZWxldGUgdGhlIHRyYWNlIGZpbGUKLQkJdHJhY2VGaWxlLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgRGVidWdUcmFjZS50cmFjZUR1bXBTdGFjayhvcHRpb24pCi0JKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhY2VGaWxlMDMoKSB7Ci0KLQkJZmluYWwgRmlsZSB0cmFjZUZpbGUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKGdldE5hbWUoKSArICIudHJhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlUZXN0RGVidWdUcmFjZSBkZWJ1Z1RyYWNlID0gdGhpcy5jcmVhdGVEZWJ1Z1RyYWNlKHRyYWNlRmlsZSk7Ci0JCVRyYWNlRW50cnlbXSB0cmFjZU91dHB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z1RyYWNlLnRyYWNlRHVtcFN0YWNrKCIvZGVidWciKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVidWdUcmFjZS50cmFjZUR1bXBTdGFjaygiL25vdHNldCIpOyAvLyROT04tTkxTLTEkCi0JCQlkZWJ1Z1RyYWNlLnRyYWNlRHVtcFN0YWNrKCIvZGVidWciKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhY2VPdXRwdXQgPSByZWFkVHJhY2VGaWxlKHRyYWNlRmlsZSk7IC8vIE5vdGU6IHRoaXMgY2FsbCB3aWxsIGFsc28gZGVsZXRlIHRoZSB0cmFjZSBmaWxlCi0JCX0gY2F0Y2ggKEludmFsaWRUcmFjZUVudHJ5IGludmFsaWRFeCkgewotCQkJZmFpbCgiRmFpbGVkICdEZWJ1Z1RyYWNlLnRyYWNlRHVtcFN0YWNrKG9wdGlvbiknIHRlc3QgYXMgYW4gaW52YWxpZCB0cmFjZSBlbnRyeSB3YXMgZm91bmQuICBBY3R1YWwgVmFsdWU6ICciICsgaW52YWxpZEV4LmdldEFjdHVhbFZhbHVlKCkgKyAiJy4iLCBpbnZhbGlkRXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB0cmFjZSBlbnRyaWVzIiwgMiwgdHJhY2VPdXRwdXQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRocmVhZCBuYW1lIGlzIGluY29ycmVjdCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRUaHJlYWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiQnVuZGxlIG5hbWUgaXMgaW5jb3JyZWN0IiwgZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnIiwgdHJhY2VPdXRwdXRbMF0uZ2V0T3B0aW9uUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsIERlYnVnT3B0aW9uc1Rlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibWV0aG9kIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgInRlc3RUcmFjZUZpbGUwMyIsIHRyYWNlT3V0cHV0WzBdLmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCJUcmFjZSBtZXNzYWdlIGlzIG5vdCBhIHN0YWNrIGR1bXAiLCB0cmFjZU91dHB1dFswXS5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aCgiVGhyZWFkIFN0YWNrIGR1bXA6ICIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydE51bGwoInRocm93YWJsZSBzaG91bGQgYmUgbnVsbCIsIHRyYWNlT3V0cHV0WzBdLmdldFRocm93YWJsZVRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdHJhY2UgZW50cmllcyBmb3IgdHJhY2Ugd2l0aG91dCBhbiBleGNlcHRpb24iLCAyLCB0cmFjZU91dHB1dC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiVGhyZWFkIG5hbWUgaXMgaW5jb3JyZWN0IiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCksIHRyYWNlT3V0cHV0WzFdLmdldFRocmVhZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJCdW5kbGUgbmFtZSBpcyBpbmNvcnJlY3QiLCBnZXROYW1lKCksIHRyYWNlT3V0cHV0WzFdLmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm9wdGlvbi1wYXRoIHZhbHVlIGlzIGluY29ycmVjdCIsICIvZGVidWciLCB0cmFjZU91dHB1dFsxXS5nZXRPcHRpb25QYXRoKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgRGVidWdPcHRpb25zVGVzdENhc2UuY2xhc3MuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRDbGFzc05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QgbmFtZSB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAidGVzdFRyYWNlRmlsZTAzIiwgdHJhY2VPdXRwdXRbMV0uZ2V0TWV0aG9kTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIlRyYWNlIG1lc3NhZ2UgaXMgbm90IGEgc3RhY2sgZHVtcCIsIHRyYWNlT3V0cHV0WzFdLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKCJUaHJlYWQgU3RhY2sgZHVtcDogIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0TnVsbCgidGhyb3dhYmxlIHNob3VsZCBiZSBudWxsIiwgdHJhY2VPdXRwdXRbMV0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBkZWxldGUgdGhlIHRyYWNlIGZpbGUKLQkJdHJhY2VGaWxlLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgRGVidWdUcmFjZS50cmFjZUVudHJ5KG9wdGlvbikKLQkqLwotCXB1YmxpYyB2b2lkIHRlc3RUcmFjZUZpbGUwNCgpIHsKLQotCQlmaW5hbCBGaWxlIHRyYWNlRmlsZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoZ2V0TmFtZSgpICsgIi50cmFjZSIpOyAvLyROT04tTkxTLTEkCi0JCVRlc3REZWJ1Z1RyYWNlIGRlYnVnVHJhY2UgPSB0aGlzLmNyZWF0ZURlYnVnVHJhY2UodHJhY2VGaWxlKTsKLQkJVHJhY2VFbnRyeVtdIHRyYWNlT3V0cHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlYnVnVHJhY2UudHJhY2VFbnRyeSgiL2RlYnVnIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRlYnVnVHJhY2UudHJhY2VFbnRyeSgiL25vdHNldCIpOyAvLyROT04tTkxTLTEkCi0JCQlkZWJ1Z1RyYWNlLnRyYWNlRW50cnkoIi9kZWJ1ZyIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFjZU91dHB1dCA9IHJlYWRUcmFjZUZpbGUodHJhY2VGaWxlKTsgLy8gTm90ZTogdGhpcyBjYWxsIHdpbGwgYWxzbyBkZWxldGUgdGhlIHRyYWNlIGZpbGUKLQkJfSBjYXRjaCAoSW52YWxpZFRyYWNlRW50cnkgaW52YWxpZEV4KSB7Ci0JCQlmYWlsKCJGYWlsZWQgJ0RlYnVnVHJhY2UudHJhY2VFbnRyeShvcHRpb24pJyB0ZXN0IGFzIGFuIGludmFsaWQgdHJhY2UgZW50cnkgd2FzIGZvdW5kLiAgQWN0dWFsIFZhbHVlOiAnIiArIGludmFsaWRFeC5nZXRBY3R1YWxWYWx1ZSgpICsgIicuIiwgaW52YWxpZEV4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdHJhY2UgZW50cmllcyIsIDIsIHRyYWNlT3V0cHV0Lmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJUaHJlYWQgbmFtZSBpcyBpbmNvcnJlY3QiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0VGhyZWFkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIkJ1bmRsZSBuYW1lIGlzIGluY29ycmVjdCIsIGdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygib3B0aW9uLXBhdGggdmFsdWUgaXMgaW5jb3JyZWN0IiwgIi9kZWJ1ZyIsIHRyYWNlT3V0cHV0WzBdLmdldE9wdGlvblBhdGgoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgbmFtZSB2YWx1ZSBpcyBpbmNvcnJlY3QiLCBEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5jbGFzcy5nZXROYW1lKCksIHRyYWNlT3V0cHV0WzBdLmdldENsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZCBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsICJ0ZXN0VHJhY2VGaWxlMDQiLCB0cmFjZU91dHB1dFswXS5nZXRNZXRob2ROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJUcmFjZSBtZXNzYWdlIGlzIG5vdCBjb3JyZWN0IiwgIkVudGVyaW5nIG1ldGhvZCB3aXRoIG5vIHBhcmFtZXRlcnMiLCB0cmFjZU91dHB1dFswXS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0TnVsbCgidGhyb3dhYmxlIHNob3VsZCBiZSBudWxsIiwgdHJhY2VPdXRwdXRbMF0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB0cmFjZSBlbnRyaWVzIGZvciB0cmFjZSB3aXRob3V0IGFuIGV4Y2VwdGlvbiIsIDIsIHRyYWNlT3V0cHV0Lmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJUaHJlYWQgbmFtZSBpcyBpbmNvcnJlY3QiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMV0uZ2V0VGhyZWFkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIkJ1bmRsZSBuYW1lIGlzIGluY29ycmVjdCIsIGdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMV0uZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygib3B0aW9uLXBhdGggdmFsdWUgaXMgaW5jb3JyZWN0IiwgIi9kZWJ1ZyIsIHRyYWNlT3V0cHV0WzFdLmdldE9wdGlvblBhdGgoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgbmFtZSB2YWx1ZSBpcyBpbmNvcnJlY3QiLCBEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5jbGFzcy5nZXROYW1lKCksIHRyYWNlT3V0cHV0WzFdLmdldENsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZCBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsICJ0ZXN0VHJhY2VGaWxlMDQiLCB0cmFjZU91dHB1dFsxXS5nZXRNZXRob2ROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJUcmFjZSBtZXNzYWdlIGlzIG5vdCBjb3JyZWN0IiwgIkVudGVyaW5nIG1ldGhvZCB3aXRoIG5vIHBhcmFtZXRlcnMiLCB0cmFjZU91dHB1dFsxXS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0TnVsbCgidGhyb3dhYmxlIHNob3VsZCBiZSBudWxsIiwgdHJhY2VPdXRwdXRbMV0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBkZWxldGUgdGhlIHRyYWNlIGZpbGUKLQkJdHJhY2VGaWxlLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgRGVidWdUcmFjZS50cmFjZUVudHJ5KG9wdGlvbiwgbWV0aG9kQXJndW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRyYWNlRmlsZTA1KCkgewotCi0JCWZpbmFsIEZpbGUgdHJhY2VGaWxlID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZShnZXROYW1lKCkgKyAiLnRyYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdERlYnVnVHJhY2UgZGVidWdUcmFjZSA9IHRoaXMuY3JlYXRlRGVidWdUcmFjZSh0cmFjZUZpbGUpOwotCQlUcmFjZUVudHJ5W10gdHJhY2VPdXRwdXQgPSBudWxsOwotCQl0cnkgewotCQkJZGVidWdUcmFjZS50cmFjZUVudHJ5KCIvZGVidWciLCBuZXcgU3RyaW5nKCJhcmcxIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRlYnVnVHJhY2UudHJhY2VFbnRyeSgiL25vdHNldCIsIG5ldyBTdHJpbmcoImFyZzIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZGVidWdUcmFjZS50cmFjZUVudHJ5KCIvZGVidWciLCBuZXcgU3RyaW5nKCJhcmczIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRyYWNlT3V0cHV0ID0gcmVhZFRyYWNlRmlsZSh0cmFjZUZpbGUpOyAvLyBOb3RlOiB0aGlzIGNhbGwgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgdHJhY2UgZmlsZQotCQl9IGNhdGNoIChJbnZhbGlkVHJhY2VFbnRyeSBpbnZhbGlkRXgpIHsKLQkJCWZhaWwoIkZhaWxlZCAnRGVidWdUcmFjZS50cmFjZUVudHJ5KG9wdGlvbiwgbWV0aG9kQXJndW1lbnQpJyB0ZXN0IGFzIGFuIGludmFsaWQgdHJhY2UgZW50cnkgd2FzIGZvdW5kLiAgQWN0dWFsIFZhbHVlOiAnIiArIGludmFsaWRFeC5nZXRBY3R1YWxWYWx1ZSgpICsgIicuIiwgaW52YWxpZEV4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdHJhY2UgZW50cmllcyIsIDIsIHRyYWNlT3V0cHV0Lmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJUaHJlYWQgbmFtZSBpcyBpbmNvcnJlY3QiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0VGhyZWFkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIkJ1bmRsZSBuYW1lIGlzIGluY29ycmVjdCIsIGdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygib3B0aW9uLXBhdGggdmFsdWUgaXMgaW5jb3JyZWN0IiwgIi9kZWJ1ZyIsIHRyYWNlT3V0cHV0WzBdLmdldE9wdGlvblBhdGgoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgbmFtZSB2YWx1ZSBpcyBpbmNvcnJlY3QiLCBEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5jbGFzcy5nZXROYW1lKCksIHRyYWNlT3V0cHV0WzBdLmdldENsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZCBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsICJ0ZXN0VHJhY2VGaWxlMDUiLCB0cmFjZU91dHB1dFswXS5nZXRNZXRob2ROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJUcmFjZSBtZXNzYWdlIGlzIG5vdCBjb3JyZWN0IiwgIkVudGVyaW5nIG1ldGhvZCB3aXRoIHBhcmFtZXRlcnM6IChhcmcxKSIsIHRyYWNlT3V0cHV0WzBdLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROdWxsKCJ0aHJvd2FibGUgc2hvdWxkIGJlIG51bGwiLCB0cmFjZU91dHB1dFswXS5nZXRUaHJvd2FibGVUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHRyYWNlIGVudHJpZXMgZm9yIHRyYWNlIHdpdGhvdXQgYW4gZXhjZXB0aW9uIiwgMiwgdHJhY2VPdXRwdXQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRocmVhZCBuYW1lIGlzIGluY29ycmVjdCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRUaHJlYWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiQnVuZGxlIG5hbWUgaXMgaW5jb3JyZWN0IiwgZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnIiwgdHJhY2VPdXRwdXRbMV0uZ2V0T3B0aW9uUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsIERlYnVnT3B0aW9uc1Rlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMV0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibWV0aG9kIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgInRlc3RUcmFjZUZpbGUwNSIsIHRyYWNlT3V0cHV0WzFdLmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIlRyYWNlIG1lc3NhZ2UgaXMgbm90IGNvcnJlY3QiLCAiRW50ZXJpbmcgbWV0aG9kIHdpdGggcGFyYW1ldGVyczogKGFyZzMpIiwgdHJhY2VPdXRwdXRbMV0uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydE51bGwoInRocm93YWJsZSBzaG91bGQgYmUgbnVsbCIsIHRyYWNlT3V0cHV0WzFdLmdldFRocm93YWJsZVRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZGVsZXRlIHRoZSB0cmFjZSBmaWxlCi0JCXRyYWNlRmlsZS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IERlYnVnVHJhY2UudHJhY2VFbnRyeShvcHRpb24sIG1ldGhvZEFyZ3VtZW50W10pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRyYWNlRmlsZTA2KCkgewotCi0JCWZpbmFsIEZpbGUgdHJhY2VGaWxlID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZShnZXROYW1lKCkgKyAiLnRyYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdERlYnVnVHJhY2UgZGVidWdUcmFjZSA9IHRoaXMuY3JlYXRlRGVidWdUcmFjZSh0cmFjZUZpbGUpOwotCQlUcmFjZUVudHJ5W10gdHJhY2VPdXRwdXQgPSBudWxsOwotCQl0cnkgewotCQkJZGVidWdUcmFjZS50cmFjZUVudHJ5KCIvZGVidWciLCBuZXcgU3RyaW5nW10geyJhcmcxIiwgImFyZzIifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlkZWJ1Z1RyYWNlLnRyYWNlRW50cnkoIi9ub3RzZXQiLCBuZXcgU3RyaW5nW10geyJhcmczIiwgImFyZzQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlkZWJ1Z1RyYWNlLnRyYWNlRW50cnkoIi9kZWJ1ZyIsIG5ldyBTdHJpbmdbXSB7ImFyZzUiLCAiYXJnNiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXRyYWNlT3V0cHV0ID0gcmVhZFRyYWNlRmlsZSh0cmFjZUZpbGUpOyAvLyBOb3RlOiB0aGlzIGNhbGwgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgdHJhY2UgZmlsZQotCQl9IGNhdGNoIChJbnZhbGlkVHJhY2VFbnRyeSBpbnZhbGlkRXgpIHsKLQkJCWZhaWwoIkZhaWxlZCAnRGVidWdUcmFjZS50cmFjZUVudHJ5KG9wdGlvbiwgbWV0aG9kQXJndW1lbnRbXSknIHRlc3QgYXMgYW4gaW52YWxpZCB0cmFjZSBlbnRyeSB3YXMgZm91bmQuICBBY3R1YWwgVmFsdWU6ICciICsgaW52YWxpZEV4LmdldEFjdHVhbFZhbHVlKCkgKyAiJy4iLCBpbnZhbGlkRXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB0cmFjZSBlbnRyaWVzIiwgMiwgdHJhY2VPdXRwdXQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRocmVhZCBuYW1lIGlzIGluY29ycmVjdCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRUaHJlYWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiQnVuZGxlIG5hbWUgaXMgaW5jb3JyZWN0IiwgZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnIiwgdHJhY2VPdXRwdXRbMF0uZ2V0T3B0aW9uUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsIERlYnVnT3B0aW9uc1Rlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibWV0aG9kIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgInRlc3RUcmFjZUZpbGUwNiIsIHRyYWNlT3V0cHV0WzBdLmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIlRyYWNlIG1lc3NhZ2UgaXMgbm90IGNvcnJlY3QiLCAiRW50ZXJpbmcgbWV0aG9kIHdpdGggcGFyYW1ldGVyczogKGFyZzEgYXJnMikiLCB0cmFjZU91dHB1dFswXS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0TnVsbCgidGhyb3dhYmxlIHNob3VsZCBiZSBudWxsIiwgdHJhY2VPdXRwdXRbMF0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB0cmFjZSBlbnRyaWVzIGZvciB0cmFjZSB3aXRob3V0IGFuIGV4Y2VwdGlvbiIsIDIsIHRyYWNlT3V0cHV0Lmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJUaHJlYWQgbmFtZSBpcyBpbmNvcnJlY3QiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMV0uZ2V0VGhyZWFkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIkJ1bmRsZSBuYW1lIGlzIGluY29ycmVjdCIsIGdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMV0uZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygib3B0aW9uLXBhdGggdmFsdWUgaXMgaW5jb3JyZWN0IiwgIi9kZWJ1ZyIsIHRyYWNlT3V0cHV0WzFdLmdldE9wdGlvblBhdGgoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiY2xhc3MgbmFtZSB2YWx1ZSBpcyBpbmNvcnJlY3QiLCBEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5jbGFzcy5nZXROYW1lKCksIHRyYWNlT3V0cHV0WzFdLmdldENsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZCBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsICJ0ZXN0VHJhY2VGaWxlMDYiLCB0cmFjZU91dHB1dFsxXS5nZXRNZXRob2ROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJUcmFjZSBtZXNzYWdlIGlzIG5vdCBjb3JyZWN0IiwgIkVudGVyaW5nIG1ldGhvZCB3aXRoIHBhcmFtZXRlcnM6IChhcmc1IGFyZzYpIiwgdHJhY2VPdXRwdXRbMV0uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydE51bGwoInRocm93YWJsZSBzaG91bGQgYmUgbnVsbCIsIHRyYWNlT3V0cHV0WzFdLmdldFRocm93YWJsZVRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZGVsZXRlIHRoZSB0cmFjZSBmaWxlCi0JCXRyYWNlRmlsZS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IERlYnVnVHJhY2UudHJhY2VFeGl0KG9wdGlvbikKLQkqLwotCXB1YmxpYyB2b2lkIHRlc3RUcmFjZUZpbGUwNygpIHsKLQotCQlmaW5hbCBGaWxlIHRyYWNlRmlsZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoZ2V0TmFtZSgpICsgIi50cmFjZSIpOyAvLyROT04tTkxTLTEkCi0JCVRlc3REZWJ1Z1RyYWNlIGRlYnVnVHJhY2UgPSB0aGlzLmNyZWF0ZURlYnVnVHJhY2UodHJhY2VGaWxlKTsKLQkJVHJhY2VFbnRyeVtdIHRyYWNlT3V0cHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlYnVnVHJhY2UudHJhY2VFeGl0KCIvZGVidWciKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVidWdUcmFjZS50cmFjZUV4aXQoIi9ub3RzZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVidWdUcmFjZS50cmFjZUV4aXQoIi9kZWJ1ZyIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFjZU91dHB1dCA9IHJlYWRUcmFjZUZpbGUodHJhY2VGaWxlKTsgLy8gTm90ZTogdGhpcyBjYWxsIHdpbGwgYWxzbyBkZWxldGUgdGhlIHRyYWNlIGZpbGUKLQkJfSBjYXRjaCAoSW52YWxpZFRyYWNlRW50cnkgaW52YWxpZEV4KSB7Ci0JCQlmYWlsKCJGYWlsZWQgJ0RlYnVnVHJhY2UudHJhY2VFeGl0KG9wdGlvbiknIHRlc3QgYXMgYW4gaW52YWxpZCB0cmFjZSBlbnRyeSB3YXMgZm91bmQuICBBY3R1YWwgVmFsdWU6ICciICsgaW52YWxpZEV4LmdldEFjdHVhbFZhbHVlKCkgKyAiJy4iLCBpbnZhbGlkRXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB0cmFjZSBlbnRyaWVzIiwgMiwgdHJhY2VPdXRwdXQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRocmVhZCBuYW1lIGlzIGluY29ycmVjdCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRUaHJlYWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiQnVuZGxlIG5hbWUgaXMgaW5jb3JyZWN0IiwgZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnIiwgdHJhY2VPdXRwdXRbMF0uZ2V0T3B0aW9uUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsIERlYnVnT3B0aW9uc1Rlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibWV0aG9kIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgInRlc3RUcmFjZUZpbGUwNyIsIHRyYWNlT3V0cHV0WzBdLmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIlRyYWNlIG1lc3NhZ2UgaXMgbm90IGNvcnJlY3QiLCAiRXhpdGluZyBtZXRob2Qgd2l0aCBhIHZvaWQgcmV0dXJuIiwgdHJhY2VPdXRwdXRbMF0uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydE51bGwoInRocm93YWJsZSBzaG91bGQgYmUgbnVsbCIsIHRyYWNlT3V0cHV0WzBdLmdldFRocm93YWJsZVRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdHJhY2UgZW50cmllcyBmb3IgdHJhY2Ugd2l0aG91dCBhbiBleGNlcHRpb24iLCAyLCB0cmFjZU91dHB1dC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiVGhyZWFkIG5hbWUgaXMgaW5jb3JyZWN0IiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCksIHRyYWNlT3V0cHV0WzFdLmdldFRocmVhZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJCdW5kbGUgbmFtZSBpcyBpbmNvcnJlY3QiLCBnZXROYW1lKCksIHRyYWNlT3V0cHV0WzFdLmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm9wdGlvbi1wYXRoIHZhbHVlIGlzIGluY29ycmVjdCIsICIvZGVidWciLCB0cmFjZU91dHB1dFsxXS5nZXRPcHRpb25QYXRoKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoImNsYXNzIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgRGVidWdPcHRpb25zVGVzdENhc2UuY2xhc3MuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRDbGFzc05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QgbmFtZSB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAidGVzdFRyYWNlRmlsZTA3IiwgdHJhY2VPdXRwdXRbMV0uZ2V0TWV0aG9kTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiVHJhY2UgbWVzc2FnZSBpcyBub3QgY29ycmVjdCIsICJFeGl0aW5nIG1ldGhvZCB3aXRoIGEgdm9pZCByZXR1cm4iLCB0cmFjZU91dHB1dFsxXS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0TnVsbCgidGhyb3dhYmxlIHNob3VsZCBiZSBudWxsIiwgdHJhY2VPdXRwdXRbMV0uZ2V0VGhyb3dhYmxlVGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBkZWxldGUgdGhlIHRyYWNlIGZpbGUKLQkJdHJhY2VGaWxlLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgRGVidWdUcmFjZS50cmFjZUV4aXQob3B0aW9uLCByZXN1bHQpCi0JKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhY2VGaWxlMDgoKSB7Ci0KLQkJZmluYWwgRmlsZSB0cmFjZUZpbGUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKGdldE5hbWUoKSArICIudHJhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlUZXN0RGVidWdUcmFjZSBkZWJ1Z1RyYWNlID0gdGhpcy5jcmVhdGVEZWJ1Z1RyYWNlKHRyYWNlRmlsZSk7Ci0JCVRyYWNlRW50cnlbXSB0cmFjZU91dHB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z1RyYWNlLnRyYWNlRXhpdCgiL2RlYnVnIiwgbmV3IFN0cmluZygicmV0dXJuVmFsdWUxIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRlYnVnVHJhY2UudHJhY2VFeGl0KCIvbm90c2V0IiwgbmV3IFN0cmluZygicmV0dXJuVmFsdWUyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRlYnVnVHJhY2UudHJhY2VFeGl0KCIvZGVidWciLCBuZXcgU3RyaW5nKCJyZXR1cm5WYWx1ZTMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdHJhY2VPdXRwdXQgPSByZWFkVHJhY2VGaWxlKHRyYWNlRmlsZSk7IC8vIE5vdGU6IHRoaXMgY2FsbCB3aWxsIGFsc28gZGVsZXRlIHRoZSB0cmFjZSBmaWxlCi0JCX0gY2F0Y2ggKEludmFsaWRUcmFjZUVudHJ5IGludmFsaWRFeCkgewotCQkJZmFpbCgiRmFpbGVkICdEZWJ1Z1RyYWNlLnRyYWNlRXhpdChvcHRpb24sIHJlc3VsdCknIHRlc3QgYXMgYW4gaW52YWxpZCB0cmFjZSBlbnRyeSB3YXMgZm91bmQuICBBY3R1YWwgVmFsdWU6ICciICsgaW52YWxpZEV4LmdldEFjdHVhbFZhbHVlKCkgKyAiJy4iLCBpbnZhbGlkRXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB0cmFjZSBlbnRyaWVzIiwgMiwgdHJhY2VPdXRwdXQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRocmVhZCBuYW1lIGlzIGluY29ycmVjdCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRUaHJlYWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiQnVuZGxlIG5hbWUgaXMgaW5jb3JyZWN0IiwgZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFswXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnIiwgdHJhY2VPdXRwdXRbMF0uZ2V0T3B0aW9uUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsIERlYnVnT3B0aW9uc1Rlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMF0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibWV0aG9kIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgInRlc3RUcmFjZUZpbGUwOCIsIHRyYWNlT3V0cHV0WzBdLmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIlRyYWNlIG1lc3NhZ2UgaXMgbm90IGNvcnJlY3QiLCAiRXhpdGluZyBtZXRob2Qgd2l0aCByZXN1bHQ6IHJldHVyblZhbHVlMSIsIHRyYWNlT3V0cHV0WzBdLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROdWxsKCJ0aHJvd2FibGUgc2hvdWxkIGJlIG51bGwiLCB0cmFjZU91dHB1dFswXS5nZXRUaHJvd2FibGVUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHRyYWNlIGVudHJpZXMgZm9yIHRyYWNlIHdpdGhvdXQgYW4gZXhjZXB0aW9uIiwgMiwgdHJhY2VPdXRwdXQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRocmVhZCBuYW1lIGlzIGluY29ycmVjdCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRUaHJlYWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiQnVuZGxlIG5hbWUgaXMgaW5jb3JyZWN0IiwgZ2V0TmFtZSgpLCB0cmFjZU91dHB1dFsxXS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnIiwgdHJhY2VPdXRwdXRbMV0uZ2V0T3B0aW9uUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHZhbHVlIGlzIGluY29ycmVjdCIsIERlYnVnT3B0aW9uc1Rlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSwgdHJhY2VPdXRwdXRbMV0uZ2V0Q2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibWV0aG9kIG5hbWUgdmFsdWUgaXMgaW5jb3JyZWN0IiwgInRlc3RUcmFjZUZpbGUwOCIsIHRyYWNlT3V0cHV0WzFdLmdldE1ldGhvZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIlRyYWNlIG1lc3NhZ2UgaXMgbm90IGNvcnJlY3QiLCAiRXhpdGluZyBtZXRob2Qgd2l0aCByZXN1bHQ6IHJldHVyblZhbHVlMyIsIHRyYWNlT3V0cHV0WzFdLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROdWxsKCJ0aHJvd2FibGUgc2hvdWxkIGJlIG51bGwiLCB0cmFjZU91dHB1dFsxXS5nZXRUaHJvd2FibGVUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIGRlbGV0ZSB0aGUgdHJhY2UgZmlsZQotCQl0cmFjZUZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogdGVzdHMgRGVidWdUcmFjZS50cmFjZShvcHRpb24sIG1lc3NhZ2UpIHdoZXJlIHRoZSAnb3B0aW9uJyBhbmQgJ21lc3NhZ2UgY29udGFpbiBhICd8JyBjaGFyYWN0ZXIgKHRoZSBkZWxpbWl0ZXIpLgotCSovCi0JcHVibGljIHZvaWQgdGVzdFRyYWNlRmlsZTA5KCkgewotCi0JCWZpbmFsIEZpbGUgdHJhY2VGaWxlID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZShnZXROYW1lKCkgKyAiLnRyYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdERlYnVnVHJhY2UgZGVidWdUcmFjZSA9IHRoaXMuY3JlYXRlRGVidWdUcmFjZSh0cmFjZUZpbGUpOwotCQlkZWJ1Z09wdGlvbnMuc2V0T3B0aW9uKGdldE5hbWUoKSArICIvZGVidWd8cGF0aCIsICJ0cnVlIik7Ci0JCVRyYWNlRW50cnlbXSB0cmFjZU91dHB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z1RyYWNlLnRyYWNlKCIvZGVidWd8cGF0aCIsICJBIG1lc3NhZ2Ugd2l0aCBhIHwgY2hhcmFjdGVyLiIpOwotCQkJZGVidWdUcmFjZS50cmFjZSgiL2RlYnVnfHBhdGgiLCAifEEgbWVzc2FnZSB3aXRoIHwgbXVsdGlwbGUgfHwgY2hhcmFjdGVycy58Iik7Ci0JCQl0cmFjZU91dHB1dCA9IHJlYWRUcmFjZUZpbGUodHJhY2VGaWxlKTsgLy8gTm90ZTogdGhpcyBjYWxsIHdpbGwgYWxzbyBkZWxldGUgdGhlIHRyYWNlIGZpbGUKLQkJfSBjYXRjaCAoSW52YWxpZFRyYWNlRW50cnkgaW52YWxpZEV4KSB7Ci0JCQlmYWlsKCJGYWlsZWQgJ0RlYnVnVHJhY2UudHJhY2Uob3B0aW9uLCBtZXNzYWdlKScgdGVzdCBhcyBhbiBpbnZhbGlkIHRyYWNlIGVudHJ5IHdhcyBmb3VuZC4gIEFjdHVhbCBWYWx1ZTogJyIgKyBpbnZhbGlkRXguZ2V0QWN0dWFsVmFsdWUoKSArICInLiIsIGludmFsaWRFeCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGVudHJpZXMiLCAyLCB0cmFjZU91dHB1dC5sZW5ndGgpOwotCQlTdHJpbmcgb3B0aW9uUGF0aCA9IGRlY29kZVN0cmluZyh0cmFjZU91dHB1dFswXS5nZXRPcHRpb25QYXRoKCkpOwotCQlTdHJpbmcgbWVzc2FnZSA9IGRlY29kZVN0cmluZyh0cmFjZU91dHB1dFswXS5nZXRNZXNzYWdlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9wdGlvbi1wYXRoIHZhbHVlIGlzIGluY29ycmVjdCIsICIvZGVidWd8cGF0aCIsIG9wdGlvblBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJUcmFjZSBtZXNzYWdlIGlzIG5vdCBjb3JyZWN0IiwgIkEgbWVzc2FnZSB3aXRoIGEgfCBjaGFyYWN0ZXIuIiwgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlvcHRpb25QYXRoID0gZGVjb2RlU3RyaW5nKHRyYWNlT3V0cHV0WzFdLmdldE9wdGlvblBhdGgoKSk7Ci0JCW1lc3NhZ2UgPSBkZWNvZGVTdHJpbmcodHJhY2VPdXRwdXRbMV0uZ2V0TWVzc2FnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcHRpb24tcGF0aCB2YWx1ZSBpcyBpbmNvcnJlY3QiLCAiL2RlYnVnfHBhdGgiLCBvcHRpb25QYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiVHJhY2UgbWVzc2FnZSBpcyBub3QgY29ycmVjdCIsICJ8QSBtZXNzYWdlIHdpdGggfCBtdWx0aXBsZSB8fCBjaGFyYWN0ZXJzLnwiLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIGRlbGV0ZSB0aGUgdHJhY2UgZmlsZQotCQl0cmFjZUZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZVN0cmluZyhmaW5hbCBTdHJpbmcgaW5wdXRTdHJpbmcpIHsKLQkJaWYgKGlucHV0U3RyaW5nID09IG51bGwgfHwgaW5wdXRTdHJpbmcuaW5kZXhPZihUUkFDRV9FTEVNRU5UX0RFTElNSVRFUl9FTkNPREVEKSA8IDApCi0JCQlyZXR1cm4gaW5wdXRTdHJpbmc7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciB0ZW1wQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihpbnB1dFN0cmluZyk7Ci0JCWludCBjdXJyZW50SW5kZXggPSB0ZW1wQnVmZmVyLmluZGV4T2YoVFJBQ0VfRUxFTUVOVF9ERUxJTUlURVJfRU5DT0RFRCk7Ci0JCXdoaWxlIChjdXJyZW50SW5kZXggPj0gMCkgewotCQkJdGVtcEJ1ZmZlci5yZXBsYWNlKGN1cnJlbnRJbmRleCwgY3VycmVudEluZGV4ICsgVFJBQ0VfRUxFTUVOVF9ERUxJTUlURVJfRU5DT0RFRC5sZW5ndGgoKSwgVFJBQ0VfRUxFTUVOVF9ERUxJTUlURVIpOwotCQkJY3VycmVudEluZGV4ID0gdGVtcEJ1ZmZlci5pbmRleE9mKFRSQUNFX0VMRU1FTlRfREVMSU1JVEVSX0VOQ09ERUQpOwotCQl9Ci0JCXJldHVybiB0ZW1wQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFjZUVudHJ5W10gcmVhZFRyYWNlRmlsZShGaWxlIHRyYWNlRmlsZSkgdGhyb3dzIEludmFsaWRUcmFjZUVudHJ5IHsKLQotCQlCdWZmZXJlZFJlYWRlciB0cmFjZVJlYWRlciA9IG51bGw7Ci0JCUxpc3QgdHJhY2VFbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLnZlcmJvc2VEZWJ1ZyA9IHRydWU7IC8vIGRlZmF1bHQgaXMgdHJ1ZQotCQl0cnkgewotCQkJdHJhY2VSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0odHJhY2VGaWxlKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCQlUcmFjZUVudHJ5IGVudHJ5ID0gbnVsbDsKLQkJCXdoaWxlICgoZW50cnkgPSB0aGlzLnJlYWRNZXNzYWdlKHRyYWNlUmVhZGVyKSkgIT0gbnVsbCkgewotCQkJCXRyYWNlRW50cmllcy5hZGQoZW50cnkpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHJlYWQgdHJhY2UgZmlsZSIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlUmVhZGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl0cmFjZVJlYWRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoVHJhY2VFbnRyeVtdKSB0cmFjZUVudHJpZXMudG9BcnJheShuZXcgVHJhY2VFbnRyeVt0cmFjZUVudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFjZUVudHJ5IHJlYWRNZXNzYWdlKGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIHRyYWNlUmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludmFsaWRUcmFjZUVudHJ5IHsKLQotCQlUcmFjZUVudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCWludCBpbnB1dCA9IHRyYWNlUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGlucHV0ICE9IC0xKSB7Ci0JCQljaGFyIGlucHV0Q2hhciA9IChjaGFyKSBpbnB1dDsKLQkJCWlmIChpbnB1dENoYXIgPT0gJyMnKSB7Ci0JCQkJU3RyaW5nIGNvbW1lbnQgPSB0cmFjZVJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChjb21tZW50ICE9IG51bGwpIHsKLQkJCQkJY29tbWVudCA9IGNvbW1lbnQudHJpbSgpOwotCQkJCX0KLQkJCQlpZiAoY29tbWVudC5zdGFydHNXaXRoKCJ2ZXJib3NlIikpIHsKLQkJCQkJaW50IHNwbGl0SW5kZXggPSBjb21tZW50LmluZGV4T2YoJzonKTsKLQkJCQkJU3RyaW5nIHZlcmJvc2VWYWx1ZSA9IGNvbW1lbnQuc3Vic3RyaW5nKHNwbGl0SW5kZXggKyAxLCBjb21tZW50Lmxlbmd0aCgpKS50cmltKCk7Ci0JCQkJCXRoaXMudmVyYm9zZURlYnVnID0gQm9vbGVhbi52YWx1ZU9mKHZlcmJvc2VWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlucHV0Q2hhciA9PSBEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5UUkFDRV9FTEVNRU5UX0RFTElNSVRFUi5jaGFyQXQoMCkpIHsKLQkJCQkvLyBmaXJzdCBlbnRyeSAtIHRocmVhZCBuYW1lICh2YWxpZCBpZiB2ZXJib3NlIGRlYnVnZ2luZyBpcyBvZmYpCi0JCQkJZmluYWwgU3RyaW5nIHRocmVhZE5hbWUgPSB0aGlzLnJlYWRFbnRyeSh0cmFjZVJlYWRlcik7Ci0JCQkJaWYgKCh0aHJlYWROYW1lID09IG51bGwpIHx8ICh0aHJlYWROYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZhbGlkVHJhY2VFbnRyeSgiVGhlIHRocmVhZCBuYW1lIGluIGEgdHJhY2UgZW50cnkgaXMgbnVsbCBvciBlbXB0eSIsIHRocmVhZE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vIHNlY29uZCBlbnRyeSAtIHRpbWVzdGFtcCAodmFsaWQgaWYgdmVyYm9zZSBkZWJ1Z2dpbmcgaXMgb2ZmKQotCQkJCWZpbmFsIFN0cmluZyBkYXRlID0gdGhpcy5yZWFkRW50cnkodHJhY2VSZWFkZXIpOwotCQkJCWlmICgoZGF0ZSA9PSBudWxsKSB8fCAoZGF0ZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCQl0aHJvdyBuZXcgSW52YWxpZFRyYWNlRW50cnkoIlRoZSB0aW1lc3RhbXAgaW4gYSB0cmFjZSBlbnRyeSBpcyBudWxsIG9yIGVtcHR5IiwgZGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJbG9uZyB0aW1lc3RhbXAgPSAwOwotCQkJCXRyeSB7Ci0JCQkJCXRpbWVzdGFtcCA9IERlYnVnT3B0aW9uc1Rlc3RDYXNlLlRSQUNFX0ZJTEVfREFURV9GT1JNQVRURVIucGFyc2UoZGF0ZSkuZ2V0VGltZSgpOwotCQkJCX0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBhcnNlRXgpIHsKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRUcmFjZUVudHJ5KCJUaGUgZGF0ZSBpbiBhIHRyYWNlIGVudHJ5ICciICsgZGF0ZSArICInIGNvdWxkIG5vdCBiZSBwYXJzZWQuIiwgZGF0ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gbnVsbDsKLQkJCQlTdHJpbmcgb3B0aW9uUGF0aCA9IG51bGw7Ci0JCQkJU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0JCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBudWxsOwotCQkJCWludCBsaW5lTnVtYmVyID0gLTE7Ci0JCQkJaWYgKHRoaXMudmVyYm9zZURlYnVnKSB7Ci0JCQkJCS8vIHRoaXJkIGVudHJ5IC0gYnVuZGxlIHN5bWJvbGljIG5hbWUKLQkJCQkJc3ltYm9saWNOYW1lID0gdGhpcy5yZWFkRW50cnkodHJhY2VSZWFkZXIpOwotCQkJCQlpZiAoKHN5bWJvbGljTmFtZSA9PSBudWxsKSB8fCAoc3ltYm9saWNOYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZFRyYWNlRW50cnkoIlRoZSBidW5kbGUgc3ltYm9saWMgbmFtZSBpbiBhIHRyYWNlIGVudHJ5IGlzIG51bGwgb3IgZW1wdHkiLCBzeW1ib2xpY05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJLy8gZm91cnRoIGVudHJ5IC0gb3B0aW9uIHBhdGgKLQkJCQkJb3B0aW9uUGF0aCA9IHRoaXMucmVhZEVudHJ5KHRyYWNlUmVhZGVyKTsKLQkJCQkJaWYgKChvcHRpb25QYXRoID09IG51bGwpIHx8IChvcHRpb25QYXRoLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZFRyYWNlRW50cnkoIlRoZSBvcHRpb24tcGF0aCBpbiBhIHRyYWNlIGVudHJ5IGlzIG51bGwgb3IgZW1wdHkiLCBvcHRpb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCS8vIGZpZnRoIGVudHJ5IC0gY2xhc3MgbmFtZQotCQkJCQljbGFzc05hbWUgPSB0aGlzLnJlYWRFbnRyeSh0cmFjZVJlYWRlcik7Ci0JCQkJCWlmICgoY2xhc3NOYW1lID09IG51bGwpIHx8IChjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkVHJhY2VFbnRyeSgiVGhlIGNsYXNzIG5hbWUgaW4gYSB0cmFjZSBlbnRyeSBpcyBudWxsIG9yIGVtcHR5IiwgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCS8vIHNpeHRoIGVudHJ5IC0gbWV0aG9kIG5hbWUKLQkJCQkJbWV0aG9kTmFtZSA9IHRoaXMucmVhZEVudHJ5KHRyYWNlUmVhZGVyKTsKLQkJCQkJaWYgKChtZXRob2ROYW1lID09IG51bGwpIHx8IChtZXRob2ROYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZFRyYWNlRW50cnkoIlRoZSBtZXRob2QgbmFtZSBpbiBhIHRyYWNlIGVudHJ5IGlzIG51bGwgb3IgZW1wdHkiLCBtZXRob2ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCS8vIHNldmVudGggZW50cnkgLSBsaW5lIG51bWJlcgotCQkJCQlmaW5hbCBTdHJpbmcgbGluZU51bWJlclN0cmluZyA9IHRoaXMucmVhZEVudHJ5KHRyYWNlUmVhZGVyKTsKLQkJCQkJaWYgKChsaW5lTnVtYmVyU3RyaW5nID09IG51bGwpIHx8IChsaW5lTnVtYmVyU3RyaW5nLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZFRyYWNlRW50cnkoIlRoZSBsaW5lIG51bWJlciBpbiBhIHRyYWNlIGVudHJ5IGlzIG51bGwgb3IgZW1wdHkiLCBsaW5lTnVtYmVyU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWxpbmVOdW1iZXIgPSBJbnRlZ2VyLnZhbHVlT2YobGluZU51bWJlclN0cmluZykuaW50VmFsdWUoKTsKLQkJCQl9Ci0JCQkJLy8gZWlnaHRoIGVudHJ5IC0gbWVzc2FnZSAgKHZhbGlkIGlmIHZlcmJvc2UgZGVidWdnaW5nIGlzIG9mZikKLQkJCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHRoaXMucmVhZEVudHJ5KHRyYWNlUmVhZGVyKTsKLQkJCQkvLyByZWFkIGluIHRoZSBuZXh0IGNoYXJhY3Rlci4gaWYgaXQgaXMgXHIgb3IgXG4gdGhlbiB0aGUgdGhyb3dhYmxlIHdhcyBub3Qgc3VwcGxpZWQgICh2YWxpZCBpZiB2ZXJib3NlIGRlYnVnZ2luZyBpcyBvZmYpCi0JCQkJdHJhY2VSZWFkZXIubWFyaygxKTsKLQkJCQlpbnB1dENoYXIgPSAoY2hhcikgdHJhY2VSZWFkZXIucmVhZCgpOwotCQkJCVN0cmluZyB0aHJvd2FibGUgPSBudWxsOwotCQkJCWlmIChpbnB1dENoYXIgIT0gJ1xuJyAmJiBpbnB1dENoYXIgIT0gJ1xyJykgewotCQkJCQl0cmFjZVJlYWRlci5yZXNldCgpOwotCQkJCQkvLyBuaW50aCBlbnRyeSAob3B0aW9uYWwpIC0gdGhyb3dhYmxlCi0JCQkJCXRocm93YWJsZSA9IHRoaXMucmVhZEVudHJ5KHRyYWNlUmVhZGVyKTsKLQkJCQkJaWYgKCh0aHJvd2FibGUgPT0gbnVsbCkgfHwgKHRocm93YWJsZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCQkJdGhyb3cgbmV3IEludmFsaWRUcmFjZUVudHJ5KCJUaGUgdGhyb3dhYmxlIGluIGEgdHJhY2UgZW50cnkgaXMgbnVsbCBvciBlbXB0eSIsIHRocm93YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBjcmVhdGUgdGhlIGVudHJ5Ci0JCQkJcmVzdWx0ID0gbmV3IFRyYWNlRW50cnkodGhyZWFkTmFtZSwgdGltZXN0YW1wLCBzeW1ib2xpY05hbWUsIG9wdGlvblBhdGgsIGNsYXNzTmFtZSwgbWV0aG9kTmFtZSwgbGluZU51bWJlciwgbWVzc2FnZSwgdGhyb3dhYmxlKTsKLQkJCQlicmVhazsgLy8gbm8gcG9pbnQgaW4gcmVhZGluZyBhbnkgbW9yZSBpbmZvcm1hdGlvbiBzaW5jZSB0aGUgVHJhY2VFbnRyeSBpcyBjcmVhdGVkCi0JCQl9Ci0JCQkvLyByZWFkIHRoZSBuZXh0IGNoYXJhY3RlcgotCQkJaW5wdXQgPSB0cmFjZVJlYWRlci5yZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZWFkRW50cnkoZmluYWwgUmVhZGVyIHRyYWNlUmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWNoYXIgaW5wdXRDaGFyID0gKGNoYXIpIHRyYWNlUmVhZGVyLnJlYWQoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKGlucHV0Q2hhciAhPSBEZWJ1Z09wdGlvbnNUZXN0Q2FzZS5UUkFDRV9FTEVNRU5UX0RFTElNSVRFUi5jaGFyQXQoMCkpIHsKLQkJCWlucHV0Q2hhciA9IChjaGFyKSB0cmFjZVJlYWRlci5yZWFkKCk7Ci0JCQlpZiAoaW5wdXRDaGFyICE9IERlYnVnT3B0aW9uc1Rlc3RDYXNlLlRSQUNFX0VMRU1FTlRfREVMSU1JVEVSLmNoYXJBdCgwKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoaW5wdXRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgY2xhc3MgVHJhY2VFbnRyeSB7Ci0JCS8qKiBJZiBhIGJ1bmRsZXMgc3ltYm9saWMgbmFtZSBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgL2RlYnVnIGNhbiBiZSB1c2VkICovCi0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfT1BUSU9OX1BBVEggPSAiL2RlYnVnIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8qKgotCQkgKiBUaGUgbmFtZSBvZiB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUgY29kZQotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGhyZWFkTmFtZTsKLQotCQkvKioKLQkJICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgdHJhY2Ugb2NjdXJyZWQuCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWVzdGFtcDsKLQotCQkvKioKLQkJICogVGhlIHRyYWNlIG9wdGlvbi1wYXRoCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBvcHRpb25QYXRoOwotCi0JCS8qKgotCQkgKiBUaGUgc3ltYm9saWMgbmFtZSBvZiB0aGUgYnVuZGxlIGJlaW5nIHRyYWNlZAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lOwotCi0JCS8qKgotCQkgKiBUaGUgY2xhc3MgYmVpbmcgdHJhY2VkCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBjbGFzc05hbWU7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRob2QgYmVpbmcgdHJhY2VkCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIGxpbmUgbnVtYmVyCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIGludCBsaW5lTnVtYmVyOwotCi0JCS8qKgotCQkgKiBUaGUgdHJhY2UgbWVzc2FnZQotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLQotCQkvKioKLQkJICogVGhlIHRyYWNlIGV4Y2VwdGlvbgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGhyb3dhYmxlVGV4dDsKLQotCQlwdWJsaWMgVHJhY2VFbnRyeShmaW5hbCBTdHJpbmcgdHJhY2VUaHJlYWROYW1lLCBmaW5hbCBsb25nIHRyYWNlVGltZXN0YW1wLCBmaW5hbCBTdHJpbmcgdHJhY2VCdW5kbGVOYW1lLCBmaW5hbCBTdHJpbmcgdHJhY2VPcHRpb25QYXRoLCBmaW5hbCBTdHJpbmcgdHJhY2VDbGFzc05hbWUsIGZpbmFsIFN0cmluZyB0cmFjZU1ldGhvZE5hbWUsIGZpbmFsIGludCB0cmFjZUxpbmVOdW1iZXIsIGZpbmFsIFN0cmluZyB0cmFjZU1lc3NhZ2UpIHsKLQotCQkJdGhpcy50aHJlYWROYW1lID0gdHJhY2VUaHJlYWROYW1lOwotCQkJdGhpcy5idW5kbGVTeW1ib2xpY05hbWUgPSB0cmFjZUJ1bmRsZU5hbWU7Ci0JCQl0aGlzLm9wdGlvblBhdGggPSB0cmFjZU9wdGlvblBhdGg7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IHRyYWNlQ2xhc3NOYW1lOwotCQkJdGhpcy5tZXRob2ROYW1lID0gdHJhY2VNZXRob2ROYW1lOwotCQkJdGhpcy5saW5lTnVtYmVyID0gdHJhY2VMaW5lTnVtYmVyOwotCQkJdGhpcy5tZXNzYWdlID0gdHJhY2VNZXNzYWdlOwotCQkJdGhpcy50aW1lc3RhbXAgPSB0cmFjZVRpbWVzdGFtcDsKLQkJCXRoaXMudGhyb3dhYmxlVGV4dCA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgVHJhY2VFbnRyeShmaW5hbCBTdHJpbmcgdHJhY2VUaHJlYWROYW1lLCBmaW5hbCBsb25nIHRyYWNlVGltZXN0YW1wLCBmaW5hbCBTdHJpbmcgdHJhY2VCdW5kbGVOYW1lLCBmaW5hbCBTdHJpbmcgdHJhY2VPcHRpb25QYXRoLCBmaW5hbCBTdHJpbmcgdHJhY2VDbGFzc05hbWUsIGZpbmFsIFN0cmluZyB0cmFjZU1ldGhvZE5hbWUsIGZpbmFsIGludCB0cmFjZUxpbmVOdW1iZXIsIGZpbmFsIFN0cmluZyB0cmFjZU1lc3NhZ2UsIGZpbmFsIFN0cmluZyB0cmFjZVRocm93YWJsZSkgewotCi0JCQl0aGlzLnRocmVhZE5hbWUgPSB0cmFjZVRocmVhZE5hbWU7Ci0JCQl0aGlzLmJ1bmRsZVN5bWJvbGljTmFtZSA9IHRyYWNlQnVuZGxlTmFtZTsKLQkJCXRoaXMub3B0aW9uUGF0aCA9IHRyYWNlT3B0aW9uUGF0aDsKLQkJCXRoaXMuY2xhc3NOYW1lID0gdHJhY2VDbGFzc05hbWU7Ci0JCQl0aGlzLm1ldGhvZE5hbWUgPSB0cmFjZU1ldGhvZE5hbWU7Ci0JCQl0aGlzLmxpbmVOdW1iZXIgPSB0cmFjZUxpbmVOdW1iZXI7Ci0JCQl0aGlzLm1lc3NhZ2UgPSB0cmFjZU1lc3NhZ2U7Ci0JCQl0aGlzLnRpbWVzdGFtcCA9IHRyYWNlVGltZXN0YW1wOwotCQkJdGhpcy50aHJvd2FibGVUZXh0ID0gdHJhY2VUaHJvd2FibGU7Ci0JCX0KLQotCQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRocmVhZE5hbWUoKSB7Ci0KLQkJCXJldHVybiB0aHJlYWROYW1lOwotCQl9Ci0KLQkJcHVibGljIGZpbmFsIGxvbmcgZ2V0VGltZXN0YW1wKCkgewotCi0JCQlyZXR1cm4gdGltZXN0YW1wOwotCQl9Ci0KLQkJcHVibGljIGZpbmFsIFN0cmluZyBnZXRCdW5kbGVTeW1ib2xpY05hbWUoKSB7Ci0KLQkJCXJldHVybiBidW5kbGVTeW1ib2xpY05hbWU7Ci0JCX0KLQotCQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0KLQkJCXJldHVybiBtZXNzYWdlOwotCQl9Ci0KLQkJcHVibGljIGZpbmFsIFN0cmluZyBnZXRUaHJvd2FibGVUZXh0KCkgewotCi0JCQlyZXR1cm4gdGhyb3dhYmxlVGV4dDsKLQkJfQotCi0JCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCi0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0KLQkJcHVibGljIGZpbmFsIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgewotCi0JCQlyZXR1cm4gbWV0aG9kTmFtZTsKLQkJfQotCi0JCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0T3B0aW9uUGF0aCgpIHsKLQotCQkJcmV0dXJuIG9wdGlvblBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgZmluYWwgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0KLQkJCXJldHVybiBsaW5lTnVtYmVyOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEludmFsaWRUcmFjZUVudHJ5IGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjM4Mzc3ODcwODE3NTAzNDRMOwotCi0JCXB1YmxpYyBJbnZhbGlkVHJhY2VFbnRyeShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGFjdHVhbCkgewotCQkJc3VwZXIobWVzc2FnZSk7Ci0JCQl0aGlzLmFjdHVhbFZhbHVlID0gYWN0dWFsOwotCQl9Ci0KLQkJcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3R1YWxWYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLmFjdHVhbFZhbHVlOwotCQl9Ci0KLQkJU3RyaW5nIGFjdHVhbFZhbHVlOwotCQlTdHJpbmcgZXhwZWN0ZWRWYWx1ZTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdERlYnVnVHJhY2UgaW1wbGVtZW50cyBEZWJ1Z1RyYWNlIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWJ1Z1RyYWNlIHdyYXBwZWQ7Ci0KLQkJcHVibGljIFRlc3REZWJ1Z1RyYWNlKERlYnVnVHJhY2Ugd3JhcHBlZCkgewotCQkJdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBvcHRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCQl3cmFwcGVkLnRyYWNlKG9wdGlvbiwgbWVzc2FnZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgb3B0aW9uLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGVycm9yKSB7Ci0JCQl3cmFwcGVkLnRyYWNlKG9wdGlvbiwgbWVzc2FnZSwgZXJyb3IpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdHJhY2VEdW1wU3RhY2soU3RyaW5nIG9wdGlvbikgewotCQkJd3JhcHBlZC50cmFjZUR1bXBTdGFjayhvcHRpb24pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdHJhY2VFbnRyeShTdHJpbmcgb3B0aW9uKSB7Ci0JCQl3cmFwcGVkLnRyYWNlRW50cnkob3B0aW9uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRyYWNlRW50cnkoU3RyaW5nIG9wdGlvbiwgT2JqZWN0IG1ldGhvZEFyZ3VtZW50KSB7Ci0JCQl3cmFwcGVkLnRyYWNlRW50cnkob3B0aW9uLCBtZXRob2RBcmd1bWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0cmFjZUVudHJ5KFN0cmluZyBvcHRpb24sIE9iamVjdFtdIG1ldGhvZEFyZ3VtZW50cykgewotCQkJd3JhcHBlZC50cmFjZUVudHJ5KG9wdGlvbiwgbWV0aG9kQXJndW1lbnRzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRyYWNlRXhpdChTdHJpbmcgb3B0aW9uKSB7Ci0JCQl3cmFwcGVkLnRyYWNlRXhpdChvcHRpb24pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdHJhY2VFeGl0KFN0cmluZyBvcHRpb24sIE9iamVjdCByZXN1bHQpIHsKLQkJCXdyYXBwZWQudHJhY2VFeGl0KG9wdGlvbiwgcmVzdWx0KTsKLQkJfQotCX0KLQotCWNsYXNzIFRlc3REZWJ1Z09wdGlvbnNMaXN0ZW5lciBpbXBsZW1lbnRzIERlYnVnT3B0aW9uc0xpc3RlbmVyIHsKLQkJYm9vbGVhbiBjYWxsZWQgPSBmYWxzZTsKLQkJU3RyaW5nIGluY29ycmVjdFZhbHVlOwotCQlNYXAgY2hlY2tWYWx1ZXM7Ci0KLQkJcHVibGljIHZvaWQgb3B0aW9uc0NoYW5nZWQoRGVidWdPcHRpb25zIG9wdGlvbnMpIHsKLQkJCWNhbGxlZCA9IHRydWU7Ci0JCQlpZiAoY2hlY2tWYWx1ZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlmb3IgKEl0ZXJhdG9yIGVudHJpZXMgPSBjaGVja1ZhbHVlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGVudHJpZXMuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgZW50cmllcy5uZXh0KCk7Ci0JCQkJU3RyaW5nIGRlYnVnVmFsdWUgPSBvcHRpb25zLmdldE9wdGlvbigoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJU3RyaW5nIGVycm9yID0gIlZhbHVlIGlzIGluY29ycmVjdCBmb3Iga2V5OiAiICsgZW50cnkuZ2V0S2V5KCkgKyAiICIgKyBkZWJ1Z1ZhbHVlOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCWlmIChkZWJ1Z1ZhbHVlID09IG51bGwpIHsKLQkJCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCQkJaW5jb3JyZWN0VmFsdWUgPSBlcnJvcjsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKCFkZWJ1Z1ZhbHVlLmVxdWFscyhlbnRyeS5nZXRWYWx1ZSgpKSkgewotCQkJCQlpbmNvcnJlY3RWYWx1ZSA9IGVycm9yOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ290Q2FsbGVkKCkgewotCQkJcmV0dXJuIGNhbGxlZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJY2FsbGVkID0gZmFsc2U7Ci0JCQljaGVja1ZhbHVlcyA9IG51bGw7Ci0JCQlpbmNvcnJlY3RWYWx1ZSA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDaGVja1ZhbHVlcyhNYXAgY2hlY2tWYWx1ZXMpIHsKLQkJCXRoaXMuY2hlY2tWYWx1ZXMgPSBjaGVja1ZhbHVlczsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SW5jb3JyZWN0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gaW5jb3JyZWN0VmFsdWU7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2VjbGlwc2VhZGFwdG9yL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvZWNsaXBzZWFkYXB0b3IvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyODQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvZWNsaXBzZWFkYXB0b3IvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5lY2xpcHNlYWRhcHRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRW52aXJvbm1lbnRJbmZvVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChGaWxlUGF0aFRlc3Quc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvZWNsaXBzZWFkYXB0b3IvRW52aXJvbm1lbnRJbmZvVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2VjbGlwc2VhZGFwdG9yL0Vudmlyb25tZW50SW5mb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2YmQ3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvZWNsaXBzZWFkYXB0b3IvRW52aXJvbm1lbnRJbmZvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmVjbGlwc2VhZGFwdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmludGVybmFsLmFkYXB0b3IuRWNsaXBzZUVudmlyb25tZW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRJbmZvVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRW52aXJvbm1lbnRJbmZvVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEVudmlyb25tZW50SW5mb1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFJWCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBDb25zdGFudHMuT1NfQUlYLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoIkFJWCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBDb25zdGFudHMuT1NfQUlYLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoImFpeCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCBDb25zdGFudHMuT1NfVU5LTk9XTiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJhaXggeHl6IikpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIENvbnN0YW50cy5XU19NT1RJRiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc1dTKENvbnN0YW50cy5PU19BSVgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SFBVWCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBDb25zdGFudHMuT1NfSFBVWCwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJIUC1VWCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBDb25zdGFudHMuT1NfSFBVWCwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJocC11eCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCBDb25zdGFudHMuT1NfVU5LTk9XTiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJocC11eCB4eXoiKSk7Ci0JCWFzc2VydEVxdWFscygiMi4wIiwgQ29uc3RhbnRzLldTX01PVElGLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzV1MoQ29uc3RhbnRzLk9TX0hQVVgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGludXgoKSB7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgQ29uc3RhbnRzLk9TX0xJTlVYLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoIkxpbnV4IikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIENvbnN0YW50cy5PU19MSU5VWCwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJsaW51eCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCBDb25zdGFudHMuT1NfVU5LTk9XTiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJsaW51eCB4eXoiKSk7Ci0JCWFzc2VydEVxdWFscygiMi4wIiwgQ29uc3RhbnRzLldTX0dUSywgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc1dTKENvbnN0YW50cy5PU19MSU5VWCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWNPU1goKSB7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgQ29uc3RhbnRzLk9TX01BQ09TWCwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJNYWMgT1MiKSk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgQ29uc3RhbnRzLk9TX01BQ09TWCwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJNYWMgT1MgWCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCBDb25zdGFudHMuT1NfTUFDT1NYLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoIm1hYyBvcyB4IikpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIENvbnN0YW50cy5XU19DT0NPQSwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc1dTKENvbnN0YW50cy5PU19NQUNPU1gpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UU5YKCkgewotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIENvbnN0YW50cy5PU19RTlgsIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NPUygiUU5YIikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIENvbnN0YW50cy5PU19RTlgsIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NPUygicW54IikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMiIsIENvbnN0YW50cy5PU19VTktOT1dOLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoInFueCB4eXoiKSk7Ci0JCWFzc2VydEVxdWFscygiMi4wIiwgQ29uc3RhbnRzLldTX1BIT1RPTiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc1dTKENvbnN0YW50cy5PU19RTlgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29sYXJpcygpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBDb25zdGFudHMuT1NfVU5LTk9XTiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJTb2xhcmlzIikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIENvbnN0YW50cy5PU19VTktOT1dOLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoInNvbGFyaXMiKSk7Ci0JCWFzc2VydEVxdWFscygiMS4yIiwgQ29uc3RhbnRzLk9TX1NPTEFSSVMsIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NPUygiU3VuT1MiKSk7Ci0JCWFzc2VydEVxdWFscygiMS4zIiwgQ29uc3RhbnRzLk9TX1NPTEFSSVMsIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NPUygic3Vub3MiKSk7Ci0JCWFzc2VydEVxdWFscygiMS40IiwgQ29uc3RhbnRzLk9TX1VOS05PV04sIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NPUygic29sYXJpcyB4eXoiKSk7Ci0JCWFzc2VydEVxdWFscygiMS40IiwgQ29uc3RhbnRzLk9TX1VOS05PV04sIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NPUygic3Vub3MgeHl6IikpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIENvbnN0YW50cy5XU19HVEssIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NXUyhDb25zdGFudHMuT1NfU09MQVJJUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXaW5kb3dzKCkgewotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIENvbnN0YW50cy5PU19XSU4zMiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJXaW5kb3dzIFhQIikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIENvbnN0YW50cy5PU19XSU4zMiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJXaW5kb3dzIDk4IikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMiIsIENvbnN0YW50cy5PU19XSU4zMiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJXaW5kb3dzIDIwMDAiKSk7Ci0JCWFzc2VydEVxdWFscygiMS4zIiwgQ29uc3RhbnRzLk9TX1dJTjMyLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoIldpbmRvd3MgTlQiKSk7Ci0JCWFzc2VydEVxdWFscygiMS40IiwgQ29uc3RhbnRzLk9TX1dJTjMyLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoIldpbmRvd3MgOTUiKSk7Ci0JCWFzc2VydEVxdWFscygiMi4wIiwgQ29uc3RhbnRzLldTX1dJTjMyLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzV1MoQ29uc3RhbnRzLk9TX1dJTjMyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElTZXJpZXMoKSB7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgQ29uc3RhbnRzLk9TX09TNDAwLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoIk9TLzQwMCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBDb25zdGFudHMuT1NfT1M0MDAsIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NPUygib3MvNDAwIikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMiIsIENvbnN0YW50cy5PU19VTktOT1dOLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoIk9TLzQwMCB4eXoiKSk7Ci0JCWFzc2VydEVxdWFscygiMi4wIiwgQ29uc3RhbnRzLldTX1VOS05PV04sIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NXUyhDb25zdGFudHMuT1NfT1M0MDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WlNlcmllcygpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBDb25zdGFudHMuT1NfT1MzOTAsIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NPUygiT1MvMzkwIikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIENvbnN0YW50cy5PU19PUzM5MCwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJvcy8zOTAiKSk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgQ29uc3RhbnRzLk9TX1pPUywgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJ6L29zIikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIENvbnN0YW50cy5PU19aT1MsIEVjbGlwc2VFbnZpcm9ubWVudEluZm8uZ3Vlc3NPUygiWi9PUyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCBDb25zdGFudHMuT1NfVU5LTk9XTiwgRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKCJPUy80MDAgeHl6IikpOwotCQlhc3NlcnRFcXVhbHMoIjEuMiIsIENvbnN0YW50cy5PU19VTktOT1dOLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzT1MoInovb3MgeHl6IikpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIENvbnN0YW50cy5XU19VTktOT1dOLCBFY2xpcHNlRW52aXJvbm1lbnRJbmZvLmd1ZXNzV1MoQ29uc3RhbnRzLk9TX09TMzkwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2VjbGlwc2VhZGFwdG9yL0ZpbGVQYXRoVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2VjbGlwc2VhZGFwdG9yL0ZpbGVQYXRoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDNlYWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9lY2xpcHNlYWRhcHRvci9GaWxlUGF0aFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5lY2xpcHNlYWRhcHRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmFkYXB0b3IuRmlsZVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdDsKLQotcHVibGljIGNsYXNzIEZpbGVQYXRoVGVzdCBleHRlbmRzIE9TR2lUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRmlsZVBhdGhUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZVBhdGhUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xvbk9uUGF0aCgpIHsKLQkJRmlsZVBhdGggcGF0aCA9IG5ldyBGaWxlUGF0aCgiL2M6Yi9hIik7Ci0JCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5PU19XSU4zMikpIHsKLQkJCS8vIFdpbmRvd3Mtc3BlY2lmaWMgdGVzdGluZwotCQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgIXBhdGguaXNBYnNvbHV0ZSgpKTsKLQkJCWFzc2VydEVxdWFscygiMi4wIiwgImM6IiwgcGF0aC5nZXREZXZpY2UoKSk7Ci0JCQlTdHJpbmdbXSBzZWdtZW50cyA9IHBhdGguZ2V0U2VnbWVudHMoKTsKLQkJCWFzc2VydEVxdWFscygiMy4wIiwgMiwgc2VnbWVudHMubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygiMy4xIiwgImIiLCBzZWdtZW50c1swXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIjMuMiIsICJhIiwgc2VnbWVudHNbMV0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIHRoaXMgcnVucyBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMJCQotCQlhc3NlcnRUcnVlKCIxLjAiLCBwYXRoLmlzQWJzb2x1dGUoKSk7Ci0JCWFzc2VydE51bGwoIjIuMCIsIHBhdGguZ2V0RGV2aWNlKCkpOwotCQlTdHJpbmdbXSBzZWdtZW50cyA9IHBhdGguZ2V0U2VnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjAiLCAyLCBzZWdtZW50cy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjMuMSIsICJjOmIiLCBzZWdtZW50c1swXSk7Ci0JCWFzc2VydEVxdWFscygiMy4yIiwgImEiLCBzZWdtZW50c1sxXSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvZXZlbnRtZ3IvRXZlbnRNYW5hZ2VyVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9ldmVudG1nci9FdmVudE1hbmFnZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDM5MDYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9ldmVudG1nci9FdmVudE1hbmFnZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmV2ZW50bWdyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuZXZlbnRtZ3IuQ29weU9uV3JpdGVJZGVudGl0eU1hcDsKLQotcHVibGljIGNsYXNzIEV2ZW50TWFuYWdlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRXZlbnRNYW5hZ2VyVGVzdHMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5T25Xcml0ZUlkZW50aXR5TWFwKCkgewotCQlPYmplY3QgbDEgPSBuZXcgT2JqZWN0KCk7Ci0JCU9iamVjdCBsMiA9IG5ldyBPYmplY3QoKTsKLQkJT2JqZWN0IGwzID0gbmV3IE9iamVjdCgpOwotCQlPYmplY3QgbDQgPSBuZXcgT2JqZWN0KCk7Ci0JCU9iamVjdCBjMSA9IG5ldyBPYmplY3QoKTsKLQkJT2JqZWN0IGMyID0gbmV3IE9iamVjdCgpOwotCQlPYmplY3QgYzMgPSBuZXcgT2JqZWN0KCk7Ci0JCU9iamVjdCBjNCA9IG5ldyBPYmplY3QoKTsKLQotCQlDb3B5T25Xcml0ZUlkZW50aXR5TWFwIGVsMSA9IG5ldyBDb3B5T25Xcml0ZUlkZW50aXR5TWFwKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgibm90IGVtcHR5IiwgZWwxLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMCwgZWwxLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnROdWxsKCJub24gbnVsbCIsIGVsMS5wdXQobDEsIGMxKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoImVtcHR5IiwgZWwxLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZWwxLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnROdWxsKCJub24gbnVsbCIsIGVsMS5wdXQobDIsIGMyKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoImVtcHR5IiwgZWwxLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgZWwxLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnROdWxsKCJub24gbnVsbCIsIGVsMS5wdXQobDMsIGMzKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoImVtcHR5IiwgZWwxLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMywgZWwxLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnROdWxsKCJub24gbnVsbCIsIGVsMS5wdXQobDQsIGM0KSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoImVtcHR5IiwgZWwxLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgZWwxLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzEsIGVsMS5nZXQobDEpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzIsIGVsMS5nZXQobDIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzMsIGVsMS5nZXQobDMpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzQsIGVsMS5nZXQobDQpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNvcHlPbldyaXRlSWRlbnRpdHlNYXAgZWwyID0gbmV3IENvcHlPbldyaXRlSWRlbnRpdHlNYXAoZWwxKTsKLQkJYXNzZXJ0RmFsc2UoImVtcHR5IiwgZWwyLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgZWwyLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzEsIGVsMi5nZXQobDEpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzIsIGVsMi5nZXQobDIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzMsIGVsMi5nZXQobDMpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzQsIGVsMi5nZXQobDQpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjMiwgZWwxLnJlbW92ZShsMikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCJlbXB0eSIsIGVsMS5pc0VtcHR5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDMsIGVsMS5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibm90IG51bGwiLCBudWxsLCBlbDEucmVtb3ZlKGwyKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoImVtcHR5IiwgZWwxLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMywgZWwxLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB2YWx1ZSIsIGM0LCBlbDEucmVtb3ZlKGw0KSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoImVtcHR5IiwgZWwxLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgZWwxLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJub3QgbnVsbCIsIG51bGwsIGVsMS5yZW1vdmUobDQpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiZW1wdHkiLCBlbDEuaXNFbXB0eSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBlbDEuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzEsIGVsMS5nZXQobDEpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzMsIGVsMS5nZXQobDMpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEZhbHNlKCJlbXB0eSIsIGVsMi5pc0VtcHR5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGVsMi5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjMSwgZWwyLmdldChsMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjMiwgZWwyLmdldChsMikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjMywgZWwyLmdldChsMykpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjNCwgZWwyLmdldChsNCkpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB2YWx1ZSIsIGMxLCBlbDIucmVtb3ZlKGwxKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB2YWx1ZSIsIGMzLCBlbDIucmVtb3ZlKGwzKSk7IC8vJE5PTi1OTFMtMSQKLQotCQllbDEucHV0QWxsKGVsMik7Ci0JCWFzc2VydEZhbHNlKCJlbXB0eSIsIGVsMS5pc0VtcHR5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGVsMS5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjMSwgZWwxLmdldChsMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjMiwgZWwxLmdldChsMikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjMywgZWwxLmdldChsMykpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjNCwgZWwxLmdldChsNCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCJlbXB0eSIsIGVsMi5pc0VtcHR5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIGVsMi5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjMiwgZWwyLmdldChsMikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjNCwgZWwyLmdldChsNCkpOyAvLyROT04tTkxTLTEkCi0KLQkJZWwyLnB1dEFsbChlbDEpOwotCQlhc3NlcnRGYWxzZSgiZW1wdHkiLCBlbDEuaXNFbXB0eSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA0LCBlbDEuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzEsIGVsMS5nZXQobDEpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzIsIGVsMS5nZXQobDIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzMsIGVsMS5nZXQobDMpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzQsIGVsMS5nZXQobDQpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiZW1wdHkiLCBlbDIuaXNFbXB0eSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA0LCBlbDIuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzEsIGVsMi5nZXQobDEpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzIsIGVsMi5nZXQobDIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzMsIGVsMi5nZXQobDMpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzQsIGVsMi5nZXQobDQpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVsMi5jbGVhcigpOwotCQlhc3NlcnRUcnVlKCJub3QgZW1wdHkiLCBlbDIuaXNFbXB0eSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAwLCBlbDIuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydE51bGwoIm5vbiBudWxsIiwgZWwyLnB1dChsMSwgYzEpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzEsIGVsMi5wdXQobDEsIGMzKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB2YWx1ZSIsIGMzLCBlbDIuZ2V0KGwxKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibWlzc2VkIGtleSIsIGVsMi5jb250YWluc0tleShsMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm1pc3NlZCB2YWx1ZSIsIGVsMi5jb250YWluc1ZhbHVlKGMzKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoImludmFsaWQga2V5IiwgZWwyLmNvbnRhaW5zS2V5KGwyKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoImludmFsaWQgdmFsdWUiLCBlbDIuY29udGFpbnNWYWx1ZShjMSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZWwyLmNsZWFyKCk7Ci0JCU1hcCBzb3VyY2UgPSBuZXcgSGFzaE1hcCgpOwotCQlzb3VyY2UucHV0KGwxLCBjMSk7Ci0JCXNvdXJjZS5wdXQobDQsIGM0KTsKLQkJZWwyLnB1dEFsbChzb3VyY2UpOwotCQlhc3NlcnRGYWxzZSgiZW1wdHkiLCBlbDIuaXNFbXB0eSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBlbDIuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzEsIGVsMi5nZXQobDEpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzQsIGVsMi5nZXQobDQpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVsMi5jbGVhcigpOwotCQlTZXQgazEgPSBlbDEua2V5U2V0KCk7Ci0JCVNldCBrMiA9IGVsMi5rZXlTZXQoKTsKLQkJQ29sbGVjdGlvbiB2MSA9IGVsMS52YWx1ZXMoKTsKLQkJQ29sbGVjdGlvbiB2MiA9IGVsMi52YWx1ZXMoKTsKLQkJU2V0IGUyID0gZWwyLmVudHJ5U2V0KCk7Ci0JCVNldCBlMSA9IGVsMS5lbnRyeVNldCgpOwotCQllbDEuY2xlYXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiZW1wdHkiLCBrMS5pc0VtcHR5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGsxLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibWlzc2VkIGtleSIsIGsxLmNvbnRhaW5zKGwxKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibWlzc2VkIGtleSIsIGsxLmNvbnRhaW5zKGwyKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibWlzc2VkIGtleSIsIGsxLmNvbnRhaW5zKGwzKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibWlzc2VkIGtleSIsIGsxLmNvbnRhaW5zKGw0KSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibWlzc2VkIGtleSIsIGsxLmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtsMSwgbDIsIGwzLCBsNH0pKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpMSA9IGsxLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgbmV4dCIsIGkxLmhhc05leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBrZXkiLCBsMSwgaTEubmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaTEucmVtb3ZlKCk7Ci0JCQlmYWlsKCJyZW1vdmUgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBuZXh0IiwgaTEuaGFzTmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIGtleSIsIGwzLCBpMS5uZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpMS5yZW1vdmUoKTsKLQkJCWZhaWwoInJlbW92ZSBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIG5leHQiLCBpMS5oYXNOZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3Jvbmcga2V5IiwgbDIsIGkxLm5leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWkxLnJlbW92ZSgpOwotCQkJZmFpbCgicmVtb3ZlIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgbmV4dCIsIGkxLmhhc05leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBrZXkiLCBsNCwgaTEubmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaTEucmVtb3ZlKCk7Ci0JCQlmYWlsKCJyZW1vdmUgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJYXNzZXJ0RmFsc2UoImV4dHJhIG5leHQiLCBpMS5oYXNOZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpMS5uZXh0KCk7Ci0JCQlmYWlsKCJuZXh0IGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQotCQlhc3NlcnRUcnVlKCJub3QgZW1wdHkiLCBrMi5pc0VtcHR5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDAsIGsyLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpMiA9IGsyLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKCJleHRyYSBuZXh0IiwgaTIuaGFzTmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaTIubmV4dCgpOwotCQkJZmFpbCgibmV4dCBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWsyLmFkZChsMSk7Ci0JCQlmYWlsKCJhZGQgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWsyLmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7bDEsIGwyfSkpOwotCQkJZmFpbCgiYWRkQWxsIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlrMS5jbGVhcigpOwotCQkJZmFpbCgiY2xlYXIgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWsxLnJlbW92ZShsMSk7Ci0JCQlmYWlsKCJyZW1vdmUgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWsxLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7bDEsIGwyfSkpOwotCQkJZmFpbCgicmVtb3ZlQWxsIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlrMS5yZXRhaW5BbGwoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10ge2wxLCBsMn0pKTsKLQkJCWZhaWwoInJldGFpbkFsbCBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCi0JCWFzc2VydFRydWUoImFycmF5IHVuZXF1YWwiLCBBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7bDEsIGwzLCBsMiwgbDR9LCBrMS50b0FycmF5KCkpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJhcnJheSB1bmVxdWFsIiwgQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10ge2wxLCBsMywgbDIsIGw0fSwgazEudG9BcnJheShuZXcgT2JqZWN0WzRdKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RmFsc2UoImVtcHR5IiwgdjEuaXNFbXB0eSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA0LCB2MS5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm1pc3NlZCBrZXkiLCB2MS5jb250YWlucyhjMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm1pc3NlZCBrZXkiLCB2MS5jb250YWlucyhjMikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm1pc3NlZCBrZXkiLCB2MS5jb250YWlucyhjMykpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm1pc3NlZCBrZXkiLCB2MS5jb250YWlucyhjNCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm1pc3NlZCBrZXkiLCB2MS5jb250YWluc0FsbChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7YzEsIGMyLCBjMywgYzR9KSkpOyAvLyROT04tTkxTLTEkCi0KLQkJSXRlcmF0b3IgaTMgPSB2MS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIG5leHQiLCBpMy5oYXNOZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3Jvbmcga2V5IiwgYzEsIGkzLm5leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWkzLnJlbW92ZSgpOwotCQkJZmFpbCgicmVtb3ZlIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgbmV4dCIsIGkzLmhhc05leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBrZXkiLCBjMywgaTMubmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaTMucmVtb3ZlKCk7Ci0JCQlmYWlsKCJyZW1vdmUgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBuZXh0IiwgaTMuaGFzTmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIGtleSIsIGMyLCBpMy5uZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpMy5yZW1vdmUoKTsKLQkJCWZhaWwoInJlbW92ZSBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIG5leHQiLCBpMy5oYXNOZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3Jvbmcga2V5IiwgYzQsIGkzLm5leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWkzLnJlbW92ZSgpOwotCQkJZmFpbCgicmVtb3ZlIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCWFzc2VydEZhbHNlKCJleHRyYSBuZXh0IiwgaTMuaGFzTmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaTMubmV4dCgpOwotCQkJZmFpbCgibmV4dCBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgibm90IGVtcHR5IiwgdjIuaXNFbXB0eSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAwLCB2Mi5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJSXRlcmF0b3IgaTQgPSB2Mi5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSgiZXh0cmEgbmV4dCIsIGk0Lmhhc05leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWk0Lm5leHQoKTsKLQkJCWZhaWwoIm5leHQgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCi0JCXRyeSB7Ci0JCQl2Mi5hZGQoYzEpOwotCQkJZmFpbCgiYWRkIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQl2Mi5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10ge2MxLCBjMn0pKTsKLQkJCWZhaWwoImFkZEFsbCBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQl0cnkgewotCQkJdjEuY2xlYXIoKTsKLQkJCWZhaWwoImNsZWFyIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQl2MS5yZW1vdmUoYzEpOwotCQkJZmFpbCgicmVtb3ZlIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQl2MS5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10ge2MxLCBjMn0pKTsKLQkJCWZhaWwoInJlbW92ZUFsbCBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQl0cnkgewotCQkJdjEucmV0YWluQWxsKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtjMSwgYzJ9KSk7Ci0JCQlmYWlsKCJyZXRhaW5BbGwgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQotCQlhc3NlcnRUcnVlKCJhcnJheSB1bmVxdWFsIiwgQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10ge2MxLCBjMywgYzIsIGM0fSwgdjEudG9BcnJheSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiYXJyYXkgdW5lcXVhbCIsIEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHtjMSwgYzMsIGMyLCBjNH0sIHYxLnRvQXJyYXkobmV3IE9iamVjdFs0XSkpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEZhbHNlKCJlbXB0eSIsIGUxLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgZTEuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUl0ZXJhdG9yIGk1ID0gZTEuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBuZXh0IiwgaTUuaGFzTmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQlNYXAuRW50cnkgbWUxID0gKE1hcC5FbnRyeSkgaTUubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGtleSIsIGwxLCBtZTEuZ2V0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjMSwgbWUxLmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpNS5yZW1vdmUoKTsKLQkJCWZhaWwoInJlbW92ZSBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQl0cnkgewotCQkJbWUxLnNldFZhbHVlKGMyKTsKLQkJCWZhaWwoInJlbW92ZSBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIG5leHQiLCBpNS5oYXNOZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCU1hcC5FbnRyeSBtZTMgPSAoTWFwLkVudHJ5KSBpNS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcga2V5IiwgbDMsIG1lMy5nZXRLZXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB2YWx1ZSIsIGMzLCBtZTMuZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWk1LnJlbW92ZSgpOwotCQkJZmFpbCgicmVtb3ZlIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQltZTMuc2V0VmFsdWUoYzIpOwotCQkJZmFpbCgicmVtb3ZlIGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgbmV4dCIsIGk1Lmhhc05leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTWFwLkVudHJ5IG1lMiA9IChNYXAuRW50cnkpIGk1Lm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBrZXkiLCBsMiwgbWUyLmdldEtleSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHZhbHVlIiwgYzIsIG1lMi5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaTUucmVtb3ZlKCk7Ci0JCQlmYWlsKCJyZW1vdmUgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCW1lMi5zZXRWYWx1ZShjMyk7Ci0JCQlmYWlsKCJyZW1vdmUgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBuZXh0IiwgaTUuaGFzTmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQlNYXAuRW50cnkgbWU0ID0gKE1hcC5FbnRyeSkgaTUubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGtleSIsIGw0LCBtZTQuZ2V0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjNCwgbWU0LmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpNS5yZW1vdmUoKTsKLQkJCWZhaWwoInJlbW92ZSBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQl0cnkgewotCQkJbWU0LnNldFZhbHVlKGMyKTsKLQkJCWZhaWwoInJlbW92ZSBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQlhc3NlcnRGYWxzZSgiZXh0cmEgbmV4dCIsIGk1Lmhhc05leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWkxLm5leHQoKTsKLQkJCWZhaWwoIm5leHQgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCi0JCWFzc2VydFRydWUoIm5vdCBlbXB0eSIsIGUyLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMCwgZTIuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUl0ZXJhdG9yIGk2ID0gZTIuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoImV4dHJhIG5leHQiLCBpNi5oYXNOZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpNi5uZXh0KCk7Ci0JCQlmYWlsKCJuZXh0IGRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQotCQl0cnkgewotCQkJZTIuYWRkKG1lMSk7Ci0JCQlmYWlsKCJhZGQgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWUyLmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBNYXAuRW50cnlbXSB7bWUyLCBtZTR9KSk7Ci0JCQlmYWlsKCJhZGRBbGwgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWUxLmNsZWFyKCk7Ci0JCQlmYWlsKCJjbGVhciBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCQl0cnkgewotCQkJZTEucmVtb3ZlKG1lMSk7Ci0JCQlmYWlsKCJyZW1vdmUgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWUxLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KG5ldyBNYXAuRW50cnlbXSB7bWUxLCBtZTJ9KSk7Ci0JCQlmYWlsKCJyZW1vdmVBbGwgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWUxLnJldGFpbkFsbChBcnJheXMuYXNMaXN0KG5ldyBNYXAuRW50cnlbXSB7bWUxLCBtZTJ9KSk7Ci0JCQlmYWlsKCJyZXRhaW5BbGwgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQotCQlhc3NlcnRUcnVlKCJhcnJheSB1bmVxdWFsIiwgQXJyYXlzLmVxdWFscyhuZXcgTWFwLkVudHJ5W10ge21lMSwgbWUzLCBtZTIsIG1lNH0sIGUxLnRvQXJyYXkoKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImFycmF5IHVuZXF1YWwiLCBBcnJheXMuZXF1YWxzKG5ldyBNYXAuRW50cnlbXSB7bWUxLCBtZTMsIG1lMiwgbWU0fSwgZTEudG9BcnJheShuZXcgTWFwLkVudHJ5WzRdKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZWwyLmNsZWFyKCk7Ci0JCWVsMi5wdXRBbGwobmV3IE9iamVjdFtdIHtsMSwgbDN9KTsKLQkJYXNzZXJ0RmFsc2UoImVtcHR5IiwgZWwyLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgZWwyLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibWlzc2VkIGtleSIsIGVsMi5jb250YWluc0tleShsMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm1pc3NlZCBrZXkiLCBlbDIuY29udGFpbnNLZXkobDMpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJ2YWx1ZSBub3QgbnVsbCIsIGVsMi5nZXQobDEpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJ2YWx1ZSBub3QgbnVsbCIsIGVsMi5nZXQobDMpKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2ZpbHRlci9CdW5kbGVDb250ZXh0RmlsdGVyVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9maWx0ZXIvQnVuZGxlQ29udGV4dEZpbHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NWI4MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2ZpbHRlci9CdW5kbGVDb250ZXh0RmlsdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmZpbHRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdHNBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkZpbHRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuSW52YWxpZFN5bnRheEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEJ1bmRsZUNvbnRleHRGaWx0ZXJUZXN0cyBleHRlbmRzIEZpbHRlclRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEJ1bmRsZUNvbnRleHRGaWx0ZXJUZXN0cy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEZpbHRlciBjcmVhdGVGaWx0ZXIoU3RyaW5nIGZpbHRlclN0cmluZykgdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb24gewotCQlyZXR1cm4gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5jcmVhdGVGaWx0ZXIoZmlsdGVyU3RyaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvZmlsdGVyL0ZpbHRlclRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvZmlsdGVyL0ZpbHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWQ3YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2ZpbHRlci9GaWx0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmZpbHRlcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEZpbHRlclRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQnVuZGxlQ29udGV4dEZpbHRlclRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEZyYW1ld29ya1V0aWxGaWx0ZXJUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCS8qKgotCSAqIEZhaWwgd2l0aCBjYXVzZSB0LgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIEZhaWx1cmUgbWVzc2FnZS4KLQkgKiBAcGFyYW0gdCBDYXVzZSBvZiB0aGUgZmFpbHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKLQkJQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSA9IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcihtZXNzYWdlICsgIjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJZS5pbml0Q2F1c2UodCk7Ci0JCXRocm93IGU7Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGludCBJU1RSVUUgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgSVNGQUxTRSA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBJU0lMTEVHQUwgPSAzOwotCi0JcHVibGljIGFic3RyYWN0IEZpbHRlciBjcmVhdGVGaWx0ZXIoU3RyaW5nIGZpbHRlclN0cmluZykgdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb247Ci0KLQlwcml2YXRlIERpY3Rpb25hcnkgZ2V0UHJvcGVydGllcygpIHsKLQkJRGljdGlvbmFyeSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KCJyb29tIiwgImJlZHJvb20iKTsKLQkJcHJvcHMucHV0KCJjaGFubmVsIiwgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcigzNCksICIxMDEifSk7Ci0JCXByb3BzLnB1dCgic3RhdHVzIiwgIihvblxcKSoiKTsKLQkJTGlzdCB2ZWMgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJdmVjLmFkZChuZXcgTG9uZygxNTApKTsKLQkJdmVjLmFkZCgiMTAwIik7Ci0JCXByb3BzLnB1dCgibWF4IHJlY29yZCB0aW1lIiwgdmVjKTsKLQkJcHJvcHMucHV0KCJjYW5yZWNvcmQiLCAidHJ1ZSh4KSIpOwotCQlwcm9wcy5wdXQoInNob3J0dmFsdWUiLCBuZXcgU2hvcnQoKHNob3J0KSAxMDAwKSk7Ci0JCXByb3BzLnB1dCgiaW50dmFsdWUiLCBuZXcgSW50ZWdlcigxMDAwMDApKTsKLQkJcHJvcHMucHV0KCJsb25ndmFsdWUiLCBuZXcgTG9uZygxMDAwMDAwMDAwMEwpKTsKLQkJcHJvcHMucHV0KCJieXRldmFsdWUiLCBuZXcgQnl0ZSgoYnl0ZSkgMTApKTsKLQkJcHJvcHMucHV0KCJmbG9hdHZhbHVlIiwgbmV3IEZsb2F0KDEuMDEpKTsKLQkJcHJvcHMucHV0KCJkb3VibGV2YWx1ZSIsIG5ldyBEb3VibGUoMi4wMSkpOwotCQlwcm9wcy5wdXQoImNoYXJ2YWx1ZSIsIG5ldyBDaGFyYWN0ZXIoJ0EnKSk7Ci0JCXByb3BzLnB1dCgiYm9vbGVhbnZhbHVlIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQlwcm9wcy5wdXQoIndlaXJkdmFsdWUiLCBuZXcgSGFzaHRhYmxlKCkpOwotCQlwcm9wcy5wdXQoInByaW1pbnRhcnJheXZhbHVlIiwgbmV3IGludFtdIHsxLCAyLCAzfSk7Ci0JCXByb3BzLnB1dCgicHJpbWxvbmdhcnJheXZhbHVlIiwgbmV3IGxvbmdbXSB7MSwgMiwgM30pOwotCQlwcm9wcy5wdXQoInByaW1ieXRlYXJyYXl2YWx1ZSIsIG5ldyBieXRlW10geyhieXRlKSAxLCAoYnl0ZSkgMiwgKGJ5dGUpIDN9KTsKLQkJcHJvcHMucHV0KCJwcmltc2hvcnRhcnJheXZhbHVlIiwgbmV3IHNob3J0W10geyhzaG9ydCkgMSwgKHNob3J0KSAyLCAoc2hvcnQpIDN9KTsKLQkJcHJvcHMucHV0KCJwcmltZmxvYXRhcnJheXZhbHVlIiwgbmV3IGZsb2F0W10geyhmbG9hdCkgMS4xLCAoZmxvYXQpIDIuMiwgKGZsb2F0KSAzLjN9KTsKLQkJcHJvcHMucHV0KCJwcmltZG91YmxlYXJyYXl2YWx1ZSIsIG5ldyBkb3VibGVbXSB7MS4xLCAyLjIsIDMuM30pOwotCQlwcm9wcy5wdXQoInByaW1jaGFyYXJyYXl2YWx1ZSIsIG5ldyBjaGFyW10geydBJywgJ2InLCAnQycsICdkJ30pOwotCQlwcm9wcy5wdXQoInByaW1ib29sZWFuYXJyYXl2YWx1ZSIsIG5ldyBib29sZWFuW10ge2ZhbHNlfSk7Ci0JCXByb3BzLnB1dCgiYmlnaW50dmFsdWUiLCBuZXcgQmlnSW50ZWdlcigiNDEyMzQ1NiIpKTsKLQkJcHJvcHMucHV0KCJiaWdkZWN2YWx1ZSIsIG5ldyBCaWdEZWNpbWFsKCI0LjEyMzQ1NiIpKTsKLQkJcHJvcHMucHV0KCIqIiwgImZvbyIpOwotCQlwcm9wcy5wdXQoIiEgIGFiIiwgImIiKTsKLQkJcHJvcHMucHV0KCJ8ICAgYWIiLCAiYiIpOwotCQlwcm9wcy5wdXQoIiYgICAgYWIiLCAiYiIpOwotCQlwcm9wcy5wdXQoIiEiLCAiYyIpOwotCQlwcm9wcy5wdXQoInwiLCAiYyIpOwotCQlwcm9wcy5wdXQoIiYiLCAiYyIpOwotCQlwcm9wcy5wdXQoImVtcHR5IiwgIiIpOwotCQlwcm9wcy5wdXQoInNwYWNlIiwgbmV3IENoYXJhY3RlcignICcpKTsKLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIoKSB7Ci0JCURpY3Rpb25hcnkgcHJvcHMgPSBnZXRQcm9wZXJ0aWVzKCk7Ci0JCXRlc3RGaWx0ZXIoIihyb29tPSopIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihyb29tPWJlZHJvb20pIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihyb29tfj0gQiBFIEQgUiBPIE8gTSApIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihyb29tPWFiYykiLCBwcm9wcywgSVNGQUxTRSk7Ci0JCXRlc3RGaWx0ZXIoIiAoIHJvb20gPj1hYWFhKSIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIocm9vbSA8PWFhYWEpIiwgcHJvcHMsIElTRkFMU0UpOwotCQl0ZXN0RmlsdGVyKCIgICggcm9vbSA9YiopICIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIgICggcm9vbSA9Km0pICIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIocm9vbT1iZWQqcm9vbSkiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiICAoIHJvb20gPWIqb28qbSkgIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIiAgKCByb29tID0qYipvbyptKikgIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIiAgKCByb29tID1iKmIqICAqbSopICIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiICAoJiAocm9vbSA9YmVkcm9vbSkgKGNoYW5uZWwgfj0zNCkpIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIiAgKCYgIChyb29tID1iKikgIChyb29tID0qeCkgKGNoYW5uZWw9MzQpKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKHwgKHJvb20gPWJlZCopKGNoYW5uZWw9MjIyKSkgIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIih8IChyb29tID1ib29tKikoY2hhbm5lbD0xMDEpKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiICAoISAocm9vbSA9YWIqYipvbyptKikgKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiICAoc3RhdHVzID1cXChvKlxcXFxcXClcXCopICIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIgIChjYW5SZWNvcmQgPXRydWVcXCh4XFwpKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKG1heCBSZWNvcmQgVGltZSA8PTE0MCkgIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihzaG9ydFZhbHVlID49MTAwKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKGludFZhbHVlIDw9MTAwMDAxKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKGxvbmdWYWx1ZSA+PTEwMDAwMDAwMDAwKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiICAoICAmICAoICBieXRlVmFsdWUgPD0xMDApICAoICBieXRlVmFsdWUgPj0xMCkgICkgICIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIod2VpcmRWYWx1ZSA9MTAwKSAiLCBwcm9wcywgSVNGQUxTRSk7Ci0JCXRlc3RGaWx0ZXIoIihiaWdJbnRWYWx1ZSA9NDEyMzQ1NikgIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihiaWdEZWNWYWx1ZSA9NC4xMjM0NTYpICIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIoZmxvYXRWYWx1ZSA+PTEuMCkgIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihkb3VibGVWYWx1ZSA8PTIuMDExKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKGNoYXJWYWx1ZSB+PWEpICIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIoYm9vbGVhblZhbHVlID10cnVlKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKHByaW1JbnRBcnJheVZhbHVlID0xKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKHByaW1Mb25nQXJyYXlWYWx1ZSA9MikgIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihwcmltQnl0ZUFycmF5VmFsdWUgPTMpICIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIocHJpbVNob3J0QXJyYXlWYWx1ZSA9MSkgIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihwcmltRmxvYXRBcnJheVZhbHVlID0xLjEpICIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIocHJpbURvdWJsZUFycmF5VmFsdWUgPTIuMikgIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihwcmltQ2hhckFycmF5VmFsdWUgfj1EKSAiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKHByaW1Cb29sZWFuQXJyYXlWYWx1ZSA9ZmFsc2UpICIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIoJiAofCAocm9vbSA9ZCptKSAocm9vbSA9YmVkKikgKHJvb209YWJjKSkgKCEgKGNoYW5uZWw9OTk5KSkpIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihyb29tPWJlZHJvb20pIiwgbnVsbCwgSVNGQUxTRSk7Ci0JCXRlc3RGaWx0ZXIoIigqPWZvbykiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKCEgIGFiPWIpIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIih8ICAgYWI9YikiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKCY9YykiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKCE9YykiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKHw9YykiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKCYgICAgYWI9YikiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKCFhYj0qKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKHxhYj0qKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKCZhYj0qKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGVtcHR5PSkiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKGVtcHR5PSopIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihzcGFjZT0gKSIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIoc3BhY2U9KikiLCBwcm9wcywgSVNUUlVFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFZhbHVlcygpIHsKLQkJRGljdGlvbmFyeSBwcm9wcyA9IGdldFByb3BlcnRpZXMoKTsKLQkJdGVzdEZpbHRlcigiKGludHZhbHVlPSopIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihpbnR2YWx1ZT1iKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGludHZhbHVlPSkiLCBwcm9wcywgSVNGQUxTRSk7Ci0JCXRlc3RGaWx0ZXIoIihsb25ndmFsdWU9KikiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKGxvbmd2YWx1ZT1iKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGxvbmd2YWx1ZT0pIiwgcHJvcHMsIElTRkFMU0UpOwotCQl0ZXN0RmlsdGVyKCIoc2hvcnR2YWx1ZT0qKSIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIoc2hvcnR2YWx1ZT1iKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKHNob3J0dmFsdWU9KSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGJ5dGV2YWx1ZT0qKSIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIoYnl0ZXZhbHVlPWIpIiwgcHJvcHMsIElTRkFMU0UpOwotCQl0ZXN0RmlsdGVyKCIoYnl0ZXZhbHVlPSkiLCBwcm9wcywgSVNGQUxTRSk7Ci0JCXRlc3RGaWx0ZXIoIihjaGFydmFsdWU9KikiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKGNoYXJ2YWx1ZT0pIiwgcHJvcHMsIElTRkFMU0UpOwotCQl0ZXN0RmlsdGVyKCIoZmxvYXR2YWx1ZT0qKSIsIHByb3BzLCBJU1RSVUUpOwotCQl0ZXN0RmlsdGVyKCIoZmxvYXR2YWx1ZT1iKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGZsb2F0dmFsdWU9KSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGRvdWJsZXZhbHVlPSopIiwgcHJvcHMsIElTVFJVRSk7Ci0JCXRlc3RGaWx0ZXIoIihkb3VibGV2YWx1ZT1iKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGRvdWJsZXZhbHVlPSkiLCBwcm9wcywgSVNGQUxTRSk7Ci0JCXRlc3RGaWx0ZXIoIihib29sZWFudmFsdWU9KikiLCBwcm9wcywgSVNUUlVFKTsKLQkJdGVzdEZpbHRlcigiKGJvb2xlYW52YWx1ZT1iKSIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGJvb2xlYW52YWx1ZT0pIiwgcHJvcHMsIElTRkFMU0UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsKCkgewotCQlEaWN0aW9uYXJ5IHByb3BzID0gZ2V0UHJvcGVydGllcygpOwotCQl0ZXN0RmlsdGVyKCIiLCBwcm9wcywgSVNJTExFR0FMKTsKLQkJdGVzdEZpbHRlcigiKCkiLCBwcm9wcywgSVNJTExFR0FMKTsKLQkJdGVzdEZpbHRlcigiKD1mb28pIiwgcHJvcHMsIElTSUxMRUdBTCk7Ci0JCXRlc3RGaWx0ZXIoIigiLCBwcm9wcywgSVNJTExFR0FMKTsKLQkJdGVzdEZpbHRlcigiKGFiYyA9ICkpIiwgcHJvcHMsIElTSUxMRUdBTCk7Ci0JCXRlc3RGaWx0ZXIoIigmIChhYmMgPSB4eXopICgmICgzNDUpKSIsIHByb3BzLCBJU0lMTEVHQUwpOwotCQl0ZXN0RmlsdGVyKCIgIChyb29tID0gYioqb28hKm0qKSApICIsIHByb3BzLCBJU0lMTEVHQUwpOwotCQl0ZXN0RmlsdGVyKCIgIChyb29tID0gYioqb28pKm0qKSApICIsIHByb3BzLCBJU0lMTEVHQUwpOwotCQl0ZXN0RmlsdGVyKCIgIChyb29tID0gKj1iKipvbyptKikgKSAiLCBwcm9wcywgSVNJTExFR0FMKTsKLQkJdGVzdEZpbHRlcigiICAocm9vbSA9ID1iKipvbyptKikgKSAiLCBwcm9wcywgSVNJTExFR0FMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NhbGFyU3Vic3RyaW5nKCkgewotCQlEaWN0aW9uYXJ5IHByb3BzID0gZ2V0UHJvcGVydGllcygpOwotCQl0ZXN0RmlsdGVyKCIoc2hvcnRWYWx1ZSA9MTAwKikgIiwgcHJvcHMsIElTRkFMU0UpOwotCQl0ZXN0RmlsdGVyKCIoaW50VmFsdWUgPTEwMCopICIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGxvbmdWYWx1ZSA9MTAwKikgIiwgcHJvcHMsIElTRkFMU0UpOwotCQl0ZXN0RmlsdGVyKCIoICBieXRlVmFsdWUgPTEqMDAgICkiLCBwcm9wcywgSVNGQUxTRSk7Ci0JCXRlc3RGaWx0ZXIoIihiaWdJbnRWYWx1ZSA9NCoyMzQ1NikgIiwgcHJvcHMsIElTRkFMU0UpOwotCQl0ZXN0RmlsdGVyKCIoYmlnRGVjVmFsdWUgPTQqMTIzNDU2KSAiLCBwcm9wcywgSVNGQUxTRSk7Ci0JCXRlc3RGaWx0ZXIoIihmbG9hdFZhbHVlID0xKjApICIsIHByb3BzLCBJU0ZBTFNFKTsKLQkJdGVzdEZpbHRlcigiKGRvdWJsZVZhbHVlID0yKjAxMSkgIiwgcHJvcHMsIElTRkFMU0UpOwotCQl0ZXN0RmlsdGVyKCIoY2hhclZhbHVlID1hKikgIiwgcHJvcHMsIElTRkFMU0UpOwotCQl0ZXN0RmlsdGVyKCIoYm9vbGVhblZhbHVlID10KnVlKSAiLCBwcm9wcywgSVNGQUxTRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6YXRpb24oKSB7Ci0JCXRyeSB7Ci0JCQlGaWx0ZXIgZjEgPSBjcmVhdGVGaWx0ZXIoIiggYSA9IGJlZHJvb20gICkiKTsKLQkJCUZpbHRlciBmMiA9IGNyZWF0ZUZpbHRlcigiIChhPSBiZWRyb29tICApICIpOwotCQkJYXNzZXJ0RXF1YWxzKCJub3QgZXF1YWwiLCAiKGE9IGJlZHJvb20gICkiLCBmMS50b1N0cmluZygpKTsKLQkJCWFzc2VydEVxdWFscygibm90IGVxdWFsIiwgIihhPSBiZWRyb29tICApIiwgZjIudG9TdHJpbmcoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIm5vdCBlcXVhbCIsIGYxLCBmMik7Ci0JCQlhc3NlcnRFcXVhbHMoIm5vdCBlcXVhbCIsIGYyLCBmMSk7Ci0JCQlhc3NlcnRFcXVhbHMoIm5vdCBlcXVhbCIsIGYxLmhhc2hDb2RlKCksIGYyLmhhc2hDb2RlKCkpOwotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgaW52YWxpZCBzeW50YXgiLCBlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RGaWx0ZXIoU3RyaW5nIHF1ZXJ5LCBEaWN0aW9uYXJ5IHByb3BzLCBpbnQgZXhwZWN0KSB7Ci0JCWZpbmFsIFNlcnZpY2VSZWZlcmVuY2UgcmVmID0gbmV3IERpY3Rpb25hcnlTZXJ2aWNlUmVmZXJlbmNlKHByb3BzKTsKLQkJRmlsdGVyIGYxOwotCQl0cnkgewotCQkJZjEgPSBjcmVhdGVGaWx0ZXIocXVlcnkpOwotCi0JCQlpZiAoZXhwZWN0ID09IElTSUxMRUdBTCkgewotCQkJCWZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiIpOwotCQkJfQotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChleHBlY3QgIT0gSVNJTExFR0FMKSB7Ci0JCQkJZmFpbCgiZXhjZXB0aW9uIiwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIHZhbCA9IGYxLm1hdGNoKHByb3BzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyByZXN1bHQiLCBleHBlY3QgPT0gSVNUUlVFLCB2YWwpOwotCi0JCXZhbCA9IGYxLm1hdGNoKHJlZik7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgcmVzdWx0IiwgZXhwZWN0ID09IElTVFJVRSwgdmFsKTsKLQotCQlTdHJpbmcgbm9ybWFsaXplZCA9IGYxLnRvU3RyaW5nKCk7Ci0JCUZpbHRlciBmMjsKLQkJdHJ5IHsKLQkJCWYyID0gY3JlYXRlRmlsdGVyKG5vcm1hbGl6ZWQpOwotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImV4Y2VwdGlvbiIsIGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdmFsID0gZjIubWF0Y2gocHJvcHMpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHJlc3VsdCIsIGV4cGVjdCA9PSBJU1RSVUUsIHZhbCk7Ci0KLQkJdmFsID0gZjIubWF0Y2gocmVmKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyByZXN1bHQiLCBleHBlY3QgPT0gSVNUUlVFLCB2YWwpOwotCi0JCWFzc2VydEVxdWFscygibm9ybWFsaXplZCBub3QgZXF1YWwiLCBub3JtYWxpemVkLCBmMi50b1N0cmluZygpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJhYmxlKCkgewotCQlGaWx0ZXIgZjEgPSBudWxsOwotCQlPYmplY3QgY29tcDQyID0gbmV3IFNhbXBsZUNvbXBhcmFibGUoIjQyIik7Ci0JCU9iamVjdCBjb21wNDMgPSBuZXcgU2FtcGxlQ29tcGFyYWJsZSgiNDMiKTsKLQkJSGFzaHRhYmxlIGhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJdHJ5IHsKLQkJCWYxID0gY3JlYXRlRmlsdGVyKCIoY29tcGFyYWJsZT00MikiKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJpbnZhbGlkIHN5bnRheCIsIGUpOwotCQl9Ci0KLQkJaGFzaC5wdXQoImNvbXBhcmFibGUiLCBjb21wNDIpOwotCQlhc3NlcnRUcnVlKCJkb2VzIG5vdCBtYXRjaCBmaWx0ZXIiLCBmMS5tYXRjaChoYXNoKSk7Ci0JCWFzc2VydFRydWUoImRvZXMgbm90IG1hdGNoIGZpbHRlciIsIGYxLm1hdGNoKG5ldyBEaWN0aW9uYXJ5U2VydmljZVJlZmVyZW5jZShoYXNoKSkpOwotCi0JCWhhc2gucHV0KCJjb21wYXJhYmxlIiwgY29tcDQzKTsKLQkJYXNzZXJ0RmFsc2UoImRvZXMgbWF0Y2ggZmlsdGVyIiwgZjEubWF0Y2goaGFzaCkpOwotCQlhc3NlcnRGYWxzZSgiZG9lcyBtYXRjaCBmaWx0ZXIiLCBmMS5tYXRjaChuZXcgRGljdGlvbmFyeVNlcnZpY2VSZWZlcmVuY2UoaGFzaCkpKTsKLQotCQl0cnkgewotCQkJZjEgPSBjcmVhdGVGaWx0ZXIoIihjb21wYXJhYmxlPD00MikiKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJpbnZhbGlkIHN5bnRheCIsIGUpOwotCQl9Ci0KLQkJaGFzaC5wdXQoImNvbXBhcmFibGUiLCBjb21wNDIpOwotCQlhc3NlcnRUcnVlKCJkb2VzIG5vdCBtYXRjaCBmaWx0ZXIiLCBmMS5tYXRjaChoYXNoKSk7Ci0JCWFzc2VydFRydWUoImRvZXMgbm90IG1hdGNoIGZpbHRlciIsIGYxLm1hdGNoKG5ldyBEaWN0aW9uYXJ5U2VydmljZVJlZmVyZW5jZShoYXNoKSkpOwotCi0JCWhhc2gucHV0KCJjb21wYXJhYmxlIiwgY29tcDQzKTsKLQkJYXNzZXJ0RmFsc2UoImRvZXMgbWF0Y2ggZmlsdGVyIiwgZjEubWF0Y2goaGFzaCkpOwotCQlhc3NlcnRGYWxzZSgiZG9lcyBtYXRjaCBmaWx0ZXIiLCBmMS5tYXRjaChuZXcgRGljdGlvbmFyeVNlcnZpY2VSZWZlcmVuY2UoaGFzaCkpKTsKLQotCQl0cnkgewotCQkJZjEgPSBjcmVhdGVGaWx0ZXIoIihjb21wYXJhYmxlPj00MikiKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJpbnZhbGlkIHN5bnRheCIsIGUpOwotCQl9Ci0KLQkJaGFzaC5wdXQoImNvbXBhcmFibGUiLCBjb21wNDIpOwotCQlhc3NlcnRUcnVlKCJkb2VzIG5vdCBtYXRjaCBmaWx0ZXIiLCBmMS5tYXRjaChoYXNoKSk7Ci0JCWFzc2VydFRydWUoImRvZXMgbm90IG1hdGNoIGZpbHRlciIsIGYxLm1hdGNoKG5ldyBEaWN0aW9uYXJ5U2VydmljZVJlZmVyZW5jZShoYXNoKSkpOwotCi0JCWhhc2gucHV0KCJjb21wYXJhYmxlIiwgY29tcDQzKTsKLQkJYXNzZXJ0VHJ1ZSgiZG9lcyBub3QgbWF0Y2ggZmlsdGVyIiwgZjEubWF0Y2goaGFzaCkpOwotCQlhc3NlcnRUcnVlKCJkb2VzIG5vdCBtYXRjaCBmaWx0ZXIiLCBmMS5tYXRjaChuZXcgRGljdGlvbmFyeVNlcnZpY2VSZWZlcmVuY2UoaGFzaCkpKTsKLQotCQl0cnkgewotCQkJZjEgPSBjcmVhdGVGaWx0ZXIoIihjb21wYXJhYmxlPTQqMikiKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJpbnZhbGlkIHN5bnRheCIsIGUpOwotCQl9Ci0KLQkJaGFzaC5wdXQoImNvbXBhcmFibGUiLCBjb21wNDIpOwotCQlhc3NlcnRGYWxzZSgiZG9lcyBtYXRjaCBmaWx0ZXIiLCBmMS5tYXRjaChoYXNoKSk7Ci0JCWFzc2VydEZhbHNlKCJkb2VzIG1hdGNoIGZpbHRlciIsIGYxLm1hdGNoKG5ldyBEaWN0aW9uYXJ5U2VydmljZVJlZmVyZW5jZShoYXNoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3QoKSB7Ci0JCUZpbHRlciBmMSA9IG51bGw7Ci0JCU9iamVjdCBvYmo0MiA9IG5ldyBTYW1wbGVPYmplY3QoIjQyIik7Ci0JCU9iamVjdCBvYmo0MyA9IG5ldyBTYW1wbGVPYmplY3QoIjQzIik7Ci0JCUhhc2h0YWJsZSBoYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCXRyeSB7Ci0JCQlmMSA9IGNyZWF0ZUZpbHRlcigiKG9iamVjdD00MikiKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJpbnZhbGlkIHN5bnRheCIsIGUpOwotCQl9Ci0KLQkJaGFzaC5wdXQoIm9iamVjdCIsIG9iajQyKTsKLQkJYXNzZXJ0VHJ1ZSgiZG9lcyBub3QgbWF0Y2ggZmlsdGVyIiwgZjEubWF0Y2goaGFzaCkpOwotCQlhc3NlcnRUcnVlKCJkb2VzIG5vdCBtYXRjaCBmaWx0ZXIiLCBmMS5tYXRjaChuZXcgRGljdGlvbmFyeVNlcnZpY2VSZWZlcmVuY2UoaGFzaCkpKTsKLQotCQloYXNoLnB1dCgib2JqZWN0Iiwgb2JqNDMpOwotCQlhc3NlcnRGYWxzZSgiZG9lcyBtYXRjaCBmaWx0ZXIiLCBmMS5tYXRjaChoYXNoKSk7Ci0JCWFzc2VydEZhbHNlKCJkb2VzIG1hdGNoIGZpbHRlciIsIGYxLm1hdGNoKG5ldyBEaWN0aW9uYXJ5U2VydmljZVJlZmVyZW5jZShoYXNoKSkpOwotCi0JCXRyeSB7Ci0JCQlmMSA9IGNyZWF0ZUZpbHRlcigiKG9iamVjdD00KjIpIik7Ci0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiaW52YWxpZCBzeW50YXgiLCBlKTsKLQkJfQotCi0JCWhhc2gucHV0KCJvYmplY3QiLCBvYmo0Mik7Ci0JCWFzc2VydEZhbHNlKCJkb2VzIG1hdGNoIGZpbHRlciIsIGYxLm1hdGNoKGhhc2gpKTsKLQkJYXNzZXJ0RmFsc2UoImRvZXMgbWF0Y2ggZmlsdGVyIiwgZjEubWF0Y2gobmV3IERpY3Rpb25hcnlTZXJ2aWNlUmVmZXJlbmNlKGhhc2gpKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTYW1wbGVDb21wYXJhYmxlIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JCXByaXZhdGUgaW50IHZhbHVlID0gLTE7Ci0KLQkJcHVibGljIFNhbXBsZUNvbXBhcmFibGUoU3RyaW5nIHZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQkJcmV0dXJuIHZhbHVlIC0gKChTYW1wbGVDb21wYXJhYmxlKSBvKS52YWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTYW1wbGVPYmplY3QgewotCQlwcml2YXRlIGludCB2YWx1ZSA9IC0xOwotCi0JCXB1YmxpYyBTYW1wbGVPYmplY3QoU3RyaW5nIHZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgU2FtcGxlT2JqZWN0KSB7Ci0JCQkJcmV0dXJuIHZhbHVlID09ICgoU2FtcGxlT2JqZWN0KSBvKS52YWx1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGljdGlvbmFyeVNlcnZpY2VSZWZlcmVuY2UgaW1wbGVtZW50cyBTZXJ2aWNlUmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBmaW5hbCBEaWN0aW9uYXJ5IGRpY3Rpb25hcnk7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10ga2V5czsKLQotCQlEaWN0aW9uYXJ5U2VydmljZVJlZmVyZW5jZShEaWN0aW9uYXJ5IGRpY3Rpb25hcnkpIHsKLQkJCWlmIChkaWN0aW9uYXJ5ID09IG51bGwpIHsKLQkJCQl0aGlzLmRpY3Rpb25hcnkgPSBudWxsOwotCQkJCXRoaXMua2V5cyA9IG5ldyBTdHJpbmdbXSB7fTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aGlzLmRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5OwotCQkJTGlzdCBrZXlMaXN0ID0gbmV3IEFycmF5TGlzdChkaWN0aW9uYXJ5LnNpemUoKSk7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBkaWN0aW9uYXJ5LmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlPYmplY3QgayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoayBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgazsKLQkJCQkJZm9yIChJdGVyYXRvciBpID0ga2V5TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBpLm5leHQoKSkpIHsKLQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJa2V5TGlzdC5hZGQoa2V5KTsKLQkJCQl9Ci0JCQl9Ci0JCQl0aGlzLmtleXMgPSAoU3RyaW5nW10pIGtleUxpc3QudG9BcnJheShuZXcgU3RyaW5nW2tleUxpc3Quc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBrZXkgPSBrZXlzW2ldOwotCQkJCWlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShrKSkgewotCQkJCQlyZXR1cm4gZGljdGlvbmFyeS5nZXQoa2V5KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0eUtleXMoKSB7Ci0JCQlyZXR1cm4gKFN0cmluZ1tdKSBrZXlzLmNsb25lKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgcmVmZXJlbmNlKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgQnVuZGxlW10gZ2V0VXNpbmdCdW5kbGVzKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVUbyhCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9maWx0ZXIvRnJhbWV3b3JrVXRpbEZpbHRlclRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvZmlsdGVyL0ZyYW1ld29ya1V0aWxGaWx0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDZmZTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9maWx0ZXIvRnJhbWV3b3JrVXRpbEZpbHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5maWx0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgRnJhbWV3b3JrVXRpbEZpbHRlclRlc3RzIGV4dGVuZHMgRmlsdGVyVGVzdHMgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRnJhbWV3b3JrVXRpbEZpbHRlclRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgRmlsdGVyIGNyZWF0ZUZpbHRlcihTdHJpbmcgZmlsdGVyU3RyaW5nKSB0aHJvd3MgSW52YWxpZFN5bnRheEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBGcmFtZXdvcmtVdGlsLmNyZWF0ZUZpbHRlcihmaWx0ZXJTdHJpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9pbnRlcm5hbC9wbHVnaW5zL0luc3RhbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2ludGVybmFsL3BsdWdpbnMvSW5zdGFsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2U0YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2ludGVybmFsL3BsdWdpbnMvSW5zdGFsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmludGVybmFsLnBsdWdpbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuaGFybmVzcy5CdW5kbGVUZXN0aW5nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuaGFybmVzcy5Db3JlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKLQotLyoqCi0gKiBQcm92aXNvcnkgaG9tZSBmb3IgdGVzdHMgdGhhdCBpbnN0YWxsIHBsdWdpbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsVGVzdHMgZXh0ZW5kcyBDb3JlVGVzdCB7Ci0KLQlwdWJsaWMgSW5zdGFsbFRlc3RzKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJbnN0YWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEludmFsaWRNYW5pZmVzdDAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlCdW5kbGUgaW5zdGFsbGVkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluc3RhbGxlZCA9IEJ1bmRsZVRlc3RpbmdIZWxwZXIuaW5zdGFsbEJ1bmRsZShPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTAzIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHNob3VsZCBoYXZlIGZhaWxlZCB3aXRoIEJ1bmRsZUV4Y2VwdGlvbgotCQkJZmFpbCgiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQkvLyBzdWNjZXNzIC0gdGhlIG1hbmlmZXN0IHdhcyBpbnZhbGlkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5zdGFsbGVkICE9IG51bGwpCi0JCQkJLy8gY2xlYW4tdXAgLSBvbmx5IHJ1bnMgaWYgd2UgZW5kLXVwIGFjY2VwdGluZyBhbiBpbnZhbGlkIG1hbmlmZXN0CQkJCQotCQkJCWluc3RhbGxlZC51bmluc3RhbGwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgaW52YWxpZCBtYW5pZmVzdDsgbWlzc2luZyBCdW5kbGUtU3ltYm9saWNOYW1lCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxJbnZhbGlkTWFuaWZlc3QwMigpIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGluc3RhbGxlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoInRlc3RJbnN0YWxsSW52YWxpZE1hbmlmZXN0MDIiLCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTExIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy8gc2hvdWxkIGhhdmUgZmFpbGVkIHdpdGggQnVuZGxlRXhjZXB0aW9uCi0JCQlmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUgd2l0aCBubyBCdW5kbGUtU3ltYm9saWNOYW1lIGhlYWRlciIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJLy8gc3VjY2VzcyAtIHRoZSBtYW5pZmVzdCB3YXMgaW52YWxpZAotCQkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBtYW5pZmVzdCBlcnJvciIsIEJ1bmRsZUV4Y2VwdGlvbi5NQU5JRkVTVF9FUlJPUiwgYmUuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluc3RhbGxlZCAhPSBudWxsKQotCQkJCS8vIGNsZWFuLXVwIC0gb25seSBydW5zIGlmIHdlIGVuZC11cCBhY2NlcHRpbmcgYW4gaW52YWxpZCBtYW5pZmVzdAkJCQkKLQkJCQlpbnN0YWxsZWQudW5pbnN0YWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGludmFsaWQgbWFuaWZlc3Q7IGR1cGxpY2F0ZSBkaXJlY3RpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEludmFsaWRNYW5pZmVzdDAzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgaW5zdGFsbGVkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluc3RhbGxlZCA9IEJ1bmRsZVRlc3RpbmdIZWxwZXIuaW5zdGFsbEJ1bmRsZSgidGVzdEluc3RhbGxJbnZhbGlkTWFuaWZlc3QwMyIsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCksIE9TR2lUZXN0c0FjdGl2YXRvci5URVNUX0ZJTEVTX1JPT1QgKyAiaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMTIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkvLyBzaG91bGQgaGF2ZSBmYWlsZWQgd2l0aCBCdW5kbGVFeGNlcHRpb24KLQkJCWZhaWwoIkV4cGVjdGVkIGEgZmFpbHVyZSB3aXRoIGR1cGxpY2F0ZSBkaXJlY3RpdmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQkvLyBzdWNjZXNzIC0gdGhlIG1hbmlmZXN0IHdhcyBpbnZhbGlkCi0JCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG1hbmlmZXN0IGVycm9yIiwgQnVuZGxlRXhjZXB0aW9uLk1BTklGRVNUX0VSUk9SLCBiZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5zdGFsbGVkICE9IG51bGwpCi0JCQkJLy8gY2xlYW4tdXAgLSBvbmx5IHJ1bnMgaWYgd2UgZW5kLXVwIGFjY2VwdGluZyBhbiBpbnZhbGlkIG1hbmlmZXN0CQkJCQotCQkJCWluc3RhbGxlZC51bmluc3RhbGwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgaW52YWxpZCBtYW5pZmVzdDsgdXNlIGF0dHJpYnV0ZXMgYnVuZGxlLXZlcnNpb24gYW5kIGJ1bmRsZS1zeW1ib2xpYy1uYW1lIGluIEV4cG9ydC1QYWNrYWdlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxJbnZhbGlkTWFuaWZlc3QwNCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGluc3RhbGxlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoInRlc3RJbnN0YWxsSW52YWxpZE1hbmlmZXN0MDQiLCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTEzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy8gc2hvdWxkIGhhdmUgZmFpbGVkIHdpdGggQnVuZGxlRXhjZXB0aW9uCi0JCQlmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUgd2l0aCBkdXBsaWNhdGUgYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJLy8gc3VjY2VzcyAtIHRoZSBtYW5pZmVzdCB3YXMgaW52YWxpZAotCQkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBtYW5pZmVzdCBlcnJvciIsIEJ1bmRsZUV4Y2VwdGlvbi5NQU5JRkVTVF9FUlJPUiwgYmUuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluc3RhbGxlZCAhPSBudWxsKQotCQkJCS8vIGNsZWFuLXVwIC0gb25seSBydW5zIGlmIHdlIGVuZC11cCBhY2NlcHRpbmcgYW4gaW52YWxpZCBtYW5pZmVzdAkJCQkKLQkJCQlpbnN0YWxsZWQudW5pbnN0YWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGludmFsaWQgbWFuaWZlc3Q7IGltcG9ydHMgc2FtZSBwYWNrYWdlIHR3aWNlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxJbnZhbGlkTWFuaWZlc3QwNSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGluc3RhbGxlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoInRlc3RJbnN0YWxsSW52YWxpZE1hbmlmZXN0MDUiLCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTE0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy8gc2hvdWxkIGhhdmUgZmFpbGVkIHdpdGggQnVuZGxlRXhjZXB0aW9uCi0JCQlmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUgd2l0aCBkdXBsaWNhdGUgaW1wb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJLy8gc3VjY2VzcyAtIHRoZSBtYW5pZmVzdCB3YXMgaW52YWxpZAotCQkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBtYW5pZmVzdCBlcnJvciIsIEJ1bmRsZUV4Y2VwdGlvbi5NQU5JRkVTVF9FUlJPUiwgYmUuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluc3RhbGxlZCAhPSBudWxsKQotCQkJCS8vIGNsZWFuLXVwIC0gb25seSBydW5zIGlmIHdlIGVuZC11cCBhY2NlcHRpbmcgYW4gaW52YWxpZCBtYW5pZmVzdAkJCQkKLQkJCQlpbnN0YWxsZWQudW5pbnN0YWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHVucmVzb2x2YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTdGFydEVycm9yMDEoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBpbnN0YWxsZWQgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoInRlc3RTdGFydEVycm9yMDEiLCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTE1Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIHNob3VsZCBiZSBhYmxlIHRvIGluc3RhbGwKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJCS8vIGZhaWxlZCB0byBpbnN0YWxsIHVucmVzb2x2YWJsZSBidW5kbGUKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIGluc3RhbGxhdGlvbiBlcnJvciIsIGJlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdHJ5IHsKLQkJCQlpbnN0YWxsZWQuc3RhcnQoKTsKLQkJCQkvLyBleHBlY3RlZCBleGNlcHRpb24gc3RhcnRpbmcKLQkJCQlmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUgdG8gc3RhcnQgdW5yZXNvbHZlZCBidW5kbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQkJLy8gc3VjY2VzcyAtIHRoZSBidW5kbGUgY2FuIG5vdCByZXNvbHZlCi0JCQkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBtYW5pZmVzdCBlcnJvciIsIEJ1bmRsZUV4Y2VwdGlvbi5SRVNPTFZFX0VSUk9SLCBiZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnN0YWxsZWQgIT0gbnVsbCkKLQkJCQkvLyBjbGVhbi11cCAtIG9ubHkgcnVucyBpZiB3ZSBlbmQtdXAgYWNjZXB0aW5nIGFuIGludmFsaWQgbWFuaWZlc3QJCQkJCi0JCQkJaW5zdGFsbGVkLnVuaW5zdGFsbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdCBzdGFydCBmcmFnbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTdGFydEVycm9yMDIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBob3N0ID0gbnVsbDsKLQkJQnVuZGxlIGZyYWdtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJaG9zdCA9IEJ1bmRsZVRlc3RpbmdIZWxwZXIuaW5zdGFsbEJ1bmRsZSgidGVzdFN0YXJ0RXJyb3IwMl9ob3N0IiwgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgT1NHaVRlc3RzQWN0aXZhdG9yLlRFU1RfRklMRVNfUk9PVCArICJpbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxNiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlmcmFnbWVudCA9IEJ1bmRsZVRlc3RpbmdIZWxwZXIuaW5zdGFsbEJ1bmRsZSgidGVzdFN0YXJ0RXJyb3IwMl9mcmFnIiwgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgT1NHaVRlc3RzQWN0aXZhdG9yLlRFU1RfRklMRVNfUk9PVCArICJpbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxNyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkvLyBzaG91bGQgYmUgYWJsZSB0byBpbnN0YWxsIGhvc3QKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJCS8vIGZhaWxlZCB0byBpbnN0YWxsIHVucmVzb2x2YWJsZSBidW5kbGUKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIGluc3RhbGxhdGlvbiBlcnJvciIsIGJlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdHJ5IHsKLQkJCQlob3N0LnN0YXJ0KCk7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIHN0YXJ0IGhvc3QgZXJyb3IiLCBiZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJZnJhZ21lbnQuc3RhcnQoKTsKLQkJCQkvLyBleHBlY3RlZCBleGNlcHRpb24gc3RhcnRpbmcKLQkJCQlmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUgdG8gc3RhcnQgZnJhZ21lbnQgYnVuZGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJCS8vIHN1Y2Nlc3MgLSB0aGUgYnVuZGxlIGNhbiBub3QgcmVzb2x2ZQotCQkJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgbWFuaWZlc3QgZXJyb3IiLCBCdW5kbGVFeGNlcHRpb24uSU5WQUxJRF9PUEVSQVRJT04sIGJlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGhvc3QgIT0gbnVsbCkKLQkJCQlob3N0LnVuaW5zdGFsbCgpOwotCQkJaWYgKGZyYWdtZW50ICE9IG51bGwpCi0JCQkJZnJhZ21lbnQudW5pbnN0YWxsKCk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIHdpdGggYm9vdCBjbGFzc3BhdGggZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uMDEoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBpbnN0YWxsZWQgPSBudWxsOwotCQl0cnkgewotCQkJaW5zdGFsbGVkID0gQnVuZGxlVGVzdGluZ0hlbHBlci5pbnN0YWxsQnVuZGxlKCJ0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb24wMSIsIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCksIE9TR2lUZXN0c0FjdGl2YXRvci5URVNUX0ZJTEVTX1JPT1QgKyAiaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMTgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkvLyBzaG91bGQgaGF2ZSBmYWlsZWQgd2l0aCBCdW5kbGVFeGNlcHRpb24KLQkJCWZhaWwoIkV4cGVjdGVkIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBleGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCS8vIHN1Y2Nlc3MgLSB0aGUgbWFuaWZlc3Qgd2FzIGludmFsaWQKLQkJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgdW5zdXBwb3J0ZWQgZXJyb3IiLCBCdW5kbGVFeGNlcHRpb24uVU5TVVBQT1JURURfT1BFUkFUSU9OLCBiZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5zdGFsbGVkICE9IG51bGwpCi0JCQkJLy8gY2xlYW4tdXAgLSBvbmx5IHJ1bnMgaWYgd2UgZW5kLXVwIGFjY2VwdGluZyBhbiBpbnZhbGlkIG1hbmlmZXN0CQkJCQotCQkJCWluc3RhbGxlZC51bmluc3RhbGwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsTG9jYXRpb25XaXRoU3BhY2VzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlCdW5kbGUgaW5zdGFsbGVkID0gbnVsbDsKLQkJaW5zdGFsbGVkID0gQnVuZGxlVGVzdGluZ0hlbHBlci5pbnN0YWxsQnVuZGxlKE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCksIE9TR2lUZXN0c0FjdGl2YXRvci5URVNUX0ZJTEVTX1JPT1QgKyAiaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlIDAxIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiMS4wIiwgImJ1bmRsZTAxIiwgaW5zdGFsbGVkLmdldFN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlhc3NlcnRFcXVhbHMoIjEuMSIsIEJ1bmRsZS5JTlNUQUxMRUQsIGluc3RhbGxlZC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJLy8gY2xlYW4tdXAKLQkJCWluc3RhbGxlZC51bmluc3RhbGwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsTG9jYXRpb25XaXRoVW5kZXJzY29yZXMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBpbnN0YWxsZWQgPSBudWxsOwotCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgT1NHaVRlc3RzQWN0aXZhdG9yLlRFU1RfRklMRVNfUk9PVCArICJpbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwMl8xLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEuMCIsICJidW5kbGUwMiIsIGluc3RhbGxlZC5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBCdW5kbGUuSU5TVEFMTEVELCBpbnN0YWxsZWQuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiMS4yIiwgbmV3IFZlcnNpb24oIjIuMCIpLCBuZXcgVmVyc2lvbigoU3RyaW5nKSBpbnN0YWxsZWQuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGZpbmFsbHkgewotCQkJLy8gY2xlYW4tdXAKLQkJCWluc3RhbGxlZC51bmluc3RhbGwoKTsKLQkJfQotCX0KLQotCS8qKiBFbnN1cmVzIHdlIHNlZSBhIGJ1bmRsZSB3aXRoIG9ubHkgYSBleHRlbnNpb24gcG9pbnQgYXMgYSBzaW5nbGV0b24gKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEJ1bmRsZVdpdGhFeHRlbnNpb25Qb2ludE9ubHkoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBpbnN0YWxsZWQgPSBudWxsOwotCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgT1NHaVRlc3RzQWN0aXZhdG9yLlRFU1RfRklMRVNfUk9PVCArICJpbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwNCIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEuMCIsICJidW5kbGUwNCIsIGluc3RhbGxlZC5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBCdW5kbGUuSU5TVEFMTEVELCBpbnN0YWxsZWQuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiMS4yIiwgIjEuMy43IiwgaW5zdGFsbGVkLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIHN5bWJvbGljTmFtZVN0cmluZyA9IChTdHJpbmcpIGluc3RhbGxlZC5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCWFzc2VydE5vdE51bGwoIjEuMyIsIHN5bWJvbGljTmFtZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCU1hbmlmZXN0RWxlbWVudFtdIHN5bWJvbGljTmFtZUhlYWRlciA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcihDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgc3ltYm9saWNOYW1lU3RyaW5nKTsKLQkJCWFzc2VydEVxdWFscygiMS40IiwgMSwgc3ltYm9saWNOYW1lSGVhZGVyLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiMS41IiwgInRydWUiLCBzeW1ib2xpY05hbWVIZWFkZXJbMF0uZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0gZmluYWxseSB7Ci0JCQkvLyBjbGVhbi11cAotCQkJaW5zdGFsbGVkLnVuaW5zdGFsbCgpOwotCQl9Ci0JfQotCi0JLyoqIEVuc3VyZXMgd2Ugc2VlIGEgYnVuZGxlIHdpdGggb25seSBhIGV4dGVuc2lvbiBhcyBhIHNpbmdsZXRvbiAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQnVuZGxlV2l0aEV4dGVuc2lvbk9ubHkoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBpbnN0YWxsZWQgPSBudWxsOwotCQlpbnN0YWxsZWQgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgT1NHaVRlc3RzQWN0aXZhdG9yLlRFU1RfRklMRVNfUk9PVCArICJpbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwNSIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEuMCIsICJidW5kbGUwNSIsIGluc3RhbGxlZC5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBCdW5kbGUuSU5TVEFMTEVELCBpbnN0YWxsZWQuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiMS4yIiwgIjEuMy44IiwgaW5zdGFsbGVkLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIHN5bWJvbGljTmFtZVN0cmluZyA9IChTdHJpbmcpIGluc3RhbGxlZC5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCWFzc2VydE5vdE51bGwoIjEuMyIsIHN5bWJvbGljTmFtZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCU1hbmlmZXN0RWxlbWVudFtdIHN5bWJvbGljTmFtZUhlYWRlciA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcihDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgc3ltYm9saWNOYW1lU3RyaW5nKTsKLQkJCWFzc2VydEVxdWFscygiMS40IiwgMSwgc3ltYm9saWNOYW1lSGVhZGVyLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiMS41IiwgInRydWUiLCBzeW1ib2xpY05hbWVIZWFkZXJbMF0uZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0gZmluYWxseSB7Ci0JCQkvLyBjbGVhbi11cAotCQkJaW5zdGFsbGVkLnVuaW5zdGFsbCgpOwotCQl9Ci0JfQotCi0JLyoqIEVuc3VyZXMgd2Ugc2VlIGEgYnVuZGxlIHdpdGggb25seSBleHRlbnNpb24gYW5kIGV4dGVuc2lvbiBwb2ludCBhcyBhIHNpbmdsZXRvbiAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQnVuZGxlV2l0aEV4dGVuc2lvbkFuZEV4dGVuc2lvblBvaW50KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlCdW5kbGUgaW5zdGFsbGVkID0gbnVsbDsKLQkJaW5zdGFsbGVkID0gQnVuZGxlVGVzdGluZ0hlbHBlci5pbnN0YWxsQnVuZGxlKE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCksIE9TR2lUZXN0c0FjdGl2YXRvci5URVNUX0ZJTEVTX1JPT1QgKyAiaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDYiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAiYnVuZGxlMDYiLCBpbnN0YWxsZWQuZ2V0U3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFzc2VydEVxdWFscygiMS4xIiwgQnVuZGxlLklOU1RBTExFRCwgaW5zdGFsbGVkLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIjEuMiIsICIxLjMuOSIsIGluc3RhbGxlZC5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBzeW1ib2xpY05hbWVTdHJpbmcgPSAoU3RyaW5nKSBpbnN0YWxsZWQuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCQlhc3NlcnROb3ROdWxsKCIxLjMiLCBzeW1ib2xpY05hbWVTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCQlNYW5pZmVzdEVsZW1lbnRbXSBzeW1ib2xpY05hbWVIZWFkZXIgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIHN5bWJvbGljTmFtZVN0cmluZyk7Ci0JCQlhc3NlcnRFcXVhbHMoIjEuNCIsIDEsIHN5bWJvbGljTmFtZUhlYWRlci5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIjEuNSIsICJ0cnVlIiwgc3ltYm9saWNOYW1lSGVhZGVyWzBdLmdldERpcmVjdGl2ZShDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9IGZpbmFsbHkgewotCQkJLy8gY2xlYW4tdXAKLQkJCWluc3RhbGxlZC51bmluc3RhbGwoKTsKLQkJfQotCX0KLQotCS8qKiBFbnN1cmVzIHR3byB2ZXJzaW9ucyBvZiBhIG5vbi1zaW5nbGV0b24gYnVuZGxlIGFyZSBhY2NlcHRlZCAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsMk5vblNpbmdsZXRvbkJ1bmRsZXMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBpbnN0YWxsZWQxID0gb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLkJ1bmRsZVRlc3RpbmdIZWxwZXIuaW5zdGFsbEJ1bmRsZShPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTA3Iik7IC8vJE5PTi1OTFMtMSQKLQkJU2VydmljZVJlZmVyZW5jZSBwYWNrYWdlQWRtaW5TUiA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJUGFja2FnZUFkbWluIHBhY2thZ2VBZG1pbiA9IChQYWNrYWdlQWRtaW4pIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5TUik7Ci0JCXBhY2thZ2VBZG1pbi5yZXNvbHZlQnVuZGxlcyhudWxsKTsKLQkJQnVuZGxlIGluc3RhbGxlZDIgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgT1NHaVRlc3RzQWN0aXZhdG9yLlRFU1RfRklMRVNfUk9PVCArICJpbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwN2IiKTsgLy8kTk9OLU5MUy0xJAotCQlwYWNrYWdlQWRtaW4ucmVzb2x2ZUJ1bmRsZXMobnVsbCk7Ci0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkudW5nZXRTZXJ2aWNlKHBhY2thZ2VBZG1pblNSKTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiMS4wIiwgImJ1bmRsZTA3IiwgaW5zdGFsbGVkMi5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBCdW5kbGUuUkVTT0xWRUQsIGluc3RhbGxlZDIuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiMS4yIiwgIjEuMC4wLmIiLCBpbnN0YWxsZWQyLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlhc3NlcnRFcXVhbHMoIjEuMyIsICJidW5kbGUwNyIsIGluc3RhbGxlZDEuZ2V0U3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFzc2VydEVxdWFscygiMS40IiwgQnVuZGxlLlJFU09MVkVELCBpbnN0YWxsZWQxLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIjEuNSIsICIxLjAuMCIsIGluc3RhbGxlZDEuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZmluYWxseSB7Ci0JCQlpbnN0YWxsZWQxLnVuaW5zdGFsbCgpOwotCQkJaW5zdGFsbGVkMi51bmluc3RhbGwoKTsKLQkJfQotCX0KLQotCS8qKiBFbnN1cmVzIHR3byB2ZXJzaW9ucyBvZiBhIHNpbmdsZXRvbiBidW5kbGUgYXJlIGFjY2VwdGVkICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwyU2luZ2xldG9uQnVuZGxlcygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGluc3RhbGxlZDEgPSBCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgT1NHaVRlc3RzQWN0aXZhdG9yLlRFU1RfRklMRVNfUk9PVCArICJpbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwOCIpOyAvLyROT04tTkxTLTEkCi0JCVNlcnZpY2VSZWZlcmVuY2UgcGFja2FnZUFkbWluU1IgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVBhY2thZ2VBZG1pbiBwYWNrYWdlQWRtaW4gPSAoUGFja2FnZUFkbWluKSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UocGFja2FnZUFkbWluU1IpOwotCQlwYWNrYWdlQWRtaW4ucmVzb2x2ZUJ1bmRsZXMobnVsbCk7Ci0JCUJ1bmRsZSBpbnN0YWxsZWQyID0gQnVuZGxlVGVzdGluZ0hlbHBlci5pbnN0YWxsQnVuZGxlKE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCksIE9TR2lUZXN0c0FjdGl2YXRvci5URVNUX0ZJTEVTX1JPT1QgKyAiaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDhiIik7IC8vJE5PTi1OTFMtMSQKLQkJcGFja2FnZUFkbWluLnJlc29sdmVCdW5kbGVzKG51bGwpOwotCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5TUik7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEuMCIsICJidW5kbGUwOCIsIGluc3RhbGxlZDEuZ2V0U3ltYm9saWNOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFzc2VydEVxdWFscygiMS4xIiwgQnVuZGxlLlJFU09MVkVELCBpbnN0YWxsZWQxLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIjEuMiIsICIxLjAuMCIsIGluc3RhbGxlZDEuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWFzc2VydEVxdWFscygiMS4zIiwgImJ1bmRsZTA4IiwgaW5zdGFsbGVkMi5nZXRTeW1ib2xpY05hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXNzZXJ0RXF1YWxzKCIxLjQiLCBCdW5kbGUuSU5TVEFMTEVELCBpbnN0YWxsZWQyLmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIjEuNSIsICIxLjAuMC5iIiwgaW5zdGFsbGVkMi5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBmaW5hbGx5IHsKLQkJCWluc3RhbGxlZDEudW5pbnN0YWxsKCk7Ci0JCQlpbnN0YWxsZWQyLnVuaW5zdGFsbCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvbGlzdGVuZXJzL0V4Y2VwdGlvbkhhbmRsZXJUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL2xpc3RlbmVycy9FeGNlcHRpb25IYW5kbGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2NTcwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvbGlzdGVuZXJzL0V4Y2VwdGlvbkhhbmRsZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5saXN0ZW5lcnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MuQnVuZGxlVGVzdGluZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkhhbmRsZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvL1RoZXNlIHRlc3RzIGV4ZXJjaXNlIHRoZSBjb2RlIGNoYW5nZSBmb3IgYnVnIDczMTExLgotCQotCWNsYXNzIEZyYW1ld29ya0V2ZW50TGlzdGVuZXJXaXRoUmVzdWx0IGltcGxlbWVudHMgRnJhbWV3b3JrTGlzdGVuZXIgewotCQlGcmFtZXdvcmtFdmVudCBldmVudCA9IG51bGw7Ci0JCQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZnJhbWV3b3JrRXZlbnQoRnJhbWV3b3JrRXZlbnQgbmV3RXZlbnQpIHsKLQkJCWlmIChuZXdFdmVudC5nZXRUeXBlKCkgIT0gRnJhbWV3b3JrRXZlbnQuRVJST1IpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlpZiAodGhpcy5ldmVudCAhPSBudWxsKQotCQkJCXJldHVybjsKLQkJCWV2ZW50ID0gbmV3RXZlbnQ7Ci0JCQlub3RpZnkoKTsKLQkJfQotCQkKLQkJcHVibGljIHN5bmNocm9uaXplZCBGcmFtZXdvcmtFdmVudCBnZXRSZXN1bHQobG9uZyB0aW1lb3V0KSB7Ci0JCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJCUZyYW1ld29ya0V2ZW50IHRtcCA9IGV2ZW50OwotCQkJCWV2ZW50ID0gbnVsbDsKLQkJCQlyZXR1cm4gdG1wOwotCQkJfQotCQkJdHJ5IHsKLQkJCQl3YWl0KHRpbWVvdXQpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQkJRnJhbWV3b3JrRXZlbnQgdG1wID0gZXZlbnQ7Ci0JCQlldmVudCA9IG51bGw7Ci0JCQlyZXR1cm4gdG1wOwotCQl9Ci0JfTsKLQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3ROb25GYXRhbEV4Y2VwdGlvbigpIHsJCi0JCUZyYW1ld29ya0V2ZW50TGlzdGVuZXJXaXRoUmVzdWx0IGZ3a0xpc3RlbmVyID0gbmV3IEZyYW1ld29ya0V2ZW50TGlzdGVuZXJXaXRoUmVzdWx0KCk7Ci0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuYWRkRnJhbWV3b3JrTGlzdGVuZXIoZndrTGlzdGVuZXIpOwotCi0JCUJ1bmRsZUxpc3RlbmVyIG5wZUdlbmVyYXRvciA9IG5ldyBCdW5kbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGJ1bmRsZUNoYW5nZWQoQnVuZGxlRXZlbnQgZXZlbnQpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkdlbmVyYXRlZCBleGNlcHRpb24iKTsKLQkJCX0KLQkJfTsJCi0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuYWRkQnVuZGxlTGlzdGVuZXIobnBlR2VuZXJhdG9yKTsKLQkJCi0JCXRyeSB7Ci0JCQlCdW5kbGVUZXN0aW5nSGVscGVyLmluc3RhbGxCdW5kbGUoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgT1NHaVRlc3RzQWN0aXZhdG9yLlRFU1RfRklMRVNfUk9PVCArICJpbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwOSIpOwotCQkJRnJhbWV3b3JrRXZlbnQgZXZlbnRSZWNlaXZlZCA9IGZ3a0xpc3RlbmVyLmdldFJlc3VsdCg2MDAwMCk7Ci0JCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKEZyYW1ld29ya0V2ZW50LkVSUk9SLCBldmVudFJlY2VpdmVkLmdldFR5cGUoKSk7Ci0JCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUsIGV2ZW50UmVjZWl2ZWQuZ2V0VGhyb3dhYmxlKCkgaW5zdGFuY2VvZiBOdWxsUG9pbnRlckV4Y2VwdGlvbik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0RvZXMgbm90IGhhcHBlbgotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlbW92ZUZyYW1ld29ya0xpc3RlbmVyKGZ3a0xpc3RlbmVyKTsKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZW1vdmVCdW5kbGVMaXN0ZW5lcihucGVHZW5lcmF0b3IpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmF0YWxFeGNlcHRpb24oKSB7CQotCQlGcmFtZXdvcmtFdmVudExpc3RlbmVyV2l0aFJlc3VsdCBmd2tMaXN0ZW5lciA9IG5ldyBGcmFtZXdvcmtFdmVudExpc3RlbmVyV2l0aFJlc3VsdCgpOwotCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmFkZEZyYW1ld29ya0xpc3RlbmVyKGZ3a0xpc3RlbmVyKTsKLQotCQlCdW5kbGVMaXN0ZW5lciBmYXRhbEV4Y2VwdGlvbiA9IG5ldyBCdW5kbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGJ1bmRsZUNoYW5nZWQoQnVuZGxlRXZlbnQgZXZlbnQpIHsKLQkJCQl0aHJvdyBuZXcgT3V0T2ZNZW1vcnlFcnJvcigiR2VuZXJhdGVkIGV4Y2VwdGlvbiIpOwotCQkJfQotCQl9OwotCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmFkZEJ1bmRsZUxpc3RlbmVyKGZhdGFsRXhjZXB0aW9uKTsKLQkJCi0JCi0JCXRyeSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoImVjbGlwc2UuZXhpdE9uRXJyb3IiLCJmYWxzZSIpOyAvL0hlcmUgd2Ugc2V0IHRoZSB2YWx1ZSB0byBmYWxzZSwgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd291bGQgc2ltcGx5IGV4aXQKLQkJCUJ1bmRsZVRlc3RpbmdIZWxwZXIuaW5zdGFsbEJ1bmRsZShPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuVEVTVF9GSUxFU19ST09UICsgImludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTEwIik7Ci0JCQlGcmFtZXdvcmtFdmVudCBldmVudFJlY2VpdmVkID0gZndrTGlzdGVuZXIuZ2V0UmVzdWx0KDEwMDAwKTsKLQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoRnJhbWV3b3JrRXZlbnQuRVJST1IsIGV2ZW50UmVjZWl2ZWQuZ2V0VHlwZSgpKTsKLQkJCUFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSwgZXZlbnRSZWNlaXZlZC5nZXRUaHJvd2FibGUoKSBpbnN0YW5jZW9mIFZpcnR1YWxNYWNoaW5lRXJyb3IpOwotCQkJU3lzdGVtLnNldFByb3BlcnR5KCJlY2xpcHNlLmV4aXRPbkVycm9yIiwidHJ1ZSIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy9Eb2VzIG5vdCBoYXBwZW4KLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZW1vdmVGcmFtZXdvcmtMaXN0ZW5lcihmd2tMaXN0ZW5lcik7Ci0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVtb3ZlQnVuZGxlTGlzdGVuZXIoZmF0YWxFeGNlcHRpb24pOwotCX0KLSAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvbWlzYy9NaXNjVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9taXNjL01pc2NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjg4MzA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9taXNjL01pc2NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMubWlzYzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5jb3JlLkJ1bmRsZUhvc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5sb2FkZXIuU2luZ2xlU291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLQotcHVibGljIGNsYXNzIE1pc2NUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKE1pc2NUZXN0cy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI1MTQyNygpIHsKLQkJQnVuZGxlSG9zdCB0ZXN0c0J1bmRsZSA9IChCdW5kbGVIb3N0KSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpOwotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0cyBidW5kbGUgaXMgbnVsbCIsIHRlc3RzQnVuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVIb3N0IGhhcm5lc3NCdW5kbGUgPSAoQnVuZGxlSG9zdCkgUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJoYXJuZXNzIGJ1bmRsZSBpcyBudWxsIiwgaGFybmVzc0J1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlTaW5nbGVTb3VyY2VQYWNrYWdlIHAxMTEgPSBuZXcgU2luZ2xlU291cmNlUGFja2FnZSgicGtnMSIsIHRlc3RzQnVuZGxlLmdldExvYWRlclByb3h5KCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbmdsZVNvdXJjZVBhY2thZ2UgcDEyMSA9IG5ldyBTaW5nbGVTb3VyY2VQYWNrYWdlKCJwa2cxIiwgdGVzdHNCdW5kbGUuZ2V0TG9hZGVyUHJveHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2luZ2xlU291cmNlUGFja2FnZSBwMTEyID0gbmV3IFNpbmdsZVNvdXJjZVBhY2thZ2UoInBrZzEiLCBoYXJuZXNzQnVuZGxlLmdldExvYWRlclByb3h5KCkpOyAvLyROT04tTkxTLTEkCi0KLQkJU2luZ2xlU291cmNlUGFja2FnZSBwMjEyID0gbmV3IFNpbmdsZVNvdXJjZVBhY2thZ2UoInBrZzIiLCBoYXJuZXNzQnVuZGxlLmdldExvYWRlclByb3h5KCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbmdsZVNvdXJjZVBhY2thZ2UgcDIyMiA9IG5ldyBTaW5nbGVTb3VyY2VQYWNrYWdlKCJwa2cyIiwgaGFybmVzc0J1bmRsZS5nZXRMb2FkZXJQcm94eSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW5nbGVTb3VyY2VQYWNrYWdlIHAyMTEgPSBuZXcgU2luZ2xlU291cmNlUGFja2FnZSgicGtnMiIsIHRlc3RzQnVuZGxlLmdldExvYWRlclByb3h5KCkpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJzb3VyY2VzIG5vdCBlcXVhbCIsIHAxMTEsIHAxMjEpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygic291cmNlcyBoYXNoQ29kZSBub3QgZXF1YWwiLCBwMTExLmhhc2hDb2RlKCksIHAxMjEuaGFzaENvZGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJzb3VyY2VzIG5vdCBlcXVhbCIsIHAyMTIsIHAyMjIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygic291cmNlcyBoYXNoQ29kZSBub3QgZXF1YWwiLCBwMjEyLmhhc2hDb2RlKCksIHAyMjIuaGFzaENvZGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRGYWxzZSgic291cmNlcyBhcmUgZXF1YWwiLCBwMTExLmVxdWFscyhwMTEyKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoInNvdXJjZXMgYXJlIGVxdWFsIiwgcDIxMi5lcXVhbHMocDIxMSkpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3BlcmYvQWxsVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9wZXJmL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTM0YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3BlcmYvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5wZXJmOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCXB1YmxpYyBBbGxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoU3RhdGVQZXJmb3JtYW5jZVRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoU3RhdGVVc2VzUGVyZm9ybWFuY2VUZXN0LnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3BlcmYvQmFzZVBlcmZvcm1hbmNlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3BlcmYvQmFzZVBlcmZvcm1hbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI2MDczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9wZXJmL0Jhc2VQZXJmb3JtYW5jZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5wZXJmOwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBCYXNlUGVyZm9ybWFuY2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXByaXZhdGUgUmFuZG9tIHJhbmRvbTsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQmFzZVBlcmZvcm1hbmNlVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEJhc2VQZXJmb3JtYW5jZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlIGJ1aWxkUmFuZG9tU3RhdGUoaW50IHNpemUpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHN0YXRlRmFjdG9yeSA9IHN0YXRlLmdldEZhY3RvcnkoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBidW5kbGVzID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW3NpemVdOwotCQlpbnQgZXhwb3J0ZWRQYWNrYWdlcyA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJbG9uZyBidW5kbGVJZCA9IGk7Ci0JCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gImJ1bmRsZSIgKyBpOwotCQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oMSwgMCwgMCk7Ci0KLQkJCWludCBleHBvcnRQYWNrYWdlQ291bnQgPSByYW5kb20ubmV4dEludCg1KTsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydFBhY2thZ2VzID0gbmV3IEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltleHBvcnRQYWNrYWdlQ291bnRdOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHBvcnRQYWNrYWdlcy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9ICJwYWNrYWdlLiIgKyBleHBvcnRlZFBhY2thZ2VzKys7Ci0JCQkJVmVyc2lvbiBwYWNrYWdlVmVyc2lvbiA9IFZlcnNpb24ucGFyc2VWZXJzaW9uKCIxLjAuMCIpOwotCQkJCWV4cG9ydFBhY2thZ2VzW2pdID0gc3RhdGVGYWN0b3J5LmNyZWF0ZUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbihwYWNrYWdlTmFtZSwgcGFja2FnZVZlcnNpb24sIG51bGwsIG51bGwsIHRydWUsIG51bGwpOwotCQkJfQotCQkJaW50IGltcG9ydFBhY2thZ2VDb3VudCA9IE1hdGgubWluKGV4cG9ydFBhY2thZ2VDb3VudCwgcmFuZG9tLm5leHRJbnQoNSkpOwotCQkJaW50IGltcG9ydGVkUGFja2FnZUluZGV4ID0gcmFuZG9tLm5leHRJbnQoZXhwb3J0UGFja2FnZUNvdW50ICsgMSk7Ci0JCQlJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbltdIGltcG9ydFBhY2thZ2VzID0gbmV3IEltcG9ydFBhY2thZ2VTcGVjaWZpY2F0aW9uW2ltcG9ydFBhY2thZ2VDb3VudF07Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGltcG9ydFBhY2thZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaW50IGluZGV4ID0gaW1wb3J0ZWRQYWNrYWdlSW5kZXgrKzsKLQkJCQlpZiAoaW1wb3J0ZWRQYWNrYWdlSW5kZXggPiBleHBvcnRQYWNrYWdlQ291bnQpCi0JCQkJCWltcG9ydGVkUGFja2FnZUluZGV4ID0gMTsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSAicGFja2FnZS4iICsgaW5kZXg7Ci0JCQkJaW1wb3J0UGFja2FnZXNbal0gPSBzdGF0ZUZhY3RvcnkuY3JlYXRlSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb24ocGFja2FnZU5hbWUsIG5ldyBWZXJzaW9uUmFuZ2UoIjEuMC4wIiksIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCQkJfQotCi0JCQlCdW5kbGVTcGVjaWZpY2F0aW9uW10gcmVxdWlyZWRCdW5kbGVzID0gbmV3IEJ1bmRsZVNwZWNpZmljYXRpb25bTWF0aC5taW4oaSwgcmFuZG9tLm5leHRJbnQoNSkpXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVxdWlyZWRCdW5kbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaW50IHJlcXVpcmVkSW5kZXggPSByYW5kb20ubmV4dEludChpKTsKLQkJCQlTdHJpbmcgcmVxdWlyZWROYW1lID0gYnVuZGxlc1tyZXF1aXJlZEluZGV4XS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCQlWZXJzaW9uIHJlcXVpcmVkVmVyc2lvbiA9IGJ1bmRsZXNbcmVxdWlyZWRJbmRleF0uZ2V0VmVyc2lvbigpOwotCQkJCWJvb2xlYW4gZXhwb3J0ID0gcmFuZG9tLm5leHRJbnQoMTApID4gNjsKLQkJCQlib29sZWFuIG9wdGlvbmFsID0gcmFuZG9tLm5leHRJbnQoMTApID4gODsKLQkJCQlyZXF1aXJlZEJ1bmRsZXNbal0gPSBzdGF0ZUZhY3RvcnkuY3JlYXRlQnVuZGxlU3BlY2lmaWNhdGlvbihyZXF1aXJlZE5hbWUsIG5ldyBWZXJzaW9uUmFuZ2UocmVxdWlyZWRWZXJzaW9uLnRvU3RyaW5nKCkpLCBleHBvcnQsIG9wdGlvbmFsKTsKLQkJCX0KLQotCQkJYnVuZGxlc1tpXSA9IHN0YXRlRmFjdG9yeS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihidW5kbGVJZCwgc3ltYm9saWNOYW1lLCB2ZXJzaW9uLCBzeW1ib2xpY05hbWUsIHJlcXVpcmVkQnVuZGxlcywgKEhvc3RTcGVjaWZpY2F0aW9uKSBudWxsLCBpbXBvcnRQYWNrYWdlcywgZXhwb3J0UGFja2FnZXMsIG51bGwsIHJhbmRvbS5uZXh0RG91YmxlKCkgPiAwLjA1KTsKLQkJCXN0YXRlLmFkZEJ1bmRsZShidW5kbGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gdXNlcyBhIGNvbnN0YW50IHNlZWQgdG8gcHJldmVudCB2YXJpYXRpb24gb24gcmVzdWx0cwotCQl0aGlzLnJhbmRvbSA9IG5ldyBSYW5kb20oMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcGVyZi9TdGF0ZVBlcmZvcm1hbmNlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3BlcmYvU3RhdGVQZXJmb3JtYW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5MjQ1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcGVyZi9TdGF0ZVBlcmZvcm1hbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnBlcmY7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MuQ29yZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLlBlcmZvcm1hbmNlVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0ZVBlcmZvcm1hbmNlVGVzdCBleHRlbmRzIEJhc2VQZXJmb3JtYW5jZVRlc3QgewotCi0JLy8gVE9ETyB0aGlzIHNob3VsZCBiZSByZW1vdmVkIGluIDMuNwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBFUkZPUk1BTkNFX0JVRzMxMTU0Nl9FWFBMQU5BVElPTiA9ICJQZXJmb3JtYW5jZSBkZWNyZWFzZSBjYXVzZWQgaW1wcm92ZW1lbnRzIGluIG1lbW9yeSB1c2FnZS4gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjkxODUgZm9yIGRldGFpbHMuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTdGF0ZVBlcmZvcm1hbmNlVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIFN0YXRlUGVyZm9ybWFuY2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RhdGUgc3RvcmVBbmRSZXRyaWV2ZShTdGF0ZSB0b1N0b3JlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdG9TdG9yZS5nZXRGYWN0b3J5KCkud3JpdGVTdGF0ZSh0b1N0b3JlLCBiYW9zKTsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotCQlyZXR1cm4gdG9TdG9yZS5nZXRGYWN0b3J5KCkucmVhZFN0YXRlKGJhaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbigpIHsKLQkJZmluYWwgaW50IHN0YXRlU2l6ZSA9IDUwMDA7Ci0JCW5ldyBQZXJmb3JtYW5jZVRlc3RSdW5uZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgewotCQkJCWJ1aWxkUmFuZG9tU3RhdGUoc3RhdGVTaXplKTsKLQkJCX0KLQkJfS5ydW4odGhpcywgMTAsIDEwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFJlc29sdXRpb24oaW50IHN0YXRlU2l6ZSwgaW50IHJlcGV0aXRpb25zLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgZGVncmFkYXRpb24pIHsKLQkJZmluYWwgU3RhdGUgb3JpZ2luYWxTdGF0ZSA9IGJ1aWxkUmFuZG9tU3RhdGUoc3RhdGVTaXplKTsKLQkJUGVyZm9ybWFuY2VUZXN0UnVubmVyIHJ1bm5lciA9IG5ldyBQZXJmb3JtYW5jZVRlc3RSdW5uZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgewotCQkJCW9yaWdpbmFsU3RhdGUucmVzb2x2ZShmYWxzZSk7Ci0JCQl9Ci0JCX07Ci0JCXJ1bm5lci5zZXRSZWdyZXNzaW9uUmVhc29uKGRlZ3JhZGF0aW9uKTsKLQkJcnVubmVyLnJ1bih0aGlzLCBsb2NhbE5hbWUsIDEwLCByZXBldGl0aW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdXRpb24xMDAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0ZXN0UmVzb2x1dGlvbigxMDAsIDUwMCwgbnVsbCwgUEVSRk9STUFOQ0VfQlVHMzExNTQ2X0VYUExBTkFUSU9OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x1dGlvbjEwMDAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0ZXN0UmVzb2x1dGlvbigxMDAwLCAxNSwgIlN0YXRlIFJlc29sdXRpb24iLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x1dGlvbjUwMCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRlc3RSZXNvbHV0aW9uKDUwMCwgNTAsIG51bGwsIFBFUkZPUk1BTkNFX0JVRzMxMTU0Nl9FWFBMQU5BVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdXRpb241MDAwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGVzdFJlc29sdXRpb24oNTAwMCwgMSwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0b3JlQW5kUmV0cmlldmUoKSB7Ci0JCWludCBzdGF0ZVNpemUgPSA1MDAwOwotCQlmaW5hbCBTdGF0ZSBvcmlnaW5hbFN0YXRlID0gYnVpbGRSYW5kb21TdGF0ZShzdGF0ZVNpemUpOwotCQluZXcgUGVyZm9ybWFuY2VUZXN0UnVubmVyKCkgewotCQkJcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHsKLQkJCQl0cnkgewotCQkJCQlzdG9yZUFuZFJldHJpZXZlKG9yaWdpbmFsU3RhdGUpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29yZVRlc3QuZmFpbCgiIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9LnJ1bih0aGlzLCAxMCwgMTApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3BlcmYvU3RhdGVVc2VzUGVyZm9ybWFuY2VUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcGVyZi9TdGF0ZVVzZXNQZXJmb3JtYW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5ODVlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcGVyZi9TdGF0ZVVzZXNQZXJmb3JtYW5jZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucGVyZjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MuUGVyZm9ybWFuY2VUZXN0UnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0ZVVzZXNQZXJmb3JtYW5jZVRlc3QgZXh0ZW5kcyBCYXNlUGVyZm9ybWFuY2VUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RhdGVVc2VzUGVyZm9ybWFuY2VUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgU3RhdGVVc2VzUGVyZm9ybWFuY2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1VzZXNSZXNvbHV0aW9uKGludCBzdGF0ZVNpemUsIGludCByZXBldGl0aW9ucywgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIGRlZ3JhZGF0aW9uKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RhdGUgb3JpZ2luYWxTdGF0ZSA9IGJ1aWxkUmFuZG9tU3RhdGUoc3RhdGVTaXplKTsKLQkJYWRkVXNlc0J1bmRsZXMob3JpZ2luYWxTdGF0ZSk7Ci0JCVBlcmZvcm1hbmNlVGVzdFJ1bm5lciBydW5uZXIgPSBuZXcgUGVyZm9ybWFuY2VUZXN0UnVubmVyKCkgewotCQkJcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHsKLQkJCQlvcmlnaW5hbFN0YXRlLnJlc29sdmUoZmFsc2UpOwotCQkJfQotCQl9OwotCQlydW5uZXIuc2V0UmVncmVzc2lvblJlYXNvbihkZWdyYWRhdGlvbik7Ci0JCXJ1bm5lci5ydW4odGhpcywgbG9jYWxOYW1lLCAxMCwgcmVwZXRpdGlvbnMpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVzZXNSZXNvbHV0aW9uMDAxMDAoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJZG9Vc2VzUmVzb2x1dGlvbigxMDAsIDEwMCwgbnVsbCwgU3RhdGVQZXJmb3JtYW5jZVRlc3QuUEVSRk9STUFOQ0VfQlVHMzExNTQ2X0VYUExBTkFUSU9OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXNlc1Jlc29sdXRpb24wMDUwMCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlkb1VzZXNSZXNvbHV0aW9uKDUwMCwgMTAsIG51bGwsIFN0YXRlUGVyZm9ybWFuY2VUZXN0LlBFUkZPUk1BTkNFX0JVRzMxMTU0Nl9FWFBMQU5BVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVzZXNSZXNvbHV0aW9uMDEwMDAoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJZG9Vc2VzUmVzb2x1dGlvbigxMDAwLCAxMCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVzZXNSZXNvbHV0aW9uMDUwMDAoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJZG9Vc2VzUmVzb2x1dGlvbig1MDAwLCAxLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVXNlc0J1bmRsZXMoU3RhdGUgc3RhdGUpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlpbnQgaWQgPSBzdGF0ZS5nZXRCdW5kbGVzKCkubGVuZ3RoICsgNTAwOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKykpOwotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjIuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhIik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIzLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYSIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKSk7Ci0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiNC4wLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKykpOwotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjUuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhIik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYjsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYjsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIzLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYjsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICI0LjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYjsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICI1LjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYjsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYzsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMi4wLjAsMy4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYzsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMi4wLjAsMy4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIzLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYzsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMi4wLjAsMy4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICI0LjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYzsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMi4wLjAsMy4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICI1LjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYzsgdXNlczo9YSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMi4wLjAsMy4wLjApXCI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJGIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiZjsgdXNlczo9YiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQSwgQiwgQyIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcGVybWlzc2lvbnMvQWRtaW5QZXJtaXNzaW9uVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9wZXJtaXNzaW9ucy9BZG1pblBlcm1pc3Npb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjE1MjZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9wZXJtaXNzaW9ucy9BZG1pblBlcm1pc3Npb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucGVybWlzc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkFkbWluUGVybWlzc2lvbjsKLQotcHVibGljIGNsYXNzIEFkbWluUGVybWlzc2lvblRlc3RzIGV4dGVuZHMgUGVybWlzc2lvblRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQWRtaW5QZXJtaXNzaW9uVGVzdHMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZG1pblBlcm1pc3Npb24oKSB7Ci0JCUFkbWluUGVybWlzc2lvbiBwMSA9IG5ldyBBZG1pblBlcm1pc3Npb24oKTsKLQkJQWRtaW5QZXJtaXNzaW9uIHAyID0gbmV3IEFkbWluUGVybWlzc2lvbigiKiIsICIqIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlQZXJtaXNzaW9uIG9wID0gbmV3IFByb3BlcnR5UGVybWlzc2lvbigiamF2YS5ob21lIiwgInJlYWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJc2hvdWxkSW1wbHkocDEsIHAyKTsKLQkJc2hvdWxkSW1wbHkocDEsIHAxKTsKLQkJc2hvdWxkTm90SW1wbHkocDEsIG9wKTsKLQotCQlzaG91bGRFcXVhbChwMSwgcDIpOwotCQlzaG91bGROb3RFcXVhbChwMSwgb3ApOwotCi0JCVBlcm1pc3Npb25Db2xsZWN0aW9uIHBjID0gcDEubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQotCQljaGVja0VudW1lcmF0aW9uKHBjLmVsZW1lbnRzKCksIHRydWUpOwotCi0JCXNob3VsZE5vdEltcGx5KHBjLCBwMSk7Ci0KLQkJc2hvdWxkQWRkKHBjLCBwMSk7Ci0JCXNob3VsZEFkZChwYywgcDIpOwotCQlzaG91bGROb3RBZGQocGMsIG9wKTsKLQotCQlwYy5zZXRSZWFkT25seSgpOwotCi0JCXNob3VsZE5vdEFkZChwYywgbmV3IEFkbWluUGVybWlzc2lvbigpKTsKLQotCQlzaG91bGRJbXBseShwYywgcDEpOwotCQlzaG91bGRJbXBseShwYywgcDIpOwotCQlzaG91bGROb3RJbXBseShwYywgb3ApOwotCi0JCWNoZWNrRW51bWVyYXRpb24ocGMuZWxlbWVudHMoKSwgZmFsc2UpOwotCi0JCXRlc3RTZXJpYWxpemF0aW9uKHAxKTsKLQkJdGVzdFNlcmlhbGl6YXRpb24ocDIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Blcm1pc3Npb25zL1BhY2thZ2VQZXJtaXNzaW9uVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9wZXJtaXNzaW9ucy9QYWNrYWdlUGVybWlzc2lvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MGQxN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Blcm1pc3Npb25zL1BhY2thZ2VQZXJtaXNzaW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5wZXJtaXNzaW9uczsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuUGFja2FnZVBlcm1pc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBQYWNrYWdlUGVybWlzc2lvblRlc3RzIGV4dGVuZHMgUGVybWlzc2lvblRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoUGFja2FnZVBlcm1pc3Npb25UZXN0cy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhY2thZ2VQZXJtaXNzaW9uKCkgewotCQliYWRQYWNrYWdlUGVybWlzc2lvbigiYS5iLmMiLCAieCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkUGFja2FnZVBlcm1pc3Npb24oImEuYi5jIiwgIiAgIGdldCAgLCAgeCAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkUGFja2FnZVBlcm1pc3Npb24oImEuYi5jIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkUGFja2FnZVBlcm1pc3Npb24oImEuYi5jIiwgIiAgICAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkUGFja2FnZVBlcm1pc3Npb24oImEuYi5jIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJYmFkUGFja2FnZVBlcm1pc3Npb24oImEuYi5jIiwgIiwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJhZFBhY2thZ2VQZXJtaXNzaW9uKCJhLmIuYyIsICIseHh4Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRQYWNrYWdlUGVybWlzc2lvbigiYS5iLmMiLCAieHh4LCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkUGFja2FnZVBlcm1pc3Npb24oImEuYi5jIiwgImltcG9ydCwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJhZFBhY2thZ2VQZXJtaXNzaW9uKCJhLmIuYyIsICJleHBvcnQsICAgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRQYWNrYWdlUGVybWlzc2lvbigiYS5iLmMiLCAiaW1wb3J0bWUsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRQYWNrYWdlUGVybWlzc2lvbigiYS5iLmMiLCAiZXhwb3J0bWUsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRQYWNrYWdlUGVybWlzc2lvbigiYS5iLmMiLCAiLGltcG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkUGFja2FnZVBlcm1pc3Npb24oImEuYi5jIiwgIixleHBvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJhZFBhY2thZ2VQZXJtaXNzaW9uKCJhLmIuYyIsICIgICBpbXBvcnRtZSAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkUGFja2FnZVBlcm1pc3Npb24oImEuYi5jIiwgIiAgIGV4cG9ydG1lICAgICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJhZFBhY2thZ2VQZXJtaXNzaW9uKCJhLmIuYyIsICIgICBpbXBvciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkUGFja2FnZVBlcm1pc3Npb24oImEuYi5jIiwgIiAgIGV4cG9yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVBlcm1pc3Npb24gb3AgPSBuZXcgUHJvcGVydHlQZXJtaXNzaW9uKCJqYXZhLmhvbWUiLCAicmVhZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlQYWNrYWdlUGVybWlzc2lvbiBwMTEgPSBuZXcgUGFja2FnZVBlcm1pc3Npb24oImNvbS5mb28uc2VydmljZTEiLCAiICAgIElNUE9SVCxleHBvcnQgICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVBhY2thZ2VQZXJtaXNzaW9uIHAxMiA9IG5ldyBQYWNrYWdlUGVybWlzc2lvbigiY29tLmZvby5zZXJ2aWNlMSIsICJFWFBPUlQgICwgICBpbXBvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVBhY2thZ2VQZXJtaXNzaW9uIHAxMyA9IG5ldyBQYWNrYWdlUGVybWlzc2lvbigiY29tLmZvby5zZXJ2aWNlMSIsICJleHBPUlQgICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVBhY2thZ2VQZXJtaXNzaW9uIHAxNCA9IG5ldyBQYWNrYWdlUGVybWlzc2lvbigiY29tLmZvby5zZXJ2aWNlMSIsICIgICAgSW1wb3J0ICAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlzaG91bGRJbXBseShwMTEsIHAxMSk7Ci0JCXNob3VsZEltcGx5KHAxMSwgcDEyKTsKLQkJc2hvdWxkSW1wbHkocDExLCBwMTMpOwotCQlzaG91bGRJbXBseShwMTEsIHAxNCk7Ci0KLQkJc2hvdWxkSW1wbHkocDEyLCBwMTEpOwotCQlzaG91bGRJbXBseShwMTIsIHAxMik7Ci0JCXNob3VsZEltcGx5KHAxMiwgcDEzKTsKLQkJc2hvdWxkSW1wbHkocDEyLCBwMTQpOwotCi0JCXNob3VsZEltcGx5KHAxMywgcDExKTsKLQkJc2hvdWxkSW1wbHkocDEzLCBwMTIpOwotCQlzaG91bGRJbXBseShwMTMsIHAxMyk7Ci0JCXNob3VsZEltcGx5KHAxMywgcDE0KTsKLQotCQlzaG91bGRJbXBseShwMTQsIHAxNCk7Ci0KLQkJc2hvdWxkTm90SW1wbHkocDE0LCBwMTEpOwotCQlzaG91bGROb3RJbXBseShwMTQsIHAxMik7Ci0JCXNob3VsZE5vdEltcGx5KHAxNCwgcDEzKTsKLQotCQlzaG91bGROb3RJbXBseShwMTEsIG9wKTsKLQotCQlzaG91bGRFcXVhbChwMTEsIHAxMSk7Ci0JCXNob3VsZEVxdWFsKHAxMSwgcDEyKTsKLQkJc2hvdWxkRXF1YWwocDExLCBwMTMpOwotCQlzaG91bGRFcXVhbChwMTIsIHAxMSk7Ci0JCXNob3VsZEVxdWFsKHAxMiwgcDEyKTsKLQkJc2hvdWxkRXF1YWwocDEyLCBwMTMpOwotCQlzaG91bGRFcXVhbChwMTMsIHAxMSk7Ci0JCXNob3VsZEVxdWFsKHAxMywgcDEyKTsKLQkJc2hvdWxkRXF1YWwocDEzLCBwMTMpOwotCi0JCXNob3VsZE5vdEVxdWFsKHAxMSwgcDE0KTsKLQkJc2hvdWxkTm90RXF1YWwocDEyLCBwMTQpOwotCQlzaG91bGROb3RFcXVhbChwMTMsIHAxNCk7Ci0JCXNob3VsZE5vdEVxdWFsKHAxNCwgcDExKTsKLQkJc2hvdWxkTm90RXF1YWwocDE0LCBwMTIpOwotCQlzaG91bGROb3RFcXVhbChwMTQsIHAxMyk7Ci0KLQkJUGVybWlzc2lvbkNvbGxlY3Rpb24gcGMgPSBwMTMubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQotCQljaGVja0VudW1lcmF0aW9uKHBjLmVsZW1lbnRzKCksIHRydWUpOwotCi0JCXNob3VsZE5vdEltcGx5KHBjLCBwMTEpOwotCi0JCXNob3VsZEFkZChwYywgcDE0KTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxNCk7Ci0JCXNob3VsZE5vdEltcGx5KHBjLCBwMTEpOwotCQlzaG91bGROb3RJbXBseShwYywgcDEyKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAxMyk7Ci0KLQkJc2hvdWxkQWRkKHBjLCBwMTMpOwotCQlzaG91bGRJbXBseShwYywgcDExKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxMik7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTMpOwotCQlzaG91bGRJbXBseShwYywgcDE0KTsKLQotCQlzaG91bGROb3RBZGQocGMsIG9wKTsKLQotCQlwYyA9IHAxMy5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwotCi0JCXNob3VsZEFkZChwYywgcDEzKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxMSk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTIpOwotCQlzaG91bGRJbXBseShwYywgcDEzKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxNCk7Ci0KLQkJcGMgPSBwMTEubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQotCQlzaG91bGRBZGQocGMsIHAxMSk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTEpOwotCQlzaG91bGRJbXBseShwYywgcDEyKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxMyk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTQpOwotCi0JCXBjLnNldFJlYWRPbmx5KCk7Ci0KLQkJc2hvdWxkTm90QWRkKHBjLCBwMTIpOwotCi0JCWNoZWNrRW51bWVyYXRpb24ocGMuZWxlbWVudHMoKSwgZmFsc2UpOwotCi0JCVBhY2thZ2VQZXJtaXNzaW9uIHAyMSA9IG5ldyBQYWNrYWdlUGVybWlzc2lvbigiY29tLmZvby5zZXJ2aWNlMiIsICJpbXBvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVBhY2thZ2VQZXJtaXNzaW9uIHAyMiA9IG5ldyBQYWNrYWdlUGVybWlzc2lvbigiY29tLmZvby4qIiwgImltcG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJUGFja2FnZVBlcm1pc3Npb24gcDIzID0gbmV3IFBhY2thZ2VQZXJtaXNzaW9uKCJjb20uKiIsICJpbXBvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVBhY2thZ2VQZXJtaXNzaW9uIHAyNCA9IG5ldyBQYWNrYWdlUGVybWlzc2lvbigiKiIsICJpbXBvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJc2hvdWxkSW1wbHkocDIxLCBwMjEpOwotCQlzaG91bGRJbXBseShwMjIsIHAyMSk7Ci0JCXNob3VsZEltcGx5KHAyMywgcDIxKTsKLQkJc2hvdWxkSW1wbHkocDI0LCBwMjEpOwotCi0JCXNob3VsZEltcGx5KHAyMiwgcDIyKTsKLQkJc2hvdWxkSW1wbHkocDIzLCBwMjIpOwotCQlzaG91bGRJbXBseShwMjQsIHAyMik7Ci0KLQkJc2hvdWxkSW1wbHkocDIzLCBwMjMpOwotCQlzaG91bGRJbXBseShwMjQsIHAyMyk7Ci0KLQkJc2hvdWxkSW1wbHkocDI0LCBwMjQpOwotCi0JCXNob3VsZE5vdEltcGx5KHAyMSwgcDIyKTsKLQkJc2hvdWxkTm90SW1wbHkocDIxLCBwMjMpOwotCQlzaG91bGROb3RJbXBseShwMjEsIHAyNCk7Ci0KLQkJc2hvdWxkTm90SW1wbHkocDIyLCBwMjMpOwotCQlzaG91bGROb3RJbXBseShwMjIsIHAyNCk7Ci0KLQkJc2hvdWxkTm90SW1wbHkocDIzLCBwMjQpOwotCi0JCXBjID0gcDIxLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7Ci0KLQkJc2hvdWxkQWRkKHBjLCBwMjEpOwotCQlzaG91bGRJbXBseShwYywgcDIxKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAyMik7Ci0JCXNob3VsZE5vdEltcGx5KHBjLCBwMjMpOwotCQlzaG91bGROb3RJbXBseShwYywgcDI0KTsKLQotCQlzaG91bGRBZGQocGMsIHAyMik7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjEpOwotCQlzaG91bGRJbXBseShwYywgcDIyKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAyMyk7Ci0JCXNob3VsZE5vdEltcGx5KHBjLCBwMjQpOwotCi0JCXNob3VsZEFkZChwYywgcDIzKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMSk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjIpOwotCQlzaG91bGRJbXBseShwYywgcDIzKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAyNCk7Ci0KLQkJc2hvdWxkQWRkKHBjLCBwMjQpOwotCQlzaG91bGRJbXBseShwYywgcDIxKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMik7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjMpOwotCQlzaG91bGRJbXBseShwYywgcDI0KTsKLQotCQlwYyA9IHAyMi5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwotCi0JCXNob3VsZEFkZChwYywgcDIyKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMSk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjIpOwotCQlzaG91bGROb3RJbXBseShwYywgcDIzKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAyNCk7Ci0KLQkJcGMgPSBwMjMubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQotCQlzaG91bGRBZGQocGMsIHAyMyk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjEpOwotCQlzaG91bGRJbXBseShwYywgcDIyKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMyk7Ci0JCXNob3VsZE5vdEltcGx5KHBjLCBwMjQpOwotCi0JCXBjID0gcDI0Lm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7Ci0KLQkJc2hvdWxkQWRkKHBjLCBwMjQpOwotCQlzaG91bGRJbXBseShwYywgcDIxKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMik7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjMpOwotCQlzaG91bGRJbXBseShwYywgcDI0KTsKLQotCQl0ZXN0U2VyaWFsaXphdGlvbihwMTEpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMTIpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMTMpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMTQpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMjEpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMjIpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMjMpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMjQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25UZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjE5NmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5wZXJtaXNzaW9uczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlBhY2thZ2VQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUGVybWlzc2lvbjsKLQotcHVibGljIGNsYXNzIFBlcm1pc3Npb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoUGVybWlzc2lvblRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWRtaW5QZXJtaXNzaW9uVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoU2VydmljZVBlcm1pc3Npb25UZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChQYWNrYWdlUGVybWlzc2lvblRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmFkU2VydmljZVBlcm1pc3Npb24oU3RyaW5nIG5hbWUsIFN0cmluZyBhY3Rpb25zKSB7Ci0JCXRyeSB7Ci0JCQlTZXJ2aWNlUGVybWlzc2lvbiBwID0gbmV3IFNlcnZpY2VQZXJtaXNzaW9uKG5hbWUsIGFjdGlvbnMpOwotCQkJZmFpbChwICsgIiBjcmVhdGVkIHdpdGggaW52YWxpZCBhY3Rpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYWRQYWNrYWdlUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKLQkJdHJ5IHsKLQkJCVBhY2thZ2VQZXJtaXNzaW9uIHAgPSBuZXcgUGFja2FnZVBlcm1pc3Npb24obmFtZSwgYWN0aW9ucyk7Ci0JCQlmYWlsKHAgKyAiIGNyZWF0ZWQgd2l0aCBpbnZhbGlkIGFjdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrRW51bWVyYXRpb24oRW51bWVyYXRpb24gZW4sIGJvb2xlYW4gaXNFbXB0eSkgewotCQlhc3NlcnRFcXVhbHMoZW4gKyAiIGVtcHR5IHN0YXRlIGlzIGludmFsaWQiLCAhaXNFbXB0eSwgZW4uaGFzTW9yZUVsZW1lbnRzKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQllbi5uZXh0RWxlbWVudCgpOwotCQkJfQotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZW4gKyAiIHRocmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWVuLm5leHRFbGVtZW50KCk7Ci0JCQlmYWlsKGVuICsgIiBpcyBlbXB0eSBidXQgZGlkbid0IHRocm93IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG91bGRJbXBseShQZXJtaXNzaW9uIHAxLCBQZXJtaXNzaW9uIHAyKSB7Ci0JCWFzc2VydFRydWUocDEgKyAiIGRvZXMgbm90IGltcGx5ICIgKyBwMiwgcDEuaW1wbGllcyhwMikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2hvdWxkTm90SW1wbHkoUGVybWlzc2lvbiBwMSwgUGVybWlzc2lvbiBwMikgewotCQlhc3NlcnRGYWxzZShwMSArICIgZG9lcyBpbXBseSAiICsgcDIsIHAxLmltcGxpZXMocDIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3VsZEltcGx5KFBlcm1pc3Npb25Db2xsZWN0aW9uIHAxLCBQZXJtaXNzaW9uIHAyKSB7Ci0JCWFzc2VydFRydWUocDEgKyAiIGRvZXMgbm90IGltcGx5ICIgKyBwMiwgcDEuaW1wbGllcyhwMikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2hvdWxkTm90SW1wbHkoUGVybWlzc2lvbkNvbGxlY3Rpb24gcDEsIFBlcm1pc3Npb24gcDIpIHsKLQkJYXNzZXJ0RmFsc2UocDEgKyAiIGRvZXMgaW1wbHkgIiArIHAyLCBwMS5pbXBsaWVzKHAyKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG91bGRFcXVhbChQZXJtaXNzaW9uIHAxLCBQZXJtaXNzaW9uIHAyKSB7Ci0JCWFzc2VydFRydWUocDEgKyAiIGRvZXMgbm90IGVxdWFsICIgKyBwMiwgcDEuZXF1YWxzKHAyKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShwMiArICIgZG9lcyBub3QgZXF1YWwgIiArIHAxLCBwMi5lcXVhbHMocDEpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3VsZE5vdEVxdWFsKFBlcm1pc3Npb24gcDEsIFBlcm1pc3Npb24gcDIpIHsKLQkJYXNzZXJ0RmFsc2UocDEgKyAiIGRvZXMgZXF1YWwgIiArIHAyLCBwMS5lcXVhbHMocDIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3VsZEFkZChQZXJtaXNzaW9uQ29sbGVjdGlvbiBwMSwgUGVybWlzc2lvbiBwMikgewotCQl0cnkgewotCQkJcDEuYWRkKHAyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwocDEgKyAiIHdpbGwgbm90IGFkZCAiICsgcDIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG91bGROb3RBZGQoUGVybWlzc2lvbkNvbGxlY3Rpb24gcDEsIFBlcm1pc3Npb24gcDIpIHsKLQkJdHJ5IHsKLQkJCXAxLmFkZChwMik7Ci0JCQlmYWlsKHAxICsgIiB3aWxsIGFkZCAiICsgcDIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oUGVybWlzc2lvbiBwMSkgewotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKLQotCQkJb3V0LndyaXRlT2JqZWN0KHAxKTsKLQkJCW91dC5mbHVzaCgpOwotCQkJb3V0LmNsb3NlKCk7Ci0KLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLQkJCU9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOwotCi0JCQlQZXJtaXNzaW9uIHAyID0gKFBlcm1pc3Npb24pIGluLnJlYWRPYmplY3QoKTsKLQotCQkJc2hvdWxkRXF1YWwocDEsIHAyKTsKLQkJCXNob3VsZEltcGx5KHAxLCBwMik7Ci0JCQlzaG91bGRJbXBseShwMiwgcDEpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcGVybWlzc2lvbnMvU2VydmljZVBlcm1pc3Npb25UZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Blcm1pc3Npb25zL1NlcnZpY2VQZXJtaXNzaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEyMjQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcGVybWlzc2lvbnMvU2VydmljZVBlcm1pc3Npb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnBlcm1pc3Npb25zOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUGVybWlzc2lvbjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQZXJtaXNzaW9uVGVzdHMgZXh0ZW5kcyBQZXJtaXNzaW9uVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTZXJ2aWNlUGVybWlzc2lvblRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVBlcm1pc3Npb24oKSB7Ci0JCWJhZFNlcnZpY2VQZXJtaXNzaW9uKCJhLmIuYyIsICJ4Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRTZXJ2aWNlUGVybWlzc2lvbigiYS5iLmMiLCAiICAgZ2V0ICAsICB4ICAgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRTZXJ2aWNlUGVybWlzc2lvbigiYS5iLmMiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRTZXJ2aWNlUGVybWlzc2lvbigiYS5iLmMiLCAiICAgICAgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRTZXJ2aWNlUGVybWlzc2lvbigiYS5iLmMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQliYWRTZXJ2aWNlUGVybWlzc2lvbigiYS5iLmMiLCAiLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkU2VydmljZVBlcm1pc3Npb24oImEuYi5jIiwgIix4eHgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJhZFNlcnZpY2VQZXJtaXNzaW9uKCJhLmIuYyIsICJ4eHgsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRTZXJ2aWNlUGVybWlzc2lvbigiYS5iLmMiLCAiZ2V0LCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkU2VydmljZVBlcm1pc3Npb24oImEuYi5jIiwgInJlZ2lzdGVyLCAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkU2VydmljZVBlcm1pc3Npb24oImEuYi5jIiwgImdldG1lLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkU2VydmljZVBlcm1pc3Npb24oImEuYi5jIiwgInJlZ2lzdGVybWUsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRTZXJ2aWNlUGVybWlzc2lvbigiYS5iLmMiLCAiLGdldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkU2VydmljZVBlcm1pc3Npb24oImEuYi5jIiwgIixyZWdpc3RlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYmFkU2VydmljZVBlcm1pc3Npb24oImEuYi5jIiwgIiAgIGdldG1lICAgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRTZXJ2aWNlUGVybWlzc2lvbigiYS5iLmMiLCAiICAgcmVnaXN0ZXJtZSAgICAgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYWRTZXJ2aWNlUGVybWlzc2lvbigiYS5iLmMiLCAiICAgZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJhZFNlcnZpY2VQZXJtaXNzaW9uKCJhLmIuYyIsICIgICByZWdpc3RlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVBlcm1pc3Npb24gb3AgPSBuZXcgUHJvcGVydHlQZXJtaXNzaW9uKCJqYXZhLmhvbWUiLCAicmVhZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlTZXJ2aWNlUGVybWlzc2lvbiBwMTEgPSBuZXcgU2VydmljZVBlcm1pc3Npb24oImNvbS5mb28uc2VydmljZTEiLCAiICAgIEdFVCxyZWdpc3RlciAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU2VydmljZVBlcm1pc3Npb24gcDEyID0gbmV3IFNlcnZpY2VQZXJtaXNzaW9uKCJjb20uZm9vLnNlcnZpY2UxIiwgIlJFR0lTVEVSICAsICAgZ2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTZXJ2aWNlUGVybWlzc2lvbiBwMTMgPSBuZXcgU2VydmljZVBlcm1pc3Npb24oImNvbS5mb28uc2VydmljZTEiLCAicmVnaXNURVIgICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVNlcnZpY2VQZXJtaXNzaW9uIHAxNCA9IG5ldyBTZXJ2aWNlUGVybWlzc2lvbigiY29tLmZvby5zZXJ2aWNlMSIsICIgICAgR2V0ICAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlzaG91bGRJbXBseShwMTEsIHAxMSk7Ci0JCXNob3VsZEltcGx5KHAxMSwgcDEyKTsKLQkJc2hvdWxkSW1wbHkocDExLCBwMTMpOwotCQlzaG91bGRJbXBseShwMTEsIHAxNCk7Ci0KLQkJc2hvdWxkSW1wbHkocDEyLCBwMTEpOwotCQlzaG91bGRJbXBseShwMTIsIHAxMik7Ci0JCXNob3VsZEltcGx5KHAxMiwgcDEzKTsKLQkJc2hvdWxkSW1wbHkocDEyLCBwMTQpOwotCi0JCXNob3VsZEltcGx5KHAxMywgcDEzKTsKLQkJc2hvdWxkSW1wbHkocDE0LCBwMTQpOwotCi0JCXNob3VsZE5vdEltcGx5KHAxMywgcDExKTsKLQkJc2hvdWxkTm90SW1wbHkocDEzLCBwMTIpOwotCi0JCXNob3VsZE5vdEltcGx5KHAxNCwgcDExKTsKLQkJc2hvdWxkTm90SW1wbHkocDE0LCBwMTIpOwotCi0JCXNob3VsZE5vdEltcGx5KHAxMywgcDE0KTsKLQkJc2hvdWxkTm90SW1wbHkocDE0LCBwMTMpOwotCi0JCXNob3VsZE5vdEltcGx5KHAxMSwgb3ApOwotCi0JCXNob3VsZEVxdWFsKHAxMSwgcDExKTsKLQkJc2hvdWxkRXF1YWwocDExLCBwMTIpOwotCQlzaG91bGRFcXVhbChwMTIsIHAxMSk7Ci0JCXNob3VsZEVxdWFsKHAxMiwgcDEyKTsKLQkJc2hvdWxkRXF1YWwocDEzLCBwMTMpOwotCQlzaG91bGRFcXVhbChwMTQsIHAxNCk7Ci0KLQkJc2hvdWxkTm90RXF1YWwocDExLCBwMTMpOwotCQlzaG91bGROb3RFcXVhbChwMTEsIHAxNCk7Ci0JCXNob3VsZE5vdEVxdWFsKHAxMiwgcDEzKTsKLQkJc2hvdWxkTm90RXF1YWwocDEyLCBwMTQpOwotCQlzaG91bGROb3RFcXVhbChwMTMsIHAxMSk7Ci0JCXNob3VsZE5vdEVxdWFsKHAxMywgcDEyKTsKLQkJc2hvdWxkTm90RXF1YWwocDEzLCBwMTQpOwotCQlzaG91bGROb3RFcXVhbChwMTQsIHAxMSk7Ci0JCXNob3VsZE5vdEVxdWFsKHAxNCwgcDEyKTsKLQkJc2hvdWxkTm90RXF1YWwocDE0LCBwMTMpOwotCi0JCVBlcm1pc3Npb25Db2xsZWN0aW9uIHBjID0gcDEzLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7Ci0KLQkJY2hlY2tFbnVtZXJhdGlvbihwYy5lbGVtZW50cygpLCB0cnVlKTsKLQotCQlzaG91bGROb3RJbXBseShwYywgcDExKTsKLQotCQlzaG91bGRBZGQocGMsIHAxNCk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTQpOwotCQlzaG91bGROb3RJbXBseShwYywgcDExKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAxMik7Ci0JCXNob3VsZE5vdEltcGx5KHBjLCBwMTMpOwotCi0JCXNob3VsZEFkZChwYywgcDEzKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxMSk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTIpOwotCQlzaG91bGRJbXBseShwYywgcDEzKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxNCk7Ci0KLQkJc2hvdWxkTm90QWRkKHBjLCBvcCk7Ci0KLQkJcGMgPSBwMTMubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQotCQlzaG91bGRBZGQocGMsIHAxMyk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTMpOwotCQlzaG91bGROb3RJbXBseShwYywgcDExKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAxMik7Ci0JCXNob3VsZE5vdEltcGx5KHBjLCBwMTQpOwotCi0JCXNob3VsZEFkZChwYywgcDE0KTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxMSk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTIpOwotCQlzaG91bGRJbXBseShwYywgcDEzKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxNCk7Ci0KLQkJcGMgPSBwMTEubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQotCQlzaG91bGRBZGQocGMsIHAxMSk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTEpOwotCQlzaG91bGRJbXBseShwYywgcDEyKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAxMyk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMTQpOwotCi0JCXBjLnNldFJlYWRPbmx5KCk7Ci0KLQkJc2hvdWxkTm90QWRkKHBjLCBwMTIpOwotCi0JCWNoZWNrRW51bWVyYXRpb24ocGMuZWxlbWVudHMoKSwgZmFsc2UpOwotCi0JCVNlcnZpY2VQZXJtaXNzaW9uIHAyMSA9IG5ldyBTZXJ2aWNlUGVybWlzc2lvbigiY29tLmZvby5zZXJ2aWNlMiIsICJnZXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVNlcnZpY2VQZXJtaXNzaW9uIHAyMiA9IG5ldyBTZXJ2aWNlUGVybWlzc2lvbigiY29tLmZvby4qIiwgImdldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU2VydmljZVBlcm1pc3Npb24gcDIzID0gbmV3IFNlcnZpY2VQZXJtaXNzaW9uKCJjb20uKiIsICJnZXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVNlcnZpY2VQZXJtaXNzaW9uIHAyNCA9IG5ldyBTZXJ2aWNlUGVybWlzc2lvbigiKiIsICJnZXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJc2hvdWxkSW1wbHkocDIxLCBwMjEpOwotCQlzaG91bGRJbXBseShwMjIsIHAyMSk7Ci0JCXNob3VsZEltcGx5KHAyMywgcDIxKTsKLQkJc2hvdWxkSW1wbHkocDI0LCBwMjEpOwotCi0JCXNob3VsZEltcGx5KHAyMiwgcDIyKTsKLQkJc2hvdWxkSW1wbHkocDIzLCBwMjIpOwotCQlzaG91bGRJbXBseShwMjQsIHAyMik7Ci0KLQkJc2hvdWxkSW1wbHkocDIzLCBwMjMpOwotCQlzaG91bGRJbXBseShwMjQsIHAyMyk7Ci0KLQkJc2hvdWxkSW1wbHkocDI0LCBwMjQpOwotCi0JCXNob3VsZE5vdEltcGx5KHAyMSwgcDIyKTsKLQkJc2hvdWxkTm90SW1wbHkocDIxLCBwMjMpOwotCQlzaG91bGROb3RJbXBseShwMjEsIHAyNCk7Ci0KLQkJc2hvdWxkTm90SW1wbHkocDIyLCBwMjMpOwotCQlzaG91bGROb3RJbXBseShwMjIsIHAyNCk7Ci0KLQkJc2hvdWxkTm90SW1wbHkocDIzLCBwMjQpOwotCi0JCXBjID0gcDIxLm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7Ci0KLQkJc2hvdWxkQWRkKHBjLCBwMjEpOwotCQlzaG91bGRJbXBseShwYywgcDIxKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAyMik7Ci0JCXNob3VsZE5vdEltcGx5KHBjLCBwMjMpOwotCQlzaG91bGROb3RJbXBseShwYywgcDI0KTsKLQotCQlzaG91bGRBZGQocGMsIHAyMik7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjEpOwotCQlzaG91bGRJbXBseShwYywgcDIyKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAyMyk7Ci0JCXNob3VsZE5vdEltcGx5KHBjLCBwMjQpOwotCi0JCXNob3VsZEFkZChwYywgcDIzKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMSk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjIpOwotCQlzaG91bGRJbXBseShwYywgcDIzKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAyNCk7Ci0KLQkJc2hvdWxkQWRkKHBjLCBwMjQpOwotCQlzaG91bGRJbXBseShwYywgcDIxKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMik7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjMpOwotCQlzaG91bGRJbXBseShwYywgcDI0KTsKLQotCQlwYyA9IHAyMi5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwotCi0JCXNob3VsZEFkZChwYywgcDIyKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMSk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjIpOwotCQlzaG91bGROb3RJbXBseShwYywgcDIzKTsKLQkJc2hvdWxkTm90SW1wbHkocGMsIHAyNCk7Ci0KLQkJcGMgPSBwMjMubmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKLQotCQlzaG91bGRBZGQocGMsIHAyMyk7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjEpOwotCQlzaG91bGRJbXBseShwYywgcDIyKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMyk7Ci0JCXNob3VsZE5vdEltcGx5KHBjLCBwMjQpOwotCi0JCXBjID0gcDI0Lm5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCk7Ci0KLQkJc2hvdWxkQWRkKHBjLCBwMjQpOwotCQlzaG91bGRJbXBseShwYywgcDIxKTsKLQkJc2hvdWxkSW1wbHkocGMsIHAyMik7Ci0JCXNob3VsZEltcGx5KHBjLCBwMjMpOwotCQlzaG91bGRJbXBseShwYywgcDI0KTsKLQotCQl0ZXN0U2VyaWFsaXphdGlvbihwMTEpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMTIpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMTMpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMTQpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMjEpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMjIpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMjMpOwotCQl0ZXN0U2VyaWFsaXphdGlvbihwMjQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RBdHRyaWJ1dGVzXzAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RBdHRyaWJ1dGVzXzAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDkwNjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0QXR0cmlidXRlc18wMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RBdHRyaWJ1dGVzXzAwMSBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdEF0dHJpYnV0ZXNfMDAxKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzQgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV81ID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMSgpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCWJ1bmRsZV80ID0gY3JlYXRlX2J1bmRsZV80KHNvZik7Ci0JCWJ1bmRsZV81ID0gY3JlYXRlX2J1bmRsZV81KHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzIuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoImZvbyIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbZm9vXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbZm9vXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzEpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMygpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8zLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJmb28iKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2Zvb10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2Zvb10gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8xKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzQoKSB7fSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzUoKSB7fSAvLyBlbmQgbWV0aG9kCi0JCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCQljaGVja1dpcmluZ1N0YXRlXzQoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV81KCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVzVG9TdGF0ZV9hKFN0YXRlIHN0YXRlKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzEpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMyk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzQpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV81KTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsICFidW5kbGVfNC5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV81LmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAiZm9vOyB2ZXJzaW9uPTEuMDsgYT14OyBiPXkiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImZvbzsgdmVyc2lvbj0xLjA7IGE9eCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiZm9vOyB2ZXJzaW9uPTEuMDsgYj15Iik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzQoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzQgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV80LnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiRCIpOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJJbXBvcnQtUGFja2FnZSIsICJmb287IHZlcnNpb249MS4wOyBjPXoiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzQsICJidW5kbGVfNCIsIDQpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfNShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfNSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzUucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV81LnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJFIik7Ci0JCWRpY3Rpb25hcnlfNS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImZvbzsgdmVyc2lvbj0xLjA7IGE9eSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNSwgImJ1bmRsZV81IiwgNSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEJTTl8wMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0QlNOXzAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWI2MmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0QlNOXzAwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGVPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEJTTl8wMDEgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RCU05fMDAxKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDAxKCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0JCQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMSgpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8xLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJmb28iKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2Zvb10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2Zvb10gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nX2EoKSB7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzIoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8zKCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVzVG9TdGF0ZV9hKFN0YXRlIHN0YXRlKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzEpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMyk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKSB7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImZvbzsgdmVyc2lvbj1cIjEuMFwiOyBidW5kbGUtc3ltYm9saWMtbmFtZT1cIkNcIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMSwgImJ1bmRsZV8xIiwgMSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8yKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8yID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiZm9vOyB2ZXJzaW9uPVwiMS4wXCI7IGJ1bmRsZS1zeW1ib2xpYy1uYW1lPVwiQVwiIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzMoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzMgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQyIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJFeHBvcnQtUGFja2FnZSIsICJmb287IHZlcnNpb249XCIxLjBcIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMywgImJ1bmRsZV8zIiwgMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEN5Y2xlXzAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RDeWNsZV8wMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwNTlmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEN5Y2xlXzAwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDeWNsZV8wMDEgIGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXB1YmxpYyBUZXN0Q3ljbGVfMDAxKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdF8wMDEoKSB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlT2JqZWN0RmFjdG9yeSBzb2YgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMSgpIHsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSByZXF1aXJlcyA9IGJ1bmRsZV8yLmdldFJlc29sdmVkUmVxdWlyZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgicmVxdWlyZXMgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCByZXF1aXJlcyk7Ci0JCWFzc2VydFRydWUoInJlcXVpcmVzIGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIHJlcXVpcmVzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaTxyZXF1aXJlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlcXVpcmVzTmFtZSA9IHJlcXVpcmVzW2ldLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgcmVxdWlyZXNOYW1lKTsKLQkJCWlmKHJlcXVpcmVzTmFtZS5lcXVhbHMoIkIiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlJlcXVpcmUgW0JdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCByZXF1aXJlc1tpXSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJSZXF1aXJlIFtCXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCByZXF1aXJlc1tpXSwgYnVuZGxlXzIpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMigpIHsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSByZXF1aXJlcyA9IGJ1bmRsZV8yLmdldFJlc29sdmVkUmVxdWlyZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgicmVxdWlyZXMgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCByZXF1aXJlcyk7Ci0JCWFzc2VydFRydWUoInJlcXVpcmVzIGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIHJlcXVpcmVzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaTxyZXF1aXJlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlcXVpcmVzTmFtZSA9IHJlcXVpcmVzW2ldLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgcmVxdWlyZXNOYW1lKTsKLQkJCWlmKHJlcXVpcmVzTmFtZS5lcXVhbHMoIkEiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlJlcXVpcmUgW0FdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCByZXF1aXJlc1tpXSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJSZXF1aXJlIFtBXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCByZXF1aXJlc1tpXSwgYnVuZGxlXzEpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQkKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nX2EoKSB7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzIoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiUmVxdWlyZS1CdW5kbGUiLCAiQiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMSwgImJ1bmRsZV8xIiwgMSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8yKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8yID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiUmVxdWlyZS1CdW5kbGUiLCAiQSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEN5Y2xlXzAwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RDeWNsZV8wMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwYWVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEN5Y2xlXzAwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDeWNsZV8wMDIgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RDeWNsZV8wMDIoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8zID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMigpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCQlCdW5kbGVEZXNjcmlwdGlvbltdIHJlcXVpcmVzID0gYnVuZGxlXzEuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnROb3ROdWxsKCJyZXF1aXJlcyBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIHJlcXVpcmVzKTsKLQkJYXNzZXJ0VHJ1ZSgicmVxdWlyZXMgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgcmVxdWlyZXMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHJlcXVpcmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVxdWlyZXNOYW1lID0gcmVxdWlyZXNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCByZXF1aXJlc05hbWUpOwotCQkJaWYocmVxdWlyZXNOYW1lLmVxdWFscygiQiIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUmVxdWlyZSBbQl0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIHJlcXVpcmVzW2ldKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlJlcXVpcmUgW0JdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIHJlcXVpcmVzW2ldLCBidW5kbGVfMik7Ci0JCQl9IGVsc2UgaWYocmVxdWlyZXNOYW1lLmVxdWFscygiQyIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUmVxdWlyZSBbQ10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIHJlcXVpcmVzW2ldKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlJlcXVpcmUgW0NdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIHJlcXVpcmVzW2ldLCBidW5kbGVfMyk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCQlCdW5kbGVEZXNjcmlwdGlvbltdIHJlcXVpcmVzID0gYnVuZGxlXzIuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnROb3ROdWxsKCJyZXF1aXJlcyBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIHJlcXVpcmVzKTsKLQkJYXNzZXJ0VHJ1ZSgicmVxdWlyZXMgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgcmVxdWlyZXMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHJlcXVpcmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVxdWlyZXNOYW1lID0gcmVxdWlyZXNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCByZXF1aXJlc05hbWUpOwotCQkJaWYocmVxdWlyZXNOYW1lLmVxdWFscygiQSIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUmVxdWlyZSBbQV0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIHJlcXVpcmVzW2ldKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlJlcXVpcmUgW0FdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIHJlcXVpcmVzW2ldLCBidW5kbGVfMSk7Ci0JCQl9IGVsc2UgaWYocmVxdWlyZXNOYW1lLmVxdWFscygiQyIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUmVxdWlyZSBbQ10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIHJlcXVpcmVzW2ldKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlJlcXVpcmUgW0NdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIHJlcXVpcmVzW2ldLCBidW5kbGVfMyk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCQlCdW5kbGVEZXNjcmlwdGlvbltdIHJlcXVpcmVzID0gYnVuZGxlXzMuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnROb3ROdWxsKCJyZXF1aXJlcyBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIHJlcXVpcmVzKTsKLQkJYXNzZXJ0VHJ1ZSgicmVxdWlyZXMgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgcmVxdWlyZXMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHJlcXVpcmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVxdWlyZXNOYW1lID0gcmVxdWlyZXNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCByZXF1aXJlc05hbWUpOwotCQkJaWYocmVxdWlyZXNOYW1lLmVxdWFscygiQSIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUmVxdWlyZSBbQV0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIHJlcXVpcmVzW2ldKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlJlcXVpcmUgW0FdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIHJlcXVpcmVzW2ldLCBidW5kbGVfMSk7Ci0JCQl9IGVsc2UgaWYocmVxdWlyZXNOYW1lLmVxdWFscygiQiIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUmVxdWlyZSBbQl0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIHJlcXVpcmVzW2ldKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlJlcXVpcmUgW0JdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIHJlcXVpcmVzW2ldLCBidW5kbGVfMik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIlJlcXVpcmUtQnVuZGxlIiwgIkIsIEMiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIlJlcXVpcmUtQnVuZGxlIiwgIkEsIEMiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIlJlcXVpcmUtQnVuZGxlIiwgIkEsIEIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEN5Y2xlXzAwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RDeWNsZV8wMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyNjIwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEN5Y2xlXzAwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDeWNsZV8wMDMgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RDeWNsZV8wMDMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8zID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMygpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCAhYnVuZGxlXzIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsICFidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIlJlcXVpcmUtQnVuZGxlIiwgIkIsIEQiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIlJlcXVpcmUtQnVuZGxlIiwgIkMiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIlJlcXVpcmUtQnVuZGxlIiwgIkEiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RDeWNsZV8wMDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0Q3ljbGVfMDA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2YyYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RDeWNsZV8wMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDeWNsZV8wMDQgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RDeWNsZV8wMDQoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDAxKCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygicCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3BdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzIuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInEiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3FdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtxXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzEpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQkKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nX2EoKSB7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzIoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicTsgdmVyc2lvbj0xLjAiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAicDsgdmVyc2lvbj0xLjAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHZlcnNpb249MS4wIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInE7IHZlcnNpb249MS4wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0Q3ljbGVfMDA1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEN5Y2xlXzAwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI3YTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0Q3ljbGVfMDA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5FeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlci5BYnN0cmFjdFN0YXRlVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0Q3ljbGVfMDA1IGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXB1YmxpYyBUZXN0Q3ljbGVfMDA1KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdF8wMDIoKSB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlT2JqZWN0RmFjdG9yeSBzb2YgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMSgpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMigpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8yLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJxIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtxXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbcV0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMy5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiciIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcl0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3JdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzEoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQSIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJFeHBvcnQtUGFja2FnZSIsICJyOyB2ZXJzaW9uPTIuMCIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJwOyB2ZXJzaW9uPTEuMCwgejsgdmVyc2lvbj0xLjAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHZlcnNpb249MS4wLCByOyB2ZXJzaW9uPTEuMCIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJJbXBvcnQtUGFja2FnZSIsICJxOyB2ZXJzaW9uPTEuMCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicTsgdmVyc2lvbj0xLjAiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAicjsgdmVyc2lvbj0xLjAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEN5Y2xlXzAwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RDeWNsZV8wMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxMmQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEN5Y2xlXzAwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDeWNsZV8wMDYgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RDeWNsZV8wMDYoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8zID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMygpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCAhYnVuZGxlXzIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8zLmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicyIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJwLCBxLCByIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwOyBxOyB1c2VzOj1cInAscVwiIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInMiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHI7IHVzZXM6PVwicCxyXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3REeW5hbWljXzAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3REeW5hbWljXzAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWNlY2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0RHluYW1pY18wMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3REeW5hbWljXzAwMSBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdER5bmFtaWNfMDAxKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMSgpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCi0JCS8vIER5bmFtaWNzCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBzdGF0ZS5saW5rRHluYW1pY0ltcG9ydChidW5kbGVfMSwgInAiKTsKLQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cCk7Ci0JCWFzc2VydEVxdWFscygiUGFja2FnZSBbcF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8yKTsKLQkJCi0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0JCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVzVG9TdGF0ZV9hKFN0YXRlIHN0YXRlKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzEpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkR5bmFtaWNJbXBvcnQtUGFja2FnZSIsICJwIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0RHluYW1pY18wMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0RHluYW1pY18wMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0OGI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdER5bmFtaWNfMDAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5FeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlci5BYnN0cmFjdFN0YXRlVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RHluYW1pY18wMDIgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3REeW5hbWljXzAwMihTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDAyKCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJYnVuZGxlXzMgPSBjcmVhdGVfYnVuZGxlXzMoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JCQotCQkvLyBEeW5hbWljcwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gc3RhdGUubGlua0R5bmFtaWNJbXBvcnQoYnVuZGxlXzEsICJyIik7Ci0JCWFzc2VydE51bGwoIlBhY2thZ2UgW3JdIGlzIHdpcmVkIHdoZW4gaXQgc2hvdWxkIG5vdCBiZSAiLCBleHApOwotCQkKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMSgpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8xLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJwIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtwXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbcF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8yKTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJxIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtxXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbcV0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8yKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0JCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInAsIHEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiRHluYW1pY0ltcG9ydC1QYWNrYWdlIiwgInIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHE7IHVzZXM6PVwicCxxXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInE7IHI7IHVzZXM6PVwicSxyXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3REeW5hbWljXzAwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3REeW5hbWljXzAwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWI0NTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0RHluYW1pY18wMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3REeW5hbWljXzAwMyBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdER5bmFtaWNfMDAzKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdF8wMDMoKSB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlT2JqZWN0RmFjdG9yeSBzb2YgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQkJCi0JCS8vIER5bmFtaWNzCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBzdGF0ZS5saW5rRHluYW1pY0ltcG9ydChidW5kbGVfMSwgInIiKTsKLQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcl0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cCk7Ci0JCWFzc2VydEVxdWFscygiUGFja2FnZSBbcl0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCi0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygicCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3BdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMyk7Ci0JCQl9IGVsc2UgaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygicSIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcV0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3FdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMyk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCQotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzEoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQSIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJwLCBxIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkR5bmFtaWNJbXBvcnQtUGFja2FnZSIsICJyIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJyIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzMoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzMgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQyIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwOyBxOyByOyB1c2VzOj1cInAscSxyXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3REeW5hbWljXzAwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3REeW5hbWljXzAwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ4NTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0RHluYW1pY18wMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3REeW5hbWljXzAwNCBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdER5bmFtaWNfMDA0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzQgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDAzKCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJYnVuZGxlXzMgPSBjcmVhdGVfYnVuZGxlXzMoc29mKTsKLQkJYnVuZGxlXzQgPSBjcmVhdGVfYnVuZGxlXzQoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JCQotCQkvLyBEeW5hbWljcwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gc3RhdGUubGlua0R5bmFtaWNJbXBvcnQoYnVuZGxlXzEsICJxIik7Ci0JCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3FdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHApOwotCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3FdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMyk7Ci0JCQotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInAiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3BdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtwXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMigpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8xLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJxIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtxXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbcV0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzQoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCQljaGVja1dpcmluZ1N0YXRlXzQoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfNCk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKSB7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8zLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfNC5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInAiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiRHluYW1pY0ltcG9ydC1QYWNrYWdlIiwgInEiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHVzZXM6PXEiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAicTsgYnVuZGxlLXN5bWJvbGljLW5hbWU9QyIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMywgImJ1bmRsZV8zIiwgMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV80KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV80ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkQiKTsKLQkJZGljdGlvbmFyeV80LnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicTsgdmVyc2lvbj0yLjAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzQsICJidW5kbGVfNCIsIDQpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3REeW5hbWljXzAwNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3REeW5hbWljXzAwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmIyZTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0RHluYW1pY18wMDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3REeW5hbWljXzAwNSBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdER5bmFtaWNfMDA1KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdF8wMDUoKSB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlT2JqZWN0RmFjdG9yeSBzb2YgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQkJCi0JCS8vIER5bmFtaWNzCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBzdGF0ZS5saW5rRHluYW1pY0ltcG9ydChidW5kbGVfMSwgInEiKTsKLQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcV0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cCk7Ci0JCWFzc2VydEVxdWFscygiUGFja2FnZSBbcV0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCi0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkR5bmFtaWNJbXBvcnQtUGFja2FnZSIsICIqIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzMoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzMgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQyIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJFeHBvcnQtUGFja2FnZSIsICJxIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0RHluYW1pY18wMDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0RHluYW1pY18wMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2Y2JhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdER5bmFtaWNfMDA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5FeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlci5BYnN0cmFjdFN0YXRlVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RHluYW1pY18wMDYgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3REeW5hbWljXzAwNihTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDA1KCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0JCQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQkJCi0JCS8vIER5bmFtaWNzCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBzdGF0ZS5saW5rRHluYW1pY0ltcG9ydChidW5kbGVfMSwgInAuYiIpOwotCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtwLmJdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHApOwotCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3AuYl0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCi0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkR5bmFtaWNJbXBvcnQtUGFja2FnZSIsICJwLioiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInAuYSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicC5iIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0R2VuZXJhdGVkXzAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RHZW5lcmF0ZWRfMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZWY4NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RHZW5lcmF0ZWRfMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5FeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlci5BYnN0cmFjdFN0YXRlVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIFRlc3RHZW5lcmF0ZWRfMDAxIGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXB1YmxpYyBUZXN0R2VuZXJhdGVkXzAwMShTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV80ID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfNSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzYgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV83ID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfOCA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzkgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xMCA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdF8wMDEoKSB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlT2JqZWN0RmFjdG9yeSBzb2YgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQlidW5kbGVfNCA9IGNyZWF0ZV9idW5kbGVfNChzb2YpOwotCQlidW5kbGVfNSA9IGNyZWF0ZV9idW5kbGVfNShzb2YpOwotCQlidW5kbGVfNiA9IGNyZWF0ZV9idW5kbGVfNihzb2YpOwotCQlidW5kbGVfNyA9IGNyZWF0ZV9idW5kbGVfNyhzb2YpOwotCQlidW5kbGVfOCA9IGNyZWF0ZV9idW5kbGVfOChzb2YpOwotCQlidW5kbGVfOSA9IGNyZWF0ZV9idW5kbGVfOShzb2YpOwotCQlidW5kbGVfMTAgPSBjcmVhdGVfYnVuZGxlXzEwKHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gbnVsbDsKLQkJZXhwb3J0cyA9IG51bGw7Ci0JCWV4cG9ydHMgPSBidW5kbGVfMy5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiYTIiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2EyXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2EyXSBpcyAgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV84KTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJhMSIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbYTFdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCAgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbYTFdIGlzICB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzMpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoImEzIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFthM10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkICBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFthM10gaXMgIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfNik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV80KCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV81KCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV82KCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gbnVsbDsKLQkJZXhwb3J0cyA9IG51bGw7Ci0JCWV4cG9ydHMgPSBidW5kbGVfNi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiYTIiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2EyXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2EyXSBpcyAgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV84KTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJhMSIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbYTFdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCAgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbYTFdIGlzICB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzMpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoImEzIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFthM10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkICBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFthM10gaXMgIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfNik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV83KCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gbnVsbDsKLQkJZXhwb3J0cyA9IG51bGw7Ci0JCWV4cG9ydHMgPSBidW5kbGVfNy5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiYTIiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2EyXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2EyXSBpcyAgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV84KTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJhMSIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbYTFdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCAgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbYTFdIGlzICB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzMpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoImEzIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFthM10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkICBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFthM10gaXMgIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfNik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV84KCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gbnVsbDsKLQkJZXhwb3J0cyA9IG51bGw7Ci0JCWV4cG9ydHMgPSBidW5kbGVfOC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiYTIiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2EyXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2EyXSBpcyAgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV84KTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJhMSIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbYTFdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCAgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbYTFdIGlzICB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzMpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoImEzIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFthM10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkICBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFthM10gaXMgIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfNik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV85KCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xMCgpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nX2EoKSB7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzIoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8zKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfNCgpOwotCQljaGVja1dpcmluZ1N0YXRlXzUoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV82KCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfNygpOwotCQljaGVja1dpcmluZ1N0YXRlXzgoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV85KCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMTAoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfNCk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzUpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV82KTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfNyk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzgpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV85KTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMTApOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCAhYnVuZGxlXzIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8zLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCAhYnVuZGxlXzQuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsICFidW5kbGVfNS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzYuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV83LmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfOC5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV85LmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCAhYnVuZGxlXzEwLmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiYTE7IHZlcnNpb249XCJbMiwgM11cIiwgYTI7IHZlcnNpb249OCwgYTM7IHZlcnNpb249XCJbNSwgMTNdXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImExOyB2ZXJzaW9uPVwiWzMsIDMuOV1cIiwgYTI7IHZlcnNpb249XCJbOCwgOC45XVwiLCBhMzsgdmVyc2lvbj0wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzMoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzMgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQyIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJFeHBvcnQtUGFja2FnZSIsICJhMTsgdmVyc2lvbj03Iik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImExOyB2ZXJzaW9uPTMsIGEyOyB2ZXJzaW9uPTgsIGEzOyB2ZXJzaW9uPTAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfNChTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfNCA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV80LnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJEIik7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImExOyB2ZXJzaW9uPVwiWzMsIDMuOV1cIiwgYTI7IHZlcnNpb249OCwgYTM7IHZlcnNpb249NSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNCwgImJ1bmRsZV80IiwgNCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV81KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV81ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfNS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzUucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkUiKTsKLQkJZGljdGlvbmFyeV81LnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiYTE7IHZlcnNpb249NywgYTI7IHZlcnNpb249OCwgYTM7IHZlcnNpb249NSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNSwgImJ1bmRsZV81IiwgNSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV82KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV82ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfNi5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzYucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkYiKTsKLQkJZGljdGlvbmFyeV82LnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAiYTM7IHZlcnNpb249MCIpOwotCQlkaWN0aW9uYXJ5XzYucHV0KCJJbXBvcnQtUGFja2FnZSIsICJhMTsgdmVyc2lvbj03LCBhMjsgdmVyc2lvbj1cIls3LCA4XVwiLCBhMzsgdmVyc2lvbj1cIlswLCAwXVwiIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV82LCAiYnVuZGxlXzYiLCA2KTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzcoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzcgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV83LnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfNy5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiRyIpOwotCQlkaWN0aW9uYXJ5XzcucHV0KCJFeHBvcnQtUGFja2FnZSIsICJhMTsgdmVyc2lvbj0zIik7Ci0JCWRpY3Rpb25hcnlfNy5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImExOyB2ZXJzaW9uPVwiWzcsIDcuOV1cIiwgYTI7IHZlcnNpb249OCwgYTM7IHZlcnNpb249MCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNywgImJ1bmRsZV83IiwgNyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV84KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV84ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfOC5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzgucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkgiKTsKLQkJZGljdGlvbmFyeV84LnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAiYTI7IHZlcnNpb249OCIpOwotCQlkaWN0aW9uYXJ5XzgucHV0KCJJbXBvcnQtUGFja2FnZSIsICJhMTsgdmVyc2lvbj0zLCBhMjsgdmVyc2lvbj04LCBhMzsgdmVyc2lvbj0wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV84LCAiYnVuZGxlXzgiLCA4KTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzkoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzkgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV85LnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfOS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiSSIpOwotCQlkaWN0aW9uYXJ5XzkucHV0KCJFeHBvcnQtUGFja2FnZSIsICJhMzsgdmVyc2lvbj01Iik7Ci0JCWRpY3Rpb25hcnlfOS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImExOyB2ZXJzaW9uPVwiWzMsIDMuOV1cIiwgYTI7IHZlcnNpb249XCJbOCwgMTZdXCIsIGEzOyB2ZXJzaW9uPTUiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzksICJidW5kbGVfOSIsIDkpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMTAoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEwID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMTAucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xMC5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiSiIpOwotCQlkaWN0aW9uYXJ5XzEwLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiYTE7IHZlcnNpb249NywgYTI7IHZlcnNpb249XCJbNywgOF1cIiwgYTM7IHZlcnNpb249NSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMTAsICJidW5kbGVfMTAiLCAxMCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RHcm91cGluZ18wMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0R3JvdXBpbmdfMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MTA0NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RHcm91cGluZ18wMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RHcm91cGluZ18wMDEgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RHcm91cGluZ18wMDEoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8zID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMSgpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInAiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3BdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtwXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInEiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3FdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtxXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMigpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMygpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzEoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQSIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJwOyB2ZXJzaW9uPTIuMCwgcTsgdmVyc2lvbj1cIlsyLjAsIDIuMF1cIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMSwgImJ1bmRsZV8xIiwgMSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8yKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8yID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicDsgcTsgdmVyc2lvbj0yLjA7IHVzZXM6PVwicCxxXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHE7IHZlcnNpb249Mi4xOyB1c2VzOj1cInAscVwiIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0R3JvdXBpbmdfMDAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEdyb3VwaW5nXzAwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTcxOWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0R3JvdXBpbmdfMDAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGVPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEdyb3VwaW5nXzAwMiBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdEdyb3VwaW5nXzAwMihTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDAyKCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJYnVuZGxlXzMgPSBjcmVhdGVfYnVuZGxlXzMoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nX2EoKSB7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzIoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8zKCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVzVG9TdGF0ZV9hKFN0YXRlIHN0YXRlKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzEpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMyk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKSB7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCAhYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInAsIHEsIHIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHI7IHVzZXM6PVwicCxyXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInE7IHI7IHVzZXM6PVwicSxyXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RHcm91cGluZ18wMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0R3JvdXBpbmdfMDAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MWU4MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RHcm91cGluZ18wMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RHcm91cGluZ18wMDMgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RHcm91cGluZ18wMDMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8zID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfNCA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzUgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDAzKCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJYnVuZGxlXzMgPSBjcmVhdGVfYnVuZGxlXzMoc29mKTsKLQkJYnVuZGxlXzQgPSBjcmVhdGVfYnVuZGxlXzQoc29mKTsKLQkJYnVuZGxlXzUgPSBjcmVhdGVfYnVuZGxlXzUoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiciIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcl0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3JdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9IGVsc2UgaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygicyIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbc10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3NdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzMuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInAiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3BdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtwXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzQpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInEiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3FdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtxXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzQpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfNCgpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfNSgpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQkKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nX2EoKSB7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzIoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8zKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfNCgpOwotCQljaGVja1dpcmluZ1N0YXRlXzUoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfNCk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzUpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzQuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV81LmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAiZm9vOyB2ZXJzaW9uPVwiMS4wXCI7IGE9eDsgYj15Iik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInI7IHZlcnNpb249Mi4wLCBzOyB2ZXJzaW9uPVwiWzIuMCwgMi4wXVwiIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJyOyBzOyB2ZXJzaW9uPTIuMDsgdXNlczo9XCJyLHNcIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicjsgczsgdmVyc2lvbj0yLjE7IHVzZXM6PVwicixzXCIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAicDsgdmVyc2lvbj0yLjAsIHE7IHZlcnNpb249XCJbMi4wLCAyLjBdXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfNChTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfNCA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV80LnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJEIik7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHE7IHZlcnNpb249Mi4wOyB1c2VzOj1cInAscVwiIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV80LCAiYnVuZGxlXzQiLCA0KTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzUoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzUgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV81LnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfNS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiRSIpOwotCQlkaWN0aW9uYXJ5XzUucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwOyBxOyB2ZXJzaW9uPTIuMTsgdXNlczo9XCJwLHFcIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNSwgImJ1bmRsZV81IiwgNSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEdyb3VwaW5nXzAwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RHcm91cGluZ18wMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzMGE3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdEdyb3VwaW5nXzAwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RHcm91cGluZ18wMDYgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RHcm91cGluZ18wMDYoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8zID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMSgpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzEoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQSIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJSZXF1aXJlLUJ1bmRsZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInkiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgIngiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgIng7IHk7IHVzZXM6PVwieCx5XCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RHcm91cGluZ18wMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0R3JvdXBpbmdfMDA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTIyMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RHcm91cGluZ18wMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RHcm91cGluZ18wMDggZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RHcm91cGluZ18wMDgoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8zID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwOCgpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCQlCdW5kbGVEZXNjcmlwdGlvbltdIHJlcXVpcmVzID0gYnVuZGxlXzEuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnROb3ROdWxsKCJyZXF1aXJlcyBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIHJlcXVpcmVzKTsKLQkJYXNzZXJ0VHJ1ZSgicmVxdWlyZXMgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgcmVxdWlyZXMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUJ1bmRsZURlc2NyaXB0aW9uIGJkID0gcmVxdWlyZXNbaV07Ci0JCQlTdHJpbmcgcmVxdWlyZXNOYW1lID0gYmQuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlIG5hbWUgaXMgbnVsbCIsIHJlcXVpcmVzTmFtZSk7Ci0JCQlpZiAocmVxdWlyZXNOYW1lLmVxdWFscygiQiIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUmVxdWlyZSBbQl0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGJkKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlJlcXVpcmUgW0JdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGJ1bmRsZV8yLCBiZCk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInAiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3BdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtwXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBidW5kbGVfMywgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMigpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMygpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzEoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQSIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJSZXF1aXJlLUJ1bmRsZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHZlcnNpb249MiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMywgImJ1bmRsZV8zIiwgMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0T3B0aW9uYWxfMDAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdE9wdGlvbmFsXzAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmVlODY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0T3B0aW9uYWxfMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5FeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlci5BYnN0cmFjdFN0YXRlVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0T3B0aW9uYWxfMDAxIGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXB1YmxpYyBUZXN0T3B0aW9uYWxfMDAxKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdF8wMDIoKSB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlT2JqZWN0RmFjdG9yeSBzb2YgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMSgpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8xLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJxIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtxXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbcV0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJyIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtyXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbcl0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJwIikpIHsKLQkJCQlhc3NlcnROdWxsKCJQYWNrYWdlIFtwXSBpcyB3aXJlZCB3aGVuIGl0IHNob3VsZCBub3QgYmUgIiwgZXhwKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nX2EoKSB7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzIoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8zKCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVzVG9TdGF0ZV9hKFN0YXRlIHN0YXRlKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzEpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMyk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKSB7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8zLmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAicDsgcmVzb2x1dGlvbjo9b3B0aW9uYWwsIHEsIHIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHI7IHVzZXM6PVwicCxyXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInE7IHI7IHVzZXM6PVwicSxyXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RPcHRpb25hbF8wMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0T3B0aW9uYWxfMDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTk4NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RPcHRpb25hbF8wMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RPcHRpb25hbF8wMDIgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RPcHRpb25hbF8wMDIoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8zID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMigpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInEiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3JdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtyXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInAiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3BdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtwXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInEiKSkgewotCQkJCWFzc2VydE51bGwoIlBhY2thZ2UgW3FdIGlzIHdpcmVkIHdoZW4gaXQgc2hvdWxkIG5vdCBiZSAiLCBleHApOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMigpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMygpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzEoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQSIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJwOyBxOyByOyByZXNvbHV0aW9uOj1vcHRpb25hbCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMSwgImJ1bmRsZV8xIiwgMSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8yKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8yID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicDsgcjsgdXNlczo9XCJwLHJcIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicTsgcjsgdXNlczo9XCJxLHJcIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMywgImJ1bmRsZV8zIiwgMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFByb3BhZ2F0aW9uXzAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RQcm9wYWdhdGlvbl8wMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjM2RkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFByb3BhZ2F0aW9uXzAwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGVPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFByb3BhZ2F0aW9uXzAwMSBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdFByb3BhZ2F0aW9uXzAwMShTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV80ID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMSgpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCWJ1bmRsZV80ID0gY3JlYXRlX2J1bmRsZV80KHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoIngiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3hdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFt4XSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzMpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInkiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3ldIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFt5XSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMigpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8yLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJ4IikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFt4XSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbeF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzQoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nX2EoKSB7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzIoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8zKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfNCgpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV80KTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV80LmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAieCwgeSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMSwgImJ1bmRsZV8xIiwgMSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8yKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8yID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAieTsgdXNlczo9eCIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJJbXBvcnQtUGFja2FnZSIsICJ4OyBidW5kbGUtc3ltYm9saWMtbmFtZT1DIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzMoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzMgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQyIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJFeHBvcnQtUGFja2FnZSIsICJ4Iik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzQoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzQgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV80LnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiRCIpOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJFeHBvcnQtUGFja2FnZSIsICJ4OyB2ZXJzaW9uPTIuMCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNCwgImJ1bmRsZV80IiwgNCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFByb3BhZ2F0aW9uXzAwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RQcm9wYWdhdGlvbl8wMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzY2U0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFByb3BhZ2F0aW9uXzAwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGVPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFByb3BhZ2F0aW9uXzAwMyBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdFByb3BhZ2F0aW9uXzAwMyhTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV80ID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMSgpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCWJ1bmRsZV80ID0gY3JlYXRlX2J1bmRsZV80KHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzIuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInAiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3BdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtwXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzQpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMygpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfNCgpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV80KCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVzVG9TdGF0ZV9hKFN0YXRlIHN0YXRlKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzEpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMyk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzQpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV80LmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiUmVxdWlyZS1CdW5kbGUiLCAiQiwgQyIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMSwgImJ1bmRsZV8xIiwgMSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8yKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8yID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAicTsgdXNlczo9cCIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJJbXBvcnQtUGFja2FnZSIsICJwOyBidW5kbGUtc3ltYm9saWMtbmFtZT1EIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzMoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzMgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQyIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzQoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzQgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV80LnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiRCIpOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwOyB2ZXJzaW9uPTIuMCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNCwgImJ1bmRsZV80IiwgNCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFJGQzc5XzAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RSRkM3OV8wMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4OTRiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFJGQzc5XzAwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGVPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFJGQzc5XzAwMSBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdFJGQzc5XzAwMShTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDAxKCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJYnVuZGxlXzMgPSBjcmVhdGVfYnVuZGxlXzMoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cG9ydHNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJqYXZheC5zZXJ2bGV0IikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtqYXZheC5zZXJ2bGV0XSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2phdmF4LnNlcnZsZXRdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMigpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8yLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwb3J0c1tpXS5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoImphdmF4LnNlcnZsZXQiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2phdmF4LnNlcnZsZXRdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbamF2YXguc2VydmxldF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzMuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHBvcnRzW2ldLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiamF2YXguc2VydmxldCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbamF2YXguc2VydmxldF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtqYXZheC5zZXJ2bGV0XSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8yKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nX2EoKSB7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzIoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8zKCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVzVG9TdGF0ZV9hKFN0YXRlIHN0YXRlKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzEpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMyk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKSB7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8zLmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAiamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjEuMCIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJqYXZheC5zZXJ2bGV0OyB2ZXJzaW9uPTIuMS4wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJqYXZheC5zZXJ2bGV0OyB2ZXJzaW9uPTIuMi4wIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImphdmF4LnNlcnZsZXQ7IHZlcnNpb249Mi4yLjAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImphdmF4LnNlcnZsZXQ7IHZlcnNpb249Mi4xLjAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzMsICJidW5kbGVfMyIsIDMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfNChTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfNCA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV80LnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJEIik7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImZvbzsgdmVyc2lvbj0xLjA7IGM9eiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNCwgImJ1bmRsZV80IiwgNCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV81KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV81ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfNS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzUucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkUiKTsKLQkJZGljdGlvbmFyeV81LnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiZm9vOyB2ZXJzaW9uPTEuMDsgYT15Iik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV81LCAiYnVuZGxlXzUiLCA1KTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0UkZDNzlfMDAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFJGQzc5XzAwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzlkODQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0UkZDNzlfMDAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5FeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlci5BYnN0cmFjdFN0YXRlVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UkZDNzlfMDAyIGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXB1YmxpYyBUZXN0UkZDNzlfMDAyKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzQgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV81ID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMigpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCWJ1bmRsZV80ID0gY3JlYXRlX2J1bmRsZV80KHNvZik7Ci0JCWJ1bmRsZV81ID0gY3JlYXRlX2J1bmRsZV81KHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHBvcnRzW2ldLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiamF2YXguc2VydmxldCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbamF2YXguc2VydmxldF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtqYXZheC5zZXJ2bGV0XSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8yKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cG9ydHNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJqYXZheC5zZXJ2bGV0IikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtqYXZheC5zZXJ2bGV0XSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2phdmF4LnNlcnZsZXRdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMygpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8zLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwb3J0c1tpXS5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoIm9yZy5mb28uaW1wbCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbb3JnLmZvby5pbXBsXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW29yZy5mb28uaW1wbF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9IGVsc2UgaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiamF2YXguc2VydmxldCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbamF2YXguc2VydmxldF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtqYXZheC5zZXJ2bGV0XSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8yKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzQoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfNC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cG9ydHNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJvcmcuZm9vLmltcGwiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW29yZy5mb28uaW1wbF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtvcmcuZm9vLmltcGxdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzEpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoImphdmF4LnNlcnZsZXQiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2phdmF4LnNlcnZsZXRdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbamF2YXguc2VydmxldF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV81KCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzUuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHBvcnRzW2ldLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygib3JnLmZvby5pbXBsIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtvcmcuZm9vLmltcGxdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbb3JnLmZvby5pbXBsXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8yKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0JCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCQljaGVja1dpcmluZ1N0YXRlXzQoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV81KCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVzVG9TdGF0ZV9hKFN0YXRlIHN0YXRlKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzEpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMyk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzQpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV81KTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV80LmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfNS5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgIm9yZy5mb28uaW1wbDsgdmVyc2lvbj0xLjAuMCwgamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjEuMCIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJqYXZheC5zZXJ2bGV0OyB2ZXJzaW9uPTIuMS4wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJvcmcuZm9vLmltcGw7IHZlcnNpb249MS4xLjAsIGphdmF4LnNlcnZsZXQ7IHZlcnNpb249Mi4yLjAiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjIuMCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjEuMCwgb3JnLmZvby5pbXBsOyB2ZXJzaW9uPVwiWzEuMS4wLCAxLjEuMF1cIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMywgImJ1bmRsZV8zIiwgMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV80KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV80ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkQiKTsKLQkJZGljdGlvbmFyeV80LnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjEuMCwgb3JnLmZvby5pbXBsOyB2ZXJzaW9uPVwiWzEuMC4wLCAxLjAuMF1cIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNCwgImJ1bmRsZV80IiwgNCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV81KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV81ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfNS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzUucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkUiKTsKLQkJZGljdGlvbmFyeV81LnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAib3JnLmZvby5pbXBsOyB2ZXJzaW9uPVwiWzEuMC4wLCAxLjEuMF1cIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNSwgImJ1bmRsZV81IiwgNSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFJGQzc5XzAwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RSRkM3OV8wMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxMGM2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFJGQzc5XzAwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGVPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFJGQzc5XzAwMyBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdFJGQzc5XzAwMyhTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV80ID0gbnVsbDsKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0XzAwMygpIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5IHNvZiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpOwotCi0JCWJ1bmRsZV8xID0gY3JlYXRlX2J1bmRsZV8xKHNvZik7Ci0JCWJ1bmRsZV8yID0gY3JlYXRlX2J1bmRsZV8yKHNvZik7Ci0JCWJ1bmRsZV8zID0gY3JlYXRlX2J1bmRsZV8zKHNvZik7Ci0JCWJ1bmRsZV80ID0gY3JlYXRlX2J1bmRsZV80KHNvZik7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIHN0YWdlIGEKLQkJLy8gZXhwZWN0IHRvIHBhc3MgPXRydWUKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJYWRkQnVuZGxlc1RvU3RhdGVfYShzdGF0ZSk7Ci0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXRyeSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjbGFzcz0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICIgbWVzc2FnZT0iICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKTsKLQkJY2hlY2tXaXJpbmdfYSgpOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8xKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHBvcnRzW2ldLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiamF2YXguc2VydmxldCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbamF2YXguc2VydmxldF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtqYXZheC5zZXJ2bGV0XSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8yKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cG9ydHNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJqYXZheC5zZXJ2bGV0IikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtqYXZheC5zZXJ2bGV0XSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2phdmF4LnNlcnZsZXRdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMygpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8zLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwb3J0c1tpXS5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoIm9yZy5mb28uaW1wbCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbb3JnLmZvby5pbXBsXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW29yZy5mb28uaW1wbF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpLCBidW5kbGVfMSk7Ci0JCQl9IGVsc2UgaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiamF2YXguc2VydmxldCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbamF2YXguc2VydmxldF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtqYXZheC5zZXJ2bGV0XSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8yKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzQoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfNC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cG9ydHNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJvcmcuZm9vLmltcGwiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW29yZy5mb28uaW1wbF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtvcmcuZm9vLmltcGxdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzEpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoImphdmF4LnNlcnZsZXQiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2phdmF4LnNlcnZsZXRdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbamF2YXguc2VydmxldF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCQljaGVja1dpcmluZ1N0YXRlXzQoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfNCk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKSB7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8zLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfNC5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgIm9yZy5mb28uaW1wbDsgdmVyc2lvbj0xLjAuMCwgamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjEuMCIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJqYXZheC5zZXJ2bGV0OyB2ZXJzaW9uPTIuMS4wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJvcmcuZm9vLmltcGw7IHZlcnNpb249MS4wLjAsIGphdmF4LnNlcnZsZXQ7IHZlcnNpb249Mi4yLjAiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjIuMCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjEuMCwgb3JnLmZvby5pbXBsOyB2ZXJzaW9uPVwiWzEuMC4wLCAxLjAuMF1cIjsgYnVuZGxlLXN5bWJvbGljLW5hbWU9QSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMywgImJ1bmRsZV8zIiwgMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV80KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV80ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkQiKTsKLQkJZGljdGlvbmFyeV80LnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjEuMCwgb3JnLmZvby5pbXBsOyB2ZXJzaW9uPVwiWzEuMC4wLCAxLjAuMF1cIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNCwgImJ1bmRsZV80IiwgNCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0UkZDNzlfMDA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFJGQzc5XzAwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmUzMzRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0UkZDNzlfMDA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5FeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlci5BYnN0cmFjdFN0YXRlVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UkZDNzlfMDA0IGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXB1YmxpYyBUZXN0UkZDNzlfMDA0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzQgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDA0KCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJYnVuZGxlXzMgPSBjcmVhdGVfYnVuZGxlXzMoc29mKTsKLQkJYnVuZGxlXzQgPSBjcmVhdGVfYnVuZGxlXzQoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cG9ydHNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmddIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmddIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzQpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoIm9yZy5hcGFjaGUuY29tbW9ucy5pbyIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbb3JnLmFwYWNoZS5jb21tb25zLmlvXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW29yZy5hcGFjaGUuY29tbW9ucy5pb10gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpLCBidW5kbGVfNCk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzIuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHBvcnRzW2ldLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmciKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJvcmcuYXBhY2hlLmNvbW1vbnMuaW8iKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW29yZy5hcGFjaGUuY29tbW9ucy5pb10gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW9dIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzMpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMygpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfNCgpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV80KCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVzVG9TdGF0ZV9hKFN0YXRlIHN0YXRlKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzEpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMyk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzQpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzQuaXNSZXNvbHZlZCgpKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzEoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQSIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZzsgb3JnLmFwYWNoZS5jb21tb25zLmlvOyB2ZXJzaW9uPTIuMC4wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJJbXBvcnQtUGFja2FnZSIsICJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZzsgdmVyc2lvbj0yLjAuMCwgb3JnLmFwYWNoZS5jb21tb25zLmlvOyB2ZXJzaW9uPVwiWzIuMC4wLCAyLjAuMF1cIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkFwYWNoZUNvbW1vbnMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmc7IG9yZy5hcGFjaGUuY29tbW9ucy5pbzsgdmVyc2lvbj0yLjAuMDsgdXNlczo9XCJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyxvcmcuYXBhY2hlLmNvbW1vbnMuaW9cIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMywgImJ1bmRsZV8zIiwgMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV80KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV80ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkFwYWNoZUNvbW1vbnMnIik7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgIm9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nOyBvcmcuYXBhY2hlLmNvbW1vbnMuaW87IHZlcnNpb249Mi4xLjA7IHVzZXM6PVwib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcsb3JnLmFwYWNoZS5jb21tb25zLmlvXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzQsICJidW5kbGVfNCIsIDQpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFJGQzc5XzAwNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RSRkM3OV8wMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmN2NiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFJGQzc5XzAwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5CdW5kbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGVPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXIuQWJzdHJhY3RTdGF0ZVRlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFJGQzc5XzAwNSBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdFJGQzc5XzAwNShTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDA1KCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJYnVuZGxlXzMgPSBjcmVhdGVfYnVuZGxlXzMoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cG9ydHNbaV0uZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJqYXZheC5zZXJ2bGV0IikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtqYXZheC5zZXJ2bGV0XSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW2phdmF4LnNlcnZsZXRdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cG9ydHNbaV0uZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzIpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMigpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8yLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwb3J0c1tpXS5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoImphdmF4LnNlcnZsZXQiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW2phdmF4LnNlcnZsZXRdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHBvcnRzW2ldLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbamF2YXguc2VydmxldF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwb3J0c1tpXS5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCQotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgIWJ1bmRsZV8zLmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAiamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjEuMCIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJqYXZheC5zZXJ2bGV0OyB2ZXJzaW9uPTIuMS4wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJqYXZheC5zZXJ2bGV0OyB2ZXJzaW9uPTIuMi4wIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImphdmF4LnNlcnZsZXQ7IHZlcnNpb249Mi4yLjAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkltcG9ydC1QYWNrYWdlIiwgImphdmF4LnNlcnZsZXQ7IHZlcnNpb249XCJbMi4xLjAsIDIuMS4wXVwiIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0UkZDNzlfMDA2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFJGQzc5XzAwNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODU5MmQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0UkZDNzlfMDA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5FeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlci5BYnN0cmFjdFN0YXRlVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UkZDNzlfMDA2IGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXB1YmxpYyBUZXN0UkZDNzlfMDA2KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzQgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV81ID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfNiA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdF8wMDYoKSB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlT2JqZWN0RmFjdG9yeSBzb2YgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQlidW5kbGVfNCA9IGNyZWF0ZV9idW5kbGVfNChzb2YpOwotCQlidW5kbGVfNSA9IGNyZWF0ZV9idW5kbGVfNShzb2YpOwotCQlidW5kbGVfNiA9IGNyZWF0ZV9idW5kbGVfNihzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMSgpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8xLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJvcmcueG1sLnNheCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbb3JnLnhtbC5zYXhdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtvcmcueG1sLnNheF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJvcmcudzNjLmRvbSIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbb3JnLnczYy5kb21dIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtvcmcudzNjLmRvbV0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV80KTsKLQkJCX0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJqYXZheC54bWwucGFyc2VycyIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbamF2YXhdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtqYXZheF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV82KTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzMoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzQoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzUoKSB7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzYoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfNi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygib3JnLnczYy5kb20iKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW29yZy53M2MuZG9tXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbb3JnLnczYy5kb21dIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfNCk7Ci0JCQl9IGVsc2UgaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygib3JnLnhtbC5zYXgiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW29yZy54bWwuc2F4XSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbb3JnLnhtbC5zYXhdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMyk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV80KCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfNSgpOwotCQljaGVja1dpcmluZ1N0YXRlXzYoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfNCk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzUpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV82KTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCAhYnVuZGxlXzIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8zLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfNC5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzUuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV82LmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkNsaWVudCBBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgIm9yZy54bWwuc2F4OyB2ZXJzaW9uPVwiWzEuMy4wLCAxLjMuMF1cIiwgb3JnLnczYy5kb207IHZlcnNpb249XCJbMi4xLjAsIDIuMS4wXVwiLCBqYXZheC54bWwucGFyc2VyczsgdmVyc2lvbj1cIlsxLjEuMCwgMS4xLjBdXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDbGllbnQgQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJJbXBvcnQtUGFja2FnZSIsICJvcmcueG1sLnNheDsgdmVyc2lvbj1cIlsxLjMuMCwgMS4zLjBdXCIsIG9yZy53M2MuZG9tOyB2ZXJzaW9uPVwiWzIuMi4wLCAyLjIuMF1cIiwgamF2YXgueG1sLnBhcnNlcnM7IHZlcnNpb249XCJbMS4xLjAsIDEuMS4wXVwiIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzMoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzMgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiU0FYIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgIm9yZy54bWwuc2F4OyB2ZXJzaW9uPTEuMy4wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzQoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzQgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV80LnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiRE9NIEEiKTsKLQkJZGljdGlvbmFyeV80LnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAib3JnLnczYy5kb207IHZlcnNpb249Mi4xLjAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzQsICJidW5kbGVfNCIsIDQpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfNShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfNSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzUucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV81LnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJET00gQiIpOwotCQlkaWN0aW9uYXJ5XzUucHV0KCJFeHBvcnQtUGFja2FnZSIsICJvcmcudzNjLmRvbTsgdmVyc2lvbj0yLjIuMCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNSwgImJ1bmRsZV81IiwgNSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV82KFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV82ID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfNi5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzYucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkpBWFAiKTsKLQkJZGljdGlvbmFyeV82LnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAiamF2YXgueG1sLnBhcnNlcnM7IHZlcnNpb249MS4xLjA7IHVzZXM6PVwib3JnLnczYy5kb20sb3JnLnhtbC5zYXhcIiIpOwotCQlkaWN0aW9uYXJ5XzYucHV0KCJJbXBvcnQtUGFja2FnZSIsICJvcmcudzNjLmRvbTsgdmVyc2lvbj1cIlsyLjEuMCwgMi4xLjBdXCIsIG9yZy54bWwuc2F4OyB2ZXJzaW9uPVwiWzEuMy4wLCAxLjMuMF1cIiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNiwgImJ1bmRsZV82IiwgNik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0JCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RSRkM3OV8wMDcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0UkZDNzlfMDA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MzRhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RSRkM3OV8wMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RSRkM3OV8wMDcgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RSRkM3OV8wMDcoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMSA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzIgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8zID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfNCA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzUgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDA3KCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJYnVuZGxlXzMgPSBjcmVhdGVfYnVuZGxlXzMoc29mKTsKLQkJYnVuZGxlXzQgPSBjcmVhdGVfYnVuZGxlXzQoc29mKTsKLQkJYnVuZGxlXzUgPSBjcmVhdGVfYnVuZGxlXzUoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiUSIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbUV0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW1FdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMik7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV80KCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzQuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoIlIiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW1JdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtSXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzEpOwotCQkJfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoIlEiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW1FdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtRXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzUpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfNSgpIHsKLQl9IC8vIGVuZCBtZXRob2QKLQotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV80KCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfNSgpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV80KTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfNSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQnVuZGxlc1Jlc29sdmVkX2EoKSB7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsICFidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzQuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV81LmlzUmVzb2x2ZWQoKSk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8xKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8xID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkEiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiRXhwb3J0LVBhY2thZ2UiLCAiUDsgdXNlczo9USwgUiIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJROyB2ZXJzaW9uPVwiWzEsIDFdXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgIlE7IHZlcnNpb249MSIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMiwgImJ1bmRsZV8yIiwgMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8zKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8zID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkMiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAiUCwgUTsgdmVyc2lvbj1cIlsyLCAyXVwiIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzQoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzQgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV80LnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfNC5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiRCIpOwotCQlkaWN0aW9uYXJ5XzQucHV0KCJJbXBvcnQtUGFja2FnZSIsICJSLCBROyB2ZXJzaW9uPVwiWzIsIDJdXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzQsICJidW5kbGVfNCIsIDQpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfNShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfNSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzUucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV81LnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJFIik7Ci0JCWRpY3Rpb25hcnlfNS5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgIlE7IHZlcnNpb249MiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfNSwgImJ1bmRsZV81IiwgNSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0JCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RWZXJzaW9uXzAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RWZXJzaW9uXzAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzliNWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0VmVyc2lvbl8wMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RWZXJzaW9uXzAwMSBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdFZlcnNpb25fMDAxKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdF8wMDEoKSB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlT2JqZWN0RmFjdG9yeSBzb2YgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMSgpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8xLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJwIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtwXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbcF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygicCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3BdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMyk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzID0gYnVuZGxlXzMuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgbnVsbCIsIGV4cG9ydHMpOwotCQlhc3NlcnRUcnVlKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IGVtcHR5IiwgZXhwb3J0cy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwID0gZXhwb3J0c1tpXTsKLQkJCVN0cmluZyBleHBvcnRQYWNrYWdlTmFtZSA9IGV4cC5nZXROYW1lKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJwYWNrYWdlIG5hbWUgaXMgbnVsbCIsIGV4cG9ydFBhY2thZ2VOYW1lKTsKLQkJCWlmIChleHBvcnRQYWNrYWdlTmFtZS5lcXVhbHMoInAiKSkgewotCQkJCWFzc2VydE5vdE51bGwoIlBhY2thZ2UgW3BdIGlzIG5vdCB3aXJlZCB3aGVuIGl0IHNob3VsZCBiZSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIFtwXSBpcyB3aXJlZCBpbmNvcnJlY3RseSAiLCBleHAuZ2V0RXhwb3J0ZXIoKSwgYnVuZGxlXzMpOwotCQkJfQotCQl9IC8vIGVuZCBmb3IKLQl9IC8vIGVuZCBtZXRob2QKLQotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdfYSgpIHsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8xKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMigpOwotCQljaGVja1dpcmluZ1N0YXRlXzMoKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZXNUb1N0YXRlX2EoU3RhdGUgc3RhdGUpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8zKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8xLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzEoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQSIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwOyB2ZXJzaW9uPTEuMCIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJwOyB2ZXJzaW9uPTEuMCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMSwgImJ1bmRsZV8xIiwgMSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQlwdWJsaWMgQnVuZGxlRGVzY3JpcHRpb24gY3JlYXRlX2J1bmRsZV8yKFN0YXRlT2JqZWN0RmFjdG9yeSBzb2YpIHsKLQkJamF2YS51dGlsLkRpY3Rpb25hcnkgZGljdGlvbmFyeV8yID0gbmV3IGphdmEudXRpbC5Qcm9wZXJ0aWVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IG51bGw7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iLCAiMiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgIkIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiSW1wb3J0LVBhY2thZ2UiLCAicDsgdmVyc2lvbj0xLjAiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHZlcnNpb249Mi4wIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInA7IHZlcnNpb249Mi4wIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8zLCAiYnVuZGxlXzMiLCAzKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCi19IC8vIGVuZCBvZiB0ZXN0Y2FzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RWZXJzaW9uXzAwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3Jlc29sdmVyL1Rlc3RWZXJzaW9uXzAwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGEzZTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0VmVyc2lvbl8wMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyLkFic3RyYWN0U3RhdGVUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFRlc3RWZXJzaW9uXzAwMiBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgVGVzdFZlcnNpb25fMDAyKFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCi0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzEgPSBudWxsOwotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8yID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMyA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdF8wMDIoKSB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlT2JqZWN0RmFjdG9yeSBzb2YgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQotCQlidW5kbGVfMSA9IGNyZWF0ZV9idW5kbGVfMShzb2YpOwotCQlidW5kbGVfMiA9IGNyZWF0ZV9idW5kbGVfMihzb2YpOwotCQlidW5kbGVfMyA9IGNyZWF0ZV9idW5kbGVfMyhzb2YpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBzdGFnZSBhCi0JCS8vIGV4cGVjdCB0byBwYXNzID10cnVlCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCWFkZEJ1bmRsZXNUb1N0YXRlX2Eoc3RhdGUpOwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQl0cnkgewotCQkJc3RhdGUucmVzb2x2ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gY2xhc3M9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiIG1lc3NhZ2U9IiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0J1bmRsZXNSZXNvbHZlZF9hKCk7Ci0JCWNoZWNrV2lyaW5nX2EoKTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCQotCXB1YmxpYyB2b2lkIGNoZWNrV2lyaW5nU3RhdGVfMSgpIHsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IGJ1bmRsZV8xLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnROb3ROdWxsKCJleHBvcnQgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiLCBleHBvcnRzKTsKLQkJYXNzZXJ0VHJ1ZSgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBlbXB0eSIsIGV4cG9ydHMubGVuZ3RoID4gMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykgewotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cCA9IGV4cG9ydHNbaV07Ci0JCQlTdHJpbmcgZXhwb3J0UGFja2FnZU5hbWUgPSBleHAuZ2V0TmFtZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgicGFja2FnZSBuYW1lIGlzIG51bGwiLCBleHBvcnRQYWNrYWdlTmFtZSk7Ci0JCQlpZiAoZXhwb3J0UGFja2FnZU5hbWUuZXF1YWxzKCJwIikpIHsKLQkJCQlhc3NlcnROb3ROdWxsKCJQYWNrYWdlIFtwXSBpcyBub3Qgd2lyZWQgd2hlbiBpdCBzaG91bGQgYmUgIiwgZXhwLmdldEV4cG9ydGVyKCkpOwotCQkJCWFzc2VydEVxdWFscygiUGFja2FnZSBbcF0gaXMgd2lyZWQgaW5jb3JyZWN0bHkgIiwgZXhwLmdldEV4cG9ydGVyKCksIGJ1bmRsZV8zKTsKLQkJCX0KLQkJfSAvLyBlbmQgZm9yCi0JfSAvLyBlbmQgbWV0aG9kCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzIoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygiciIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcl0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3JdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMyk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsIGJ1bmRsZV8yLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnVuZGxlIHJlc29sdXRpb24gc3RhdGUiLCBidW5kbGVfMy5pc1Jlc29sdmVkKCkpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMShTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMSA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJBIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInI7IHZlcnNpb249Mi41Iik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInA7IHZlcnNpb249XCJbMi4wLCAzLjApXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzEsICJidW5kbGVfMSIsIDEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMihTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMiA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJCIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkltcG9ydC1QYWNrYWdlIiwgInI7IHZlcnNpb249XCIoMS41LCAyLjUpXCIiKTsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IHNvZi5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihkaWN0aW9uYXJ5XzIsICJidW5kbGVfMiIsIDIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCWZhaWwoYmUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0gLy8gZW5kIG9mIG1ldGhvZAotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGNyZWF0ZV9idW5kbGVfMyhTdGF0ZU9iamVjdEZhY3Rvcnkgc29mKSB7Ci0JCWphdmEudXRpbC5EaWN0aW9uYXJ5IGRpY3Rpb25hcnlfMyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBudWxsOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiwgIjIiKTsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJDIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkV4cG9ydC1QYWNrYWdlIiwgInA7IHZlcnNpb249Mi4yLCByOyB2ZXJzaW9uPTIuMiIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMywgImJ1bmRsZV8zIiwgMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQotfSAvLyBlbmQgb2YgdGVzdGNhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0VmVyc2lvbl8wMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9yZXNvbHZlci9UZXN0VmVyc2lvbl8wMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhYmQ3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvcmVzb2x2ZXIvVGVzdFZlcnNpb25fMDAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5FeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5TdGF0ZU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlci5BYnN0cmFjdFN0YXRlVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0VmVyc2lvbl8wMDMgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIFRlc3RWZXJzaW9uXzAwMyhTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZV8xID0gbnVsbDsKLQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVfMiA9IG51bGw7Ci0JQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlXzMgPSBudWxsOwotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRlc3RfMDAzKCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdGF0ZU9iamVjdEZhY3Rvcnkgc29mID0gcGxhdGZvcm1BZG1pbi5nZXRGYWN0b3J5KCk7Ci0KLQkJYnVuZGxlXzEgPSBjcmVhdGVfYnVuZGxlXzEoc29mKTsKLQkJYnVuZGxlXzIgPSBjcmVhdGVfYnVuZGxlXzIoc29mKTsKLQkJYnVuZGxlXzMgPSBjcmVhdGVfYnVuZGxlXzMoc29mKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gc3RhZ2UgYQotCQkvLyBleHBlY3QgdG8gcGFzcyA9dHJ1ZQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlhZGRCdW5kbGVzVG9TdGF0ZV9hKHN0YXRlKTsKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJdHJ5IHsKLQkJCXN0YXRlLnJlc29sdmUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNsYXNzPSIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIiBtZXNzYWdlPSIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2hlY2tCdW5kbGVzUmVzb2x2ZWRfYSgpOwotCQljaGVja1dpcmluZ19hKCk7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ1N0YXRlXzEoKSB7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydHMgPSBidW5kbGVfMS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0IGFycmF5IGlzIHVuZXhwZWN0ZWRseSBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydFRydWUoImV4cG9ydCBhcnJheSBpcyB1bmV4cGVjdGVkbHkgZW1wdHkiLCBleHBvcnRzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHAgPSBleHBvcnRzW2ldOwotCQkJU3RyaW5nIGV4cG9ydFBhY2thZ2VOYW1lID0gZXhwLmdldE5hbWUoKTsKLQkJCWFzc2VydE5vdE51bGwoInBhY2thZ2UgbmFtZSBpcyBudWxsIiwgZXhwb3J0UGFja2FnZU5hbWUpOwotCQkJaWYgKGV4cG9ydFBhY2thZ2VOYW1lLmVxdWFscygicCIpKSB7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUGFja2FnZSBbcF0gaXMgbm90IHdpcmVkIHdoZW4gaXQgc2hvdWxkIGJlICIsIGV4cC5nZXRFeHBvcnRlcigpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlBhY2thZ2UgW3BdIGlzIHdpcmVkIGluY29ycmVjdGx5ICIsIGV4cC5nZXRFeHBvcnRlcigpLCBidW5kbGVfMyk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvcgotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8yKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0JcHVibGljIHZvaWQgY2hlY2tXaXJpbmdTdGF0ZV8zKCkgewotCX0gLy8gZW5kIG1ldGhvZAotCi0KLQlwdWJsaWMgdm9pZCBjaGVja1dpcmluZ19hKCkgewotCQljaGVja1dpcmluZ1N0YXRlXzEoKTsKLQkJY2hlY2tXaXJpbmdTdGF0ZV8yKCk7Ci0JCWNoZWNrV2lyaW5nU3RhdGVfMygpOwotCX0gLy8gZW5kIG1ldGhvZAotCi0JCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlc1RvU3RhdGVfYShTdGF0ZSBzdGF0ZSkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWFkZGVkID0gc3RhdGUuYWRkQnVuZGxlKGJ1bmRsZV8xKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGFkZCBidW5kbGUgIiwgYWRkZWQpOwotCQlhZGRlZCA9IHN0YXRlLmFkZEJ1bmRsZShidW5kbGVfMik7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBhZGQgYnVuZGxlICIsIGFkZGVkKTsKLQkJYWRkZWQgPSBzdGF0ZS5hZGRCdW5kbGUoYnVuZGxlXzMpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGJ1bmRsZSAiLCBhZGRlZCk7Ci0JfSAvLyBlbmQgbWV0aG9kCi0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0J1bmRsZXNSZXNvbHZlZF9hKCkgewotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBidW5kbGUgcmVzb2x1dGlvbiBzdGF0ZSIsICFidW5kbGVfMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGJ1bmRsZSByZXNvbHV0aW9uIHN0YXRlIiwgYnVuZGxlXzMuaXNSZXNvbHZlZCgpKTsKLQl9IC8vIGVuZCBtZXRob2QKLQotCQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzEoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzEgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8xLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMS5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQSIpOwotCQlkaWN0aW9uYXJ5XzEucHV0KCJJbXBvcnQtUGFja2FnZSIsICJwIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8xLCAiYnVuZGxlXzEiLCAxKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzIoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzIgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8yLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMi5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQiIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwOyB2ZXJzaW9uPTIuMCIpOwotCQlkaWN0aW9uYXJ5XzIucHV0KCJJbXBvcnQtUGFja2FnZSIsICJxIik7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBzb2YuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oZGljdGlvbmFyeV8yLCAiYnVuZGxlXzIiLCAyKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQlmYWlsKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9IC8vIGVuZCBvZiBtZXRob2QKLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBjcmVhdGVfYnVuZGxlXzMoU3RhdGVPYmplY3RGYWN0b3J5IHNvZikgewotCQlqYXZhLnV0aWwuRGljdGlvbmFyeSBkaWN0aW9uYXJ5XzMgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gbnVsbDsKLQkJZGljdGlvbmFyeV8zLnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7Ci0JCWRpY3Rpb25hcnlfMy5wdXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiLCAiQyIpOwotCQlkaWN0aW9uYXJ5XzMucHV0KCJFeHBvcnQtUGFja2FnZSIsICJwOyB2ZXJzaW9uPTEuMCIpOwotCQl0cnkgewotCQkJYnVuZGxlID0gc29mLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGRpY3Rpb25hcnlfMywgImJ1bmRsZV8zIiwgMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJZmFpbChiZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfSAvLyBlbmQgb2YgbWV0aG9kCi0KLX0gLy8gZW5kIG9mIHRlc3RjYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHkvQXV0aG9yaXplQW55VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L0F1dGhvcml6ZUFueVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5OTJhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHkvQXV0aG9yaXplQW55VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlY3VyaXR5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5zZXNzaW9uLkNvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwucHJvdmlzaW9uYWwuc2VydmljZS5zZWN1cml0eS5BdXRob3JpemF0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5wcm92aXNpb25hbC5zZXJ2aWNlLnNlY3VyaXR5LkF1dGhvcml6YXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vLyBzZXQgYW55IGFsbG93ZWQKLS8vIGVuc3VyZSB1bnNpZ25lZCwgc2lnbmVkLCBhbmQgdHJ1c3RlZCBhbGwgcGFzcwotLy8gZW5zdXJlIGNvcnJ1cHQgYW5kIGV4cGlyZWQgZmFpbAotcHVibGljIGNsYXNzIEF1dGhvcml6ZUFueVRlc3QgZXh0ZW5kcyBCYXNlU2VjdXJpdHlUZXN0IHsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJlZ2lzdGVyRWNsaXBzZVRydXN0RW5naW5lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCUNvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlIHN1aXRlID0gbmV3IENvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlKEJVTkRMRV9TRUNVUklUWV9URVNUUywgIlVuaXQgdGVzdHMgZm9yIEF1dGhvcml6YXRpb25FbmdpbmUgd2l0aCAnYW55JyBwb2xpY3kiKTsKLQkJYWRkRGVmYXVsdFNlY3VyaXR5QnVuZGxlcyhzdWl0ZSk7Ci0JCXNldEF1dGhvcml6YXRpb25FbmFibGVkKHN1aXRlKTsKLQkJc2V0QXV0aG9yaXphdGlvblBvbGljeShzdWl0ZSwgImFueSIpOwotCQkvL2ZvciAoaW50IGkgPSAwOyBpIDwgc190ZXN0cy5sZW5ndGg7IGkrKykgewotCQkvLwlzdWl0ZS5hZGRUZXN0KHNfdGVzdHNbaV0pOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXV0aG9yaXplQW55VGVzdC5jbGFzcyk7Ci0JCS8vfQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JLy90ZXN0MDE6IHVuc2lnbmVkIChhbGxvd2VkKQotCXN0YXRpYyBib29sZWFuIHNfdGVzdDAxY2FsbGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXplMDEoKSB7Ci0KLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoQXV0aG9yaXphdGlvbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IEF1dGhvcml6YXRpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhdXRob3JpemF0aW9uRXZlbnQoQXV0aG9yaXphdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCWFzc2VydEVxdWFscygiQ29udGVudCBpcyBub3QgYWxsb3dlZCEiLCBBdXRob3JpemF0aW9uRXZlbnQuQUxMT1dFRCwgZXZlbnQuZ2V0UmVzdWx0KCkpOwotCQkJCQlzX3Rlc3QwMWNhbGxlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSwgbnVsbCk7Ci0KLQkJCXRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJ1bnNpZ25lZCIpKTsgLy9zaWduZWQgYnkgY2ExX2xlYWZhCi0KLQkJCWFzc2VydFRydWUoIkhhbmRsZXIgbm90IGNhbGxlZCEiLCBzX3Rlc3QwMWNhbGxlZCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIHQpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAodGVzdEJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJCXRlc3RCdW5kbGUudW5pbnN0YWxsKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLy90ZXN0MDI6IHNpZ25lZCAoYWxsb3dlZCkKLQlzdGF0aWMgYm9vbGVhbiBzX3Rlc3QwMmNhbGxlZCA9IGZhbHNlOwotCi0JcHVibGljIHZvaWQgdGVzdEF1dGhvcml6ZTAyKCkgewotCi0JCUJ1bmRsZSB0ZXN0QnVuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKEF1dGhvcml6YXRpb25MaXN0ZW5lci5jbGFzcy5nZXROYW1lKCksIG5ldyBBdXRob3JpemF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYXV0aG9yaXphdGlvbkV2ZW50KEF1dGhvcml6YXRpb25FdmVudCBldmVudCkgewotCQkJCQlhc3NlcnRFcXVhbHMoIkNvbnRlbnQgaXMgbm90IGFsbG93ZWQhIiwgQXV0aG9yaXphdGlvbkV2ZW50LkFMTE9XRUQsIGV2ZW50LmdldFJlc3VsdCgpKTsKLQkJCQkJc190ZXN0MDJjYWxsZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0sIG51bGwpOwotCi0JCQl0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvL3NpZ25lZCBieSBjYTFfbGVhZmEKLQotCQkJYXNzZXJ0VHJ1ZSgiSGFuZGxlciBub3QgY2FsbGVkISIsIHNfdGVzdDAyY2FsbGVkKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh0ZXN0QnVuZGxlICE9IG51bGwpIHsKLQkJCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvL3Rlc3QwMzogdHJ1c3RlZCAoYWxsb3dlZCkKLQlzdGF0aWMgYm9vbGVhbiBzX3Rlc3QwM2NhbGxlZCA9IGZhbHNlOwotCi0JcHVibGljIHZvaWQgdGVzdEF1dGhvcml6ZTAzKCkgewotCi0JCUJ1bmRsZSB0ZXN0QnVuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOwotCi0JCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShBdXRob3JpemF0aW9uTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgQXV0aG9yaXphdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGF1dGhvcml6YXRpb25FdmVudChBdXRob3JpemF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKCJDb250ZW50IGlzIG5vdCBhbGxvd2VkISIsIEF1dGhvcml6YXRpb25FdmVudC5BTExPV0VELCBldmVudC5nZXRSZXN1bHQoKSk7Ci0JCQkJCXNfdGVzdDAzY2FsbGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9LCBudWxsKTsKLQotCQkJdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZCIpKTsgLy9zaWduZWQgYnkgY2ExX2xlYWZhCi0KLQkJCWFzc2VydFRydWUoIkhhbmRsZXIgbm90IGNhbGxlZCEiLCBzX3Rlc3QwM2NhbGxlZCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIHQpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlnZXRUcnVzdEVuZ2luZSgpLnJlbW92ZVRydXN0QW5jaG9yKCJjYTFfbGVhZmEiKTsKLQkJCQlpZiAodGVzdEJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJCXRlc3RCdW5kbGUudW5pbnN0YWxsKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLy90ZXN0MDQ6IGNvcnJ1cHQgKGFsbG93ZWQsIGV4cGxvZGVzIG9uIGxvYWQpCi0Jc3RhdGljIGJvb2xlYW4gc190ZXN0MDRjYWxsZWQgPSBmYWxzZTsKLQotCXB1YmxpYyB2b2lkIHRlc3RBdXRob3JpemUwNCgpIHsKLQotCQlCdW5kbGUgdGVzdEJ1bmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlnZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX2xlYWZhIiksICJjYTFfbGVhZmEiKTsKLQotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoQXV0aG9yaXphdGlvbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IEF1dGhvcml6YXRpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhdXRob3JpemF0aW9uRXZlbnQoQXV0aG9yaXphdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCWFzc2VydEVxdWFscygiQ29udGVudCBpcyBub3QgYWxsb3dlZCEiLCBBdXRob3JpemF0aW9uRXZlbnQuQUxMT1dFRCwgZXZlbnQuZ2V0UmVzdWx0KCkpOwotCQkJCQlzX3Rlc3QwNGNhbGxlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSwgbnVsbCk7Ci0KLQkJCXRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWRfd2l0aF9jb3JydXB0IikpOyAvL3NpZ25lZCBieSBjYTFfbGVhZmEKLQotCQkJYXNzZXJ0VHJ1ZSgiSGFuZGxlciBub3QgY2FsbGVkISIsIHNfdGVzdDA0Y2FsbGVkKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWdldFRydXN0RW5naW5lKCkucmVtb3ZlVHJ1c3RBbmNob3IoImNhMV9sZWFmYSIpOwotCQkJCWlmICh0ZXN0QnVuZGxlICE9IG51bGwpIHsKLQkJCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvL3Rlc3QwNTogZXhwaXJlZCAoZGVuaWVkKSBUT0RPIQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHkvQXV0aG9yaXplU2lnbmVkVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L0F1dGhvcml6ZVNpZ25lZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3NDIyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHkvQXV0aG9yaXplU2lnbmVkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlY3VyaXR5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5zZXNzaW9uLkNvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwucHJvdmlzaW9uYWwuc2VydmljZS5zZWN1cml0eS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwuc2VydmljZS5zZWN1cml0eS5EZWZhdWx0QXV0aG9yaXphdGlvbkVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEF1dGhvcml6ZVNpZ25lZFRlc3QgZXh0ZW5kcyBCYXNlU2VjdXJpdHlUZXN0IHsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJlZ2lzdGVyRWNsaXBzZVRydXN0RW5naW5lKCk7Ci0JCUF1dGhvcml6YXRpb25FbmdpbmUgYXV0aEVuZ2luZSA9IGdldEF1dGhvcml6YXRpb25FbmdpbmUoKTsKLQkJaWYgKGF1dGhFbmdpbmUgaW5zdGFuY2VvZiBEZWZhdWx0QXV0aG9yaXphdGlvbkVuZ2luZSkgewotCQkJKChEZWZhdWx0QXV0aG9yaXphdGlvbkVuZ2luZSkgYXV0aEVuZ2luZSkuc2V0TG9hZFBvbGljeShEZWZhdWx0QXV0aG9yaXphdGlvbkVuZ2luZS5FTkZPUkNFX1NJR05FRCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlBdXRob3JpemF0aW9uRW5naW5lIGF1dGhFbmdpbmUgPSBnZXRBdXRob3JpemF0aW9uRW5naW5lKCk7Ci0JCWlmIChhdXRoRW5naW5lIGluc3RhbmNlb2YgRGVmYXVsdEF1dGhvcml6YXRpb25FbmdpbmUpIHsKLQkJCSgoRGVmYXVsdEF1dGhvcml6YXRpb25FbmdpbmUpIGF1dGhFbmdpbmUpLnNldExvYWRQb2xpY3koMCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCUNvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlIHN1aXRlID0gbmV3IENvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlKEJVTkRMRV9TRUNVUklUWV9URVNUUywgIlVuaXQgdGVzdHMgZm9yIEF1dGhvcml6YXRpb25FbmdpbmUgd2l0aCAnc2lnbmVkJyBwb2xpY3kiKTsKLQkJYWRkRGVmYXVsdFNlY3VyaXR5QnVuZGxlcyhzdWl0ZSk7Ci0JCXNldEF1dGhvcml6YXRpb25FbmFibGVkKHN1aXRlKTsKLQkJLy9zZXRBdXRob3JpemF0aW9uUG9saWN5KHN1aXRlLCAic2lnbmVkIik7Ci0JCS8vZm9yIChpbnQgaSA9IDA7IGkgPCBzX3Rlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vCXN1aXRlLmFkZFRlc3Qoc190ZXN0c1tpXSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBdXRob3JpemVTaWduZWRUZXN0LmNsYXNzKTsKLQkJLy99Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQkvL3Rlc3QwMTogc2lnbmVkIChhbGxvdykKLQlwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXplMDEoKSB7Ci0JCUJ1bmRsZSB0ZXN0QnVuZGxlID0gbnVsbDsKLQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb24gPSBudWxsOwotCQlmaW5hbCBpbnRbXSBzX3Rlc3QwMWNhbGxlZCA9IG5ldyBpbnRbXSB7LTF9OwotCQl0cnkgewotCQkJcmVnaXN0cmF0aW9uID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoQXV0aG9yaXphdGlvbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IEF1dGhvcml6YXRpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhdXRob3JpemF0aW9uRXZlbnQoQXV0aG9yaXphdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNfdGVzdDAxY2FsbGVkWzBdID0gZXZlbnQuZ2V0UmVzdWx0KCk7Ci0JCQkJfQotCQkJfSwgbnVsbCk7Ci0JCQl0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvL3NpZ25lZCBieSBjYTFfbGVhZmEKLQkJCWFzc2VydFRydWUoIkhhbmRsZXIgbm90IGNhbGxlZCEiLCBzX3Rlc3QwMWNhbGxlZFswXSAhPSAtMSk7Ci0JCQlhc3NlcnRFcXVhbHMoIkNvbnRlbnQgd2FzIG5vdCBhbGxvd2VkISIsIEF1dGhvcml6YXRpb25FdmVudC5BTExPV0VELCBzX3Rlc3QwMWNhbGxlZFswXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh0ZXN0QnVuZGxlICE9IG51bGwpIHsKLQkJCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIkZhaWxlZCB0byB1bmluc3RhbGwgYnVuZGxlIiwgZSk7Ci0JCQl9Ci0JCQlpZiAocmVnaXN0cmF0aW9uICE9IG51bGwpCi0JCQkJcmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJfQotCX0KLQotCS8vdGVzdDAyOiB0cnVzdGVkIChhbGxvdykKLQlwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXplMDIoKSB7Ci0KLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiA9IG51bGw7Ci0JCWZpbmFsIGludFtdIHNfdGVzdDAyY2FsbGVkID0gbmV3IGludFtdIHstMX07Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOwotCQkJfQotCi0JCQlyZWdpc3RyYXRpb24gPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShBdXRob3JpemF0aW9uTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgQXV0aG9yaXphdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGF1dGhvcml6YXRpb25FdmVudChBdXRob3JpemF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc190ZXN0MDJjYWxsZWRbMF0gPSBldmVudC5nZXRSZXN1bHQoKTsKLQkJCQl9Ci0JCQl9LCBudWxsKTsKLQotCQkJdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZCIpKTsgLy9zaWduZWQgYnkgY2ExX2xlYWZhCi0KLQkJCWFzc2VydFRydWUoIkhhbmRsZXIgbm90IGNhbGxlZCEiLCBzX3Rlc3QwMmNhbGxlZFswXSAhPSAtMSk7Ci0JCQlhc3NlcnRFcXVhbHMoIkNvbnRlbnQgd2FzIG5vdCBhbGxvd2VkISIsIEF1dGhvcml6YXRpb25FdmVudC5BTExPV0VELCBzX3Rlc3QwMmNhbGxlZFswXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWdldFRydXN0RW5naW5lKCkucmVtb3ZlVHJ1c3RBbmNob3IoImNhMV9sZWFmYSIpOwotCQkJCWlmICh0ZXN0QnVuZGxlICE9IG51bGwpIHsKLQkJCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWZhaWwoIkZhaWxlZCB0byB1bmluc3RhbGwgYnVuZGxlIiwgdCk7Ci0JCQl9Ci0JCQlpZiAocmVnaXN0cmF0aW9uICE9IG51bGwpCi0JCQkJcmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJfQotCX0KLQotCS8vdGVzdDAzOiB1bnNpZ25lZCAoZGVueSkKLQlwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXplMDMoKSB7Ci0KLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiA9IG51bGw7Ci0JCWZpbmFsIGludFtdIHNfdGVzdDAzY2FsbGVkID0gbmV3IGludFtdIHstMX07Ci0JCXRyeSB7Ci0JCQlyZWdpc3RyYXRpb24gPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShBdXRob3JpemF0aW9uTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgQXV0aG9yaXphdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGF1dGhvcml6YXRpb25FdmVudChBdXRob3JpemF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc190ZXN0MDNjYWxsZWRbMF0gPSBldmVudC5nZXRSZXN1bHQoKTsKLQkJCQl9Ci0JCQl9LCBudWxsKTsKLQotCQkJdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInVuc2lnbmVkIikpOyAvL3NpZ25lZCBieSBjYTFfbGVhZmEKLQotCQkJYXNzZXJ0VHJ1ZSgiSGFuZGxlciBub3QgY2FsbGVkISIsIHNfdGVzdDAzY2FsbGVkWzBdICE9IC0xKTsKLQkJCWFzc2VydEVxdWFscygiQ29udGVudCB3YXMgIGFsbG93ZWQhIiwgQXV0aG9yaXphdGlvbkV2ZW50LkRFTklFRCwgc190ZXN0MDNjYWxsZWRbMF0pOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAodGVzdEJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJCXRlc3RCdW5kbGUudW5pbnN0YWxsKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlmYWlsKCJGYWlsZWQgdG8gdW5pbnN0YWxsIGJ1bmRsZSIsIHQpOwotCQkJfQotCQkJaWYgKHJlZ2lzdHJhdGlvbiAhPSBudWxsKQotCQkJCXJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyKCk7Ci0JCX0KLQl9Ci0KLQkvL3Rlc3QwNDogY29ycnVwdGVkIChhbGxvdywgdGhlbiBleHBsb2RlIGxhdGVyKQotCXB1YmxpYyB2b2lkIHRlc3RBdXRob3JpemUwNCgpIHsKLQotCQlCdW5kbGUgdGVzdEJ1bmRsZSA9IG51bGw7Ci0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uID0gbnVsbDsKLQkJZmluYWwgaW50W10gc190ZXN0MDRjYWxsZWQgPSBuZXcgaW50W10gey0xfTsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCQl9Ci0KLQkJCXJlZ2lzdHJhdGlvbiA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKEF1dGhvcml6YXRpb25MaXN0ZW5lci5jbGFzcy5nZXROYW1lKCksIG5ldyBBdXRob3JpemF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYXV0aG9yaXphdGlvbkV2ZW50KEF1dGhvcml6YXRpb25FdmVudCBldmVudCkgewotCQkJCQlzX3Rlc3QwNGNhbGxlZFswXSA9IGV2ZW50LmdldFJlc3VsdCgpOwotCQkJCX0KLQkJCX0sIG51bGwpOwotCi0JCQl0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkX3dpdGhfY29ycnVwdCIpKTsgLy9zaWduZWQgYnkgY2ExX2xlYWZhCi0KLQkJCWFzc2VydFRydWUoIkhhbmRsZXIgbm90IGNhbGxlZCEiLCBzX3Rlc3QwNGNhbGxlZFswXSAhPSAtMSk7Ci0JCQlhc3NlcnRFcXVhbHMoIkNvbnRlbnQgd2FzIG5vdCBhbGxvd2VkISIsIEF1dGhvcml6YXRpb25FdmVudC5BTExPV0VELCBzX3Rlc3QwNGNhbGxlZFswXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWdldFRydXN0RW5naW5lKCkucmVtb3ZlVHJ1c3RBbmNob3IoImNhMV9sZWFmYSIpOwotCQkJCWlmICh0ZXN0QnVuZGxlICE9IG51bGwpIHsKLQkJCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWZhaWwoIkZhaWxlZCB0byB1bmluc3RhbGwgYnVuZGxlIiwgdCk7Ci0JCQl9Ci0JCQlpZiAocmVnaXN0cmF0aW9uICE9IG51bGwpCi0JCQkJcmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJfQotCX0KLQkvL3Rlc3QwNTogZXhwaXJlZCAoZGVueSkgLy9UT0RPIQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L0F1dGhvcml6ZVRydXN0ZWRUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHkvQXV0aG9yaXplVHJ1c3RlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlOTJjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHkvQXV0aG9yaXplVHJ1c3RlZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VjdXJpdHk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLnNlc3Npb24uQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5wcm92aXNpb25hbC5zZXJ2aWNlLnNlY3VyaXR5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5zZXJ2aWNlLnNlY3VyaXR5LkRlZmF1bHRBdXRob3JpemF0aW9uRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEF1dGhvcml6ZVRydXN0ZWRUZXN0IGV4dGVuZHMgQmFzZVNlY3VyaXR5VGVzdCB7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZWdpc3RlckVjbGlwc2VUcnVzdEVuZ2luZSgpOwotCQlBdXRob3JpemF0aW9uRW5naW5lIGF1dGhFbmdpbmUgPSBnZXRBdXRob3JpemF0aW9uRW5naW5lKCk7Ci0JCWlmIChhdXRoRW5naW5lIGluc3RhbmNlb2YgRGVmYXVsdEF1dGhvcml6YXRpb25FbmdpbmUpIHsKLQkJCSgoRGVmYXVsdEF1dGhvcml6YXRpb25FbmdpbmUpIGF1dGhFbmdpbmUpLnNldExvYWRQb2xpY3koRGVmYXVsdEF1dGhvcml6YXRpb25FbmdpbmUuRU5GT1JDRV9TSUdORUQgfCBEZWZhdWx0QXV0aG9yaXphdGlvbkVuZ2luZS5FTkZPUkNFX1RSVVNURUQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJQXV0aG9yaXphdGlvbkVuZ2luZSBhdXRoRW5naW5lID0gZ2V0QXV0aG9yaXphdGlvbkVuZ2luZSgpOwotCQlpZiAoYXV0aEVuZ2luZSBpbnN0YW5jZW9mIERlZmF1bHRBdXRob3JpemF0aW9uRW5naW5lKSB7Ci0JCQkoKERlZmF1bHRBdXRob3JpemF0aW9uRW5naW5lKSBhdXRoRW5naW5lKS5zZXRMb2FkUG9saWN5KDApOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZShCVU5ETEVfU0VDVVJJVFlfVEVTVFMsICJVbml0IHRlc3RzIGZvciBBdXRob3JpemF0aW9uRW5naW5lIHdpdGggJ3RydXN0ZWQnIHBvbGljeSIpOwotCQlhZGREZWZhdWx0U2VjdXJpdHlCdW5kbGVzKHN1aXRlKTsKLQkJc2V0RWNsaXBzZVRydXN0RW5naW5lKHN1aXRlKTsKLQkJc2V0QXV0aG9yaXphdGlvbkVuYWJsZWQoc3VpdGUpOwotCQkvL3NldEF1dGhvcml6YXRpb25Qb2xpY3koc3VpdGUsICJ0cnVzdGVkIik7Ci0JCS8vZm9yIChpbnQgaSA9IDA7IGkgPCBzX3Rlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vCXN1aXRlLmFkZFRlc3Qoc190ZXN0c1tpXSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBdXRob3JpemVUcnVzdGVkVGVzdC5jbGFzcyk7Ci0JCS8vfQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JLy90ZXN0MDE6IHRydXN0ZWQsIHNob3VsZCBwYXNzCi0JcHVibGljIHZvaWQgdGVzdEF1dGhvcml6ZTAxKCkgewotCi0JCUJ1bmRsZSB0ZXN0QnVuZGxlID0gbnVsbDsKLQkJZmluYWwgaW50W10gc190ZXN0MDFjYWxsZWQgPSBuZXcgaW50W10gey0xfTsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCQl9Ci0KLQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKEF1dGhvcml6YXRpb25MaXN0ZW5lci5jbGFzcy5nZXROYW1lKCksIG5ldyBBdXRob3JpemF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYXV0aG9yaXphdGlvbkV2ZW50KEF1dGhvcml6YXRpb25FdmVudCBldmVudCkgewotCQkJCQlzX3Rlc3QwMWNhbGxlZFswXSA9IGV2ZW50LmdldFJlc3VsdCgpOwotCQkJCX0KLQkJCX0sIG51bGwpOwotCi0JCQl0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvL3NpZ25lZCBieSBjYTFfbGVhZmEKLQotCQkJYXNzZXJ0VHJ1ZSgiSGFuZGxlciBub3QgY2FsbGVkISIsIHNfdGVzdDAxY2FsbGVkWzBdICE9IC0xKTsKLQkJCWFzc2VydEVxdWFscygiQ29udGVudCB3YXMgbm90IGFsbG93ZWQhIiwgQXV0aG9yaXphdGlvbkV2ZW50LkFMTE9XRUQsIHNfdGVzdDAxY2FsbGVkWzBdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJZ2V0VHJ1c3RFbmdpbmUoKS5yZW1vdmVUcnVzdEFuY2hvcigiY2ExX2xlYWZhIik7Ci0JCQkJaWYgKHRlc3RCdW5kbGUgIT0gbnVsbCkgewotCQkJCQl0ZXN0QnVuZGxlLnVuaW5zdGFsbCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24iLCB0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8vdGVzdDAyOiB1bnNpZ25lZCwgc2hvdWxkIGZhaWwKLQlwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXplMDIoKSB7Ci0KLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQlmaW5hbCBpbnRbXSBzX3Rlc3QwMmNhbGxlZCA9IG5ldyBpbnRbXSB7LTF9OwotCQl0cnkgewotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoQXV0aG9yaXphdGlvbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IEF1dGhvcml6YXRpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhdXRob3JpemF0aW9uRXZlbnQoQXV0aG9yaXphdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNfdGVzdDAyY2FsbGVkWzBdID0gZXZlbnQuZ2V0UmVzdWx0KCk7Ci0JCQkJfQotCQkJfSwgbnVsbCk7Ci0KLQkJCXRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJ1bnNpZ25lZCIpKTsKLQkJCS8vVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQlhc3NlcnRUcnVlKCJIYW5kbGVyIG5vdCBjYWxsZWQhIiwgc190ZXN0MDJjYWxsZWRbMF0gIT0gLTEpOwotCQkJYXNzZXJ0RXF1YWxzKCJDb250ZW50IHdhcyBhbGxvd2VkISIsIEF1dGhvcml6YXRpb25FdmVudC5ERU5JRUQsIHNfdGVzdDAyY2FsbGVkWzBdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRlc3RCdW5kbGUgIT0gbnVsbCkgewotCQkJCQl0ZXN0QnVuZGxlLnVuaW5zdGFsbCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiRmFpbGVkIHRvIHVuaW5zdGFsbCBidW5kbGUiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vdGVzdDAzOiB1bnRydXN0ZWQsIHNob3VsZCBmYWlsCi0JcHVibGljIHZvaWQgdGVzdEF1dGhvcml6ZTAzKCkgewotCi0JCUJ1bmRsZSB0ZXN0QnVuZGxlID0gbnVsbDsKLQkJZmluYWwgaW50W10gc190ZXN0MDNjYWxsZWQgPSBuZXcgaW50W10gey0xfTsKLQkJdHJ5IHsKLQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKEF1dGhvcml6YXRpb25MaXN0ZW5lci5jbGFzcy5nZXROYW1lKCksIG5ldyBBdXRob3JpemF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYXV0aG9yaXphdGlvbkV2ZW50KEF1dGhvcml6YXRpb25FdmVudCBldmVudCkgewotCQkJCQlzX3Rlc3QwM2NhbGxlZFswXSA9IGV2ZW50LmdldFJlc3VsdCgpOwotCQkJCX0KLQkJCX0sIG51bGwpOwotCi0JCQl0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvL3NpZ25lZCBieSBjYTFfbGVhZmEKLQotCQkJYXNzZXJ0VHJ1ZSgiSGFuZGxlciBub3QgY2FsbGVkISIsIHNfdGVzdDAzY2FsbGVkWzBdICE9IC0xKTsKLQkJCWFzc2VydEVxdWFscygiQ29udGVudCB3YXMgYWxsb3dlZCEiLCBBdXRob3JpemF0aW9uRXZlbnQuREVOSUVELCBzX3Rlc3QwM2NhbGxlZFswXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh0ZXN0QnVuZGxlICE9IG51bGwpIHsKLQkJCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIkZhaWxlZCB0byB1bmluc3RhbGwgYnVuZGxlIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvL3Rlc3QwNDogY29ycnVwdCwgc2hvdWxkIGZhaWwKLQlwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXplMDQoKSB7Ci0KLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQlmaW5hbCBpbnRbXSBzX3Rlc3QwNGNhbGxlZCA9IG5ldyBpbnRbXSB7LTF9OwotCQl0cnkgewotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoQXV0aG9yaXphdGlvbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IEF1dGhvcml6YXRpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhdXRob3JpemF0aW9uRXZlbnQoQXV0aG9yaXphdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNfdGVzdDA0Y2FsbGVkWzBdID0gZXZlbnQuZ2V0UmVzdWx0KCk7Ci0JCQkJfQotCQkJfSwgbnVsbCk7Ci0KLQkJCXRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWRfd2l0aF9jb3JydXB0IikpOyAvL3NpZ25lZCBieSBjYTFfbGVhZmEKLQotCQkJYXNzZXJ0VHJ1ZSgiSGFuZGxlciBub3QgY2FsbGVkISIsIHNfdGVzdDA0Y2FsbGVkWzBdICE9IC0xKTsKLQkJCWFzc2VydEVxdWFscygiQ29udGVudCB3YXMgIGFsbG93ZWQhIiwgQXV0aG9yaXphdGlvbkV2ZW50LkRFTklFRCwgc190ZXN0MDRjYWxsZWRbMF0pOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAodGVzdEJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJCXRlc3RCdW5kbGUudW5pbnN0YWxsKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJGYWlsZWQgdG8gdW5pbnN0YWxsIGJ1bmRsZSIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLy90ZXN0MDU6IFRPRE86IGV4cGlyZWQsIHNob3VsZCBmYWlsIC8vVE9ETyEKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eS9CYXNlU2VjdXJpdHlUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHkvQmFzZVNlY3VyaXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM0NmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eS9CYXNlU2VjdXJpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlY3VyaXR5OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLkNvcmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuc2Vzc2lvbi5Db25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnByb3Zpc2lvbmFsLnNlcnZpY2Uuc2VjdXJpdHkuQXV0aG9yaXphdGlvbkVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnNlcnZpY2Uuc2VjdXJpdHkuS2V5U3RvcmVUcnVzdEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2Uuc2VjdXJpdHkuVHJ1c3RFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zaWduZWRjb250ZW50LlNpZ25lZENvbnRlbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQmFzZVNlY3VyaXR5VGVzdCBleHRlbmRzIENvcmVUZXN0IHsKLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBQQVNTV09SRF9ERUZBVUxUID0geydjJywgJ2gnLCAnYScsICduJywgJ2cnLCAnZScsICdpJywgJ3QnfTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVFlQRV9ERUZBVUxUID0gIkpLUyI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfU0VDVVJJVFlfVEVTVFMgPSAib3JnLmVjbGlwc2Uub3NnaS50ZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBCYXNlU2VjdXJpdHlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCYXNlU2VjdXJpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEtleVN0b3JlIHN1cHBvcnRTdG9yZTsKLQlzdGF0aWMgewotCQl0cnkgewotCQkJVVJMIHN1cHBvcnRVcmwgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJ0ZXN0X2ZpbGVzL3NlY3VyaXR5L2tleXN0b3JlLmprcyIpOwotCQkJc3VwcG9ydFN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoVFlQRV9ERUZBVUxUKTsKLQkJCXN1cHBvcnRTdG9yZS5sb2FkKHN1cHBvcnRVcmwub3BlblN0cmVhbSgpLCBQQVNTV09SRF9ERUZBVUxUKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gdHJ1c3RSZWcgPSBudWxsOwotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRTZWN1cml0eUJ1bmRsZXMoQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUgc3VpdGUpIHsKLQkJU3RyaW5nW10gaWRzID0gQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUuTUlOSU1BTF9CVU5ETEVfU0VUOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJc3VpdGUuYWRkQnVuZGxlKGlkc1tpXSk7Ci0JCX0KLQkJc3VpdGUuYWRkQnVuZGxlKEJVTkRMRV9TRUNVUklUWV9URVNUUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBDZXJ0aWZpY2F0ZSBnZXRUZXN0Q2VydGlmaWNhdGUoU3RyaW5nIGFsaWFzKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwcG9ydFN0b3JlLmdldENlcnRpZmljYXRlKGFsaWFzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENlcnRpZmljYXRlW10gZ2V0VGVzdENlcnRpZmljYXRlQ2hhaW4oU3RyaW5nW10gYWxpYXNlcykgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IGNlcnRzID0gbmV3IEFycmF5TGlzdChhbGlhc2VzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxpYXNlcy5sZW5ndGg7IGkrKykgewotCQkJY2VydHMuYWRkKGdldFRlc3RDZXJ0aWZpY2F0ZShhbGlhc2VzW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIChDZXJ0aWZpY2F0ZVtdKSBjZXJ0cy50b0FycmF5KG5ldyBDZXJ0aWZpY2F0ZVtdIHt9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckVjbGlwc2VUcnVzdEVuZ2luZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBtYWtlIGEgY29weSBvZiBjYWNlcnRzIGZpbGUgYW5kIHVzZSB0aGF0IGF0IHJ1bnRpbWUKLQkJVVJMIGVjbGlwc2VVUkwgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJ0ZXN0X2ZpbGVzL3NlY3VyaXR5L2VjbGlwc2UuamtzIik7Ci0JCUZpbGUgdGVtcEVuZ2luZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlbXAuamtzIik7Ci0KLQkJY29weShlY2xpcHNlVVJMLm9wZW5TdHJlYW0oKSwgdGVtcEVuZ2luZSk7Ci0KLQkJS2V5U3RvcmVUcnVzdEVuZ2luZSBkdW1teVRFID0gbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmUodGVtcEVuZ2luZS5nZXRBYnNvbHV0ZVBhdGgoKSwgIkpLUyIsICJjaGFuZ2VpdCIudG9DaGFyQXJyYXkoKSwgInRlbXAuamtzIik7Ci0JCUhhc2h0YWJsZSBwcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSg3KTsKLQkJcHJvcGVydGllcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfUkFOS0lORywgbmV3IEludGVnZXIoSW50ZWdlci5NQVhfVkFMVUUpKTsKLQotCQl0cnVzdFJlZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKFRydXN0RW5naW5lLmNsYXNzLmdldE5hbWUoKSwgZHVtbXlURSwgcHJvcGVydGllcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRydXN0UmVnICE9IG51bGwpCi0JCQl0cnVzdFJlZy51bnJlZ2lzdGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoSW5wdXRTdHJlYW0gaW4sIEZpbGUgZHN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLwkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpOwotCi0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJaW50IGxlbjsKLQkJd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkgewotCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbGVuKTsKLQkJfQotCQlpbi5jbG9zZSgpOwotCQlvdXQuY2xvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2lnbmVkQ29udGVudEZhY3RvcnkgZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKFNpZ25lZENvbnRlbnRGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIFNpZ25lZENvbnRlbnRGYWN0b3J5IHNlcnZpY2UiLCByZWYpOwotCQlTaWduZWRDb250ZW50RmFjdG9yeSBmYWN0b3J5ID0gKFNpZ25lZENvbnRlbnRGYWN0b3J5KSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UocmVmKTsKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UocmVmKTsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIFRydXN0RW5naW5lIGdldFRydXN0RW5naW5lKCkgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZiA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZShUcnVzdEVuZ2luZS5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBUcnVzdEVuZ2luZSBhdmFpbGFibGUiLCByZWYpOwotCQlUcnVzdEVuZ2luZSBlbmdpbmUgPSAoVHJ1c3RFbmdpbmUpIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZShyZWYpOwotCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShyZWYpOwotCQlyZXR1cm4gZW5naW5lOwotCX0KLQotCXByb3RlY3RlZCBBdXRob3JpemF0aW9uRW5naW5lIGdldEF1dGhvcml6YXRpb25FbmdpbmUoKSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKEF1dGhvcml6YXRpb25FbmdpbmUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gQXV0aG9yaXphdGlvbkVuZ2luZSBhdmFpbGFibGUiLCByZWYpOwotCQlBdXRob3JpemF0aW9uRW5naW5lIGVuZ2luZSA9IChBdXRob3JpemF0aW9uRW5naW5lKSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UocmVmKTsKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UocmVmKTsKLQkJcmV0dXJuIGVuZ2luZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnVuZGxlIGluc3RhbGxCdW5kbGUoU3RyaW5nIGJ1bmRsZVBhdGgpIHsKLQkJVVJMIGJ1bmRsZVVSTCA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoYnVuZGxlUGF0aCk7Ci0JCWFzc2VydE5vdE51bGwoIkJ1bmRsZSBVUkwgaXMgbnVsbCAiICsgYnVuZGxlUGF0aCwgYnVuZGxlVVJMKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmluc3RhbGxCdW5kbGUoYnVuZGxlUGF0aCwgYnVuZGxlVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGluc3RhbGwgZXhjZXB0aW9uIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgZ2V0RW50cnlGaWxlKFN0cmluZyBlbnRyeVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVVSTCBlbnRyeVVSTCA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoZW50cnlQYXRoKTsKLQkJaWYgKGVudHJ5VVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBGaWxlKEZpbGVMb2NhdG9yLnRvRmlsZVVSTChlbnRyeVVSTCkudG9FeHRlcm5hbEZvcm0oKS5zdWJzdHJpbmcoNSkpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGNvcHlFbnRyeUZpbGUoU3RyaW5nIGVudHJ5UGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJVVJMIGVudHJ5VVJMID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShlbnRyeVBhdGgpOwotCQlpZiAoZW50cnlVUkwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlGaWxlIHRlbXBGb2xkZXIgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZW1wIik7Ci0JCXRlbXBGb2xkZXIubWtkaXJzKCk7Ci0JCUZpbGUgcmVzdWx0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZW50cnkiLCAiLmphciIsIHRlbXBGb2xkZXIpOwotCQlyZWFkRmlsZShlbnRyeVVSTC5vcGVuU3RyZWFtKCksIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdEphclBhdGgoU3RyaW5nIGphck5hbWUpIHsKLQkJcmV0dXJuICJ0ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvIiArIGphck5hbWUgKyAiLmphciI7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldEF1dGhvcml6YXRpb25FbmFibGVkKENvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlIHN1aXRlKSB7Ci0JCXRyeSB7Ci0JCQlzdWl0ZS5nZXRTZXR1cCgpLnNldFN5c3RlbVByb3BlcnR5KCJvc2dpLnNpZ25lZGNvbnRlbnQuc3VwcG9ydCIsICJhbGwiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldEF1dGhvcml6YXRpb25Qb2xpY3koQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUgc3VpdGUsIFN0cmluZyBwb2xpY3kpIHsKLQkJdHJ5IHsKLQkJCXN1aXRlLmdldFNldHVwKCkuc2V0U3lzdGVtUHJvcGVydHkoIm9zZ2kuc2lnbmVkY29udGVudC5hdXRob3JpemF0aW9uLmVuZ2luZS5wb2xpY3kiLCBwb2xpY3kpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2V0RWNsaXBzZVRydXN0RW5naW5lKENvbmZpZ3VyYXRpb25TZXNzaW9uVGVzdFN1aXRlIHN1aXRlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgZWNsaXBzZVVSTCA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoInRlc3RfZmlsZXMvc2VjdXJpdHkvZWNsaXBzZS5qa3MiKTsKLQkJCUZpbGUgdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJrZXlzdG9yZSIsICIuamtzIik7Ci0KLQkJCWNvcHkoZWNsaXBzZVVSTC5vcGVuU3RyZWFtKCksIHRlbXBGaWxlKTsKLQotCQkJc3VpdGUuZ2V0U2V0dXAoKS5zZXRTeXN0ZW1Qcm9wZXJ0eSgib3NnaS5mcmFtZXdvcmsua2V5c3RvcmUiLCB0ZW1wRmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVhZEZpbGUoSW5wdXRTdHJlYW0gaW4sIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotCQl0cnkgewotCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0KLQkJCWJ5dGUgYnVmZmVyW10gPSBuZXcgYnl0ZVsxMDI0XTsKLQkJCWludCBjb3VudDsKLQkJCXdoaWxlICgoY291bnQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCkpID4gMCkgewotCQkJCWZvcy53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKLQkJCX0KLQotCQkJZm9zLmNsb3NlKCk7Ci0JCQlmb3MgPSBudWxsOwotCi0JCQlpbi5jbG9zZSgpOwotCQkJaW4gPSBudWxsOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjbG9zZSBvcGVuIHN0cmVhbXMKLQkJCWlmIChmb3MgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVlKSB7Ci0JCQkJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVlKSB7Ci0JCQkJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQotCQkJCX0KLQkJCX0KLQotCQkJdGhyb3cgZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eS9LZXlTdG9yZVRydXN0RW5naW5lVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L0tleVN0b3JlVHJ1c3RFbmdpbmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMWU5YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L0tleVN0b3JlVHJ1c3RFbmdpbmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlY3VyaXR5OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwuc2VydmljZS5zZWN1cml0eS5LZXlTdG9yZVRydXN0RW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5zZWN1cml0eS5UcnVzdEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLQotcHVibGljIGNsYXNzIEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIFBBU1NXT1JEX0RFRkFVTFQgPSB7J2MnLCAnaCcsICdhJywgJ24nLCAnZycsICdlJywgJ2knLCAndCd9OwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUWVBFX0RFRkFVTFQgPSAiSktTIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdENhc2VbXSBzX3Rlc3RzID0gewotCS8qIGZpbmRUcnVzdEFuY2hvciB0ZXN0cyAqLwotCW5ldyBLZXlTdG9yZVRydXN0RW5naW5lVGVzdCgiZmluZFRydXN0QW5jaG9yIHBvc2l0aXZlIHRlc3Q6IHNlbGYgc2lnbmVkIHRydXN0ZWQiLCBuZXcgU3RyaW5nW10geyJjYTFfcm9vdCJ9KSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJCXRlc3RGaW5kVHJ1c3RBbmNob3IwKCk7Ci0JCQkJfQotCQkJfSwgbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJmaW5kVHJ1c3RBbmNob3IgcG9zaXRpdmUgdGVzdDogY2hhaW4gd2l0aCByb290IHRydXN0ZWQiLCBuZXcgU3RyaW5nW10geyJjYTFfcm9vdCJ9KSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJCXRlc3RGaW5kVHJ1c3RBbmNob3IxKCk7Ci0JCQkJfQotCQkJfSwgbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJmaW5kVHJ1c3RBbmNob3IgcG9zaXRpdmUgdGVzdDogY2hhaW4gd2l0aCBpbnRlcm1lZGlhdGUgdHJ1c3RlZCIsIG5ldyBTdHJpbmdbXSB7ImNhMV9vdSJ9KSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJCXRlc3RGaW5kVHJ1c3RBbmNob3IyKCk7Ci0JCQkJfQotCQkJfSwgbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJmaW5kVHJ1c3RBbmNob3IgcG9zaXRpdmUgdGVzdDogY2hhaW4gd2l0aCBsZWFmIHRydXN0ZWQiLCBuZXcgU3RyaW5nW10geyJjYTFfbGVhZmIifSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJCQl0ZXN0RmluZFRydXN0QW5jaG9yMygpOwotCQkJCX0KLQkJCX0sIG5ldyBLZXlTdG9yZVRydXN0RW5naW5lVGVzdCgiZmluZFRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IHVudHJ1c3RlZCBzZWxmIHNpZ25lZCIsIG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJCXRlc3RGaW5kVHJ1c3RBbmNob3I0KCk7Ci0JCQkJfQotCQkJfSwgbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJmaW5kVHJ1c3RBbmNob3IgbmVnYXRpdmUgdGVzdDogdW50cnVzdGVkIGNoYWluIiwgbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQkJdGVzdEZpbmRUcnVzdEFuY2hvcjUoKTsKLQkJCQl9Ci0JCQl9LCBuZXcgS2V5U3RvcmVUcnVzdEVuZ2luZVRlc3QoImZpbmRUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiBpbnZhbGlkIGNoYWluIiwgbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQkJdGVzdEZpbmRUcnVzdEFuY2hvcjYoKTsKLQkJCQl9Ci0JCQl9LCBuZXcgS2V5U3RvcmVUcnVzdEVuZ2luZVRlc3QoImZpbmRUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiBpbmNvbXBsZXRlLWFibGUgY2hhaW4iLCBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJCQl0ZXN0RmluZFRydXN0QW5jaG9yNygpOwotCQkJCX0KLQkJCX0sIG5ldyBLZXlTdG9yZVRydXN0RW5naW5lVGVzdCgiZmluZFRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IG51bGwgY2hhaW4iLCBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJCQl0ZXN0RmluZFRydXN0QW5jaG9yOCgpOwotCQkJCX0KLQkJCX0sCi0JCQkvKiBhZGRUcnVzdEFuY2hvciB0ZXN0cyAqLwotCQkJbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJhZGRUcnVzdEFuY2hvciBwb3NpdGl2ZSB0ZXN0OiBhZGQgd2l0aCBhbGlhcyIsIG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJCXRlc3RBZGRUcnVzdEFuY2hvcjAoKTsKLQkJCQl9Ci0JCQl9LC8qLCBuZXcgS2V5U3RvcmVUcnVzdEVuZ2luZVRlc3QoImFkZFRydXN0QW5jaG9yIHBvc2l0aXZlIHRlc3Q6IGFkZCB3aXRoIGF1dG9nZW5lcmF0ZWQgYWxpYXMiLCBudWxsKSB7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJdGVzdEFkZFRydXN0QW5jaG9yMSgpOwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCX0qLwotCQkJbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJhZGRUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiBudWxsIGNlcnQgc3BlY2lmaWVkIiwgbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQkJdGVzdEFkZFRydXN0QW5jaG9yMigpOwotCQkJCX0KLQkJCX0sIG5ldyBLZXlTdG9yZVRydXN0RW5naW5lVGVzdCgiYWRkVHJ1c3RBbmNob3IgbmVnYXRpdmUgdGVzdDogZXhpc3RpbmcgY2VydCBzcGVjaWZpZWQiLCBuZXcgU3RyaW5nW10geyJjYTFfcm9vdCJ9KSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJCXRlc3RBZGRUcnVzdEFuY2hvcjMoKTsKLQkJCQl9Ci0JCQl9LCBuZXcgS2V5U3RvcmVUcnVzdEVuZ2luZVRlc3QoImFkZFRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IGV4aXN0aW5nIGFsaWFzIHNwZWNpZmllZCIsIG5ldyBTdHJpbmdbXSB7ImNhMV9yb290In0pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQkJdGVzdEFkZFRydXN0QW5jaG9yNCgpOwotCQkJCX0KLQkJCX0KLQkJCS8qIHJlbW92ZVRydXN0QW5jaG9yIHRlc3RzICovCi0JCQksIG5ldyBLZXlTdG9yZVRydXN0RW5naW5lVGVzdCgicmVtb3ZlVHJ1c3RBbmNob3IgcG9zaXRpdmUgdGVzdDogcmVtb3ZlIGJ5IGFsaWFzIiwgbmV3IFN0cmluZ1tdIHsiY2ExX3Jvb3QifSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJCQl0ZXN0UmVtb3ZlVHJ1c3RBbmNob3IwKCk7Ci0JCQkJfQotCQkJfSwgbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJyZW1vdmVUcnVzdEFuY2hvciBwb3NpdGl2ZSB0ZXN0OiByZW1vdmUgYnkgY2VydCIsIG5ldyBTdHJpbmdbXSB7ImNhMV9yb290In0pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQkJdGVzdFJlbW92ZVRydXN0QW5jaG9yMSgpOwotCQkJCX0KLQkJCX0sIG5ldyBLZXlTdG9yZVRydXN0RW5naW5lVGVzdCgicmVtb3ZlVHJ1c3RBbmNob3IgbmVnYXRpdmUgdGVzdDogY2VydCBub3QgZm91bmQiLCBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJCQl0ZXN0UmVtb3ZlVHJ1c3RBbmNob3IyKCk7Ci0JCQkJfQotCQkJfSwgbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJyZW1vdmVUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiBieSBhbGlhcyBub3QgZm91bmQiLCBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJCQl0ZXN0UmVtb3ZlVHJ1c3RBbmNob3IzKCk7Ci0JCQkJfQotCQkJfSwgbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJyZW1vdmVUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiByZW1vdmUgYnkgbnVsbCBhbGlhcyIsIG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJCXRlc3RSZW1vdmVUcnVzdEFuY2hvcjQoKTsKLQkJCQl9Ci0JCQl9LCBuZXcgS2V5U3RvcmVUcnVzdEVuZ2luZVRlc3QoInJlbW92ZVRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IHJlbW92ZSBieSBudWxsIGNlcnRpZmljYXRlIiwgbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQkJdGVzdFJlbW92ZVRydXN0QW5jaG9yNSgpOwotCQkJCX0KLQkJCX0sCi0JCQkvKiBnZXRUcnVzdEFuY2hvciB0ZXN0cyovCi0JCQluZXcgS2V5U3RvcmVUcnVzdEVuZ2luZVRlc3QoImdldFRydXN0QW5jaG9yIHBvc2l0aXZlIHRlc3Q6IGdldCBieSBhbGlhcyIsIG5ldyBTdHJpbmdbXSB7ImNhMV9yb290In0pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQkJdGVzdEdldFRydXN0QW5jaG9yMCgpOwotCQkJCX0KLQkJCX0sIG5ldyBLZXlTdG9yZVRydXN0RW5naW5lVGVzdCgiZ2V0VHJ1c3RBbmNob3IgbmVnYXRpdmUgdGVzdDogZ2V0IGJ5IG51bGwgYWxpYXMiLCBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJCQl0ZXN0R2V0VHJ1c3RBbmNob3IxKCk7Ci0JCQkJfQotCQkJfSwgbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJnZXRUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiBkb2VzIG5vdCBleGlzdCIsIG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJCXRlc3RHZXRUcnVzdEFuY2hvcjIoKTsKLQkJCQl9Ci0JCQl9LAotCQkJLyogZ2V0QWxpYXNlcyB0ZXN0cyAqLwotCQkJbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0KCJnZXRBbGlhc2VzIHBvc2l0aXZlIHRlc3Q6IGdldCB0aGUgYWxpYXMgbGlzdCIsIG5ldyBTdHJpbmdbXSB7ImNhMV9yb290IiwgImNhMl9yb290In0pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJCQl0ZXN0R2V0QWxpYXNlczAoKTsKLQkJCQl9Ci0JCQl9fTsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVW5pdCB0ZXN0cyBmb3IgVHJ1c3RFbmdpbmUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHNfdGVzdHMubGVuZ3RoOyBpKyspIHsKLQkJCXN1aXRlLmFkZFRlc3Qoc190ZXN0c1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEtleVN0b3JlIHN1cHBvcnRTdG9yZTsKLQlzdGF0aWMgewotCQl0cnkgewotCQkJVVJMIHN1cHBvcnRVcmwgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJ0ZXN0X2ZpbGVzL3NlY3VyaXR5L2tleXN0b3JlLmprcyIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShUWVBFX0RFRkFVTFQpOwotCQkJc3VwcG9ydFN0b3JlLmxvYWQoc3VwcG9ydFVybC5vcGVuU3RyZWFtKCksIFBBU1NXT1JEX0RFRkFVTFQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYWxpYXNlczsKLQlwcml2YXRlIEtleVN0b3JlIHRlc3RTdG9yZTsKLQlwcml2YXRlIEZpbGUgdGVzdFN0b3JlRmlsZTsKLQlUcnVzdEVuZ2luZSBlbmdpbmU7Ci0KLQlwdWJsaWMgS2V5U3RvcmVUcnVzdEVuZ2luZVRlc3QoKSB7Ci0JCS8vcGxhY2Vob2xkZXIKLQl9Ci0KLQlwdWJsaWMgS2V5U3RvcmVUcnVzdEVuZ2luZVRlc3QoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGFsaWFzZXMpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuYWxpYXNlcyA9IGFsaWFzZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHN1cHBvcnRTdG9yZSA9PSBudWxsKSB7Ci0JCQlmYWlsKCJDb3VsZCBub3Qgb3BlbiBrZXlzdG9yZSB3aXRoIHRlc3QgY2VydGlmaWNhdGVzISIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0ZXN0U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShUWVBFX0RFRkFVTFQpOwotCQl0ZXN0U3RvcmUubG9hZChudWxsLCBQQVNTV09SRF9ERUZBVUxUKTsKLQkJaWYgKGFsaWFzZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGVzdFN0b3JlLnNldENlcnRpZmljYXRlRW50cnkoYWxpYXNlc1tpXSwgZ2V0VGVzdENlcnRpZmljYXRlKGFsaWFzZXNbaV0pKTsKLQkJCX0KLQkJfQotCQl0ZXN0U3RvcmVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdHN0b3JlIiwgImprcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZXN0U3RvcmVGaWxlKTsKLQkJdHJ5IHsKLQkJCXRlc3RTdG9yZS5zdG9yZShvdXQsIFBBU1NXT1JEX0RFRkFVTFQpOwotCQl9IGZpbmFsbHkgewotCQkJc2FmZUNsb3NlKG91dCk7Ci0JCX0KLQkJZW5naW5lID0gbmV3IEtleVN0b3JlVHJ1c3RFbmdpbmUodGVzdFN0b3JlRmlsZS5nZXRQYXRoKCksIFRZUEVfREVGQVVMVCwgUEFTU1dPUkRfREVGQVVMVCwgInRlc3RzdG9yZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2xvc2VzIGEgc3RyZWFtIGFuZCBpZ25vcmVzIGFueSByZXN1bHRpbmcgZXhjZXB0aW9uLiBUaGlzIGlzIHVzZWZ1bAotCSAqIHdoZW4gZG9pbmcgc3RyZWFtIGNsZWFudXAgaW4gYSBmaW5hbGx5IGJsb2NrIHdoZXJlIHNlY29uZGFyeSBleGNlcHRpb25zCi0JICogYXJlIG5vdCB3b3J0aCBsb2dnaW5nLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzYWZlQ2xvc2UoT3V0cHV0U3RyZWFtIG91dCkgewotCQl0cnkgewotCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCW91dC5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2lnbm9yZQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JCWVuZ2luZSA9IG51bGw7Ci0JCXRlc3RTdG9yZSA9IG51bGw7Ci0JCXRlc3RTdG9yZUZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ2VydGlmaWNhdGUgZ2V0VGVzdENlcnRpZmljYXRlKFN0cmluZyBhbGlhcykgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cHBvcnRTdG9yZS5nZXRDZXJ0aWZpY2F0ZShhbGlhcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ2VydGlmaWNhdGVbXSBnZXRUZXN0Q2VydGlmaWNhdGVDaGFpbihTdHJpbmdbXSBhbGlhc2VzKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewotCQlBcnJheUxpc3QgY2VydHMgPSBuZXcgQXJyYXlMaXN0KGFsaWFzZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZXJ0cy5hZGQoZ2V0VGVzdENlcnRpZmljYXRlKGFsaWFzZXNbaV0pKTsKLQkJfQotCQlyZXR1cm4gKENlcnRpZmljYXRlW10pIGNlcnRzLnRvQXJyYXkobmV3IENlcnRpZmljYXRlW10ge30pOwotCX0KLQotCS8vZmluZFRydXN0QW5jaG9yIHBvc2l0aXZlIHRlc3Q6IHNlbGYgc2lnbmVkIHRydXN0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFRydXN0QW5jaG9yMCgpIHsKLQkJdHJ5IHsKLQkJCUNlcnRpZmljYXRlIGNlcnQgPSBlbmdpbmUuZmluZFRydXN0QW5jaG9yKG5ldyBDZXJ0aWZpY2F0ZVtdIHtnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9yb290Iil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0Tm90TnVsbCgiRGlkIG5vdCByZXR1cm4gYSBjZXJ0IGZvciBzZWxmLXNpZ25lZCBjYXNlIiwgY2VydCk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiSW5wdXQgYW5kIG91dHB1dCBjZXJ0cyBub3QgZXF1YWwgZm9yIHNlbGYtc2lnbmVkIGNhc2UiLCBjZXJ0LCBnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9yb290IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRlc3RpbmcgdHJ1c3RlZCBzZWxmLXNpZ25lZCBjZXJ0OiAiICsgdC5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL2ZpbmRUcnVzdEFuY2hvciBwb3NpdGl2ZSB0ZXN0OiBjaGFpbiB3aXRoIHJvb3QgdHJ1c3RlZAotCXB1YmxpYyB2b2lkIHRlc3RGaW5kVHJ1c3RBbmNob3IxKCkgewotCQl0cnkgewotCQkJQ2VydGlmaWNhdGUgY2VydCA9IGVuZ2luZS5maW5kVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlQ2hhaW4obmV3IFN0cmluZ1tdIHsiY2ExX2xlYWZiIiwgImNhMV9vdSIsICJjYTFfcm9vdCJ9KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlhc3NlcnROb3ROdWxsKCJDZXJ0aWZpY2F0ZSBkaWQgbm90IGNvbWUgYmFjayBpbiB0cnVzdGVkIHJvb3QgY2FzZSIsIGNlcnQpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIk91dHB1dCBjZXJ0IGlzIG5vdCByb290IHRydXN0ZWQgY2VydCIsIGNlcnQsIGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX3Jvb3QiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gdGVzdGluZyB0cnVzdGVkIHJvb3QgZnJvbSBjb21wbGV0ZSBjaGFpbjogIiArIHQuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLy9maW5kVHJ1c3RBbmNob3IgcG9zaXRpdmUgdGVzdDogY2hhaW4gd2l0aCBpbnRlcm1lZGlhdGUgdHJ1c3RlZAotCXB1YmxpYyB2b2lkIHRlc3RGaW5kVHJ1c3RBbmNob3IyKCkgewotCQl0cnkgewotCQkJQ2VydGlmaWNhdGUgY2VydCA9IGVuZ2luZS5maW5kVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlQ2hhaW4obmV3IFN0cmluZ1tdIHsiY2ExX2xlYWZiIiwgImNhMV9vdSIsICJjYTFfcm9vdCJ9KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlhc3NlcnROb3ROdWxsKCJDZXJ0aWZpY2F0ZSBkaWQgbm90IGNvbWUgYmFjayBpbiB0cnVzdGVkIGludGVybWVkaWF0ZSBjYXNlIiwgY2VydCk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiT3V0cHV0IGNlcnQgaXMgbm90IGludGVybWVkaWF0ZSB0cnVzdGVkIGNlcnQiLCBjZXJ0LCBnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9vdSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB0ZXN0aW5nIHRydXN0ZWQgcm9vdCBmcm9tIGNvbXBsZXRlIGNoYWluOiAiICsgdC5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL2ZpbmRUcnVzdEFuY2hvciBwb3NpdGl2ZSB0ZXN0OiBjaGFpbiB3aXRoIGxlYWYgdHJ1c3RlZAotCXB1YmxpYyB2b2lkIHRlc3RGaW5kVHJ1c3RBbmNob3IzKCkgewotCQl0cnkgewotCQkJQ2VydGlmaWNhdGUgY2VydCA9IGVuZ2luZS5maW5kVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlQ2hhaW4obmV3IFN0cmluZ1tdIHsiY2ExX2xlYWZiIiwgImNhMV9vdSIsICJjYTFfcm9vdCJ9KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlhc3NlcnROb3ROdWxsKCJDZXJ0aWZpY2F0ZSBkaWQgbm90IGNvbWUgYmFjayBpbiB0cnVzdGVkIGxlYWYgY2FzZSIsIGNlcnQpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIk91dHB1dCBjZXJ0IGlzIG5vdCBsZWFmIHRydXN0ZWQgY2VydCIsIGNlcnQsIGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX2xlYWZiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRlc3RpbmcgdHJ1c3RlZCByb290IGZyb20gY29tcGxldGUgY2hhaW46ICIgKyB0LmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vZmluZFRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IHVudHJ1c3RlZCBzZWxmIHNpZ25lZAotCXB1YmxpYyB2b2lkIHRlc3RGaW5kVHJ1c3RBbmNob3I0KCkgewotCQl0cnkgewotCQkJQ2VydGlmaWNhdGUgY2VydCA9IGVuZ2luZS5maW5kVHJ1c3RBbmNob3IobmV3IENlcnRpZmljYXRlW10ge2dldFRlc3RDZXJ0aWZpY2F0ZSgiY2EyX3Jvb3QiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnROdWxsKCJJbmNvcnJlY3RseSByZXR1cm5lZCBhIGNlcnRpZmljYXRlIGZvciB1bnRydXN0ZWQgc2VsZi1zaWduZWQgY2FzZSIsIGNlcnQpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB0ZXN0aW5nIHVudHJ1c3RlZCBzZWxmLXNpZ25lZCBjZXJ0OiAiICsgdC5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL2ZpbmRUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiB1bnRydXN0ZWQgY2hhaW4KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFRydXN0QW5jaG9yNSgpIHsKLQkJdHJ5IHsKLQkJCUNlcnRpZmljYXRlIGNlcnQgPSBlbmdpbmUuZmluZFRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZUNoYWluKG5ldyBTdHJpbmdbXSB7ImNhMl9sZWFmYiIsICJjYTJfb3UiLCAiY2EyX3Jvb3QifSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJYXNzZXJ0TnVsbCgiSW5jb3JyZWN0bHkgcmV0dXJuZWQgYSBjZXJ0aWZpY2F0ZSBmb3IgdW50cnVzdGVkIGNoYWluIGNhc2UiLCBjZXJ0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gdGVzdGluZyB1bnRydXN0ZWQgY2hhaW46ICIgKyB0LmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vZmluZFRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IGludmFsaWQgY2hhaW4KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFRydXN0QW5jaG9yNigpIHsKLQkJdHJ5IHsKLQkJCUNlcnRpZmljYXRlIGNlcnQgPSBlbmdpbmUuZmluZFRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZUNoYWluKG5ldyBTdHJpbmdbXSB7ImNhMl9sZWFmYSIsICJjYTFfcm9vdCJ9KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXNzZXJ0TnVsbCgiSW5jb3JyZWN0bHkgcmV0dXJuZWQgYSBjZXJ0aWZpY2F0ZSBvbiBpbnZhbGlkIGNlcnRpZmljYXRlIGNoYWluIiwgY2VydCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWFzc2VydE51bGwoIkluY29ycmVjdGx5IHRocm93biBleGNlcHRpb24gdGhyb3duIG9uIGludmFsaWQgY2VydGlmaWNhdGUgY2hhaW4iLCB0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLy9maW5kVHJ1c3RBbmNob3IgbmVnYXRpdmUgdGVzdDogaW5jb21wbGV0ZS1hYmxlIGNoYWluCi0JcHVibGljIHZvaWQgdGVzdEZpbmRUcnVzdEFuY2hvcjcoKSB7Ci0JCXRyeSB7Ci0JCQlDZXJ0aWZpY2F0ZSBjZXJ0ID0gZW5naW5lLmZpbmRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGVDaGFpbihuZXcgU3RyaW5nW10geyJjYTFfbGVhZmIiLCAiY2ExX3Jvb3QifSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFzc2VydE51bGwoIkluY29ycmVjdGx5IHJldHVybmVkIGEgY2VydGlmaWNhdGUgb24gaW5jb21wbGV0ZS1hYmxlIGNlcnRpZmljYXRlIGNoYWluIiwgY2VydCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWFzc2VydE51bGwoIkluY29ycmVjdGx5IHRocm93biBleGNlcHRpb24gdGhyb3duIG9uIGluY29tcGxldGUtYWJsZSBjZXJ0aWZpY2F0ZSBjaGFpbiIsIHQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL2ZpbmRUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiBudWxsIGNoYWluCi0JcHVibGljIHZvaWQgdGVzdEZpbmRUcnVzdEFuY2hvcjgoKSB7Ci0JCXRyeSB7Ci0JCQllbmdpbmUuZmluZFRydXN0QW5jaG9yKG51bGwpOwotCQkJZmFpbCgiRGlkIG5vdCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb24gTlVMTCBjZXJ0aWZpY2F0ZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBvbiBOVUxMIGNlcnRpZmljYXRlIiwgdCBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vdGVzdEFkZFRydXN0QW5jaG9yIHBvc2l0aXZlIHRlc3Q6IGFkZCB3aXRoIGFsaWFzCi0JcHVibGljIHZvaWQgdGVzdEFkZFRydXN0QW5jaG9yMCgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBhbGlhcyA9IGVuZ2luZS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9yb290IiksICJjYTFfcm9vdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFzc2VydEVxdWFscygiQWxpYXMgcmV0dXJuZWQgZG9lcyBub3QgZXF1YWwgYWxpYXMgaW5wdXQiLCBhbGlhcywgImNhMV9yb290Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBhZGRpbmcgdHJ1c3RlZCByb290OiAiICsgdC5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL3Rlc3RBZGRUcnVzdEFuY2hvciBwb3NpdGl2ZSB0ZXN0OiBhZGQgd2l0aCBhdXRvZ2VuZXJhdGVkIGFsaWFzCi0JcHVibGljIHZvaWQgdGVzdEFkZFRydXN0QW5jaG9yMSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBhbGlhcyA9IGVuZ2luZS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9yb290IiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnROb3ROdWxsKCJHZW5lcmF0ZWQgYWxpYXMgd2FzIG5vdCBjb3JyZWN0bHkgcmV0dXJuZWQiLCBhbGlhcyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGFkZGluZyB0cnVzdGVkIHJvb3QgKGF1dG9nZW4gYWxpYXMpOiAiICsgdC5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL3Rlc3RBZGRUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiBudWxsIGNlcnQgc3BlY2lmaWVkCi0JcHVibGljIHZvaWQgdGVzdEFkZFRydXN0QW5jaG9yMigpIHsKLQkJdHJ5IHsKLQkJCWVuZ2luZS5hZGRUcnVzdEFuY2hvcihudWxsLCAiY2ExX3Jvb3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmFpbCgiRGlkIG5vdCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb24gTlVMTCBjZXJ0aWZpY2F0ZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBvbiBOVUxMIGNlcnRpZmljYXRlIiwgdCBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vdGVzdEFkZFRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IGV4aXN0aW5nIGNlcnQgc3BlY2lmaWVkCi0JcHVibGljIHZvaWQgdGVzdEFkZFRydXN0QW5jaG9yMygpIHsKLQkJdHJ5IHsKLQkJCWVuZ2luZS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9yb290IiksICJuZXdfcm9vdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgdGhyb3cgQ2VydGlmaWNhdGVFeGNlcHRpb24gb24gZHVwbGljYXRlIGNlcnQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWFzc2VydFRydWUoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIG9uIGR1cGxpY2F0ZSBjZXJ0IiwgdCBpbnN0YW5jZW9mIENlcnRpZmljYXRlRXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIGFkZGluZyB0cnVzdCBhbmNob3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vdGVzdEFkZFRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IGV4aXN0aW5nIGFsaWFzIHNwZWNpZmllZAotCXB1YmxpYyB2b2lkIHRlc3RBZGRUcnVzdEFuY2hvcjQoKSB7Ci0JCXRyeSB7Ci0JCQllbmdpbmUuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTJfcm9vdCIpLCAiY2ExX3Jvb3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlhc3NlcnRUcnVlKCJEaWQgbm90IHRocm93IENlcnRpZmljYXRlRXhjZXB0aW9uIG9uIGR1cGxpY2F0ZSBhbGlhcyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gb24gZHVwbGljYXRlIGFsaWFzIiwgdCBpbnN0YW5jZW9mIENlcnRpZmljYXRlRXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIGFkZGluZyB0cnVzdCBhbmNob3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vcmVtb3ZlVHJ1c3RBbmNob3IgcG9zaXRpdmUgdGVzdDogcmVtb3ZlIGJ5IGFsaWFzCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRydXN0QW5jaG9yMCgpIHsKLQkJdHJ5IHsKLQkJCWVuZ2luZS5yZW1vdmVUcnVzdEFuY2hvcigiY2ExX3Jvb3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIHdoZW4gcmVtb3ZpbmcgYnkgYWxpYXM6ICIgKyB0LmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vcmVtb3ZlVHJ1c3RBbmNob3IgcG9zaXRpdmUgdGVzdDogcmVtb3ZlIGJ5IGNlcnQKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVHJ1c3RBbmNob3IxKCkgewotCQl0cnkgewotCQkJZW5naW5lLnJlbW92ZVRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX3Jvb3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biB3aGVuIHJlbW92aW5nIGJ5IGNlcnQ6ICIgKyB0LmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vcmVtb3ZlVHJ1c3RBbmNob3IgbmVnYXRpdmUgdGVzdDogY2VydCBub3QgZm91bmQKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVHJ1c3RBbmNob3IyKCkgewotCQl0cnkgewotCQkJZW5naW5lLnJlbW92ZVRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX3Jvb3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZhaWwoIkRpZCBub3QgdGhyb3cgQ2VydGlmaWNhdGVFeGNlcHRpb24gb24gY2VydCBub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gb24gcmVtb3ZlIGJ5IGNlcnQiLCB0IGluc3RhbmNlb2YgQ2VydGlmaWNhdGVFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL3JlbW92ZVRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IGJ5IGFsaWFzIG5vdCBmb3VuZAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUcnVzdEFuY2hvcjMoKSB7Ci0JCXRyeSB7Ci0JCQllbmdpbmUucmVtb3ZlVHJ1c3RBbmNob3IoImNhMl9yb290Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgdGhyb3cgQ2VydGlmaWNhdGVFeGNlcHRpb24gb24gYWxpYXMgbm90IGZvdW5kIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBvbiByZW1vdmUgYnkgYWxpYXMiLCB0IGluc3RhbmNlb2YgQ2VydGlmaWNhdGVFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gcmVtb3ZpbmcgdHJ1c3QgYW5jaG9yIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvL3JlbW92ZVRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IHJlbW92ZSBieSBudWxsIGFsaWFzCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRydXN0QW5jaG9yNCgpIHsKLQkJdHJ5IHsKLQkJCWVuZ2luZS5yZW1vdmVUcnVzdEFuY2hvcigoU3RyaW5nKSBudWxsKTsKLQkJCWZhaWwoIkRpZCBub3QgdGhyb3cgQ2VydGlmaWNhdGVFeGNlcHRpb24gb24gYWxpYXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBvbiByZW1vdmUgYnkgbnVsbCBhbGlhcyIsIHQgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL3JlbW92ZVRydXN0QW5jaG9yIG5lZ2F0aXZlIHRlc3Q6IHJlbW92ZSBieSBudWxsIGNlcnRpZmljYXRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRydXN0QW5jaG9yNSgpIHsKLQkJdHJ5IHsKLQkJCWVuZ2luZS5yZW1vdmVUcnVzdEFuY2hvcigoQ2VydGlmaWNhdGUpIG51bGwpOwotCQkJZmFpbCgiRGlkIG5vdCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb24gcmVtb3ZlIGJ5IGNlcnQgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBvbiByZW1vdmUgYnkgbnVsbCBjZXJ0IiwgdCBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vZ2V0VHJ1c3RBbmNob3IgcG9zaXRpdmUgdGVzdDogZ2V0IGJ5IGFsaWFzCi0JcHVibGljIHZvaWQgdGVzdEdldFRydXN0QW5jaG9yMCgpIHsKLQkJdHJ5IHsKLQkJCUNlcnRpZmljYXRlIGNlcnQgPSBlbmdpbmUuZ2V0VHJ1c3RBbmNob3IoImNhMV9yb290Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgY2VydGlmaWNhdGUiLCBnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9yb290IiksIGNlcnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gcmV0cmlldmluZyB0cnVzdCBhbmNob3I6ICIgKyB0LmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vZ2V0VHJ1c3RBbmNob3IgbmVnYXRpdmUgdGVzdDogZ2V0IGJ5IG51bGwgYWxpYXMKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHJ1c3RBbmNob3IxKCkgewotCQl0cnkgewotCQkJZW5naW5lLmdldFRydXN0QW5jaG9yKG51bGwpOwotCQkJZmFpbCgiRGlkIG5vdCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb24gZ2V0IGJ5IGFsaWFzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gb24gcmVtb3ZlIGJ5IG51bGwgYWxpYXMiLCB0IGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLy9nZXRUcnVzdEFuY2hvciBuZWdhdGl2ZSB0ZXN0OiBkb2VzIG5vdCBleGlzdAotCXB1YmxpYyB2b2lkIHRlc3RHZXRUcnVzdEFuY2hvcjIoKSB7Ci0JCXRyeSB7Ci0JCQlDZXJ0aWZpY2F0ZSBjZXJ0ID0gZW5naW5lLmdldFRydXN0QW5jaG9yKCJjYTJfcm9vdCIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnROdWxsKCJJbmNvcnJlY3RseSByZXR1cm5lZCBhIGNlcnRpZmljYXRlIG9uIGNlcnRpZmljYXRlIGRvZXMgbm90IGV4aXN0IiwgY2VydCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWFzc2VydE51bGwoIkluY29ycmVjdGx5IHRocm93biBleGNlcHRpb24gb24gYWxpYXMgZG9lcyBub3QgZXhpc3QiLCB0KTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLy9nZXRBbGlhc2VzIHBvc2l0aXZlIHRlc3Q6IGdldCB0aGUgYWxpYXMgbGlzdAotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbGlhc2VzMCgpIHsKLQkJdHJ5IHsKLQkJCWVuZ2luZS5nZXRBbGlhc2VzKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHJldHJpZXZpbmcgYWxpYXMgbGlzdDogIiArIHQuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0JLy9UT0RPOiB0aHJlYWQgc2FmZXR5IHRlc3RzCi0JLy9UT0RPOiBwZXJmb3JtYW5jZSB0ZXN0cwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L09TR2lBUElDZXJ0aWZpY2F0ZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eS9PU0dpQVBJQ2VydGlmaWNhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWRkY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L09TR2lBUElDZXJ0aWZpY2F0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VjdXJpdHk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5BZG1pblBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uKjsKLQotcHVibGljIGNsYXNzIE9TR2lBUElDZXJ0aWZpY2F0ZVRlc3QgZXh0ZW5kcyBCYXNlU2VjdXJpdHlUZXN0IHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG4xID0gIkNOPUNBMSBMZWFmQSwgTz1DQTEsIEw9Qm9zdG9uLCBTVD1NYXNzYWNodXNldHRzLCBDPVVTIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkbjIgPSAiQ049Q0ExIFJvb3QsIE89Q0ExLCBMPUJvc3RvbiwgU1Q9TWFzc2FjaHVzZXR0cywgQz1VUyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG4zID0gIkNOPUNBMSBMZWFmQSwgTz1DQTEsIEw9QXVzdGluLCBTVD1UZXhhcywgQz1VUyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG40ID0gIkNOPUNBMSBSb290LCBPPUNBMSwgTD1BdXN0aW4sIFNUPVRleGFzLCBDPVVTIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkbjUgPSAiQ049Q0ExIExlYWZBLCBPPUNBMSwgTD0qLCBTVD0qLCBDPVVTIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkbjYgPSAiQ049Q0ExIFJvb3QsIE89Q0ExLCBMPSosIFNUPSosIEM9VVMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRuNyA9ICIqLCBMPSosIFNUPSosIEM9VVMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG5DaGFpbjAxVHJ1ZSA9IGRuMSArICc7JyArIGRuMjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG5DaGFpbjAyVHJ1ZSA9ICIqOyIgKyBkbjI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG5DaGFpbjAzVHJ1ZSA9IGRuMSArICI7KiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG5DaGFpbjA0RmFsc2UgPSBkbjEgKyAnOycgKyBkbjQ7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRuQ2hhaW4wNUZhbHNlID0gZG4zICsgJzsnICsgZG4yOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkbkNoYWluMDZUcnVlID0gZG41ICsgJzsnICsgZG42OwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkbkNoYWluMDdUcnVlID0gZG43ICsgJzsnICsgZG42OwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkbkNoYWluMDhUcnVlID0gZG41ICsgJzsnICsgZG43OwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRuQ2hhaW4wMVRydWVFc2NhcGVkID0gZXNjYXBlU3RhcihkbkNoYWluMDFUcnVlKTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG5DaGFpbjAyVHJ1ZUVzY2FwZWQgPSBlc2NhcGVTdGFyKGRuQ2hhaW4wMlRydWUpOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkbkNoYWluMDNUcnVlRXNjYXBlZCA9IGVzY2FwZVN0YXIoZG5DaGFpbjAzVHJ1ZSk7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRuQ2hhaW4wNEZhbHNlRXNjYXBlZCA9IGVzY2FwZVN0YXIoZG5DaGFpbjA0RmFsc2UpOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkbkNoYWluMDVGYWxzZUVzY2FwZWQgPSBlc2NhcGVTdGFyKGRuQ2hhaW4wNUZhbHNlKTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG5DaGFpbjA2VHJ1ZUVzY2FwZWQgPSBlc2NhcGVTdGFyKGRuQ2hhaW4wNlRydWUpOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkbkNoYWluMDdUcnVlRXNjYXBlZCA9IGVzY2FwZVN0YXIoZG5DaGFpbjA3VHJ1ZSk7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRuQ2hhaW4wOFRydWVFc2NhcGVkID0gZXNjYXBlU3RhcihkbkNoYWluMDhUcnVlKTsKLQotCXByaXZhdGUgc3RhdGljIENvbmRpdGlvbkluZm8gaW5mbzAxVHJ1ZSA9IG5ldyBDb25kaXRpb25JbmZvKEJ1bmRsZVNpZ25lckNvbmRpdGlvbi5jbGFzcy5nZXROYW1lKCksIG5ldyBTdHJpbmdbXSB7Ii0ifSk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBDb25kaXRpb25JbmZvIGluZm8wMkZhbHNlID0gbmV3IENvbmRpdGlvbkluZm8oQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmNsYXNzLmdldE5hbWUoKSwgbmV3IFN0cmluZ1tdIHsiLSIsICIhIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIHN0YXRpYyBDb25kaXRpb25JbmZvIGluZm8wM1RydWUgPSBuZXcgQ29uZGl0aW9uSW5mbyhCdW5kbGVTaWduZXJDb25kaXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBuZXcgU3RyaW5nW10ge2RuQ2hhaW4wMVRydWV9KTsKLQlwcml2YXRlIHN0YXRpYyBDb25kaXRpb25JbmZvIGluZm8wNFRydWUgPSBuZXcgQ29uZGl0aW9uSW5mbyhCdW5kbGVTaWduZXJDb25kaXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBuZXcgU3RyaW5nW10ge2RuQ2hhaW4wMlRydWV9KTsKLQlwcml2YXRlIHN0YXRpYyBDb25kaXRpb25JbmZvIGluZm8wNVRydWUgPSBuZXcgQ29uZGl0aW9uSW5mbyhCdW5kbGVTaWduZXJDb25kaXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBuZXcgU3RyaW5nW10ge2RuQ2hhaW4wM1RydWV9KTsKLQlwcml2YXRlIHN0YXRpYyBDb25kaXRpb25JbmZvIGluZm8wNkZhbHNlID0gbmV3IENvbmRpdGlvbkluZm8oQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmNsYXNzLmdldE5hbWUoKSwgbmV3IFN0cmluZ1tdIHtkbkNoYWluMDRGYWxzZX0pOwotCXByaXZhdGUgc3RhdGljIENvbmRpdGlvbkluZm8gaW5mbzA3RmFsc2UgPSBuZXcgQ29uZGl0aW9uSW5mbyhCdW5kbGVTaWduZXJDb25kaXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBuZXcgU3RyaW5nW10ge2RuQ2hhaW4wNUZhbHNlfSk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29uZGl0aW9uSW5mbyBpbmZvMDhUcnVlID0gbmV3IENvbmRpdGlvbkluZm8oQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmNsYXNzLmdldE5hbWUoKSwgbmV3IFN0cmluZ1tdIHtkbkNoYWluMDZUcnVlfSk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29uZGl0aW9uSW5mbyBpbmZvMDlUcnVlID0gbmV3IENvbmRpdGlvbkluZm8oQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmNsYXNzLmdldE5hbWUoKSwgbmV3IFN0cmluZ1tdIHtkbkNoYWluMDdUcnVlfSk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29uZGl0aW9uSW5mbyBpbmZvMTBUcnVlID0gbmV3IENvbmRpdGlvbkluZm8oQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmNsYXNzLmdldE5hbWUoKSwgbmV3IFN0cmluZ1tdIHtkbkNoYWluMDhUcnVlfSk7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoT1NHaUFQSUNlcnRpZmljYXRlVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVzY2FwZVN0YXIoU3RyaW5nIGRuQ2hhaW4pIHsKLQkJaWYgKGRuQ2hhaW4gPT0gbnVsbCB8fCBkbkNoYWluLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZG5DaGFpbjsKLQkJZm9yIChpbnQgc3RhciA9IGRuQ2hhaW4uaW5kZXhPZignKicpOyBzdGFyID49IDA7IHN0YXIgPSBkbkNoYWluLmluZGV4T2YoJyonLCBzdGFyICsgMikpCi0JCQlkbkNoYWluID0gZG5DaGFpbi5zdWJzdHJpbmcoMCwgc3RhcikgKyAnXFwnICsgZG5DaGFpbi5zdWJzdHJpbmcoc3Rhcik7Ci0JCXJldHVybiBkbkNoYWluOwotCX0KLQotCXB1YmxpYyBPU0dpQVBJQ2VydGlmaWNhdGVUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPU0dpQVBJQ2VydGlmaWNhdGVUZXN0KFN0cmluZyBuYW1lLCBTdHJpbmcgamFybmFtZSwgU3RyaW5nW10gYWxpYXNlcykgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZWdpc3RlckVjbGlwc2VUcnVzdEVuZ2luZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bmRsZVNpZ25lckNvbmRpdGlvbjAxKCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIGFsbCBzaWduZWQgbWF0Y2gKLQkJdHJ5IHsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUJ1bmRsZSB0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvLyROT04tTkxTLTEkCi0JCQlDb25kaXRpb24gY29uZGl0aW9uID0gQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmdldENvbmRpdGlvbih0ZXN0QnVuZGxlLCBpbmZvMDFUcnVlKTsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb25kaXRpb24gdmFsdWUiLCBDb25kaXRpb24uVFJVRSwgY29uZGl0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bmRsZVNpZ25lckNvbmRpdGlvbjAyKCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIGFsbCBzaWduZWQgbWF0Y2ggKyAiISIgbm90IG9wZXJhdGlvbgotCQl0cnkgewotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUNvbmRpdGlvbiBjb25kaXRpb24gPSBCdW5kbGVTaWduZXJDb25kaXRpb24uZ2V0Q29uZGl0aW9uKHRlc3RCdW5kbGUsIGluZm8wMkZhbHNlKTsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb25kaXRpb24gdmFsdWUiLCBDb25kaXRpb24uRkFMU0UsIGNvbmRpdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdW5kbGVTaWduZXJDb25kaXRpb24wMygpIHsKLQkJLy8gdGVzdCB1bnRydXN0ZWQgY2VydCB3aXRoIGFsbCBzaWduZWQgbWF0Y2gKLQkJdHJ5IHsKLQkJCUJ1bmRsZSB0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvLyROT04tTkxTLTEkCi0JCQlDb25kaXRpb24gY29uZGl0aW9uID0gQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmdldENvbmRpdGlvbih0ZXN0QnVuZGxlLCBpbmZvMDFUcnVlKTsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb25kaXRpb24gdmFsdWUiLCBDb25kaXRpb24uRkFMU0UsIGNvbmRpdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdW5kbGVTaWduZXJDb25kaXRpb24wNCgpIHsKLQkJLy8gdGVzdCB1bnRydXN0ZWQgY2VydCB3aXRoIGFsbCBzaWduZWQgbWF0Y2ggKyAiISIgbm90IG9wZXJhdGlvbgotCQl0cnkgewotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUNvbmRpdGlvbiBjb25kaXRpb24gPSBCdW5kbGVTaWduZXJDb25kaXRpb24uZ2V0Q29uZGl0aW9uKHRlc3RCdW5kbGUsIGluZm8wMkZhbHNlKTsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb25kaXRpb24gdmFsdWUiLCBDb25kaXRpb24uVFJVRSwgY29uZGl0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bmRsZVNpZ25lckNvbmRpdGlvbjA1KCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIGV4YWN0IG1hdGNoIHBhdHRlcm4KLQkJdHJ5IHsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUJ1bmRsZSB0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvLyROT04tTkxTLTEkCi0JCQlDb25kaXRpb24gY29uZGl0aW9uID0gQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmdldENvbmRpdGlvbih0ZXN0QnVuZGxlLCBpbmZvMDNUcnVlKTsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb25kaXRpb24gdmFsdWUiLCBDb25kaXRpb24uVFJVRSwgY29uZGl0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bmRsZVNpZ25lckNvbmRpdGlvbjA2KCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIHByZWZpeCB3aWxkY2FyZCBtYXRjaCBwYXR0ZXJuCi0JCXRyeSB7Ci0JCQlnZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX2xlYWZhIiksICJjYTFfbGVhZmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlCdW5kbGUgdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IEJ1bmRsZVNpZ25lckNvbmRpdGlvbi5nZXRDb25kaXRpb24odGVzdEJ1bmRsZSwgaW5mbzA0VHJ1ZSk7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY29uZGl0aW9uIHZhbHVlIiwgQ29uZGl0aW9uLlRSVUUsIGNvbmRpdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdW5kbGVTaWduZXJDb25kaXRpb24wNygpIHsKLQkJLy8gdGVzdCB0cnVzdGVkIGNlcnQgd2l0aCBwb3N0Zml4IHdpbGRjYXJkIG1hdGNoIHBhdHRlcm4KLQkJdHJ5IHsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUJ1bmRsZSB0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvLyROT04tTkxTLTEkCi0JCQlDb25kaXRpb24gY29uZGl0aW9uID0gQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmdldENvbmRpdGlvbih0ZXN0QnVuZGxlLCBpbmZvMDVUcnVlKTsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb25kaXRpb24gdmFsdWUiLCBDb25kaXRpb24uVFJVRSwgY29uZGl0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bmRsZVNpZ25lckNvbmRpdGlvbjA4KCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIHdyb25nIHByZWZpeCBkbgotCQl0cnkgewotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUNvbmRpdGlvbiBjb25kaXRpb24gPSBCdW5kbGVTaWduZXJDb25kaXRpb24uZ2V0Q29uZGl0aW9uKHRlc3RCdW5kbGUsIGluZm8wNkZhbHNlKTsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb25kaXRpb24gdmFsdWUiLCBDb25kaXRpb24uRkFMU0UsIGNvbmRpdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdW5kbGVTaWduZXJDb25kaXRpb24wOSgpIHsKLQkJLy8gdGVzdCB0cnVzdGVkIGNlcnQgd2l0aCB3cm9uZyBwb3N0Zml4IGRuCi0JCXRyeSB7Ci0JCQlnZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX2xlYWZhIiksICJjYTFfbGVhZmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlCdW5kbGUgdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IEJ1bmRsZVNpZ25lckNvbmRpdGlvbi5nZXRDb25kaXRpb24odGVzdEJ1bmRsZSwgaW5mbzA3RmFsc2UpOwotCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNvbmRpdGlvbiB2YWx1ZSIsIENvbmRpdGlvbi5GQUxTRSwgY29uZGl0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bmRsZVNpZ25lckNvbmRpdGlvbjEwKCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIFJETiB3aWxkY2FyZCBtYXRjaCBwYXR0ZXJuCi0JCXRyeSB7Ci0JCQlnZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX2xlYWZhIiksICJjYTFfbGVhZmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlCdW5kbGUgdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IEJ1bmRsZVNpZ25lckNvbmRpdGlvbi5nZXRDb25kaXRpb24odGVzdEJ1bmRsZSwgaW5mbzA4VHJ1ZSk7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY29uZGl0aW9uIHZhbHVlIiwgQ29uZGl0aW9uLlRSVUUsIGNvbmRpdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdW5kbGVTaWduZXJDb25kaXRpb24xMSgpIHsKLQkJLy8gdGVzdCB0cnVzdGVkIGNlcnQgd2l0aCBSRE4gd2lsZGNhcmQgbWF0Y2ggcGF0dGVybgotCQl0cnkgewotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUNvbmRpdGlvbiBjb25kaXRpb24gPSBCdW5kbGVTaWduZXJDb25kaXRpb24uZ2V0Q29uZGl0aW9uKHRlc3RCdW5kbGUsIGluZm8wOVRydWUpOwotCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNvbmRpdGlvbiB2YWx1ZSIsIENvbmRpdGlvbi5UUlVFLCBjb25kaXRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlU2lnbmVyQ29uZGl0aW9uMTIoKSB7Ci0JCS8vIHRlc3QgdHJ1c3RlZCBjZXJ0IHdpdGggUkROIHdpbGRjYXJkIG1hdGNoIHBhdHRlcm4KLQkJdHJ5IHsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUJ1bmRsZSB0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvLyROT04tTkxTLTEkCi0JCQlDb25kaXRpb24gY29uZGl0aW9uID0gQnVuZGxlU2lnbmVyQ29uZGl0aW9uLmdldENvbmRpdGlvbih0ZXN0QnVuZGxlLCBpbmZvMTBUcnVlKTsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb25kaXRpb24gdmFsdWUiLCBDb25kaXRpb24uVFJVRSwgY29uZGl0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkbWluUGVybWlzc2lvbjAxKCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIGV4YWN0IG1hdGNoIHBhdHRlcm4KLQkJdHJ5IHsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUJ1bmRsZSB0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvLyROT04tTkxTLTEkCi0JCQlBZG1pblBlcm1pc3Npb24gZGVjbGFyZWRQZXJtID0gbmV3IEFkbWluUGVybWlzc2lvbigiKHNpZ25lcj0tKSIsIEFkbWluUGVybWlzc2lvbi5DT05URVhUKTsgLy8kTk9OLU5MUy0xJAotCQkJQWRtaW5QZXJtaXNzaW9uIGNoZWNrZWRQZXJtID0gbmV3IEFkbWluUGVybWlzc2lvbih0ZXN0QnVuZGxlLCBBZG1pblBlcm1pc3Npb24uQ09OVEVYVCk7Ci0JCQlhc3NlcnRUcnVlKCJTZWN1cml0eSBjaGVjayBmYWlsZWQiLCBkZWNsYXJlZFBlcm0uaW1wbGllcyhjaGVja2VkUGVybSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRtaW5QZXJtaXNzaW9uMDIoKSB7Ci0JCS8vIHRlc3QgdHJ1c3RlZCBjZXJ0IHdpdGggZXhhY3QgbWF0Y2ggcGF0dGVybgotCQl0cnkgewotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUFkbWluUGVybWlzc2lvbiBkZWNsYXJlZFBlcm0gPSBuZXcgQWRtaW5QZXJtaXNzaW9uKCIoc2lnbmVyPSIgKyBkbkNoYWluMDFUcnVlRXNjYXBlZCArICIpIiwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUFkbWluUGVybWlzc2lvbiBjaGVja2VkUGVybSA9IG5ldyBBZG1pblBlcm1pc3Npb24odGVzdEJ1bmRsZSwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOwotCQkJYXNzZXJ0VHJ1ZSgiU2VjdXJpdHkgY2hlY2sgZmFpbGVkIiwgZGVjbGFyZWRQZXJtLmltcGxpZXMoY2hlY2tlZFBlcm0pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkbWluUGVybWlzc2lvbjAzKCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIGV4YWN0IG1hdGNoIHBhdHRlcm4gKyAhIG9wZXJhdGlvbiAKLQkJdHJ5IHsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUJ1bmRsZSB0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvLyROT04tTkxTLTEkCi0JCQlBZG1pblBlcm1pc3Npb24gZGVjbGFyZWRQZXJtID0gbmV3IEFkbWluUGVybWlzc2lvbigiKCEoc2lnbmVyPS0pKSIsIEFkbWluUGVybWlzc2lvbi5DT05URVhUKTsgLy8kTk9OLU5MUy0xJAotCQkJQWRtaW5QZXJtaXNzaW9uIGNoZWNrZWRQZXJtID0gbmV3IEFkbWluUGVybWlzc2lvbih0ZXN0QnVuZGxlLCBBZG1pblBlcm1pc3Npb24uQ09OVEVYVCk7Ci0JCQlhc3NlcnRGYWxzZSgiU2VjdXJpdHkgY2hlY2sgZmFpbGVkIiwgZGVjbGFyZWRQZXJtLmltcGxpZXMoY2hlY2tlZFBlcm0pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkbWluUGVybWlzc2lvbjA0KCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIGV4YWN0IG1hdGNoIHBhdHRlcm4gKyAhIG9wZXJhdGlvbgotCQl0cnkgewotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUFkbWluUGVybWlzc2lvbiBkZWNsYXJlZFBlcm0gPSBuZXcgQWRtaW5QZXJtaXNzaW9uKCIoIShzaWduZXI9IiArIGRuQ2hhaW4wMVRydWVFc2NhcGVkICsgIikpIiwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUFkbWluUGVybWlzc2lvbiBjaGVja2VkUGVybSA9IG5ldyBBZG1pblBlcm1pc3Npb24odGVzdEJ1bmRsZSwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOwotCQkJYXNzZXJ0RmFsc2UoIlNlY3VyaXR5IGNoZWNrIGZhaWxlZCIsIGRlY2xhcmVkUGVybS5pbXBsaWVzKGNoZWNrZWRQZXJtKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZG1pblBlcm1pc3Npb24wNSgpIHsKLQkJLy8gdGVzdCB0cnVzdGVkIGNlcnQgd2l0aCBwcmVmaXggd2lsZGNhcmQgbWF0Y2ggcGF0dGVybgotCQl0cnkgewotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUFkbWluUGVybWlzc2lvbiBkZWNsYXJlZFBlcm0gPSBuZXcgQWRtaW5QZXJtaXNzaW9uKCIoc2lnbmVyPSIgKyBkbkNoYWluMDJUcnVlRXNjYXBlZCArICIpIiwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUFkbWluUGVybWlzc2lvbiBjaGVja2VkUGVybSA9IG5ldyBBZG1pblBlcm1pc3Npb24odGVzdEJ1bmRsZSwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOwotCQkJYXNzZXJ0VHJ1ZSgiU2VjdXJpdHkgY2hlY2sgZmFpbGVkIiwgZGVjbGFyZWRQZXJtLmltcGxpZXMoY2hlY2tlZFBlcm0pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkbWluUGVybWlzc2lvbjA2KCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIHBvc3RmaXggd2lsZGNhcmQgbWF0Y2ggcGF0dGVybgotCQl0cnkgewotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUFkbWluUGVybWlzc2lvbiBkZWNsYXJlZFBlcm0gPSBuZXcgQWRtaW5QZXJtaXNzaW9uKCIoc2lnbmVyPSIgKyBkbkNoYWluMDNUcnVlRXNjYXBlZCArICIpIiwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUFkbWluUGVybWlzc2lvbiBjaGVja2VkUGVybSA9IG5ldyBBZG1pblBlcm1pc3Npb24odGVzdEJ1bmRsZSwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOwotCQkJYXNzZXJ0VHJ1ZSgiU2VjdXJpdHkgY2hlY2sgZmFpbGVkIiwgZGVjbGFyZWRQZXJtLmltcGxpZXMoY2hlY2tlZFBlcm0pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkbWluUGVybWlzc2lvbjA3KCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIGJhZCBwb3N0Zml4IGRuIG1hdGNoIHBhdHRlcm4KLQkJdHJ5IHsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUJ1bmRsZSB0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvLyROT04tTkxTLTEkCi0JCQlBZG1pblBlcm1pc3Npb24gZGVjbGFyZWRQZXJtID0gbmV3IEFkbWluUGVybWlzc2lvbigiKHNpZ25lcj0iICsgZG5DaGFpbjA0RmFsc2VFc2NhcGVkICsgIikiLCBBZG1pblBlcm1pc3Npb24uQ09OVEVYVCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQWRtaW5QZXJtaXNzaW9uIGNoZWNrZWRQZXJtID0gbmV3IEFkbWluUGVybWlzc2lvbih0ZXN0QnVuZGxlLCBBZG1pblBlcm1pc3Npb24uQ09OVEVYVCk7Ci0JCQlhc3NlcnRGYWxzZSgiU2VjdXJpdHkgY2hlY2sgZmFpbGVkIiwgZGVjbGFyZWRQZXJtLmltcGxpZXMoY2hlY2tlZFBlcm0pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkbWluUGVybWlzc2lvbjA4KCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIGJhZCBwcmVmaXggZG4gbWF0Y2ggcGF0dGVybgotCQl0cnkgewotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUFkbWluUGVybWlzc2lvbiBkZWNsYXJlZFBlcm0gPSBuZXcgQWRtaW5QZXJtaXNzaW9uKCIoc2lnbmVyPSIgKyBkbkNoYWluMDVGYWxzZUVzY2FwZWQgKyAiKSIsIEFkbWluUGVybWlzc2lvbi5DT05URVhUKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlBZG1pblBlcm1pc3Npb24gY2hlY2tlZFBlcm0gPSBuZXcgQWRtaW5QZXJtaXNzaW9uKHRlc3RCdW5kbGUsIEFkbWluUGVybWlzc2lvbi5DT05URVhUKTsKLQkJCWFzc2VydEZhbHNlKCJTZWN1cml0eSBjaGVjayBmYWlsZWQiLCBkZWNsYXJlZFBlcm0uaW1wbGllcyhjaGVja2VkUGVybSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRtaW5QZXJtaXNzaW9uMDkoKSB7Ci0JCS8vIHRlc3QgdHJ1c3RlZCBjZXJ0IHdpdGggUkROIG1hdGNoIHBhdHRlcm4KLQkJdHJ5IHsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUJ1bmRsZSB0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkIikpOyAvLyROT04tTkxTLTEkCi0JCQlBZG1pblBlcm1pc3Npb24gZGVjbGFyZWRQZXJtID0gbmV3IEFkbWluUGVybWlzc2lvbigiKHNpZ25lcj0iICsgZG5DaGFpbjA2VHJ1ZUVzY2FwZWQgKyAiKSIsIEFkbWluUGVybWlzc2lvbi5DT05URVhUKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlBZG1pblBlcm1pc3Npb24gY2hlY2tlZFBlcm0gPSBuZXcgQWRtaW5QZXJtaXNzaW9uKHRlc3RCdW5kbGUsIEFkbWluUGVybWlzc2lvbi5DT05URVhUKTsKLQkJCWFzc2VydFRydWUoIlNlY3VyaXR5IGNoZWNrIGZhaWxlZCIsIGRlY2xhcmVkUGVybS5pbXBsaWVzKGNoZWNrZWRQZXJtKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZG1pblBlcm1pc3Npb24xMCgpIHsKLQkJLy8gdGVzdCB0cnVzdGVkIGNlcnQgd2l0aCBSRE4gbWF0Y2ggcGF0dGVybgotCQl0cnkgewotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUFkbWluUGVybWlzc2lvbiBkZWNsYXJlZFBlcm0gPSBuZXcgQWRtaW5QZXJtaXNzaW9uKCIoc2lnbmVyPSIgKyBkbkNoYWluMDdUcnVlRXNjYXBlZCArICIpIiwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUFkbWluUGVybWlzc2lvbiBjaGVja2VkUGVybSA9IG5ldyBBZG1pblBlcm1pc3Npb24odGVzdEJ1bmRsZSwgQWRtaW5QZXJtaXNzaW9uLkNPTlRFWFQpOwotCQkJYXNzZXJ0VHJ1ZSgiU2VjdXJpdHkgY2hlY2sgZmFpbGVkIiwgZGVjbGFyZWRQZXJtLmltcGxpZXMoY2hlY2tlZFBlcm0pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkbWluUGVybWlzc2lvbjExKCkgewotCQkvLyB0ZXN0IHRydXN0ZWQgY2VydCB3aXRoIFJETiBtYXRjaCBwYXR0ZXJuCi0JCXRyeSB7Ci0JCQlnZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX2xlYWZhIiksICJjYTFfbGVhZmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlCdW5kbGUgdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJQWRtaW5QZXJtaXNzaW9uIGRlY2xhcmVkUGVybSA9IG5ldyBBZG1pblBlcm1pc3Npb24oIihzaWduZXI9IiArIGRuQ2hhaW4wOFRydWVFc2NhcGVkICsgIikiLCBBZG1pblBlcm1pc3Npb24uQ09OVEVYVCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQWRtaW5QZXJtaXNzaW9uIGNoZWNrZWRQZXJtID0gbmV3IEFkbWluUGVybWlzc2lvbih0ZXN0QnVuZGxlLCBBZG1pblBlcm1pc3Npb24uQ09OVEVYVCk7Ci0JCQlhc3NlcnRUcnVlKCJTZWN1cml0eSBjaGVjayBmYWlsZWQiLCBkZWNsYXJlZFBlcm0uaW1wbGllcyhjaGVja2VkUGVybSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eS9TZWN1cml0eVRlc3RTdWl0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L1NlY3VyaXR5VGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzJhY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L1NlY3VyaXR5VGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VjdXJpdHk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIFNlY3VyaXR5VGVzdFN1aXRlIGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVW5pdCB0ZXN0cyBmb3IgRXF1aW5veCBzZWN1cml0eSIpOwotCQkvL3RydXN0IGVuZ2luZSB0ZXN0cwotCQlzdWl0ZS5hZGRUZXN0KEtleVN0b3JlVHJ1c3RFbmdpbmVUZXN0LnN1aXRlKCkpOwotCQkvL3NpZ25lZCBidW5kbGUgdGVzdHMgLSAqdXNlcyogdHJ1c3QgZW5naW5lCi0JCXN1aXRlLmFkZFRlc3QoU2lnbmVkQnVuZGxlVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChTaWduZWRCdW5kbGVUZXN0LmxvY2FsU3VpdGUoKSk7Ci0JCS8vYXV0aG9yaXphdGlvbiB0ZXN0cyAtICp1c2VzKiBzaWduZWQgY29udGVudCB0ZXN0cwotCQlzdWl0ZS5hZGRUZXN0KEF1dGhvcml6ZUFueVRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQXV0aG9yaXplU2lnbmVkVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBdXRob3JpemVUcnVzdGVkVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChPU0dpQVBJQ2VydGlmaWNhdGVUZXN0LnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L1NpZ25lZEJ1bmRsZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eS9TaWduZWRCdW5kbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTYyMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5L1NpZ25lZEJ1bmRsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VjdXJpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLnNlc3Npb24uQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zaWduZWRjb250ZW50Lio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2lnbmVkQnVuZGxlVGVzdCBleHRlbmRzIEJhc2VTZWN1cml0eVRlc3QgewotCi0JLyoKLQlwcml2YXRlIHN0YXRpYyBUZXN0W10gc190ZXN0cyA9IHsKLQkvLyBwb3NpdGl2ZSB0ZXN0cyAKLQluZXcgU2lnbmVkQnVuZGxlVGVzdCgidGVzdFNpZ25lZENvbnRlbnQwMSIsICJ1bnNpZ25lZCIsIG5ldyBTdHJpbmdbXSB7fSkgewotCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJdGVzdFNpZ25lZENvbnRlbnQwMSgpOwotCQl9Ci0JfSwgbmV3IFNpZ25lZEJ1bmRsZVRlc3QoIlNpZ25lZENvbnRlbnQgcG9zaXRpdmUgdGVzdDogc2lnbmVkIGphciwgMSB0cnVzdGVkIHNpZ25lciIsICJzaWduZWQiLCBuZXcgU3RyaW5nW10geyJjYTFfbGVhZmEifSkgewotCQlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJdGVzdFNpZ25lZENvbnRlbnQwMigpOwotCQl9Ci0JfQotCSwgbmV3IFNpZ25lZEJ1bmRsZVRlc3QoIlNpZ25lZENvbnRlbnQgcG9zaXRpdmUgdGVzdDogc2lnbmVkIGphciwgMiB0cnVzdGVkIHNpZ25lcnMiLCAibXVsdGlwbHlfc2lnbmVkIiwgbmV3IFN0cmluZ1tdIHsiY2ExX2xlYWZhIiwgImNhMV9sZWFmYiJ9KSB7KG5vbi1KYXZhZG9jKQotCSAgQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjcnVuVGVzdCgpCi0JIAlwdWJsaWMgdm9pZCBydW5UZXN0KCkgewotCQkJdGVzdFNpZ25lZENvbnRlbnQwMygpOwotCQl9Ci0JfX07Ci0JKi8KLQotCS8qCi0JLy9wb3NpdGl2ZSB0ZXN0cwotCXNpZ25lcjEJc2lnbmVyMgl2YWxpZAotCW4vYQkJbi9hCQluL2EJCT0gcG9zaXRpdmUsIHVuc2lnbmVkCQkJCSgndW5zaWduZWQuamFyJykKLQl5ZXMJCW4vYQkJeWVzCQk9IHBvc2l0aXZlLCAxIHNpZ25lcgkJCQkoJ3NpZ25lZC5qYXInLCdjYTFfbGVhZmEnKQotCXllcwkJeWVzCQl5ZXMJCT0gcG9zaXRpdmUsIDIgc2lnbmVycwkJCQkoJ211bHRpcGx5X3NpZ25lZC5qYXInLCdjYTFfbGVhZmEsJ2NhMV9sZWFmYicpCi0KLQkvL25lZ2F0aXZlID0gdW50cnVzdGVkIHRlc3RzCi0Jbm8JCW4vYQkJeWVzCQk9IG5lZ2F0aXZlLCAxIHNpZ25lciwgMSB1bnRydXN0ZWQJKCdzaWduZWQuamFyJykJCQotCW5vCQlubwkJeWVzCQk9IG5lZ2F0aXZlLCAyIHNpZ25lcnMsIDIgdW50cnVzdGVkICAoJ211bHRpcGx5X3NpZ25lZC5qYXInKQotCXllcwkJbm8JCXllcwkJPSBuZWdhdGl2ZSwgMiBzaWduZXJzLCAxIHVudHJ1c3RlZAkoJ211bHRpcGx5X3NpZ25lZC5qYXInLCAnY2ExX2xlYWZhJykKLQotCS8vbmVnYXRpdmUgPSB2YWxpZGl0eSB0ZXN0cwotCXllcwkJbi9hCQlubwkJPSBuZWdhdGl2ZSwgMSBzaWduZXIsIDEgY29ycnVwdAkJKCdzaWduZWRfd2l0aF9jb3JydXB0LmphcicsJ2NhMV9sZWFmYScpCi0JeWVzCQl5ZXMJCW5vCQk9IG5lZ2F0aXZlLCAyIHNpZ25lcnMsIDIgY29ycnVwdAotCQotCS8vVE9ETzogT1NHaS1zcGVjaWZpYyBwYXJ0aWFsIHNpZ25lciBjYXNlcwotCS8vVE9ETzogVFNBIHRlc3RzICh3L1RTQSBzaWduZXIgdHJ1c3RlZCwgdW50cnVzdGVkLCBldGMpCi0JLy9UT0RPOiBNb3JlPyBORVNURUQgSkFSUz8gCQkKLQkqLwotCi0JLy9wcml2YXRlIFN0cmluZyBqYXJOYW1lOwotCS8vcHJpdmF0ZSBTdHJpbmdbXSBhbGlhc2VzOwotCXB1YmxpYyBTaWduZWRCdW5kbGVUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTaWduZWRCdW5kbGVUZXN0KFN0cmluZyBuYW1lLCBTdHJpbmcgamFybmFtZSwgU3RyaW5nW10gYWxpYXNlcykgewotCQlzdXBlcihuYW1lKTsKLQkJLy90aGlzLmphck5hbWUgPSBqYXJuYW1lOwotCQkvL3RoaXMuYWxpYXNlcyA9IGFsaWFzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZShCVU5ETEVfU0VDVVJJVFlfVEVTVFMsICJVbml0IHNlc3Npb24gdGVzdHMgZm9yIFNpZ25lZENvbnRlbnQiKTsKLQkJYWRkRGVmYXVsdFNlY3VyaXR5QnVuZGxlcyhzdWl0ZSk7Ci0JCXNldEF1dGhvcml6YXRpb25FbmFibGVkKHN1aXRlKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpZ25lZEJ1bmRsZVRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IGxvY2FsU3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNpZ25lZEJ1bmRsZVRlc3QuY2xhc3MsICJVbml0IGxvY2FsIHRlc3RzIGZvciBTaWduZWRDb250ZW50Iik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmVnaXN0ZXJFY2xpcHNlVHJ1c3RFbmdpbmUoKTsKLQkJLyoKLQkJCQlUcnVzdEVuZ2luZSBlbmdpbmUgPSBnZXRUcnVzdEVuZ2luZSgpOwotCi0JCQkJaWYgKHN1cHBvcnRTdG9yZSA9PSBudWxsKSB7Ci0JCQkJCWZhaWwoIkNvdWxkIG5vdCBvcGVuIGtleXN0b3JlIHdpdGggdGVzdCBjZXJ0aWZpY2F0ZXMhIik7Ci0JCQkJfQotCi0JCQkJLy8gZ2V0IHRoZSBjZXJ0cyBmcm9tIHRoZSBzdXBwb3J0IHN0b3JlIGFuZCBhZGQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ2VydGlmaWNhdGUgY2VydCA9IHN1cHBvcnRTdG9yZS5nZXRDZXJ0aWZpY2F0ZShhbGlhc2VzW2ldKTsKLQkJCQkJZW5naW5lLmFkZFRydXN0QW5jaG9yKGNlcnQsIGFsaWFzZXNbaV0pOwotCQkJCX0KLQkJKi8KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCS8vCVNpZ25lZENvbnRlbnQgcG9zaXRpdmUgdGVzdDogdW5zaWduZWQgamFyCi0JcHVibGljIHZvaWQgdGVzdFNpZ25lZENvbnRlbnQwMSgpIHsKLQotCQlCdW5kbGUgdGVzdEJ1bmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgidW5zaWduZWQiKSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJUZXN0IGJ1bmRsZSBub3QgaW5zdGFsbGVkISIsIHRlc3RCdW5kbGUpOwotCQkJLy9nZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGFuY2hvciwgYWxpYXMpOwotCi0JCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCQlTaWduZWRDb250ZW50IHNpZ25lZENvbnRlbnQgPSBnZXRTaWduZWRDb250ZW50RmFjdG9yeSgpLmdldFNpZ25lZENvbnRlbnQodGVzdEJ1bmRsZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCWFzc2VydEZhbHNlKCJDb250ZW50IGlzIHNpZ25lZCEhIiwgc2lnbmVkQ29udGVudC5pc1NpZ25lZCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXRlc3RCdW5kbGUudW5pbnN0YWxsKCk7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIkZhaWxlZCB0byB1bmluc3RhbGwgYnVuZGxlIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvL1NpZ25lZENvbnRlbnQgcG9zaXRpdmUgdGVzdDogc2lnbmVkIGphciwgMSB0cnVzdGVkIHNpZ25lcgotCXB1YmxpYyB2b2lkIHRlc3RTaWduZWRDb250ZW50MDIoKSB7Ci0KLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZCIpKTsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOwotCi0JCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCQlTaWduZWRDb250ZW50IHNpZ25lZENvbnRlbnQgPSBnZXRTaWduZWRDb250ZW50RmFjdG9yeSgpLmdldFNpZ25lZENvbnRlbnQodGVzdEJ1bmRsZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCS8vIGNoZWNrIGlmIGl0IGlzIHNpZ25lZAotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNpZ25lZCIsIHNpZ25lZENvbnRlbnQuaXNTaWduZWQoKSk7Ci0JCQkvLyBnZXQgdGhlIHNpZ25lciBpbmZvcwotCQkJU2lnbmVySW5mb1tdIGluZm9zID0gc2lnbmVkQ29udGVudC5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgaW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2lnbmVycyIsIDEsIGluZm9zLmxlbmd0aCk7Ci0JCQkvLyBjaGVjayB0aGUgc2lnbmVyIHZhbGlkaXR5Ci0JCQlzaWduZWRDb250ZW50LmNoZWNrVmFsaWRpdHkoaW5mb3NbMF0pOwotCQkJLy8gY2hlY2sgdGhlIHNpZ25lciB0cnVzdAotCQkJYXNzZXJ0VHJ1ZSgiU2lnbmVyIGlzIG5vdCB0cnVzdGVkIiwgaW5mb3NbMF0uaXNUcnVzdGVkKCkpOwotCQkJLy8gY2hlY2sgdGhlIHRydXN0IGFuY2hvcgotCQkJYXNzZXJ0Tm90TnVsbCgiVHJ1c3QgYW5jaG9yIGlzIG51bGwiLCBpbmZvc1swXS5nZXRUcnVzdEFuY2hvcigpKTsKLQkJCS8vIHZlcmlmeSBhbmQgdmFsaWRhdGUgdGhlIGVudHJpZXMKLQkJCVNpZ25lZENvbnRlbnRFbnRyeVtdIGVudHJpZXMgPSBzaWduZWRDb250ZW50LmdldFNpZ25lZEVudHJpZXMoKTsKLQkJCWFzc2VydE5vdE51bGwoIkVudHJpZXMgaXMgbnVsbCIsIGVudHJpZXMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZW50cmllc1tpXS52ZXJpZnkoKTsKLQkJCQlTaWduZXJJbmZvW10gZW50cnlJbmZvcyA9IGVudHJpZXNbaV0uZ2V0U2lnbmVySW5mb3MoKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJTaWduZXJJbmZvIGlzIG51bGwiLCBlbnRyeUluZm9zKTsKLQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBlbnRyeSBzaWduZXJzIiwgMSwgZW50cnlJbmZvcy5sZW5ndGgpOwotCQkJCWFzc2VydEVxdWFscygiRW50cnkgc2lnbmVyIGRvZXMgbm90IGVxdWFsIGNvbnRlbnQgc2lnbmVyIiwgaW5mb3NbMF0sIGVudHJ5SW5mb3NbMF0pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQlnZXRUcnVzdEVuZ2luZSgpLnJlbW92ZVRydXN0QW5jaG9yKCJjYTFfbGVhZmEiKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiRmFpbGVkIHRvIHVuaW5zdGFsbCBidW5kbGUiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vU2lnbmVkQ29udGVudCBwb3NpdGl2ZSB0ZXN0OiBzaWduZWQgamFyLCAyIHRydXN0ZWQgc2lnbmVycwotCXB1YmxpYyB2b2lkIHRlc3RTaWduZWRDb250ZW50MDMoKSB7Ci0KLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoIm11bHRpcGx5X3NpZ25lZCIpKTsKLQkJCXRoaXMuZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7Ci0JCQl0aGlzLmdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTJfbGVhZmEiKSwgImNhMl9sZWFmYSIpOwotCi0JCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCQlTaWduZWRDb250ZW50IHNpZ25lZENvbnRlbnQgPSBnZXRTaWduZWRDb250ZW50RmFjdG9yeSgpLmdldFNpZ25lZENvbnRlbnQodGVzdEJ1bmRsZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCS8vIGNoZWNrIGlmIGl0IGlzIHNpZ25lZAotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNpZ25lZCIsIHNpZ25lZENvbnRlbnQuaXNTaWduZWQoKSk7Ci0JCQkvLyBnZXQgdGhlIHNpZ25lciBpbmZvcwotCQkJU2lnbmVySW5mb1tdIGluZm9zID0gc2lnbmVkQ29udGVudC5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgaW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2lnbmVycyIsIDIsIGluZm9zLmxlbmd0aCk7Ci0JCQkvLyBjaGVjayB0aGUgc2lnbmVyIHZhbGlkaXR5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2lnbmVkQ29udGVudC5jaGVja1ZhbGlkaXR5KGluZm9zW2ldKTsKLQkJCQlzaWduZWRDb250ZW50LmNoZWNrVmFsaWRpdHkoaW5mb3NbaV0pOwotCQkJCS8vIGNoZWNrIHRoZSBzaWduZXIgdHJ1c3QKLQkJCQlhc3NlcnRUcnVlKCJTaWduZXIgaXMgbm90IHRydXN0ZWQ6ICIgKyBpbmZvc1tpXS5nZXRDZXJ0aWZpY2F0ZUNoYWluKClbMF0sIGluZm9zW2ldLmlzVHJ1c3RlZCgpKTsKLQkJCQkvLyBjaGVjayB0aGUgdHJ1c3QgYW5jaG9yCi0JCQkJYXNzZXJ0Tm90TnVsbCgiVHJ1c3QgYW5jaG9yIGlzIG51bGwiLCBpbmZvc1tpXS5nZXRUcnVzdEFuY2hvcigpKTsKLQkJCX0KLQkJCS8vIHZlcmlmeSBhbmQgdmFsaWRhdGUgdGhlIGVudHJpZXMKLQkJCVNpZ25lZENvbnRlbnRFbnRyeVtdIGVudHJpZXMgPSBzaWduZWRDb250ZW50LmdldFNpZ25lZEVudHJpZXMoKTsKLQkJCWFzc2VydE5vdE51bGwoIkVudHJpZXMgaXMgbnVsbCIsIGVudHJpZXMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZW50cmllc1tpXS52ZXJpZnkoKTsKLQkJCQlTaWduZXJJbmZvW10gZW50cnlJbmZvcyA9IGVudHJpZXNbaV0uZ2V0U2lnbmVySW5mb3MoKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJTaWduZXJJbmZvIGlzIG51bGwiLCBlbnRyeUluZm9zKTsKLQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBlbnRyeSBzaWduZXJzIiwgMiwgZW50cnlJbmZvcy5sZW5ndGgpOwotCQkJCWFzc2VydEVxdWFscygiRW50cnkgc2lnbmVyIGRvZXMgbm90IGVxdWFsIGNvbnRlbnQgc2lnbmVyIiwgaW5mb3NbMF0sIGVudHJ5SW5mb3NbMF0pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQlnZXRUcnVzdEVuZ2luZSgpLnJlbW92ZVRydXN0QW5jaG9yKCJjYTFfbGVhZmEiKTsKLQkJCQlnZXRUcnVzdEVuZ2luZSgpLnJlbW92ZVRydXN0QW5jaG9yKCJjYTJfbGVhZmEiKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiRmFpbGVkIHRvIHVuaW5zdGFsbCBidW5kbGUiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vU2lnbmVkQ29udGVudCBuZWdhdGl2ZSwgMSBzaWduZXIsIDEgdW50cnVzdGVkCi0JcHVibGljIHZvaWQgdGVzdFNpZ25lZENvbnRlbnQwNCgpIHsKLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZCIpKTsKLQotCQkJLy8gZ2V0IHRoZSBzaWduZWQgY29udGVudCBmb3IgdGhlIGJ1bmRsZQotCQkJU2lnbmVkQ29udGVudCBzaWduZWRDb250ZW50ID0gZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKS5nZXRTaWduZWRDb250ZW50KHRlc3RCdW5kbGUpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVkQ29udGVudCBpcyBudWxsIiwgc2lnbmVkQ29udGVudCk7Ci0JCQkvLyBjaGVjayBpZiBpdCBpcyBzaWduZWQKLQkJCWFzc2VydFRydWUoIlNob3VsZCBiZSBzaWduZWQiLCBzaWduZWRDb250ZW50LmlzU2lnbmVkKCkpOwotCQkJLy8gZ2V0IHRoZSBzaWduZXIgaW5mb3MKLQkJCVNpZ25lckluZm9bXSBpbmZvcyA9IHNpZ25lZENvbnRlbnQuZ2V0U2lnbmVySW5mb3MoKTsKLQkJCWFzc2VydE5vdE51bGwoIlNpZ25lckluZm8gaXMgbnVsbCIsIGluZm9zKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIHNpZ25lcnMiLCAxLCBpbmZvcy5sZW5ndGgpOwotCQkJLy8gY2hlY2sgdGhlIHNpZ25lciB2YWxpZGl0eQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIGNoZWNrIHRoZSBzaWduZXIgdHJ1c3QKLQkJCQlhc3NlcnRUcnVlKCJTaWduZXIgaXMgdHJ1c3RlZDogIiArIGluZm9zW2ldLmdldENlcnRpZmljYXRlQ2hhaW4oKVswXSwgIShpbmZvc1tpXS5pc1RydXN0ZWQoKSkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiRmFpbGVkIHRvIHVuaW5zdGFsbCBidW5kbGUiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vU2lnbmVkQ29udGVudCBuZWdhdGl2ZSwgMiBzaWduZXJzLCAyIHVudHJ1c3RlZAotCXB1YmxpYyB2b2lkIHRlc3RTaWduZWRDb250ZW50MDUoKSB7Ci0JCUJ1bmRsZSB0ZXN0QnVuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRlc3RCdW5kbGUgPSBpbnN0YWxsQnVuZGxlKGdldFRlc3RKYXJQYXRoKCJtdWx0aXBseV9zaWduZWQiKSk7Ci0KLQkJCS8vIGdldCB0aGUgc2lnbmVkIGNvbnRlbnQgZm9yIHRoZSBidW5kbGUKLQkJCVNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudCA9IGdldFNpZ25lZENvbnRlbnRGYWN0b3J5KCkuZ2V0U2lnbmVkQ29udGVudCh0ZXN0QnVuZGxlKTsKLQkJCWFzc2VydE5vdE51bGwoIlNpZ25lZENvbnRlbnQgaXMgbnVsbCIsIHNpZ25lZENvbnRlbnQpOwotCQkJLy8gY2hlY2sgaWYgaXQgaXMgc2lnbmVkCi0JCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgc2lnbmVkIiwgc2lnbmVkQ29udGVudC5pc1NpZ25lZCgpKTsKLQkJCS8vIGdldCB0aGUgc2lnbmVyIGluZm9zCi0JCQlTaWduZXJJbmZvW10gaW5mb3MgPSBzaWduZWRDb250ZW50LmdldFNpZ25lckluZm9zKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZXJJbmZvIGlzIG51bGwiLCBpbmZvcyk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBzaWduZXJzIiwgMiwgaW5mb3MubGVuZ3RoKTsKLQkJCS8vIGNoZWNrIHRoZSBzaWduZXIgdmFsaWRpdHkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBjaGVjayB0aGUgc2lnbmVyIHRydXN0Ci0JCQkJYXNzZXJ0VHJ1ZSgiU2lnbmVyIGlzIHRydXN0ZWQ6ICIgKyBpbmZvc1tpXS5nZXRDZXJ0aWZpY2F0ZUNoYWluKClbMF0sICEoaW5mb3NbaV0uaXNUcnVzdGVkKCkpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXRlc3RCdW5kbGUudW5pbnN0YWxsKCk7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIkZhaWxlZCB0byB1bmluc3RhbGwgYnVuZGxlIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvL1NpZ25lZENvbnRlbnQgbmVnYXRpdmUsIDIgc2lnbmVycywgMSB1bnRydXN0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0U2lnbmVkQ29udGVudDA2KCkgewotCQlCdW5kbGUgdGVzdEJ1bmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgibXVsdGlwbHlfc2lnbmVkIikpOwotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7Ci0KLQkJCS8vIGdldCB0aGUgc2lnbmVkIGNvbnRlbnQgZm9yIHRoZSBidW5kbGUKLQkJCVNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudCA9IGdldFNpZ25lZENvbnRlbnRGYWN0b3J5KCkuZ2V0U2lnbmVkQ29udGVudCh0ZXN0QnVuZGxlKTsKLQkJCWFzc2VydE5vdE51bGwoIlNpZ25lZENvbnRlbnQgaXMgbnVsbCIsIHNpZ25lZENvbnRlbnQpOwotCQkJLy8gY2hlY2sgaWYgaXQgaXMgc2lnbmVkCi0JCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgc2lnbmVkIiwgc2lnbmVkQ29udGVudC5pc1NpZ25lZCgpKTsKLQkJCS8vIGdldCB0aGUgc2lnbmVyIGluZm9zCi0JCQlTaWduZXJJbmZvW10gaW5mb3MgPSBzaWduZWRDb250ZW50LmdldFNpZ25lckluZm9zKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZXJJbmZvIGlzIG51bGwiLCBpbmZvcyk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBzaWduZXJzIiwgMiwgaW5mb3MubGVuZ3RoKTsKLQotCQkJLy8gbWFrZSBzdXJlIGNhMSBzaWduZXIgaXMgdHJ1c3RlZAotCi0JCQkvLyBjaGVjayB0aGUgc2lnbmVyIHZhbGlkaXR5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ2VydGlmaWNhdGUgY2VydHNbXSA9IGluZm9zW2ldLmdldENlcnRpZmljYXRlQ2hhaW4oKTsKLQotCQkJCWlmIChpbmZvc1tpXS5pc1RydXN0ZWQoKSkgewotCQkJCQlYNTA5Q2VydGlmaWNhdGUgeDUwOUNlcnQgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0c1swXTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiQ0ExIExlYWZBIHNpZ25lciBpcyBub3QgdHJ1c3RlZCIsIHg1MDlDZXJ0LmdldFN1YmplY3RETigpLmdldE5hbWUoKS5pbmRleE9mKCJDQTEgTGVhZkEiKSA+PSAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQl0ZXN0QnVuZGxlLnVuaW5zdGFsbCgpOwotCQkJCWdldFRydXN0RW5naW5lKCkucmVtb3ZlVHJ1c3RBbmNob3IoImNhMV9sZWFmYSIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJGYWlsZWQgdG8gdW5pbnN0YWxsIGJ1bmRsZSIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gbmVnYXRpdmUsIDEgc2lnbmVyLCAxIGNvcnJ1cHQgc2lnbmVkX3dpdGhfY29ycnVwdC5qYXIKLQlwdWJsaWMgdm9pZCB0ZXN0U2lnbmVkQ29udGVudDA3KCkgewotCQlCdW5kbGUgdGVzdEJ1bmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0ZXN0QnVuZGxlID0gaW5zdGFsbEJ1bmRsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkX3dpdGhfY29ycnVwdCIpKTsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOwotCi0JCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCQlTaWduZWRDb250ZW50IHNpZ25lZENvbnRlbnQgPSBnZXRTaWduZWRDb250ZW50RmFjdG9yeSgpLmdldFNpZ25lZENvbnRlbnQodGVzdEJ1bmRsZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCS8vIGNoZWNrIGlmIGl0IGlzIHNpZ25lZAotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNpZ25lZCIsIHNpZ25lZENvbnRlbnQuaXNTaWduZWQoKSk7Ci0JCQkvLyBnZXQgdGhlIHNpZ25lciBpbmZvcwotCQkJU2lnbmVySW5mb1tdIGluZm9zID0gc2lnbmVkQ29udGVudC5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgaW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2lnbmVycyIsIDEsIGluZm9zLmxlbmd0aCk7Ci0KLQkJCVNpZ25lZENvbnRlbnRFbnRyeVtdIGVudHJpZXMgPSBzaWduZWRDb250ZW50LmdldFNpZ25lZEVudHJpZXMoKTsKLQkJCWFzc2VydE5vdE51bGwoIkVudHJpZXMgaXMgbnVsbCIsIGVudHJpZXMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZW50cmllc1tpXS52ZXJpZnkoKTsKLQkJCQkJaWYgKCJvcmcvZWNsaXBzZS9lcXVpbm94L3NlY3VyaXR5L2p1bml0L0NvcnJ1cHRDbGFzcy5jbGFzcyIuZXF1YWxzKGVudHJpZXNbaV0uZ2V0TmFtZSgpKSkKLQkJCQkJCWZhaWwoIkV4cGVjdGVkIGEgY29ycnVwdGlvbiBmb3I6ICIgKyBlbnRyaWVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJfSBjYXRjaCAoSW52YWxpZENvbnRlbnRFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoISJvcmcvZWNsaXBzZS9lcXVpbm94L3NlY3VyaXR5L2p1bml0L0NvcnJ1cHRDbGFzcy5jbGFzcyIuZXF1YWxzKGVudHJpZXNbaV0uZ2V0TmFtZSgpKSkKLQkJCQkJCWZhaWwoIlVuZXhwZWN0ZWQgY29ycnVwdGlvbiBpbjogIiArIGVudHJpZXNbaV0uZ2V0TmFtZSgpLCBlKTsKLQkJCQl9Ci0JCQkJU2lnbmVySW5mb1tdIGVudHJ5SW5mb3MgPSBlbnRyaWVzW2ldLmdldFNpZ25lckluZm9zKCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgZW50cnlJbmZvcyk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgZW50cnkgc2lnbmVycyIsIDEsIGVudHJ5SW5mb3MubGVuZ3RoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIkVudHJ5IHNpZ25lciBkb2VzIG5vdCBlcXVhbCBjb250ZW50IHNpZ25lciIsIGluZm9zWzBdLCBlbnRyeUluZm9zWzBdKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJdGVzdEJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQlnZXRUcnVzdEVuZ2luZSgpLnJlbW92ZVRydXN0QW5jaG9yKCJjYTFfbGVhZmEiKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiRmFpbGVkIHRvIHVuaW5zdGFsbCBidW5kbGUiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHBvc2l0dmUgMSBzaWduZXIsIDEgdHNhCi0JcHVibGljIHZvaWQgdGVzdFNpZ25lZENvbnRlbnQwOCgpIHsKLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZF90c2EiKSk7Ci0JCQlnZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2ExX2xlYWZhIiksICJjYTFfbGVhZmEiKTsKLQotCQkJLy8gZ2V0IHRoZSBzaWduZWQgY29udGVudCBmb3IgdGhlIGJ1bmRsZQotCQkJU2lnbmVkQ29udGVudCBzaWduZWRDb250ZW50ID0gZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKS5nZXRTaWduZWRDb250ZW50KHRlc3RCdW5kbGUpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVkQ29udGVudCBpcyBudWxsIiwgc2lnbmVkQ29udGVudCk7Ci0JCQkvLyBjaGVjayBpZiBpdCBpcyBzaWduZWQKLQkJCWFzc2VydFRydWUoIlNob3VsZCBiZSBzaWduZWQiLCBzaWduZWRDb250ZW50LmlzU2lnbmVkKCkpOwotCQkJLy8gZ2V0IHRoZSBzaWduZXIgaW5mb3MKLQkJCVNpZ25lckluZm9bXSBpbmZvcyA9IHNpZ25lZENvbnRlbnQuZ2V0U2lnbmVySW5mb3MoKTsKLQkJCWFzc2VydE5vdE51bGwoIlNpZ25lckluZm8gaXMgbnVsbCIsIGluZm9zKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIHNpZ25lcnMiLCAxLCBpbmZvcy5sZW5ndGgpOwotCi0JCQlhc3NlcnROb3ROdWxsKCJTaWduaW5nIHRpbWUgaXMgbnVsbCEiLCBzaWduZWRDb250ZW50LmdldFNpZ25pbmdUaW1lKGluZm9zWzBdKSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXRlc3RCdW5kbGUudW5pbnN0YWxsKCk7Ci0JCQkJZ2V0VHJ1c3RFbmdpbmUoKS5yZW1vdmVUcnVzdEFuY2hvcigiY2ExX2xlYWZhIik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIkZhaWxlZCB0byB1bmluc3RhbGwgYnVuZGxlIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLwlTaWduZWRDb250ZW50IHBvc2l0aXZlIHRlc3Q6IHVuc2lnbmVkIGphcgotCXB1YmxpYyB2b2lkIHRlc3RTaWduZWRDb250ZW50MDkoKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIHVuc2lnbmVkRmlsZSA9IGdldEVudHJ5RmlsZShnZXRUZXN0SmFyUGF0aCgidW5zaWduZWQiKSk7Ci0KLQkJCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBmaW5kIHVuc2lnbmVkIGZpbGUhIiwgdW5zaWduZWRGaWxlKTsKLQkJCS8vZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihhbmNob3IsIGFsaWFzKTsKLQotCQkJLy8gZ2V0IHRoZSBzaWduZWQgY29udGVudCBmb3IgdGhlIGJ1bmRsZQotCQkJU2lnbmVkQ29udGVudCBzaWduZWRDb250ZW50ID0gZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKS5nZXRTaWduZWRDb250ZW50KHVuc2lnbmVkRmlsZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCWFzc2VydEZhbHNlKCJDb250ZW50IGlzIHNpZ25lZCEhIiwgc2lnbmVkQ29udGVudC5pc1NpZ25lZCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvL1NpZ25lZENvbnRlbnQgcG9zaXRpdmUgdGVzdDogc2lnbmVkIGphciwgMSB0cnVzdGVkIHNpZ25lcgotCXB1YmxpYyB2b2lkIHRlc3RTaWduZWRDb250ZW50MTAoKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIHNpZ25lZEZpbGUgPSBnZXRFbnRyeUZpbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZCIpKTsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOwotCi0JCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCQlTaWduZWRDb250ZW50IHNpZ25lZENvbnRlbnQgPSBnZXRTaWduZWRDb250ZW50RmFjdG9yeSgpLmdldFNpZ25lZENvbnRlbnQoc2lnbmVkRmlsZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCS8vIGNoZWNrIGlmIGl0IGlzIHNpZ25lZAotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNpZ25lZCIsIHNpZ25lZENvbnRlbnQuaXNTaWduZWQoKSk7Ci0JCQkvLyBnZXQgdGhlIHNpZ25lciBpbmZvcwotCQkJU2lnbmVySW5mb1tdIGluZm9zID0gc2lnbmVkQ29udGVudC5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgaW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2lnbmVycyIsIDEsIGluZm9zLmxlbmd0aCk7Ci0JCQkvLyBjaGVjayB0aGUgc2lnbmVyIHZhbGlkaXR5Ci0JCQlzaWduZWRDb250ZW50LmNoZWNrVmFsaWRpdHkoaW5mb3NbMF0pOwotCQkJLy8gY2hlY2sgdGhlIHNpZ25lciB0cnVzdAotCQkJYXNzZXJ0VHJ1ZSgiU2lnbmVyIGlzIG5vdCB0cnVzdGVkIiwgaW5mb3NbMF0uaXNUcnVzdGVkKCkpOwotCQkJLy8gY2hlY2sgdGhlIHRydXN0IGFuY2hvcgotCQkJYXNzZXJ0Tm90TnVsbCgiVHJ1c3QgYW5jaG9yIGlzIG51bGwiLCBpbmZvc1swXS5nZXRUcnVzdEFuY2hvcigpKTsKLQkJCS8vIHZlcmlmeSBhbmQgdmFsaWRhdGUgdGhlIGVudHJpZXMKLQkJCVNpZ25lZENvbnRlbnRFbnRyeVtdIGVudHJpZXMgPSBzaWduZWRDb250ZW50LmdldFNpZ25lZEVudHJpZXMoKTsKLQkJCWFzc2VydE5vdE51bGwoIkVudHJpZXMgaXMgbnVsbCIsIGVudHJpZXMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZW50cmllc1tpXS52ZXJpZnkoKTsKLQkJCQlTaWduZXJJbmZvW10gZW50cnlJbmZvcyA9IGVudHJpZXNbaV0uZ2V0U2lnbmVySW5mb3MoKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJTaWduZXJJbmZvIGlzIG51bGwiLCBlbnRyeUluZm9zKTsKLQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBlbnRyeSBzaWduZXJzIiwgMSwgZW50cnlJbmZvcy5sZW5ndGgpOwotCQkJCWFzc2VydEVxdWFscygiRW50cnkgc2lnbmVyIGRvZXMgbm90IGVxdWFsIGNvbnRlbnQgc2lnbmVyIiwgaW5mb3NbMF0sIGVudHJ5SW5mb3NbMF0pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8vU2lnbmVkQ29udGVudCBwb3NpdGl2ZSB0ZXN0OiBzaWduZWQgamFyLCAyIHRydXN0ZWQgc2lnbmVycwotCXB1YmxpYyB2b2lkIHRlc3RTaWduZWRDb250ZW50MTEoKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIG11bHRpcGxlU2lnbmVkID0gZ2V0RW50cnlGaWxlKGdldFRlc3RKYXJQYXRoKCJtdWx0aXBseV9zaWduZWQiKSk7Ci0JCQl0aGlzLmdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOwotCQkJdGhpcy5nZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGdldFRlc3RDZXJ0aWZpY2F0ZSgiY2EyX2xlYWZhIiksICJjYTJfbGVhZmEiKTsKLQotCQkJLy8gZ2V0IHRoZSBzaWduZWQgY29udGVudCBmb3IgdGhlIGJ1bmRsZQotCQkJU2lnbmVkQ29udGVudCBzaWduZWRDb250ZW50ID0gZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKS5nZXRTaWduZWRDb250ZW50KG11bHRpcGxlU2lnbmVkKTsKLQkJCWFzc2VydE5vdE51bGwoIlNpZ25lZENvbnRlbnQgaXMgbnVsbCIsIHNpZ25lZENvbnRlbnQpOwotCQkJLy8gY2hlY2sgaWYgaXQgaXMgc2lnbmVkCi0JCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgc2lnbmVkIiwgc2lnbmVkQ29udGVudC5pc1NpZ25lZCgpKTsKLQkJCS8vIGdldCB0aGUgc2lnbmVyIGluZm9zCi0JCQlTaWduZXJJbmZvW10gaW5mb3MgPSBzaWduZWRDb250ZW50LmdldFNpZ25lckluZm9zKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZXJJbmZvIGlzIG51bGwiLCBpbmZvcyk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBzaWduZXJzIiwgMiwgaW5mb3MubGVuZ3RoKTsKLQkJCS8vIGNoZWNrIHRoZSBzaWduZXIgdmFsaWRpdHkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCQlzaWduZWRDb250ZW50LmNoZWNrVmFsaWRpdHkoaW5mb3NbaV0pOwotCQkJCXNpZ25lZENvbnRlbnQuY2hlY2tWYWxpZGl0eShpbmZvc1tpXSk7Ci0JCQkJLy8gY2hlY2sgdGhlIHNpZ25lciB0cnVzdAotCQkJCWFzc2VydFRydWUoIlNpZ25lciBpcyBub3QgdHJ1c3RlZDogIiArIGluZm9zW2ldLmdldENlcnRpZmljYXRlQ2hhaW4oKVswXSwgaW5mb3NbaV0uaXNUcnVzdGVkKCkpOwotCQkJCS8vIGNoZWNrIHRoZSB0cnVzdCBhbmNob3IKLQkJCQlhc3NlcnROb3ROdWxsKCJUcnVzdCBhbmNob3IgaXMgbnVsbCIsIGluZm9zW2ldLmdldFRydXN0QW5jaG9yKCkpOwotCQkJfQotCQkJLy8gdmVyaWZ5IGFuZCB2YWxpZGF0ZSB0aGUgZW50cmllcwotCQkJU2lnbmVkQ29udGVudEVudHJ5W10gZW50cmllcyA9IHNpZ25lZENvbnRlbnQuZ2V0U2lnbmVkRW50cmllcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiRW50cmllcyBpcyBudWxsIiwgZW50cmllcyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQllbnRyaWVzW2ldLnZlcmlmeSgpOwotCQkJCVNpZ25lckluZm9bXSBlbnRyeUluZm9zID0gZW50cmllc1tpXS5nZXRTaWduZXJJbmZvcygpOwotCQkJCWFzc2VydE5vdE51bGwoIlNpZ25lckluZm8gaXMgbnVsbCIsIGVudHJ5SW5mb3MpOwotCQkJCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGVudHJ5IHNpZ25lcnMiLCAyLCBlbnRyeUluZm9zLmxlbmd0aCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJFbnRyeSBzaWduZXIgZG9lcyBub3QgZXF1YWwgY29udGVudCBzaWduZXIiLCBpbmZvc1swXSwgZW50cnlJbmZvc1swXSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOwotCQl9Ci0JfQotCi0JLy9TaWduZWRDb250ZW50IG5lZ2F0aXZlLCAxIHNpZ25lciwgMSB1bnRydXN0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0U2lnbmVkQ29udGVudDEyKCkgewotCQl0cnkgewotCQkJRmlsZSBzaWduZWRGaWxlID0gZ2V0RW50cnlGaWxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7Ci0JCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCQlTaWduZWRDb250ZW50IHNpZ25lZENvbnRlbnQgPSBnZXRTaWduZWRDb250ZW50RmFjdG9yeSgpLmdldFNpZ25lZENvbnRlbnQoc2lnbmVkRmlsZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCS8vIGNoZWNrIGlmIGl0IGlzIHNpZ25lZAotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNpZ25lZCIsIHNpZ25lZENvbnRlbnQuaXNTaWduZWQoKSk7Ci0JCQkvLyBnZXQgdGhlIHNpZ25lciBpbmZvcwotCQkJU2lnbmVySW5mb1tdIGluZm9zID0gc2lnbmVkQ29udGVudC5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgaW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2lnbmVycyIsIDEsIGluZm9zLmxlbmd0aCk7Ci0JCQkvLyBjaGVjayB0aGUgc2lnbmVyIHZhbGlkaXR5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gY2hlY2sgdGhlIHNpZ25lciB0cnVzdAotCQkJCWFzc2VydFRydWUoIlNpZ25lciBpcyB0cnVzdGVkOiAiICsgaW5mb3NbaV0uZ2V0Q2VydGlmaWNhdGVDaGFpbigpWzBdLCAhKGluZm9zW2ldLmlzVHJ1c3RlZCgpKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOwotCQl9Ci0JfQotCi0JLy9TaWduZWRDb250ZW50IG5lZ2F0aXZlLCAyIHNpZ25lcnMsIDIgdW50cnVzdGVkCi0JcHVibGljIHZvaWQgdGVzdFNpZ25lZENvbnRlbnQxMygpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgbXVsdGlwbGVTaWduZWQgPSBnZXRFbnRyeUZpbGUoZ2V0VGVzdEphclBhdGgoIm11bHRpcGx5X3NpZ25lZCIpKTsKLQotCQkJLy8gZ2V0IHRoZSBzaWduZWQgY29udGVudCBmb3IgdGhlIGJ1bmRsZQotCQkJU2lnbmVkQ29udGVudCBzaWduZWRDb250ZW50ID0gZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKS5nZXRTaWduZWRDb250ZW50KG11bHRpcGxlU2lnbmVkKTsKLQkJCWFzc2VydE5vdE51bGwoIlNpZ25lZENvbnRlbnQgaXMgbnVsbCIsIHNpZ25lZENvbnRlbnQpOwotCQkJLy8gY2hlY2sgaWYgaXQgaXMgc2lnbmVkCi0JCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgc2lnbmVkIiwgc2lnbmVkQ29udGVudC5pc1NpZ25lZCgpKTsKLQkJCS8vIGdldCB0aGUgc2lnbmVyIGluZm9zCi0JCQlTaWduZXJJbmZvW10gaW5mb3MgPSBzaWduZWRDb250ZW50LmdldFNpZ25lckluZm9zKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZXJJbmZvIGlzIG51bGwiLCBpbmZvcyk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBzaWduZXJzIiwgMiwgaW5mb3MubGVuZ3RoKTsKLQkJCS8vIGNoZWNrIHRoZSBzaWduZXIgdmFsaWRpdHkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBjaGVjayB0aGUgc2lnbmVyIHRydXN0Ci0JCQkJYXNzZXJ0VHJ1ZSgiU2lnbmVyIGlzIHRydXN0ZWQ6ICIgKyBpbmZvc1tpXS5nZXRDZXJ0aWZpY2F0ZUNoYWluKClbMF0sICEoaW5mb3NbaV0uaXNUcnVzdGVkKCkpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvL1NpZ25lZENvbnRlbnQgbmVnYXRpdmUsIDIgc2lnbmVycywgMSB1bnRydXN0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0U2lnbmVkQ29udGVudDE0KCkgewotCQl0cnkgewotCQkJRmlsZSBtdWx0aXBsZVNpZ25lZCA9IGdldEVudHJ5RmlsZShnZXRUZXN0SmFyUGF0aCgibXVsdGlwbHlfc2lnbmVkIikpOwotCQkJZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihnZXRUZXN0Q2VydGlmaWNhdGUoImNhMV9sZWFmYSIpLCAiY2ExX2xlYWZhIik7Ci0KLQkJCS8vIGdldCB0aGUgc2lnbmVkIGNvbnRlbnQgZm9yIHRoZSBidW5kbGUKLQkJCVNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudCA9IGdldFNpZ25lZENvbnRlbnRGYWN0b3J5KCkuZ2V0U2lnbmVkQ29udGVudChtdWx0aXBsZVNpZ25lZCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCS8vIGNoZWNrIGlmIGl0IGlzIHNpZ25lZAotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNpZ25lZCIsIHNpZ25lZENvbnRlbnQuaXNTaWduZWQoKSk7Ci0JCQkvLyBnZXQgdGhlIHNpZ25lciBpbmZvcwotCQkJU2lnbmVySW5mb1tdIGluZm9zID0gc2lnbmVkQ29udGVudC5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgaW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2lnbmVycyIsIDIsIGluZm9zLmxlbmd0aCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBjYTEgc2lnbmVyIGlzIHRydXN0ZWQKLQotCQkJLy8gY2hlY2sgdGhlIHNpZ25lciB2YWxpZGl0eQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJCUNlcnRpZmljYXRlIGNlcnRzW10gPSBpbmZvc1tpXS5nZXRDZXJ0aWZpY2F0ZUNoYWluKCk7Ci0KLQkJCQlpZiAoaW5mb3NbaV0uaXNUcnVzdGVkKCkpIHsKLQkJCQkJWDUwOUNlcnRpZmljYXRlIHg1MDlDZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydHNbMF07Ci0JCQkJCWFzc2VydFRydWUoIkNBMSBMZWFmQSBzaWduZXIgaXMgbm90IHRydXN0ZWQiLCB4NTA5Q2VydC5nZXRTdWJqZWN0RE4oKS5nZXROYW1lKCkuaW5kZXhPZigiQ0ExIExlYWZBIikgPj0gMCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8vIG5lZ2F0aXZlLCAxIHNpZ25lciwgMSBjb3JydXB0IHNpZ25lZF93aXRoX2NvcnJ1cHQuamFyCi0JcHVibGljIHZvaWQgdGVzdFNpZ25lZENvbnRlbnQxNSgpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgY29ycnVwdGVkRmlsZSA9IGdldEVudHJ5RmlsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkX3dpdGhfY29ycnVwdCIpKTsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOwotCi0JCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCQlTaWduZWRDb250ZW50IHNpZ25lZENvbnRlbnQgPSBnZXRTaWduZWRDb250ZW50RmFjdG9yeSgpLmdldFNpZ25lZENvbnRlbnQoY29ycnVwdGVkRmlsZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCS8vIGNoZWNrIGlmIGl0IGlzIHNpZ25lZAotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNpZ25lZCIsIHNpZ25lZENvbnRlbnQuaXNTaWduZWQoKSk7Ci0JCQkvLyBnZXQgdGhlIHNpZ25lciBpbmZvcwotCQkJU2lnbmVySW5mb1tdIGluZm9zID0gc2lnbmVkQ29udGVudC5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgaW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2lnbmVycyIsIDEsIGluZm9zLmxlbmd0aCk7Ci0KLQkJCVNpZ25lZENvbnRlbnRFbnRyeVtdIGVudHJpZXMgPSBzaWduZWRDb250ZW50LmdldFNpZ25lZEVudHJpZXMoKTsKLQkJCWFzc2VydE5vdE51bGwoIkVudHJpZXMgaXMgbnVsbCIsIGVudHJpZXMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZW50cmllc1tpXS52ZXJpZnkoKTsKLQkJCQkJaWYgKCJvcmcvZWNsaXBzZS9lcXVpbm94L3NlY3VyaXR5L2p1bml0L0NvcnJ1cHRDbGFzcy5jbGFzcyIuZXF1YWxzKGVudHJpZXNbaV0uZ2V0TmFtZSgpKSkKLQkJCQkJCWZhaWwoIkV4cGVjdGVkIGEgY29ycnVwdGlvbiBmb3I6ICIgKyBlbnRyaWVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJfSBjYXRjaCAoSW52YWxpZENvbnRlbnRFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoISJvcmcvZWNsaXBzZS9lcXVpbm94L3NlY3VyaXR5L2p1bml0L0NvcnJ1cHRDbGFzcy5jbGFzcyIuZXF1YWxzKGVudHJpZXNbaV0uZ2V0TmFtZSgpKSkKLQkJCQkJCWZhaWwoIlVuZXhwZWN0ZWQgY29ycnVwdGlvbiBpbjogIiArIGVudHJpZXNbaV0uZ2V0TmFtZSgpLCBlKTsKLQkJCQl9Ci0JCQkJU2lnbmVySW5mb1tdIGVudHJ5SW5mb3MgPSBlbnRyaWVzW2ldLmdldFNpZ25lckluZm9zKCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgZW50cnlJbmZvcyk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgZW50cnkgc2lnbmVycyIsIDEsIGVudHJ5SW5mb3MubGVuZ3RoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIkVudHJ5IHNpZ25lciBkb2VzIG5vdCBlcXVhbCBjb250ZW50IHNpZ25lciIsIGluZm9zWzBdLCBlbnRyeUluZm9zWzBdKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8vIHBvc2l0dmUgMSBzaWduZXIsIDEgdHNhCi0JcHVibGljIHZvaWQgdGVzdFNpZ25lZENvbnRlbnQxNigpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgc2lnbmVkVHNhRmlsZSA9IGdldEVudHJ5RmlsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkX3RzYSIpKTsKLQkJCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOwotCi0JCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCQlTaWduZWRDb250ZW50IHNpZ25lZENvbnRlbnQgPSBnZXRTaWduZWRDb250ZW50RmFjdG9yeSgpLmdldFNpZ25lZENvbnRlbnQoc2lnbmVkVHNhRmlsZSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJCS8vIGNoZWNrIGlmIGl0IGlzIHNpZ25lZAotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNpZ25lZCIsIHNpZ25lZENvbnRlbnQuaXNTaWduZWQoKSk7Ci0JCQkvLyBnZXQgdGhlIHNpZ25lciBpbmZvcwotCQkJU2lnbmVySW5mb1tdIGluZm9zID0gc2lnbmVkQ29udGVudC5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgaW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2lnbmVycyIsIDEsIGluZm9zLmxlbmd0aCk7Ci0KLQkJCWFzc2VydE5vdE51bGwoIlNpZ25pbmcgdGltZSBpcyBudWxsISIsIHNpZ25lZENvbnRlbnQuZ2V0U2lnbmluZ1RpbWUoaW5mb3NbMF0pKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8vU2lnbmVkQ29udGVudCBwb3NpdGl2ZSB0ZXN0OiBzaWduZWQgamFyLCAxIHRydXN0ZWQgc2lnbmVyCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzIyNTA5MF8wMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIHNpZ25lZEZpbGUgPSBjb3B5RW50cnlGaWxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWQiKSk7Ci0JCWdldFRydXN0RW5naW5lKCkuYWRkVHJ1c3RBbmNob3IoZ2V0VGVzdENlcnRpZmljYXRlKCJjYTFfbGVhZmEiKSwgImNhMV9sZWFmYSIpOwotCi0JCS8vIGdldCB0aGUgc2lnbmVkIGNvbnRlbnQgZm9yIHRoZSBidW5kbGUKLQkJU2lnbmVkQ29udGVudCBzaWduZWRDb250ZW50ID0gZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKS5nZXRTaWduZWRDb250ZW50KHNpZ25lZEZpbGUpOwotCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJLy8gY2hlY2sgaWYgaXQgaXMgc2lnbmVkCi0JCWFzc2VydFRydWUoIlNob3VsZCBiZSBzaWduZWQiLCBzaWduZWRDb250ZW50LmlzU2lnbmVkKCkpOwotCQkvLyBnZXQgdGhlIHNpZ25lciBpbmZvcwotCQlTaWduZXJJbmZvW10gaW5mb3MgPSBzaWduZWRDb250ZW50LmdldFNpZ25lckluZm9zKCk7Ci0JCWFzc2VydE5vdE51bGwoIlNpZ25lckluZm8gaXMgbnVsbCIsIGluZm9zKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2lnbmVycyIsIDEsIGluZm9zLmxlbmd0aCk7Ci0JCS8vIGNoZWNrIHRoZSBzaWduZXIgdmFsaWRpdHkKLQkJc2lnbmVkQ29udGVudC5jaGVja1ZhbGlkaXR5KGluZm9zWzBdKTsKLQkJLy8gY2hlY2sgdGhlIHNpZ25lciB0cnVzdAotCQlhc3NlcnRUcnVlKCJTaWduZXIgaXMgbm90IHRydXN0ZWQiLCBpbmZvc1swXS5pc1RydXN0ZWQoKSk7Ci0JCS8vIGNoZWNrIHRoZSB0cnVzdCBhbmNob3IKLQkJYXNzZXJ0Tm90TnVsbCgiVHJ1c3QgYW5jaG9yIGlzIG51bGwiLCBpbmZvc1swXS5nZXRUcnVzdEFuY2hvcigpKTsKLQkJLy8gdmVyaWZ5IGFuZCB2YWxpZGF0ZSB0aGUgZW50cmllcwotCQlTaWduZWRDb250ZW50RW50cnlbXSBlbnRyaWVzID0gc2lnbmVkQ29udGVudC5nZXRTaWduZWRFbnRyaWVzKCk7Ci0JCWFzc2VydE5vdE51bGwoIkVudHJpZXMgaXMgbnVsbCIsIGVudHJpZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWVudHJpZXNbaV0udmVyaWZ5KCk7Ci0JCQlTaWduZXJJbmZvW10gZW50cnlJbmZvcyA9IGVudHJpZXNbaV0uZ2V0U2lnbmVySW5mb3MoKTsKLQkJCWFzc2VydE5vdE51bGwoIlNpZ25lckluZm8gaXMgbnVsbCIsIGVudHJ5SW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgZW50cnkgc2lnbmVycyIsIDEsIGVudHJ5SW5mb3MubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygiRW50cnkgc2lnbmVyIGRvZXMgbm90IGVxdWFsIGNvbnRlbnQgc2lnbmVyIiwgaW5mb3NbMF0sIGVudHJ5SW5mb3NbMF0pOwotCQl9Ci0JCXNpZ25lZEZpbGUuZGVsZXRlKCk7Ci0JCWFzc2VydEZhbHNlKCJGaWxlIHNob3VsZCBub3QgZXhpc3QiLCBzaWduZWRGaWxlLmV4aXN0cygpKTsKLQl9Ci0KLQkvLwlTaWduZWRDb250ZW50IHBvc2l0aXZlIHRlc3Q6IHVuc2lnbmVkIGphcgotCXB1YmxpYyB2b2lkIHRlc3RCdWcyMjUwOTBfMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSB1bnNpZ25lZEZpbGUgPSBjb3B5RW50cnlGaWxlKGdldFRlc3RKYXJQYXRoKCJ1bnNpZ25lZCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgZmluZCB1bnNpZ25lZCBmaWxlISIsIHVuc2lnbmVkRmlsZSk7Ci0JCS8vZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihhbmNob3IsIGFsaWFzKTsKLQotCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCVNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudCA9IGdldFNpZ25lZENvbnRlbnRGYWN0b3J5KCkuZ2V0U2lnbmVkQ29udGVudCh1bnNpZ25lZEZpbGUpOwotCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJYXNzZXJ0RmFsc2UoIkNvbnRlbnQgaXMgc2lnbmVkISEiLCBzaWduZWRDb250ZW50LmlzU2lnbmVkKCkpOwotCQlTaWduZWRDb250ZW50RW50cnlbXSBlbnRyaWVzID0gc2lnbmVkQ29udGVudC5nZXRTaWduZWRFbnRyaWVzKCk7Ci0JCWFzc2VydE5vdE51bGwoIkVudHJpZXMgaXMgbnVsbCIsIGVudHJpZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWVudHJpZXNbaV0udmVyaWZ5KCk7Ci0JCQlTaWduZXJJbmZvW10gZW50cnlJbmZvcyA9IGVudHJpZXNbaV0uZ2V0U2lnbmVySW5mb3MoKTsKLQkJCWFzc2VydE5vdE51bGwoIlNpZ25lckluZm8gaXMgbnVsbCIsIGVudHJ5SW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgZW50cnkgc2lnbmVycyIsIDAsIGVudHJ5SW5mb3MubGVuZ3RoKTsKLQkJfQotCQl1bnNpZ25lZEZpbGUuZGVsZXRlKCk7Ci0JCWFzc2VydEZhbHNlKCJGaWxlIHNob3VsZCBub3QgZXhpc3QiLCB1bnNpZ25lZEZpbGUuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyMjg0MjdfMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBzaWduZWRGaWxlID0gY29weUVudHJ5RmlsZShnZXRUZXN0SmFyUGF0aCgic2lnbmVkX3dpdGhfbWV0YWRhdGEiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGZpbmQgc2lnbmVkIGZpbGUhIiwgc2lnbmVkRmlsZSk7Ci0JCS8vZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihhbmNob3IsIGFsaWFzKTsKLQotCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCVNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudCA9IGdldFNpZ25lZENvbnRlbnRGYWN0b3J5KCkuZ2V0U2lnbmVkQ29udGVudChzaWduZWRGaWxlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVkQ29udGVudCBpcyBudWxsIiwgc2lnbmVkQ29udGVudCk7Ci0JCWFzc2VydFRydWUoIkNvbnRlbnQgaXMgbm90IHNpZ25lZCEhIiwgc2lnbmVkQ29udGVudC5pc1NpZ25lZCgpKTsKLQkJU2lnbmVkQ29udGVudEVudHJ5W10gZW50cmllcyA9IHNpZ25lZENvbnRlbnQuZ2V0U2lnbmVkRW50cmllcygpOwotCQlhc3NlcnROb3ROdWxsKCJFbnRyaWVzIGlzIG51bGwiLCBlbnRyaWVzKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHNpZ25lZCBlbnRyaWVzIiwgNCwgZW50cmllcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWVudHJpZXNbaV0udmVyaWZ5KCk7Ci0JCQlTaWduZXJJbmZvW10gZW50cnlJbmZvcyA9IGVudHJpZXNbaV0uZ2V0U2lnbmVySW5mb3MoKTsKLQkJCWFzc2VydE5vdE51bGwoIlNpZ25lckluZm8gaXMgbnVsbCIsIGVudHJ5SW5mb3MpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgZW50cnkgc2lnbmVycyIsIDEsIGVudHJ5SW5mb3MubGVuZ3RoKTsKLQkJfQotCQlzaWduZWRGaWxlLmRlbGV0ZSgpOwotCQlhc3NlcnRGYWxzZSgiRmlsZSBzaG91bGQgbm90IGV4aXN0Iiwgc2lnbmVkRmlsZS5leGlzdHMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzIyODQyN18wMigpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIHNpZ25lZEZpbGUgPSBjb3B5RW50cnlGaWxlKGdldFRlc3RKYXJQYXRoKCJzaWduZWRfd2l0aF9tZXRhZGF0YV9hZGRlZCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgZmluZCBzaWduZWQgZmlsZSEiLCBzaWduZWRGaWxlKTsKLQkJLy9nZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGFuY2hvciwgYWxpYXMpOwotCi0JCS8vIGdldCB0aGUgc2lnbmVkIGNvbnRlbnQgZm9yIHRoZSBidW5kbGUKLQkJU2lnbmVkQ29udGVudCBzaWduZWRDb250ZW50ID0gZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKS5nZXRTaWduZWRDb250ZW50KHNpZ25lZEZpbGUpOwotCQlhc3NlcnROb3ROdWxsKCJTaWduZWRDb250ZW50IGlzIG51bGwiLCBzaWduZWRDb250ZW50KTsKLQkJYXNzZXJ0VHJ1ZSgiQ29udGVudCBpcyBub3Qgc2lnbmVkISEiLCBzaWduZWRDb250ZW50LmlzU2lnbmVkKCkpOwotCQlTaWduZWRDb250ZW50RW50cnlbXSBlbnRyaWVzID0gc2lnbmVkQ29udGVudC5nZXRTaWduZWRFbnRyaWVzKCk7Ci0JCWFzc2VydE5vdE51bGwoIkVudHJpZXMgaXMgbnVsbCIsIGVudHJpZXMpOwotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2Ygc2lnbmVkIGVudHJpZXMiLCA0LCBlbnRyaWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJZW50cmllc1tpXS52ZXJpZnkoKTsKLQkJCVNpZ25lckluZm9bXSBlbnRyeUluZm9zID0gZW50cmllc1tpXS5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgZW50cnlJbmZvcyk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBlbnRyeSBzaWduZXJzIiwgMSwgZW50cnlJbmZvcy5sZW5ndGgpOwotCQl9Ci0JCXNpZ25lZEZpbGUuZGVsZXRlKCk7Ci0JCWFzc2VydEZhbHNlKCJGaWxlIHNob3VsZCBub3QgZXhpc3QiLCBzaWduZWRGaWxlLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjI4NDI3XzAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgc2lnbmVkRmlsZSA9IGNvcHlFbnRyeUZpbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZF93aXRoX21ldGFkYXRhX2NvcnJ1cHQiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGZpbmQgc2lnbmVkIGZpbGUhIiwgc2lnbmVkRmlsZSk7Ci0JCS8vZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihhbmNob3IsIGFsaWFzKTsKLQotCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCVNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudCA9IGdldFNpZ25lZENvbnRlbnRGYWN0b3J5KCkuZ2V0U2lnbmVkQ29udGVudChzaWduZWRGaWxlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVkQ29udGVudCBpcyBudWxsIiwgc2lnbmVkQ29udGVudCk7Ci0JCWFzc2VydFRydWUoIkNvbnRlbnQgaXMgbm90IHNpZ25lZCEhIiwgc2lnbmVkQ29udGVudC5pc1NpZ25lZCgpKTsKLQkJU2lnbmVkQ29udGVudEVudHJ5W10gZW50cmllcyA9IHNpZ25lZENvbnRlbnQuZ2V0U2lnbmVkRW50cmllcygpOwotCQlhc3NlcnROb3ROdWxsKCJFbnRyaWVzIGlzIG51bGwiLCBlbnRyaWVzKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHNpZ25lZCBlbnRyaWVzIiwgNCwgZW50cmllcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJZW50cmllc1tpXS52ZXJpZnkoKTsKLQkJCQlhc3NlcnRGYWxzZSgiV3JvbmcgZW50cnkgaXMgdmFsaWRhdGVkOiAiICsgZW50cmllc1tpXS5nZXROYW1lKCksICJNRVRBLUlORi90ZXN0L3Rlc3QxLmZpbGUiLmVxdWFscyhlbnRyaWVzW2ldLmdldE5hbWUoKSkpOwotCQkJfSBjYXRjaCAoSW52YWxpZENvbnRlbnRFeGNlcHRpb24gZSkgewotCQkJCWFzc2VydEVxdWFscygiV3JvbmcgZW50cnkgaXMgY29ycnVwdGVkIiwgIk1FVEEtSU5GL3Rlc3QvdGVzdDEuZmlsZSIsIGVudHJpZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCVNpZ25lckluZm9bXSBlbnRyeUluZm9zID0gZW50cmllc1tpXS5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgZW50cnlJbmZvcyk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBlbnRyeSBzaWduZXJzIiwgMSwgZW50cnlJbmZvcy5sZW5ndGgpOwotCQl9Ci0JCXNpZ25lZEZpbGUuZGVsZXRlKCk7Ci0JCWFzc2VydEZhbHNlKCJGaWxlIHNob3VsZCBub3QgZXhpc3QiLCBzaWduZWRGaWxlLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjI4NDI3XzA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgc2lnbmVkRmlsZSA9IGNvcHlFbnRyeUZpbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZF93aXRoX21ldGFkYXRhX3JlbW92ZWQiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGZpbmQgc2lnbmVkIGZpbGUhIiwgc2lnbmVkRmlsZSk7Ci0JCS8vZ2V0VHJ1c3RFbmdpbmUoKS5hZGRUcnVzdEFuY2hvcihhbmNob3IsIGFsaWFzKTsKLQotCQkvLyBnZXQgdGhlIHNpZ25lZCBjb250ZW50IGZvciB0aGUgYnVuZGxlCi0JCVNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudCA9IGdldFNpZ25lZENvbnRlbnRGYWN0b3J5KCkuZ2V0U2lnbmVkQ29udGVudChzaWduZWRGaWxlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVkQ29udGVudCBpcyBudWxsIiwgc2lnbmVkQ29udGVudCk7Ci0JCWFzc2VydFRydWUoIkNvbnRlbnQgaXMgbm90IHNpZ25lZCEhIiwgc2lnbmVkQ29udGVudC5pc1NpZ25lZCgpKTsKLQkJU2lnbmVkQ29udGVudEVudHJ5W10gZW50cmllcyA9IHNpZ25lZENvbnRlbnQuZ2V0U2lnbmVkRW50cmllcygpOwotCQlhc3NlcnROb3ROdWxsKCJFbnRyaWVzIGlzIG51bGwiLCBlbnRyaWVzKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHNpZ25lZCBlbnRyaWVzIiwgNCwgZW50cmllcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJZW50cmllc1tpXS52ZXJpZnkoKTsKLQkJCQlhc3NlcnRGYWxzZSgiV3JvbmcgZW50cnkgaXMgdmFsaWRhdGVkOiAiICsgZW50cmllc1tpXS5nZXROYW1lKCksICJNRVRBLUlORi90ZXN0LmZpbGUiLmVxdWFscyhlbnRyaWVzW2ldLmdldE5hbWUoKSkpOwotCQkJfSBjYXRjaCAoSW52YWxpZENvbnRlbnRFeGNlcHRpb24gZSkgewotCQkJCWFzc2VydEVxdWFscygiV3JvbmcgZW50cnkgaXMgY29ycnVwdGVkIiwgIk1FVEEtSU5GL3Rlc3QuZmlsZSIsIGVudHJpZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCVNpZ25lckluZm9bXSBlbnRyeUluZm9zID0gZW50cmllc1tpXS5nZXRTaWduZXJJbmZvcygpOwotCQkJYXNzZXJ0Tm90TnVsbCgiU2lnbmVySW5mbyBpcyBudWxsIiwgZW50cnlJbmZvcyk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBlbnRyeSBzaWduZXJzIiwgMSwgZW50cnlJbmZvcy5sZW5ndGgpOwotCQl9Ci0JCXNpZ25lZEZpbGUuZGVsZXRlKCk7Ci0JCWFzc2VydEZhbHNlKCJGaWxlIHNob3VsZCBub3QgZXhpc3QiLCBzaWduZWRGaWxlLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjM2MzI5XzAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgc2lnbmVkRmlsZSA9IGNvcHlFbnRyeUZpbGUoZ2V0VGVzdEphclBhdGgoInNpZ25lZF93aXRoX3NmX2NvcnJ1cHRlZCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgZmluZCBzaWduZWQgZmlsZSEiLCBzaWduZWRGaWxlKTsKLQkJLy9nZXRUcnVzdEVuZ2luZSgpLmFkZFRydXN0QW5jaG9yKGFuY2hvciwgYWxpYXMpOwotCi0JCS8vIGdldCB0aGUgc2lnbmVkIGNvbnRlbnQgZm9yIHRoZSBidW5kbGUKLQkJdHJ5IHsKLQkJCWdldFNpZ25lZENvbnRlbnRGYWN0b3J5KCkuZ2V0U2lnbmVkQ29udGVudChzaWduZWRGaWxlKTsKLQkJCWZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhIFNpZ25hdHVyZUV4Y2VwdGlvbiBmb3IgZmlsZTogIiArIHNpZ25lZEZpbGUpOwotCQl9IGNhdGNoIChTaWduYXR1cmVFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyNTIwOTgoKSB7Ci0KLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJdGVzdEJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoZ2V0VGVzdEphclBhdGgoInRlc3QuYnVnMjUyMDk4IikpOwotCQkJYXNzZXJ0Tm90TnVsbCgiVGVzdCBidW5kbGUgbm90IGluc3RhbGxlZCEiLCB0ZXN0QnVuZGxlKTsKLQkJCXRlc3RCdW5kbGUuc3RhcnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh0ZXN0QnVuZGxlICE9IG51bGwpCi0JCQkJCXRlc3RCdW5kbGUudW5pbnN0YWxsKCk7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIkZhaWxlZCB0byB1bmluc3RhbGwgYnVuZGxlIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHlhZG1pbi9BbGxTZWN1cml0eUFkbWluVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eWFkbWluL0FsbFNlY3VyaXR5QWRtaW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmY1NmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eWFkbWluL0FsbFNlY3VyaXR5QWRtaW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VjdXJpdHlhZG1pbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxTZWN1cml0eUFkbWluVGVzdHMgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxTZWN1cml0eUFkbWluVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChTZWN1cml0eUFkbWluVW5pdFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFNlY3VyaXR5TWFuYWdlclRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5YWRtaW4vU2VjdXJpdHlBZG1pblVuaXRUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5YWRtaW4vU2VjdXJpdHlBZG1pblVuaXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2QxYzhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eWFkbWluL1NlY3VyaXR5QWRtaW5Vbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlY3VyaXR5YWRtaW47Ci0KLWltcG9ydCBleHQuZnJhbWV3b3JrLmIuVGVzdENvbmRpdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnBlcm1hZG1pbi5FcXVpbm94U2VjdXJpdHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwucGVybWFkbWluLlNlY3VyaXR5QWRtaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5idW5kbGVzLkFic3RyYWN0QnVuZGxlVGVzdHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGVybWlzc2lvbmFkbWluLlBlcm1pc3Npb25JbmZvOwotCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlBZG1pblVuaXRUZXN0cyBleHRlbmRzIEFic3RyYWN0QnVuZGxlVGVzdHMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVybWlzc2lvbkluZm9bXSBTT0NLRVRfSU5GT1MgPSBuZXcgUGVybWlzc2lvbkluZm9bXSB7bmV3IFBlcm1pc3Npb25JbmZvKCJqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uIiwgImxvY2FsaG9zdCIsICJhY2NlcHQiKX07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVybWlzc2lvbkluZm9bXSBSRUFET05MWV9JTkZPUyA9IG5ldyBQZXJtaXNzaW9uSW5mb1tdIHtuZXcgUGVybWlzc2lvbkluZm8oImphdmEuaW8uRmlsZVBlcm1pc3Npb24iLCAiPDxBTEwgRklMRVM+PiIsICJyZWFkIil9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcm1pc3Npb25JbmZvW10gUkVBRFdSSVRFX0lORk9TID0gbmV3IFBlcm1pc3Npb25JbmZvW10gewotCS8vIG11bHRpcGxlIHBlcm1pc3Npb24gaW5mb3MKLQkJCW5ldyBQZXJtaXNzaW9uSW5mbygiamF2YS5pby5GaWxlUGVybWlzc2lvbiIsICI8PEFMTCBGSUxFUz4+IiwgInJlYWQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCW5ldyBQZXJtaXNzaW9uSW5mbygiamF2YS5pby5GaWxlUGVybWlzc2lvbiIsICI8PEFMTCBGSUxFUz4+IiwgIndyaXRlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVybWlzc2lvbkluZm9bXSBSVU5USU1FX0lORk9TID0gbmV3IFBlcm1pc3Npb25JbmZvW10ge25ldyBQZXJtaXNzaW9uSW5mbygiamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uIiwgImV4aXRWTSIsIG51bGwpfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25kaXRpb25JbmZvW10gQUxMTE9DQVRJT05fQ09ORFMgPSBuZXcgQ29uZGl0aW9uSW5mb1tdIHtuZXcgQ29uZGl0aW9uSW5mbygib3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uIiwgbmV3IFN0cmluZ1tdIHsiKiJ9KX07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbmRpdGlvbkluZm8gUE9TVF9NVVRfU0FUID0gbmV3IENvbmRpdGlvbkluZm8oImV4dC5mcmFtZXdvcmsuYi5UZXN0Q29uZGl0aW9uIiwgbmV3IFN0cmluZ1tdIHsiUE9TVF9NVVRfU0FUIiwgInRydWUiLCAidHJ1ZSIsICJ0cnVlIn0pOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbmRpdGlvbkluZm8gUE9TVF9NVVRfVU5TQVQgPSBuZXcgQ29uZGl0aW9uSW5mbygiZXh0LmZyYW1ld29yay5iLlRlc3RDb25kaXRpb24iLCBuZXcgU3RyaW5nW10geyJQT1NUX01VVF9VTlNBVCIsICJ0cnVlIiwgInRydWUiLCAiZmFsc2UifSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25kaXRpb25JbmZvIFNJR05FUl9DT05ESVRJT04xID0gbmV3IENvbmRpdGlvbkluZm8oIm9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVTaWduZXJDb25kaXRpb24iLCBuZXcgU3RyaW5nW10geyIqO2NuPXRlc3QxLGM9VVMifSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uZGl0aW9uSW5mbyBTSUdORVJfQ09ORElUSU9OMiA9IG5ldyBDb25kaXRpb25JbmZvKCJvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlU2lnbmVyQ29uZGl0aW9uIiwgbmV3IFN0cmluZ1tdIHsiKjtjbj10ZXN0MixjPVVTIn0pOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbmRpdGlvbkluZm8gTk9UX1NJR05FUl9DT05ESVRJT04xID0gbmV3IENvbmRpdGlvbkluZm8oIm9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVTaWduZXJDb25kaXRpb24iLCBuZXcgU3RyaW5nW10geyIqO2NuPXRlc3QxLGM9VVMiLCAiISJ9KTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JVTkRMRSA9ICJ0ZXN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUMl9CVU5ETEUgPSAidGVzdDIiOyAvLyROT04tTkxTLTEkCi0KLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIENvbmRpdGlvbkluZm8gUE9TVF9NVVRfTk9UU0FUID0gbmV3IENvbmRpdGlvbkluZm8oImV4dC5mcmFtZXdvcmsuYi5UZXN0Q29uZGl0aW9uIiwgbmV3IFN0cmluZ1tdIHsiUE9TVF9NVVRfTk9UU0FUIiwgInRydWUiLCAidHJ1ZSIsICJmYWxzZSJ9KTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIENvbmRpdGlvbkluZm8gUE9TVF9OT1RNVVRfU0FUID0gbmV3IENvbmRpdGlvbkluZm8oImV4dC5mcmFtZXdvcmsuYi5UZXN0Q29uZGl0aW9uIiwgbmV3IFN0cmluZ1tdIHsiUE9TVF9OT1RNVVRfU0FUIiwgInRydWUiLCAiZmFsc2UiLCAidHJ1ZSJ9KTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIENvbmRpdGlvbkluZm8gUE9TVF9OT1RNVVRfTk9UU0FUID0gbmV3IENvbmRpdGlvbkluZm8oImV4dC5mcmFtZXdvcmsuYi5UZXN0Q29uZGl0aW9uIiwgbmV3IFN0cmluZ1tdIHsiUE9TVF9OT1RNVVRfTk9UU0FUIiwgInRydWUiLCAiZmFsc2UiLCAiZmFsc2UifSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlY3VyaXR5QWRtaW5Vbml0VGVzdHMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgU2VjdXJpdHlBZG1pbiBjcmVhdGVTZWN1cml0eUFkbWluKEVxdWlub3hTZWN1cml0eU1hbmFnZXIgc20pIHsKLQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5QWRtaW4oc20sIG51bGwpOwotCX0KLQotCXByaXZhdGUgU2VjdXJpdHlBZG1pbiBjcmVhdGVTZWN1cml0eUFkbWluKEVxdWlub3hTZWN1cml0eU1hbmFnZXIgc20sIFN0cmluZ1tdIGNvbmRQZXJtSW5mb3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgU2VjdXJpdHlBZG1pbihzbSwgbnVsbCwgbmV3IFRlc3RQZXJtaXNzaW9uU3RvcmFnZShjb25kUGVybUluZm9zKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNyZWF0aW5nIFNlY3VpcnR5QWRtaW4iLCBlKTsgLy8kTk9OLU5MUy0xJDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU2VjdXJpdHlBZG1pbigpIHsKLQkJY3JlYXRlU2VjdXJpdHlBZG1pbihudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9tYWluKCkgewotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1RfQlVORExFKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZCA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0KTsKLQkJaWYgKCFwZC5pbXBsaWVzKG5ldyBBbGxQZXJtaXNzaW9uKCkpKQotCQkJZmFpbCgidGVzdCBidW5kbGUgc2hvdWxkIGhhdmUgQWxsUGVybWlzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2F0aW9uUGVybWlzc2lvbjAxKCkgewotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1RfQlVORExFKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZCA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0KTsKLQkJc2VjdXJpdHlBZG1pbi5zZXRQZXJtaXNzaW9ucyh0ZXN0LmdldExvY2F0aW9uKCksIFJFQURPTkxZX0lORk9TKTsKLQotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCBmYWxzZSk7Ci0KLQkJc2VjdXJpdHlBZG1pbi5zZXRQZXJtaXNzaW9ucyh0ZXN0LmdldExvY2F0aW9uKCksIG51bGwpOwotCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEFsbFBlcm1pc3Npb24oKSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2F0aW9uUGVybWlzc2lvbjAyKCkgewotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1RfQlVORExFKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZCA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0KTsKLQkJc2VjdXJpdHlBZG1pbi5zZXRQZXJtaXNzaW9ucyh0ZXN0LmdldExvY2F0aW9uKCksIFJFQURXUklURV9JTkZPUyk7Ci0KLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJ3cml0ZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCBmYWxzZSk7Ci0KLQkJc2VjdXJpdHlBZG1pbi5zZXRQZXJtaXNzaW9ucyh0ZXN0LmdldExvY2F0aW9uKCksIG51bGwpOwotCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEFsbFBlcm1pc3Npb24oKSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2F0aW9uUGVybWlzc2lvbjAzKCkgewotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1RfQlVORExFKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZCA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0KTsKLQotCQlzZWN1cml0eUFkbWluLnNldERlZmF1bHRQZXJtaXNzaW9ucyhSRUFET05MWV9JTkZPUyk7Ci0JCXNlY3VyaXR5QWRtaW4uc2V0UGVybWlzc2lvbnModGVzdC5nZXRMb2NhdGlvbigpLCBSRUFEV1JJVEVfSU5GT1MpOwotCQlDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvIGNvbmRQZXJtSW5mbyA9IHNlY3VyaXR5QWRtaW4uYWRkQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhBTExMT0NBVElPTl9DT05EUywgU09DS0VUX0lORk9TKTsKLQotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBBbGxQZXJtaXNzaW9uKCksIGZhbHNlKTsKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJsb2NhbGhvc3QiLCAiYWNjZXB0IiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJc2VjdXJpdHlBZG1pbi5zZXRQZXJtaXNzaW9ucyh0ZXN0LmdldExvY2F0aW9uKCksIG51bGwpOwotCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCBmYWxzZSk7Ci0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgU29ja2V0UGVybWlzc2lvbigibG9jYWxob3N0IiwgImFjY2VwdCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJY29uZFBlcm1JbmZvLmRlbGV0ZSgpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCBmYWxzZSk7Ci0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgU29ja2V0UGVybWlzc2lvbigibG9jYWxob3N0IiwgImFjY2VwdCIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXNlY3VyaXR5QWRtaW4uc2V0RGVmYXVsdFBlcm1pc3Npb25zKG51bGwpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBBbGxQZXJtaXNzaW9uKCksIHRydWUpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IFNvY2tldFBlcm1pc3Npb24oImxvY2FsaG9zdCIsICJhY2NlcHQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRQZXJtaXNzaW9uczAxKCkgewotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1RfQlVORExFKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZCA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0KTsKLQkJc2VjdXJpdHlBZG1pbi5zZXREZWZhdWx0UGVybWlzc2lvbnMoUkVBRE9OTFlfSU5GT1MpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCBmYWxzZSk7Ci0KLQkJc2VjdXJpdHlBZG1pbi5zZXREZWZhdWx0UGVybWlzc2lvbnMobnVsbCk7Ci0KLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJ3cml0ZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFBlcm1pc3Npb25zMDIoKSB7Ci0JCVNlY3VyaXR5QWRtaW4gc2VjdXJpdHlBZG1pbiA9IGNyZWF0ZVNlY3VyaXR5QWRtaW4obnVsbCk7Ci0JCUJ1bmRsZSB0ZXN0ID0gaW5zdGFsbFRlc3RCdW5kbGUoVEVTVF9CVU5ETEUpOwotCQlQcm90ZWN0aW9uRG9tYWluIHBkID0gc2VjdXJpdHlBZG1pbi5jcmVhdGVQcm90ZWN0aW9uRG9tYWluKHRlc3QpOwotCQlzZWN1cml0eUFkbWluLnNldERlZmF1bHRQZXJtaXNzaW9ucyhSRUFET05MWV9JTkZPUyk7Ci0KLQkJc2VjdXJpdHlBZG1pbi5zZXRQZXJtaXNzaW9ucyh0ZXN0LmdldExvY2F0aW9uKCksIFNPQ0tFVF9JTkZPUyk7Ci0KLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJ3cml0ZSIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBBbGxQZXJtaXNzaW9uKCksIGZhbHNlKTsKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJsb2NhbGhvc3QiLCAiYWNjZXB0IiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlzZWN1cml0eUFkbWluLnNldFBlcm1pc3Npb25zKHRlc3QuZ2V0TG9jYXRpb24oKSwgbnVsbCk7Ci0KLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJ3cml0ZSIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEFsbFBlcm1pc3Npb24oKSwgZmFsc2UpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IFNvY2tldFBlcm1pc3Npb24oImxvY2FsaG9zdCIsICJhY2NlcHQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlzZWN1cml0eUFkbWluLnNldERlZmF1bHRQZXJtaXNzaW9ucyhudWxsKTsKLQotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBBbGxQZXJtaXNzaW9uKCksIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3RMb2NhdGlvbkNvbmRpdGlvbjAxKCkgewotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1RfQlVORExFKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZCA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0KTsKLQotCQlDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvIGNvbmRQZXJtSW5mbyA9IHNlY3VyaXR5QWRtaW4uYWRkQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhnZXRMb2NhdGlvbkNvbmRpdGlvbnMoInh4eCIsIHRydWUpLCBTT0NLRVRfSU5GT1MpOyAvLyROT04tTkxTLTEkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCBmYWxzZSk7Ci0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgU29ja2V0UGVybWlzc2lvbigibG9jYWxob3N0IiwgImFjY2VwdCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJY29uZFBlcm1JbmZvLmRlbGV0ZSgpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEFsbFBlcm1pc3Npb24oKSwgdHJ1ZSk7Ci0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgU29ja2V0UGVybWlzc2lvbigibG9jYWxob3N0IiwgImFjY2VwdCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdExvY2F0aW9uQ29uZGl0aW9uMDIoKSB7Ci0JCVNlY3VyaXR5QWRtaW4gc2VjdXJpdHlBZG1pbiA9IGNyZWF0ZVNlY3VyaXR5QWRtaW4obnVsbCk7Ci0JCUJ1bmRsZSB0ZXN0ID0gaW5zdGFsbFRlc3RCdW5kbGUoVEVTVF9CVU5ETEUpOwotCQlQcm90ZWN0aW9uRG9tYWluIHBkID0gc2VjdXJpdHlBZG1pbi5jcmVhdGVQcm90ZWN0aW9uRG9tYWluKHRlc3QpOwotCi0JCUNvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8gY29uZFBlcm1JbmZvID0gc2VjdXJpdHlBZG1pbi5hZGRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKGdldExvY2F0aW9uQ29uZGl0aW9ucyh0ZXN0LmdldExvY2F0aW9uKCksIHRydWUpLCBTT0NLRVRfSU5GT1MpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEFsbFBlcm1pc3Npb24oKSwgZmFsc2UpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IFNvY2tldFBlcm1pc3Npb24oImxvY2FsaG9zdCIsICJhY2NlcHQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQljb25kUGVybUluZm8uZGVsZXRlKCk7Ci0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCB0cnVlKTsKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJsb2NhbGhvc3QiLCAiYWNjZXB0IiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVMb2NhdGlvbkNvbmRpdGlvbnMwMSgpIHsKLQkJU2VjdXJpdHlBZG1pbiBzZWN1cml0eUFkbWluID0gY3JlYXRlU2VjdXJpdHlBZG1pbihudWxsKTsKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsVGVzdEJ1bmRsZShURVNUX0JVTkRMRSk7Ci0JCVByb3RlY3Rpb25Eb21haW4gcGQgPSBzZWN1cml0eUFkbWluLmNyZWF0ZVByb3RlY3Rpb25Eb21haW4odGVzdCk7Ci0KLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyBjb25kUGVybUluZm8xID0gc2VjdXJpdHlBZG1pbi5hZGRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKGdldExvY2F0aW9uQ29uZGl0aW9ucygieHh4IiwgZmFsc2UpLCBTT0NLRVRfSU5GT1MpOyAvLyROT04tTkxTLTEkCi0JCUNvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8gY29uZFBlcm1JbmZvMiA9IHNlY3VyaXR5QWRtaW4uYWRkQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhBTExMT0NBVElPTl9DT05EUywgUkVBRE9OTFlfSU5GT1MpOwotCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgU29ja2V0UGVybWlzc2lvbigibG9jYWxob3N0IiwgImFjY2VwdCIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJY29uZFBlcm1JbmZvMS5kZWxldGUoKTsKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJsb2NhbGhvc3QiLCAiYWNjZXB0IiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQljb25kUGVybUluZm8yLmRlbGV0ZSgpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IFNvY2tldFBlcm1pc3Npb24oImxvY2FsaG9zdCIsICJhY2NlcHQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVMb2NhdGlvbkNvbmRpdGlvbnMwMigpIHsKLQkJU2VjdXJpdHlBZG1pbiBzZWN1cml0eUFkbWluID0gY3JlYXRlU2VjdXJpdHlBZG1pbihudWxsKTsKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsVGVzdEJ1bmRsZShURVNUX0JVTkRMRSk7Ci0JCVByb3RlY3Rpb25Eb21haW4gcGQgPSBzZWN1cml0eUFkbWluLmNyZWF0ZVByb3RlY3Rpb25Eb21haW4odGVzdCk7Ci0KLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyBjb25kUGVybUluZm8xID0gc2VjdXJpdHlBZG1pbi5hZGRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKGdldExvY2F0aW9uQ29uZGl0aW9ucygieHh4IiwgZmFsc2UpLCBTT0NLRVRfSU5GT1MpOyAvLyROT04tTkxTLTEkCi0JCUNvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8gY29uZFBlcm1JbmZvMiA9IHNlY3VyaXR5QWRtaW4uYWRkQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhBTExMT0NBVElPTl9DT05EUywgUkVBRE9OTFlfSU5GT1MpOwotCQlDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvIGNvbmRQZXJtSW5mbzMgPSBzZWN1cml0eUFkbWluLmFkZENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8oZ2V0TG9jYXRpb25Db25kaXRpb25zKHRlc3QuZ2V0TG9jYXRpb24oKSwgZmFsc2UpLCBSVU5USU1FX0lORk9TKTsKLQotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IFNvY2tldFBlcm1pc3Npb24oImxvY2FsaG9zdCIsICJhY2NlcHQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBSdW50aW1lUGVybWlzc2lvbigiZXhpdFZNIiwgbnVsbCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQljb25kUGVybUluZm8xLmRlbGV0ZSgpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IFNvY2tldFBlcm1pc3Npb24oImxvY2FsaG9zdCIsICJhY2NlcHQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBSdW50aW1lUGVybWlzc2lvbigiZXhpdFZNIiwgbnVsbCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQljb25kUGVybUluZm8yLmRlbGV0ZSgpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IFNvY2tldFBlcm1pc3Npb24oImxvY2FsaG9zdCIsICJhY2NlcHQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBSdW50aW1lUGVybWlzc2lvbigiZXhpdFZNIiwgbnVsbCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJY29uZFBlcm1JbmZvMy5kZWxldGUoKTsKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBTb2NrZXRQZXJtaXNzaW9uKCJsb2NhbGhvc3QiLCAiYWNjZXB0IiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBSdW50aW1lUGVybWlzc2lvbigiZXhpdFZNIiwgbnVsbCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGUwMSgpIHsKLQkJU2VjdXJpdHlBZG1pbiBzZWN1cml0eUFkbWluID0gY3JlYXRlU2VjdXJpdHlBZG1pbihudWxsKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlIHVwZGF0ZSA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7Ci0JCUxpc3Qgcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlhc3NlcnRUcnVlKCJ0YWJsZSBpcyBub3QgZW1wdHkiLCByb3dzLmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGNvbW1pdCIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlMDIoKSB7Ci0JCVNlY3VyaXR5QWRtaW4gc2VjdXJpdHlBZG1pbiA9IGNyZWF0ZVNlY3VyaXR5QWRtaW4obnVsbCk7Ci0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlMaXN0IHJvd3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyBpbmZvID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIEFMTExPQ0FUSU9OX0NPTkRTLCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVyk7Ci0JCXJvd3MuYWRkKGluZm8pOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZSB0ZXN0ID0gaW5zdGFsbFRlc3RCdW5kbGUoVEVTVF9CVU5ETEUpOwotCQlQcm90ZWN0aW9uRG9tYWluIHBkID0gc2VjdXJpdHlBZG1pbi5jcmVhdGVQcm90ZWN0aW9uRG9tYWluKHRlc3QpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCBmYWxzZSk7Ci0KLQkJdXBkYXRlID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlyb3dzLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBjb21taXQiLCB1cGRhdGUuY29tbWl0KCkpOyAvLyROT04tTkxTLTEkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEFsbFBlcm1pc3Npb24oKSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZTAzKCkgewotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCQlDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUgdXBkYXRlID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCByb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCUNvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8gaW5mbzEgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgQUxMTE9DQVRJT05fQ09ORFMsIFJFQURXUklURV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5ERU5ZKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyBpbmZvMiA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBBTExMT0NBVElPTl9DT05EUywgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpOwotCQlyb3dzLmFkZChpbmZvMSk7Ci0JCXJvd3MuYWRkKGluZm8yKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGNvbW1pdCIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1RfQlVORExFKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZCA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0KTsKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJ3cml0ZSIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBBbGxQZXJtaXNzaW9uKCksIGZhbHNlKTsKLQotCQl1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlyb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MucmVtb3ZlKDApOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCBmYWxzZSk7Ci0KLQkJdXBkYXRlID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlyb3dzLnJlbW92ZSgwKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGNvbW1pdCIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJ3cml0ZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgQWxsUGVybWlzc2lvbigpLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlMDQoKSB7Ci0JCVNlY3VyaXR5QWRtaW4gc2VjdXJpdHlBZG1pbiA9IGNyZWF0ZVNlY3VyaXR5QWRtaW4obnVsbCk7Ci0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlMaXN0IHJvd3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyBpbmZvMSA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBBTExMT0NBVElPTl9DT05EUywgUkVBRFdSSVRFX0lORk9TLCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkRFTlkpOwotCQlDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvIGluZm8yID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIEFMTExPQ0FUSU9OX0NPTkRTLCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVyk7Ci0JCXJvd3MuYWRkKGluZm8xKTsKLQkJcm93cy5hZGQoaW5mbzIpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUxID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCByb3dzMSA9IHVwZGF0ZTEuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJcm93czEucmVtb3ZlKDApOwotCi0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUyID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCByb3dzMiA9IHVwZGF0ZTIuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJcm93czIucmVtb3ZlKDApOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlMi5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgdGVzdCA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1RfQlVORExFKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZCA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0KTsKLQkJdGVzdFBlcm1pc3Npb24ocGQsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJ3cml0ZSIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEFsbFBlcm1pc3Npb24oKSwgZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKCJzdWNjZWVkZWQgY29tbWl0IiwgdXBkYXRlMS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlyb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MucmVtb3ZlKDApOwotCi0JCWFzc2VydFRydWUoImZhaWxlZCB0byBjb21taXQiLCB1cGRhdGUuY29tbWl0KCkpOyAvLyROT04tTkxTLTEkCi0JCXRlc3RQZXJtaXNzaW9uKHBkLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEFsbFBlcm1pc3Npb24oKSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlY3VyaXR5TWFuYWdlcjAxKCkgewotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCQlDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUgdXBkYXRlID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCByb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCUNvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8gaW5mbyA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBBTExMT0NBVElPTl9DT05EUywgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpOwotCQlyb3dzLmFkZChpbmZvKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGNvbW1pdCIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFcXVpbm94U2VjdXJpdHlNYW5hZ2VyIHNtID0gbmV3IEVxdWlub3hTZWN1cml0eU1hbmFnZXIoKTsKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsVGVzdEJ1bmRsZShURVNUX0JVTkRMRSk7Ci0JCVByb3RlY3Rpb25Eb21haW4gcGQgPSBzZWN1cml0eUFkbWluLmNyZWF0ZVByb3RlY3Rpb25Eb21haW4odGVzdCk7Ci0JCVByb3RlY3Rpb25Eb21haW5bXSBwZHMgPSBuZXcgUHJvdGVjdGlvbkRvbWFpbltdIHtwZH07Ci0JCXRlc3RTTVBlcm1pc3Npb24oc20sIHBkcywgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTTVBlcm1pc3Npb24oc20sIHBkcywgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U01QZXJtaXNzaW9uKHNtLCBwZHMsIG5ldyBBbGxQZXJtaXNzaW9uKCksIGZhbHNlKTsKLQotCQl1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlyb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGNvbW1pdCIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGVzdFNNUGVybWlzc2lvbihzbSwgcGRzLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U01QZXJtaXNzaW9uKHNtLCBwZHMsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFNNUGVybWlzc2lvbihzbSwgcGRzLCBuZXcgQWxsUGVybWlzc2lvbigpLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UG9zdHBvbmVkQ29uZGl0aW9uczAxKCkgewotCQlpbnN0YWxsQ29uZGl0aW9uQnVuZGxlKCk7Ci0JCVRlc3RDb25kaXRpb24uY2xlYXJDb25kaXRpb25zKCk7Ci0JCUVxdWlub3hTZWN1cml0eU1hbmFnZXIgc20gPSBuZXcgRXF1aW5veFNlY3VyaXR5TWFuYWdlcigpOwotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKHNtKTsKLQkJQnVuZGxlIHRlc3QxID0gaW5zdGFsbFRlc3RCdW5kbGUoVEVTVF9CVU5ETEUpOwotCQlCdW5kbGUgdGVzdDIgPSBpbnN0YWxsVGVzdEJ1bmRsZShURVNUMl9CVU5ETEUpOwotCQlQcm90ZWN0aW9uRG9tYWluIHBkMSA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0MSk7Ci0JCVByb3RlY3Rpb25Eb21haW4gcGQyID0gc2VjdXJpdHlBZG1pbi5jcmVhdGVQcm90ZWN0aW9uRG9tYWluKHRlc3QyKTsKLQkJUHJvdGVjdGlvbkRvbWFpbltdIHBkcyA9IG5ldyBQcm90ZWN0aW9uRG9tYWluW10ge3BkMSwgcGQyfTsKLQotCQlDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUgdXBkYXRlID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCByb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MuYWRkKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtQT1NUX01VVF9TQVR9LCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5ERU5ZKSk7Ci0JCXJvd3MuYWRkKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtQT1NUX01VVF9VTlNBVH0sIFJFQURPTkxZX0lORk9TLCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkFMTE9XKSk7Ci0JCXJvd3MuYWRkKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBBTExMT0NBVElPTl9DT05EUywgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uREVOWSkpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJCk7Ci0KLQkJdGVzdFNNUGVybWlzc2lvbihzbSwgcGRzLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVRlc3RDb25kaXRpb24gdGMxc2F0ID0gVGVzdENvbmRpdGlvbi5nZXRUZXN0Q29uZGl0aW9uKCJQT1NUX01VVF9TQVRfIiArIHRlc3QxLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RDb25kaXRpb24gdGMyc2F0ID0gVGVzdENvbmRpdGlvbi5nZXRUZXN0Q29uZGl0aW9uKCJQT1NUX01VVF9TQVRfIiArIHRlc3QyLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RDb25kaXRpb24gdGMxdW5zYXQgPSBUZXN0Q29uZGl0aW9uLmdldFRlc3RDb25kaXRpb24oIlBPU1RfTVVUX1VOU0FUXyIgKyB0ZXN0MS5nZXRCdW5kbGVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlUZXN0Q29uZGl0aW9uIHRjMnVuc2F0ID0gVGVzdENvbmRpdGlvbi5nZXRUZXN0Q29uZGl0aW9uKCJQT1NUX01VVF9VTlNBVF8iICsgdGVzdDIuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnROb3ROdWxsKCJ0YzFzYXQiLCB0YzFzYXQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoInRjMnNhdCIsIHRjMnNhdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgidGMxdW5zYXQiLCB0YzF1bnNhdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgidGMydW5zYXQiLCB0YzJ1bnNhdCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0YzFzYXQuc2V0U2F0aXNmaWVkKGZhbHNlKTsKLQkJdGMyc2F0LnNldFNhdGlzZmllZChmYWxzZSk7Ci0JCXRjMXVuc2F0LnNldFNhdGlzZmllZCh0cnVlKTsKLQkJdGMydW5zYXQuc2V0U2F0aXNmaWVkKHRydWUpOwotCQl0ZXN0U01QZXJtaXNzaW9uKHNtLCBwZHMsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl0YzFzYXQuc2V0U2F0aXNmaWVkKHRydWUpOwotCQl0YzJzYXQuc2V0U2F0aXNmaWVkKHRydWUpOwotCQl1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlyb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MucmVtb3ZlKDApOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJCk7Ci0JCXRlc3RTTVBlcm1pc3Npb24oc20sIHBkcywgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXRjMXVuc2F0LnNldFNhdGlzZmllZChmYWxzZSk7Ci0JCXRjMnVuc2F0LnNldFNhdGlzZmllZChmYWxzZSk7Ci0JCXRlc3RTTVBlcm1pc3Npb24oc20sIHBkcywgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlyb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MucmVtb3ZlKDApOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJCk7Ci0JCXRlc3RTTVBlcm1pc3Npb24oc20sIHBkcywgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UG9zdHBvbmVkQ29uZGl0aW9uczAyKCkgewotCQlpbnN0YWxsQ29uZGl0aW9uQnVuZGxlKCk7Ci0JCVRlc3RDb25kaXRpb24uY2xlYXJDb25kaXRpb25zKCk7Ci0JCUVxdWlub3hTZWN1cml0eU1hbmFnZXIgc20gPSBuZXcgRXF1aW5veFNlY3VyaXR5TWFuYWdlcigpOwotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKHNtKTsKLQkJQnVuZGxlIHRlc3QxID0gaW5zdGFsbFRlc3RCdW5kbGUoVEVTVF9CVU5ETEUpOwotCQlCdW5kbGUgdGVzdDIgPSBpbnN0YWxsVGVzdEJ1bmRsZShURVNUMl9CVU5ETEUpOwotCQlQcm90ZWN0aW9uRG9tYWluIHBkMSA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0MSk7Ci0JCVByb3RlY3Rpb25Eb21haW4gcGQyID0gc2VjdXJpdHlBZG1pbi5jcmVhdGVQcm90ZWN0aW9uRG9tYWluKHRlc3QyKTsKLQkJUHJvdGVjdGlvbkRvbWFpbltdIHBkcyA9IG5ldyBQcm90ZWN0aW9uRG9tYWluW10ge3BkMSwgcGQyfTsKLQotCQlDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUgdXBkYXRlID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCByb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MuYWRkKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtQT1NUX01VVF9TQVR9LCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5ERU5ZKSk7Ci0JCXJvd3MuYWRkKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtQT1NUX01VVF9TQVR9LCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5ERU5ZKSk7Ci0JCXJvd3MuYWRkKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtQT1NUX01VVF9VTlNBVH0sIFJFQURPTkxZX0lORk9TLCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkRFTlkpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIEFMTExPQ0FUSU9OX0NPTkRTLCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5ERU5ZKSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBjb21taXQiLCB1cGRhdGUuY29tbWl0KCkpOyAvLyROT04tTkxTLTEkKTsKLQotCQl0ZXN0U01QZXJtaXNzaW9uKHNtLCBwZHMsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJVGVzdENvbmRpdGlvbiB0YzFzYXQgPSBUZXN0Q29uZGl0aW9uLmdldFRlc3RDb25kaXRpb24oIlBPU1RfTVVUX1NBVF8iICsgdGVzdDEuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdENvbmRpdGlvbiB0YzJzYXQgPSBUZXN0Q29uZGl0aW9uLmdldFRlc3RDb25kaXRpb24oIlBPU1RfTVVUX1NBVF8iICsgdGVzdDIuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdENvbmRpdGlvbiB0YzF1bnNhdCA9IFRlc3RDb25kaXRpb24uZ2V0VGVzdENvbmRpdGlvbigiUE9TVF9NVVRfVU5TQVRfIiArIHRlc3QxLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RDb25kaXRpb24gdGMydW5zYXQgPSBUZXN0Q29uZGl0aW9uLmdldFRlc3RDb25kaXRpb24oIlBPU1RfTVVUX1VOU0FUXyIgKyB0ZXN0Mi5nZXRCdW5kbGVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGF2b2lkIGFuIG9yZGVyaW5nIGFzc3VtcHRpb24gb24gdGhlIG9yZGVyIGluIHdoaWNoCi0JCS8vIFByb3RlY3Rpb25Eb21haW5zIGFyZSBwcm9jZXNzZWQgYnkgdGhlIEFjY2Vzc0NvbnRyb2xDb250ZXh0IChidWcgMjY5OTE3KQotCQkvLyBKdXN0IG1ha2Ugc3VyZSBib3RoIHRjMSBhbmQgdGMyIGFyZSBub3Qgbm9uLW51bGwgYXQgdGhlIHNhbWUgdGltZS4KLQkJYXNzZXJ0VHJ1ZSgidGMxc2F0IGFuZCB0YzJzYXQgYXJlIGVpdGhlciBib3RoIG51bGwgb3IgYm90aCBub24tbnVsbCIsICh0YzFzYXQgPT0gbnVsbCkgXiAodGMyc2F0ID09IG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJ0YzF1bnNhdCBhbmQgdGMydW5zYXQgYXJlIGVpdGhlciBib3RoIG51bGwgb3IgYm90aCBub24tbnVsbCIsICh0YzF1bnNhdCA9PSBudWxsKSBeICh0YzJ1bnNhdCA9PSBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlUZXN0Q29uZGl0aW9uIG1vZGlmeVNhdCA9IHRjMXNhdCAhPSBudWxsID8gdGMxc2F0IDogdGMyc2F0OwotCQlUZXN0Q29uZGl0aW9uIG1vZGlmeVVuc2F0ID0gdGMxdW5zYXQgIT0gbnVsbCA/IHRjMXVuc2F0IDogdGMydW5zYXQ7Ci0JCW1vZGlmeVNhdC5zZXRTYXRpc2ZpZWQoZmFsc2UpOwotCQltb2RpZnlVbnNhdC5zZXRTYXRpc2ZpZWQodHJ1ZSk7Ci0JCXRlc3RTTVBlcm1pc3Npb24oc20sIHBkcywgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UG9zdHBvbmVkQ29uZGl0aW9uczAzKCkgewotCQlpbnN0YWxsQ29uZGl0aW9uQnVuZGxlKCk7Ci0JCVRlc3RDb25kaXRpb24uY2xlYXJDb25kaXRpb25zKCk7Ci0JCUVxdWlub3hTZWN1cml0eU1hbmFnZXIgc20gPSBuZXcgRXF1aW5veFNlY3VyaXR5TWFuYWdlcigpOwotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKHNtKTsKLQkJQnVuZGxlIHRlc3QxID0gaW5zdGFsbFRlc3RCdW5kbGUoVEVTVF9CVU5ETEUpOwotCQlCdW5kbGUgdGVzdDIgPSBpbnN0YWxsVGVzdEJ1bmRsZShURVNUMl9CVU5ETEUpOwotCQlQcm90ZWN0aW9uRG9tYWluIHBkMSA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0MSk7Ci0JCVByb3RlY3Rpb25Eb21haW4gcGQyID0gc2VjdXJpdHlBZG1pbi5jcmVhdGVQcm90ZWN0aW9uRG9tYWluKHRlc3QyKTsKLQkJUHJvdGVjdGlvbkRvbWFpbltdIHBkcyA9IG5ldyBQcm90ZWN0aW9uRG9tYWluW10ge3BkMSwgcGQyfTsKLQotCQlDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUgdXBkYXRlID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCByb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MuYWRkKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtQT1NUX01VVF9TQVR9LCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQlyb3dzLmFkZChzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7UE9TVF9NVVRfU0FUfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1BPU1RfTVVUX1VOU0FUfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIEFMTExPQ0FUSU9OX0NPTkRTLCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJCk7Ci0KLQkJdGVzdFNNUGVybWlzc2lvbihzbSwgcGRzLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJVGVzdENvbmRpdGlvbiB0YzFzYXQgPSBUZXN0Q29uZGl0aW9uLmdldFRlc3RDb25kaXRpb24oIlBPU1RfTVVUX1NBVF8iICsgdGVzdDEuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdENvbmRpdGlvbiB0YzJzYXQgPSBUZXN0Q29uZGl0aW9uLmdldFRlc3RDb25kaXRpb24oIlBPU1RfTVVUX1NBVF8iICsgdGVzdDIuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdENvbmRpdGlvbiB0YzF1bnNhdCA9IFRlc3RDb25kaXRpb24uZ2V0VGVzdENvbmRpdGlvbigiUE9TVF9NVVRfVU5TQVRfIiArIHRlc3QxLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RDb25kaXRpb24gdGMydW5zYXQgPSBUZXN0Q29uZGl0aW9uLmdldFRlc3RDb25kaXRpb24oIlBPU1RfTVVUX1VOU0FUXyIgKyB0ZXN0Mi5nZXRCdW5kbGVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydE5vdE51bGwoInRjMXNhdCIsIHRjMXNhdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgidGMyc2F0IiwgdGMyc2F0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJ0YzF1bnNhdCIsIHRjMXVuc2F0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJ0YzJ1bnNhdCIsIHRjMnVuc2F0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXRjMXNhdC5zZXRTYXRpc2ZpZWQoZmFsc2UpOwotCQl0YzJzYXQuc2V0U2F0aXNmaWVkKGZhbHNlKTsKLQkJdGMxdW5zYXQuc2V0U2F0aXNmaWVkKHRydWUpOwotCQl0YzJ1bnNhdC5zZXRTYXRpc2ZpZWQodHJ1ZSk7Ci0JCXRlc3RTTVBlcm1pc3Npb24oc20sIHBkcywgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQb3N0cG9uZWRDb25kaXRpb25zMDQoKSB7Ci0JCWluc3RhbGxDb25kaXRpb25CdW5kbGUoKTsKLQkJVGVzdENvbmRpdGlvbi5jbGVhckNvbmRpdGlvbnMoKTsKLQkJRXF1aW5veFNlY3VyaXR5TWFuYWdlciBzbSA9IG5ldyBFcXVpbm94U2VjdXJpdHlNYW5hZ2VyKCk7Ci0JCVNlY3VyaXR5QWRtaW4gc2VjdXJpdHlBZG1pbiA9IGNyZWF0ZVNlY3VyaXR5QWRtaW4oc20pOwotCQlCdW5kbGUgdGVzdDEgPSBpbnN0YWxsVGVzdEJ1bmRsZShURVNUX0JVTkRMRSk7Ci0JCUJ1bmRsZSB0ZXN0MiA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1QyX0JVTkRMRSk7Ci0JCVByb3RlY3Rpb25Eb21haW4gcGQxID0gc2VjdXJpdHlBZG1pbi5jcmVhdGVQcm90ZWN0aW9uRG9tYWluKHRlc3QxKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZDIgPSBzZWN1cml0eUFkbWluLmNyZWF0ZVByb3RlY3Rpb25Eb21haW4odGVzdDIpOwotCQlQcm90ZWN0aW9uRG9tYWluW10gcGRzID0gbmV3IFByb3RlY3Rpb25Eb21haW5bXSB7cGQxLCBwZDJ9OwotCi0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlMaXN0IHJvd3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1BPU1RfTVVUX1NBVH0sIFJFQURPTkxZX0lORk9TLCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkRFTlkpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1BPU1RfTVVUX1NBVH0sIFJFQURPTkxZX0lORk9TLCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkRFTlkpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1BPU1RfTVVUX1VOU0FUfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uREVOWSkpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJCk7Ci0KLQkJdGVzdFNNUGVybWlzc2lvbihzbSwgcGRzLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVRlc3RDb25kaXRpb24gdGMxc2F0ID0gVGVzdENvbmRpdGlvbi5nZXRUZXN0Q29uZGl0aW9uKCJQT1NUX01VVF9TQVRfIiArIHRlc3QxLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RDb25kaXRpb24gdGMyc2F0ID0gVGVzdENvbmRpdGlvbi5nZXRUZXN0Q29uZGl0aW9uKCJQT1NUX01VVF9TQVRfIiArIHRlc3QyLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RDb25kaXRpb24gdGMxdW5zYXQgPSBUZXN0Q29uZGl0aW9uLmdldFRlc3RDb25kaXRpb24oIlBPU1RfTVVUX1VOU0FUXyIgKyB0ZXN0MS5nZXRCdW5kbGVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlUZXN0Q29uZGl0aW9uIHRjMnVuc2F0ID0gVGVzdENvbmRpdGlvbi5nZXRUZXN0Q29uZGl0aW9uKCJQT1NUX01VVF9VTlNBVF8iICsgdGVzdDIuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBOb3RlIHRoYXQgd2UgbmVlZCB0byBhdm9pZCBhbiBvcmRlcmluZyBhc3N1bXB0aW9uIG9uIHRoZSBvcmRlciBpbiB3aGljaAotCQkvLyBQcm90ZWN0aW9uRG9tYWlucyBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSBBY2Nlc3NDb250cm9sQ29udGV4dCAoYnVnIDI2OTkxNykKLQkJLy8gSnVzdCBtYWtlIHN1cmUgYm90aCB0YzEgYW5kIHRjMiBhcmUgbm90IG5vbi1udWxsIGF0IHRoZSBzYW1lIHRpbWUuCi0JCWFzc2VydFRydWUoInRjMXNhdCBhbmQgdGMyc2F0IGFyZSBlaXRoZXIgYm90aCBudWxsIG9yIGJvdGggbm9uLW51bGwiLCAodGMxc2F0ID09IG51bGwpIF4gKHRjMnNhdCA9PSBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgidGMxdW5zYXQgYW5kIHRjMnVuc2F0IGFyZSBlaXRoZXIgYm90aCBudWxsIG9yIGJvdGggbm9uLW51bGwiLCAodGMxdW5zYXQgPT0gbnVsbCkgXiAodGMydW5zYXQgPT0gbnVsbCkpOyAvLyROT04tTkxTLTEkCi0KLQkJVGVzdENvbmRpdGlvbiBtb2RpZnlTYXQgPSB0YzFzYXQgIT0gbnVsbCA/IHRjMXNhdCA6IHRjMnNhdDsKLQkJVGVzdENvbmRpdGlvbiBtb2RpZnlVbnNhdCA9IHRjMXVuc2F0ICE9IG51bGwgPyB0YzF1bnNhdCA6IHRjMnVuc2F0OwotCQltb2RpZnlTYXQuc2V0U2F0aXNmaWVkKGZhbHNlKTsKLQkJbW9kaWZ5VW5zYXQuc2V0U2F0aXNmaWVkKHRydWUpOwotCQl0ZXN0U01QZXJtaXNzaW9uKHNtLCBwZHMsIG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBvc3Rwb25lZENvbmRpdGlvbnMwNSgpIHsKLQkJaW5zdGFsbENvbmRpdGlvbkJ1bmRsZSgpOwotCQlUZXN0Q29uZGl0aW9uLmNsZWFyQ29uZGl0aW9ucygpOwotCQlFcXVpbm94U2VjdXJpdHlNYW5hZ2VyIHNtID0gbmV3IEVxdWlub3hTZWN1cml0eU1hbmFnZXIoKTsKLQkJU2VjdXJpdHlBZG1pbiBzZWN1cml0eUFkbWluID0gY3JlYXRlU2VjdXJpdHlBZG1pbihzbSk7Ci0JCUJ1bmRsZSB0ZXN0MSA9IGluc3RhbGxUZXN0QnVuZGxlKFRFU1RfQlVORExFKTsKLQkJQnVuZGxlIHRlc3QyID0gaW5zdGFsbFRlc3RCdW5kbGUoVEVTVDJfQlVORExFKTsKLQkJUHJvdGVjdGlvbkRvbWFpbiBwZDEgPSBzZWN1cml0eUFkbWluLmNyZWF0ZVByb3RlY3Rpb25Eb21haW4odGVzdDEpOwotCQlQcm90ZWN0aW9uRG9tYWluIHBkMiA9IHNlY3VyaXR5QWRtaW4uY3JlYXRlUHJvdGVjdGlvbkRvbWFpbih0ZXN0Mik7Ci0JCVByb3RlY3Rpb25Eb21haW5bXSBwZHMgPSBuZXcgUHJvdGVjdGlvbkRvbWFpbltdIHtwZDEsIHBkMn07Ci0KLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlIHVwZGF0ZSA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7Ci0JCUxpc3Qgcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlyb3dzLmFkZChzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7UE9TVF9NVVRfU0FUfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uREVOWSkpOwotCQlyb3dzLmFkZChzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7UE9TVF9NVVRfVU5TQVR9LCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQlyb3dzLmFkZChzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7UE9TVF9NVVRfU0FUfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1BPU1RfTVVUX1VOU0FUfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIEFMTExPQ0FUSU9OX0NPTkRTLCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJCk7Ci0KLQkJdGVzdFNNUGVybWlzc2lvbihzbSwgcGRzLCBuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVRlc3RDb25kaXRpb24gdGMxc2F0ID0gVGVzdENvbmRpdGlvbi5nZXRUZXN0Q29uZGl0aW9uKCJQT1NUX01VVF9TQVRfIiArIHRlc3QxLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RDb25kaXRpb24gdGMyc2F0ID0gVGVzdENvbmRpdGlvbi5nZXRUZXN0Q29uZGl0aW9uKCJQT1NUX01VVF9TQVRfIiArIHRlc3QyLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RDb25kaXRpb24gdGMxdW5zYXQgPSBUZXN0Q29uZGl0aW9uLmdldFRlc3RDb25kaXRpb24oIlBPU1RfTVVUX1VOU0FUXyIgKyB0ZXN0MS5nZXRCdW5kbGVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlUZXN0Q29uZGl0aW9uIHRjMnVuc2F0ID0gVGVzdENvbmRpdGlvbi5nZXRUZXN0Q29uZGl0aW9uKCJQT1NUX01VVF9VTlNBVF8iICsgdGVzdDIuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnROb3ROdWxsKCJ0YzFzYXQiLCB0YzFzYXQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoInRjMnNhdCIsIHRjMnNhdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgidGMxdW5zYXQiLCB0YzF1bnNhdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgidGMydW5zYXQiLCB0YzJ1bnNhdCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0YzFzYXQuc2V0U2F0aXNmaWVkKGZhbHNlKTsKLQkJdGMyc2F0LnNldFNhdGlzZmllZChmYWxzZSk7Ci0JCXRlc3RTTVBlcm1pc3Npb24oc20sIHBkcywgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NDb250cm9sQ29udGV4dDAxKCkgewotCQkvLyB0ZXN0IHNpbmdsZSByb3cgd2l0aCBzaWduZXIgY29uZGl0aW9uCi0JCVNlY3VyaXR5QWRtaW4gc2VjdXJpdHlBZG1pbiA9IGNyZWF0ZVNlY3VyaXR5QWRtaW4obnVsbCk7Ci0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlMaXN0IHJvd3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1NJR05FUl9DT05ESVRJT04xfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGNvbW1pdCIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlBY2Nlc3NDb250cm9sQ29udGV4dCBhY2MgPSBzZWN1cml0eUFkbWluLmdldEFjY2Vzc0NvbnRyb2xDb250ZXh0KG5ldyBTdHJpbmdbXSB7ImNuPXQxLGM9RlI7Y249dGVzdDEsYz1VUyJ9KTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJYWNjLmNoZWNrUGVybWlzc2lvbihuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZmFpbCgiZXhwZWN0aW5nIEFjY2Vzc0NvbnRyb2xFeGNldHBpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgQWNjZXNzQ29udHJvbEV4Y2V0cGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzQ29udHJvbENvbnRleHQwMWEoKSB7Ci0JCS8vIHRlc3Qgc2luZ2xlIHJvdyB3aXRoIHNpZ25lciBjb25kaXRpb24KLQkJU2VjdXJpdHlBZG1pbiBzZWN1cml0eUFkbWluID0gY3JlYXRlU2VjdXJpdHlBZG1pbihudWxsKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlIHVwZGF0ZSA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7Ci0JCUxpc3Qgcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlyb3dzLmFkZChzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7U0lHTkVSX0NPTkRJVElPTjF9LCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYyA9IHNlY3VyaXR5QWRtaW4uZ2V0QWNjZXNzQ29udHJvbENvbnRleHQobmV3IFN0cmluZ1tdIHsiY249dGVzdDEsYz1VUyJ9KTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJYWNjLmNoZWNrUGVybWlzc2lvbihuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZmFpbCgiZXhwZWN0aW5nIEFjY2Vzc0NvbnRyb2xFeGNldHBpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgQWNjZXNzQ29udHJvbEV4Y2V0cGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzQ29udHJvbENvbnRleHQwMigpIHsKLQkJLy8gdGVzdCB3aXRoIERFTlkgcm93Ci0JCVNlY3VyaXR5QWRtaW4gc2VjdXJpdHlBZG1pbiA9IGNyZWF0ZVNlY3VyaXR5QWRtaW4obnVsbCk7Ci0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlMaXN0IHJvd3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1NJR05FUl9DT05ESVRJT04xfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1NJR05FUl9DT05ESVRJT04xfSwgUkVBRFdSSVRFX0lORk9TLCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkRFTlkpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1NJR05FUl9DT05ESVRJT04xfSwgUkVBRFdSSVRFX0lORk9TLCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkFMTE9XKSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBjb21taXQiLCB1cGRhdGUuY29tbWl0KCkpOyAvLyROT04tTkxTLTEkCi0KLQkJQWNjZXNzQ29udHJvbENvbnRleHQgYWNjID0gc2VjdXJpdHlBZG1pbi5nZXRBY2Nlc3NDb250cm9sQ29udGV4dChuZXcgU3RyaW5nW10geyJjbj10MSxjPUZSO2NuPXRlc3QxLGM9VVMifSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZhaWwoImV4cGVjdGluZyBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlhY2MuY2hlY2tQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIEFjY2Vzc0NvbnRyb2xFeGNldHBpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0NvbnRyb2xDb250ZXh0MDMoKSB7Ci0JCS8vIHRlc3QgbXVsdGlwbGUgc2lnbmVyIGNvbmRpdGlvbnMKLQkJU2VjdXJpdHlBZG1pbiBzZWN1cml0eUFkbWluID0gY3JlYXRlU2VjdXJpdHlBZG1pbihudWxsKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlIHVwZGF0ZSA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7Ci0JCUxpc3Qgcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlyb3dzLmFkZChzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7U0lHTkVSX0NPTkRJVElPTjF9LCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY29tbWl0IiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYyA9IHNlY3VyaXR5QWRtaW4uZ2V0QWNjZXNzQ29udHJvbENvbnRleHQobmV3IFN0cmluZ1tdIHsiY249dDEsYz1GUjtjbj10ZXN0MixjPVVTIn0pOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlhY2MuY2hlY2tQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJ3cml0ZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmYWlsKCJleHBlY3RpbmcgQWNjZXNzQ29udHJvbEV4Y2V0cGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQl0cnkgewotCQkJYWNjLmNoZWNrUGVybWlzc2lvbihuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmYWlsKCJleHBlY3RpbmcgQWNjZXNzQ29udHJvbEV4Y2V0cGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCi0JCXVwZGF0ZSA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7Ci0JCXJvd3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1NJR05FUl9DT05ESVRJT04yfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGNvbW1pdCIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWNjID0gc2VjdXJpdHlBZG1pbi5nZXRBY2Nlc3NDb250cm9sQ29udGV4dChuZXcgU3RyaW5nW10geyJjbj10MSxjPUZSO2NuPXRlc3QyLGM9VVMifSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZhaWwoImV4cGVjdGluZyBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlhY2MuY2hlY2tQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIEFjY2Vzc0NvbnRyb2xFeGNldHBpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0NvbnRyb2xDb250ZXh0MDQoKSB7Ci0JCS8vIHRlc3QgbXVsdGlwbGUgc2lnbmVyIGNvbmRpdGlvbnMKLQkJU2VjdXJpdHlBZG1pbiBzZWN1cml0eUFkbWluID0gY3JlYXRlU2VjdXJpdHlBZG1pbihudWxsKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlIHVwZGF0ZSA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7Ci0JCUxpc3Qgcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlyb3dzLmFkZChzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7U0lHTkVSX0NPTkRJVElPTjEsIFNJR05FUl9DT05ESVRJT04yfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJcm93cy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge1NJR05FUl9DT05ESVRJT04xfSwgUkVBRFdSSVRFX0lORk9TLCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkFMTE9XKSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBjb21taXQiLCB1cGRhdGUuY29tbWl0KCkpOyAvLyROT04tTkxTLTEkCi0KLQkJQWNjZXNzQ29udHJvbENvbnRleHQgYWNjID0gc2VjdXJpdHlBZG1pbi5nZXRBY2Nlc3NDb250cm9sQ29udGV4dChuZXcgU3RyaW5nW10geyJjbj10MSxjPUZSO2NuPXRlc3QyLGM9VVMifSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZhaWwoImV4cGVjdGluZyBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlhY2MuY2hlY2tQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZhaWwoImV4cGVjdGluZyBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0KLQkJYWNjID0gc2VjdXJpdHlBZG1pbi5nZXRBY2Nlc3NDb250cm9sQ29udGV4dChuZXcgU3RyaW5nW10geyJjbj10MSxjPUZSO2NuPXRlc3QxLGM9VVMiLCAiY249dDEsYz1GUjtjbj10ZXN0MixjPVVTIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHJ5IHsKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIEFjY2Vzc0NvbnRyb2xFeGNldHBpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlhY2MuY2hlY2tQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIEFjY2Vzc0NvbnRyb2xFeGNldHBpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0NvbnRyb2xDb250ZXh0MDUoKSB7Ci0JCS8vIHRlc3Qgd2l0aCBlbXB0eSByb3dzCi0JCVNlY3VyaXR5QWRtaW4gc2VjdXJpdHlBZG1pbiA9IGNyZWF0ZVNlY3VyaXR5QWRtaW4obnVsbCk7Ci0KLQkJQWNjZXNzQ29udHJvbENvbnRleHQgYWNjID0gc2VjdXJpdHlBZG1pbi5nZXRBY2Nlc3NDb250cm9sQ29udGV4dChuZXcgU3RyaW5nW10geyJjbj10MSxjPUZSO2NuPXRlc3QyLGM9VVMifSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYWNjLmNoZWNrUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIEFjY2Vzc0NvbnRyb2xFeGNldHBpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHNldCB0aGUgZGVmYXVsdCBwZXJtaXNzaW9ucwotCQlzZWN1cml0eUFkbWluLnNldERlZmF1bHRQZXJtaXNzaW9ucyhSRUFEV1JJVEVfSU5GT1MpOwotCQlhY2MgPSBzZWN1cml0eUFkbWluLmdldEFjY2Vzc0NvbnRyb2xDb250ZXh0KG5ldyBTdHJpbmdbXSB7ImNuPXQxLGM9RlI7Y249dGVzdDIsYz1VUyJ9KTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJYWNjLmNoZWNrUGVybWlzc2lvbihuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYWNjLmNoZWNrUGVybWlzc2lvbihuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJYWNjLmNoZWNrUGVybWlzc2lvbihuZXcgQWxsUGVybWlzc2lvbigpKTsKLQkJCWZhaWwoImV4cGVjdGluZyBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0NvbnRyb2xDb250ZXh0MDYoKSB7Ci0JCS8vIHRlc3Qgd2l0aCBlbXB0eSBjb25kaXRpb24gcm93cwotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCQlDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUgdXBkYXRlID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCByb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MuYWRkKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHt9LCBSRUFET05MWV9JTkZPUywgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQlyb3dzLmFkZChzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7U0lHTkVSX0NPTkRJVElPTjF9LCBSRUFEV1JJVEVfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGNvbW1pdCIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlBY2Nlc3NDb250cm9sQ29udGV4dCBhY2MgPSBzZWN1cml0eUFkbWluLmdldEFjY2Vzc0NvbnRyb2xDb250ZXh0KG5ldyBTdHJpbmdbXSB7ImNuPXQxLGM9RlI7Y249dGVzdDIsYz1VUyJ9KTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJYWNjLmNoZWNrUGVybWlzc2lvbihuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAicmVhZCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJYWNjLmNoZWNrUGVybWlzc2lvbihuZXcgRmlsZVBlcm1pc3Npb24oInRlc3QiLCAid3JpdGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZmFpbCgiZXhwZWN0aW5nIEFjY2Vzc0NvbnRyb2xFeGNldHBpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzQ29udHJvbENvbnRleHQwNygpIHsKLQkJLy8gdGVzdCAhIHNpZ25lciBjb25kaXRpb24KLQkJU2VjdXJpdHlBZG1pbiBzZWN1cml0eUFkbWluID0gY3JlYXRlU2VjdXJpdHlBZG1pbihudWxsKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlIHVwZGF0ZSA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7Ci0JCUxpc3Qgcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlyb3dzLmFkZChzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7Tk9UX1NJR05FUl9DT05ESVRJT04xfSwgUkVBRE9OTFlfSU5GT1MsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8uQUxMT1cpKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGNvbW1pdCIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQWNjZXNzQ29udHJvbENvbnRleHQgYWNjID0gc2VjdXJpdHlBZG1pbi5nZXRBY2Nlc3NDb250cm9sQ29udGV4dChuZXcgU3RyaW5nW10geyJjbj10MSxjPUZSO2NuPXRlc3QxLGM9VVMifSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZhaWwoImV4cGVjdGluZyBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlhY2MuY2hlY2tQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZhaWwoImV4cGVjdGluZyBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0KLQkJYWNjID0gc2VjdXJpdHlBZG1pbi5nZXRBY2Nlc3NDb250cm9sQ29udGV4dChuZXcgU3RyaW5nW10geyJjbj10MSxjPUZSO2NuPXRlc3QyLGM9VVMifSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWFjYy5jaGVja1Blcm1pc3Npb24obmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgIndyaXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZhaWwoImV4cGVjdGluZyBBY2Nlc3NDb250cm9sRXhjZXRwaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQlhY2MuY2hlY2tQZXJtaXNzaW9uKG5ldyBGaWxlUGVybWlzc2lvbigidGVzdCIsICJyZWFkIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIEFjY2Vzc0NvbnRyb2xFeGNldHBpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVuY29kaW5nSW5mb3MwMSgpIHsKLQkJU3RyaW5nIGluZm8xID0gIkFMTE9XIHsgW1Rlc3QxXSAoVHlwZTEgXCJuYW1lMVwiIFwiYWN0aW9uMVwiKSB9IFwibmFtZTFcIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGluZm8yID0gIkFMTE9XIHsgW1Rlc3QyXSAoVHlwZTIgXCJuYW1lMlwiIFwiYWN0aW9uMlwiKSB9IFwibmFtZTJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGluZm8zID0gImRlbnkgeyBbVGVzdDNdIChUeXBlMyBcIm5hbWUzXCIgXCJhY3Rpb24zXCIpIH0gXCJuYW1lM1wiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZ1tdIGNvbmRQZXJtSW5mb3MgPSBuZXcgU3RyaW5nW10ge2luZm8xLCBpbmZvMn07Ci0JCVNlY3VyaXR5QWRtaW4gc2VjdXJpdHlBZG1pbiA9IGNyZWF0ZVNlY3VyaXR5QWRtaW4obnVsbCwgY29uZFBlcm1JbmZvcyk7Ci0JCUFycmF5TGlzdCBpbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlSW5mb3MgPSBzZWN1cml0eUFkbWluLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7IGVJbmZvcy5oYXNNb3JlRWxlbWVudHMoKTspCi0JCQlpbmZvcy5hZGQoZUluZm9zLm5leHRFbGVtZW50KCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBpbmZvcyIsIDIsIGluZm9zLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTWlzc2luZyBpbmZvMSIsIGluZm9zLmNvbnRhaW5zKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhpbmZvMSkpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJNaXNzaW5nIGluZm8yIiwgaW5mb3MuY29udGFpbnMoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKGluZm8yKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgaW5kZXggb2YgaW5mbzEiLCAwLCBpbmZvcy5pbmRleE9mKHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhpbmZvMSkpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGluZGV4IG9mIGluZm8yIiwgMSwgaW5mb3MuaW5kZXhPZihzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8oaW5mbzIpKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUgdXBkYXRlID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCB1cGRhdGVJbmZvcyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQlhc3NlcnRUcnVlKCJJbmZvIGxpc3RzIGFyZSBub3QgZXF1YWwiLCB1cGRhdGVJbmZvcy5lcXVhbHMoaW5mb3MpKTsgLy8kTk9OLU5MUy0xJAotCQl1cGRhdGVJbmZvcy5hZGQoc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKGluZm8zKSk7Ci0JCWFzc2VydFRydWUoIkZhaWxlZCBjb21taXQiLCB1cGRhdGUuY29tbWl0KCkpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoRW51bWVyYXRpb24gZUluZm9zID0gc2VjdXJpdHlBZG1pbi5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOyBlSW5mb3MuaGFzTW9yZUVsZW1lbnRzKCk7KQotCQkJaW5mb3MuYWRkKGVJbmZvcy5uZXh0RWxlbWVudCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5mbyBsaXN0cyBhcmUgbm90IGVxdWFsIiwgdXBkYXRlSW5mb3MuZXF1YWxzKGluZm9zKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5jb2RpbmdJbmZvczAyKCkgewotCQlTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4gPSBjcmVhdGVTZWN1cml0eUFkbWluKG51bGwpOwotCi0JCUNvbmRpdGlvbkluZm8gY29uZDEgPSBuZXcgQ29uZGl0aW9uSW5mbygiVGVzdDEiLCBuZXcgU3RyaW5nW10geyJhcmcxIiwgImFyZzIifSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotCQlDb25kaXRpb25JbmZvIGNvbmQyID0gbmV3IENvbmRpdGlvbkluZm8oIlRlc3QxIiwgbmV3IFN0cmluZ1tdIHsiYXJnMSIsICJhcmcyIiwgImFyZzMifSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUNvbmRpdGlvbkluZm8gY29uZDMgPSBuZXcgQ29uZGl0aW9uSW5mbygiVGVzdDEiLCBuZXcgU3RyaW5nW10geyJ0ZXN0IH0gdGVzdCIsICJ9IHRlc3QifSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotCi0JCVBlcm1pc3Npb25JbmZvIHBlcm0xID0gbmV3IFBlcm1pc3Npb25JbmZvKCJUeXBlMSIsICJuYW1lMSIsICJhY3Rpb24xIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJUGVybWlzc2lvbkluZm8gcGVybTIgPSBuZXcgUGVybWlzc2lvbkluZm8oIlR5cGUxIiwgIn0iLCAidGVzdCB9Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotCi0JCS8vIGdvb2QgaW5mbzsgbWl4IGNhc2UgZGVjaXNpb24KLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyB0ZXN0SW5mbzEgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8oIm5hbWUxIiwgbmV3IENvbmRpdGlvbkluZm9bXSB7Y29uZDF9LCBuZXcgUGVybWlzc2lvbkluZm9bXSB7cGVybTF9LCAiYWxsb3ciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUNvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8gdGVzdEluZm8yID0gY2hlY2tHb29kSW5mbygiQWxMb1cgeyBbVGVzdDEgXCJhcmcxXCIgXCJhcmcyXCJdIChUeXBlMSBcIm5hbWUxXCIgXCJhY3Rpb24xXCIpIH0gXCJuYW1lMVwiIiwgc2VjdXJpdHlBZG1pbik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tJbmZvcyh0ZXN0SW5mbzEsIHRlc3RJbmZvMik7Ci0JCXRlc3RJbmZvMSA9IHNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbygibmFtZTEiLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtjb25kMn0sIG5ldyBQZXJtaXNzaW9uSW5mb1tdIHtwZXJtMX0sICJkZW55Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0SW5mbzIgPSBjaGVja0dvb2RJbmZvKCJkRW5ZIHsgW1Rlc3QxIFwiYXJnMVwiIFwiYXJnMlwiIFwiYXJnM1wiXSAoVHlwZTEgXCJuYW1lMVwiIFwiYWN0aW9uMVwiKSB9IFwibmFtZTFcIiIsIHNlY3VyaXR5QWRtaW4pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrSW5mb3ModGVzdEluZm8xLCB0ZXN0SW5mbzIpOwotCi0JCS8vIGdvb2QgaW5mbzsgbm8gY29uZGl0aW9ucwotCQl0ZXN0SW5mbzEgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8oIm5hbWUxIiwgbnVsbCwgbmV3IFBlcm1pc3Npb25JbmZvW10ge3Blcm0xfSwgImRlbnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RJbmZvMiA9IGNoZWNrR29vZEluZm8oImRFblkgeyAoVHlwZTEgXCJuYW1lMVwiIFwiYWN0aW9uMVwiKSB9IFwibmFtZTFcIiIsIHNlY3VyaXR5QWRtaW4pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrSW5mb3ModGVzdEluZm8xLCB0ZXN0SW5mbzIpOwotCi0JCS8vIGdvb2QgaW5mbzsgbm8gbmFtZQotCQl0ZXN0SW5mbzEgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7Y29uZDF9LCBuZXcgUGVybWlzc2lvbkluZm9bXSB7cGVybTF9LCAiYWxsb3ciKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXN0SW5mbzIgPSBjaGVja0dvb2RJbmZvKCJhbGxvdyB7IFtUZXN0MSBcImFyZzFcIiBcImFyZzJcIl0gKFR5cGUxIFwibmFtZTFcIiBcImFjdGlvbjFcIikgfSIsIHNlY3VyaXR5QWRtaW4pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrSW5mb3ModGVzdEluZm8xLCB0ZXN0SW5mbzIpOwotCi0JCS8vIGdvb2QgaW5mbzsgZW1wdHkgbmFtZQotCQl0ZXN0SW5mbzEgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8oIiIsIG5ldyBDb25kaXRpb25JbmZvW10ge2NvbmQxfSwgbmV3IFBlcm1pc3Npb25JbmZvW10ge3Blcm0xfSwgImFsbG93Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0SW5mbzIgPSBjaGVja0dvb2RJbmZvKCJhbGxvdyB7IFtUZXN0MSBcImFyZzFcIiBcImFyZzJcIl0gKFR5cGUxIFwibmFtZTFcIiBcImFjdGlvbjFcIikgfSBcIlwiIiwgc2VjdXJpdHlBZG1pbik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tJbmZvcyh0ZXN0SW5mbzEsIHRlc3RJbmZvMik7Ci0KLQkJLy8gZ29vZCBpbmZvOyBubyB3aGl0ZSBzcGFjZQotCQl0ZXN0SW5mbzEgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8oIm5hbWUxIiwgbmV3IENvbmRpdGlvbkluZm9bXSB7Y29uZDF9LCBuZXcgUGVybWlzc2lvbkluZm9bXSB7cGVybTF9LCAiYWxsb3ciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RJbmZvMiA9IGNoZWNrR29vZEluZm8oImFsbG93e1tUZXN0MSBcImFyZzFcIiBcImFyZzJcIl0oVHlwZTEgXCJuYW1lMVwiIFwiYWN0aW9uMVwiKX1cIm5hbWUxXCIiLCBzZWN1cml0eUFkbWluKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja0luZm9zKHRlc3RJbmZvMSwgdGVzdEluZm8yKTsKLQotCQkvLyBnb29kIGluZm87ICd9JyBpbiBxdW90ZWQgdmFsdWUKLQkJdGVzdEluZm8xID0gc2VjdXJpdHlBZG1pbi5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKCJuYW1lIiwgbmV3IENvbmRpdGlvbkluZm9bXSB7Y29uZDN9LCBuZXcgUGVybWlzc2lvbkluZm9bXSB7cGVybTJ9LCAiYWxsb3ciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RJbmZvMiA9IGNoZWNrR29vZEluZm8oImFsbG93IHsgW1Rlc3QxIFwidGVzdCB9IHRlc3RcIiBcIn0gdGVzdFwiXSAoVHlwZTEgXCJ9XCIgXCJ0ZXN0IH1cIikgfSBcIm5hbWVcIiIsIHNlY3VyaXR5QWRtaW4pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrSW5mb3ModGVzdEluZm8xLCB0ZXN0SW5mbzIpOwotCi0JCS8vIGdvb2QgaW5mbzsgJ30nIGluIHF1b3RlZCB2YWx1ZQotCQl0ZXN0SW5mbzEgPSBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8oIm5hIH0gbWUiLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtjb25kM30sIG5ldyBQZXJtaXNzaW9uSW5mb1tdIHtwZXJtMn0sICJhbGxvdyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdEluZm8yID0gY2hlY2tHb29kSW5mbygiYWxsb3cgeyBbVGVzdDEgXCJ0ZXN0IH0gdGVzdFwiIFwifSB0ZXN0XCJdIChUeXBlMSBcIn1cIiBcInRlc3QgfVwiKSB9IFwibmEgfSBtZVwiIiwgc2VjdXJpdHlBZG1pbik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tJbmZvcyh0ZXN0SW5mbzEsIHRlc3RJbmZvMik7Ci0KLQkJLy8gYmFkIGRlY2lzaW9uIHRlc3QKLQkJY2hlY2tCYWRJbmZvKCJpbnZhbGlkIHsgW1Rlc3QxXSAoVHlwZTEgXCJuYW1lMVwiIFwiYWN0aW9uMVwiKSB9IFwibmFtZTFcIiIsIHNlY3VyaXR5QWRtaW4pOyAvLyROT04tTkxTLTEkCi0JCS8vIGJhZCBjb25kaXRpb247IG1pc3NpbmcgdHlwZQotCQljaGVja0JhZEluZm8oImFsbG93IHsgW10gKFR5cGUxIFwibmFtZTFcIiBcImFjdGlvbjFcIikgfSBcIm5hbWUxXCIiLCBzZWN1cml0eUFkbWluKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja0JhZEluZm8oImRlbnkgeyBbXCJhcmcxXCJdIChUeXBlMSBcIm5hbWUxXCIgXCJhY3Rpb24xXCIpIH0gXCJuYW1lMVwiIiwgc2VjdXJpdHlBZG1pbik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYmFkIHBlcm1pc3Npb24gKG5vbmUpCi0JCWNoZWNrQmFkSW5mbygiQUxMT1cgeyBbVGVzdDEgXCJhcmcxXCIgXCJhcmcyXCJdIH0gXCJuYW1lMVwiIiwgc2VjdXJpdHlBZG1pbik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYmFkIHBlcm1pc3Npb247IG1pc3NpbmcgdHlwZQotCQljaGVja0JhZEluZm8oIkFMTE9XIHsgW1Rlc3QxIFwiYXJnMVwiIFwiYXJnMlwiXSAoKSB9IFwibmFtZTFcIiIsIHNlY3VyaXR5QWRtaW4pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrQmFkSW5mbygiQUxMT1cgeyBbVGVzdDEgXCJhcmcxXCIgXCJhcmcyXCJdIChcIm5hbWUxXCIgXCJhY3Rpb24xXCIpIH0gXCJuYW1lMVwiIiwgc2VjdXJpdHlBZG1pbik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYmFkIG5hbWU7IG5vIHF1b3RlcwotCQljaGVja0JhZEluZm8oIkFsTG9XIHsgW1Rlc3QxIFwiYXJnMVwiIFwiYXJnMlwiXSAoVHlwZTEgXCJuYW1lMVwiIFwiYWN0aW9uMVwiKSB9IG5hbWUxIiwgc2VjdXJpdHlBZG1pbik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYmFkIG5hbWU7IG1pc3NpbmcgZW5kIHF1b3RlCi0JCWNoZWNrQmFkSW5mbygiQWxMb1cgeyBbVGVzdDEgXCJhcmcxXCIgXCJhcmcyXCJdIChUeXBlMSBcIm5hbWUxXCIgXCJhY3Rpb24xXCIpIH0gXCJuYW1lMSIsIHNlY3VyaXR5QWRtaW4pOyAvLyROT04tTkxTLTEkCi0JCS8vIGJhZCBuYW1lOyBtaXNzaW5nIHN0YXJ0IHF1b3RlCi0JCWNoZWNrQmFkSW5mbygiQWxMb1cgeyBbVGVzdDEgXCJhcmcxXCIgXCJhcmcyXCJdIChUeXBlMSBcIm5hbWUxXCIgXCJhY3Rpb24xXCIpIH0gbmFtZTFcIiIsIHNlY3VyaXR5QWRtaW4pOyAvLyROT04tTkxTLTEkCi0JCS8vIGJhZCBuYW1lOyBzaW5nbGUgcXVvdGUKLQkJY2hlY2tCYWRJbmZvKCJBbExvVyB7IFtUZXN0MSBcImFyZzFcIiBcImFyZzJcIl0gKFR5cGUxIFwibmFtZTFcIiBcImFjdGlvbjFcIikgfSBcIiIsIHNlY3VyaXR5QWRtaW4pOyAvLyROT04tTkxTLTEkCi0JCS8vIGJhZCBuYW1lOyBleHRyYSBzdHVmZgotCQljaGVja0JhZEluZm8oIkFsTG9XIHsgW1Rlc3QxIFwiYXJnMVwiIFwiYXJnMlwiXSAoVHlwZTEgXCJuYW1lMVwiIFwiYWN0aW9uMVwiKSB9IFwibmFtZTFcIiBleHRyYWp1bmsiLCBzZWN1cml0eUFkbWluKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI4NjMwNygpIHsKLQkJU2VjdXJpdHlBZG1pbiBzZWN1cml0eUFkbWluID0gY3JlYXRlU2VjdXJpdHlBZG1pbihudWxsKTsKLQkJQnVuZGxlIHRlc3QgPSBpbnN0YWxsVGVzdEJ1bmRsZSgidGVzdC5idWcyODYzMDciKTsgLy8kTk9OLU5MUy0xJAotCQlQcm90ZWN0aW9uRG9tYWluIHBkID0gc2VjdXJpdHlBZG1pbi5jcmVhdGVQcm90ZWN0aW9uRG9tYWluKHRlc3QpOwotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEZpbGVQZXJtaXNzaW9uKCJ0ZXN0IiwgInJlYWQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0UGVybWlzc2lvbihwZCwgbmV3IEFsbFBlcm1pc3Npb24oKSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luZm9zKENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8gdGVzdEluZm8xLCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvIHRlc3RJbmZvMikgewotCQlhc3NlcnRUcnVlKCJJbmZvcyBhcmUgbm90IGVxdWFsOiAiICsgdGVzdEluZm8xLmdldEVuY29kZWQoKSArICIgIiArIHRlc3RJbmZvMi5nZXRFbmNvZGVkKCksIHRlc3RJbmZvMS5lcXVhbHModGVzdEluZm8yKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIkluZm8gaGFzaCBjb2RlIGlzIG5vdCBlcXVhbCIsIHRlc3RJbmZvMS5oYXNoQ29kZSgpLCB0ZXN0SW5mbzIuaGFzaENvZGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tCYWRJbmZvKFN0cmluZyBlbmNvZGVkLCBTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4pIHsKLQkJdHJ5IHsKLQkJCXNlY3VyaXR5QWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhlbmNvZGVkKTsKLQkJCWZhaWwoIkV4cGVjdGluZyBmYWlsIHdpdGggYmFkIGluZm86ICIgKyBlbmNvZGVkKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXByaXZhdGUgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyBjaGVja0dvb2RJbmZvKFN0cmluZyBlbmNvZGVkLCBTZWN1cml0eUFkbWluIHNlY3VyaXR5QWRtaW4pIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzZWN1cml0eUFkbWluLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8oZW5jb2RlZCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGZhaWx1cmUgd2l0aCBnb29kIGluZm86ICIgKyBlbmNvZGVkLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0U01QZXJtaXNzaW9uKEVxdWlub3hTZWN1cml0eU1hbmFnZXIgc20sIFByb3RlY3Rpb25Eb21haW5bXSBwZHMsIFBlcm1pc3Npb24gcGVybWlzc2lvbiwgYm9vbGVhbiBleHBlY3RlZFRvUGFzcykgewotCQlBY2Nlc3NDb250cm9sQ29udGV4dCBhY2MgPSBuZXcgQWNjZXNzQ29udHJvbENvbnRleHQocGRzKTsKLQkJdHJ5IHsKLQkJCXNtLmNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uLCBhY2MpOwotCQkJaWYgKCFleHBlY3RlZFRvUGFzcykKLQkJCQlmYWlsKCJ0ZXN0IHNob3VsZCBub3QgaGF2ZSB0aGUgcGVybWlzc2lvbiAiICsgcGVybWlzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJaWYgKGV4cGVjdGVkVG9QYXNzKQotCQkJCWZhaWwoInRlc3Qgc2hvdWxkIGhhdmUgdGhlIHBlcm1pc3Npb24gIiArIHBlcm1pc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFBlcm1pc3Npb24oUHJvdGVjdGlvbkRvbWFpbiBwZCwgUGVybWlzc2lvbiBwZXJtaXNzaW9uLCBib29sZWFuIGV4cGVjdGVkVG9QYXNzKSB7Ci0JCWlmIChleHBlY3RlZFRvUGFzcyBeIHBkLmltcGxpZXMocGVybWlzc2lvbikpCi0JCQlmYWlsKCJ0ZXN0IHNob3VsZCIgKyAoZXhwZWN0ZWRUb1Bhc3MgPyAiIiA6ICIgbm90IikgKyAiIGhhdmUgdGhlIHBlcm1pc3Npb24gIiArIHBlcm1pc3Npb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JfQotCi0JcHJpdmF0ZSBDb25kaXRpb25JbmZvW10gZ2V0TG9jYXRpb25Db25kaXRpb25zKFN0cmluZyBsb2NhdGlvbiwgYm9vbGVhbiBub3QpIHsKLQkJU3RyaW5nW10gYXJncyA9IG5vdCA/IG5ldyBTdHJpbmdbXSB7bG9jYXRpb24sICIhIn0gOiBuZXcgU3RyaW5nW10ge2xvY2F0aW9ufTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IENvbmRpdGlvbkluZm9bXSB7bmV3IENvbmRpdGlvbkluZm8oIm9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiIsIGFyZ3MpfTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQnVuZGxlIGluc3RhbGxUZXN0QnVuZGxlKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUobmFtZSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gaW5zdGFsbCBidW5kbGU6ICIgKyBuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQnVuZGxlIGluc3RhbGxDb25kaXRpb25CdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbGVyLmluc3RhbGxCdW5kbGUoImV4dC5mcmFtZXdvcmsuYiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5zdGFsbGVyLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7YnVuZGxlfSk7Ci0JCQlyZXR1cm4gYnVuZGxlOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGluc3RhbGwgYnVuZGxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHlhZG1pbi9TZWN1cml0eU1hbmFnZXJUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlY3VyaXR5YWRtaW4vU2VjdXJpdHlNYW5hZ2VyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5OGEwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHlhZG1pbi9TZWN1cml0eU1hbmFnZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlY3VyaXR5YWRtaW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwuY29yZS5GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5sYXVuY2guRXF1aW5veDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGVybWlzc2lvbmFkbWluLlBlcm1pc3Npb25JbmZvOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbC5TdGFydExldmVsOwotCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlNYW5hZ2VyVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQZXJtaXNzaW9uSW5mbyBob3N0RnJhZ21lbnRQZXJtaXNzaW9uID0gbmV3IFBlcm1pc3Npb25JbmZvKEJ1bmRsZVBlcm1pc3Npb24uY2xhc3MuZ2V0TmFtZSgpLCAiKiIsICJob3N0LGZyYWdtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcm1pc3Npb25JbmZvIGhvc3RGcmFnbWVudFByb3ZpZGVQZXJtaXNzaW9uID0gbmV3IFBlcm1pc3Npb25JbmZvKEJ1bmRsZVBlcm1pc3Npb24uY2xhc3MuZ2V0TmFtZSgpLCAiKiIsICJob3N0LGZyYWdtZW50LHByb3ZpZGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVybWlzc2lvbkluZm8gYWxsUGFja2FnZVBlcm1pc3Npb24gPSBuZXcgUGVybWlzc2lvbkluZm8oUGFja2FnZVBlcm1pc3Npb24uY2xhc3MuZ2V0TmFtZSgpLCAiKiIsICJpbXBvcnQsZXhwb3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcm1pc3Npb25JbmZvIGltcG9ydFBhY2thZ2VQZXJtaXNzaW9uID0gbmV3IFBlcm1pc3Npb25JbmZvKFBhY2thZ2VQZXJtaXNzaW9uLmNsYXNzLmdldE5hbWUoKSwgIioiLCAiaW1wb3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcm1pc3Npb25JbmZvIGltcG9ydEZyYW1ld29ya1BhY2thZ2VQZXJtaXNzaW9uID0gbmV3IFBlcm1pc3Npb25JbmZvKFBhY2thZ2VQZXJtaXNzaW9uLmNsYXNzLmdldE5hbWUoKSwgIm9yZy5vc2dpLmZyYW1ld29yayIsICJpbXBvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBQb2xpY3kgcHJldmlvdXNQb2xpY3k7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlY3VyaXR5TWFuYWdlclRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpCi0JCQlmYWlsKCJDYW5ub3QgdGVzdCB3aXRoIHNlY3VyaXR5IG1hbmFnZXIgc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJcHJldmlvdXNQb2xpY3kgPSBQb2xpY3kuZ2V0UG9saWN5KCk7Ci0JCWZpbmFsIFBlcm1pc3Npb24gYWxsUGVybWlzc2lvbiA9IG5ldyBBbGxQZXJtaXNzaW9uKCk7Ci0JCWZpbmFsIFBlcm1pc3Npb25Db2xsZWN0aW9uIGFsbFBlcm1pc3Npb25zID0gbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uKCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODEzMTM0OTQ5NDcwODI3N0w7Ci0KLQkJCS8vIEEgc2ltcGxlIFBlcm1pc3Npb25Db2xsZWN0aW9uIHRoYXQgb25seSBoYXMgQWxsUGVybWlzc2lvbgotCQkJcHVibGljIHZvaWQgYWRkKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewotCQkJCS8vbm8gYWRkaW5nIHRvIHRoaXMgcG9saWN5Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGltcGxpZXMoUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJCQlyZXR1cm4gbmV3IEVudW1lcmF0aW9uKCkgewotCQkJCQlpbnQgY3VyID0gMDsKLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCQkJCQlyZXR1cm4gY3VyIDwgMTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCQkJCQlpZiAoY3VyID09IDApIHsKLQkJCQkJCQljdXIgPSAxOwotCQkJCQkJCXJldHVybiBhbGxQZXJtaXNzaW9uOwotCQkJCQkJfQotCQkJCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0KLQkJUG9saWN5LnNldFBvbGljeShuZXcgUG9saWN5KCkgewotCi0JCQlwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoQ29kZVNvdXJjZSBjb2Rlc291cmNlKSB7Ci0JCQkJcmV0dXJuIGFsbFBlcm1pc3Npb25zOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0KLQotCQl9KTsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpCi0JCQlTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOwotCQlQb2xpY3kuc2V0UG9saWN5KHByZXZpb3VzUG9saWN5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlU2VjdXJpdHlNYW5hZ2VyMDEoKSB7Ci0JCUZpbGUgY29uZmlnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdEVuYWJsZVNlY3VyaXR5TWFuYWdlcjAxIik7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydGllcyBjb25maWd1cmF0aW9uID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TVE9SQUdFLCBjb25maWcuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NFQ1VSSVRZLCBGcmFtZXdvcmsuU0VDVVJJVFlfT1NHSSk7Ci0JCUVxdWlub3ggZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5pbml0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBvbiBpbml0KCkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoIlNlY3VyaXR5TWFuYWdlciBpcyBudWxsIiwgU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzaG91bGQgYmUgaW4gdGhlIFNUQVJUSU5HIHN0YXRlCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5TVEFSVElORywgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcHV0IHRoZSBmcmFtZXdvcmsgYmFjayB0byB0aGUgUkVTT0xWRUQgc3RhdGUKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJTZWN1cml0eU1hbmFnZXIgaXMgbm90IG51bGwiLCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVuYWJsZVNlY3VyaXR5TWFuYWdlcjAyKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCS8vIGNyZWF0ZS9zdGFydC9zdG9wL3N0YXJ0L3N0b3AgdGVzdAotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RFbmFibGVTZWN1cml0eU1hbmFnZXIwMiIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TRUNVUklUWSwgRnJhbWV3b3JrLlNFQ1VSSVRZX09TR0kpOwotCQlFcXVpbm94IGVxdWlub3ggPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gb24gaW5pdCgpIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFzc2VydE5vdE51bGwoIlNlY3VyaXR5TWFuYWdlciBpcyBudWxsIiwgU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzaG91bGQgYmUgaW4gdGhlIFNUQVJUSU5HIHN0YXRlCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5TVEFSVElORywgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZUNvbnRleHQgc3lzdGVtQ29udGV4dCA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlhc3NlcnROb3ROdWxsKCJTeXN0ZW0gY29udGV4dCBpcyBudWxsIiwgc3lzdGVtQ29udGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdHJ5IGluc3RhbGxpbmcgaG9zdCBhbmQgZnJhZ21lbnQgdG8gdGVzdCBidWcgMjQ1Njc4Ci0JCVN0cmluZyBsb2NhdGlvblNlY3VyaXR5QSA9IGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigic2VjdXJpdHkuYSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsb2NhdGlvblNlY3VyaXR5QUZyYWdBID0gaW5zdGFsbGVyLmdldEJ1bmRsZUxvY2F0aW9uKCJzZWN1cml0eS5hLmZyYWcuYSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCB0aGUgc2VjdXJpdHkgZm9yIHRoZSBob3N0IGFuZCBmcmFnbWVudAotCQlDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbiBjYSA9IChDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbikgc3lzdGVtQ29udGV4dC5nZXRTZXJ2aWNlKHN5c3RlbUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlIHVwZGF0ZSA9IGNhLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlMaXN0IHJvd3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJcm93cy5hZGQoY2EubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBudWxsLCBuZXcgUGVybWlzc2lvbkluZm9bXSB7aG9zdEZyYWdtZW50UGVybWlzc2lvbiwgYWxsUGFja2FnZVBlcm1pc3Npb259LCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkFMTE9XKSk7Ci0JCWFzc2VydFRydWUoIkNhbm5vdCBjb21taXQgcm93cyIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgc2VjdXJpdHlBID0gc3lzdGVtQ29udGV4dC5pbnN0YWxsQnVuZGxlKGxvY2F0aW9uU2VjdXJpdHlBKTsKLQkJc3lzdGVtQ29udGV4dC5pbnN0YWxsQnVuZGxlKGxvY2F0aW9uU2VjdXJpdHlBRnJhZ0EpOwotCi0JCWVxdWlub3guc3RhcnQoKTsKLQotCQl0cnkgewotCQkJc2VjdXJpdHlBLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgc2VjdXJpdHlBIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHB1dCB0aGUgZnJhbWV3b3JrIGJhY2sgdG8gdGhlIFJFU09MVkVEIHN0YXRlCi0JCQllcXVpbm94LnN0b3AoKTsKLQotCQkJdHJ5IHsKLQkJCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoIlNlY3VyaXR5TWFuYWdlciBpcyBub3QgbnVsbCIsIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlU2VjdXJpdHlNYW5hZ2VyMDMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJRmlsZSBjb25maWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZXN0RW5hYmxlU2VjdXJpdHlNYW5hZ2VyMDMiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU0VDVVJJVFksIEZyYW1ld29yay5TRUNVUklUWV9PU0dJKTsKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0JCXRyeSB7Ci0JCQllcXVpbm94LmluaXQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9uIGluaXQoKSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlhc3NlcnROb3ROdWxsKCJTZWN1cml0eU1hbmFnZXIgaXMgbnVsbCIsIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2hvdWxkIGJlIGluIHRoZSBTVEFSVElORyBzdGF0ZQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuU1RBUlRJTkcsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRyeSBpbnN0YWxsaW5nIGEgYnVuZGxlIHRvIHRlc3RzIGJ1ZyAKLQkJU3RyaW5nIGxvY2F0aW9uU2VjdXJpdHlBID0gaW5zdGFsbGVyLmdldEJ1bmRsZUxvY2F0aW9uKCJzZWN1cml0eS5hIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IHRoZSBzZWN1cml0eSBmb3IgdGhlIGJ1bmRsZQotCQlDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbiBjYSA9IChDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbikgc3lzdGVtQ29udGV4dC5nZXRTZXJ2aWNlKHN5c3RlbUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlIHVwZGF0ZSA9IGNhLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlMaXN0IHJvd3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJcm93cy5hZGQoY2EubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBudWxsLCBuZXcgUGVybWlzc2lvbkluZm9bXSB7aG9zdEZyYWdtZW50UGVybWlzc2lvbiwgaW1wb3J0UGFja2FnZVBlcm1pc3Npb259LCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkFMTE9XKSk7Ci0JCWFzc2VydFRydWUoIkNhbm5vdCBjb21taXQgcm93cyIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgc2VjdXJpdHlBID0gc3lzdGVtQ29udGV4dC5pbnN0YWxsQnVuZGxlKGxvY2F0aW9uU2VjdXJpdHlBKTsKLQotCQllcXVpbm94LnN0YXJ0KCk7Ci0JCVBhY2thZ2VBZG1pbiBwYSA9IChQYWNrYWdlQWRtaW4pIHN5c3RlbUNvbnRleHQuZ2V0U2VydmljZShzeXN0ZW1Db250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCXRyeSB7Ci0JCQlhc3NlcnRUcnVlKHBhLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7c2VjdXJpdHlBfSkpOwotCQkJRXhwb3J0ZWRQYWNrYWdlW10gZXBzID0gcGEuZ2V0RXhwb3J0ZWRQYWNrYWdlcyhzZWN1cml0eUEpOwotCQkJYXNzZXJ0TnVsbCgiRm91bmQgdW5leHBlY3RlZCBleHBvcnRzIiwgZXBzKTsgLy8kTk9OLU5MUy0xJAotCQkJUmVxdWlyZWRCdW5kbGVbXSByYnMgPSBwYS5nZXRSZXF1aXJlZEJ1bmRsZXMoc2VjdXJpdHlBLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCWFzc2VydE51bGwoIkZvdW5kIHVuZXhwZWN0ZWQgcmVxdWlyZWQgYnVuZGxlIiwgcmJzKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gZ3JhbnQgZXhwb3J0IHBlcm1pc3Npb24KLQkJCXVwZGF0ZSA9IGNhLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQkJcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQkJcm93cy5jbGVhcigpOwotCQkJcm93cy5hZGQoY2EubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBudWxsLCBuZXcgUGVybWlzc2lvbkluZm9bXSB7aG9zdEZyYWdtZW50UHJvdmlkZVBlcm1pc3Npb24sIGFsbFBhY2thZ2VQZXJtaXNzaW9ufSwgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQkJYXNzZXJ0VHJ1ZSgiQ2Fubm90IGNvbW1pdCByb3dzIiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlzZWN1cml0eUEudW5pbnN0YWxsKCk7Ci0JCQlzZWN1cml0eUEgPSBzeXN0ZW1Db250ZXh0Lmluc3RhbGxCdW5kbGUobG9jYXRpb25TZWN1cml0eUEpOwotCQkJYXNzZXJ0VHJ1ZShwYS5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge3NlY3VyaXR5QX0pKTsKLQkJCWVwcyA9IHBhLmdldEV4cG9ydGVkUGFja2FnZXMoc2VjdXJpdHlBKTsKLQkJCWFzc2VydE5vdE51bGwoIkRpZCBub3QgZmluZCBleHBlY3RlZCBleHBvcnRzIiwgZXBzKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgZXhwb3J0cyBmb3VuZCIsIDEsIGVwcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQlyYnMgPSBwYS5nZXRSZXF1aXJlZEJ1bmRsZXMoc2VjdXJpdHlBLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCWFzc2VydE5vdE51bGwoIkRpZCBub3QgZmluZCByZXF1aXJlZCBidW5kbGUiLCBlcHMpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiByZXF1aXJlZCBidW5kbGVzIGZvdW5kIiwgMSwgcmJzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9IGZpbmFsbHkgewotCQkJLy8gcHV0IHRoZSBmcmFtZXdvcmsgYmFjayB0byB0aGUgUkVTT0xWRUQgc3RhdGUKLQkJCWVxdWlub3guc3RvcCgpOwotCi0JCQl0cnkgewotCQkJCWVxdWlub3gud2FpdEZvclN0b3AoMTAwMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiU2VjdXJpdHlNYW5hZ2VyIGlzIG5vdCBudWxsIiwgU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmFibGVTZWN1cml0eU1hbmFnZXIwNCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RFbmFibGVTZWN1cml0eU1hbmFnZXIwNCIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TRUNVUklUWSwgRnJhbWV3b3JrLlNFQ1VSSVRZX09TR0kpOwotCQlFcXVpbm94IGVxdWlub3ggPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gb24gaW5pdCgpIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFzc2VydE5vdE51bGwoIlNlY3VyaXR5TWFuYWdlciBpcyBudWxsIiwgU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzaG91bGQgYmUgaW4gdGhlIFNUQVJUSU5HIHN0YXRlCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5TVEFSVElORywgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZUNvbnRleHQgc3lzdGVtQ29udGV4dCA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlhc3NlcnROb3ROdWxsKCJTeXN0ZW0gY29udGV4dCBpcyBudWxsIiwgc3lzdGVtQ29udGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdHJ5IGluc3RhbGxpbmcgYSBidW5kbGUgdG8gdGVzdHMgYnVnIAotCQlTdHJpbmcgbG9jYXRpb25MaW5rQSA9IGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigidGVzdC5saW5rLmEiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbG9jYXRpb25MaW5rQUNsaWVudCA9IGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigidGVzdC5saW5rLmEuY2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgdGhlIHNlY3VyaXR5IGZvciB0aGUgYnVuZGxlcwotCQlDb25kaXRpb25JbmZvIGxpbmtBQ29uZGl0aW9uID0gbmV3IENvbmRpdGlvbkluZm8oQnVuZGxlTG9jYXRpb25Db25kaXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBuZXcgU3RyaW5nW10ge2xvY2F0aW9uTGlua0F9KTsKLQkJQ29uZGl0aW9uSW5mbyBsaW5rQUNsaWVudENvbmRpdGlvbiA9IG5ldyBDb25kaXRpb25JbmZvKEJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uLmNsYXNzLmdldE5hbWUoKSwgbmV3IFN0cmluZ1tdIHtsb2NhdGlvbkxpbmtBQ2xpZW50fSk7Ci0JCVBlcm1pc3Npb25JbmZvIGZpbHRlclBlcm1pc3Npb24gPSBuZXcgUGVybWlzc2lvbkluZm8oUGFja2FnZVBlcm1pc3Npb24uY2xhc3MuZ2V0TmFtZSgpLCAiKCYobmFtZT10ZXN0LmxpbmsuYSkocGFja2FnZS5uYW1lPXRlc3QubGluay4qKSkiLCAiaW1wb3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbiBjYSA9IChDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbikgc3lzdGVtQ29udGV4dC5nZXRTZXJ2aWNlKHN5c3RlbUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlIHVwZGF0ZSA9IGNhLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQlMaXN0IHJvd3MgPSB1cGRhdGUuZ2V0Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MoKTsKLQkJcm93cy5hZGQoY2EubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtsaW5rQUNvbmRpdGlvbn0sIG5ldyBQZXJtaXNzaW9uSW5mb1tdIHtob3N0RnJhZ21lbnRQcm92aWRlUGVybWlzc2lvbiwgYWxsUGFja2FnZVBlcm1pc3Npb259LCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkFMTE9XKSk7Ci0JCXJvd3MuYWRkKGNhLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbmV3IENvbmRpdGlvbkluZm9bXSB7bGlua0FDbGllbnRDb25kaXRpb259LCBuZXcgUGVybWlzc2lvbkluZm9bXSB7aW1wb3J0RnJhbWV3b3JrUGFja2FnZVBlcm1pc3Npb24sIGZpbHRlclBlcm1pc3Npb259LCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkFMTE9XKSk7Ci0JCWFzc2VydFRydWUoIkNhbm5vdCBjb21taXQgcm93cyIsIHVwZGF0ZS5jb21taXQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgbGlua0EgPSBzeXN0ZW1Db250ZXh0Lmluc3RhbGxCdW5kbGUobG9jYXRpb25MaW5rQSk7Ci0JCUJ1bmRsZSBsaW5rQUNsaWVudCA9IHN5c3RlbUNvbnRleHQuaW5zdGFsbEJ1bmRsZShsb2NhdGlvbkxpbmtBQ2xpZW50KTsKLQkJZXF1aW5veC5zdGFydCgpOwotCQlQYWNrYWdlQWRtaW4gcGEgPSAoUGFja2FnZUFkbWluKSBzeXN0ZW1Db250ZXh0LmdldFNlcnZpY2Uoc3lzdGVtQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZShwYS5yZXNvbHZlQnVuZGxlcyhuZXcgQnVuZGxlW10ge2xpbmtBLCBsaW5rQUNsaWVudH0pKTsKLQkJCS8vIGNoYW5nZSBpbXBvcnQgcGVybWlzc2lvbiB0byBmYWlsIGZpbHRlciBtYXRjaAotCQkJZmlsdGVyUGVybWlzc2lvbiA9IG5ldyBQZXJtaXNzaW9uSW5mbyhQYWNrYWdlUGVybWlzc2lvbi5jbGFzcy5nZXROYW1lKCksICIoJihuYW1lPWZhaWwubWF0Y2gpKHBhY2thZ2UubmFtZT10ZXN0LmxpbmsuKikpIiwgImltcG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXVwZGF0ZSA9IGNhLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSgpOwotCQkJcm93cyA9IHVwZGF0ZS5nZXRDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcygpOwotCQkJcm93cy5jbGVhcigpOwotCQkJcm93cy5hZGQoY2EubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhudWxsLCBuZXcgQ29uZGl0aW9uSW5mb1tdIHtsaW5rQUNvbmRpdGlvbn0sIG5ldyBQZXJtaXNzaW9uSW5mb1tdIHtob3N0RnJhZ21lbnRQcm92aWRlUGVybWlzc2lvbiwgYWxsUGFja2FnZVBlcm1pc3Npb259LCBDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvLkFMTE9XKSk7Ci0JCQlyb3dzLmFkZChjYS5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25JbmZvKG51bGwsIG5ldyBDb25kaXRpb25JbmZvW10ge2xpbmtBQ2xpZW50Q29uZGl0aW9ufSwgbmV3IFBlcm1pc3Npb25JbmZvW10ge2ltcG9ydEZyYW1ld29ya1BhY2thZ2VQZXJtaXNzaW9uLCBmaWx0ZXJQZXJtaXNzaW9ufSwgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQkJYXNzZXJ0VHJ1ZSgiQ2Fubm90IGNvbW1pdCByb3dzIiwgdXBkYXRlLmNvbW1pdCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcGEucmVmcmVzaFBhY2thZ2VzKG5ldyBCdW5kbGVbXSB7bGlua0EsIGxpbmtBQ2xpZW50fSk7Ci0JCQkvLyBoYWNrIHRvIHdhaXQgZm9yIHJlZnJlc2ggdG8gZW5kCi0JCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCQlhc3NlcnRFcXVhbHMoImxpbmtBIGhhcyB3cm9uZyBzdGF0ZSIsIEJ1bmRsZS5SRVNPTFZFRCwgbGlua0EuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygibGlua0FDbGllbnQgaGFzIHdyb25nIHN0YXRlIiwgQnVuZGxlLklOU1RBTExFRCwgbGlua0FDbGllbnQuZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gZmFpbAotCQkJZmFpbCgiaW50ZXJydXB0ZWQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJLy8gcHV0IHRoZSBmcmFtZXdvcmsgYmFjayB0byB0aGUgUkVTT0xWRUQgc3RhdGUKLQkJCWVxdWlub3guc3RvcCgpOwotCi0JCQl0cnkgewotCQkJCWVxdWlub3gud2FpdEZvclN0b3AoMTAwMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuUkVTT0xWRUQsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiU2VjdXJpdHlNYW5hZ2VyIGlzIG5vdCBudWxsIiwgU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmFibGVTZWN1cml0eU1hbmFnZXIwNSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU0VDVVJJVFksIEZyYW1ld29yay5TRUNVUklUWV9PU0dJKTsKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0JCXRyeSB7Ci0JCQllcXVpbm94LmluaXQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9uIGluaXQoKSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlhc3NlcnROb3ROdWxsKCJTZWN1cml0eU1hbmFnZXIgaXMgbnVsbCIsIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2hvdWxkIGJlIGluIHRoZSBTVEFSVElORyBzdGF0ZQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuU1RBUlRJTkcsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRyeSBpbnN0YWxsaW5nIGEgYnVuZGxlIHRvIHRlc3RzIGJ1ZyAKLQkJU3RyaW5nIGxvY2F0aW9uTGlua0EgPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QubGluay5hIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxvY2F0aW9uTGlua0FDbGllbnQgPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInRlc3QubGluay5hLmNsaWVudCIpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlIGxpbmtBID0gc3lzdGVtQ29udGV4dC5pbnN0YWxsQnVuZGxlKGxvY2F0aW9uTGlua0EpOwotCQlCdW5kbGUgbGlua0FDbGllbnQgPSBzeXN0ZW1Db250ZXh0Lmluc3RhbGxCdW5kbGUobG9jYXRpb25MaW5rQUNsaWVudCk7Ci0JCWVxdWlub3guc3RhcnQoKTsKLQotCQl0cnkgewotCQkJUGFja2FnZUFkbWluIHBhID0gKFBhY2thZ2VBZG1pbikgc3lzdGVtQ29udGV4dC5nZXRTZXJ2aWNlKHN5c3RlbUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCQlhc3NlcnRUcnVlKHBhLnJlc29sdmVCdW5kbGVzKG5ldyBCdW5kbGVbXSB7bGlua0EsIGxpbmtBQ2xpZW50fSkpOwotCQkJbGlua0EudW5pbnN0YWxsKCk7Ci0JCQlsaW5rQUNsaWVudC51bmluc3RhbGwoKTsKLQotCQkJbGlua0EgPSBzeXN0ZW1Db250ZXh0Lmluc3RhbGxCdW5kbGUobG9jYXRpb25MaW5rQSk7Ci0JCQlsaW5rQUNsaWVudCA9IHN5c3RlbUNvbnRleHQuaW5zdGFsbEJ1bmRsZShsb2NhdGlvbkxpbmtBQ2xpZW50KTsKLQkJCWFzc2VydFRydWUocGEucmVzb2x2ZUJ1bmRsZXMobmV3IEJ1bmRsZVtdIHtsaW5rQSwgbGlua0FDbGllbnR9KSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBwdXQgdGhlIGZyYW1ld29yayBiYWNrIHRvIHRoZSBSRVNPTFZFRCBzdGF0ZQotCQkJZXF1aW5veC5zdG9wKCk7Ci0KLQkJCXRyeSB7Ci0JCQkJZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJTZWN1cml0eU1hbmFnZXIgaXMgbm90IG51bGwiLCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2FsaXphdGlvbjAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCS8vIGNyZWF0ZS9zdGFydC9zdG9wL3N0YXJ0L3N0b3AgdGVzdAotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RMb2NhbGl6YXRpb24wMSIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgY29uZmlndXJhdGlvbiA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU1RPUkFHRSwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TRUNVUklUWSwgRnJhbWV3b3JrLlNFQ1VSSVRZX09TR0kpOwotCQlFcXVpbm94IGVxdWlub3ggPSBuZXcgRXF1aW5veChjb25maWd1cmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWVxdWlub3guaW5pdCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gb24gaW5pdCgpIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3NlcnROb3ROdWxsKCJTZWN1cml0eU1hbmFnZXIgaXMgbnVsbCIsIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2hvdWxkIGJlIGluIHRoZSBTVEFSVElORyBzdGF0ZQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlIGZvciBTeXN0ZW1CdW5kbGUiLCBCdW5kbGUuU1RBUlRJTkcsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRyeSBpbnN0YWxsaW5nIGhvc3QgYW5kIGZyYWdtZW50IHRvIHRlc3QgYnVnIDI0NTY3OAotCQlTdHJpbmcgbG9jYXRpb25TZWN1cml0eUEgPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInNlY3VyaXR5LmEiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbG9jYXRpb25TZWN1cml0eUFGcmFnQSA9IGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigic2VjdXJpdHkuYS5mcmFnLmEiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzZXQgdGhlIHNlY3VyaXR5IGZvciB0aGUgaG9zdCBhbmQgZnJhZ21lbnQKLQkJQ29uZGl0aW9uYWxQZXJtaXNzaW9uQWRtaW4gY2EgPSAoQ29uZGl0aW9uYWxQZXJtaXNzaW9uQWRtaW4pIHN5c3RlbUNvbnRleHQuZ2V0U2VydmljZShzeXN0ZW1Db250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoQ29uZGl0aW9uYWxQZXJtaXNzaW9uQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCUNvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSB1cGRhdGUgPSBjYS5uZXdDb25kaXRpb25hbFBlcm1pc3Npb25VcGRhdGUoKTsKLQkJTGlzdCByb3dzID0gdXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7Ci0JCXJvd3MuYWRkKGNhLm5ld0NvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8obnVsbCwgbnVsbCwgbmV3IFBlcm1pc3Npb25JbmZvW10ge2hvc3RGcmFnbWVudFBlcm1pc3Npb24sIGFsbFBhY2thZ2VQZXJtaXNzaW9ufSwgQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mby5BTExPVykpOwotCQlhc3NlcnRUcnVlKCJDYW5ub3QgY29tbWl0IHJvd3MiLCB1cGRhdGUuY29tbWl0KCkpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlIHNlY3VyaXR5QSA9IHN5c3RlbUNvbnRleHQuaW5zdGFsbEJ1bmRsZShsb2NhdGlvblNlY3VyaXR5QSk7Ci0JCXN5c3RlbUNvbnRleHQuaW5zdGFsbEJ1bmRsZShsb2NhdGlvblNlY3VyaXR5QUZyYWdBKTsKLQotCQllcXVpbm94LnN0YXJ0KCk7Ci0KLQkJdHJ5IHsKLQkJCXNlY3VyaXR5QS5zdGFydCgpOwotCQkJRGljdGlvbmFyeSBoZWFkZXJzID0gc2VjdXJpdHlBLmdldEhlYWRlcnMoImVuX1VTIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgaGVhZGVycy5nZXQoQ29uc3RhbnRzLkJVTkRMRV9OQU1FKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgQnVuZGxlLU5hbWUiLCAiZW5fVVMiLCBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWhlYWRlcnMgPSBzZWN1cml0eUEuZ2V0SGVhZGVycygiZW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KENvbnN0YW50cy5CVU5ETEVfTkFNRSk7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIEJ1bmRsZS1OYW1lIiwgImRlZmF1bHQiLCBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgc2VjdXJpdHlBIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHB1dCB0aGUgZnJhbWV3b3JrIGJhY2sgdG8gdGhlIFJFU09MVkVEIHN0YXRlCi0JCQllcXVpbm94LnN0b3AoKTsKLQotCQkJdHJ5IHsKLQkJCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoIlNlY3VyaXR5TWFuYWdlciBpcyBub3QgbnVsbCIsIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjU0NjAwKCkgewotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RCdWcyNTQ2MDAiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvcGVydGllcygpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NUT1JBR0UsIGNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWNvbmZpZ3VyYXRpb24ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfU0VDVVJJVFksIEZyYW1ld29yay5TRUNVUklUWV9PU0dJKTsKLQkJRXF1aW5veCBlcXVpbm94ID0gbmV3IEVxdWlub3goY29uZmlndXJhdGlvbik7Ci0JCXRyeSB7Ci0JCQllcXVpbm94LmluaXQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9uIGluaXQoKSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiU2VjdXJpdHlNYW5hZ2VyIGlzIG51bGwiLCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIHNob3VsZCBiZSBpbiB0aGUgU1RBUlRJTkcgc3RhdGUKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlNUQVJUSU5HLCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGhlIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZUNvbnRleHQgc3lzdGVtQ29udGV4dCA9IGVxdWlub3guZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlhc3NlcnROb3ROdWxsKCJTeXN0ZW0gY29udGV4dCBpcyBudWxsIiwgc3lzdGVtQ29udGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgc2VjdXJpdHlCID0gbnVsbDsKLQkJbG9uZyBpZEIgPSAtMTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsb2NhdGlvblNlY3VyaXR5QSA9IGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigic2VjdXJpdHkuYSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbG9jYXRpb25TZWN1cml0eUIgPSBpbnN0YWxsZXIuZ2V0QnVuZGxlTG9jYXRpb24oInNlY3VyaXR5LmIiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3lzdGVtQ29udGV4dC5pbnN0YWxsQnVuZGxlKGxvY2F0aW9uU2VjdXJpdHlBKTsKLQkJCXNlY3VyaXR5QiA9IHN5c3RlbUNvbnRleHQuaW5zdGFsbEJ1bmRsZShsb2NhdGlvblNlY3VyaXR5Qik7Ci0JCQlpZEIgPSBzZWN1cml0eUIuZ2V0QnVuZGxlSWQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBpbnN0YWxsIHNlY3VyaXR5IHRlc3QgYnVuZGxlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJc2VjdXJpdHlCLnN0YXJ0KCk7Ci0JCQlzZWN1cml0eUIuc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHNlY3VyaXR5LmIgYnVuZGxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHB1dCB0aGUgZnJhbWV3b3JrIGJhY2sgdG8gdGhlIFJFU09MVkVEIHN0YXRlCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJvcnIgc3RvcHBpbmcgZnJhbWV3b3JrIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXF1aW5veC53YWl0Rm9yU3RvcCgxMDAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW50ZXJydXB0ZWQgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQllcXVpbm94LnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgdGhlIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLkFDVElWRSwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCXNlY3VyaXR5QiA9IHN5c3RlbUNvbnRleHQuZ2V0QnVuZGxlKGlkQik7Ci0KLQkJdHJ5IHsKLQkJCXNlY3VyaXR5Qi5zdGFydCgpOwotCQkJc2VjdXJpdHlCLnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzdGFydCBzZWN1cml0eS5iIGJ1bmRsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJZXF1aW5veC5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVyb3JyIHN0b3BwaW5nIGZyYW1ld29yayIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWVxdWlub3gud2FpdEZvclN0b3AoMTAwMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGF0ZSBmb3IgU3lzdGVtQnVuZGxlIiwgQnVuZGxlLlJFU09MVkVELCBlcXVpbm94LmdldFN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoIlNlY3VyaXR5TWFuYWdlciBpcyBub3QgbnVsbCIsIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjg3NzUwKCkgewotCQlGaWxlIGNvbmZpZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoZ2V0TmFtZSgpKTsKLQkJUHJvcGVydGllcyBjb25maWd1cmF0aW9uID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJY29uZmlndXJhdGlvbi5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19TVE9SQUdFLCBjb25maWcuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQljb25maWd1cmF0aW9uLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1NFQ1VSSVRZLCBGcmFtZXdvcmsuU0VDVVJJVFlfT1NHSSk7Ci0JCUVxdWlub3ggZXF1aW5veCA9IG5ldyBFcXVpbm94KGNvbmZpZ3VyYXRpb24pOwotCQl0cnkgewotCQkJZXF1aW5veC5pbml0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBvbiBpbml0KCkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydE5vdE51bGwoIlNlY3VyaXR5TWFuYWdlciBpcyBudWxsIiwgU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzaG91bGQgYmUgaW4gdGhlIFNUQVJUSU5HIHN0YXRlCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5TVEFSVElORywgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZXF1aW5veC5zdGFydCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5BQ1RJVkUsIGVxdWlub3guZ2V0U3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGVDb250ZXh0IHN5c3RlbUNvbnRleHQgPSBlcXVpbm94LmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIGNvbnRleHQgaXMgbnVsbCIsIHN5c3RlbUNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlIHRlc3RCdW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIGxvY2F0aW9uVGVzdEJ1bmRsZSA9IGluc3RhbGxlci5nZXRCdW5kbGVMb2NhdGlvbigidGVzdC5idWcyODc3NTAiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGVzdEJ1bmRsZSA9IHN5c3RlbUNvbnRleHQuaW5zdGFsbEJ1bmRsZShsb2NhdGlvblRlc3RCdW5kbGUpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGluc3RhbGwgc2VjdXJpdHkgdGVzdCBidW5kbGVzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQl0ZXN0QnVuZGxlLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc3RhcnQgc2VjdXJpdHkuYiBidW5kbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0YXJ0TGV2ZWwgc2wgPSAoU3RhcnRMZXZlbCkgc3lzdGVtQ29udGV4dC5nZXRTZXJ2aWNlKHN5c3RlbUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShTdGFydExldmVsLmNsYXNzLmdldE5hbWUoKSkpOwotCQlpZiAoc2wuZ2V0U3RhcnRMZXZlbCgpICE9IDEwKQotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGFydGxldmVsIiwgMTAsIHNsLmdldFN0YXJ0TGV2ZWwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWVxdWlub3guc3RvcCgpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBlcm9yciBzdG9wcGluZyBmcmFtZXdvcmsiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcXVpbm94LndhaXRGb3JTdG9wKDEwMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhdGUgZm9yIFN5c3RlbUJ1bmRsZSIsIEJ1bmRsZS5SRVNPTFZFRCwgZXF1aW5veC5nZXRTdGF0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJTZWN1cml0eU1hbmFnZXIgaXMgbm90IG51bGwiLCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VjdXJpdHlhZG1pbi9UZXN0UGVybWlzc2lvblN0b3JhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eWFkbWluL1Rlc3RQZXJtaXNzaW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjdkOWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZWN1cml0eWFkbWluL1Rlc3RQZXJtaXNzaW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlY3VyaXR5YWRtaW47Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmFkYXB0b3IuUGVybWlzc2lvblN0b3JhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UGVybWlzc2lvblN0b3JhZ2UgaW1wbGVtZW50cyBQZXJtaXNzaW9uU3RvcmFnZSB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbmRpdGlvblBlcm1pc3Npb25JbmZvOwotCi0JcHVibGljIFRlc3RQZXJtaXNzaW9uU3RvcmFnZShTdHJpbmdbXSBjb25kaXRpb25QZXJtaXNzaW9uSW5mbykgewotCQl0aGlzLmNvbmRpdGlvblBlcm1pc3Npb25JbmZvID0gY29uZGl0aW9uUGVybWlzc2lvbkluZm87Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbmRpdGlvblBlcm1pc3Npb25JbmZvOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMb2NhdGlvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQZXJtaXNzaW9uRGF0YShTdHJpbmcgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUNvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKFN0cmluZ1tdIGluZm9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljb25kaXRpb25QZXJtaXNzaW9uSW5mbyA9IGluZm9zOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UGVybWlzc2lvbkRhdGEoU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmdbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcmVnaXN0cnkvU2VydmljZUV4Y2VwdGlvblRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXJlZ2lzdHJ5L1NlcnZpY2VFeGNlcHRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2M3MzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcmVnaXN0cnkvU2VydmljZUV4Y2VwdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUV4Y2VwdGlvblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTZXJ2aWNlRXhjZXB0aW9uVGVzdHMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlRXhjZXB0aW9uMDEoKSB7Ci0JCWZpbmFsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSA9ICJ0ZXN0U2VydmljZUV4Y2VwdGlvbjAxIjsgLy8kTk9OLU5MUy0xJAotCQkvLyB0ZXN0IGEgc2VydmljZSBmYWN0b3J5IHdoaWNoIHJldHVybnMgd3Jvbmcgb2JqZWN0IHR5cGVzCi0JCVNlcnZpY2VFeGNlcHRpb25TZXJ2aWNlRmFjdG9yeSB3cm9uZ09iamVjdEZhY3RvcnkgPSBuZXcgU2VydmljZUV4Y2VwdGlvblNlcnZpY2VGYWN0b3J5KCJBIFN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KCJuYW1lIiwgdGVzdE1ldGhvZE5hbWUpOyAvLyROT04tTkxTLTEkIAotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSwgd3JvbmdPYmplY3RGYWN0b3J5LCBwcm9wcyk7Ci0JCVNlcnZpY2VFeGNlcHRpb25GcmFtZXdvcmtMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZXJ2aWNlRXhjZXB0aW9uRnJhbWV3b3JrTGlzdGVuZXIoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKSwgbnVsbCwgU2VydmljZUV4Y2VwdGlvbi5GQUNUT1JZX0VSUk9SKTsKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5hZGRGcmFtZXdvcmtMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRyeSB7Ci0JCQlTZXJ2aWNlUmVmZXJlbmNlW10gcmVmcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlZnMgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2VzKFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSwgIihuYW1lPSIgKyB0ZXN0TWV0aG9kTmFtZSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBzeW50YXggZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYXNzZXJ0Tm90TnVsbCgic2VydmljZSByZWZzIGlzIG51bGwiLCByZWZzKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcmVmZXJlbmNlcyIsIDEsIHJlZnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJUnVubmFibGUgc2VydmljZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNlcnZpY2UgPSAoUnVubmFibGUpIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZShyZWZzWzBdKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBjYXN0IGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhc3NlcnROdWxsKCJzZXJ2aWNlIGlzIG5vdCBudWxsIiwgc2VydmljZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxpc3RlbmVyLndhaXRGb3JFdmVudCgiRmFpbGVkIHRvIGZpcmUgU2VydmljZUV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShyZWZzWzBdKTsKLQkJCUVycm9yIGVycm9yID0gd3JvbmdPYmplY3RGYWN0b3J5LmdldFVuZ2V0RmFpbHVyZSgpOwotCQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQkJdGhyb3cgZXJyb3I7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVnICE9IG51bGwpCi0JCQkJcmVnLnVucmVnaXN0ZXIoKTsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVtb3ZlRnJhbWV3b3JrTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcnZpY2VFeGNlcHRpb24wMigpIHsKLQkJZmluYWwgU3RyaW5nIHRlc3RNZXRob2ROYW1lID0gInRlc3RTZXJ2aWNlRXhjZXB0aW9uMDIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHRlc3QgYSBzZXJ2aWNlIGZhY3Rvcnkgd2hpY2ggcmV0dXJucyBudWxsIG9iamVjdHMKLQkJU2VydmljZUV4Y2VwdGlvblNlcnZpY2VGYWN0b3J5IG51bGxPYmplY3RGYWN0b3J5ID0gbmV3IFNlcnZpY2VFeGNlcHRpb25TZXJ2aWNlRmFjdG9yeShudWxsKTsKLQkJSGFzaHRhYmxlIHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQoIm5hbWUiLCB0ZXN0TWV0aG9kTmFtZSk7IC8vJE5PTi1OTFMtMSQgCi0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBudWxsT2JqZWN0RmFjdG9yeSwgcHJvcHMpOwotCQlTZXJ2aWNlRXhjZXB0aW9uRnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VydmljZUV4Y2VwdGlvbkZyYW1ld29ya0xpc3RlbmVyKE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCksIG51bGwsIFNlcnZpY2VFeGNlcHRpb24uRkFDVE9SWV9FUlJPUik7Ci0JCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuYWRkRnJhbWV3b3JrTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0cnkgewotCQkJU2VydmljZVJlZmVyZW5jZVtdIHJlZnMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZWZzID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlcyhSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksICIobmFtZT0iICsgdGVzdE1ldGhvZE5hbWUgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgc3ludGF4IGVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWFzc2VydE5vdE51bGwoInNlcnZpY2UgcmVmcyBpcyBudWxsIiwgcmVmcyk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHJlZmVyZW5jZXMiLCAxLCByZWZzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCVJ1bm5hYmxlIHNlcnZpY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzZXJ2aWNlID0gKFJ1bm5hYmxlKSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UocmVmc1swXSk7Ci0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgY2FzdCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYXNzZXJ0TnVsbCgic2VydmljZSBpcyBub3QgbnVsbCIsIHNlcnZpY2UpOyAvLyROT04tTkxTLTEkCi0JCQlsaXN0ZW5lci53YWl0Rm9yRXZlbnQoIkZhaWxlZCB0byBmaXJlIFNlcnZpY2VFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UocmVmc1swXSk7Ci0JCQlFcnJvciBlcnJvciA9IG51bGxPYmplY3RGYWN0b3J5LmdldFVuZ2V0RmFpbHVyZSgpOwotCQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQkJdGhyb3cgZXJyb3I7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVnICE9IG51bGwpCi0JCQkJcmVnLnVucmVnaXN0ZXIoKTsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVtb3ZlRnJhbWV3b3JrTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcnZpY2VFeGNlcHRpb24wMygpIHsKLQkJZmluYWwgU3RyaW5nIHRlc3RNZXRob2ROYW1lID0gInRlc3RTZXJ2aWNlRXhjZXB0aW9uMDMiOyAvLyROT04tTkxTLTEkCi0JCS8vIHRlc3QgYSBzZXJ2aWNlIGZhY3Rvcnkgd2hpY2ggdGhyb3dzIGEgUnVudGltZUV4Y2VwdGlvbgotCQlSdW50aW1lRXhjZXB0aW9uIGNhdXNlID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24odGVzdE1ldGhvZE5hbWUpOwotCQlTZXJ2aWNlRXhjZXB0aW9uU2VydmljZUZhY3RvcnkgcnVudGltZUV4Y2VwdGlvbkZhY3RvcnkgPSBuZXcgU2VydmljZUV4Y2VwdGlvblNlcnZpY2VGYWN0b3J5KGNhdXNlKTsKLQkJSGFzaHRhYmxlIHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQoIm5hbWUiLCB0ZXN0TWV0aG9kTmFtZSk7IC8vJE5PTi1OTFMtMSQgCi0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW50aW1lRXhjZXB0aW9uRmFjdG9yeSwgcHJvcHMpOwotCQlTZXJ2aWNlRXhjZXB0aW9uRnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VydmljZUV4Y2VwdGlvbkZyYW1ld29ya0xpc3RlbmVyKE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCksIGNhdXNlLCBTZXJ2aWNlRXhjZXB0aW9uLkZBQ1RPUllfRVhDRVBUSU9OKTsKLQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5hZGRGcmFtZXdvcmtMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRyeSB7Ci0JCQlTZXJ2aWNlUmVmZXJlbmNlW10gcmVmcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlZnMgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2VzKFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSwgIihuYW1lPSIgKyB0ZXN0TWV0aG9kTmFtZSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBzeW50YXggZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYXNzZXJ0Tm90TnVsbCgic2VydmljZSByZWZzIGlzIG51bGwiLCByZWZzKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcmVmZXJlbmNlcyIsIDEsIHJlZnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJUnVubmFibGUgc2VydmljZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNlcnZpY2UgPSAoUnVubmFibGUpIE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZShyZWZzWzBdKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBjYXN0IGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhc3NlcnROdWxsKCJzZXJ2aWNlIGlzIG5vdCBudWxsIiwgc2VydmljZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxpc3RlbmVyLndhaXRGb3JFdmVudCgiRmFpbGVkIHRvIGZpcmUgU2VydmljZUV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShyZWZzWzBdKTsKLQkJCUVycm9yIGVycm9yID0gcnVudGltZUV4Y2VwdGlvbkZhY3RvcnkuZ2V0VW5nZXRGYWlsdXJlKCk7Ci0JCQlpZiAoZXJyb3IgIT0gbnVsbCkKLQkJCQl0aHJvdyBlcnJvcjsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZWcudW5yZWdpc3RlcigpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZW1vdmVGcmFtZXdvcmtMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUV4Y2VwdGlvbjA0KCkgewotCQlmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUgPSAidGVzdFNlcnZpY2VFeGNlcHRpb24wNCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdGVzdCBhIHNlcnZpY2UgZmFjdG9yeSB3aGljaCB0aHJvd3MgYW4gRXJyb3IKLQkJRXJyb3IgY2F1c2UgPSBuZXcgRXJyb3IodGVzdE1ldGhvZE5hbWUpOwotCQlTZXJ2aWNlRXhjZXB0aW9uU2VydmljZUZhY3RvcnkgZXJyb3JGYWN0b3J5ID0gbmV3IFNlcnZpY2VFeGNlcHRpb25TZXJ2aWNlRmFjdG9yeShjYXVzZSk7Ci0JCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KCJuYW1lIiwgdGVzdE1ldGhvZE5hbWUpOyAvLyROT04tTkxTLTEkIAotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSwgZXJyb3JGYWN0b3J5LCBwcm9wcyk7Ci0JCVNlcnZpY2VFeGNlcHRpb25GcmFtZXdvcmtMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZXJ2aWNlRXhjZXB0aW9uRnJhbWV3b3JrTGlzdGVuZXIoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKSwgY2F1c2UsIFNlcnZpY2VFeGNlcHRpb24uRkFDVE9SWV9FWENFUFRJT04pOwotCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmFkZEZyYW1ld29ya0xpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdHJ5IHsKLQkJCVNlcnZpY2VSZWZlcmVuY2VbXSByZWZzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVmcyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZXMoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCAiKG5hbWU9IiArIHRlc3RNZXRob2ROYW1lICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIHN5bnRheCBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhc3NlcnROb3ROdWxsKCJzZXJ2aWNlIHJlZnMgaXMgbnVsbCIsIHJlZnMpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiByZWZlcmVuY2VzIiwgMSwgcmVmcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQlSdW5uYWJsZSBzZXJ2aWNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2VydmljZSA9IChSdW5uYWJsZSkgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlKHJlZnNbMF0pOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIGNhc3QgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWFzc2VydE51bGwoInNlcnZpY2UgaXMgbm90IG51bGwiLCBzZXJ2aWNlKTsgLy8kTk9OLU5MUy0xJAotCQkJbGlzdGVuZXIud2FpdEZvckV2ZW50KCJGYWlsZWQgdG8gZmlyZSBTZXJ2aWNlRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkudW5nZXRTZXJ2aWNlKHJlZnNbMF0pOwotCQkJRXJyb3IgZXJyb3IgPSBlcnJvckZhY3RvcnkuZ2V0VW5nZXRGYWlsdXJlKCk7Ci0JCQlpZiAoZXJyb3IgIT0gbnVsbCkKLQkJCQl0aHJvdyBlcnJvcjsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZWcudW5yZWdpc3RlcigpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZW1vdmVGcmFtZXdvcmtMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQljbGFzcyBTZXJ2aWNlRXhjZXB0aW9uU2VydmljZUZhY3RvcnkgaW1wbGVtZW50cyBTZXJ2aWNlRmFjdG9yeSB7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNlcnZpY2VPclRocm93YWJsZTsKLQkJcHJpdmF0ZSBFcnJvciB1bmdldEZhaWx1cmU7Ci0KLQkJcHVibGljIFNlcnZpY2VFeGNlcHRpb25TZXJ2aWNlRmFjdG9yeShPYmplY3Qgc2VydmljZU9yVGhyb3dhYmxlKSB7Ci0JCQl0aGlzLnNlcnZpY2VPclRocm93YWJsZSA9IHNlcnZpY2VPclRocm93YWJsZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0U2VydmljZShCdW5kbGUgYnVuZGxlLCBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbikgewotCQkJaWYgKHNlcnZpY2VPclRocm93YWJsZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIHNlcnZpY2VPclRocm93YWJsZTsKLQkJCWlmIChzZXJ2aWNlT3JUaHJvd2FibGUgaW5zdGFuY2VvZiBFcnJvcikKLQkJCQl0aHJvdyAoRXJyb3IpIHNlcnZpY2VPclRocm93YWJsZTsKLQkJCXJldHVybiBzZXJ2aWNlT3JUaHJvd2FibGU7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdW5nZXRTZXJ2aWNlKEJ1bmRsZSBidW5kbGUsIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uLCBPYmplY3Qgc2VydmljZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoc2VydmljZU9yVGhyb3dhYmxlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKLQkJCQkJZmFpbCgiVW5leHBlY3RlZCBjYWxsIHRvIHVuZ2V0U2VydmljZTogIiArIHNlcnZpY2VPclRocm93YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoc2VydmljZU9yVGhyb3dhYmxlIGluc3RhbmNlb2YgRXJyb3IpCi0JCQkJCWZhaWwoIlVuZXhwZWN0ZWQgY2FsbCB0byB1bmdldFNlcnZpY2U6ICIgKyBzZXJ2aWNlT3JUaHJvd2FibGUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChFcnJvciBlcnJvcikgewotCQkJCXVuZ2V0RmFpbHVyZSA9IGVycm9yOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIEVycm9yIGdldFVuZ2V0RmFpbHVyZSgpIHsKLQkJCXJldHVybiB1bmdldEZhaWx1cmU7Ci0JCX0KLQl9Ci0KLQljbGFzcyBTZXJ2aWNlRXhjZXB0aW9uRnJhbWV3b3JrTGlzdGVuZXIgaW1wbGVtZW50cyBGcmFtZXdvcmtMaXN0ZW5lciB7Ci0JCXByaXZhdGUgZmluYWwgQnVuZGxlIHJlZ2lzdHJhdGlvbkJ1bmRsZTsKLQkJcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUgZXhjZXB0aW9uOwotCQlwcml2YXRlIGZpbmFsIGludCBleGNlcHRpb25UeXBlOwotCQlwcml2YXRlIGJvb2xlYW4gd2FpdEZvckV2ZW50ID0gdHJ1ZTsKLQotCQlwdWJsaWMgU2VydmljZUV4Y2VwdGlvbkZyYW1ld29ya0xpc3RlbmVyKEJ1bmRsZSByZWdpc3RyYXRpb25CdW5kbGUsIFRocm93YWJsZSBleGNlcHRpb24sIGludCBleGNlcHRpb25UeXBlKSB7Ci0JCQl0aGlzLnJlZ2lzdHJhdGlvbkJ1bmRsZSA9IHJlZ2lzdHJhdGlvbkJ1bmRsZTsKLQkJCXRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOwotCQkJdGhpcy5leGNlcHRpb25UeXBlID0gZXhjZXB0aW9uVHlwZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZyYW1ld29ya0V2ZW50KEZyYW1ld29ya0V2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0QnVuZGxlKCkgIT0gcmVnaXN0cmF0aW9uQnVuZGxlKQotCQkJCXJldHVybjsKLQkJCWlmICghKGV2ZW50LmdldFRocm93YWJsZSgpIGluc3RhbmNlb2YgU2VydmljZUV4Y2VwdGlvbikpCi0JCQkJcmV0dXJuOwotCQkJaWYgKCgoU2VydmljZUV4Y2VwdGlvbikgZXZlbnQuZ2V0VGhyb3dhYmxlKCkpLmdldENhdXNlKCkgIT0gZXhjZXB0aW9uKQotCQkJCXJldHVybjsKLQkJCWlmICgoKFNlcnZpY2VFeGNlcHRpb24pIGV2ZW50LmdldFRocm93YWJsZSgpKS5nZXRUeXBlKCkgIT0gZXhjZXB0aW9uVHlwZSkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZnlXYWl0ZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5V2FpdGVyKCkgewotCQkJd2FpdEZvckV2ZW50ID0gZmFsc2U7Ci0JCQlub3RpZnlBbGwoKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3YWl0Rm9yRXZlbnQoU3RyaW5nIGZhaWxNZXNzYWdlKSB7Ci0JCQlpZiAod2FpdEZvckV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd2FpdCgxMDAwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlmYWlsKCJ1bmV4cGVjdGVkIGludGVydXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8gc3RpbGwgd2FpdGluZyBmb3IgZXZlbnQ7IHdlIG5vdyBmYWlsCi0JCQkJaWYgKHdhaXRGb3JFdmVudCkKLQkJCQkJZmFpbChmYWlsTWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXJlZ2lzdHJ5L1NlcnZpY2VIb29rVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcmVnaXN0cnkvU2VydmljZUhvb2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjJmNmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcmVnaXN0cnkvU2VydmljZUhvb2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VyZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYnVuZGxlcy5BYnN0cmFjdEJ1bmRsZVRlc3RzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5ob29rcy5zZXJ2aWNlLio7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSG9va1Rlc3RzIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTZXJ2aWNlSG9va1Rlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZEhvb2swMSgpIHsKLQkJZmluYWwgU3RyaW5nIHRlc3RNZXRob2ROYW1lID0gInRlc3RGaW5kSG9vazAxIjsgLy8kTk9OLU5MUy0xJAotCQkvLyB0ZXN0IHRoZSBGaW5kSG9vayBpcyBjYWxsZWQgYW5kIGNhbiByZW1vdmUgYSByZWZlcmVuY2UgZnJvbSB0aGUgcmVzdWx0cwotCQlSdW5uYWJsZSBydW5JdCA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JCWZpbmFsIEJ1bmRsZUNvbnRleHQgdGVzdENvbnRleHQgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCQkvLyByZWdpc3RlciBzZXJ2aWNlcwotCQlIYXNodGFibGUgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dCgibmFtZSIsIHRlc3RNZXRob2ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJzZXJ2aWNlIDEiKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZzEgPSB0ZXN0Q29udGV4dC5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9ERVNDUklQVElPTiwgInNlcnZpY2UgMiIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnMiA9IHRlc3RDb250ZXh0LnJlZ2lzdGVyU2VydmljZShSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksIHJ1bkl0LCBwcm9wcyk7Ci0KLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX0RFU0NSSVBUSU9OLCAic2VydmljZSAzIik7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU2VydmljZVJlZ2lzdHJhdGlvbiByZWczID0gdGVzdENvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSwgcnVuSXQsIHByb3BzKTsKLQotCQlmaW5hbCBpbnRbXSBob29rQ2FsbGVkID0gbmV3IGludFtdIHswLCAwLCAwLCAwLCAwfTsKLQkJZmluYWwgYm9vbGVhbltdIHN0YXJ0VGVzdCA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkJZmluYWwgQXNzZXJ0aW9uRmFpbGVkRXJyb3JbXSBob29rRXJyb3IgPSBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3JbXSB7bnVsbCwgbnVsbCwgbnVsbCwgbnVsbH07Ci0KLQkJLy8gcmVnaXN0ZXIgZmluZCBob29rIDEKLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX0RFU0NSSVBUSU9OLCAiZmluZCBob29rIDEiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJtaW4gdmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfUkFOS0lORywgbmV3IEludGVnZXIoSW50ZWdlci5NSU5fVkFMVUUpKTsKLQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWdIb29rMSA9IHRlc3RDb250ZXh0LnJlZ2lzdGVyU2VydmljZShGaW5kSG9vay5jbGFzcy5nZXROYW1lKCksIG5ldyBGaW5kSG9vaygpIHsKLQkJCXB1YmxpYyB2b2lkIGZpbmQoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlciwgYm9vbGVhbiBhbGxTZXJ2aWNlcywgQ29sbGVjdGlvbiByZWZlcmVuY2VzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3luY2hyb25pemVkIChob29rQ2FsbGVkKSB7Ci0JCQkJCQlpZiAoIXN0YXJ0VGVzdFswXSkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlob29rQ2FsbGVkWysraG9va0NhbGxlZFswXV0gPSAxOwotCQkJCQl9Ci0JCQkJCWFzc2VydEVxdWFscygid3JvbmcgY29udGV4dCBpbiBob29rIiwgdGVzdENvbnRleHQsIGNvbnRleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSBpbiBob29rIiwgUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIGZpbHRlciBpbiBob29rIiwgIihuYW1lPSIgKyB0ZXN0TWV0aG9kTmFtZSArICIpIiwgZmlsdGVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBhbGxzZXJ2aWNlcyBpbiBob29rIiwgZmFsc2UsIGFsbFNlcnZpY2VzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBzZXJ2aWNlcyBpbiBob29rIiwgMSwgcmVmZXJlbmNlcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJU2VydmljZVJlZmVyZW5jZSByZWYgPSAoU2VydmljZVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocmVmLmVxdWFscyhyZWcxLmdldFJlZmVyZW5jZSgpKSkgewotCQkJCQkJCWZhaWwoInNlcnZpY2UgMSBpcyBwcmVzZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmIChyZWYuZXF1YWxzKHJlZzIuZ2V0UmVmZXJlbmNlKCkpKSB7Ci0JCQkJCQkJZmFpbCgic2VydmljZSAyIGlzIHByZXNlbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCXJlZmVyZW5jZXMuYWRkKHJlZzEuZ2V0UmVmZXJlbmNlKCkpOwotCQkJCQkJZmFpbCgiYWRkIHRvIGNvbGxlY3Rpb24gc3VjY2VlZGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gc2hvdWxkIGdldCBhbiBleGNlcHRpb24KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWZhaWwoImluY29ycmVjdCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZWZlcmVuY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTZXJ2aWNlUmVmZXJlbmNlW10ge3JlZzEuZ2V0UmVmZXJlbmNlKCl9KSk7Ci0JCQkJCQlmYWlsKCJhZGRBbGwgdG8gY29sbGVjdGlvbiBzdWNjZWVkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBzaG91bGQgZ2V0IGFuIGV4Y2VwdGlvbgotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZmFpbCgiaW5jb3JyZWN0IGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBhKSB7Ci0JCQkJCWhvb2tFcnJvclswXSA9IGE7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0sIHByb3BzKTsKLQotCQkvLyByZWdpc3RlciBmaW5kIGhvb2sgMgotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJmaW5kIGhvb2sgMiIpOyAvLyROT04tTkxTLTEkCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9ERVNDUklQVElPTiwgIm1heCB2YWx1ZSBmaXJzdCIpOyAvLyROT04tTkxTLTEkCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9SQU5LSU5HLCBuZXcgSW50ZWdlcihJbnRlZ2VyLk1BWF9WQUxVRSkpOwotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ0hvb2syID0gdGVzdENvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKEZpbmRIb29rLmNsYXNzLmdldE5hbWUoKSwgbmV3IEZpbmRIb29rKCkgewotCQkJcHVibGljIHZvaWQgZmluZChCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsdGVyLCBib29sZWFuIGFsbFNlcnZpY2VzLCBDb2xsZWN0aW9uIHJlZmVyZW5jZXMpIHsKLQkJCQl0cnkgewotCQkJCQlzeW5jaHJvbml6ZWQgKGhvb2tDYWxsZWQpIHsKLQkJCQkJCWlmICghc3RhcnRUZXN0WzBdKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWhvb2tDYWxsZWRbKytob29rQ2FsbGVkWzBdXSA9IDI7Ci0JCQkJCX0KLQkJCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBjb250ZXh0IGluIGhvb2siLCB0ZXN0Q29udGV4dCwgY29udGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIGluIGhvb2siLCBSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFzc2VydEVxdWFscygid3JvbmcgZmlsdGVyIGluIGhvb2siLCAiKG5hbWU9IiArIHRlc3RNZXRob2ROYW1lICsgIikiLCBmaWx0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIGFsbHNlcnZpY2VzIGluIGhvb2siLCBmYWxzZSwgYWxsU2VydmljZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIHNlcnZpY2VzIGluIGhvb2siLCAzLCByZWZlcmVuY2VzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZiA9IChTZXJ2aWNlUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChyZWYuZXF1YWxzKHJlZzIuZ2V0UmVmZXJlbmNlKCkpKSB7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXRyeSB7Ci0JCQkJCQlyZWZlcmVuY2VzLmFkZChyZWcyLmdldFJlZmVyZW5jZSgpKTsKLQkJCQkJCWZhaWwoImFkZCB0byBjb2xsZWN0aW9uIHN1Y2NlZWRlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIHNob3VsZCBnZXQgYW4gZXhjZXB0aW9uCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlmYWlsKCJpbmNvcnJlY3QgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJcmVmZXJlbmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU2VydmljZVJlZmVyZW5jZVtdIHtyZWcyLmdldFJlZmVyZW5jZSgpfSkpOwotCQkJCQkJZmFpbCgiYWRkQWxsIHRvIGNvbGxlY3Rpb24gc3VjY2VlZGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gc2hvdWxkIGdldCBhbiBleGNlcHRpb24KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWZhaWwoImluY29ycmVjdCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgYSkgewotCQkJCQlob29rRXJyb3JbMV0gPSBhOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9LCBwcm9wcyk7Ci0KLQkJLy8gcmVnaXN0ZXIgZmluZCBob29rIDMKLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX0RFU0NSSVBUSU9OLCAiZmluZCBob29rIDMiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJtYXggdmFsdWUgc2Vjb25kIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX1JBTktJTkcsIG5ldyBJbnRlZ2VyKEludGVnZXIuTUFYX1ZBTFVFKSk7Ci0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnSG9vazMgPSB0ZXN0Q29udGV4dC5yZWdpc3RlclNlcnZpY2UoRmluZEhvb2suY2xhc3MuZ2V0TmFtZSgpLCBuZXcgRmluZEhvb2soKSB7Ci0JCQlwdWJsaWMgdm9pZCBmaW5kKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIFN0cmluZyBmaWx0ZXIsIGJvb2xlYW4gYWxsU2VydmljZXMsIENvbGxlY3Rpb24gcmVmZXJlbmNlcykgewotCQkJCXRyeSB7Ci0JCQkJCXN5bmNocm9uaXplZCAoaG9va0NhbGxlZCkgewotCQkJCQkJaWYgKCFzdGFydFRlc3RbMF0pCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJaG9va0NhbGxlZFsrK2hvb2tDYWxsZWRbMF1dID0gMzsKLQkJCQkJfQotCQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIGNvbnRleHQgaW4gaG9vayIsIHRlc3RDb250ZXh0LCBjb250ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUgaW4gaG9vayIsIFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSwgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBmaWx0ZXIgaW4gaG9vayIsICIobmFtZT0iICsgdGVzdE1ldGhvZE5hbWUgKyAiKSIsIGZpbHRlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWFzc2VydEVxdWFscygid3JvbmcgYWxsc2VydmljZXMgaW4gaG9vayIsIGZhbHNlLCBhbGxTZXJ2aWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2Ygc2VydmljZXMgaW4gaG9vayIsIDIsIHJlZmVyZW5jZXMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCVNlcnZpY2VSZWZlcmVuY2UgcmVmID0gKFNlcnZpY2VSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHJlZi5lcXVhbHMocmVnMi5nZXRSZWZlcmVuY2UoKSkpIHsKLQkJCQkJCQlmYWlsKCJzZXJ2aWNlIDIgaXMgcHJlc2VudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQl0cnkgewotCQkJCQkJcmVmZXJlbmNlcy5hZGQocmVnMi5nZXRSZWZlcmVuY2UoKSk7Ci0JCQkJCQlmYWlsKCJhZGQgdG8gY29sbGVjdGlvbiBzdWNjZWVkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBzaG91bGQgZ2V0IGFuIGV4Y2VwdGlvbgotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZmFpbCgiaW5jb3JyZWN0IGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCXJlZmVyZW5jZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IFNlcnZpY2VSZWZlcmVuY2VbXSB7cmVnMi5nZXRSZWZlcmVuY2UoKX0pKTsKLQkJCQkJCWZhaWwoImFkZEFsbCB0byBjb2xsZWN0aW9uIHN1Y2NlZWRlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIHNob3VsZCBnZXQgYW4gZXhjZXB0aW9uCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlmYWlsKCJpbmNvcnJlY3QgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGEpIHsKLQkJCQkJaG9va0Vycm9yWzJdID0gYTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvLyB0aHJvdyBhbiBleGNlcHRpb24gZnJvbSB0aGUgaG9vayB0byB0ZXN0IHRoYXQgdGhlIG5leHQgaG9va3MgYXJlIGNhbGxlZC4KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0ZXN0TWV0aG9kTmFtZSk7Ci0JCQl9Ci0JCX0sIHByb3BzKTsKLQotCQkvLyByZWdpc3RlciBmaW5kIGhvb2sgNAotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJmaW5kIGhvb2sgNCIpOyAvLyROT04tTkxTLTEkCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9ERVNDUklQVElPTiwgIm1heCB2YWx1ZSB0aGlyZCIpOyAvLyROT04tTkxTLTEkCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9SQU5LSU5HLCBuZXcgSW50ZWdlcihJbnRlZ2VyLk1BWF9WQUxVRSkpOwotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ0hvb2s0ID0gdGVzdENvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKEZpbmRIb29rLmNsYXNzLmdldE5hbWUoKSwgbmV3IEZpbmRIb29rKCkgewotCQkJcHVibGljIHZvaWQgZmluZChCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsdGVyLCBib29sZWFuIGFsbFNlcnZpY2VzLCBDb2xsZWN0aW9uIHJlZmVyZW5jZXMpIHsKLQkJCQl0cnkgewotCQkJCQlzeW5jaHJvbml6ZWQgKGhvb2tDYWxsZWQpIHsKLQkJCQkJCWlmICghc3RhcnRUZXN0WzBdKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWhvb2tDYWxsZWRbKytob29rQ2FsbGVkWzBdXSA9IDQ7Ci0JCQkJCX0KLQkJCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBjb250ZXh0IGluIGhvb2siLCB0ZXN0Q29udGV4dCwgY29udGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIGluIGhvb2siLCBSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFzc2VydEVxdWFscygid3JvbmcgZmlsdGVyIGluIGhvb2siLCAiKG5hbWU9IiArIHRlc3RNZXRob2ROYW1lICsgIikiLCBmaWx0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIGFsbHNlcnZpY2VzIGluIGhvb2siLCBmYWxzZSwgYWxsU2VydmljZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIHNlcnZpY2VzIGluIGhvb2siLCAyLCByZWZlcmVuY2VzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZiA9IChTZXJ2aWNlUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChyZWYuZXF1YWxzKHJlZzEuZ2V0UmVmZXJlbmNlKCkpKSB7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChyZWYuZXF1YWxzKHJlZzIuZ2V0UmVmZXJlbmNlKCkpKSB7Ci0JCQkJCQkJZmFpbCgic2VydmljZSAyIGlzIHByZXNlbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCXJlZmVyZW5jZXMuYWRkKHJlZzIuZ2V0UmVmZXJlbmNlKCkpOwotCQkJCQkJZmFpbCgiYWRkIHRvIGNvbGxlY3Rpb24gc3VjY2VlZGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gc2hvdWxkIGdldCBhbiBleGNlcHRpb24KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWZhaWwoImluY29ycmVjdCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZWZlcmVuY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTZXJ2aWNlUmVmZXJlbmNlW10ge3JlZzIuZ2V0UmVmZXJlbmNlKCl9KSk7Ci0JCQkJCQlmYWlsKCJhZGRBbGwgdG8gY29sbGVjdGlvbiBzdWNjZWVkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBzaG91bGQgZ2V0IGFuIGV4Y2VwdGlvbgotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZmFpbCgiaW5jb3JyZWN0IGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBhKSB7Ci0JCQkJCWhvb2tFcnJvclszXSA9IGE7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0sIHByb3BzKTsKLQotCQlzdGFydFRlc3RbMF0gPSB0cnVlOwotCQkvLyBnZXQgcmVmZXJlbmNlIGFuZCBob29rIHJlbW92ZXMgc29tZSBzZXJ2aWNlcwotCQl0cnkgewotCQkJU2VydmljZVJlZmVyZW5jZVtdIHJlZnMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZWZzID0gdGVzdENvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZXMoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCAiKG5hbWU9IiArIHRlc3RNZXRob2ROYW1lICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJVbmV4cGVjdGVkIHN5bnRheCBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoImFsbCBob29rcyBub3QgY2FsbGVkIiwgNCwgaG9va0NhbGxlZFswXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiaG9vayAyIG5vdCBjYWxsZWQgZmlyc3QiLCAyLCBob29rQ2FsbGVkWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJob29rIDMgbm90IGNhbGxlZCBzZWNvbmQiLCAzLCBob29rQ2FsbGVkWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJob29rIDQgbm90IGNhbGxlZCB0aGlyZCIsIDQsIGhvb2tDYWxsZWRbM10pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoImhvb2sgMSBub3QgY2FsbGVkIGZvdXJ0aCAiLCAxLCBob29rQ2FsbGVkWzRdKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob29rRXJyb3IubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaG9va0Vycm9yW2ldICE9IG51bGwpIHsKLQkJCQkJdGhyb3cgaG9va0Vycm9yW2ldOwotCQkJCX0KLQkJCX0KLQkJCWFzc2VydE5vdE51bGwoInNlcnZpY2UgcmVmcyBpcyBudWxsIiwgcmVmcyk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHJlZmVyZW5jZXMiLCAxLCByZWZzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gdGVzdCByZW1vdmVkIHNlcnZpY2VzIGFyZSBub3QgaW4gdGhlIHJlc3VsdAotCQkJTGlzdCByZWZMaXN0ID0gQXJyYXlzLmFzTGlzdChyZWZzKTsKLQkJCWFzc2VydEZhbHNlKCJjb250YWlucyBzZXJ2aWNlIDEiLCByZWZMaXN0LmNvbnRhaW5zKHJlZzEuZ2V0UmVmZXJlbmNlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoImNvbnRhaW5zIHNlcnZpY2UgMiIsIHJlZkxpc3QuY29udGFpbnMocmVnMi5nZXRSZWZlcmVuY2UoKSkpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJtaXNzaW5nIHNlcnZpY2UgMyIsIHJlZkxpc3QuY29udGFpbnMocmVnMy5nZXRSZWZlcmVuY2UoKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJCXN0YXJ0VGVzdFswXSA9IGZhbHNlOwotCQkJLy8gcmVtb3ZlIHRoZSBob29rcwotCQkJcmVnSG9vazEudW5yZWdpc3RlcigpOwotCQkJcmVnSG9vazEgPSBudWxsOwotCQkJcmVnSG9vazIudW5yZWdpc3RlcigpOwotCQkJcmVnSG9vazIgPSBudWxsOwotCQkJcmVnSG9vazMudW5yZWdpc3RlcigpOwotCQkJcmVnSG9vazMgPSBudWxsOwotCQkJcmVnSG9vazQudW5yZWdpc3RlcigpOwotCQkJcmVnSG9vazQgPSBudWxsOwotCi0JCQkvLyBnZXQgc2VydmljZXMgYW5kIG1ha2Ugc3VyZSBub25lIGFyZSBmaWx0ZXJlZAotCQkJcmVmcyA9IG51bGw7Ci0JCQlob29rQ2FsbGVkWzBdID0gMDsKLQotCQkJc3RhcnRUZXN0WzBdID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJcmVmcyA9IHRlc3RDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2VzKFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSwgIihuYW1lPSIgKyB0ZXN0TWV0aG9kTmFtZSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiVW5leHBlY3RlZCBzeW50YXggZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYXNzZXJ0RXF1YWxzKCJob29rcyBjYWxsZWQiLCAwLCBob29rQ2FsbGVkWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0Tm90TnVsbCgic2VydmljZSByZWZzIGlzIG51bGwiLCByZWZzKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcmVmZXJlbmNlcyIsIDMsIHJlZnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyB0ZXN0IHJlc3VsdCBjb250YWlucyBhbGwgZXhwZWN0ZWQgc2VydmljZXMKLQkJCXJlZkxpc3QgPSBBcnJheXMuYXNMaXN0KHJlZnMpOwotCQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBzZXJ2aWNlIDEiLCByZWZMaXN0LmNvbnRhaW5zKHJlZzEuZ2V0UmVmZXJlbmNlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBzZXJ2aWNlIDIiLCByZWZMaXN0LmNvbnRhaW5zKHJlZzIuZ2V0UmVmZXJlbmNlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBzZXJ2aWNlIDMiLCByZWZMaXN0LmNvbnRhaW5zKHJlZzMuZ2V0UmVmZXJlbmNlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJLy8gdW5yZWdpc3RlciBob29rIGFuZCBzZXJ2aWNlcwotCQkJaWYgKHJlZ0hvb2sxICE9IG51bGwpCi0JCQkJcmVnSG9vazEudW5yZWdpc3RlcigpOwotCQkJaWYgKHJlZ0hvb2syICE9IG51bGwpCi0JCQkJcmVnSG9vazIudW5yZWdpc3RlcigpOwotCQkJaWYgKHJlZ0hvb2szICE9IG51bGwpCi0JCQkJcmVnSG9vazMudW5yZWdpc3RlcigpOwotCQkJaWYgKHJlZ0hvb2s0ICE9IG51bGwpCi0JCQkJcmVnSG9vazQudW5yZWdpc3RlcigpOwotCQkJaWYgKHJlZzEgIT0gbnVsbCkKLQkJCQlyZWcxLnVucmVnaXN0ZXIoKTsKLQkJCWlmIChyZWcyICE9IG51bGwpCi0JCQkJcmVnMi51bnJlZ2lzdGVyKCk7Ci0JCQlpZiAocmVnMyAhPSBudWxsKQotCQkJCXJlZzMudW5yZWdpc3RlcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV2ZW50SG9vazAxKCkgewotCQlmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUgPSAidGVzdEV2ZW50SG9vazAxIjsgLy8kTk9OLU5MUy0xJAotCQkvLyB0ZXN0IHRoZSBFdmVudEhvb2sgaXMgY2FsbGVkIGFuZCBjYW4gcmVtb3ZlIGEgcmVmZXJlbmNlIGZyb20gdGhlIHJlc3VsdHMKLQkJUnVubmFibGUgcnVuSXQgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQl9OwotCQlmaW5hbCBCdW5kbGVDb250ZXh0IHRlc3RDb250ZXh0ID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKTsKLQotCQlmaW5hbCBpbnRbXSBob29rQ2FsbGVkID0gbmV3IGludFtdIHswLCAwfTsKLQkJZmluYWwgQXNzZXJ0aW9uRmFpbGVkRXJyb3JbXSBob29rRXJyb3IgPSBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3JbXSB7bnVsbH07Ci0JCWZpbmFsIExpc3QgZXZlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZpbmFsIFNlcnZpY2VMaXN0ZW5lciBzbCA9IG5ldyBTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2aWNlQ2hhbmdlZChTZXJ2aWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGV2ZW50cykgewotCQkJCQlldmVudHMuYWRkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJZmluYWwgU3RyaW5nIGZpbHRlclN0cmluZyA9ICIoJihuYW1lPSIgKyB0ZXN0TWV0aG9kTmFtZSArICIpKG9iamVjdENsYXNzPWphdmEubGFuZy5SdW5uYWJsZSkpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUZpbHRlciB0bXBGaWx0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJdG1wRmlsdGVyID0gdGVzdENvbnRleHQuY3JlYXRlRmlsdGVyKGZpbHRlclN0cmluZyk7Ci0JCQl0ZXN0Q29udGV4dC5hZGRTZXJ2aWNlTGlzdGVuZXIoc2wsIGZpbHRlclN0cmluZyk7Ci0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBzeW50YXggZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZmluYWwgRmlsdGVyIGZpbHRlciA9IHRtcEZpbHRlcjsKLQkJRXZlbnRIb29rIGhvb2sxID0gbmV3IEV2ZW50SG9vaygpIHsKLQkJCXB1YmxpYyB2b2lkIGV2ZW50KFNlcnZpY2VFdmVudCBldmVudCwgQ29sbGVjdGlvbiBjb250ZXh0cykgewotCQkJCXRyeSB7Ci0JCQkJCWlmICghZmlsdGVyLm1hdGNoKGV2ZW50LmdldFNlcnZpY2VSZWZlcmVuY2UoKSkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlzeW5jaHJvbml6ZWQgKGhvb2tDYWxsZWQpIHsKLQkJCQkJCWhvb2tDYWxsZWRbKytob29rQ2FsbGVkWzBdXSA9IDE7Ci0JCQkJCX0KLQkJCQkJYXNzZXJ0VHJ1ZSgiZG9lcyBub3QgY29udGFpbiB0ZXN0IGNvbnRleHQiLCBjb250ZXh0cy5jb250YWlucyh0ZXN0Q29udGV4dCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbnRleHRzLmFkZCh0ZXN0Q29udGV4dC5nZXRCdW5kbGUoMCkuZ2V0QnVuZGxlQ29udGV4dCgpKTsKLQkJCQkJCWZhaWwoImFkZCB0byBjb2xsZWN0aW9uIHN1Y2NlZWRlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIHNob3VsZCBnZXQgYW4gZXhjZXB0aW9uCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlmYWlsKCJpbmNvcnJlY3QgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJY29udGV4dHMuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IEJ1bmRsZUNvbnRleHRbXSB7dGVzdENvbnRleHQuZ2V0QnVuZGxlKDApLmdldEJ1bmRsZUNvbnRleHQoKX0pKTsKLQkJCQkJCWZhaWwoImFkZEFsbCB0byBjb2xsZWN0aW9uIHN1Y2NlZWRlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIHNob3VsZCBnZXQgYW4gZXhjZXB0aW9uCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlmYWlsKCJpbmNvcnJlY3QgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGEpIHsKLQkJCQkJaG9va0Vycm9yWzBdID0gYTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJRXZlbnRIb29rIGhvb2syID0gbmV3IEV2ZW50SG9vaygpIHsKLQkJCXB1YmxpYyB2b2lkIGV2ZW50KFNlcnZpY2VFdmVudCBldmVudCwgQ29sbGVjdGlvbiBjb250ZXh0cykgewotCQkJCXRyeSB7Ci0JCQkJCWlmICghZmlsdGVyLm1hdGNoKGV2ZW50LmdldFNlcnZpY2VSZWZlcmVuY2UoKSkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlzeW5jaHJvbml6ZWQgKGhvb2tDYWxsZWQpIHsKLQkJCQkJCWhvb2tDYWxsZWRbKytob29rQ2FsbGVkWzBdXSA9IDE7Ci0JCQkJCX0KLQkJCQkJYXNzZXJ0VHJ1ZSgiZG9lcyBub3QgY29udGFpbiB0ZXN0IGNvbnRleHQiLCBjb250ZXh0cy5jb250YWlucyh0ZXN0Q29udGV4dCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRleHRzLnJlbW92ZSh0ZXN0Q29udGV4dCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb250ZXh0cy5hZGQodGVzdENvbnRleHQuZ2V0QnVuZGxlKDApLmdldEJ1bmRsZUNvbnRleHQoKSk7Ci0JCQkJCQlmYWlsKCJhZGQgdG8gY29sbGVjdGlvbiBzdWNjZWVkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBzaG91bGQgZ2V0IGFuIGV4Y2VwdGlvbgotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZmFpbCgiaW5jb3JyZWN0IGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbnRleHRzLmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBCdW5kbGVDb250ZXh0W10ge3Rlc3RDb250ZXh0LmdldEJ1bmRsZSgwKS5nZXRCdW5kbGVDb250ZXh0KCl9KSk7Ci0JCQkJCQlmYWlsKCJhZGRBbGwgdG8gY29sbGVjdGlvbiBzdWNjZWVkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBzaG91bGQgZ2V0IGFuIGV4Y2VwdGlvbgotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZmFpbCgiaW5jb3JyZWN0IGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBhKSB7Ci0JCQkJCWhvb2tFcnJvclswXSA9IGE7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJSGFzaHRhYmxlIHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQoIm5hbWUiLCB0ZXN0TWV0aG9kTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmVnaXN0ZXIgZXZlbnQgaG9vayAxCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9ERVNDUklQVElPTiwgImV2ZW50IGhvb2sgMSIpOyAvLyROT04tTkxTLTEkCi0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnSG9vayA9IHRlc3RDb250ZXh0LnJlZ2lzdGVyU2VydmljZShFdmVudEhvb2suY2xhc3MuZ2V0TmFtZSgpLCBob29rMSwgcHJvcHMpOwotCi0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnMSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJzZXJ2aWNlIDEiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3luY2hyb25pemVkIChldmVudHMpIHsKLQkJCQlldmVudHMuY2xlYXIoKTsKLQkJCX0KLQkJCXJlZzEgPSB0ZXN0Q29udGV4dC5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCQkJYXNzZXJ0RXF1YWxzKCJhbGwgaG9va3Mgbm90IGNhbGxlZCIsIDEsIGhvb2tDYWxsZWRbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoImhvb2sgMSBub3QgY2FsbGVkIGZpcnN0IiwgMSwgaG9va0NhbGxlZFsxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9va0Vycm9yLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGhvb2tFcnJvcltpXSAhPSBudWxsKSB7Ci0JCQkJCXRocm93IGhvb2tFcnJvcltpXTsKLQkJCQl9Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKGV2ZW50cykgewotCQkJCWFzc2VydEVxdWFscygibGlzdGVuZXIgbm90IGNhbGxlZCBvbmNlIiwgMSwgZXZlbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJdGVyYXRvciBpdGVyID0gZXZlbnRzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCVNlcnZpY2VFdmVudCBldmVudCA9IChTZXJ2aWNlRXZlbnQpIGl0ZXIubmV4dCgpOwotCQkJCQlhc3NlcnRFcXVhbHMoInR5cGUgbm90IHJlZ2lzdGVyZWQiLCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCwgZXZlbnQuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIHNlcnZpY2UiLCByZWcxLmdldFJlZmVyZW5jZSgpLCBldmVudC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQlyZWdIb29rLnVucmVnaXN0ZXIoKTsKLQkJCXJlZ0hvb2sgPSBudWxsOwotCi0JCQlzeW5jaHJvbml6ZWQgKGV2ZW50cykgewotCQkJCWV2ZW50cy5jbGVhcigpOwotCQkJfQotCQkJaG9va0NhbGxlZFswXSA9IDA7Ci0JCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJzZXJ2aWNlIDIiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVnMS5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCXN5bmNocm9uaXplZCAoZXZlbnRzKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJsaXN0ZW5lciBub3QgY2FsbGVkIG9uY2UiLCAxLCBldmVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBldmVudHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJU2VydmljZUV2ZW50IGV2ZW50ID0gKFNlcnZpY2VFdmVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCWFzc2VydEVxdWFscygidHlwZSBub3QgcmVnaXN0ZXJlZCIsIFNlcnZpY2VFdmVudC5NT0RJRklFRCwgZXZlbnQuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIHNlcnZpY2UiLCByZWcxLmdldFJlZmVyZW5jZSgpLCBldmVudC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJYXNzZXJ0RXF1YWxzKCJob29rcyBjYWxsZWQiLCAwLCBob29rQ2FsbGVkWzBdKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJldmVudCBob29rIDIiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVnSG9vayA9IHRlc3RDb250ZXh0LnJlZ2lzdGVyU2VydmljZShFdmVudEhvb2suY2xhc3MuZ2V0TmFtZSgpLCBob29rMiwgcHJvcHMpOwotCi0JCQlzeW5jaHJvbml6ZWQgKGV2ZW50cykgewotCQkJCWV2ZW50cy5jbGVhcigpOwotCQkJfQotCQkJaG9va0NhbGxlZFswXSA9IDA7Ci0JCQlyZWcxLnVucmVnaXN0ZXIoKTsKLQkJCXJlZzEgPSBudWxsOwotCQkJc3luY2hyb25pemVkIChldmVudHMpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImxpc3RlbmVyIGNhbGxlZCIsIDAsIGV2ZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoImFsbCBob29rcyBub3QgY2FsbGVkIiwgMSwgaG9va0NhbGxlZFswXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiaG9vayAxIG5vdCBjYWxsZWQgZmlyc3QiLCAxLCBob29rQ2FsbGVkWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob29rRXJyb3IubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaG9va0Vycm9yW2ldICE9IG51bGwpIHsKLQkJCQkJdGhyb3cgaG9va0Vycm9yW2ldOwotCQkJCX0KLQkJCX0KLQotCQl9IGZpbmFsbHkgewotCQkJLy8gdW5yZWdpc3RlciBob29rIGFuZCBzZXJ2aWNlcwotCQkJaWYgKHJlZ0hvb2sgIT0gbnVsbCkKLQkJCQlyZWdIb29rLnVucmVnaXN0ZXIoKTsKLQkJCWlmIChyZWcxICE9IG51bGwpCi0JCQkJcmVnMS51bnJlZ2lzdGVyKCk7Ci0JCQlpZiAoc2wgIT0gbnVsbCkKLQkJCQl0ZXN0Q29udGV4dC5yZW1vdmVTZXJ2aWNlTGlzdGVuZXIoc2wpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVySG9vazAxKCkgewotCQlmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUgPSAidGVzdExpc3RlbmVySG9vazAxIjsgLy8kTk9OLU5MUy0xJAotCQkvLyB0ZXN0IHRoZSBMaXN0ZW5lckhvb2sgaXMgY2FsbGVkCi0JCWZpbmFsIEJ1bmRsZUNvbnRleHQgdGVzdENvbnRleHQgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCQlmaW5hbCBDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmluYWwgaW50W10gaG9va0NhbGxlZCA9IG5ldyBpbnRbXSB7MCwgMH07Ci0KLQkJTGlzdGVuZXJIb29rIGhvb2sxID0gbmV3IExpc3RlbmVySG9vaygpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZGVkKENvbGxlY3Rpb24gbGlzdGVuZXJzKSB7Ci0JCQkJc3luY2hyb25pemVkIChob29rQ2FsbGVkKSB7Ci0JCQkJCWhvb2tDYWxsZWRbMF0rKzsKLQkJCQl9Ci0JCQkJcmVzdWx0LmFkZEFsbChsaXN0ZW5lcnMpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVkKENvbGxlY3Rpb24gbGlzdGVuZXJzKSB7Ci0JCQkJc3luY2hyb25pemVkIChob29rQ2FsbGVkKSB7Ci0JCQkJCWhvb2tDYWxsZWRbMV0rKzsKLQkJCQl9Ci0JCQkJcmVzdWx0LnJlbW92ZUFsbChsaXN0ZW5lcnMpOwotCQkJfQotCQl9OwotCi0JCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KCJuYW1lIiwgdGVzdE1ldGhvZE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCS8vIHJlZ2lzdGVyIGxpc3RlbmVyIGhvb2sgMQotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJsaXN0ZW5lciBob29rIDEiKTsgLy8kTk9OLU5MUy0xJAotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ0hvb2sgPSB0ZXN0Q29udGV4dC5yZWdpc3RlclNlcnZpY2UoTGlzdGVuZXJIb29rLmNsYXNzLmdldE5hbWUoKSwgaG9vazEsIHByb3BzKTsKLQotCQl0cnkgewotCQkJYXNzZXJ0RmFsc2UoIm5vIHNlcnZpY2UgbGlzdGVuZXJzIGZvdW5kIiwgcmVzdWx0LmlzRW1wdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiYWRkZWQgbm90IGNhbGxlZCIsIDEsIGhvb2tDYWxsZWRbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInJlbW92ZWQgY2FsbGVkIiwgMCwgaG9va0NhbGxlZFsxXSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaW50IHNpemUgPSByZXN1bHQuc2l6ZSgpOwotCQkJU2VydmljZUxpc3RlbmVyIHRlc3RTTCA9IG5ldyBTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VydmljZUNoYW5nZWQoU2VydmljZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9OwotCQkJU3RyaW5nIGZpbHRlclN0cmluZzEgPSAiKGZvbz1iYXIpIjsgLy8kTk9OLU5MUy0xJAotCQkJdGVzdENvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKHRlc3RTTCwgZmlsdGVyU3RyaW5nMSk7Ci0JCQlhc3NlcnRFcXVhbHMoImFkZGVkIG5vdCBjYWxsZWQiLCAyLCBob29rQ2FsbGVkWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJyZW1vdmVkIGNhbGxlZCIsIDAsIGhvb2tDYWxsZWRbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoImxpc3RlbmVyIG5vdCBhZGRlZCIsIHNpemUgKyAxLCByZXN1bHQuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJSXRlcmF0b3IgaXRlciA9IHJlc3VsdC5pdGVyYXRvcigpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJTGlzdGVuZXJIb29rLkxpc3RlbmVySW5mbyBpbmZvID0gKExpc3RlbmVySG9vay5MaXN0ZW5lckluZm8pIGl0ZXIubmV4dCgpOwotCQkJCUJ1bmRsZUNvbnRleHQgYyA9IGluZm8uZ2V0QnVuZGxlQ29udGV4dCgpOwotCQkJCVN0cmluZyBmID0gaW5mby5nZXRGaWx0ZXIoKTsKLQkJCQlpZiAoKGMgPT0gdGVzdENvbnRleHQpICYmIChmaWx0ZXJTdHJpbmcxLmVxdWFscyhmKSkpIHsKLQkJCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCQlmYWlsKCJmb3VuZCBtb3JlIHRoYW4gb25jZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlmYWlsKCJsaXN0ZW5lciBub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlTdHJpbmcgZmlsdGVyU3RyaW5nMiA9ICIoYmFyPWZvbykiOyAvLyROT04tTkxTLTEkCi0JCQl0ZXN0Q29udGV4dC5hZGRTZXJ2aWNlTGlzdGVuZXIodGVzdFNMLCBmaWx0ZXJTdHJpbmcyKTsKLQkJCWFzc2VydEVxdWFscygiYWRkZWQgbm90IGNhbGxlZCIsIDMsIGhvb2tDYWxsZWRbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInJlbW92ZWQgbm90IGNhbGxlZCIsIDEsIGhvb2tDYWxsZWRbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoImxpc3RlbmVyIG5vdCByZW1vdmVkIGFuZCBhZGRlZCIsIHNpemUgKyAxLCByZXN1bHQuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJaXRlciA9IHJlc3VsdC5pdGVyYXRvcigpOwotCQkJZm91bmQgPSBmYWxzZTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUxpc3RlbmVySG9vay5MaXN0ZW5lckluZm8gaW5mbyA9IChMaXN0ZW5lckhvb2suTGlzdGVuZXJJbmZvKSBpdGVyLm5leHQoKTsKLQkJCQlCdW5kbGVDb250ZXh0IGMgPSBpbmZvLmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJCQlTdHJpbmcgZiA9IGluZm8uZ2V0RmlsdGVyKCk7Ci0JCQkJaWYgKChjID09IHRlc3RDb250ZXh0KSAmJiAoZmlsdGVyU3RyaW5nMi5lcXVhbHMoZikpKSB7Ci0JCQkJCWlmIChmb3VuZCkgewotCQkJCQkJZmFpbCgiZm91bmQgbW9yZSB0aGFuIG9uY2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKChjID09IHRlc3RDb250ZXh0KSAmJiAoZmlsdGVyU3RyaW5nMS5lcXVhbHMoZikpKSB7Ci0JCQkJCWZhaWwoImZpcnN0IGxpc3RlbmVyIG5vdCByZW1vdmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJZmFpbCgibGlzdGVuZXIgbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJdGVzdENvbnRleHQucmVtb3ZlU2VydmljZUxpc3RlbmVyKHRlc3RTTCk7Ci0JCQlhc3NlcnRFcXVhbHMoImFkZGVkIGNhbGxlZCIsIDMsIGhvb2tDYWxsZWRbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInJlbW92ZWQgbm90IGNhbGxlZCIsIDIsIGhvb2tDYWxsZWRbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoImxpc3RlbmVyIG5vdCByZW1vdmVkIiwgc2l6ZSwgcmVzdWx0LnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWl0ZXIgPSByZXN1bHQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUxpc3RlbmVySG9vay5MaXN0ZW5lckluZm8gaW5mbyA9IChMaXN0ZW5lckhvb2suTGlzdGVuZXJJbmZvKSBpdGVyLm5leHQoKTsKLQkJCQlCdW5kbGVDb250ZXh0IGMgPSBpbmZvLmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJCQlTdHJpbmcgZiA9IGluZm8uZ2V0RmlsdGVyKCk7Ci0JCQkJaWYgKChjID09IHRlc3RDb250ZXh0KSAmJiAoZmlsdGVyU3RyaW5nMi5lcXVhbHMoZikpKSB7Ci0JCQkJCWZhaWwoInNlY29uZCBsaXN0ZW5lciBub3QgcmVtb3ZlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQl0ZXN0Q29udGV4dC5yZW1vdmVTZXJ2aWNlTGlzdGVuZXIodGVzdFNMKTsKLQkJCWFzc2VydEVxdWFscygiYWRkZWQgY2FsbGVkIiwgMywgaG9va0NhbGxlZFswXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygicmVtb3ZlZCBjYWxsZWQiLCAyLCBob29rQ2FsbGVkWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJsaXN0ZW5lciByZW1vdmVkIiwgc2l6ZSwgcmVzdWx0LnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlZ0hvb2sgIT0gbnVsbCkgewotCQkJCXJlZ0hvb2sudW5yZWdpc3RlcigpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVySG9vazAyKCkgewotCQlmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUgPSAidGVzdExpc3RlbmVySG9vazAyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyB0ZXN0IHRoZSBMaXN0ZW5lckhvb2sgd29ya3Mgd2l0aCB0aGUgRmlsdGVyZWRTZXJ2aWNlTGlzdGVuZXIgb3B0aW1pemF0aW9uIGluIGVxdWlub3gKLQkJZmluYWwgQnVuZGxlQ29udGV4dCB0ZXN0Q29udGV4dCA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCk7Ci0JCWZpbmFsIENvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaW5hbCBpbnRbXSBob29rQ2FsbGVkID0gbmV3IGludFtdIHswLCAwfTsKLQotCQlMaXN0ZW5lckhvb2sgaG9vazEgPSBuZXcgTGlzdGVuZXJIb29rKCkgewotCQkJcHVibGljIHZvaWQgYWRkZWQoQ29sbGVjdGlvbiBsaXN0ZW5lcnMpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGhvb2tDYWxsZWQpIHsKLQkJCQkJaG9va0NhbGxlZFswXSsrOwotCQkJCX0KLQkJCQlyZXN1bHQuYWRkQWxsKGxpc3RlbmVycyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZWQoQ29sbGVjdGlvbiBsaXN0ZW5lcnMpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGhvb2tDYWxsZWQpIHsKLQkJCQkJaG9va0NhbGxlZFsxXSsrOwotCQkJCX0KLQkJCQlyZXN1bHQucmVtb3ZlQWxsKGxpc3RlbmVycyk7Ci0JCQl9Ci0JCX07Ci0KLQkJSGFzaHRhYmxlIHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQoIm5hbWUiLCB0ZXN0TWV0aG9kTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmVnaXN0ZXIgbGlzdGVuZXIgaG9vayAxCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9ERVNDUklQVElPTiwgImxpc3RlbmVyIGhvb2sgMSIpOyAvLyROT04tTkxTLTEkCi0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnSG9vayA9IHRlc3RDb250ZXh0LnJlZ2lzdGVyU2VydmljZShMaXN0ZW5lckhvb2suY2xhc3MuZ2V0TmFtZSgpLCBob29rMSwgcHJvcHMpOwotCi0JCXRyeSB7Ci0JCQlhc3NlcnRGYWxzZSgibm8gc2VydmljZSBsaXN0ZW5lcnMgZm91bmQiLCByZXN1bHQuaXNFbXB0eSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJhZGRlZCBub3QgY2FsbGVkIiwgMSwgaG9va0NhbGxlZFswXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygicmVtb3ZlZCBjYWxsZWQiLCAwLCBob29rQ2FsbGVkWzFdKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpbnQgc2l6ZSA9IHJlc3VsdC5zaXplKCk7Ci0JCQlTZXJ2aWNlTGlzdGVuZXIgdGVzdFNMID0gbmV3IFNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZXJ2aWNlQ2hhbmdlZChTZXJ2aWNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0KLQkJCX07Ci0JCQlTdHJpbmcgZmlsdGVyU3RyaW5nMSA9ICIoIiArIENvbnN0YW50cy5PQkpFQ1RDTEFTUyArICI9YmFyKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGVzdENvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKHRlc3RTTCwgZmlsdGVyU3RyaW5nMSk7Ci0JCQlhc3NlcnRFcXVhbHMoImFkZGVkIG5vdCBjYWxsZWQiLCAyLCBob29rQ2FsbGVkWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJyZW1vdmVkIGNhbGxlZCIsIDAsIGhvb2tDYWxsZWRbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoImxpc3RlbmVyIG5vdCBhZGRlZCIsIHNpemUgKyAxLCByZXN1bHQuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJSXRlcmF0b3IgaXRlciA9IHJlc3VsdC5pdGVyYXRvcigpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJTGlzdGVuZXJIb29rLkxpc3RlbmVySW5mbyBpbmZvID0gKExpc3RlbmVySG9vay5MaXN0ZW5lckluZm8pIGl0ZXIubmV4dCgpOwotCQkJCUJ1bmRsZUNvbnRleHQgYyA9IGluZm8uZ2V0QnVuZGxlQ29udGV4dCgpOwotCQkJCVN0cmluZyBmID0gaW5mby5nZXRGaWx0ZXIoKTsKLQkJCQlpZiAoKGMgPT0gdGVzdENvbnRleHQpICYmIChmaWx0ZXJTdHJpbmcxLmVxdWFscyhmKSkpIHsKLQkJCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCQlmYWlsKCJmb3VuZCBtb3JlIHRoYW4gb25jZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlmYWlsKCJsaXN0ZW5lciBub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlTdHJpbmcgZmlsdGVyU3RyaW5nMiA9IG51bGw7Ci0JCQl0ZXN0Q29udGV4dC5hZGRTZXJ2aWNlTGlzdGVuZXIodGVzdFNMKTsKLQkJCWFzc2VydEVxdWFscygiYWRkZWQgbm90IGNhbGxlZCIsIDMsIGhvb2tDYWxsZWRbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoInJlbW92ZWQgbm90IGNhbGxlZCIsIDEsIGhvb2tDYWxsZWRbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoImxpc3RlbmVyIG5vdCByZW1vdmVkIGFuZCBhZGRlZCIsIHNpemUgKyAxLCByZXN1bHQuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJaXRlciA9IHJlc3VsdC5pdGVyYXRvcigpOwotCQkJZm91bmQgPSBmYWxzZTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUxpc3RlbmVySG9vay5MaXN0ZW5lckluZm8gaW5mbyA9IChMaXN0ZW5lckhvb2suTGlzdGVuZXJJbmZvKSBpdGVyLm5leHQoKTsKLQkJCQlCdW5kbGVDb250ZXh0IGMgPSBpbmZvLmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJCQlTdHJpbmcgZiA9IGluZm8uZ2V0RmlsdGVyKCk7Ci0JCQkJaWYgKChjID09IHRlc3RDb250ZXh0KSAmJiAoZiA9PSBmaWx0ZXJTdHJpbmcyKSkgewotCQkJCQlpZiAoZm91bmQpIHsKLQkJCQkJCWZhaWwoImZvdW5kIG1vcmUgdGhhbiBvbmNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICgoYyA9PSB0ZXN0Q29udGV4dCkgJiYgKGZpbHRlclN0cmluZzEuZXF1YWxzKGYpKSkgewotCQkJCQlmYWlsKCJmaXJzdCBsaXN0ZW5lciBub3QgcmVtb3ZlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCWZhaWwoImxpc3RlbmVyIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXRlc3RDb250ZXh0LnJlbW92ZVNlcnZpY2VMaXN0ZW5lcih0ZXN0U0wpOwotCQkJYXNzZXJ0RXF1YWxzKCJhZGRlZCBjYWxsZWQiLCAzLCBob29rQ2FsbGVkWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJyZW1vdmVkIG5vdCBjYWxsZWQiLCAyLCBob29rQ2FsbGVkWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJsaXN0ZW5lciBub3QgcmVtb3ZlZCIsIHNpemUsIHJlc3VsdC5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQlpdGVyID0gcmVzdWx0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlMaXN0ZW5lckhvb2suTGlzdGVuZXJJbmZvIGluZm8gPSAoTGlzdGVuZXJIb29rLkxpc3RlbmVySW5mbykgaXRlci5uZXh0KCk7Ci0JCQkJQnVuZGxlQ29udGV4dCBjID0gaW5mby5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JCQkJU3RyaW5nIGYgPSBpbmZvLmdldEZpbHRlcigpOwotCQkJCWlmICgoYyA9PSB0ZXN0Q29udGV4dCkgJiYgKGYgPT0gZmlsdGVyU3RyaW5nMikpIHsKLQkJCQkJZmFpbCgic2Vjb25kIGxpc3RlbmVyIG5vdCByZW1vdmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRlc3RDb250ZXh0LnJlbW92ZVNlcnZpY2VMaXN0ZW5lcih0ZXN0U0wpOwotCQkJYXNzZXJ0RXF1YWxzKCJhZGRlZCBjYWxsZWQiLCAzLCBob29rQ2FsbGVkWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJyZW1vdmVkIGNhbGxlZCIsIDIsIGhvb2tDYWxsZWRbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoImxpc3RlbmVyIHJlbW92ZWQiLCBzaXplLCByZXN1bHQuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVnSG9vayAhPSBudWxsKSB7Ci0JCQkJcmVnSG9vay51bnJlZ2lzdGVyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXJlZ2lzdHJ5L1NlcnZpY2VSZWdpc3RyeVRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXJlZ2lzdHJ5L1NlcnZpY2VSZWdpc3RyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5M2YzMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VyZWdpc3RyeS9TZXJ2aWNlUmVnaXN0cnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VyZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VSZWdpc3RyeVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFNlcnZpY2VSZWdpc3RyeVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShTZXJ2aWNlUmVnaXN0cnlUZXN0cy5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KFNlcnZpY2VFeGNlcHRpb25UZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChTZXJ2aWNlSG9va1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFNlcnZpY2VUcmFja2VyVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUxpc3RlbmVyMDEoKSB7Ci0JCWZpbmFsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSA9IGdldE5hbWUoKTsKLQkJLy8gc2ltcGxlIFNlcnZpY2VMaXN0ZW5lciB0ZXN0Ci0JCVJ1bm5hYmxlIHJ1bkl0ID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdHMgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX07Ci0JCVNlcnZpY2VMaXN0ZW5lciB0ZXN0TGlzdGVuZXIgPSBuZXcgU2VydmljZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmljZUNoYW5nZWQoU2VydmljZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCQkJY2FzZSBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCA6Ci0JCQkJCQlyZXN1bHRzWzBdID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNlcnZpY2VFdmVudC5NT0RJRklFRCA6Ci0JCQkJCQlyZXN1bHRzWzFdID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNlcnZpY2VFdmVudC5NT0RJRklFRF9FTkRNQVRDSCA6Ci0JCQkJCQlyZXN1bHRzWzJdID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIDoKLQkJCQkJCXJlc3VsdHNbM10gPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5hZGRTZXJ2aWNlTGlzdGVuZXIodGVzdExpc3RlbmVyLCAiKCYob2JqZWN0Y2xhc3M9amF2YS5sYW5nLlJ1bm5hYmxlKSgiICsgdGVzdE1ldGhvZE5hbWUudG9Mb3dlckNhc2UoKSArICI9dHJ1ZSkpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZpbHRlciBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWcgPSBudWxsOwotCQl0cnkgewotCQkJLy8gcmVnaXN0ZXIgc2VydmljZSB3aGljaCBtYXRjaGVzCi0JCQlIYXNodGFibGUgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQlwcm9wcy5wdXQodGVzdE1ldGhvZE5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksIHJ1bkl0LCBwcm9wcyk7Ci0JCQlhc3NlcnRUcnVlKCJEaWQgbm90IGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIHN0aWxsIG1hdGNoCi0JCQlwcm9wcy5wdXQoInRlc3RDaGFuZ2VQcm9wIiwgQm9vbGVhbi5GQUxTRSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRCIsIHJlc3VsdHNbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0giLCByZXN1bHRzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50LlVOUkVHSVNURVJJTkciLCByZXN1bHRzWzNdKTsgLy8kTk9OLU5MUy0xJAotCQkJY2xlYXJSZXN1bHRzKHJlc3VsdHMpOwotCi0JCQkvLyBjaGFuZ2UgcHJvcHMgdG8gbm8gbG9uZ2VyIG1hdGNoCi0JCQlwcm9wcy5wdXQodGVzdE1ldGhvZE5hbWUsIEJvb2xlYW4uRkFMU0UpOwotCQkJcmVnLnNldFByb3BlcnRpZXMocHJvcHMpOwotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQiLCByZXN1bHRzWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEIiwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRF9FTkRNQVRDSCIsIHJlc3VsdHNbMl0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORyIsIHJlc3VsdHNbM10pOyAvLyROT04tTkxTLTEkCi0JCQljbGVhclJlc3VsdHMocmVzdWx0cyk7Ci0KLQkJCS8vIGNoYW5nZSBwcm9wcyB0byBubyBsb25nZXIgbWF0Y2gKLQkJCXByb3BzLnB1dCgidGVzdENoYW5nZVByb3AiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0JCQlyZWcuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIGJhY2sgdG8gbWF0Y2gKLQkJCXByb3BzLnB1dCh0ZXN0TWV0aG9kTmFtZSwgQm9vbGVhbi5UUlVFKTsKLQkJCXJlZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRCIsIHJlc3VsdHNbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0giLCByZXN1bHRzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50LlVOUkVHSVNURVJJTkciLCByZXN1bHRzWzNdKTsgLy8kTk9OLU5MUy0xJAotCQkJY2xlYXJSZXN1bHRzKHJlc3VsdHMpOwotCi0JCQkvLyB1bnJlZ2lzdGVyCi0JCQlyZWcudW5yZWdpc3RlcigpOwotCQkJcmVnID0gbnVsbDsKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRCIsIHJlc3VsdHNbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0giLCByZXN1bHRzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBnZXQgU2VydmljZUV2ZW50LlVOUkVHSVNURVJJTkciLCByZXN1bHRzWzNdKTsgLy8kTk9OLU5MUy0xJAotCQkJY2xlYXJSZXN1bHRzKHJlc3VsdHMpOwotCQl9IGZpbmFsbHkgewotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZW1vdmVTZXJ2aWNlTGlzdGVuZXIodGVzdExpc3RlbmVyKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZWcudW5yZWdpc3RlcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcnZpY2VMaXN0ZW5lcjAyKCkgewotCQlmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUgPSBnZXROYW1lKCk7Ci0JCS8vIHNpbXBsZSBTZXJ2aWNlTGlzdGVuZXIgdGVzdAotCQlSdW5uYWJsZSBydW5JdCA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHRzID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9OwotCQlTZXJ2aWNlTGlzdGVuZXIgdGVzdExpc3RlbmVyID0gbmV3IFNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZpY2VDaGFuZ2VkKFNlcnZpY2VFdmVudCBldmVudCkgewotCQkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCQkJCWNhc2UgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQgOgotCQkJCQkJcmVzdWx0c1swXSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQgOgotCQkJCQkJcmVzdWx0c1sxXSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0ggOgotCQkJCQkJcmVzdWx0c1syXSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORyA6Ci0JCQkJCQlyZXN1bHRzWzNdID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuYWRkU2VydmljZUxpc3RlbmVyKHRlc3RMaXN0ZW5lciwgIigmKG9iamVjdGNsYXNzPWphdmEubGFuZy5SdW5uYWJsZSkoIiArIHRlc3RNZXRob2ROYW1lLnRvTG93ZXJDYXNlKCkgKyAiPXRydWUpKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmaWx0ZXIgZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHJlZ2lzdGVyIHNlcnZpY2Ugd2hpY2ggZG9lcyBub3QgbWF0Y2gKLQkJCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCXByb3BzLnB1dCh0ZXN0TWV0aG9kTmFtZSwgQm9vbGVhbi5GQUxTRSk7Ci0JCQlyZWcgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksIHJ1bkl0LCBwcm9wcyk7Ci0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIHN0aWxsIG5vdCBtYXRjaAotCQkJcHJvcHMucHV0KCJ0ZXN0Q2hhbmdlUHJvcCIsIEJvb2xlYW4uRkFMU0UpOyAvLyROT04tTkxTLTEkCi0JCQlyZWcuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIG1hdGNoCi0JCQlwcm9wcy5wdXQodGVzdE1ldGhvZE5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZWcuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJEaWQgbm90IGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIHN0aWxsIG1hdGNoCi0JCQlwcm9wcy5wdXQoInRlc3RDaGFuZ2VQcm9wIiwgQm9vbGVhbi5UUlVFKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVnLnNldFByb3BlcnRpZXMocHJvcHMpOwotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQiLCByZXN1bHRzWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEIiwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRF9FTkRNQVRDSCIsIHJlc3VsdHNbMl0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORyIsIHJlc3VsdHNbM10pOyAvLyROT04tTkxTLTEkCi0JCQljbGVhclJlc3VsdHMocmVzdWx0cyk7Ci0KLQkJCS8vIGNoYW5nZSBwcm9wcyB0byBubyBsb25nZXIgbWF0Y2gKLQkJCXByb3BzLnB1dCh0ZXN0TWV0aG9kTmFtZSwgQm9vbGVhbi5GQUxTRSk7Ci0JCQlyZWcuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gdW5yZWdpc3RlcgotCQkJcmVnLnVucmVnaXN0ZXIoKTsKLQkJCXJlZyA9IG51bGw7Ci0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCU9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVtb3ZlU2VydmljZUxpc3RlbmVyKHRlc3RMaXN0ZW5lcik7Ci0JCQlpZiAocmVnICE9IG51bGwpCi0JCQkJcmVnLnVucmVnaXN0ZXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlTGlzdGVuZXIwMygpIHsKLQkJZmluYWwgU3RyaW5nIHRlc3RNZXRob2ROYW1lID0gZ2V0TmFtZSgpOwotCQkvLyBzaW1wbGUgU2VydmljZUxpc3RlbmVyIHRlc3QKLQkJUnVubmFibGUgcnVuSXQgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQl9OwotCQlmaW5hbCBpbnRbXSByZXN1bHRzID0gbmV3IGludFtdIHswLCAwLCAwLCAwfTsKLQkJU2VydmljZUxpc3RlbmVyIHRlc3RMaXN0ZW5lciA9IG5ldyBTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2aWNlQ2hhbmdlZChTZXJ2aWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewotCQkJCQljYXNlIFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIDoKLQkJCQkJCXJlc3VsdHNbMF0rKzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNlcnZpY2VFdmVudC5NT0RJRklFRCA6Ci0JCQkJCQlyZXN1bHRzWzFdKys7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0ggOgotCQkJCQkJcmVzdWx0c1syXSsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2VydmljZUV2ZW50LlVOUkVHSVNURVJJTkcgOgotCQkJCQkJcmVzdWx0c1szXSsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5hZGRTZXJ2aWNlTGlzdGVuZXIodGVzdExpc3RlbmVyLCAiKCYob2JqZWN0Y2xhc3M9amF2YS5sYW5nLlJ1bm5hYmxlKSgiICsgdGVzdE1ldGhvZE5hbWUudG9Mb3dlckNhc2UoKSArICI9dHJ1ZSkpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZpbHRlciBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWcxID0gbnVsbDsKLQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWcyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHJlZ2lzdGVyIHNlcnZpY2Ugd2hpY2ggZG9lcyBub3QgbWF0Y2gKLQkJCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCXByb3BzLnB1dCh0ZXN0TWV0aG9kTmFtZSwgQm9vbGVhbi5GQUxTRSk7Ci0JCQlyZWcxID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCQkJcmVnMiA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSwgcnVuSXQsIHByb3BzKTsKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIDAsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEIiwgMCwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0giLCAwLCByZXN1bHRzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgMCwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIHN0aWxsIG5vdCBtYXRjaAotCQkJcHJvcHMucHV0KCJ0ZXN0Q2hhbmdlUHJvcCIsIEJvb2xlYW4uRkFMU0UpOyAvLyROT04tTkxTLTEkCi0JCQlyZWcxLnNldFByb3BlcnRpZXMocHJvcHMpOwotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIiwgMCwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCAwLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRF9FTkRNQVRDSCIsIDAsIHJlc3VsdHNbMl0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50LlVOUkVHSVNURVJJTkciLCAwLCByZXN1bHRzWzNdKTsgLy8kTk9OLU5MUy0xJAotCQkJY2xlYXJSZXN1bHRzKHJlc3VsdHMpOwotCQkJcmVnMi5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIDAsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEIiwgMCwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0giLCAwLCByZXN1bHRzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgMCwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIG1hdGNoCi0JCQlwcm9wcy5wdXQodGVzdE1ldGhvZE5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZWcxLnNldFByb3BlcnRpZXMocHJvcHMpOwotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIiwgMCwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCAxLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRF9FTkRNQVRDSCIsIDAsIHJlc3VsdHNbMl0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50LlVOUkVHSVNURVJJTkciLCAwLCByZXN1bHRzWzNdKTsgLy8kTk9OLU5MUy0xJAotCQkJY2xlYXJSZXN1bHRzKHJlc3VsdHMpOwotCQkJcmVnMi5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIDAsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEIiwgMSwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0giLCAwLCByZXN1bHRzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgMCwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIHN0aWxsIG1hdGNoCi0JCQlwcm9wcy5wdXQoInRlc3RDaGFuZ2VQcm9wIiwgQm9vbGVhbi5UUlVFKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVnMS5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIDAsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEIiwgMSwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0giLCAwLCByZXN1bHRzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgMCwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQkJCXJlZzIuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQiLCAwLCByZXN1bHRzWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRCIsIDEsIHJlc3VsdHNbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIiwgMCwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORyIsIDAsIHJlc3VsdHNbM10pOyAvLyROT04tTkxTLTEkCi0JCQljbGVhclJlc3VsdHMocmVzdWx0cyk7Ci0KLQkJCS8vIGNoYW5nZSBwcm9wcyB0byBubyBsb25nZXIgbWF0Y2gKLQkJCXByb3BzLnB1dCh0ZXN0TWV0aG9kTmFtZSwgQm9vbGVhbi5GQUxTRSk7Ci0JCQlyZWcxLnNldFByb3BlcnRpZXMocHJvcHMpOwotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIiwgMCwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQiLCAwLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRF9FTkRNQVRDSCIsIDEsIHJlc3VsdHNbMl0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50LlVOUkVHSVNURVJJTkciLCAwLCByZXN1bHRzWzNdKTsgLy8kTk9OLU5MUy0xJAotCQkJY2xlYXJSZXN1bHRzKHJlc3VsdHMpOwotCQkJcmVnMi5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIDAsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEIiwgMCwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0giLCAxLCByZXN1bHRzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgMCwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gdW5yZWdpc3RlcgotCQkJcmVnMS51bnJlZ2lzdGVyKCk7Ci0JCQlyZWcxID0gbnVsbDsKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCIsIDAsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEIiwgMCwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuTU9ESUZJRURfRU5ETUFUQ0giLCAwLCByZXN1bHRzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5VTlJFR0lTVEVSSU5HIiwgMCwgcmVzdWx0c1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQkJCXJlZzIudW5yZWdpc3RlcigpOwotCQkJcmVnMiA9IG51bGw7Ci0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQiLCAwLCByZXN1bHRzWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJEaWQgZ2V0IFNlcnZpY2VFdmVudC5NT0RJRklFRCIsIDAsIHJlc3VsdHNbMV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIkRpZCBnZXQgU2VydmljZUV2ZW50Lk1PRElGSUVEX0VORE1BVENIIiwgMCwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiRGlkIGdldCBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORyIsIDAsIHJlc3VsdHNbM10pOyAvLyROT04tTkxTLTEkCi0JCQljbGVhclJlc3VsdHMocmVzdWx0cyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlbW92ZVNlcnZpY2VMaXN0ZW5lcih0ZXN0TGlzdGVuZXIpOwotCQkJaWYgKHJlZzEgIT0gbnVsbCkKLQkJCQlyZWcxLnVucmVnaXN0ZXIoKTsKLQkJCWlmIChyZWcyICE9IG51bGwpCi0JCQkJcmVnMi51bnJlZ2lzdGVyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZU9yZGVyaW5nMDEoKSB7Ci0JCWZpbmFsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSA9IGdldE5hbWUoKTsKLQkJLy8gdGVzdCB0aGF0IGdldFNlcnZpY2VSZWZlcmVuY2UgcmV0dXJucyB0aGUgcHJvcGVyIHNlcnZpY2UKLQkJUnVubmFibGUgcnVuSXQgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQl9OwotCQlIYXNodGFibGUgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dCgibmFtZSIsIHRlc3RNZXRob2ROYW1lKTsgLy8kTk9OLU5MUy0xJCAKLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX0RFU0NSSVBUSU9OLCAibWluIHZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX1JBTktJTkcsIG5ldyBJbnRlZ2VyKEludGVnZXIuTUlOX1ZBTFVFKSk7Ci0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnMSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSwgcnVuSXQsIHByb3BzKTsKLQotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJtYXggdmFsdWUgZmlyc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfUkFOS0lORywgbmV3IEludGVnZXIoSW50ZWdlci5NQVhfVkFMVUUpKTsKLQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWcyID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9ERVNDUklQVElPTiwgIm1heCB2YWx1ZSBzZWNvbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfUkFOS0lORywgbmV3IEludGVnZXIoSW50ZWdlci5NQVhfVkFMVUUpKTsKLQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWczID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCi0JCXRyeSB7Ci0JCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZiA9IG51bGw7Ci0JCQlyZWYgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydE5vdE51bGwoInNlcnZpY2UgcmVmIGlzIG51bGwiLCByZWYpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIldyb25nIHJlZmVyZW5jZXMiLCByZWcyLmdldFJlZmVyZW5jZSgpLCByZWYpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVnMSAhPSBudWxsKQotCQkJCXJlZzEudW5yZWdpc3RlcigpOwotCQkJaWYgKHJlZzIgIT0gbnVsbCkKLQkJCQlyZWcyLnVucmVnaXN0ZXIoKTsKLQkJCWlmIChyZWczICE9IG51bGwpCi0JCQkJcmVnMy51bnJlZ2lzdGVyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlT2JqZWN0Q2xhc3MoKSB7Ci0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZyA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTdHJpbmdbXSB7UnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpfSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gbm90aGluZwotCQkJCX0KLQkJCX0sIG51bGwpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHJlZ2lzdGVyIHNlcnZpY2Ugd2l0aCBkdXBsaWNhdGUgb2JqZWN0Q2xhc3MgbmFtZXMiLCB0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlZyAhPSBudWxsKQotCQkJCXJlZy51bnJlZ2lzdGVyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVJlZmVyZW5jZUNvbXBhcmUwMSgpIHsKLQkJZmluYWwgU3RyaW5nIHRlc3RNZXRob2ROYW1lID0gZ2V0TmFtZSgpOwotCQkvLyB0ZXN0IHRoYXQgZ2V0U2VydmljZVJlZmVyZW5jZSByZXR1cm5zIHRoZSBwcm9wZXIgc2VydmljZQotCQlSdW5uYWJsZSBydW5JdCA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KCJuYW1lIiwgdGVzdE1ldGhvZE5hbWUpOyAvLyROT04tTkxTLTEkIAotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJtaW4gdmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfUkFOS0lORywgbmV3IEludGVnZXIoSW50ZWdlci5NSU5fVkFMVUUpKTsKLQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWcxID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9ERVNDUklQVElPTiwgIm1heCB2YWx1ZSBmaXJzdCIpOyAvLyROT04tTkxTLTEkCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9SQU5LSU5HLCBuZXcgSW50ZWdlcihJbnRlZ2VyLk1BWF9WQUxVRSkpOwotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZzIgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksIHJ1bkl0LCBwcm9wcyk7Ci0KLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX0RFU0NSSVBUSU9OLCAibWF4IHZhbHVlIHNlY29uZCIpOyAvLyROT04tTkxTLTEkCi0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9SQU5LSU5HLCBuZXcgSW50ZWdlcihJbnRlZ2VyLk1BWF9WQUxVRSkpOwotCQlTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZzMgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksIHJ1bkl0LCBwcm9wcyk7Ci0KLQkJdHJ5IHsKLQkJCVNlcnZpY2VSZWZlcmVuY2UgcmVmID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKFJ1bm5hYmxlLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZjEgPSByZWcxLmdldFJlZmVyZW5jZSgpOwotCQkJU2VydmljZVJlZmVyZW5jZSByZWYyID0gcmVnMi5nZXRSZWZlcmVuY2UoKTsKLQkJCVNlcnZpY2VSZWZlcmVuY2UgcmVmMyA9IHJlZzMuZ2V0UmVmZXJlbmNlKCk7Ci0KLQkJCWFzc2VydE5vdE51bGwoInNlcnZpY2UgcmVmIGlzIG51bGwiLCByZWYpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRFcXVhbHMoIldyb25nIHJlZmVyZW5jZSIsIHJlZjIsIHJlZik7IC8vJE5PTi1OTFMtMSQKLQotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyByZWZlcmVuY2VzIiwgMCwgcmVmMi5jb21wYXJlVG8ocmVmKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgcmVmZXJlbmNlcyIsIDAsIHJlZi5jb21wYXJlVG8ocmVmMikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFzc2VydFRydWUoIldyb25nIGNvbXBhcmVUbyB2YWx1ZTogIiArIHJlZjEuY29tcGFyZVRvKHJlZjEpLCByZWYxLmNvbXBhcmVUbyhyZWYxKSA9PSAwKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgY29tcGFyZVRvIHZhbHVlOiAiICsgcmVmMS5jb21wYXJlVG8ocmVmMiksIHJlZjEuY29tcGFyZVRvKHJlZjIpIDwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIldyb25nIGNvbXBhcmVUbyB2YWx1ZTogIiArIHJlZjEuY29tcGFyZVRvKHJlZjMpLCByZWYxLmNvbXBhcmVUbyhyZWYzKSA8IDApOyAvLyROT04tTkxTLTEkCi0KLQkJCWFzc2VydFRydWUoIldyb25nIGNvbXBhcmVUbyB2YWx1ZTogIiArIHJlZjIuY29tcGFyZVRvKHJlZjEpLCByZWYyLmNvbXBhcmVUbyhyZWYxKSA+IDApOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJXcm9uZyBjb21wYXJlVG8gdmFsdWU6ICIgKyByZWYyLmNvbXBhcmVUbyhyZWYyKSwgcmVmMi5jb21wYXJlVG8ocmVmMikgPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIldyb25nIGNvbXBhcmVUbyB2YWx1ZTogIiArIHJlZjIuY29tcGFyZVRvKHJlZjMpLCByZWYyLmNvbXBhcmVUbyhyZWYzKSA+IDApOyAvLyROT04tTkxTLTEkCi0KLQkJCWFzc2VydFRydWUoIldyb25nIGNvbXBhcmVUbyB2YWx1ZTogIiArIHJlZjMuY29tcGFyZVRvKHJlZjEpLCByZWYzLmNvbXBhcmVUbyhyZWYxKSA+IDApOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJXcm9uZyBjb21wYXJlVG8gdmFsdWU6ICIgKyByZWYzLmNvbXBhcmVUbyhyZWYyKSwgcmVmMy5jb21wYXJlVG8ocmVmMikgPCAwKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgY29tcGFyZVRvIHZhbHVlOiAiICsgcmVmMy5jb21wYXJlVG8ocmVmMyksIHJlZjMuY29tcGFyZVRvKHJlZjMpID09IDApOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVnMSAhPSBudWxsKQotCQkJCXJlZzEudW5yZWdpc3RlcigpOwotCQkJaWYgKHJlZzIgIT0gbnVsbCkKLQkJCQlyZWcyLnVucmVnaXN0ZXIoKTsKLQkJCWlmIChyZWczICE9IG51bGwpCi0JCQkJcmVnMy51bnJlZ2lzdGVyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZpZWRSYW5raW5nKCkgewotCQlSdW5uYWJsZSBydW5JdCA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KGdldE5hbWUoKSwgQm9vbGVhbi5UUlVFKTsKLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX1JBTktJTkcsIG5ldyBJbnRlZ2VyKDE1KSk7Ci0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnMSA9IGdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfUkFOS0lORywgbmV3IEludGVnZXIoMTApKTsKLQkJU2VydmljZVJlZ2lzdHJhdGlvbiByZWcyID0gZ2V0Q29udGV4dCgpLnJlZ2lzdGVyU2VydmljZShSdW5uYWJsZS5jbGFzcy5nZXROYW1lKCksIHJ1bkl0LCBwcm9wcyk7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNlcnZpY2UgcmVmZXJlbmNlIiwgcmVnMS5nZXRSZWZlcmVuY2UoKSwgZ2V0Q29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoImphdmEubGFuZy5SdW5uYWJsZSIpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQotCQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX1JBTktJTkcsIG5ldyBJbnRlZ2VyKDIwKSk7Ci0JCQlyZWcyLnNldFByb3BlcnRpZXMocHJvcHMpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzZXJ2aWNlIHJlZmVyZW5jZSIsIHJlZzIuZ2V0UmVmZXJlbmNlKCksIGdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKCJqYXZhLmxhbmcuUnVubmFibGUiKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVnMSAhPSBudWxsKQotCQkJCXJlZzEudW5yZWdpc3RlcigpOwotCQkJaWYgKHJlZzIgIT0gbnVsbCkKLQkJCQlyZWcyLnVucmVnaXN0ZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclJlc3VsdHMoYm9vbGVhbltdIHJlc3VsdHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKQotCQkJcmVzdWx0c1tpXSA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclJlc3VsdHMoaW50W10gcmVzdWx0cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspCi0JCQlyZXN1bHRzW2ldID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXJlZ2lzdHJ5L1NlcnZpY2VUcmFja2VyVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcmVnaXN0cnkvU2VydmljZVRyYWNrZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTVmZWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcmVnaXN0cnkvU2VydmljZVRyYWNrZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VyZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLmJ1bmRsZXMuQWJzdHJhY3RCdW5kbGVUZXN0czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyQ3VzdG9taXplcjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VUcmFja2VyVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZVRlc3RzIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlcnZpY2VUcmFja2VyVGVzdHMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlVHJhY2tlcjAxKCkgewotCQlmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUgPSBnZXROYW1lKCk7Ci0JCS8vIHNpbXBsZSBTZXJ2aWNlVHJhY2tlciB0ZXN0Ci0JCVJ1bm5hYmxlIHJ1bkl0ID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQkJSGFzaHRhYmxlIHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQodGVzdE1ldGhvZE5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCQlTZXJ2aWNlVHJhY2tlciB0ZXN0VHJhY2tlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBib29sZWFuW10gcmVzdWx0cyA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZSwgZmFsc2V9OwotCQkJU2VydmljZVRyYWNrZXJDdXN0b21pemVyIHRlc3RDdXN0b21pemVyID0gbmV3IFNlcnZpY2VUcmFja2VyQ3VzdG9taXplcigpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGFkZGluZ1NlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJCQkJcmVzdWx0c1swXSA9IHRydWU7Ci0JCQkJCXJldHVybiByZWZlcmVuY2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgbW9kaWZpZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewotCQkJCQlyZXN1bHRzWzFdID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCQkJcmVzdWx0c1syXSA9IHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJdGVzdFRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgRnJhbWV3b3JrVXRpbC5jcmVhdGVGaWx0ZXIoIigmKG9iamVjdGNsYXNzPWphdmEubGFuZy5SdW5uYWJsZSkoIiArIHRlc3RNZXRob2ROYW1lLnRvTG93ZXJDYXNlKCkgKyAiPXRydWUpKSIpLCB0ZXN0Q3VzdG9taXplcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiZmlsdGVyIGVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRlc3RUcmFja2VyLm9wZW4oKTsKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIHN0aWxsIG1hdGNoCi0JCQlwcm9wcy5wdXQoInRlc3RDaGFuZ2VQcm9wIiwgQm9vbGVhbi5GQUxTRSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIG5vIGxvbmdlciBtYXRjaAotCQkJcHJvcHMucHV0KHRlc3RNZXRob2ROYW1lLCBCb29sZWFuLkZBTFNFKTsKLQkJCXJlZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIG5vIGxvbmdlciBtYXRjaAotCQkJcHJvcHMucHV0KCJ0ZXN0Q2hhbmdlUHJvcCIsIEJvb2xlYW4uVFJVRSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIGJhY2sgdG8gbWF0Y2gKLQkJCXByb3BzLnB1dCh0ZXN0TWV0aG9kTmFtZSwgQm9vbGVhbi5UUlVFKTsKLQkJCXJlZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlZyAhPSBudWxsKQotCQkJCXJlZy51bnJlZ2lzdGVyKCk7Ci0JCQlpZiAodGVzdFRyYWNrZXIgIT0gbnVsbCkKLQkJCQl0ZXN0VHJhY2tlci5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcnZpY2VUcmFja2VyMDIoKSB7Ci0JCWZpbmFsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSA9IGdldE5hbWUoKTsKLQkJLy8gc2ltcGxlIFNlcnZpY2VUcmFja2VyIHRlc3QKLQkJUnVubmFibGUgcnVuSXQgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfQotCQl9OwotCQlIYXNodGFibGUgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dCh0ZXN0TWV0aG9kTmFtZSwgQm9vbGVhbi5GQUxTRSk7Ci0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCQlTZXJ2aWNlVHJhY2tlciB0ZXN0VHJhY2tlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBib29sZWFuW10gcmVzdWx0cyA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZSwgZmFsc2V9OwotCQkJU2VydmljZVRyYWNrZXJDdXN0b21pemVyIHRlc3RDdXN0b21pemVyID0gbmV3IFNlcnZpY2VUcmFja2VyQ3VzdG9taXplcigpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGFkZGluZ1NlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJCQkJcmVzdWx0c1swXSA9IHRydWU7Ci0JCQkJCXJldHVybiByZWZlcmVuY2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgbW9kaWZpZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewotCQkJCQlyZXN1bHRzWzFdID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCQkJcmVzdWx0c1syXSA9IHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJdGVzdFRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgRnJhbWV3b3JrVXRpbC5jcmVhdGVGaWx0ZXIoIigmKG9iamVjdGNsYXNzPWphdmEubGFuZy5SdW5uYWJsZSkoIiArIHRlc3RNZXRob2ROYW1lLnRvTG93ZXJDYXNlKCkgKyAiPXRydWUpKSIpLCB0ZXN0Q3VzdG9taXplcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiZmlsdGVyIGVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRlc3RUcmFja2VyLm9wZW4oKTsKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIG1hdGNoCi0JCQlwcm9wcy5wdXQodGVzdE1ldGhvZE5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZWcuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQlhc3NlcnRUcnVlKCJEaWQgbm90IGNhbGwgYWRkaW5nU2VydmljZSIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGNhbGwgbW9kaWZpZWRTZXJ2aWNlIiwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCByZW1vdmVkU2VydmljZSIsIHJlc3VsdHNbMl0pOyAvLyROT04tTkxTLTEkCi0JCQljbGVhclJlc3VsdHMocmVzdWx0cyk7Ci0KLQkJCS8vIGNoYW5nZSBwcm9wcyB0byBzdGlsbCBtYXRjaAotCQkJcHJvcHMucHV0KCJ0ZXN0Q2hhbmdlUHJvcCIsIEJvb2xlYW4uVFJVRSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIG5vIGxvbmdlciBtYXRjaAotCQkJcHJvcHMucHV0KHRlc3RNZXRob2ROYW1lLCBCb29sZWFuLkZBTFNFKTsKLQkJCXJlZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIG5vIGxvbmdlciBtYXRjaAotCQkJcHJvcHMucHV0KCJ0ZXN0Q2hhbmdlUHJvcCIsIEJvb2xlYW4uRkFMU0UpOyAvLyROT04tTkxTLTEkCi0JCQlyZWcuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQlhc3NlcnRGYWxzZSgiRGlkIGNhbGwgYWRkaW5nU2VydmljZSIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGNhbGwgbW9kaWZpZWRTZXJ2aWNlIiwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCByZW1vdmVkU2VydmljZSIsIHJlc3VsdHNbMl0pOyAvLyROT04tTkxTLTEkCi0JCQljbGVhclJlc3VsdHMocmVzdWx0cyk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZWcudW5yZWdpc3RlcigpOwotCQkJaWYgKHRlc3RUcmFja2VyICE9IG51bGwpCi0JCQkJdGVzdFRyYWNrZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlVHJhY2tlcjAzKCkgewotCQlmaW5hbCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUgPSBnZXROYW1lKCk7Ci0JCS8vIHNpbXBsZSBTZXJ2aWNlVHJhY2tlciB0ZXN0Ci0JCVJ1bm5hYmxlIHJ1bkl0ID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQkJSGFzaHRhYmxlIHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQodGVzdE1ldGhvZE5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0JCVNlcnZpY2VSZWdpc3RyYXRpb24gcmVnID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoUnVubmFibGUuY2xhc3MuZ2V0TmFtZSgpLCBydW5JdCwgcHJvcHMpOwotCQlTZXJ2aWNlVHJhY2tlciB0ZXN0VHJhY2tlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBib29sZWFuW10gcmVzdWx0cyA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZSwgZmFsc2V9OwotCQkJU2VydmljZVRyYWNrZXJDdXN0b21pemVyIHRlc3RDdXN0b21pemVyID0gbmV3IFNlcnZpY2VUcmFja2VyQ3VzdG9taXplcigpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGFkZGluZ1NlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJCQkJcmVzdWx0c1swXSA9IHRydWU7Ci0JCQkJCXJldHVybiByZWZlcmVuY2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgbW9kaWZpZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewotCQkJCQlyZXN1bHRzWzFdID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJCQkJcmVzdWx0c1syXSA9IHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJdGVzdFRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKSwgRnJhbWV3b3JrVXRpbC5jcmVhdGVGaWx0ZXIoIigmKG9iamVjdGNsYXNzPWphdmEubGFuZy5SdW5uYWJsZSkoIiArIHRlc3RNZXRob2ROYW1lLnRvTG93ZXJDYXNlKCkgKyAiPXRydWUpKSIpLCB0ZXN0Q3VzdG9taXplcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiZmlsdGVyIGVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRlc3RUcmFja2VyLm9wZW4oKTsKLQkJCWFzc2VydFRydWUoIkRpZCBub3QgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RmFsc2UoIkRpZCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIG5vdCBtYXRjaAotCQkJcHJvcHMucHV0KHRlc3RNZXRob2ROYW1lLCBCb29sZWFuLkZBTFNFKTsKLQkJCXJlZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBhZGRpbmdTZXJ2aWNlIiwgcmVzdWx0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCBtb2RpZmllZFNlcnZpY2UiLCByZXN1bHRzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBjYWxsIHJlbW92ZWRTZXJ2aWNlIiwgcmVzdWx0c1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyUmVzdWx0cyhyZXN1bHRzKTsKLQotCQkJLy8gY2hhbmdlIHByb3BzIHRvIG1hdGNoCi0JCQlwcm9wcy5wdXQodGVzdE1ldGhvZE5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZWcuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQlhc3NlcnRUcnVlKCJEaWQgbm90IGNhbGwgYWRkaW5nU2VydmljZSIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRGYWxzZSgiRGlkIGNhbGwgbW9kaWZpZWRTZXJ2aWNlIiwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCByZW1vdmVkU2VydmljZSIsIHJlc3VsdHNbMl0pOyAvLyROT04tTkxTLTEkCi0JCQljbGVhclJlc3VsdHMocmVzdWx0cyk7Ci0KLQkJCS8vIGNoYW5nZSBwcm9wcyB0byBzdGlsbCBtYXRjaAotCQkJcHJvcHMucHV0KCJ0ZXN0Q2hhbmdlUHJvcCIsIEJvb2xlYW4uRkFMU0UpOyAvLyROT04tTkxTLTEkCi0JCQlyZWcuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0JCQlhc3NlcnRGYWxzZSgiRGlkIGNhbGwgYWRkaW5nU2VydmljZSIsIHJlc3VsdHNbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJEaWQgbm90IGNhbGwgbW9kaWZpZWRTZXJ2aWNlIiwgcmVzdWx0c1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydEZhbHNlKCJEaWQgY2FsbCByZW1vdmVkU2VydmljZSIsIHJlc3VsdHNbMl0pOyAvLyROT04tTkxTLTEkCi0JCQljbGVhclJlc3VsdHMocmVzdWx0cyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVnICE9IG51bGwpCi0JCQkJcmVnLnVucmVnaXN0ZXIoKTsKLQkJCWlmICh0ZXN0VHJhY2tlciAhPSBudWxsKQotCQkJCXRlc3RUcmFja2VyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJSZXN1bHRzKGJvb2xlYW5bXSByZXN1bHRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykKLQkJCXJlc3VsdHNbaV0gPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvZGF0YWxvY2F0aW9uL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvZGF0YWxvY2F0aW9uL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGY0ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL2RhdGFsb2NhdGlvbi9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLmRhdGFsb2NhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgQWxsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFsbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KExvY2F0aW9uQXJlYVNlc3Npb25UZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEJhc2ljTG9jYXRpb25UZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChTaW1wbGVUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChGaWxlTWFuYWdlclRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFN0cmVhbU1hbmFnZXJUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9kYXRhbG9jYXRpb24vQmFzaWNMb2NhdGlvblRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvZGF0YWxvY2F0aW9uL0Jhc2ljTG9jYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDEyZjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9kYXRhbG9jYXRpb24vQmFzaWNMb2NhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLmRhdGFsb2NhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5Mb2NhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLkNvcmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdHNBY3RpdmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY0xvY2F0aW9uVGVzdHMgZXh0ZW5kcyBDb3JlVGVzdCB7Ci0KLQlTdHJpbmcgb3JpZ2luYWxVc2VyID0gbnVsbDsKLQlTdHJpbmcgb3JpZ2luYWxJbnN0YW5jZSA9IG51bGw7Ci0JU3RyaW5nIG9yaWdpbmFsQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0JU3RyaW5nIG9yaWdpbmFsSW5zdGFsbCA9IG51bGw7Ci0JU3RyaW5nIHByZWZpeCA9ICIiOwotCWJvb2xlYW4gd2luZG93cyA9IFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLk9TX1dJTjMyKTsKLQotCXB1YmxpYyBCYXNpY0xvY2F0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShCYXNpY0xvY2F0aW9uVGVzdHMuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXByZWZpeCA9IHdpbmRvd3MgPyAiYzoiIDogIiI7Ci0JCW9yaWdpbmFsVXNlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9VU0VSX0FSRUEpOwotCQlvcmlnaW5hbEluc3RhbmNlID0gU3lzdGVtLmdldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0lOU1RBTkNFX0FSRUEpOwotCQlvcmlnaW5hbENvbmZpZ3VyYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoTG9jYXRpb25NYW5hZ2VyLlBST1BfQ09ORklHX0FSRUEpOwotCQlvcmlnaW5hbEluc3RhbGwgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoTG9jYXRpb25NYW5hZ2VyLlBST1BfSU5TVEFMTF9BUkVBKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoa2V5KTsKLQkJZWxzZQotCQkJU3lzdGVtLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX1VTRVJfQVJFQSwgb3JpZ2luYWxVc2VyKTsKLQkJc2V0UHJvcGVydHkoTG9jYXRpb25NYW5hZ2VyLlBST1BfSU5TVEFOQ0VfQVJFQSwgb3JpZ2luYWxJbnN0YW5jZSk7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0NPTkZJR19BUkVBLCBvcmlnaW5hbENvbmZpZ3VyYXRpb24pOwotCQlzZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9JTlNUQUxMX0FSRUEsIG9yaWdpbmFsSW5zdGFsbCk7Ci0JCUxvY2F0aW9uTWFuYWdlci5pbml0aWFsaXplTG9jYXRpb25zKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU2xhc2hlcygpIHsKLQkJY2hlY2tMb2NhdGlvbihMb2NhdGlvbk1hbmFnZXIuZ2V0VXNlckxvY2F0aW9uKCksIHRydWUsIHRydWUsIG51bGwpOwotCQljaGVja0xvY2F0aW9uKExvY2F0aW9uTWFuYWdlci5nZXRJbnN0YW5jZUxvY2F0aW9uKCksIHRydWUsIHRydWUsIG51bGwpOwotCQljaGVja0xvY2F0aW9uKExvY2F0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCWNoZWNrTG9jYXRpb24oTG9jYXRpb25NYW5hZ2VyLmdldEluc3RhbGxMb2NhdGlvbigpLCB0cnVlLCB0cnVlLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tMb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbiwgYm9vbGVhbiBsZWFkaW5nLCBib29sZWFuIHRyYWlsaW5nLCBTdHJpbmcgc2NoZW1lKSB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlVUkwgdXJsID0gbG9jYXRpb24uZ2V0VVJMKCk7Ci0JCWlmIChzY2hlbWUgIT0gbnVsbCkKLQkJCWFzc2VydEVxdWFscyhzY2hlbWUsIHVybC5nZXRQcm90b2NvbCgpKTsKLQkJaWYgKCF1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkKLQkJCXJldHVybjsKLQkJYXNzZXJ0VHJ1ZSh1cmwudG9FeHRlcm5hbEZvcm0oKSArICIgc2hvdWxkICIgKyAodHJhaWxpbmcgPyAiIiA6ICJub3QiKSArICIgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoIiwgdXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpID09IHRyYWlsaW5nKTsKLQkJaWYgKHdpbmRvd3MpCi0JCQlhc3NlcnRUcnVlKHVybC50b0V4dGVybmFsRm9ybSgpICsgIiBzaG91bGQgIiArIChsZWFkaW5nID8gIiIgOiAibm90IikgKyAiIGhhdmUgYSBsZWFkaW5nIHNsYXNoIiwgdXJsLmdldEZpbGUoKS5zdGFydHNXaXRoKCIvIikgPT0gbGVhZGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUxvY2F0aW9uMDEoKSB7Ci0JCUxvY2F0aW9uIGNvbmZpZ0xvY2F0aW9uID0gTG9jYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQlGaWxlIHRlc3RMb2NhdGlvbkZpbGUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZXN0TG9jYXRpb25zL3Rlc3RDcmVhdGVMb2NhdGlvbjAxIik7Ci0JCUxvY2F0aW9uIHRlc3RMb2NhdGlvbiA9IGNvbmZpZ0xvY2F0aW9uLmNyZWF0ZUxvY2F0aW9uKG51bGwsIG51bGwsIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCXRlc3RMb2NhdGlvbi5zZXQodGVzdExvY2F0aW9uRmlsZS50b1VSTCgpLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc2V0IGxvY2F0aW9uIiwgdCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIkNvdWxkIG5vdCBsb2NrIGxvY2F0aW9uIiwgdGVzdExvY2F0aW9uLmxvY2soKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBsb2NrIGxvY2F0aW9uIiwgZSk7Ci0JCX0KLQkJdGVzdExvY2F0aW9uLnJlbGVhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTG9jYXRpb24wMigpIHsKLQkJTG9jYXRpb24gY29uZmlnTG9jYXRpb24gPSBMb2NhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCUZpbGUgdGVzdExvY2F0aW9uRmlsZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RMb2NhdGlvbnMvdGVzdENyZWF0ZUxvY2F0aW9uMDIiKTsKLQkJTG9jYXRpb24gdGVzdExvY2F0aW9uID0gY29uZmlnTG9jYXRpb24uY3JlYXRlTG9jYXRpb24obnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0TG9jYXRpb24uc2V0KHRlc3RMb2NhdGlvbkZpbGUudG9VUkwoKSwgZmFsc2UpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHNldCBsb2NhdGlvbiIsIHQpOwotCQl9Ci0JCXRyeSB7Ci0JCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgbG9jayBsb2NhdGlvbiIsIHRlc3RMb2NhdGlvbi5sb2NrKCkpOwotCQkJdGVzdExvY2F0aW9uLnJlbGVhc2UoKTsKLQkJCWZhaWwoIlNob3VsZCBub3QgYmUgYWJsZSB0byBsb2NrIHJlYWQtb25seSBsb2NhdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUxvY2F0aW9uMDMoKSB7Ci0JCUxvY2F0aW9uIGNvbmZpZ0xvY2F0aW9uID0gTG9jYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQlGaWxlIHRlc3RMb2NhdGlvbkZpbGUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZXN0TG9jYXRpb25zL3Rlc3RDcmVhdGVMb2NhdGlvbjAzIik7Ci0JCUxvY2F0aW9uIHRlc3RMb2NhdGlvbiA9IGNvbmZpZ0xvY2F0aW9uLmNyZWF0ZUxvY2F0aW9uKG51bGwsIG51bGwsIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCXRlc3RMb2NhdGlvbi5zZXQodGVzdExvY2F0aW9uRmlsZS50b1VSTCgpLCB0cnVlKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzZXQgbG9jYXRpb24iLCB0KTsKLQkJfQotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGxvY2sgbG9jYXRpb24iLCB0ZXN0TG9jYXRpb24uaXNMb2NrZWQoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBsb2NrIGxvY2F0aW9uIiwgZSk7Ci0JCX0KLQkJdGVzdExvY2F0aW9uLnJlbGVhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTG9jYXRpb24wNCgpIHsKLQkJTG9jYXRpb24gY29uZmlnTG9jYXRpb24gPSBMb2NhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCUZpbGUgdGVzdExvY2F0aW9uRmlsZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RMb2NhdGlvbnMvdGVzdENyZWF0ZUxvY2F0aW9uMDQiKTsKLQkJTG9jYXRpb24gdGVzdExvY2F0aW9uID0gY29uZmlnTG9jYXRpb24uY3JlYXRlTG9jYXRpb24obnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0TG9jYXRpb24uc2V0KHRlc3RMb2NhdGlvbkZpbGUudG9VUkwoKSwgdHJ1ZSk7Ci0JCQl0ZXN0TG9jYXRpb24ucmVsZWFzZSgpOwotCQkJZmFpbCgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIGxvY2sgcmVhZC1vbmx5IGxvY2F0aW9uIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUxvY2F0aW9uMDUoKSB7Ci0JCUxvY2F0aW9uIGNvbmZpZ0xvY2F0aW9uID0gTG9jYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQlGaWxlIHRlc3RMb2NhdGlvbkZpbGUgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKCJ0ZXN0TG9jYXRpb25zL3Rlc3RDcmVhdGVMb2NhdGlvbjAxIik7Ci0JCUxvY2F0aW9uIHRlc3RMb2NhdGlvbiA9IGNvbmZpZ0xvY2F0aW9uLmNyZWF0ZUxvY2F0aW9uKG51bGwsIG51bGwsIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCXRlc3RMb2NhdGlvbi5zZXQodGVzdExvY2F0aW9uRmlsZS50b1VSTCgpLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc2V0IGxvY2F0aW9uIiwgdCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIkNvdWxkIG5vdCBsb2NrIGxvY2F0aW9uIiwgdGVzdExvY2F0aW9uLmxvY2soKSk7Ci0JCQlhc3NlcnRGYWxzZSgiQ291bGQgbG9jayBhIHNlY2VuZCB0aW1lIiwgdGVzdExvY2F0aW9uLmxvY2soKSk7Ci0JCQlhc3NlcnRGYWxzZSgiQ291bGQgbG9jayBhIHRoaXJkIHRpbWUiLCB0ZXN0TG9jYXRpb24ubG9jaygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGxvY2sgbG9jYXRpb24iLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRlc3RMb2NhdGlvbi5yZWxlYXNlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIkNvdWxkIG5vdCBsb2NrIGxvY2F0aW9uIiwgdGVzdExvY2F0aW9uLmxvY2soKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBsb2NrIGxvY2F0aW9uIiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0ZXN0TG9jYXRpb24ucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTkNFX0RBVEFfQVJFQV9QUkVGSVggPSAiLm1ldGFkYXRhLy5wbHVnaW5zLyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbkRhdGFBcmVhMDEoKSB7Ci0JCUxvY2F0aW9uIGluc3RhbmNlID0gTG9jYXRpb25NYW5hZ2VyLmdldEluc3RhbmNlTG9jYXRpb24oKTsKLQkJZG9BbGxUZXN0TG9jYXRpb25EYXRhQXJlYShpbnN0YW5jZSwgSU5TVEFOQ0VfREFUQV9BUkVBX1BSRUZJWCk7Ci0KLQkJTG9jYXRpb24gY29uZmlndXJhdGlvbiA9IExvY2F0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJZG9BbGxUZXN0TG9jYXRpb25EYXRhQXJlYShjb25maWd1cmF0aW9uLCAiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvQWxsVGVzdExvY2F0aW9uRGF0YUFyZWEoTG9jYXRpb24gbG9jYXRpb24sIFN0cmluZyBkYXRhQXJlYVByZWZpeCkgewotCQlkb1Rlc3RMb2NhdGVEYXRhQXJlYShsb2NhdGlvbiwgZGF0YUFyZWFQcmVmaXgsIGdldE5hbWUoKSk7Ci0JCWRvVGVzdExvY2F0ZURhdGFBcmVhKGxvY2F0aW9uLCBkYXRhQXJlYVByZWZpeCwgIiIpOwotCQlkb1Rlc3RMb2NhdGVEYXRhQXJlYShsb2NhdGlvbiwgZGF0YUFyZWFQcmVmaXgsICJ0ZXN0L211bHRpcGxlL3BhdGhzIik7Ci0JCWRvVGVzdExvY2F0ZURhdGFBcmVhKGxvY2F0aW9uLCBkYXRhQXJlYVByZWZpeCwgInRlc3QvbXVsdGlwbGUvLi4vcGF0aHMiKTsKLQkJZG9UZXN0TG9jYXRlRGF0YUFyZWEobG9jYXRpb24sIGRhdGFBcmVhUHJlZml4LCAidGVzdFxcbXVsdGlwbGVcXHBhdGhzIik7Ci0KLQkJRmlsZSB0ZXN0TG9jYXRpb25GaWxlID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdExvY2F0aW9ucy8iICsgZ2V0TmFtZSgpKTsKLQkJTG9jYXRpb24gY3JlYXRlZExvY2F0aW9uID0gbG9jYXRpb24uY3JlYXRlTG9jYXRpb24obnVsbCwgbnVsbCwgZmFsc2UpOwotCQl0cnkgewotCQkJY3JlYXRlZExvY2F0aW9uLnNldCh0ZXN0TG9jYXRpb25GaWxlLnRvVVJMKCksIGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBzZXQgbG9jYXRpb24iLCBlKTsKLQkJfQotCQlkb1Rlc3RMb2NhdGVEYXRhQXJlYShjcmVhdGVkTG9jYXRpb24sIGRhdGFBcmVhUHJlZml4LCBnZXROYW1lKCkpOwotCQlkb1Rlc3RMb2NhdGVEYXRhQXJlYShjcmVhdGVkTG9jYXRpb24sIGRhdGFBcmVhUHJlZml4LCAiIik7Ci0JCWRvVGVzdExvY2F0ZURhdGFBcmVhKGNyZWF0ZWRMb2NhdGlvbiwgZGF0YUFyZWFQcmVmaXgsICJ0ZXN0L211bHRpcGxlL3BhdGhzIik7Ci0JCWRvVGVzdExvY2F0ZURhdGFBcmVhKGNyZWF0ZWRMb2NhdGlvbiwgZGF0YUFyZWFQcmVmaXgsICJ0ZXN0L211bHRpcGxlLy4uL3BhdGhzIik7Ci0JCWRvVGVzdExvY2F0ZURhdGFBcmVhKGxvY2F0aW9uLCBkYXRhQXJlYVByZWZpeCwgInRlc3RcXG11bHRpcGxlXFxwYXRocyIpOwotCi0JCWNyZWF0ZWRMb2NhdGlvbiA9IGxvY2F0aW9uLmNyZWF0ZUxvY2F0aW9uKG51bGwsIG51bGwsIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCWNyZWF0ZWRMb2NhdGlvbi5nZXREYXRhQXJlYSgic2hvdWxkRmFpbCIpOwotCQkJZmFpbCgiZXhwZWN0ZWQgZmFpbHVyZSB3aGVuIGxvY2F0aW9uIGlzIG5vdCBzZXQiKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9UZXN0TG9jYXRlRGF0YUFyZWEoTG9jYXRpb24gbG9jYXRpb24sIFN0cmluZyBkYXRhQXJlYVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSkgewotCQlhc3NlcnRUcnVlKCJMb2NhdGlvbiBpcyBub3Qgc2V0IiwgbG9jYXRpb24uaXNTZXQoKSk7Ci0JCVVSTCBkYXRhQXJlYSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkYXRhQXJlYSA9IGxvY2F0aW9uLmdldERhdGFBcmVhKG5hbWVzcGFjZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBnZXQgZGF0YSBhcmVhLiIsIGUpOwotCQl9Ci0JCWFzc2VydE5vdE51bGwoIkRhdGEgYXJlYSBpcyBudWxsLiIsIGRhdGFBcmVhKTsKLQotCQluYW1lc3BhY2UgPSBuYW1lc3BhY2UucmVwbGFjZSgnXFwnLCAnLycpOwotCQlhc3NlcnRUcnVlKCJEYXRhIGFyZWEgaXMgbm90IHRoZSBleHBlY3RlZCB2YWx1ZTogIiArIGRhdGFBcmVhLnRvRXh0ZXJuYWxGb3JtKCksIGRhdGFBcmVhLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoZGF0YUFyZWFQcmVmaXggKyBuYW1lc3BhY2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TG9jYXRpb25XaXRoRW1wdHlMb2NrRmlsZSgpIHsKLQkJTG9jYXRpb24gY29uZmlnTG9jYXRpb24gPSBMb2NhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCUZpbGUgdGVzdExvY2F0aW9uRmlsZSA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoInRlc3RMb2NhdGlvbnMvdGVzdFNldExvY2F0aW9uV2l0aEVtcHR5TG9ja0ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlMb2NhdGlvbiB0ZXN0TG9jYXRpb24gPSBjb25maWdMb2NhdGlvbi5jcmVhdGVMb2NhdGlvbihudWxsLCBudWxsLCBmYWxzZSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0TG9jYXRpb24uc2V0KHRlc3RMb2NhdGlvbkZpbGUudG9VUkwoKSwgdHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBNYWtlIHN1cmUgaXQgaGFzIGNyZWF0ZWQgdGhlIGRlZmF1bHQgbG9jayBmaWxlCi0JCQlGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUodGVzdExvY2F0aW9uRmlsZSwgIi5tZXRhZGF0YS8ubG9jayIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJMb2NrIGZpbGUgZG9lcyBub3QgZXhpc3QhIiwgbG9ja0ZpbGUuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc2V0IGxvY2F0aW9uIiwgdCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGxvY2sgbG9jYXRpb24iLCB0ZXN0TG9jYXRpb24uaXNMb2NrZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGxvY2sgbG9jYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRlc3RMb2NhdGlvbi5yZWxlYXNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldExvY2F0aW9uV2l0aFJlbExvY2tGaWxlKCkgewotCQlMb2NhdGlvbiBjb25maWdMb2NhdGlvbiA9IExvY2F0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJRmlsZSB0ZXN0TG9jYXRpb25GaWxlID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdExvY2F0aW9ucy90ZXN0U2V0TG9jYXRpb25XaXRoUmVsTG9ja0ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlMb2NhdGlvbiB0ZXN0TG9jYXRpb24gPSBjb25maWdMb2NhdGlvbi5jcmVhdGVMb2NhdGlvbihudWxsLCBudWxsLCBmYWxzZSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0TG9jYXRpb24uc2V0KHRlc3RMb2NhdGlvbkZpbGUudG9VUkwoKSwgdHJ1ZSwgIi5tb2NrbG9jayIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUodGVzdExvY2F0aW9uRmlsZSwgIi5tb2NrbG9jayIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJMb2NrIGZpbGUgZG9lcyBub3QgZXhpc3QhIiwgbG9ja0ZpbGUuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gc2V0IGxvY2F0aW9uIiwgdCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGxvY2sgbG9jYXRpb24iLCB0ZXN0TG9jYXRpb24uaXNMb2NrZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGxvY2sgbG9jYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRlc3RMb2NhdGlvbi5yZWxlYXNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldExvY2F0aW9uV2l0aEFic0xvY2tGaWxlKCkgewotCQlMb2NhdGlvbiBjb25maWdMb2NhdGlvbiA9IExvY2F0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJRmlsZSB0ZXN0TG9jYXRpb25GaWxlID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdExvY2F0aW9ucy90ZXN0U2V0TG9jYXRpb25XaXRoQWJzTG9ja0ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIHRlc3RMb2NhdGlvbkxvY2tGaWxlID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdExvY2F0aW9ucy9tb2NrLmxvY2siKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHRlc3RMb2NhdGlvbkxvY2tGaWxlLmlzQWJzb2x1dGUoKSk7Ci0JCUxvY2F0aW9uIHRlc3RMb2NhdGlvbiA9IGNvbmZpZ0xvY2F0aW9uLmNyZWF0ZUxvY2F0aW9uKG51bGwsIG51bGwsIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCXRlc3RMb2NhdGlvbi5zZXQodGVzdExvY2F0aW9uRmlsZS50b1VSTCgpLCB0cnVlLCB0ZXN0TG9jYXRpb25Mb2NrRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgbG9jayBmaWxlIHNob3VsZCBiZSBwcmVzZW50ISIsIHRlc3RMb2NhdGlvbkxvY2tGaWxlLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbCgiRmFpbGVkIHRvIHNldCBsb2NhdGlvbiIsIHQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIkNvdWxkIG5vdCBsb2NrIGxvY2F0aW9uIiwgdGVzdExvY2F0aW9uLmlzTG9ja2VkKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkZhaWxlZCB0byBsb2NrIGxvY2F0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0ZXN0TG9jYXRpb24ucmVsZWFzZSgpOwotCQlhc3NlcnRUcnVlKCJUaGUgbG9jayBmaWxlIGNvdWxkIG5vdCBiZSByZW1vdmVkISIsIHRlc3RMb2NhdGlvbkxvY2tGaWxlLmRlbGV0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzKCkgewotCQlzZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9VU0VSX0FSRUEsIHByZWZpeCArICIvYSIpOwotCQlzZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9JTlNUQU5DRV9BUkVBLCBwcmVmaXggKyAiL2MvZCIpOwotCQlzZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9DT05GSUdfQVJFQSwgcHJlZml4ICsgIi9lL2YiKTsKLQkJc2V0UHJvcGVydHkoTG9jYXRpb25NYW5hZ2VyLlBST1BfSU5TVEFMTF9BUkVBLCAiZmlsZToiICsgcHJlZml4ICsgIi9nIik7Ci0JCUxvY2F0aW9uTWFuYWdlci5pbml0aWFsaXplTG9jYXRpb25zKCk7Ci0JCWNoZWNrU2xhc2hlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWVzKCkgewotCQlzZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9VU0VSX0FSRUEsICJodHRwOi8vZXhhbXBsZS5jb20vYSIpOwotCQlzZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9JTlNUQU5DRV9BUkVBLCAiZnRwOi8vZXhhbXBsZS5jb20vYy9kIik7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0NPTkZJR19BUkVBLCAicGxhdGZvcm06L2Jhc2UvZS9mIik7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0lOU1RBTExfQVJFQSwgImZpbGU6IiArIHByZWZpeCArICIvZyIpOwotCQlMb2NhdGlvbk1hbmFnZXIuaW5pdGlhbGl6ZUxvY2F0aW9ucygpOwotCQljaGVja1NsYXNoZXMoKTsKLQkJY2hlY2tMb2NhdGlvbihMb2NhdGlvbk1hbmFnZXIuZ2V0VXNlckxvY2F0aW9uKCksIHRydWUsIHRydWUsICJodHRwIik7Ci0JCWNoZWNrTG9jYXRpb24oTG9jYXRpb25NYW5hZ2VyLmdldEluc3RhbmNlTG9jYXRpb24oKSwgdHJ1ZSwgdHJ1ZSwgImZ0cCIpOwotCQljaGVja0xvY2F0aW9uKExvY2F0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSwgdHJ1ZSwgdHJ1ZSwgInBsYXRmb3JtIik7Ci0JCWNoZWNrTG9jYXRpb24oTG9jYXRpb25NYW5hZ2VyLmdldEluc3RhbGxMb2NhdGlvbigpLCB0cnVlLCB0cnVlLCAiZmlsZSIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vbmUoKSB7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX1VTRVJfQVJFQSwgIkBub25lIik7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0lOU1RBTkNFX0FSRUEsICJAbm9uZSIpOwotCQlzZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9DT05GSUdfQVJFQSwgIkBub25lIik7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0lOU1RBTExfQVJFQSwgImZpbGU6IiArIHByZWZpeCArICIvZyIpOwotCQlMb2NhdGlvbk1hbmFnZXIuaW5pdGlhbGl6ZUxvY2F0aW9ucygpOwotCQlhc3NlcnROdWxsKCJVc2VyIGxvY2F0aW9uIHNob3VsZCBiZSBudWxsIiwgTG9jYXRpb25NYW5hZ2VyLmdldFVzZXJMb2NhdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCgiSW5zdGFuY2UgbG9jYXRpb24gc2hvdWxkIGJlIG51bGwiLCBMb2NhdGlvbk1hbmFnZXIuZ2V0VXNlckxvY2F0aW9uKCkpOwotCQlhc3NlcnROdWxsKCJDb25maWd1cmF0aW9uIGxvY2F0aW9uIHNob3VsZCBiZSBudWxsIiwgTG9jYXRpb25NYW5hZ2VyLmdldFVzZXJMb2NhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXNlckRpcigpIHsKLQkJc2V0UHJvcGVydHkoTG9jYXRpb25NYW5hZ2VyLlBST1BfVVNFUl9BUkVBLCAiQHVzZXIuZGlyIik7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0lOU1RBTkNFX0FSRUEsICJAdXNlci5kaXIiKTsKLQkJc2V0UHJvcGVydHkoTG9jYXRpb25NYW5hZ2VyLlBST1BfQ09ORklHX0FSRUEsICJAdXNlci5kaXIiKTsKLQkJc2V0UHJvcGVydHkoTG9jYXRpb25NYW5hZ2VyLlBST1BfSU5TVEFMTF9BUkVBLCAiZmlsZToiICsgcHJlZml4ICsgIi9nIik7Ci0JCUxvY2F0aW9uTWFuYWdlci5pbml0aWFsaXplTG9jYXRpb25zKCk7Ci0JCWNoZWNrTG9jYXRpb24oTG9jYXRpb25NYW5hZ2VyLmdldFVzZXJMb2NhdGlvbigpLCB0cnVlLCB0cnVlLCAiZmlsZSIpOwotCQljaGVja0xvY2F0aW9uKExvY2F0aW9uTWFuYWdlci5nZXRJbnN0YW5jZUxvY2F0aW9uKCksIHRydWUsIHRydWUsICJmaWxlIik7Ci0JCWNoZWNrTG9jYXRpb24oTG9jYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpLCB0cnVlLCB0cnVlLCAiZmlsZSIpOwotCQljaGVja0xvY2F0aW9uKExvY2F0aW9uTWFuYWdlci5nZXRJbnN0YWxsTG9jYXRpb24oKSwgdHJ1ZSwgdHJ1ZSwgImZpbGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXNlckhvbWUoKSB7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX1VTRVJfQVJFQSwgIkB1c2VyLmhvbWUiKTsKLQkJc2V0UHJvcGVydHkoTG9jYXRpb25NYW5hZ2VyLlBST1BfSU5TVEFOQ0VfQVJFQSwgIkB1c2VyLmhvbWUiKTsKLQkJc2V0UHJvcGVydHkoTG9jYXRpb25NYW5hZ2VyLlBST1BfQ09ORklHX0FSRUEsICJAdXNlci5ob21lIik7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0lOU1RBTExfQVJFQSwgImZpbGU6IiArIHByZWZpeCArICIvZyIpOwotCQlMb2NhdGlvbk1hbmFnZXIuaW5pdGlhbGl6ZUxvY2F0aW9ucygpOwotCQljaGVja0xvY2F0aW9uKExvY2F0aW9uTWFuYWdlci5nZXRVc2VyTG9jYXRpb24oKSwgdHJ1ZSwgdHJ1ZSwgImZpbGUiKTsKLQkJY2hlY2tMb2NhdGlvbihMb2NhdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2VMb2NhdGlvbigpLCB0cnVlLCB0cnVlLCAiZmlsZSIpOwotCQljaGVja0xvY2F0aW9uKExvY2F0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSwgdHJ1ZSwgdHJ1ZSwgImZpbGUiKTsKLQkJY2hlY2tMb2NhdGlvbihMb2NhdGlvbk1hbmFnZXIuZ2V0SW5zdGFsbExvY2F0aW9uKCksIHRydWUsIHRydWUsICJmaWxlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVOQygpIHsKLQkJaWYgKCF3aW5kb3dzKQotCQkJcmV0dXJuOwotCQlzZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9VU0VSX0FSRUEsICIvL3NlcnZlci9zaGFyZS9hIik7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0lOU1RBTkNFX0FSRUEsICIvL3NlcnZlci9zaGFyZS9iIik7Ci0JCXNldFByb3BlcnR5KExvY2F0aW9uTWFuYWdlci5QUk9QX0NPTkZJR19BUkVBLCAiLy9zZXJ2ZXIvc2hhcmUvYyIpOwotCQlzZXRQcm9wZXJ0eShMb2NhdGlvbk1hbmFnZXIuUFJPUF9JTlNUQUxMX0FSRUEsICJmaWxlOi8vc2VydmVyL3NoYXJlL2ciKTsKLQkJTG9jYXRpb25NYW5hZ2VyLmluaXRpYWxpemVMb2NhdGlvbnMoKTsKLQkJY2hlY2tMb2NhdGlvbihMb2NhdGlvbk1hbmFnZXIuZ2V0VXNlckxvY2F0aW9uKCksIHRydWUsIHRydWUsICJmaWxlIik7Ci0JCWNoZWNrTG9jYXRpb24oTG9jYXRpb25NYW5hZ2VyLmdldEluc3RhbmNlTG9jYXRpb24oKSwgdHJ1ZSwgdHJ1ZSwgImZpbGUiKTsKLQkJY2hlY2tMb2NhdGlvbihMb2NhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCksIHRydWUsIHRydWUsICJmaWxlIik7Ci0JCWNoZWNrTG9jYXRpb24oTG9jYXRpb25NYW5hZ2VyLmdldEluc3RhbGxMb2NhdGlvbigpLCB0cnVlLCB0cnVlLCAiZmlsZSIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9kYXRhbG9jYXRpb24vRmlsZU1hbmFnZXJUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL2RhdGFsb2NhdGlvbi9GaWxlTWFuYWdlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDU5YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL2RhdGFsb2NhdGlvbi9GaWxlTWFuYWdlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLmRhdGFsb2NhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc3RvcmFnZW1hbmFnZXIuU3RvcmFnZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdDsKLQotcHVibGljIGNsYXNzIEZpbGVNYW5hZ2VyVGVzdHMgZXh0ZW5kcyBPU0dpVGVzdCB7Ci0JU3RvcmFnZU1hbmFnZXIgbWFuYWdlcjE7Ci0JU3RvcmFnZU1hbmFnZXIgbWFuYWdlcjI7Ci0JRmlsZSBiYXNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXB1YmxpYyBGaWxlTWFuYWdlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRmlsZU1hbmFnZXJUZXN0cy5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYmFzZSA9IG5ldyBGaWxlKFBsYXRmb3JtLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpLmdldFVSTCgpLmdldFBhdGgoKSwgIkZpbGVNYW5hZ2VyVGVzdHMiKTsKLQkJbWFuYWdlcjEgPSBudWxsOwotCQltYW5hZ2VyMiA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJaWYgKG1hbmFnZXIxICE9IG51bGwpCi0JCQltYW5hZ2VyMS5jbG9zZSgpOwotCQlpZiAobWFuYWdlcjIgIT0gbnVsbCkKLQkJCW1hbmFnZXIyLmNsb3NlKCk7Ci0JCXJtKGJhc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBybShGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGxpc3QgPSBmaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGlkeD0wOyBpZHg8bGlzdC5sZW5ndGg7IGlkeCsrKSB7Ci0JCQkJCXJtKGxpc3RbaWR4XSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbGUuZGVsZXRlKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIE9wZW4gYSBmaWxlbWFuYWdlciBpbiByZWFkb25seSBhbmQgZW5zdXJlIGZpbGVzIGFyZQotCSAqIG5vdCBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZWFkT25seSgpIHsKLQkJRmlsZSB0ZXN0RGlyID0gbmV3IEZpbGUoYmFzZSwgInJlYWRPbmx5TWFuYWdlciIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSAidGVzdFJlYWRPbmx5IjsKLQkJdGVzdERpci5ta2RpcnMoKTsKLQkJU3RyaW5nW10gZmlsZXMgPSB0ZXN0RGlyLmxpc3QoKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGVzLmxlbmd0aCwgMCk7Ci0JCW1hbmFnZXIxID0gbmV3IFN0b3JhZ2VNYW5hZ2VyKHRlc3REaXIsIG51bGwsIHRydWUpOwotCQl0cnkgewotCQkJbWFuYWdlcjEub3Blbih0cnVlKTsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOwotCQl9Ci0JCWZpbGVzID0gdGVzdERpci5saXN0KCk7Ci0JCWFzc2VydEVxdWFscyhmaWxlcy5sZW5ndGgsIDApOwotCQl0cnkgewotCQkJbWFuYWdlcjEuYWRkKGZpbGVOYW1lKTsKLQkJCWZhaWwoImFkZCBzdWNjZWRkZWQiKTsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2dvb2QKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCW1hbmFnZXIxLmxvb2t1cChmaWxlTmFtZSwgdHJ1ZSk7Ci0JCQlmYWlsKCJsb29rdXAgc3VjY2VkZGVkIik7Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJLy9nb29kCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQltYW5hZ2VyMS5jcmVhdGVUZW1wRmlsZShmaWxlTmFtZSk7Ci0JCQlmYWlsKCJjcmVhdGUgdGVtcCBmaWxlIHN1Y2NlZGRlZCIpOwotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZ29vZAotCQl9Ci0JCWZpbGVzID0gdGVzdERpci5saXN0KCk7Ci0JCWFzc2VydEVxdWFscyhmaWxlcy5sZW5ndGgsIDApOwotCQltYW5hZ2VyMS5jbG9zZSgpOwotCQltYW5hZ2VyMSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCS8vIGxldHMgY3JlYXRlIGEgZmlsZSBpbiBhIHdyaXRhYmxlIGZpbGUgbWFuYWdlcgotCQkJbWFuYWdlcjIgPSBuZXcgU3RvcmFnZU1hbmFnZXIodGVzdERpciwgbnVsbCwgZmFsc2UpOwotCQkJbWFuYWdlcjIub3Blbih0cnVlKTsKLQkJCW1hbmFnZXIyLmxvb2t1cChmaWxlTmFtZSwgdHJ1ZSk7Ci0JCQlGaWxlIHRtcEZpbGUgPSBtYW5hZ2VyMi5jcmVhdGVUZW1wRmlsZShmaWxlTmFtZSk7Ci0JCQl3cml0ZVRvRmlsZSh0bXBGaWxlLCAiVGhpcyBmaWxlIGV4aXN0cyIpOwotCQkJbWFuYWdlcjIudXBkYXRlKG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWV9LCBuZXcgU3RyaW5nW10ge3RtcEZpbGUuZ2V0TmFtZSgpfSk7Ci0JCQltYW5hZ2VyMi5jbG9zZSgpOwotCQkJbWFuYWdlcjIgPSBudWxsOwotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0JCQotCX0KLQkKLQkKLQl2b2lkIHdyaXRlVG9GaWxlKEZpbGUgZmlsZSwgU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJdHJ5IHsKLQkJCWZvcy53cml0ZShzdHIuZ2V0Qnl0ZXMoKSk7Ci0JCQlmb3MuZmx1c2goKTsKLQkJCWZvcy5nZXRGRCgpLnN5bmMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZvcy5jbG9zZSgpOwotCQl9Ci0JfQotCi0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5wdXRTdHJlYW1Db250ZW50cyhJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlieXRlW10gZGF0YSA9IG5ldyBieXRlWzY0XTsKLQkJaW50IGxlbjsKLQkJdHJ5IHsKLQkJCXdoaWxlICgobGVuID0gaXMucmVhZChkYXRhKSkgIT0gLTEpIHsKLQkJCQlzYi5hcHBlbmQobmV3IFN0cmluZyhkYXRhLCAwLCBsZW4pKTsKLQkJCX0gCi0JCX0gZmluYWxseSB7Ci0JCQlpcy5jbG9zZSgpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBUaGlzIHRlc3RzIGEgRk0gdXBkYXRlIHdoZXJlIHRoZSBhIHNwZWNpZmljIGZpbGUgaXMgbWFuYWdlZCB3aXRoIGEgCi0JICogcmV2aXNpb24gbnVtYmVyIG9mIChuKSBhbmQgYW4gdXBkYXRlIGlzIHJlcXVlc3RlZCB3aGlsZSB0aGVyZSBhbHJlYWR5Ci0JICogZXhpc3RzIGEgZmlsZSB3aXRoIHJldmlzaW9uIG51bWJlciAobisxKS4gRk0gc2hvdWxkIHNraXAgdGhhdCBnZW5lcmF0aW9uIAotCSAqIG51bWJlciBhbmQgdXBkYXRlIHRoZSBkYXRhYmFzZSB3aXRoIGZpbGUgdmVyc2lvbiBzZXQgdG8gKG4rMikuIFRoaXMgdGVzdCBpcwotCSAqIHBvc3NpYmxlIGlmIGEgcG93ZXIgbG9zcyBvY2N1cnMgYmV0d2VlbiBGTSByZW5hbWUoKSBhbmQgRk0gc2F2ZSgpLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeGlzdGluZ1ZlcnNpb24oKSB7Ci0JCVN0cmluZyB0ZXN0RmlsZSA9ICJ0ZXN0RXhpc3RpbmdWZXJzaW9uLnR4dCI7Ci0JCW1hbmFnZXIxID0gbmV3IFN0b3JhZ2VNYW5hZ2VyKGJhc2UsIG51bGwpOwotCQl0cnkgewotCQkJbWFuYWdlcjEub3BlbihmYWxzZSk7Ci0JCQlGaWxlIGZpbGUxID0gbmV3IEZpbGUoYmFzZSwgdGVzdEZpbGUrIi4xIik7Ci0JCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUoYmFzZSwgdGVzdEZpbGUrIi4yIik7Ci0JCQlGaWxlIGZpbGUzID0gbmV3IEZpbGUoYmFzZSwgdGVzdEZpbGUrIi4zIik7Ci0JCQlGaWxlIGZpbGU0ID0gbmV3IEZpbGUoYmFzZSwgdGVzdEZpbGUrIi40Iik7Ci0JCQlpZiAoZmlsZTEuZXhpc3RzKCkgfHwgZmlsZTIuZXhpc3RzKCkgfHwgZmlsZTMuZXhpc3RzKCkgfHwgZmlsZTQuZXhpc3RzKCkpIHsKLQkJCQlmYWlsKCJUZXN0IGZpbGVzIGFscmVhZHkgZXhpc3RzLiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIGNyZWF0ZSBmaWxlIHZlcnNpb24gKDEpCi0JCQltYW5hZ2VyMS5hZGQodGVzdEZpbGUpOwotCQkJRmlsZSBmaWxlID0gbWFuYWdlcjEuY3JlYXRlVGVtcEZpbGUodGVzdEZpbGUpOwotCQkJd3JpdGVUb0ZpbGUoZmlsZSwgImNvbnRlbnRzIGlycmVsZXZhbnQiKTsKLQkJCW1hbmFnZXIxLnVwZGF0ZShuZXcgU3RyaW5nW10ge3Rlc3RGaWxlfSwgbmV3IFN0cmluZ1tdIHtmaWxlLmdldE5hbWUoKX0pOwotCQkJaWYgKCFmaWxlMS5leGlzdHMoKSB8fCBmaWxlMi5leGlzdHMoKSB8fCBmaWxlMy5leGlzdHMoKSB8fCBmaWxlNC5leGlzdHMoKSkgewotCQkJCWZhaWwoIkZhaWxlZCB0byBjcmVhdGUgYSBzaW5nbGUgdGVzdCBmaWxlIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBjcmVhdGUgZmlsZSB2ZXJzaW9uICgyKSBvdXRzaWRlIGZpbGVtYW5hZ2VyCi0JCQl3cml0ZVRvRmlsZShmaWxlMiwgImZpbGUyIGV4aXN0cyIpOwotCi0JCQkvLyB1cGRhdGUgYW5vdGhlciBmaWxlIGFmdGVyIGdlbmVyYXRpb24gMiBhbHJlYWR5IGV4aXN0cy4uLgotCQkJZmlsZSA9IG1hbmFnZXIxLmNyZWF0ZVRlbXBGaWxlKHRlc3RGaWxlKTsKLQkJCXdyaXRlVG9GaWxlKGZpbGUsICJmaWxlIDMgY29udGVudHMiKTsKLQkJCW1hbmFnZXIxLnVwZGF0ZShuZXcgU3RyaW5nW10ge3Rlc3RGaWxlfSwgbmV3IFN0cmluZ1tdIHtmaWxlLmdldE5hbWUoKX0pOwotCQkJaWYgKCFmaWxlMy5leGlzdHMoKSB8fCBmaWxlNC5leGlzdHMoKSkgewotCQkJCWZhaWwoIkZhaWxlZCB0byBza2lwIGV4aXN0aW5nIGZpbGVtYW5hZ2VyIGZpbGUuIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBvcGVuIGEgbmV3IG1hbmFnZXIsIGVuc3VyZSBhIGxvb2t1cCByZXN1bHRzIGluIGZpbGUgdmVyc2lvbiAoMykKLQkJCW1hbmFnZXIyID0gbmV3IFN0b3JhZ2VNYW5hZ2VyKGJhc2UsIG51bGwpOwotCQkJbWFuYWdlcjIub3Blbih0cnVlKTsKLQkJCWZpbGUgPSBtYW5hZ2VyMi5sb29rdXAodGVzdEZpbGUsIGZhbHNlKTsKLQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQlmYWlsKCJVbmFibGUgdG8gbG9va3VwIGV4aXNpbmcgZmlsZSIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWFzc2VydFRydWUoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi4zIikpOwotCQkJYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJYXNzZXJ0RXF1YWxzKGdldElucHV0U3RyZWFtQ29udGVudHMoZmlzKSwgImZpbGUgMyBjb250ZW50cyIpOwotCQkJCi0JCQltYW5hZ2VyMi5jbG9zZSgpOwotCQkJbWFuYWdlcjI9bnVsbDsKLQkJCQotCQkJbWFuYWdlcjEuY2xvc2UoKTsKLQkJCW1hbmFnZXIxPW51bGw7Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIFRoaXMgdGVzdHMgdGhhdCBGTSBhcGlzIHRocm93IGV4Y2VwdGlvbnMgaWYgRk0gaGFzIG5vdCB5ZXQgYmVlbiBvcGVuZWQKLQkgKiBvciBpZiBGTSBoYXMgYmVlbiBjbG9zZWQuICAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90T3BlbigpIHsKLQkJU3RyaW5nIHBlcm1hbmVudEZpbGUgPSAidGVzdE5vdE9wZW4udHh0IjsKLQkJU3RyaW5nIHNjcmF0Y2hGaWxlID0gInRlc3ROb3RPcGVuU2NyYXRjaCI7Ci0JCW1hbmFnZXIxID0gbmV3IFN0b3JhZ2VNYW5hZ2VyKGJhc2UsIG51bGwpOwotCQkvLyBjcmVhdGUgYSBwZXJtYW5lbnQgZmlsZSBhbmQgYSBtYW5hZ2VkIHNjcmF0Y2ggZmlsZQotCQl0cnkgewotCQkJbWFuYWdlcjEub3Blbih0cnVlKTsKLQkJCW1hbmFnZXIxLmFkZChwZXJtYW5lbnRGaWxlKTsKLQkJCUZpbGUgdG1wRmlsZSA9IG1hbmFnZXIxLmNyZWF0ZVRlbXBGaWxlKHBlcm1hbmVudEZpbGUpOwotCQkJdGhpcy53cml0ZVRvRmlsZSh0bXBGaWxlLCAiRmlsZSBleGlzdHMiKTsKLQkJCW1hbmFnZXIxLnVwZGF0ZShuZXcgU3RyaW5nW10ge3Blcm1hbmVudEZpbGV9LCBuZXcgU3RyaW5nW10ge3RtcEZpbGUuZ2V0TmFtZSgpfSk7Ci0JCQltYW5hZ2VyMS5hZGQoc2NyYXRjaEZpbGUpOwotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0KLQkJCi0JCS8vIGNyZWF0ZSBhIG5ldyBtYW5hZ2VyLCBhbmQgdHJ5IG1ha2luZyBjYWxscwotCQltYW5hZ2VyMiA9IG5ldyBTdG9yYWdlTWFuYWdlcihiYXNlLCBudWxsKTsKLQkJY2hlY2tPcGVuKGZhbHNlLCBwZXJtYW5lbnRGaWxlLCBzY3JhdGNoRmlsZSk7Ci0JCS8vIG9wZW4gdGhlIG1hbmFnZXIsIHRyeSBhZ2FpbgotCQl0cnkgewotCQkJbWFuYWdlcjIub3Blbih0cnVlKTsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOwotCQl9Ci0JCWNoZWNrT3Blbih0cnVlLCBwZXJtYW5lbnRGaWxlLCBzY3JhdGNoRmlsZSk7Ci0JCS8vIGNsb3NlIG1hbmFnZXIsIHRyeSBhZ2FpbgotCQltYW5hZ2VyMi5jbG9zZSgpOwotCQljaGVja09wZW4oZmFsc2UsIHBlcm1hbmVudEZpbGUsIHNjcmF0Y2hGaWxlKTsKLQkJbWFuYWdlcjIgPSBudWxsOwotCQkKLQkJbWFuYWdlcjEuY2xvc2UoKTsKLQkJbWFuYWdlcjEgPSBudWxsOwotCX0KLQotCXZvaWQgY2hlY2tPcGVuKGJvb2xlYW4gb3BlbiwgU3RyaW5nIHBlcm1hbmVudEZpbGUsIFN0cmluZyBzY3JhdGNoRmlsZSkgewotCQkvLyBjaGVjayBhZGQoKQotCQl0cnkgewotCQkJbWFuYWdlcjIuYWRkKCJmYWlsRmlsZSIpOwotCQkJaWYgKCFvcGVuKQotCQkJCWZhaWwoImFkZCBkaWQgbm90IGZhaWwuIik7Ci0JCQltYW5hZ2VyMi5yZW1vdmUoImZhaWxGaWxlIik7Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKG9wZW4pCi0JCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCQkvLyBjaGVjayBsb29rdXAoKQotCQl0cnkgewotCQkJLy8gZXhwZWN0IFRFU1QyIHRvIGV4aXN0Ci0JCQltYW5hZ2VyMi5sb29rdXAocGVybWFuZW50RmlsZSwgZmFsc2UpOwotCQkJaWYgKCFvcGVuKQotCQkJCWZhaWwoImxvb2t1cCBkaWQgbm90IGZhaWwuIik7Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKG9wZW4pCi0JCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCQkvLyBjaGVjayB1cGRhdGUsIGZpcnN0IGNyZWF0ZSBhIHJlYWwgZmlsZSB0byBhZGQKLQkJRmlsZSB0bXBGaWxlOwotCQl0cnkgewotCQkJdG1wRmlsZSA9IG1hbmFnZXIyLmNyZWF0ZVRlbXBGaWxlKCJvcGVuVGVzdCIpOwotCQkJd3JpdGVUb0ZpbGUodG1wRmlsZSwgImNvbnRlbnRzIGlycmVsZXZhbnQiKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJCXRtcEZpbGUgPSBudWxsOwotCQl9CQotCQlpZiAodG1wRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1hbmFnZXIyLnVwZGF0ZShuZXcgU3RyaW5nW10ge3Blcm1hbmVudEZpbGV9LCBuZXcgU3RyaW5nW10ge3RtcEZpbGUuZ2V0TmFtZSgpfSk7Ci0JCQkJaWYgKCFvcGVuKQotCQkJCQlmYWlsKCJ1cGRhdGUgZGlkIG5vdCBmYWlsLiIpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKG9wZW4pCi0JCQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2sgcmVtb3ZlKCkKLQkJdHJ5IHsKLQkJCW1hbmFnZXIyLnJlbW92ZShzY3JhdGNoRmlsZSk7Ci0JCQlpZiAoIW9wZW4pCi0JCQkJZmFpbCgicmVtb3ZlIGRpZCBub3QgZmFpbCIpOwotCQkJZWxzZSAvLyBhZGQgdGhlIGZpbGUgYmFjayBpZiBleHBlY3RlZCB0byBjb21wbGV0ZQotCQkJCW1hbmFnZXIyLmFkZChzY3JhdGNoRmlsZSk7Ci0JCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChvcGVuKQotCQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogVGhpcyB0ZXN0cyBGTSByZW1vdmUoKSB0aGVuIGFkZCgpLiAgT24gYSByZW1vdmUoKSwgdGhlIGZpbGUgY2FuIG5vdCBiZSBkZWxldGVkIGFzIGl0IG1heQotCSAqIGJlIGluIHVzZSBieSBhbm90aGVyIEZNLiBUaGVuIGFkZCgpIHRoZSBmaWxlIGJhY2sgYW5kIHNlZSBpZiB0aGUgdmVyc2lvbiBudW1iZXIgd3JpdHRlbiB0bwotCSAqIGlzIChuKzEpIHdoZXJlIChuKSBpcyB0aGUgdmVyc2lvbiB3aGVuIHJlbW92ZSgpIGNhbGxlZC4gIFRoaXMgaXMgbGlrZWx5IGlmIGZyYW1ld29yayB1c2VzCi0JICogLWNsZWFuIHdoZXJlIG9uIGNsZWFuIHdlIHJlbW92ZSB0aGUgZmlsZSwgdGhlbiBvbiBleGl0IHdlIGFkZCB0aGUgZmlsZSBiYWNrLiAgTWFrZSBzdXJlIAotCSAqIHRoaXMgaXMgb3JkZXJseS4KLQkgKiAKLQkgKiBDdXJyZW50bHkgaXMgaXMgYSBrbm93biBpc3N1ZXMgdGhhdCByZW1vdmUoKSB3aWxsIG5ldmVyIGRlbGV0ZSBhbnkgb2xkIG1hbmFnZXIgY29udGVudHMuIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUaGVuQWRkKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSAidGVzdFJlbW92ZVRoZW5BZGQudHh0IjsKLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKGJhc2UsIGZpbGVOYW1lKyIuMSIpOwotCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUoYmFzZSwgZmlsZU5hbWUrIi4yIik7Ci0JCUZpbGUgZmlsZTMgPSBuZXcgRmlsZShiYXNlLCBmaWxlTmFtZSsiLjMiKTsKLQkJbWFuYWdlcjEgPSBuZXcgU3RvcmFnZU1hbmFnZXIoYmFzZSwgbnVsbCk7Ci0JCS8vIGNyZWF0ZSBhIHBlcm1hbmVudCBmaWxlCi0JCXRyeSB7Ci0JCQltYW5hZ2VyMS5vcGVuKHRydWUpOwotCQkJbWFuYWdlcjEuYWRkKGZpbGVOYW1lKTsKLQkJCS8vIGNyZWF0ZSB2ZXJzaW9uICgxKQotCQkJRmlsZSB0bXBGaWxlID0gbWFuYWdlcjEuY3JlYXRlVGVtcEZpbGUoZmlsZU5hbWUpOwotCQkJd3JpdGVUb0ZpbGUodG1wRmlsZSwgIkZpbGUgZXhpc3RzIik7Ci0JCQltYW5hZ2VyMS51cGRhdGUobmV3IFN0cmluZ1tdIHtmaWxlTmFtZX0sIG5ldyBTdHJpbmdbXSB7dG1wRmlsZS5nZXROYW1lKCl9KTsKLQkJCS8vIGRvIGl0IGFnYWluLCBub3cgdmVyc2lvbiAoMikKLQkJCXRtcEZpbGUgPSBtYW5hZ2VyMS5jcmVhdGVUZW1wRmlsZShmaWxlTmFtZSk7Ci0JCQl3cml0ZVRvRmlsZSh0bXBGaWxlLCAiRmlsZSBleGlzdHMgIzIiKTsKLQkJCW1hbmFnZXIxLnVwZGF0ZShuZXcgU3RyaW5nW10ge2ZpbGVOYW1lfSwgbmV3IFN0cmluZ1tdIHt0bXBGaWxlLmdldE5hbWUoKX0pOwotCQkJbWFuYWdlcjEuY2xvc2UoKTsgLy8gZm9yY2UgYSBjbGVhbnVwCi0JCQltYW5hZ2VyMSA9IG51bGw7Ci0JCQkvLyBzYW5pdHkgY2hlY2sKLQkJCWlmIChmaWxlMS5leGlzdHMoKSB8fCAhZmlsZTIuZXhpc3RzKCkgfHwgZmlsZTMuZXhpc3RzKCkpCi0JCQkJZmFpbCgiRmFpbGVkIGNyZWF0aW5nIGEgZmlsZSByZXZpc2lvbiIpOwotCQkJCi0JCQltYW5hZ2VyMiA9IG5ldyBTdG9yYWdlTWFuYWdlcihiYXNlLCBudWxsKTsKLQkJCW1hbmFnZXIyLm9wZW4odHJ1ZSk7Ci0JCQltYW5hZ2VyMi5yZW1vdmUoZmlsZU5hbWUpOwotCQkJLy8gY2hlY2sgbG9va3VwICYgZ2V0SW5wdXRTdHJlYW0KLQkJCUZpbGUgdGVzdEZpbGUgPSBtYW5hZ2VyMi5sb29rdXAoZmlsZU5hbWUsIGZhbHNlKTsKLQkJCWFzc2VydE51bGwodGVzdEZpbGUpOwotCQkJbWFuYWdlcjIuYWRkKGZpbGVOYW1lKTsKLQkJCXRlc3RGaWxlID0gbWFuYWdlcjIubG9va3VwKGZpbGVOYW1lLCBmYWxzZSk7Ci0JCQlhc3NlcnROb3ROdWxsKHRlc3RGaWxlKTsKLQkJCWFzc2VydFRydWUodGVzdEZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuMCIpKTsKLQkJCS8vIHdyaXRlIG5ldyBmaWxlLCBlbnN1cmUgaXQgdmVyc2lvbiAzCi0JCQl0bXBGaWxlID0gbWFuYWdlcjIuY3JlYXRlVGVtcEZpbGUoZmlsZU5hbWUpOwotCQkJd3JpdGVUb0ZpbGUodG1wRmlsZSwgIkZpbGUgZXhpc3RzICMzIik7Ci0JCQltYW5hZ2VyMi51cGRhdGUobmV3IFN0cmluZ1tdIHtmaWxlTmFtZX0sIG5ldyBTdHJpbmdbXSB7dG1wRmlsZS5nZXROYW1lKCl9KTsKLQkJCXRlc3RGaWxlID0gbWFuYWdlcjIubG9va3VwKGZpbGVOYW1lLCBmYWxzZSk7Ci0JCQlhc3NlcnROb3ROdWxsKHRlc3RGaWxlKTsKLQkJCWFzc2VydFRydWUodGVzdEZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuMyIpKTsKLQkJCWFzc2VydFRydWUoZmlsZTMuZXhpc3RzKCkpOwotCQkJCi0JCQkvLyBvcGVuIGEgbmV3IG1hbmFnZXIsIGVuc3VyZSB0aGF0IHRoZSBkYXRhYmFzZSB3YXMgdXBkYXRlZAotCQkJLy8gYnkgY2hlY2tpbmcgdmVyc2lvbiBpcyBhbHNvICMzCi0JCQltYW5hZ2VyMSA9IG5ldyBTdG9yYWdlTWFuYWdlcihiYXNlLCBudWxsKTsKLQkJCW1hbmFnZXIxLm9wZW4odHJ1ZSk7Ci0JCQl0ZXN0RmlsZSA9IG1hbmFnZXIxLmxvb2t1cChmaWxlTmFtZSwgZmFsc2UpOwotCQkJYXNzZXJ0Tm90TnVsbCh0ZXN0RmlsZSk7Ci0JCQlhc3NlcnRUcnVlKHRlc3RGaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLjMiKSk7Ci0JCQkKLQkJCW1hbmFnZXIxLmNsb3NlKCk7Ci0JCQltYW5hZ2VyMSA9IG51bGw7Ci0JCQltYW5hZ2VyMi5jbG9zZSgpOwotCQkJbWFuYWdlcjIgPSBudWxsOwotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBtdWx0aXBsZSBGTSBkbyBub3QgY2xlYW51cCBhbnkgb2xkIGZpbGVzIGFzIHRoZXkgbWF5IGJlIGluIHVzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVGaWxlTWFuYWdlcnMoKSB7Ci0JCS8vIFRoaXMgdGVzdCByZWxpZXMgb24gYSBmaWxlIGxvY2sgdG8gZmFpbCBpZiB0aGUgc2FtZSBwcm9jZXNzIGFscmVhZHkKLQkJLy8gIGhvbGRzIGEgZmlsZSBsb2NrLiBUaGlzIGlzIHRydWUgb24gV2luMzIgYnV0IG5vdCBvbiBMaW51eC4gU28gcnVuIAotCQkvLyAgdGhpcyB0ZXN0IGZvciB3aW5kb3dzIG9ubHkuCi0JCWlmICghIndpbjMyIi5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3NnaS5vcyIpKSkKLQkJCS8vIHRoaXMgaXMgYSBXaW5kb3dzLW9ubHkgdGVzdAotCQkJcmV0dXJuOwotCQlTdHJpbmcgZmlsZU5hbWUgPSAidGVzdE11bHRpcGxlRmlsZU1hbmFnZXJzLnR4dCI7Ci0JCUZpbGUgZmlsZTEgPSBuZXcgRmlsZShiYXNlLCBmaWxlTmFtZSsiLjEiKTsKLQkJRmlsZSBmaWxlMiA9IG5ldyBGaWxlKGJhc2UsIGZpbGVOYW1lKyIuMiIpOwotCQltYW5hZ2VyMSA9IG5ldyBTdG9yYWdlTWFuYWdlcihiYXNlLCBudWxsKTsKLQkJdHJ5IHsKLQkJCW1hbmFnZXIxLm9wZW4odHJ1ZSk7Ci0JCQlGaWxlIGZpbGUgPSBtYW5hZ2VyMS5sb29rdXAoZmlsZU5hbWUsIHRydWUpOwotCQkJYXNzZXJ0Tm90TnVsbChmaWxlKTsKLQkJCWZpbGUgPSBtYW5hZ2VyMS5jcmVhdGVUZW1wRmlsZShmaWxlTmFtZSk7Ci0JCQl3cml0ZVRvRmlsZShmaWxlLCAidGVzdCBjb250ZW50cyAjMSIpOwotCQkJbWFuYWdlcjEudXBkYXRlKG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWV9LCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCQkKLQkJCS8vIGVuc3VyZSBmaWxlIGlzIHZlcnNpb24gIzEKLQkJCWZpbGUgPSBtYW5hZ2VyMS5sb29rdXAoZmlsZU5hbWUsIGZhbHNlKTsKLQkJCWFzc2VydE5vdE51bGwoZmlsZSk7Ci0JCQlhc3NlcnRUcnVlKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuMSIpKTsKLQkJCWFzc2VydFRydWUoZmlsZTEuZXhpc3RzKCkpOwotCQkJCi0JCQkvL25ldyBmaWxlTWFuZ2FnZXIgdXNpbmcgdmVyc2lvbiAjMQotCQkJbWFuYWdlcjIgPSBuZXcgU3RvcmFnZU1hbmFnZXIoYmFzZSwgbnVsbCk7Ci0JCQltYW5hZ2VyMi5vcGVuKHRydWUpOwotCQkJLy8gc2FuaXR5IGNoZWNrCi0JCQlmaWxlID0gbWFuYWdlcjIubG9va3VwKGZpbGVOYW1lLCBmYWxzZSk7Ci0JCQlhc3NlcnROb3ROdWxsKGZpbGUpOwotCQkJYXNzZXJ0VHJ1ZShmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLjEiKSk7Ci0JCQlhc3NlcnRUcnVlKGZpbGUxLmV4aXN0cygpICYmICFmaWxlMi5leGlzdHMoKSk7Ci0JCQkKLQkJCS8vIGJhY2sgdG8gbWFuYWdlciAjMSwgdXBkYXRlIGZpbGUgYWdhaW4sIGNsb3NlCi0JCQlmaWxlID0gbWFuYWdlcjEuY3JlYXRlVGVtcEZpbGUoZmlsZU5hbWUpOwotCQkJd3JpdGVUb0ZpbGUoZmlsZSwgInRlc3QgY29udGVudHMgIzIiKTsKLQkJCW1hbmFnZXIxLnVwZGF0ZShuZXcgU3RyaW5nW10ge2ZpbGVOYW1lfSwgbmV3IFN0cmluZ1tdIHtmaWxlLmdldE5hbWUoKX0pOwotCQkJLy9zYW5pdHkgY2hlY2sKLQkJCWFzc2VydFRydWUoZmlsZTEuZXhpc3RzKCkpOwotCQkJYXNzZXJ0VHJ1ZShmaWxlMi5leGlzdHMoKSk7Ci0JCQltYW5hZ2VyMS5jbG9zZSgpOwotCQkJbWFuYWdlcjEgPSBudWxsOwotCQkJLy8gYm90aCBmaWxlcyBiZXR0ZXIgc3RpbGwgZXhpc3RzCi0JCQlhc3NlcnRUcnVlKGZpbGUxLmV4aXN0cygpKTsKLQkJCWFzc2VydFRydWUoZmlsZTIuZXhpc3RzKCkpOwotCQkJCi0JCQkvLyBtYW5hZ2VyICMyCi0JCQkvLyBzYW5pdHkgY2hlY2sKLQkJCWZpbGUgPSBtYW5hZ2VyMi5sb29rdXAoZmlsZU5hbWUsIGZhbHNlKTsKLQkJCWFzc2VydE5vdE51bGwoZmlsZSk7Ci0JCQlhc3NlcnRUcnVlKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuMSIpKTsKLQkJCS8vIGNsb3NlIG1hbmFnZXIyLCBjbGVhbnVwIHNob3VsZCBvY2N1cgotCQkJbWFuYWdlcjIuY2xvc2UoKTsKLQkJCW1hbmFnZXIyID0gbnVsbDsKLQkJCWFzc2VydFRydWUoIWZpbGUxLmV4aXN0cygpKTsKLQkJCWFzc2VydFRydWUoZmlsZTIuZXhpc3RzKCkpOwotCQkJCi0JCQkvLyBuZXcgbWFuYWdlcjEsIGRvZXMgaXQgZ2V0IHZlcnNpb24gMT8KLQkJCW1hbmFnZXIxID0gbmV3IFN0b3JhZ2VNYW5hZ2VyKGJhc2UsIG51bGwpOwotCQkJbWFuYWdlcjEub3Blbih0cnVlKTsKLQkJCWZpbGUgPSBtYW5hZ2VyMS5sb29rdXAoZmlsZU5hbWUsIGZhbHNlKTsKLQkJCWFzc2VydE5vdE51bGwoZmlsZSk7Ci0JCQlhc3NlcnRUcnVlKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuMiIpKTsKLQkJCW1hbmFnZXIxLmNsb3NlKCk7CQkKLQkJCW1hbmFnZXIxID0gbnVsbDsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgdGVzdCB3aWxsIHZlcmlmeSB0aGF0IGEgRk0gd2lsbCBmYWlsIGlmIGEgbG9jayBpcyBoZWxkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEphdmFJT0xvY2tpbmcoKSB7Ci0JCS8vIFRoaXMgdHlwZSBvZiBsb2NraW5nIGlzIG9ubHkgc3VyZSB0byB3b3JrIG9uIFdpbjMyLgotCQlpZiAoISJ3aW4zMiIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zZ2kub3MiKSkpCi0JCQkvLyB0aGlzIGlzIGEgV2luZG93cy1vbmx5IHRlc3QKLQkJCXJldHVybjsKLQkJU3RyaW5nIGZpbGVOYW1lID0gInRlc3RKYXZhSU9Mb2NraW5nIjsKLQkJRmlsZSBsb2NrRmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKGJhc2UsIi5tYW5hZ2VyIiksIi5maWxlVGFibGVMb2NrIik7Ci0JCWxvY2tGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJdHJ5IHsKLQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvY2tGaWxlKS5jbG9zZSgpOwotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShsb2NrRmlsZS5leGlzdHMoKSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvY2tGaWxlKTsKLQkJCS8vIHdlIGhvbGQgdGhlIGxvY2ssIGxldHMgb3BlbiBhIEZNCi0JCQltYW5hZ2VyMSA9IG5ldyBTdG9yYWdlTWFuYWdlcihiYXNlLCAiamF2YS5pbyIpOwotCQkJdHJ5IHsKLQkJCQltYW5hZ2VyMS5vcGVuKHRydWUpOyAvLyB3YWl0IGZvciBsb2NrCi0JCQkJZmFpbCgib3BlbiB3aXRoIGxvY2sgc3VjY2VkZGVkIik7Ci0JCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2dvb2QKLQkJCX0KLQkJCQotCQkJbWFuYWdlcjEub3BlbihmYWxzZSk7IC8vIGRvbid0IHdhaXQsIHNob3VsZCB3b3JrCi0JCQl0cnkgewotCQkJCW1hbmFnZXIxLmFkZChmaWxlTmFtZSk7Ci0JCQkJZmFpbCgiYWRkIHN1Y2NlZGRlZCIpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9nb29kCi0JCQl9Ci0JCQkvL3Nhbml0eSBjaGVjaywgZmlsZSBzaG91bGQgbm90IGJlIG1hbmFnZWQKLQkJCWFzc2VydE51bGwobWFuYWdlcjEubG9va3VwKGZpbGVOYW1lLCBmYWxzZSkpOwotCQkJbWFuYWdlcjEuY2xvc2UoKTsKLQkJCW1hbmFnZXIxID0gbnVsbDsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZm9zICE9IG51bGwpCi0JCQkJCWZvcy5jbG9zZSgpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9kYXRhbG9jYXRpb24vTG9jYXRpb25BcmVhU2Vzc2lvblRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9kYXRhbG9jYXRpb24vTG9jYXRpb25BcmVhU2Vzc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiZjZkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvZGF0YWxvY2F0aW9uL0xvY2F0aW9uQXJlYVNlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLmRhdGFsb2NhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuaW50ZXJuYWwuYWRhcHRvci5CYXNpY0xvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuc2Vzc2lvbi5Db25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLnNlc3Npb24uU2V0dXBNYW5hZ2VyLlNldHVwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5JbnZhbGlkU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgTG9jYXRpb25BcmVhU2Vzc2lvblRlc3QgZXh0ZW5kcyBPU0dpVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTklPID0gImphdmEubmlvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0lPID0gImphdmEuaW8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTE9DQVRJT05fRElSID0gIm9zZ2kudGVzdC5sb2NhdGlvbi5kaXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBMb2NhdGlvbiBsb2NrZWRUZXN0TG9jYXRpb247Ci0Jc3RhdGljIFN0cmluZyB0ZXN0TG9jYXRpb25Mb2NrRGlyID0gT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgidGVzdExvY2F0aW9uIikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoTG9jYXRpb25BcmVhU2Vzc2lvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCQkvLyBmaXJzdCBsb2NrIHdpdGggamF2YS5uaW8KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdENhc2UoInRlc3RMb2NrSmF2YU5JTyIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCQlkb0xvY2sodGVzdExvY2F0aW9uTG9ja0RpciwgSkFWQV9OSU8sIGZhbHNlLCB0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYXR0ZW1wdCB0byBsb2NrIHNhbWUgbG9jYXRpb24gd2l0aCBhIHNlc3Npb24KLQkJQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUgc2Vzc2lvbkxvY2sgPSBuZXcgQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUoUElfT1NHSV9URVNUUywgTG9jYXRpb25BcmVhU2Vzc2lvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nW10gaWRzID0gQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUuTUlOSU1BTF9CVU5ETEVfU0VUOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLQkJCXNlc3Npb25Mb2NrLmFkZEJ1bmRsZShpZHNbaV0pOwotCQlzZXNzaW9uTG9jay5hZGRCdW5kbGUoUElfT1NHSV9URVNUUyk7Ci0JCXRyeSB7Ci0JCQlzZXNzaW9uTG9jay5nZXRTZXR1cCgpLnNldFN5c3RlbVByb3BlcnR5KFRFU1RfTE9DQVRJT05fRElSLCB0ZXN0TG9jYXRpb25Mb2NrRGlyKTsKLQkJfSBjYXRjaCAoU2V0dXBFeGNlcHRpb24gZSkgewotCQkJLy8gd2hhdCBjYW4gd2UgZG87IGp1c3QgZmFpbCB0aGUgdGVzdGNhc2UgbGF0ZXIgd2hlbiB0aGUgcHJvcCBpcyBub3Qgc2V0LgotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlzZXNzaW9uTG9jay5hZGRUZXN0KG5ldyBMb2NhdGlvbkFyZWFTZXNzaW9uVGVzdCgidGVzdFNlc3Npb25GYWlsTG9ja0phdmFOSU8iKSk7Ci0JCXN1aXRlLmFkZFRlc3Qoc2Vzc2lvbkxvY2spOwotCi0JCS8vIG5vdyByZWxlYXNlIGxvY2sKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdENhc2UoInRlc3RSZWxlYXNlSmF2YU5JTyIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCQlkb1JlbGVhc2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYXR0ZW1wdCB0byBsb2NrIHRoZSBsb2NhdGlvbiB3aXRoIGEgc2Vzc2lvbgotCQlzZXNzaW9uTG9jayA9IG5ldyBDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZShQSV9PU0dJX1RFU1RTLCBMb2NhdGlvbkFyZWFTZXNzaW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLQkJCXNlc3Npb25Mb2NrLmFkZEJ1bmRsZShpZHNbaV0pOwotCQlzZXNzaW9uTG9jay5hZGRCdW5kbGUoUElfT1NHSV9URVNUUyk7Ci0JCXRyeSB7Ci0JCQlzZXNzaW9uTG9jay5nZXRTZXR1cCgpLnNldFN5c3RlbVByb3BlcnR5KFRFU1RfTE9DQVRJT05fRElSLCB0ZXN0TG9jYXRpb25Mb2NrRGlyKTsKLQkJfSBjYXRjaCAoU2V0dXBFeGNlcHRpb24gZSkgewotCQkJLy8gd2hhdCBjYW4gd2UgZG87IGp1c3QgZmFpbCB0aGUgdGVzdGNhc2UgbGF0ZXIgd2hlbiB0aGUgcHJvcCBpcyBub3Qgc2V0LgotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlzZXNzaW9uTG9jay5hZGRUZXN0KG5ldyBMb2NhdGlvbkFyZWFTZXNzaW9uVGVzdCgidGVzdFNlc3Npb25TdWNjZXNzTG9ja0phdmFOSU8iKSk7Ci0JCXN1aXRlLmFkZFRlc3Qoc2Vzc2lvbkxvY2spOwotCi0JCS8vIG5vdyB0ZXN0IHdpdGggamF2YS5pbwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0Q2FzZSgidGVzdExvY2tKYXZhSU8iKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCQkJLy8gTm90ZSB0aGF0IGphdmEuaW8gbG9ja2luZyBvbmx5IHNlZW1zIHRvIHdvcmsgcmVsaWFibHkgb24gd2luZG93cwotCQkJCWlmICghQ29uc3RhbnRzLk9TX1dJTjMyLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zZ2kub3MiKSkpCi0JCQkJCXJldHVybjsKLQkJCQlkb0xvY2sodGVzdExvY2F0aW9uTG9ja0RpciwgSkFWQV9JTywgZmFsc2UsIHRydWUpOwotCQkJfQotCQl9KTsKLQotCQkvLyBhdHRlbXB0IHRvIGxvY2sgc2FtZSBsb2NhdGlvbiB3aXRoIGEgc2Vzc2lvbgotCQlzZXNzaW9uTG9jayA9IG5ldyBDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZShQSV9PU0dJX1RFU1RTLCBMb2NhdGlvbkFyZWFTZXNzaW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlpZHMgPSBDb25maWd1cmF0aW9uU2Vzc2lvblRlc3RTdWl0ZS5NSU5JTUFMX0JVTkRMRV9TRVQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKQotCQkJc2Vzc2lvbkxvY2suYWRkQnVuZGxlKGlkc1tpXSk7Ci0JCXNlc3Npb25Mb2NrLmFkZEJ1bmRsZShQSV9PU0dJX1RFU1RTKTsKLQkJdHJ5IHsKLQkJCXNlc3Npb25Mb2NrLmdldFNldHVwKCkuc2V0U3lzdGVtUHJvcGVydHkoVEVTVF9MT0NBVElPTl9ESVIsIHRlc3RMb2NhdGlvbkxvY2tEaXIpOwotCQl9IGNhdGNoIChTZXR1cEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3aGF0IGNhbiB3ZSBkbzsganVzdCBmYWlsIHRoZSB0ZXN0Y2FzZSBsYXRlciB3aGVuIHRoZSBwcm9wIGlzIG5vdCBzZXQuCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXNlc3Npb25Mb2NrLmFkZFRlc3QobmV3IExvY2F0aW9uQXJlYVNlc3Npb25UZXN0KCJ0ZXN0U2Vzc2lvbkZhaWxMb2NrSmF2YUlPIikpOwotCQlzdWl0ZS5hZGRUZXN0KHNlc3Npb25Mb2NrKTsKLQotCQkvLyBub3cgcmVsZWFzZSBsb2NrCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RDYXNlKCJ0ZXN0UmVsZWFzZUphdmFJTyIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCQlpZiAoIUNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJvc2dpLm9zIikpKQotCQkJCQlyZXR1cm47Ci0JCQkJZG9SZWxlYXNlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGF0dGVtcHQgdG8gbG9jayB0aGUgbG9jYXRpb24gd2l0aCBhIHNlc3Npb24KLQkJc2Vzc2lvbkxvY2sgPSBuZXcgQ29uZmlndXJhdGlvblNlc3Npb25UZXN0U3VpdGUoUElfT1NHSV9URVNUUywgTG9jYXRpb25BcmVhU2Vzc2lvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCi0JCQlzZXNzaW9uTG9jay5hZGRCdW5kbGUoaWRzW2ldKTsKLQkJc2Vzc2lvbkxvY2suYWRkQnVuZGxlKFBJX09TR0lfVEVTVFMpOwotCQl0cnkgewotCQkJc2Vzc2lvbkxvY2suZ2V0U2V0dXAoKS5zZXRTeXN0ZW1Qcm9wZXJ0eShURVNUX0xPQ0FUSU9OX0RJUiwgdGVzdExvY2F0aW9uTG9ja0Rpcik7Ci0JCX0gY2F0Y2ggKFNldHVwRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdoYXQgY2FuIHdlIGRvOyBqdXN0IGZhaWwgdGhlIHRlc3RjYXNlIGxhdGVyIHdoZW4gdGhlIHByb3AgaXMgbm90IHNldC4KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJc2Vzc2lvbkxvY2suYWRkVGVzdChuZXcgTG9jYXRpb25BcmVhU2Vzc2lvblRlc3QoInRlc3RTZXNzaW9uU3VjY2Vzc0xvY2tKYXZhSU8iKSk7Ci0JCXN1aXRlLmFkZFRlc3Qoc2Vzc2lvbkxvY2spOwotCQlyZXR1cm4gc3VpdGU7Ci0KLQl9Ci0KLQlwdWJsaWMgTG9jYXRpb25BcmVhU2Vzc2lvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgZG9Mb2NrKFN0cmluZyB0ZXN0TG9jYXRpb25EaXIsIFN0cmluZyB0eXBlLCBib29sZWFuIHJlbGVhc2UsIGJvb2xlYW4gc3VjY2VlZCkgewotCQlTdHJpbmcgb2xkTG9ja2luZ1ZhbHVlID0gU3lzdGVtLnNldFByb3BlcnR5KEJhc2ljTG9jYXRpb24uUFJPUF9PU0dJX0xPQ0tJTkcsIHR5cGUpOwotCQl0cnkgewotCQkJZG9Mb2NrKHRlc3RMb2NhdGlvbkRpciwgcmVsZWFzZSwgc3VjY2VlZCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAob2xkTG9ja2luZ1ZhbHVlID09IG51bGwpCi0JCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoQmFzaWNMb2NhdGlvbi5QUk9QX09TR0lfTE9DS0lORyk7Ci0JCQllbHNlCi0JCQkJU3lzdGVtLnNldFByb3BlcnR5KEJhc2ljTG9jYXRpb24uUFJPUF9PU0dJX0xPQ0tJTkcsIG9sZExvY2tpbmdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgdm9pZCBkb0xvY2soU3RyaW5nIHRlc3RMb2NhdGlvbkRpciwgYm9vbGVhbiByZWxlYXNlLCBib29sZWFuIHN1Y2NlZWQpIHsKLQkJaWYgKHRlc3RMb2NhdGlvbkRpciA9PSBudWxsKQotCQkJZmFpbCgiVGhlIHRlc3RMb2NhdGlvbkRpciBpcyBub3Qgc2V0Iik7Ci0JCVNlcnZpY2VSZWZlcmVuY2VbXSByZWZzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZnMgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2VzKExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwgIih0eXBlPW9zZ2kuY29uZmlndXJhdGlvbi5hcmVhKSIpOwotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBjcmVhdGUgZmlsdGVyIiwgZSk7Ci0JCX0KLQkJLy8gdGhpcyBpcyB0ZXN0IGNvZGUgc28gd2UgYXJlIG5vdCB2ZXJ5IGNhcmVmdWw7IGp1c3QgYXNzdW1lIHRoZXJlIGlzIGF0IGxlYXNlIG9uZSBzZXJ2aWNlLiAgRG8gbm90IGNvcHkgYW5kIHBhc3RlIHRoaXMgY29kZSEhIQotCQlMb2NhdGlvbiBjb25maWdMb2NhdGlvbiA9IChMb2NhdGlvbikgT1NHaVRlc3RzQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlKHJlZnNbMF0pOwotCQlMb2NhdGlvbiB0ZXN0TG9jYXRpb24gPSBudWxsOwotCQl0cnkgewotCQkJdGVzdExvY2F0aW9uID0gY29uZmlnTG9jYXRpb24uY3JlYXRlTG9jYXRpb24obnVsbCwgbmV3IEZpbGUodGVzdExvY2F0aW9uRGlyKS50b1VSTCgpLCBmYWxzZSk7Ci0JCQl0ZXN0TG9jYXRpb24uc2V0VVJMKHRlc3RMb2NhdGlvbi5nZXREZWZhdWx0KCksIGZhbHNlKTsKLQkJCS8vIHRyeSBsb2NraW5nIGxvY2F0aW9uCi0JCQlpZiAoc3VjY2VlZCA/IHRlc3RMb2NhdGlvbi5pc0xvY2tlZCgpIDogIXRlc3RMb2NhdGlvbi5pc0xvY2tlZCgpKQotCQkJCWZhaWwoImxvY2F0aW9uIHNob3VsZCAiICsgKHN1Y2NlZWQgPyAibm90ICIgOiAiIikgKyAiYmUgbG9ja2VkIik7Ci0JCQlpZiAoc3VjY2VlZCA/ICF0ZXN0TG9jYXRpb24ubG9jaygpIDogdGVzdExvY2F0aW9uLmxvY2soKSkKLQkJCQlmYWlsKChzdWNjZWVkID8gIkNvdWxkIG5vdCIgOiAiQ291bGQiKSArICIgbG9jayBsb2NhdGlvbiIpOwotCQkJaWYgKCF0ZXN0TG9jYXRpb24uaXNMb2NrZWQoKSkKLQkJCQlmYWlsKCJsb2NhdGlvbiBzaG91bGQgYmUgbG9ja2VkIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gY3JlYXRlIHRoZSBsb2NhdGlvbiBVUkwiLCBlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiZmFpbGVkIHRvIGxvY2sgd2l0aCBJT0V4Y2V0cGlvbiIsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlbGVhc2UgJiYgdGVzdExvY2F0aW9uICE9IG51bGwpCi0JCQkJdGVzdExvY2F0aW9uLnJlbGVhc2UoKTsKLQkJCWlmICghcmVsZWFzZSkKLQkJCQlsb2NrZWRUZXN0TG9jYXRpb24gPSB0ZXN0TG9jYXRpb247Ci0JCQlPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShyZWZzWzBdKTsKLQkJfQotCX0KLQotCXN0YXRpYyB2b2lkIGRvUmVsZWFzZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChsb2NrZWRUZXN0TG9jYXRpb24gPT0gbnVsbCkKLQkJCQlmYWlsKCJsb2NrZWRUZXN0TG9jYXRpb24gPT0gbnVsbCAhISIpOwotCQkJaWYgKCFsb2NrZWRUZXN0TG9jYXRpb24uaXNMb2NrZWQoKSkKLQkJCQlmYWlsKCJsb2NrZWRUZXN0TG9jYXRpb24gaXMgbm90IGxvY2tlZCEhIik7Ci0JCQlsb2NrZWRUZXN0TG9jYXRpb24ucmVsZWFzZSgpOwotCQkJaWYgKGxvY2tlZFRlc3RMb2NhdGlvbi5pc0xvY2tlZCgpKQotCQkJCWZhaWwoImxvY2tlZFRlc3RMb2NhdGlvbiBpcyBzdGlsbCBsb2NrZWQhISIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJmYWlsZWQgdG8gdW5sb2NrIGxvY2tlZFRlc3RMb2NhdGlvbiIsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJbG9ja2VkVGVzdExvY2F0aW9uID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXNzaW9uRmFpbExvY2tKYXZhTklPKCkgewotCQlkb0xvY2soU3lzdGVtLmdldFByb3BlcnR5KFRFU1RfTE9DQVRJT05fRElSKSwgSkFWQV9OSU8sIHRydWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2Vzc2lvblN1Y2Nlc3NMb2NrSmF2YU5JTygpIHsKLQkJZG9Mb2NrKFN5c3RlbS5nZXRQcm9wZXJ0eShURVNUX0xPQ0FUSU9OX0RJUiksIEpBVkFfTklPLCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2Vzc2lvbkZhaWxMb2NrSmF2YUlPKCkgewotCQlpZiAoIUNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJvc2dpLm9zIikpKQotCQkJcmV0dXJuOwotCQlkb0xvY2soU3lzdGVtLmdldFByb3BlcnR5KFRFU1RfTE9DQVRJT05fRElSKSwgSkFWQV9JTywgdHJ1ZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXNzaW9uU3VjY2Vzc0xvY2tKYXZhSU8oKSB7Ci0JCWlmICghQ29uc3RhbnRzLk9TX1dJTjMyLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zZ2kub3MiKSkpCi0JCQlyZXR1cm47Ci0JCWRvTG9jayhTeXN0ZW0uZ2V0UHJvcGVydHkoVEVTVF9MT0NBVElPTl9ESVIpLCBKQVZBX0lPLCB0cnVlLCB0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvZGF0YWxvY2F0aW9uL1NpbXBsZVRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvZGF0YWxvY2F0aW9uL1NpbXBsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzY4YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL2RhdGFsb2NhdGlvbi9TaW1wbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5kYXRhbG9jYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnN0b3JhZ2VtYW5hZ2VyLlN0b3JhZ2VNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JU3RvcmFnZU1hbmFnZXIgbWFuYWdlcjE7Ci0JU3RvcmFnZU1hbmFnZXIgbWFuYWdlcjI7Ci0JRmlsZSBiYXNlOwotCXN0YXRpYyBTdHJpbmcgVEVTVDEgPSAidGVzdC50eHQiOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNpbXBsZVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQliYXNlID0gbmV3IEZpbGUoUGxhdGZvcm0uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkuZ2V0VVJMKCkuZ2V0UGF0aCgpKTsKLQkJbWFuYWdlcjEgPSBuZXcgU3RvcmFnZU1hbmFnZXIoYmFzZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlKCkgewotCQl0cnkgewotCQltYW5hZ2VyMS5vcGVuKHRydWUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFuYWdlcjEubG9va3VwKFRFU1QxLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIG1hbmFnZXIxLmdldElkKFRFU1QxKSk7Ci0KLQkJbWFuYWdlcjEuYWRkKFRFU1QxKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGJhc2UsIFRFU1QxICsgIi4wIiksIG1hbmFnZXIxLmxvb2t1cChURVNUMSwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hbmFnZXIxLmdldElkKFRFU1QxKSk7Ci0KLQkJbWFuYWdlcjEucmVtb3ZlKFRFU1QxKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hbmFnZXIxLmxvb2t1cChURVNUMSwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBtYW5hZ2VyMS5nZXRJZChURVNUMSkpOwotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vTm8gZXhjZXB0aW9uIGNhbiBvY2N1cnMgc2luY2UgYWxsIHRoZSBsb29rdXAgY2FsbHMgYXJlIGRvbmUgd2l0aCBmYWxzZQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZTEoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8JCW1hbmFnZXIxLmFkZChURVNUMSk7Ci0vLwkJdXBkYXRlKG1hbmFnZXIxLCBURVNUMSArICIubmV3Iik7Ci0vLwkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGJhc2UsIFRFU1QxKSwgbWFuYWdlcjEubG9va3VwKFRFU1QxLCBmYWxzZSkpOwotLy8JCWFzc2VydEVxdWFscygyLCBtYW5hZ2VyMS5nZXRJZChURVNUMSkpOwotLy8JCWFzc2VydFRydWUobWFuYWdlcjEuZ2V0VGltZVN0YW1wKFRFU1QxKSAhPSAwKTsKLS8vCX0KLS8vCi0vLwkvKgotLy8JICogc2hvdWxkIGJlIHJ1biBhZnRlciB0ZXN0aW5nIHNpbmdsZSB1cGRhdGUKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZTIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8JCWxvbmcgb2xkU3RhbXAgPSBtYW5hZ2VyMS5nZXRUaW1lU3RhbXAoVEVTVDEpOwotLy8JCXVwZGF0ZShtYW5hZ2VyMSwgVEVTVDEgKyAiLm5ldzIiKTsKLS8vCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoYmFzZSwgVEVTVDEpLCBtYW5hZ2VyMS5sb29rdXAoVEVTVDEpKTsKLS8vCQlhc3NlcnRFcXVhbHMoMywgbWFuYWdlcjEuZ2V0SWQoVEVTVDEpKTsKLS8vCQlhc3NlcnRUcnVlKG1hbmFnZXIxLmdldFRpbWVTdGFtcChURVNUMSkgIT0gMCk7Ci0vLwkJYXNzZXJ0VHJ1ZShuZXcgRmlsZShiYXNlLCBURVNUMSArICIuMiIpLmV4aXN0cygpKTsKLS8vCQlhc3NlcnRUcnVlKG9sZFN0YW1wICE9IG1hbmFnZXIxLmdldFRpbWVTdGFtcChURVNUMSkpOwotLy8JfQotLy8KLS8vCS8qCi0vLwkgKiBzaG91bGQgYmUgcnVuIGFmdGVyIHRlc3RpbmcgdXBkYXRlMgotLy8JICovCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0vLwkJbWFuYWdlcjIgPSBuZXcgRmlsZU1hbmFnZXIoYmFzZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGJhc2UsIFRFU1QxKSwgbWFuYWdlcjIubG9va3VwKFRFU1QxKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDMsIG1hbmFnZXIyLmdldElkKFRFU1QxKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShtYW5hZ2VyMi5nZXRUaW1lU3RhbXAoVEVTVDEpICE9IDApOwotLy8JCWFzc2VydFRydWUobmV3IEZpbGUoYmFzZSwgVEVTVDEgKyAiLjIiKS5leGlzdHMoKSk7Ci0vLwotLy8JCXVwZGF0ZShtYW5hZ2VyMiwgVEVTVDEgKyAiLm5ldzMiKTsKLS8vCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoYmFzZSwgVEVTVDEpLCBtYW5hZ2VyMi5sb29rdXAoVEVTVDEpKTsKLS8vCQlhc3NlcnRFcXVhbHMoNCwgbWFuYWdlcjIuZ2V0SWQoVEVTVDEpKTsKLS8vCQlhc3NlcnRUcnVlKG1hbmFnZXIyLmdldFRpbWVTdGFtcChURVNUMSkgIT0gMCk7Ci0vLwkJYXNzZXJ0VHJ1ZShuZXcgRmlsZShiYXNlLCBURVNUMSArICIuMyIpLmV4aXN0cygpKTsKLS8vCi0vLwkJYXNzZXJ0Tm90U2FtZShuZXcgRmlsZShiYXNlLCBURVNUMSksIG1hbmFnZXIxLmxvb2t1cChURVNUMSkpOwotLy8JCWFzc2VydEVxdWFscyhuZXcgRmlsZShiYXNlLCBURVNUMSArICIuMyIpLCBtYW5hZ2VyMS5sb29rdXAoVEVTVDEpKTsKLS8vCQlhc3NlcnRFcXVhbHMoMywgbWFuYWdlcjEuZ2V0SWQoVEVTVDEpKTsKLS8vCQlhc3NlcnRUcnVlKG1hbmFnZXIxLmdldFRpbWVTdGFtcChURVNUMSkgIT0gMCk7Ci0vLwkJYXNzZXJ0VHJ1ZShtYW5hZ2VyMS5nZXRUaW1lU3RhbXAoVEVTVDEpICE9IG1hbmFnZXIyLmdldFRpbWVTdGFtcChURVNUMSkpOwotLy8JfQotLy8KLS8vCXByaXZhdGUgdm9pZCB1cGRhdGUoU3RvcmFnZU1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8JCXdyaXRlRmlsZShuZXcgRmlsZShiYXNlLCBmaWxlbmFtZSkpOwotLy8JCW1hbmFnZXIudXBkYXRlKG5ldyBTdHJpbmdbXSB7VEVTVDF9LCBuZXcgU3RyaW5nW10ge2ZpbGVuYW1lfSk7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSB2b2lkIHdyaXRlRmlsZShGaWxlIGZpbGVuYW1lKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7Ci0vLwkJCW91dC53cml0ZSgoInRlc3QgLSAiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldEJ5dGVzKCkpOwotLy8JCQlvdXQuY2xvc2UoKTsKLS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLwkJfQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL2RhdGFsb2NhdGlvbi9TdHJlYW1NYW5hZ2VyVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9kYXRhbG9jYXRpb24vU3RyZWFtTWFuYWdlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzI5N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL2RhdGFsb2NhdGlvbi9TdHJlYW1NYW5hZ2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMuZGF0YWxvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnN0b3JhZ2VtYW5hZ2VyLk1hbmFnZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zdG9yYWdlbWFuYWdlci5TdG9yYWdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0OwotCi1wdWJsaWMgY2xhc3MgU3RyZWFtTWFuYWdlclRlc3RzIGV4dGVuZHMgT1NHaVRlc3QgewotCVN0b3JhZ2VNYW5hZ2VyIG1hbmFnZXIxOwotCVN0b3JhZ2VNYW5hZ2VyIG1hbmFnZXIyOwotCUZpbGUgYmFzZTsKLQlTdHJpbmcgcmVsaWFibGVGaWxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJlYW1NYW5hZ2VyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTdHJlYW1NYW5hZ2VyVGVzdHMuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWJhc2UgPSBuZXcgRmlsZShQbGF0Zm9ybS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCksICJTdHJlYW1NYW5hZ2VyVGVzdHMiKTsKLQkJbWFuYWdlcjEgPSBudWxsOwotCQltYW5hZ2VyMiA9IG51bGw7Ci0JCXJlbGlhYmxlRmlsZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3NnaS51c2VSZWxpYWJsZUZpbGVzIik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJaWYgKG1hbmFnZXIxICE9IG51bGwpCi0JCQltYW5hZ2VyMS5jbG9zZSgpOwotCQlpZiAobWFuYWdlcjIgIT0gbnVsbCkKLQkJCW1hbmFnZXIyLmNsb3NlKCk7Ci0JCXJtKGJhc2UpOwotCQlpZiAocmVsaWFibGVGaWxlID09IG51bGwpCi0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZSgib3NnaS51c2VSZWxpYWJsZUZpbGVzIik7Ci0JCWVsc2UKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgib3NnaS51c2VSZWxpYWJsZUZpbGVzIiwgcmVsaWFibGVGaWxlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJtKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gbGlzdCA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaWR4PTA7IGlkeDxsaXN0Lmxlbmd0aDsgaWR4KyspIHsKLQkJCQkJcm0obGlzdFtpZHhdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmlsZS5kZWxldGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5wdXRTdHJlYW1Db250ZW50cyhJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlieXRlW10gZGF0YSA9IG5ldyBieXRlWzY0XTsKLQkJaW50IGxlbjsKLQkJdHJ5IHsKLQkJCXdoaWxlICgobGVuID0gaXMucmVhZChkYXRhKSkgIT0gLTEpIHsKLQkJCQlzYi5hcHBlbmQobmV3IFN0cmluZyhkYXRhLCAwLCBsZW4pKTsKLQkJCX0gCi0JCX0gZmluYWxseSB7Ci0JCQlpcy5jbG9zZSgpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkKLQl2b2lkIHdyaXRlVG9GaWxlKEZpbGUgZmlsZSwgU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJdHJ5IHsKLQkJCWZvcy53cml0ZShzdHIuZ2V0Qnl0ZXMoKSk7Ci0JCQlmb3MuZmx1c2goKTsKLQkJCWZvcy5nZXRGRCgpLnN5bmMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZvcy5jbG9zZSgpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogVGhpcyB0ZXN0cyB0aGF0IEZNIHdpbGwga2VlcCBhIGJhY2t1cCB2ZXJzaW9uIG9mIGEgcmVsaWFibGVGaWxlIGFuZCB0aGF0Ci0JICogY29ycnVwdGluZyB0aGUgcmVsaWFibGVGaWxlIHdpbGwgcmVjb3ZlciB0aGUgcHJldmlvdXMgY29udGVudHMuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbGlhYmxlRmlsZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gInRlc3RSZWxpYWJsZUZpbGUudHh0IjsKLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKGJhc2UsIGZpbGVOYW1lKyIuMSIpOwotCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUoYmFzZSwgZmlsZU5hbWUrIi4yIik7Ci0JCUZpbGUgZmlsZTMgPSBuZXcgRmlsZShiYXNlLCBmaWxlTmFtZSsiLjMiKTsKLQkJU3RyaW5nIGNvbnRlbnRzMSA9ICJ0ZXN0IHJlbGlhYmxlIGZpbGUgY09udGVudHMgIzEiOwotCQlTdHJpbmcgY29udGVudHMyID0gInRlc3QgcmVsaWFibGUgZmlsZSBjT250ZW50cyAjMiI7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9zZ2kudXNlUmVsaWFibGVGaWxlcyIsICJ0cnVlIik7IC8vIGZvcmNlIHJlbGlhYmxlIGZpbGVzCi0JCQltYW5hZ2VyMSA9IG5ldyBTdG9yYWdlTWFuYWdlcihiYXNlLCBudWxsKTsKLQkJCW1hbmFnZXIxLm9wZW4odHJ1ZSk7Ci0JCQlNYW5hZ2VkT3V0cHV0U3RyZWFtIGZtb3MgPSBtYW5hZ2VyMS5nZXRPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJYXNzZXJ0Tm90TnVsbChmbW9zKTsKLQkJCWZtb3Mud3JpdGUoY29udGVudHMxLmdldEJ5dGVzKCkpOwotCQkJZm1vcy5jbG9zZSgpOwotCQkJCi0JCQkvLyBXcml0ZSB2ZXJpb24yIG9mIHRoZSBmaWxlCi0JCQlmbW9zID0gbWFuYWdlcjEuZ2V0T3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCWFzc2VydE5vdE51bGwoZm1vcyk7Ci0JCQlmbW9zLndyaXRlKGNvbnRlbnRzMi5nZXRCeXRlcygpKTsKLQkJCWZtb3MuY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoZmlsZTEuZXhpc3RzKCkpOwotCQkJYXNzZXJ0VHJ1ZShmaWxlMi5leGlzdHMoKSk7Ci0JCQlhc3NlcnRUcnVlKCFmaWxlMy5leGlzdHMoKSk7Ci0JCQltYW5hZ2VyMS5jbG9zZSgpOwotCQkJbWFuYWdlcjEgPSBudWxsOwotCQkJCi0JCQkvL25vdywgb3BlbiBuZXcgbWFuYWdlciwgdmVyaWZ5IGZpbGUgY29udGVudHMgYXJlICMyCi0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9zZ2kudXNlUmVsaWFibGVGaWxlcyIsICJ0cnVlIik7IC8vIGZvcmNlIHJlbGlhYmxlIGZpbGVzCi0JCQltYW5hZ2VyMiA9IG5ldyBTdG9yYWdlTWFuYWdlcihiYXNlLCBudWxsKTsKLQkJCW1hbmFnZXIyLm9wZW4odHJ1ZSk7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IG1hbmFnZXIyLmdldElucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCWFzc2VydE5vdE51bGwoaXMpOwotCQkJYXNzZXJ0RXF1YWxzKGNvbnRlbnRzMiwgZ2V0SW5wdXRTdHJlYW1Db250ZW50cyhpcykpOwotCQkJbWFuYWdlcjIuY2xvc2UoKTsKLQkJCW1hbmFnZXIyID0gbnVsbDsKLQkJCQotCQkJLy8gbmVlZCB0byBzbGVlcCwgRkFUMzIgZG9lc24ndCBoYXZlIHRvbyBmaW5lIGdyYW51bGFyaXR5IGluIHRpbWVzdGFtcHMKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUwMDApOwotCQkJfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7LyppZ25vcmUqL30KLQkJCS8vbm93LCBjb3JydXB0IHZlcnNpb24gMiBvZiB0aGUgZmlsZQotCQkJUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmaWxlMiwgInJ3Iik7Ci0JCQlyYWYuc2VlaygyMCk7Ci0JCQlyYWYud3JpdGUoJzAnKTsgLy8gY2hhbmdlICdPJyB0byAnMCcKLQkJCXJhZi5jbG9zZSgpOwotCi0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9zZ2kudXNlUmVsaWFibGVGaWxlcyIsICJ0cnVlIik7IC8vIGZvcmNlIHJlbGlhYmxlIGZpbGVzCi0JCQltYW5hZ2VyMSA9IG5ldyBTdG9yYWdlTWFuYWdlcihiYXNlLCBudWxsKTsKLQkJCW1hbmFnZXIxLm9wZW4odHJ1ZSk7Ci0JCQkKLQkJCS8vcmVxdWVzdCBhbnkgdmFsaWQgc3RyZWFtIGF2YWlsYWJsZQotCQkJaXMgPSBtYW5hZ2VyMS5nZXRJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlhc3NlcnROb3ROdWxsKGlzKTsKLQkJCWFzc2VydEVxdWFscyhjb250ZW50czEsIGdldElucHV0U3RyZWFtQ29udGVudHMoaXMpKTsKLQkJCQotCQkJLy9ub3cgcmVxdWVzdCBvbmx5IHRoZSBwcmltYXJ5IGZpbGUKLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW1bXSBpc1NldCA9IG1hbmFnZXIxLmdldElucHV0U3RyZWFtU2V0KG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWV9KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlzU2V0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpc1NldFtpXSAhPSBudWxsKQotCQkJCQkJaXNTZXRbaV0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJZmFpbCgiZ2V0SW5wdXRTdHJlYW1TZXQgd2FzIHN1Y2Nlc3NmdWwiKTsKLQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCS8vZ29vZAotCQkJfQotCQkJCi0JCQkvL25vdywgY29ycnVwdCB2ZXJzaW9uIDEgb2YgdGhlIGZpbGUKLQkJCXJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZpbGUxLCAicnciKTsKLQkJCXJhZi5zZWVrKDIwKTsKLQkJCXJhZi53cml0ZSgnMCcpOyAvLyBjaGFuZ2UgJ08nIHRvICcwJwotCQkJcmFmLmNsb3NlKCk7Ci0JCQkKLQkJCS8vIGdldCBpbnB1dCBzdHJlYW0gc2hvdWxkIGZhaWwKLQkJCXRyeSB7Ci0JCQkJaXMgPSBtYW5hZ2VyMS5nZXRJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQkJZmFpbCgiZ2V0IGlucHV0IHN0cmVhbSBzdWNjZWRkZWQiKTsKLQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCS8vZ29vZAotCQkJfQotCQkJbWFuYWdlcjEuY2xvc2UoKTsKLQkJCW1hbmFnZXIxID0gbnVsbDsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4ZXBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBUaGlzIHRlc3RzIGlmIG1pZ3JhdGlvbiBmcm9tIGEgcHJpb3IgKG5vbi1SZWxpYWJsZUZpbGUpIC5maWxlVGFibGUKLQkgKiB0byB0aGUgY3VycmVudCAuZmlsZVRhYmxlIGlzIGNvcnJlY3QuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWlncmF0aW9uKCkgewotCQlGaWxlIHRlc3REaXIgPSBuZXcgRmlsZShiYXNlLCAidGVzdE1pZ3JhdGlvbk1hbmFnZXIiKTsKLQkJRmlsZSBtYW5hZ2VyRGlyID0gbmV3IEZpbGUodGVzdERpciwgIi5tYW5hZ2VyIik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9ICJ0ZXN0TWlncmF0aW9uLnR4dCI7Ci0JCUZpbGUgZmlsZTIgPSBuZXcgRmlsZSh0ZXN0RGlyLCBmaWxlTmFtZSsiLjIiKTsKLQkJRmlsZSBmaWxlNSA9IG5ldyBGaWxlKHRlc3REaXIsIGZpbGVOYW1lKyIuNSIpOwotCQlGaWxlIGZpbGVUYWJsZSA9IG5ldyBGaWxlKG1hbmFnZXJEaXIsICIuZmlsZVRhYmxlIik7Ci0JCUZpbGUgZmlsZVRhYmxlMSA9IG5ldyBGaWxlKG1hbmFnZXJEaXIsICIuZmlsZVRhYmxlLjEiKTsKLQkJRmlsZSBmaWxlVGFibGUyID0gbmV3IEZpbGUobWFuYWdlckRpciwgIi5maWxlVGFibGUuMiIpOwotCQlGaWxlIGZpbGVUYWJsZTMgPSBuZXcgRmlsZShtYW5hZ2VyRGlyLCAiLmZpbGVUYWJsZS4zIik7Ci0JCVN0cmluZyBjb250ZW50czEgPSAidGVzdCByZWxpYWJsZSBmaWxlIGNvbnRlbnRzICMxIjsKLQkJU3RyaW5nIGNvbnRlbnRzMiA9ICJ0ZXN0IHJlbGlhYmxlIGZpbGUgY29udGVudHMgIzIiOwotCQlTdHJpbmcgY29udGVudHMzID0gInRlc3QgcmVsaWFibGUgZmlsZSBjb250ZW50cyAjMyI7Ci0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgYSAuZmlsZVRhYmxlIGFuZCBhIG5vcm1hbCBmaWxlCi0JCQltYW5hZ2VyRGlyLm1rZGlycygpOwotCQkJd3JpdGVUb0ZpbGUoZmlsZVRhYmxlLCAiI3NhZmUgdGFibGVcbiIrZmlsZU5hbWUrIj0yXG4iKTsKLQkJCXdyaXRlVG9GaWxlKGZpbGUyLCBjb250ZW50czEpOwotCQkJbWFuYWdlcjEgPSBuZXcgU3RvcmFnZU1hbmFnZXIodGVzdERpciwgbnVsbCk7Ci0JCQltYW5hZ2VyMS5vcGVuKHRydWUpOwotCQkJRmlsZSB0ZXN0ID0gbWFuYWdlcjEubG9va3VwKGZpbGVOYW1lLCBmYWxzZSk7Ci0JCQlhc3NlcnROb3ROdWxsKHRlc3QpOwotCQkJYXNzZXJ0VHJ1ZSh0ZXN0LmV4aXN0cygpKTsKLQkJCQotCQkJLy8gdXBkYXRlIGEgbmV3IGZpbGUKLQkJCUZpbGUgdGVzdEZpbGUgPSBtYW5hZ2VyMS5jcmVhdGVUZW1wRmlsZShmaWxlTmFtZSk7Ci0JCQl3cml0ZVRvRmlsZSh0ZXN0RmlsZSwgY29udGVudHMyKTsKLQkJCW1hbmFnZXIxLnVwZGF0ZShuZXcgU3RyaW5nW10ge2ZpbGVOYW1lfSwgbmV3IFN0cmluZ1tdIHt0ZXN0RmlsZS5nZXROYW1lKCl9KTsKLQkJCS8vIGFnYWluCi0JCQl0ZXN0RmlsZSA9IG1hbmFnZXIxLmNyZWF0ZVRlbXBGaWxlKGZpbGVOYW1lKTsKLQkJCXdyaXRlVG9GaWxlKHRlc3RGaWxlLCBjb250ZW50czMpOwotCQkJbWFuYWdlcjEudXBkYXRlKG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWV9LCBuZXcgU3RyaW5nW10ge3Rlc3RGaWxlLmdldE5hbWUoKX0pOwotCQkJLy8gYWdhaW4KLQkJCXRlc3RGaWxlID0gbWFuYWdlcjEuY3JlYXRlVGVtcEZpbGUoZmlsZU5hbWUpOwotCQkJd3JpdGVUb0ZpbGUodGVzdEZpbGUsIGNvbnRlbnRzMSk7Ci0JCQltYW5hZ2VyMS51cGRhdGUobmV3IFN0cmluZ1tdIHtmaWxlTmFtZX0sIG5ldyBTdHJpbmdbXSB7dGVzdEZpbGUuZ2V0TmFtZSgpfSk7Ci0JCQltYW5hZ2VyMS5jbG9zZSgpOwotCQkJbWFuYWdlcjE9IG51bGw7Ci0JCQkKLQkJCVN0cmluZ1tdIGZpbGVzID0gbWFuYWdlckRpci5saXN0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoNCwgZmlsZXMubGVuZ3RoKTsKLQkJCS8vb3JpZ2luYWwgZmlsZSBuZXZlciBnZXRzIGRlbGV0ZWQKLQkJCWFzc2VydFRydWUoZmlsZVRhYmxlLmV4aXN0cygpKTsKLQkJCS8vYmVoYXZlcyBsaWtlIGEgcmVsaWFibGVGaWxlPwotCQkJYXNzZXJ0RmFsc2UoZmlsZVRhYmxlMS5leGlzdHMoKSk7Ci0JCQlhc3NlcnRUcnVlKGZpbGVUYWJsZTIuZXhpc3RzKCkpOwotCQkJYXNzZXJ0VHJ1ZShmaWxlVGFibGUzLmV4aXN0cygpKTsKLQkJCS8vZmlsZXMgYXJlIGFzIGV4cGVjdGVkPwotCQkJZmlsZXMgPSB0ZXN0RGlyLmxpc3QoKTsKLQkJCWFzc2VydEVxdWFscygyLCBmaWxlcy5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZShmaWxlNS5leGlzdHMoKSk7Ci0JCQkKLQkJCW1hbmFnZXIyID0gbmV3IFN0b3JhZ2VNYW5hZ2VyKHRlc3REaXIsIG51bGwpOwotCQkJbWFuYWdlcjIub3Blbih0cnVlKTsKLQkJCXRlc3RGaWxlID0gbWFuYWdlcjIubG9va3VwKGZpbGVOYW1lLCBmYWxzZSk7Ci0JCQlhc3NlcnROb3ROdWxsKHRlc3RGaWxlKTsKLQkJCWFzc2VydFRydWUodGVzdEZpbGUuZXhpc3RzKCkpOwotCQkJYXNzZXJ0VHJ1ZSh0ZXN0RmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi41IikpOwotCQkJbWFuYWdlcjIuY2xvc2UoKTsKLQkJCW1hbmFnZXIyPW51bGw7Ci0JCQkKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4ZXBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgdGVzdHMgdGhhdCBhbiBvdXRwdXQgc3RyZWFtIGFib3J0IGJlaGF2ZSBhcyBleHBlY3RlZC4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBYm9ydCgpIHsKLQkJdGVzdEFib3J0KHRydWUpOwotCQl0ZXN0QWJvcnQoZmFsc2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGVzdEFib3J0KGJvb2xlYW4gcmVsaWFibGUpIHsKLQkJU3RyaW5nIGZpbGVOYW1lOwotCQlpZiAocmVsaWFibGUpCi0JCQlmaWxlTmFtZSA9ICJhYm9ydEZpbGVSZWxpYWJsZS50eHQiOwotCQllbHNlIAotCQkJZmlsZU5hbWUgPSAiYWJvcnRGaWxlU3RkLnR4dCI7Ci0JCUZpbGUgZmlsZTEgPSBuZXcgRmlsZShiYXNlLCBmaWxlTmFtZSsiLjEiKTsKLQkJRmlsZSBmaWxlMiA9IG5ldyBGaWxlKGJhc2UsIGZpbGVOYW1lKyIuMiIpOwotCQlGaWxlIGZpbGUzID0gbmV3IEZpbGUoYmFzZSwgZmlsZU5hbWUrIi4zIik7Ci0JCVN0cmluZyBjb250ZW50czEgPSAidGVzdCByZWxpYWJsZSBmaWxlIGNvbnRlbnRzICMxIjsKLQkJU3RyaW5nIGNvbnRlbnRzMiA9ICJ0ZXN0IHJlbGlhYmxlIGZpbGUgY29udGVudHMgIzIiOwotCQl0cnkgewotCQkJU3lzdGVtLnNldFByb3BlcnR5KCJvc2dpLnVzZVJlbGlhYmxlRmlsZXMiLCAidHJ1ZSIpOyAvLyBmb3JjZSByZWxpYWJsZSBmaWxlcwotCQkJbWFuYWdlcjEgPSBuZXcgU3RvcmFnZU1hbmFnZXIoYmFzZSwgbnVsbCk7Ci0JCQltYW5hZ2VyMS5vcGVuKHRydWUpOwotCQkJLy9jcmVhdGUgdmVyc2lvbiAxCi0JCQlNYW5hZ2VkT3V0cHV0U3RyZWFtIHNtb3MgPSBtYW5hZ2VyMS5nZXRPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc21vcy53cml0ZShjb250ZW50czEuZ2V0Qnl0ZXMoKSk7Ci0JCQlzbW9zLmNsb3NlKCk7Ci0JCQkKLQkJCS8vc3RhcnQgY3JlYXRpbmcgdmVyc2lvbiAyCi0JCQlzbW9zID0gbWFuYWdlcjEuZ2V0T3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXNtb3Mud3JpdGUoY29udGVudHMyLmdldEJ5dGVzKCkpOwotCQkJc21vcy5hYm9ydCgpOwotCQkJc21vcy5jbG9zZSgpOyAvLyBzaG91bGRuJ3QgY2F1c2UgZXhjZXB0aW9uLCBjaGVjayEKLQkJCQotCQkJLy8gbm93IHNlZSBpZiB3ZSdyZSBzdGlsbCBvbiB2ZXJzaW9uICMxCi0JCQlhc3NlcnRFcXVhbHMoMSwgbWFuYWdlcjEuZ2V0SWQoZmlsZU5hbWUpKTsKLQkJCS8vIGNoZWNrIGNvbnRlbnRzIGFsc28KLQkJCUlucHV0U3RyZWFtIGlzID0gbWFuYWdlcjEuZ2V0SW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJYXNzZXJ0Tm90TnVsbChpcyk7Ci0JCQlhc3NlcnRFcXVhbHMoY29udGVudHMxLCBnZXRJbnB1dFN0cmVhbUNvbnRlbnRzKGlzKSk7Ci0JCQltYW5hZ2VyMS5jbG9zZSgpOwotCQkJbWFuYWdlcjE9bnVsbDsKLQkJCQotCQkJLy8gb3BlbiBhIG5ldyBtYW5hZ2VyICYgY2hlY2sgdGhlIHNhbWUgdGhpbmcgdG8gZW5zdXJlIHRoZSBkYXRhYmFzZSBpcyBjb3JyZWN0Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9zZ2kudXNlUmVsaWFibGVGaWxlcyIsICJ0cnVlIik7IC8vIGZvcmNlIHJlbGlhYmxlIGZpbGVzCi0JCQltYW5hZ2VyMiA9IG5ldyBTdG9yYWdlTWFuYWdlcihiYXNlLCBudWxsKTsKLQkJCW1hbmFnZXIyLm9wZW4odHJ1ZSk7Ci0JCQkvL2NyZWF0ZSB2ZXJzaW9uIDEKLQkJCS8vIG5vdyBzZWUgaWYgd2UncmUgc3RpbGwgb24gdmVyc2lvbiAjMQotCQkJYXNzZXJ0RXF1YWxzKDEsIG1hbmFnZXIyLmdldElkKGZpbGVOYW1lKSk7Ci0JCQkvLyBjaGVjayBjb250ZW50cyBhbHNvCi0JCQlpcyA9IG1hbmFnZXIyLmdldElucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCWFzc2VydE5vdE51bGwoaXMpOwotCQkJYXNzZXJ0RXF1YWxzKGNvbnRlbnRzMSwgZ2V0SW5wdXRTdHJlYW1Db250ZW50cyhpcykpOwotCQkJbWFuYWdlcjIuY2xvc2UoKTsKLQkJCW1hbmFnZXIyPW51bGw7Ci0JCQlhc3NlcnRUcnVlKGZpbGUxLmV4aXN0cygpKTsKLQkJCWFzc2VydEZhbHNlKGZpbGUyLmV4aXN0cygpKTsKLQkJCWFzc2VydEZhbHNlKGZpbGUzLmV4aXN0cygpKTsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4ZXBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIFRoaXMgdGVzdHMgaWYgZ2V0dGluZyBhbiBvdXRwdXQgc3RyZWFtLXNldCB3b3JrIHByb3Blcmx5LgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldE91dHB1dFN0cmVhbVNldCgpIHsKLQkJdGVzdEdldE91dHB1dFN0cmVhbVNldCh0cnVlKTsKLQkJdGVzdEdldE91dHB1dFN0cmVhbVNldChmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0ZXN0R2V0T3V0cHV0U3RyZWFtU2V0KGJvb2xlYW4gcmVsaWFibGUpIHsKLQkJRmlsZSBtZ3JEaXI7Ci0JCWlmIChyZWxpYWJsZSkKLQkJCW1nckRpciA9IG5ldyBGaWxlKGJhc2UsICJnZXRTZXRSZWxpYWJsZSIpOwotCQllbHNlCi0JCQltZ3JEaXIgPSBuZXcgRmlsZShiYXNlLCAiZ2V0U2V0U3RkIik7Ci0JCVN0cmluZyBmaWxlTmFtZTEgPSAidGVzdFNldDEudHh0IjsKLQkJU3RyaW5nIGZpbGVOYW1lMiA9ICJ0ZXN0U2V0Mi50eHQiOwotCQlGaWxlIGZpbGUxXzEgPSBuZXcgRmlsZShtZ3JEaXIsIGZpbGVOYW1lMSsiLjEiKTsKLQkJRmlsZSBmaWxlMV8yID0gbmV3IEZpbGUobWdyRGlyLCBmaWxlTmFtZTErIi4yIik7Ci0JCUZpbGUgZmlsZTJfMSA9IG5ldyBGaWxlKG1nckRpciwgZmlsZU5hbWUyKyIuMSIpOwotCQlGaWxlIGZpbGUyXzIgPSBuZXcgRmlsZShtZ3JEaXIsIGZpbGVOYW1lMisiLjIiKTsKLQkJU3RyaW5nIGNvbnRlbnRzMSA9ICJ0ZXN0IHJlbGlhYmxlIGZpbGUgY29udGVudHMgIzEiOwotCQlTdHJpbmcgY29udGVudHMyID0gInRlc3QgcmVsaWFibGUgZmlsZSBjb250ZW50cyAjMiI7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9zZ2kudXNlUmVsaWFibGVGaWxlcyIsIHJlbGlhYmxlID8gInRydWUiIDogImZhbHNlIik7IC8vIGZvcmNlIHJlbGlhYmxlIGZpbGVzCi0JCQltYW5hZ2VyMSA9IG5ldyBTdG9yYWdlTWFuYWdlcihtZ3JEaXIsIG51bGwpOwotCQkJbWFuYWdlcjEub3Blbih0cnVlKTsKLQkJCU1hbmFnZWRPdXRwdXRTdHJlYW1bXSBvdXRzID0gbWFuYWdlcjEuZ2V0T3V0cHV0U3RyZWFtU2V0KG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWUxLCBmaWxlTmFtZTJ9KTsKLQkJCWFzc2VydE5vdE51bGwob3V0cyk7Ci0JCQlhc3NlcnRFcXVhbHMoMiwgb3V0cy5sZW5ndGgpOwotCQkJCi0JCQlvdXRzWzBdLndyaXRlKGNvbnRlbnRzMS5nZXRCeXRlcygpKTsKLQkJCW91dHNbMV0ud3JpdGUoY29udGVudHMyLmdldEJ5dGVzKCkpOwotCQkJb3V0c1sxXS5jbG9zZSgpOwotCQkJYXNzZXJ0RmFsc2UoZmlsZTFfMS5leGlzdHMoKSk7Ci0JCQlhc3NlcnRGYWxzZShmaWxlMl8xLmV4aXN0cygpKTsKLQkJCW91dHNbMF0uY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoZmlsZTFfMS5leGlzdHMoKSk7Ci0JCQlhc3NlcnRUcnVlKGZpbGUyXzEuZXhpc3RzKCkpOwotCQkJCi0JCQlvdXRzID0gbWFuYWdlcjEuZ2V0T3V0cHV0U3RyZWFtU2V0KG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWUxLCBmaWxlTmFtZTJ9KTsKLQkJCWFzc2VydE5vdE51bGwob3V0cyk7Ci0JCQkKLQkJCW91dHNbMF0ud3JpdGUoIm5ldyBkYXRhICMxIi5nZXRCeXRlcygpKTsKLQkJCW91dHNbMV0ud3JpdGUoIm5ldyBkYXRhICMyIi5nZXRCeXRlcygpKTsKLQkJCW91dHNbMF0uY2xvc2UoKTsKLQkJCWFzc2VydEZhbHNlKGZpbGUxXzIuZXhpc3RzKCkpOwotCQkJYXNzZXJ0RmFsc2UoZmlsZTJfMi5leGlzdHMoKSk7Ci0JCQlvdXRzWzFdLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKGZpbGUxXzIuZXhpc3RzKCkpOwotCQkJYXNzZXJ0VHJ1ZShmaWxlMl8yLmV4aXN0cygpKTsKLQkJCW1hbmFnZXIxLmNsb3NlKCk7Ci0JCQltYW5hZ2VyMSA9IG51bGw7Ci0JCQkKLQkJCWlmIChyZWxpYWJsZSkgewotCQkJCS8vIHZlcmlmeSBGTSB0aGlua3MgdGhleSBhcmUgcmVsaWFibGUKLQkJCQlhc3NlcnRUcnVlKGZpbGUxXzEuZXhpc3RzKCkpOwotCQkJCWFzc2VydFRydWUoZmlsZTJfMS5leGlzdHMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHZlcmlmeSBGTSB0aGlua3MgdGhleSBhcmUgbm90IHJlbGlhYmxlCi0JCQkJYXNzZXJ0RmFsc2UoZmlsZTFfMS5leGlzdHMoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoZmlsZTJfMS5leGlzdHMoKSk7CQkJCQotCQkJfQotCQkKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4ZXBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHRlc3RzIGlmIGFib3J0aW5nIGEgbWFuYWdlZCBzdHJlYW0tc2V0IHdvcmtzIGFzIGV4cGVjdGVkCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWJvcnRTdHJlYW1TZXQoKSB7Ci0JCXRlc3RBYm9ydFNldCh0cnVlKTsKLQkJdGVzdEFib3J0U2V0KGZhbHNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRlc3RBYm9ydFNldChib29sZWFuIHJlbGlhYmxlKSB7Ci0JCUZpbGUgbWdyRGlyOwotCQlpZiAocmVsaWFibGUpCi0JCQltZ3JEaXIgPSBuZXcgRmlsZShiYXNlLCAiYWJvcnRTZXRSZWxpYWJsZSIpOwotCQllbHNlCi0JCQltZ3JEaXIgPSBuZXcgRmlsZShiYXNlLCAiYWJvcnRTZXRTdGQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lMSA9ICJ0ZXN0MS50eHQiOwotCQlTdHJpbmcgZmlsZU5hbWUyID0gInRlc3QyLnR4dCI7Ci0JCVN0cmluZyBmaWxlTmFtZTMgPSAidGVzdDMudHh0IjsKLQkJU3RyaW5nIGZpbGVOYW1lNCA9ICJ0ZXN0NC50eHQiOwotCQlTdHJpbmcgY29udGVudHMxID0gInRlc3QgcmVsaWFibGUgZmlsZSBjb250ZW50cyAjMSI7Ci0JCVN0cmluZyBjb250ZW50czIgPSAidGVzdCByZWxpYWJsZSBmaWxlIGNvbnRlbnRzICMyIjsKLQkJdHJ5IHsKLQkJCW1nckRpci5ta2RpcnMoKTsKLQkJCVN0cmluZ1tdIGxpc3QgPSBtZ3JEaXIubGlzdCgpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3QubGVuZ3RoKTsKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgib3NnaS51c2VSZWxpYWJsZUZpbGVzIiwgcmVsaWFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8gZm9yY2UgcmVsaWFibGUgZmlsZXMKLQkJCW1hbmFnZXIxID0gbmV3IFN0b3JhZ2VNYW5hZ2VyKG1nckRpciwgbnVsbCk7Ci0JCQltYW5hZ2VyMS5vcGVuKHRydWUpOwotCQkJTWFuYWdlZE91dHB1dFN0cmVhbVtdIG91dHMgPSBtYW5hZ2VyMS5nZXRPdXRwdXRTdHJlYW1TZXQobmV3IFN0cmluZ1tdIHtmaWxlTmFtZTEsIGZpbGVOYW1lMiwgZmlsZU5hbWUzLCBmaWxlTmFtZTR9KTsKLQkJCWFzc2VydE5vdE51bGwob3V0cyk7Ci0JCQkKLQkJCW91dHNbMF0ud3JpdGUoY29udGVudHMxLmdldEJ5dGVzKCkpOwotCQkJb3V0c1sxXS53cml0ZShjb250ZW50czIuZ2V0Qnl0ZXMoKSk7Ci0JCQlvdXRzWzJdLndyaXRlKGNvbnRlbnRzMi5nZXRCeXRlcygpKTsKLQkJCW91dHNbM10ud3JpdGUoY29udGVudHMxLmdldEJ5dGVzKCkpOwotCQkJLy9zYW5pdHkgY2hlY2sKLQkJCWxpc3QgPSBtZ3JEaXIubGlzdCgpOwotCQkJYXNzZXJ0RXF1YWxzKDUsIGxpc3QubGVuZ3RoKTsKLQkJCW91dHNbMl0uY2xvc2UoKTsKLQkJCW91dHNbMV0uYWJvcnQoKTsKLQkJCW91dHNbMF0uY2xvc2UoKTsgLy9ub29wCi0JCQlvdXRzWzNdLmNsb3NlKCk7IC8vbm9vcAotCQkJb3V0c1syXS5jbG9zZSgpOyAvL25vb3AKLQkJCW91dHNbMV0uY2xvc2UoKTsgLy9ub29wCi0JCQlsaXN0ID0gbWdyRGlyLmxpc3QoKTsKLQkJCWFzc2VydEVxdWFscygxLCBsaXN0Lmxlbmd0aCk7Ci0JCQlhc3NlcnROdWxsKG1hbmFnZXIxLmxvb2t1cChmaWxlTmFtZTEsIGZhbHNlKSk7Ci0JCQlhc3NlcnROdWxsKG1hbmFnZXIxLmxvb2t1cChmaWxlTmFtZTIsIGZhbHNlKSk7Ci0JCQlhc3NlcnROdWxsKG1hbmFnZXIxLmxvb2t1cChmaWxlTmFtZTMsIGZhbHNlKSk7Ci0JCQlhc3NlcnROdWxsKG1hbmFnZXIxLmxvb2t1cChmaWxlTmFtZTQsIGZhbHNlKSk7Ci0JCQltYW5hZ2VyMS5jbG9zZSgpOwotCQkJbWFuYWdlcjEgPSBudWxsOwotCQkJCi0JCQkvLyBvcGVuIGEgbmV3IG1hbmFnZXIgJiBjaGVjayB0aGUgc2FtZSB0aGluZyB0byBlbnN1cmUgdGhlIGRhdGFiYXNlIGlzIGNvcnJlY3QKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgib3NnaS51c2VSZWxpYWJsZUZpbGVzIiwgcmVsaWFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8gZm9yY2UgcmVsaWFibGUgZmlsZXMKLQkJCW1hbmFnZXIyID0gbmV3IFN0b3JhZ2VNYW5hZ2VyKG1nckRpciwgbnVsbCk7Ci0JCQltYW5hZ2VyMi5vcGVuKHRydWUpOwotCQkJLy9jcmVhdGUgdmVyc2lvbiAxCi0JCQlhc3NlcnROdWxsKG1hbmFnZXIyLmxvb2t1cChmaWxlTmFtZTEsIGZhbHNlKSk7Ci0JCQlhc3NlcnROdWxsKG1hbmFnZXIyLmxvb2t1cChmaWxlTmFtZTIsIGZhbHNlKSk7Ci0JCQlhc3NlcnROdWxsKG1hbmFnZXIyLmxvb2t1cChmaWxlTmFtZTMsIGZhbHNlKSk7Ci0JCQlhc3NlcnROdWxsKG1hbmFnZXIyLmxvb2t1cChmaWxlTmFtZTQsIGZhbHNlKSk7Ci0JCQlsaXN0ID0gbWdyRGlyLmxpc3QoKTsKLQkJCWFzc2VydEVxdWFscygxLCBsaXN0Lmxlbmd0aCk7Ci0JCQltYW5hZ2VyMi5jbG9zZSgpOwotCQkJbWFuYWdlcjIgPSBudWxsOwotCQkKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJ1bmV4ZXBlY3RlZCBleGNlcHRpb24iLCBlKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9BYnN0cmFjdFN0YXRlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL0Fic3RyYWN0U3RhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWE2ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL0Fic3RyYWN0U3RhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5PU0dpVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdGF0ZVRlc3QgZXh0ZW5kcyBPU0dpVGVzdCB7Ci0JcHJvdGVjdGVkIFBsYXRmb3JtQWRtaW4gcGxhdGZvcm1BZG1pbjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXBsYXRmb3JtQWRtaW4gPSBuZXcgU2ltcGxlUGxhdGZvcm1BZG1pbihnZXRSYW5kb21Mb2NhdGlvbigpLnRvRmlsZSgpLCBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RTdGF0ZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NlcnRDb250YWlucyhTdHJpbmcgdGFnLCBPYmplY3RbXSBhcnJheSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLQkJCWlmIChhcnJheVtpXSA9PSBlbGVtZW50KQotCQkJCXJldHVybjsKLQkJZmFpbCh0YWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdGF0ZSBvcmlnaW5hbCwgU3RhdGUgY29weSkgewotCQlhc3NlcnRFcXVhbHMoIiIsIG9yaWdpbmFsLCBjb3B5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIHRhZywgQnVuZGxlRGVzY3JpcHRpb24gb3JpZ2luYWwsIEJ1bmRsZURlc2NyaXB0aW9uIGNvcHkpIHsKLQkJaWYgKG9yaWdpbmFsID09IGNvcHkpCi0JCQlyZXR1cm47Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjAiLCBvcmlnaW5hbC5nZXRCdW5kbGVJZCgpLCBjb3B5LmdldEJ1bmRsZUlkKCkpOwotCQlhc3NlcnRFcXVhbHModGFnICsgIi4xIiwgb3JpZ2luYWwuZ2V0U3ltYm9saWNOYW1lKCksIGNvcHkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGFnICsgIi4yIiwgb3JpZ2luYWwuZ2V0VmVyc2lvbigpLCBjb3B5LmdldFZlcnNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjMiLCBvcmlnaW5hbC5nZXRMb2NhdGlvbigpLCBjb3B5LmdldExvY2F0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModGFnICsgIi40Iiwgb3JpZ2luYWwuaXNSZXNvbHZlZCgpLCBjb3B5LmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjUiLCBvcmlnaW5hbC5nZXRIb3N0KCksIGNvcHkuZ2V0SG9zdCgpKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gb3JpZ2luYWxFeHBvcnRQYWNrYWdlcyA9IG9yaWdpbmFsLmdldEV4cG9ydFBhY2thZ2VzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGNvcHlFeHBvcnRQYWNrYWdlcyA9IGNvcHkuZ2V0RXhwb3J0UGFja2FnZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuNiIsIG9yaWdpbmFsRXhwb3J0UGFja2FnZXMubGVuZ3RoLCBjb3B5RXhwb3J0UGFja2FnZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcmlnaW5hbEV4cG9ydFBhY2thZ2VzLmxlbmd0aDsgaSsrKQotCQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuNy4iICsgaSwgb3JpZ2luYWxFeHBvcnRQYWNrYWdlc1tpXSwgY29weUV4cG9ydFBhY2thZ2VzW2ldKTsKLQkJSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb25bXSBvcmlnaW5hbEltcG9ydFBhY2thZ2VzID0gb3JpZ2luYWwuZ2V0SW1wb3J0UGFja2FnZXMoKTsKLQkJSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb25bXSBjb3B5SW1wb3J0UGFja2FnZXMgPSBjb3B5LmdldEltcG9ydFBhY2thZ2VzKCk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjgiLCBvcmlnaW5hbEltcG9ydFBhY2thZ2VzLmxlbmd0aCwgY29weUltcG9ydFBhY2thZ2VzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2luYWxJbXBvcnRQYWNrYWdlcy5sZW5ndGg7IGkrKykKLQkJCWFzc2VydEVxdWFscyh0YWcgKyAiLjkuIiArIGksIG9yaWdpbmFsSW1wb3J0UGFja2FnZXNbaV0sIGNvcHlJbXBvcnRQYWNrYWdlc1tpXSk7Ci0JCUJ1bmRsZVNwZWNpZmljYXRpb25bXSBvcmlnaW5hbFJlcXVpcmVkQnVuZGxlcyA9IG9yaWdpbmFsLmdldFJlcXVpcmVkQnVuZGxlcygpOwotCQlCdW5kbGVTcGVjaWZpY2F0aW9uW10gY29weVJlcXVpcmVkQnVuZGxlcyA9IGNvcHkuZ2V0UmVxdWlyZWRCdW5kbGVzKCk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjEwIiwgb3JpZ2luYWxSZXF1aXJlZEJ1bmRsZXMubGVuZ3RoLCBjb3B5UmVxdWlyZWRCdW5kbGVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2luYWxSZXF1aXJlZEJ1bmRsZXMubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnRFcXVhbHModGFnICsgIi4xMS4iICsgaSwgb3JpZ2luYWxSZXF1aXJlZEJ1bmRsZXNbaV0sIGNvcHlSZXF1aXJlZEJ1bmRsZXNbaV0pOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBvcmlnaW5hbFJlc29sdmVkSW1wb3J0cyA9IG9yaWdpbmFsLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBjb3B5UmVzb2x2ZWRJbXBvcnRzID0gY29weS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuMTIiLCBvcmlnaW5hbFJlc29sdmVkSW1wb3J0cy5sZW5ndGgsIGNvcHlSZXNvbHZlZEltcG9ydHMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcmlnaW5hbFJlc29sdmVkSW1wb3J0cy5sZW5ndGg7IGkrKykKLQkJCWFzc2VydEVxdWFscyh0YWcgKyAiLjEzLiIgKyBpLCBvcmlnaW5hbFJlc29sdmVkSW1wb3J0c1tpXSwgY29weVJlc29sdmVkSW1wb3J0c1tpXSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gb3JpZ2luYWxSZXNvbHZlZFJlcXVpcmVzID0gb3JpZ2luYWwuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGNvcHlSZXNvbHZlZFJlcXVpcmVzID0gY29weS5nZXRSZXNvbHZlZFJlcXVpcmVzKCk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjE0Iiwgb3JpZ2luYWxSZXNvbHZlZFJlcXVpcmVzLmxlbmd0aCwgY29weVJlc29sdmVkUmVxdWlyZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcmlnaW5hbFJlc29sdmVkUmVxdWlyZXMubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnRFcXVhbHModGFnICsgIi4xNS4iICsgaSwgb3JpZ2luYWxSZXNvbHZlZFJlcXVpcmVzW2ldLCBjb3B5UmVzb2x2ZWRSZXF1aXJlc1tpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyB0YWcsIEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBvcmlnaW5hbCwgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGNvcHkpIHsKLQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuMCIsIG9yaWdpbmFsLmdldE5hbWUoKSwgY29weS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGFnICsgIi4xIiwgb3JpZ2luYWwuZ2V0VmVyc2lvbigpLCBjb3B5LmdldFZlcnNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjIiLCBvcmlnaW5hbC5nZXRBdHRyaWJ1dGVzKCksIGNvcHkuZ2V0QXR0cmlidXRlcygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuMyIsIG9yaWdpbmFsLmdldERpcmVjdGl2ZXMoKSwgb3JpZ2luYWwuZ2V0RGlyZWN0aXZlcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIHRhZywgU3RhdGUgb3JpZ2luYWwsIFN0YXRlIGNvcHkpIHsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBvcmlnaW5hbEJ1bmRsZXMgPSBvcmlnaW5hbC5nZXRCdW5kbGVzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gY29weUJ1bmRsZXMgPSBjb3B5LmdldEJ1bmRsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuMSIsIG9yaWdpbmFsQnVuZGxlcy5sZW5ndGgsIGNvcHlCdW5kbGVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2luYWxCdW5kbGVzLmxlbmd0aDsgaSsrKQotCQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuMi4iICsgaSwgb3JpZ2luYWxCdW5kbGVzW2ldLCBjb3B5QnVuZGxlc1tpXSk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjMiLCBvcmlnaW5hbC5pc1Jlc29sdmVkKCksIGNvcHkuaXNSZXNvbHZlZCgpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBvcmlnaW5hbFJlc29sdmVkQnVuZGxlcyA9IG9yaWdpbmFsLmdldFJlc29sdmVkQnVuZGxlcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGNvcHlSZXNvbHZlZEJ1bmRsZXMgPSBjb3B5LmdldFJlc29sdmVkQnVuZGxlcygpOwotCQlhc3NlcnRFcXVhbHModGFnICsgIi40Iiwgb3JpZ2luYWxSZXNvbHZlZEJ1bmRsZXMubGVuZ3RoLCBjb3B5UmVzb2x2ZWRCdW5kbGVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2luYWxSZXNvbHZlZEJ1bmRsZXMubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnRFcXVhbHModGFnICsgIi41LiIgKyBpLCBvcmlnaW5hbFJlc29sdmVkQnVuZGxlc1tpXSwgY29weVJlc29sdmVkQnVuZGxlc1tpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFzc2VydFZlcnNpb25Db25zdHJhaW50RXF1YWxzKFN0cmluZyB0YWcsIFZlcnNpb25Db25zdHJhaW50IG9yaWdpbmFsLCBWZXJzaW9uQ29uc3RyYWludCBjb3B5KSB7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjAiLCBvcmlnaW5hbCA9PSBudWxsLCBjb3B5ID09IG51bGwpOwotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuMSIsIG9yaWdpbmFsLmdldE5hbWUoKSwgY29weS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGFnICsgIi4yIiwgb3JpZ2luYWwuZ2V0VmVyc2lvblJhbmdlKCksIGNvcHkuZ2V0VmVyc2lvblJhbmdlKCkpOwotCQlhc3NlcnRFcXVhbHModGFnICsgIi40Iiwgb3JpZ2luYWwuZ2V0U3VwcGxpZXIoKSA9PSBudWxsLCBjb3B5LmdldFN1cHBsaWVyKCkgPT0gbnVsbCk7Ci0JCWlmIChvcmlnaW5hbC5nZXRTdXBwbGllcigpICE9IG51bGwpIHsKLQkJCU9iamVjdCBvID0gb3JpZ2luYWwuZ2V0U3VwcGxpZXIoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgQnVuZGxlRGVzY3JpcHRpb24pCi0JCQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuNSIsIChCdW5kbGVEZXNjcmlwdGlvbilvcmlnaW5hbC5nZXRTdXBwbGllcigpLCAoQnVuZGxlRGVzY3JpcHRpb24pY29weS5nZXRTdXBwbGllcigpKTsKLQkJCWVsc2UKLQkJCQlhc3NlcnRFcXVhbHModGFnICsgIi41IiwgKEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbilvcmlnaW5hbC5nZXRTdXBwbGllcigpLCAoRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uKWNvcHkuZ2V0U3VwcGxpZXIoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIHRhZywgQnVuZGxlU3BlY2lmaWNhdGlvbiBvcmlnaW5hbCwgQnVuZGxlU3BlY2lmaWNhdGlvbiBjb3B5KSB7Ci0JCWFzc2VydFZlcnNpb25Db25zdHJhaW50RXF1YWxzKHRhZyArICIuMCIsIG9yaWdpbmFsLCBjb3B5KTsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjEiLCBvcmlnaW5hbC5pc0V4cG9ydGVkKCksIGNvcHkuaXNFeHBvcnRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRhZyArICIuMiIsIG9yaWdpbmFsLmlzT3B0aW9uYWwoKSwgY29weS5pc09wdGlvbmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgdGFnLCBJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbiBvcmlnaW5hbCwgSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb24gY29weSkgewotCQlhc3NlcnRWZXJzaW9uQ29uc3RyYWludEVxdWFscyh0YWcgKyAiLjAiLCBvcmlnaW5hbCwgY29weSk7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhc3NlcnRFcXVhbHModGFnICsgIi4xIiwgb3JpZ2luYWwuZ2V0QXR0cmlidXRlcygpLCBjb3B5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjIiLCBvcmlnaW5hbC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSwgY29weS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjMiLCBvcmlnaW5hbC5nZXRCdW5kbGVWZXJzaW9uUmFuZ2UoKSwgY29weS5nZXRCdW5kbGVWZXJzaW9uUmFuZ2UoKSk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjUiLCBvcmlnaW5hbC5nZXREaXJlY3RpdmVzKCksIG9yaWdpbmFsLmdldERpcmVjdGl2ZXMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyB0YWcsIEhvc3RTcGVjaWZpY2F0aW9uIG9yaWdpbmFsLCBIb3N0U3BlY2lmaWNhdGlvbiBjb3B5KSB7Ci0JCWFzc2VydFZlcnNpb25Db25zdHJhaW50RXF1YWxzKHRhZyArICIuMCIsIG9yaWdpbmFsLCBjb3B5KTsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gb3JpZ2luYWxIb3N0cyA9IG9yaWdpbmFsLmdldEhvc3RzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gY29weUhvc3RzID0gY29weS5nZXRIb3N0cygpOwotCQlhc3NlcnRFcXVhbHModGFnICsgIi4xIiwgb3JpZ2luYWxIb3N0cyA9PSBudWxsLCBjb3B5SG9zdHMgPT0gbnVsbCk7Ci0JCWlmIChvcmlnaW5hbEhvc3RzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjIiLCBvcmlnaW5hbEhvc3RzLmxlbmd0aCwgY29weUhvc3RzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2luYWxIb3N0cy5sZW5ndGg7IGkrKykKLQkJCWFzc2VydEVxdWFscyh0YWcgKyAiLjMuIiArIGksIG9yaWdpbmFsSG9zdHNbaV0sIGNvcHlIb3N0c1tpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXNzZXJ0RnVsbHlSZXNvbHZlZChTdHJpbmcgdGFnLCBCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUpIHsKLQkJYXNzZXJ0VHJ1ZSh0YWcgKyAiYSIsIGJ1bmRsZS5pc1Jlc29sdmVkKCkpOwotCQlJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbltdIHBhY2thZ2VzID0gYnVuZGxlLmdldEltcG9ydFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnROb3ROdWxsKHRhZyArICJiXyIgKyBpLCBwYWNrYWdlc1tpXS5nZXRTdXBwbGllcigpKTsKLQkJSG9zdFNwZWNpZmljYXRpb24gaG9zdCA9IGJ1bmRsZS5nZXRIb3N0KCk7Ci0JCWlmIChob3N0ICE9IG51bGwpCi0JCQlhc3NlcnROb3ROdWxsKHRhZyArICJjIiwgaG9zdC5nZXRIb3N0cygpKTsKLQkJQnVuZGxlU3BlY2lmaWNhdGlvbltdIHJlcXVpcmVkQnVuZGxlcyA9IGJ1bmRsZS5nZXRSZXF1aXJlZEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEJ1bmRsZXMubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnROb3ROdWxsKHRhZyArICJkXyIgKyBpLCByZXF1aXJlZEJ1bmRsZXNbaV0uZ2V0U3VwcGxpZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXNzZXJ0RnVsbHlVbnJlc29sdmVkKFN0cmluZyB0YWcsIEJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSkgewotCQlhc3NlcnRGYWxzZSh0YWcgKyAiYSIsIGJ1bmRsZS5pc1Jlc29sdmVkKCkpOwotCQlJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbltdIHBhY2thZ2VzID0gYnVuZGxlLmdldEltcG9ydFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnROdWxsKHRhZyArICJiXyIgKyBpLCBwYWNrYWdlc1tpXS5nZXRTdXBwbGllcigpKTsKLQkJSG9zdFNwZWNpZmljYXRpb24gaG9zdCA9IGJ1bmRsZS5nZXRIb3N0KCk7Ci0JCWlmIChob3N0ICE9IG51bGwpCi0JCQlhc3NlcnROdWxsKHRhZyArICJjIiwgaG9zdC5nZXRIb3N0cygpKTsKLQkJQnVuZGxlU3BlY2lmaWNhdGlvbltdIHJlcXVpcmVkQnVuZGxlcyA9IGJ1bmRsZS5nZXRSZXF1aXJlZEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEJ1bmRsZXMubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnROdWxsKHRhZyArICJkXyIgKyBpLCByZXF1aXJlZEJ1bmRsZXNbaV0uZ2V0U3VwcGxpZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXNzZXJ0SWRlbnRpY2FsKFN0cmluZyB0YWcsIFN0YXRlIG9yaWdpbmFsLCBTdGF0ZSBjb3B5KSB7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjBhIiwgb3JpZ2luYWwuaXNSZXNvbHZlZCgpLCBjb3B5LmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0YWcgKyAiLjBiIiwgb3JpZ2luYWwuZ2V0VGltZVN0YW1wKCksIGNvcHkuZ2V0VGltZVN0YW1wKCkpOwotCQlhc3NlcnRFcXVhbHModGFnLCBvcmlnaW5hbCwgY29weSk7Ci0JfQotCi0JcHVibGljIFN0YXRlIGJ1aWxkQ29tcGxleFN0YXRlKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCS8qCi0JCSAqIG9yZy5lY2xpcHNlLmIxXzEuMCBleHBvcnRzIG9yZy5lY2xpcHNlLnAxXzEuMCBpbXBvcnRzIG9yZy5lY2xpcHNlLnAyCi0JCSAqLwotCQlmaW5hbCBTdHJpbmcgQjFfTE9DQVRJT04gPSAib3JnLmVjbGlwc2UuYjEiOwotCQlmaW5hbCBTdHJpbmcgQjFfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYjFcbiIgKyAiQnVuZGxlLVZlcnNpb246IDEuMFxuIiArICJFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucDE7c3BlY2lmaWNhdGlvbi12ZXJzaW9uPTEuMFxuIiArICJJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucDIiOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEIxX01BTklGRVNUKSwgQjFfTE9DQVRJT04sIDEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYjEpOwotCQkvKgotCQkgKiBvcmcuZWNsaXBzZS5iMl8yLjAgZXhwb3J0cyBvcmcuZWNsaXBzZS5wMiBpbXBvcnRzIG9yZy5lY2xpcHNlLnAxCi0JCSAqLwotCQlmaW5hbCBTdHJpbmcgQjJfTE9DQVRJT04gPSAib3JnLmVjbGlwc2UuYjIiOwotCQlmaW5hbCBTdHJpbmcgQjJfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYjJcbiIgKyAiQnVuZGxlLVZlcnNpb246IDIuMFxuIiArICJFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucDJcbiIgKyAiSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnAxIjsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChCMl9NQU5JRkVTVCksIEIyX0xPQ0FUSU9OLCAyKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIyKTsKLQkJLyoKLQkJICogb3JnLmVjbGlwc2UuYjNfMi4wIGV4cG9ydHMgb3JnLmVjbGlwc2UucDJfMi4wCi0JCSAqLwotCQlmaW5hbCBTdHJpbmcgQjNfTE9DQVRJT04gPSAib3JnLmVjbGlwc2UuYjMiOwotCQlmaW5hbCBTdHJpbmcgQjNfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYjNcbiIgKyAiQnVuZGxlLVZlcnNpb246IDIuMFxuIiArICJFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucDI7IHNwZWNpZmljYXRpb24tdmVyc2lvbj0yLjAiOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEIzX01BTklGRVNUKSwgQjNfTE9DQVRJT04sIDMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYjMpOwotCQkvKgotCQkgKiBvcmcuZWNsaXBzZS5iNF8xLjAgcmVxdWlyZXMgb3JnLmVjbGlwc2UuYjFfKgotCQkgKi8KLQkJZmluYWwgU3RyaW5nIEI0X0xPQ0FUSU9OID0gIm9yZy5lY2xpcHNlLmI0IjsKLQkJZmluYWwgU3RyaW5nIEI0X01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmI0XG4iICsgIkJ1bmRsZS1WZXJzaW9uOiAyLjBcbiIgKyAiUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmIxIjsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjQgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChCNF9NQU5JRkVTVCksIEI0X0xPQ0FUSU9OLCA0KTsKLQkJc3RhdGUuYWRkQnVuZGxlKGI0KTsKLQkJLyoKLQkJICogb3JnLmVjbGlwc2UuYjVfMS4wIGZyYWdtZW50IGZvciBvcmcuZWNsaXBzZS5iM18qCi0JCSAqLwotCQlmaW5hbCBTdHJpbmcgQjVfTE9DQVRJT04gPSAib3JnLmVjbGlwc2UuYjUiOwotCQlmaW5hbCBTdHJpbmcgQjVfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYjVcbiIgKyAiQnVuZGxlLVZlcnNpb246IDEuMFxuIiArICJGcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5iMyI7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGI1ID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQjVfTUFOSUZFU1QpLCBCNV9MT0NBVElPTiwgNSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiNSk7Ci0JCS8qCi0JCSAqIG9yZy5lY2xpcHNlLmI2XzEuMCByZXF1aXJlcyBvcmcuZWNsaXBzZS5iNAotCQkgKi8KLQkJZmluYWwgU3RyaW5nIEI2X0xPQ0FUSU9OID0gIm9yZy5lY2xpcHNlLmI2IjsKLQkJZmluYWwgU3RyaW5nIEI2X01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmI2XG4iICsgIkJ1bmRsZS1WZXJzaW9uOiAxLjBcbiIgKyAiUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmI0IjsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjYgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChCNl9NQU5JRkVTVCksIEI2X0xPQ0FUSU9OLCA2KTsKLQkJc3RhdGUuYWRkQnVuZGxlKGI2KTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCXB1YmxpYyBTdGF0ZSBidWlsZEVtcHR5U3RhdGUoKSB7Ci0JCVN0YXRlIHN0YXRlID0gcGxhdGZvcm1BZG1pbi5nZXRTdGF0ZSgpOwotCQlzdGF0ZS5zZXRSZXNvbHZlcihwbGF0Zm9ybUFkbWluLmdldFJlc29sdmVyKCkpOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHVibGljIFN0YXRlIGJ1aWxkSW5pdGlhbFN0YXRlKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCS8qCi0JCSAqIG9yZy5lY2xpcHNlLmIxXzEuMCBleHBvcnRzIG9yZy5lY2xpcHNlLnAxXzEuMAotCQkgKi8KLQkJZmluYWwgU3RyaW5nIFNZU1RFTV9CVU5ETEVfTE9DQVRJT04gPSAib3JnLmVjbGlwc2UuYjEiOwotCQlmaW5hbCBTdHJpbmcgU1lTVEVNX0JVTkRMRV9NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcub3NnaS5mcmFtZXdvcmtcbiIgKyAiQnVuZGxlLVZlcnNpb246IDMuMFxuIiArICJFeHBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrOyBzcGVjaWZpY2F0aW9uLXZlcnNpb249My4wIjsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChTWVNURU1fQlVORExFX01BTklGRVNUKSwgU1lTVEVNX0JVTkRMRV9MT0NBVElPTiwgMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiMCk7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgU3RhdGUgYnVpbGRTaW1wbGVTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQkvKgotCQkgKiBvcmcuZWNsaXBzZS5iMV8xLjAgZXhwb3J0cyBvcmcuZWNsaXBzZS5wMV8xLjAgaW1wb3J0cyBvcmcuZWNsaXBzZS5wMgotCQkgKi8KLQkJZmluYWwgU3RyaW5nIEIxX0xPQ0FUSU9OID0gIm9yZy5lY2xpcHNlLmIxIjsKLQkJZmluYWwgU3RyaW5nIEIxX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmIxXG4iICsgIkJ1bmRsZS1WZXJzaW9uOiAxLjBcbiIgKyAiRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnAxO3NwZWNpZmljYXRpb24tdmVyc2lvbj0xLjBcbiIgKyAiSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnAyIjsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChCMV9NQU5JRkVTVCksIEIxX0xPQ0FUSU9OLCAxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIxKTsKLQkJLyoKLQkJICogb3JnLmVjbGlwc2UuYjJfMi4wIGV4cG9ydHMgb3JnLmVjbGlwc2UucDIgaW1wb3J0cyBvcmcuZWNsaXBzZS5wMQotCQkgKi8KLQkJZmluYWwgU3RyaW5nIEIyX0xPQ0FUSU9OID0gIm9yZy5lY2xpcHNlLmIyIjsKLQkJZmluYWwgU3RyaW5nIEIyX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmIyXG4iICsgIkJ1bmRsZS1WZXJzaW9uOiAyLjBcbiIgKyAiRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnAyXG4iICsgIkltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wMSI7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQjJfTUFOSUZFU1QpLCBCMl9MT0NBVElPTiwgMik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiMik7Ci0JCS8qCi0JCSAqIG9yZy5lY2xpcHNlLmIzXzIuMCBpbXBvcnRzIG9yZy5lY2xpcHNlLnAxXzIuMAotCQkgKi8KLQkJZmluYWwgU3RyaW5nIEIzX0xPQ0FUSU9OID0gIm9yZy5lY2xpcHNlLmIzIjsKLQkJZmluYWwgU3RyaW5nIEIzX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmIzXG4iICsgIkJ1bmRsZS1WZXJzaW9uOiAyLjBcbiIgKyAiSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnAxOyBzcGVjaWZpY2F0aW9uLXZlcnNpb249Mi4wIjsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChCM19NQU5JRkVTVCksIEIzX0xPQ0FUSU9OLCAzKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIzKTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGljdGlvbmFyeSBwYXJzZU1hbmlmZXN0KFN0cmluZyBtYW5pZmVzdCkgewotCQlEaWN0aW9uYXJ5IGVudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1hbmlmZXN0LCAiOlxuIik7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcga2V5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJU3RyaW5nIHZhbHVlID0gdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSA/IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCkgOiAiIjsKLQkJCWVudHJpZXMucHV0KGtleSwgdmFsdWUpOwotCQl9Ci0JCXJldHVybiBlbnRyaWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTE4MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFsbFRlc3RzKCkgewotCQlzdXBlcihudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoU3Vic3RpdHV0YWJsZUV4cG9ydHNUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KERpc2FibGVkSW5mb1Rlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoUGxhdGZvcm1BZG1pblRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoU3RhdGVSZXNvbHZlclRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoU3RhdGVDeWNsZVRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoU3RhdGVDb21wYXJpc29uVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChWZXJzaW9uUmFuZ2VUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChSNFJlc29sdmVyVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChYRnJpZW5kc0ludGVybmFsUmVzb2x2ZXJUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEdlbmVyaWNDYXBhYmlsaXR5VGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChEZXZNb2RlVGVzdC5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9EZXZNb2RlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL0Rldk1vZGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmU5MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL0Rldk1vZGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIERldk1vZGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGV2TW9kZVRlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBEZXZNb2RlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0YXRlIGJ1aWxkRGV2TW9kZVN0YXRlKCkgewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlEaWN0aW9uYXJ5W10gcHJvcHMgPSBuZXcgRGljdGlvbmFyeVtdIHtuZXcgSGFzaHRhYmxlKCl9OwotCQlwcm9wc1swXS5wdXQoIm9zZ2kucmVzb2x2ZXJNb2RlIiwgImRldmVsb3BtZW50Iik7Ci0JCXN0YXRlLnNldFBsYXRmb3JtUHJvcGVydGllcyhwcm9wcyk7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGV2TW9kZURvbWlubzAyKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGREZXZNb2RlU3RhdGUoKTsKLQotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIngsIGQiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIlgsIEUiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkEiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkEiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJEIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImQiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJFIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImUiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGQpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZSk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJLy8gYnVuZGxlIGEgaGFzIGFuIHVuc2F0aXNmaWVkIGNvbnN0cmFpbnQKLQkJLy8gYiwgYywgZCwgZSBzaG91bGQgc3RpbGwgYmUgcmVzb2x2ZWQgdGhvdWdoCi0JCWFzc2VydEZhbHNlKCIwLjEiLCBhLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjAuMyIsIGIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMC40IiwgYy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIwLjUiLCBkLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjAuNSIsIGUuaXNSZXNvbHZlZCgpKTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFSZXF1aXJlZCA9IGEuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnRUcnVlKCIxLjEiLCBhUmVxdWlyZWQubGVuZ3RoID09IDEpOwotCQlhc3NlcnRUcnVlKCIxLjIiLCBhUmVxdWlyZWRbMF0gPT0gZSk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFJbXBvcnRlZCA9IGEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydFRydWUoIjEuMyIsIGFJbXBvcnRlZC5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIjEuNCIsIGFJbXBvcnRlZFswXS5nZXRFeHBvcnRlcigpID09IGQpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYlJlcXVpcmVkID0gYi5nZXRSZXNvbHZlZFJlcXVpcmVzKCk7Ci0JCWFzc2VydFRydWUoIjIuMSIsIGJSZXF1aXJlZC5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIjIuMiIsIGJSZXF1aXJlZFswXSA9PSBhKTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGNSZXF1aXJlZCA9IGMuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnRUcnVlKCIzLjEiLCBjUmVxdWlyZWQubGVuZ3RoID09IDEpOwotCQlhc3NlcnRUcnVlKCIzLjIiLCBjUmVxdWlyZWRbMF0gPT0gYSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERldk1vZGVEb21pbm8wMSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRGV2TW9kZVN0YXRlKCk7Ci0KLQkJaW50IGJ1bmRsZUlEID0gMDsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4Iik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJYIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJBIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQyIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJBIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJLy8gYnVuZGxlIGEgaGFzIGFuIHVuc2F0aXNmaWVkIGNvbnN0cmFpbnQKLQkJLy8gYiBhbmQgYyBzaG91bGQgc3RpbGwgYmUgcmVzb2x2ZWQgdG8gYnVuZGxlIGEgdGhvdWdoCi0JCWFzc2VydEZhbHNlKCIwLjEiLCBhLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjAuMyIsIGIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMC40IiwgYy5pc1Jlc29sdmVkKCkpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYlJlcXVpcmVkID0gYi5nZXRSZXNvbHZlZFJlcXVpcmVzKCk7Ci0JCWFzc2VydFRydWUoIjEuMSIsIGJSZXF1aXJlZC5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIjEuMiIsIGJSZXF1aXJlZFswXSA9PSBhKTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGNSZXF1aXJlZCA9IGMuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnRUcnVlKCIyLjEiLCBjUmVxdWlyZWQubGVuZ3RoID09IDEpOwotCQlhc3NlcnRUcnVlKCIyLjIiLCBjUmVxdWlyZWRbMF0gPT0gYSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERldk1vZGVGcmFnbWVudDAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGREZXZNb2RlU3RhdGUoKTsKLQotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImMiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBRnJhZyIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEuZnJhZyIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImEsIGEuZnJhZyIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkMiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYyIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRnJhZyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQkvLyBvbmx5IEEgc2hvdWxkIG5vdCBiZSByZXNvbHZlZCwgZG8gbm90IHdhbnQgdGhlIGRvbWlubyBlZmZlY3QuCi0JCWFzc2VydEZhbHNlKCIwLjEiLCBhLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjAuMiIsIGFGcmFnLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjAuMyIsIGIuaXNSZXNvbHZlZCgpKTsKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJJbXBvcnRzID0gYi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYUV4cG9ydHMubGVuZ3RoID09IDIpOwotCQlhc3NlcnRUcnVlKCIxLjIiLCBiSW1wb3J0cy5sZW5ndGggPT0gMik7Ci0JCWFzc2VydFRydWUoIjEuMyIsIGFFeHBvcnRzWzBdID09IGJJbXBvcnRzWzBdKTsKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwgYUV4cG9ydHNbMV0gPT0gYkltcG9ydHNbMV0pOwotCQlhc3NlcnRUcnVlKCIxLjUiLCBhRnJhZy5nZXRIb3N0KCkuZ2V0U3VwcGxpZXIoKSA9PSBhKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4xIiwgYS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIyLjIiLCBhRnJhZy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIyLjMiLCBiLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjIuNCIsIGMuaXNSZXNvbHZlZCgpKTsKLQotCQlhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWJJbXBvcnRzID0gYi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4xIiwgYUV4cG9ydHMubGVuZ3RoID09IDIpOwotCQlhc3NlcnRUcnVlKCIzLjIiLCBiSW1wb3J0cy5sZW5ndGggPT0gMik7Ci0JCWFzc2VydFRydWUoIjMuMyIsIGFFeHBvcnRzWzBdID09IGJJbXBvcnRzWzBdKTsKLQkJYXNzZXJ0VHJ1ZSgiMy40IiwgYUV4cG9ydHNbMV0gPT0gYkltcG9ydHNbMV0pOwkJCi0JCWFzc2VydFRydWUoIjMuNSIsIGFGcmFnLmdldEhvc3QoKS5nZXRTdXBwbGllcigpID09IGEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXZNb2RlU2luZ2xldG9uMDEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZERldk1vZGVTdGF0ZSgpOwotCi0JCWludCBidW5kbGVJRCA9IDA7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkE7IHNpbmdsZXRvbjo9dHJ1ZSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGExID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkE7IHNpbmdsZXRvbjo9dHJ1ZSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgdmVyc2lvbj0yLjAiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkE7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwyLjApXCIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJc3RhdGUuYWRkQnVuZGxlKGExKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEyKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJLy8gYm90aCB2ZXJzaW9ucyBvZiBBIHNob3VsZCBiZSByZXNvbHZlZAotCQlhc3NlcnRUcnVlKCIwLjEiLCBhMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIwLjIiLCBhMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIwLjMiLCBiLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjAuNCIsIGMuaXNSZXNvbHZlZCgpKTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGJSZXF1aXJlZCA9IGIuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnRUcnVlKCIxLjEiLCBiUmVxdWlyZWQubGVuZ3RoID09IDEpOwotCQlhc3NlcnRUcnVlKCIxLjIiLCBiUmVxdWlyZWRbMF0gPT0gYTIpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gY1JlcXVpcmVkID0gYy5nZXRSZXNvbHZlZFJlcXVpcmVzKCk7Ci0JCWFzc2VydFRydWUoIjIuMSIsIGNSZXF1aXJlZC5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIjIuMiIsIGNSZXF1aXJlZFswXSA9PSBhMSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERldk1vZGVTaW5nbGV0b24wMigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRGV2TW9kZVN0YXRlKCk7Ci0KLQkJaW50IGJ1bmRsZUlEID0gMDsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQTsgc2luZ2xldG9uOj10cnVlIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIngiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYTEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQTsgc2luZ2xldG9uOj10cnVlIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYTIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJBOyB2ZXJzaW9uPTIuMCIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkMiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLDIuMClcIiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYTEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYTIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQkvLyBvbmx5IGEyIGlzIHJlc29sdmVkIGJlY2F1c2UgYTEgaGFzIGFuIHVuc2F0aXNmaWVkIGNvbnN0cmFpbnQKLQkJLy8gYyBzaG91bGQgc3RpbGwgYmUgcmVzb2x2ZWQgdG8gYTEgdGhvdWdoCi0JCWFzc2VydEZhbHNlKCIwLjEiLCBhMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIwLjIiLCBhMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIwLjMiLCBiLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjAuNCIsIGMuaXNSZXNvbHZlZCgpKTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGJSZXF1aXJlZCA9IGIuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnRUcnVlKCIxLjEiLCBiUmVxdWlyZWQubGVuZ3RoID09IDEpOwotCQlhc3NlcnRUcnVlKCIxLjIiLCBiUmVxdWlyZWRbMF0gPT0gYTIpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gY1JlcXVpcmVkID0gYy5nZXRSZXNvbHZlZFJlcXVpcmVzKCk7Ci0JCWFzc2VydFRydWUoIjIuMSIsIGNSZXF1aXJlZC5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIjIuMiIsIGNSZXF1aXJlZFswXSA9PSBhMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL0Rpc2FibGVkSW5mb1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9EaXNhYmxlZEluZm9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDBiNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL0Rpc2FibGVkSW5mb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuT1NHaVRlc3RzQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBEaXNhYmxlZEluZm9UZXN0IGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIEIxX0xPQ0FUSU9OID0gImIxIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIEIyX0xPQ0FUSU9OID0gImIyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIEIzX0xPQ0FUSU9OID0gImIzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBPTElDWSA9ICJ0ZXN0LnBvbGljeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGlzYWJsZWRJbmZvVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIERpc2FibGVkSW5mb1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkSW5mbzAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRUZXN0U3RhdGUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjEgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIxX0xPQ0FUSU9OKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIyX0xPQ0FUSU9OKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjMgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIzX0xPQ0FUSU9OKTsKLQotCQlEaXNhYmxlZEluZm8gaW5mbzEgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIxKTsgLy8kTk9OLU5MUy0xJAotCQlEaXNhYmxlZEluZm8gaW5mbzIgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIyKTsgLy8kTk9OLU5MUy0xJAotCQlEaXNhYmxlZEluZm8gaW5mbzMgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZERpc2FibGVkSW5mbyhpbmZvMSk7Ci0JCXN0YXRlLmFkZERpc2FibGVkSW5mbyhpbmZvMik7Ci0JCXN0YXRlLmFkZERpc2FibGVkSW5mbyhpbmZvMyk7Ci0KLQkJU3RhdGUgY29weSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVTdGF0ZShzdGF0ZSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGNvcHlCMSA9IGNvcHkuZ2V0QnVuZGxlQnlMb2NhdGlvbihCMV9MT0NBVElPTik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGNvcHlCMiA9IGNvcHkuZ2V0QnVuZGxlQnlMb2NhdGlvbihCMl9MT0NBVElPTik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGNvcHlCMyA9IGNvcHkuZ2V0QnVuZGxlQnlMb2NhdGlvbihCM19MT0NBVElPTik7Ci0KLQkJRGlzYWJsZWRJbmZvIGNvcHlJbmZvMSA9IGNvcHkuZ2V0RGlzYWJsZWRJbmZvKGNvcHlCMSwgUE9MSUNZKTsKLQkJRGlzYWJsZWRJbmZvIGNvcHlJbmZvMiA9IGNvcHkuZ2V0RGlzYWJsZWRJbmZvKGNvcHlCMiwgUE9MSUNZKTsKLQkJRGlzYWJsZWRJbmZvIGNvcHlJbmZvMyA9IGNvcHkuZ2V0RGlzYWJsZWRJbmZvKGNvcHlCMywgUE9MSUNZKTsKLQotCQlhc3NlcnROb3ROdWxsKCJjb3B5SW5mbzEiLCBjb3B5SW5mbzEpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImNvcHlJbmZvMiIsIGNvcHlJbmZvMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY29weUluZm8zIiwgY29weUluZm8zKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydFRydWUoImNvcHlJbmZvMSBidW5kbGUiLCBjb3B5SW5mbzEuZ2V0QnVuZGxlKCkgPT0gY29weUIxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJjb3B5SW5mbzIgYnVuZGxlIiwgY29weUluZm8yLmdldEJ1bmRsZSgpID09IGNvcHlCMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiY29weUluZm8zIGJ1bmRsZSIsIGNvcHlJbmZvMy5nZXRCdW5kbGUoKSA9PSBjb3B5QjMpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkSW5mbzAyKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRUZXN0U3RhdGUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjEgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIxX0xPQ0FUSU9OKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIyX0xPQ0FUSU9OKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjMgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIzX0xPQ0FUSU9OKTsKLQotCQlEaXNhYmxlZEluZm8gaW5mbzEgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIxKTsgLy8kTk9OLU5MUy0xJAotCQlEaXNhYmxlZEluZm8gaW5mbzIgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIyKTsgLy8kTk9OLU5MUy0xJAotCQlEaXNhYmxlZEluZm8gaW5mbzMgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiYjEgcmVzb2x2ZWQiLCBiMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImIyIHJlc29sdmVkIiwgYjIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJiMyByZXNvbHZlZCIsIGIzLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGREaXNhYmxlZEluZm8oaW5mbzEpOwotCQlzdGF0ZS5hZGREaXNhYmxlZEluZm8oaW5mbzIpOwotCQlzdGF0ZS5hZGREaXNhYmxlZEluZm8oaW5mbzMpOwotCi0JCXN0YXRlLnJlc29sdmUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZSgiYjEgcmVzb2x2ZWQiLCBiMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCJiMiByZXNvbHZlZCIsIGIyLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoImIzIHJlc29sdmVkIiwgYjMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEluZm8wMygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkVGVzdFN0YXRlKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIxID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbihCMV9MT0NBVElPTik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIyID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbihCMl9MT0NBVElPTik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIzID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbihCM19MT0NBVElPTik7Ci0KLQkJRGlzYWJsZWRJbmZvIGluZm8xID0gbmV3IERpc2FibGVkSW5mbyhQT0xJQ1ksICJtZXNzYWdlIDEiLCBiMSk7IC8vJE5PTi1OTFMtMSQKLQkJRGlzYWJsZWRJbmZvIGluZm8yID0gbmV3IERpc2FibGVkSW5mbyhQT0xJQ1ksICJtZXNzYWdlIDEiLCBiMik7IC8vJE5PTi1OTFMtMSQKLQkJRGlzYWJsZWRJbmZvIGluZm8zID0gbmV3IERpc2FibGVkSW5mbyhQT0xJQ1ksICJtZXNzYWdlIDEiLCBiMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGREaXNhYmxlZEluZm8oaW5mbzEpOwotCQlzdGF0ZS5hZGREaXNhYmxlZEluZm8oaW5mbzIpOwotCQlzdGF0ZS5hZGREaXNhYmxlZEluZm8oaW5mbzMpOwotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCQlGaWxlIHN0YXRlRGlyID0gY29udGV4dC5nZXREYXRhRmlsZSgidGVzdERpc2FibGVkSW5mbzAzIik7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGVEaXIubWtkaXJzKCk7Ci0JCXRyeSB7Ci0JCQlzdGF0ZS5nZXRGYWN0b3J5KCkud3JpdGVTdGF0ZShzdGF0ZSwgc3RhdGVEaXIpOwotCQkJU3RhdGUgY29weSA9IHN0YXRlLmdldEZhY3RvcnkoKS5yZWFkU3RhdGUoc3RhdGVEaXIpOwotCQkJQnVuZGxlRGVzY3JpcHRpb24gY29weUIxID0gY29weS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIxX0xPQ0FUSU9OKTsKLQkJCUJ1bmRsZURlc2NyaXB0aW9uIGNvcHlCMiA9IGNvcHkuZ2V0QnVuZGxlQnlMb2NhdGlvbihCMl9MT0NBVElPTik7Ci0JCQlCdW5kbGVEZXNjcmlwdGlvbiBjb3B5QjMgPSBjb3B5LmdldEJ1bmRsZUJ5TG9jYXRpb24oQjNfTE9DQVRJT04pOwotCQkJRGlzYWJsZWRJbmZvIGNvcHlJbmZvMSA9IGNvcHkuZ2V0RGlzYWJsZWRJbmZvKGNvcHlCMSwgUE9MSUNZKTsKLQkJCURpc2FibGVkSW5mbyBjb3B5SW5mbzIgPSBjb3B5LmdldERpc2FibGVkSW5mbyhjb3B5QjIsIFBPTElDWSk7Ci0JCQlEaXNhYmxlZEluZm8gY29weUluZm8zID0gY29weS5nZXREaXNhYmxlZEluZm8oY29weUIzLCBQT0xJQ1kpOwotCi0JCQlhc3NlcnROb3ROdWxsKCJjb3B5SW5mbzEiLCBjb3B5SW5mbzEpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnROb3ROdWxsKCJjb3B5SW5mbzIiLCBjb3B5SW5mbzIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnROb3ROdWxsKCJjb3B5SW5mbzMiLCBjb3B5SW5mbzMpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFzc2VydFRydWUoImNvcHlJbmZvMSBidW5kbGUiLCBjb3B5SW5mbzEuZ2V0QnVuZGxlKCkgPT0gY29weUIxKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiY29weUluZm8yIGJ1bmRsZSIsIGNvcHlJbmZvMi5nZXRCdW5kbGUoKSA9PSBjb3B5QjIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJjb3B5SW5mbzMgYnVuZGxlIiwgY29weUluZm8zLmdldEJ1bmRsZSgpID09IGNvcHlCMyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkSW5mbzA0KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRUZXN0U3RhdGUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjEgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIxX0xPQ0FUSU9OKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIyX0xPQ0FUSU9OKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjMgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKEIzX0xPQ0FUSU9OKTsKLQotCQlEaXNhYmxlZEluZm8gaW5mbzEgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIxKTsgLy8kTk9OLU5MUy0xJAotCQlEaXNhYmxlZEluZm8gaW5mbzIgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIyKTsgLy8kTk9OLU5MUy0xJAotCQlEaXNhYmxlZEluZm8gaW5mbzMgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiYjEgcmVzb2x2ZWQiLCBiMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImIyIHJlc29sdmVkIiwgYjIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJiMyByZXNvbHZlZCIsIGIzLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGREaXNhYmxlZEluZm8oaW5mbzEpOwotCQlzdGF0ZS5hZGREaXNhYmxlZEluZm8oaW5mbzIpOwotCQlzdGF0ZS5hZGREaXNhYmxlZEluZm8oaW5mbzMpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gZGlzYWJsZWRCdW5kbGVzID0gc3RhdGUuZ2V0RGlzYWJsZWRCdW5kbGVzKCk7Ci0JCWFzc2VydE5vdE51bGwoImRpc2FibGVkQnVuZGxlcyIsIGRpc2FibGVkQnVuZGxlcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkaXNhYmxlZEJ1bmRsZXMgbGVuZ3RoIiwgMywgZGlzYWJsZWRCdW5kbGVzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiYjEgbm90IGZvdW5kIiwgZGlzYWJsZWRCdW5kbGVzWzBdID09IGIxIHx8IGRpc2FibGVkQnVuZGxlc1sxXSA9PSBiMSB8fCBkaXNhYmxlZEJ1bmRsZXNbMl0gPT0gYjEpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImIyIG5vdCBmb3VuZCIsIGRpc2FibGVkQnVuZGxlc1swXSA9PSBiMiB8fCBkaXNhYmxlZEJ1bmRsZXNbMV0gPT0gYjIgfHwgZGlzYWJsZWRCdW5kbGVzWzJdID09IGIyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJiMyBub3QgZm91bmQiLCBkaXNhYmxlZEJ1bmRsZXNbMF0gPT0gYjMgfHwgZGlzYWJsZWRCdW5kbGVzWzFdID09IGIzIHx8IGRpc2FibGVkQnVuZGxlc1syXSA9PSBiMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5yZW1vdmVEaXNhYmxlZEluZm8oaW5mbzEpOwotCQlkaXNhYmxlZEJ1bmRsZXMgPSBzdGF0ZS5nZXREaXNhYmxlZEJ1bmRsZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZGlzYWJsZWRCdW5kbGVzIiwgZGlzYWJsZWRCdW5kbGVzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImRpc2FibGVkQnVuZGxlcyBsZW5ndGgiLCAyLCBkaXNhYmxlZEJ1bmRsZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJiMiBub3QgZm91bmQiLCBkaXNhYmxlZEJ1bmRsZXNbMF0gPT0gYjIgfHwgZGlzYWJsZWRCdW5kbGVzWzFdID09IGIyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJiMyBub3QgZm91bmQiLCBkaXNhYmxlZEJ1bmRsZXNbMF0gPT0gYjMgfHwgZGlzYWJsZWRCdW5kbGVzWzFdID09IGIzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLnJlbW92ZURpc2FibGVkSW5mbyhpbmZvMik7Ci0JCWRpc2FibGVkQnVuZGxlcyA9IHN0YXRlLmdldERpc2FibGVkQnVuZGxlcygpOwotCQlhc3NlcnROb3ROdWxsKCJkaXNhYmxlZEJ1bmRsZXMiLCBkaXNhYmxlZEJ1bmRsZXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZGlzYWJsZWRCdW5kbGVzIGxlbmd0aCIsIDEsIGRpc2FibGVkQnVuZGxlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImIzIG5vdCBmb3VuZCIsIGRpc2FibGVkQnVuZGxlc1swXSA9PSBiMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5yZW1vdmVEaXNhYmxlZEluZm8oaW5mbzMpOwotCQlkaXNhYmxlZEJ1bmRsZXMgPSBzdGF0ZS5nZXREaXNhYmxlZEJ1bmRsZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZGlzYWJsZWRCdW5kbGVzIiwgZGlzYWJsZWRCdW5kbGVzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImRpc2FibGVkQnVuZGxlcyBsZW5ndGgiLCAwLCBkaXNhYmxlZEJ1bmRsZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyNTE0MjcoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZFRlc3RTdGF0ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMSA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oQjFfTE9DQVRJT04pOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMiA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oQjJfTE9DQVRJT04pOwotCi0JCURpc2FibGVkSW5mbyBpbmZvMTEgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIxKTsgLy8kTk9OLU5MUy0xJAotCQlEaXNhYmxlZEluZm8gaW5mbzEyID0gbmV3IERpc2FibGVkSW5mbyhQT0xJQ1ksICJtZXNzYWdlIDEiLCBiMSk7IC8vJE5PTi1OTFMtMSQKLQkJRGlzYWJsZWRJbmZvIGluZm8yMSA9IG5ldyBEaXNhYmxlZEluZm8oUE9MSUNZLCAibWVzc2FnZSAxIiwgYjIpOyAvLyROT04tTkxTLTEkCi0JCURpc2FibGVkSW5mbyBpbmZvMjIgPSBuZXcgRGlzYWJsZWRJbmZvKFBPTElDWSwgIm1lc3NhZ2UgMSIsIGIyKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygiaW5mb3Mgbm90IGVxdWFsIiwgaW5mbzExLCBpbmZvMTIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaW5mb3MgaGFzaENvZGUgbm90IGVxdWFsIiwgaW5mbzExLmhhc2hDb2RlKCksIGluZm8xMi5oYXNoQ29kZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImluZm9zIG5vdCBlcXVhbCIsIGluZm8yMSwgaW5mbzIyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImluZm9zIGhhc2hDb2RlIG5vdCBlcXVhbCIsIGluZm8yMS5oYXNoQ29kZSgpLCBpbmZvMjIuaGFzaENvZGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByaXZhdGUgU3RhdGUgYnVpbGRUZXN0U3RhdGUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJZmluYWwgU3RyaW5nIEIxX01BTklGRVNUID0gIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDFcbiIgKyAiQnVuZGxlLVN5bWJvbGljTmFtZTogYjFcbiIgKyAiQnVuZGxlLVZlcnNpb246IDEuMFxuIiArICJJbXBvcnQtUGFja2FnZTogYjIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBwYXJzZU1hbmlmZXN0KEIxX01BTklGRVNUKSwgQjFfTE9DQVRJT04sIDEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYjEpOwotCQlmaW5hbCBTdHJpbmcgQjJfTUFOSUZFU1QgPSAiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMVxuIiArICJCdW5kbGUtU3ltYm9saWNOYW1lOiBiMlxuIiArICJCdW5kbGUtVmVyc2lvbjogMS4wXG4iICsgIkV4cG9ydC1QYWNrYWdlOiBiMlxuIiArICJJbXBvcnQtUGFja2FnZTogYjMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIHBhcnNlTWFuaWZlc3QoQjJfTUFOSUZFU1QpLCBCMl9MT0NBVElPTiwgMik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiMik7Ci0JCWZpbmFsIFN0cmluZyBCM19NQU5JRkVTVCA9ICJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAxXG4iICsgIkJ1bmRsZS1TeW1ib2xpY05hbWU6IGIzXG4iICsgIkJ1bmRsZS1WZXJzaW9uOiAxLjBcbiIgKyAiRXhwb3J0LVBhY2thZ2U6IGIzOyB2ZXJzaW9uPTEuMCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIHBhcnNlTWFuaWZlc3QoQjNfTUFOSUZFU1QpLCBCM19MT0NBVElPTiwgMyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiMyk7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvR2VuZXJpY0NhcGFiaWxpdHlUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvR2VuZXJpY0NhcGFiaWxpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjg2YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL0dlbmVyaWNDYXBhYmlsaXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNDYXBhYmlsaXR5VGVzdCBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJJQ19SRVFVSVJFID0gIkVjbGlwc2UtR2VuZXJpY1JlcXVpcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSSUNfQ0FQQUJJTElUWSA9ICJFY2xpcHNlLUdlbmVyaWNDYXBhYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoR2VuZXJpY0NhcGFiaWxpdHlUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0NhcGFiaWxpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljc0Jhc2ljcygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImdlbmVyaWNDYXBhYmxpdHkiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCVN0cmluZ0J1ZmZlciBjYXBhYmlsaWx0eSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCJmb287IHZlcnNpb249XCIxLjMuMVwiOyBhdHRyMT1cInZhbHVlMVwiOyBhdHRyMj1cInZhbHVlMlwiLCIpOyAKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCJiYXI6YmFydHlwZTsgdmVyc2lvbj1cIjEuNC4xXCI7IGF0dHIxPVwidmFsdWUxXCI7IGF0dHIyPVwidmFsdWUyXCIsIik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgidGVzdC50eXBlczp0ZXN0dHlwZTsiKTsgCi0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFWZXJzaW9uOnZlcnNpb249XCIyLjAuMFwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhTG9uZzpsb25nPVwiMTAwMDAwMDAwMDBcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYURvdWJsZTpkb3VibGU9XCIxLjAwMDEwOVwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhVXJpOnVyaT1cImZpbGU6L3Rlc3RcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYVNldDpzZXQ9XCJhLGIsYyxkXCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFTdHJpbmc6c3RyaW5nPVwic29tZVN0cmluZ1wiIik7Ci0JCW1hbmlmZXN0LnB1dChHRU5FUklDX0NBUEFCSUxJVFksIGNhcGFiaWxpbHR5LnRvU3RyaW5nKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZW5DYXAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljUmVxdWlyZSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJU3RyaW5nQnVmZmVyIHJlcXVpcmVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlyZXF1aXJlZC5hcHBlbmQoImZvbzsgc2VsZWN0aW9uLWZpbHRlcj1cIih2ZXJzaW9uPj0xLjMuMClcIiwiKTsKLQkJcmVxdWlyZWQuYXBwZW5kKCJiYXI6YmFydHlwZTsgc2VsZWN0aW9uLWZpbHRlcj1cIihhdHRyMT12YWx1ZTEpXCIsIik7Ci0JCXJlcXVpcmVkLmFwcGVuZCgidGVzdC50eXBlczp0ZXN0dHlwZTsgc2VsZWN0aW9uLWZpbHRlcj1cIigmKGFWZXJzaW9uPj0yLjAuMCkoYUxvbmc+PTU1NTUpKGFEb3VibGU+PTEuMDApKGFVcmk9ZmlsZTovdGVzdCkoYVNldD1jKShhU3RyaW5nPXNvbWVTdHJpbmcpKVwiIik7Ci0JCW1hbmlmZXN0LnB1dChHRU5FUklDX1JFUVVJUkUsIHJlcXVpcmVkLnRvU3RyaW5nKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZW5SZXEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VuQ2FwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGdlblJlcSk7Ci0KLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCBnZW5DYXAuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgZ2VuUmVxLmlzUmVzb2x2ZWQoKSk7Ci0JCUdlbmVyaWNTcGVjaWZpY2F0aW9uW10gZ2VuU3BlY3MgPSBnZW5SZXEuZ2V0R2VuZXJpY1JlcXVpcmVzKCk7Ci0JCWFzc2VydFRydWUoIjIuMCIsIGdlblNwZWNzLmxlbmd0aCA9PSAzKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4xIiwgZ2VuU3BlY3NbMF0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEuMSIsIGdlblNwZWNzWzBdLmdldFN1cHBsaWVyKCksIGdlbkNhcC5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbMF0pOwotCQlhc3NlcnRUcnVlKCIyLjIiLCBnZW5TcGVjc1sxXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMi4xIiwgZ2VuU3BlY3NbMV0uZ2V0U3VwcGxpZXIoKSwgZ2VuQ2FwLmdldEdlbmVyaWNDYXBhYmlsaXRpZXMoKVsxXSk7Ci0JCWFzc2VydFRydWUoIjIuMyIsIGdlblNwZWNzWzJdLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscygiMi4zLjEiLCBnZW5TcGVjc1syXS5nZXRTdXBwbGllcigpLCBnZW5DYXAuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3NVcGRhdGUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljQ2FwYWJsaXR5Iik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQlTdHJpbmdCdWZmZXIgY2FwYWJpbGlsdHkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiZm9vOyB2ZXJzaW9uPVwiMS4zLjFcIjsgYXR0cjE9XCJ2YWx1ZTFcIjsgYXR0cjI9XCJ2YWx1ZTJcIiwiKTsgCi0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiYmFyOmJhcnR5cGU7IHZlcnNpb249XCIxLjQuMVwiOyBhdHRyMT1cInZhbHVlMVwiOyBhdHRyMj1cInZhbHVlMlwiLCIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoInRlc3QudHlwZXM6dGVzdHR5cGU7Iik7IAotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhVmVyc2lvbjp2ZXJzaW9uPVwiMi4wLjBcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYUxvbmc6bG9uZz1cIjEwMDAwMDAwMDAwXCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFEb3VibGU6ZG91YmxlPVwiMS4wMDAxMDlcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYVVyaTp1cmk9XCJmaWxlOi90ZXN0XCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFTZXQ6c2V0PVwiYSxiLGMsZFwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhU3RyaW5nOnN0cmluZz1cInNvbWVTdHJpbmdcIiIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19DQVBBQklMSVRZLCBjYXBhYmlsaWx0eS50b1N0cmluZygpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuQ2FwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZ2VuZXJpY1JlcXVpcmUiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCVN0cmluZ0J1ZmZlciByZXF1aXJlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcmVxdWlyZWQuYXBwZW5kKCJmb287IHNlbGVjdGlvbi1maWx0ZXI9XCIodmVyc2lvbj49MS4zLjApXCIsIik7Ci0JCXJlcXVpcmVkLmFwcGVuZCgiYmFyOmJhcnR5cGU7IHNlbGVjdGlvbi1maWx0ZXI9XCIoYXR0cjE9dmFsdWUxKVwiLCIpOwotCQlyZXF1aXJlZC5hcHBlbmQoInRlc3QudHlwZXM6dGVzdHR5cGU7IHNlbGVjdGlvbi1maWx0ZXI9XCIoJihhVmVyc2lvbj49Mi4wLjApKGFMb25nPj01NTU1KShhRG91YmxlPj0xLjAwKShhVXJpPWZpbGU6L3Rlc3QpKGFTZXQ9YykoYVN0cmluZz1zb21lU3RyaW5nKSlcIiIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19SRVFVSVJFLCByZXF1aXJlZC50b1N0cmluZygpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuUmVxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJc3RhdGUuYWRkQnVuZGxlKGdlbkNhcCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnZW5SZXEpOwotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgZ2VuQ2FwLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMSIsIGdlblJlcS5pc1Jlc29sdmVkKCkpOwotCQlHZW5lcmljU3BlY2lmaWNhdGlvbltdIGdlblNwZWNzID0gZ2VuUmVxLmdldEdlbmVyaWNSZXF1aXJlcygpOwotCQlhc3NlcnRUcnVlKCIyLjAiLCBnZW5TcGVjcy5sZW5ndGggPT0gMyk7Ci0JCWFzc2VydFRydWUoIjIuMSIsIGdlblNwZWNzWzBdLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscygiMi4xLjEiLCBnZW5TcGVjc1swXS5nZXRTdXBwbGllcigpLCBnZW5DYXAuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzBdKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4yIiwgZ2VuU3BlY3NbMV0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjIuMSIsIGdlblNwZWNzWzFdLmdldFN1cHBsaWVyKCksIGdlbkNhcC5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbMV0pOwotCQlhc3NlcnRUcnVlKCIyLjMiLCBnZW5TcGVjc1syXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMy4xIiwgZ2VuU3BlY3NbMl0uZ2V0U3VwcGxpZXIoKSwgZ2VuQ2FwLmdldEdlbmVyaWNDYXBhYmlsaXRpZXMoKVsyXSk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljQ2FwYWJsaXR5Iik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAuMCIpOwotCQljYXBhYmlsaWx0eSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCJmb287IHZlcnNpb249XCIxLjMuMlwiOyBhdHRyMT1cInZhbHVlMVwiOyBhdHRyMj1cInZhbHVlMlwiLCIpOyAKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCJiYXI6YmFydHlwZTsgdmVyc2lvbj1cIjEuNC4yXCI7IGF0dHIxPVwidmFsdWUxXCI7IGF0dHIyPVwidmFsdWUyXCIsIik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgidGVzdC50eXBlczp0ZXN0dHlwZTsiKTsgCi0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFWZXJzaW9uOnZlcnNpb249XCIyLjAuMVwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhTG9uZzpsb25nPVwiMTAwMDAwMDAwMDBcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYURvdWJsZTpkb3VibGU9XCIxLjAwMDEwOVwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhVXJpOnVyaT1cImZpbGU6L3Rlc3RcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYVNldDpzZXQ9XCJhLGIsYyxkXCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFTdHJpbmc6c3RyaW5nPVwic29tZVN0cmluZ1wiIik7Ci0JCW1hbmlmZXN0LnB1dChHRU5FUklDX0NBUEFCSUxJVFksIGNhcGFiaWxpbHR5LnRvU3RyaW5nKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZW5DYXAyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgZ2VuQ2FwLmdldEJ1bmRsZUlkKCkpOwotCQkKLQkJc3RhdGUudXBkYXRlQnVuZGxlKGdlbkNhcDIpOwotCQlzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtnZW5DYXAyfSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMy4wIiwgZ2VuQ2FwMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIzLjEiLCBnZW5SZXEuaXNSZXNvbHZlZCgpKTsKLQkJZ2VuU3BlY3MgPSBnZW5SZXEuZ2V0R2VuZXJpY1JlcXVpcmVzKCk7Ci0JCWFzc2VydFRydWUoIjQuMCIsIGdlblNwZWNzLmxlbmd0aCA9PSAzKTsKLQkJYXNzZXJ0VHJ1ZSgiNC4xIiwgZ2VuU3BlY3NbMF0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCI0LjEuMSIsIGdlblNwZWNzWzBdLmdldFN1cHBsaWVyKCksIGdlbkNhcDIuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzBdKTsKLQkJYXNzZXJ0VHJ1ZSgiNC4yIiwgZ2VuU3BlY3NbMV0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCI0LjIuMSIsIGdlblNwZWNzWzFdLmdldFN1cHBsaWVyKCksIGdlbkNhcDIuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzFdKTsKLQkJYXNzZXJ0VHJ1ZSgiNC4zIiwgZ2VuU3BlY3NbMl0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCI0LjMuMSIsIGdlblNwZWNzWzJdLmdldFN1cHBsaWVyKCksIGdlbkNhcDIuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzJdKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljc1JlZnJlc2goKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljQ2FwYWJsaXR5Iik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQlTdHJpbmdCdWZmZXIgY2FwYWJpbGlsdHkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiZm9vOyB2ZXJzaW9uPVwiMS4zLjFcIjsgYXR0cjE9XCJ2YWx1ZTFcIjsgYXR0cjI9XCJ2YWx1ZTJcIiwiKTsgCi0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiYmFyOmJhcnR5cGU7IHZlcnNpb249XCIxLjQuMVwiOyBhdHRyMT1cInZhbHVlMVwiOyBhdHRyMj1cInZhbHVlMlwiLCIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoInRlc3QudHlwZXM6dGVzdHR5cGU7Iik7IAotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhVmVyc2lvbjp2ZXJzaW9uPVwiMi4wLjBcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYUxvbmc6bG9uZz1cIjEwMDAwMDAwMDAwXCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFEb3VibGU6ZG91YmxlPVwiMS4wMDAxMDlcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYVVyaTp1cmk9XCJmaWxlOi90ZXN0XCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFTZXQ6c2V0PVwiYSxiLGMsZFwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhU3RyaW5nOnN0cmluZz1cInNvbWVTdHJpbmdcIiIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19DQVBBQklMSVRZLCBjYXBhYmlsaWx0eS50b1N0cmluZygpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuQ2FwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZ2VuZXJpY1JlcXVpcmUiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCVN0cmluZ0J1ZmZlciByZXF1aXJlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcmVxdWlyZWQuYXBwZW5kKCJmb287IHNlbGVjdGlvbi1maWx0ZXI9XCIodmVyc2lvbj49MS4zLjApXCIsIik7Ci0JCXJlcXVpcmVkLmFwcGVuZCgiYmFyOmJhcnR5cGU7IHNlbGVjdGlvbi1maWx0ZXI9XCIoYXR0cjE9dmFsdWUxKVwiLCIpOwotCQlyZXF1aXJlZC5hcHBlbmQoInRlc3QudHlwZXM6dGVzdHR5cGU7IHNlbGVjdGlvbi1maWx0ZXI9XCIoJihhVmVyc2lvbj49Mi4wLjApKGFMb25nPj01NTU1KShhRG91YmxlPj0xLjAwKShhVXJpPWZpbGU6L3Rlc3QpKGFTZXQ9YykoYVN0cmluZz1zb21lU3RyaW5nKSlcIiIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19SRVFVSVJFLCByZXF1aXJlZC50b1N0cmluZygpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuUmVxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJc3RhdGUuYWRkQnVuZGxlKGdlbkNhcCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnZW5SZXEpOwotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgZ2VuQ2FwLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMSIsIGdlblJlcS5pc1Jlc29sdmVkKCkpOwotCQlHZW5lcmljU3BlY2lmaWNhdGlvbltdIGdlblNwZWNzID0gZ2VuUmVxLmdldEdlbmVyaWNSZXF1aXJlcygpOwotCQlhc3NlcnRUcnVlKCIyLjAiLCBnZW5TcGVjcy5sZW5ndGggPT0gMyk7Ci0JCWFzc2VydFRydWUoIjIuMSIsIGdlblNwZWNzWzBdLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscygiMi4xLjEiLCBnZW5TcGVjc1swXS5nZXRTdXBwbGllcigpLCBnZW5DYXAuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzBdKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4yIiwgZ2VuU3BlY3NbMV0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjIuMSIsIGdlblNwZWNzWzFdLmdldFN1cHBsaWVyKCksIGdlbkNhcC5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbMV0pOwotCQlhc3NlcnRUcnVlKCIyLjMiLCBnZW5TcGVjc1syXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMy4xIiwgZ2VuU3BlY3NbMl0uZ2V0U3VwcGxpZXIoKSwgZ2VuQ2FwLmdldEdlbmVyaWNDYXBhYmlsaXRpZXMoKVsyXSk7Ci0KLQotCQlzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtnZW5DYXB9KTsKLQotCQlhc3NlcnRUcnVlKCIzLjAiLCBnZW5DYXAuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4xIiwgZ2VuUmVxLmlzUmVzb2x2ZWQoKSk7Ci0JCWdlblNwZWNzID0gZ2VuUmVxLmdldEdlbmVyaWNSZXF1aXJlcygpOwotCQlhc3NlcnRUcnVlKCI0LjAiLCBnZW5TcGVjcy5sZW5ndGggPT0gMyk7Ci0JCWFzc2VydFRydWUoIjQuMSIsIGdlblNwZWNzWzBdLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscygiNC4xLjEiLCBnZW5TcGVjc1swXS5nZXRTdXBwbGllcigpLCBnZW5DYXAuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzBdKTsKLQkJYXNzZXJ0VHJ1ZSgiNC4yIiwgZ2VuU3BlY3NbMV0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCI0LjIuMSIsIGdlblNwZWNzWzFdLmdldFN1cHBsaWVyKCksIGdlbkNhcC5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbMV0pOwotCQlhc3NlcnRUcnVlKCI0LjMiLCBnZW5TcGVjc1syXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjQuMy4xIiwgZ2VuU3BlY3NbMl0uZ2V0U3VwcGxpZXIoKSwgZ2VuQ2FwLmdldEdlbmVyaWNDYXBhYmlsaXRpZXMoKVsyXSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3NGcmFncygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZ2VuZXJpY0NhcGFibGl0eSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJU3RyaW5nQnVmZmVyIGNhcGFiaWxpbHR5ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoImZvbzsgdmVyc2lvbj1cIjEuMy4xXCI7IGF0dHIxPVwidmFsdWUxXCI7IGF0dHIyPVwidmFsdWUyXCIsIik7IAotCQljYXBhYmlsaWx0eS5hcHBlbmQoImJhcjpiYXJ0eXBlOyB2ZXJzaW9uPVwiMS40LjFcIjsgYXR0cjE9XCJ2YWx1ZTFcIjsgYXR0cjI9XCJ2YWx1ZTJcIiwiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCJ0ZXN0LnR5cGVzOnRlc3R0eXBlOyIpOyAKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYVZlcnNpb246dmVyc2lvbj1cIjIuMC4wXCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFMb25nOmxvbmc9XCIxMDAwMDAwMDAwMFwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhRG91YmxlOmRvdWJsZT1cIjEuMDAwMTA5XCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFVcmk6dXJpPVwiZmlsZTovdGVzdFwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhU2V0OnNldD1cImEsYixjLGRcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYVN0cmluZzpzdHJpbmc9XCJzb21lU3RyaW5nXCIiKTsKLQkJbWFuaWZlc3QucHV0KEdFTkVSSUNfQ0FQQUJJTElUWSwgY2FwYWJpbGlsdHkudG9TdHJpbmcoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlbkNhcCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZ2VuZXJpY0NhcGFiaWxpdHkuZnJhZzEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgImdlbmVyaWNDYXBhYmxpdHk7YnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCIiKTsKLQkJY2FwYWJpbGlsdHkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiZnJhZ21lbnRTdHVmZiIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19DQVBBQklMSVRZLCBjYXBhYmlsaWx0eS50b1N0cmluZygpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuQ2FwRnJhZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImdlbmVyaWNSZXF1aXJlIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQlTdHJpbmdCdWZmZXIgcmVxdWlyZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXJlcXVpcmVkLmFwcGVuZCgiZm9vOyBzZWxlY3Rpb24tZmlsdGVyPVwiKHZlcnNpb24+PTEuMy4wKVwiLCIpOwotCQlyZXF1aXJlZC5hcHBlbmQoImJhcjpiYXJ0eXBlOyBzZWxlY3Rpb24tZmlsdGVyPVwiKGF0dHIxPXZhbHVlMSlcIiwiKTsKLQkJcmVxdWlyZWQuYXBwZW5kKCJ0ZXN0LnR5cGVzOnRlc3R0eXBlOyBzZWxlY3Rpb24tZmlsdGVyPVwiKCYoYVZlcnNpb24+PTIuMC4wKShhTG9uZz49NTU1NSkoYURvdWJsZT49MS4wMCkoYVVyaT1maWxlOi90ZXN0KShhU2V0PWMpKGFTdHJpbmc9c29tZVN0cmluZykpXCIsIik7Ci0JCXJlcXVpcmVkLmFwcGVuZCgiZnJhZ21lbnRTdHVmZiIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19SRVFVSVJFLCByZXF1aXJlZC50b1N0cmluZygpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuUmVxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJc3RhdGUuYWRkQnVuZGxlKGdlbkNhcCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnZW5DYXBGcmFnKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGdlblJlcSk7Ci0KLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCBnZW5DYXAuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgZ2VuUmVxLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMiIsIGdlbkNhcEZyYWcuaXNSZXNvbHZlZCgpKTsKLQkJR2VuZXJpY1NwZWNpZmljYXRpb25bXSBnZW5TcGVjcyA9IGdlblJlcS5nZXRHZW5lcmljUmVxdWlyZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgZ2VuU3BlY3MubGVuZ3RoID09IDQpOwotCQlhc3NlcnRUcnVlKCIyLjEiLCBnZW5TcGVjc1swXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMS4xIiwgZ2VuU3BlY3NbMF0uZ2V0U3VwcGxpZXIoKSwgZ2VuQ2FwLmdldEdlbmVyaWNDYXBhYmlsaXRpZXMoKVswXSk7Ci0JCWFzc2VydFRydWUoIjIuMiIsIGdlblNwZWNzWzFdLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscygiMi4yLjEiLCBnZW5TcGVjc1sxXS5nZXRTdXBwbGllcigpLCBnZW5DYXAuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzFdKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgZ2VuU3BlY3NbMl0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjMuMSIsIGdlblNwZWNzWzJdLmdldFN1cHBsaWVyKCksIGdlbkNhcC5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbMl0pOwotCQlhc3NlcnRUcnVlKCIyLjQiLCBnZW5TcGVjc1szXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuNC4xIiwgZ2VuU3BlY3NbM10uZ2V0U3VwcGxpZXIoKSwgZ2VuQ2FwRnJhZy5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljc0ludHJhRnJhZ3MoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJbG9uZyBidW5kbGVJRCA9IDA7Ci0KLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIm9yZy5lY2xpcHNlLmVxdWlub3guZ2VuZXJpYy5mcmFnLmEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIm9yZy5lY2xpcHNlLmVxdWlub3guZ2VuZXJpYy5ob3N0O2J1bmRsZS12ZXJzaW9uPVwiMS4wLjBcIiIpOwotCQltYW5pZmVzdC5wdXQoIkVjbGlwc2UtR2VuZXJpY0NhcGFiaWxpdHkiLCAiZnJhZy5hIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlbkZyYWdBID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAib3JnLmVjbGlwc2UuZXF1aW5veC5nZW5lcmljLmhvc3QiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlbkhvc3QgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQkKLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAib3JnLmVjbGlwc2UuZXF1aW5veC5nZW5lcmljLmZyYWcuYiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAib3JnLmVjbGlwc2UuZXF1aW5veC5nZW5lcmljLmhvc3Q7YnVuZGxlLXZlcnNpb249XCIxLjAuMFwiIik7Ci0JCW1hbmlmZXN0LnB1dCgiRWNsaXBzZS1HZW5lcmljUmVxdWlyZSIsICJmcmFnLmEiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuRnJhZ0IgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VuSG9zdCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnZW5GcmFnQSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnZW5GcmFnQik7Ci0KLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCBnZW5Ib3N0LmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMSIsIGdlbkZyYWdBLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMiIsIGdlbkZyYWdCLmlzUmVzb2x2ZWQoKSk7Ci0JCUdlbmVyaWNTcGVjaWZpY2F0aW9uW10gZ2VuU3BlY3MgPSBnZW5GcmFnQi5nZXRHZW5lcmljUmVxdWlyZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgZ2VuU3BlY3MubGVuZ3RoID09IDEpOwotCQlhc3NlcnRUcnVlKCIyLjEiLCBnZW5TcGVjc1swXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMS4xIiwgZ2VuU3BlY3NbMF0uZ2V0U3VwcGxpZXIoKSwgZ2VuRnJhZ0EuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzBdKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3NBbGlhc2VzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCURpY3Rpb25hcnlbXSBhbGxQbGF0UHJvcHMgPSBzdGF0ZS5nZXRQbGF0Zm9ybVByb3BlcnRpZXMoKTsKLQkJRGljdGlvbmFyeSBwbGF0UHJvcHMgPSAoRGljdGlvbmFyeSkgKChIYXNodGFibGUpYWxsUGxhdFByb3BzWzBdKS5jbG9uZSgpOwotCQlwbGF0UHJvcHMucHV0KCJvc2dpLmdlbmVyaWNBbGlhc2VzIiwgIkV4cG9ydC1TZXJ2aWNlOkltcG9ydC1TZXJ2aWNlOnNlcnZpY2UsVEpXLUV4cG9ydDpUSlctSW1wb3J0OnRqdyIpOwotCQlzdGF0ZS5zZXRQbGF0Zm9ybVByb3BlcnRpZXMocGxhdFByb3BzKTsKLQotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImdlbmVyaWNDYXBhYmxpdHkiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1NFUlZJQ0UsICJvcmcub3NnaS5zZXJ2aWNlLmxvZy5Mb2dTZXJ2aWNlOyB2ZXJzaW9uPTEuMiIpOwotCQltYW5pZmVzdC5wdXQoIlRKVy1FeHBvcnQiLCAibXkuZ3JlYXQuc3R1ZmY7IGFMb25nOmxvbmc9NTE1MDsgYURvdWJsZTpkb3VibGU9My4xNDsgYVZlcnNpb246dmVyc2lvbj0xLjIuMCIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZW5DYXAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljUmVxdWlyZSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfU0VSVklDRSwgIm9yZy5vc2dpLnNlcnZpY2UubG9nLkxvZ1NlcnZpY2U7IHNlbGVjdGlvbi1maWx0ZXI9KHZlcnNpb24+PTEuMC4wKSIpOwotCQltYW5pZmVzdC5wdXQoIlRKVy1JbXBvcnQiLCAibXkuZ3JlYXQuc3R1ZmY7IHNlbGVjdGlvbi1maWx0ZXI9KCYoYUxvbmc8PTEwMDAwKShhTG9uZz49NTAwMCkpIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlblJlcSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShnZW5DYXApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VuUmVxKTsKLQotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIGdlbkNhcC5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjEiLCBnZW5SZXEuaXNSZXNvbHZlZCgpKTsKLQkJR2VuZXJpY1NwZWNpZmljYXRpb25bXSBnZW5TcGVjcyA9IGdlblJlcS5nZXRHZW5lcmljUmVxdWlyZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgZ2VuU3BlY3MubGVuZ3RoID09IDIpOwotCQlhc3NlcnRUcnVlKCIyLjEiLCBnZW5TcGVjc1swXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMS4xIiwgZ2VuU3BlY3NbMF0uZ2V0U3VwcGxpZXIoKSwgZ2VuQ2FwLmdldEdlbmVyaWNDYXBhYmlsaXRpZXMoKVswXSk7Ci0JCWFzc2VydFRydWUoIjIuMiIsIGdlblNwZWNzWzFdLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscygiMi4yLjEiLCBnZW5TcGVjc1sxXS5nZXRTdXBwbGllcigpLCBnZW5DYXAuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzFdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3NPcHRpb25hbE11bHRpcGxlKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbG9uZyBidW5kbGVJRCA9IDA7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZ2VuZXJpY0NhcGFibGl0eSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJU3RyaW5nQnVmZmVyIGNhcGFiaWxpbHR5ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoImZvbzsgdmVyc2lvbj1cIjEuMy4xXCI7IGF0dHIxPVwidmFsdWUxXCI7IGF0dHIyPVwidmFsdWUyXCIsIik7IAotCQljYXBhYmlsaWx0eS5hcHBlbmQoImJhcjpiYXJ0eXBlOyB2ZXJzaW9uPVwiMS40LjFcIjsgYXR0cjE9XCJ2YWx1ZTFcIjsgYXR0cjI9XCJ2YWx1ZTJcIiwiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCJ0ZXN0LnR5cGVzOnRlc3R0eXBlOyIpOyAKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYVZlcnNpb246dmVyc2lvbj1cIjIuMC4wXCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFMb25nOmxvbmc9XCIxMDAwMDAwMDAwMFwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhRG91YmxlOmRvdWJsZT1cIjEuMDAwMTA5XCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFVcmk6dXJpPVwiZmlsZTovdGVzdFwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhU2V0OnNldD1cImEsYixjLGRcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYVN0cmluZzpzdHJpbmc9XCJzb21lU3RyaW5nXCIsIik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgidGVzdC5yZWFsLm9wdGlvbmFsOnRoaXNpc29wdGlvbmFsLCIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoInRlc3QucmVhbC5tdWx0aXBsZTp0aGlzaXNtdWx0aXBsZTsgdmVyc2lvbj0xLjAsIik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgidGVzdC5yZWFsLm11bHRpcGxlOnRoaXNpc211bHRpcGxlOyB2ZXJzaW9uPTIuMCIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19DQVBBQklMSVRZLCBjYXBhYmlsaWx0eS50b1N0cmluZygpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuQ2FwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZ2VuZXJpY1JlcXVpcmUiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCVN0cmluZ0J1ZmZlciByZXF1aXJlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcmVxdWlyZWQuYXBwZW5kKCJmb287IHNlbGVjdGlvbi1maWx0ZXI9XCIodmVyc2lvbj49MS4zLjApXCIsIik7Ci0JCXJlcXVpcmVkLmFwcGVuZCgiYmFyOmJhcnR5cGU7IHNlbGVjdGlvbi1maWx0ZXI9XCIoYXR0cjE9dmFsdWUxKVwiLCIpOwotCQlyZXF1aXJlZC5hcHBlbmQoInRlc3QudHlwZXM6dGVzdHR5cGU7IHNlbGVjdGlvbi1maWx0ZXI9XCIoJihhVmVyc2lvbj49Mi4wLjApKGFMb25nPj01NTU1KShhRG91YmxlPj0xLjAwKShhVXJpPWZpbGU6L3Rlc3QpKGFTZXQ9YykoYVN0cmluZz1zb21lU3RyaW5nKSlcIiwiKTsKLQkJcmVxdWlyZWQuYXBwZW5kKCJ0ZXN0Lm9wdGlvbmFsOnRoaXNpc29wdGlvbmFsOyBvcHRpb25hbD10cnVlLCIpOwotCQlyZXF1aXJlZC5hcHBlbmQoInRlc3QucmVhbC5vcHRpb25hbDp0aGlzaXNvcHRpb25hbDsgb3B0aW9uYWw9dHJ1ZSwiKTsKLQkJcmVxdWlyZWQuYXBwZW5kKCJ0ZXN0LnJlYWwubXVsdGlwbGU6dGhpc2lzbXVsdGlwbGU7IG11bHRpcGxlPXRydWUiKTsKLQkJbWFuaWZlc3QucHV0KEdFTkVSSUNfUkVRVUlSRSwgcmVxdWlyZWQudG9TdHJpbmcoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlblJlcSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShnZW5DYXApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VuUmVxKTsKLQotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIGdlbkNhcC5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjEiLCBnZW5SZXEuaXNSZXNvbHZlZCgpKTsKLQkJR2VuZXJpY1NwZWNpZmljYXRpb25bXSBnZW5TcGVjcyA9IGdlblJlcS5nZXRHZW5lcmljUmVxdWlyZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgZ2VuU3BlY3MubGVuZ3RoID09IDYpOwotCQlhc3NlcnRUcnVlKCIyLjEiLCBnZW5TcGVjc1swXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMS4xIiwgZ2VuU3BlY3NbMF0uZ2V0U3VwcGxpZXIoKSwgZ2VuQ2FwLmdldEdlbmVyaWNDYXBhYmlsaXRpZXMoKVswXSk7Ci0JCWFzc2VydFRydWUoIjIuMiIsIGdlblNwZWNzWzFdLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscygiMi4yLjEiLCBnZW5TcGVjc1sxXS5nZXRTdXBwbGllcigpLCBnZW5DYXAuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzFdKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgZ2VuU3BlY3NbMl0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjMuMSIsIGdlblNwZWNzWzJdLmdldFN1cHBsaWVyKCksIGdlbkNhcC5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbMl0pOwotCQlhc3NlcnRGYWxzZSgiMi40IiwgZ2VuU3BlY3NbM10uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMi41IiwgZ2VuU3BlY3NbNF0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjUuMSIsIGdlblNwZWNzWzRdLmdldFN1cHBsaWVyKCksIGdlbkNhcC5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbM10pOwotCQlhc3NlcnRUcnVlKCIyLjYiLCBnZW5TcGVjc1s1XS5pc1Jlc29sdmVkKCkpOwotCQlHZW5lcmljRGVzY3JpcHRpb25bXSBzdXBwbGllcnMgPSBnZW5TcGVjc1s1XS5nZXRTdXBwbGllcnMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMi42LjEiLCBzdXBwbGllcnMgIT0gbnVsbCAmJiBzdXBwbGllcnMubGVuZ3RoID09IDIpOwotCQlhc3NlcnRFcXVhbHMoIjIuNi4yIiwgc3VwcGxpZXJzWzBdLCBnZW5DYXAuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzVdKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjYuMyIsIHN1cHBsaWVyc1sxXSwgZ2VuQ2FwLmdldEdlbmVyaWNDYXBhYmlsaXRpZXMoKVs0XSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzQ3ljbGVzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbG9uZyBidW5kbGVJRCA9IDA7Ci0KLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljQ2FwYWJsaXR5Iik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQlTdHJpbmdCdWZmZXIgY2FwYWJpbGlsdHkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiZm9vOyB2ZXJzaW9uPVwiMS4zLjFcIjsgYXR0cjE9XCJ2YWx1ZTFcIjsgYXR0cjI9XCJ2YWx1ZTJcIiwiKTsgCi0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiYmFyOmJhcnR5cGU7IHZlcnNpb249XCIxLjQuMVwiOyBhdHRyMT1cInZhbHVlMVwiOyBhdHRyMj1cInZhbHVlMlwiLCIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoInRlc3QudHlwZXM6dGVzdHR5cGU7Iik7IAotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhVmVyc2lvbjp2ZXJzaW9uPVwiMi4wLjBcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYUxvbmc6bG9uZz1cIjEwMDAwMDAwMDAwXCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFEb3VibGU6ZG91YmxlPVwiMS4wMDAxMDlcIjsiKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCIgYVVyaTp1cmk9XCJmaWxlOi90ZXN0XCI7Iik7Ci0JCWNhcGFiaWxpbHR5LmFwcGVuZCgiIGFTZXQ6c2V0PVwiYSxiLGMsZFwiOyIpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoIiBhU3RyaW5nOnN0cmluZz1cInNvbWVTdHJpbmdcIiIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19DQVBBQklMSVRZLCBjYXBhYmlsaWx0eS50b1N0cmluZygpKTsKLQkJU3RyaW5nQnVmZmVyIHJlcXVpcmVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlyZXF1aXJlZC5hcHBlbmQoImZvbzpjeWNsZTsgc2VsZWN0aW9uLWZpbHRlcj1cIih2ZXJzaW9uPj0xLjMuMClcIiIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19SRVFVSVJFLCByZXF1aXJlZC50b1N0cmluZygpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuQ2FwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljQ2FwYWJpbGl0eS5mcmFnMSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiZ2VuZXJpY0NhcGFibGl0eTtidW5kbGUtdmVyc2lvbj1cIlsxLjAuMCwyLjAuMClcIiIpOwotCQljYXBhYmlsaWx0eSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2FwYWJpbGlsdHkuYXBwZW5kKCJmcmFnbWVudFN0dWZmIik7Ci0JCW1hbmlmZXN0LnB1dChHRU5FUklDX0NBUEFCSUxJVFksIGNhcGFiaWxpbHR5LnRvU3RyaW5nKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZW5DYXBGcmFnID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZ2VuZXJpY1JlcXVpcmUiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCWNhcGFiaWxpbHR5ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljYXBhYmlsaWx0eS5hcHBlbmQoImZvbzpjeWNsZTsgdmVyc2lvbjp2ZXJzaW9uPVwiMi4wXCIiKTsKLQkJbWFuaWZlc3QucHV0KEdFTkVSSUNfQ0FQQUJJTElUWSwgY2FwYWJpbGlsdHkudG9TdHJpbmcoKSk7Ci0JCXJlcXVpcmVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlyZXF1aXJlZC5hcHBlbmQoImZvbzsgc2VsZWN0aW9uLWZpbHRlcj1cIih2ZXJzaW9uPj0xLjMuMClcIiwiKTsKLQkJcmVxdWlyZWQuYXBwZW5kKCJiYXI6YmFydHlwZTsgc2VsZWN0aW9uLWZpbHRlcj1cIihhdHRyMT12YWx1ZTEpXCIsIik7Ci0JCXJlcXVpcmVkLmFwcGVuZCgidGVzdC50eXBlczp0ZXN0dHlwZTsgc2VsZWN0aW9uLWZpbHRlcj1cIigmKGFWZXJzaW9uPj0yLjAuMCkoYUxvbmc+PTU1NTUpKGFEb3VibGU+PTEuMDApKGFVcmk9ZmlsZTovdGVzdCkoYVNldD1jKShhU3RyaW5nPXNvbWVTdHJpbmcpKVwiLCIpOwotCQlyZXF1aXJlZC5hcHBlbmQoImZyYWdtZW50U3R1ZmYiKTsKLQkJbWFuaWZlc3QucHV0KEdFTkVSSUNfUkVRVUlSRSwgcmVxdWlyZWQudG9TdHJpbmcoKSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlblJlcSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShnZW5DYXApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VuQ2FwRnJhZyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnZW5SZXEpOwotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgZ2VuQ2FwLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMSIsIGdlblJlcS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjIiLCBnZW5DYXBGcmFnLmlzUmVzb2x2ZWQoKSk7Ci0JCUdlbmVyaWNTcGVjaWZpY2F0aW9uW10gZ2VuU3BlY3MgPSBnZW5SZXEuZ2V0R2VuZXJpY1JlcXVpcmVzKCk7Ci0JCWFzc2VydFRydWUoIjIuMCIsIGdlblNwZWNzLmxlbmd0aCA9PSA0KTsKLQkJYXNzZXJ0VHJ1ZSgiMi4xIiwgZ2VuU3BlY3NbMF0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEuMSIsIGdlblNwZWNzWzBdLmdldFN1cHBsaWVyKCksIGdlbkNhcC5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbMF0pOwotCQlhc3NlcnRUcnVlKCIyLjIiLCBnZW5TcGVjc1sxXS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMi4xIiwgZ2VuU3BlY3NbMV0uZ2V0U3VwcGxpZXIoKSwgZ2VuQ2FwLmdldEdlbmVyaWNDYXBhYmlsaXRpZXMoKVsxXSk7Ci0JCWFzc2VydFRydWUoIjIuMyIsIGdlblNwZWNzWzJdLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEVxdWFscygiMi4zLjEiLCBnZW5TcGVjc1syXS5nZXRTdXBwbGllcigpLCBnZW5DYXAuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzJdKTsKLQkJYXNzZXJ0VHJ1ZSgiMi40IiwgZ2VuU3BlY3NbM10uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjQuMSIsIGdlblNwZWNzWzNdLmdldFN1cHBsaWVyKCksIGdlbkNhcEZyYWcuZ2V0R2VuZXJpY0NhcGFiaWxpdGllcygpWzBdKTsKLQkJZ2VuU3BlY3MgPSBnZW5DYXAuZ2V0R2VuZXJpY1JlcXVpcmVzKCk7Ci0JCWFzc2VydFRydWUoIjMuMCIsIGdlblNwZWNzLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4xIiwgZ2VuU3BlY3NbMF0uaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjEuMSIsIGdlblNwZWNzWzBdLmdldFN1cHBsaWVyKCksIGdlblJlcS5nZXRHZW5lcmljQ2FwYWJpbGl0aWVzKClbMF0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9OZXdSZXNvbHZlclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9OZXdSZXNvbHZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkZjQ2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvTmV3UmVzb2x2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBOZXdSZXNvbHZlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0KLQlwdWJsaWMgTmV3UmVzb2x2ZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCQlzdXBlcih0ZXN0TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoTmV3UmVzb2x2ZXJUZXN0LmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNrZWxldG9uKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljU2NlbmFyaW8xKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCQotCQlmaW5hbCBTdHJpbmcgTUFOX0EgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogQVxuIiArIAotCQkgICAgICAgICAgICAgICAgICAgICAiRXhwb3J0LVBhY2thZ2U6IHNlcnZsZXQ7IHNwZWNpZmljYXRpb24tdmVyc2lvbj0yLjEiOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiQSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KE1BTl9BKSwKLQkJCQkJCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5iYXNpYzFBIiwgMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiQSk7Ci0JCQotCQlmaW5hbCBTdHJpbmcgTUFOX0IgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogQlxuIiArIAotICAgICAgICAJCQkJCSAiSW1wb3J0LVBhY2thZ2U6IHNlcnZsZXQ7IHNwZWNpZmljYXRpb24tdmVyc2lvbj0yLjEiOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiQiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KE1BTl9CKSwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UuYmFzaWMxQiIsIDEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYkIpOwotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQkJCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIwID0gc3RhdGUuZ2V0QnVuZGxlKDApOwotCQlhc3NlcnROb3ROdWxsKCIwLjEiLCBiMCk7Ci0JCWFzc2VydEZ1bGx5UmVzb2x2ZWQoIjAuMiIsIGIwKTsKLQkJCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIxID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlhc3NlcnROb3ROdWxsKCIwLjMiLCBiMSk7Ci0JCWFzc2VydEZ1bGx5UmVzb2x2ZWQoIjAuNCIsIGIxKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1BsYXRmb3JtQWRtaW5UZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvUGxhdGZvcm1BZG1pblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyNjVkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvUGxhdGZvcm1BZG1pblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwuYmFzZWFkYXB0b3IuU3RhdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFBsYXRmb3JtQWRtaW5UZXN0IGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUklDX1JFUVVJUkUgPSAiRWNsaXBzZS1HZW5lcmljUmVxdWlyZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJJQ19DQVBBQklMSVRZID0gIkVjbGlwc2UtR2VuZXJpY0NhcGFiaWxpdHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFBsYXRmb3JtQWRtaW5UZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgUGxhdGZvcm1BZG1pblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZSBzdG9yZUFuZFJldHJpZXZlKFN0YXRlIHRvU3RvcmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl0b1N0b3JlLmdldEZhY3RvcnkoKS53cml0ZVN0YXRlKHRvU3RvcmUsIGJhb3MpOwotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0JCXJldHVybiB0b1N0b3JlLmdldEZhY3RvcnkoKS5yZWFkU3RhdGUoYmFpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhY2hlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBvcmlnaW5hbFN0YXRlID0gYnVpbGRTaW1wbGVTdGF0ZSgpOwotCQlTdGF0ZSByZXRyaWV2ZWRTdGF0ZSA9IHN0b3JlQW5kUmV0cmlldmUob3JpZ2luYWxTdGF0ZSk7Ci0JCWFzc2VydEVxdWFscygiMC45IiwgMCwgcmV0cmlldmVkU3RhdGUuZ2V0Q2hhbmdlcygpLmdldENoYW5nZXMoKS5sZW5ndGgpOwotCQlhc3NlcnRJZGVudGljYWwoIjEuMCIsIG9yaWdpbmFsU3RhdGUsIHJldHJpZXZlZFN0YXRlKTsKLQkJb3JpZ2luYWxTdGF0ZS5yZXNvbHZlKCk7Ci0JCXJldHJpZXZlZFN0YXRlID0gc3RvcmVBbmRSZXRyaWV2ZShvcmlnaW5hbFN0YXRlKTsKLQkJYXNzZXJ0SWRlbnRpY2FsKCIyLjAiLCBvcmlnaW5hbFN0YXRlLCByZXRyaWV2ZWRTdGF0ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIG9yaWdpbmFsID0gYnVpbGRTaW1wbGVTdGF0ZSgpOwotCQlTdGF0ZSBuZXdTdGF0ZSA9IG9yaWdpbmFsLmdldEZhY3RvcnkoKS5jcmVhdGVTdGF0ZShvcmlnaW5hbCk7Ci0JCWFzc2VydEVxdWFscygiMSIsIG9yaWdpbmFsLCBuZXdTdGF0ZSk7Ci0JCW9yaWdpbmFsID0gYnVpbGRDb21wbGV4U3RhdGUoKTsKLQkJbmV3U3RhdGUgPSBvcmlnaW5hbC5nZXRGYWN0b3J5KCkuY3JlYXRlU3RhdGUob3JpZ2luYWwpOwotCQlhc3NlcnRFcXVhbHMoIjIiLCBvcmlnaW5hbCwgbmV3U3RhdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyMDUyNzAoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZFNpbXBsZVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW50IGlkID0gMDsKLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERSwgImxpYndyYXBwZXItbGludXgteDg2LTMyLnNvOyB3cmFwcGVyLWxpbnV4LXg4Ni0zMjsgb3NuYW1lPWxpbnV4OyBwcm9jZXNzb3I9eDg2Iik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOwotCQl0cnkgewotCQkJQnVuZGxlRGVzY3JpcHRpb24gYVByaW1lID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKGEpOwotCQkJYXNzZXJ0RXF1YWxzKCJDb3B5IGlzIG5vdCBlcXVhbCIsIGEsIGFQcmltZSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGVycm9yIHdoaWxlIGNsb25pbmcgYSBCdW5kbGVEZXNjcmlwdGlvbiIsIHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzE4NDEyNygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlGaWxlIHJlc29sdmVyRGF0YSA9IGdldENvbnRleHQoKS5nZXREYXRhRmlsZSgicmVzb2x2ZXJEYXRhIik7Ci0JCXJlc29sdmVyRGF0YS5ta2RpcnMoKTsKLQotCQlGaWxlIHN0YXRlRmlsZSA9IG5ldyBGaWxlKHJlc29sdmVyRGF0YSwgIi5zdGF0ZSIpOwotCQlGaWxlIGxhenlGaWxlID0gbmV3IEZpbGUocmVzb2x2ZXJEYXRhLCAiLmxhenkiKTsKLQkJc3RhdGVGaWxlLmRlbGV0ZSgpOwotCQlsYXp5RmlsZS5kZWxldGUoKTsKLQkJU3RhdGVNYW5hZ2VyIHNtID0gbmV3IFN0YXRlTWFuYWdlcihzdGF0ZUZpbGUsIGxhenlGaWxlLCBnZXRDb250ZXh0KCkpOwotCQlTdGF0ZSBzeXN0ZW1TdGF0ZSA9IHNtLnJlYWRTeXN0ZW1TdGF0ZSgpOwotCQlhc3NlcnROdWxsKCJTeXN0ZW1TdGF0ZSBpcyBub3QgbnVsbCIsIHN5c3RlbVN0YXRlKTsKLQkJc3lzdGVtU3RhdGUgPSBzbS5jcmVhdGVTeXN0ZW1TdGF0ZSgpOwotCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW50IGlkID0gMDsKLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3lzdGVtU3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN5c3RlbVN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJiLCBjIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJhIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJhZnJhZzIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN5c3RlbVN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzeXN0ZW1TdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhZnJhZzIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhZnJhZzIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYyIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhZnJhZzIgPSBzeXN0ZW1TdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3lzdGVtU3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYWZyYWcxIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJhIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGFmcmFnMSA9IHN5c3RlbVN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzeXN0ZW1TdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7Ci0KLQkJc3lzdGVtU3RhdGUuYWRkQnVuZGxlKGFmcmFnMSk7Ci0JCXN5c3RlbVN0YXRlLmFkZEJ1bmRsZShhZnJhZzIpOwotCQlzeXN0ZW1TdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN5c3RlbVN0YXRlLmFkZEJ1bmRsZShiKTsKLQotCQlzeXN0ZW1TdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiYUZyYWcxIGlzIG5vdCByZXNvbHZlZCIsIGFmcmFnMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJhRnJhZzIgaXMgbm90IHJlc29sdmVkIiwgYWZyYWcyLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoImEgaXMgbm90IHJlc29sdmVkIiwgYS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCJiIGlzIG5vdCByZXNvbHZlZCIsIGIuaXNSZXNvbHZlZCgpKTsKLQotCQl0cnkgewotCQkJc20uc2h1dGRvd24oc3RhdGVGaWxlLCBsYXp5RmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoImZhaWxlZCB0byBzaHVkb3duIFN0YXRlTWFuYWdlciIsIGUpOwotCQl9Ci0KLQkJc20gPSBuZXcgU3RhdGVNYW5hZ2VyKHN0YXRlRmlsZSwgbGF6eUZpbGUsIGdldENvbnRleHQoKSk7Ci0JCXN5c3RlbVN0YXRlID0gc20ucmVhZFN5c3RlbVN0YXRlKCk7Ci0JCWFzc2VydE5vdE51bGwoIlN5c3RlbVN0YXRlIGlzIG51bGwiLCBzeXN0ZW1TdGF0ZSk7Ci0JCWIgPSBzeXN0ZW1TdGF0ZS5nZXRCdW5kbGUoImIiLCBudWxsKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlleHBvcnRzID0gYi5nZXRFeHBvcnRQYWNrYWdlcygpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gZ2V0dGluZyBleHBvcnRzIiwgZSk7Ci0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiZXhwb3J0cyBpcyBudWxsIiwgZXhwb3J0cyk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGV4cG9ydHMiLCAyLCBleHBvcnRzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI0MTEyOF8wMSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWludCBpZCA9IDA7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJiIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiYTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsIDIuMC4wKVwiIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShhMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUucmVzb2x2ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKCJCdW5kbGUgYTEgaXMgbm90IHJlc29sdmVkIiwgYTEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiQnVuZGxlIGIgaXMgbm90IHJlc29sdmVkIiwgYi5pc1Jlc29sdmVkKCkpOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wLjAiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYTIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGExLmdldEJ1bmRsZUlkKCkpOwotCQlzdGF0ZS51cGRhdGVCdW5kbGUoYTIpOwotCi0JCXN0YXRlLnJlc29sdmUodHJ1ZSk7Ci0JCWFzc2VydFRydWUoIkJ1bmRsZSBhMiBpcyBub3QgcmVzb2x2ZWQiLCBhMi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRGYWxzZSgiQnVuZGxlIGIgaXMgcmVzb2x2ZWQiLCBiLmlzUmVzb2x2ZWQoKSk7Ci0KLQkJVmVyc2lvbkNvbnN0cmFpbnRbXSB1bnNhdGlzaWZpZWQgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFVuc2F0aXNmaWVkTGVhdmVzKHN0YXRlLmdldEJ1bmRsZXMoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHVuc2F0aXNpZmllZCBsZWF2ZXMiLCAxLCB1bnNhdGlzaWZpZWQubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB1bnNhdGlzZmllZCBjb25zdHJhaW50IiwgYi5nZXRSZXF1aXJlZEJ1bmRsZXMoKVswXSwgdW5zYXRpc2lmaWVkWzBdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjQxMTI4XzAyKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW50IGlkID0gMDsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGExID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgImE7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMC4wLCAyLjAuMClcIiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYTEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLnJlc29sdmUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiQnVuZGxlIGExIGlzIG5vdCByZXNvbHZlZCIsIGExLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIkJ1bmRsZSBiIGlzIG5vdCByZXNvbHZlZCIsIGIuaXNSZXNvbHZlZCgpKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjIuMC4wIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBhMS5nZXRCdW5kbGVJZCgpKTsKLQkJc3RhdGUudXBkYXRlQnVuZGxlKGEyKTsKLQotCQlzdGF0ZS5yZXNvbHZlKHRydWUpOwotCQlhc3NlcnRUcnVlKCJCdW5kbGUgYTIgaXMgbm90IHJlc29sdmVkIiwgYTIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RmFsc2UoIkJ1bmRsZSBiIGlzIHJlc29sdmVkIiwgYi5pc1Jlc29sdmVkKCkpOwotCi0JCVZlcnNpb25Db25zdHJhaW50W10gdW5zYXRpc2lmaWVkID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRVbnNhdGlzZmllZExlYXZlcyhzdGF0ZS5nZXRCdW5kbGVzKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB1bnNhdGlzaWZpZWQgbGVhdmVzIiwgMSwgdW5zYXRpc2lmaWVkLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgdW5zYXRpc2ZpZWQgY29uc3RyYWludCIsIGIuZ2V0SG9zdCgpLCB1bnNhdGlzaWZpZWRbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyNDExMjhfMDMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbnQgaWQgPSAwOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImE7IHZlcnNpb249MS4wIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGExID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJhOyB2ZXJzaW9uPVwiWzEuMC4wLCAyLjAuMClcIiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYTEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLnJlc29sdmUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiQnVuZGxlIGExIGlzIG5vdCByZXNvbHZlZCIsIGExLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIkJ1bmRsZSBiIGlzIG5vdCByZXNvbHZlZCIsIGIuaXNSZXNvbHZlZCgpKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjIuMC4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhOyB2ZXJzaW9uPTIuMCIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYTEuZ2V0QnVuZGxlSWQoKSk7Ci0JCXN0YXRlLnVwZGF0ZUJ1bmRsZShhMik7Ci0KLQkJc3RhdGUucmVzb2x2ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiQnVuZGxlIGEyIGlzIG5vdCByZXNvbHZlZCIsIGEyLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKCJCdW5kbGUgYiBpcyByZXNvbHZlZCIsIGIuaXNSZXNvbHZlZCgpKTsKLQotCQlWZXJzaW9uQ29uc3RyYWludFtdIHVuc2F0aXNpZmllZCA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VW5zYXRpc2ZpZWRMZWF2ZXMoc3RhdGUuZ2V0QnVuZGxlcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5zYXRpc2lmaWVkIGxlYXZlcyIsIDEsIHVuc2F0aXNpZmllZC5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHVuc2F0aXNmaWVkIGNvbnN0cmFpbnQiLCBiLmdldEltcG9ydFBhY2thZ2VzKClbMF0sIHVuc2F0aXNpZmllZFswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI0MTEyOF8wNCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlEaWN0aW9uYXJ5W10gcHJvcHMgPSBuZXcgRGljdGlvbmFyeVtdIHtuZXcgSGFzaHRhYmxlKCl9OwotCQlwcm9wc1swXS5wdXQoIm9zZ2kub3MiLCAid2luMzIiKTsKLQkJcHJvcHNbMF0ucHV0KCJvc2dpLmFyY2giLCAieDg2Iik7Ci0JCXN0YXRlLnNldFBsYXRmb3JtUHJvcGVydGllcyhwcm9wcyk7Ci0KLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbnQgaWQgPSAwOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERSwgIkJ1bmRsZS1OYXRpdmVDb2RlOiBuYXRpdmVmaWxlMS50eHQ7cHJvY2Vzc29yPXg4Njtvc25hbWU9d2luMzIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYTEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShhMSk7Ci0JCXN0YXRlLnJlc29sdmUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiQnVuZGxlIGExIGlzIG5vdCByZXNvbHZlZCIsIGExLmlzUmVzb2x2ZWQoKSk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFLCAiQnVuZGxlLU5hdGl2ZUNvZGU6IG5hdGl2ZWZpbGUxLnR4dDtwcm9jZXNzb3I9bGludXg7b3NuYW1lPWd0ayIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYTEuZ2V0QnVuZGxlSWQoKSk7Ci0JCXN0YXRlLnVwZGF0ZUJ1bmRsZShhMik7Ci0KLQkJc3RhdGUucmVzb2x2ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UoIkJ1bmRsZSBhMiBpcyByZXNvbHZlZCIsIGEyLmlzUmVzb2x2ZWQoKSk7Ci0KLQkJVmVyc2lvbkNvbnN0cmFpbnRbXSB1bnNhdGlzaWZpZWQgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFVuc2F0aXNmaWVkQ29uc3RyYWludHMoYTIpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB1bnNhdGlzaWZpZWQgbGVhdmVzIiwgMSwgdW5zYXRpc2lmaWVkLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgdW5zYXRpc2ZpZWQgY29uc3RyYWludCIsIGEyLmdldE5hdGl2ZUNvZGVTcGVjaWZpY2F0aW9uKCksIHVuc2F0aXNpZmllZFswXSk7Ci0KLQkJdW5zYXRpc2lmaWVkID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRVbnNhdGlzZmllZExlYXZlcyhzdGF0ZS5nZXRCdW5kbGVzKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB1bnNhdGlzaWZpZWQgbGVhdmVzIiwgMSwgdW5zYXRpc2lmaWVkLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgdW5zYXRpc2ZpZWQgY29uc3RyYWludCIsIGEyLmdldE5hdGl2ZUNvZGVTcGVjaWZpY2F0aW9uKCksIHVuc2F0aXNpZmllZFswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzQmFzaWNzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbG9uZyBidW5kbGVJRCA9IDA7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljQ2FwYWJsaXR5Iik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19DQVBBQklMSVRZLCAiZm9vOyB2ZXJzaW9uPVwiMS4zLjFcIjsgYXR0cjE9XCJ2YWx1ZTFcIjsgYXR0cjI9XCJ2YWx1ZTJcIiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZW5DYXAxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljUmVxdWlyZSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsKLQkJbWFuaWZlc3QucHV0KEdFTkVSSUNfUkVRVUlSRSwgImZvbzsgc2VsZWN0aW9uLWZpbHRlcj1cIih2ZXJzaW9uPj0xLjMuMClcIiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZW5SZXEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VuQ2FwMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnZW5SZXEpOwotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRUcnVlKCJCdW5kbGUgZ2VuQ2FwMSBpcyBub3QgcmVzb2x2ZWQiLCBnZW5DYXAxLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIkJ1bmRsZSBnZW5SZXEgaXMgbm90IHJlc29sdmVkIiwgZ2VuUmVxLmlzUmVzb2x2ZWQoKSk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZW5lcmljQ2FwYWJsaXR5Iik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoR0VORVJJQ19DQVBBQklMSVRZLCAiZm9vOyB2ZXJzaW9uPVwiMS4wXCI7IGF0dHIxPVwidmFsdWUxXCI7IGF0dHIyPVwidmFsdWUyXCIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VuQ2FwMiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGdlbkNhcDEuZ2V0QnVuZGxlSWQoKSk7Ci0KLQkJc3RhdGUudXBkYXRlQnVuZGxlKGdlbkNhcDIpOwotCi0JCXN0YXRlLnJlc29sdmUodHJ1ZSk7Ci0JCWFzc2VydFRydWUoIkJ1bmRsZSBnZW5DYXAyIGlzIG5vdCByZXNvbHZlZCIsIGdlbkNhcDIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0RmFsc2UoIkJ1bmRsZSBnZW5SZXEgaXMgcmVzb2x2ZWQiLCBnZW5SZXEuaXNSZXNvbHZlZCgpKTsKLQotCQlWZXJzaW9uQ29uc3RyYWludFtdIHVuc2F0aXNpZmllZCA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VW5zYXRpc2ZpZWRMZWF2ZXMoc3RhdGUuZ2V0QnVuZGxlcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5zYXRpc2lmaWVkIGxlYXZlcyIsIDEsIHVuc2F0aXNpZmllZC5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHVuc2F0aXNmaWVkIGNvbnN0cmFpbnQiLCBnZW5SZXEuZ2V0R2VuZXJpY1JlcXVpcmVzKClbMF0sIHVuc2F0aXNpZmllZFswXSk7Ci0JfQotfQotLy9UT0RPIHRlc3RzIHRvIGVuYWJsZQotLy90ZXN0RnJhZ21lbnRVcGRhdGVOb1ZlcnNpb25DaGFuZ2VkKCkKLS8vdGVzdEZyYWdtZW50VXBkYXRlVmVyc2lvbkNoYW5nZWQoKQotLy90ZXN0SG9zdFVwZGF0ZU5vVmVyc2lvbkNoYW5nZWQoKQotLy90ZXN0SG9zdFVwZGF0ZVZlcnNpb25DaGFuZ2VkKCkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9SNFJlc29sdmVyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1I0UmVzb2x2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZDVhM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1I0UmVzb2x2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnJlc29sdmVyLio7Ci0KLXB1YmxpYyBjbGFzcyBSNFJlc29sdmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSNFJlc29sdmVyVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShSNFJlc29sdmVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEF0dHJpYnV0ZXNfMDAxLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0QlNOXzAwMS5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEN5Y2xlXzAwMS5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEN5Y2xlXzAwMi5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEN5Y2xlXzAwMy5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEN5Y2xlXzAwNC5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEN5Y2xlXzAwNS5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEN5Y2xlXzAwNi5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdER5bmFtaWNfMDAxLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RHluYW1pY18wMDIuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3REeW5hbWljXzAwMy5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdER5bmFtaWNfMDA0LmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RHluYW1pY18wMDUuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3REeW5hbWljXzAwNi5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEdlbmVyYXRlZF8wMDEuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RHcm91cGluZ18wMDEuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RHcm91cGluZ18wMDIuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RHcm91cGluZ18wMDMuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RHcm91cGluZ18wMDYuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RHcm91cGluZ18wMDguY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RPcHRpb25hbF8wMDEuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RPcHRpb25hbF8wMDIuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RQcm9wYWdhdGlvbl8wMDEuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RQcm9wYWdhdGlvbl8wMDMuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSRkM3OV8wMDEuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSRkM3OV8wMDIuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSRkM3OV8wMDMuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSRkM3OV8wMDQuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSRkM3OV8wMDUuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSRkM3OV8wMDYuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSRkM3OV8wMDcuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RWZXJzaW9uXzAwMS5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFZlcnNpb25fMDAyLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0VmVyc2lvbl8wMDMuY2xhc3MpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1NpbXBsZVBsYXRmb3JtQWRtaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9TaW1wbGVQbGF0Zm9ybUFkbWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjZhZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1NpbXBsZVBsYXRmb3JtQWRtaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLmJhc2VhZGFwdG9yLlN0YXRlTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVBsYXRmb3JtQWRtaW4gZXh0ZW5kcyBTdGF0ZU1hbmFnZXIgewotCXB1YmxpYyBTaW1wbGVQbGF0Zm9ybUFkbWluKEZpbGUgYnVuZGxlUm9vdERpciwgQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKG5ldyBGaWxlKGJ1bmRsZVJvb3REaXIsICIuc3RhdGUiKSwgbmV3IEZpbGUoYnVuZGxlUm9vdERpciwgIi5sYXp5IiksIGNvbnRleHQpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQljcmVhdGVTeXN0ZW1TdGF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9TdGF0ZUNvbXBhcmlzb25UZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvU3RhdGVDb21wYXJpc29uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM0OGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9TdGF0ZUNvbXBhcmlzb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBTdGF0ZUNvbXBhcmlzb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCi0JcHVibGljIFN0YXRlQ29tcGFyaXNvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkaXRpb24oKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUxID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0YXRlIHN0YXRlMiA9IHN0YXRlMS5nZXRGYWN0b3J5KCkuY3JlYXRlU3RhdGUoc3RhdGUxKTsKLQkJU3RhdGVEZWx0YSBkZWx0YSA9IHN0YXRlMS5jb21wYXJlKHN0YXRlMik7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMCwgZGVsdGEuZ2V0Q2hhbmdlcygpLmxlbmd0aCk7Ci0JCWRlbHRhID0gc3RhdGUyLmNvbXBhcmUoc3RhdGUxKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCAwLCBkZWx0YS5nZXRDaGFuZ2VzKCkubGVuZ3RoKTsKLQkJU3RyaW5nIEFfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYVxuQnVuZGxlLVZlcnNpb246IDEuMFxuIjsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlQSA9IHN0YXRlMi5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChBX01BTklGRVNUKSwgIm9yZy5lY2xpcHNlLmEiLCAtMSk7Ci0JCWFzc2VydFRydWUoIjIuMCIsIHN0YXRlMi5hZGRCdW5kbGUoYnVuZGxlQSkpOwotCQlkZWx0YSA9IHN0YXRlMS5jb21wYXJlKHN0YXRlMik7Ci0JCWFzc2VydEVxdWFscygiMi4xIiwgMSwgZGVsdGEuZ2V0Q2hhbmdlcygpLmxlbmd0aCk7Ci0JCUJ1bmRsZURlbHRhIHJlbW92YWwgPSBkZWx0YS5nZXRDaGFuZ2VzKClbMF07Ci0JCWFzc2VydEVxdWFscygiMi4yIiwgYnVuZGxlQSwgcmVtb3ZhbC5nZXRCdW5kbGUoKSk7Ci0JCWFzc2VydEVxdWFscygiMi4zIiwgQnVuZGxlRGVsdGEuUkVNT1ZFRCwgcmVtb3ZhbC5nZXRUeXBlKCkpOwotCQlkZWx0YSA9IHN0YXRlMi5jb21wYXJlKHN0YXRlMSk7Ci0JCWFzc2VydEVxdWFscygiMy4xIiwgMSwgZGVsdGEuZ2V0Q2hhbmdlcygpLmxlbmd0aCk7Ci0JCUJ1bmRsZURlbHRhIGFkZGl0aW9uID0gZGVsdGEuZ2V0Q2hhbmdlcygpWzBdOwotCQlhc3NlcnRFcXVhbHMoIjMuMiIsIGJ1bmRsZUEsIGFkZGl0aW9uLmdldEJ1bmRsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjMiLCBCdW5kbGVEZWx0YS5BRERFRCwgYWRkaXRpb24uZ2V0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZhbCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZTEgPSBidWlsZFNpbXBsZVN0YXRlKCk7Ci0JCVN0YXRlIHN0YXRlMiA9IHN0YXRlMS5nZXRGYWN0b3J5KCkuY3JlYXRlU3RhdGUoc3RhdGUxKTsKLQkJU3RhdGVEZWx0YSBkZWx0YSA9IHN0YXRlMS5jb21wYXJlKHN0YXRlMik7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMCwgZGVsdGEuZ2V0Q2hhbmdlcygpLmxlbmd0aCk7Ci0JCWRlbHRhID0gc3RhdGUyLmNvbXBhcmUoc3RhdGUxKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCAwLCBkZWx0YS5nZXRDaGFuZ2VzKCkubGVuZ3RoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlMSA9IHN0YXRlMS5nZXRCdW5kbGVCeUxvY2F0aW9uKCJvcmcuZWNsaXBzZS5iMSIpOwotCQlhc3NlcnROb3ROdWxsKCIxLjkiLCBidW5kbGUxKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgc3RhdGUxLnJlbW92ZUJ1bmRsZShidW5kbGUxKSk7Ci0JCWRlbHRhID0gc3RhdGUxLmNvbXBhcmUoc3RhdGUyKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCAxLCBkZWx0YS5nZXRDaGFuZ2VzKCkubGVuZ3RoKTsKLQkJQnVuZGxlRGVsdGEgcmVtb3ZhbCA9IGRlbHRhLmdldENoYW5nZXMoKVswXTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjIiLCBidW5kbGUxLCByZW1vdmFsLmdldEJ1bmRsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjMiLCBCdW5kbGVEZWx0YS5SRU1PVkVELCByZW1vdmFsLmdldFR5cGUoKSk7Ci0JCWRlbHRhID0gc3RhdGUyLmNvbXBhcmUoc3RhdGUxKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjEiLCAxLCBkZWx0YS5nZXRDaGFuZ2VzKCkubGVuZ3RoKTsKLQkJQnVuZGxlRGVsdGEgYWRkaXRpb24gPSBkZWx0YS5nZXRDaGFuZ2VzKClbMF07Ci0JCWFzc2VydEVxdWFscygiMy4yIiwgYnVuZGxlMSwgYWRkaXRpb24uZ2V0QnVuZGxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjMuMyIsIEJ1bmRsZURlbHRhLkFEREVELCBhZGRpdGlvbi5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUxID0gYnVpbGRTaW1wbGVTdGF0ZSgpOwotCQlTdGF0ZSBzdGF0ZTIgPSBzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZVN0YXRlKHN0YXRlMSk7Ci0JCVN0YXRlRGVsdGEgZGVsdGEgPSBzdGF0ZTEuY29tcGFyZShzdGF0ZTIpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDAsIGRlbHRhLmdldENoYW5nZXMoKS5sZW5ndGgpOwotCQlkZWx0YSA9IHN0YXRlMi5jb21wYXJlKHN0YXRlMSk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgMCwgZGVsdGEuZ2V0Q2hhbmdlcygpLmxlbmd0aCk7Ci0JCWFzc2VydE5vdE51bGwoIjEuOSIsIHN0YXRlMS5nZXRCdW5kbGVCeUxvY2F0aW9uKCJvcmcuZWNsaXBzZS5iMSIpKTsKLQkJU3RyaW5nIEFfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYjFcbkJ1bmRsZS1WZXJzaW9uOiAyLjBcbiI7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZTEgPSBzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQV9NQU5JRkVTVCksICJvcmcuZWNsaXBzZS5iMSIsIDEpOwotCQlhc3NlcnRUcnVlKCIyLjAiLCBzdGF0ZTEudXBkYXRlQnVuZGxlKGJ1bmRsZTEpKTsKLQkJZGVsdGEgPSBzdGF0ZTEuY29tcGFyZShzdGF0ZTIpOwotCQlhc3NlcnRFcXVhbHMoIjIuMSIsIDEsIGRlbHRhLmdldENoYW5nZXMoKS5sZW5ndGgpOwotCQlCdW5kbGVEZWx0YSB1cGRhdGUgPSBkZWx0YS5nZXRDaGFuZ2VzKClbMF07Ci0JCWFzc2VydEVxdWFscygiMi4yIiwgYnVuZGxlMSwgdXBkYXRlLmdldEJ1bmRsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjMiLCBCdW5kbGVEZWx0YS5VUERBVEVELCB1cGRhdGUuZ2V0VHlwZSgpKTsKLQkJZGVsdGEgPSBzdGF0ZTIuY29tcGFyZShzdGF0ZTEpOwotCQlhc3NlcnRFcXVhbHMoIjMuMSIsIDAsIGRlbHRhLmdldENoYW5nZXMoKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RhdGVDb21wYXJpc29uVGVzdC5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1N0YXRlQ3ljbGVUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvU3RhdGVDeWNsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4NGY5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvU3RhdGVDeWNsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgU3RhdGVDeWNsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFN0YXRlQ3ljbGVUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgU3RhdGVDeWNsZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3ljbGUxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlMSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdHJpbmcgQV9NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hXG5CdW5kbGUtVmVyc2lvbjogMS4wXG4iOwotCQlzdGF0ZTEuYWRkQnVuZGxlKHN0YXRlMS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChBX01BTklGRVNUKSwgIm9yZy5lY2xpcHNlLmEiLCAxKSk7Ci0JCVN0cmluZyBCX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmJcbkJ1bmRsZS1WZXJzaW9uOiAxLjBcblJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5hLG9yZy5lY2xpcHNlLmNcbiI7Ci0JCXN0YXRlMS5hZGRCdW5kbGUoc3RhdGUxLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEJfTUFOSUZFU1QpLCAib3JnLmVjbGlwc2UuYiIsIDIpKTsKLQkJU3RyaW5nIENfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuY1xuQnVuZGxlLVZlcnNpb246IDEuMFxuUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmEsb3JnLmVjbGlwc2UuYlxuIjsKLQkJc3RhdGUxLmFkZEJ1bmRsZShzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQ19NQU5JRkVTVCksICJvcmcuZWNsaXBzZS5jIiwgMykpOwotCQlTdHJpbmcgRF9NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5kXG5CdW5kbGUtVmVyc2lvbjogMS4wXG5SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuYSxvcmcuZWNsaXBzZS5jXG4iOwotCQlzdGF0ZTEuYWRkQnVuZGxlKHN0YXRlMS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChEX01BTklGRVNUKSwgIm9yZy5lY2xpcHNlLmQiLCA0KSk7Ci0JCVN0cmluZyBFX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVcbkJ1bmRsZS1WZXJzaW9uOiAxLjBcblJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5hLG9yZy5lY2xpcHNlLmI7IG9wdGlvbmFsPXRydWVcbiI7Ci0JCXN0YXRlMS5hZGRCdW5kbGUoc3RhdGUxLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEVfTUFOSUZFU1QpLCAib3JnLmVjbGlwc2UuZSIsIDUpKTsKLQkJU3RyaW5nIEZfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZlxuQnVuZGxlLVZlcnNpb246IDEuMFxuUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmZcbiI7Ci0JCXN0YXRlMS5hZGRCdW5kbGUoc3RhdGUxLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEZfTUFOSUZFU1QpLCAib3JnLmVjbGlwc2UuZiIsIDYpKTsKLQkJU3RhdGUgc3RhdGUgPSBzdGF0ZTE7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlQSA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmEiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlQiA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlQyA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmMiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlRCA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmQiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlRSA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmUiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlRiA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmYiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBhbGxCdW5kbGVzID0gc3RhdGUuZ2V0QnVuZGxlcygpOwotCQlhc3NlcnRDb250YWlucygiMC41IiwgYWxsQnVuZGxlcywgYnVuZGxlQSk7Ci0JCWFzc2VydENvbnRhaW5zKCIwLjYiLCBhbGxCdW5kbGVzLCBidW5kbGVCKTsKLQkJYXNzZXJ0Q29udGFpbnMoIjAuNyIsIGFsbEJ1bmRsZXMsIGJ1bmRsZUMpOwotCQlhc3NlcnRDb250YWlucygiMC44IiwgYWxsQnVuZGxlcywgYnVuZGxlRCk7Ci0JCWFzc2VydENvbnRhaW5zKCIwLjkiLCBhbGxCdW5kbGVzLCBidW5kbGVFKTsKLQkJYXNzZXJ0Q29udGFpbnMoIjAuMTAiLCBhbGxCdW5kbGVzLCBidW5kbGVGKTsKLQotCQkvLyBjeWNsZXMgbXVzdCByZXNvbHZlIG5vdwotCQlhc3NlcnRUcnVlKCIxLjAiLCBidW5kbGVBLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjIuMCIsIGJ1bmRsZUIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4wIiwgYnVuZGxlQy5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCI0LjAiLCBidW5kbGVELmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjUuMCIsIGJ1bmRsZUUuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiNi4wIiwgYnVuZGxlRi5pc1Jlc29sdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDeWNsZTIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUxID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0cmluZyBBX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFcbkJ1bmRsZS1WZXJzaW9uOiAxLjBcbiI7Ci0JCXN0YXRlMS5hZGRCdW5kbGUoc3RhdGUxLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEFfTUFOSUZFU1QpLCAib3JnLmVjbGlwc2UuYSIsIDEpKTsKLQkJU3RyaW5nIEJfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYlxuQnVuZGxlLVZlcnNpb246IDEuMFxuUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmEsb3JnLmVjbGlwc2UuY1xuIjsKLQkJc3RhdGUxLmFkZEJ1bmRsZShzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQl9NQU5JRkVTVCksICJvcmcuZWNsaXBzZS5iIiwgMikpOwotCQlTdHJpbmcgQ19NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5jXG5CdW5kbGUtVmVyc2lvbjogMS4wXG5SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuYSxvcmcuZWNsaXBzZS5kXG4iOwotCQlzdGF0ZTEuYWRkQnVuZGxlKHN0YXRlMS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChDX01BTklGRVNUKSwgIm9yZy5lY2xpcHNlLmMiLCAzKSk7Ci0JCVN0cmluZyBEX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmRcbkJ1bmRsZS1WZXJzaW9uOiAxLjBcblJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5hLG9yZy5lY2xpcHNlLmJcbiI7Ci0JCXN0YXRlMS5hZGRCdW5kbGUoc3RhdGUxLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KERfTUFOSUZFU1QpLCAib3JnLmVjbGlwc2UuZCIsIDQpKTsKLQkJU3RyaW5nIEVfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZVxuQnVuZGxlLVZlcnNpb246IDEuMFxuUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmEsb3JnLmVjbGlwc2UuYjsgb3B0aW9uYWw9dHJ1ZVxuIjsKLQkJc3RhdGUxLmFkZEJ1bmRsZShzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoRV9NQU5JRkVTVCksICJvcmcuZWNsaXBzZS5lIiwgNSkpOwotCQlTdHJpbmcgRl9NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5mXG5CdW5kbGUtVmVyc2lvbjogMS4wXG5SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZlxuIjsKLQkJc3RhdGUxLmFkZEJ1bmRsZShzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoRl9NQU5JRkVTVCksICJvcmcuZWNsaXBzZS5mIiwgNikpOwotCQlTdGF0ZSBzdGF0ZSA9IHN0YXRlMTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVBID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuYSIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVCID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuYiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVDID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuYyIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVEID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuZCIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVFID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuZSIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVGID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuZiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFsbEJ1bmRsZXMgPSBzdGF0ZS5nZXRCdW5kbGVzKCk7Ci0JCWFzc2VydENvbnRhaW5zKCIwLjUiLCBhbGxCdW5kbGVzLCBidW5kbGVBKTsKLQkJYXNzZXJ0Q29udGFpbnMoIjAuNiIsIGFsbEJ1bmRsZXMsIGJ1bmRsZUIpOwotCQlhc3NlcnRDb250YWlucygiMC43IiwgYWxsQnVuZGxlcywgYnVuZGxlQyk7Ci0JCWFzc2VydENvbnRhaW5zKCIwLjgiLCBhbGxCdW5kbGVzLCBidW5kbGVEKTsKLQkJYXNzZXJ0Q29udGFpbnMoIjAuOSIsIGFsbEJ1bmRsZXMsIGJ1bmRsZUUpOwotCQlhc3NlcnRDb250YWlucygiMC4xMCIsIGFsbEJ1bmRsZXMsIGJ1bmRsZUYpOwotCi0JCS8vIGN5Y2xlcyBtdXN0IHJlc29sdmUgbm93Ci0JCWFzc2VydFRydWUoIjEuMCIsIGJ1bmRsZUEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgYnVuZGxlQi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIzLjAiLCBidW5kbGVDLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjQuMCIsIGJ1bmRsZUQuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiNS4wIiwgYnVuZGxlRS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCI2LjAiLCBidW5kbGVGLmlzUmVzb2x2ZWQoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3ljbGUzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCVN0cmluZyBBX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFcbkJ1bmRsZS1WZXJzaW9uOiAxLjBcbiI7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChBX01BTklGRVNUKSwgIm9yZy5lY2xpcHNlLmEiLCAxKSk7Ci0JCVN0cmluZyBCX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmJcbkJ1bmRsZS1WZXJzaW9uOiAxLjBcblJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jXG4iOwotCQlzdGF0ZS5hZGRCdW5kbGUoc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQl9NQU5JRkVTVCksICJvcmcuZWNsaXBzZS5iIiwgMikpOwotCQlTdHJpbmcgQ19NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5jXG5CdW5kbGUtVmVyc2lvbjogMS4wXG5SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZFxuIjsKLQkJc3RhdGUuYWRkQnVuZGxlKHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KENfTUFOSUZFU1QpLCAib3JnLmVjbGlwc2UuYyIsIDMpKTsKLQkJU3RyaW5nIERfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZFxuQnVuZGxlLVZlcnNpb246IDEuMFxuUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmJcbiI7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChEX01BTklGRVNUKSwgIm9yZy5lY2xpcHNlLmQiLCA0KSk7Ci0KLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVDID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuYyIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVCID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuYiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVBID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuYSIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVEID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbigib3JnLmVjbGlwc2UuZCIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFsbEJ1bmRsZXMgPSBzdGF0ZS5nZXRCdW5kbGVzKCk7Ci0JCWFzc2VydENvbnRhaW5zKCIwLjUiLCBhbGxCdW5kbGVzLCBidW5kbGVDKTsKLQkJYXNzZXJ0Q29udGFpbnMoIjAuNiIsIGFsbEJ1bmRsZXMsIGJ1bmRsZUIpOwotCQlhc3NlcnRDb250YWlucygiMC43IiwgYWxsQnVuZGxlcywgYnVuZGxlQSk7Ci0JCWFzc2VydENvbnRhaW5zKCIwLjgiLCBhbGxCdW5kbGVzLCBidW5kbGVEKTsKLQotCQkvLyBjeWNsZXMgbXVzdCByZXNvbHZlIG5vdwotCQlhc3NlcnRUcnVlKCIwLjkiLCBidW5kbGVBLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIGJ1bmRsZUMuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgYnVuZGxlQi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIzLjAiLCBidW5kbGVELmlzUmVzb2x2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN5Y2xlNCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlTdHJpbmcgQV9NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hXG5CdW5kbGUtVmVyc2lvbjogMS4wXG4iOwotCQlzdGF0ZS5hZGRCdW5kbGUoc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQV9NQU5JRkVTVCksICJvcmcuZWNsaXBzZS5hIiwgMSkpOwotCQlTdHJpbmcgQl9NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5iXG5CdW5kbGUtVmVyc2lvbjogMS4wXG5SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY1xuIjsKLQkJc3RhdGUuYWRkQnVuZGxlKHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEJfTUFOSUZFU1QpLCAib3JnLmVjbGlwc2UuYiIsIDIpKTsKLQkJU3RyaW5nIENfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuY1xuQnVuZGxlLVZlcnNpb246IDEuMFxuUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmRcbiI7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChDX01BTklGRVNUKSwgIm9yZy5lY2xpcHNlLmMiLCAzKSk7Ci0JCVN0cmluZyBEX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmRcbkJ1bmRsZS1WZXJzaW9uOiAxLjBcblJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5iOyBvcHRpb25hbD10cnVlXG4iOwotCQlzdGF0ZS5hZGRCdW5kbGUoc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoRF9NQU5JRkVTVCksICJvcmcuZWNsaXBzZS5kIiwgNCkpOwotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlQyA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmMiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlQiA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlQSA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmEiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlRCA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oIm9yZy5lY2xpcHNlLmQiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBhbGxCdW5kbGVzID0gc3RhdGUuZ2V0QnVuZGxlcygpOwotCQlhc3NlcnRDb250YWlucygiMC41IiwgYWxsQnVuZGxlcywgYnVuZGxlQyk7Ci0JCWFzc2VydENvbnRhaW5zKCIwLjYiLCBhbGxCdW5kbGVzLCBidW5kbGVCKTsKLQkJYXNzZXJ0Q29udGFpbnMoIjAuNyIsIGFsbEJ1bmRsZXMsIGJ1bmRsZUEpOwotCQlhc3NlcnRDb250YWlucygiMC44IiwgYWxsQnVuZGxlcywgYnVuZGxlRCk7Ci0KLQkJLy8gY3ljbGVzIG11c3QgcmVzb2x2ZSBub3cKLQkJYXNzZXJ0VHJ1ZSgiMC45IiwgYnVuZGxlQS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCBidW5kbGVDLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjIuMCIsIGJ1bmRsZUIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4wIiwgYnVuZGxlRC5pc1Jlc29sdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QxODUyODUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJLy8gaWYgdHdvIHZlcnNpb25zIG9mIHRoZSBzYW1lIGJ1bmRsZSBleHBvcnQgYW5kIGltcG9ydCB0d28gZGlmZmVyZW50IHBhY2thZ2VzIGF0IHRoZSBzYW1lIHZlcnNpb24KLQkJLy8gdGhlbiB3ZSBzaG91bGQgcmVzb2x2ZSBib3RoIHNldHMgb2YgaW1wb3J0cyB0byB0aGUgZmlyc3QgYnVuZGxlIGluc3RhbGxlZC4KLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJYIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiZm9vOyB2ZXJzaW9uPVwiMS4wLjBcIiwgYmFyOyB2ZXJzaW9uPVwiMS4wLjBcIiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiZm9vLCBiYXIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJYIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiZm9vOyB2ZXJzaW9uPVwiMS4wLjBcIiwgYmFyOyB2ZXJzaW9uPVwiMS4wLjBcIiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiZm9vLCBiYXIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYV8xMDEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoYV8xMDEpOwotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYV8xMDAuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYV8xMDEuaXNSZXNvbHZlZCgpKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gc2VsZWN0ZWRFeHBvcnRzQTEwMCA9IGFfMTAwLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBzZWxlY3RlZEV4cG9ydHNBMTAxID0gYV8xMDEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydFRydWUoIjIuMCIsIHNlbGVjdGVkRXhwb3J0c0ExMDAubGVuZ3RoID09IDIpOwotCQlhc3NlcnRUcnVlKCIyLjEiLCBzZWxlY3RlZEV4cG9ydHNBMTAxLmxlbmd0aCA9PSAwKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gcmVzb2x2ZWRJbXBvcnRzQTEwMCA9IGFfMTAwLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSByZXNvbHZlZEltcG9ydHNBMTAxID0gYV8xMDAuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydFRydWUoIjMuMCIsIHJlc29sdmVkSW1wb3J0c0ExMDAubGVuZ3RoID09IDIpOwotCQlhc3NlcnRUcnVlKCIzLjEiLCByZXNvbHZlZEltcG9ydHNBMTAxLmxlbmd0aCA9PSAyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvbHZlZEltcG9ydHNBMTAwLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRUcnVlKCIzLjIuMS4iICsgaSwgc2VsZWN0ZWRFeHBvcnRzQTEwMFtpXSA9PSByZXNvbHZlZEltcG9ydHNBMTAwW2ldKTsKLQkJCWFzc2VydFRydWUoIjMuMi4xLiIgKyBpLCBzZWxlY3RlZEV4cG9ydHNBMTAwW2ldID09IHJlc29sdmVkSW1wb3J0c0ExMDFbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1N0YXRlUmVzb2x2ZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvU3RhdGVSZXNvbHZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0ZjVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvU3RhdGVSZXNvbHZlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnNlcnZpY2VzLnJlc29sdmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLk9TR2lUZXN0c0FjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIFN0YXRlUmVzb2x2ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RTdGF0ZVRlc3QgewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RhdGVSZXNvbHZlclRlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBTdGF0ZVJlc29sdmVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBhZGRpbmcgMyBuZXcgYnVuZGxlcyB0byBhbiBhbHJlYWR5IHJlc29sdmVkIHN0YXRlIGFuZCB0aGVuCi0JICogcmVzb2x2aW5nIG9ubHkgb25lIG9mIHRoZSBidW5kbGVzLiBUaGUgcmVzdWx0IHNob3VsZCBiZSBhbGwgMyBhZGRlZAotCSAqIGJ1bmRsZXMgYmVpbmcgcmVzb2x2ZWQuCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGQzUmVzb2x2ZTEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEluaXRpYWxTdGF0ZSgpOwotCQlTdGF0ZURlbHRhIGRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldENoYW5nZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjAgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCWFzc2VydE5vdE51bGwoIjAuMSIsIGIwKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGdWxseVJlc29sdmVkKCIwLjIiLCBiMCk7IC8vJE5PTi1OTFMtMSQKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJvcmcuZWNsaXBzZS5iMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAib3JnLm9zZ2kuZnJhbWV3b3JrIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIm9yZy5lY2xpcHNlLnAxOyBzcGVjaWZpY2F0aW9uLXZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjEgPSBudWxsOwotCQl0cnkgewotCQkJYjEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24obWFuaWZlc3QsICJvcmcuZWNsaXBzZS5iMSIsIDEpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0ZS5yZW1vdmVCdW5kbGUoMSk7Ci0JCQlzdGF0ZS5hZGRCdW5kbGUoYjEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBCdW5kbGVEZXNjcmlwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJvcmcuZWNsaXBzZS5iMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAib3JnLm9zZ2kuZnJhbWV3b3JrLG9yZy5lY2xpcHNlLnAxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIm9yZy5lY2xpcHNlLnAyOyBzcGVjaWZpY2F0aW9uLXZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBudWxsOwotCQl0cnkgewotCQkJYjIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24obWFuaWZlc3QsICJvcmcuZWNsaXBzZS5iMiIsIDIpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0ZS5yZW1vdmVCdW5kbGUoMik7Ci0JCQlzdGF0ZS5hZGRCdW5kbGUoYjIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBCdW5kbGVEZXNjcmlwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJvcmcuZWNsaXBzZS5iMyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAib3JnLm9zZ2kuZnJhbWV3b3JrLG9yZy5lY2xpcHNlLnAyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIm9yZy5lY2xpcHNlLnAzOyBzcGVjaWZpY2F0aW9uLXZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjMgPSBudWxsOwotCQl0cnkgewotCQkJYjMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24obWFuaWZlc3QsICJvcmcuZWNsaXBzZS5iMyIsIDMpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0ZS5yZW1vdmVCdW5kbGUoMyk7Ci0JCQlzdGF0ZS5hZGRCdW5kbGUoYjMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBCdW5kbGVEZXNjcmlwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWRlbHRhID0gc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7c3RhdGUuZ2V0QnVuZGxlKDEpfSk7Ci0JCWRlbHRhcyA9IGRlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAzLCBkZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlNYXAgZGVsdGFzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspCi0JCQlkZWx0YXNNYXAucHV0KG5ldyBMb25nKGRlbHRhc1tpXS5nZXRCdW5kbGUoKS5nZXRCdW5kbGVJZCgpKSwgZGVsdGFzW2ldKTsKLQkJYXNzZXJ0Tm90TnVsbCgiMS4xIiwgZGVsdGFzTWFwLmdldChuZXcgTG9uZygxKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjEuMiIsIGRlbHRhc01hcC5nZXQobmV3IExvbmcoMikpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCIxLjMiLCBkZWx0YXNNYXAuZ2V0KG5ldyBMb25nKDMpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCAoQnVuZGxlRGVsdGEuUkVTT0xWRUQgfCBCdW5kbGVEZWx0YS5BRERFRCksICgoQnVuZGxlRGVsdGEpIGRlbHRhc01hcC5nZXQobmV3IExvbmcoMSkpKS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMi4yIiwgKEJ1bmRsZURlbHRhLlJFU09MVkVEIHwgQnVuZGxlRGVsdGEuQURERUQpLCAoKEJ1bmRsZURlbHRhKSBkZWx0YXNNYXAuZ2V0KG5ldyBMb25nKDIpKSkuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMyIsIChCdW5kbGVEZWx0YS5SRVNPTFZFRCB8IEJ1bmRsZURlbHRhLkFEREVEKSwgKChCdW5kbGVEZWx0YSkgZGVsdGFzTWFwLmdldChuZXcgTG9uZygzKSkpLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNSZXNvbHV0aW9uKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRTaW1wbGVTdGF0ZSgpOwotCQlTdGF0ZURlbHRhIGRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMSA9IHN0YXRlLmdldEJ1bmRsZSgxKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBzdGF0ZS5nZXRCdW5kbGUoMik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIzID0gc3RhdGUuZ2V0QnVuZGxlKDMpOwotCQlhc3NlcnROb3ROdWxsKCIwLjEiLCBiMSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiMC4yIiwgYjIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjAuMyIsIGIzKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZWx0YVtdIGNoYW5nZXMgPSBkZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMywgY2hhbmdlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlbHRhW10gYWRkaXRpb25zID0gZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5BRERFRCwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDMsIGFkZGl0aW9ucy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlbHRhW10gcmVzb2x1dGlvbnMgPSBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLlJFU09MVkVELCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgMiwgcmVzb2x1dGlvbnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlNYXAgZGVsdGFzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvbHV0aW9ucy5sZW5ndGg7IGkrKykKLQkJCWRlbHRhc01hcC5wdXQocmVzb2x1dGlvbnNbaV0uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIHJlc29sdXRpb25zW2ldKTsKLQkJYXNzZXJ0Tm90TnVsbCgiMy4xIiwgZGVsdGFzTWFwLmdldChiMS5nZXRTeW1ib2xpY05hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjMuMiIsIGRlbHRhc01hcC5nZXQoYjIuZ2V0U3ltYm9saWNOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBUT0RPIHdoeSBkbyB3ZSBleHBlY3QgdW5yZXNvbHZlZCBkZWx0YXMgaGVyZSB3aGVuIHRoZSBidW5kbGUgd2FzIG5vdCByZXNvbHZlZCBpbiB0aGUgZmlyc3QgcGxhY2U/Ci0JCS8vQnVuZGxlRGVsdGFbXSB1bnJlc29sdXRpb25zID0gZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5VTlJFU09MVkVELCBmYWxzZSk7Ci0JCS8vYXNzZXJ0RXF1YWxzKCI0LjAiLCAxLCB1bnJlc29sdXRpb25zLmxlbmd0aCk7Ci0JCS8vYXNzZXJ0RXF1YWxzKCI0LjEiLCB1bnJlc29sdXRpb25zWzBdLmdldEJ1bmRsZSgpLCBiMyk7Ci0JCWFzc2VydEZ1bGx5UmVzb2x2ZWQoIjUuMSIsIGIxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGdWxseVJlc29sdmVkKCI1LjIiLCBiMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RnVsbHlVbnJlc29sdmVkKCI1LjMiLCBiMyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleFJlc29sdXRpb24oKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZENvbXBsZXhTdGF0ZSgpOwotCQlTdGF0ZURlbHRhIGRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMSA9IHN0YXRlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuYjEiLCBWZXJzaW9uLnBhcnNlVmVyc2lvbigiMS4wIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBzdGF0ZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmIyIiwgVmVyc2lvbi5wYXJzZVZlcnNpb24oIjIuMCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIzID0gc3RhdGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5iMyIsIFZlcnNpb24ucGFyc2VWZXJzaW9uKCIyLjAiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiNCA9IHN0YXRlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuYjQiLCBWZXJzaW9uLnBhcnNlVmVyc2lvbigiMi4wIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjUgPSBzdGF0ZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmI1IiwgVmVyc2lvbi5wYXJzZVZlcnNpb24oIjEuMCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGI2ID0gc3RhdGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5iNiIsIFZlcnNpb24ucGFyc2VWZXJzaW9uKCIxLjAiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROb3ROdWxsKCIwLjEiLCBiMSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiMC4yIiwgYjIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjAuMyIsIGIzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCIwLjQiLCBiNCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiMC41IiwgYjUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjAuNiIsIGI2KTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZWx0YVtdIGNoYW5nZXMgPSBkZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgNiwgY2hhbmdlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlbHRhW10gYWRkaXRpb25zID0gZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5BRERFRCwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDYsIGFkZGl0aW9ucy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlbHRhW10gcmVzb2x1dGlvbnMgPSBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLlJFU09MVkVELCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgNiwgcmVzb2x1dGlvbnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlNYXAgZGVsdGFzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvbHV0aW9ucy5sZW5ndGg7IGkrKykKLQkJCWRlbHRhc01hcC5wdXQocmVzb2x1dGlvbnNbaV0uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIHJlc29sdXRpb25zW2ldKTsKLQkJYXNzZXJ0Tm90TnVsbCgiMy4xIiwgZGVsdGFzTWFwLmdldChiMS5nZXRTeW1ib2xpY05hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjMuMiIsIGRlbHRhc01hcC5nZXQoYjIuZ2V0U3ltYm9saWNOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCIzLjMiLCBkZWx0YXNNYXAuZ2V0KGIzLmdldFN5bWJvbGljTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiMy40IiwgZGVsdGFzTWFwLmdldChiNC5nZXRTeW1ib2xpY05hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjMuNSIsIGRlbHRhc01hcC5nZXQoYjUuZ2V0U3ltYm9saWNOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCIzLjYiLCBkZWx0YXNNYXAuZ2V0KGI2LmdldFN5bWJvbGljTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVsdGFbXSB1bnJlc29sdXRpb25zID0gZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5VTlJFU09MVkVELCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiNC4wIiwgMCwgdW5yZXNvbHV0aW9ucy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZ1bGx5UmVzb2x2ZWQoIjUuMSIsIGIxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGdWxseVJlc29sdmVkKCI1LjIiLCBiMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RnVsbHlSZXNvbHZlZCgiNS4zIiwgYjMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZ1bGx5UmVzb2x2ZWQoIjUuNCIsIGI0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGdWxseVJlc29sdmVkKCI1LjUiLCBiNSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RnVsbHlSZXNvbHZlZCgiNS42IiwgYjYpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlcGVuZGVudEJ1bmRsZXMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZENvbXBsZXhTdGF0ZSgpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gZGVwZW5kZW50OwotCQlkZXBlbmRlbnQgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlSGVscGVyKCkuZ2V0RGVwZW5kZW50QnVuZGxlcyhuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7c3RhdGUuZ2V0QnVuZGxlKDIpfSk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMSwgZGVwZW5kZW50Lmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBzdGF0ZS5nZXRCdW5kbGUoMiksIGRlcGVuZGVudFswXSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVwZW5kZW50ID0gcGxhdGZvcm1BZG1pbi5nZXRTdGF0ZUhlbHBlcigpLmdldERlcGVuZGVudEJ1bmRsZXMobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge3N0YXRlLmdldEJ1bmRsZSgxKX0pOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDQsIGRlcGVuZGVudC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCIyLjEiLCBkZXBlbmRlbnQsIHN0YXRlLmdldEJ1bmRsZSgxKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Q29udGFpbnMoIjIuMiIsIGRlcGVuZGVudCwgc3RhdGUuZ2V0QnVuZGxlKDIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRDb250YWlucygiMi4zIiwgZGVwZW5kZW50LCBzdGF0ZS5nZXRCdW5kbGUoNCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCIyLjQiLCBkZXBlbmRlbnQsIHN0YXRlLmdldEJ1bmRsZSg2KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlcmVxdWlzaXRlQnVuZGxlKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRDb21wbGV4U3RhdGUoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIHByZXJlcXM7Ci0JCXByZXJlcXMgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlSGVscGVyKCkuZ2V0UHJlcmVxdWlzaXRlcyhzdGF0ZS5nZXRSZXNvbHZlZEJ1bmRsZXMoKSk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgNiwgcHJlcmVxcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCXByZXJlcXMgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlSGVscGVyKCkuZ2V0UHJlcmVxdWlzaXRlcyhuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7c3RhdGUuZ2V0QnVuZGxlKDEpfSk7Ci0JCWFzc2VydEVxdWFscygiMi4wIiwgMiwgcHJlcmVxcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCIyLjEiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCIyLjIiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMykpOyAvLyROT04tTkxTLTEkCi0JCXByZXJlcXMgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlSGVscGVyKCkuZ2V0UHJlcmVxdWlzaXRlcyhuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7c3RhdGUuZ2V0QnVuZGxlKDIpfSk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgMywgcHJlcmVxcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCIzLjEiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCIzLjIiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCIzLjMiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMykpOyAvLyROT04tTkxTLTEkCi0JCXByZXJlcXMgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlSGVscGVyKCkuZ2V0UHJlcmVxdWlzaXRlcyhuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7c3RhdGUuZ2V0QnVuZGxlKDMpfSk7Ci0JCWFzc2VydEVxdWFscygiNC4wIiwgMSwgcHJlcmVxcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI0LjEiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMykpOyAvLyROT04tTkxTLTEkCi0JCXByZXJlcXMgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlSGVscGVyKCkuZ2V0UHJlcmVxdWlzaXRlcyhuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7c3RhdGUuZ2V0QnVuZGxlKDQpfSk7Ci0JCWFzc2VydEVxdWFscygiNS4wIiwgMywgcHJlcmVxcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI1LjEiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI1LjIiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMykpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI1LjMiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoNCkpOyAvLyROT04tTkxTLTEkCi0JCXByZXJlcXMgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlSGVscGVyKCkuZ2V0UHJlcmVxdWlzaXRlcyhuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7c3RhdGUuZ2V0QnVuZGxlKDUpfSk7Ci0JCWFzc2VydEVxdWFscygiNi4wIiwgMiwgcHJlcmVxcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI2LjEiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMykpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI2LjIiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoNSkpOyAvLyROT04tTkxTLTEkCi0JCXByZXJlcXMgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlSGVscGVyKCkuZ2V0UHJlcmVxdWlzaXRlcyhuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7c3RhdGUuZ2V0QnVuZGxlKDYpfSk7Ci0JCWFzc2VydEVxdWFscygiNi4wIiwgNCwgcHJlcmVxcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI2LjEiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI2LjIiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoMykpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI2LjMiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoNCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydENvbnRhaW5zKCI2LjQiLCBwcmVyZXFzLCBzdGF0ZS5nZXRCdW5kbGUoNikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gdGVtcG9yYXJpbHkgZGlzYWJsZWQKLQlwdWJsaWMgdm9pZCB0ZXN0TGlua2FnZUNoYW5nZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQkvLyBkb24ndCBhZGQgYjEgZm9yIG5vdwotCQlTdHJpbmcgQjFfTE9DQVRJT04gPSAib3JnLmVjbGlwc2UuYjEiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBCMV9NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5iMVxuIiArICJCdW5kbGUtVmVyc2lvbjogMS4wXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChCMV9NQU5JRkVTVCksIEIxX0xPQ0FUSU9OLCAobG9uZykgKE1hdGgucmFuZG9tKCkgKiBMb25nLk1BWF9WQUxVRSkpOwotCQkvLyBiMiByZXF1aXJlcyBiMSBvcHRpb25hbGx5LCBzbyBzaG91bGQgcmVzb2x2ZQotCQlTdHJpbmcgQjJfTE9DQVRJT04gPSAib3JnLmVjbGlwc2UuYjIiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBCMl9NQU5JRkVTVCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5iMlxuIiArICJCdW5kbGUtVmVyc2lvbjogMi4wXG4iICsgIlJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5iMTtvcHRpb25hbD10cnVlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChCMl9NQU5JRkVTVCksIEIyX0xPQ0FUSU9OLCAobG9uZykgKE1hdGgucmFuZG9tKCkgKiBMb25nLk1BWF9WQUxVRSkpOwotCQkvLyBiMyByZXF1aXJlcyBiMSwgc28gc2hvdWxkIG5vdCByZXNvbHZlCi0JCVN0cmluZyBCM19MT0NBVElPTiA9ICJvcmcuZWNsaXBzZS5iMyI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEIzX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmIzXG4iICsgIkJ1bmRsZS1WZXJzaW9uOiAyLjBcbiIgKyAiUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmIxIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24ocGFyc2VNYW5pZmVzdChCM19NQU5JRkVTVCksIEIzX0xPQ0FUSU9OLCAobG9uZykgKE1hdGgucmFuZG9tKCkgKiBMb25nLk1BWF9WQUxVRSkpOwotCQkvLyBhZGQgYjIgYW5kIGIzCi0JCXN0YXRlLmFkZEJ1bmRsZShiMik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiMyk7Ci0JCVN0YXRlRGVsdGEgZGVsdGEgPSBzdGF0ZS5yZXNvbHZlKCk7Ci0JCS8vIGVuc3VyZSB3ZSBkaWRuJ3QgYWRkIGIxIHlldAotCQlhc3NlcnRGdWxseVVucmVzb2x2ZWQoIjAuMSIsIGIxKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZWx0YVtdIGNoYW5nZXMgPSBkZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMiwgY2hhbmdlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlbHRhW10gYWRkaXRpb25zID0gZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5BRERFRCwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDIsIGFkZGl0aW9ucy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlbHRhW10gcmVzb2x1dGlvbnMgPSBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLlJFU09MVkVELCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgMSwgcmVzb2x1dGlvbnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjMuMSIsIGIyLCByZXNvbHV0aW9uc1swXS5nZXRCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVsdGFbXSBhZGR0aW9uc05vdFJlc29sdmVkID0gZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5BRERFRCwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygiNC4wIiwgMSwgYWRkdGlvbnNOb3RSZXNvbHZlZC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiNC4xIiwgYjMsIGFkZHRpb25zTm90UmVzb2x2ZWRbMF0uZ2V0QnVuZGxlKCkpOyAvLyROT04tTkxTLTEkCi0JCXN0YXRlLmFkZEJ1bmRsZShiMSk7Ci0JCWRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQljaGFuZ2VzID0gZGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnRFcXVhbHMoIjUuMCIsIDIsIGNoYW5nZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRpdGlvbnMgPSBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLkFEREVELCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiNi4wIiwgMSwgYWRkaXRpb25zLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCI2LjEiLCBiMSwgYWRkaXRpb25zWzBdLmdldEJ1bmRsZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXNvbHV0aW9ucyA9IGRlbHRhLmdldENoYW5nZXMoQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKCI3LjAiLCAyLCByZXNvbHV0aW9ucy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlbHRhW10gZXhpc3RpbmdSZXNvbHZlZCA9IGRlbHRhLmdldENoYW5nZXMoQnVuZGxlRGVsdGEuUkVTT0xWRUQsIHRydWUpOwotCQlhc3NlcnRFcXVhbHMoIjguMCIsIDEsIGV4aXN0aW5nUmVzb2x2ZWQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjguMSIsIGIzLCBleGlzdGluZ1Jlc29sdmVkWzBdLmdldEJ1bmRsZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBUT0RPIGxpbmthZ2UgY2hhbmdlZCB0eXBlcyBhcmUgbm8gbG9uZ2VyIHZhbGlkCi0JCS8vQnVuZGxlRGVsdGFbXSBvcHRpb25hbExpbmthZ2VDaGFuZ2VkID0gZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5PUFRJT05BTF9MSU5LQUdFX0NIQU5HRUQsIHRydWUpOwotCQkvL2Fzc2VydEVxdWFscygiOS4wIiwgMSwgb3B0aW9uYWxMaW5rYWdlQ2hhbmdlZC5sZW5ndGgpOwotCQkvL2Fzc2VydEVxdWFscygiOS4xIiwgYjIsIG9wdGlvbmFsTGlua2FnZUNoYW5nZWRbMF0uZ2V0QnVuZGxlKCkpOwotCQlkZWx0YSA9IHN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2IyfSk7Ci0JCWNoYW5nZXMgPSBkZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydEVxdWFscygiOS4wIiwgMSwgY2hhbmdlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCXJlc29sdXRpb25zID0gZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5SRVNPTFZFRCwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygiOS4xIiwgMSwgcmVzb2x1dGlvbnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjkuMiIsIGIyLCByZXNvbHV0aW9uc1swXS5nZXRCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RnVsbHlSZXNvbHZlZCgiMTAuMSIsIGIxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGdWxseVJlc29sdmVkKCIxMC4yIiwgYjIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZ1bGx5UmVzb2x2ZWQoIjEwLjMiLCBiMyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyB0ZW1wb3JhcmlseSBkaXNhYmxlZAotCXB1YmxpYyB2b2lkIHRlc3RSZWluc3RhbGwoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZENvbXBsZXhTdGF0ZSgpOwotCQlTdGF0ZURlbHRhIGRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQkvLyByZW1vdmUgYnVuZGxlIDQgLSBzaG91bGQgY2F1c2UgNiB0byBiZSB1bnJlc29sdmVkCi0JCXN0YXRlLnJlbW92ZUJ1bmRsZSg0KTsKLQkJZGVsdGEgPSBzdGF0ZS5yZXNvbHZlKCk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMSwgZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5SRU1PVkVEIHwgQnVuZGxlRGVsdGEuVU5SRVNPTFZFRCB8IEJ1bmRsZURlbHRhLlJFTU9WQUxfQ09NUExFVEUsIHRydWUpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCA0LCBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLlJFTU9WRUQgfCBCdW5kbGVEZWx0YS5VTlJFU09MVkVEIHwgQnVuZGxlRGVsdGEuUkVNT1ZBTF9DT01QTEVURSwgdHJ1ZSlbMF0uZ2V0QnVuZGxlKCkuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCAxLCBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLlVOUkVTT0xWRUQsIHRydWUpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCA2LCBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLlVOUkVTT0xWRUQsIHRydWUpWzBdLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIHJlaW5zdGFsbCBidW5kbGUgNCAtIHNob3VsZCBjYXVzZSA2IHRvIGJlIHJlc29sdmVkIGFnYWluCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGI0ID0gZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5SRU1PVkVEIHwgQnVuZGxlRGVsdGEuVU5SRVNPTFZFRCB8IEJ1bmRsZURlbHRhLlJFTU9WQUxfQ09NUExFVEUsIHRydWUpWzBdLmdldEJ1bmRsZSgpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYjQpOwotCQlkZWx0YSA9IHN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjAiLCAxLCBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLkFEREVEIHwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIHRydWUpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIzLjEiLCA0LCBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLkFEREVEIHwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIHRydWUpWzBdLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiNC4wIiwgMSwgZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5SRVNPTFZFRCwgdHJ1ZSkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjQuMSIsIDYsIGRlbHRhLmdldENoYW5nZXMoQnVuZGxlRGVsdGEuUkVTT0xWRUQsIHRydWUpWzBdLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92YWwoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIEIxX0xPQ0FUSU9OID0gIm9yZy5lY2xpcHNlLmIxIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgQjFfTUFOSUZFU1QgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYjFcbiIgKyAiQnVuZGxlLVZlcnNpb246IDEuMFxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZyBCMl9MT0NBVElPTiA9ICJvcmcuZWNsaXBzZS5iMiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEIyX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmIyXG4iICsgIkJ1bmRsZS1WZXJzaW9uOiAxLjBcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdGF0ZSBzdGF0ZSA9IHBsYXRmb3JtQWRtaW4uZ2V0U3RhdGUoKTsKLQkJc3RhdGUuc2V0UmVzb2x2ZXIocGxhdGZvcm1BZG1pbi5nZXRSZXNvbHZlcigpKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjEgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEIxX01BTklGRVNUKSwgQjFfTE9DQVRJT04sIDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQjJfTUFOSUZFU1QpLCBCMl9MT0NBVElPTiwgMik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiMik7Ci0JCVN0YXRlRGVsdGEgZGVsdGEgPSBzdGF0ZS5yZXNvbHZlKCk7Ci0JCWFzc2VydFRydWUoIjEuMSIsIGNvbnRhaW5zKHN0YXRlLmdldFJlc29sdmVkQnVuZGxlcygpLCBiMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGNvbnRhaW5zKHN0YXRlLmdldFJlc29sdmVkQnVuZGxlcygpLCBiMikpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlbHRhW10gY2hhbmdlcyA9IGRlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjMiLCAyLCBjaGFuZ2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjQgLSAiICsgY2hhbmdlc1swXS5nZXRCdW5kbGUoKSwgKEJ1bmRsZURlbHRhLkFEREVEIHwgQnVuZGxlRGVsdGEuUkVTT0xWRUQpLCBjaGFuZ2VzWzBdLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjUgLSAiICsgY2hhbmdlc1sxXS5nZXRCdW5kbGUoKSwgKEJ1bmRsZURlbHRhLkFEREVEIHwgQnVuZGxlRGVsdGEuUkVTT0xWRUQpLCBjaGFuZ2VzWzFdLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RnVsbHlSZXNvbHZlZCgiMS42IiwgYjEpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZ1bGx5UmVzb2x2ZWQoIjEuNyIsIGIyKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZW1vdmUgYSByZXNvbHZlZCBidW5kbGUKLQkJc3RhdGUucmVtb3ZlQnVuZGxlKGIxKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgIWNvbnRhaW5zKHN0YXRlLmdldFJlc29sdmVkQnVuZGxlcygpLCBiMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMSIsIGNvbnRhaW5zKHN0YXRlLmdldFJlc29sdmVkQnVuZGxlcygpLCBiMikpOyAvLyROT04tTkxTLTEkCi0JCWRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQljaGFuZ2VzID0gZGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnRFcXVhbHMoIjIuMiIsIDEsIGNoYW5nZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMyIsIGIxLCBjaGFuZ2VzWzBdLmdldEJ1bmRsZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuNCIsIEJ1bmRsZURlbHRhLlJFTU9WRUQgfCBCdW5kbGVEZWx0YS5VTlJFU09MVkVELCBjaGFuZ2VzWzBdLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5kQWRkKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBCX0xPQ0FUSU9OID0gIm9yZy5lY2xpcHNlLmIiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBCX01BTklGRVNUID0gIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmJcbiIgKyAiQnVuZGxlLVZlcnNpb246IDEuMFxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0YXRlIHN0YXRlID0gcGxhdGZvcm1BZG1pbi5nZXRTdGF0ZSgpOwotCQlzdGF0ZS5zZXRSZXNvbHZlcihwbGF0Zm9ybUFkbWluLmdldFJlc29sdmVyKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMSA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQl9NQU5JRkVTVCksIEJfTE9DQVRJT04sIDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMiA9IHBsYXRmb3JtQWRtaW4uZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQl9NQU5JRkVTVCksIEJfTE9DQVRJT04sIDIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYjEpOwotCQlTdGF0ZURlbHRhIGRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZWx0YVtdIGNoYW5nZXMgPSBkZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMSwgY2hhbmdlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMS4xIiwgYjEsIGNoYW5nZXNbMF0uZ2V0QnVuZGxlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMS4yIiwgKEJ1bmRsZURlbHRhLkFEREVEIHwgQnVuZGxlRGVsdGEuUkVTT0xWRUQpLCBjaGFuZ2VzWzBdLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RnVsbHlSZXNvbHZlZCgiMS4zIiwgYjEpOyAvLyROT04tTkxTLTEkCi0JCXN0YXRlLnJlbW92ZUJ1bmRsZShiMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiMik7Ci0JCWRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDIsIGRlbHRhLmdldENoYW5nZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMi4xIiwgMSwgZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5VTlJFU09MVkVEIHwgQnVuZGxlRGVsdGEuUkVNT1ZFRCwgdHJ1ZSkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMiIsIGIxLCBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLlVOUkVTT0xWRUQgfCBCdW5kbGVEZWx0YS5SRU1PVkVELCB0cnVlKVswXS5nZXRCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIyLjMiLCAxLCBkZWx0YS5nZXRDaGFuZ2VzKEJ1bmRsZURlbHRhLlJFU09MVkVEIHwgQnVuZGxlRGVsdGEuQURERUQsIHRydWUpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIyLjMiLCBiMiwgZGVsdGEuZ2V0Q2hhbmdlcyhCdW5kbGVEZWx0YS5SRVNPTFZFRCB8IEJ1bmRsZURlbHRhLkFEREVELCB0cnVlKVswXS5nZXRCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZhbFJlc29sdmUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEluaXRpYWxTdGF0ZSgpOwotCQlTdGF0ZURlbHRhIGRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldENoYW5nZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjAgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCWFzc2VydE5vdE51bGwoIjAuMSIsIGIwKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGdWxseVJlc29sdmVkKCIwLjIiLCBiMCk7IC8vJE5PTi1OTFMtMSQKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJvcmcuZWNsaXBzZS5iMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAib3JnLm9zZ2kuZnJhbWV3b3JrIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIm9yZy5lY2xpcHNlLnAxOyBzcGVjaWZpY2F0aW9uLXZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjEgPSBudWxsOwotCQl0cnkgewotCQkJYjEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24obWFuaWZlc3QsICJvcmcuZWNsaXBzZS5iMSIsIDEpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0ZS5yZW1vdmVCdW5kbGUoMSk7Ci0JCQlzdGF0ZS5hZGRCdW5kbGUoYjEpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBCdW5kbGVEZXNjcmlwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJvcmcuZWNsaXBzZS5iMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAib3JnLm9zZ2kuZnJhbWV3b3JrLG9yZy5lY2xpcHNlLnAxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIm9yZy5lY2xpcHNlLnAyOyBzcGVjaWZpY2F0aW9uLXZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjIgPSBudWxsOwotCQl0cnkgewotCQkJYjIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24obWFuaWZlc3QsICJvcmcuZWNsaXBzZS5iMiIsIDIpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0ZS5yZW1vdmVCdW5kbGUoMik7Ci0JCQlzdGF0ZS5hZGRCdW5kbGUoYjIpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBCdW5kbGVEZXNjcmlwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJvcmcuZWNsaXBzZS5iMyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAib3JnLm9zZ2kuZnJhbWV3b3JrLG9yZy5lY2xpcHNlLnAyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIm9yZy5lY2xpcHNlLnAzOyBzcGVjaWZpY2F0aW9uLXZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjMgPSBudWxsOwotCQl0cnkgewotCQkJYjMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24obWFuaWZlc3QsICJvcmcuZWNsaXBzZS5iMyIsIDMpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0ZS5yZW1vdmVCdW5kbGUoMyk7Ci0JCQlzdGF0ZS5hZGRCdW5kbGUoYjMpOwotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBCdW5kbGVEZXNjcmlwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWRlbHRhID0gc3RhdGUucmVzb2x2ZShmYWxzZSk7Ci0JCWRlbHRhcyA9IGRlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCA0LCBkZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlNYXAgZGVsdGFzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspCi0JCQlkZWx0YXNNYXAucHV0KG5ldyBMb25nKGRlbHRhc1tpXS5nZXRCdW5kbGUoKS5nZXRCdW5kbGVJZCgpKSwgZGVsdGFzW2ldKTsKLQkJYXNzZXJ0Tm90TnVsbCgiMS4xIiwgZGVsdGFzTWFwLmdldChuZXcgTG9uZygxKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjEuMiIsIGRlbHRhc01hcC5nZXQobmV3IExvbmcoMikpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCIxLjMiLCBkZWx0YXNNYXAuZ2V0KG5ldyBMb25nKDMpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCAoQnVuZGxlRGVsdGEuUkVTT0xWRUQgfCBCdW5kbGVEZWx0YS5BRERFRCksICgoQnVuZGxlRGVsdGEpIGRlbHRhc01hcC5nZXQobmV3IExvbmcoMSkpKS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMi4yIiwgKEJ1bmRsZURlbHRhLlJFU09MVkVEIHwgQnVuZGxlRGVsdGEuQURERUQpLCAoKEJ1bmRsZURlbHRhKSBkZWx0YXNNYXAuZ2V0KG5ldyBMb25nKDIpKSkuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMyIsIChCdW5kbGVEZWx0YS5SRVNPTFZFRCB8IEJ1bmRsZURlbHRhLkFEREVEKSwgKChCdW5kbGVEZWx0YSkgZGVsdGFzTWFwLmdldChuZXcgTG9uZygzKSkpLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGUucmVtb3ZlQnVuZGxlKDEpOwotCQlkZWx0YSA9IHN0YXRlLnJlc29sdmUoZmFsc2UpOwotCQlkZWx0YXMgPSBkZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWIyID0gc3RhdGUuZ2V0QnVuZGxlKDIpOwotCQliMyA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjEiLCBmYWxzZSwgYjIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjMuMiIsIGZhbHNlLCBiMy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGVzdHMgYWRkaW5nIDMgbmV3IGJ1bmRsZXMgdG8gYW4gYWxyZWFkeSByZXNvbHZlZCBzdGF0ZSBhbmQgdGhlbgotCSAqIHJlc29sdmluZyBvbmx5IG9uZSBvZiB0aGUgYnVuZGxlcy4gVGhlIHJlc3VsdCBzaG91bGQgYmUgYWxsIDMgYWRkZWQKLQkgKiBidW5kbGVzIGJlaW5nIHJlc29sdmVkLiBUaGVuIHJlLXJlc29sdmluZyB0aGUgc2FtZSBidW5kbGUuIFRoZSByZXN1bHQKLQkgKiBzaG91bGQgYmUgb25seSB0aGUgb25lIGJ1bmRsZSBiZWluZyByZXNvbHZlZC4KLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlcmVzb2x2ZUJ1bmRsZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkSW5pdGlhbFN0YXRlKCk7Ci0JCVN0YXRlRGVsdGEgZGVsdGEgPSBzdGF0ZS5yZXNvbHZlKCk7Ci0JCUJ1bmRsZURlbHRhW10gZGVsdGFzID0gZGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMCA9IHN0YXRlLmdldEJ1bmRsZSgwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiMC4xIiwgYjApOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZ1bGx5UmVzb2x2ZWQoIjAuMiIsIGIwKTsgLy8kTk9OLU5MUy0xJAotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIm9yZy5lY2xpcHNlLmIxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJvcmcub3NnaS5mcmFtZXdvcmsiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAib3JnLmVjbGlwc2UucDE7IHNwZWNpZmljYXRpb24tdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQliMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihtYW5pZmVzdCwgIm9yZy5lY2xpcHNlLmIxIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXRlLnJlbW92ZUJ1bmRsZSgxKTsKLQkJCXN0YXRlLmFkZEJ1bmRsZShiMSk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gY3JlYXRlIEJ1bmRsZURlc2NyaXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIm9yZy5lY2xpcHNlLmIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJvcmcub3NnaS5mcmFtZXdvcmssb3JnLmVjbGlwc2UucDEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAib3JnLmVjbGlwc2UucDI7IHNwZWNpZmljYXRpb24tdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQliMiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihtYW5pZmVzdCwgIm9yZy5lY2xpcHNlLmIyIiwgMik7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXRlLnJlbW92ZUJ1bmRsZSgyKTsKLQkJCXN0YXRlLmFkZEJ1bmRsZShiMik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gY3JlYXRlIEJ1bmRsZURlc2NyaXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIm9yZy5lY2xpcHNlLmIzIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJvcmcub3NnaS5mcmFtZXdvcmssb3JnLmVjbGlwc2UucDIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAib3JnLmVjbGlwc2UucDM7IHNwZWNpZmljYXRpb24tdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQliMyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihtYW5pZmVzdCwgIm9yZy5lY2xpcHNlLmIzIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXRlLnJlbW92ZUJ1bmRsZSgzKTsKLQkJCXN0YXRlLmFkZEJ1bmRsZShiMyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gY3JlYXRlIEJ1bmRsZURlc2NyaXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtzdGF0ZS5nZXRCdW5kbGUoMSl9KTsKLQkJZGVsdGFzID0gZGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDMsIGRlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCU1hcCBkZWx0YXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykKLQkJCWRlbHRhc01hcC5wdXQobmV3IExvbmcoZGVsdGFzW2ldLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUlkKCkpLCBkZWx0YXNbaV0pOwotCQlhc3NlcnROb3ROdWxsKCIxLjEiLCBkZWx0YXNNYXAuZ2V0KG5ldyBMb25nKDEpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiMS4yIiwgZGVsdGFzTWFwLmdldChuZXcgTG9uZygyKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjEuMyIsIGRlbHRhc01hcC5nZXQobmV3IExvbmcoMykpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMSIsIChCdW5kbGVEZWx0YS5SRVNPTFZFRCB8IEJ1bmRsZURlbHRhLkFEREVEKSwgKChCdW5kbGVEZWx0YSkgZGVsdGFzTWFwLmdldChuZXcgTG9uZygxKSkpLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIyLjIiLCAoQnVuZGxlRGVsdGEuUkVTT0xWRUQgfCBCdW5kbGVEZWx0YS5BRERFRCksICgoQnVuZGxlRGVsdGEpIGRlbHRhc01hcC5nZXQobmV3IExvbmcoMikpKS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMi4zIiwgKEJ1bmRsZURlbHRhLlJFU09MVkVEIHwgQnVuZGxlRGVsdGEuQURERUQpLCAoKEJ1bmRsZURlbHRhKSBkZWx0YXNNYXAuZ2V0KG5ldyBMb25nKDMpKSkuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlkZWx0YSA9IHN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge3N0YXRlLmdldEJ1bmRsZSgxKX0pOwotCQlkZWx0YXMgPSBkZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgMywgZGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsdGFzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspCi0JCQlkZWx0YXNNYXAucHV0KG5ldyBMb25nKGRlbHRhc1tpXS5nZXRCdW5kbGUoKS5nZXRCdW5kbGVJZCgpKSwgZGVsdGFzW2ldKTsKLQkJYXNzZXJ0Tm90TnVsbCgiMy4xIiwgZGVsdGFzTWFwLmdldChuZXcgTG9uZygxKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIjMuMiIsIGRlbHRhc01hcC5nZXQobmV3IExvbmcoMikpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCIzLjMiLCBkZWx0YXNNYXAuZ2V0KG5ldyBMb25nKDMpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIzLjQiLCBCdW5kbGVEZWx0YS5SRVNPTFZFRCwgKChCdW5kbGVEZWx0YSkgZGVsdGFzTWFwLmdldChuZXcgTG9uZygxKSkpLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIzLjUiLCBCdW5kbGVEZWx0YS5SRVNPTFZFRCwgKChCdW5kbGVEZWx0YSkgZGVsdGFzTWFwLmdldChuZXcgTG9uZygyKSkpLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIzLjYiLCBCdW5kbGVEZWx0YS5SRVNPTFZFRCwgKChCdW5kbGVEZWx0YSkgZGVsdGFzTWFwLmdldChuZXcgTG9uZygzKSkpLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJU3RyaW5nIEIxX0xPQ0FUSU9OID0gIm9yZy5lY2xpcHNlLmIiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBCMV9SRVNPTFZFRCA9ICJCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5iMVxuIiArICJCdW5kbGUtVmVyc2lvbjogMS4wXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmluYWwgU3RyaW5nIEIxX1VOUkVTT0xWRUQgPSAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYjFcbiIgKyAiQnVuZGxlLVZlcnNpb246IDIuMFxuUmVxdWlyZS1CdW5kbGU6IG5vbi5leGlzdGFudC5idW5kbGVcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEIxX1JFU09MVkVEKSwgQjFfTE9DQVRJT04sIDEpOwotCQlhc3NlcnRUcnVlKCIwLjkiLCBzdGF0ZS5hZGRCdW5kbGUoYjEpKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZURlbHRhIGRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQliMSA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oYjEuZ2V0TG9jYXRpb24oKSk7Ci0JCUJ1bmRsZURlbHRhW10gY2hhbmdlcyA9IGRlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAxLCBjaGFuZ2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBiMSwgY2hhbmdlc1swXS5nZXRCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCAoQnVuZGxlRGVsdGEuQURERUQgfCBCdW5kbGVEZWx0YS5SRVNPTFZFRCksIGNoYW5nZXNbMF0uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGdWxseVJlc29sdmVkKCIxLjMiLCBiMSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS44IiwgY29udGFpbnMoc3RhdGUuZ2V0UmVzb2x2ZWRCdW5kbGVzKCksIGIxKSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjExID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHBhcnNlTWFuaWZlc3QoQjFfVU5SRVNPTFZFRCksIEIxX0xPQ0FUSU9OLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiMS44YiIsIHN0YXRlLnVwZGF0ZUJ1bmRsZShiMTEpKTsgLy8kTk9OLU5MUy0xJAotCQliMTEgPSBzdGF0ZS5nZXRCdW5kbGUoYjExLmdldEJ1bmRsZUlkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjkiLCAhY29udGFpbnMoc3RhdGUuZ2V0UmVzb2x2ZWRCdW5kbGVzKCksIGIxMSkpOyAvLyROT04tTkxTLTEkCi0JCWRlbHRhID0gc3RhdGUucmVzb2x2ZSgpOwotCQljaGFuZ2VzID0gZGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDIsIGNoYW5nZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlIYXNoTWFwIGRlbHRhc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykKLQkJCWRlbHRhc01hcC5wdXQoY2hhbmdlc1tpXS5nZXRCdW5kbGUoKSwgY2hhbmdlc1tpXSk7Ci0JCWFzc2VydE5vdE51bGwoIjIuMSIsIGRlbHRhc01hcC5nZXQoYjEpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCIyLjIiLCBkZWx0YXNNYXAuZ2V0KGIxMSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMi4zIiwgQnVuZGxlRGVsdGEuVU5SRVNPTFZFRCwgKChCdW5kbGVEZWx0YSkgZGVsdGFzTWFwLmdldChiMSkpLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIyLjQiLCBCdW5kbGVEZWx0YS5VUERBVEVELCAoKEJ1bmRsZURlbHRhKSBkZWx0YXNNYXAuZ2V0KGIxMSkpLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjExMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihwYXJzZU1hbmlmZXN0KEIxX1JFU09MVkVEKSwgQjFfTE9DQVRJT04sIDEpOwotCQlhc3NlcnRUcnVlKCIzLjAiLCBzdGF0ZS51cGRhdGVCdW5kbGUoYjExMSkpOyAvLyROT04tTkxTLTEkCi0JCWIxMTEgPSBzdGF0ZS5nZXRCdW5kbGUoYjExMS5nZXRCdW5kbGVJZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4xIiwgIWNvbnRhaW5zKHN0YXRlLmdldFJlc29sdmVkQnVuZGxlcygpLCBiMTExKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsdGEgPSBzdGF0ZS5yZXNvbHZlKCk7Ci0JCWNoYW5nZXMgPSBkZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydEVxdWFscygiMy4yIiwgMSwgY2hhbmdlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMy4xIiwgYjExMSwgY2hhbmdlc1swXS5nZXRCdW5kbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIzLjIiLCBCdW5kbGVEZWx0YS5VUERBVEVEIHwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGNoYW5nZXNbMF0uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGdWxseVJlc29sdmVkKCIzLjMiLCBiMTExKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25zKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuaG9zdDsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEhvc3QxMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5ob3N0MTAwIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuaG9zdDsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4xIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEhvc3QxMDEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5ob3N0MTAxIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuZnJhZzsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAidGVzdC5ob3N0OyBidW5kbGUtdmVyc2lvbj1cIlsxLjAuMCwyLjAuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RGcmFnMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInRlc3QuZnJhZzEwMCIsIDIpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LmZyYWc7IHNpbmdsZXRvbjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInRlc3QuaG9zdDsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0RnJhZzEwMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ0ZXN0LmZyYWcxMDEiLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5kZXBlbmRlbnQ7IHNpbmdsZXRvbjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJ0ZXN0Lmhvc3Q7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMC4xLDIuMC4wKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdERlcGVuZGVudCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ0ZXN0LmZyYWcxMDEiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0SG9zdDEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0RnJhZzEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0SG9zdDEwMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0RnJhZzEwMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0RGVwZW5kZW50KTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRGYWxzZSgiMS4wIiwgdGVzdEhvc3QxMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCB0ZXN0SG9zdDEwMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjIiLCB0ZXN0RnJhZzEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMyIsIHRlc3RGcmFnMTAxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwgdGVzdERlcGVuZGVudC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbnNTYW1lVmVyc2lvbigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyB0aGlzIGlzIGEgdGVzdGNhc2UgdG8gaGFuZGxlIGhvdyBQREUgYnVpbGQgaXMgdXNpbmcgdGhlIHN0YXRlCi0JCS8vIHdpdGggbXVsdGlwbGUgc2luZ2xldG9uIGJ1bmRsZXMgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgQlNOIGFuZCB2ZXJzaW9uCi0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuaG9zdDsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEhvc3QxMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5ob3N0MTAwIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuaG9zdDsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEhvc3QxMDEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5ob3N0MTAxIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuZnJhZzsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAidGVzdC5ob3N0OyBidW5kbGUtdmVyc2lvbj1cIlsxLjAuMCwyLjAuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RGcmFnMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInRlc3QuZnJhZzEwMCIsIDIpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LmZyYWc7IHNpbmdsZXRvbjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInRlc3QuaG9zdDsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0RnJhZzEwMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ0ZXN0LmZyYWcxMDEiLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0SG9zdDEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0RnJhZzEwMCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3RIb3N0MTAxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3RGcmFnMTAxKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCB0ZXN0SG9zdDEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjEiLCB0ZXN0SG9zdDEwMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIHRlc3RGcmFnMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjEuMyIsIHRlc3RGcmFnMTAxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uc1NlbGVjdGlvbjEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXMKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAic2RrOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInBsYXRmb3JtOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc2RrMTAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAic2RrMTAiLCAwKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicGxhdGZvcm07ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicmNwOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcGxhdGZvcm0xMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJwbGF0Zm9ybTEwIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJjcDsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcDEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInJjcDEwIiwgMik7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImdlZjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJyY3A7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwxLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZWYxMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJnZWYxMCIsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKHNkazEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHBsYXRmb3JtMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUocmNwMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VmMTApOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgc2RrMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBwbGF0Zm9ybTEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgcmNwMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBnZWYxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJzZGs7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicGxhdGZvcm07IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwyLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBzZGsyMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJzZGsyMCIsIDQpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJwbGF0Zm9ybTsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjIuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJyY3A7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwyLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBwbGF0Zm9ybTIwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInBsYXRmb3JtMjAiLCA1KTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicmNwOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcmNwMjAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAicmNwMjAiLCA2KTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShzZGsyMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShwbGF0Zm9ybTIwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHJjcDIwKTsKLQkJc3RhdGUucmVzb2x2ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgc2RrMjAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjEiLCBwbGF0Zm9ybTIwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4yIiwgcmNwMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjMiLCBnZWYxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIyLjQiLCBzZGsxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIyLjUiLCBwbGF0Zm9ybTEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjIuNiIsIHJjcDIwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uc1NlbGVjdGlvbjIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXM7IHRlc3Qgd2l0aCBjeWNsZSBhZGRlZAotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJzZGs7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicGxhdGZvcm07IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwyLjBdXCIsIGN5Y2xlIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc2RrMTAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAic2RrMTAiLCAwKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicGxhdGZvcm07ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicmNwOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcGxhdGZvcm0xMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJwbGF0Zm9ybTEwIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJjcDsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcDEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInJjcDEwIiwgMik7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImdlZjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJyY3A7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwxLjBdXCIsIHNkayIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlZjEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImdlZjEwIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImN5Y2xlOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImdlZiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGN5Y2xlMTAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiZ2VmMTAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShzZGsxMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShwbGF0Zm9ybTEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHJjcDEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGdlZjEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGN5Y2xlMTApOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgc2RrMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBwbGF0Zm9ybTEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgcmNwMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBnZWYxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGN5Y2xlMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAic2RrOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInBsYXRmb3JtOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc2RrMjAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAic2RrMjAiLCA1KTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicGxhdGZvcm07ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicmNwOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcGxhdGZvcm0yMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJwbGF0Zm9ybTIwIiwgNik7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJjcDsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjIuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcDIwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInJjcDIwIiwgNyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUoc2RrMjApOwotCQlzdGF0ZS5hZGRCdW5kbGUocGxhdGZvcm0yMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShyY3AyMCk7Ci0JCXN0YXRlLnJlc29sdmUoZmFsc2UpOwotCi0JCWFzc2VydFRydWUoIjIuMCIsIHNkazIwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4xIiwgcGxhdGZvcm0yMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMiIsIHJjcDEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgZ2VmMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjQiLCBjeWNsZTEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjIuNSIsIHNkazEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjIuNiIsIHBsYXRmb3JtMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMi43IiwgcmNwMjAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25zU2VsZWN0aW9uMygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXM7IHdpdGggZnJhZ21lbnRzCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInNkazsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJwbGF0Zm9ybTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLDIuMF1cIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHNkazEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInNkazEwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInNkay5mcmFnOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAic2RrIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc2RrX2ZyYWcxMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJzZGsuZnJhZzEwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInNkay5mcmFnMjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInNkazsgYnVuZGxlLXZlcnNpb249Mi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc2RrX2ZyYWcyMTAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAic2RrLmZyYWcyMTAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicGxhdGZvcm07ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicmNwOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcGxhdGZvcm0xMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJwbGF0Zm9ybTEwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInBsYXRmb3JtLmZyYWc7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJwbGF0Zm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHBsYXRmb3JtX2ZyYWcxMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJwbGF0Zm9ybS5mcmFnMTAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicGxhdGZvcm0uZnJhZzI7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJwbGF0Zm9ybTsgYnVuZGxlLXZlcnNpb249Mi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcGxhdGZvcm1fZnJhZzIxMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJwbGF0Zm9ybS5mcmFnMjEwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJjcDsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcDEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInJjcDEwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJjcC5mcmFnOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAicmNwIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcmNwX2ZyYWcxMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJyY3AuZnJhZzEwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJjcC5mcmFnMjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInJjcDsgYnVuZGxlLXZlcnNpb249Mi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcmNwX2ZyYWcyMTAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAicmNwLmZyYWcyMTAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZ2VmOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInJjcDsgYnVuZGxlLXZlcnNpb249XCJbMS4wLDEuMF1cIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlZjEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImdlZjEwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUoc2RrMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUoc2RrX2ZyYWcxMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzZGtfZnJhZzIxMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShwbGF0Zm9ybTEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHBsYXRmb3JtX2ZyYWcxMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShwbGF0Zm9ybV9mcmFnMjEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHJjcDEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHJjcF9mcmFnMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUocmNwX2ZyYWcyMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VmMTApOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgc2RrMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjAuMSIsIHNka19mcmFnMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMS4wLjIiLCBzZGtfZnJhZzIxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIHBsYXRmb3JtMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEuMSIsIHBsYXRmb3JtX2ZyYWcxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjEuMiIsIHBsYXRmb3JtX2ZyYWcyMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCByY3AxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMi4xIiwgcmNwX2ZyYWcxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjIuMiIsIHJjcF9mcmFnMjEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZ2VmMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAic2RrOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInBsYXRmb3JtOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc2RrMjAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAic2RrMjAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicGxhdGZvcm07ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicmNwOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcGxhdGZvcm0yMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJwbGF0Zm9ybTIwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJjcDsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjIuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcDIwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInJjcDIwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUoc2RrMjApOwotCQlzdGF0ZS5hZGRCdW5kbGUocGxhdGZvcm0yMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShyY3AyMCk7Ci0JCXN0YXRlLnJlc29sdmUoZmFsc2UpOwotCi0JCWFzc2VydFRydWUoIjIuMCIsIHNkazIwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4wLjEiLCBzZGtfZnJhZzEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4wLjIiLCBzZGtfZnJhZzIxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMSIsIHBsYXRmb3JtMjAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjEuMSIsIHBsYXRmb3JtX2ZyYWcxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMS4yIiwgcGxhdGZvcm1fZnJhZzIxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMiIsIHJjcDEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4yLjEiLCByY3BfZnJhZzEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgZ2VmMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMi40Iiwgc2RrMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMi41IiwgcGxhdGZvcm0xMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIyLjYiLCByY3AyMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIyLjIuMiIsIHJjcF9mcmFnMjEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uc1NlbGVjdGlvbjQoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJaW50IGJ1bmRsZUlEID0gMDsKLQkJLy8gdGVzdCB0aGUgc2VsZWN0aW9uIGFsZ29yaXRobSBvZiB0aGUgcmVzb2x2ZXIgdG8gcGljayB0aGUgYnVuZGxlcyB3aGljaAotCQkvLyByZXNvbHZlIHRoZSBsYXJnZXN0IHNldCBvZiBidW5kbGVzOyB3aXRoIGZyYWdtZW50cyB1c2luZyBJbXBvcnQtUGFja2FnZQotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJzZGs7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAic2RrOyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJwbGF0Zm9ybTsgdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc2RrMTAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAic2RrMTAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAic2RrLmZyYWc7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJzZGsiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBzZGtfZnJhZzEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInNkay5mcmFnMTAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAic2RrLmZyYWcyOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAic2RrOyBidW5kbGUtdmVyc2lvbj0yLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBzZGtfZnJhZzIxMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJzZGsuZnJhZzIxMCIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJwbGF0Zm9ybTsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJwbGF0Zm9ybTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAicmNwOyB2ZXJzaW9uPVwiWzEuMCwyLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBwbGF0Zm9ybTEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInBsYXRmb3JtMTAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicGxhdGZvcm0uZnJhZzsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInBsYXRmb3JtIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcGxhdGZvcm1fZnJhZzEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInBsYXRmb3JtLmZyYWcxMCIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJwbGF0Zm9ybS5mcmFnMjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInBsYXRmb3JtOyBidW5kbGUtdmVyc2lvbj0yLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBwbGF0Zm9ybV9mcmFnMjEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInBsYXRmb3JtLmZyYWcyMTAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicmNwOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInJjcDsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiByY3AxMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJyY3AxMCIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJyY3AuZnJhZzsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInJjcCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcF9mcmFnMTAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAicmNwLmZyYWcxMCIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJyY3AuZnJhZzI7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJyY3A7IGJ1bmRsZS12ZXJzaW9uPTIuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcF9mcmFnMjEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInJjcC5mcmFnMjEwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImdlZjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJyY3A7IHZlcnNpb249XCJbMS4wLDEuMF1cIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlZjEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImdlZjEwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUoc2RrMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUoc2RrX2ZyYWcxMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzZGtfZnJhZzIxMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShwbGF0Zm9ybTEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHBsYXRmb3JtX2ZyYWcxMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShwbGF0Zm9ybV9mcmFnMjEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHJjcDEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHJjcF9mcmFnMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUocmNwX2ZyYWcyMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VmMTApOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgc2RrMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjAuMSIsIHNka19mcmFnMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMS4wLjIiLCBzZGtfZnJhZzIxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIHBsYXRmb3JtMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEuMSIsIHBsYXRmb3JtX2ZyYWcxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjEuMiIsIHBsYXRmb3JtX2ZyYWcyMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCByY3AxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMi4xIiwgcmNwX2ZyYWcxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjIuMiIsIHJjcF9mcmFnMjEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZ2VmMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAic2RrOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInNkazsgdmVyc2lvbj0yLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAicGxhdGZvcm07IHZlcnNpb249XCJbMS4wLDIuMF1cIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHNkazIwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInNkazIwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInBsYXRmb3JtOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInBsYXRmb3JtOyB2ZXJzaW9uPTIuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJyY3A7IHZlcnNpb249XCJbMS4wLDIuMF1cIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHBsYXRmb3JtMjAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAicGxhdGZvcm0yMCIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJyY3A7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJyY3A7IHZlcnNpb249Mi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjIuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcDIwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInJjcDIwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUoc2RrMjApOwotCQlzdGF0ZS5hZGRCdW5kbGUocGxhdGZvcm0yMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShyY3AyMCk7Ci0JCXN0YXRlLnJlc29sdmUoZmFsc2UpOwotCi0JCWFzc2VydFRydWUoIjIuMCIsIHNkazIwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4wLjEiLCBzZGtfZnJhZzEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4wLjIiLCBzZGtfZnJhZzIxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMSIsIHBsYXRmb3JtMjAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjEuMSIsIHBsYXRmb3JtX2ZyYWcxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMS4yIiwgcGxhdGZvcm1fZnJhZzIxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMiIsIHJjcDEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4yLjEiLCByY3BfZnJhZzEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgZ2VmMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMi40Iiwgc2RrMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMi41IiwgcGxhdGZvcm0xMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIyLjYiLCByY3AyMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIyLjIuMiIsIHJjcF9mcmFnMjEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uc1NlbGVjdGlvbjUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQotCQlsb25nIGlkID0gMDsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYmFzZTsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGJhc2UxMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJiYXNlMTAiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJiYXNlOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4xIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCwgIkoyU0UtMS42Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYmFzZTExID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImJhc2UxMSIsIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJlcXVpcmVzOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImJhc2U7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwxLjEpXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiByZXF1aXJlczEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInJlcXVpcmVzMTAiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJyZXF1aXJlczsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJiYXNlOyBidW5kbGUtdmVyc2lvbj1cIlsxLjEsMS4yKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcmVxdWlyZXMxMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJyZXF1aXJlczExIiwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZnJhZzsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInJlcXVpcmVzOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMS4xKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZnJhZzEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImZyYWcxMCIsIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImZyYWc7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJyZXF1aXJlczsgYnVuZGxlLXZlcnNpb249XCJbMS4xLDEuMilcIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGZyYWcxMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJmcmFnMTEiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJmcmFnYjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInJlcXVpcmVzOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMS4xKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImZyYWdiOyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGZyYWdiMTAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiZnJhZzEwIiwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZnJhZ2I7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJyZXF1aXJlczsgYnVuZGxlLXZlcnNpb249XCJbMS4wLDEuMSlcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJmcmFnYjsgdmVyc2lvbj0xLjEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBmcmFnYjExID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImZyYWcxMSIsIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImltcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiZnJhZ2I7IHZlcnNpb249XCJbMS4wLDEuMF1cIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGltcG9ydDEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImltcG9ydDEwIiwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiaW1wb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJmcmFnYjsgdmVyc2lvbj1cIlsxLjEsMS4xXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gaW1wb3J0MTEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiaW1wb3J0MTEiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShiYXNlMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUoYmFzZTExKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHJlcXVpcmVzMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUocmVxdWlyZXMxMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShmcmFnMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZnJhZzExKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGZyYWdiMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZnJhZ2IxMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShpbXBvcnQxMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShpbXBvcnQxMSk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRUcnVlKCIxLjAiLCBiYXNlMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCByZXF1aXJlczEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgZnJhZzEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZnJhZ2IxMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGltcG9ydDExLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjEuNSIsIGJhc2UxMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjYiLCByZXF1aXJlczExLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjEuNyIsIGZyYWcxMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjgiLCBmcmFnYjEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjEuOSIsIGltcG9ydDEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uc1NlbGVjdGlvbjYoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXMKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAic2RrOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInBsYXRmb3JtOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc2RrMTAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAic2RrMTAiLCAwKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicGxhdGZvcm07ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicmNwOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcGxhdGZvcm0xMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJwbGF0Zm9ybTEwIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJjcDsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcDEwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInJjcDEwIiwgMik7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImdlZjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJyY3A7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwxLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZWYxMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJnZWYxMCIsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKHNkazEwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHBsYXRmb3JtMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUocmNwMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZ2VmMTApOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgc2RrMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBwbGF0Zm9ybTEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgcmNwMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBnZWYxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJzZGs7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicGxhdGZvcm07IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwyLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBzZGsyMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJzZGsyMCIsIDQpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJwbGF0Zm9ybTsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjIuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJyY3A7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwyLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBwbGF0Zm9ybTIwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInBsYXRmb3JtMjAiLCA1KTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicmNwOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcmNwMjAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAicmNwMjAiLCA2KTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLnJlbW92ZUJ1bmRsZShzZGsxMCk7Ci0JCXN0YXRlLnJlbW92ZUJ1bmRsZShwbGF0Zm9ybTEwKTsKLQkJc3RhdGUucmVtb3ZlQnVuZGxlKHJjcDEwKTsKLQkJc3RhdGUucmVtb3ZlQnVuZGxlKGdlZjEwKTsKLQotCQkvLyByZW9yZGVyIHRoZSBidW5kbGVzIHRvIHRlc3QgdGhhdCBvcmRlciBvZiBidW5kbGVzIGRvZXMgbm90IGVmZmVjdCByZXNvbHV0aW9uIG91dGNvbWUKLQkJc3RhdGUuYWRkQnVuZGxlKHNkazIwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHBsYXRmb3JtMjApOwotCQlzdGF0ZS5hZGRCdW5kbGUocmNwMjApOwotCQlzdGF0ZS5hZGRCdW5kbGUoc2RrMTApOwotCQlzdGF0ZS5hZGRCdW5kbGUocGxhdGZvcm0xMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShyY3AxMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnZWYxMCk7Ci0JCXN0YXRlLnJlc29sdmUoZmFsc2UpOwotCi0JCWFzc2VydFRydWUoIjIuMCIsIHNkazIwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4xIiwgcGxhdGZvcm0yMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMiIsIHJjcDEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgZ2VmMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMi40Iiwgc2RrMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMi41IiwgcGxhdGZvcm0xMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIyLjYiLCByY3AyMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbnNTZWxlY3Rpb243KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCWxvbmcgaWQgPSAwOwotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXMKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAic2luZ2xldG9uOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInNpbmdsZXRvbiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHNpbmdsZXRvbjEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAic2luZ2xldG9uMSIsIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInNpbmdsZXRvbiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhO3ZlcnNpb249MS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJhMSIsIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImIiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShzaW5nbGV0b24xKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGExKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgc2luZ2xldG9uMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIGExLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgYi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInNpbmdsZXRvbjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJzaW5nbGV0b24iKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBzaW5nbGV0b24yID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInNpbmdsZXRvbjIiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJzaW5nbGV0b24iKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYTt2ZXJzaW9uPTEuMC4xIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYTIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYTIiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShzaW5nbGV0b24yKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEyKTsKLQkJc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7c2luZ2xldG9uMSwgc2luZ2xldG9uMiwgYTEsIGEyfSk7Ci0KLQkJYXNzZXJ0RmFsc2UoIjIuMCIsIHNpbmdsZXRvbjEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjEiLCBzaW5nbGV0b24yLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4yIiwgYTEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjMiLCBhMi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuNCIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGltcG9ydHMgPSBiLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGltcG9ydHMiLCAxLCBpbXBvcnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGV4cG9ydGVyIiwgYTIsIGltcG9ydHNbMF0uZ2V0RXhwb3J0ZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uU2luZ2xldG9uc1NhbWVWZXJzaW9uKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCS8vIHRoaXMgaXMgYSB0ZXN0Y2FzZSB0byBoYW5kbGUgaG93IFBERSBidWlsZCBpcyB1c2luZyB0aGUgc3RhdGUKLQkJLy8gd2l0aCBtdWx0aXBsZSBzaW5nbGV0b24gYnVuZGxlcyBpbnN0YWxsZWQgd2l0aCB0aGUgc2FtZSBCU04gYW5kIHZlcnNpb24KLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5ob3N0Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEhvc3QxMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5ob3N0MTAwIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuaG9zdDsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEhvc3QxMDEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5ob3N0MTAxIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuZnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInRlc3QuaG9zdDsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0RnJhZzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ0ZXN0LmZyYWcxMDAiLCAyKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5mcmFnOyBzaW5nbGV0b246PXRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJ0ZXN0Lmhvc3Q7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMC4wLDIuMC4wKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEZyYWcxMDEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5mcmFnMTAxIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUodGVzdEhvc3QxMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUodGVzdEZyYWcxMDApOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0SG9zdDEwMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0RnJhZzEwMSk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgdGVzdEhvc3QxMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCB0ZXN0SG9zdDEwMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIHRlc3RGcmFnMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgdGVzdEZyYWcxMDEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2l0aXZlVXNlcygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYTFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImExXzEwMCIsIDApOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYTJfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImEyXzEwMCIsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJiOyB1c2VzOj1hIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImE7YnVuZGxlLXN5bWJvbGljLW5hbWU9QTIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYjFfMTAwIiwgMik7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkMxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImM7IHVzZXM6PWIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJjMV8xMDAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRDEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYSwgYyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGQxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJkMV8xMDAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShhMV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoYTJfMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIxXzEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjMV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZDFfMTAwKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGIxUmVzb2x2ZWRJbXBvcnRzID0gYjFfMTAwLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkMVJlc29sdmVkSW1wb3J0cyA9IGQxXzEwMC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaXNDb25zaXN0ZW50ID0gaXNDb25zaXN0ZW50KGIxUmVzb2x2ZWRJbXBvcnRzLCBkMVJlc29sdmVkSW1wb3J0cyk7Ci0JCWFzc2VydE51bGwoIjEuMSBQYWNrYWdlcyBhcmUgbm90IGNvbnNpc3RlbnQ6ICIgKyBpc0NvbnNpc3RlbnQsIGlzQ29uc2lzdGVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImI7IHVzZXM6PWEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYTtidW5kbGUtc3ltYm9saWMtbmFtZT1BMSIpOyAvLyROT04tTkxTLTEkCi0JCWIxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJiMV8xMDAiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZS51cGRhdGVCdW5kbGUoYjFfMTAwKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWIxUmVzb2x2ZWRJbXBvcnRzID0gYjFfMTAwLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlkMVJlc29sdmVkSW1wb3J0cyA9IGQxXzEwMC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJaXNDb25zaXN0ZW50ID0gaXNDb25zaXN0ZW50KGIxUmVzb2x2ZWRJbXBvcnRzLCBkMVJlc29sdmVkSW1wb3J0cyk7Ci0JCWFzc2VydE51bGwoIjEuMiBQYWNrYWdlcyBhcmUgbm90IGNvbnNpc3RlbnQ6ICIgKyBpc0NvbnNpc3RlbnQsIGlzQ29uc2lzdGVudCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVFeHBvcnRzVXNlczAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkExIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImE7IHZlcnNpb249Mi4wOyB1c2VzOj1kLCBkOyB2ZXJzaW9uPTIuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGExXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJhMV8xMDAiLCAwKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQTIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYTsgdmVyc2lvbj0xLjA7IHVzZXM6PWQsIGQ7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYTJfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImEyXzEwMCIsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJiLCBiOyBtYW5kYXRvcnk6PVwidGVzdFwiOyB0ZXN0PXZhbHVlOyB1c2VzOj1kIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImE7YnVuZGxlLXN5bWJvbGljLW5hbWU9QTIsIGQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiMV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYjFfMTAwIiwgMik7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkMxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImM7IHVzZXM6PWIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYjsgdGVzdD12YWx1ZSwgZCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJjMV8xMDAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRDEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYSwgYywgZCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGQxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJkMV8xMDAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShhMV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoYTJfMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIxXzEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjMV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZDFfMTAwKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGIxUmVzb2x2ZWRJbXBvcnRzID0gYjFfMTAwLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkMVJlc29sdmVkSW1wb3J0cyA9IGQxXzEwMC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaXNDb25zaXN0ZW50ID0gaXNDb25zaXN0ZW50KGIxUmVzb2x2ZWRJbXBvcnRzLCBkMVJlc29sdmVkSW1wb3J0cyk7Ci0JCWFzc2VydE51bGwoIjEuMSBQYWNrYWdlcyBhcmUgbm90IGNvbnNpc3RlbnQ6ICIgKyBpc0NvbnNpc3RlbnQsIGlzQ29uc2lzdGVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImI7IHVzZXM6PWEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYTtidW5kbGUtc3ltYm9saWMtbmFtZT1BMSIpOyAvLyROT04tTkxTLTEkCi0JCWIxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJiMV8xMDAiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZS51cGRhdGVCdW5kbGUoYjFfMTAwKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWIxUmVzb2x2ZWRJbXBvcnRzID0gYjFfMTAwLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlkMVJlc29sdmVkSW1wb3J0cyA9IGQxXzEwMC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJaXNDb25zaXN0ZW50ID0gaXNDb25zaXN0ZW50KGIxUmVzb2x2ZWRJbXBvcnRzLCBkMVJlc29sdmVkSW1wb3J0cyk7Ci0JCWFzc2VydE51bGwoIjEuMiBQYWNrYWdlcyBhcmUgbm90IGNvbnNpc3RlbnQ6ICIgKyBpc0NvbnNpc3RlbnQsIGlzQ29uc2lzdGVudCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZUJ1bmRsZVVzZXMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJaW50IGlkID0gMDsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYV8xMDAiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYV8yMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYV8yMDAiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJiOyB1c2VzOj1hIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkE7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYl8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYl8xMDAiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJjOyB1c2VzOj1iIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkEsIEIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJjXzEwMCIsIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKGFfMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGJfMTAwKTsKLQkJLy8gZmlyc3QgcmVzb2x2ZSBqdXN0IEEgYW5kIEIKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIwLjEiLCBhXzEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuMiIsIGJfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbm93IGFkZCBBIHYyIGFuZCByZXNvbHZlIGl0Ci0JCXN0YXRlLmFkZEJ1bmRsZShhXzIwMCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYV8yMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBub3cgYWRkIEMgYW5kIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBnZXQgcGFja2FnZXMgZnJvbSBBIHYyCi0JCXN0YXRlLmFkZEJ1bmRsZShjXzEwMCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgY18xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGMxUmVzb2x2ZWRJbXBvcnRzID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoY18xMDApOwotCQlhc3NlcnRUcnVlKCIyLjEiLCBjMVJlc29sdmVkSW1wb3J0cy5sZW5ndGggPT0gMik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGluZGV4ID0gYzFSZXNvbHZlZEltcG9ydHNbMF0uZ2V0TmFtZSgpLmVxdWFscygiYSIpID8gMCA6IGMxUmVzb2x2ZWRJbXBvcnRzWzFdLmdldE5hbWUoKS5lcXVhbHMoImEiKSA/IDEgOiAtMTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjIuMiIsIGluZGV4ID49IDApOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMi4yIiwgYzFSZXNvbHZlZEltcG9ydHNbaW5kZXhdLmdldEV4cG9ydGVyKCksIGFfMTAwKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDeWNsaWNUcmFuc2l0aXZlVXNlcygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhOyB1c2VzOj1kIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYTFfMTAwIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkEyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImE7IHVzZXM6PWQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiZCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEyXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJhMl8xMDAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQjEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYjsgdXNlczo9YSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJhO2J1bmRsZS1zeW1ib2xpYy1uYW1lPUEyIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImIxXzEwMCIsIDIpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJjOyB1c2VzOj1iIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjMV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYzFfMTAwIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkQxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImQ7IHVzZXM6PWMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYSwgYyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGQxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJkMV8xMDAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShhMV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoYTJfMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIxXzEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjMV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoZDFfMTAwKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydEZhbHNlKCIwLjEiLCBhMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjIiLCBhMl8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjMiLCBiMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjQiLCBjMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjUiLCBkMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGIxUmVzb2x2ZWRJbXBvcnRzID0gYjFfMTAwLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkMVJlc29sdmVkSW1wb3J0cyA9IGQxXzEwMC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaXNDb25zaXN0ZW50ID0gaXNDb25zaXN0ZW50KGIxUmVzb2x2ZWRJbXBvcnRzLCBkMVJlc29sdmVkSW1wb3J0cyk7Ci0JCWFzc2VydE51bGwoIjEuMSBQYWNrYWdlcyBhcmUgbm90IGNvbnNpc3RlbnQ6ICIgKyBpc0NvbnNpc3RlbnQsIGlzQ29uc2lzdGVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImI7IHVzZXM6PWEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYTtidW5kbGUtc3ltYm9saWMtbmFtZT1BMSIpOyAvLyROT04tTkxTLTEkCi0JCWIxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJiMV8xMDAiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZS51cGRhdGVCdW5kbGUoYjFfMTAwKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydFRydWUoIjIuMSIsIGExXzEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIyLjIiLCBhMl8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjMiLCBiMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjQiLCBjMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjUiLCBkMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWIxUmVzb2x2ZWRJbXBvcnRzID0gYjFfMTAwLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlkMVJlc29sdmVkSW1wb3J0cyA9IGQxXzEwMC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJaXNDb25zaXN0ZW50ID0gaXNDb25zaXN0ZW50KGIxUmVzb2x2ZWRJbXBvcnRzLCBkMVJlc29sdmVkSW1wb3J0cyk7Ci0JCWFzc2VydE51bGwoIjMuMSBQYWNrYWdlcyBhcmUgbm90IGNvbnNpc3RlbnQ6ICIgKyBpc0NvbnNpc3RlbnQsIGlzQ29uc2lzdGVudCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RnJhZ21lbnRUcmFuc2l0aXZlVXNlcygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhOyB1c2VzOj1kIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYTFfMTAwIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkExLkZyYWciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJBMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhLmZyYWc7IHVzZXM6PWEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMWZyYWdfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImExZnJhZ18xMDAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQTIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYTsgdXNlczo9ZCwgYS5mcmFnOyB1c2VzOj1hIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMl8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYTJfMTAwIiwgMik7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImI7IHVzZXM6PWEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYTtidW5kbGUtc3ltYm9saWMtbmFtZT1BMiwgYS5mcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYjFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImIxXzEwMCIsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJjOyB1c2VzOj1iIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjMV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYzFfMTAwIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkQxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImQ7IHVzZXM6PWMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYS5mcmFnLCBjIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZDFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImQxXzEwMCIsIDUpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKGExXzEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhMWZyYWdfMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEyXzEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiMV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoYzFfMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGQxXzEwMCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRGYWxzZSgiMC4xIiwgYTFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC4yIiwgYTJfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC4zIiwgYjFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC40IiwgYzFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC41IiwgZDFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiMVJlc29sdmVkSW1wb3J0cyA9IGIxXzEwMC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZDFSZXNvbHZlZEltcG9ydHMgPSBkMV8xMDAuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGlzQ29uc2lzdGVudCA9IGlzQ29uc2lzdGVudChiMVJlc29sdmVkSW1wb3J0cywgZDFSZXNvbHZlZEltcG9ydHMpOwotCQlhc3NlcnROdWxsKCIxLjEgUGFja2FnZXMgYXJlIG5vdCBjb25zaXN0ZW50OiAiICsgaXNDb25zaXN0ZW50LCBpc0NvbnNpc3RlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJiOyB1c2VzOj1hIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImE7YnVuZGxlLXN5bWJvbGljLW5hbWU9QTEiKTsgLy8kTk9OLU5MUy0xJAotCQliMV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYjFfMTAwIiwgMik7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGUudXBkYXRlQnVuZGxlKGIxXzEwMCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRUcnVlKCIyLjEiLCBhMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMi4yIiwgYTJfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgYjFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi40IiwgYzFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi41IiwgZDFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQliMVJlc29sdmVkSW1wb3J0cyA9IGIxXzEwMC5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJZDFSZXNvbHZlZEltcG9ydHMgPSBkMV8xMDAuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWlzQ29uc2lzdGVudCA9IGlzQ29uc2lzdGVudChiMVJlc29sdmVkSW1wb3J0cywgZDFSZXNvbHZlZEltcG9ydHMpOwotCQlhc3NlcnROdWxsKCIzLjEgUGFja2FnZXMgYXJlIG5vdCBjb25zaXN0ZW50OiAiICsgaXNDb25zaXN0ZW50LCBpc0NvbnNpc3RlbnQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50VXNlczAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCWxvbmcgaWQgPSAwOwotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkExIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQzIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQTEuRnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkExIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImI7IGdvb2Q9dHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGExZnJhZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQjEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYjsgZ29vZD10cnVlOyB1c2VzOj1jIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImM7IGdvb2Q9dHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJjOyBnb29kPXRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQzIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYzsgYmFkPXRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjMiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYTEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYTFmcmFnKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMyKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydFRydWUoIjAuMSIsIGExLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjAuMiIsIGExZnJhZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuMyIsIGIxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC40IiwgYzEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjUiLCBjMi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50VXNlczAyKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCWxvbmcgaWQgPSAwOwotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlEaWN0aW9uYXJ5W10gcHJvcHMgPSBuZXcgRGljdGlvbmFyeVtdIHtuZXcgSGFzaHRhYmxlKCl9OwotCQlwcm9wc1swXS5wdXQoIm9zZ2kucmVzb2x2ZXJNb2RlIiwgImRldmVsb3BtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzdGF0ZS5zZXRQbGF0Zm9ybVByb3BlcnRpZXMocHJvcHMpOwotCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkExIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQzIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQTEuRnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkExIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImI7IGdvb2Q9dHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGExZnJhZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQjEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYjsgZ29vZD10cnVlOyB1c2VzOj1jIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImM7IGdvb2Q9dHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJjOyBnb29kPXRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQzIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYzsgYmFkPXRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjMiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYTEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYTFmcmFnKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMyKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydFRydWUoIjAuMSIsIGExLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdXNlcyBjb25zdHJhaW50cyBhcmUgaWdub3JlZCB3aGVuIGluIGRldiBtb2RlIChzZWUgMjYxODQ5KQotCQlhc3NlcnRUcnVlKCIwLjIiLCBhMWZyYWcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjMiLCBiMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuNCIsIGMxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC41IiwgYzIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDeWNsaWNVc2VzRXhwb3J0RHJvcCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJXIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImE7IGI7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImMsIGEsIGIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB3MV8xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidzFfMTAwIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIlgiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJkIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24geDFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIngxXzEwMCIsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJZIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHkxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ5MV8xMDAiLCAyKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiWiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhOyB2ZXJzaW9uID0gMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gejFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInoxXzEwMCIsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKHcxXzEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh4MV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoeTFfMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHoxXzEwMCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRUcnVlKCIwLjEiLCB3MV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjIiLCB4MV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjMiLCB5MV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjQiLCB6MV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygiMS4xIiwgMSwgdzFfMTAwLmdldFNlbGVjdGVkRXhwb3J0cygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCAiYiIsIHcxXzEwMC5nZXRTZWxlY3RlZEV4cG9ydHMoKVswXS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZhbFBlbmRpbmcoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIHdNYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJd01hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQl3TWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiVyIpOyAvLyROT04tTkxTLTEkCi0JCXdNYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQl3TWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImE7IGI7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJd01hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJhLCBiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdzFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCB3TWFuaWZlc3QsICJ3MV8xMDAiLCAwKTsgLy8kTk9OLU5MUy0xJAotCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIlgiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHgxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ4MV8xMDAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiWSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24geTFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInkxXzEwMCIsIDIpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKHcxXzEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh4MV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoeTFfMTAwKTsKLQotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMC4xIiwgdzFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC4yIiwgeDFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC4zIiwgeTFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGVEZXNjcmlwdGlvbiB3MV8xMDBfcHJpbWUgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIHdNYW5pZmVzdCwgIncxXzEwMCIsIDApOyAvLyROT04tTkxTLTEkCi0JCXN0YXRlLnVwZGF0ZUJ1bmRsZSh3MV8xMDBfcHJpbWUpOwotCQlzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvblswXSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgdzFfMTAwX3ByaW1lLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgeDFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgeTFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRzX3cxXzEwMCA9IHcxXzEwMC5nZXRTZWxlY3RlZEV4cG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaW1wb3J0c193MV8xMDBfcHJpbWUgPSB3MV8xMDBfcHJpbWUuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGlzQ29uc2lzdGVudCA9IGlzQ29uc2lzdGVudChleHBvcnRzX3cxXzEwMCwgaW1wb3J0c193MV8xMDBfcHJpbWUpOwotCQlhc3NlcnROdWxsKCIyLjEgUGFja2FnZXMgYXJlIG5vdCBjb25zaXN0ZW50OiAiICsgaXNDb25zaXN0ZW50LCBpc0NvbnNpc3RlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7dzFfMTAwfSk7Ci0JCWFzc2VydFRydWUoIjMuMSIsIHcxXzEwMF9wcmltZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjMuMiIsIHgxXzEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjMuMyIsIHkxXzEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwb3J0c193MV8xMDBfcHJpbWUgPSB3MV8xMDBfcHJpbWUuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWltcG9ydHNfdzFfMTAwX3ByaW1lID0gdzFfMTAwX3ByaW1lLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlpc0NvbnNpc3RlbnQgPSBpc0NvbnNpc3RlbnQoZXhwb3J0c193MV8xMDBfcHJpbWUsIGltcG9ydHNfdzFfMTAwX3ByaW1lKTsKLQkJYXNzZXJ0TnVsbCgiNC4xIFBhY2thZ2VzIGFyZSBub3QgY29uc2lzdGVudDogIiArIGlzQ29uc2lzdGVudCwgaXNDb25zaXN0ZW50KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGcmFnbWVudENvbnN0cmFpbnRzMDEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJaW50IGlkID0gMDsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRDEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYS5mcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZDFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImMxXzEwMCIsIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkExIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImE7IHVzZXM6PWQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYjsgdmVyc2lvbj0yLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQzE7IGJ1bmRsZS12ZXJzaW9uPVwiWzIuMCwgMy4wKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYTFfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImExXzEwMCIsIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBMS5GcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiQTEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYS5mcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImI7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkMxOyBidW5kbGUtdmVyc2lvbj1cIlsyLjAsIDMuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGExZnJhZ18xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYTFmcmFnXzEwMCIsIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJiOyB2ZXJzaW9uPTIuMSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJiMV8xMDAiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQzEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wLjEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMxXzEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJjMV8xMDAiLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShkMV8xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoYTFfMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGExZnJhZ18xMDApOwotCQlzdGF0ZS5hZGRCdW5kbGUoYjFfMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMxXzEwMCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRUcnVlKCIwLjEiLCBhMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjIiLCBhMWZyYWdfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC4zIiwgYjFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC40IiwgYzFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC41IiwgZDFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBub3cgdXNlIGEgZnJhZ21lbnQgdGhhdCBoYXMgY29uZmxpY3RpbmcgaW1wb3J0cy9yZXF1aXJlcyB3aXRoIHRoZSBob3N0Ci0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQTEuRnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkExIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEuZnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiOyB2ZXJzaW9uPTIuMSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJDMTsgYnVuZGxlLXZlcnNpb249XCJbMi41LCA0LjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlhMWZyYWdfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImExZnJhZ18xMDAiLCBhMWZyYWdfMTAwLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCXN0YXRlLnVwZGF0ZUJ1bmRsZShhMWZyYWdfMTAwKTsKLQkJc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7YTFmcmFnXzEwMH0pOwotCi0JCWFzc2VydFRydWUoIjEuMSIsIGExXzEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjIiLCBhMWZyYWdfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgYjFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwgYzFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjEuNSIsIGQxXzEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBMS5GcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiQTEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYS5mcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImI7IHZlcnNpb249XCJbMS4wLDIuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCWExZnJhZ18xMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiYTFmcmFnXzEwMCIsIGExZnJhZ18xMDAuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGUudXBkYXRlQnVuZGxlKGExZnJhZ18xMDApOwotCQlzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthMWZyYWdfMTAwfSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMi4xIiwgYTFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjIuMiIsIGExZnJhZ18xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjMiLCBiMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjQiLCBjMV8xMDAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMi41IiwgZDFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBub3cgdXNlIGEgZnJhZ21lbnQgdGhhdCBoYXMgY29uZmxpY3RpbmcgaW1wb3J0cy9yZXF1aXJlcyB3aXRoIHRoZSBob3N0Ci0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQTEuRnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkExIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEuZnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJDMTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLCAxLjUpXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlhMWZyYWdfMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgImExZnJhZ18xMDAiLCBhMWZyYWdfMTAwLmdldEJ1bmRsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCXN0YXRlLnVwZGF0ZUJ1bmRsZShhMWZyYWdfMTAwKTsKLQkJc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7YTFmcmFnXzEwMH0pOwotCi0JCWFzc2VydFRydWUoIjMuMSIsIGExXzEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIzLjIiLCBhMWZyYWdfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMy4zIiwgYjFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMy40IiwgYzFfMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjMuNSIsIGQxXzEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50Q29uc3RyYWludHMwMigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlpbnQgaWQgPSAwOwotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWcxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiLCBjLCBkIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWcyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiLCBjLCBlIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWczIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiLCBjIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWczID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhLCBiLCBjIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRnJhZzEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYUZyYWcyKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGFGcmFnMyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydFRydWUoIjAuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMC4yIiwgYUZyYWcxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjAuMyIsIGFGcmFnMi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuNCIsIGFGcmFnMy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuNSIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFSZXNvbHZlZEltcG9ydHMgPSBhLmdldFJlc29sdmVkSW1wb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiU2VsZWN0ZWRFeHBvcnRzID0gYi5nZXRTZWxlY3RlZEV4cG9ydHMoKTsKLQotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDMsIGFSZXNvbHZlZEltcG9ydHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIDMsIGJTZWxlY3RlZEV4cG9ydHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGFSZXNvbHZlZEltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhiU2VsZWN0ZWRFeHBvcnRzW2ldLCBhUmVzb2x2ZWRJbXBvcnRzW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGcmFnbWVudENvbnN0cmFpbnRzMDMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJLy8gc2FtZSBhcyB0ZXN0RnJhZ21lbnRDb25zdHJhaW50czAyIGJ1dCB3aXRoIGEgY3ljbGUKLQkJaW50IGlkID0gMDsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWcxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiLCBjLCBkIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWcyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiLCBjLCBlIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWczIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiLCBjIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWczID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhLCBiLCBjIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIngiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGFGcmFnMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRnJhZzIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYUZyYWczKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMC4xIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIwLjIiLCBhRnJhZzEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMC4zIiwgYUZyYWcyLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC40IiwgYUZyYWczLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC41IiwgYi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYVJlc29sdmVkSW1wb3J0cyA9IGEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFTZWxlY3RlZEV4cG9ydHMgPSBhLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiUmVzb2x2ZWRJbXBvcnRzID0gYi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYlNlbGVjdGVkRXhwb3J0cyA9IGIuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAzLCBhUmVzb2x2ZWRJbXBvcnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCAzLCBiU2VsZWN0ZWRFeHBvcnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhUmVzb2x2ZWRJbXBvcnRzLmxlbmd0aDsgaSsrKQotCQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCBiU2VsZWN0ZWRFeHBvcnRzW2ldLCBhUmVzb2x2ZWRJbXBvcnRzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDEsIGFTZWxlY3RlZEV4cG9ydHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMSIsIDEsIGJSZXNvbHZlZEltcG9ydHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMiIsIGFTZWxlY3RlZEV4cG9ydHNbMF0sIGJSZXNvbHZlZEltcG9ydHNbMF0pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50Q29uc3RyYWludHMwNCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlpbnQgaWQgPSAwOwotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWcxIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJjLCBkLCBlIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWcyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJjLCBkLCBmIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWczIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJjLCBkIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWczID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJiMSwgYjIsIGIzIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYzEsIGMyLCBjMyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImQxLCBkMiwgZDMiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGFGcmFnMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRnJhZzIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYUZyYWczKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShkKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydFRydWUoIjAuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMC4yIiwgYUZyYWcxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjAuMyIsIGFGcmFnMi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuNCIsIGFGcmFnMy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuNSIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjYiLCBjLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC43IiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBhUmVzb2x2ZWRSZXF1aXJlcyA9IGEuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDMsIGFSZXNvbHZlZFJlcXVpcmVzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCBiLCBhUmVzb2x2ZWRSZXF1aXJlc1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCBjLCBhUmVzb2x2ZWRSZXF1aXJlc1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjMiLCBkLCBhUmVzb2x2ZWRSZXF1aXJlc1syXSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RnJhZ21lbnRDb25zdHJhaW50czA1KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCS8vIHNhbWUgYXMgdGVzdEZyYWdtZW50Q29uc3RyYWludHMwNCBidXQgd2l0aCBhIGN5Y2xlCi0JCWludCBpZCA9IDA7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiYiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhRnJhZzEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImMsIGQsIGUiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZzEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhRnJhZzIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImMsIGQsIGYiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZzIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhRnJhZzMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImMsIGQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZzMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImIxLCBiMiwgYjMiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJjMSwgYzIsIGMzIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJkMSwgZDIsIGQzIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRnJhZzEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYUZyYWcyKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGFGcmFnMyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRUcnVlKCIwLjEiLCBhLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjAuMiIsIGFGcmFnMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIwLjMiLCBhRnJhZzIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjQiLCBhRnJhZzMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjUiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC42IiwgYy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuNyIsIGQuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYVJlc29sdmVkUmVxdWlyZXMgPSBhLmdldFJlc29sdmVkUmVxdWlyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAzLCBhUmVzb2x2ZWRSZXF1aXJlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMS4xIiwgYiwgYVJlc29sdmVkUmVxdWlyZXNbMF0pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMS4yIiwgYywgYVJlc29sdmVkUmVxdWlyZXNbMV0pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMS4zIiwgZCwgYVJlc29sdmVkUmVxdWlyZXNbMl0pOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gZFJlc29sdmVkUmVxdWlyZXMgPSBkLmdldFJlc29sdmVkUmVxdWlyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCAxLCBkUmVzb2x2ZWRSZXF1aXJlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMi4xIiwgYSwgZFJlc29sdmVkUmVxdWlyZXNbMF0pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50Q29uc3RyYWludHMwNigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlpbnQgaWQgPSAwOwotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiYiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhRnJhZzEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImIsIGMsIGQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiYywgZCwgZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGFGcmFnMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImFGcmFnMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYiwgYywgZSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJjLCBkLCBmIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWczIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiLCBjIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImMsIGQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZzMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEsIGIsIGMiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJjMSwgYzIsIGMzIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiZDEsIGQyLCBkMyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYUZyYWcxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGFGcmFnMik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRnJhZzMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGQpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMC4xIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIwLjIiLCBhRnJhZzEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMC4zIiwgYUZyYWcyLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC40IiwgYUZyYWczLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC41IiwgYi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuNiIsIGMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjciLCBkLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhUmVzb2x2ZWRJbXBvcnRzID0gYS5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYlNlbGVjdGVkRXhwb3J0cyA9IGIuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAzLCBhUmVzb2x2ZWRJbXBvcnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCAzLCBiU2VsZWN0ZWRFeHBvcnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhUmVzb2x2ZWRJbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYlNlbGVjdGVkRXhwb3J0c1tpXSwgYVJlc29sdmVkSW1wb3J0c1tpXSk7Ci0JCX0KLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFSZXNvbHZlZFJlcXVpcmVzID0gYS5nZXRSZXNvbHZlZFJlcXVpcmVzKCk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMywgYVJlc29sdmVkUmVxdWlyZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIGIsIGFSZXNvbHZlZFJlcXVpcmVzWzBdKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjEuMiIsIGMsIGFSZXNvbHZlZFJlcXVpcmVzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjEuMyIsIGQsIGFSZXNvbHZlZFJlcXVpcmVzWzJdKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGcmFnbWVudENvbnN0cmFpbnRzMDcoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJLy8gc2FtZSBhcyB0ZXN0RnJhZ21lbnRDb25zdHJhaW50czA2IGJ1dCB3aXRoIGEgY3ljbGUKLQkJaW50IGlkID0gMDsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiYiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhRnJhZzEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgImIsIGMsIGQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiYywgZCwgZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGFGcmFnMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImFGcmFnMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYiwgYywgZSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJjLCBkLCBmIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYUZyYWczIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJiLCBjIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImMsIGQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZzMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgIl8iICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGlkKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEsIGIsIGMiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJjMSwgYzIsIGMzIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAiXyIgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgaWQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiZDEsIGQyLCBkMyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICJfIiArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBpZCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGFGcmFnMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRnJhZzIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYUZyYWczKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShkKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydFRydWUoIjAuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMC4yIiwgYUZyYWcxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjAuMyIsIGFGcmFnMi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuNCIsIGFGcmFnMy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjAuNSIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjYiLCBjLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC43IiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYVJlc29sdmVkSW1wb3J0cyA9IGEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFTZWxlY3RlZEV4cG9ydHMgPSBhLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiU2VsZWN0ZWRFeHBvcnRzID0gYi5nZXRTZWxlY3RlZEV4cG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZFJlc29sdmVkSW1wb3J0cyA9IGQuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAzLCBhUmVzb2x2ZWRJbXBvcnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIxLjEiLCAzLCBiU2VsZWN0ZWRFeHBvcnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhUmVzb2x2ZWRJbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYlNlbGVjdGVkRXhwb3J0c1tpXSwgYVJlc29sdmVkSW1wb3J0c1tpXSk7Ci0JCX0KLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFSZXNvbHZlZFJlcXVpcmVzID0gYS5nZXRSZXNvbHZlZFJlcXVpcmVzKCk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMywgYVJlc29sdmVkUmVxdWlyZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIGIsIGFSZXNvbHZlZFJlcXVpcmVzWzBdKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjEuMiIsIGMsIGFSZXNvbHZlZFJlcXVpcmVzWzFdKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjEuMyIsIGQsIGFSZXNvbHZlZFJlcXVpcmVzWzJdKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDEsIGFTZWxlY3RlZEV4cG9ydHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMSIsIDEsIGRSZXNvbHZlZEltcG9ydHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjIuMiIsIGFTZWxlY3RlZEV4cG9ydHNbMF0sIGRSZXNvbHZlZEltcG9ydHNbMF0pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50c0J1ZzE4ODE5OSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXM7IHdpdGggZnJhZ21lbnRzIHVzaW5nIEltcG9ydC1QYWNrYWdlCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJjIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJBIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQUZyYWciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJhLmZyYWciKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJBIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiYSwgYS5mcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJCIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiQyIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYUZyYWcpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIwLjEiLCBhLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC4yIiwgYUZyYWcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjMiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC40IiwgYy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUucmVtb3ZlQnVuZGxlKGMpOwotCQlzdGF0ZS5yZXNvbHZlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoIjEuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMS4yIiwgYUZyYWcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMS4zIiwgYi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKGMpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCWFzc2VydFRydWUoIjIuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjIiLCBhRnJhZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMyIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjQiLCBjLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJJbXBvcnRzID0gYi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4xIiwgYUV4cG9ydHMubGVuZ3RoID09IDIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjMuMiIsIGJJbXBvcnRzLmxlbmd0aCA9PSAyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIzLjMiLCBhRXhwb3J0c1swXSA9PSBiSW1wb3J0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMy40IiwgYUV4cG9ydHNbMV0gPT0gYkltcG9ydHNbMV0pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50c011bHRpcGxlVmVyc2lvbigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXM7IHdpdGggZnJhZ21lbnRzIHVzaW5nIEltcG9ydC1QYWNrYWdlCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAnXycgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkFGcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZzEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgJ18nICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjIuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArICdfJyArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQUZyYWciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGFGcmFnMiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAnXycgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJc3RhdGUuYWRkQnVuZGxlKGExKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGFGcmFnMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhMik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRnJhZzIpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCWFzc2VydFRydWUoIjAuMSIsIGExLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC4yIiwgYUZyYWcxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMC4zIiwgYTIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIwLjQiLCBhRnJhZzIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLnJlbW92ZUJ1bmRsZShhMik7Ci0JCXN0YXRlLnJlc29sdmUoZmFsc2UpOwotCQlhc3NlcnRUcnVlKCIxLjEiLCBhMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGFGcmFnMi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjMiLCBhRnJhZzEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIjEuNCIsIGExLCBhRnJhZzIuZ2V0SG9zdCgpLmdldFN1cHBsaWVyKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtUHJvcGVydGllczAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCWludCBidW5kbGVJRCA9IDA7Ci0JCS8vIHRlc3QgdGhlIHNlbGVjdGlvbiBhbGdvcml0aG0gb2YgdGhlIHJlc29sdmVyIHRvIHBpY2sgdGhlIGJ1bmRsZXMgd2hpY2gKLQkJLy8gcmVzb2x2ZSB0aGUgbGFyZ2VzdCBzZXQgb2YgYnVuZGxlczsgd2l0aCBmcmFnbWVudHMgdXNpbmcgSW1wb3J0LVBhY2thZ2UKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAib3JnLmVjbGlwc2Uub3NnaSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBzeXN0ZW1CdW5kbGUgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAib3JnLmVjbGlwc2Uub3NnaSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInBrZy5iLCBwa2cuc3lzdGVtLmIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULCAiSjJTRS0xLjQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIkEiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJwa2cuYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJwa2cuc3lzdGVtLmIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULCAiSjJTRS0xLjIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIkIiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJzeXN0ZW0uYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAicGtnLnN5c3RlbS5iIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCwgIkoyU0UtMS4yIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc3lzdGVtQiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJzeXN0ZW0uYiIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJRGljdGlvbmFyeVtdIHByb3BzID0gbmV3IERpY3Rpb25hcnlbXSB7bmV3IEhhc2h0YWJsZSgpLCBuZXcgSGFzaHRhYmxlKCl9OwotCQlwcm9wc1swXS5wdXQoIm9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMiLCAicGtnLnN5c3RlbS5hLCBwa2cuc3lzdGVtLmMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByb3BzWzBdLnB1dCgib3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50IiwgIkoyU0UtMS4yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcm9wc1sxXS5wdXQoIm9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMiLCAicGtnLnN5c3RlbS5hLCBwa2cuc3lzdGVtLmIsIHBrZy5zeXN0ZW0uYyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJvcHNbMV0ucHV0KCJvcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQiLCAiSjJTRS0xLjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJc3RhdGUuc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKHByb3BzKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHN5c3RlbUJ1bmRsZSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoc3lzdGVtQik7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRUcnVlKCIxLjAiLCBzeXN0ZW1CdW5kbGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBhLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgYi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMyIsIHN5c3RlbUIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydFRydWUoIjIuMCIsIGEuZ2V0UmVzb2x2ZWRJbXBvcnRzKClbMV0uZ2V0RXhwb3J0ZXIoKSA9PSBzeXN0ZW1CdW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMSIsIGIuZ2V0UmVzb2x2ZWRJbXBvcnRzKClbMF0uZ2V0RXhwb3J0ZXIoKSA9PSBzeXN0ZW1CKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG5vdyB0ZXN0IHRoZSB1c2VzIGNsYXVzZSBmb3IgcGtnLmIgc3VjaCB0aGF0IGJ1bmRsZSAnQScgd2lsbCBiZSBmb3JjZWQgdG8gdXNlZAotCQkvLyBwa2cuc3lzdGVtIGZyb20gYnVuZGxlICdzeXN0ZW0uYicKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInBrZy5iOyB1c2VzOj1cInBrZy5zeXN0ZW0uYlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInBrZy5zeXN0ZW0uYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQsICJKMlNFLTEuMiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGJfdXBkYXRlZCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJCIiwgYi5nZXRCdW5kbGVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZS51cGRhdGVCdW5kbGUoYl91cGRhdGVkKTsKLQkJc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7Yl91cGRhdGVkfSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMy4wIiwgc3lzdGVtQnVuZGxlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMy4xIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjMuMiIsIGJfdXBkYXRlZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjMuMyIsIHN5c3RlbUIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydFRydWUoIjIuMCIsIGEuZ2V0UmVzb2x2ZWRJbXBvcnRzKClbMV0uZ2V0RXhwb3J0ZXIoKSA9PSBzeXN0ZW1CKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjEiLCBiX3VwZGF0ZWQuZ2V0UmVzb2x2ZWRJbXBvcnRzKClbMF0uZ2V0RXhwb3J0ZXIoKSA9PSBzeXN0ZW1CKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbGF0Zm9ybVByb3BlcnRpZXMwMigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBzYW1lIGFzIDAxIGV4Y2VwdCB1c2UgYWxpYXMgc3lzdGVtLmJ1bmRsZSB0byBhbm90aGVyIG5hbWUgInRlc3Quc3lzdGVtLmJ1bmRsZSIKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJaW50IGJ1bmRsZUlEID0gMDsKLQkJLy8gdGVzdCB0aGUgc2VsZWN0aW9uIGFsZ29yaXRobSBvZiB0aGUgcmVzb2x2ZXIgdG8gcGljayB0aGUgYnVuZGxlcyB3aGljaAotCQkvLyByZXNvbHZlIHRoZSBsYXJnZXN0IHNldCBvZiBidW5kbGVzOyB3aXRoIGZyYWdtZW50cyB1c2luZyBJbXBvcnQtUGFja2FnZQotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LnN5c3RlbS5idW5kbGUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc3lzdGVtQnVuZGxlID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInRlc3Quc3lzdGVtLmJ1bmRsZSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInBrZy5iLCBwa2cuc3lzdGVtLmIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULCAiSjJTRS0xLjQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIkEiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJwa2cuYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJwa2cuc3lzdGVtLmIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULCAiSjJTRS0xLjIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIkIiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJzeXN0ZW0uYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAicGtnLnN5c3RlbS5iIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCwgIkoyU0UtMS4yIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc3lzdGVtQiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJzeXN0ZW0uYiIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJRGljdGlvbmFyeVtdIHByb3BzID0gbmV3IERpY3Rpb25hcnlbXSB7bmV3IEhhc2h0YWJsZSgpLCBuZXcgSGFzaHRhYmxlKCl9OwotCQlwcm9wc1swXS5wdXQoIm9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMiLCAicGtnLnN5c3RlbS5hLCBwa2cuc3lzdGVtLmMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByb3BzWzBdLnB1dCgib3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50IiwgIkoyU0UtMS4yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcm9wc1swXS5wdXQoIm9zZ2kuc3lzdGVtLmJ1bmRsZSIsICJ0ZXN0LnN5c3RlbS5idW5kbGUiKTsgLy8gc2V0IHRoZSBzeXN0ZW0uYnVuZGxlIHRvIGFub3RoZXIgc3lzdGVtIGJ1bmRsZSAob3RoZXIgdGhhbiBvcmcuZWNsaXBzZS5vc2dpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJvcHNbMV0ucHV0KCJvcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzIiwgInBrZy5zeXN0ZW0uYSwgcGtnLnN5c3RlbS5iLCBwa2cuc3lzdGVtLmMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByb3BzWzFdLnB1dCgib3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50IiwgIkoyU0UtMS40Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXN0YXRlLnNldFBsYXRmb3JtUHJvcGVydGllcyhwcm9wcyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzeXN0ZW1CdW5kbGUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHN5c3RlbUIpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgc3lzdGVtQnVuZGxlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBzeXN0ZW1CLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCIyLjAiLCBhLmdldFJlc29sdmVkSW1wb3J0cygpWzFdLmdldEV4cG9ydGVyKCkgPT0gc3lzdGVtQnVuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjEiLCBiLmdldFJlc29sdmVkSW1wb3J0cygpWzBdLmdldEV4cG9ydGVyKCkgPT0gc3lzdGVtQik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBub3cgdGVzdCB0aGUgdXNlcyBjbGF1c2UgZm9yIHBrZy5iIHN1Y2ggdGhhdCBidW5kbGUgJ0EnIHdpbGwgYmUgZm9yY2VkIHRvIHVzZWQKLQkJLy8gcGtnLnN5c3RlbSBmcm9tIGJ1bmRsZSAnc3lzdGVtLmInCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJwa2cuYjsgdXNlczo9XCJwa2cuc3lzdGVtLmJcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJwa2cuc3lzdGVtLmIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULCAiSjJTRS0xLjIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiX3VwZGF0ZWQgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiQiIsIGIuZ2V0QnVuZGxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGUudXBkYXRlQnVuZGxlKGJfdXBkYXRlZCk7Ci0JCXN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2JfdXBkYXRlZH0pOwotCi0JCWFzc2VydFRydWUoIjMuMCIsIHN5c3RlbUJ1bmRsZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjMuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIzLjIiLCBiX3VwZGF0ZWQuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIzLjMiLCBzeXN0ZW1CLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCIyLjAiLCBhLmdldFJlc29sdmVkSW1wb3J0cygpWzFdLmdldEV4cG9ydGVyKCkgPT0gc3lzdGVtQik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4xIiwgYl91cGRhdGVkLmdldFJlc29sdmVkSW1wb3J0cygpWzBdLmdldEV4cG9ydGVyKCkgPT0gc3lzdGVtQik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGxhdGZvcm1Qcm9wZXJ0aWVzMDMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCB0aGF0IHJlcXVpcmUtYnVuZGxlLCBmcmFnbWVudC1ob3N0LCBhbmQgaW1wb3J0LXBhY2thZ2Ugb2Ygc3lzdGVtLmJ1bmRsZSBjYW4gYmUgYWxpYXNlZCBwcm9wZXJseQotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQlTdHJpbmcgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSA9ICJvcmcuZWNsaXBzZS5vc2dpIjsgLy8kTk9OLU5MUy0xJAotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXM7IHdpdGggZnJhZ21lbnRzIHVzaW5nIEltcG9ydC1QYWNrYWdlCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJzeXN0ZW0uYnVuZGxlLmV4cG9ydGVkLnBrZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBzeXN0ZW1CdW5kbGUgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCBjb25maWd1cmVkU3lzdGVtQnVuZGxlLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAic3lzdGVtLmJ1bmRsZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiQSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiQiIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInN5c3RlbS5idW5kbGUuZXhwb3J0ZWQucGtnOyBidW5kbGUtc3ltYm9saWMtbmFtZT1cInN5c3RlbS5idW5kbGVcIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiQyIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInN5c3RlbS5idW5kbGUuZXhwb3J0ZWQucGtnOyBidW5kbGUtc3ltYm9saWMtbmFtZT1cIiIgKyBjb25maWd1cmVkU3lzdGVtQnVuZGxlICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIkQiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJFIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJwa2cuc3lzdGVtLmE7IGJ1bmRsZS1zeW1ib2xpYy1uYW1lPVwic3lzdGVtLmJ1bmRsZVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJFIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAicGtnLnN5c3RlbS5hOyBidW5kbGUtc3ltYm9saWMtbmFtZT1cIiIgKyBjb25maWd1cmVkU3lzdGVtQnVuZGxlICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIkYiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJHIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInN5c3RlbS5idW5kbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBnID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIkciLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJIIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGggPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiSCIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJRGljdGlvbmFyeVtdIHByb3BzID0gbmV3IERpY3Rpb25hcnlbXSB7bmV3IEhhc2h0YWJsZSgpLCBuZXcgSGFzaHRhYmxlKCl9OwotCQlwcm9wc1swXS5wdXQoIm9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMiLCAicGtnLnN5c3RlbS5hLCBwa2cuc3lzdGVtLmIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByb3BzWzBdLnB1dCgib3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50IiwgIkoyU0UtMS4yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXN0YXRlLnNldFBsYXRmb3JtUHJvcGVydGllcyhwcm9wcyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzeXN0ZW1CdW5kbGUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShlKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGYpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydFRydWUoIjEuMCIsIHN5c3RlbUJ1bmRsZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgYy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGQuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS42IiwgZi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNyIsIGcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjgiLCBoLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCIyLjAiLCBhLmdldFJlc29sdmVkUmVxdWlyZXMoKVswXSA9PSBzeXN0ZW1CdW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMSIsIGIuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpWzBdID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4yIiwgYy5nZXRSZXNvbHZlZEltcG9ydHMoKVswXS5nZXRFeHBvcnRlcigpID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgZC5nZXRSZXNvbHZlZEltcG9ydHMoKVswXS5nZXRFeHBvcnRlcigpID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi40IiwgZS5nZXRSZXNvbHZlZEltcG9ydHMoKVswXS5nZXRFeHBvcnRlcigpID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi41IiwgZi5nZXRSZXNvbHZlZEltcG9ydHMoKVswXS5nZXRFeHBvcnRlcigpID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi42IiwgZy5nZXRIb3N0KCkuZ2V0SG9zdHMoKVswXSA9PSBzeXN0ZW1CdW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuNyIsIGguZ2V0SG9zdCgpLmdldEhvc3RzKClbMF0gPT0gc3lzdGVtQnVuZGxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbGF0Zm9ybVByb3BlcnRpZXMwNCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBzYW1lIGFzIDAzIGV4Y2VwdCB1c2UgYSBkaWZmZXJlbnQgc3lzdGVtLmJ1bmRsZSBhbGlhcyBvdGhlciB0aGFuIG9yZy5lY2xpcHNlLm9zZ2kKLQkJLy8gdGVzdCB0aGF0IHJlcXVpcmUtYnVuZGxlLCBmcmFnbWVudC1ob3N0LCBhbmQgaW1wb3J0LXBhY2thZ2Ugb2Ygc3lzdGVtLmJ1bmRsZSBjYW4gYmUgYWxpYXNlZCBwcm9wZXJseQotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQlTdHJpbmcgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSA9ICJ0ZXN0LnN5c3RlbS5idW5kbGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIHRlc3QgdGhlIHNlbGVjdGlvbiBhbGdvcml0aG0gb2YgdGhlIHJlc29sdmVyIHRvIHBpY2sgdGhlIGJ1bmRsZXMgd2hpY2gKLQkJLy8gcmVzb2x2ZSB0aGUgbGFyZ2VzdCBzZXQgb2YgYnVuZGxlczsgd2l0aCBmcmFnbWVudHMgdXNpbmcgSW1wb3J0LVBhY2thZ2UKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCBjb25maWd1cmVkU3lzdGVtQnVuZGxlKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInN5c3RlbS5idW5kbGUuZXhwb3J0ZWQucGtnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHN5c3RlbUJ1bmRsZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIGNvbmZpZ3VyZWRTeXN0ZW1CdW5kbGUsIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJzeXN0ZW0uYnVuZGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJBIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCBjb25maWd1cmVkU3lzdGVtQnVuZGxlKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJCIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAic3lzdGVtLmJ1bmRsZS5leHBvcnRlZC5wa2c7IGJ1bmRsZS1zeW1ib2xpYy1uYW1lPVwic3lzdGVtLmJ1bmRsZVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJDIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAic3lzdGVtLmJ1bmRsZS5leHBvcnRlZC5wa2c7IGJ1bmRsZS1zeW1ib2xpYy1uYW1lPVwiIiArIGNvbmZpZ3VyZWRTeXN0ZW1CdW5kbGUgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiRCIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInBrZy5zeXN0ZW0uYTsgYnVuZGxlLXN5bWJvbGljLW5hbWU9XCJzeXN0ZW0uYnVuZGxlXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBlID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIkUiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJGIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJwa2cuc3lzdGVtLmE7IGJ1bmRsZS1zeW1ib2xpYy1uYW1lPVwiIiArIGNvbmZpZ3VyZWRTeXN0ZW1CdW5kbGUgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiRiIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAic3lzdGVtLmJ1bmRsZSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGcgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiRyIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkgiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCBjb25maWd1cmVkU3lzdGVtQnVuZGxlKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJIIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlEaWN0aW9uYXJ5W10gcHJvcHMgPSBuZXcgRGljdGlvbmFyeVtdIHtuZXcgSGFzaHRhYmxlKCksIG5ldyBIYXNodGFibGUoKX07Ci0JCXByb3BzWzBdLnB1dCgib3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyIsICJwa2cuc3lzdGVtLmEsIHBrZy5zeXN0ZW0uYiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJvcHNbMF0ucHV0KCJvcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQiLCAiSjJTRS0xLjIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByb3BzWzBdLnB1dCgib3NnaS5zeXN0ZW0uYnVuZGxlIiwgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSk7IC8vIHNldCB0aGUgc3lzdGVtLmJ1bmRsZSB0byBhbm90aGVyIHN5c3RlbSBidW5kbGUgKG90aGVyIHRoYW4gb3JnLmVjbGlwc2Uub3NnaSkgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLnNldFBsYXRmb3JtUHJvcGVydGllcyhwcm9wcyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzeXN0ZW1CdW5kbGUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShlKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGYpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydFRydWUoIjEuMCIsIHN5c3RlbUJ1bmRsZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgYy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGQuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS42IiwgZi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNyIsIGcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjgiLCBoLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCIyLjAiLCBhLmdldFJlc29sdmVkUmVxdWlyZXMoKVswXSA9PSBzeXN0ZW1CdW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMSIsIGIuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpWzBdID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4yIiwgYy5nZXRSZXNvbHZlZEltcG9ydHMoKVswXS5nZXRFeHBvcnRlcigpID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgZC5nZXRSZXNvbHZlZEltcG9ydHMoKVswXS5nZXRFeHBvcnRlcigpID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi40IiwgZS5nZXRSZXNvbHZlZEltcG9ydHMoKVswXS5nZXRFeHBvcnRlcigpID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi41IiwgZi5nZXRSZXNvbHZlZEltcG9ydHMoKVswXS5nZXRFeHBvcnRlcigpID09IHN5c3RlbUJ1bmRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMi42IiwgZy5nZXRIb3N0KCkuZ2V0SG9zdHMoKVswXSA9PSBzeXN0ZW1CdW5kbGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuNyIsIGguZ2V0SG9zdCgpLmdldEhvc3RzKClbMF0gPT0gc3lzdGVtQnVuZGxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbGF0Zm9ybVByb3BlcnRpZXNCdWcxODgwNzUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCWludCBidW5kbGVJRCA9IDA7Ci0KLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dCgiRWNsaXBzZS1QbGF0Zm9ybUZpbHRlciIsICIoISh0ZXN0PXZhbHVlKSkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiQSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KCJFY2xpcHNlLVBsYXRmb3JtRmlsdGVyIiwgIih0ZXN0PXZhbHVlKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJCIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlEaWN0aW9uYXJ5IHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQoInRlc3QiLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJc3RhdGUuc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKHByb3BzKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRGYWxzZSgiMS4xIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IE9TR2lUZXN0c0FjdGl2YXRvci5nZXRDb250ZXh0KCk7Ci0JCUZpbGUgc3RhdGVDYWNoZSA9IGNvbnRleHQuZ2V0RGF0YUZpbGUoInN0YXRlY2FjaGUiKTsgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZUNhY2hlLm1rZGlycygpOwotCQlTdGF0ZU9iamVjdEZhY3RvcnkuZGVmYXVsdEZhY3Rvcnkud3JpdGVTdGF0ZShzdGF0ZSwgc3RhdGVDYWNoZSk7Ci0JCXN0YXRlID0gU3RhdGVPYmplY3RGYWN0b3J5LmRlZmF1bHRGYWN0b3J5LnJlYWRTdGF0ZShzdGF0ZUNhY2hlKTsKLQkJcHJvcHMgPSBzdGF0ZS5nZXRQbGF0Zm9ybVByb3BlcnRpZXMoKVswXTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCAidmFsdWUiLCBwcm9wcy5nZXQoInRlc3QiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGFDYWNoZSA9IHN0YXRlLmdldEJ1bmRsZSgiQSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGJDYWNoZSA9IHN0YXRlLmdldEJ1bmRsZSgiQiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIyLjEiLCBhQ2FjaGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIyLjIiLCBiQ2FjaGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbGF0Zm9ybVByb3BlcnRpZXNCdWcyMDc1MDBhKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlpbnQgYnVuZGxlSUQgPSAwOwotCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoIkVjbGlwc2UtUGxhdGZvcm1GaWx0ZXIiLCAiKHRlc3Q9dmFsdWUxKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJBIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoIkVjbGlwc2UtUGxhdGZvcm1GaWx0ZXIiLCAiKHRlc3Q9dmFsdWUyKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJCIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQlEaWN0aW9uYXJ5IHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQoInRlc3QiLCBuZXcgQ2F0Y2hBbGxWYWx1ZSgiKiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJc3RhdGUuc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKHByb3BzKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQkvLyBCb3RoIHNob3VsZCByZXNvbHZlCi0JCWFzc2VydFRydWUoIjEuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBPU0dpVGVzdHNBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCQlGaWxlIHN0YXRlQ2FjaGUgPSBjb250ZXh0LmdldERhdGFGaWxlKCJzdGF0ZWNhY2hlIik7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGVDYWNoZS5ta2RpcnMoKTsKLQkJU3RhdGVPYmplY3RGYWN0b3J5LmRlZmF1bHRGYWN0b3J5LndyaXRlU3RhdGUoc3RhdGUsIHN0YXRlQ2FjaGUpOwotCQlzdGF0ZSA9IFN0YXRlT2JqZWN0RmFjdG9yeS5kZWZhdWx0RmFjdG9yeS5yZWFkU3RhdGUoc3RhdGVDYWNoZSk7Ci0JCXByb3BzID0gc3RhdGUuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKClbMF07Ci0JCS8vIHdlIGRvIG5vdCBwZXJzaXN0IGN1c3RvbSBwcm9wZXJ0aWVzCi0JCWFzc2VydE51bGwoIjIuMCIsIHByb3BzLmdldCgidGVzdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGFDYWNoZSA9IHN0YXRlLmdldEJ1bmRsZSgiQSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGJDYWNoZSA9IHN0YXRlLmdldEJ1bmRsZSgiQiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMSIsIGFDYWNoZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjIuMiIsIGJDYWNoZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcmUtcmVzb2x2ZSB3aXRob3V0IHRoZSBjdXN0b20gdmFsdWUKLQkJc3RhdGUuc2V0UmVzb2x2ZXIocGxhdGZvcm1BZG1pbi5nZXRSZXNvbHZlcigpKTsKLQkJc3RhdGUucmVzb2x2ZShmYWxzZSk7Ci0JCS8vIGJvdGggc2hvdWxkIGZhaWwgdG8gcmVzb2x2ZQotCQlhc3NlcnRGYWxzZSgiMy4xIiwgYUNhY2hlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjMuMiIsIGJDYWNoZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtUHJvcGVydGllc0J1ZzIwNzUwMGIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCWludCBidW5kbGVJRCA9IDA7Ci0KLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX05BVElWRUNPREUsICJsaWJ3cmFwcGVyLWxpbnV4LXg4Ni0zMi5zbzsgd3JhcHBlci1saW51eC14ODYtMzI7IG9zbmFtZT1saW51eDsgcHJvY2Vzc29yPXg4NiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiQSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJRGljdGlvbmFyeSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KCJvc2dpLm9zIiwgbmV3IENhdGNoQWxsVmFsdWUoIioiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcm9wcy5wdXQoIm9zZ2kuYXJjaCIsIG5ldyBDYXRjaEFsbFZhbHVlKCIqIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJvcHMucHV0KCJvc2dpLmxhbmciLCBuZXcgQ2F0Y2hBbGxWYWx1ZSgiKiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByb3BzLnB1dCgib3NnaS53cyIsIG5ldyBDYXRjaEFsbFZhbHVlKCIqIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlzdGF0ZS5zZXRQbGF0Zm9ybVByb3BlcnRpZXMocHJvcHMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQkvLyBzaG91bGQgcmVzb2x2ZQotCQlhc3NlcnRUcnVlKCIxLjEiLCBhLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGxhdGZvcm1Qcm9wZXJ0aWVzQnVnMjQ2NjQwYSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQlTdHJpbmcgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSA9ICJvcmcuZWNsaXBzZS5vc2dpOyBzaW5nbGV0b246PXRydWUiOyAvLyROT04tTkxTLTEkCi0JCS8vIHRlc3QgdGhlIHNlbGVjdGlvbiBhbGdvcml0aG0gb2YgdGhlIHJlc29sdmVyIHRvIHBpY2sgdGhlIGJ1bmRsZXMgd2hpY2gKLQkJLy8gcmVzb2x2ZSB0aGUgbGFyZ2VzdCBzZXQgb2YgYnVuZGxlczsgd2l0aCBmcmFnbWVudHMgdXNpbmcgSW1wb3J0LVBhY2thZ2UKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCBjb25maWd1cmVkU3lzdGVtQnVuZGxlKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHN5c3RlbUJ1bmRsZTEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCBjb25maWd1cmVkU3lzdGVtQnVuZGxlICsgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIGNvbmZpZ3VyZWRTeXN0ZW1CdW5kbGUpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc3lzdGVtQnVuZGxlMiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIGNvbmZpZ3VyZWRTeXN0ZW1CdW5kbGUgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInBrZy5zeXN0ZW0uYiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAiQSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJlcXVpcmUuc3lzdGVtLmIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIm9yZy5lY2xpcHNlLm9zZ2k7IGJ1bmRsZS12ZXJzaW9uPTIuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQsICJKMlNFLTEuMiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJlcXVpcmVTeXN0ZW1CdW5kbGUgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQlEaWN0aW9uYXJ5W10gcHJvcHMgPSBuZXcgRGljdGlvbmFyeVtdIHtuZXcgSGFzaHRhYmxlKCksIG5ldyBIYXNodGFibGUoKX07Ci0JCXByb3BzWzBdLnB1dCgib3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyIsICJwa2cuc3lzdGVtLmEsIHBrZy5zeXN0ZW0uYyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJvcHNbMF0ucHV0KCJvcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQiLCAiSjJTRS0xLjIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByb3BzWzFdLnB1dCgib3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyIsICJwa2cuc3lzdGVtLmEsIHBrZy5zeXN0ZW0uYiwgcGtnLnN5c3RlbS5jIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcm9wc1sxXS5wdXQoIm9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCIsICJKMlNFLTEuNCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlzdGF0ZS5zZXRQbGF0Zm9ybVByb3BlcnRpZXMocHJvcHMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoc3lzdGVtQnVuZGxlMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzeXN0ZW1CdW5kbGUyKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUocmVxdWlyZVN5c3RlbUJ1bmRsZSk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlhc3NlcnRGYWxzZSgiMS4wIiwgc3lzdGVtQnVuZGxlMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMC4xIiwgc3lzdGVtQnVuZGxlMi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjQiLCByZXF1aXJlU3lzdGVtQnVuZGxlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCIyLjAiLCBhLmdldFJlc29sdmVkSW1wb3J0cygpWzBdLmdldEV4cG9ydGVyKCkgPT0gc3lzdGVtQnVuZGxlMik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGxhdGZvcm1Qcm9wZXJ0aWVzQnVnMjQ2NjQwYigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQlTdHJpbmcgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSA9ICJ0ZXN0LnN5c3RlbS5idW5kbGU7IHNpbmdsZXRvbjo9dHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdGVzdCB0aGUgc2VsZWN0aW9uIGFsZ29yaXRobSBvZiB0aGUgcmVzb2x2ZXIgdG8gcGljayB0aGUgYnVuZGxlcyB3aGljaAotCQkvLyByZXNvbHZlIHRoZSBsYXJnZXN0IHNldCBvZiBidW5kbGVzOyB3aXRoIGZyYWdtZW50cyB1c2luZyBJbXBvcnQtUGFja2FnZQotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIGNvbmZpZ3VyZWRTeXN0ZW1CdW5kbGUpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc3lzdGVtQnVuZGxlMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIGNvbmZpZ3VyZWRTeXN0ZW1CdW5kbGUgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIyLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBzeXN0ZW1CdW5kbGUyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgY29uZmlndXJlZFN5c3RlbUJ1bmRsZSArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAicGtnLnN5c3RlbS5iIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJBIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicmVxdWlyZS5zeXN0ZW0uYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAidGVzdC5zeXN0ZW0uYnVuZGxlOyBidW5kbGUtdmVyc2lvbj0yLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULCAiSjJTRS0xLjIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiByZXF1aXJlU3lzdGVtQnVuZGxlID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJRGljdGlvbmFyeVtdIHByb3BzID0gbmV3IERpY3Rpb25hcnlbXSB7bmV3IEhhc2h0YWJsZSgpLCBuZXcgSGFzaHRhYmxlKCl9OwotCQlwcm9wc1swXS5wdXQoIm9zZ2kuc3lzdGVtLmJ1bmRsZSIsICJ0ZXN0LnN5c3RlbS5idW5kbGUiKTsgLy8gc2V0IHRoZSBzeXN0ZW0uYnVuZGxlIHRvIGFub3RoZXIgc3lzdGVtIGJ1bmRsZSAob3RoZXIgdGhhbiBvcmcuZWNsaXBzZS5vc2dpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJvcHNbMF0ucHV0KCJvcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzIiwgInBrZy5zeXN0ZW0uYSwgcGtnLnN5c3RlbS5jIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcm9wc1swXS5wdXQoIm9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCIsICJKMlNFLTEuMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJvcHNbMV0ucHV0KCJvcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzIiwgInBrZy5zeXN0ZW0uYSwgcGtnLnN5c3RlbS5iLCBwa2cuc3lzdGVtLmMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByb3BzWzFdLnB1dCgib3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50IiwgIkoyU0UtMS40Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXN0YXRlLnNldFBsYXRmb3JtUHJvcGVydGllcyhwcm9wcyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShzeXN0ZW1CdW5kbGUxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHN5c3RlbUJ1bmRsZTIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShyZXF1aXJlU3lzdGVtQnVuZGxlKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCWFzc2VydEZhbHNlKCIxLjAiLCBzeXN0ZW1CdW5kbGUxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4wLjEiLCBzeXN0ZW1CdW5kbGUyLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIHJlcXVpcmVTeXN0ZW1CdW5kbGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydFRydWUoIjIuMCIsIGEuZ2V0UmVzb2x2ZWRJbXBvcnRzKClbMF0uZ2V0RXhwb3J0ZXIoKSA9PSBzeXN0ZW1CdW5kbGUyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaXNDb25zaXN0ZW50KEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIHBrZ3MxLCBFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBwa2dzMikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHBrZ3MxLmxlbmd0aDsgaSsrKQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwa2dzMi5sZW5ndGg7IGorKykKLQkJCQlpZiAocGtnczFbaV0uZ2V0TmFtZSgpLmVxdWFscyhwa2dzMltqXS5nZXROYW1lKCkpICYmIHBrZ3MxW2ldICE9IHBrZ3MyW2pdKQotCQkJCQlyZXR1cm4gbmV3IEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIHtwa2dzMVtpXSwgcGtnczJbal19OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0W10gYXJyYXksIE9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCi0JCQlpZiAoYXJyYXlbaV0uZXF1YWxzKGVsZW1lbnQpKQotCQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvblBvbGljeSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlSZXNvbHZlciByZXNvbHZlciA9IHN0YXRlLmdldFJlc29sdmVyKCk7Ci0JCXJlc29sdmVyLnNldFNlbGVjdGlvblBvbGljeShuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCWlmICghKG8xIGluc3RhbmNlb2YgQmFzZURlc2NyaXB0aW9uKSB8fCAhKG8yIGluc3RhbmNlb2YgQmFzZURlc2NyaXB0aW9uKSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCVZlcnNpb24gdjEgPSBudWxsOwotCQkJCVZlcnNpb24gdjIgPSBudWxsOwotCQkJCXYxID0gKChCYXNlRGVzY3JpcHRpb24pIG8xKS5nZXRWZXJzaW9uKCk7Ci0JCQkJdjIgPSAoKEJhc2VEZXNjcmlwdGlvbikgbzIpLmdldFZlcnNpb24oKTsKLQkJCQkvLyBvbmx5IHRha2UgdmVyc2lvbiBpbiB0byBhY2NvdW50IGFuZCB1c2UgbG93ZXIgdmVyc2lvbnMgb3ZlciBoaWdoZXIgb25lcwotCQkJCXJldHVybiB2MS5jb21wYXJlVG8odjIpOwotCQkJfQotCQl9KTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuaG9zdDsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEhvc3QxMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5ob3N0MTAwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuaG9zdDsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4xIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEhvc3QxMDEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5ob3N0MTAxIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuZnJhZzsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAidGVzdC5ob3N0OyBidW5kbGUtdmVyc2lvbj1cIlsxLjAuMCwyLjAuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RGcmFnMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInRlc3QuZnJhZzEwMCIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LmZyYWc7IHNpbmdsZXRvbjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgInRlc3QuaG9zdDsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0RnJhZzEwMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ0ZXN0LmZyYWcxMDEiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5kZXBlbmRlbnQ7IHNpbmdsZXRvbjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJ0ZXN0Lmhvc3Q7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMC4wLDIuMC4wKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdERlcGVuZGVudCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ0ZXN0LmZyYWcxMDEiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0SG9zdDEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0RnJhZzEwMCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0SG9zdDEwMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0RnJhZzEwMSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0RGVwZW5kZW50KTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCB0ZXN0SG9zdDEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjEiLCB0ZXN0SG9zdDEwMS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIHRlc3RGcmFnMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjEuMyIsIHRlc3RGcmFnMTAxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwgdGVzdERlcGVuZGVudC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzE4NzYxNigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5ob3N0OyBzaW5nbGV0b246PXRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0SG9zdDEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ0ZXN0Lmhvc3QxMDAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5ob3N0OyBzaW5nbGV0b246PXRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0SG9zdDEwMSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ0ZXN0Lmhvc3QxMDEiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5mcmFnOyBzaW5nbGV0b246PXRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJ0ZXN0Lmhvc3Q7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMC4wLDIuMC4wKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEZyYWcxMDAgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAidGVzdC5mcmFnMTAwIiwgYnVuZGxlSUQrKyk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuZnJhZzsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAidGVzdC5ob3N0OyBidW5kbGUtdmVyc2lvbj1cIlsxLjAuMCwyLjAuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RGcmFnMTAxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInRlc3QuZnJhZzEwMSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LmRlcGVuZGVudDsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInRlc3QuaG9zdDsgYnVuZGxlLXZlcnNpb249XCJbMS4wLjAsMi4wLjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0RGVwZW5kZW50ID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInRlc3QuZnJhZzEwMSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3RIb3N0MTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3RGcmFnMTAwKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3RIb3N0MTAxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3RGcmFnMTAxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3REZXBlbmRlbnQpOwotCQlTdGF0ZURlbHRhIHN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKCk7Ci0JCWFzc2VydEZhbHNlKCIxLjAiLCB0ZXN0SG9zdDEwMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIHRlc3RIb3N0MTAxLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjEuMiIsIHRlc3RGcmFnMTAwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgdGVzdEZyYWcxMDEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjQiLCB0ZXN0RGVwZW5kZW50LmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVsdGFbXSBiRGVsdGEgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoQnVuZGxlRGVsdGEuQURERUQgfCBCdW5kbGVEZWx0YS5SRVNPTFZFRCwgZmFsc2UpOwotCQlhc3NlcnRUcnVlKCIyLjAiLCBiRGVsdGEubGVuZ3RoID09IDUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzIxNzE1MCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5ob3N0OyBzaW5nbGV0b246PXRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0SG9zdDEwMCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJ0ZXN0Lmhvc3QxMDAiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQl0ZXN0SG9zdDEwMC5nZXRGcmFnbWVudHMoKTsKLQkJCWZhaWwoIkV4cGVjdGVkIHRvIGdldCBhbiBleGNlcHRpb24gaGVyZSEhISIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBFeHBlY3RlZCBleGNlcHRpb24uCi0JCX0KLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuZnJhZzsgc2luZ2xldG9uOj10cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAidGVzdC5ob3N0OyBidW5kbGUtdmVyc2lvbj1cIlsxLjAuMCwyLjAuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RGcmFnMTAwID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgInRlc3QuZnJhZzEwMCIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gaG9zdHMgPSB0ZXN0RnJhZzEwMC5nZXRIb3N0KCkuZ2V0SG9zdHMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiaG9zdHMgaXMgbnVsbCIsIGhvc3RzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGhvc3RzIiwgMCwgaG9zdHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYXRpdmVDb2RlUmVzb2x1dGlvbjAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCURpY3Rpb25hcnlbXSBwcm9wcyA9IG5ldyBEaWN0aW9uYXJ5W10ge25ldyBIYXNodGFibGUoKX07Ci0JCXByb3BzWzBdLnB1dCgib3NnaS53cyIsICJ3aW4zMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJvcHNbMF0ucHV0KCJvc2dpLm9zIiwgIndpbjMyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcm9wc1swXS5wdXQoIm9zZ2kuYXJjaCIsICJ4ODYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByb3BzWzBdLnB1dCgib3NnaS5ubCIsICJlbl9VUyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3RhdGUuc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKHByb3BzKTsKLQotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiTmF0aXZlQnVuZGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERSwgIkJ1bmRsZS1OYXRpdmVDb2RlOiBuYXRpdmVmaWxlMS50eHQ7cHJvY2Vzc29yPXg4Njtvc25hbWU9V2luZG93czIwMDA7b3NuYW1lPVwiV2luZG93cyAyMDAzXCI7b3NuYW1lPVdpbmRvd3M5NTtvc25hbWU9V2luZG93czk4O29zbmFtZT1XaW5kb3dzTlQ7b3NuYW1lPVdpbmRvd3NYUDtvc25hbWU9XCJXaW5kb3dzIE5UICh1bmtub3duKVwiO29zbmFtZT1cIldpbmRvd3MgVmlzdGFcIjsgbGFuZ3VhZ2U9ZW4iKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0TmF0aXZlQnVuZGxlID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIk5hdGl2ZUJ1bmRsZSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0TmF0aXZlQnVuZGxlKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCB0ZXN0TmF0aXZlQnVuZGxlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYXRpdmVDb2RlUmVzb2x1dGlvbjAyKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCURpY3Rpb25hcnlbXSBwcm9wcyA9IG5ldyBEaWN0aW9uYXJ5W10ge25ldyBIYXNodGFibGUoKX07Ci0JCXByb3BzWzBdLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX09TX05BTUUsICJXSU4zMiIpOyAvLyBVc2UgZGlmZmVyZW50IGNhc2UgZm9yIG9zbmFtZSAvLyROT04tTkxTLTEkCi0JCXByb3BzWzBdLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1BST0NFU1NPUiwgIng4NiIpOyAvLyROT04tTkxTLTEkCi0JCXN0YXRlLnNldFBsYXRmb3JtUHJvcGVydGllcyhwcm9wcyk7Ci0KLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIk5hdGl2ZUJ1bmRsZSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX05BVElWRUNPREUsICJCdW5kbGUtTmF0aXZlQ29kZTogbmF0aXZlZmlsZTEudHh0O3Byb2Nlc3Nvcj14ODY7b3NuYW1lPVdpbmRvd3MyMDAwO29zbmFtZT1cIldpbmRvd3MgMjAwM1wiO29zbmFtZT1XaW5kb3dzOTU7b3NuYW1lPVdpbmRvd3M5ODtvc25hbWU9V2luZG93c05UO29zbmFtZT1XaW5kb3dzWFA7b3NuYW1lPVwiV2luZG93cyBOVCAodW5rbm93bilcIjtvc25hbWU9XCJXaW5kb3dzIFZpc3RhXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0TmF0aXZlQnVuZGxlID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgIk5hdGl2ZUJ1bmRsZSIsIGJ1bmRsZUlEKyspOyAvLyROT04tTkxTLTEkCi0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0TmF0aXZlQnVuZGxlKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCB0ZXN0TmF0aXZlQnVuZGxlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlQ29kZVJlc29sdXRpb24wMygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlEaWN0aW9uYXJ5W10gcHJvcHMgPSBuZXcgRGljdGlvbmFyeVtdIHtuZXcgSGFzaHRhYmxlKCl9OwotCQlwcm9wc1swXS5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19PU19OQU1FLCAid2luMzIiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wc1swXS5wdXQoQ29uc3RhbnRzLkZSQU1FV09SS19QUk9DRVNTT1IsICJYODYiKTsgLy8gVXNlIGRpZmZlcmVudCBjYXNlIGZvciBwcm9jZXNzb3IgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZS5zZXRQbGF0Zm9ybVByb3BlcnRpZXMocHJvcHMpOwotCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbG9uZyBidW5kbGVJRCA9IDA7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJOYXRpdmVCdW5kbGUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFLCAiQnVuZGxlLU5hdGl2ZUNvZGU6IG5hdGl2ZWZpbGUxLnR4dDtwcm9jZXNzb3I9eDg2O29zbmFtZT1XaW5kb3dzMjAwMDtvc25hbWU9XCJXaW5kb3dzIDIwMDNcIjtvc25hbWU9V2luZG93czk1O29zbmFtZT1XaW5kb3dzOTg7b3NuYW1lPVdpbmRvd3NOVDtvc25hbWU9V2luZG93c1hQO29zbmFtZT1cIldpbmRvd3MgTlQgKHVua25vd24pXCI7b3NuYW1lPVwiV2luZG93cyBWaXN0YVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdE5hdGl2ZUJ1bmRsZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJOYXRpdmVCdW5kbGUiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZS5hZGRCdW5kbGUodGVzdE5hdGl2ZUJ1bmRsZSk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgdGVzdE5hdGl2ZUJ1bmRsZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdGl2ZUNvZGVSZXNvbHV0aW9uMDQoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJRGljdGlvbmFyeVtdIHByb3BzID0gbmV3IERpY3Rpb25hcnlbXSB7bmV3IEhhc2h0YWJsZSgpfTsKLQkJcHJvcHNbMF0ucHV0KENvbnN0YW50cy5GUkFNRVdPUktfT1NfTkFNRSwgIkRvZXNOb3RFeGlzdCIpOyAvLyBVc2UgZGlmZmVyZW50IGNhc2UgZm9yIG9zbmFtZSAvLyROT04tTkxTLTEkCi0JCXByb3BzWzBdLnB1dChDb25zdGFudHMuRlJBTUVXT1JLX1BST0NFU1NPUiwgIkluVmFMaWQiKTsgLy8gVXNlIGRpZmZlcmVudCBjYXNlIGZvciBwcm9jZXNzb3IgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZS5zZXRQbGF0Zm9ybVByb3BlcnRpZXMocHJvcHMpOwotCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbG9uZyBidW5kbGVJRCA9IDA7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJOYXRpdmVCdW5kbGUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFLCAiQnVuZGxlLU5hdGl2ZUNvZGU6IG5hdGl2ZWZpbGUxLnR4dDtwcm9jZXNzb3I9aU52QWxpZDtvc25hbWU9ZG9lU25vVGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdE5hdGl2ZUJ1bmRsZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsICJOYXRpdmVCdW5kbGUiLCBidW5kbGVJRCsrKTsgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZS5hZGRCdW5kbGUodGVzdE5hdGl2ZUJ1bmRsZSk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgdGVzdE5hdGl2ZUJ1bmRsZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpU3RhdGVBZGQwMSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZTEgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXMKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAic2RrOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInBsYXRmb3JtOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gc2RrMTAgPSBzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlMSwgbWFuaWZlc3QsICJzZGsxMCIsIDApOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJwbGF0Zm9ybTsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJyY3A7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwyLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBwbGF0Zm9ybTEwID0gc3RhdGUxLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZTEsIG1hbmlmZXN0LCAicGxhdGZvcm0xMCIsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJyY3A7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiByY3AxMCA9IHN0YXRlMS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUxLCBtYW5pZmVzdCwgInJjcDEwIiwgMik7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImdlZjsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJyY3A7IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwxLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBnZWYxMCA9IHN0YXRlMS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUxLCBtYW5pZmVzdCwgImdlZjEwIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZTEuYWRkQnVuZGxlKHNkazEwKTsKLQkJc3RhdGUxLmFkZEJ1bmRsZShwbGF0Zm9ybTEwKTsKLQkJc3RhdGUxLmFkZEJ1bmRsZShyY3AxMCk7Ci0JCXN0YXRlMS5hZGRCdW5kbGUoZ2VmMTApOwotCQlzdGF0ZTEucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCBzZGsxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIHBsYXRmb3JtMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCByY3AxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMyIsIGdlZjEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlTdGF0ZSBzdGF0ZTIgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJdHJ5IHsKLQkJCXN0YXRlMi5hZGRCdW5kbGUocmNwMTApOwotCQkJZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG9uIGFkZGluZyB0byBtdWx0aXBsZSBzdGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aVN0YXRlQWRkMDIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUxID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0KLQkJLy8gdGVzdCB0aGUgc2VsZWN0aW9uIGFsZ29yaXRobSBvZiB0aGUgcmVzb2x2ZXIgdG8gcGljayB0aGUgYnVuZGxlcyB3aGljaAotCQkvLyByZXNvbHZlIHRoZSBsYXJnZXN0IHNldCBvZiBidW5kbGVzCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInNkazsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJwbGF0Zm9ybTsgYnVuZGxlLXZlcnNpb249XCJbMS4wLDIuMF1cIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHNkazEwID0gc3RhdGUxLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZTEsIG1hbmlmZXN0LCAic2RrMTAiLCAwKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicGxhdGZvcm07ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicmNwOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMi4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcGxhdGZvcm0xMCA9IHN0YXRlMS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUxLCBtYW5pZmVzdCwgInBsYXRmb3JtMTAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAicmNwOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gcmNwMTAgPSBzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlMSwgbWFuaWZlc3QsICJyY3AxMCIsIDIpOyAvLyROT04tTkxTLTEkCi0KLQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJnZWY7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicmNwOyBidW5kbGUtdmVyc2lvbj1cIlsxLjAsMS4wXVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZ2VmMTAgPSBzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlMSwgbWFuaWZlc3QsICJnZWYxMCIsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGUxLmFkZEJ1bmRsZShzZGsxMCk7Ci0JCXN0YXRlMS5hZGRCdW5kbGUocGxhdGZvcm0xMCk7Ci0JCXN0YXRlMS5hZGRCdW5kbGUocmNwMTApOwotCQlzdGF0ZTEuYWRkQnVuZGxlKGdlZjEwKTsKLQkJc3RhdGUxLnJlc29sdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgc2RrMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBwbGF0Zm9ybTEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgcmNwMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBnZWYxMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcmVtb3ZlIHRoZSByY3AxMCBidW5kbGUuICBUaGUgYnVuZGxlIHdpbGwgYmUgcmVtb3ZhbCBwZW5kaW5nCi0JCS8vIHRoaXMgc2hvdWxkIHN0aWxsIHRocm93IGFuIGV4Y2VwdGlvbiB1bnRpbCB0aGUgcmVtb3ZhbCBpcyBubyBsb25nZXIgcGVuZGluZwotCQlzdGF0ZTEucmVtb3ZlQnVuZGxlKHJjcDEwKTsKLQkJU3RhdGUgc3RhdGUyID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCXRyeSB7Ci0JCQlzdGF0ZTIuYWRkQnVuZGxlKHJjcDEwKTsKLQkJCWZhaWwoIkV4cGVjdGVkIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBvbiBhZGRpbmcgdG8gbXVsdGlwbGUgc3RhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlTdGF0ZUFkZDAzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlMSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCi0JCS8vIHRlc3QgdGhlIHNlbGVjdGlvbiBhbGdvcml0aG0gb2YgdGhlIHJlc29sdmVyIHRvIHBpY2sgdGhlIGJ1bmRsZXMgd2hpY2gKLQkJLy8gcmVzb2x2ZSB0aGUgbGFyZ2VzdCBzZXQgb2YgYnVuZGxlcwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJzZGs7ICIgKyBDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRSArICI6PXRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAicGxhdGZvcm07IGJ1bmRsZS12ZXJzaW9uPVwiWzEuMCwyLjBdXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBzZGsxMCA9IHN0YXRlMS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUxLCBtYW5pZmVzdCwgInNkazEwIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInBsYXRmb3JtOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInJjcDsgYnVuZGxlLXZlcnNpb249XCJbMS4wLDIuMF1cIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHBsYXRmb3JtMTAgPSBzdGF0ZTEuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlMSwgbWFuaWZlc3QsICJwbGF0Zm9ybTEwIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQltYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInJjcDsgIiArIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9dHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHJjcDEwID0gc3RhdGUxLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZTEsIG1hbmlmZXN0LCAicmNwMTAiLCAyKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiZ2VmOyAiICsgQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj10cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInJjcDsgYnVuZGxlLXZlcnNpb249XCJbMS4wLDEuMF1cIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGdlZjEwID0gc3RhdGUxLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZTEsIG1hbmlmZXN0LCAiZ2VmMTAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlMS5hZGRCdW5kbGUoc2RrMTApOwotCQlzdGF0ZTEuYWRkQnVuZGxlKHBsYXRmb3JtMTApOwotCQlzdGF0ZTEuYWRkQnVuZGxlKHJjcDEwKTsKLQkJc3RhdGUxLmFkZEJ1bmRsZShnZWYxMCk7Ci0JCXN0YXRlMS5yZXNvbHZlKCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHNkazEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgcGxhdGZvcm0xMC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIHJjcDEwLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZ2VmMTAuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHJlbW92ZSB0aGUgcmNwMTAgYnVuZGxlLiAgVGhlIGJ1bmRsZSB3aWxsIGJlIHJlbW92YWwgcGVuZGluZwotCQkvLyB0aGlzIHNob3VsZCBzdGlsbCB0aHJvdyBhbiBleGNlcHRpb24gdW50aWwgdGhlIHJlbW92YWwgaXMgbm8gbG9uZ2VyIHBlbmRpbmcKLQkJc3RhdGUxLnJlbW92ZUJ1bmRsZShyY3AxMCk7Ci0JCXN0YXRlMS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtyY3AxMH0pOwotCQlTdGF0ZSBzdGF0ZTIgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQotCQl0cnkgewotCQkJc3RhdGUyLmFkZEJ1bmRsZShyY3AxMCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBvbiBhZGRpbmcgdG8gc3RhdGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZSBjcmVhdGVCdWcyNjY5MzVTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlpbnQgYnVuZGxlSUQgPSAwOwotCQkvLyB0ZXN0IHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIG9mIHRoZSByZXNvbHZlciB0byBwaWNrIHRoZSBidW5kbGVzIHdoaWNoCi0JCS8vIHJlc29sdmUgdGhlIGxhcmdlc3Qgc2V0IG9mIGJ1bmRsZXM7IHdpdGggZnJhZ21lbnRzCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgImEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJhIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0KLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlhc3NlcnRUcnVlKCJBIGlzIG5vdCByZXNvbHZlZCIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJCIGlzIG5vdCByZXNvbHZlZCIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJpdmF0ZSBCdW5kbGVEZXNjcmlwdGlvbiB1cGRhdGVTdGF0ZUJ1ZzI2NjkzNShTdGF0ZSBzdGF0ZSwgQnVuZGxlRGVzY3JpcHRpb24gYSkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgYS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sIGEuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBuZXdBID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBhLmdldEJ1bmRsZUlkKCkpOwotCQlzdGF0ZS51cGRhdGVCdW5kbGUobmV3QSk7Ci0JCXJldHVybiBuZXdBOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyNjY5MzVfMDEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBjcmVhdGVCdWcyNjY5MzVTdGF0ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0QnVuZGxlKCJhIiwgbmV3IFZlcnNpb24oIjEuMCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIG5ld0EgPSB1cGRhdGVTdGF0ZUJ1ZzI2NjkzNShzdGF0ZSwgYSk7Ci0JCXN0YXRlLnJlbW92ZUJ1bmRsZShhKTsKLQkJc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7bmV3QX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWcyNjY5MzVfMDIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBjcmVhdGVCdWcyNjY5MzVTdGF0ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0QnVuZGxlKCJhIiwgbmV3IFZlcnNpb24oIjEuMCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXVwZGF0ZVN0YXRlQnVnMjY2OTM1KHN0YXRlLCBhKTsKLQkJc3RhdGUucmVtb3ZlQnVuZGxlKGEpOwotCQlzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI2NjkzNV8wMygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGNyZWF0ZUJ1ZzI2NjkzNVN0YXRlKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoImEiLCBuZXcgVmVyc2lvbigiMS4wIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQnVuZGxlRGVzY3JpcHRpb24gbmV3QSA9IHVwZGF0ZVN0YXRlQnVnMjY2OTM1KHN0YXRlLCBhKTsKLQkJc3RhdGUucmVtb3ZlQnVuZGxlKG5ld0EpOwotCQlzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtuZXdBfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzI2NjkzNV8wNCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGNyZWF0ZUJ1ZzI2NjkzNVN0YXRlKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoImEiLCBuZXcgVmVyc2lvbigiMS4wIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQnVuZGxlRGVzY3JpcHRpb24gbmV3QSA9IHVwZGF0ZVN0YXRlQnVnMjY2OTM1KHN0YXRlLCBhKTsKLQkJc3RhdGUucmVtb3ZlQnVuZGxlKG5ld0EpOwotCQlzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthfSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDYXRjaEFsbFZhbHVlIHsKLQkJcHVibGljIENhdGNoQWxsVmFsdWUoU3RyaW5nIHMpIHsKLQkJCS8vZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotfQotLy90ZXN0RnJhZ21lbnRVcGRhdGVOb1ZlcnNpb25DaGFuZ2VkKCkKLS8vdGVzdEZyYWdtZW50VXBkYXRlVmVyc2lvbkNoYW5nZWQoKQotLy90ZXN0SG9zdFVwZGF0ZU5vVmVyc2lvbkNoYW5nZWQoKQotLy90ZXN0SG9zdFVwZGF0ZVZlcnNpb25DaGFuZ2VkKCkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9TdWJzdGl0dXRhYmxlRXhwb3J0c1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9TdWJzdGl0dXRhYmxlRXhwb3J0c1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1ZDI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvU3Vic3RpdHV0YWJsZUV4cG9ydHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBTdWJzdGl0dXRhYmxlRXhwb3J0c1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlVGVzdCB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTdWJzdGl0dXRhYmxlRXhwb3J0c1Rlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBTdWJzdGl0dXRhYmxlRXhwb3J0c1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZSBnZXRTdWJzdGl0dXRlQmFzaWNTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBCYXNpYyBzdWJzdGl0dXRhYmxlIGV4cG9ydCB0ZXN0IHdpdGggQSwgQiwgQyBhbGwgZXhwb3J0aW5nIGFuZCBpbXBvcnRpbmcgeCx5IHBhY2thZ2VzCi0JCS8vIEQsIEUsIEYgYWxsIHJlcXVpcmluZyBBLCBCLCBDIHJlc3BlY3RpdmVseSB0byBhY2Nlc3MgeCwgeSBwYWNrYWdlcwotCQkvLyBhbGwgc2hvdWxkIGdldCBwYWNrYWdlcyB4IGFuZCB5IGZyb20gQQotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHo7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJEIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShkKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZik7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlwcml2YXRlIFN0YXRlIGdldFN1YnN0aXR1dGVVc2VzU3RhdGUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJLy8gU2FtZSBhcyBiYXNpYyBzdWJzdGl0dXRhYmxlIGV4cG9ydCB0ZXN0IHdpdGggQSwgQiwgQyBhbGwgZXhwb3J0aW5nIGFuZCBpbXBvcnRpbmcgeCx5IHBhY2thZ2VzICsgInVzZXMiIGNsYXVzZQotCQkvLyBELCBFLCBGIGFsbCByZXF1aXJpbmcgQSwgQiwgQyByZXNwZWN0aXZlbHkgdG8gYWNjZXNzIHgsIHkgcGFja2FnZXMKLQkJLy8gYWxsIHNob3VsZCBnZXQgcGFja2FnZXMgeCBhbmQgeSBmcm9tIEEKLQkJLy8gYnVuZGxlIEcgY2Fubm90IHJlc29sdmUgYmVjYXVzZSBvZiB1c2VzIGNvbmZsaWN0IHdpdGggeCBwYWNrYWdlIGZyb20gWgotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJaIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHZlcnNpb249MC41OyBidW5kbGU9WiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHogPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyB1c2VzOj1cIngseVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHVzZXM6PVwieCx5XCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgdXNlczo9XCJ4LHlcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJEIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJHIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgIGJ1bmRsZT1aIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJc3RhdGUuYWRkQnVuZGxlKHopOwotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShlKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGYpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZyk7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlwcml2YXRlIFN0YXRlIGdldFN1YnN0aXR1dGVVc2VzQ3ljbGVTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBTYW1lIGFzIGJhc2ljIHN1YnN0aXR1dGFibGUgZXhwb3J0IHRlc3Qgd2l0aCBBLCBCLCBDIGFsbCBleHBvcnRpbmcgYW5kIGltcG9ydGluZyB4LHkgcGFja2FnZXMgKyAidXNlcyIgY2xhdXNlICsgY3ljbGUKLQkJLy8gRCwgRSwgRiBhbGwgcmVxdWlyaW5nIEEsIEIsIEMgcmVzcGVjdGl2ZWx5IHRvIGFjY2VzcyB4LCB5IHBhY2thZ2VzCi0JCS8vIGFsbCBzaG91bGQgZ2V0IHBhY2thZ2VzIHggYW5kIHkgZnJvbSBBIGFuZCBwYWNrYWdlIHogZnJvbSBHCi0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbG9uZyBidW5kbGVJRCA9IDA7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIloiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgejsgdmVyc2lvbj0wLjUiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB6ID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgdXNlczo9XCJ4LHkselwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHo7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHVzZXM6PVwieCx5LHpcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB6OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyB1c2VzOj1cIngseSx6XCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgejsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInoiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInoiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBlID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInoiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249MS4wOyB1c2VzOj14Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkgiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPTEuMDsgdXNlczo9eCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGggPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZSh6KTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGQpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShmKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGcpOwotCQlzdGF0ZS5hZGRCdW5kbGUoaCk7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlwcml2YXRlIFN0YXRlIGdldFN1YnN0aXR1dGVCYXNpY0ZyYWdTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBCYXNpYyBzdWJzdGl0dXRhYmxlIGV4cG9ydCB0ZXN0IHdpdGggQSwgQiwgQyBhbGwgZXhwb3J0aW5nIGFuZCBpbXBvcnRpbmcgeCx5IHBhY2thZ2VzCi0JCS8vIEVhY2ggaGF2ZSBhIGZyYWdtZW50IHRoYXQgZXhwb3J0cyBhbmQgaW1wb3J0cyB6IHBhY2thZ2UKLQkJLy8gRCwgRSwgRiBhbGwgcmVxdWlyaW5nIEEsIEIsIEMgcmVzcGVjdGl2ZWx5IHRvIGFjY2VzcyB4LCB5LCB6IHBhY2thZ2VzCi0JCS8vIGFsbCBzaG91bGQgZ2V0IHBhY2thZ2VzIHgsIHkgYW5kIHogZnJvbSBBICsgZnJhZ21lbnQKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBRnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiejsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiejsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQkZyYWciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYkZyYWcgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkNGcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGNGcmFnID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJGIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRnJhZyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGJGcmFnKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoY0ZyYWcpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShlKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGYpOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZSBnZXRTdWJzdGl0dXRlVXNlc0ZyYWdTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBCYXNpYyBzdWJzdGl0dXRhYmxlIGV4cG9ydCB0ZXN0IHdpdGggQSwgQiwgQyBhbGwgZXhwb3J0aW5nIGFuZCBpbXBvcnRpbmcgeCx5IHBhY2thZ2VzICsgInVzZXMiIGNsYXVzZQotCQkvLyBFYWNoIGhhdmUgYSBmcmFnbWVudCB0aGF0IGV4cG9ydHMgYW5kIGltcG9ydHMgeiBwYWNrYWdlCi0JCS8vIEQsIEUsIEYgYWxsIHJlcXVpcmluZyBBLCBCLCBDIHJlc3BlY3RpdmVseSB0byBhY2Nlc3MgeCwgeSwgeiBwYWNrYWdlcwotCQkvLyBhbGwgc2hvdWxkIGdldCBwYWNrYWdlcyB4LCB5IGFuZCB6IGZyb20gQSArIGZyYWdtZW50Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbG9uZyBidW5kbGVJRCA9IDA7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIloiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgdmVyc2lvbj0wLjU7IGJ1bmRsZT1aIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24geiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHVzZXM6PVwieCx5XCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQUZyYWciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249MS4wOyB1c2VzOj1cIngseVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyB1c2VzOj1cIngseVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkJGcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPTEuMDsgdXNlczo9XCJ4LHlcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGJGcmFnID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgdXNlczo9XCJ4LHlcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDRnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiejsgdmVyc2lvbj0xLjA7IHVzZXM6PVwieCx5XCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiejsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjRnJhZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJFIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBlID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyAgYnVuZGxlPVoiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBnID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoeik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGFGcmFnKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYkZyYWcpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjRnJhZyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShkKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnKTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCXByaXZhdGUgU3RhdGUgZ2V0U3Vic3RpdHV0ZVVzZXNGcmFnQ3ljbGVTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBTYW1lIGFzIGJhc2ljIHN1YnN0aXR1dGFibGUgZXhwb3J0IHRlc3Qgd2l0aCBBLCBCLCBDIGFsbCBleHBvcnRpbmcgYW5kIGltcG9ydGluZyB4LHkgcGFja2FnZXMgKyAidXNlcyIgY2xhdXNlICsgY3ljbGUgKyBmcmFncwotCQkvLyBELCBFLCBGIGFsbCByZXF1aXJpbmcgQSwgQiwgQyByZXNwZWN0aXZlbHkgdG8gYWNjZXNzIHgsIHkgcGFja2FnZXMKLQkJLy8gYWxsIHNob3VsZCBnZXQgcGFja2FnZXMgeCBhbmQgeSBmcm9tIEEgYW5kIHBhY2thZ2UgeiBmcm9tIEcKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiWiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB6OyB2ZXJzaW9uPTIuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIHogPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyB1c2VzOj1cIngseSxxXCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj1cIlsxLjAsMi4wKVwiLCBxIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkFGcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPTEuMDsgdXNlczo9XCJ4LHlcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPVwiWzEuMCwyLjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHVzZXM6PVwieCx5LHFcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPVwiWzEuMCwyLjApXCIsIHEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQkZyYWciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249MS4wOyB1c2VzOj1cIngseVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249XCJbMS4wLDIuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGJGcmFnID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgdXNlczo9XCJ4LHkscVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249XCJbMS4wLDIuMClcIiwgcSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDRnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiejsgdmVyc2lvbj0xLjA7IHVzZXM6PVwieCx5XCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiejsgdmVyc2lvbj1cIlsxLjAsMi4wKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gY0ZyYWcgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJEIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJHIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAicTsgdmVyc2lvbj0xLjA7IHVzZXM6PXgiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAicTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBnID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiSCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInE7IHZlcnNpb249MS4wOyB1c2VzOj14Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInE7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gaCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkkiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJxOyB4OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGkgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZSh6KTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYUZyYWcpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiRnJhZyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGNGcmFnKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGQpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShmKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGcpOwotCQlzdGF0ZS5hZGRCdW5kbGUoaCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShpKTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCXByaXZhdGUgU3RhdGUgZ2V0U3Vic3RpdHV0ZUJhc2ljUmVleHBvcnRTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBCYXNpYyBzdWJzdGl0dXRhYmxlIGV4cG9ydCB0ZXN0IHdpdGggQSwgQiwgQyBhbGwgZXhwb3J0aW5nIGFuZCBpbXBvcnRpbmcgeCx5IHBhY2thZ2VzCi0JCS8vIEQsIEUsIEYgYWxsIHJlcXVpcmluZyBBLCBCLCBDIHJlc3BlY3RpdmVseSB0byBhY2Nlc3MgeCwgeSBwYWNrYWdlcyBhcmUgcmVleHBvcnRpbmcKLQkJLy8gRywgSCwgSSBhbGwgcmVxdWlyaW5nIEQsIEUsIEYgcmVwZWN0aXZlbHkgdG8gYWNjZXNzIHgsIHkgcGFja2FnZXMKLQkJLy8gYWxsIHNob3VsZCBnZXQgcGFja2FnZXMgeCBhbmQgeSBmcm9tIEEKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJBOyB2aXNpYmlsaXR5Oj1yZWV4cG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJFIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQzsgdmlzaWJpbGl0eTo9cmVleHBvcnQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJEIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkgiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGggPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJJIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBpID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQlzdGF0ZS5hZGRCdW5kbGUoYSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShlKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGYpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShoKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGkpOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZSBnZXRTdWJzdGl0dXRlVXNlc1JlZXhwb3J0U3RhdGUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJLy8gQmFzaWMgc3Vic3RpdHV0YWJsZSBleHBvcnQgdGVzdCB3aXRoIEEsIEIsIEMgYWxsIGV4cG9ydGluZyBhbmQgaW1wb3J0aW5nIHgseSBwYWNrYWdlcyArICJ1c2VzIiBjbGF1c2UKLQkJLy8gRCwgRSwgRiBhbGwgcmVxdWlyaW5nIEEsIEIsIEMgcmVzcGVjdGl2ZWx5IHRvIGFjY2VzcyB4LCB5IHBhY2thZ2VzIGFyZSByZWV4cG9ydGluZwotCQkvLyBHLCBILCBJIGFsbCByZXF1aXJpbmcgRCwgRSwgRiByZXBlY3RpdmVseSB0byBhY2Nlc3MgeCwgeSBwYWNrYWdlcwotCQkvLyBhbGwgc2hvdWxkIGdldCBwYWNrYWdlcyB4IGFuZCB5IGZyb20gQQotCQkvLyBKIGNhbm5vdCByZXNvbHZlIGJlY2F1c2Ugb2YgdXNlcyBjb25mbGljeSB3aXRoIHBhY2thZ2UgeCBmcm9tIFoKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiWiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB2ZXJzaW9uPTAuNTsgYnVuZGxlPVoiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiB6ID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgdXNlczo9XCJ4LHlcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyB1c2VzOj1cIngseVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHVzZXM6PVwieCx5XCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJBOyB2aXNpYmlsaXR5Oj1yZWV4cG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJFIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkI7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQzsgdmlzaWJpbGl0eTo9cmVleHBvcnQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJEIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkgiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGggPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJJIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBpID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiSiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJGIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7ICBidW5kbGU9WiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGogPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZSh6KTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGQpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShmKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGcpOwotCQlzdGF0ZS5hZGRCdW5kbGUoaCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShpKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGopOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZSBnZXRTdWJzdGl0dXRlVXNlc1JlZXhwb3J0Q3ljbGVTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBCYXNpYyBzdWJzdGl0dXRhYmxlIGV4cG9ydCB0ZXN0IHdpdGggQSwgQiwgQyBhbGwgZXhwb3J0aW5nIGFuZCBpbXBvcnRpbmcgeCx5IHBhY2thZ2VzICsgdXNlcyBjbGF1c2UgKyBjeWNsZQotCQkvLyBELCBFLCBGIGFsbCByZXF1aXJpbmcgQSwgQiwgQyByZXNwZWN0aXZlbHkgdG8gYWNjZXNzIHgsIHkgcGFja2FnZXMgYXJlIHJlZXhwb3J0aW5nCi0JCS8vIEcsIEgsIEkgYWxsIHJlcXVpcmluZyBELCBFLCBGIHJlcGVjdGl2ZWx5IHRvIGFjY2VzcyB4LCB5IHBhY2thZ2VzCi0JCS8vIGFsbCBzaG91bGQgZ2V0IHBhY2thZ2VzIHggYW5kIHkgZnJvbSBBCi0JCS8vIEogY2Fubm90IHJlc29sdmUgYmVjYXVzZSBvZiB1c2VzIGNvbmZsaWN5IHdpdGggcGFja2FnZSB4IGZyb20gWgotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJaIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHo7IHZlcnNpb249Mi4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24geiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHVzZXM6PVwieCx5LHpcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB6OyB2ZXJzaW9uPVwiWzEuMCwyLjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgdXNlczo9XCJ4LHkselwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHo7IHZlcnNpb249XCJbMS4wLDIuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyB1c2VzOj1cIngseSx6XCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgejsgdmVyc2lvbj1cIlsxLjAsMi4wKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQTsgdmlzaWJpbGl0eTo9cmVleHBvcnQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJCOyB2aXNpYmlsaXR5Oj1yZWV4cG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJGIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkM7IHZpc2liaWxpdHk6PXJlZXhwb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiRCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGcgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJIIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkUiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBoID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiSSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJGIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gaSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkoiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiRiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPTEuMDsgdXNlcz1cIngseVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249XCJbMS4wLDIuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGogPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZSh6KTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGQpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShmKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGcpOwotCQlzdGF0ZS5hZGRCdW5kbGUoaCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShpKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGopOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZSBnZXRTdWJzdGl0dXRlVW5yZXNvbHZlZEZyYWdTdGF0ZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQkvLyBCYXNpYyBzdWJzdGl0dXRhYmxlIGV4cG9ydCB0ZXN0IHdpdGggQSwgQiwgQyBhbGwgZXhwb3J0aW5nIGFuZCBpbXBvcnRpbmcgeCx5IHBhY2thZ2VzCi0JCS8vIEVhY2ggaGF2ZSBhIGZyYWdtZW50IHRoYXQgZXhwb3J0cyBhbmQgaW1wb3J0cyB6IHBhY2thZ2UgYW5kIGFuIGV4dHJhIHVucmVzb2x2ZWQgaW1wb3J0IG9mIHEKLQkJLy8gRCwgRSwgRiBhbGwgcmVxdWlyaW5nIEEsIEIsIEMgcmVzcGVjdGl2ZWx5IHRvIGFjY2VzcyB4LCB5LiB6IHNob3VsZCBub3QgYmUgYWNjZXNzaWJsZQotCQkvLyBhbGwgc2hvdWxkIGdldCBwYWNrYWdlcyB4LCB5LgotCQlTdGF0ZSBzdGF0ZSA9IGJ1aWxkRW1wdHlTdGF0ZSgpOwotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWxvbmcgYnVuZGxlSUQgPSAwOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkFGcmFnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ6OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ6OyBxOyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGFGcmFnID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJCRnJhZyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiejsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiejsgcTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiRnJhZyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQ0ZyYWciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIno7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInosIHE7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gY0ZyYWcgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJEIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGFGcmFnKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYkZyYWcpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShjRnJhZyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShkKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZik7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlwcml2YXRlIFN0YXRlIGdldFN1YnN0aXR1dGVTcGxpdFN0YXRlKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCS8vIEJhc2ljIHN1YnN0aXR1dGFibGUgZXhwb3J0IHRlc3Qgd2l0aCBBLCBCLCBDIGFsbCBleHBvcnRpbmcgYW5kIGltcG9ydGluZyB4LHkgcGFja2FnZXMKLQkJLy8gRCwgRSwgRiBhbGwgcmVxdWlyaW5nIEEsIEIsIEMgcmVzcGVjdGl2ZWx5IHRvIGFjY2VzcyB4LCB5IHBhY2thZ2VzIGFuZCBleHBvcnQgbW9yZSBjb250ZW50IChzcGxpdCkKLQkJLy8gYWxsIHNob3VsZCBnZXQgcGFja2FnZXMgeCBhbmQgeSBmcm9tIEEKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgc3BsaXQ9c3BsaXQ7IG1hbmRhdG9yeTo9c3BsaXQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHNwbGl0PXNwbGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHNwbGl0PXNwbGl0OyBtYW5kYXRvcnk6PXNwbGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyBzcGxpdD1zcGxpdCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyBzcGxpdD1zcGxpdDsgbWFuZGF0b3J5Oj1zcGxpdCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgc3BsaXQ9c3BsaXQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJBIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkUiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJGIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkMiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGcgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJIIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkQiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBoID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiSSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJFIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gaSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkoiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiRiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGogPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShkKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGgpOwotCQlzdGF0ZS5hZGRCdW5kbGUoaSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShqKTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCXByaXZhdGUgU3RhdGUgZ2V0U3Vic3RpdHV0ZVNwbGl0VXNlc1N0YXRlKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCS8vIEJhc2ljIHN1YnN0aXR1dGFibGUgZXhwb3J0IHRlc3Qgd2l0aCBBLCBCLCBDIGFsbCBleHBvcnRpbmcgYW5kIGltcG9ydGluZyB4LHkgcGFja2FnZXMgKyB1c2VzCi0JCS8vIEQsIEUsIEYgYWxsIHJlcXVpcmluZyBBLCBCLCBDIHJlc3BlY3RpdmVseSB0byBhY2Nlc3MgeCwgeSBwYWNrYWdlcyBhbmQgYWRkIG1vcmUgY29udGVudCAoc3BsaXQpCi0JCS8vIGFsbCBzaG91bGQgZ2V0IHBhY2thZ2VzIHggYW5kIHkgZnJvbSBBCi0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbG9uZyBidW5kbGVJRCA9IDA7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHNwbGl0PXNwbGl0OyBtYW5kYXRvcnk6PXNwbGl0OyB1c2VzOj1cIngseSxxXCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHNwbGl0PXNwbGl0LCBxOyB2ZXJzaW9uPVwiWzEuMCwyLjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgc3BsaXQ9c3BsaXQ7IG1hbmRhdG9yeTo9c3BsaXQ7IHVzZXM6PVwieCx5LHFcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgc3BsaXQ9c3BsaXQsIHE7IHZlcnNpb249XCJbMS4wLDIuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyBzcGxpdD1zcGxpdDsgbWFuZGF0b3J5Oj1zcGxpdDsgdXNlczo9XCJ4LHkscVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyBzcGxpdD1zcGxpdCwgcTsgdmVyc2lvbj1cIlsxLjAsMi4wKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkQiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjA7IHVzZXM6PVwieCx5LHJcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCwgcjsgdmVyc2lvbj1cIlsxLjAsMi4wKVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgdXNlczo9XCJ4LHksclwiIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wLCByOyB2ZXJzaW9uPVwiWzEuMCwyLjApXCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJGIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgIng7IHk7IHZlcnNpb249MS4wOyB1c2VzOj1cIngseSxyXCIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAsIHI7IHZlcnNpb249XCJbMS4wLDIuMClcIiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJDIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkciKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBnID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiSCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJEIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gaCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkkiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGkgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJKIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBqID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiSyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJxOyByOyB2ZXJzaW9uPTIuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGsgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJMIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInE7IHI7IHZlcnNpb249MS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gbCA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIk0iKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieCwgeSwgcSwgciIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIG0gPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJOIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInEsIHIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiRiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIG4gPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShkKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShnKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGgpOwotCQlzdGF0ZS5hZGRCdW5kbGUoaSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShqKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGspOwotCQlzdGF0ZS5hZGRCdW5kbGUobCk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShtKTsKLQkJc3RhdGUuYWRkQnVuZGxlKG4pOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZSBnZXROb25PdmVybGFwaW5nU3Vic3RpdHV0ZUJhc2ljU3RhdGUoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJLy8gQmFzaWMgc3Vic3RpdHV0YWJsZSBleHBvcnQgdGVzdCB3aXRoIEEsIEIsIEMgYWxsIGV4cG9ydGluZyBhbmQgaW1wb3J0aW5nIHgseSBwYWNrYWdlcwotCQkvLyBELCBFLCBGIGFsbCByZXF1aXJpbmcgQSwgQiwgQyByZXNwZWN0aXZlbHkgdG8gYWNjZXNzIHgsIHkgcGFja2FnZXMKLQkJLy8gYWxsIHNob3VsZCBnZXQgcGFja2FnZXMgeCBhbmQgeSBmcm9tIEEKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlsb25nIGJ1bmRsZUlEID0gMDsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMDsgbm9tYXRjaD1ub21hdGNoIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAieDsgeTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsICJ4OyB5OyB2ZXJzaW9uPTEuMCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJEIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgIkEiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRSIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJCIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgKyAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkYiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiQyIpOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpICsgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShhKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShkKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZik7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0YWJsZUV4cG9ydHMwMDEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdWJzdGl0dXRlQmFzaWNTdGF0ZSgpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRCdW5kbGUoMSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRCdW5kbGUoMik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRCdW5kbGUoMyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRCdW5kbGUoNCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCBjLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGIpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBjVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGMpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYlZpc2libGUgaXMgbnVsbCIsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJjVmlzaWJsZSBpcyBudWxsIiwgY1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFTdWJ0aXR1dGVzID0gbmV3IEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIHthRXhwb3J0c1swXSwgYUV4cG9ydHNbMV19OwotCQlhc3NlcnRFcXVhbHMoImFWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGEuZ2V0RXhwb3J0UGFja2FnZXMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJiVmlzaWJsZSBub3QgY29ycmVjdCIsIGFTdWJ0aXR1dGVzLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjVmlzaWJsZSBub3QgY29ycmVjdCIsIGFTdWJ0aXR1dGVzLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJlVmlzaWJsZSBub3QgY29ycmVjdCIsIGFTdWJ0aXR1dGVzLCBlVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJmVmlzaWJsZSBub3QgY29ycmVjdCIsIGFTdWJ0aXR1dGVzLCBmVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0YWJsZUV4cG9ydHMwMDIoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdWJzdGl0dXRlVXNlc1N0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEJ1bmRsZSgxKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEJ1bmRsZSgyKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEJ1bmRsZSg1KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEJ1bmRsZSg2KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEJ1bmRsZSg3KTsKLQotCQlhc3NlcnRUcnVlKCIxLjAiLCBhLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBkLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwgZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNSIsIGYuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMS42IiwgZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYVZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhhKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYlZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhiKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhjKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZFZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhkKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZVZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhlKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZlZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhmKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZ1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhnKTsKLQotCQlhc3NlcnROb3ROdWxsKCJhVmlzaWJsZSBpcyBudWxsIiwgYVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImJWaXNpYmxlIGlzIG51bGwiLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY1Zpc2libGUgaXMgbnVsbCIsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJkVmlzaWJsZSBpcyBudWxsIiwgZFZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImVWaXNpYmxlIGlzIG51bGwiLCBlVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZlZpc2libGUgaXMgbnVsbCIsIGZWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJnVmlzaWJsZSBpcyBudWxsIiwgZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYUV4cG9ydHMgPSBhLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlhc3NlcnRFcXVhbHMoImFWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGEuZ2V0RXhwb3J0UGFja2FnZXMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJiVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJlVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBlVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJmVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBmVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0YWJsZUV4cG9ydHMwMDMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdWJzdGl0dXRlVXNlc0N5Y2xlU3RhdGUoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0QnVuZGxlKDIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0QnVuZGxlKDMpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0QnVuZGxlKDQpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBlID0gc3RhdGUuZ2V0QnVuZGxlKDUpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0QnVuZGxlKDYpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnID0gc3RhdGUuZ2V0QnVuZGxlKDcpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBoID0gc3RhdGUuZ2V0QnVuZGxlKDgpOwotCi0JCWFzc2VydFRydWUoIjEuMCIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgYy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMyIsIGQuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjQiLCBlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS41IiwgZi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNiIsIGcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjciLCBoLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGIpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBjVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGMpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBoVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGgpOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYlZpc2libGUgaXMgbnVsbCIsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJjVmlzaWJsZSBpcyBudWxsIiwgY1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImdWaXNpYmxlIGlzIG51bGwiLCBnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRFcXVhbHMoImFWaXNpYmxlIHdyb25nIG51bWJlciIsIDEsIGFWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJiVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBiVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY1Zpc2libGUgd3JvbmcgbnVtYmVyIiwgMywgY1Zpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImRWaXNpYmxlIHdyb25nIG51bWJlciIsIDMsIGRWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJlVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBlVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMywgZlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImdWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGdWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJoVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBoVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYUV4cG9ydGVkID0gYS5nZXRTZWxlY3RlZEV4cG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZ0V4cG9ydGVkID0gZy5nZXRTZWxlY3RlZEV4cG9ydHMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwZWN0ZWQgPSBuZXcgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW2FFeHBvcnRlZC5sZW5ndGggKyBnRXhwb3J0ZWQubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhRXhwb3J0ZWQsIDAsIGV4cGVjdGVkLCAwLCBhRXhwb3J0ZWQubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShnRXhwb3J0ZWQsIDAsIGV4cGVjdGVkLCBhRXhwb3J0ZWQubGVuZ3RoLCBnRXhwb3J0ZWQubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPT0gMikKLQkJCQlhc3NlcnRDb250YWlucygiYVZpc2libGUgbm90IGNvcnJlY3QiLCBhVmlzaWJsZSwgZXhwZWN0ZWRbaV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRDb250YWlucygiYlZpc2libGUgbm90IGNvcnJlY3QiLCBiVmlzaWJsZSwgZXhwZWN0ZWRbaV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRDb250YWlucygiY1Zpc2libGUgbm90IGNvcnJlY3QiLCBjVmlzaWJsZSwgZXhwZWN0ZWRbaV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRDb250YWlucygiZFZpc2libGUgbm90IGNvcnJlY3QiLCBkVmlzaWJsZSwgZXhwZWN0ZWRbaV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRDb250YWlucygiZVZpc2libGUgbm90IGNvcnJlY3QiLCBlVmlzaWJsZSwgZXhwZWN0ZWRbaV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRDb250YWlucygiZlZpc2libGUgbm90IGNvcnJlY3QiLCBmVmlzaWJsZSwgZXhwZWN0ZWRbaV0pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaSA9PSAwIHx8IGkgPT0gMSkKLQkJCQlhc3NlcnRDb250YWlucygiZ1Zpc2libGUgbm90IGNvcnJlY3QiLCBnVmlzaWJsZSwgZXhwZWN0ZWRbaV0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRDb250YWlucygiaFZpc2libGUgbm90IGNvcnJlY3QiLCBoVmlzaWJsZSwgZXhwZWN0ZWRbaV0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0YWJsZUV4cG9ydHMwMDQoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdWJzdGl0dXRlQmFzaWNGcmFnU3RhdGUoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGFGcmFnID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0QnVuZGxlKDIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiRnJhZyA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gY0ZyYWcgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRCdW5kbGUoNik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRCdW5kbGUoNyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRCdW5kbGUoOCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMC4xIiwgYUZyYWcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xLjEiLCBiRnJhZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIuMSIsIGNGcmFnLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRnJhZ1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhhRnJhZyk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoYik7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJGcmFnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGJGcmFnKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhjKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY0ZyYWdWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoY0ZyYWcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYUZyYWdWaXNpYmxlIGlzIG51bGwiLCBhRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImJWaXNpYmxlIGlzIG51bGwiLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYkZyYWdWaXNpYmxlIGlzIG51bGwiLCBiRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImNWaXNpYmxlIGlzIG51bGwiLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY0ZyYWdWaXNpYmxlIGlzIG51bGwiLCBjRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYUZyYWdWaXNpYmxlIHdyb25nIG51bWJlciIsIDAsIGFGcmFnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJGcmFnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAxLCBiRnJhZ1Zpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjRnJhZ1Zpc2libGUgd3JvbmcgbnVtYmVyIiwgMSwgY0ZyYWdWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMywgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDMsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiYSBoYXMgd3JvbmcgbnVtYmVyIG9mIGV4cG9ydHMiLCAzLCBhRXhwb3J0cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFEZWNsYXJlZEV4cG9ydHMgPSBhLmdldEV4cG9ydFBhY2thZ2VzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFGcmFnRXhwb3J0cyA9IG5ldyBFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSB7YUV4cG9ydHNbMl19OwotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYURlY2xhcmVkRXhwb3J0cywgYlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYkZyYWdWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUZyYWdFeHBvcnRzLCBiRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY1Zpc2libGUgbm90IGNvcnJlY3QiLCBhRGVjbGFyZWRFeHBvcnRzLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjRnJhZ1Zpc2libGUgbm90IGNvcnJlY3QiLCBhRnJhZ0V4cG9ydHMsIGNGcmFnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRFcXVhbHMoImRWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGRWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImVWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGZWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRhYmxlRXhwb3J0czAwNSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGdldFN1YnN0aXR1dGVVc2VzRnJhZ1N0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQkvLwkJQnVuZGxlRGVzY3JpcHRpb24geiA9IHN0YXRlLmdldEJ1bmRsZSgwKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEJ1bmRsZSgxKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcgPSBzdGF0ZS5nZXRCdW5kbGUoMik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRCdW5kbGUoMyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJGcmFnID0gc3RhdGUuZ2V0QnVuZGxlKDQpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0QnVuZGxlKDUpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjRnJhZyA9IHN0YXRlLmdldEJ1bmRsZSg2KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEJ1bmRsZSg3KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEJ1bmRsZSg4KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEJ1bmRsZSg5KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEJ1bmRsZSgxMCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMC4xIiwgYUZyYWcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xLjEiLCBiRnJhZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIuMSIsIGNGcmFnLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjEuNiIsIGcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoYSk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFGcmFnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGFGcmFnKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYlZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhiKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYkZyYWdWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoYkZyYWcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBjVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGMpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBjRnJhZ1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhjRnJhZyk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGRWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoZCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGVWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoZSk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGZWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoZik7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGdWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoZyk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCgiYVZpc2libGUgaXMgbnVsbCIsIGFWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJhRnJhZ1Zpc2libGUgaXMgbnVsbCIsIGFGcmFnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYlZpc2libGUgaXMgbnVsbCIsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJiRnJhZ1Zpc2libGUgaXMgbnVsbCIsIGJGcmFnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY1Zpc2libGUgaXMgbnVsbCIsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJjRnJhZ1Zpc2libGUgaXMgbnVsbCIsIGNGcmFnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZFZpc2libGUgaXMgbnVsbCIsIGRWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJlVmlzaWJsZSBpcyBudWxsIiwgZVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImZWaXNpYmxlIGlzIG51bGwiLCBmVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZ1Zpc2libGUgaXMgbnVsbCIsIGdWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygiYVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMCwgYVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImFGcmFnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBhRnJhZ1Zpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGJWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJiRnJhZ1Zpc2libGUgd3JvbmcgbnVtYmVyIiwgMSwgYkZyYWdWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBjVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY0ZyYWdWaXNpYmxlIHdyb25nIG51bWJlciIsIDEsIGNGcmFnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZFZpc2libGUgd3JvbmcgbnVtYmVyIiwgMywgZFZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImVWaXNpYmxlIHdyb25nIG51bWJlciIsIDMsIGVWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJmVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBmVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZ1Zpc2libGUgd3JvbmcgbnVtYmVyIiwgMCwgZ1Zpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFFeHBvcnRzID0gYS5nZXRTZWxlY3RlZEV4cG9ydHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIGhhcyB3cm9uZyBudW1iZXIgb2YgZXhwb3J0cyIsIDMsIGFFeHBvcnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYURlY2xhcmVkRXhwb3J0cyA9IGEuZ2V0RXhwb3J0UGFja2FnZXMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYUZyYWdFeHBvcnRzID0gbmV3IEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIHthRXhwb3J0c1syXX07Ci0JCWFzc2VydEVxdWFscygiYlZpc2libGUgbm90IGNvcnJlY3QiLCBhRGVjbGFyZWRFeHBvcnRzLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJiRnJhZ1Zpc2libGUgbm90IGNvcnJlY3QiLCBhRnJhZ0V4cG9ydHMsIGJGcmFnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjVmlzaWJsZSBub3QgY29ycmVjdCIsIGFEZWNsYXJlZEV4cG9ydHMsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNGcmFnVmlzaWJsZSBub3QgY29ycmVjdCIsIGFGcmFnRXhwb3J0cywgY0ZyYWdWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygiZFZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZFZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZlZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGFibGVFeHBvcnRzMDA2KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gZ2V0U3Vic3RpdHV0ZVVzZXNGcmFnQ3ljbGVTdGF0ZSgpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJLy8JCUJ1bmRsZURlc2NyaXB0aW9uIHogPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoMSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGFGcmFnID0gc3RhdGUuZ2V0QnVuZGxlKDIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0QnVuZGxlKDMpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiRnJhZyA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSg1KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gY0ZyYWcgPSBzdGF0ZS5nZXRCdW5kbGUoNik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRCdW5kbGUoNyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRCdW5kbGUoOCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRCdW5kbGUoOSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGcgPSBzdGF0ZS5nZXRCdW5kbGUoMTApOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBoID0gc3RhdGUuZ2V0QnVuZGxlKDExKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaSA9IHN0YXRlLmdldEJ1bmRsZSgxMik7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMC4xIiwgYUZyYWcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xLjEiLCBiRnJhZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIuMSIsIGNGcmFnLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS42IiwgZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNyIsIGguaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjciLCBpLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRnJhZ1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhhRnJhZyk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoYik7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJGcmFnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGJGcmFnKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhjKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY0ZyYWdWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoY0ZyYWcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBoVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGgpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBpVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGkpOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYUZyYWdWaXNpYmxlIGlzIG51bGwiLCBhRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImJWaXNpYmxlIGlzIG51bGwiLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYkZyYWdWaXNpYmxlIGlzIG51bGwiLCBiRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImNWaXNpYmxlIGlzIG51bGwiLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY0ZyYWdWaXNpYmxlIGlzIG51bGwiLCBjRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImdWaXNpYmxlIGlzIG51bGwiLCBnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZ1Zpc2libGUgaXMgbnVsbCIsIGhWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJpVmlzaWJsZSBpcyBudWxsIiwgaVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAxLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYUZyYWdWaXNpYmxlIHdyb25nIG51bWJlciIsIDAsIGFGcmFnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMywgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJGcmFnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAxLCBiRnJhZ1Zpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDMsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjRnJhZ1Zpc2libGUgd3JvbmcgbnVtYmVyIiwgMSwgY0ZyYWdWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMywgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDMsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaFZpc2libGUgd3JvbmcgbnVtYmVyIiwgNCwgaFZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImlWaXNpYmxlIHdyb25nIG51bWJlciIsIDQsIGlWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhIGhhcyB3cm9uZyBudW1iZXIgb2YgZXhwb3J0cyIsIDMsIGFFeHBvcnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYURlY2xhcmVkRXhwb3J0cyA9IGEuZ2V0RXhwb3J0UGFja2FnZXMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYmNFeHBlY3RlZFZpc2libGUgPSBuZXcgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW2FEZWNsYXJlZEV4cG9ydHMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYURlY2xhcmVkRXhwb3J0cywgMCwgYmNFeHBlY3RlZFZpc2libGUsIDAsIGFEZWNsYXJlZEV4cG9ydHMubGVuZ3RoKTsKLQkJYmNFeHBlY3RlZFZpc2libGVbMl0gPSBnLmdldFNlbGVjdGVkRXhwb3J0cygpWzBdOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRnJhZ0V4cG9ydHMgPSBuZXcgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10ge2FFeHBvcnRzWzJdfTsKLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSBub3QgY29ycmVjdCIsIGcuZ2V0U2VsZWN0ZWRFeHBvcnRzKCksIGFWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYmNFeHBlY3RlZFZpc2libGUsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJGcmFnVmlzaWJsZSBub3QgY29ycmVjdCIsIGFGcmFnRXhwb3J0cywgYkZyYWdWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYmNFeHBlY3RlZFZpc2libGUsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNGcmFnVmlzaWJsZSBub3QgY29ycmVjdCIsIGFGcmFnRXhwb3J0cywgY0ZyYWdWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygiZFZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZFZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZlZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZ0V4cG9ydHMgPSBnLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlhc3NlcnRFcXVhbHMoImcgaGFzIHdyb25nIG51bWJlciBvZiBleHBvcnRzIiwgMSwgZ0V4cG9ydHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBlY3RlZEhJVmlzaWJsZSA9IG5ldyBFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSB7Z0V4cG9ydHNbMF0sIGFFeHBvcnRzWzBdLCBhRXhwb3J0c1sxXSwgYUV4cG9ydHNbMl19OwotCQlhc3NlcnRFcXVhbHMoImdWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGdWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImhWaXNpYmxlIG5vdCBjb3JyZWN0IiwgZXhwZWN0ZWRISVZpc2libGUsIGhWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImlWaXNpYmxlIG5vdCBjb3JyZWN0IiwgZXhwZWN0ZWRISVZpc2libGUsIGlWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRhYmxlRXhwb3J0czAwNygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGdldFN1YnN0aXR1dGVCYXNpY1JlZXhwb3J0U3RhdGUoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRCdW5kbGUoMSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRCdW5kbGUoMik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRCdW5kbGUoMyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRCdW5kbGUoNCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGcgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGggPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGkgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCBjLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS41IiwgZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNSIsIGguaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBpLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGIpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBjVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGMpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBoVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGgpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBpVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGkpOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYlZpc2libGUgaXMgbnVsbCIsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJjVmlzaWJsZSBpcyBudWxsIiwgY1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImdWaXNpYmxlIGlzIG51bGwiLCBnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiaFZpc2libGUgaXMgbnVsbCIsIGhWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJpVmlzaWJsZSBpcyBudWxsIiwgaVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaFZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgaFZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImlWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGlWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiYlZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgYlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY1Zpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgY1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZFZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZFZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZlZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZ1Zpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaFZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgaFZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaVZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgaVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGFibGVFeHBvcnRzMDA4KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gZ2V0U3Vic3RpdHV0ZVVzZXNSZWV4cG9ydFN0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0QnVuZGxlKDIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0QnVuZGxlKDMpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0QnVuZGxlKDQpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBlID0gc3RhdGUuZ2V0QnVuZGxlKDUpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0QnVuZGxlKDYpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnID0gc3RhdGUuZ2V0QnVuZGxlKDcpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBoID0gc3RhdGUuZ2V0QnVuZGxlKDgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBpID0gc3RhdGUuZ2V0QnVuZGxlKDkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBqID0gc3RhdGUuZ2V0QnVuZGxlKDEwKTsKLQotCQlhc3NlcnRUcnVlKCIxLjAiLCBhLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBkLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwgZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNSIsIGYuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjYiLCBnLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS43IiwgaC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuOCIsIGkuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRGYWxzZSgiMS45Iiwgai5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYVZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhhKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYlZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhiKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhjKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZFZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhkKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZVZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhlKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZlZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhmKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZ1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhnKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaFZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaVZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhpKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10galZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhqKTsKLQotCQlhc3NlcnROb3ROdWxsKCJhVmlzaWJsZSBpcyBudWxsIiwgYVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImJWaXNpYmxlIGlzIG51bGwiLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY1Zpc2libGUgaXMgbnVsbCIsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJkVmlzaWJsZSBpcyBudWxsIiwgZFZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImVWaXNpYmxlIGlzIG51bGwiLCBlVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZlZpc2libGUgaXMgbnVsbCIsIGZWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJnVmlzaWJsZSBpcyBudWxsIiwgZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImhWaXNpYmxlIGlzIG51bGwiLCBoVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiaVZpc2libGUgaXMgbnVsbCIsIGlWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJqVmlzaWJsZSBpcyBudWxsIiwgalZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaFZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgaFZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImlWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGlWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJqVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBqVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYUV4cG9ydHMgPSBhLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImRWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGRWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImVWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGZWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImdWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGdWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImhWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGhWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImlWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGlWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRhYmxlRXhwb3J0czAwOSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGdldFN1YnN0aXR1dGVVc2VzUmVleHBvcnRDeWNsZVN0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEJ1bmRsZSgxKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEJ1bmRsZSgyKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEJ1bmRsZSg1KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEJ1bmRsZSg2KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEJ1bmRsZSg3KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaCA9IHN0YXRlLmdldEJ1bmRsZSg4KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaSA9IHN0YXRlLmdldEJ1bmRsZSg5KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaiA9IHN0YXRlLmdldEJ1bmRsZSgxMCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCBjLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS42IiwgZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNyIsIGguaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjgiLCBpLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS45Iiwgai5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYVZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhhKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYlZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhiKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhjKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZFZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhkKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZVZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhlKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZlZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhmKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZ1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhnKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaFZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaVZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhpKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10galZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhqKTsKLQotCQlhc3NlcnROb3ROdWxsKCJhVmlzaWJsZSBpcyBudWxsIiwgYVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImJWaXNpYmxlIGlzIG51bGwiLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY1Zpc2libGUgaXMgbnVsbCIsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJkVmlzaWJsZSBpcyBudWxsIiwgZFZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImVWaXNpYmxlIGlzIG51bGwiLCBlVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZlZpc2libGUgaXMgbnVsbCIsIGZWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJnVmlzaWJsZSBpcyBudWxsIiwgZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImhWaXNpYmxlIGlzIG51bGwiLCBoVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiaVZpc2libGUgaXMgbnVsbCIsIGlWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJqVmlzaWJsZSBpcyBudWxsIiwgalZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAxLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMywgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDMsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaFZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgaFZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImlWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGlWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJqVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBqVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYUV4cG9ydHMgPSBhLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlhc3NlcnRFcXVhbHMoImFFeHBvcnRzIGNvdW50IHdyb25nIiwgMiwgYUV4cG9ydHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBqRXhwb3J0cyA9IGouZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiYUV4cG9ydHMgY291bnQgd3JvbmciLCAxLCBqRXhwb3J0cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJjRXhwZWN0ZWQgPSBuZXcgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10ge2FFeHBvcnRzWzBdLCBhRXhwb3J0c1sxXSwgakV4cG9ydHNbMF19OwotCQlhc3NlcnRFcXVhbHMoImFWaXNpYmxlIG5vdCBjb3JyZWN0IiwgakV4cG9ydHMsIGFWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYmNFeHBlY3RlZCwgYlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY1Zpc2libGUgbm90IGNvcnJlY3QiLCBiY0V4cGVjdGVkLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJlVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBlVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJmVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBmVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJnVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJoVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBoVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJpVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBpVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJqVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBqVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0YWJsZUV4cG9ydHMwMTAoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdWJzdGl0dXRlQmFzaWNTdGF0ZSgpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRCdW5kbGUoMSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRCdW5kbGUoMik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRCdW5kbGUoMyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRCdW5kbGUoNCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0KLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBhbGxCdW5kbGVzID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2EsIGIsIGMsIGQsIGUsIGZ9OwotCQlTdGF0ZURlbHRhIHN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthfSk7Ci0JCUJ1bmRsZURlbHRhW10gYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCA2LCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsQnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBidW5kbGVEZWx0YXMubGVuZ3RoICYmICFmb3VuZDsgaisrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGRlbHRhIHR5cGUgIiArIGJ1bmRsZURlbHRhc1tqXSwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGJ1bmRsZURlbHRhc1tqXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSBidW5kbGVEZWx0YXNbal0uZ2V0QnVuZGxlKCkgPT0gYWxsQnVuZGxlc1tpXTsKLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlmYWlsKCJEaWQgbm90IGZpbmQgUkVTT0xWRUQgQnVuZGxlRGVsdGEgZm9yICIgKyBhbGxCdW5kbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtmfSk7Ci0JCWJ1bmRsZURlbHRhcyA9IHN0YXRlRGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnROb3ROdWxsKCJidW5kbGVEZWx0YXMgaXMgbnVsbCIsIGJ1bmRsZURlbHRhcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJidW5sZGVEZWx0YXMgd3JvbmcgbnVtYmVyIiwgMSwgYnVuZGxlRGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0YWJsZUV4cG9ydHMwMTEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdWJzdGl0dXRlVXNlc1N0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24geiA9IHN0YXRlLmdldEJ1bmRsZSgwKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEJ1bmRsZSgxKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEJ1bmRsZSgyKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEJ1bmRsZSg1KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEJ1bmRsZSg2KTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFsbFJlZnJlc2hCdW5kbGVzID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2EsIGIsIGMsIGQsIGUsIGZ9OwotCQlTdGF0ZURlbHRhIHN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthfSk7Ci0JCUJ1bmRsZURlbHRhW10gYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCA2LCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUmVmcmVzaEJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYnVuZGxlRGVsdGFzLmxlbmd0aCAmJiAhZm91bmQ7IGorKykgewotCQkJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBkZWx0YSB0eXBlICIgKyBidW5kbGVEZWx0YXNbal0sIEJ1bmRsZURlbHRhLlJFU09MVkVELCBidW5kbGVEZWx0YXNbal0uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvdW5kID0gYnVuZGxlRGVsdGFzW2pdLmdldEJ1bmRsZSgpID09IGFsbFJlZnJlc2hCdW5kbGVzW2ldOwotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCWZhaWwoIkRpZCBub3QgZmluZCBSRVNPTFZFRCBCdW5kbGVEZWx0YSBmb3IgIiArIGFsbFJlZnJlc2hCdW5kbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtmfSk7Ci0JCWJ1bmRsZURlbHRhcyA9IHN0YXRlRGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnROb3ROdWxsKCJidW5kbGVEZWx0YXMgaXMgbnVsbCIsIGJ1bmRsZURlbHRhcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJidW5sZGVEZWx0YXMgd3JvbmcgbnVtYmVyIiwgMSwgYnVuZGxlRGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZURlbHRhID0gc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7en0pOwotCQlidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlRGVsdGFzIGlzIG51bGwiLCBidW5kbGVEZWx0YXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVubGRlRGVsdGFzIHdyb25nIG51bWJlciIsIDEsIGJ1bmRsZURlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGFibGVFeHBvcnRzMDEyKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gZ2V0U3Vic3RpdHV0ZVVzZXNDeWNsZVN0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEJ1bmRsZSgxKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEJ1bmRsZSgyKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEJ1bmRsZSg1KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEJ1bmRsZSg2KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEJ1bmRsZSg3KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaCA9IHN0YXRlLmdldEJ1bmRsZSg4KTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFsbFJlZnJlc2hCdW5kbGVzID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2EsIGIsIGMsIGQsIGUsIGYsIGcsIGh9OwotCQlTdGF0ZURlbHRhIHN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthfSk7Ci0JCUJ1bmRsZURlbHRhW10gYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCA4LCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUmVmcmVzaEJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYnVuZGxlRGVsdGFzLmxlbmd0aCAmJiAhZm91bmQ7IGorKykgewotCQkJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBkZWx0YSB0eXBlICIgKyBidW5kbGVEZWx0YXNbal0sIEJ1bmRsZURlbHRhLlJFU09MVkVELCBidW5kbGVEZWx0YXNbal0uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvdW5kID0gYnVuZGxlRGVsdGFzW2pdLmdldEJ1bmRsZSgpID09IGFsbFJlZnJlc2hCdW5kbGVzW2ldOwotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCWZhaWwoIkRpZCBub3QgZmluZCBSRVNPTFZFRCBCdW5kbGVEZWx0YSBmb3IgIiArIGFsbFJlZnJlc2hCdW5kbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtmfSk7Ci0JCWJ1bmRsZURlbHRhcyA9IHN0YXRlRGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnROb3ROdWxsKCJidW5kbGVEZWx0YXMgaXMgbnVsbCIsIGJ1bmRsZURlbHRhcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJidW5sZGVEZWx0YXMgd3JvbmcgbnVtYmVyIiwgMSwgYnVuZGxlRGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZURlbHRhID0gc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7Y30pOwotCQlidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlRGVsdGFzIGlzIG51bGwiLCBidW5kbGVEZWx0YXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVubGRlRGVsdGFzIHdyb25nIG51bWJlciIsIDgsIGJ1bmRsZURlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxSZWZyZXNoQnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBidW5kbGVEZWx0YXMubGVuZ3RoICYmICFmb3VuZDsgaisrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGRlbHRhIHR5cGUgIiArIGJ1bmRsZURlbHRhc1tqXSwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGJ1bmRsZURlbHRhc1tqXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSBidW5kbGVEZWx0YXNbal0uZ2V0QnVuZGxlKCkgPT0gYWxsUmVmcmVzaEJ1bmRsZXNbaV07Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJZmFpbCgiRGlkIG5vdCBmaW5kIFJFU09MVkVEIEJ1bmRsZURlbHRhIGZvciAiICsgYWxsUmVmcmVzaEJ1bmRsZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0YWJsZUV4cG9ydHMwMTMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdWJzdGl0dXRlQmFzaWNGcmFnU3RhdGUoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGFGcmFnID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0QnVuZGxlKDIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiRnJhZyA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gY0ZyYWcgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRCdW5kbGUoNik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRCdW5kbGUoNyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRCdW5kbGUoOCk7Ci0KLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBhbGxCdW5kbGVzID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2EsIGFGcmFnLCBiLCBiRnJhZywgYywgY0ZyYWcsIGQsIGUsIGZ9OwotCQlTdGF0ZURlbHRhIHN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthfSk7Ci0JCUJ1bmRsZURlbHRhW10gYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCA5LCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsQnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBidW5kbGVEZWx0YXMubGVuZ3RoICYmICFmb3VuZDsgaisrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGRlbHRhIHR5cGUgIiArIGJ1bmRsZURlbHRhc1tqXSwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGJ1bmRsZURlbHRhc1tqXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSBidW5kbGVEZWx0YXNbal0uZ2V0QnVuZGxlKCkgPT0gYWxsQnVuZGxlc1tpXTsKLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlmYWlsKCJEaWQgbm90IGZpbmQgUkVTT0xWRUQgQnVuZGxlRGVsdGEgZm9yICIgKyBhbGxCdW5kbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtmfSk7Ci0JCWJ1bmRsZURlbHRhcyA9IHN0YXRlRGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnROb3ROdWxsKCJidW5kbGVEZWx0YXMgaXMgbnVsbCIsIGJ1bmRsZURlbHRhcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJidW5sZGVEZWx0YXMgd3JvbmcgbnVtYmVyIiwgMSwgYnVuZGxlRGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZURlbHRhID0gc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7Y30pOwotCQlidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBleHBlY3RlZFJlZnJlc2ggPSBuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7YywgY0ZyYWcsIGZ9OwotCQlhc3NlcnROb3ROdWxsKCJidW5kbGVEZWx0YXMgaXMgbnVsbCIsIGJ1bmRsZURlbHRhcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJidW5sZGVEZWx0YXMgd3JvbmcgbnVtYmVyIiwgMywgYnVuZGxlRGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkUmVmcmVzaC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBidW5kbGVEZWx0YXMubGVuZ3RoICYmICFmb3VuZDsgaisrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGRlbHRhIHR5cGUgIiArIGJ1bmRsZURlbHRhc1tqXSwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGJ1bmRsZURlbHRhc1tqXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSBidW5kbGVEZWx0YXNbal0uZ2V0QnVuZGxlKCkgPT0gZXhwZWN0ZWRSZWZyZXNoW2ldOwotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCWZhaWwoIkRpZCBub3QgZmluZCBSRVNPTFZFRCBCdW5kbGVEZWx0YSBmb3IgIiArIGV4cGVjdGVkUmVmcmVzaFtpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRhYmxlRXhwb3J0czAxNCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGdldFN1YnN0aXR1dGVVc2VzRnJhZ1N0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbiB6ID0gc3RhdGUuZ2V0QnVuZGxlKDApOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZyA9IHN0YXRlLmdldEJ1bmRsZSgyKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYkZyYWcgPSBzdGF0ZS5nZXRCdW5kbGUoNCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGNGcmFnID0gc3RhdGUuZ2V0QnVuZGxlKDYpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0QnVuZGxlKDcpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBlID0gc3RhdGUuZ2V0QnVuZGxlKDgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0QnVuZGxlKDkpOwotCQkvL0J1bmRsZURlc2NyaXB0aW9uIGcgPSBzdGF0ZS5nZXRCdW5kbGUoMTApOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYWxsUmVmcmVzaEJ1bmRsZXMgPSBuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7YSwgYUZyYWcsIGIsIGJGcmFnLCBjLCBjRnJhZywgZCwgZSwgZn07Ci0JCVN0YXRlRGVsdGEgc3RhdGVEZWx0YSA9IHN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2F9KTsKLQkJQnVuZGxlRGVsdGFbXSBidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlRGVsdGFzIGlzIG51bGwiLCBidW5kbGVEZWx0YXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVubGRlRGVsdGFzIHdyb25nIG51bWJlciIsIGFsbFJlZnJlc2hCdW5kbGVzLmxlbmd0aCwgYnVuZGxlRGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFJlZnJlc2hCdW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGJ1bmRsZURlbHRhcy5sZW5ndGggJiYgIWZvdW5kOyBqKyspIHsKLQkJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZGVsdGEgdHlwZSAiICsgYnVuZGxlRGVsdGFzW2pdLCBCdW5kbGVEZWx0YS5SRVNPTFZFRCwgYnVuZGxlRGVsdGFzW2pdLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZCA9IGJ1bmRsZURlbHRhc1tqXS5nZXRCdW5kbGUoKSA9PSBhbGxSZWZyZXNoQnVuZGxlc1tpXTsKLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlmYWlsKCJEaWQgbm90IGZpbmQgUkVTT0xWRUQgQnVuZGxlRGVsdGEgZm9yICIgKyBhbGxSZWZyZXNoQnVuZGxlc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdGF0ZURlbHRhID0gc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7Zn0pOwotCQlidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlRGVsdGFzIGlzIG51bGwiLCBidW5kbGVEZWx0YXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVubGRlRGVsdGFzIHdyb25nIG51bWJlciIsIDEsIGJ1bmRsZURlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGVEZWx0YSA9IHN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge3p9KTsKLQkJYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCAxLCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtjfSk7Ci0JCWJ1bmRsZURlbHRhcyA9IHN0YXRlRGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGV4cGVjdGVkUmVmcmVzaCA9IG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtjLCBjRnJhZywgZn07Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCAzLCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRSZWZyZXNoLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGJ1bmRsZURlbHRhcy5sZW5ndGggJiYgIWZvdW5kOyBqKyspIHsKLQkJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZGVsdGEgdHlwZSAiICsgYnVuZGxlRGVsdGFzW2pdLCBCdW5kbGVEZWx0YS5SRVNPTFZFRCwgYnVuZGxlRGVsdGFzW2pdLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZCA9IGJ1bmRsZURlbHRhc1tqXS5nZXRCdW5kbGUoKSA9PSBleHBlY3RlZFJlZnJlc2hbaV07Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJZmFpbCgiRGlkIG5vdCBmaW5kIFJFU09MVkVEIEJ1bmRsZURlbHRhIGZvciAiICsgZXhwZWN0ZWRSZWZyZXNoW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGFibGVFeHBvcnRzMDE1KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gZ2V0U3Vic3RpdHV0ZVVzZXNGcmFnQ3ljbGVTdGF0ZSgpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCS8vCQlCdW5kbGVEZXNjcmlwdGlvbiB6ID0gc3RhdGUuZ2V0QnVuZGxlKDApOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhRnJhZyA9IHN0YXRlLmdldEJ1bmRsZSgyKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYkZyYWcgPSBzdGF0ZS5nZXRCdW5kbGUoNCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGNGcmFnID0gc3RhdGUuZ2V0QnVuZGxlKDYpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0QnVuZGxlKDcpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBlID0gc3RhdGUuZ2V0QnVuZGxlKDgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0QnVuZGxlKDkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnID0gc3RhdGUuZ2V0QnVuZGxlKDEwKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaCA9IHN0YXRlLmdldEJ1bmRsZSgxMSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGkgPSBzdGF0ZS5nZXRCdW5kbGUoMTIpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYWxsUmVmcmVzaEJ1bmRsZXMgPSBuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7YSwgYUZyYWcsIGIsIGJGcmFnLCBjLCBjRnJhZywgZCwgZSwgZiwgZywgaCwgaX07Ci0JCVN0YXRlRGVsdGEgc3RhdGVEZWx0YSA9IHN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2F9KTsKLQkJQnVuZGxlRGVsdGFbXSBidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlRGVsdGFzIGlzIG51bGwiLCBidW5kbGVEZWx0YXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVubGRlRGVsdGFzIHdyb25nIG51bWJlciIsIGFsbFJlZnJlc2hCdW5kbGVzLmxlbmd0aCwgYnVuZGxlRGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKGludCBqID0gMDsgaiA8IGFsbFJlZnJlc2hCdW5kbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IGJ1bmRsZURlbHRhcy5sZW5ndGggJiYgIWZvdW5kOyBrKyspIHsKLQkJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZGVsdGEgdHlwZSAiICsgYnVuZGxlRGVsdGFzW2tdLCBCdW5kbGVEZWx0YS5SRVNPTFZFRCwgYnVuZGxlRGVsdGFzW2tdLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZCA9IGJ1bmRsZURlbHRhc1trXS5nZXRCdW5kbGUoKSA9PSBhbGxSZWZyZXNoQnVuZGxlc1tqXTsKLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlmYWlsKCJEaWQgbm90IGZpbmQgUkVTT0xWRUQgQnVuZGxlRGVsdGEgZm9yICIgKyBhbGxSZWZyZXNoQnVuZGxlc1tqXSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdGF0ZURlbHRhID0gc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7Zn0pOwotCQlidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlRGVsdGFzIGlzIG51bGwiLCBidW5kbGVEZWx0YXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVubGRlRGVsdGFzIHdyb25nIG51bWJlciIsIDEsIGJ1bmRsZURlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGVEZWx0YSA9IHN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2N9KTsKLQkJYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCBhbGxSZWZyZXNoQnVuZGxlcy5sZW5ndGgsIGJ1bmRsZURlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbGxSZWZyZXNoQnVuZGxlcy5sZW5ndGg7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBidW5kbGVEZWx0YXMubGVuZ3RoICYmICFmb3VuZDsgaysrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGRlbHRhIHR5cGUgIiArIGJ1bmRsZURlbHRhc1trXSwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGJ1bmRsZURlbHRhc1trXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSBidW5kbGVEZWx0YXNba10uZ2V0QnVuZGxlKCkgPT0gYWxsUmVmcmVzaEJ1bmRsZXNbal07Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJZmFpbCgiRGlkIG5vdCBmaW5kIFJFU09MVkVEIEJ1bmRsZURlbHRhIGZvciAiICsgYWxsUmVmcmVzaEJ1bmRsZXNbal0pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0YWJsZUV4cG9ydHMwMTYoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdWJzdGl0dXRlQmFzaWNSZWV4cG9ydFN0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEJ1bmRsZSgwKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEJ1bmRsZSgxKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSgyKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEJ1bmRsZSg1KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEJ1bmRsZSg2KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaCA9IHN0YXRlLmdldEJ1bmRsZSg3KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaSA9IHN0YXRlLmdldEJ1bmRsZSg4KTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFsbEJ1bmRsZXMgPSBuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7YSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaX07Ci0JCVN0YXRlRGVsdGEgc3RhdGVEZWx0YSA9IHN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2F9KTsKLQkJQnVuZGxlRGVsdGFbXSBidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlRGVsdGFzIGlzIG51bGwiLCBidW5kbGVEZWx0YXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVubGRlRGVsdGFzIHdyb25nIG51bWJlciIsIGFsbEJ1bmRsZXMubGVuZ3RoLCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgYWxsQnVuZGxlcy5sZW5ndGg7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBidW5kbGVEZWx0YXMubGVuZ3RoICYmICFmb3VuZDsgaysrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGRlbHRhIHR5cGUgIiArIGJ1bmRsZURlbHRhc1trXSwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGJ1bmRsZURlbHRhc1trXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSBidW5kbGVEZWx0YXNba10uZ2V0QnVuZGxlKCkgPT0gYWxsQnVuZGxlc1tqXTsKLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlmYWlsKCJEaWQgbm90IGZpbmQgUkVTT0xWRUQgQnVuZGxlRGVsdGEgZm9yICIgKyBhbGxCdW5kbGVzW2pdKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJc3RhdGVEZWx0YSA9IHN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2Z9KTsKLQkJYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gZXhwZWN0ZWRSZWZyZXNoID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2YsIGl9OwotCQlhc3NlcnROb3ROdWxsKCJidW5kbGVEZWx0YXMgaXMgbnVsbCIsIGJ1bmRsZURlbHRhcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJidW5sZGVEZWx0YXMgd3JvbmcgbnVtYmVyIiwgZXhwZWN0ZWRSZWZyZXNoLmxlbmd0aCwgYnVuZGxlRGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkUmVmcmVzaC5sZW5ndGg7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBidW5kbGVEZWx0YXMubGVuZ3RoICYmICFmb3VuZDsgaysrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGRlbHRhIHR5cGUgIiArIGJ1bmRsZURlbHRhc1trXSwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGJ1bmRsZURlbHRhc1trXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSBidW5kbGVEZWx0YXNba10uZ2V0QnVuZGxlKCkgPT0gZXhwZWN0ZWRSZWZyZXNoW2pdOwotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCWZhaWwoIkRpZCBub3QgZmluZCBSRVNPTFZFRCBCdW5kbGVEZWx0YSBmb3IgIiArIGV4cGVjdGVkUmVmcmVzaFtqXSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdGF0ZURlbHRhID0gc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7aX0pOwotCQlidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlRGVsdGFzIGlzIG51bGwiLCBidW5kbGVEZWx0YXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVubGRlRGVsdGFzIHdyb25nIG51bWJlciIsIDEsIGJ1bmRsZURlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGFibGVFeHBvcnRzMDE3KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gZ2V0U3Vic3RpdHV0ZVVzZXNSZWV4cG9ydFN0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24geiA9IHN0YXRlLmdldEJ1bmRsZSgwKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEJ1bmRsZSgxKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEJ1bmRsZSgyKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEJ1bmRsZSg1KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEJ1bmRsZSg2KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEJ1bmRsZSg3KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaCA9IHN0YXRlLmdldEJ1bmRsZSg4KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaSA9IHN0YXRlLmdldEJ1bmRsZSg5KTsKLQkJLy9CdW5kbGVEZXNjcmlwdGlvbiBqID0gc3RhdGUuZ2V0QnVuZGxlKDEwKTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFsbFJlZnJlc2hCdW5kbGVzID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2EsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGl9OwotCQlTdGF0ZURlbHRhIHN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthfSk7Ci0JCUJ1bmRsZURlbHRhW10gYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCBhbGxSZWZyZXNoQnVuZGxlcy5sZW5ndGgsIGJ1bmRsZURlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChpbnQgbCA9IDA7IGwgPCBhbGxSZWZyZXNoQnVuZGxlcy5sZW5ndGg7IGwrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgbSA9IDA7IG0gPCBidW5kbGVEZWx0YXMubGVuZ3RoICYmICFmb3VuZDsgbSsrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGRlbHRhIHR5cGUgIiArIGJ1bmRsZURlbHRhc1ttXSwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGJ1bmRsZURlbHRhc1ttXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSBidW5kbGVEZWx0YXNbbV0uZ2V0QnVuZGxlKCkgPT0gYWxsUmVmcmVzaEJ1bmRsZXNbbF07Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJZmFpbCgiRGlkIG5vdCBmaW5kIFJFU09MVkVEIEJ1bmRsZURlbHRhIGZvciAiICsgYWxsUmVmcmVzaEJ1bmRsZXNbbF0pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlzdGF0ZURlbHRhID0gc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7Zn0pOwotCQlidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBleHBlY3RlZFJlZnJlc2ggPSBuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7ZiwgaX07Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCBleHBlY3RlZFJlZnJlc2gubGVuZ3RoLCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGwgPSAwOyBsIDwgZXhwZWN0ZWRSZWZyZXNoLmxlbmd0aDsgbCsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBtID0gMDsgbSA8IGJ1bmRsZURlbHRhcy5sZW5ndGggJiYgIWZvdW5kOyBtKyspIHsKLQkJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZGVsdGEgdHlwZSAiICsgYnVuZGxlRGVsdGFzW21dLCBCdW5kbGVEZWx0YS5SRVNPTFZFRCwgYnVuZGxlRGVsdGFzW21dLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZCA9IGJ1bmRsZURlbHRhc1ttXS5nZXRCdW5kbGUoKSA9PSBleHBlY3RlZFJlZnJlc2hbbF07Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJZmFpbCgiRGlkIG5vdCBmaW5kIFJFU09MVkVEIEJ1bmRsZURlbHRhIGZvciAiICsgZXhwZWN0ZWRSZWZyZXNoW2xdKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtpfSk7Ci0JCWJ1bmRsZURlbHRhcyA9IHN0YXRlRGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnROb3ROdWxsKCJidW5kbGVEZWx0YXMgaXMgbnVsbCIsIGJ1bmRsZURlbHRhcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJidW5sZGVEZWx0YXMgd3JvbmcgbnVtYmVyIiwgMSwgYnVuZGxlRGVsdGFzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0ZURlbHRhID0gc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7en0pOwotCQlidW5kbGVEZWx0YXMgPSBzdGF0ZURlbHRhLmdldENoYW5nZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYnVuZGxlRGVsdGFzIGlzIG51bGwiLCBidW5kbGVEZWx0YXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYnVubGRlRGVsdGFzIHdyb25nIG51bWJlciIsIDEsIGJ1bmRsZURlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGFibGVFeHBvcnRzMDE4KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gZ2V0U3Vic3RpdHV0ZVVzZXNSZWV4cG9ydEN5Y2xlU3RhdGUoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0QnVuZGxlKDIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0QnVuZGxlKDMpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0QnVuZGxlKDQpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBlID0gc3RhdGUuZ2V0QnVuZGxlKDUpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0QnVuZGxlKDYpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBnID0gc3RhdGUuZ2V0QnVuZGxlKDcpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBoID0gc3RhdGUuZ2V0QnVuZGxlKDgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBpID0gc3RhdGUuZ2V0QnVuZGxlKDkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBqID0gc3RhdGUuZ2V0QnVuZGxlKDEwKTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFsbFJlZnJlc2hCdW5kbGVzID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2EsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGp9OwotCQlTdGF0ZURlbHRhIHN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthfSk7Ci0JCUJ1bmRsZURlbHRhW10gYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCBhbGxSZWZyZXNoQnVuZGxlcy5sZW5ndGgsIGJ1bmRsZURlbHRhcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChpbnQgayA9IDA7IGsgPCBhbGxSZWZyZXNoQnVuZGxlcy5sZW5ndGg7IGsrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBidW5kbGVEZWx0YXMubGVuZ3RoICYmICFmb3VuZDsgbCsrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGRlbHRhIHR5cGUgIiArIGJ1bmRsZURlbHRhc1tsXSwgQnVuZGxlRGVsdGEuUkVTT0xWRUQsIGJ1bmRsZURlbHRhc1tsXS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSBidW5kbGVEZWx0YXNbbF0uZ2V0QnVuZGxlKCkgPT0gYWxsUmVmcmVzaEJ1bmRsZXNba107Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJZmFpbCgiRGlkIG5vdCBmaW5kIFJFU09MVkVEIEJ1bmRsZURlbHRhIGZvciAiICsgYWxsUmVmcmVzaEJ1bmRsZXNba10pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJc3RhdGVEZWx0YSA9IHN0YXRlLnJlc29sdmUobmV3IEJ1bmRsZURlc2NyaXB0aW9uW10ge2l9KTsKLQkJYnVuZGxlRGVsdGFzID0gc3RhdGVEZWx0YS5nZXRDaGFuZ2VzKCk7Ci0JCWFzc2VydE5vdE51bGwoImJ1bmRsZURlbHRhcyBpcyBudWxsIiwgYnVuZGxlRGVsdGFzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJ1bmxkZURlbHRhcyB3cm9uZyBudW1iZXIiLCAxLCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRlRGVsdGEgPSBzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtjfSk7Ci0JCWJ1bmRsZURlbHRhcyA9IHN0YXRlRGVsdGEuZ2V0Q2hhbmdlcygpOwotCQlhc3NlcnROb3ROdWxsKCJidW5kbGVEZWx0YXMgaXMgbnVsbCIsIGJ1bmRsZURlbHRhcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJidW5sZGVEZWx0YXMgd3JvbmcgbnVtYmVyIiwgYWxsUmVmcmVzaEJ1bmRsZXMubGVuZ3RoLCBidW5kbGVEZWx0YXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGsgPSAwOyBrIDwgYWxsUmVmcmVzaEJ1bmRsZXMubGVuZ3RoOyBrKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGwgPSAwOyBsIDwgYnVuZGxlRGVsdGFzLmxlbmd0aCAmJiAhZm91bmQ7IGwrKykgewotCQkJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBkZWx0YSB0eXBlICIgKyBidW5kbGVEZWx0YXNbbF0sIEJ1bmRsZURlbHRhLlJFU09MVkVELCBidW5kbGVEZWx0YXNbbF0uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvdW5kID0gYnVuZGxlRGVsdGFzW2xdLmdldEJ1bmRsZSgpID09IGFsbFJlZnJlc2hCdW5kbGVzW2tdOwotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCWZhaWwoIkRpZCBub3QgZmluZCBSRVNPTFZFRCBCdW5kbGVEZWx0YSBmb3IgIiArIGFsbFJlZnJlc2hCdW5kbGVzW2tdKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGFibGVFeHBvcnRzMDE5KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gZ2V0U3Vic3RpdHV0ZVVucmVzb2x2ZWRGcmFnU3RhdGUoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCi0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGFGcmFnID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0QnVuZGxlKDIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiRnJhZyA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gY0ZyYWcgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRCdW5kbGUoNik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRCdW5kbGUoNyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRCdW5kbGUoOCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjAuMSIsIGFGcmFnLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjEuMSIsIGJGcmFnLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgYy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKCIxLjIuMSIsIGNGcmFnLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRnJhZ1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhhRnJhZyk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoYik7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJGcmFnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGJGcmFnKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhjKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY0ZyYWdWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoY0ZyYWcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYUZyYWdWaXNpYmxlIGlzIG51bGwiLCBhRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImJWaXNpYmxlIGlzIG51bGwiLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYkZyYWdWaXNpYmxlIGlzIG51bGwiLCBiRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImNWaXNpYmxlIGlzIG51bGwiLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY0ZyYWdWaXNpYmxlIGlzIG51bGwiLCBjRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYUZyYWdWaXNpYmxlIHdyb25nIG51bWJlciIsIDAsIGFGcmFnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJGcmFnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBiRnJhZ1Zpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjRnJhZ1Zpc2libGUgd3JvbmcgbnVtYmVyIiwgMCwgY0ZyYWdWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiYSBoYXMgd3JvbmcgbnVtYmVyIG9mIGV4cG9ydHMiLCAyLCBhRXhwb3J0cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJiVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJlVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBlVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJmVmlzaWJsZSBub3QgY29ycmVjdCIsIGFFeHBvcnRzLCBmVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0YWJsZUV4cG9ydHMwMjAoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdWJzdGl0dXRlVW5yZXNvbHZlZEZyYWdTdGF0ZSgpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEJ1bmRsZSgwKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUZyYWcgPSBzdGF0ZS5nZXRCdW5kbGUoMSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRCdW5kbGUoMik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJGcmFnID0gc3RhdGUuZ2V0QnVuZGxlKDMpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0QnVuZGxlKDQpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjRnJhZyA9IHN0YXRlLmdldEJ1bmRsZSg1KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEJ1bmRsZSg2KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEJ1bmRsZSg3KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEJ1bmRsZSg4KTsKLQotCQkvLyBhZGQgYSBidW5kbGUgdG8gcmVzb2x2ZSB0aGUgZnJhZ21lbnRzIGltcG9ydCBvZiBxCi0JCUhhc2h0YWJsZSBtYW5pZmVzdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOyAvLyROT04tTkxTLTEkCi0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIlEiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAicTsgdmVyc2lvbj0xLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlCdW5kbGVEZXNjcmlwdGlvbiBxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSArIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBmLmdldEJ1bmRsZUlkKCkgKyAxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHEpOwotCQlzdGF0ZS5yZXNvbHZlKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHthfSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMC4xIiwgYUZyYWcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xLjEiLCBiRnJhZy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIuMSIsIGNGcmFnLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRnJhZ1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhhRnJhZyk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoYik7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGJGcmFnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGJGcmFnKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhjKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY0ZyYWdWaXNpYmxlID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXRWaXNpYmxlUGFja2FnZXMoY0ZyYWcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYUZyYWdWaXNpYmxlIGlzIG51bGwiLCBhRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImJWaXNpYmxlIGlzIG51bGwiLCBiVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYkZyYWdWaXNpYmxlIGlzIG51bGwiLCBiRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImNWaXNpYmxlIGlzIG51bGwiLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiY0ZyYWdWaXNpYmxlIGlzIG51bGwiLCBjRnJhZ1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYUZyYWdWaXNpYmxlIHdyb25nIG51bWJlciIsIDEsIGFGcmFnVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJGcmFnVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBiRnJhZ1Zpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjRnJhZ1Zpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgY0ZyYWdWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMywgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDMsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiYSBoYXMgd3JvbmcgbnVtYmVyIG9mIGV4cG9ydHMiLCAzLCBhRXhwb3J0cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYURlY2xhcmVkRXhwb3J0cyA9IGEuZ2V0RXhwb3J0UGFja2FnZXMoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYUZyYWdFeHBlY3RlZCA9IG5ldyBFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSB7YUV4cG9ydHNbMl0sIHEuZ2V0RXhwb3J0UGFja2FnZXMoKVswXX07Ci0JCWFzc2VydEVxdWFscygiYUZyYWdWaXNpYmxlIG5vdCBjb3JyZWN0IiwgcS5nZXRTZWxlY3RlZEV4cG9ydHMoKSwgYUZyYWdWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYURlY2xhcmVkRXhwb3J0cywgYlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYkZyYWdWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUZyYWdFeHBlY3RlZCwgYkZyYWdWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYURlY2xhcmVkRXhwb3J0cywgY1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY0ZyYWdWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUZyYWdFeHBlY3RlZCwgY0ZyYWdWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygiZFZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZFZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZlZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnN0aXR1dGFibGVFeHBvcnRzMDIxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gZ2V0U3Vic3RpdHV0ZUJhc2ljU3RhdGUoKTsKLQkJc3RhdGUucmVzb2x2ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0QnVuZGxlKDApOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiID0gc3RhdGUuZ2V0QnVuZGxlKDEpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBjID0gc3RhdGUuZ2V0QnVuZGxlKDIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBkID0gc3RhdGUuZ2V0QnVuZGxlKDMpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBlID0gc3RhdGUuZ2V0QnVuZGxlKDQpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBmID0gc3RhdGUuZ2V0QnVuZGxlKDUpOwotCi0JCXN0YXRlLnJlbW92ZUJ1bmRsZShhKTsKLQkJc3RhdGUucmVzb2x2ZShuZXcgQnVuZGxlRGVzY3JpcHRpb25bXSB7YX0pOwotCQlhc3NlcnRGYWxzZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCBjLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoIjEuMyIsIGQuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjQiLCBlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS41IiwgZi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYlZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhiKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gY1Zpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhjKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZFZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhkKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZVZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhlKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZlZpc2libGUgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcyhmKTsKLQotCQlhc3NlcnROb3ROdWxsKCJiVmlzaWJsZSBpcyBudWxsIiwgYlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImNWaXNpYmxlIGlzIG51bGwiLCBjVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZFZpc2libGUgaXMgbnVsbCIsIGRWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJlVmlzaWJsZSBpcyBudWxsIiwgZVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImZWaXNpYmxlIGlzIG51bGwiLCBmVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIHdyb25nIG51bWJlciIsIDAsIGJWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBjVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZFZpc2libGUgd3JvbmcgbnVtYmVyIiwgMCwgZFZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImVWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGVWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJmVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBmVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gYkV4cG9ydHMgPSBiLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYkV4cG9ydHMsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImVWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYkV4cG9ydHMsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYkV4cG9ydHMsIGZWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRhYmxlRXhwb3J0czAyMigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGdldFN1YnN0aXR1dGVTcGxpdFN0YXRlKCk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYSA9IHN0YXRlLmdldEJ1bmRsZSgwKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYiA9IHN0YXRlLmdldEJ1bmRsZSgxKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEJ1bmRsZSgyKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZCA9IHN0YXRlLmdldEJ1bmRsZSgzKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEJ1bmRsZSg0KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEJ1bmRsZSg1KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZyA9IHN0YXRlLmdldEJ1bmRsZSg2KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaCA9IHN0YXRlLmdldEJ1bmRsZSg3KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaSA9IHN0YXRlLmdldEJ1bmRsZSg4KTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gaiA9IHN0YXRlLmdldEJ1bmRsZSg5KTsKLQotCQlhc3NlcnRUcnVlKCIxLjAiLCBhLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMiIsIGMuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBkLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwgZS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNSIsIGYuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjYiLCBnLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS43IiwgaC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuOCIsIGkuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjkiLCBqLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGIpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBjVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGMpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBoVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGgpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBpVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGkpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBqVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGopOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYlZpc2libGUgaXMgbnVsbCIsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJjVmlzaWJsZSBpcyBudWxsIiwgY1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImdWaXNpYmxlIGlzIG51bGwiLCBnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiaFZpc2libGUgaXMgbnVsbCIsIGhWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJpVmlzaWJsZSBpcyBudWxsIiwgaVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImpWaXNpYmxlIGlzIG51bGwiLCBqVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRFcXVhbHMoImFWaXNpYmxlIHdyb25nIG51bWJlciIsIDAsIGFWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJiVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBiVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiY1Zpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgY1Zpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImRWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGRWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJlVmlzaWJsZSB3cm9uZyBudW1iZXIiLCA0LCBlVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZlZpc2libGUgd3JvbmcgbnVtYmVyIiwgNCwgZlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImdWaXNpYmxlIHdyb25nIG51bWJlciIsIDQsIGdWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJoVmlzaWJsZSB3cm9uZyBudW1iZXIiLCA0LCBoVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaVZpc2libGUgd3JvbmcgbnVtYmVyIiwgNCwgaVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImpWaXNpYmxlIHdyb25nIG51bWJlciIsIDQsIGpWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiYVZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgYS5nZXRFeHBvcnRQYWNrYWdlcygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImRWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGRWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGFFeHBvcnRlZCA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGRFeHBvcnRlZCA9IGQuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cGVjdGVkID0gbmV3IEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvblthRXhwb3J0ZWQubGVuZ3RoICsgZEV4cG9ydGVkLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYUV4cG9ydGVkLCAwLCBleHBlY3RlZCwgMCwgYUV4cG9ydGVkLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZEV4cG9ydGVkLCAwLCBleHBlY3RlZCwgYUV4cG9ydGVkLmxlbmd0aCwgZEV4cG9ydGVkLmxlbmd0aCk7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBleHBlY3RlZC5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWFzc2VydENvbnRhaW5zKCJlVmlzaWJsZSBub3QgY29ycmVjdCIsIGVWaXNpYmxlLCBleHBlY3RlZFtpbmRleF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRDb250YWlucygiZlZpc2libGUgbm90IGNvcnJlY3QiLCBmVmlzaWJsZSwgZXhwZWN0ZWRbaW5kZXhdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0Q29udGFpbnMoImdWaXNpYmxlIG5vdCBjb3JyZWN0IiwgZ1Zpc2libGUsIGV4cGVjdGVkW2luZGV4XSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydENvbnRhaW5zKCJoVmlzaWJsZSBub3QgY29ycmVjdCIsIGhWaXNpYmxlLCBleHBlY3RlZFtpbmRleF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRDb250YWlucygiaVZpc2libGUgbm90IGNvcnJlY3QiLCBpVmlzaWJsZSwgZXhwZWN0ZWRbaW5kZXhdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0Q29udGFpbnMoImpWaXNpYmxlIG5vdCBjb3JyZWN0IiwgalZpc2libGUsIGV4cGVjdGVkW2luZGV4XSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRhYmxlRXhwb3J0czAyMygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGdldFN1YnN0aXR1dGVTcGxpdFVzZXNTdGF0ZSgpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRCdW5kbGUoMSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRCdW5kbGUoMik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRCdW5kbGUoMyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRCdW5kbGUoNCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGcgPSBzdGF0ZS5nZXRCdW5kbGUoNik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGggPSBzdGF0ZS5nZXRCdW5kbGUoNyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGkgPSBzdGF0ZS5nZXRCdW5kbGUoOCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGogPSBzdGF0ZS5nZXRCdW5kbGUoOSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGsgPSBzdGF0ZS5nZXRCdW5kbGUoMTApOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBsID0gc3RhdGUuZ2V0QnVuZGxlKDExKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gbSA9IHN0YXRlLmdldEJ1bmRsZSgxMik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIG4gPSBzdGF0ZS5nZXRCdW5kbGUoMTMpOwotCi0JCWFzc2VydFRydWUoIjEuMCIsIGEuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjEiLCBiLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgYy5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMyIsIGQuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjQiLCBlLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS41IiwgZi5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNiIsIGcuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjciLCBoLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS44IiwgaS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuOSIsIGouaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjkiLCBrLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS45IiwgbC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuOSIsIGouaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjkiLCBuLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGIpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBjVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGMpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBnVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGcpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBoVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGgpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBpVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGkpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBqVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGopOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBrVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGspOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBsVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGwpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBtVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKG0pOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBuVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKG4pOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYlZpc2libGUgaXMgbnVsbCIsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJjVmlzaWJsZSBpcyBudWxsIiwgY1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImdWaXNpYmxlIGlzIG51bGwiLCBnVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiaFZpc2libGUgaXMgbnVsbCIsIGhWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJpVmlzaWJsZSBpcyBudWxsIiwgaVZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImpWaXNpYmxlIGlzIG51bGwiLCBqVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgia1Zpc2libGUgaXMgbnVsbCIsIGtWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJsVmlzaWJsZSBpcyBudWxsIiwgbFZpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIm1WaXNpYmxlIGlzIG51bGwiLCBtVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiblZpc2libGUgaXMgbnVsbCIsIG5WaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydEVxdWFscygiYVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMSwgYVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIHdyb25nIG51bWJlciIsIDMsIGJWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJjVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAzLCBjVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZFZpc2libGUgd3JvbmcgbnVtYmVyIiwgMywgZFZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImVWaXNpYmxlIHdyb25nIG51bWJlciIsIDUsIGVWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJmVmlzaWJsZSB3cm9uZyBudW1iZXIiLCA1LCBmVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZ1Zpc2libGUgd3JvbmcgbnVtYmVyIiwgNCwgZ1Zpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImhWaXNpYmxlIHdyb25nIG51bWJlciIsIDQsIGhWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJpVmlzaWJsZSB3cm9uZyBudW1iZXIiLCA0LCBpVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygialZpc2libGUgd3JvbmcgbnVtYmVyIiwgNCwgalZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImtWaXNpYmxlIHdyb25nIG51bWJlciIsIDAsIGtWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJsVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBsVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibVZpc2libGUgd3JvbmcgbnVtYmVyIiwgNiwgbVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm5WaXNpYmxlIHdyb25nIG51bWJlciIsIDYsIG5WaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiYUV4cG9ydHMgd3JvbmcgbnVtYmVyIiwgMiwgYUV4cG9ydHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiY0V4cGVjdGVkID0gbmV3IEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIHthRXhwb3J0c1swXSwgYUV4cG9ydHNbMV0sIGwuZ2V0U2VsZWN0ZWRFeHBvcnRzKClbMF19OwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwZWN0ZWQgPSBuZXcgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10ge2wuZ2V0U2VsZWN0ZWRFeHBvcnRzKClbMF19OwotCQlhc3NlcnRFcXVhbHMoImFWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cGVjdGVkLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJiVmlzaWJsZSBub3QgY29ycmVjdCIsIGJjRXhwZWN0ZWQsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYmNFeHBlY3RlZCwgY1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZEV4cGVjdGVkID0gbmV3IEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIHtsLmdldFNlbGVjdGVkRXhwb3J0cygpWzFdLCBhRXhwb3J0c1swXSwgYUV4cG9ydHNbMV19OwotCQlhc3NlcnRFcXVhbHMoImRWaXNpYmxlIG5vdCBjb3JyZWN0IiwgZEV4cGVjdGVkLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0ZWQgPSBhLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkRXhwb3J0ZWQgPSBkLmdldFNlbGVjdGVkRXhwb3J0cygpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlZkV4cGVjdGVkID0gbmV3IEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvblthRXhwb3J0ZWQubGVuZ3RoICsgZEV4cG9ydGVkLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFFeHBvcnRlZCwgMCwgZWZFeHBlY3RlZCwgMCwgYUV4cG9ydGVkLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZEV4cG9ydGVkLCAwLCBlZkV4cGVjdGVkLCBhRXhwb3J0ZWQubGVuZ3RoLCBkRXhwb3J0ZWQubGVuZ3RoKTsKLQkJZWZFeHBlY3RlZFthRXhwb3J0ZWQubGVuZ3RoICsgZEV4cG9ydGVkLmxlbmd0aF0gPSBsLmdldFNlbGVjdGVkRXhwb3J0cygpWzFdOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWZFeHBlY3RlZC5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWFzc2VydENvbnRhaW5zKCJlVmlzaWJsZSBub3QgY29ycmVjdCIsIGVWaXNpYmxlLCBlZkV4cGVjdGVkW2luZGV4XSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydENvbnRhaW5zKCJmVmlzaWJsZSBub3QgY29ycmVjdCIsIGZWaXNpYmxlLCBlZkV4cGVjdGVkW2luZGV4XSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGdoaWpFeHBlY3RlZCA9IG5ldyBFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bYUV4cG9ydGVkLmxlbmd0aCArIGRFeHBvcnRlZC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFFeHBvcnRlZCwgMCwgZ2hpakV4cGVjdGVkLCAwLCBhRXhwb3J0ZWQubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShkRXhwb3J0ZWQsIDAsIGdoaWpFeHBlY3RlZCwgYUV4cG9ydGVkLmxlbmd0aCwgZEV4cG9ydGVkLmxlbmd0aCk7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBnaGlqRXhwZWN0ZWQubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlhc3NlcnRDb250YWlucygiZ1Zpc2libGUgbm90IGNvcnJlY3QiLCBnVmlzaWJsZSwgZ2hpakV4cGVjdGVkW2luZGV4XSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydENvbnRhaW5zKCJoVmlzaWJsZSBub3QgY29ycmVjdCIsIGhWaXNpYmxlLCBnaGlqRXhwZWN0ZWRbaW5kZXhdKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0Q29udGFpbnMoImlWaXNpYmxlIG5vdCBjb3JyZWN0IiwgaVZpc2libGUsIGdoaWpFeHBlY3RlZFtpbmRleF0pOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRDb250YWlucygialZpc2libGUgbm90IGNvcnJlY3QiLCBqVmlzaWJsZSwgZ2hpakV4cGVjdGVkW2luZGV4XSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGxFeHBvcnRlZCA9IGwuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIG1uRXhwZWN0ZWQgPSBuZXcgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW2FFeHBvcnRlZC5sZW5ndGggKyBkRXhwb3J0ZWQubGVuZ3RoICsgbEV4cG9ydGVkLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYUV4cG9ydGVkLCAwLCBtbkV4cGVjdGVkLCAwLCBhRXhwb3J0ZWQubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShkRXhwb3J0ZWQsIDAsIG1uRXhwZWN0ZWQsIGFFeHBvcnRlZC5sZW5ndGgsIGRFeHBvcnRlZC5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGxFeHBvcnRlZCwgMCwgbW5FeHBlY3RlZCwgYUV4cG9ydGVkLmxlbmd0aCArIGRFeHBvcnRlZC5sZW5ndGgsIGxFeHBvcnRlZC5sZW5ndGgpOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbW5FeHBlY3RlZC5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWFzc2VydENvbnRhaW5zKCJtVmlzaWJsZSBub3QgY29ycmVjdCIsIG1WaXNpYmxlLCBtbkV4cGVjdGVkW2luZGV4XSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydENvbnRhaW5zKCJuVmlzaWJsZSBub3QgY29ycmVjdCIsIG5WaXNpYmxlLCBtbkV4cGVjdGVkW2luZGV4XSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRhYmxlRXhwb3J0czAyNCgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlTdGF0ZSBzdGF0ZSA9IGdldE5vbk92ZXJsYXBpbmdTdWJzdGl0dXRlQmFzaWNTdGF0ZSgpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGEgPSBzdGF0ZS5nZXRCdW5kbGUoMCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRCdW5kbGUoMSk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGMgPSBzdGF0ZS5nZXRCdW5kbGUoMik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRCdW5kbGUoMyk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGUgPSBzdGF0ZS5nZXRCdW5kbGUoNCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGYgPSBzdGF0ZS5nZXRCdW5kbGUoNSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgYS5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMSIsIGIuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjIiLCBjLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgZC5pc1Jlc29sdmVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuNCIsIGUuaXNSZXNvbHZlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBiVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGIpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBjVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGMpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBkVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGQpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBlVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGUpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBmVmlzaWJsZSA9IHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGYpOwotCi0JCWFzc2VydE5vdE51bGwoImFWaXNpYmxlIGlzIG51bGwiLCBhVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiYlZpc2libGUgaXMgbnVsbCIsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJjVmlzaWJsZSBpcyBudWxsIiwgY1Zpc2libGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoImRWaXNpYmxlIGlzIG51bGwiLCBkVmlzaWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiZVZpc2libGUgaXMgbnVsbCIsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJmVmlzaWJsZSBpcyBudWxsIiwgZlZpc2libGUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0RXF1YWxzKCJhVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAwLCBhVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiYlZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgYlZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGNWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkVmlzaWJsZSB3cm9uZyBudW1iZXIiLCAyLCBkVmlzaWJsZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZVZpc2libGUgd3JvbmcgbnVtYmVyIiwgMiwgZVZpc2libGUubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIHdyb25nIG51bWJlciIsIDIsIGZWaXNpYmxlLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBhRXhwb3J0cyA9IGEuZ2V0U2VsZWN0ZWRFeHBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiYVZpc2libGUgbm90IGNvcnJlY3QiLCBhRXhwb3J0cywgYS5nZXRFeHBvcnRQYWNrYWdlcygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImJWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGJWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImNWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGNWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImRWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGRWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImVWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGVWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImZWaXNpYmxlIG5vdCBjb3JyZWN0IiwgYUV4cG9ydHMsIGZWaXNpYmxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1ZlcnNpb25SYW5nZVRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvVmVyc2lvblJhbmdlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzZmIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvc2VydmljZXMvcmVzb2x2ZXIvVmVyc2lvblJhbmdlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5zZXJ2aWNlcy5yZXNvbHZlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uUmFuZ2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlVmVyc2lvblJhbmdlKCkgewotCQlWZXJzaW9uUmFuZ2UgcmFuZ2U7Ci0JCXJhbmdlID0gbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMC4tKSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiMC4xIiwgVmVyc2lvbi5wYXJzZVZlcnNpb24oIjEuMCIpLCByYW5nZS5nZXRNaW5pbXVtKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiMC45IiwgIXJhbmdlLmlzSW5jbHVkZWQoVmVyc2lvbi5wYXJzZVZlcnNpb24oIjAuOSIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIxLjAiLCByYW5nZS5pc0luY2x1ZGVkKFZlcnNpb24ucGFyc2VWZXJzaW9uKCIxIikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjEuMSIsIHJhbmdlLmlzSW5jbHVkZWQoVmVyc2lvbi5wYXJzZVZlcnNpb24oIjEuMCIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIxLjIiLCByYW5nZS5pc0luY2x1ZGVkKFZlcnNpb24ucGFyc2VWZXJzaW9uKCIxLjAuMCIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIyLjEiLCAhcmFuZ2UuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMS4wLjAuMCIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIyLjIiLCAhcmFuZ2UuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMS4wLjEiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgIXJhbmdlLmlzSW5jbHVkZWQoVmVyc2lvbi5wYXJzZVZlcnNpb24oIjEuMSIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIyLjQiLCAhcmFuZ2UuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMiIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZlcnRlZFJhbmdlKCkgewotCQlWZXJzaW9uUmFuZ2UgcmFuZ2U7Ci0JCXJhbmdlID0gbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAxLjAuMF0iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIxLjAiLCAhcmFuZ2UuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMSIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIxLjEiLCAhcmFuZ2UuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMS41IikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjEuMiIsICFyYW5nZS5pc0luY2x1ZGVkKFZlcnNpb24ucGFyc2VWZXJzaW9uKCIyLjAiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgIXJhbmdlLmlzSW5jbHVkZWQoVmVyc2lvbi5wYXJzZVZlcnNpb24oIjIuNSIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIxLjQiLCAhcmFuZ2UuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMC41IikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdyZWF0ZXJUaGFuKCkgewotCQkvLyBhbnkgdmVyc2lvbiBlcXVhbCBvciBncmVhdGVyIHRoYW4gMS4wIGlzIG9rIAotCQlWZXJzaW9uUmFuZ2UgbG93ZXJCb3VuZCA9IG5ldyBWZXJzaW9uUmFuZ2UoIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgIWxvd2VyQm91bmQuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMC45IikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjEuMSIsIGxvd2VyQm91bmQuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMS4wIikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjEuMiIsIGxvd2VyQm91bmQuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMS45LjkueCIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBsb3dlckJvdW5kLmlzSW5jbHVkZWQoVmVyc2lvbi5wYXJzZVZlcnNpb24oIjk5OS45OTkuOTk5LmZvbyIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMb3dlclRoYW4oKSB7Ci0JCS8vIGFueSB2ZXJzaW9uIGxvd2VyIHRoYW4gMi4wIGlzIG9rIAkJCi0JCVZlcnNpb25SYW5nZSB1cHBlckJvdW5kID0gbmV3IFZlcnNpb25SYW5nZSgiWzAsMi4wKSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMCIsIHVwcGVyQm91bmQuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMC4wIikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjEuMSIsIHVwcGVyQm91bmQuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMC45IikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjEuMiIsIHVwcGVyQm91bmQuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMS4wIikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjEuMyIsIHVwcGVyQm91bmQuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMS45LjkueCIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIxLjQiLCAhdXBwZXJCb3VuZC5pc0luY2x1ZGVkKFZlcnNpb24ucGFyc2VWZXJzaW9uKCIyLjAiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiMS41IiwgIXVwcGVyQm91bmQuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMi4xIikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxNaW4oKSB7Ci0JCVZlcnNpb25SYW5nZSBudWxsTWluID0gbmV3IFZlcnNpb25SYW5nZShudWxsLCB0cnVlLCBuZXcgVmVyc2lvbigiMS4wIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCIwLjEiLCBudWxsTWluLmdldE1pbmltdW0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCIwLjIiLCBWZXJzaW9uLmVtcHR5VmVyc2lvbiwgbnVsbE1pbi5nZXRNaW5pbXVtKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIjEuMCIsIG51bGxNaW4uaXNJbmNsdWRlZChudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgbnVsbE1pbi5pc0luY2x1ZGVkKG5ldyBWZXJzaW9uKCIwLjAiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgbnVsbE1pbi5pc0luY2x1ZGVkKG5ldyBWZXJzaW9uKCIwLjkuOSIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCIxLjMiLCBudWxsTWluLmlzSW5jbHVkZWQoVmVyc2lvbi5wYXJzZVZlcnNpb24oIjAuOS45LngiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RmFsc2UoIjEuNCIsIG51bGxNaW4uaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiMi4wIikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEZhbHNlKCIxLjUiLCBudWxsTWluLmlzSW5jbHVkZWQoVmVyc2lvbi5wYXJzZVZlcnNpb24oIjIuMSIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsTWF4KCkgewotCQlWZXJzaW9uUmFuZ2UgbnVsbE1heEFueSA9IG5ldyBWZXJzaW9uUmFuZ2UobmV3IFZlcnNpb24oIjAiKSwgdHJ1ZSwgbnVsbCwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgbnVsbE1heEFueS5pc0luY2x1ZGVkKFZlcnNpb24ucGFyc2VWZXJzaW9uKCIwLjAiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgbnVsbE1heEFueS5pc0luY2x1ZGVkKFZlcnNpb24ucGFyc2VWZXJzaW9uKCIwLjkiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgbnVsbE1heEFueS5pc0luY2x1ZGVkKFZlcnNpb24ucGFyc2VWZXJzaW9uKCIxLjAiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgbnVsbE1heEFueS5pc0luY2x1ZGVkKFZlcnNpb24ucGFyc2VWZXJzaW9uKCIxLjkuOS54IikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjEuNCIsIG51bGxNYXhBbnkuaXNJbmNsdWRlZChWZXJzaW9uLnBhcnNlVmVyc2lvbigiOTk5Ljk5OS45OTkuZm9vIikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIjEuNSIsIG51bGxNYXhBbnkuaXNJbmNsdWRlZChuZXcgVmVyc2lvbihJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFKSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShWZXJzaW9uUmFuZ2VUZXN0cy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1hGcmllbmRzSW50ZXJuYWxSZXNvbHZlclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy9zZXJ2aWNlcy9yZXNvbHZlci9YRnJpZW5kc0ludGVybmFsUmVzb2x2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MGRmM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3NlcnZpY2VzL3Jlc29sdmVyL1hGcmllbmRzSW50ZXJuYWxSZXNvbHZlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuc2VydmljZXMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgWEZyaWVuZHNJbnRlcm5hbFJlc29sdmVyVGVzdCBleHRlbmRzIEFic3RyYWN0U3RhdGVUZXN0IHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFhGcmllbmRzSW50ZXJuYWxSZXNvbHZlclRlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBYRnJpZW5kc0ludGVybmFsUmVzb2x2ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSB4LWZyaWVuZHMgZGlyZWN0aXZlLiAgQSBidW5kbGUgc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIGltcG9ydCBhIHBhY2thZ2Ugd2hpY2gKLQkgKiBkZWNsYXJlcyBhbiB4LWZyaWVuZHMgZGlyZWN0aXZlIGFuZCB0aGUgaW1wb3J0ZXIgaXMgbm90IGEgZnJpZW5kLiAgV2hlbiBhIGJ1bmRsZSByZXF1aXJlcwotCSAqIGFudGhlciBidW5kbGUgd2hpY2ggZXhwb3J0cyBwYWNrYWdlcyB3aGljaCBkZWNsYXJlIGFuIHgtZnJpZW5kcyBkaXJlY3RpdmUgaXQgc2hvdWxkIG5vdCAKLQkgKiBoYXZlIGFjY2VzcyB0byB0aGUgcGFja2FnZXMgdW5sZXNzIHRoZSByZXF1aXJpbmcgYnVuZGxlIGlzIGEgZnJpZW5kLgotCSAqIEB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFhGcmllbmRzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCWludCBidW5kbGVJRCA9IDA7Ci0JCS8vIHRlc3QgdGhlIHNlbGVjdGlvbiBhbGdvcml0aG0gb2YgdGhlIHJlc29sdmVyIHRvIHBpY2sgdGhlIGJ1bmRsZXMgd2hpY2gKLQkJLy8gcmVzb2x2ZSB0aGUgbGFyZ2VzdCBzZXQgb2YgYnVuZGxlczsgd2l0aCBmcmFnbWVudHMgdXNpbmcgSW1wb3J0LVBhY2thZ2UKLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuZXhwb3J0ZXIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAKLQkJCQkidGVzdC5leHBvcnRlci5mb28xOyB4LWZyaWVuZHM6PVwidGVzdC5pbXBvcnRlcjEsIHRlc3QucmVxdWlyZXIxXCIsIiArCi0JCQkJInRlc3QuZXhwb3J0ZXIuZm9vMjsgeC1mcmllbmRzOj1cInRlc3QuaW1wb3J0ZXIyLCB0ZXN0LnJlcXVpcmVyMlwiLCIgKwotCQkJCSJ0ZXN0LmV4cG9ydGVyLmJhcjE7IHgtZnJpZW5kczo9XCJ0ZXN0LmltcG9ydGVyMSwgdGVzdC5yZXF1aXJlcjFcIiwiICsKLQkJCQkidGVzdC5leHBvcnRlci5iYXIyOyB4LWZyaWVuZHM6PVwidGVzdC5pbXBvcnRlcjIsIHRlc3QucmVxdWlyZXIyXCIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdEV4cG9ydGVyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LmltcG9ydGVyMSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsIAotCQkJCSJ0ZXN0LmV4cG9ydGVyLmZvbzEsIiArCi0JCQkJInRlc3QuZXhwb3J0ZXIuYmFyMSwiICsKLQkJCQkidGVzdC5leHBvcnRlci5mb28yOyByZXNvbHV0aW9uOj1vcHRpb25hbCwiICsKLQkJCQkidGVzdC5leHBvcnRlci5iYXIyOyByZXNvbHV0aW9uOj1vcHRpb25hbCIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0SW1wb3J0ZXIxID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LmltcG9ydGVyMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsIAotCQkJCSJ0ZXN0LmV4cG9ydGVyLmZvbzE7IHJlc29sdXRpb246PW9wdGlvbmFsLCIgKwotCQkJCSJ0ZXN0LmV4cG9ydGVyLmJhcjE7IHJlc29sdXRpb246PW9wdGlvbmFsLCIgKwotCQkJCSJ0ZXN0LmV4cG9ydGVyLmZvbzIsIiArCi0JCQkJInRlc3QuZXhwb3J0ZXIuYmFyMiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0SW1wb3J0ZXIyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LmltcG9ydGVyMyIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsIAotCQkJCSJ0ZXN0LmV4cG9ydGVyLmZvbzEsIiArCi0JCQkJInRlc3QuZXhwb3J0ZXIuYmFyMSwiICsKLQkJCQkidGVzdC5leHBvcnRlci5mb28yOyByZXNvbHV0aW9uOj1vcHRpb25hbCwiICsKLQkJCQkidGVzdC5leHBvcnRlci5iYXIyOyByZXNvbHV0aW9uOj1vcHRpb25hbCIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiB0ZXN0SW1wb3J0ZXIzID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LnJlcXVpcmVyMSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJ0ZXN0LmV4cG9ydGVyIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIHRlc3RSZXF1aXJlcjEgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QucmVxdWlyZXIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInRlc3QuZXhwb3J0ZXIiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gdGVzdFJlcXVpcmVyMiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCURpY3Rpb25hcnlbXSBwcm9wcyA9IG5ldyBEaWN0aW9uYXJ5W10ge25ldyBIYXNodGFibGUoKX07Ci0JCXByb3BzWzBdLnB1dCgib3NnaS5yZXNvbHZlck1vZGUiLCAic3RyaWN0Iik7Ci0KLQkJc3RhdGUuc2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKHByb3BzKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3RFeHBvcnRlcik7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0SW1wb3J0ZXIxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3RJbXBvcnRlcjIpOwotCQlzdGF0ZS5hZGRCdW5kbGUodGVzdEltcG9ydGVyMyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZSh0ZXN0UmVxdWlyZXIxKTsKLQkJc3RhdGUuYWRkQnVuZGxlKHRlc3RSZXF1aXJlcjIpOwotCQlzdGF0ZS5yZXNvbHZlKCk7Ci0KLQkJLy8gbWFrZSBzdXJlIGFsbCBidW5kbGVzIGFyZSByZXNvbHZlZCB0aGF0IHNob3VsZCBiZQotCQlhc3NlcnRUcnVlKCIxLjAiLCB0ZXN0RXhwb3J0ZXIuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgdGVzdEltcG9ydGVyMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjIiLCB0ZXN0SW1wb3J0ZXIyLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKCIxLjMiLCB0ZXN0SW1wb3J0ZXIzLmlzUmVzb2x2ZWQoKSk7IC8vIHNob3VsZCBub3QgYmUgcmVzb2x2ZWQKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwgdGVzdFJlcXVpcmVyMS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjUiLCB0ZXN0UmVxdWlyZXIyLmlzUmVzb2x2ZWQoKSk7Ci0KLQkJU3RyaW5nW10gdmFsaWRQYWNrYWdlczEgPSB7InRlc3QuZXhwb3J0ZXIuZm9vMSIsICJ0ZXN0LmV4cG9ydGVyLmJhcjEifTsKLQkJU3RyaW5nW10gdmFsaWRQYWNrYWdlczIgPSB7InRlc3QuZXhwb3J0ZXIuZm9vMiIsICJ0ZXN0LmV4cG9ydGVyLmJhcjIifTsKLQkJLy8gbWFrZSBzdXJlIHRoZSBpbXBvcnRlcnMgb25seSBnb3QgdGhlIHBhY2thZ2VzIHRoZXkgYXJlIHJlYWxseSBmcmllbmRzIHRvCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGltcG9ydGVkMSA9IHRlc3RJbXBvcnRlcjEuZ2V0UmVzb2x2ZWRJbXBvcnRzKCk7Ci0JCWFzc2VydFRydWUoIjIuMCIsIGltcG9ydGVkMSAhPSBudWxsICYmIGltcG9ydGVkMS5sZW5ndGggPT0gMik7IC8vIHNob3VsZCBvbmx5IGhhdmUgMiByZXNvbHZlZCBpbXBvcnRzCi0JCWFzc2VydFRydWUoIjIuMSIsIGNvbnRhaW5zKHZhbGlkUGFja2FnZXMxLCBpbXBvcnRlZDFbMF0uZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoIjIuMiIsIGNvbnRhaW5zKHZhbGlkUGFja2FnZXMxLCBpbXBvcnRlZDFbMV0uZ2V0TmFtZSgpKSk7Ci0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gaW1wb3J0ZWQyID0gdGVzdEltcG9ydGVyMi5nZXRSZXNvbHZlZEltcG9ydHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4wIiwgaW1wb3J0ZWQyICE9IG51bGwgJiYgaW1wb3J0ZWQyLmxlbmd0aCA9PSAyKTsgLy8gc2hvdWxkIG9ubHkgaGF2ZSAyIHJlc29sdmVkIGltcG9ydHMKLQkJYXNzZXJ0VHJ1ZSgiMy4xIiwgY29udGFpbnModmFsaWRQYWNrYWdlczIsIGltcG9ydGVkMlswXS5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4yIiwgY29udGFpbnModmFsaWRQYWNrYWdlczIsIGltcG9ydGVkMlsxXS5nZXROYW1lKCkpKTsKLQotCQlTdGF0ZUhlbHBlciBoZWxwZXIgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSByZXF1aXJlZDEgPSBoZWxwZXIuZ2V0VmlzaWJsZVBhY2thZ2VzKHRlc3RSZXF1aXJlcjEpOwotCQlhc3NlcnRUcnVlKCI0LjAiLCByZXF1aXJlZDEgIT0gbnVsbCAmJiByZXF1aXJlZDEubGVuZ3RoID09IDIpOyAvLyBzaG91bGQgb25seSBoYXZlIDIgdmlzaWJsZSBpbXBvcnRzCi0JCWFzc2VydFRydWUoIjQuMSIsIGNvbnRhaW5zKHZhbGlkUGFja2FnZXMxLCByZXF1aXJlZDFbMF0uZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoIjQuMiIsIGNvbnRhaW5zKHZhbGlkUGFja2FnZXMxLCByZXF1aXJlZDFbMV0uZ2V0TmFtZSgpKSk7Ci0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gcmVxdWlyZWQyID0gaGVscGVyLmdldFZpc2libGVQYWNrYWdlcyh0ZXN0UmVxdWlyZXIyKTsKLQkJYXNzZXJ0VHJ1ZSgiNS4wIiwgcmVxdWlyZWQyICE9IG51bGwgJiYgcmVxdWlyZWQyLmxlbmd0aCA9PSAyKTsgLy8gc2hvdWxkIG9ubHkgaGF2ZSAyIHZpc2libGUgaW1wb3J0cwotCQlhc3NlcnRUcnVlKCI1LjEiLCBjb250YWlucyh2YWxpZFBhY2thZ2VzMiwgcmVxdWlyZWQyWzBdLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKCI1LjIiLCBjb250YWlucyh2YWxpZFBhY2thZ2VzMiwgcmVxdWlyZWQyWzFdLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXNpYmxlUGFja2FnZXMwMDEoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJU3RhdGUgc3RhdGUgPSBidWlsZEVtcHR5U3RhdGUoKTsKLQkJaW50IGJ1bmRsZUlEID0gMDsKLQotCQlIYXNodGFibGUgbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiYS5iYXNlIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgImEuc3BsaXQucGtnOyBhLmJhc2U9c3BsaXQ7IG1hbmRhdG9yeTo9YS5iYXNlIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGFCYXNlID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJhLmV4dHJhIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImEuYmFzZSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAiYS5zcGxpdC5wa2ciKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYUV4dHJhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJiIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgImEuZXh0cmEiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInRlc3QuYmFzZS5leHBvcnRlci5yZXF1aXJlIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGI9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCXN0YXRlLmFkZEJ1bmRsZShhQmFzZSk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShhRXh0cmEpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYik7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQkvLyBtYWtlIHN1cmUgYWxsIGJ1bmRsZXMgYXJlIHJlc29sdmVkIHRoYXQgc2hvdWxkIGJlCi0JCWFzc2VydFRydWUoIjEuMCIsIGFCYXNlLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMSIsIGFFeHRyYS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjIiLCBiLmlzUmVzb2x2ZWQoKSk7Ci0KLQkJU3RhdGVIZWxwZXIgaGVscGVyID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gdmlzSW1wb3J0ZXIgPSBoZWxwZXIuZ2V0VmlzaWJsZVBhY2thZ2VzKGIpOwotCQlhc3NlcnRUcnVlKCIyLjAiLCB2aXNJbXBvcnRlciAhPSBudWxsICYmIHZpc0ltcG9ydGVyLmxlbmd0aCA9PSAyKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCB2aXNJbXBvcnRlclswXS5nZXROYW1lKCksICJhLnNwbGl0LnBrZyIpOwotCQlhc3NlcnRFcXVhbHMoIjIuMiIsIHZpc0ltcG9ydGVyWzFdLmdldE5hbWUoKSwgImEuc3BsaXQucGtnIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGV4cG9ydGVyMSA9IHZpc0ltcG9ydGVyWzBdLmdldEV4cG9ydGVyKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGV4cG9ydGVyMiA9IHZpc0ltcG9ydGVyWzFdLmdldEV4cG9ydGVyKCk7Ci0JCWFzc2VydFRydWUoIjIuMyIsIGV4cG9ydGVyMSAhPSBleHBvcnRlcjIpOwotCQlhc3NlcnRUcnVlKCIyLjQiLCBleHBvcnRlcjEgPT0gYUJhc2UgfHwgZXhwb3J0ZXIxID09IGFFeHRyYSk7Ci0JCWFzc2VydFRydWUoIjIuNCIsIGV4cG9ydGVyMiA9PSBhQmFzZSB8fCBleHBvcnRlcjIgPT0gYUV4dHJhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlzaWJsZVBhY2thZ2VzMDAyKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCWludCBidW5kbGVJRCA9IDA7Ci0KLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuYmFzZS5leHBvcnRlciIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsIAotCQkJCSJ0ZXN0LmJhc2U7IGJhc2UuZXhwb3J0ZXI9c3BsaXQ7IG1hbmRhdG9yeTo9YmFzZS5leHBvcnRlciIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiYXNlRXhwb3J0ZXIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuYmFzZS5leHBvcnRlci5yZXF1aXJlIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgInRlc3QuYmFzZS5leHBvcnRlciIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAKLQkJCQkidGVzdC5iYXNlOyBiYXNlLmV4cG9ydGVyLnJlcXVpcmU9c3BsaXQ7IG1hbmRhdG9yeTo9YmFzZS5leHBvcnRlci5yZXF1aXJlIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJhc2VFeHBvcnRlclJlcXVpcmUgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgInRlc3QuYmFzZS5leHBvcnRlci5yZXF1aXJlMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsIAotCQkJCSJ0ZXN0LmJhc2UuZXhwb3J0ZXIucmVxdWlyZSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAidGVzdC5iYXNlLmV4cG9ydGVyLnJlcXVpcmUiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYmFzZUV4cG9ydGVyUmVxdWlyZTIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5iYXNlLmltcG9ydGVyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgCi0JCQkJInRlc3QuYmFzZS5leHBvcnRlci5yZXF1aXJlIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJhc2VJbXBvcnRlciA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAidGVzdC5iYXNlLmltcG9ydGVyMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJ0ZXN0LmJhc2UuZXhwb3J0ZXIucmVxdWlyZTIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgInRlc3QuYmFzZSIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiYXNlSW1wb3J0ZXIyID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJbWFuaWZlc3QuY2xlYXIoKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCAiMiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsICJ0ZXN0LmJhc2UuaW1wb3J0ZXIzIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sICIxLjAiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgInRlc3QuYmFzZTsgYnVuZGxlLXN5bWJvbGljLW5hbWU9dGVzdC5iYXNlLmltcG9ydGVyMiIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBiYXNlSW1wb3J0ZXIzID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJRGljdGlvbmFyeVtdIHByb3BzID0gbmV3IERpY3Rpb25hcnlbXSB7bmV3IEhhc2h0YWJsZSgpfTsKLQkJcHJvcHNbMF0ucHV0KCJvc2dpLnJlc29sdmVyTW9kZSIsICJzdHJpY3QiKTsKLQotCQlzdGF0ZS5zZXRQbGF0Zm9ybVByb3BlcnRpZXMocHJvcHMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYmFzZUV4cG9ydGVyKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGJhc2VFeHBvcnRlclJlcXVpcmUpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYmFzZUV4cG9ydGVyUmVxdWlyZTIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYmFzZUltcG9ydGVyKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGJhc2VJbXBvcnRlcjIpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYmFzZUltcG9ydGVyMyk7Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQkvLyBtYWtlIHN1cmUgYWxsIGJ1bmRsZXMgYXJlIHJlc29sdmVkIHRoYXQgc2hvdWxkIGJlCi0JCWFzc2VydFRydWUoIjEuMCIsIGJhc2VFeHBvcnRlci5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjEiLCBiYXNlRXhwb3J0ZXJSZXF1aXJlLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMiIsIGJhc2VFeHBvcnRlclJlcXVpcmUyLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMyIsIGJhc2VJbXBvcnRlci5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjQiLCBiYXNlSW1wb3J0ZXIyLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuNSIsIGJhc2VJbXBvcnRlcjMuaXNSZXNvbHZlZCgpKTsKLQotCQlTdGF0ZUhlbHBlciBoZWxwZXIgPSBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpOwotCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSB2aXNJbXBvcnRlciA9IGhlbHBlci5nZXRWaXNpYmxlUGFja2FnZXMoYmFzZUltcG9ydGVyKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4wIiwgdmlzSW1wb3J0ZXIgIT0gbnVsbCAmJiB2aXNJbXBvcnRlci5sZW5ndGggPT0gMik7Ci0JCWFzc2VydEVxdWFscygiMi4xIiwgdmlzSW1wb3J0ZXJbMF0uZ2V0TmFtZSgpLCAidGVzdC5iYXNlIik7Ci0JCWFzc2VydEVxdWFscygiMi4yIiwgdmlzSW1wb3J0ZXJbMV0uZ2V0TmFtZSgpLCAidGVzdC5iYXNlIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGV4cG9ydGVyMSA9IHZpc0ltcG9ydGVyWzBdLmdldEV4cG9ydGVyKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGV4cG9ydGVyMiA9IHZpc0ltcG9ydGVyWzFdLmdldEV4cG9ydGVyKCk7Ci0JCWFzc2VydFRydWUoIjIuMyIsIGV4cG9ydGVyMSAhPSBleHBvcnRlcjIpOwotCQlhc3NlcnRUcnVlKCIyLjQiLCBleHBvcnRlcjEgPT0gYmFzZUV4cG9ydGVyIHx8IGV4cG9ydGVyMSA9PSBiYXNlRXhwb3J0ZXJSZXF1aXJlKTsKLQkJYXNzZXJ0VHJ1ZSgiMi41IiwgZXhwb3J0ZXIyID09IGJhc2VFeHBvcnRlciB8fCBleHBvcnRlcjIgPT0gYmFzZUV4cG9ydGVyUmVxdWlyZSk7Ci0KLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gdmlzSW1wb3J0ZXIyID0gaGVscGVyLmdldFZpc2libGVQYWNrYWdlcyhiYXNlSW1wb3J0ZXIyKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4wIiwgdmlzSW1wb3J0ZXIyICE9IG51bGwgJiYgdmlzSW1wb3J0ZXIyLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjEiLCB2aXNJbXBvcnRlcjJbMF0uZ2V0TmFtZSgpLCAidGVzdC5iYXNlLmV4cG9ydGVyLnJlcXVpcmUiKTsKLQkJYXNzZXJ0VHJ1ZSgiMy4yIiwgdmlzSW1wb3J0ZXIyWzBdLmdldEV4cG9ydGVyKCkgPT0gYmFzZUV4cG9ydGVyUmVxdWlyZTIpOwotCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIHZpc0ltcG9ydGVyMyA9IGhlbHBlci5nZXRWaXNpYmxlUGFja2FnZXMoYmFzZUltcG9ydGVyMyk7Ci0JCWFzc2VydFRydWUoIjQuMCIsIHZpc0ltcG9ydGVyMyAhPSBudWxsICYmIHZpc0ltcG9ydGVyMy5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydEVxdWFscygiNC4xIiwgdmlzSW1wb3J0ZXIzWzBdLmdldE5hbWUoKSwgInRlc3QuYmFzZSIpOwotCQlhc3NlcnRUcnVlKCI0LjIiLCB2aXNJbXBvcnRlcjNbMF0uZ2V0RXhwb3J0ZXIoKSA9PSBiYXNlSW1wb3J0ZXIyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlzaWJsZVBhY2thZ2VzMDAzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCVN0YXRlIHN0YXRlID0gYnVpbGRFbXB0eVN0YXRlKCk7Ci0JCWludCBidW5kbGVJRCA9IDA7Ci0KLQkJSGFzaHRhYmxlIG1hbmlmZXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkUiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAidGVzdC5iYXNlOyBFPXNwbGl0OyBtYW5kYXRvcnk6PUUiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZSA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiRCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJFIik7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGQgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkMiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCAiRCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAidGVzdC5iYXNlOyBEPXNwbGl0OyBtYW5kYXRvcnk6PUQiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYyA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQiIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJGOyAiICsgQ29uc3RhbnRzLlZJU0lCSUxJVFlfRElSRUNUSVZFICsgIjo9IiArIENvbnN0YW50cy5WSVNJQklMSVRZX1JFRVhQT1JUICk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGIgPSBzdGF0ZS5nZXRGYWN0b3J5KCkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLCBidW5kbGVJRCsrKTsKLQotCQltYW5pZmVzdC5jbGVhcigpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sICIyIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgIkYiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgIjEuMCIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAidGVzdC5iYXNlOyBGPXNwbGl0OyBtYW5kYXRvcnk6PUYiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZiA9IHN0YXRlLmdldEZhY3RvcnkoKS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksIGJ1bmRsZUlEKyspOwotCi0JCW1hbmlmZXN0LmNsZWFyKCk7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgIjIiKTsKLQkJbWFuaWZlc3QucHV0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAiQSIpOwotCQltYW5pZmVzdC5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCAiMS4wIik7Ci0JCW1hbmlmZXN0LnB1dChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsICJCOyAiICsgQ29uc3RhbnRzLlZJU0lCSUxJVFlfRElSRUNUSVZFICsgIjo9IiArIENvbnN0YW50cy5WSVNJQklMSVRZX1JFRVhQT1JUICsgCi0JCQkJCQkJCQkJCQkJCQkJCSIsQyIpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBhID0gc3RhdGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBtYW5pZmVzdCwgKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwgYnVuZGxlSUQrKyk7Ci0KLQkJRGljdGlvbmFyeVtdIHByb3BzID0gbmV3IERpY3Rpb25hcnlbXSB7bmV3IEhhc2h0YWJsZSgpfTsKLQkJcHJvcHNbMF0ucHV0KCJvc2dpLnJlc29sdmVyTW9kZSIsICJzdHJpY3QiKTsKLQotCQlzdGF0ZS5zZXRQbGF0Zm9ybVByb3BlcnRpZXMocHJvcHMpOwotCQlzdGF0ZS5hZGRCdW5kbGUoZik7Ci0JCXN0YXRlLmFkZEJ1bmRsZShlKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGQpOwotCQlzdGF0ZS5hZGRCdW5kbGUoYyk7Ci0JCXN0YXRlLmFkZEJ1bmRsZShiKTsKLQkJc3RhdGUuYWRkQnVuZGxlKGEpOwotCi0JCXN0YXRlLnJlc29sdmUoKTsKLQotCQkvLyBtYWtlIHN1cmUgYWxsIGJ1bmRsZXMgYXJlIHJlc29sdmVkIHRoYXQgc2hvdWxkIGJlCi0JCWFzc2VydFRydWUoIjEuMCIsIGEuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4xIiwgYi5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjIiLCBjLmlzUmVzb2x2ZWQoKSk7Ci0JCWFzc2VydFRydWUoIjEuMyIsIGQuaXNSZXNvbHZlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwgZS5pc1Jlc29sdmVkKCkpOwotCQlhc3NlcnRUcnVlKCIxLjUiLCBmLmlzUmVzb2x2ZWQoKSk7Ci0KLQkJU3RhdGVIZWxwZXIgaGVscGVyID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKTsKLQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gdmlzSW1wb3J0ZXIgPSBoZWxwZXIuZ2V0VmlzaWJsZVBhY2thZ2VzKGEpOwotCQlhc3NlcnRUcnVlKCIyLjAiLCB2aXNJbXBvcnRlciAhPSBudWxsICYmIHZpc0ltcG9ydGVyLmxlbmd0aCA9PSAyKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCB2aXNJbXBvcnRlclswXS5nZXROYW1lKCksICJ0ZXN0LmJhc2UiKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjIiLCB2aXNJbXBvcnRlclsxXS5nZXROYW1lKCksICJ0ZXN0LmJhc2UiKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZXhwb3J0ZXIxID0gdmlzSW1wb3J0ZXJbMF0uZ2V0RXhwb3J0ZXIoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb24gZXhwb3J0ZXIyID0gdmlzSW1wb3J0ZXJbMV0uZ2V0RXhwb3J0ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwgZXhwb3J0ZXIxICE9IGV4cG9ydGVyMik7Ci0JCWFzc2VydFRydWUoIjIuNCIsIGV4cG9ydGVyMSA9PSBjIHx8IGV4cG9ydGVyMSA9PSBmKTsKLQkJYXNzZXJ0VHJ1ZSgiMi41IiwgZXhwb3J0ZXIyID09IGMgfHwgZXhwb3J0ZXIyID09IGYpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLQkJCWlmIChhcnJheVtpXS5lcXVhbHMoZWxlbWVudCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvdXRpbC9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2I3YjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQkvLyBUZXN0IHN1aXRlIHRvIHJ1biBhbGwgdGV4dCBwcm9jZXNzb3Igc2Vzc2lvbiB0ZXN0cwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBbGxUZXN0cygpOwotCX0KLQotCXB1YmxpYyBBbGxUZXN0cygpIHsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKE9iamVjdFBvb2xUZXN0Q2FzZS5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoTWFuaWZlc3RFbGVtZW50VGVzdENhc2UuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKE5MU1Rlc3RDYXNlLmNsYXNzKSk7Ci0JCWFkZEJpZGlUZXN0cygpOwotCQlhZGRMYXRpblRlc3RzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEJpZGlUZXN0cygpIHsKLQkJYWRkVGVzdChuZXcgVGV4dFByb2Nlc3NvclNlc3Npb25UZXN0KCJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzIiwgQmlkaVRleHRQcm9jZXNzb3JUZXN0Q2FzZS5jbGFzcywgIml3IikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMYXRpblRlc3RzKCkgewotCQlhZGRUZXN0KG5ldyBUZXh0UHJvY2Vzc29yU2Vzc2lvblRlc3QoIm9yZy5lY2xpcHNlLm9zZ2kudGVzdHMiLCBMYXRpblRleHRQcm9jZXNzb3JUZXN0Q2FzZS5jbGFzcywgImVuIikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL0JpZGlUZXh0UHJvY2Vzc29yVGVzdENhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL0JpZGlUZXh0UHJvY2Vzc29yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyNTg0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvdXRpbC9CaWRpVGV4dFByb2Nlc3NvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuVGV4dFByb2Nlc3NvcjsKLQotLyoqCi0gKiBUZXN0cyBmb3Igc3RyaW5ncyB0aGF0IHVzZSB0aGUgVGV4dFByb2Nlc3NvciBhbmQgYXJlIHJ1biBpbiBhIGJpZGkgbG9jYWxlLgotICogCi0gKiBOT1RFOiBSdW4gdGhlc2UgdGVzdHMgYXMgYSBzZXNzaW9uIHRlc3QgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgY29ycmVjdAotICoJCSBsb2NhbGUgc2V0LiAgUnVuIGNsYXNzIEFsbFRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQmlkaVRleHRQcm9jZXNzb3JUZXN0Q2FzZSBleHRlbmRzIFRleHRQcm9jZXNzb3JUZXN0Q2FzZSB7Ci0KLQkvLyBsZWZ0IHRvIHJpZ2h0IG1hcmtlcgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBMUk0gPSAnXHUyMDBlJzsKLQkvLyBsZWZ0IHRvIHJpZ2h0IGVtYmVkZGluZwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBMUkUgPSAnXHUyMDJhJzsKLQkvLyBwb3AgZGlyZWN0aW9uYWwgZm9ybWF0CQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBQREYgPSAnXHUyMDJjJzsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIXzFfUkVTVUxUID0gTFJFICsgUEFUSF8xICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIXzJfUkVTVUxUID0gTFJFICsgUEFUSF8yICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIXzNfUkVTVUxUID0gTFJFICsgUEFUSF8zICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIXzRfUkVTVUxUID0gTFJFICsgUEFUSF80ICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIXzVfUkVTVUxUID0gTFJFICsgImQiICsgIjoiICsgIlxcIiArIEhFQlJFV19TVFJJTkdfMiArICIgYWJjZGVmLSIgKyBIRUJSRVdfU1RSSU5HXzMgKyAiXFwiICsgInh5eiIgKyAiXFwiICsgImFiY2RlZiIgKyAiXFwiICsgSEVCUkVXX1NUUklOR180ICsgTFJNICsgIlxcIiArIEhFQlJFV19TVFJJTkdfNSArICIuIiArICJqYXZhIiArIFBERjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUEFUSF82X1JFU1VMVCA9IExSRSArICJkIiArICI6IiArICJcXCIgKyBIRUJSRVdfU1RSSU5HXzIgKyAiIGFiY2RlZi0iICsgSEVCUkVXX1NUUklOR18zICsgIlxcIiArICJ4eXoiICsgIlxcIiArICJhYmNkZWYiICsgIlxcIiArIEhFQlJFV19TVFJJTkdfNCArIExSTSArICJcXCIgKyBIRUJSRVdfU1RSSU5HXzUgKyBMUk0gKyAiLiIgKyBIRUJSRVdfU1RSSU5HXzYgKyBQREY7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBBVEhfN19SRVNVTFQgPSBMUkUgKyAiZCIgKyAiOiIgKyAiXFwiICsgSEVCUkVXX1NUUklOR18yICsgIiBhYmNkZWYtIiArIEhFQlJFV19TVFJJTkdfMyArICJcXCIgKyAieHl6IiArICJcXCIgKyAiYWJjZGVmIiArICJcXCIgKyBIRUJSRVdfU1RSSU5HXzQgKyAiXFwiICsgIlRlc3QiICsgIi4iICsgImphdmEiICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIXzhfUkVTVUxUID0gTFJFICsgUEFUSF84ICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIXzlfUkVTVUxUID0gTFJFICsgUEFUSF85ICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIXzEwX1JFU1VMVCA9IExSRSArIFBBVEhfMTAgKyBQREY7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBBVEhfMTFfUkVTVUxUID0gTFJFICsgUEFUSF8xMSArIFBERjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUEFUSF8xMl9SRVNVTFQgPSBQQVRIXzEyOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIXzEzX1JFU1VMVCA9IExSRSArIFBBVEhfMTMgKyBQREY7Ci0KLQkvLyBhZGRpdGlvbmFsIHN0cmluZ3MKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzFfUkVTVUxUID0gU1RSSU5HXzE7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR18yX1JFU1VMVCA9IFNUUklOR18yOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfM19SRVNVTFQgPSBMUkUgKyBTVFJJTkdfMyArIFBERjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzRfUkVTVUxUID0gTFJFICsgU1RSSU5HXzQgKyBQREY7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR181X1JFU1VMVCA9IExSRSArIFNUUklOR181ICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfNl9SRVNVTFQgPSBMUkUgKyBTVFJJTkdfNiArIFBERjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzdfUkVTVUxUID0gU1RSSU5HXzc7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR184X1JFU1VMVCA9IExSRSArIFNUUklOR184ICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfOV9SRVNVTFQgPSBMUkUgKyAiZDpcXG15Rm9sZGVyXFwiICsgSEVCUkVXX1NUUklOR181ICsgTFJNICsgIlxcIiArIEhFQlJFV19TVFJJTkdfNiArICIuamF2YSIgKyBQREY7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR18xMF9SRVNVTFQgPSBMUkUgKyAiZDpcXG15Rm9sZGVyXFwiICsgSEVCUkVXX1NUUklOR18yICsgTFJNICsgIlxcMTIzLyIgKyBIRUJSRVdfU1RSSU5HXzMgKyAiLmphdmEiICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfMTFfUkVTVUxUID0gTFJFICsgImQ6XFxteUZvbGRlclxcIiArIEhFQlJFV19TVFJJTkdfMiArIExSTSArICJcXDEyMy8iICsgSEVCUkVXX1NUUklOR18zICsgTFJNICsgIi4iICsgSEVCUkVXX1NUUklOR181ICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfMTJfUkVTVUxUID0gTFJFICsgImQ6XFxteUZvbGRlclxcIiArIEhFQlJFV19TVFJJTkdfMiArIExSTSArICJcXDEyMyIgKyBIRUJSRVdfU1RSSU5HXzMgKyBMUk0gKyAiLiIgKyBIRUJSRVdfU1RSSU5HXzYgKyBQREY7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR18xM19SRVNVTFQgPSBMUkUgKyAiZDpcXG15Rm9sZGVyXFwiICsgSEVCUkVXX1NUUklOR18yICsgTFJNICsgIlxcMTIzL215ZmlsZS4iICsgSEVCUkVXX1NUUklOR182ICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfMTRfUkVTVUxUID0gTFJFICsgImQ6XFxteUZvbGRlclxcIiArIEhFQlJFV19TVFJJTkdfMiArIExSTSArICJcXDEyM215ZmlsZS4iICsgSEVCUkVXX1NUUklOR182ICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfMTVfUkVTVUxUID0gTFJFICsgImQ6XFxteUZvbGRlclxcIiArIEhFQlJFV19TVFJJTkdfMiArICIxMi09IiArIExSTSArICJcXDw+PzM0IiArIEhFQlJFV19TVFJJTkdfNiArICIuamF2YSIgKyBQREY7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR18xNl9SRVNVTFQgPSBMUkUgKyBIRUJSRVdfU1RSSU5HXzIgKyBMUk0gKyAiLyIgKyBIRUJSRVdfU1RSSU5HXzYgKyBMUk0gKyAiLyIgKyBIRUJSRVdfU1RSSU5HXzQgKyBMUk0gKyAiLiIgKyBIRUJSRVdfU1RSSU5HXzUgKyBQREY7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR18xN19SRVNVTFQgPSBMUkUgKyBIRUJSRVdfU1RSSU5HXzcgKyBMUk0gKyAiLyIgKyBIRUJSRVdfU1RSSU5HXzggKyBMUk0gKyAiLyIgKyBIRUJSRVdfU1RSSU5HXzkgKyBMUk0gKyAiLyIgKyBIRUJSRVdfU1RSSU5HXzEwICsgTFJNICsgIi8iICsgSEVCUkVXX1NUUklOR18xMSArIExSTSArICIvIiArIEhFQlJFV19TVFJJTkdfMTIgKyBMUk0gKyAiLyIgKyBIRUJSRVdfU1RSSU5HXzEzICsgUERGOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfMThfUkVTVUxUID0gTFJFICsgIl8iICsgSEVCUkVXX1NUUklOR18yICsgIiBtaXhlZCB0ZXh0IHN0YXJ0cyBhbmQgZW5kcyB3aXRoIG5ldXRyYWwuIiArIFBERjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzE5X1JFU1VMVCA9IExSRSArICJlbmdsaXNoIGFuZCAiICsgSEVCUkVXX1NUUklOR18yICsgIiB0ZXh0IHN0YXJ0cyB3aXRoIExUUiBlbmRzIHdpdGggbmV1dHJhbCBfIiArIFBERjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBPVEhFUl9TVFJJTkdfTk9fREVMSU0gPSBMUkUgKyAiXHUwNWVhXHUwNWU5XHUwNWU4XHUwNWU3XHUwNWU2IGFiY2RlZi1cdTA1ZTVcdTA1ZTRcdTA1ZTMiICsgUERGOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE9USEVSX1NUUklOR18xX1JFU1VMVCA9IExSRSArICIqIiArICIuIiArICJqYXZhIiArIFBERjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgT1RIRVJfU1RSSU5HXzJfUkVTVUxUID0gTFJFICsgIioiICsgIi4iICsgIlx1MDVkMFx1MDVkMVx1MDVkMiIgKyBQREY7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE9USEVSX1NUUklOR18zX1JFU1VMVCA9IExSRSArICJcdTA1ZDBcdTA1ZDFcdTA1ZDIgIiArIExSTSArICI9IiArICIgXHUwNWVhXHUwNWU5XHUwNWU4XHUwNWU3XHUwNWU2IiArIFBERjsKLQkvLyByZXN1bHQgc3RyaW5ncyBpZiBudWxsIGRlbGltaXRlciBpcyBwYXNzZWQgCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE9USEVSX1NUUklOR18xX05EX1JFU1VMVCA9IExSRSArICIqIiArICIuIiArICJqYXZhIiArIFBERjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgT1RIRVJfU1RSSU5HXzJfTkRfUkVTVUxUID0gTFJFICsgIioiICsgIi4iICsgIlx1MDVkMFx1MDVkMVx1MDVkMiIgKyBQREY7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE9USEVSX1NUUklOR18zX05EX1JFU1VMVCA9IExSRSArICJcdTA1ZDBcdTA1ZDFcdTA1ZDIgIiArICI9IiArICIgXHUwNWVhXHUwNWU5XHUwNWU4XHUwNWU3XHUwNWU2IiArIFBERjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIFJFU1VMVF9ERUZBVUxUX1BBVEhTID0ge1BBVEhfMV9SRVNVTFQsIFBBVEhfMl9SRVNVTFQsIFBBVEhfM19SRVNVTFQsIFBBVEhfNF9SRVNVTFQsIFBBVEhfNV9SRVNVTFQsIFBBVEhfNl9SRVNVTFQsIFBBVEhfN19SRVNVTFQsIFBBVEhfOF9SRVNVTFQsIFBBVEhfOV9SRVNVTFQsIFBBVEhfMTBfUkVTVUxULCBQQVRIXzExX1JFU1VMVCwgUEFUSF8xMl9SRVNVTFQsIFBBVEhfMTNfUkVTVUxUfTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIFJFU1VMVF9BRERJVElPTkFMX1NUUklOR1MgPSB7U1RSSU5HXzFfUkVTVUxULCBTVFJJTkdfMl9SRVNVTFQsIFNUUklOR18zX1JFU1VMVCwgU1RSSU5HXzRfUkVTVUxULCBTVFJJTkdfNV9SRVNVTFQsIFNUUklOR182X1JFU1VMVCwgU1RSSU5HXzdfUkVTVUxULCBTVFJJTkdfOF9SRVNVTFQsIFNUUklOR185X1JFU1VMVCwgU1RSSU5HXzEwX1JFU1VMVCwgU1RSSU5HXzExX1JFU1VMVCwgU1RSSU5HXzEyX1JFU1VMVCwgU1RSSU5HXzEzX1JFU1VMVCwgU1RSSU5HXzE0X1JFU1VMVCwgU1RSSU5HXzE1X1JFU1VMVCwgU1RSSU5HXzE2X1JFU1VMVCwgU1RSSU5HXzE3X1JFU1VMVCwgU1RSSU5HXzE4X1JFU1VMVCwgU1RSSU5HXzE5X1JFU1VMVH07Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBSRVNVTFRfU1RBUl9QQVRIUyA9IHtPVEhFUl9TVFJJTkdfMV9SRVNVTFQsIE9USEVSX1NUUklOR18yX1JFU1VMVH07Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBSRVNVTFRfRVFVQUxTX1BBVEhTID0ge09USEVSX1NUUklOR18zX1JFU1VMVH07Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBSRVNVTFRfU1RBUl9QQVRIU19ORCA9IHtPVEhFUl9TVFJJTkdfMV9ORF9SRVNVTFQsIE9USEVSX1NUUklOR18yX05EX1JFU1VMVH07Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBSRVNVTFRfRVFVQUxTX1BBVEhTX05EID0ge09USEVSX1NUUklOR18zX05EX1JFU1VMVH07Ci0KLQkvLyB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBwbGF0Zm9ybSBzdXBwb3J0cyBkaXJlY3Rpb25hbCBjaGFyYWN0ZXJzCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZFBsYXRmb3JtID0gZmFsc2U7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIG9zTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9zTmFtZS5zdGFydHNXaXRoKCJ3aW5kb3dzIikgfHwgb3NOYW1lLnN0YXJ0c1dpdGgoImxpbnV4IikgfHwgb3NOYW1lLnN0YXJ0c1dpdGgoIm1hYyIpKSB7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJCS8vIE9ubHkgY29uc2lkZXIgcGxhdGZvcm1zIHRoYXQgY2FuIHN1cHBvcnQgY29udHJvbCBjaGFyYWN0ZXJzCi0JCQlpc1N1cHBvcnRlZFBsYXRmb3JtID0gdHJ1ZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGRlZmF1bHREZWxpbWl0ZXJzID0gVGV4dFByb2Nlc3Nvci5nZXREZWZhdWx0RGVsaW1pdGVycygpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG5hbWUgdGVzdCBuYW1lCi0JICovCi0JcHVibGljIEJpZGlUZXh0UHJvY2Vzc29yVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBUZXN0IFRleHRQcm9jZXNzb3IgZm9yIGZpbGUgcGF0aHMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJpZGlQYXRocygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0RFRkFVTFRfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoVEVTVF9ERUZBVUxUX1BBVEhTW2ldKTsKLQkJCWlmIChpc1N1cHBvcnRlZFBsYXRmb3JtKQotCQkJCXZlcmlmeUJpZGlSZXN1bHQoIlByb2Nlc3MgcGF0aCAiICsgKGkgKyAxKSwgcmVzdWx0LCBSRVNVTFRfREVGQVVMVF9QQVRIU1tpXSk7Ci0JCQllbHNlCi0JCQkJdmVyaWZ5UmVzdWx0KCJQcm9jZXNzIHBhdGggIiArIChpICsgMSksIHJlc3VsdCwgVEVTVF9ERUZBVUxUX1BBVEhTW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCaWRpUGF0aHNEZXByb2Nlc3MoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9ERUZBVUxUX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFRFU1RfREVGQVVMVF9QQVRIU1tpXSk7Ci0JCQlTdHJpbmcgcmVzdWx0RFAgPSBUZXh0UHJvY2Vzc29yLmRlcHJvY2VzcyhyZXN1bHQpOwotCQkJdmVyaWZ5QmlkaVJlc3VsdCgiRGVwcm9jZXNzIHBhdGggIiArIChpICsgMSksIHJlc3VsdERQLCBURVNUX0RFRkFVTFRfUEFUSFNbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJpZGlQYXRoc1dpdGhOdWxsRGVsaW1pdGVyKCkgewotCQkvLyBzaG91bGQgdXNlIGRlZmF1bHQgZGVsaW1pdGVycwotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfREVGQVVMVF9QQVRIUy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlc3VsdCA9IFRleHRQcm9jZXNzb3IucHJvY2VzcyhURVNUX0RFRkFVTFRfUEFUSFNbaV0sIG51bGwpOwotCQkJaWYgKGlzU3VwcG9ydGVkUGxhdGZvcm0pCi0JCQkJdmVyaWZ5QmlkaVJlc3VsdCgiUHJvY2VzcyBwYXRoICIgKyAoaSArIDEpLCByZXN1bHQsIFJFU1VMVF9ERUZBVUxUX1BBVEhTW2ldKTsKLQkJCWVsc2UKLQkJCQl2ZXJpZnlSZXN1bHQoIlByb2Nlc3MgcGF0aCAiICsgKGkgKyAxKSwgcmVzdWx0LCBURVNUX0RFRkFVTFRfUEFUSFNbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJpZGlTdHJpbmdXaXRoTm9EZWxpbWl0ZXJzKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKE9USEVSX1NUUklOR19OT19ERUxJTSk7Ci0JCWFzc2VydEVxdWFscygiT3RoZXIgc3RyaW5nIGNvbnRhaW5pbmcgbm8gZGVsaW1pdGVycyBub3QgZXF1aXZhbGVudC4iLCBPVEhFUl9TVFJJTkdfTk9fREVMSU0sIHJlc3VsdCk7Ci0JfQotCi0JLyoKLQkgKiBUZXN0IG90aGVyIHBvc3NpYmxlIHVzZXMgZm9yIFRleHRQcm9jZXNzb3IsIGluY2x1ZGluZyBmaWxlIGFzc29jaWF0aW9ucyBhbmQgCi0JICogdmFyaWFibGUgYXNzaWdubWVudCBzdGF0ZW1lbnRzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RPdGhlclN0cmluZ3MoKSB7Ci0JCWludCB0ZXN0TnVtID0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX1NUQVJfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoVEVTVF9TVEFSX1BBVEhTW2ldLCAiKi4iKTsKLQkJCWlmIChpc1N1cHBvcnRlZFBsYXRmb3JtKQotCQkJCXZlcmlmeUJpZGlSZXN1bHQoIk90aGVyIChzdGFyKSBzdHJpbmciICsgdGVzdE51bSwgcmVzdWx0LCBSRVNVTFRfU1RBUl9QQVRIU1tpXSk7Ci0JCQllbHNlCi0JCQkJdmVyaWZ5UmVzdWx0KCJPdGhlciAoc3Rhcikgc3RyaW5nIiArIHRlc3ROdW0sIHJlc3VsdCwgVEVTVF9TVEFSX1BBVEhTW2ldKTsKLQkJCXRlc3ROdW0rKzsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9FUVVBTFNfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoVEVTVF9FUVVBTFNfUEFUSFNbaV0sICI9Iik7Ci0JCQlpZiAoaXNTdXBwb3J0ZWRQbGF0Zm9ybSkKLQkJCQl2ZXJpZnlCaWRpUmVzdWx0KCJPdGhlciAoZXF1YWxzKSBzdHJpbmciICsgdGVzdE51bSwgcmVzdWx0LCBSRVNVTFRfRVFVQUxTX1BBVEhTW2ldKTsKLQkJCWVsc2UKLQkJCQl2ZXJpZnlSZXN1bHQoIk90aGVyIChlcXVhbHMpIHN0cmluZyIgKyB0ZXN0TnVtLCByZXN1bHQsIFRFU1RfRVFVQUxTX1BBVEhTW2ldKTsKLQkJCXRlc3ROdW0rKzsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdGhlclN0cmluZ3NEZXByb2Nlc3MoKSB7Ci0JCWludCB0ZXN0TnVtID0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX1NUQVJfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoVEVTVF9TVEFSX1BBVEhTW2ldLCAiKi4iKTsKLQkJCVN0cmluZyByZXN1bHREUCA9IFRleHRQcm9jZXNzb3IuZGVwcm9jZXNzKHJlc3VsdCk7Ci0JCQl2ZXJpZnlCaWRpUmVzdWx0KCJEZXByb2Nlc3Mgb3RoZXIgKHN0YXIpIHN0cmluZyIgKyB0ZXN0TnVtLCByZXN1bHREUCwgVEVTVF9TVEFSX1BBVEhTW2ldKTsKLQkJCXRlc3ROdW0rKzsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9FUVVBTFNfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoVEVTVF9FUVVBTFNfUEFUSFNbaV0sICI9Iik7Ci0JCQlTdHJpbmcgcmVzdWx0RFAgPSBUZXh0UHJvY2Vzc29yLmRlcHJvY2VzcyhyZXN1bHQpOwotCQkJdmVyaWZ5QmlkaVJlc3VsdCgiRGVwcm9jZXNzIG90aGVyIChlcXVhbHMpIHN0cmluZyIgKyB0ZXN0TnVtLCByZXN1bHREUCwgVEVTVF9FUVVBTFNfUEFUSFNbaV0pOwotCQkJdGVzdE51bSsrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE90aGVyU3RyaW5nc1dpdGhOdWxsRGVsaW1pdGVyKCkgewotCQlpbnQgdGVzdE51bSA9IDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9TVEFSX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFRFU1RfU1RBUl9QQVRIU1tpXSwgbnVsbCk7Ci0JCQlpZiAoaXNTdXBwb3J0ZWRQbGF0Zm9ybSkKLQkJCQl2ZXJpZnlCaWRpUmVzdWx0KCJPdGhlciAoc3Rhcikgc3RyaW5nIiArIHRlc3ROdW0sIHJlc3VsdCwgUkVTVUxUX1NUQVJfUEFUSFNfTkRbaV0pOwotCQkJZWxzZQotCQkJCXZlcmlmeVJlc3VsdCgiT3RoZXIgKHN0YXIpIHN0cmluZyIgKyB0ZXN0TnVtLCByZXN1bHQsIFRFU1RfU1RBUl9QQVRIU1tpXSk7Ci0JCQl0ZXN0TnVtKys7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfRVFVQUxTX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFRFU1RfRVFVQUxTX1BBVEhTW2ldLCBudWxsKTsKLQkJCWlmIChpc1N1cHBvcnRlZFBsYXRmb3JtKQotCQkJCXZlcmlmeUJpZGlSZXN1bHQoIk90aGVyIChlcXVhbHMpIHN0cmluZyIgKyB0ZXN0TnVtLCByZXN1bHQsIFJFU1VMVF9FUVVBTFNfUEFUSFNfTkRbaV0pOwotCQkJZWxzZSB7Ci0JCQkJdmVyaWZ5UmVzdWx0KCJPdGhlciAoZXF1YWxzKSBzdHJpbmciICsgdGVzdE51bSwgcmVzdWx0LCBURVNUX0VRVUFMU19QQVRIU1tpXSk7Ci0JCQl9Ci0JCQl0ZXN0TnVtKys7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRlc3QgdGhlIHJlc3VsdCB0byBlbnN1cmUgbWFya2VycyBhcmVuJ3QgYWRkZWQgbW9yZSB0aGFuIG9uY2UgaWYgdGhlIAotCSAqIHN0cmluZyBpcyBwcm9jZXNzZWQgbXVsdGlwbGUgdGltZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVByb2Nlc3NQYXRocygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0RFRkFVTFRfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoVEVTVF9ERUZBVUxUX1BBVEhTW2ldKTsKLQkJCXJlc3VsdCA9IFRleHRQcm9jZXNzb3IucHJvY2VzcyhyZXN1bHQpOwotCQkJaWYgKGlzU3VwcG9ydGVkUGxhdGZvcm0pCi0JCQkJdmVyaWZ5QmlkaVJlc3VsdCgiUGF0aCAiICsgKGkgKyAxKSwgcmVzdWx0LCBSRVNVTFRfREVGQVVMVF9QQVRIU1tpXSk7Ci0JCQllbHNlCi0JCQkJdmVyaWZ5UmVzdWx0KCJQYXRoICIgKyAoaSArIDEpLCByZXN1bHQsIFRFU1RfREVGQVVMVF9QQVRIU1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRlc3QgdGhlIHJlc3VsdCB0byBlbnN1cmUgbWFya2VycyBhcmVuJ3QgYWRkZWQgbW9yZSB0aGFuIG9uY2UgaWYgdGhlIAotCSAqIHN0cmluZyBpcyBwcm9jZXNzZWQgbXVsdGlwbGUgdGltZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVByb2Nlc3NPdGhlclN0cmluZ3MoKSB7Ci0JCWludCB0ZXN0TnVtID0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX1NUQVJfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoVEVTVF9TVEFSX1BBVEhTW2ldLCAiKi4iKTsKLQkJCXJlc3VsdCA9IFRleHRQcm9jZXNzb3IucHJvY2VzcyhyZXN1bHQsICIqLiIpOwotCQkJaWYgKGlzU3VwcG9ydGVkUGxhdGZvcm0pCi0JCQkJdmVyaWZ5QmlkaVJlc3VsdCgiT3RoZXIgKHN0YXIpIHN0cmluZyAiICsgdGVzdE51bSwgcmVzdWx0LCBSRVNVTFRfU1RBUl9QQVRIU1tpXSk7Ci0JCQllbHNlCi0JCQkJdmVyaWZ5UmVzdWx0KCJPdGhlciAoc3Rhcikgc3RyaW5nICIgKyB0ZXN0TnVtLCByZXN1bHQsIFRFU1RfU1RBUl9QQVRIU1tpXSk7Ci0JCQl0ZXN0TnVtKys7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfRVFVQUxTX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFRFU1RfRVFVQUxTX1BBVEhTW2ldLCAiPSIpOwotCQkJcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHJlc3VsdCwgIj0iKTsKLQkJCWlmIChpc1N1cHBvcnRlZFBsYXRmb3JtKQotCQkJCXZlcmlmeUJpZGlSZXN1bHQoIk90aGVyIChlcXVhbHMpIHN0cmluZyIgKyB0ZXN0TnVtLCByZXN1bHQsIFJFU1VMVF9FUVVBTFNfUEFUSFNbaV0pOwotCQkJZWxzZQotCQkJCXZlcmlmeVJlc3VsdCgiT3RoZXIgKGVxdWFscykgc3RyaW5nIiArIHRlc3ROdW0sIHJlc3VsdCwgVEVTVF9FUVVBTFNfUEFUSFNbaV0pOwotCQkJdGVzdE51bSsrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZGl0aW9uYWxTdHJpbmdzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfQURESVRJT05BTF9TVFJJTkdTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFRFU1RfQURESVRJT05BTF9TVFJJTkdTW2ldKTsKLQkJCWlmIChpc1N1cHBvcnRlZFBsYXRmb3JtKQotCQkJCXZlcmlmeUJpZGlSZXN1bHQoIkFkZGl0aW9uYWwgc3RyaW5nICIgKyAoaSArIDEpLCByZXN1bHQsIFJFU1VMVF9BRERJVElPTkFMX1NUUklOR1NbaV0pOwotCQkJZWxzZQotCQkJCXZlcmlmeVJlc3VsdCgiQWRkaXRpb25hbCBzdHJpbmcgIiArIChpICsgMSksIHJlc3VsdCwgVEVTVF9BRERJVElPTkFMX1NUUklOR1NbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZGl0aW9uYWxTdHJpbmdzRGVwcm9jZXNzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfQURESVRJT05BTF9TVFJJTkdTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFRFU1RfQURESVRJT05BTF9TVFJJTkdTW2ldKTsKLQkJCVN0cmluZyByZXN1bHREUCA9IFRleHRQcm9jZXNzb3IuZGVwcm9jZXNzKHJlc3VsdCk7Ci0JCQl2ZXJpZnlCaWRpUmVzdWx0KCJBZGRpdGlvbmFsIHN0cmluZyAiICsgKGkgKyAxKSwgcmVzdWx0RFAsIFRFU1RfQURESVRJT05BTF9TVFJJTkdTW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZ1BhcmFtcygpIHsKLQkJdmVyaWZ5QmlkaVJlc3VsdCgiVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFN0cmluZykgZm9yIGVtcHR5IHN0cmluZyAiLCBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoIiIpLCBFTVBUWV9TVFJJTkcpOwotCQl2ZXJpZnlCaWRpUmVzdWx0KCJUZXh0UHJvY2Vzc29yLnByb2Nlc3MoU3RyaW5nLCBTdHJpbmcpIGZvciBlbXB0eSBzdHJpbmdzICIsIFRleHRQcm9jZXNzb3IucHJvY2VzcygiIiwgIiIpLCBFTVBUWV9TVFJJTkcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZ1BhcmFtc0RlcHJvY2VzcygpIHsKLQkJdmVyaWZ5QmlkaVJlc3VsdCgiVGV4dFByb2Nlc3Nvci5kZXByb2Nlc3MoU3RyaW5nKSBmb3IgZW1wdHkgc3RyaW5nICIsIFRleHRQcm9jZXNzb3IuZGVwcm9jZXNzKCIiKSwgRU1QVFlfU1RSSU5HKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFBhcmFtcygpIHsKLQkJYXNzZXJ0TnVsbCgiVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFN0cmluZykgZm9yIG51bGwgcGFyYW0gIiwgVGV4dFByb2Nlc3Nvci5wcm9jZXNzKG51bGwpKTsKLQkJYXNzZXJ0TnVsbCgiVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFN0cmluZywgU3RyaW5nKSBmb3IgcGFyYW1zICIsIFRleHRQcm9jZXNzb3IucHJvY2VzcyhudWxsLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxQYXJhbXNEZXByb2Nlc3MoKSB7Ci0JCWFzc2VydE51bGwoIlRleHRQcm9jZXNzb3IuZGVwcm9jZXNzKFN0cmluZykgZm9yIG51bGwgcGFyYW0gIiwgVGV4dFByb2Nlc3Nvci5kZXByb2Nlc3MobnVsbCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlCaWRpUmVzdWx0KFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nIHJlc3VsdCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWJvb2xlYW4gdGVzdFJlc3VsdCA9IHJlc3VsdC5lcXVhbHMoZXhwZWN0ZWQpOwotCQlhc3NlcnRUcnVlKHRlc3ROYW1lICsgIiByZXN1bHQgc3RyaW5nIGlzIG5vdCB0aGUgc2FtZSBhcyBleHBlY3RlZCBzdHJpbmcuIiwgdGVzdFJlc3VsdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3V0aWwvTGF0aW5UZXh0UHJvY2Vzc29yVGVzdENhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL0xhdGluVGV4dFByb2Nlc3NvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMTVlOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3V0aWwvTGF0aW5UZXh0UHJvY2Vzc29yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotCi0vKioKLSAqIFRlc3QgZm9yIHN0cmluZ3MgdGhhdCB1c2UgdGhlIFRleHRQcm9jZXNzb3IgYnV0IGFyZSBub3QgcnVuIGluIGEgYmlkaSBsb2NhbGUuIAotICogTGF0aW4gbG9jYWxlcyBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIFN0cmluZyB0aGF0IHdhcyBwYXNzZWQgaW4uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGF0aW5UZXh0UHJvY2Vzc29yVGVzdENhc2UgZXh0ZW5kcyBUZXh0UHJvY2Vzc29yVGVzdENhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gQUxMX1BBVEhTOwotCXN0YXRpYyB7Ci0JCS8vIG1lcmdlIGFsbCB0ZXN0IHN0cmluZ3MgaW50byBvbmUgYXJyYXkgZm9yIExhdGluIGxvY2FsZXMKLQkJaW50IHNpemUgPSBURVNUX0RFRkFVTFRfUEFUSFMubGVuZ3RoICsgVEVTVF9TVEFSX1BBVEhTLmxlbmd0aCArIFRFU1RfRVFVQUxTX1BBVEhTLmxlbmd0aCArIFRFU1RfQURESVRJT05BTF9TVFJJTkdTLmxlbmd0aDsKLQkJQUxMX1BBVEhTID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJaW50IGlkeCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9ERUZBVUxUX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlBTExfUEFUSFNbaWR4XSA9IFRFU1RfREVGQVVMVF9QQVRIU1tpXTsKLQkJCWlkeCsrOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9TVEFSX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlBTExfUEFUSFNbaWR4XSA9IFRFU1RfU1RBUl9QQVRIU1tpXTsKLQkJCWlkeCsrOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9FUVVBTFNfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCUFMTF9QQVRIU1tpZHhdID0gVEVTVF9FUVVBTFNfUEFUSFNbaV07Ci0JCQlpZHgrKzsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfQURESVRJT05BTF9TVFJJTkdTLmxlbmd0aDsgaSsrKSB7Ci0JCQlBTExfUEFUSFNbaWR4XSA9IFRFU1RfQURESVRJT05BTF9TVFJJTkdTW2ldOwotCQkJaWR4Kys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIG5hbWUgdGVzdCBuYW1lCi0JICovCi0JcHVibGljIExhdGluVGV4dFByb2Nlc3NvclRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXRpblBhdGhzKCkgewotCQkvLyB0ZXN0IGFsbCBzdHJpbmdzIHVzaW5nIHByb2Nlc3MoU3RyaW5nKSBtZXRob2QKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBBTExfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoQUxMX1BBVEhTW2ldKTsKLQkJCXZlcmlmeVJlc3VsdCgiUHJvY2VzcyBzdHJpbmcgIiArIChpICsgMSksIHJlc3VsdCwgQUxMX1BBVEhTW2ldKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGF0aW5QYXRoc0RlcHJvY2VzcygpewotCQkvLyB0ZXN0IGFsbCBzdHJpbmdzIHVzaW5nIHByb2Nlc3MoU3RyaW5nKSBtZXRob2QKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBBTExfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoQUxMX1BBVEhTW2ldKTsKLQkJCVN0cmluZyByZXN1bHREUCA9IFRleHRQcm9jZXNzb3IuZGVwcm9jZXNzKHJlc3VsdCk7Ci0JCQl2ZXJpZnlSZXN1bHQoIkRlcHJvY2VzcyBzdHJpbmcgIiArIChpICsgMSksIHJlc3VsdERQLCBBTExfUEFUSFNbaV0pOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF0aW5QYXRoc1dpdGhOdWxsRGVsaW1pdGVyKCkgewotCQkvLyBzaG91bGQgdXNlIGRlZmF1bHQgZGVsaW1pdGVycwotCQlmb3IgKGludCBpID0gMDsgaSA8IEFMTF9QQVRIUy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlc3VsdCA9IFRleHRQcm9jZXNzb3IucHJvY2VzcyhBTExfUEFUSFNbaV0sIG51bGwpOwotCQkJdmVyaWZ5UmVzdWx0KCJQcm9jZXNzIHN0cmluZyAiICsgKGkgKyAxKSwgcmVzdWx0LCBBTExfUEFUSFNbaV0pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMYXRpbk90aGVyU3RyaW5ncygpIHsKLQkJLy8gdGVzdCB0aGUgcHJvY2VzcyhTdHJpbmcsIFN0cmluZykgbWV0aG9kCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9TVEFSX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFRFU1RfU1RBUl9QQVRIU1tpXSwgIiouIik7Ci0JCQl2ZXJpZnlSZXN1bHQoIkZpbGUgYXNzb2NpYXRpb24gIiArIChpICsgMSksIHJlc3VsdCwgVEVTVF9TVEFSX1BBVEhTW2ldKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9FUVVBTFNfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoVEVTVF9FUVVBTFNfUEFUSFNbaV0sICI9Iik7Ci0JCQl2ZXJpZnlSZXN1bHQoIkVxdWFscyBleHByZXNzaW9uICIgKyAoaSArIDEpLCByZXN1bHQsIFRFU1RfRVFVQUxTX1BBVEhTW2ldKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGF0aW5PdGhlclN0cmluZ3NEZXByb2Nlc3MoKSB7Ci0JCS8vIHRlc3QgdGhlIHByb2Nlc3MoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZAotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfU1RBUl9QQVRIUy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlc3VsdCA9IFRleHRQcm9jZXNzb3IucHJvY2VzcyhURVNUX1NUQVJfUEFUSFNbaV0sICIqLiIpOwotCQkJU3RyaW5nIHJlc3VsdERQID0gVGV4dFByb2Nlc3Nvci5kZXByb2Nlc3MocmVzdWx0KTsKLQkJCXZlcmlmeVJlc3VsdCgiRmlsZSBhc3NvY2lhdGlvbiAiICsgKGkgKyAxKSwgcmVzdWx0RFAsIFRFU1RfU1RBUl9QQVRIU1tpXSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfRVFVQUxTX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFRFU1RfRVFVQUxTX1BBVEhTW2ldLCAiPSIpOwotCQkJU3RyaW5nIHJlc3VsdERQID0gVGV4dFByb2Nlc3Nvci5kZXByb2Nlc3MocmVzdWx0KTsKLQkJCXZlcmlmeVJlc3VsdCgiRXF1YWxzIGV4cHJlc3Npb24gIiArIChpICsgMSksIHJlc3VsdERQLCBURVNUX0VRVUFMU19QQVRIU1tpXSk7Ci0JCX0KLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdExhdGluT3RoZXJTdHJpbmdzV2l0aE5vRGVsaW1pdGVyKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfU1RBUl9QQVRIUy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlc3VsdCA9IFRleHRQcm9jZXNzb3IucHJvY2VzcyhURVNUX1NUQVJfUEFUSFNbaV0sIG51bGwpOwotCQkJdmVyaWZ5UmVzdWx0KCJGaWxlIGFzc29jaWF0aW9uICIgKyAoaSArIDEpLCByZXN1bHQsIFRFU1RfU1RBUl9QQVRIU1tpXSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfRVFVQUxTX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKFRFU1RfRVFVQUxTX1BBVEhTW2ldLCBudWxsKTsKLQkJCXZlcmlmeVJlc3VsdCgiRXF1YWxzIGV4cHJlc3Npb24gIiArIChpICsgMSksIHJlc3VsdCwgVEVTVF9FUVVBTFNfUEFUSFNbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5U3RyaW5nUGFyYW1zKCkgewotCQl2ZXJpZnlSZXN1bHQoIlRleHRQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcpIGZvciBlbXB0eSBzdHJpbmcgIiwgVGV4dFByb2Nlc3Nvci5wcm9jZXNzKCIiKSwgRU1QVFlfU1RSSU5HKTsKLQkJdmVyaWZ5UmVzdWx0KCJUZXh0UHJvY2Vzc29yLnByb2Nlc3MoU3RyaW5nLCBTdHJpbmcpIGZvciBlbXB0eSBzdHJpbmdzICIsIFRleHRQcm9jZXNzb3IucHJvY2VzcygiIiwgIiIpLCBFTVBUWV9TVFJJTkcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmdQYXJhbXNEZXByb2Nlc3MoKSB7Ci0JCXZlcmlmeVJlc3VsdCgiVGV4dFByb2Nlc3Nvci5kZXByb2Nlc3MoU3RyaW5nKSBmb3IgZW1wdHkgc3RyaW5nICIsIFRleHRQcm9jZXNzb3IuZGVwcm9jZXNzKCIiKSwgRU1QVFlfU1RSSU5HKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxQYXJhbXMoKSB7Ci0JCWFzc2VydE51bGwoIlRleHRQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcpIGZvciBudWxsIHBhcmFtICIsIFRleHRQcm9jZXNzb3IucHJvY2VzcyhudWxsKSk7Ci0JCWFzc2VydE51bGwoIlRleHRQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcsIFN0cmluZykgZm9yIHBhcmFtcyAiLCBUZXh0UHJvY2Vzc29yLnByb2Nlc3MobnVsbCwgbnVsbCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFBhcmFtc0RlcHJvY2VzcygpIHsKLQkJYXNzZXJ0TnVsbCgiVGV4dFByb2Nlc3Nvci5kZXByb2Nlc3MoU3RyaW5nKSBmb3IgbnVsbCBwYXJhbSAiLCBUZXh0UHJvY2Vzc29yLmRlcHJvY2VzcyhudWxsKSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL01hbmlmZXN0RWxlbWVudFRlc3RDYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvdXRpbC9NYW5pZmVzdEVsZW1lbnRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZlNzFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL01hbmlmZXN0RWxlbWVudFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBNYW5pZmVzdEVsZW1lbnRUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyB2b2lkIHRlc3RTcGFjZXNJblZhbHVlcygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50cyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcigidGVzdC1zcGFjZXMiLCAiXCJjb21wIDFcIjtcImNvbXAgMlwiO1wiY29tcCAzXCI7YXR0cj1cInZhbCAxXCI7ZGlyOj1cInZhbCAyXCIiKTsKLQkJYXNzZXJ0Tm90TnVsbCgiMS4wIiwgZWxlbWVudHMpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIGVsZW1lbnRzLmxlbmd0aCwgMSk7Ci0JCVN0cmluZ1tdIGNvbXBvbmVudHMgPSBlbGVtZW50c1swXS5nZXRWYWx1ZUNvbXBvbmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCBjb21wb25lbnRzLmxlbmd0aCwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCBjb21wb25lbnRzWzBdLCAiY29tcCAxIik7Ci0JCWFzc2VydEVxdWFscygiMi4xIiwgY29tcG9uZW50c1sxXSwgImNvbXAgMiIpOwotCQlhc3NlcnRFcXVhbHMoIjIuMiIsIGNvbXBvbmVudHNbMl0sICJjb21wIDMiKTsKLQotCQlhc3NlcnRFcXVhbHMoIjMuMCIsIGVsZW1lbnRzWzBdLmdldEF0dHJpYnV0ZSgiYXR0ciIpLCAidmFsIDEiKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjEiLCBlbGVtZW50c1swXS5nZXREaXJlY3RpdmUoImRpciIpLCAidmFsIDIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVnMjM4Njc1XzAxKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnRzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKCJCdW5kbGUtTmF0aXZlQ29kZSIsICJcImV4dGVybmFsOkM6L3RtcC94LmRsbFwiO1wiZXh0ZXJuYWw6QzovdG1wL3kuZGxsXCI7IG9zbmFtZSA9V2luZG93c1hQOyBvc3Zlcmlzb24gPSAyLjA7IHByb2Nlc3NvciA9IHg4NiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROb3ROdWxsKCIxLjAiLCBlbGVtZW50cyk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgMSwgZWxlbWVudHMubGVuZ3RoKTsKLQkJU3RyaW5nW10gY29tcG9uZW50cyA9IGVsZW1lbnRzWzBdLmdldFZhbHVlQ29tcG9uZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIjEuMiIsIDIsIGNvbXBvbmVudHMubGVuZ3RoKTsKLQotCQlhc3NlcnRFcXVhbHMoIjIuMCIsICJleHRlcm5hbDpDOi90bXAveC5kbGwiLCBjb21wb25lbnRzWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCAiZXh0ZXJuYWw6QzovdG1wL3kuZGxsIiwgY29tcG9uZW50c1sxXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1ZzIzODY3NV8wMigpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50cyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcigiQnVuZGxlLU5hdGl2ZUNvZGUiLCAiXCJleHRlcm5hbDp0ZXN0MTp0ZXN0MlwiO1widGVzdDM6dGVzdDQ6XCI7IG9zbmFtZSA9V2luZG93c1hQOyBvc3Zlcmlzb24gPSAyLjA7IHByb2Nlc3NvciA9IHg4NiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0Tm90TnVsbCgiMS4wIiwgZWxlbWVudHMpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIDEsIGVsZW1lbnRzLmxlbmd0aCk7Ci0JCVN0cmluZ1tdIGNvbXBvbmVudHMgPSBlbGVtZW50c1swXS5nZXRWYWx1ZUNvbXBvbmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCAyLCBjb21wb25lbnRzLmxlbmd0aCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCBjb21wb25lbnRzWzBdLCAiZXh0ZXJuYWw6dGVzdDE6dGVzdDIiKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCBjb21wb25lbnRzWzFdLCAidGVzdDM6dGVzdDQ6Iik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3V0aWwvTkxTVGVzdENhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL05MU1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGZiYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3V0aWwvTkxTVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLkNvcmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBOTFNUZXN0Q2FzZSBleHRlbmRzIENvcmVUZXN0IHsKLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU1lc3NhZ2VCdWcyMDAyOTYoKSB7Ci0JCXRyeSB7Ci0JCQlOTFMuYmluZCgiIiwgbmV3IEludGVnZXIoMCkpOwotCQl9IGNhdGNoIChOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIxLjAiLCBlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3V0aWwvT2JqZWN0UG9vbFRlc3RDYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvdXRpbC9PYmplY3RQb29sVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlYWViZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvdXRpbC9PYmplY3RQb29sVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS50ZXN0cy5oYXJuZXNzLkNvcmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLnV0aWwuT2JqZWN0UG9vbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE9iamVjdFBvb2xUZXN0Q2FzZSBleHRlbmRzIENvcmVUZXN0IHsKLQlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0UG9vbDAxKCkgewotCQkvLyBUZXN0cyBPYmplY3RQb29sIHdpdGggc3RyaW5ncyBvbmx5Ci0JCUxpc3Qgb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IG51bSA9IDIwMDA7Ci0JCS8vIG5ldyBvYmplY3RzIGFyZSBhZGRlZCB0byB0aGUgb2JqZWN0IHBvb2w7IGludGVybmluZyBzaG91bGQgYWRkIHRoZSBvYmplY3QgdG8gdGhlIHBvb2wgYW5kIHJldHVybiB0aGUgc2FtZSBvYmplY3QKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJU3RyaW5nIHRlc3QxID0gZ2V0TmFtZSgpICsgIl8iICsgaTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHRlc3QyID0gKFN0cmluZykgT2JqZWN0UG9vbC5pbnRlcm4odGVzdDEpOwotCQkJYXNzZXJ0VHJ1ZSgiU3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lOiAiICsgdGVzdDEsIHRlc3QxID09IHRlc3QyKTsgLy8kTk9OLU5MUy0xJAotCQkJb2JqZWN0cy5hZGQodGVzdDIpOwotCQl9Ci0JCWRvR0MoKTsKLQkJLy8gYWZ0ZXIgZG9pbmcgYSBHQyB0aGUgaW50ZXJuZWQgb2JqZWN0cyBzaG91bGQgc3RpbGwgYmUgaW4gdGhlIHBvb2w7IGludGVybmluZyBhIGR1cGxpY2F0ZSBzaG91bGQgcmV0dXJuIHRoZSBvYmplY3RzIHRoYXQgd2VyZSBhZGRlZCBhYm92ZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQlTdHJpbmcgdGVzdDEgPSBnZXROYW1lKCkgKyAiXyIgKyBpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdGVzdDIgPSAoU3RyaW5nKSBPYmplY3RQb29sLmludGVybih0ZXN0MSk7Ci0JCQlhc3NlcnRGYWxzZSgiU3RyaW5ncyBhcmUgdGhlIHNhbWU6ICIgKyB0ZXN0MSwgdGVzdDEgPT0gdGVzdDIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJTdHJpbmdzIGFyZSBub3QgdGhlIHNhbWU6ICIgKyB0ZXN0MSwgdGVzdDIgPT0gb2JqZWN0cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gY2xlYXIgdGhlIGhhcmQgcmVmZXJlbmNlcyB0byB0aGUgaW50ZXJuZWQgb2JqZWN0cwotCQlvYmplY3RzLmNsZWFyKCk7Ci0JCWRvR0MoKTsKLQkJLy8gYWZ0ZXIgZG9pbmcgYSBHQyB0aGUgaW50ZXJuZWQgb2JqZWN0cyBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgb2JqZWN0IHBvb2wKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJU3RyaW5nIHRlc3QxID0gZ2V0TmFtZSgpICsgIl8iICsgaTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHRlc3QyID0gKFN0cmluZykgT2JqZWN0UG9vbC5pbnRlcm4odGVzdDEpOwotCQkJYXNzZXJ0VHJ1ZSgiU3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lOiAiICsgdGVzdDEsIHRlc3QxID09IHRlc3QyKTsgLy8kTk9OLU5MUy0xJAotCQkJb2JqZWN0cy5hZGQodGVzdDIpOwotCQl9Ci0JCS8vIGZsdXNoIG91dCB0aGUgb2JqZWN0cyBhZ2Fpbi4KLQkJb2JqZWN0cy5jbGVhcigpOwotCQlkb0dDKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdFBvb2wwMigpIHsKLQkJLy8gVGVzdCBib3RoIHN0cmluZ3MgYW5kIHZlcnNpb25zCi0JCUxpc3Qgc3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB2ZXJzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IG51bSA9IDIwMDA7Ci0JCS8vIG5ldyBvYmplY3RzIGFyZSBhZGRlZCB0byB0aGUgb2JqZWN0IHBvb2w7IGludGVybmluZyBzaG91bGQgYWRkIHRoZSBvYmplY3QgdG8gdGhlIHBvb2wgYW5kIHJldHVybiB0aGUgc2FtZSBvYmplY3QKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJU3RyaW5nIHRlc3RTdHJpbmcxID0gZ2V0TmFtZSgpICsgIl8iICsgaTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHRlc3RTdHJpbmcyID0gKFN0cmluZykgT2JqZWN0UG9vbC5pbnRlcm4odGVzdFN0cmluZzEpOwotCQkJYXNzZXJ0VHJ1ZSgiU3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lOiAiICsgdGVzdFN0cmluZzEsIHRlc3RTdHJpbmcxID09IHRlc3RTdHJpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RyaW5ncy5hZGQodGVzdFN0cmluZzIpOwotCQkJVmVyc2lvbiB0ZXN0VmVyc2lvbjEgPSBuZXcgVmVyc2lvbihpLCBpLCBpLCBnZXROYW1lKCkgKyAiXyIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJVmVyc2lvbiB0ZXN0VmVyc2lvbjIgPSAoVmVyc2lvbikgT2JqZWN0UG9vbC5pbnRlcm4odGVzdFZlcnNpb24xKTsKLQkJCWFzc2VydFRydWUoIlZlcnNpb25zIGFyZSBub3QgdGhlIHNhbWU6ICIgKyB0ZXN0VmVyc2lvbjEsIHRlc3RWZXJzaW9uMSA9PSB0ZXN0VmVyc2lvbjIpOyAvLyROT04tTkxTLTEkCi0JCQl2ZXJzaW9ucy5hZGQodGVzdFZlcnNpb24yKTsKLQkJfQotCQlkb0dDKCk7Ci0JCS8vIGFmdGVyIGRvaW5nIGEgR0MgdGhlIGludGVybmVkIG9iamVjdHMgc2hvdWxkIHN0aWxsIGJlIGluIHRoZSBwb29sOyBpbnRlcm5pbmcgYSBkdXBsaWNhdGUgc2hvdWxkIHJldHVybiB0aGUgb2JqZWN0cyB0aGF0IHdlcmUgYWRkZWQgYWJvdmUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJU3RyaW5nIHRlc3RTdHJpbmcxID0gZ2V0TmFtZSgpICsgIl8iICsgaTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHRlc3RTdHJpbmcyID0gKFN0cmluZykgT2JqZWN0UG9vbC5pbnRlcm4odGVzdFN0cmluZzEpOwotCQkJYXNzZXJ0RmFsc2UoIlN0cmluZ3MgYXJlIHRoZSBzYW1lOiAiICsgdGVzdFN0cmluZzEsIHRlc3RTdHJpbmcxID09IHRlc3RTdHJpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0VHJ1ZSgiU3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lOiAiICsgdGVzdFN0cmluZzEsIHRlc3RTdHJpbmcyID09IHN0cmluZ3MuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJVmVyc2lvbiB0ZXN0VmVyc2lvbjEgPSBuZXcgVmVyc2lvbihpLCBpLCBpLCBnZXROYW1lKCkgKyAiXyIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJVmVyc2lvbiB0ZXN0VmVyc2lvbjIgPSAoVmVyc2lvbikgT2JqZWN0UG9vbC5pbnRlcm4odGVzdFZlcnNpb24xKTsKLQkJCWFzc2VydEZhbHNlKCJWZXJzaW9ucyBhcmUgdGhlIHNhbWU6ICIgKyB0ZXN0VmVyc2lvbjEsIHRlc3RWZXJzaW9uMSA9PSB0ZXN0VmVyc2lvbjIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJWZXJzaW9ucyBhcmUgbm90IHRoZSBzYW1lOiAiICsgdGVzdFZlcnNpb24xLCB0ZXN0VmVyc2lvbjIgPT0gdmVyc2lvbnMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIGNsZWFyIHRoZSBoYXJkIHJlZmVyZW5jZXMgdG8gdGhlIGludGVybmVkIG9iamVjdHMKLQkJc3RyaW5ncy5jbGVhcigpOwotCQl2ZXJzaW9ucy5jbGVhcigpOwotCQkvLyBhZnRlciBkb2luZyBhIEdDIHRoZSBpbnRlcm5lZCBvYmplY3RzIHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBvYmplY3QgcG9vbAotCQlkb0dDKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJCVN0cmluZyB0ZXN0U3RyaW5nMSA9IGdldE5hbWUoKSArICJfIiArIGk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0ZXN0U3RyaW5nMiA9IChTdHJpbmcpIE9iamVjdFBvb2wuaW50ZXJuKHRlc3RTdHJpbmcxKTsKLQkJCWFzc2VydFRydWUoIlN0cmluZ3MgYXJlIG5vdCB0aGUgc2FtZTogIiArIHRlc3RTdHJpbmcxLCB0ZXN0U3RyaW5nMSA9PSB0ZXN0U3RyaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJCXN0cmluZ3MuYWRkKHRlc3RTdHJpbmcyKTsKLQkJCVZlcnNpb24gdGVzdFZlcnNpb24xID0gbmV3IFZlcnNpb24oaSwgaSwgaSwgZ2V0TmFtZSgpICsgIl8iICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCVZlcnNpb24gdGVzdFZlcnNpb24yID0gKFZlcnNpb24pIE9iamVjdFBvb2wuaW50ZXJuKHRlc3RWZXJzaW9uMSk7Ci0JCQlhc3NlcnRUcnVlKCJWZXJzaW9ucyBhcmUgbm90IHRoZSBzYW1lOiAiICsgdGVzdFZlcnNpb24xLCB0ZXN0VmVyc2lvbjEgPT0gdGVzdFZlcnNpb24yKTsgLy8kTk9OLU5MUy0xJAotCQkJdmVyc2lvbnMuYWRkKHRlc3RWZXJzaW9uMik7Ci0JCX0KLQkJLy8gZmx1c2ggb3V0IHRoZSBvYmplY3RzIGFnYWluLgotCQlzdHJpbmdzLmNsZWFyKCk7Ci0JCXZlcnNpb25zLmNsZWFyKCk7Ci0JCWRvR0MoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRvR0MoKSB7Ci0JCS8vIFdlIGdvIHRocm91Z2ggZ3JlYXQgZWZmb3J0IHRvIGZvcmNlIHRoZSBWTSB0byB0aHJvdyBvdXIgd2Vha2x5IHJlZmVyZW5jZWQgb2JqZWN0cyBhd2F5LgotCQlTeXN0ZW0uZ2MoKTsKLQkJU3lzdGVtLnJ1bkZpbmFsaXphdGlvbigpOwotCQlTeXN0ZW0uZ2MoKTsKLQkJU3lzdGVtLnJ1bkZpbmFsaXphdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL1RleHRQcm9jZXNzb3JTZXNzaW9uVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3V0aWwvVGV4dFByb2Nlc3NvclNlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTM0MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2dpL3Rlc3RzL3V0aWwvVGV4dFByb2Nlc3NvclNlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kudGVzdHMudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuc2Vzc2lvbi5TZXNzaW9uVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuc2Vzc2lvbi5TZXR1cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLnNlc3Npb24uU2V0dXBNYW5hZ2VyLlNldHVwRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGV4dFByb2Nlc3NvclNlc3Npb25UZXN0IGV4dGVuZHMgU2Vzc2lvblRlc3RTdWl0ZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFuZyA9IG51bGw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgc2Vzc2lvbiB0ZXN0IGZvciB0aGUgZ2l2ZW4gY2xhc3MuICAKLQkgKiBAcGFyYW0gcGx1Z2luSWQgdGVzdHMgcGx1Z2luIGlkCi0JICogQHBhcmFtIGNsYXp6IHRoZSB0ZXN0IGNsYXNzIHRvIHJ1bgotCSAqIEBwYXJhbSBsYW5ndWFnZSB0aGUgbGFuZ3VhZ2UgdG8gcnVuIHRoZSB0ZXN0cyB1bmRlciAodGhlIC1ubCBwYXJhbWV0ZXIgdmFsdWUpCi0JICovCi0JcHVibGljIFRleHRQcm9jZXNzb3JTZXNzaW9uVGVzdChTdHJpbmcgcGx1Z2luSWQsIENsYXNzIGNsYXp6LCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJc3VwZXIocGx1Z2luSWQsIGNsYXp6KTsKLQkJbGFuZyA9IGxhbmd1YWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUudGVzdHMuc2Vzc2lvbi5TZXNzaW9uVGVzdFN1aXRlI25ld1NldHVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU2V0dXAgbmV3U2V0dXAoKSB0aHJvd3MgU2V0dXBFeGNlcHRpb24gewotCQlTZXR1cCBiYXNlID0gc3VwZXIubmV3U2V0dXAoKTsKLQkJLy8gdGhlIGJhc2UgaW1wbGVtZW50YXRpb24gd2lsbCBoYXZlIHNldCB0aGlzIHRvIHRoZSBob3N0IGNvbmZpZ3VyYXRpb24KLQkJYmFzZS5zZXRFY2xpcHNlQXJndW1lbnQoIm5sIiwgbGFuZyk7CS8vIFNldHVwLk5MIGlzIHByaXZhdGUKLQkJcmV0dXJuIGJhc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zZ2kvdGVzdHMvdXRpbC9UZXh0UHJvY2Vzc29yVGVzdENhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL1RleHRQcm9jZXNzb3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM1MzVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NnaS90ZXN0cy91dGlsL1RleHRQcm9jZXNzb3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogQ29tbW9uIGNsYXNzIGZvciBUZXh0UHJvY2Vzc29yIHRlc3QgY2FzZXMuCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGV4dFByb2Nlc3NvclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCS8vIHNvbWUgSGVicmV3IHN0cmluZ3MgdG8gdXNlIGZvciB0ZXN0IGNhc2VzCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgSEVCUkVXX1NUUklOR18xID0gIlx1MDVkMFx1MDVkMVx1MDVkMlx1MDVkMyBcdTA1ZDRcdTA1ZDUiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEhFQlJFV19TVFJJTkdfMiA9ICJcdTA1ZWFcdTA1ZTlcdTA1ZThcdTA1ZTdcdTA1ZTYiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEhFQlJFV19TVFJJTkdfMyA9ICJcdTA1ZTVcdTA1ZTRcdTA1ZTMiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEhFQlJFV19TVFJJTkdfNCA9ICJcdTA1ZTJcdTA1ZTFcdTA1ZTAiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEhFQlJFV19TVFJJTkdfNSA9ICJcdTA1ZGZcdTA1ZmRcdTA1ZGQiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEhFQlJFV19TVFJJTkdfNiA9ICJcdTA1ZGNcdTA1ZGJcdTA1ZGEiOwkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBIRUJSRVdfU1RSSU5HXzcgPSAiXHUwNWQwIjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBIRUJSRVdfU1RSSU5HXzggPSAiXHUwNWU5IjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBIRUJSRVdfU1RSSU5HXzkgPSAiXHUwNWRjIjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBIRUJSRVdfU1RSSU5HXzEwID0gIlx1MDVlMyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgSEVCUkVXX1NUUklOR18xMSA9ICJcdTA1ZDQiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEhFQlJFV19TVFJJTkdfMTIgPSAiXHUwNWRhIjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBIRUJSRVdfU1RSSU5HXzEzID0gIlx1MDVkZiI7Ci0JCQotCS8vIHN0cmluZ3MgdG8gdGVzdAotCQotCS8vIHBhdGhzCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgUEFUSF8xID0gImQ6XFx0ZXN0XFwiICsgSEVCUkVXX1NUUklOR18xICsgIlxcc2VnbWVudCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgUEFUSF8yID0gIlxcdGVzdFxcIiArIEhFQlJFV19TVFJJTkdfMSArICJcXHNlZ21lbnQiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFBBVEhfMyA9ICJkOlxcIiArIEhFQlJFV19TVFJJTkdfMiArICIgYWJjZGVmLSIgKyBIRUJSRVdfU1RSSU5HXzMgKyAiXFx4eXpcXGFiY2RlZlxcIiArIEhFQlJFV19TVFJJTkdfNDsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBQQVRIXzQgPSAiXFwiICsgSEVCUkVXX1NUUklOR18yICsgIiBhYmNkZWYtIiArIEhFQlJFV19TVFJJTkdfMyArICJcXHh5elxcYWJjZGVmXFwiICsgSEVCUkVXX1NUUklOR180OwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFBBVEhfNSA9ICJkOlxcIiArIEhFQlJFV19TVFJJTkdfMiArICIgYWJjZGVmLSIgKyBIRUJSRVdfU1RSSU5HXzMgKyAiXFx4eXpcXGFiY2RlZlxcIiArIEhFQlJFV19TVFJJTkdfNCArICJcXCIgKyBIRUJSRVdfU1RSSU5HXzUgKyAiLmphdmEiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFBBVEhfNiA9ICJkOlxcIiArIEhFQlJFV19TVFJJTkdfMiArICIgYWJjZGVmLSIgKyBIRUJSRVdfU1RSSU5HXzMgKyAiXFx4eXpcXGFiY2RlZlxcIiArIEhFQlJFV19TVFJJTkdfNCArICJcXCIgKyBIRUJSRVdfU1RSSU5HXzUgKyAiLiIgKyBIRUJSRVdfU1RSSU5HXzY7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgUEFUSF83ID0gImQ6XFwiICsgSEVCUkVXX1NUUklOR18yICsgIiBhYmNkZWYtIiArIEhFQlJFV19TVFJJTkdfMyArICJcXHh5elxcYWJjZGVmXFwiICsgSEVCUkVXX1NUUklOR180ICsgIlxcVGVzdC5qYXZhIjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBQQVRIXzggPSAiXFx0ZXN0XFxqa2wiICsgSEVCUkVXX1NUUklOR18xICsgIlxcc2VnbWVudCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgUEFUSF85ID0gIlxcdGVzdFxcIiArIEhFQlJFV19TVFJJTkdfMSArICJqa2xcXHNlZ21lbnQiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFBBVEhfMTAgPSAiZDpcXHRcXCIgKyBIRUJSRVdfU1RSSU5HXzcgKyAiXFxzZWdtZW50IjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBQQVRIXzExID0gIlxcdFxcIiArIEhFQlJFV19TVFJJTkdfNyArICJcXHNlZ21lbnQiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFBBVEhfMTIgPSAiZDpcXCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgUEFUSF8xMyA9ICJcXHQiOwotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFNUUklOR18xID0gImQ6XFxhbGxcXGVuZ2xpc2giOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFNUUklOR18yID0gImFsbCBlbmdsaXNoIHdpdGggbmV1dHJhbHMgKHNwYWNlcykgaW4gdGhlIG1pZGRsZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzMgPSAiX2Q6YWxsL2VuZ2xpc2ggd2l0aCBsZWFkaW5nIG5ldXRyYWwiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFNUUklOR180ID0gImQ6YWxsL2VuZ2xpc2ggd2l0aCB0cmFpbGluZyBuZXV0cmFsXyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzUgPSAiM2Q6YWxsL2VuZ2xpc2ggd2l0aCBsZWFkaW5nIGRpZ2l0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBTVFJJTkdfNiA9ICJlbmdsaXNoIHdpdGggc29tZSAiICsgSEVCUkVXX1NUUklOR181ICsgIiBpbiB0aGUgbWlkZGxlIjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBTVFJJTkdfNyA9ICJkOmFsbC9lbmdsaXNoIHdpdGggdHJhaWxpbmcgbmV1dHJhbCB0aGVuIGRpZ2l0c18xMjMiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFNUUklOR184ID0gIj09PiI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzkgPSAiZDpcXG15Rm9sZGVyXFwiICsgSEVCUkVXX1NUUklOR181ICsgIlxcIiArIEhFQlJFV19TVFJJTkdfNiArICIuamF2YSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzEwID0gImQ6XFxteUZvbGRlclxcIiArIEhFQlJFV19TVFJJTkdfMiArICJcXDEyMy8iICsgSEVCUkVXX1NUUklOR18zICsgIi5qYXZhIjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBTVFJJTkdfMTEgPSAiZDpcXG15Rm9sZGVyXFwiICsgSEVCUkVXX1NUUklOR18yICsgIlxcMTIzLyIgKyBIRUJSRVdfU1RSSU5HXzMgKyAiLiIgKyBIRUJSRVdfU1RSSU5HXzU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzEyID0gImQ6XFxteUZvbGRlclxcIiArIEhFQlJFV19TVFJJTkdfMiArICJcXDEyMyIgKyBIRUJSRVdfU1RSSU5HXzMgKyAiLiIgKyBIRUJSRVdfU1RSSU5HXzY7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzEzID0gImQ6XFxteUZvbGRlclxcIiArIEhFQlJFV19TVFJJTkdfMiArICJcXDEyMy9teWZpbGUuIiArIEhFQlJFV19TVFJJTkdfNjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBTVFJJTkdfMTQgPSAiZDpcXG15Rm9sZGVyXFwiICsgSEVCUkVXX1NUUklOR18yICsgIlxcMTIzbXlmaWxlLiIgKyBIRUJSRVdfU1RSSU5HXzY7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzE1PSAiZDpcXG15Rm9sZGVyXFwiICsgSEVCUkVXX1NUUklOR18yICsgIjEyLT1cXDw+PzM0IiArIEhFQlJFV19TVFJJTkdfNiArICIuamF2YSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzE2ID0gSEVCUkVXX1NUUklOR18yICsgIi8iICsgSEVCUkVXX1NUUklOR182ICsgIi8iICsgSEVCUkVXX1NUUklOR180ICsgIi4iICsgSEVCUkVXX1NUUklOR181OyAKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBTVFJJTkdfMTcgPSBIRUJSRVdfU1RSSU5HXzcgKyAiLyIgKyBIRUJSRVdfU1RSSU5HXzggKyAiLyIgKyBIRUJSRVdfU1RSSU5HXzkgKyAiLyIgKyBIRUJSRVdfU1RSSU5HXzEwICsgIi8iICtIRUJSRVdfU1RSSU5HXzExICsgIi8iICsgSEVCUkVXX1NUUklOR18xMiArICIvIiArIEhFQlJFV19TVFJJTkdfMTM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU1RSSU5HXzE4ID0gIl8iICsgSEVCUkVXX1NUUklOR18yICsgIiBtaXhlZCB0ZXh0IHN0YXJ0cyBhbmQgZW5kcyB3aXRoIG5ldXRyYWwuIjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBTVFJJTkdfMTkgPSAiZW5nbGlzaCBhbmQgIiArIEhFQlJFV19TVFJJTkdfMiArICIgdGV4dCBzdGFydHMgd2l0aCBMVFIgZW5kcyB3aXRoIG5ldXRyYWwgXyI7Ci0KLQkvLyBvdGhlciBzdHJpbmdzIC0gZmlsZSBhc3NvY2lhdGlvbnMgYW5kIGFzc2lnbm1lbnQgc3RhdGVtZW50cwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIE9USEVSX1NUUklOR18xID0gIiouamF2YSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgT1RIRVJfU1RSSU5HXzIgPSAiKi5cdTA1ZDBcdTA1ZDFcdTA1ZDIiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIE9USEVSX1NUUklOR18zID0gIlx1MDVkMFx1MDVkMVx1MDVkMiA9IFx1MDVlYVx1MDVlOVx1MDVlOFx1MDVlN1x1MDVlNiI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gVEVTVF9ERUZBVUxUX1BBVEhTID0geyBQQVRIXzEsIFBBVEhfMiwgUEFUSF8zLAotCQkJUEFUSF80LCBQQVRIXzUsIFBBVEhfNiwgUEFUSF83LCBQQVRIXzgsIFBBVEhfOSB9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBURVNUX0FERElUSU9OQUxfU1RSSU5HUyA9IHsgU1RSSU5HXzEsIFNUUklOR18yLAotCQkJU1RSSU5HXzMsIFNUUklOR180LCBTVFJJTkdfNSwgU1RSSU5HXzYsIFNUUklOR183LCBTVFJJTkdfOCwKLQkJCVNUUklOR185LCBTVFJJTkdfMTAsIFNUUklOR18xMSwgU1RSSU5HXzEyLCBTVFJJTkdfMTMsIFNUUklOR18xNCwKLQkJCVNUUklOR18xNSwgU1RSSU5HXzE2LCBTVFJJTkdfMTcsIFNUUklOR18xOCwgU1RSSU5HXzE5IH07Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIFRFU1RfU1RBUl9QQVRIUyA9IHsgT1RIRVJfU1RSSU5HXzEsCi0JCQlPVEhFUl9TVFJJTkdfMiB9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBURVNUX0VRVUFMU19QQVRIUyA9IHsgT1RIRVJfU1RSSU5HXzMgfTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFRleHRQcm9jZXNzb3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlSZXN1bHQoU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyByZXN1bHQpewotCQlhc3NlcnRUcnVlKHRlc3ROYW1lICsgIiByZXN1bHQgc3RyaW5nIGlzIG5vdCB0aGUgc2FtZSBhcyBzdHJpbmcgcGFzc2VkIGluLiIsIHJlc3VsdC5lcXVhbHMoZXhwZWN0ZWQpKTsJCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhNTU5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwcm9qZWN0IG5hbWU9IkNvcmUgUmVzb3VyY2VzIEF1dG9tYXRlZCBUZXN0cyIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLQotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLi8iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9Im9zZ2lfbG9jYXRpb24iIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vb3NnaV9zbmlmZl9mb2xkZXIiLz4gIAotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgdGhlIHRlc3RzIC0tPgotICA8IS0tIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdG8gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtydW50aW1lX2xvY2F0aW9ufSIgcXVpZXQ9InRydWUiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtyZXNvdXJjZXNfbG9jYXRpb259IiBxdWlldD0idHJ1ZSIvPgotICAgIDxkZWxldGUgZGlyPSIke29zZ2lfbG9jYXRpb259IiBxdWlldD0idHJ1ZSIvPiAgICAKLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIGFmdGVyIGFsbCAtLT4KLSAgPCEtLSB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHBlcmZvcm1hbmNlIHRlc3Qgc3VpdGVzLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIGFmdGVyIGFsbCAtLT4KLSAgPCEtLSB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2UiIGRlcGVuZHM9ImluaXQscGVyZm9ybWFuY2Utc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PiAgCi0gIDwvdGFyZ2V0PiAgCi0KLSAgPHRhcmdldCBuYW1lPSJPU0dpVGVzdHMiIGRlcGVuZHM9ImluaXQsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke29zZ2lfbG9jYXRpb259Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2dpLnRlc3RzIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5BdXRvbWF0ZWRUZXN0cyIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLSAgIAotICA8dGFyZ2V0IG5hbWU9Ik9TR2lQZXJmb3JtYW5jZVRlc3RzIiBkZXBlbmRzPSJpbml0LGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtvc2dpX2xvY2F0aW9ufSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NnaS50ZXN0cyIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLm9zZ2kudGVzdHMucGVyZi5BbGxUZXN0cyIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4gIAotICAgIAotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIiBkZXBlbmRzPSJPU0dpVGVzdHMiLz4gIAotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZS1zdWl0ZSIgZGVwZW5kcz0iT1NHaVBlcmZvcm1hbmNlVGVzdHMiLz4gIAotCQotIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2NvbmZpZ3VyYXRpb24vYnVuZGxlMDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9jb25maWd1cmF0aW9uL2J1bmRsZTAxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDgwYmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2NvbmZpZ3VyYXRpb24vYnVuZGxlMDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogYnVuZGxlMDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2NvbmZpZ3VyYXRpb24vYnVuZGxlMDIvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2NvbmZpZ3VyYXRpb24vYnVuZGxlMDIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhY2ZmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9jb25maWd1cmF0aW9uL2J1bmRsZTAyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gIG5hbWU9ImJ1bmRsZTAyIgotICBpZD0iYnVuZGxlMDIiCi0gIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICB2ZXJzaW9uPSIxLjAiLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2NvbmZpZ3VyYXRpb24vYnVuZGxlMDMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9jb25maWd1cmF0aW9uL2J1bmRsZTAzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZmYTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2NvbmZpZ3VyYXRpb24vYnVuZGxlMDMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogYnVuZGxlMDMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvYXBwQWRtaW5UZXN0cy9hcHBhZG1pbi50ZXN0MDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2FwcEFkbWluVGVzdHMvYXBwYWRtaW4udGVzdDAxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjBiYTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvYXBwQWRtaW5UZXN0cy9hcHBhZG1pbi50ZXN0MDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IHRlc3QxIGJ1bmRsZQotQnVuZGxlLVN5bWJvbGljTmFtZTogYXBwYWRtaW4udGVzdDAxO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy5hcHBhZG1pbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9hcHBBZG1pblRlc3RzL2FwcGFkbWluLnRlc3QwMS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9hcHBBZG1pblRlc3RzL2FwcGFkbWluLnRlc3QwMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODM2YWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvYXBwQWRtaW5UZXN0cy9hcHBhZG1pbi50ZXN0MDEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InNpbXBsZUFwcCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgY2FyZGluYWxpdHk9IjEiCi0gICAgICAgICAgICB0aHJlYWQ9ImFueSIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zZ2kudGVzdHMuYXBwYWRtaW4uU2ltcGxlQXBwIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUgMDEvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZSAwMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2RkYTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZSAwMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICBuYW1lPSJidW5kbGUwMSIKLSAgaWQ9ImJ1bmRsZTAxIgotICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgdmVyc2lvbj0iMS4wIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwMl8xLjAuMC9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDJfMS4wLjAvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxYzA1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwMl8xLjAuMC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICBuYW1lPSJidW5kbGUwMiIKLSAgaWQ9ImJ1bmRsZTAyIgotICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgdmVyc2lvbj0iMi4wIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwMy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhYzY3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwMy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSB2ZXJzaW9uIGF0dHJpYnV0ZSBpcyBpbnRlbnRpb25hbGx5IG1pc3NpbmcgLS0+Ci08cGx1Z2luCi0gIG5hbWU9ImJ1bmRsZTAzIgotICBpZD0iYnVuZGxlMDMiCi0gIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIiAgICAKLSAgLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTA0L3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwNC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2VhNmYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTA0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSBzaW5nbGUgZXh0ZW5zaW9uIHBvaW50IC0tPgotPHBsdWdpbgotICBuYW1lPSJidW5kbGUwNCIKLSAgaWQ9ImJ1bmRsZTA0IgotICB2ZXJzaW9uPSIxLjMuNyIKLSAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpZCIgbmFtZT0ibmFtZSIvPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwNS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2YmFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwNS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gc2luZ2xlIGV4dGVuc2lvbiAtLT4KLTxwbHVnaW4KLSAgbmFtZT0iYnVuZGxlMDUiCi0gIGlkPSJidW5kbGUwNSIKLSAgdmVyc2lvbj0iMS4zLjgiCi0gIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIj4KLSAgPGV4dGVuc2lvbiBwb2ludD0iaWQiLz4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDYvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTA2L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGI0ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDYvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tIHNpbmdsZSBleHRlbnNpb24gLS0+Ci08cGx1Z2luCi0gIG5hbWU9ImJ1bmRsZTA2IgotICBpZD0iYnVuZGxlMDYiCi0gIHZlcnNpb249IjEuMy45IgotICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyI+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImlkIiBuYW1lPSJuYW1lIi8+Ci0gIDxleHRlbnNpb24gcG9pbnQ9ImJ1bmRsZTA2LmlkIi8+ICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDcvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTA3L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDMyOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDcvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgbmFtZT0iYnVuZGxlMDciCi0gIGlkPSJidW5kbGUwNyIKLSAgdmVyc2lvbj0iMS4wLjAiCi0gIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDdiL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwN2IvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1NzgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwN2IvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgbmFtZT0iYnVuZGxlMDciCi0gIGlkPSJidW5kbGUwNyIKLSAgdmVyc2lvbj0iMS4wLjAuYiIKLSAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwOC9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDgvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzZTlhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwOC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICBuYW1lPSJidW5kbGUwOCIKLSAgaWQ9ImJ1bmRsZTA4IgotICB2ZXJzaW9uPSIxLjAuMCIKLSAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpZCIgbmFtZT0ibmFtZSIvPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUwOGIvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTA4Yi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUzNmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTA4Yi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICBuYW1lPSJidW5kbGUwOCIKLSAgaWQ9ImJ1bmRsZTA4IgotICB2ZXJzaW9uPSIxLjAuMC5iIgotICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyI+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImlkIiBuYW1lPSJuYW1lIi8+ICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTA5L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmEyODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMDkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgbmFtZT0iYnVuZGxlMDkiCi0gIGlkPSJidW5kbGUwOSIKLSAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciICAgIAotICB2ZXJzaW9uPSIxLjAuMCIKLSAgLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTEwL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxMC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTA2OTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTEwL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gIG5hbWU9ImJ1bmRsZTEwIgotICBpZD0iYnVuZGxlMTAiCi0gIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIiAgICAKLSAgdmVyc2lvbj0iMS4wLjAiCi0gIC8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTExL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNlODVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTExL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAgYnVuZGxlMTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTEyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMTIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmY1Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMTIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IGJ1bmRsZTEyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBidW5kbGUxMgotRXhwb3J0LXBhY2thZ2U6IGE7IHRlc3Q6PXZhbHVlMjsgdGVzdDo9dmFsdWUxIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMTMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxMy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkY2I4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxMy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogYnVuZGxlMTMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGJ1bmRsZTEzCi1FeHBvcnQtcGFja2FnZTogYTsgdGVzdD12YWx1ZTI7IHRlc3Q9dmFsdWUxIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMTQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxNC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlMTliMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxNC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogYnVuZGxlMTQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGJ1bmRsZTE0Ci1JbXBvcnQtcGFja2FnZTogYTsgYXR0cj12YWx1ZTEsIGE7IGF0dHI9dmFsdWUyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxNS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTE1L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmYxMjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTE1L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBidW5kbGUxNQotQnVuZGxlLVN5bWJvbGljTmFtZTogYnVuZGxlMTUKLUltcG9ydC1wYWNrYWdlOiB3aWxsbm90cmVzb2x2ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvaW50ZXJuYWwvcGx1Z2lucy9pbnN0YWxsVGVzdHMvYnVuZGxlMTYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxNi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwZjcyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxNi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogYnVuZGxlMTYKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGJ1bmRsZTE2CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxNy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTE3L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTYwN2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTE3L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBidW5kbGUxNwotQnVuZGxlLVN5bWJvbGljTmFtZTogYnVuZGxlMTcKLUZyYWdtZW50LUhvc3Q6IGJ1bmRsZTE2CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9pbnRlcm5hbC9wbHVnaW5zL2luc3RhbGxUZXN0cy9idW5kbGUxOC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTE4L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWE0NGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL2ludGVybmFsL3BsdWdpbnMvaW5zdGFsbFRlc3RzL2J1bmRsZTE4L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBidW5kbGUxOAotQnVuZGxlLVN5bWJvbGljTmFtZTogYnVuZGxlMTgKLUZyYWdtZW50LUhvc3Q6IHN5c3RlbS5idW5kbGU7IGV4dGVuc2lvbjo9Ym9vdGNsYXNzcGF0aApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9SRUFETUUgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3MGMzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRlc3QgamFyZmlsZXMsIHNpZ25lZCBieSBDQTFfTEVBRkEgKGFuZCBzb21ldGltZXMgQ0ExX0xFQUZCKSBhcyB3ZWxsLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9tdWx0aXBseV9zaWduZWQuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9tdWx0aXBseV9zaWduZWQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmZjMzQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvbXVsdGlwbHlfc2lnbmVkLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvbXVsdGlwbHlfc2lnbmVkX3dpdGhfY29ycnVwdC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL211bHRpcGx5X3NpZ25lZF93aXRoX2NvcnJ1cHQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGMwODdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvbXVsdGlwbHlfc2lnbmVkX3dpdGhfY29ycnVwdC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3NpZ25lZC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3NpZ25lZC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxY2FkN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9zaWduZWQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9zaWduZWRfdHNhLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkX3RzYS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NzU0MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9zaWduZWRfdHNhLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkX3dpdGhfY29ycnVwdC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3NpZ25lZF93aXRoX2NvcnJ1cHQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFmYWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkX3dpdGhfY29ycnVwdC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3NpZ25lZF93aXRoX21ldGFkYXRhLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkX3dpdGhfbWV0YWRhdGEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDY5M2NhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkX3dpdGhfbWV0YWRhdGEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9zaWduZWRfd2l0aF9tZXRhZGF0YV9hZGRlZC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3NpZ25lZF93aXRoX21ldGFkYXRhX2FkZGVkLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3ZDdjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3NpZ25lZF93aXRoX21ldGFkYXRhX2FkZGVkLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkX3dpdGhfbWV0YWRhdGFfY29ycnVwdC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3NpZ25lZF93aXRoX21ldGFkYXRhX2NvcnJ1cHQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzcxN2QyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkX3dpdGhfbWV0YWRhdGFfY29ycnVwdC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3NpZ25lZF93aXRoX21ldGFkYXRhX3JlbW92ZWQuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9zaWduZWRfd2l0aF9tZXRhZGF0YV9yZW1vdmVkLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2NDkzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3NpZ25lZF93aXRoX21ldGFkYXRhX3JlbW92ZWQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9zaWduZWRfd2l0aF9zZl9jb3JydXB0ZWQuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy9zaWduZWRfd2l0aF9zZl9jb3JydXB0ZWQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWI5NTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvc2lnbmVkX3dpdGhfc2ZfY29ycnVwdGVkLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvdGVzdC5idWcyNTIwOTguamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy90ZXN0LmJ1ZzI1MjA5OC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNDAzMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvYnVuZGxlcy90ZXN0LmJ1ZzI1MjA5OC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9idW5kbGVzL3Vuc2lnbmVkLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvdW5zaWduZWQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyZGIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2J1bmRsZXMvdW5zaWduZWQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvZWNsaXBzZS5qa3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9lY2xpcHNlLmprcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ4Nzg0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9lY2xpcHNlLmprcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2tleXN0b3JlLmprcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L2tleXN0b3JlLmprcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwMmZlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9rZXlzdG9yZS5qa3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9sZWFma2V5cy5qa3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9sZWFma2V5cy5qa3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NGQyYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvbGVhZmtleXMuamtzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL1JFQURNRSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L3BrY3MxMi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OTg4MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUNlcnRpZmljYXRlIGZpbGVzIGZvciBlYWNoIHRlc3QgY2VydC4gUGFzc3dvcmQgaXMgInBhc3N3b3JkIiAobm8gcXVvdGVzKSBmb3IgYWxsIGZpbGVzLiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9wa2NzMTIvY2ExX2xlYWZhLnAxMiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L3BrY3MxMi9jYTFfbGVhZmEucDEyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNhM2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L3BrY3MxMi9jYTFfbGVhZmEucDEyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL2NhMV9sZWFmYi5wMTIgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9wa2NzMTIvY2ExX2xlYWZiLnAxMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1N2Q4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9wa2NzMTIvY2ExX2xlYWZiLnAxMgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L3BrY3MxMi9jYTFfb3UucDEyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL2NhMV9vdS5wMTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzc0NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL2NhMV9vdS5wMTIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9wa2NzMTIvY2ExX3Jvb3QucDEyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL2NhMV9yb290LnAxMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3Y2QzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9wa2NzMTIvY2ExX3Jvb3QucDEyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL2NhMl9sZWFmYS5wMTIgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9wa2NzMTIvY2EyX2xlYWZhLnAxMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3ZTIxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9wa2NzMTIvY2EyX2xlYWZhLnAxMgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L3BrY3MxMi9jYTJfbGVhZmIucDEyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL2NhMl9sZWFmYi5wMTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzljMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL2NhMl9sZWFmYi5wMTIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudGVzdHMvdGVzdF9maWxlcy9zZWN1cml0eS9wa2NzMTIvY2EyX291LnAxMiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L3BrY3MxMi9jYTJfb3UucDEyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRhMmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L3BrY3MxMi9jYTJfb3UucDEyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL2NhMl9yb290LnAxMiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS50ZXN0cy90ZXN0X2ZpbGVzL3NlY3VyaXR5L3BrY3MxMi9jYTJfcm9vdC5wMTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Nzk2Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnRlc3RzL3Rlc3RfZmlsZXMvc2VjdXJpdHkvcGtjczEyL2NhMl9yb290LnAxMgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDc3MzJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSIiIGtpbmQ9ImxpYiIgc291cmNlcGF0aD0ic3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL09TR2klTWluaW11bS0xLjIiIGtpbmQ9ImNvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiIGtpbmQ9ImNvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJiaW4iIGtpbmQ9Im91dHB1dCIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzg2MDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uub3NnaS51dGlsPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiNWVjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgTWF5IDI1IDE1OjAwOjM3IEVEVCAyMDA0Ci1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NmNmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jVHVlIEp1biAwNiAxMToyMzoxMCBDRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhNjkyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVvc2dpVXRpbAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NnaS51dGlsCi1CdW5kbGUtVmVyc2lvbjogMy4yLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1EZXNjcmlwdGlvbjogJW9zZ2lVdGlsRGVzCi1CdW5kbGUtVmVuZG9yOiAlZWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLURvY1VybDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZwotQnVuZGxlLUNvbnRhY3RBZGRyZXNzOiB3d3cuZWNsaXBzZS5vcmcKLUJ1bmRsZS1Db3B5cmlnaHQ6ICVjb3B5cmlnaHQKLUV4cG9ydC1QYWNrYWdlOiBvcmcub3NnaS51dGlsLm1lYXN1cmVtZW50OyB2ZXJzaW9uPSIxLjAuMSIsCi0gb3JnLm9zZ2kudXRpbC5wb3NpdGlvbjsgdmVyc2lvbj0iMS4wLjEiLAotIG9yZy5vc2dpLnV0aWwueG1sOyB2ZXJzaW9uPSIxLjAuMSIKLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcms7IHZlcnNpb249MS4xLAotIGphdmF4LnhtbC5wYXJzZXJzOyByZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcub3NnaS51dGlsLm1lYXN1cmVtZW50OyB2ZXJzaW9uPSJbMS4wLjEsIDEuMikiLAotIG9yZy5vc2dpLnV0aWwucG9zaXRpb247IHZlcnNpb249IlsxLjAuMSwgMS4yKSIsCi0gb3JnLm9zZ2kudXRpbC54bWw7IHZlcnNpb249IlsxLjAuMSwgMS4yKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBPU0dpL01pbmltdW0tMS4yLAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTdkYjIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDI1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci0KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKLWRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIAotZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0byB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgZm9yIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0Pk9TR2kgTWF0ZXJpYWxzPC9oND4KLQotPHA+QWxsIGZpbGVzIGluIHRoZSBmb2xsb3dpbmcgc3ViLWRpcmVjdG9yaWVzIChhbmQgdGhlaXIgc3ViLWRpcmVjdG9yaWVzKTo8L3A+Ci0KLTx1bD4KLQk8bGk+b3JnL29zZ2k8L2xpPgotPC91bD4KLQotPHA+YW5kIHRoZSBmb2xsb3dpbmcgZmlsZXMgKHdoaWNoIG1heSBub3QgYmUgcHJlc2VudCBpbiBhbGwgY2FzZXMpOjwvcD4KLQotPHVsPgotCTxsaT5vc2dpL2VlLmZvdW5kYXRpb24uamFyPC9saT4KLQk8bGk+b3NnaS9lZS5taW5pbXVtLmphcjwvbGk+CQotPC91bD4KLQotPHA+c2hhbGwgYmUgZGVmaW5lZCBhcyB0aGUgJnF1b3Q7T1NHaSBNYXRlcmlhbHMuJnF1b3Q7ICBUaGUgT1NHaSBNYXRlcmlhbHMgYXJlOjwvcD4KLQotPGJsb2NrcXVvdGU+Ci1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYKLTxiciAvPjxiciAvPgotT1NHaSBBbGxpYW5jZQotQmlzaG9wIFJhbmNoIDY8YnIvPgotMjQwMCBDYW1pbm8gUmFtb24sIFN1aXRlIDM3NTxici8+Ci1TYW4gUmFtb24sIENBIDk0NTgzIFVTQQotPGJyIC8+PGJyIC8+Ci1BbGwgUmlnaHRzIFJlc2VydmVkLgotPC9ibG9ja3F1b3RlPgotCi08cD5UaGUgT1NHaSBNYXRlcmlhbHMgYXJlIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQKLWluIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL0xJQ0VOU0UtMi4wLnR4dCIgdGFyZ2V0PSJfYmxhbmsiPkxJQ0VOU0UtMi4wLnR4dDwvYT4gYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LjwvcD4KLQotPHA+SW1wbGVtZW50YXRpb24gb2YgY2VydGFpbiBlbGVtZW50cyBvZiB0aGUgT1NHaSBNYXRlcmlhbHMgbWF5IGJlIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgcGF0ZW50IHJpZ2h0cyAoc3VjaCBhIHRoaXJkIHBhcnR5IG1heQotb3IgbWF5IG5vdCBiZSBhIG1lbWJlciBvZiB0aGUgT1NHaSBBbGxpYW5jZSkuICBUaGUgT1NHaSBBbGxpYW5jZSBhbmQgaXRzIG1lbWJlcnMgYXJlIG5vdCByZXNwb25zaWJsZSBhbmQgc2hhbGwgbm90IGJlIGhlbGQgcmVzcG9uc2libGUgaW4gYW55IG1hbm5lciBmb3IgaWRlbnRpZnlpbmcgb3IgZmFpbGluZyB0byBpZGVudGlmeSBhbnkgb3IgYWxsIHN1Y2ggdGhpcmQgcGFydHkKLWludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMuPC9wPgotCi08c21hbGw+T1NHaSZ0cmFkZTsgaXMgYSB0cmFkZW1hcmssIHJlZ2lzdGVyZWQgdHJhZGVtYXJrLCBvciBzZXJ2aWNlIG1hcmsgb2YgVGhlIE9TR2kgQWxsaWFuY2UgaW4gdGhlIFVTIGFuZCBvdGhlciBjb3VudHJpZXMuIEphdmEgaXMgYSB0cmFkZW1hcmssCi1yZWdpc3RlcmVkIHRyYWRlbWFyaywgb3Igc2VydmljZSBtYXJrIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVTIGFuZCBvdGhlciBjb3VudHJpZXMuIEFsbCBvdGhlciB0cmFkZW1hcmtzLCByZWdpc3RlcmVkIHRyYWRlbWFya3MsIG9yCi1zZXJ2aWNlIG1hcmtzIHVzZWQgaW4gdGhlIENvbnRlbnQgYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycyBhbmQgYXJlIGhlcmVieSByZWNvZ25pemVkLjwvc21hbGw+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvYWJvdXRfZmlsZXMvTElDRU5TRS0yLjAudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvYWJvdXRfZmlsZXMvTElDRU5TRS0yLjAudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL2Fib3V0X2ZpbGVzL0xJQ0VOU0UtMi4wLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDE1ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIG9yZy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvCi1zcmMuaW5jbHVkZXMgPSBzcmMuemlwLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvCi1zb3VyY2UuLiA9IC4KLW91dHB1dC4uID0gLgotY3VzdG9tQnVpbGRDYWxsYmFja3M9Y3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjUwZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBDdXN0b20gdGFyZ2V0cyBjYWxsZWQgZnJvbSBhIHByb2plY3QncyBnZW5lcmF0ZWQgYnVpbGQueG1sICAgICAgICAgICAgLS0+Ci08IS0tIFNldCBjdXN0b21CdWlsZENhbGxiYWNrcz08cGF0aC90by90aGlzL2ZpbGU+IGluIHlvdXIgYnVpbGQucHJvcGVydGllcy4tLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHByb2plY3QgbmFtZT0iQnVpbGQgc3BlY2lmaWMgdGFyZ2V0cyBhbmQgcHJvcGVydGllcyIgZGVmYXVsdD0ibm9EZWZhdWx0Ij4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVGhpcyBmaWxlIG11c3QgYmUgY2FsbGVkIHdpdGggZXhwbGljaXQgdGFyZ2V0cyIgLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLmphcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5qYXJzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5qYXJzIj4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiB0YXJnZXQgPG5hbWU+ICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gU3Vic3RpdHV0ZSAibmFtZSIgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdGFyZ2V0LCBlZyBAZG90ICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBzb3VyY2UuZm9sZGVybiA6IG4gPSAxIC4uLiBOLCB0aGUgc291cmNlIGZvbGRlcnMgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyICA6IHdoZXJlIHRoZSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiBnbyAgICAgICAgICAgIC0tPgotCTwhLS0gICA8bmFtZT4uY2xhc3NwYXRoIDogbmFtZSA9IG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHRhcmdldC4gQSAgICAgICAgIC0tPgotCTwhLS0gICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHRvIHRoZSBjbGFzc3BhdGggc3RydWN0dXJlLiAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLm5hbWUiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcmUuQGRvdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGR1cmluZyB0aGUgY29tcGlsYXRpb24gdGFyZ2V0IDxuYW1lPiwgYWZ0ZXIgdGhlIGNvbXBpbGUgICAtLT4KLQk8IS0tIGJ1dCBiZWZvcmUgamFyaW5nLiAgU3Vic3RpdHV0ZSAibmFtZSIgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24tLT4KLQk8IS0tIHRhcmdldCwgZWcgQGRvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgc291cmNlLmZvbGRlcm4gOiBuID0gMSAuLi4gTiwgdGhlIHNvdXJjZSBmb2xkZXJzICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgdGFyZ2V0LmZvbGRlciAgOiB3aGVyZSB0aGUgcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gZ28gICAgICAgICAgICAtLT4KLQk8IS0tICAgPG5hbWU+LmNsYXNzcGF0aCA6IG5hbWUgPSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB0YXJnZXQuIEEgICAgICAgICAtLT4KLQk8IS0tICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSB0byB0aGUgY2xhc3NwYXRoIHN0cnVjdHVyZS4gICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuY29tcGlsZS5uYW1lIj4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icG9zdC5jb21waWxlLkBkb3QiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIGNvbXBpbGF0aW9uIHRhcmdldCA8bmFtZT4gICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gU3Vic3RpdHV0ZSAibmFtZSIgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdGFyZ2V0LCBlZyBAZG90ICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBqYXIubG9jYXRpb24gLSB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbXBpbGF0aW9uIHJlc3VsdHMgICAgICAgICAgICAgIC0tPgotCTwhLS0gICA8bmFtZT4uY2xhc3NwYXRoIDogbmFtZSA9IG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHRhcmdldC4gQSAgICAgICAgIC0tPgotCTwhLS0gICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHRvIHRoZSBjbGFzc3BhdGggc3RydWN0dXJlLiAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5uYW1lIj4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icG9zdC5AZG90Ij4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5iaW4ucGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgY29udGFpbmluZyB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JPC90YXJnZXQ+Ci0JCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuc291cmNlcyI+Ci0JCTx1bnppcCBzcmM9IiR7dGFyZ2V0LmZvbGRlcn0vc3JjLnppcCIgZGVzdD0iJHt0YXJnZXQuZm9sZGVyfSIgb3ZlcndyaXRlPSJmYWxzZSIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L3NyYy56aXAiIC8+CQotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBnYXRoZXIubG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuZ2F0aGVyLmxvZ3MiPiAgICAgICAgCi0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmxvZ3MiPiAgICAgICAKLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmNsZWFuIj4KLQkJPG1vdmUgZmlsZT0ic3JjLnppcCIgdG9maWxlPSJ1dGlsX3NyYy56aXAiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBwbHVnaW4uZGVzdGluYXRpb24gLSBmaW5hbCBkZXN0aW5hdGlvbiBvZiB0aGUgYnVpbGQgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0ZW1wLmZvbGRlciAtIHRlbXBvcmFyeSBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5jbGVhbiI+Ci0JCTxtb3ZlIGZpbGU9InV0aWxfc3JjLnppcCIgdG9maWxlPSJzcmMuemlwIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9vcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L01lYXN1cmVtZW50LmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9NZWFzdXJlbWVudC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1NjZmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9vcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L01lYXN1cmVtZW50LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9TdGF0ZS5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL29yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvU3RhdGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTkwZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9TdGF0ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL29yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvVW5pdC5jbGFzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL29yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvVW5pdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0ODdlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9vcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L1VuaXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9vcmcvb3NnaS91dGlsL3Bvc2l0aW9uL1Bvc2l0aW9uLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvb3JnL29zZ2kvdXRpbC9wb3NpdGlvbi9Qb3NpdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NWIyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9vcmcvb3NnaS91dGlsL3Bvc2l0aW9uL1Bvc2l0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvb3JnL29zZ2kvdXRpbC94bWwvWE1MUGFyc2VyQWN0aXZhdG9yLmNsYXNzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvb3JnL29zZ2kvdXRpbC94bWwvWE1MUGFyc2VyQWN0aXZhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjE1ZTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL29yZy9vc2dpL3V0aWwveG1sL1hNTFBhcnNlckFjdGl2YXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYTg2MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpLnV0aWwvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vc2dpVXRpbCA9IE9TR2kgUmVsZWFzZSA0LjIuMCBVdGlsaXR5IENsYXNzZXMKLWVjbGlwc2Uub3JnID0gRWNsaXBzZS5vcmcgLSBFcXVpbm94Ci1vc2dpVXRpbERlcyA9IE9TR2kgU2VydmljZSBQbGF0Zm9ybSBSZWxlYXNlIDQuMi4wIFV0aWxpdHkgQ2xhc3NlcwotY29weXJpZ2h0ID0gQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL3NyYy56aXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kudXRpbC9zcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjY0YWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS51dGlsL3NyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL29zZ2kvaW50ZXJuYWwvbW9kdWxlL01hcHBlZExpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9pbnRlcm5hbC9tb2R1bGUvTWFwcGVkTGlzdC5qYXZhCmluZGV4IGFkZTYxOGEuLmY5ZjA2NmIgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9pbnRlcm5hbC9tb2R1bGUvTWFwcGVkTGlzdC5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9pbnRlcm5hbC9tb2R1bGUvTWFwcGVkTGlzdC5qYXZhCkBAIC03NSw3ICs3NSw3IEBACiAJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewogCQkJT2JqZWN0IHZhbHVlID0gaXRlci5uZXh0KCk7CiAJCQlpZiAodmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLQkJCQlPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pIGl0ZXIubmV4dCgpOworCQkJCU9iamVjdFtdIHZhbHVlcyA9IChPYmplY3RbXSkgdmFsdWU7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCiAJCQkJCXJlc3VsdHMuYWRkKHZhbHVlc1tpXSk7CiAJCQl9IGVsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9zdXBwbGVtZW50L3NyYy9vcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9ldmVudG1nci9Db3B5T25Xcml0ZUlkZW50aXR5TWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kvc3VwcGxlbWVudC9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9mcmFtZXdvcmsvZXZlbnRtZ3IvQ29weU9uV3JpdGVJZGVudGl0eU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ1YTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9zdXBwbGVtZW50L3NyYy9vcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9ldmVudG1nci9Db3B5T25Xcml0ZUlkZW50aXR5TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuZXZlbnRtZ3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIGNvcHktb24td3JpdGUgaWRlbnRpdHkgbWFwLiBXcml0ZSBvcGVyYXRpb25zIHJlc3VsdCBpbiBjb3B5aW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgc28gdGhhdAotICogc2ltdWx0YW5lb3VzIHJlYWQgb3BlcmF0aW9ucyBhcmUgbm90IGFmZmVjdGVkLgotICogVGhpcyBhbGxvd3MgZm9yIHNhZmUsIHVuc3luY2hyb25pemVkIHRyYXZlcnNhbC4KLSAqIAotICogPHA+Ci0gKiBOb3RlOiBUaGlzIGNsYXNzIHVzZXMgaWRlbnRpdHkgZm9yIGtleSBhbmQgdmFsdWUgY29tcGFyaXNvbiwgbm90IGVxdWFscy4KLSAqIAotICogQHNpbmNlIDMuNQotICovCi1wdWJsaWMgY2xhc3MgQ29weU9uV3JpdGVJZGVudGl0eU1hcCBpbXBsZW1lbnRzIE1hcCB7Ci0JLyoqCi0JICogVGhlIGVtcHR5IGFycmF5IHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnRyeVtdIGVtcHR5QXJyYXkgPSBuZXcgRW50cnlbMF07Ci0KLQkvKioKLQkgKiBUaGUgYXJyYXkgb2YgZW50cmllcy4gVGhpcyBmaWVsZCBpcyB2b2xhdGlsZSBzbyBpdCBjYW4gYmUgCi0JICogYWNjZXNzZWQgZnJvbSB1bnN5bmNocm9uaXplZCByZWFkZXIgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIHZvbGF0aWxlIEVudHJ5W10gZW50cmllczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgbWFwLgotCSAqCi0JICovCi0JcHVibGljIENvcHlPbldyaXRlSWRlbnRpdHlNYXAoKSB7Ci0JCWVudHJpZXMgPSBlbXB0eUFycmF5OwotCX0KLQotCS8qKgotCSAqIENvcHkgY29uc3RydWN0b3IuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBDb3B5T25Xcml0ZU1hcCB0byBjb3B5LgotCSAqLwotCXB1YmxpYyBDb3B5T25Xcml0ZUlkZW50aXR5TWFwKENvcHlPbldyaXRlSWRlbnRpdHlNYXAgc291cmNlKSB7Ci0JCXRoaXMuZW50cmllcyA9IHNvdXJjZS5lbnRyaWVzKCk7Ci0JfQotCi0JLyogVGhlc2UgbWV0aG9kcyBtb2RpZnkgdGhlIG1hcCBhbmQgYXJlIHN5bmNocm9uaXplZC4gKi8KLQotCS8qKgotCSAqIEFkZCBhIGtleSwgdmFsdWUgcGFpciB0byB0aGUgbWFwLgotCSAqIElmIHRoZSBrZXkgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIG1hcCwgdGhlbiBpdHMgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IHZhbHVlLgotCSAqIEtleXMgYXJlIGNvbXBhcmVkIHVzaW5nIGlkZW50aXR5LgotCSAqCi0JICogQHBhcmFtIGtleSBUaGUga2V5IG9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9iamVjdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLQkgKiBUaGlzIG1heSBiZSBudWxsLgotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBrZXkgd2FzIG5ld2x5IGFkZGVkIHRvIHRoZSBtYXAuCi0JICogT3RoZXJ3aXNlIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUga2V5LgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIGtleSBpcyBudWxsLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlpbnQgc2l6ZSA9IGVudHJpZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGVudHJpZXNbaV0ua2V5ID09IGtleSkgewotCQkJCU9iamVjdCB2ID0gZW50cmllc1tpXS52YWx1ZTsKLQkJCQlpZiAodiA9PSB2YWx1ZSkgewotCQkJCQlyZXR1cm4gdjsKLQkJCQl9Ci0JCQkJRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IEVudHJ5W3NpemVdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZW50cmllcywgMCwgbmV3RW50cmllcywgMCwgc2l6ZSk7Ci0JCQkJbmV3RW50cmllc1tpXSA9IG5ldyBFbnRyeShrZXksIHZhbHVlKTsKLQkJCQllbnRyaWVzID0gbmV3RW50cmllczsKLQkJCQlyZXR1cm4gdjsKLQkJCX0KLQkJfQotCi0JCUVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBFbnRyeVtzaXplICsgMV07Ci0JCWlmIChzaXplID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBzaXplKTsKLQkJfQotCQluZXdFbnRyaWVzW3NpemVdID0gbmV3IEVudHJ5KGtleSwgdmFsdWUpOwotCQllbnRyaWVzID0gbmV3RW50cmllczsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZW50cmllcyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgbWFwLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG1hcCB3aG9zZSBlbnRyaWVzIGFyZSB0byBiZSBhZGRlZCB0byB0aGlzIG1hcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHNvdXJjZSkgewotCQlpbnQgc291cmNlU2l6ZSA9IHNvdXJjZS5zaXplKCk7Ci0JCWlmIChzb3VyY2VTaXplID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc291cmNlIGluc3RhbmNlb2YgQ29weU9uV3JpdGVJZGVudGl0eU1hcCkgewotCQkJcHV0QWxsKCgoQ29weU9uV3JpdGVJZGVudGl0eU1hcCkgc291cmNlKS5lbnRyaWVzKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRW50cnlbXSB0b0NvcHkgPSBuZXcgRW50cnlbc291cmNlU2l6ZV07Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2UuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVNpemU7IGkrKykgewotCQkJTWFwLkVudHJ5IG1hcEVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQl0b0NvcHlbaV0gPSBuZXcgRW50cnkobWFwRW50cnkuZ2V0S2V5KCksIG1hcEVudHJ5LmdldFZhbHVlKCkpOwotCQl9Ci0JCXB1dEFsbCh0b0NvcHkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGtleXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHRvIHRoaXMgbWFwIHdpdGggdGhlIHZhbHVlCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGtleXMgVGhlIGFycmF5IG9mIGtleXMgdG8gYmUgYWRkZWQgdG8gdGhpcyBtYXAuCi0JICovCi0JcHVibGljIHZvaWQgcHV0QWxsKE9iamVjdFtdIGtleXMpIHsKLQkJaW50IHNvdXJjZVNpemUgPSBrZXlzLmxlbmd0aDsKLQkJaWYgKHNvdXJjZVNpemUgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVudHJ5W10gdG9Db3B5ID0gbmV3IEVudHJ5W3NvdXJjZVNpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVNpemU7IGkrKykgewotCQkJdG9Db3B5W2ldID0gbmV3IEVudHJ5KGtleXNbaV0sIG51bGwpOwotCQl9Ci0JCXB1dEFsbCh0b0NvcHkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVudHJpZXMgdG8gdGhpcyBtYXAuCi0JICogCi0JICogQHBhcmFtIHRvQ29weSBBcnJheSBvZiBlbnRyaWVzIHRvIGFkZCB0byB0aGlzIG1hcC4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHB1dEFsbChFbnRyeVtdIHRvQ29weSkgewotCQlpbnQgc291cmNlU2l6ZSA9IHRvQ29weS5sZW5ndGg7Ci0JCWludCBzaXplID0gZW50cmllcy5sZW5ndGg7Ci0JCUVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBFbnRyeVtzaXplICsgc291cmNlU2l6ZV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZW50cmllcywgMCwgbmV3RW50cmllcywgMCwgc2l6ZSk7Ci0JCWNvcHk6IGZvciAoaW50IG4gPSAwOyBuIDwgc291cmNlU2l6ZTsgbisrKSB7Ci0JCQlFbnRyeSBjb3B5ID0gdG9Db3B5W25dOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAobmV3RW50cmllc1tpXS5rZXkgPT0gY29weS5rZXkpIHsKLQkJCQkJbmV3RW50cmllc1tpXSA9IGNvcHk7Ci0JCQkJCWNvbnRpbnVlIGNvcHk7Ci0JCQkJfQotCQkJfQotCQkJbmV3RW50cmllc1tzaXplXSA9IGNvcHk7Ci0JCQlzaXplKys7Ci0JCX0KLQkJaWYgKHNpemUgPT0gbmV3RW50cmllcy5sZW5ndGgpIHsKLQkJCWVudHJpZXMgPSBuZXdFbnRyaWVzOwotCQkJcmV0dXJuOwotCQl9Ci0JCUVudHJ5W10gZSA9IG5ldyBFbnRyeVtzaXplXTsKLQkJU3lzdGVtLmFycmF5Y29weShuZXdFbnRyaWVzLCAwLCBlLCAwLCBzaXplKTsKLQkJZW50cmllcyA9IGU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEga2V5IGZyb20gdGhlIG1hcCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCi0JICogS2V5IG9iamVjdHMgYXJlIGNvbXBhcmVkIHVzaW5nIGlkZW50aXR5LgotCSAqCi0JICogQHBhcmFtIGtleSBUaGUga2V5IG9iamVjdCB0byBiZSByZW1vdmVkIGZyb20gdGhlIG1hcC4KLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBpbiB0aGUgbGlzdC4gCi0JICogT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYga2V5IGlzIG51bGwuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlpbnQgc2l6ZSA9IGVudHJpZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGVudHJpZXNbaV0ua2V5ID09IGtleSkgewotCQkJCU9iamVjdCB2ID0gZW50cmllc1tpXS52YWx1ZTsKLQkJCQlpZiAoc2l6ZSA9PSAxKSB7Ci0JCQkJCWVudHJpZXMgPSBlbXB0eUFycmF5OwotCQkJCQlyZXR1cm4gdjsKLQkJCQl9Ci0JCQkJRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IEVudHJ5W3NpemUgLSAxXTsKLQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBpKTsKLQkJCQl9Ci0JCQkJaW50IG5leHQgPSBzaXplIC0gMSAtIGk7Ci0JCQkJaWYgKG5leHQgPiAwKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZW50cmllcywgaSArIDEsIG5ld0VudHJpZXMsIGksIG5leHQpOwotCQkJCX0KLQkJCQllbnRyaWVzID0gbmV3RW50cmllczsKLQkJCQlyZXR1cm4gdjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIGVudHJpZXMgZnJvbSB0aGUgbWFwLgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJZW50cmllcyA9IGVtcHR5QXJyYXk7Ci0JfQotCi0JLyogVGhlc2UgbWV0aG9kcyBvbmx5IHJlYWQgdGhlIG1hcCBhbmQgYXJlIG5vdCBzeW5jaHJvbml6ZWQuICovCi0KLQkvKioKLQkgKiBBY2Nlc3NvciBmb3IgbWV0aG9kcyB3aGljaCBvbmx5IHJlYWQgdGhlIGVudHJpZXMuCi0JICogQHJldHVybiBUaGUgYXJyYXkgb2YgZW50cmllcy4gQ2FsbGVycyB0byB0aGlzIG1ldGhvZCBNVVNUIE5PVAotCSAqIG1vZGlmeSB0aGUgcmV0dXJuZWQgYXJyYXkuCi0JICovCi0JcHJpdmF0ZSBFbnRyeVtdIGVudHJpZXMoKSB7Ci0JCXJldHVybiBlbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIElzIHRoZSBtYXAgZW1wdHk/Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGlzdCBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBtYXAuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gZW50cmllcygpLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0JICogS2V5cyBhcmUgY29tcGFyZWQgdXNpbmcgaWRlbnRpdHkuCi0JICogCi0JICogQHBhcmFtIGtleSBUaGUga2V5IG9iamVjdC4KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQga2V5LgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIGtleSBpcyBudWxsLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlFbnRyeVtdIGUgPSBlbnRyaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVbaV0ua2V5ID09IGtleSkgewotCQkJCXJldHVybiBlW2ldLnZhbHVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuCi0JICogS2V5cyBhcmUgY29tcGFyZWQgdXNpbmcgaWRlbnRpdHkuCi0JICogCi0JICogQHBhcmFtIGtleSBUaGUga2V5IG9iamVjdC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGluIHRoZSBtYXAuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYga2V5IGlzIG51bGwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUVudHJ5W10gZSA9IGVudHJpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZVtpXS5rZXkgPT0ga2V5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBWYWx1ZXMgYXJlIGNvbXBhcmVkIHVzaW5nIGlkZW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2JqZWN0LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBpbiB0aGUgbWFwLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCUVudHJ5W10gZSA9IGVudHJpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZVtpXS52YWx1ZSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc25hcHNob3Qgb2YgdGhlIGVudHJpZXMgaW4gdGhpcyBtYXAuCi0JICogVGhlIHJldHVybmVkIHNldCB3aWxsIE5PVCBiZSBjaGFuZ2VkIGJ5IGZ1dHVyZSBjaGFuZ2VzIHRvIHRoaXMgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gQSBTZXQgb2YgTWFwLkVudHJ5IGZvciBlYWNoIGVudHJ5IGluIHRoaXMgbWFwLgotCSAqIFRoZSBzZXQgYW5kIHRoZSBlbnRyaWVzIHJldHVybmVkIGJ5IHRoZSBzZXQgY2Fubm90IGJlIG1vZGlmaWVkLgotCSAqLwotCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0JCXJldHVybiBuZXcgRW50cnlTZXQoZW50cmllcygpLCBFbnRyeVNldC5FTlRSWSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBrZXlzIGluIHRoaXMgbWFwLgotCSAqIFRoZSByZXR1cm5lZCBzZXQgd2lsbCBOT1QgYmUgY2hhbmdlZCBieSBmdXR1cmUgY2hhbmdlcyB0byB0aGlzIG1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgU2V0IG9mIHRoZSBrZXkgb2JqZWN0cyBpbiB0aGlzIG1hcAotCSAqIFRoZSBzZXQgY2Fubm90IGJlIG1vZGlmaWVkLgotCSAqLwotCXB1YmxpYyBTZXQga2V5U2V0KCkgewotCQlyZXR1cm4gbmV3IEVudHJ5U2V0KGVudHJpZXMoKSwgRW50cnlTZXQuS0VZKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc25hcHNob3Qgb2YgdGhlIHZhbHVlcyBpbiB0aGlzIG1hcC4KLQkgKiBUaGUgcmV0dXJuZWQgY29sbGVjdGlvbiB3aWxsIE5PVCBiZSBjaGFuZ2VkIGJ5IGZ1dHVyZSBjaGFuZ2VzIHRvIHRoaXMgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gQSBDb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZSBvYmplY3RzIGluIHRoaXMgbWFwLgotCSAqIFRoZSBjb2xsZWN0aW9uIGNhbm5vdCBiZSBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0JCXJldHVybiBuZXcgRW50cnlTZXQoZW50cmllcygpLCBFbnRyeVNldC5WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBlbnRyeSBpbiB0aGlzIE1hcC4KLQkgKiBFbnRyeSBpcyBpbW11dGFibGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnkgaW1wbGVtZW50cyBNYXAuRW50cnkgewotCQkvKioKLQkJICogS2V5IG9iamVjdC4KLQkJICovCi0JCWZpbmFsIE9iamVjdCBrZXk7Ci0KLQkJLyoqCi0JCSAqIFZhbHVlIG9iamVjdC4KLQkJICovCi0JCWZpbmFsIE9iamVjdCB2YWx1ZTsKLQotCQkvKioKLQkJICogQ29uc3RydWN0b3IgZm9yIG1hcCBlbnRyeS4KLQkJICogQHBhcmFtIGtleSBLZXkgb2JqZWN0IGluIGVudHJ5LiBVc2VkIGZvciB1bmlxdWVuZXNzLgotCQkgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2JqZWN0IHN0b3JlZCB3aXRoIGtleSBvYmplY3QuCi0JCSAqLwotCQlFbnRyeShmaW5hbCBPYmplY3Qga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCXRoaXMua2V5ID0ga2V5OwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgLy8gZW50cmllcyBjYW5ub3QgYmUgbW9kaWZpZWQuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgY2xhc3MgdXNlZCBmb3IgZW50cnkgYW5kIGtleSBzZXRzIGFuZCB2YWx1ZXMgY29sbGVjdGlvbnMuCi0JICoKLQkgKiBUaGlzIGNsYXNzIGlzIGltbXV0YWJsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRyeVNldCBleHRlbmRzIEFic3RyYWN0U2V0IHsKLQkJcHJpdmF0ZSBmaW5hbCBFbnRyeVtdIGVudHJpZXM7Ci0JCXByaXZhdGUgZmluYWwgaW50IHJldHVyblR5cGU7Ci0JCWZpbmFsIHN0YXRpYyBpbnQgRU5UUlkgPSAxOwotCQlmaW5hbCBzdGF0aWMgaW50IEtFWSA9IDI7Ci0JCWZpbmFsIHN0YXRpYyBpbnQgVkFMVUUgPSAzOwotCi0JCUVudHJ5U2V0KEVudHJ5W10gZW50cmllcywgaW50IHJldHVyblR5cGUpIHsKLQkJCXRoaXMuZW50cmllcyA9IGVudHJpZXM7Ci0JCQl0aGlzLnJldHVyblR5cGUgPSByZXR1cm5UeXBlOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKGVudHJpZXMsIHJldHVyblR5cGUpOwotCQl9Ci0KLQkJcHVibGljIGludCBzaXplKCkgewotCQkJcmV0dXJuIGVudHJpZXMubGVuZ3RoOwotCQl9Ci0JfQotCi0JLyoqIAotCSAqIEl0ZXJhdG9yIGNsYXNzIHVzZWQgZm9yIGVudHJ5IGFuZCBrZXkgc2V0cyBhbmQgdmFsdWVzIGNvbGxlY3Rpb25zLgotCSAqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBFbnRyeVtdIGVudHJpZXM7Ci0JCXByaXZhdGUgZmluYWwgaW50IHJldHVyblR5cGU7Ci0JCXByaXZhdGUgaW50IGN1cnNvciA9IDA7Ci0KLQkJRW50cnlJdGVyYXRvcihFbnRyeVtdIGVudHJpZXMsIGludCByZXR1cm5UeXBlKSB7Ci0JCQl0aGlzLmVudHJpZXMgPSBlbnRyaWVzOwotCQkJdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gY3Vyc29yIDwgZW50cmllcy5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlpZiAoY3Vyc29yID09IGVudHJpZXMubGVuZ3RoKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXN3aXRjaCAocmV0dXJuVHlwZSkgewotCQkJCWNhc2UgRW50cnlTZXQuRU5UUlkgOgotCQkJCQlyZXR1cm4gZW50cmllc1tjdXJzb3IrK107Ci0JCQkJY2FzZSBFbnRyeVNldC5LRVkgOgotCQkJCQlyZXR1cm4gZW50cmllc1tjdXJzb3IrK10ua2V5OwotCQkJCWNhc2UgRW50cnlTZXQuVkFMVUUgOgotCQkJCQlyZXR1cm4gZW50cmllc1tjdXJzb3IrK10udmFsdWU7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IC8vIHRoZSBjb2xsZWN0aW9uIGNhbm5vdCBiZSBtb2RpZmllZC4KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9zdXBwbGVtZW50L3NyYy9vcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9ldmVudG1nci9FdmVudERpc3BhdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9zdXBwbGVtZW50L3NyYy9vcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9ldmVudG1nci9FdmVudERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2ZjNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kvc3VwcGxlbWVudC9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9mcmFtZXdvcmsvZXZlbnRtZ3IvRXZlbnREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5ldmVudG1ncjsKLQotLyoqCi0gKiBUaGUgRXZlbnREaXNwYXRjaGVyIGludGVyZmFjZSBjb250YWlucyB0aGUgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGJ5IHRoZQotICogRXZlbnQgTWFuYWdlciB0byBjb21wbGV0ZSB0aGUgZXZlbnQgZGVsaXZlcnkgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXZlbnREaXNwYXRjaGVyIHsKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBsaXN0ZW5lci4KLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGNhc3QgdGhlIGV2ZW50IGxpc3RlbmVyIG9iamVjdCB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIKLQkgKiBjbGFzcyBmb3IgdGhlIGV2ZW50IHR5cGUgYW5kIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIG1ldGhvZC4KLQkgKiAKLQkgKiA8cD5UaGUgbWV0aG9kIHNob3VsZCBwcm9wZXJseSBsb2cvaGFuZGxlIGFueSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY2FsbGVkCi0JICogbGlzdGVuZXIuIFRoZSBFdmVudE1hbmFnZXIgd2lsbCBpZ25vcmUgYW55IFRocm93YWJsZSB0aHJvd24gYnkgdGhpcyBtZXRob2QKLQkgKiBpbiBvcmRlciB0byBjb250aW51ZSBkZWxpdmVyeSBvZiB0aGUgZXZlbnQgdG8gdGhlIG5leHQgbGlzdGVuZXIuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnRMaXN0ZW5lciBUaGlzIGlzIHRoZSBrZXkgaW4gdGhlIE1hcC5FbnRyeSBmb3IgdGhlIGxpc3RlbmVyLgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBtdXN0IGNhc3QgaXQgdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyCi0JICogY2xhc3MgZm9yIHRoZSBldmVudCB0byBiZSBkZWxpdmVyZWQgYW5kIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBtZXRob2QKLQkgKiBtdXN0IHRoZW4gYmUgY2FsbGVkLgotCSAqIEBwYXJhbSBsaXN0ZW5lck9iamVjdCBUaGlzIGlzIHRoZSB2YWx1ZSBpbiB0aGUgTWFwLkVudHJ5IGZvciB0aGUgbGlzdGVuZXIuCi0JICogQHBhcmFtIGV2ZW50QWN0aW9uIFRoaXMgdmFsdWUgd2FzIHBhc3NlZCB0byB0aGUgTGlzdGVuZXJRdWV1ZSBvYmplY3QgdmlhIG9uZSBvZiBpdHMKLQkgKiBkaXNwYXRjaEV2ZW50KiBtZXRob2QgY2FsbHMuIEl0IGNhbiBwcm92aWRlIGluZm9ybWF0aW9uIChzdWNoCi0JICogYXMgd2hpY2ggbGlzdGVuZXIgbWV0aG9kIHRvIGNhbGwpIHNvIHRoYXQgdGhlIEV2ZW50RGlzcGF0Y2hlcgotCSAqIGNhbiBjb21wbGV0ZSB0aGUgZGVsaXZlcnkgb2YgdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lci4KLQkgKiBAcGFyYW0gZXZlbnRPYmplY3QgVGhpcyBvYmplY3Qgd2FzIHBhc3NlZCB0byB0aGUgTGlzdGVuZXJRdWV1ZSBvYmplY3QgdmlhIG9uZSBvZiBpdHMKLQkgKiBkaXNwYXRjaEV2ZW50KiBtZXRob2QgY2FsbHMuIFRoaXMgb2JqZWN0IHdhcyBjcmVhdGVkIGJ5IHRoZSBldmVudCBzb3VyY2UgYW5kCi0JICogaXMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLiBJdCBzaG91bGQgY29udGFpbiBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiAoc3VjaAotCSAqIGFzIHdoYXQgZXZlbnQgb2JqZWN0IHRvIHBhc3MpIHNvIHRoYXQgdGhpcyBtZXRob2QKLQkgKiBjYW4gY29tcGxldGUgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBldmVudCB0byB0aGUgbGlzdGVuZXIuCi0JICogVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGFjdHVhbCBldmVudCBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGF0Y2hFdmVudChPYmplY3QgZXZlbnRMaXN0ZW5lciwgT2JqZWN0IGxpc3RlbmVyT2JqZWN0LCBpbnQgZXZlbnRBY3Rpb24sIE9iamVjdCBldmVudE9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kvc3VwcGxlbWVudC9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9mcmFtZXdvcmsvZXZlbnRtZ3IvRXZlbnRMaXN0ZW5lcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9zdXBwbGVtZW50L3NyYy9vcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9ldmVudG1nci9FdmVudExpc3RlbmVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWU2NmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9zdXBwbGVtZW50L3NyYy9vcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9ldmVudG1nci9FdmVudExpc3RlbmVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuZXZlbnRtZ3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIGxpc3Qgb2YgbGlzdGVuZXJzLiAKLSAqIAotICogTGlzdGVuZXJzIG1heSBiZSBhZGRlZCBvciByZW1vdmVkIGFzIG5lY2Vzc2FyeS4KLSAqIAotICogVGhpcyBjbGFzcyB1c2VzIGlkZW50aXR5IGZvciBjb21wYXJpc29uLCBub3QgZXF1YWxzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKiBAZGVwcmVjYXRlZCBBcyBvZiAzLjUuIFJlcGxhY2VkIGJ5IENvcHlPbldyaXRlSWRlbnRpdHlNYXAuCi0gKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgY2xhc3MgRXZlbnRMaXN0ZW5lcnMgewotCXByaXZhdGUgZmluYWwgQ29weU9uV3JpdGVJZGVudGl0eU1hcCBsaXN0ID0gbmV3IENvcHlPbldyaXRlSWRlbnRpdHlNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgbGlzdGVuZXIgbGlzdC4KLQkgKgotCSAqLwotCXB1YmxpYyBFdmVudExpc3RlbmVycygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGxpc3RlbmVyIGxpc3QuCi0JICoKLQkgKiBAcGFyYW0gY2FwYWNpdHkgVGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBFdmVudExpc3RlbmVycyhpbnQgY2FwYWNpdHkpIHsKLQkJdGhpcygpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRvIHRoZSBsaXN0LgotCSAqIElmIGEgbGlzdGVuZXIgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIGxpc3QsIHRoZW4gaXQgaXMgcmVwbGFjZWQuCi0JICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIHB1dCBtZXRob2QuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgVGhpcyBpcyB0aGUgbGlzdGVuZXIgb2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0LgotCSAqIEBwYXJhbSBsaXN0ZW5lck9iamVjdCBUaGlzIGlzIGFuIG9wdGlvbmFsIGxpc3RlbmVyLXNwZWNpZmljIG9iamVjdC4KLQkgKiBUaGlzIG9iamVjdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgRXZlbnREaXNwYXRjaGVyIGFsb25nIHdpdGggdGhlIGxpc3RlbmVyCi0JICogd2hlbiB0aGUgbGlzdGVuZXIgaXMgdG8gYmUgY2FsbGVkLiBUaGlzIG1heSBiZSBudWxsCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgbGlzdGVuZXIgaXMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIsIE9iamVjdCBsaXN0ZW5lck9iamVjdCkgewotCQlsaXN0LnB1dChsaXN0ZW5lciwgbGlzdGVuZXJPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIGZyb20gdGhlIGxpc3QuCi0JICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIHJlbW92ZSBtZXRob2QuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgVGhpcyBpcyB0aGUgbGlzdGVuZXIgb2JqZWN0IHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiBsaXN0ZW5lciBpcyBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgewotCQlsaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMgZnJvbSB0aGUgbGlzdC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgY2xlYXIgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbExpc3RlbmVycygpIHsKLQkJbGlzdC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZW50cnkgU2V0IGZyb20gdGhlIGludGVybmFsIENvcHlPbldyaXRlSWRlbnRpdHlNYXAuCi0JICogQHJldHVybiBUaGUgZW50cnkgU2V0LgotCSAqLwotCVNldCBlbnRyeVNldCgpIHsKLQkJcmV0dXJuIGxpc3QuZW50cnlTZXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kvc3VwcGxlbWVudC9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9mcmFtZXdvcmsvZXZlbnRtZ3IvRXZlbnRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kvc3VwcGxlbWVudC9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9mcmFtZXdvcmsvZXZlbnRtZ3IvRXZlbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzcxODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpL3N1cHBsZW1lbnQvc3JjL29yZy9lY2xpcHNlL29zZ2kvZnJhbWV3b3JrL2V2ZW50bWdyL0V2ZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmV2ZW50bWdyOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBjZW50cmFsIGNsYXNzIGZvciB0aGUgRXZlbnQgTWFuYWdlci4gRWFjaAotICogcHJvZ3JhbSB0aGF0IHdpc2hlcyB0byB1c2UgdGhlIEV2ZW50IE1hbmFnZXIgc2hvdWxkIGNvbnN0cnVjdAotICogYW4gRXZlbnRNYW5hZ2VyIG9iamVjdCBhbmQgdXNlIHRoYXQgb2JqZWN0IHRvIGNvbnN0cnVjdAotICogTGlzdGVuZXJRdWV1ZSBmb3IgZGlzcGF0Y2hpbmcgZXZlbnRzLiBDb3B5T25Xcml0ZUlkZW50aXR5TWFwIG9iamVjdHMKLSAqIG11c3QgYmUgdXNlZCB0byBtYW5hZ2UgbGlzdGVuZXIgbGlzdHMuCi0gKgotICogPHA+VGhpcyBleGFtcGxlIHVzZXMgdGhlIGZpY3RpdGlvdXMgU29tZUV2ZW50IGNsYXNzIGFuZCBzaG93cyBob3cgdG8gdXNlIHRoaXMgcGFja2FnZSAKLSAqIHRvIGRlbGl2ZXIgYSBTb21lRXZlbnQgdG8gYSBzZXQgb2YgU29tZUV2ZW50TGlzdGVuZXJzLiAgCi0gKiA8cHJlPgotICoKLSAqIAkvLyBDcmVhdGUgYW4gRXZlbnRNYW5hZ2VyIHdpdGggYSBuYW1lIGZvciBhbiBhc3luY2hyb25vdXMgZXZlbnQgZGlzcGF0Y2ggdGhyZWFkCi0gKiAJRXZlbnRNYW5hZ2VyIGV2ZW50TWFuYWdlciA9IG5ldyBFdmVudE1hbmFnZXIoIlNvbWVFdmVudCBBc3luYyBFdmVudCBEaXNwYXRjaGVyIFRocmVhZCIpOwotICogCS8vIENyZWF0ZSBhIENvcHlPbldyaXRlSWRlbnRpdHlNYXAgdG8gaG9sZCB0aGUgbGlzdCBvZiBTb21lRXZlbnRMaXN0ZW5lcnMKLSAqCU1hcCBldmVudExpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUlkZW50aXR5TWFwKCk7Ci0gKgotICoJLy8gQWRkIGEgU29tZUV2ZW50TGlzdGVuZXIgdG8gdGhlIGxpc3RlbmVyIGxpc3QKLSAqCWV2ZW50TGlzdGVuZXJzLnB1dChzb21lRXZlbnRMaXN0ZW5lciwgbnVsbCk7Ci0gKgotICoJLy8gQXN5bmNocm9ub3VzbHkgZGVsaXZlciBhIFNvbWVFdmVudCB0byByZWdpc3RlcmVkIFNvbWVFdmVudExpc3RlbmVycwotICoJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBxdWV1ZSBmb3IgdGhpcyBldmVudCBkZWxpdmVyeQotICoJTGlzdGVuZXJRdWV1ZSBsaXN0ZW5lclF1ZXVlID0gbmV3IExpc3RlbmVyUXVldWUoZXZlbnRNYW5hZ2VyKTsKLSAqCS8vIEFkZCB0aGUgbGlzdGVuZXJzIHRvIHRoZSBxdWV1ZSBhbmQgYXNzb2NpYXRlIHRoZW0gd2l0aCB0aGUgZXZlbnQgZGlzcGF0Y2hlcgotICoJbGlzdGVuZXJRdWV1ZS5xdWV1ZUxpc3RlbmVycyhldmVudExpc3RlbmVycy5lbnRyeVNldCgpLCBuZXcgRXZlbnREaXNwYXRjaGVyKCkgewotICoJCXB1YmxpYyB2b2lkIGRpc3BhdGNoRXZlbnQoT2JqZWN0IGV2ZW50TGlzdGVuZXIsIE9iamVjdCBsaXN0ZW5lck9iamVjdCwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudEFjdGlvbiwgT2JqZWN0IGV2ZW50T2JqZWN0KSB7Ci0gKiAJCQl0cnkgewotICoJCQkJKFNvbWVFdmVudExpc3RlbmVyKWV2ZW50TGlzdGVuZXIuc29tZUV2ZW50T2NjdXJlZCgoU29tZUV2ZW50KWV2ZW50T2JqZWN0KTsKLSAqIAkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gKiAJCQkJLy8gcHJvcGVybHkgbG9nL2hhbmRsZSBhbnkgVGhyb3dhYmxlIHRocm93biBieSB0aGUgbGlzdGVuZXIKLSAqIAkJCX0KLSAqCQl9Ci0gKgl9KTsKLSAqCS8vIERlbGl2ZXIgdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lcnMuIAotICoJbGlzdGVuZXJRdWV1ZS5kaXNwYXRjaEV2ZW50QXN5bmNocm9ub3VzKDAsIG5ldyBTb21lRXZlbnQoKSk7Ci0gKgkJCi0gKgkvLyBSZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGxpc3QKLSAqCWV2ZW50TGlzdGVuZXJzLnJlbW92ZShzb21lRXZlbnRMaXN0ZW5lcik7Ci0gKgotICoJLy8gQ2xvc2UgRXZlbnRNYW5hZ2VyIHRvIGNsZWFuIHdoZW4gZG9uZSB0byB0ZXJtaW5hdGUgYXN5bmMgZXZlbnQgZGlzcGF0Y2ggdGhyZWFkLgotICoJLy8gTm90ZSB0aGF0IGNsb3NpbmcgdGhlIGV2ZW50IG1hbmFnZXIgd2hpbGUgYXN5bmNocm9ub3VzbHkgZGVsaXZlcmluZyBldmVudHMgCi0gKgkvLyBtYXkgY2F1c2Ugc29tZSBldmVudHMgdG8gbm90IGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGhlIGFzeW5jIGV2ZW50IGRpc3BhdGNoIAotICoJLy8gdGhyZWFkIHRlcm1pbmF0ZXMKLSAqCWV2ZW50TWFuYWdlci5jbG9zZSgpOwotICogPC9wcmU+Ci0gKiAKLSAqIDxwPkF0IGZpcnN0IGdsYW5jZSwgdGhpcyBwYWNrYWdlIG1heSBzZWVtIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBuZWNlc3NhcnkKLSAqIGJ1dCBpdCBoYXMgc3VwcG9ydCBmb3Igc29tZSBpbXBvcnRhbnQgZmVhdHVyZXMuIFRoZSBsaXN0ZW5lciBsaXN0IHN1cHBvcnRzCi0gKiBjb21wYW5pb24gb2JqZWN0cyBmb3IgZWFjaCBsaXN0ZW5lciBvYmplY3QuIFRoaXMgaXMgdXNlZCBieSB0aGUgT1NHaSBmcmFtZXdvcmsKLSAqIHRvIGNyZWF0ZSB3cmFwcGVyIG9iamVjdHMgZm9yIGEgbGlzdGVuZXIgd2hpY2ggYXJlIHBhc3NlZCB0byB0aGUgZXZlbnQgZGlzcGF0Y2hlci4KLSAqIFRoZSBMaXN0ZW5lclF1ZXVlIGNsYXNzIGlzIHVzZWQgdG8gYnVpbGQgYSBzbmFwIHNob3Qgb2YgdGhlIGxpc3RlbmVycyBwcmlvciB0byBiZWdpbm5pbmcKLSAqIGV2ZW50IGRpc3BhdGNoLiAKLSAqIAotICogVGhlIE9TR2kgZnJhbWV3b3JrIHVzZXMgYSAyIGxldmVsIGxpc3RlbmVyIGxpc3QgZm9yIGVhY2ggbGlzdGVuZXIgdHlwZSAoNCB0eXBlcykuIAotICogTGV2ZWwgb25lIGlzIG1hbmFnZWQgcGVyIGZyYW1ld29yayBpbnN0YW5jZSBhbmQgY29udGFpbnMgdGhlIGxpc3Qgb2YgQnVuZGxlQ29udGV4dHMgd2hpY2ggaGF2ZSAKLSAqIHJlZ2lzdGVyZWQgYSBsaXN0ZW5lci4gTGV2ZWwgMiBpcyBtYW5hZ2VkIHBlciBCdW5kbGVDb250ZXh0IGZvciB0aGUgbGlzdGVuZXJzIGluIHRoYXQgCi0gKiBjb250ZXh0LiBUaGlzIGFsbG93cyBhbGwgdGhlIGxpc3RlbmVycyBvZiBhIGJ1bmRsZSB0byBiZSBlYXNpbHkgYW5kIGF0b21pY2FsbHkgcmVtb3ZlZCBmcm9tIAotICogdGhlIGxldmVsIG9uZSBsaXN0LiBUbyB1c2UgYSAiZmxhdCIgbGlzdCBmb3IgYWxsIGJ1bmRsZXMgd291bGQgcmVxdWlyZSB0aGUgbGlzdCB0byBrbm93IHdoaWNoIAotICogYnVuZGxlIHJlZ2lzdGVyZWQgYSBsaXN0ZW5lciBvYmplY3Qgc28gdGhhdCB0aGUgbGlzdCBjb3VsZCBiZSB0cmF2ZXJzZWQgd2hlbiBzdG9wcGluZyBhIGJ1bmRsZSAKLSAqIHRvIHJlbW92ZSBhbGwgdGhlIGJ1bmRsZSdzIGxpc3RlbmVycy4gCi0gKiAKLSAqIFdoZW4gYW4gZXZlbnQgaXMgZmlyZWQsIGEgc25hcHNob3QgbGlzdCAoTGlzdGVuZXJRdWV1ZSkgbXVzdCBiZSBtYWRlIG9mIHRoZSBjdXJyZW50IGxpc3RlbmVycyBiZWZvcmUgZGVsaXZlcnkgCi0gKiBpcyBhdHRlbXB0ZWQuIFRoZSBzbmFwc2hvdCBsaXN0IGlzIG5lY2Vzc2FyeSB0byBhbGxvdyB0aGUgbGlzdGVuZXIgbGlzdCB0byBiZSBtb2RpZmllZCB3aGlsZSB0aGUgCi0gKiBldmVudCBpcyBiZWluZyBkZWxpdmVyZWQgdG8gdGhlIHNuYXBzaG90IGxpc3QuIFRoZSBtZW1vcnkgY29zdCBvZiB0aGUgc25hcHNob3QgbGlzdCBpcwotICogbG93IHNpbmNlIHRoZSBMaXN0ZW5lclF1ZXVlIG9iamVjdCB1c2VzIHRoZSBjb3B5LW9uLXdyaXRlIHNlbWFudGljcyAKLSAqIG9mIHRoZSBDb3B5T25Xcml0ZUlkZW50aXR5TWFwLiBUaGlzIGd1YXJhbnRlZXMgdGhlIHNuYXBzaG90IGxpc3QgaXMgbmV2ZXIgbW9kaWZpZWQgb25jZSBjcmVhdGVkLgotICogCi0gKiBUaGUgT1NHaSBmcmFtZXdvcmsgYWxzbyB1c2VzIGEgMiBsZXZlbCBkaXNwYXRjaCB0ZWNobmlxdWUgKEV2ZW50RGlzcGF0Y2hlcikuCi0gKiBMZXZlbCBvbmUgZGlzcGF0Y2ggaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGFkZCB0aGUgbGV2ZWwgMiBsaXN0ZW5lciBsaXN0IG9mIGVhY2ggCi0gKiBCdW5kbGVDb250ZXh0IHRvIHRoZSBzbmFwc2hvdCBpbiBwcmVwYXJhdGlvbiBmb3IgZGVsaXZlcnkgb2YgdGhlIGV2ZW50LgotICogTGV2ZWwgMiBkaXNwYXRjaCBpcyB1c2VkIGFzIHRoZSBmaW5hbCBldmVudCBkZWxpdmVyZXIgYW5kIG11c3QgY2FzdCB0aGUgbGlzdGVuZXIgCi0gKiBhbmQgZXZlbnQgb2JqZWN0cyB0byB0aGUgcHJvcGVyIHR5cGUgYmVmb3JlIGNhbGxpbmcgdGhlIGxpc3RlbmVyLiBMZXZlbCAyIGRpc3BhdGNoCi0gKiB3aWxsIGNhbmNlbCBkZWxpdmVyeSBvZiBhbiBldmVudCAKLSAqIHRvIGEgYnVuZGxlIHRoYXQgaGFzIHN0b3BwZWQgYmV0d2VlbiB0aGUgdGltZSB0aGUgc25hcHNob3Qgd2FzIGNyZWF0ZWQgYW5kIHRoZQotICogYXR0ZW1wdCB3YXMgbWFkZSB0byBkZWxpdmVyIHRoZSBldmVudC4KLSAqIAotICogPHA+IFRoZSBoaWdobHkgZHluYW1pYyBuYXR1cmUgb2YgdGhlIE9TR2kgZnJhbWV3b3JrIGhhZCBuZWNlc3NpdGF0ZWQgdGhlc2UgZmVhdHVyZXMgZm9yIAotICogcHJvcGVyIGFuZCBlZmZpY2llbnQgZXZlbnQgZGVsaXZlcnkuICAKLSAqIEBzaW5jZSAzLjEKLSAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKi8KLQotcHVibGljIGNsYXNzIEV2ZW50TWFuYWdlciB7Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCS8qKgotCSAqIEV2ZW50VGhyZWFkIGZvciBhc3luY2hyb25vdXMgZGlzcGF0Y2ggb2YgZXZlbnRzLgotCSAqIEFjY2VzcyB0byB0aGlzIGZpZWxkIG11c3QgYmUgcHJvdGVjdGVkIGJ5IGEgc3luY2hyb25pemVkIHJlZ2lvbi4KLQkgKi8KLQlwcml2YXRlIEV2ZW50VGhyZWFkIHRocmVhZDsKLQotCS8qKiAKLQkgKiBPbmNlIGNsb3NlZCwgYW4gYXR0ZW1wdCB0byBjcmVhdGUgYSBuZXcgRXZlbnRUaHJlYWQgd2lsbCByZXN1bHQgaW4gYW4gCi0JICogSWxsZWdhbFN0YXRlRXhjZXB0aW9uLiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VkOwotCi0JLyoqCi0JICogVGhyZWFkIG5hbWUgdXNlZCBmb3IgYXN5bmNocm9ub3VzIGV2ZW50IGRlbGl2ZXJ5Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB0aHJlYWROYW1lOwotCi0JLyoqCi0JICogVGhlIHRocmVhZCBncm91cCB1c2VkIGZvciBhc3luY2hyb25vdXMgZXZlbnQgZGVsaXZlcnkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGhyZWFkR3JvdXAgdGhyZWFkR3JvdXA7Ci0KLQkvKioKLQkgKiBFdmVudE1hbmFnZXIgY29uc3RydWN0b3IuIEFuIEV2ZW50TWFuYWdlciBvYmplY3QgaXMgcmVzcG9uc2libGUgZm9yCi0JICogdGhlIGRlbGl2ZXJ5IG9mIGV2ZW50cyB0byBsaXN0ZW5lcnMgdmlhIGFuIEV2ZW50RGlzcGF0Y2hlci4KLQkgKgotCSAqLwotCXB1YmxpYyBFdmVudE1hbmFnZXIoKSB7Ci0JCXRoaXMobnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXZlbnRNYW5hZ2VyIGNvbnN0cnVjdG9yLiBBbiBFdmVudE1hbmFnZXIgb2JqZWN0IGlzIHJlc3BvbnNpYmxlIGZvcgotCSAqIHRoZSBkZWxpdmVyeSBvZiBldmVudHMgdG8gbGlzdGVuZXJzIHZpYSBhbiBFdmVudERpc3BhdGNoZXIuCi0JICoKLQkgKiBAcGFyYW0gdGhyZWFkTmFtZSBUaGUgbmFtZSB0byBnaXZlIHRoZSBldmVudCB0aHJlYWQgYXNzb2NpYXRlZCB3aXRoCi0JICogdGhpcyBFdmVudE1hbmFnZXIuICBBIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIGlzIGFsbG93ZWQuCi0JICovCi0JcHVibGljIEV2ZW50TWFuYWdlcihTdHJpbmcgdGhyZWFkTmFtZSkgewotCQl0aGlzKHRocmVhZE5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEV2ZW50TWFuYWdlciBjb25zdHJ1Y3Rvci4gQW4gRXZlbnRNYW5hZ2VyIG9iamVjdCBpcyByZXNwb25zaWJsZSBmb3IKLQkgKiB0aGUgZGVsaXZlcnkgb2YgZXZlbnRzIHRvIGxpc3RlbmVycyB2aWEgYW4gRXZlbnREaXNwYXRjaGVyLgotCSAqCi0JICogQHBhcmFtIHRocmVhZE5hbWUgVGhlIG5hbWUgdG8gZ2l2ZSB0aGUgZXZlbnQgdGhyZWFkIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoaXMgRXZlbnRNYW5hZ2VyLiAgQSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSBpcyBhbGxvd2VkLgotCSAqIEBwYXJhbSB0aHJlYWRHcm91cCBUaGUgdGhyZWFkIGdyb3VwIHRvIHVzZSBmb3IgdGhlIGFzeW5jaHJvbm91cyBldmVudAotCSAqIHRocmVhZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBFdmVudE1hbmFnZXIuIEEgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgaXMgYWxsb3dlZC4KLQkgKiBAc2luY2UgMy40Ci0JICovCi0JcHVibGljIEV2ZW50TWFuYWdlcihTdHJpbmcgdGhyZWFkTmFtZSwgVGhyZWFkR3JvdXAgdGhyZWFkR3JvdXApIHsKLQkJdGhyZWFkID0gbnVsbDsKLQkJY2xvc2VkID0gZmFsc2U7Ci0JCXRoaXMudGhyZWFkTmFtZSA9IHRocmVhZE5hbWU7Ci0JCXRoaXMudGhyZWFkR3JvdXAgPSB0aHJlYWRHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbGVhc2UgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcwotCSAqIEV2ZW50TWFuYWdlci4KLQkgKiA8cD4KLQkgKiBDbG9zaW5nIHRoaXMgRXZlbnRNYW5hZ2VyIHdoaWxlIGl0IGlzIGFzeW5jaHJvbm91c2x5IGRlbGl2ZXJpbmcgZXZlbnRzIAotCSAqIG1heSBjYXVzZSBzb21lIGV2ZW50cyB0byBub3QgYmUgZGVsaXZlcmVkIGJlZm9yZSB0aGUgYXN5bmMgZXZlbnQgZGlzcGF0Y2ggCi0JICogdGhyZWFkIHRlcm1pbmF0ZXMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgewotCQlpZiAoY2xvc2VkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRocmVhZCAhPSBudWxsKSB7Ci0JCQl0aHJlYWQuY2xvc2UoKTsKLQkJCXRocmVhZCA9IG51bGw7Ci0JCX0KLQkJY2xvc2VkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFdmVudFRocmVhZCB0byB1c2UgZm9yIGRpc3BhdGNoaW5nIGV2ZW50cyBhc3luY2hyb25vdXNseSBmb3IKLQkgKiB0aGlzIEV2ZW50TWFuYWdlci4KLQkgKgotCSAqIEByZXR1cm4gRXZlbnRUaHJlYWQgdG8gdXNlIGZvciBkaXNwYXRjaGluZyBldmVudHMgYXN5bmNocm9ub3VzbHkgZm9yCi0JICogdGhpcyBFdmVudE1hbmFnZXIuCi0JICovCi0Jc3luY2hyb25pemVkIEV2ZW50VGhyZWFkIGdldEV2ZW50VGhyZWFkKCkgewotCQlpZiAoY2xvc2VkKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKHRocmVhZCA9PSBudWxsKSB7Ci0JCQkvKiBpZiB0aGVyZSBpcyBubyB0aHJlYWQsIHRoZW4gY3JlYXRlIGEgbmV3IG9uZSAqLwotCQkJdGhyZWFkID0gKEV2ZW50VGhyZWFkKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLQkJCQkJRXZlbnRUaHJlYWQgdCA9IG5ldyBFdmVudFRocmVhZCh0aHJlYWRHcm91cCwgdGhyZWFkTmFtZSk7Ci0JCQkJCXJldHVybiB0OwotCQkJCX0KLQkJCX0pOwotCQkJLyogc3RhcnQgdGhlIG5ldyB0aHJlYWQgKi8KLQkJCXRocmVhZC5zdGFydCgpOwotCQl9Ci0JCXJldHVybiB0aHJlYWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIEV2ZW50RGlzcGF0Y2hlciBvYmplY3QgdG8gY29tcGxldGUgdGhlIGRpc3BhdGNoIG9mCi0JICogdGhlIGV2ZW50LiBJZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cyBpbiB0aGUgbGlzdCwgY2FsbCBkaXNwYXRjaEV2ZW50Ci0JICogb24gdGhlIG5leHQgaXRlbSBvbiB0aGUgbGlzdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBwYWNrYWdlIHByaXZhdGUuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXJzIEEgU2V0IG9mIGVudHJpZXMgZnJvbSBhIENvcHlPbldyaXRlSWRlbnRpdHlNYXAgbWFwLgotCSAqIEBwYXJhbSBkaXNwYXRjaGVyIENhbGwgYmFjayBvYmplY3Qgd2hpY2ggaXMgY2FsbGVkIHRvIGNvbXBsZXRlIHRoZSBkZWxpdmVyeSBvZgotCSAqIHRoZSBldmVudC4KLQkgKiBAcGFyYW0gZXZlbnRBY3Rpb24gVGhpcyB2YWx1ZSB3YXMgcGFzc2VkIGJ5IHRoZSBldmVudCBzb3VyY2UgYW5kCi0JICogaXMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLiBUaGlzIGlzIHBhc3NlZCBvbiB0byB0aGUgY2FsbCBiYWNrIG9iamVjdC4KLQkgKiBAcGFyYW0gZXZlbnRPYmplY3QgVGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQgYnkgdGhlIGV2ZW50IHNvdXJjZSBhbmQKLQkgKiBpcyBwYXNzZWQgdG8gdGhpcyBtZXRob2QuIFRoaXMgaXMgcGFzc2VkIG9uIHRvIHRoZSBjYWxsIGJhY2sgb2JqZWN0LgotCSAqLwotCXN0YXRpYyB2b2lkIGRpc3BhdGNoRXZlbnQoU2V0Lyo8TWFwLkVudHJ5PE9iamVjdCxPYmplY3Q+PiovbGlzdGVuZXJzLCBFdmVudERpc3BhdGNoZXIgZGlzcGF0Y2hlciwgaW50IGV2ZW50QWN0aW9uLCBPYmplY3QgZXZlbnRPYmplY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeyAvKiBpdGVyYXRlIG92ZXIgdGhlIGxpc3Qgb2YgbGlzdGVuZXJzICovCi0JCQlNYXAuRW50cnkgbGlzdGVuZXIgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBldmVudExpc3RlbmVyID0gbGlzdGVuZXIuZ2V0S2V5KCk7Ci0JCQlPYmplY3QgbGlzdGVuZXJPYmplY3QgPSBsaXN0ZW5lci5nZXRWYWx1ZSgpOwotCQkJdHJ5IHsKLQkJCQkvKiBDYWxsIHRoZSBFdmVudERpc3BhdGNoZXIgdG8gY29tcGxldGUgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBldmVudC4gKi8KLQkJCQlkaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnRMaXN0ZW5lciwgbGlzdGVuZXJPYmplY3QsIGV2ZW50QWN0aW9uLCBldmVudE9iamVjdCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCS8qIENvbnN1bWUgYW5kIGlnbm9yZSBhbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGxpc3RlbmVyICovCi0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGluICIgKyBsaXN0ZW5lci5nZXRLZXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHBhY2thZ2UgcHJpdmF0ZSBjbGFzcyBpcyB1c2VkIGZvciBhc3luY2hyb25vdXNseSBkaXNwYXRjaGluZyBldmVudHMuCi0JICovCi0KLQlzdGF0aWMgY2xhc3MgRXZlbnRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCQlwcml2YXRlIHN0YXRpYyBpbnQgbmV4dFRocmVhZE51bWJlcjsKLQotCQkvKioKLQkJICogUXVldWVkIGlzIGEgbmVzdGVkIHRvcC1sZXZlbCAobm9uLW1lbWJlcikgY2xhc3MuIFRoaXMgY2xhc3MKLQkJICogcmVwcmVzZW50cyB0aGUgaXRlbXMgd2hpY2ggYXJlIHBsYWNlZCBvbiB0aGUgYXN5bmNoIGRpc3BhdGNoIHF1ZXVlLgotCQkgKiBUaGlzIGNsYXNzIGlzIHByaXZhdGUuCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBRdWV1ZWQgewotCQkJLyoqIGxpc3RlbmVyIGxpc3QgZm9yIHRoaXMgZXZlbnQgKi8KLQkJCWZpbmFsIFNldC8qPE1hcC5FbnRyeTxPYmplY3QsT2JqZWN0Pj4qL2xpc3RlbmVyczsKLQkJCS8qKiBkaXNwYXRjaGVyIG9mIHRoaXMgZXZlbnQgKi8KLQkJCWZpbmFsIEV2ZW50RGlzcGF0Y2hlciBkaXNwYXRjaGVyOwotCQkJLyoqIGFjdGlvbiBmb3IgdGhpcyBldmVudCAqLwotCQkJZmluYWwgaW50IGFjdGlvbjsKLQkJCS8qKiBvYmplY3QgZm9yIHRoaXMgZXZlbnQgKi8KLQkJCWZpbmFsIE9iamVjdCBvYmplY3Q7Ci0JCQkvKiogbmV4dCBpdGVtIGluIGV2ZW50IHF1ZXVlICovCi0JCQlRdWV1ZWQgbmV4dDsKLQotCQkJLyoqCi0JCQkgKiBDb25zdHJ1Y3RvciBmb3IgZXZlbnQgcXVldWUgaXRlbQotCQkJICoKLQkJCSAqIEBwYXJhbSBsIExpc3RlbmVyIGxpc3QgZm9yIHRoaXMgZXZlbnQKLQkJCSAqIEBwYXJhbSBkIERpc3BhdGNoZXIgZm9yIHRoaXMgZXZlbnQKLQkJCSAqIEBwYXJhbSBhIEFjdGlvbiBmb3IgdGhpcyBldmVudAotCQkJICogQHBhcmFtIG8gT2JqZWN0IGZvciB0aGlzIGV2ZW50Ci0JCQkgKi8KLQkJCVF1ZXVlZChTZXQvKjxNYXAuRW50cnk8T2JqZWN0LE9iamVjdD4+Ki9sLCBFdmVudERpc3BhdGNoZXIgZCwgaW50IGEsIE9iamVjdCBvKSB7Ci0JCQkJbGlzdGVuZXJzID0gbDsKLQkJCQlkaXNwYXRjaGVyID0gZDsKLQkJCQlhY3Rpb24gPSBhOwotCQkJCW9iamVjdCA9IG87Ci0JCQkJbmV4dCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKiogaXRlbSBhdCB0aGUgaGVhZCBvZiB0aGUgZXZlbnQgcXVldWUgKi8KLQkJcHJpdmF0ZSBRdWV1ZWQgaGVhZDsKLQkJLyoqIGl0ZW0gYXQgdGhlIHRhaWwgb2YgdGhlIGV2ZW50IHF1ZXVlICovCi0JCXByaXZhdGUgUXVldWVkIHRhaWw7Ci0JCS8qKiBpZiBmYWxzZSB0aGUgdGhyZWFkIG11c3QgdGVybWluYXRlICovCi0JCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBydW5uaW5nOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGV2ZW50IHRocmVhZC4gCi0JCSAqIEBwYXJhbSB0aHJlYWROYW1lIE5hbWUgb2YgdGhlIEV2ZW50VGhyZWFkIAotCQkgKi8KLQkJRXZlbnRUaHJlYWQoVGhyZWFkR3JvdXAgdGhyZWFkR3JvdXAsIFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCQlzdXBlcih0aHJlYWRHcm91cCwgdGhyZWFkTmFtZSA9PSBudWxsID8gZ2V0TmV4dE5hbWUoKSA6IHRocmVhZE5hbWUpOwotCQkJcnVubmluZyA9IHRydWU7Ci0JCQloZWFkID0gbnVsbDsKLQkJCXRhaWwgPSBudWxsOwotCi0JCQlzZXREYWVtb24odHJ1ZSk7IC8qIE1hcmsgdGhyZWFkIGFzIGRhZW1vbiB0aHJlYWQgKi8KLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TmV4dE5hbWUoKSB7Ci0JCQlyZXR1cm4gIkV2ZW50TWFuYWdlclRocmVhZC0iICsgbmV4dFRocmVhZE51bWJlcisrOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQ29uc3RydWN0b3IgZm9yIHRoZSBldmVudCB0aHJlYWQuIAotCQkgKiBAcGFyYW0gdGhyZWFkTmFtZSBOYW1lIG9mIHRoZSBFdmVudFRocmVhZCAKLQkJICovCi0JCUV2ZW50VGhyZWFkKFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCQl0aGlzKG51bGwsIHRocmVhZE5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgZXZlbnQgdGhyZWFkLgotCQkgKi8KLQkJRXZlbnRUaHJlYWQoKSB7Ci0JCQl0aGlzKG51bGwsIG51bGwpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFN0b3AgdGhyZWFkLgotCQkgKi8KLQkJdm9pZCBjbG9zZSgpIHsKLQkJCXJ1bm5pbmcgPSBmYWxzZTsKLQkJCWludGVycnVwdCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgbWV0aG9kIHB1bGxzIGV2ZW50cyBmcm9tCi0JCSAqIHRoZSBxdWV1ZSBhbmQgZGlzcGF0Y2hlcyB0aGVtLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQlRdWV1ZWQgaXRlbSA9IGdldE5leHRFdmVudCgpOwotCQkJCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJRXZlbnRNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoaXRlbS5saXN0ZW5lcnMsIGl0ZW0uZGlzcGF0Y2hlciwgaXRlbS5hY3Rpb24sIGl0ZW0ub2JqZWN0KTsKLQkJCQkJLy8gQnVnIDI5OTU4OTogc2luY2UgdGhlIGNhbGwgdG8gZ2V0TmV4dEV2ZW50KCkgd2lsbCBldmVudHVhbGx5IGJsb2NrIGZvciBhIGxvbmcgdGltZSwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgJ2l0ZW0nCi0JCQkJCS8vIHZhcmlhYmxlIGlzIGNsZWFyZWQgb2YgdGhlIHByZXZpb3VzIHZhbHVlIGJlZm9yZSB0aGUgY2FsbCB0byBnZXROZXh0RXZlbnQoKS4gU2VlIFZNIFNQZWMgMi41LjcgZm9yIHdoeSB0aGUgY29tcGlsZXIgCi0JCQkJCS8vIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgY2xlYXIgdGhpcyB2YXJpYWJsZSBmb3IgZWFjaCBsb29wIGl0ZXJhdGlvbi4KLQkJCQkJaXRlbSA9IG51bGw7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKEV2ZW50TWFuYWdlci5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQl0aHJvdyBlOwotCQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJCWlmIChFdmVudE1hbmFnZXIuREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIG1ldGhvZHMgdGFrZXMgdGhlIGlucHV0IHBhcmFtZXRlcnMgYW5kIGNyZWF0ZXMgYSBRdWV1ZWQKLQkJICogb2JqZWN0IGFuZCBxdWV1ZXMgaXQuCi0JCSAqIFRoZSB0aHJlYWQgaXMgbm90aWZpZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBsIExpc3RlbmVyIGxpc3QgZm9yIHRoaXMgZXZlbnQKLQkJICogQHBhcmFtIGQgRGlzcGF0Y2hlciBmb3IgdGhpcyBldmVudAotCQkgKiBAcGFyYW0gYSBBY3Rpb24gZm9yIHRoaXMgZXZlbnQKLQkJICogQHBhcmFtIG8gT2JqZWN0IGZvciB0aGlzIGV2ZW50Ci0JCSAqLwotCQlzeW5jaHJvbml6ZWQgdm9pZCBwb3N0RXZlbnQoU2V0Lyo8TWFwLkVudHJ5PE9iamVjdCxPYmplY3Q+PiovbCwgRXZlbnREaXNwYXRjaGVyIGQsIGludCBhLCBPYmplY3QgbykgewotCQkJaWYgKCFpc0FsaXZlKCkpIHsgLyogSWYgdGhlIHRocmVhZCBpcyBub3QgYWxpdmUsIHRocm93IGFuIGV4Y2VwdGlvbiAqLwotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJUXVldWVkIGl0ZW0gPSBuZXcgUXVldWVkKGwsIGQsIGEsIG8pOwotCi0JCQlpZiAoaGVhZCA9PSBudWxsKSAvKiBpZiB0aGUgcXVldWUgd2FzIGVtcHR5ICovCi0JCQl7Ci0JCQkJaGVhZCA9IGl0ZW07Ci0JCQkJdGFpbCA9IGl0ZW07Ci0JCQl9IGVsc2UgLyogZWxzZSBhZGQgdG8gZW5kIG9mIHF1ZXVlICovCi0JCQl7Ci0JCQkJdGFpbC5uZXh0ID0gaXRlbTsKLQkJCQl0YWlsID0gaXRlbTsKLQkJCX0KLQotCQkJbm90aWZ5KCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB0aHJlYWQgdG8gcmVtb3ZlCi0JCSAqIGl0ZW1zIGZyb20gdGhlIHF1ZXVlIHNvIHRoYXQgdGhleSBjYW4gYmUgZGlzcGF0Y2hlZCB0byB0aGVpciBsaXN0ZW5lcnMuCi0JCSAqIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgdGhlIHRocmVhZCB3YWl0cy4KLQkJICoKLQkJICogQHJldHVybiBUaGUgUXVldWVkIHJlbW92ZWQgZnJvbSB0aGUgdG9wIG9mIHRoZSBxdWV1ZSBvciBudWxsCi0JCSAqIGlmIHRoZSB0aHJlYWQgaGFzIGJlZW4gcmVxdWVzdGVkIHRvIHN0b3AuCi0JCSAqLwotCQlwcml2YXRlIHN5bmNocm9uaXplZCBRdWV1ZWQgZ2V0TmV4dEV2ZW50KCkgewotCQkJd2hpbGUgKHJ1bm5pbmcgJiYgKGhlYWQgPT0gbnVsbCkpIHsKLQkJCQl0cnkgewotCQkJCQl3YWl0KCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBJZiBpbnRlcnJ1cHRlZCwgd2Ugd2lsbCBsb29wIGJhY2sgdXAgYW5kIGNoZWNrIHJ1bm5pbmcKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghcnVubmluZykgeyAvKiBpZiB3ZSBhcmUgc3RvcHBpbmcgKi8KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJUXVldWVkIGl0ZW0gPSBoZWFkOwotCQkJaGVhZCA9IGl0ZW0ubmV4dDsKLQkJCWlmIChoZWFkID09IG51bGwpIHsKLQkJCQl0YWlsID0gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kvc3VwcGxlbWVudC9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9mcmFtZXdvcmsvZXZlbnRtZ3IvTGlzdGVuZXJRdWV1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5vc2dpL3N1cHBsZW1lbnQvc3JjL29yZy9lY2xpcHNlL29zZ2kvZnJhbWV3b3JrL2V2ZW50bWdyL0xpc3RlbmVyUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2M2VjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kvc3VwcGxlbWVudC9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9mcmFtZXdvcmsvZXZlbnRtZ3IvTGlzdGVuZXJRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmV2ZW50bWdyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuZXZlbnRtZ3IuRXZlbnRNYW5hZ2VyLkV2ZW50VGhyZWFkOwotCi0vKioKLSAqIFRoZSBMaXN0ZW5lclF1ZXVlIGlzIHVzZWQgdG8gc25hcHNob3QgdGhlIGxpc3Qgb2YgbGlzdGVuZXJzIGF0IHRoZSB0aW1lIHRoZSBldmVudAotICogaXMgZmlyZWQuIFRoZSBzbmFwc2hvdCBsaXN0IGlzIHRoZW4gdXNlZCB0byBkaXNwYXRjaAotICogZXZlbnRzIHRvIHRob3NlIGxpc3RlbmVycy4gQSBMaXN0ZW5lclF1ZXVlIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYQotICogc3BlY2lmaWMgRXZlbnRNYW5hZ2VyIG9iamVjdC4gTGlzdGVuZXJRdWV1ZSBvYmplY3RzIGNvbnN0cnVjdGVkIHdpdGggdGhlIHNhbWUKLSAqIEV2ZW50TWFuYWdlciBvYmplY3Qgd2lsbCBnZXQgaW4tb3JkZXIgZGVsaXZlcnkgb2YgZXZlbnRzIHdoZW4KLSAqIHVzaW5nIGFzeW5jaHJvbm91cyBkZWxpdmVyeS4gTm8gZGVsaXZlcnkgb3JkZXIgaXMgZ3VhcmFudGVlZCBmb3Igc3luY2hyb25vdXMKLSAqIGRlbGl2ZXJ5IHRvIGF2b2lkIGFueSBwb3RlbnRpYWwgZGVhZGx5IGVtYnJhY2VzLgotICoKLSAqIDxwPkxpc3RlbmVyUXVldWUgb2JqZWN0cyBhcmUgY3JlYXRlZCBhcyBuZWNlc3NhcnkgdG8gYnVpbGQgYSBsaXN0IG9mIGxpc3RlbmVycwotICogdGhhdCBzaG91bGQgcmVjZWl2ZSBhIHNwZWNpZmljIGV2ZW50IG9yIGV2ZW50cy4gT25jZSB0aGUgbGlzdCBpcyBjcmVhdGVkLCB0aGUgZXZlbnQKLSAqIGNhbiB0aGVuIGJlIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkgZGVsaXZlcmVkIHRvIHRoZSBsaXN0IG9mCi0gKiBsaXN0ZW5lcnMuIEFmdGVyIHRoZSBldmVudCBoYXMgYmVlbiBkaXNwYXRjaGVkIGZvciBkZWxpdmVyeSwgdGhlCi0gKiBMaXN0ZW5lclF1ZXVlIG9iamVjdCBzaG91bGQgYmUgZGlzY2FyZGVkIGFzIGl0IGlzIGxpa2VseSB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMgaXMgc3RhbGUuCi0gKiBBIG5ldyBMaXN0ZW5lclF1ZXVlIG9iamVjdCBzaG91bGQgYmUgY3JlYXRlZCB3aGVuIGl0IGlzIHRpbWUgdG8gZGVsaXZlciAKLSAqIGFub3RoZXIgZXZlbnQuIFRoZSBTZXRzIHVzZWQgdG8gYnVpbGQgdGhlIGxpc3Qgb2YgbGlzdGVuZXJzIG11c3Qgbm90IGNoYW5nZSBhZnRlciBiZWluZyAKLSAqIGFkZGVkIHRvIHRoZSBsaXN0LgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJRdWV1ZSB7Ci0JLyoqCi0JICogRXZlbnRNYW5hZ2VyIHdpdGggd2hpY2ggdGhpcyBxdWV1ZSBpcyBhc3NvY2lhdGVkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBFdmVudE1hbmFnZXIgbWFuYWdlcjsKLQkvKioKLQkgKiBBIGxpc3Qgb2YgbGlzdGVuZXIgbGlzdHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAgLyo8U2V0PE1hcC5FbnRyeTxPYmplY3QsT2JqZWN0Pj4sRXZlbnREaXNwYXRjaGVyPiovcXVldWU7Ci0KLQkvKioKLQkgKiBPbmNlIHRoZSBsaXN0ZW5lciBxdWV1ZSBoYXMgYmVlbiB1c2VkIHRvIGRpc3BhdGNoIGFuIGV2ZW50LCAKLQkgKiB5b3UgY2Fubm90IGFkZCBtb2RpZnkgdGhlIHF1ZXVlLgotCSAqIEFjY2VzcyB0byB0aGlzIGZpZWxkIG11c3QgYmUgcHJvdGVjdGVkIGJ5IGEgc3luY2hyb25pemVkIHJlZ2lvbi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVhZE9ubHk7Ci0KLQkvKioKLQkgKiBMaXN0ZW5lclF1ZXVlIGNvbnN0cnVjdG9yLiBUaGlzIG1ldGhvZCBjcmVhdGVzIGFuIGVtcHR5IHNuYXBzaG90IGxpc3QuCi0JICoKLQkgKiBAcGFyYW0gbWFuYWdlciBUaGUgRXZlbnRNYW5hZ2VyIHRoaXMgcXVldWUgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIG1hbmFnZXIgaXMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJRdWV1ZShFdmVudE1hbmFnZXIgbWFuYWdlcikgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQlxdWV1ZSA9IG5ldyBDb3B5T25Xcml0ZUlkZW50aXR5TWFwKCk7Ci0JCXJlYWRPbmx5ID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgbGlzdCB0byB0aGUgc25hcHNob3QgbGlzdC4gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgcHJpb3IgdG8KLQkgKiBjYWxsaW5nIG9uZSBvZiB0aGUgZGlzcGF0Y2hFdmVudCBtZXRob2RzLCB0byBidWlsZCB0aGUgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhlCi0JICogZGVsaXZlcnkgb2YgYSBzcGVjaWZpYyBldmVudC4gVGhlIGN1cnJlbnQgbGlzdCBvZiBsaXN0ZW5lcnMgaW4gdGhlIHNwZWNpZmllZCBFdmVudExpc3RlbmVycwotCSAqIG9iamVjdCBpcyBhZGRlZCB0byB0aGUgc25hcHNob3QgbGlzdC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lcnMgQW4gRXZlbnRMaXN0ZW5lcnMgb2JqZWN0IHRvIGFkZCB0byB0aGUgcXVldWUuIFRoZSBjdXJyZW50IGxpc3RlbmVycwotCSAqIGluIHRoZSBFdmVudExpc3RlbmVycyBvYmplY3Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpcyBkaXNwYXRjaGVkLgotCSAqIEBwYXJhbSBkaXNwYXRjaGVyIEFuIEV2ZW50RGlzcGF0Y2hlciBvYmplY3QgdG8gdXNlIHdoZW4gZGlzcGF0Y2hpbmcgYW4gZXZlbnQKLQkgKiB0byB0aGUgbGlzdGVuZXJzIG9uIHRoZSBzcGVjaWZpZWQgRXZlbnRMaXN0ZW5lcnMuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGFmdGVyIG9uZSBvZiB0aGUgZGlzcGF0Y2ggbWV0aG9kcyBoYXMgYmVlbiBjYWxsZWQuCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMy41LiBSZXBsYWNlZCBieSB7QGxpbmsgI3F1ZXVlTGlzdGVuZXJzKFNldCwgRXZlbnREaXNwYXRjaGVyKX0uCi0JICovCi0JcHVibGljIHZvaWQgcXVldWVMaXN0ZW5lcnMoRXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzLCBFdmVudERpc3BhdGNoZXIgZGlzcGF0Y2hlcikgewotCQlxdWV1ZUxpc3RlbmVycyhsaXN0ZW5lcnMuZW50cnlTZXQoKSwgZGlzcGF0Y2hlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgc2V0IG9mIGxpc3RlbmVycyB0byB0aGUgc25hcHNob3QgbGlzdC4gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgcHJpb3IgdG8KLQkgKiBjYWxsaW5nIG9uZSBvZiB0aGUgZGlzcGF0Y2hFdmVudCBtZXRob2RzLCB0byBidWlsZCB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMgZm9yIHRoZQotCSAqIGRlbGl2ZXJ5IG9mIGEgc3BlY2lmaWMgZXZlbnQuIFRoZSBzcGVjaWZpZWQgbGlzdGVuZXJzCi0JICogYXJlIGFkZGVkIHRvIHRoZSBzbmFwc2hvdCBsaXN0LgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVycyBBIFNldCBvZiBNYXAuRW50cmllcyB0byBhZGQgdG8gdGhlIHF1ZXVlLiBUaGlzIGlzIHR5cGljYWxseSB0aGUgZW50cnlTZXQKLQkgKiBmcm9tIGEgQ29weU9uV3JpdGVJZGVudGl0eU1hcCBvYmplY3QuIFRoaXMgc2V0IG11c3Qgbm90IGNoYW5nZSBhZnRlciBiZWluZyBhZGRlZCB0byB0aGlzCi0JICogc25hcHNob3QgbGlzdC4KLQkgKiBAcGFyYW0gZGlzcGF0Y2hlciBBbiBFdmVudERpc3BhdGNoZXIgb2JqZWN0IHRvIHVzZSB3aGVuIGRpc3BhdGNoaW5nIGFuIGV2ZW50Ci0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0ZW5lcnMuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGFmdGVyIG9uZSBvZiB0aGUgZGlzcGF0Y2ggbWV0aG9kcyBoYXMgYmVlbiBjYWxsZWQuCi0JICogQHNpbmNlIDMuNQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBxdWV1ZUxpc3RlbmVycyhTZXQvKjxNYXAuRW50cnk8T2JqZWN0LE9iamVjdD4+Ki9saXN0ZW5lcnMsIEV2ZW50RGlzcGF0Y2hlciBkaXNwYXRjaGVyKSB7Ci0JCWlmIChyZWFkT25seSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJaWYgKGxpc3RlbmVycy5zaXplKCkgIT0gMCkgewotCQkJcXVldWUucHV0KGxpc3RlbmVycywgZGlzcGF0Y2hlcik7IC8vIGVucXVldWUgdGhlIGxpc3QgYW5kIGl0cyBkaXNwYXRjaGVyCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3luY2hyb25vdXNseSBkaXNwYXRjaCBhbiBldmVudCB0byB0aGUgc25hcHNob3QgbGlzdC4gQW4gZXZlbnQgZGlzcGF0Y2ggdGhyZWFkCi0JICogbWFpbnRhaW5lZCBieSB0aGUgYXNzb2NpYXRlZCBFdmVudE1hbmFnZXIgaXMgdXNlZCB0byBkZWxpdmVyIHRoZSBldmVudHMuCi0JICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBpbW1lZGlhdGVseSB0byB0aGUgY2FsbGVyLgotCSAqCi0JICogQHBhcmFtIGV2ZW50QWN0aW9uIFRoaXMgdmFsdWUgaXMgcGFzc2VkIHRvIHRoZSBFdmVudERpc3BhdGNoZXIuCi0JICogQHBhcmFtIGV2ZW50T2JqZWN0IFRoaXMgb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgRXZlbnREaXNwYXRjaGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BhdGNoRXZlbnRBc3luY2hyb25vdXMoaW50IGV2ZW50QWN0aW9uLCBPYmplY3QgZXZlbnRPYmplY3QpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlyZWFkT25seSA9IHRydWU7Ci0JCX0KLQkJRXZlbnRUaHJlYWQgZXZlbnRUaHJlYWQgPSBtYW5hZ2VyLmdldEV2ZW50VGhyZWFkKCk7Ci0JCXN5bmNocm9uaXplZCAoZXZlbnRUaHJlYWQpIHsgLyogc3luY2hyb25pemUgb24gdGhlIEV2ZW50VGhyZWFkIHRvIGVuc3VyZSBubyBpbnRlcmxlYXZpbmcgb2YgcG9zdGluZyB0byB0aGUgZXZlbnQgdGhyZWFkICovCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBxdWV1ZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeyAvKiBpdGVyYXRlIG92ZXIgdGhlIGxpc3Qgb2YgbGlzdGVuZXIgbGlzdHMgKi8KLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlldmVudFRocmVhZC5wb3N0RXZlbnQoKFNldCkgZW50cnkuZ2V0S2V5KCksIChFdmVudERpc3BhdGNoZXIpIGVudHJ5LmdldFZhbHVlKCksIGV2ZW50QWN0aW9uLCBldmVudE9iamVjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbm91c2x5IGRpc3BhdGNoIGFuIGV2ZW50IHRvIHRoZSBzbmFwc2hvdCBsaXN0LiBUaGUgZXZlbnQgbWF5Ci0JICogYmUgZGlzcGF0Y2hlZCBvbiB0aGUgY3VycmVudCB0aHJlYWQgb3IgYW4gZXZlbnQgZGlzcGF0Y2ggdGhyZWFkCi0JICogbWFpbnRhaW5lZCBieSB0aGUgYXNzb2NpYXRlZCBFdmVudE1hbmFnZXIuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIHRvIHRoZSBjYWxsZXIgdW50aWwgdGhlIEV2ZW50RGlzcGF0Y2hlcgotCSAqIGhhcyBiZWVuIGNhbGxlZCAoYW5kIGhhcyByZXR1cm5lZCkgZm9yIGVhY2ggbGlzdGVuZXIgb24gdGhlIHF1ZXVlLgotCSAqCi0JICogQHBhcmFtIGV2ZW50QWN0aW9uIFRoaXMgdmFsdWUgaXMgcGFzc2VkIHRvIHRoZSBFdmVudERpc3BhdGNoZXIuCi0JICogQHBhcmFtIGV2ZW50T2JqZWN0IFRoaXMgb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgRXZlbnREaXNwYXRjaGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BhdGNoRXZlbnRTeW5jaHJvbm91cyhpbnQgZXZlbnRBY3Rpb24sIE9iamVjdCBldmVudE9iamVjdCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCXJlYWRPbmx5ID0gdHJ1ZTsKLQkJfQotCQkvLyBXZSBjYW4ndCBndWFyYW50ZWUgYW55IGRlbGl2ZXJ5IG9yZGVyIGZvciBzeW5jaHJvbm91cyBldmVudHMuCi0JCS8vIEF0dGVtcHRzIHRvIGRvIHNvIHJlc3VsdCBpbiBkZWFkbHkgZW1icmFjZXMuCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHF1ZXVlLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7IC8qIGl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBsaXN0ZW5lciBsaXN0cyAqLwotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlFdmVudE1hbmFnZXIuZGlzcGF0Y2hFdmVudCgoU2V0KSBlbnRyeS5nZXRLZXkoKSwgKEV2ZW50RGlzcGF0Y2hlcikgZW50cnkuZ2V0VmFsdWUoKSwgZXZlbnRBY3Rpb24sIGV2ZW50T2JqZWN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9zdXBwbGVtZW50L3NyYy9vcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9ldmVudG1nci9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLm9zZ2kvc3VwcGxlbWVudC9zcmMvb3JnL2VjbGlwc2Uvb3NnaS9mcmFtZXdvcmsvZXZlbnRtZ3IvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWUzNDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uub3NnaS9zdXBwbGVtZW50L3NyYy9vcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9ldmVudG1nci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBldmVudCBtYW5hZ2VyIEFQSS4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci1UaGlzIHBhY2thZ2Ugc3BlY2lmaWVzIHRoZSBBUEkgZm9yIHRoZSBldmVudCBtYW5hZ2VyLgotPHA+Ci1DbGllbnRzIHdoaWNoIGltcGxlbWVudCBhbiBldmVudCBidXMgdG8gZGVsaXZlciBzeW5jaHJvbm91cyBhbmQvb3IgYXN5bmNocm9ub3VzCi1ldmVudHMgdG8gbGlzdGVuZXJzIHdpbGwgbGlrZWx5IGJlIGludGVyZXN0ZWQgaW4gdGhlIHR5cGVzIHByb3ZpZGVkIGJ5IHRoaXMgcGFja2FnZS4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3guY29yZS5zZGsvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmNvcmUuc2RrLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA5NTQxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3guY29yZS5zZGsvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LmNvcmUuc2RrPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5jb3JlLnNkay9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5jb3JlLnNkay9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzJiZjAxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3guY29yZS5zZGsvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IEVjbGlwc2VTb3VyY2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIEVjbGlwc2VTb3VyY2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLGxpY2Vuc2UuaHRtbCxlcGwtdjEwLmh0bWwsbGljZW5zZS5odG1sLGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5wbHVnaW5Ab3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24uc291cmNlPW9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uCi1nZW5lcmF0ZS5wbHVnaW5Ab3JnLmVjbGlwc2UuZXF1aW5veC5jb25jdXJyZW50LnNvdXJjZT1vcmcuZWNsaXBzZS5lcXVpbm94LmNvbmN1cnJlbnQKLWdlbmVyYXRlLnBsdWdpbkBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLnNvdXJjZT1vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyCi1nZW5lcmF0ZS5wbHVnaW5Ab3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeS5zb3VyY2U9b3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeQotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLnNvdXJjZT1vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcgotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLmVxdWlub3guc3VwcGxlbWVudC5zb3VyY2U9b3JnLmVjbGlwc2UuZXF1aW5veC5zdXBwbGVtZW50Ci1nZW5lcmF0ZS5wbHVnaW5Ab3JnLmVjbGlwc2UuZXF1aW5veC50cmFuc2Zvcm1zLmhvb2suc291cmNlPW9yZy5lY2xpcHNlLmVxdWlub3gudHJhbnNmb3Jtcy5ob29rCi1nZW5lcmF0ZS5wbHVnaW5Ab3JnLmVjbGlwc2UuZXF1aW5veC50cmFuc2Zvcm1zLnhzbHQuc291cmNlPW9yZy5lY2xpcHNlLmVxdWlub3gudHJhbnNmb3Jtcy54c2x0Ci1nZW5lcmF0ZS5wbHVnaW5Ab3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcy5zb3VyY2U9b3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcwotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLm9zZ2kuc291cmNlPW9yZy5lY2xpcHNlLm9zZ2kKLWdlbmVyYXRlLnBsdWdpbkBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuc291cmNlPW9yZy5lY2xpcHNlLm9zZ2kudXRpbAotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkud2luMzIueDg2LnNvdXJjZT1vcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5LndpbjMyLng4NgotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkubWFjb3N4LnNvdXJjZT1vcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5Lm1hY29zeAotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkuc291cmNlPW9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkKLWdlbmVyYXRlLnBsdWdpbkBvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5LnVpLnNvdXJjZT1vcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5LnVpCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmNvcmUuc2RrL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3guY29yZS5zZGsvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3guY29yZS5zZGsvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3guY29yZS5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5jb3JlLnNkay9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5Yzk1NjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5jb3JlLnNkay9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgRWNsaXBzZVNvdXJjZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgRWNsaXBzZVNvdXJjZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVxdWlub3ggQ29yZSBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgRXF1aW5veCBQcm9qZWN0Ci0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFcXVpbm94IFByb2plY3QgUmVwb3NpdG9yeQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QSBjb2xsZWN0aW9uIG9mIGNvcmUgRXF1aW5veCBidW5kbGVzIGFuZCBzb3VyY2UgaW5jbHVkaW5nIHRoZSBFcXVpbm94IGZyYW1ld29yayBcCi1pbXBsZW1lbnRhdGlvbiBpdHNlbGYuIFxuXAotVGhpcyBmZWF0dXJlIGluY2x1ZGVzIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhbmQgaXMgaW50ZW5kZWQgXAotdG8gYmUgYWRkZWQgdG8gdGFyZ2V0IHBsYXRmb3JtcyBhdCBkZXZlbG9wbWVudCB0aW1lIHJhdGhlciB0aGFuIFwKLWRlcGxveWVkIHdpdGggZW5kLXVzZXIgc3lzdGVtcy4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA5IEVjbGlwc2VTb3VyY2UgYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBFY2xpcHNlU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmNvcmUuc2RrL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5jb3JlLnNkay9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzMzUxYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmNvcmUuc2RrL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29yZS5zZGsiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy42LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5LnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc3VwcGxlbWVudCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc3VwcGxlbWVudC5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnRyYW5zZm9ybXMueHNsdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gudHJhbnNmb3Jtcy54c2x0LnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gudHJhbnNmb3Jtcy5ob29rIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnRyYW5zZm9ybXMuaG9vay5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kudXRpbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kudXRpbC5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbmN1cnJlbnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbmN1cnJlbnQuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkud2luMzIueDg2LnNvdXJjZSIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkubWFjb3N4IgotICAgICAgICAgb3M9Im1hY29zeCIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS5tYWNvc3giCi0gICAgICAgICBvcz0ibWFjb3N4IgotICAgICAgICAgYXJjaD0ieDg2XzY0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5Lm1hY29zeCIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICBhcmNoPSJwcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkubWFjb3N4LnNvdXJjZSIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5Lm1hY29zeC5zb3VyY2UiCi0gICAgICAgICBvcz0ibWFjb3N4IgotICAgICAgICAgYXJjaD0ieDg2XzY0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS5tYWNvc3guc291cmNlIgotICAgICAgICAgb3M9Im1hY29zeCIKLSAgICAgICAgIGFyY2g9InBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkudWkuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmNvcmUuc2RrL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3guY29yZS5zZGsvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3guY29yZS5zZGsvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIucmVsZW5nLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIucmVsZW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDMzZDA0Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLnJlbGVuZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIucmVsZW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIucmVsZW5nL2J1aWxkLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLnJlbGVuZy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDA2YTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIucmVsZW5nL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi08IS0tCi0gICAgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAKLSAgICBDb250cmlidXRvcnM6Ci0gICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotPHByb2plY3QgbmFtZT0iTGF1bmNoZXIgQnVpbGQiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImJ1aWxkIj4KLQk8cHJvcGVydHkgbmFtZT0iY3ZzTG9naW4iIHZhbHVlPSI6cHNlcnZlcjphbm9ueW1vdXMiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImN2c1Jvb3QiIHZhbHVlPSIke2N2c0xvZ2lufUBkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvcnQiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImN2c3JzaCIgdmFsdWU9InNzaCIgLz4KLQk8cHJvcGVydHkgbmFtZT0iY3ZzRXhlY3V0YWJsZVBhdGgiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94L2ZyYW1ld29yay9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZSIgLz4KLQk8cHJvcGVydHkgbmFtZT0iY3ZzVGFnIiB2YWx1ZT0iSEVBRCIgLz4KLQkKLQk8IS0tIE1hY3JvIGZvciBleGVjaW5nIHNjcCAtLT4KLQk8bWFjcm9kZWYgbmFtZT0iU0NQIj4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIC8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0ic291cmNlIi8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iZGVzdGluYXRpb24iIC8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIGRlZmF1bHQ9InRydWUiIC8+Ci0JCTxzZXF1ZW50aWFsPgotCQkJPGVjaG8gbWVzc2FnZT0iQ29weWluZyBAe3NvdXJjZX0gdG8gQHtkZXN0aW5hdGlvbn0uIi8+Ci0JCQk8ZXhlYyBkaXI9IkB7ZGlyfSIgZXhlY3V0YWJsZT0ic2NwIiBmYWlsb25lcnJvcj0iQHtmYWlsb25lcnJvcn0iPgotCQkJCTxhcmcgdmFsdWU9Ii1xIi8+Ci0JCQkJPGFyZyBsaW5lPSJAe3NvdXJjZX0iIC8+Ci0JCQkJPGFyZyB2YWx1ZT0iQHtkZXN0aW5hdGlvbn0iIC8+Ci0JCQk8L2V4ZWM+Ci0JCTwvc2VxdWVudGlhbD4KLQk8L21hY3JvZGVmPgotCQotCTwhLS0gbWFjcm8gdG8gcmVzb2x2ZSBwcm9wZXJ0aWVzIGJlY2F1c2Ugd2UgY2FuJ3QgZG8gJHske3Byb3B9fSAtLT4KLQk8bWFjcm9kZWYgbmFtZT0icmVzb2x2ZVByb3BlcnR5Ij4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiAvPgotCQk8YXR0cmlidXRlIG5hbWU9InZhbHVlIiAvPgotCQk8c2VxdWVudGlhbD4KLQkJCTxjb25kaXRpb24gcHJvcGVydHk9IkB7bmFtZX0iIHZhbHVlPSIke0B7dmFsdWV9fSIgPgotCQkJCTxpc3NldCBwcm9wZXJ0eT0iQHt2YWx1ZX0iLz4KLQkJCTwvY29uZGl0aW9uPgotCQk8L3NlcXVlbnRpYWw+Ci0JPC9tYWNyb2RlZj4KLQkKLQk8dGFyZ2V0IG5hbWU9ImluaXRfZXhlRm9sZGVyIiA+Ci0JCTwhLS0gc2V0IHRvICJiaW4iIG9yICJjb250cmlidXRlZCIgYWNjb3JkaW5nIHRvIHdoaWNoIGZvbGRlciB1bmRlciBvcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUgdG8gc3RvcmUgdGhlIGJ1aWx0IGVjbGlwc2UgLS0+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9ImV4ZUZvbGRlciIgdmFsdWU9ImNvbnRyaWJ1dGVkIiBlbHNlPSJiaW4iPgotCQkJPG9yPgotCQkJCTxlcXVhbHMgYXJnMT0iczM5MCIgYXJnMj0iJHthcmNofSIgLz4KLQkJCQk8ZXF1YWxzIGFyZzE9InMzOTB4IiBhcmcyPSIke2FyY2h9IiAvPgotCQkJCTxlcXVhbHMgYXJnMT0ibW90aWYuc3BhcmMiIGFyZzI9IiR7d3N9LiR7YXJjaH0iIC8+Ci0JCQkJPGVxdWFscyBhcmcxPSJ3aW4zMi5pYTY0IiBhcmcyPSIke3dzfS4ke2FyY2h9IiAvPgotCQkJPC9vcj4KLQkJPC9jb25kaXRpb24+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJpbml0X2ZyYWdtZW50IiA+Ci0JCTwhLS0gc2V0IHRvICJjb250cmlidXRlZCIgb3IgImZyYWdtZW50cyIgYWNjb3JkaW5nIHRvIHdoaWNoIGZvbGRlciB1bmRlciBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIHRvIGZpbmQgdGhlIGZyYWdtZW50IC0tPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJzdWJGb2xkZXIiIHZhbHVlPSJjb250cmlidXRlZCIgZWxzZT0iZnJhZ21lbnRzIj4KLQkJCTxvcj4KLQkJCQk8ZXF1YWxzIGFyZzE9InMzOTAiIGFyZzI9IiR7YXJjaH0iIC8+Ci0JCQkJPGVxdWFscyBhcmcxPSJzMzkweCIgYXJnMj0iJHthcmNofSIgLz4KLQkJCQk8ZXF1YWxzIGFyZzE9InNvbGFyaXMueDg2IiBhcmcyPSIke29zfS4ke2FyY2h9IiAvPgotCQkJPC9vcj4KLQkJPC9jb25kaXRpb24+Ci0JCTwhLS0gbWFjIG9ubHkgaGFzIGFyY2ggaW4gZnJhZ21lbnQgbmFtZSBmb3IgeDg2XzY0IC0tPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJmcmFnbWVudEZvbGRlciIgdmFsdWU9IiR7c3ViRm9sZGVyfS9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLiR7d3N9LiR7b3N9LiR7YXJjaH0iIAotCQkJCQkJCQkJCQkgZWxzZT0iJHtzdWJGb2xkZXJ9L29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuJHt3c30uJHtvc30iID4KLQkJCTxub3Q+Ci0JCQkJPGFuZD4KLQkJCQkJPGVxdWFscyBhcmcxPSJtYWNvc3giIGFyZzI9IiR7b3N9Ii8+Ci0JCQkJCTxub3Q+IDxlcXVhbHMgYXJnMT0ieDg2XzY0IiBhcmcyPSIke2FyY2h9Ii8+IDwvbm90PgotCQkJCTwvYW5kPgotCQkJPC9ub3Q+Ci0JCTwvY29uZGl0aW9uPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJmZXRjaEV4ZWN1dGFibGVTb3VyY2UiID4KLQkJPCEtLSBmZXRjaCB0aGUgc291cmNlIGFuZCBwdXQgaXQgaW4gYSBmb2xkZXIgdW5pcXVlIHRvIHRoaXMgcGxhdGZvcm0gc28gd2UgZG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIKLQkJICAgICBjb21waWxlcyBpZiB0aGUgd29ya2luZyBmb2xkZXIgaXMgc2hhcmVkIGFjY3Jvc3MgbXVsdGlwbGUgbWFjaGluZXMgLS0+Ci0JCTxkZWxldGUgZGlyPSIke2Jhc2VkaXJ9LyR7b3N9LiR7d3N9LiR7YXJjaH0vbGlicmFyeSIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+IAotCQk8Y3ZzIGNvbW1hbmQ9ImV4cG9ydCAtZCAke29zfS4ke3dzfS4ke2FyY2h9L2xpYnJhcnkiIHRhZz0iJHtjdnNUYWd9IiBjdnNyc2g9IiR7Y3ZzcnNofSIgcGFja2FnZT0iJHtjdnNFeGVjdXRhYmxlUGF0aH0vbGlicmFyeSIgY3ZzUm9vdD0iJHtjdnNSb290fSIgZGVzdD0iJHtiYXNlZGlyfSIgcXVpZXQ9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJidWlsZE5peCIgaWY9ImJ1aWxkTml4Ij4KLQkJPCEtLSBleGVjIHRoZSBidWlsZC5zaCBmb3IgZmxhdm9ycyBvZiB1bml4IC0tPgotCQk8ZXhlYyBkaXI9IiR7bGlicmFyeUZvbGRlcn0vJHt3c30iIGV4ZWN1dGFibGU9InNoIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0JCQkJPGFyZyB2YWx1ZT0iYnVpbGQuc2giLz4KLQkJCQk8YXJnIGxpbmU9Ii13cyAke3dzfSAtb3MgJHtvc30gLWFyY2ggJHthcmNofSIvPgotCQkJCTxhcmcgbGluZT0iLWphdmEgJHtqYXZhSG9tZX0iLz4KLQkJCQk8YXJnIHZhbHVlPSJjbGVhbiBhbGwiIC8+Ci0JCQkJPGVudiBrZXk9IlBBVEgiIHZhbHVlPSIvYmluOi91c3IvYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL1gxMVI2L2JpbiIgLz4KLQkJPC9leGVjPgkKLQkJCi0JCTwhLS0gY29weSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgYW5kIC5zbyAtLT4KLQkJPFNDUCBkaXI9IiR7bGlicmFyeUZvbGRlcn0vJHt3c30iIHNvdXJjZT0iZWNsaXBzZSIgZGVzdGluYXRpb249IiR7cmVzdWx0c0Jhc2VGb2xkZXJ9L29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS8ke2V4ZUZvbGRlcn0vJHt3c30vJHtvc30vJHthcmNofSIgLz4KLQkJPFNDUCBkaXI9IiR7bGlicmFyeUZvbGRlcn0vJHt3c30iIHNvdXJjZT0iZWNsaXBzZV8ke21hal92ZXJ9JHttaW5fdmVyfS5zbyIgZGVzdGluYXRpb249IiR7cmVzdWx0c0Jhc2VGb2xkZXJ9L29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvJHtmcmFnbWVudEZvbGRlcn0iIC8+Ci0JCQotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5TW90aWZMaWIiID4KLQkJCTxlcXVhbHMgYXJnMT0iYWl4Lm1vdGlmIiBhcmcyPSIke29zfS4ke3dzfSIgLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY29weU1vdGlmTGliIiAvPgotCTwvdGFyZ2V0PgotCQkJCi0JPHRhcmdldCBuYW1lPSJjb3B5TW90aWZMaWIiIGlmPSJjb3B5TW90aWZMaWIiID4KLQkJPFNDUCBkaXI9IiR7bGlicmFyeUZvbGRlcn0vJHt3c30iIHNvdXJjZT0ibGliZWNsaXBzZS1tb3RpZi5zbyIgZGVzdGluYXRpb249IiR7cmVzdWx0c0Jhc2VGb2xkZXJ9L29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvJHtmcmFnbWVudEZvbGRlcn0iIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkV2luZG93cyIgaWY9ImJ1aWxkV2luZG93cyI+Ci0JCTwhLS0gZXhlYyB0aGUgYmF0Y2ggZmlsZSB0byBidWlsZCBvbiB3aW5kb3dzIC0tPgotCQk8ZXhlYyBkaXI9IiR7bGlicmFyeUZvbGRlcn0vJHt3c30iIGV4ZWN1dGFibGU9ImNtZCIgZmFpbG9uZXJyb3I9InRydWUiPgotCQkJPGFyZyB2YWx1ZT0iL2MiIC8+Ci0JCQk8YXJnIHZhbHVlPSJidWlsZC5iYXQiIC8+Ci0JCQk8YXJnIGxpbmU9IiR7YXJjaH0iLz4KLQkJCTxhcmcgdmFsdWU9Ii1qYXZhIi8+Ci0JCQk8YXJnIHZhbHVlPSIke2phdmFIb21lfSIvPgotCQkJPGFyZyBsaW5lPSJjbGVhbiBhbGwiIC8+Ci0JCTwvZXhlYz4KLQkJCi0JCTxTQ1AgZGlyPSIke2xpYnJhcnlGb2xkZXJ9LyR7d3N9IiBzb3VyY2U9ImVjbGlwc2UuZXhlIGVjbGlwc2VjLmV4ZSIgZGVzdGluYXRpb249IiR7cmVzdWx0c0Jhc2VGb2xkZXJ9L29yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZS8ke2V4ZUZvbGRlcn0vJHt3c30vJHtvc30vJHthcmNofSIgLz4KLQkJPFNDUCBkaXI9IiR7bGlicmFyeUZvbGRlcn0vJHt3c30iIHNvdXJjZT0iZWNsaXBzZV8ke21hal92ZXJ9JHttaW5fdmVyfS5kbGwiIGRlc3RpbmF0aW9uPSIke3Jlc3VsdHNCYXNlRm9sZGVyfS9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLyR7ZnJhZ21lbnRGb2xkZXJ9IiAvPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5V1BGIj4KLQkJCTxlcXVhbHMgYXJnMT0iJHt3c30iIGFyZzI9IndwZiIgLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY29weVdQRiIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNvcHlXUEYiIGlmPSJjb3B5V1BGIiA+Ci0JCTxTQ1AgZGlyPSIke2xpYnJhcnlGb2xkZXJ9LyR7d3N9IiBzb3VyY2U9ImNvbV8ke21hal92ZXJ9JHttaW5fdmVyfS5kbGwiIGRlc3RpbmF0aW9uPSIke3Jlc3VsdHNCYXNlRm9sZGVyfS9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLyR7ZnJhZ21lbnRGb2xkZXJ9IiBmYWlsb25lcnJvcj0iZmFsc2UiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJidWlsZE1hYyIgaWY9ImJ1aWxkTWFjIj4KLQkJPGV4ZWMgZGlyPSIke2xpYnJhcnlGb2xkZXJ9L2NhcmJvbiIgZXhlY3V0YWJsZT0ic2giIGZhaWxvbmVycm9yPSJ0cnVlIj4KLQkJCTxhcmcgdmFsdWU9ImJ1aWxkLnNoIi8+Ci0JCQk8YXJnIGxpbmU9Ii13cyAke3dzfSAtYXJjaCAke2FyY2h9Ii8+Ci0JCQk8YXJnIHZhbHVlPSJjbGVhbiBhbGwiIC8+Ci0JCQk8ZW52IGtleT0iUEFUSCIgdmFsdWU9Ii9iaW46L3Vzci9iaW46L3Vzci9sb2NhbC9iaW46L3Vzci9YMTFSNi9iaW46JHtleHRyYVBhdGh9IiAvPgotCQk8L2V4ZWM+CQotCQkJCi0JCTxTQ1AgZGlyPSIke2xpYnJhcnlGb2xkZXJ9L2NhcmJvbiIgc291cmNlPSJlY2xpcHNlIiBkZXN0aW5hdGlvbj0iJHtyZXN1bHRzQmFzZUZvbGRlcn0vb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlLyR7ZXhlRm9sZGVyfS8ke3dzfS8ke29zfS8ke2FyY2h9L0VjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TIiAvPgotCQk8U0NQIGRpcj0iJHtsaWJyYXJ5Rm9sZGVyfS9jYXJib24iIHNvdXJjZT0iZWNsaXBzZV8ke21hal92ZXJ9JHttaW5fdmVyfS5zbyIgZGVzdGluYXRpb249IiR7cmVzdWx0c0Jhc2VGb2xkZXJ9L29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIvJHtmcmFnbWVudEZvbGRlcn0iIC8+Ci0JCTwhLS0geDg2IGFuZCBwcGMgYXJlIHRoZSBzYW1lIHVuaXZlcnNhbCBiaW5hcnksIGNvcHkgdG8gYm90aCB1bmRlciB0aGUgZXhlY3V0YWJsZSBmZWF0dXJlIC0tPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5TWFjUFBDIj4KLQkJCTxlcXVhbHMgYXJnMT0iJHthcmNofSIgYXJnMj0ieDg2IiAvPgotCQk8L2NvbmRpdGlvbj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjb3B5TWFjUFBDIiAvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY29weU1hY1BQQyIgaWY9ImNvcHlNYWNQUEMiID4KLQkJPFNDUCBkaXI9IiR7bGlicmFyeUZvbGRlcn0vY2FyYm9uIiBzb3VyY2U9ImVjbGlwc2UiIGRlc3RpbmF0aW9uPSIke3Jlc3VsdHNCYXNlRm9sZGVyfS9vcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUvJHtleGVGb2xkZXJ9LyR7d3N9LyR7b3N9L3BwYy9FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUyIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImRldGVybWluZUJ1aWxkIiA+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9ImJ1aWxkV2luZG93cyIgPgotCQkJPGVxdWFscyBhcmcxPSIke29zfSIgYXJnMj0id2luMzIiLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9ImJ1aWxkTWFjIiA+Ci0JCQk8ZXF1YWxzIGFyZzE9IiR7b3N9IiBhcmcyPSJtYWNvc3giIC8+Ci0JCTwvY29uZGl0aW9uPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJidWlsZE5peCIgPgotCQkJPG5vdD48b3I+Ci0JCQkJPGlzc2V0IHByb3BlcnR5PSJidWlsZFdpbmRvd3MiIC8+Ci0JCQkJPGlzc2V0IHByb3BlcnR5PSJidWlsZE1hYyIgLz4KLQkJCTwvb3I+PC9ub3Q+Ci0JCTwvY29uZGl0aW9uPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iaW5pdFByb3BlcnRpZXMiID4KLQkJPHByb3BlcnR5IG5hbWU9IndzIiB2YWx1ZT0iJHtlbnYud3N9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvcyIgdmFsdWU9IiR7ZW52Lm9zfSIgLz4JCi0JCTxwcm9wZXJ0eSBuYW1lPSJhcmNoIiB2YWx1ZT0iJHtlbnYuYXJjaH0iIC8+Ci0JCQotCQk8cmVzb2x2ZVByb3BlcnR5IG5hbWU9Im1hY2hpbmUiIHZhbHVlPSJtXyR7b3N9LiR7YXJjaH0iIC8+Ci0JCTxyZXNvbHZlUHJvcGVydHkgbmFtZT0iamF2YUFyZyIgdmFsdWU9ImpfJHtvc30uJHthcmNofSIgLz4KLQkJPHJlc29sdmVQcm9wZXJ0eSBuYW1lPSJ1c2VyTmFtZSIgdmFsdWU9InVfJHtvc30uJHthcmNofSIgLz4KLQkJCi0JCTwhLS0gd2luZG93cyBpcyBidWlsdCBsb2NhbGx5LCBldmVyeXRoaW5nIGVsc2UgaXMgcmVtb3RlIC0tPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJsb2NhbCIgPgotCQkJPGVxdWFscyBhcmcxPSIke29zfSIgYXJnMj0id2luMzIiLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9InJlbW90ZSIgPgotCQkJPG5vdD4gPGlzc2V0IHByb3BlcnR5PSJsb2NhbCIvPiA8L25vdD4KLQkJPC9jb25kaXRpb24+Ci0JCQotCQk8IS0tIHdvcmtpbmcgZGlyZWN0b3J5IGRlZmF1bHRzIGZvciBvdXIgbWFjaGluZXMuICBPdGhlcnMgc2hvdWxkCi0JCSAgICAgcGFzcyBpbiB3b3Jrc3BhY2UgYXMgYSBwcm9wZXJ0eSBvbiB0aGUgY29tbWFuZCBsaW5lICAtLT4KLQkJPGNvbmRpdGlvbiBwcm9wZXJ0eT0id29ya3NwYWNlIiB2YWx1ZT0iL1VzZXJzL3N3dGJ1aWxkL2J1aWxkL2VxdWlub3giID4KLQkJCTxlcXVhbHMgYXJnMT0iJHtvc30iIGFyZzI9Im1hY29zeCIvPgotCQk8L2NvbmRpdGlvbj4KLQkJPGNvbmRpdGlvbiBwcm9wZXJ0eT0id29ya3NwYWNlIiB2YWx1ZT0ifi9lcXVpbm94IiA+Ci0JCQk8ZXF1YWxzIGFyZzE9IiR7b3N9LiR7YXJjaH0iIGFyZzI9InNvbGFyaXMueDg2IiAvPgotCQk8L2NvbmRpdGlvbj4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmtzcGFjZSIgdmFsdWU9Ii9ibHVlYmlyZC90ZWFtc3d0L2VxdWlub3giIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JCi0JPCEtLSAKLQkJTWFpbiBlbnRyeSBwb2ludC4gIFdlIGV4cGVjdCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0JCQkgb3MsIHdzLCBhcmNoICAtIHRvIGJlIHBhc3NlZCBhcyBhbnQgcHJvcGVydGllcyBvciBzZXQgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotCQkJIHJlc3VsdHNCYXNlRm9sZGVyIC0gbG9jYXRpb24gdG8gc2NwIHRoZSByZXN1bHRpbmcgYmluYXJpZXMgdG8sIHVzdWFsbHkgYSB3b3Jrc3BhY2UgY29udGFpbmluZyB0aGUgZXhlY3V0YWJsZSAmIGxhdW5jaGVyIHByb2plY3RzIChlZzogdXNlckBtYWNoaW5lOn4vd29ya3NwYWNlKQotCQkJIG1fPG9zPi48YXJjaD4gLSBuYW1lIG9mIGEgbWFjaGluZSB0byBzc2ggdG8gZm9yIHRoaXMgb3MgJiBhcmNoCi0JCQkgdV88b3M+LjxhcmNoPiAtIG9wdGlvbmFsIHVzZXIgb24gdGhlIG1hY2hpbmUgZm9yIHRoaXMgcGxhdGZvcm0KLQkJCSBqXzxvcz4uPGFyY2g+IC0gbG9jYXRpb24gb2YgYSBqZGsgd2UgY2FuIGNvbXBpbGUgYWdhaW5zdAotCQlXZSBleHBlY3Qgc3NoIGtleXMgdG8gYmUgc2V0IHVwIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCBwYXNzd29yZHMKLQkJCi0JCVRoZSBqXzxvcz4uPGFyY2g+IHByb3BlcnRpZXMgd29yayB0b2dldGhlciB3aXRoIHJlbW90ZS5zaCwgYW5kIGFyZSBlaXRoZXIKLQkJICAgLWphdmFIb21lIC9wYXRoL3RvL2pkawotCQlvciAtamF2YSByZWxhdGl2ZS9wYXRoL3RvL2pkawotCS0tPgotCTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImluaXRQcm9wZXJ0aWVzIj4KLQkJPGVjaG8gbWVzc2FnZT0iQnVpbGRpbmcgZm9yICR7b3N9LCAke3dzfSwgJHthcmNofSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkTG9jYWwiIC8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGRSZW1vdGUiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJidWlsZExvY2FsIiBpZj0ibG9jYWwiID4KLQkJPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF2YUhvbWUiIHZhbHVlPSIke2pfd2luMzJ9IiBlbHNlPSIke2phdmEuaG9tZX0iID4KLQkJCTxpc3NldCBwcm9wZXJ0eT0ial93aW4zMiIvPgotCQk8L2NvbmRpdGlvbj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZENvbmZpZyIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkUmVtb3RlIiBpZj0icmVtb3RlIj4KLQkJPGVjaG8gbWVzc2FnZT0iTWFjaGluZTogJHttYWNoaW5lfSIgLz4KLQkJPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic2NwRGVzdCIgdmFsdWU9IiR7dXNlck5hbWV9QCR7bWFjaGluZX0iIGVsc2U9IiR7bWFjaGluZX0iID4KLQkJCTxpc3NldCBwcm9wZXJ0eT0idXNlck5hbWUiIC8+Ci0JCTwvY29uZGl0aW9uPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJzc2hVc2VyIiB2YWx1ZT0iLWwgJHt1c2VyTmFtZX0iIGVsc2U9IiIgPgotCQkJPGlzc2V0IHByb3BlcnR5PSJ1c2VyTmFtZSIgLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxTQ1AgZGlyPSIke2Jhc2VkaXJ9IiBzb3VyY2U9InJlbW90ZS5zaCBidWlsZC54bWwiIGRlc3RpbmF0aW9uPSIke3NjcERlc3R9OiR7d29ya3NwYWNlfSIgLz4KLQkJPGVjaG8gbWVzc2FnZT0iRXhlY2luZyBzc2ggJHttYWNoaW5lfSIgLz4KLQkJPGV4ZWMgZXhlY3V0YWJsZT0ic3NoIiBmYWlsb25lcnJvcj0idHJ1ZSIgPgotCQkJPGFyZyBsaW5lPSIke3NzaFVzZXJ9ICR7bWFjaGluZX0iIC8+Ci0JCQk8YXJnIGxpbmU9InNoICR7d29ya3NwYWNlfS9yZW1vdGUuc2giIC8+Ci0JCQk8YXJnIGxpbmU9IiR7amF2YUFyZ30iIC8+Ci0JCQk8YXJnIGxpbmU9Ii1Eb3M9JHtvc30gLUR3cz0ke3dzfSAtRGFyY2g9JHthcmNofSAtRGN2c0xvZ2luPSR7Y3ZzTG9naW59IC1EY3ZzVGFnPSR7Y3ZzVGFnfSIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1EcmVzdWx0c0Jhc2VGb2xkZXI9JHtyZXN1bHRzQmFzZUZvbGRlcn0iIC8+Ci0JCTwvZXhlYz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGRDb25maWciIGRlcGVuZHM9ImluaXRfZXhlRm9sZGVyLGluaXRfZnJhZ21lbnQsZGV0ZXJtaW5lQnVpbGQiID4KLQkJPGFudGNhbGwgdGFyZ2V0PSJmZXRjaEV4ZWN1dGFibGVTb3VyY2UiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJqYXZhSG9tZSIgdmFsdWU9IiR7amF2YS5ob21lfS8uLiIgLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpYnJhcnlGb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9LyR7b3N9LiR7d3N9LiR7YXJjaH0vbGlicmFyeSIgLz4KLQkJPHByb3BlcnR5IGZpbGU9IiR7bGlicmFyeUZvbGRlcn0vbWFrZV92ZXJzaW9uLm1hayIgLz4KLQkJCi0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGROaXgiIC8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGRXaW5kb3dzIiAvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkTWFjIiAvPgotCTwvdGFyZ2V0PgotCQotPC9wcm9qZWN0PgotCi0KLQotCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5yZWxlbmcvcmVtb3RlLnNoIGIvcmVsZW5nL29yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIucmVsZW5nL3JlbW90ZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlYjIyNi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5yZWxlbmcvcmVtb3RlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyEvYmluL3NoCi0KLSN0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQKLXNjcmlwdERpcj1gZGlybmFtZSAiJDAiYAotCi1BTlRfSE9NRT0vYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvYnVpbGQvYXBhY2hlLWFudC0xLjcuMQotZXh0cmFBcmdzPSIiCi0KLXdoaWxlIFsgIiQxIiAhPSAiIiBdOyBkbwotCWlmIFsgIiQxIiA9ICItamF2YSIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotICAgICAgICBKQVZBX0hPTUU9L2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL2J1aWxkL0pSRS8kMgotICAgICAgICBzaGlmdAotICAgIGVsaWYgWyAiJDEiID0gIi1qYXZhSG9tZSIgXSAmJiBbICIkMiIgIT0gIiIgXTsgdGhlbgotCQlKQVZBX0hPTUU9IiQyIgotCQlzaGlmdAotICAgIGVsaWYgWyAiJDEiID0gIi1hbnRIb21lIiBdICYmIFsgIiQyIiAhPSAiIiBdOyB0aGVuCi0JCUFOVF9IT01FPSIkMiIKLQkJc2hpZnQKLSAgICBlbHNlCi0gICAgICAgIGV4dHJhQXJncz0iJGV4dHJhQXJncyAkMSIKLSAgICBmaQotICAgIHNoaWZ0Ci1kb25lCi0KLU9TPWB1bmFtZSAtc2AKLWNhc2UgJE9TIGluIAotCSJTdW5PUyIpCi0JCWlmIFsgIiRQUk9DIiA9ICIiIF07ICB0aGVuCi0JCSAgICBQUk9DPWB1bmFtZSAtcGAKLQkJZmkKLQkJY2FzZSAke1BST0N9IGluCi0JCQkiaTM4NiIpCi0JCQkJQU5UX0hPTUU9fi9lcXVpbm94L2FwYWNoZS1hbnQtMS43LjEKLQkJCQk7OwotCQllc2FjCi0JCTs7Ci0JIkFJWCIpCi0JCVBBVEg9L2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL2J1aWxkL2N2c19iaW4vQUlYOiRQQVRICi0JCTs7Ci1lc2FjCi0KLVBBVEg9JEpBVkFfSE9NRS9qcmUvYmluOiRBTlRfSE9NRS9iaW46JFBBVEgKLQotZXhwb3J0IEpBVkFfSE9NRSBBTlRfSE9NRSBQQVRICi1lY2hvIEpBVkFfSE9NRSA9ICRKQVZBX0hPTUUKLWVjaG8gQU5UX0hPTUUgPSAkQU5UX0hPTUUKLWVjaG8gYW50IC1mICR7c2NyaXB0RGlyfS9idWlsZC54bWwgYnVpbGRDb25maWcgJGV4dHJhQXJncyAKLWFudCAtZiAke3NjcmlwdERpcn0vYnVpbGQueG1sIGJ1aWxkQ29uZmlnICRleHRyYUFyZ3MK