{
	"address": "d0bcefdf1e67ea85",
	"balance": "78765037574",
	"contracts": {
		"HWGarageCard": "LyoKKgoqICAgQW4gTkZUIGNvbnRyYWN0IGRlbW8gZm9yIHJlZGVlbWluZy9taW50aW5nIHVubGltaXRlZCB0b2tlbnMKKgoqCiovCgppbXBvcnQgTm9uRnVuZ2libGVUb2tlbiBmcm9tIDB4MWQ3ZTU3YWE1NTgxNzQ0OAppbXBvcnQgTWV0YWRhdGFWaWV3cyBmcm9tIDB4MWQ3ZTU3YWE1NTgxNzQ0OAppbXBvcnQgVmlld1Jlc29sdmVyIGZyb20gMHgxZDdlNTdhYTU1ODE3NDQ4CmltcG9ydCBGdW5naWJsZVRva2VuIGZyb20gMHhmMjMzZGNlZTg4ZmUwYWJlCgphY2Nlc3MoYWxsKSBjb250cmFjdCBIV0dhcmFnZUNhcmQ6IE5vbkZ1bmdpYmxlVG9rZW4gewoKICAgIC8qIAogICAgKiAgIE5vbkZ1bmdpYmxlVG9rZW4gU3RhbmRhcmQgRXZlbnRzCiAgICAqLwoKICAgIGFjY2VzcyhhbGwpIGV2ZW50IENvbnRyYWN0SW5pdGlhbGl6ZWQoKQogICAgYWNjZXNzKGFsbCkgZXZlbnQgV2l0aGRyYXcoaWQ6IFVJbnQ2NCwgZnJvbTogQWRkcmVzcz8pCiAgICBhY2Nlc3MoYWxsKSBldmVudCBEZXBvc2l0KGlkOiBVSW50NjQsIHRvOiBBZGRyZXNzPykKCiAgICAvKiAKICAgICogICBQcm9qZWN0IEV2ZW50cwogICAgKi8KCiAgICBhY2Nlc3MoYWxsKSBldmVudCBNaW50KGlkOiBVSW50NjQpCiAgICBhY2Nlc3MoYWxsKSBldmVudCBCdXJuKGlkOiBVSW50NjQpCiAgICBhY2Nlc3MoYWxsKSBldmVudCBEZXBvc2l0RXZlbnQoCiAgICAgICAgdXVpZDogVUludDY0LAogICAgICAgIGlkOiBVSW50NjQsCiAgICAgICAgc2VyaWVzSWQ6IFVJbnQ2NCwKICAgICAgICBlZGl0aW9uSWQ6IFVJbnQ2NCwKICAgICAgICB0bzogQWRkcmVzcz8KICAgICAgICApCiAgICBhY2Nlc3MoYWxsKSBldmVudCBUcmFuc2ZlckV2ZW50KAogICAgICAgIHV1aWQ6IFVJbnQ2NCwKICAgICAgICBpZDogVUludDY0LAogICAgICAgIHNlcmllc0lkOiBVSW50NjQsCiAgICAgICAgZWRpdGlvbklkOiBVSW50NjQsCiAgICAgICAgdG86IEFkZHJlc3M/CiAgICAgICAgKQoKICAgIC8qIAogICAgKiAgIE5hbWVkIFBhdGhzCiAgICAqLwoKICAgIGFjY2VzcyhhbGwpIGxldCBDb2xsZWN0aW9uU3RvcmFnZVBhdGg6IFN0b3JhZ2VQYXRoCiAgICBhY2Nlc3MoYWxsKSBsZXQgQ29sbGVjdGlvblB1YmxpY1BhdGg6IFB1YmxpY1BhdGgKCiAgICAvKiAKICAgICogICBOb25GdW5naWJsZVRva2VuIFN0YW5kYXJkIEZpZWxkcwogICAgKi8KCiAgICBhY2Nlc3MoYWxsKSB2YXIgdG90YWxTdXBwbHk6IFVJbnQ2NAoKICAgIC8qCiAgICAqICAgVG9rZW4gU3RhdGUgVmFyaWFibGVzCiAgICAqLwoKICAgIGFjY2VzcyhhbGwpIHZhciBuYW1lOiBTdHJpbmcKCiAgICBhY2Nlc3Moc2VsZikgdmFyIGNvbGxlY3Rpb25NZXRhZGF0YTogeyBTdHJpbmc6IFN0cmluZyB9CiAgICBhY2Nlc3Moc2VsZikgbGV0IGlkVG9Ub2tlbk1ldGFkYXRhOiB7IFVJbnQ2NDogVG9rZW5NZXRhZGF0YSB9CgogICAgYWNjZXNzKGFsbCkgc3RydWN0IFRva2VuTWV0YWRhdGEgewogICAgICAgIGFjY2VzcyhhbGwpIGxldCBtZXRhZGF0YTogeyBTdHJpbmc6IFN0cmluZyB9CgogICAgICAgIGluaXQobWV0YWRhdGE6IHsgU3RyaW5nOiBTdHJpbmcgfSkgewogICAgICAgICAgICBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEKICAgICAgICB9CiAgICB9CgogICAgYWNjZXNzKGFsbCkgcmVzb3VyY2UgTkZUOiBOb25GdW5naWJsZVRva2VuLk5GVCB7CiAgICAgICAgYWNjZXNzKGFsbCkgbGV0IGlkOiBVSW50NjQKICAgICAgICBhY2Nlc3MoYWxsKSBsZXQgcGFja0lEOiBVSW50NjQKCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0TWV0YWRhdGEoKToge1N0cmluZzogU3RyaW5nfSB7CiAgICAgICAgICAgIGlmIChIV0dhcmFnZUNhcmQuaWRUb1Rva2VuTWV0YWRhdGFbc2VsZi5pZF0gIT0gbmlsKXsKICAgICAgICAgICAgICAgIHJldHVybiBIV0dhcmFnZUNhcmQuaWRUb1Rva2VuTWV0YWRhdGFbc2VsZi5pZF0hLm1ldGFkYXRhCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge30KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW5pdChpZDogVUludDY0LCBwYWNrSUQ6IFVJbnQ2NCkgewogICAgICAgICAgICBzZWxmLmlkID0gaWQKICAgICAgICAgICAgc2VsZi5wYWNrSUQgPSBwYWNrSUQKICAgICAgICAgICAgZW1pdCBNaW50KGlkOiBzZWxmLmlkKQogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGNyZWF0ZUVtcHR5Q29sbGVjdGlvbigpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0gewogICAgICAgICAgICByZXR1cm4gPC1IV0dhcmFnZUNhcmQuY3JlYXRlRW1wdHlDb2xsZWN0aW9uKG5mdFR5cGU6IFR5cGU8QEhXR2FyYWdlQ2FyZC5ORlQ+KCkpCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRWaWV3cygpOiBbVHlwZV0gewogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLkRpc3BsYXk+KCksCiAgICAgICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkw+KCksCiAgICAgICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRhdGE+KCksCiAgICAgICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXk+KCksCiAgICAgICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuUm95YWx0aWVzPigpCiAgICAgICAgICAgIF0KICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIHJlc29sdmVWaWV3KF8gdmlldzogVHlwZSk6IEFueVN0cnVjdD8gewogICAgICAgICAgICBzd2l0Y2ggdmlldyB7CiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5EaXNwbGF5PigpOgogICAgICAgICAgICAgICAgICAgIHZhciBpcGZzSW1hZ2U6IE1ldGFkYXRhVmlld3MuSVBGU0ZpbGUgPSBNZXRhZGF0YVZpZXdzLklQRlNGaWxlKGNpZDogIk5vIHRodW1ibmFpbCBjaWQgc2V0IiwgcGF0aDogIk5vIHRodW1ibmFpbCBwYXRoIHNldCIpCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZ2V0TWV0YWRhdGEoKS5jb250YWluc0tleSgidGh1bWJuYWlsQ0lEIikpewogICAgICAgICAgICAgICAgICAgICAgICBpcGZzSW1hZ2UgPSBNZXRhZGF0YVZpZXdzLklQRlNGaWxlKGNpZDogc2VsZi5nZXRNZXRhZGF0YSgpWyJ0aHVtYm5haWxDSUQiXSEsIHBhdGg6IHNlbGYuZ2V0TWV0YWRhdGEoKVsidGh1bWJuYWlsUGF0aCJdKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5EaXNwbGF5KAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZWxmLmdldE1ldGFkYXRhKClbIm5hbWUiXSA/PyAiSG90IFdoZWVscyBHYXJhZ2UgQ2FyZCBTZXJpZXMgNCAjIi5jb25jYXQoc2VsZi5pZC50b1N0cmluZygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHNlbGYuZ2V0TWV0YWRhdGEoKVsiZGVzY3JpcHRpb24iXSA/PyAiRGlnaXRhbCBDYXJkIENvbGxlY3RhYmxlIGZyb20gSG90IFdoZWVscyBHYXJhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWw6IGlwZnNJbWFnZQogICAgICAgICAgICAgICAgICAgICkKCgoKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMPigpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMKCIiKQoKCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFdHYXJhZ2VDYXJkLnJlc29sdmVDb250cmFjdFZpZXcocmVzb3VyY2VUeXBlOiBUeXBlPEBIV0dhcmFnZUNhcmQuTkZUPigpLCB2aWV3VHlwZTogVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EYXRhPigpKQoKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EaXNwbGF5PigpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBIV0dhcmFnZUNhcmQucmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU8QEhXR2FyYWdlQ2FyZC5ORlQ+KCksdmlld1R5cGU6IFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKSkKCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCk6IAogICAgICAgICAgICAgICAgICAgIHJldHVybiBIV0dhcmFnZUNhcmQucmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU8QEhXR2FyYWdlQ2FyZC5ORlQ+KCksIHZpZXdUeXBlOiBUeXBlPE1ldGFkYXRhVmlld3MuUm95YWx0aWVzPigpKQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmlsCiAgICAgICAgfQoKICAgIH0KCiAgICBhY2Nlc3MoYWxsKSByZXNvdXJjZSBpbnRlcmZhY2UgSFdHYXJhZ2VDYXJkQ29sbGVjdGlvblB1YmxpYyB7fQoKICAgIGFjY2VzcyhhbGwpIHJlc291cmNlIENvbGxlY3Rpb246IEhXR2FyYWdlQ2FyZENvbGxlY3Rpb25QdWJsaWMsIE5vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbiB7CiAgICAgICAgYWNjZXNzKGFsbCkgdmFyIG93bmVkTkZUczogQHtVSW50NjQ6IHtOb25GdW5naWJsZVRva2VuLk5GVH19CgogICAgICAgIGluaXQoKSB7CiAgICAgICAgICAgIHNlbGYub3duZWRORlRzIDwtIHt9CiAgICAgICAgfQoKICAgICAgICAvLy8gZ2V0U3VwcG9ydGVkTkZUVHlwZXMgcmV0dXJucyBhIGxpc3Qgb2YgTkZUIHR5cGVzIHRoYXQgdGhpcyByZWNlaXZlciBhY2NlcHRzCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0U3VwcG9ydGVkTkZUVHlwZXMoKToge1R5cGU6IEJvb2x9ewogICAgICAgICAgICBsZXQgc3VwcG9ydGVkVHlwZXM6IHtUeXBlOiBCb29sfSA9IHt9CiAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzW1R5cGU8QEhXR2FyYWdlQ2FyZC5ORlQ+KCldID0gdHJ1ZQogICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkVHlwZXMKICAgICAgICB9CgogICAgICAgIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB0eXBlIGlzIGFjY2VwdGVkIGJ5IHRoZSBjb2xsZWN0aW9uCiAgICAgICAgLy8vIEEgY29sbGVjdGlvbiB0aGF0IGNhbiBhY2NlcHQgYW55IHR5cGUgc2hvdWxkIGp1c3QgcmV0dXJuIHRydWUgYnkgZGVmYXVsdAogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGlzU3VwcG9ydGVkTkZUVHlwZSh0eXBlOiBUeXBlKTogQm9vbCB7CiAgICAgICAgICAgIHJldHVybiB0eXBlID09IFR5cGU8QEhXR2FyYWdlQ2FyZC5ORlQ+KCkKICAgICAgICB9CgogICAgICAgIGFjY2VzcyhOb25GdW5naWJsZVRva2VuLldpdGhkcmF3KSBmdW4gd2l0aGRyYXcod2l0aGRyYXdJRDogVUludDY0KTogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gewogICAgICAgICAgICBsZXQgdG9rZW46IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9IDwtIHNlbGYub3duZWRORlRzLnJlbW92ZShrZXk6IHdpdGhkcmF3SUQpID8/IHBhbmljKCJtaXNzaW5nIE5GVCIpCiAgICAgICAgICAgIGVtaXQgV2l0aGRyYXcoaWQ6IHRva2VuLmlkLCBmcm9tOiBzZWxmLm93bmVyPy5hZGRyZXNzKQogICAgICAgICAgICByZXR1cm4gPC10b2tlbgogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGRlcG9zaXQodG9rZW46IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9KSB7CiAgICAgICAgICAgIC8vIGxldCB0b2tlbiA8LSB0b2tlbiBhcyEgQEhXR2FyYWdlQ2FyZC5ORlQKICAgICAgICAgICAgLy8gbGV0IGlkOiBVSW50NjQgPSB0b2tlbi5pZAogICAgICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkOiBASFdHYXJhZ2VDYXJkLk5GVCA8LSB0b2tlbiBhcyEgQEhXR2FyYWdlQ2FyZC5ORlQKICAgICAgICAgICAgbGV0IEhXR2FyYWdlQ2FyZFVVSUQ6IFVJbnQ2NCA9IEhXR2FyYWdlQ2FyZC51dWlkCiAgICAgICAgICAgIGxldCBIV0dhcmFnZUNhcmRTZXJpZXNJZDogVUludDY0ID0gNAogICAgICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkSUQ6IFVJbnQ2NCA9IEhXR2FyYWdlQ2FyZC5pZAogICAgICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkY2FyZEVkaXRpb25JRDogVUludDY0ID0gSFdHYXJhZ2VDYXJkLmlkCiAgICAgICAgICAgIHNlbGYub3duZWRORlRzW0hXR2FyYWdlQ2FyZElEXSA8LSEgSFdHYXJhZ2VDYXJkCiAgICAgICAgICAgIGVtaXQgRGVwb3NpdChpZDogSFdHYXJhZ2VDYXJkSUQsIHRvOiBzZWxmLm93bmVyPy5hZGRyZXNzKQogICAgICAgICAgICBlbWl0IERlcG9zaXRFdmVudCgKICAgICAgICAgICAgICAgIHV1aWQ6IEhXR2FyYWdlQ2FyZFVVSUQsCiAgICAgICAgICAgICAgICBpZDogSFdHYXJhZ2VDYXJkSUQsCiAgICAgICAgICAgICAgICBzZXJpZXNJZDogSFdHYXJhZ2VDYXJkU2VyaWVzSWQsCiAgICAgICAgICAgICAgICBlZGl0aW9uSWQ6IEhXR2FyYWdlQ2FyZGNhcmRFZGl0aW9uSUQsCiAgICAgICAgICAgICAgICB0bzogc2VsZi5vd25lcj8uYWRkcmVzcwogICAgICAgICAgICAgICAgKQogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0SURzKCk6IFtVSW50NjRdIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGYub3duZWRORlRzLmtleXMKICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldExlbmd0aCgpOiBJbnQgewogICAgICAgICAgICByZXR1cm4gc2VsZi5vd25lZE5GVHMua2V5cy5sZW5ndGgKICAgICAgICB9CiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gYm9ycm93TkZUKF8gaWQ6IFVJbnQ2NCk6ICZ7Tm9uRnVuZ2libGVUb2tlbi5ORlR9PyB7CiAgICAgICAgICAgIHJldHVybiAoJnNlbGYub3duZWRORlRzW2lkXSkKICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGJvcnJvd0hXR2FyYWdlQ2FyZChpZDogVUludDY0KTogJk5GVD8gewogICAgICAgICAgICBpZiBsZXQgY2FyZDogJntOb25GdW5naWJsZVRva2VuLk5GVH0gPSAmc2VsZi5vd25lZE5GVHNbaWRdIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYXJkIGFzISAmTkZUCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5pbAogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gYm9ycm93Vmlld1Jlc29sdmVyKGlkOiBVSW50NjQpOiAme1ZpZXdSZXNvbHZlci5SZXNvbHZlcn0/IHsKICAgICAgICAgICAgaWYgbGV0IG5mdFJlZjogJntOb25GdW5naWJsZVRva2VuLk5GVH0gPSAoJnNlbGYub3duZWRORlRzW2lkXSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5mdFJlZiBhcyAme1ZpZXdSZXNvbHZlci5SZXNvbHZlcn0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmlsCiAgICAgICAgfQogICAgCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGNyZWF0ZUVtcHR5Q29sbGVjdGlvbigpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0gewogICAgICAgICAgICByZXR1cm4gPC0gSFdHYXJhZ2VDYXJkLmNyZWF0ZUVtcHR5Q29sbGVjdGlvbihuZnRUeXBlOiBUeXBlPEBIV0dhcmFnZUNhcmQuTkZUPigpKQogICAgICAgIH0KICAgIH0KCiAgICBhY2Nlc3MoYWxsKSBmdW4gY3JlYXRlRW1wdHlDb2xsZWN0aW9uKG5mdFR5cGU6IFR5cGUpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0gewogICAgICAgIHJldHVybiA8LSBjcmVhdGUgQ29sbGVjdGlvbigpCiAgICB9CgogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0Q29udHJhY3RWaWV3cyhyZXNvdXJjZVR5cGU6IFR5cGU/KTogW1R5cGVdIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRhdGE+KCksCiAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKSwKICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLlJveWFsdGllcz4oKQogICAgICAgIF0KICAgIH0KCiAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biByZXNvbHZlQ29udHJhY3RWaWV3KHJlc291cmNlVHlwZTogVHlwZT8sIHZpZXdUeXBlOiBUeXBlKTogQW55U3RydWN0PyB7CiAgICAgICAgc3dpdGNoIHZpZXdUeXBlIHsKICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRhdGE+KCk6CiAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YSgKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlUGF0aDogc2VsZi5Db2xsZWN0aW9uU3RvcmFnZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgcHVibGljUGF0aDogc2VsZi5Db2xsZWN0aW9uUHVibGljUGF0aCwKICAgICAgICAgICAgICAgICAgICBwdWJsaWNDb2xsZWN0aW9uOiBUeXBlPCZIV0dhcmFnZUNhcmQuQ29sbGVjdGlvbj4oKSwKICAgICAgICAgICAgICAgICAgICBwdWJsaWNMaW5rZWRUeXBlOiBUeXBlPCZIV0dhcmFnZUNhcmQuQ29sbGVjdGlvbj4oKSwKICAgICAgICAgICAgICAgICAgICBjcmVhdGVFbXB0eUNvbGxlY3Rpb25GdW5jdGlvbjogKGZ1bigpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPC1IV0dhcmFnZUNhcmQuY3JlYXRlRW1wdHlDb2xsZWN0aW9uKG5mdFR5cGU6IFR5cGU8QEhXR2FyYWdlQ2FyZC5ORlQ+KCkpCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EaXNwbGF5PigpOgogICAgICAgICAgICAgICAgICAgIGxldCBleHRlcm5hbFVSTCA9IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoIiIpCiAgICAgICAgICAgICAgICAgICAgbGV0IHNxdWFyZUltYWdlID0gTWV0YWRhdGFWaWV3cy5NZWRpYSgKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogTWV0YWRhdGFWaWV3cy5IVFRQRmlsZSh1cmw6ICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiAiaW1hZ2UvcG5nIgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBsZXQgYmFubmVySW1hZ2UgPSBNZXRhZGF0YVZpZXdzLk1lZGlhKAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBNZXRhZGF0YVZpZXdzLkhUVFBGaWxlKHVybDogIiIpLAogICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6ICJpbWFnZS9wbmciCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGxldCBzb2NpYWxNYXA6IHtTdHJpbmc6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkx9ID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMKCJodHRwczovL3d3dy5mYWNlYm9vay5jb20vaG90d2hlZWxzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWdyYW0iOiBNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMKCJodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL2hvdHdoZWVsc29mZmljaWFsLyIpLAogICAgICAgICAgICAgICAgICAgICAgICAidHdpdHRlciI6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoImh0dHBzOi8vdHdpdHRlci5jb20vSG90X1doZWVscyIpLAogICAgICAgICAgICAgICAgICAgICAgICAiZGlzY29yZCI6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoImh0dHBzOi8vZGlzY29yZC5nZy9tYXR0ZWwiKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheSgKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogIkhvdCBXaGVlbHMgR2FyYWdlIENhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogIkRpZ2l0YWwgQ29sbGVjdGFibGUgZnJvbSBIb3QgV2hlZWxzIEdhcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsVVJMOiBleHRlcm5hbFVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgc3F1YXJlSW1hZ2U6IHNxdWFyZUltYWdlLAogICAgICAgICAgICAgICAgICAgICAgICBiYW5uZXJJbWFnZTogYmFubmVySW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHNvY2lhbHM6IHNvY2lhbE1hcAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuUm95YWx0aWVzPigpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXRhZGF0YVZpZXdzLlJveWFsdGllcyhbXSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5pbAogICAgfQoKICAgIC8qIAogICAgKiAgIEFkbWluIEZ1bmN0aW9ucwogICAgKi8KICAgIGFjY2VzcyhhY2NvdW50KSBmdW4gc2V0RWRpdGlvbk1ldGFkYXRhKGVkaXRpb25OdW1iZXI6IFVJbnQ2NCwgbWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30pIHsKICAgICAgICBzZWxmLmlkVG9Ub2tlbk1ldGFkYXRhW2VkaXRpb25OdW1iZXJdID0gVG9rZW5NZXRhZGF0YShtZXRhZGF0YTogbWV0YWRhdGEpCiAgICB9CgogICAgYWNjZXNzKGFjY291bnQpIGZ1biBzZXRDb2xsZWN0aW9uTWV0YWRhdGEobWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30pIHsKICAgICAgICBzZWxmLmNvbGxlY3Rpb25NZXRhZGF0YSA9IG1ldGFkYXRhCiAgICB9CgogICAgYWNjZXNzKGFjY291bnQpIGZ1biBtaW50KG5mdElEOiBVSW50NjQsIHBhY2tJRDogVUludDY0KTogQE5GVCB7CiAgICAgICAgc2VsZi50b3RhbFN1cHBseSA9IHNlbGYudG90YWxTdXBwbHkgKyAxCiAgICAgICAgcmV0dXJuIDwtIGNyZWF0ZSBORlQoaWQ6IG5mdElELCBwYWNrSUQ6IHBhY2tJRCkKICAgIH0KCiAgICAvKiAKICAgICogICBQdWJsaWMgRnVuY3Rpb25zCiAgICAqLwogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0VG90YWxTdXBwbHkoKTogVUludDY0IHsKICAgICAgICByZXR1cm4gc2VsZi50b3RhbFN1cHBseQogICAgfQoKICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldE5hbWUoKTogU3RyaW5nIHsKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCiAgICB9CgogICAgYWNjZXNzKGFsbCkgZnVuIHRyYW5zZmVyKHV1aWQ6IFVJbnQ2NCwgaWQ6IFVJbnQ2NCwgcGFja1Nlcmllc0lkOiBVSW50NjQsIGNhcmRFZGl0aW9uSWQ6IFVJbnQ2NCwgdG9BZGRyZXNzOiBBZGRyZXNzKXsKCiAgICAgICAgbGV0IEhXR2FyYWdlQ2FyZFYyVVVJRDogVUludDY0ID0gdXVpZAogICAgICAgIGxldCBIV0dhcmFnZUNhcmRWMlNlcmllc0lkOiBVSW50NjQgPSBwYWNrU2VyaWVzSWQKICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkVjJJRDogVUludDY0ID0gaWQKICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkVjJjYXJkRWRpdGlvbklEOiBVSW50NjQgPSBjYXJkRWRpdGlvbklkCgogICAgICAgIGVtaXQgVHJhbnNmZXJFdmVudCgKICAgICAgICAgICAgdXVpZDogSFdHYXJhZ2VDYXJkVjJVVUlECiAgICAgICAgICAgICwgaWQ6IEhXR2FyYWdlQ2FyZFYySUQKICAgICAgICAgICAgLCBzZXJpZXNJZDogSFdHYXJhZ2VDYXJkVjJTZXJpZXNJZAogICAgICAgICAgICAsIGVkaXRpb25JZDogSFdHYXJhZ2VDYXJkVjJjYXJkRWRpdGlvbklECiAgICAgICAgICAgICwgdG86IHRvQWRkcmVzcykKICAgIH0KCiAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRDb2xsZWN0aW9uTWV0YWRhdGEoKToge1N0cmluZzogU3RyaW5nfSB7CiAgICAgICAgcmV0dXJuIHNlbGYuY29sbGVjdGlvbk1ldGFkYXRhCiAgICB9CgogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0RWRpdGlvbk1ldGFkYXRhKF8gZWRpdGlvbjogVUludDY0KToge1N0cmluZzogU3RyaW5nfSB7CiAgICAgICAgaWYgKCBzZWxmLmlkVG9Ub2tlbk1ldGFkYXRhW2VkaXRpb25dICE9IG5pbCkgewogICAgICAgICAgICByZXR1cm4gc2VsZi5pZFRvVG9rZW5NZXRhZGF0YVtlZGl0aW9uXSEubWV0YWRhdGEKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4ge30KICAgICAgICB9CiAgICB9CgogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0TWV0YWRhdGFMZW5ndGgoKTogSW50IHsKICAgICAgICByZXR1cm4gc2VsZi5pZFRvVG9rZW5NZXRhZGF0YS5sZW5ndGgKICAgIH0KCiAgICAvLyBpbml0aWFsaXplIGNvbnRyYWN0IHN0YXRlIHZhcmlhYmxlcwogICAgaW5pdCgpewogICAgICAgIHNlbGYubmFtZSA9ICJIV0dhcmFnZUNhcmQiCiAgICAgICAgc2VsZi50b3RhbFN1cHBseSA9IDAKCiAgICAgICAgc2VsZi5jb2xsZWN0aW9uTWV0YWRhdGEgPSB7fQogICAgICAgIHNlbGYuaWRUb1Rva2VuTWV0YWRhdGEgPSB7fQoKICAgICAgICAvLyBzZXQgdGhlIG5hbWVkIHBhdGhzCiAgICAgICAgc2VsZi5Db2xsZWN0aW9uU3RvcmFnZVBhdGggPSAvc3RvcmFnZS9IV0dhcmFnZUNhcmRDb2xsZWN0aW9uCiAgICAgICAgc2VsZi5Db2xsZWN0aW9uUHVibGljUGF0aCA9IC9wdWJsaWMvSFdHYXJhZ2VDYXJkQ29sbGVjdGlvbgoKICAgICAgICAvLyBDcmVhdGUgYSBjb2xsZWN0aW9uIHJlc291cmNlIGFuZCBzYXZlIGl0IHRvIHN0b3JhZ2UKICAgICAgICBsZXQgY29sbGVjdGlvbjogQEhXR2FyYWdlQ2FyZC5Db2xsZWN0aW9uIDwtIGNyZWF0ZSBDb2xsZWN0aW9uKCkKICAgICAgICBzZWxmLmFjY291bnQuc3RvcmFnZS5zYXZlKDwtY29sbGVjdGlvbiwgdG86IHNlbGYuQ29sbGVjdGlvblN0b3JhZ2VQYXRoKQoKICAgICAgICBsZXQgY29sbGVjdGlvbkNhcCA9IHNlbGYuYWNjb3VudC5jYXBhYmlsaXRpZXMuc3RvcmFnZS5pc3N1ZTwmSFdHYXJhZ2VDYXJkLkNvbGxlY3Rpb24+KHNlbGYuQ29sbGVjdGlvblN0b3JhZ2VQYXRoKQogICAgICAgIHNlbGYuYWNjb3VudC5jYXBhYmlsaXRpZXMucHVibGlzaChjb2xsZWN0aW9uQ2FwLCBhdDogc2VsZi5Db2xsZWN0aW9uUHVibGljUGF0aCkKCgogICAgICAgIGVtaXQgQ29udHJhY3RJbml0aWFsaXplZCgpCiAgICB9Cn0=",
		"HWGarageCardV2": "LyoKKgoqICAgQW4gTkZUIGNvbnRyYWN0IGZvciByZWRlZW1pbmcvbWludGluZyB0b2tlbnMgYnkgc2VyaWVzCioKKgoqLwoKaW1wb3J0IE5vbkZ1bmdpYmxlVG9rZW4gZnJvbSAweDFkN2U1N2FhNTU4MTc0NDgKaW1wb3J0IEZ1bmdpYmxlVG9rZW4gZnJvbSAweGYyMzNkY2VlODhmZTBhYmUKaW1wb3J0IE1ldGFkYXRhVmlld3MgZnJvbSAweDFkN2U1N2FhNTU4MTc0NDgKaW1wb3J0IFZpZXdSZXNvbHZlciBmcm9tIDB4MWQ3ZTU3YWE1NTgxNzQ0OAoKCmFjY2VzcyhhbGwpIGNvbnRyYWN0IEhXR2FyYWdlQ2FyZFYyOiBOb25GdW5naWJsZVRva2VuIHsKCiAgICAvKiAKICAgICogICBOb25GdW5naWJsZVRva2VuIFN0YW5kYXJkIEV2ZW50cwogICAgKi8KICAgIGFjY2VzcyhhbGwpIGV2ZW50IENvbnRyYWN0SW5pdGlhbGl6ZWQoKQogICAgYWNjZXNzKGFsbCkgZXZlbnQgV2l0aGRyYXcoaWQ6IFVJbnQ2NCwgZnJvbTogQWRkcmVzcz8pCiAgICBhY2Nlc3MoYWxsKSBldmVudCBEZXBvc2l0KGlkOiBVSW50NjQsIHRvOiBBZGRyZXNzPykKCiAgICAvKiAKICAgICogICBQcm9qZWN0IEV2ZW50cwogICAgKi8KICAgIGFjY2VzcyhhbGwpIGV2ZW50IE1pbnQoaWQ6IFVJbnQ2NCkKICAgIGFjY2VzcyhhbGwpIGV2ZW50IEJ1cm4oaWQ6IFVJbnQ2NCkKICAgIGFjY2VzcyhhbGwpIGV2ZW50IERlcG9zaXRFdmVudCgKICAgICAgICB1dWlkOiBVSW50NjQKICAgICAgICAsIGlkOiBVSW50NjQKICAgICAgICAsIHNlcmllc0lkOiBVSW50NjQKICAgICAgICAsIGVkaXRpb25JZDogVUludDY0CiAgICAgICAgLCB0bzogQWRkcmVzcz8KICAgICAgICApCgogICAgYWNjZXNzKGFsbCkgZXZlbnQgVHJhbnNmZXJFdmVudCgKICAgICAgICB1dWlkOiBVSW50NjQKICAgICAgICAsIGlkOiBVSW50NjQKICAgICAgICAsIHNlcmllc0lkOiBVSW50NjQKICAgICAgICAsIGVkaXRpb25JZDogVUludDY0CiAgICAgICAgLCB0bzogQWRkcmVzcz8KICAgICAgICApCgogICAgLyogCiAgICAqICAgTmFtZWQgUGF0aHMKICAgICovCiAgICBhY2Nlc3MoYWxsKSBsZXQgQ29sbGVjdGlvblN0b3JhZ2VQYXRoOiBTdG9yYWdlUGF0aAogICAgYWNjZXNzKGFsbCkgbGV0IENvbGxlY3Rpb25QdWJsaWNQYXRoOiBQdWJsaWNQYXRoCgogICAgLyogCiAgICAqICAgTm9uRnVuZ2libGVUb2tlbiBTdGFuZGFyZCBGaWVsZHMKICAgICovCiAgICBhY2Nlc3MoYWxsKSB2YXIgdG90YWxTdXBwbHk6IFVJbnQ2NAoKICAgIC8qCiAgICAqICAgQ2FyZCBTdGF0ZSBWYXJpYWJsZXMKICAgICovCiAgICBhY2Nlc3Moc2VsZikgdmFyIG5hbWU6IFN0cmluZwogICAgYWNjZXNzKGFjY291bnQpIHZhciBjdXJyZW50Q2FyZEVkaXRpb25JZEJ5UGFja1Nlcmllc0lkOiB7VUludDY0OiBVSW50NjR9CgogICAgYWNjZXNzKGFsbCkgcmVzb3VyY2UgTkZUOiBOb25GdW5naWJsZVRva2VuLk5GVCB7CiAgICAgICAgYWNjZXNzKGFsbCkgbGV0IGlkOiBVSW50NjQKICAgICAgICAvLyB0aGUgcGFjayBzZXJpZXMgdGhpcyBjYXJkIGNhbWUgZnJvbQogICAgICAgIGFjY2VzcyhhbGwpIGxldCBwYWNrU2VyaWVzSUQ6IFVJbnQ2NCAKICAgICAgICBhY2Nlc3MoYWxsKSBsZXQgY2FyZEVkaXRpb25JRDogVUludDY0CiAgICAgICAgYWNjZXNzKGFsbCkgbGV0IHBhY2tIYXNoOiBTdHJpbmcKICAgICAgICBhY2Nlc3MoYWxsKSBsZXQgcmVkZWVtYWJsZTogU3RyaW5nCiAgICAgICAgYWNjZXNzKGFsbCkgbGV0IG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9CgoKICAgICAgICBpbml0KAogICAgICAgICAgICBpZDogVUludDY0CiAgICAgICAgICAgICwgcGFja1Nlcmllc0lEOiBVSW50NjQKICAgICAgICAgICAgLCBjYXJkRWRpdGlvbklEOiBVSW50NjQKICAgICAgICAgICAgLCBwYWNrSGFzaDogU3RyaW5nCiAgICAgICAgICAgICwgcmVkZWVtYWJsZTogU3RyaW5nCiAgICAgICAgICAgICwgbWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30KICAgICAgICAgICAgKSB7CiAgICAgICAgICAgIHNlbGYuaWQgPSBpZAogICAgICAgICAgICBzZWxmLnBhY2tTZXJpZXNJRCA9IHBhY2tTZXJpZXNJRAogICAgICAgICAgICBzZWxmLmNhcmRFZGl0aW9uSUQgPSBjYXJkRWRpdGlvbklECiAgICAgICAgICAgIHNlbGYucGFja0hhc2ggPSBwYWNrSGFzaAogICAgICAgICAgICBzZWxmLnJlZGVlbWFibGUgPSByZWRlZW1hYmxlCiAgICAgICAgICAgIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YQogICAgICAgICAgICBlbWl0IE1pbnQoaWQ6IHNlbGYuaWQpCiAgICAgICAgfQoKCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGNyZWF0ZUVtcHR5Q29sbGVjdGlvbigpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0gewogICAgICAgICAgICByZXR1cm4gPC1IV0dhcmFnZUNhcmRWMi5jcmVhdGVFbXB0eUNvbGxlY3Rpb24obmZ0VHlwZTogVHlwZTxASFdHYXJhZ2VDYXJkVjIuTkZUPigpKQogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0Vmlld3MoKTogW1R5cGVdIHsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5EaXNwbGF5PigpLAogICAgICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMPigpLAogICAgICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EYXRhPigpLAogICAgICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EaXNwbGF5PigpLAogICAgICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLlJveWFsdGllcz4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5UcmFpdHM+KCksCiAgICAgICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuUmFyaXR5PigpCiAgICAgICAgICAgIF0KICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIGZ1biByZXNvbHZlVmlldyhfIHZpZXc6IFR5cGUpOiBBbnlTdHJ1Y3Q/IHsKICAgICAgICAgICAgc3dpdGNoIHZpZXcgewogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuRGlzcGxheT4oKToKICAgICAgICAgICAgICAgICAgICB2YXIgaXBmc0ltYWdlID0gTWV0YWRhdGFWaWV3cy5JUEZTRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgY2lkOiBzZWxmLm1ldGFkYXRhWyJ0aHVtYm5haWxDSUQiXSA/PyAiVGh1bWJuYWlsQ0lEIG5vdCBzZXQiCiAgICAgICAgICAgICAgICAgICAgICAgICwgcGF0aDogc2VsZi5tZXRhZGF0YVsidGh1bWJuYWlsUGF0aCJdID8/ICIiCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5EaXNwbGF5KAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZWxmLm1ldGFkYXRhWyJjYXJkTmFtZSJdID8/ICJIb3QgV2hlZWxzIEdhcmFnZSBDYXJkIFNlcmllcyAiLmNvbmNhdChzZWxmLnBhY2tTZXJpZXNJRC50b1N0cmluZygpKS5jb25jYXQoIiAjIikuY29uY2F0KHNlbGYuY2FyZEVkaXRpb25JRC50b1N0cmluZygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHNlbGYubWV0YWRhdGFbImNhcmREZXNjcmlwdGlvbiJdID8/ICJEaWdpdGFsIENhcmQgQ29sbGVjdGFibGUgZnJvbSBIb3QgV2hlZWxzIEdhcmFnZSIgLAogICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWw6IGlwZnNJbWFnZQogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTD4oKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgKICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhWyJ1cmwiXSA/PyAiIgogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFdHYXJhZ2VDYXJkVjIucmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU8QEhXR2FyYWdlQ2FyZFYyLk5GVD4oKSwgdmlld1R5cGU6IFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKSkKCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFdHYXJhZ2VDYXJkVjIucmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU8QEhXR2FyYWdlQ2FyZFYyLk5GVD4oKSwgdmlld1R5cGU6IFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKSkKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLlRyYWl0cz4oKTogCiAgICAgICAgICAgICAgICAgICAgbGV0IGV4bHVkZWRUcmFpdHMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRodW1ibmFpbFBhdGgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAidGh1bWJuYWlsQ0lEIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgImNvbGxlY3Rpb25OYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgImNvbGxlY3Rpb25EZXNjcmlwdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJjYXJkRGVzY3JpcHRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAidXJsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIGxldCB0cmFpdHNWaWV3ID0gTWV0YWRhdGFWaWV3cy5kaWN0VG9UcmFpdHMoCiAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Q6IHNlbGYubWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkTmFtZXM6IGV4bHVkZWRUcmFpdHMKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHNWaWV3CiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCk6IAogICAgICAgICAgICAgICAgICAgIHJldHVybiBIV0dhcmFnZUNhcmRWMi5yZXNvbHZlQ29udHJhY3RWaWV3KHJlc291cmNlVHlwZTogVHlwZTxASFdHYXJhZ2VDYXJkVjIuTkZUPigpLCB2aWV3VHlwZTogVHlwZTxNZXRhZGF0YVZpZXdzLlJveWFsdGllcz4oKSkKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLlJhcml0eT4oKTogCiAgICAgICAgICAgICAgICAgICAgbGV0IHJhcml0eURlc2NyaXB0aW9uID0gc2VsZi5tZXRhZGF0YVsicmFyaXR5Il0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5SYXJpdHkoCiAgICAgICAgICAgICAgICAgICAgc2NvcmU6IG5pbAogICAgICAgICAgICAgICAgICAgICwgbWF4OiBuaWwKICAgICAgICAgICAgICAgICAgICAsZGVzY3JpcHRpb246IHJhcml0eURlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5pbAogICAgICAgIH0KCgogICAgfQoKICAgIGFjY2VzcyhhbGwpIHJlc291cmNlIGludGVyZmFjZSBDYXJkQ29sbGVjdGlvblB1YmxpYyB7fQoKICAgIGFjY2VzcyhhbGwpIHJlc291cmNlIENvbGxlY3Rpb246IENhcmRDb2xsZWN0aW9uUHVibGljLCBOb25GdW5naWJsZVRva2VuLkNvbGxlY3Rpb24gewogICAgICAgIGFjY2VzcyhhbGwpIHZhciBvd25lZE5GVHM6IEB7VUludDY0OiB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9fQoKICAgICAgICBpbml0KCkgewogICAgICAgICAgICBzZWxmLm93bmVkTkZUcyA8LSB7fQogICAgICAgIH0KCiAgICAgICAgLy8vIGdldFN1cHBvcnRlZE5GVFR5cGVzIHJldHVybnMgYSBsaXN0IG9mIE5GVCB0eXBlcyB0aGF0IHRoaXMgcmVjZWl2ZXIgYWNjZXB0cwogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldFN1cHBvcnRlZE5GVFR5cGVzKCk6IHtUeXBlOiBCb29sfXsKICAgICAgICAgICAgbGV0IHN1cHBvcnRlZFR5cGVzOiB7VHlwZTogQm9vbH0gPSB7fQogICAgICAgICAgICBzdXBwb3J0ZWRUeXBlc1tUeXBlPEBIV0dhcmFnZUNhcmRWMi5ORlQ+KCldID0gdHJ1ZQogICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkVHlwZXMKICAgICAgICB9CgogICAgICAgIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB0eXBlIGlzIGFjY2VwdGVkIGJ5IHRoZSBjb2xsZWN0aW9uCiAgICAgICAgLy8vIEEgY29sbGVjdGlvbiB0aGF0IGNhbiBhY2NlcHQgYW55IHR5cGUgc2hvdWxkIGp1c3QgcmV0dXJuIHRydWUgYnkgZGVmYXVsdAogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGlzU3VwcG9ydGVkTkZUVHlwZSh0eXBlOiBUeXBlKTogQm9vbCB7CiAgICAgICAgICAgIHJldHVybiB0eXBlID09IFR5cGU8QEhXR2FyYWdlQ2FyZFYyLk5GVD4oKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhY2Nlc3MoTm9uRnVuZ2libGVUb2tlbi5XaXRoZHJhdykgZnVuIHdpdGhkcmF3KHdpdGhkcmF3SUQ6IFVJbnQ2NCk6IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9IHsKICAgICAgICAgICAgbGV0IHRva2VuIDwtIHNlbGYub3duZWRORlRzLnJlbW92ZShrZXk6IHdpdGhkcmF3SUQpID8/IHBhbmljKCJtaXNzaW5nIE5GVCIpCgogICAgICAgICAgICBlbWl0IFdpdGhkcmF3KAogICAgICAgICAgICAgICAgaWQ6IHRva2VuLmlkLAogICAgICAgICAgICAgICAgZnJvbTogc2VsZi5vd25lcj8uYWRkcmVzcwogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIDwtdG9rZW4KICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIGZ1biBkZXBvc2l0KHRva2VuOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSkgewogICAgICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkVjIgPC0gdG9rZW4gYXMhIEBIV0dhcmFnZUNhcmRWMi5ORlQKICAgICAgICAgICAgbGV0IEhXR2FyYWdlQ2FyZFYyVVVJRDogVUludDY0ID0gSFdHYXJhZ2VDYXJkVjIudXVpZAogICAgICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkVjJTZXJpZXNJZDogVUludDY0ID0gSFdHYXJhZ2VDYXJkVjIucGFja1Nlcmllc0lECiAgICAgICAgICAgIGxldCBIV0dhcmFnZUNhcmRWMklEOiBVSW50NjQgPSBIV0dhcmFnZUNhcmRWMi5pZAogICAgICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkVjJjYXJkRWRpdGlvbklEOiBVSW50NjQgPSBIV0dhcmFnZUNhcmRWMi5jYXJkRWRpdGlvbklECgogICAgICAgICAgICBzZWxmLm93bmVkTkZUc1tIV0dhcmFnZUNhcmRWMklEXSA8LSEgSFdHYXJhZ2VDYXJkVjIKCiAgICAgICAgICAgIGVtaXQgRGVwb3NpdCgKICAgICAgICAgICAgICAgIGlkOiBIV0dhcmFnZUNhcmRWMklELAogICAgICAgICAgICAgICAgdG86IHNlbGYub3duZXI/LmFkZHJlc3MKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgCiAgICAgICAgICAgIGVtaXQgRGVwb3NpdEV2ZW50KAogICAgICAgICAgICAgICAgdXVpZDogSFdHYXJhZ2VDYXJkVjJVVUlELAogICAgICAgICAgICAgICAgaWQ6IEhXR2FyYWdlQ2FyZFYySUQsCiAgICAgICAgICAgICAgICBzZXJpZXNJZDogSFdHYXJhZ2VDYXJkVjJTZXJpZXNJZCwKICAgICAgICAgICAgICAgIGVkaXRpb25JZDogSFdHYXJhZ2VDYXJkVjJjYXJkRWRpdGlvbklELAogICAgICAgICAgICAgICAgdG86IHNlbGYub3duZXI/LmFkZHJlc3MKICAgICAgICAgICAgICAgICkKICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldElEcygpOiBbVUludDY0XSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmLm93bmVkTkZUcy5rZXlzCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBib3Jyb3dORlQoXyBpZDogVUludDY0KTogJntOb25GdW5naWJsZVRva2VuLk5GVH0/IHsKICAgICAgICAgICAgcmV0dXJuICgmc2VsZi5vd25lZE5GVHNbaWRdKQogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gYm9ycm93Q2FyZChpZDogVUludDY0KTogJk5GVD8gewogICAgICAgICAgICBpZiBsZXQgY2FyZFJlZjogJntOb25GdW5naWJsZVRva2VuLk5GVH0gPSAmc2VsZi5vd25lZE5GVHNbaWRdIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYXJkUmVmIGFzISAmTkZUCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmlsCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGJvcnJvd1ZpZXdSZXNvbHZlcihpZDogVUludDY0KTogJntWaWV3UmVzb2x2ZXIuUmVzb2x2ZXJ9PyB7CiAgICAgICAgICAgIGlmIGxldCBuZnRSZWY6ICZ7Tm9uRnVuZ2libGVUb2tlbi5ORlR9ID0gJnNlbGYub3duZWRORlRzW2lkXSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmZ0UmVmIGFzICZ7Vmlld1Jlc29sdmVyLlJlc29sdmVyfQogICAgICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5pbAogICAgICAgIH0KCiAgICAgICAgLy8vIEFsbG93cyBhIGdpdmVuIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdAogICAgICAgIC8vLyBvZiBvd25lZCBORlQgSURzIGluIGEgY29sbGVjdGlvbiB3aXRob3V0IGZpcnN0CiAgICAgICAgLy8vIGhhdmluZyB0byBsb2FkIHRoZSBlbnRpcmUgbGlzdCBpbnRvIG1lbW9yeQogICAgICAgIGFjY2VzcyhhbGwpIGZ1biBmb3JFYWNoSUQoXyBmOiBmdW4oVUludDY0KTogQm9vbCkgewogICAgICAgICAgICBzZWxmLm93bmVkTkZUcy5mb3JFYWNoS2V5KGYpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGFjY2VzcyhhbGwpIGZ1biBjcmVhdGVFbXB0eUNvbGxlY3Rpb24oKTogQHtOb25GdW5naWJsZVRva2VuLkNvbGxlY3Rpb259IHsKICAgICAgICAgICAgcmV0dXJuIDwtIEhXR2FyYWdlQ2FyZFYyLmNyZWF0ZUVtcHR5Q29sbGVjdGlvbihuZnRUeXBlOiBUeXBlPEBIV0dhcmFnZUNhcmRWMi5ORlQ+KCkpCiAgICAgICAgfQogICAgfQoKCiAgICAvKiAKICAgICogICBQdWJsaWMgRnVuY3Rpb25zCiAgICAqLwoKICAgIGFjY2VzcyhhbGwpIGZ1biBjcmVhdGVFbXB0eUNvbGxlY3Rpb24obmZ0VHlwZTogVHlwZSk6IEB7Tm9uRnVuZ2libGVUb2tlbi5Db2xsZWN0aW9ufSB7CiAgICAgICAgICAgIHJldHVybiA8LSBjcmVhdGUgQ29sbGVjdGlvbigpCiAgICAgICAgfQoKICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldFRvdGFsU3VwcGx5KCk6IFVJbnQ2NCB7CiAgICAgICAgcmV0dXJuIHNlbGYudG90YWxTdXBwbHkKICAgIH0KCiAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXROYW1lKCk6IFN0cmluZyB7CiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQogICAgfQogICAgCiAgICBhY2Nlc3MoYWxsKSBmdW4gdHJhbnNmZXIodXVpZDogVUludDY0LCBpZDogVUludDY0LCBwYWNrU2VyaWVzSWQ6IFVJbnQ2NCwgY2FyZEVkaXRpb25JZDogVUludDY0LCB0b0FkZHJlc3M6IEFkZHJlc3MpewoKICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkVjJVVUlEOiBVSW50NjQgPSB1dWlkCiAgICAgICAgbGV0IEhXR2FyYWdlQ2FyZFYyU2VyaWVzSWQ6IFVJbnQ2NCA9IHBhY2tTZXJpZXNJZAogICAgICAgIGxldCBIV0dhcmFnZUNhcmRWMklEOiBVSW50NjQgPSBpZAogICAgICAgIGxldCBIV0dhcmFnZUNhcmRWMmNhcmRFZGl0aW9uSUQ6IFVJbnQ2NCA9IGNhcmRFZGl0aW9uSWQKCiAgICAgICAgZW1pdCBUcmFuc2ZlckV2ZW50KAogICAgICAgICAgICB1dWlkOiBIV0dhcmFnZUNhcmRWMlVVSUQKICAgICAgICAgICAgLCBpZDogSFdHYXJhZ2VDYXJkVjJJRAogICAgICAgICAgICAsIHNlcmllc0lkOiBIV0dhcmFnZUNhcmRWMlNlcmllc0lkCiAgICAgICAgICAgICwgZWRpdGlvbklkOiBIV0dhcmFnZUNhcmRWMmNhcmRFZGl0aW9uSUQKICAgICAgICAgICAgLCB0bzogdG9BZGRyZXNzKQogICAgfQogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0Q29udHJhY3RWaWV3cyhyZXNvdXJjZVR5cGU6IFR5cGU/KTogW1R5cGVdIHsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCkKICAgICAgICAgICAgXQogICAgICAgIH0KCiAgICBhY2Nlc3MoYWxsKSBmdW4gcmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU/LCB2aWV3VHlwZTogVHlwZSk6IEFueVN0cnVjdD8gewogICAgICAgIHN3aXRjaCB2aWV3VHlwZSB7CiAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EYXRhPigpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EYXRhKAogICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlUGF0aDogSFdHYXJhZ2VDYXJkVjIuQ29sbGVjdGlvblN0b3JhZ2VQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNQYXRoOiBIV0dhcmFnZUNhcmRWMi5Db2xsZWN0aW9uUHVibGljUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljQ29sbGVjdGlvbjogVHlwZTwmSFdHYXJhZ2VDYXJkVjIuQ29sbGVjdGlvbj4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljTGlua2VkVHlwZTogVHlwZTwmSFdHYXJhZ2VDYXJkVjIuQ29sbGVjdGlvbj4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRW1wdHlDb2xsZWN0aW9uRnVuY3Rpb246IChmdW4oKTogQHtOb25GdW5naWJsZVRva2VuLkNvbGxlY3Rpb259IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8LSBIV0dhcmFnZUNhcmRWMi5jcmVhdGVFbXB0eUNvbGxlY3Rpb24obmZ0VHlwZTogVHlwZTxASFdHYXJhZ2VDYXJkVjIuTkZUPigpKX0pCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAKICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXk+KCk6CiAgICAgICAgICAgICAgICAgICAgbGV0IGV4dGVybmFsVVJMID0gTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgKICAgICAgICAgICAgICAgICAgICAgICAgIiIKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICAgICBsZXQgc3F1YXJlSW1hZ2UgPSBNZXRhZGF0YVZpZXdzLk1lZGlhKAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBNZXRhZGF0YVZpZXdzLkhUVFBGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiAiaW1hZ2UvcG5nIikKCiAgICAgICAgICAgICAgICAgICAgbGV0IGJhbm5lckltYWdlID0gTWV0YWRhdGFWaWV3cy5NZWRpYSgKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogTWV0YWRhdGFWaWV3cy5IVFRQRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogIiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogImltYWdlL3BuZyIpCgogICAgICAgICAgICAgICAgICAgIGxldCBzb2NpYWxNYXA6IHtTdHJpbmc6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkx9ID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9ob3R3aGVlbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFncmFtIjogTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL2hvdHdoZWVsc29mZmljaWFsLyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3R3aXR0ZXIuY29tL0hvdF9XaGVlbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAiZGlzY29yZCI6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly9kaXNjb3JkLmdnL21hdHRlbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXkoCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJIb3QgV2hlZWxzIEdhcmFnZSBDYXJkIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICJEaWdpdGFsIENvbGxlY3RhYmxlIGZyb20gSG90IFdoZWVscyBHYXJhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFVSTDogZXh0ZXJuYWxVUkwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNxdWFyZUltYWdlOiBzcXVhcmVJbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgYmFubmVySW1hZ2U6IGJhbm5lckltYWdlLAogICAgICAgICAgICAgICAgICAgICAgICBzb2NpYWxzOiBzb2NpYWxNYXAKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVmlld3MuUm95YWx0aWVzKFtdKQogICAgICAgIH0KICAgICAgICByZXR1cm4gbmlsCiAgICB9CgogICAgLyoKICAgICogICBBZG1pbiBGdW5jdGlvbnMKICAgICovCiAgICBhY2Nlc3MoYWNjb3VudCkgZnVuIGFkZE5ld1NlcmllcyhuZXdDYXJkU2VyaWVzSUQ6IFVJbnQ2NCl7CiAgICAgICAgc2VsZi5jdXJyZW50Q2FyZEVkaXRpb25JZEJ5UGFja1Nlcmllc0lkLmluc2VydChrZXk6IG5ld0NhcmRTZXJpZXNJRCwgMCkKICAgIH0KCgogICAgYWNjZXNzKGFjY291bnQpIGZ1biB1cGRhdGVDdXJyZW50RWRpdGlvbklkQnlQYWNrU2VyaWVzSWQocGFja1Nlcmllc0lEOiBVSW50NjQsIGNhcmRTZXJpZXNFZGl0aW9uOiBVSW50NjQpewogICAgICAgIHNlbGYuY3VycmVudENhcmRFZGl0aW9uSWRCeVBhY2tTZXJpZXNJZFtwYWNrU2VyaWVzSURdID0gY2FyZFNlcmllc0VkaXRpb24KICAgIH0KCgogICAgYWNjZXNzKGFjY291bnQpIGZ1biBtaW50KAogICAgICAgIG5mdElEOiBVSW50NjQKICAgICAgICAsIHBhY2tTZXJpZXNJRDogVUludDY0CiAgICAgICAgLCBjYXJkRWRpdGlvbklEOiBVSW50NjQKICAgICAgICAsIHBhY2tIYXNoOiBTdHJpbmcKICAgICAgICAsIHJlZGVlbWFibGU6IFN0cmluZwogICAgICAgICwgbWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30KICAgICAgICApOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSB7CgogICAgICAgIHNlbGYudG90YWxTdXBwbHkgPSBzZWxmLmdldFRvdGFsU3VwcGx5KCkgKyAxCgogICAgICAgIHNlbGYuY3VycmVudENhcmRFZGl0aW9uSWRCeVBhY2tTZXJpZXNJZFtwYWNrU2VyaWVzSURdID0gc2VsZi5jdXJyZW50Q2FyZEVkaXRpb25JZEJ5UGFja1Nlcmllc0lkW3BhY2tTZXJpZXNJRF0hICsgMQoKICAgICAgICByZXR1cm4gPC0gY3JlYXRlIE5GVCgKICAgICAgICAgICAgaWQ6IG5mdElECiAgICAgICAgICAgICwgcGFja1Nlcmllc0lEOiBwYWNrU2VyaWVzSUQKICAgICAgICAgICAgLCBjYXJkRWRpdGlvbklEOiBzZWxmLmN1cnJlbnRDYXJkRWRpdGlvbklkQnlQYWNrU2VyaWVzSWRbcGFja1Nlcmllc0lEXSEKICAgICAgICAgICAgLCBwYWNrSGFzaDogcGFja0hhc2gKICAgICAgICAgICAgLCByZWRlZW1hYmxlOiByZWRlZW1hYmxlCiAgICAgICAgICAgICwgbWV0YWRhdGE6IG1ldGFkYXRhCiAgICAgICAgICAgICkKICAgIH0KCiAgICAvLyBpbml0aWFsaXplIGNvbnRyYWN0IHN0YXRlIHZhcmlhYmxlcwogICAgaW5pdCgpewogICAgICAgIHNlbGYubmFtZSA9ICJIb3QgV2hlZWxzIEdhcmFnZSBDYXJkIHYyIgogICAgICAgIHNlbGYudG90YWxTdXBwbHkgPSAwCiAgICAgICAgc2VsZi5jdXJyZW50Q2FyZEVkaXRpb25JZEJ5UGFja1Nlcmllc0lkID0gezEgOiAwfQoKICAgICAgICAvLyBzZXQgdGhlIG5hbWVkIHBhdGhzCiAgICAgICAgc2VsZi5Db2xsZWN0aW9uU3RvcmFnZVBhdGggPSAvc3RvcmFnZS9IV0dhcmFnZUNhcmRWMkNvbGxlY3Rpb24KICAgICAgICBzZWxmLkNvbGxlY3Rpb25QdWJsaWNQYXRoID0gL3B1YmxpYy9IV0dhcmFnZUNhcmRWMkNvbGxlY3Rpb24KCiAgICAgICAgLy8gY3JlYXRlIGEgY29sbGVjdGlvbiByZXNvdXJjZSBhbmQgc2F2ZSBpdCB0byBzdG9yYWdlCiAgICAgICAgbGV0IGNvbGxlY3Rpb246IEBIV0dhcmFnZUNhcmRWMi5Db2xsZWN0aW9uIDwtIGNyZWF0ZSBDb2xsZWN0aW9uKCkKICAgICAgICBzZWxmLmFjY291bnQuc3RvcmFnZS5zYXZlKDwtY29sbGVjdGlvbiwgdG86IHNlbGYuQ29sbGVjdGlvblN0b3JhZ2VQYXRoKQoKICAgICAgICBsZXQgY29sbGVjdGlvbkNhcCA9IHNlbGYuYWNjb3VudC5jYXBhYmlsaXRpZXMuc3RvcmFnZS5pc3N1ZTwmSFdHYXJhZ2VDYXJkVjIuQ29sbGVjdGlvbj4oc2VsZi5Db2xsZWN0aW9uU3RvcmFnZVBhdGgpCiAgICAgICAgc2VsZi5hY2NvdW50LmNhcGFiaWxpdGllcy5wdWJsaXNoKGNvbGxlY3Rpb25DYXAsIGF0OiBzZWxmLkNvbGxlY3Rpb25QdWJsaWNQYXRoKQoKICAgICAgICBlbWl0IENvbnRyYWN0SW5pdGlhbGl6ZWQoKQogICAgfQoKCn0KIA==",
		"HWGaragePM": "LyogDQoqICAgQSBjb250cmFjdCB0aGF0IG1hbmFnZXMgdGhlIGNyZWF0aW9uIGFuZCBzYWxlIG9mIHBhY2tzIGFuZCB0b2tlbnMNCioNCiogICBBIG1hbmFnZXIgcmVzb3VyY2UgZXhpc3RzIGFsbG93IG1vZGlmeWluZyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgcHVibGljDQoqICAgc2FsZSBhbmQgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtaW50IGVkaXRpb25zIHRoZW1zZWx2ZXMNCiovDQoNCmltcG9ydCBOb25GdW5naWJsZVRva2VuIGZyb20gMHgxZDdlNTdhYTU1ODE3NDQ4DQppbXBvcnQgRnVuZ2libGVUb2tlbiBmcm9tIDB4ZjIzM2RjZWU4OGZlMGFiZQ0KaW1wb3J0IEZsb3dUb2tlbiBmcm9tIDB4MTY1NDY1MzM5OTA0MGE2MQ0KaW1wb3J0IEhXR2FyYWdlQ2FyZCBmcm9tIDB4ZDBiY2VmZGYxZTY3ZWE4NQ0KaW1wb3J0IEhXR2FyYWdlUGFjayBmcm9tIDB4ZDBiY2VmZGYxZTY3ZWE4NQ0KDQoNCmFjY2VzcyhhbGwpIGNvbnRyYWN0IEhXR2FyYWdlUE0gew0KICAgIC8qIA0KICAgICogICBFdmVudHMNCiAgICAqDQogICAgKiAgIGVtaXR0ZWQgd2hlbiB0aGUgY29udHJhY3QgaXMgZGVwbG95ZWQNCiAgICAqLw0KICAgIGFjY2VzcyhhbGwpIGV2ZW50IENvbnRyYWN0SW5pdGlhbGl6ZWQoKQ0KDQogICAgLyogDQogICAgKiAgIEhXR2FyYWdlQ2FyZA0KICAgICoNCiAgICAqICAgZW1taXRlZCB3aGVuIGFuIGFkbWluIGhhcyBpbml0aWF0ZWQgYSBtaW50IG9mIGEgSFdHYXJhZ2VDYXJkDQogICAgKi8NCiAgICBhY2Nlc3MoYWxsKSBldmVudCBBZG1pbk1pbnRIV0dhcmFnZUNhcmQoaWQ6IFVJbnQ2NCkNCiAgICAvLyBlbW1pdGVkIHdoZW4gdGhlIG1ldGFkYXRhIGZvciBhbiBIV0dhcmFnZUNhcmQgY29sbGVjdGlvbiBpcyB1cGRhdGVkDQogICAgYWNjZXNzKGFsbCkgZXZlbnQgVXBkYXRlSFdHYXJhZ2VDYXJkQ29sbGVjdGlvbk1ldGFkYXRhKCkNCiAgICAvLyBlbW1pdGVkIHdoZW4gYW4gZWRpdGlvbiB3aXRoaW4gSFdHYXJhZ2VDYXJkIGhhcyBoYWQgaXQncyBtZXRkYXRhIHVwZGF0ZWQNCiAgICBhY2Nlc3MoYWxsKSBldmVudCBVcGRhdGVUb2tlbkVkaXRpb25NZXRhZGF0YShpZDogVUludDY0LCBtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfSwgcGFja0hhc2g6IFN0cmluZywgYWRkcmVzczogQWRkcmVzcykNCg0KICAgIC8qIA0KICAgICogICBIV0dhcmFnZVBhY2sNCiAgICAqDQogICAgKiAgIGVtaXR0ZWQgd2hlbiBhbiBhZG1pbiBoYXMgaW5pdGlhdGVkIGEgbWludCBvZiBhIEhXR2FyYWdlQ2FyZA0KICAgICovDQogICAgYWNjZXNzKGFsbCkgZXZlbnQgQWRtaW5NaW50UGFjayhpZDogVUludDY0LCBwYWNrSGFzaDogU3RyaW5nKQ0KICAgIC8vIGVtaXR0ZWQgd2hlbiBzb21lb25lIHJlZGVlbXMgYSBIV0dhcmFnZVBhY2sgZm9yIENhcmRzDQogICAgYWNjZXNzKGFsbCkgZXZlbnQgUmVkZWVtUGFjayhpZDogVUludDY0LCBwYWNrSUQ6IFVJbnQ2NCwgcGFja0VkaXRpb25JRDogVUludDY0LCBhZGRyZXNzOiBBZGRyZXNzLCBwYWNrSGFzaDogU3RyaW5nKQ0KICAgIC8vIGVtaXR0ZWQgd2hlbiBQYWNrIGhhcyBtZXRhZGF0YSB1cGRhdGVkDQogICAgYWNjZXNzKGFsbCkgZXZlbnQgVXBkYXRlUGFja0NvbGxlY3Rpb25NZXRhZGF0YSgpDQogICAgLy8gZW1pdHRlZCB3aGVuIFBhY2tFZGl0aW9uIHVwZGF0ZXMgbWV0YWRhdGENCiAgICBhY2Nlc3MoYWxsKSBldmVudCBVcGRhdGVQYWNrRWRpdGlvbk1ldGFkYXRhKGlkOiBVSW50NjQsIG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9KQ0KICAgIC8vIGVtaXR0ZWQgd2hlbiBhbnkgaW5mb3JtYXRpb24gYWJvdXQgcmVkZW1wdGlvbiBoYXMgYmVlbiBtb2RpZmllZA0KICAgIGFjY2VzcyhhbGwpIGV2ZW50IFVwZGF0ZUhXR2FyYWdlUGFja1JlZGVlbUluZm8ocmVkZWVtU3RhcnRUaW1lOiBVRml4NjQpDQogICAgLy8gZW1pdHRlZCB3aGVuIGEgdXNlciBzdWJtaXRzIGEgcGFja0hhc2ggdG8gY2xhaW0gYSBwYWNrDQogICAgYWNjZXNzKGFsbCkgZXZlbnQgUGFja0NsYWltQmVnaW4oYWRkcmVzczogQWRkcmVzcywgcGFja0hhc2g6IFN0cmluZykNCiAgICAvLyBlbWl0dGVkIHdoZW4gYSB1c2VyIHN1Y2Nlc2Z1bGx5IGNsYWltcyBhIHBhY2sNCiAgICBhY2Nlc3MoYWxsKSBldmVudCBQYWNrQ2xhaW1TdWNjZXNzKGFkZHJlc3M6IEFkZHJlc3MsIHBhY2tIYXNoOiBTdHJpbmcsIHBhY2tJRDogVUludDY0KQ0KICAgIA0KICAgIC8qDQogICAgKiAgIEhXR2FyYWdlQWlyZHJvcA0KICAgICoNCiAgICAqICAgZW1pdHRlZCB3aGVuIGFuIGFkbWluIGhhcyBpbml0aWF0ZXMgYW4gYWlyZHJvcCB0byBhIHdhbGxldA0KICAgICAqLw0KICAgIC8vIFYyIGlzIGRlcHJhY2F0ZWQNCiAgICBhY2Nlc3MoYWxsKSBldmVudCBBaXJkcm9wUmVkZWVtYWJsZVYyKGlkOlVJbnQ2NCwgYWRkcmVzczogQWRkcmVzcykNCiAgICANCiAgICBhY2Nlc3MoYWxsKSBldmVudCBBaXJkcm9wUmVkZWVtYWJsZSgNCiAgICAgICAgV2FsbGV0QWRkcmVzczogQWRkcmVzcw0KICAgICAgICAsIFRva2VuSUQ6VUludDY0DQogICAgICAgICwgVG9rZW5NaW50SUQ6IFVJbnQ2NA0KICAgICAgICAsIE9yaWdpbmFsQ2FyZFNlcmlhbDogU3RyaW5nDQogICAgICAgICwgVG9rZW5TZXJpYWw6IFN0cmluZw0KICAgICAgICAsIFNlcmllc05hbWU6IFN0cmluZw0KICAgICAgICAsIE5hbWU6IFN0cmluZw0KICAgICAgICAsIFRva2VuSW1hZ2VIYXNoOiBTdHJpbmcNCiAgICAgICAgLCBUb2tlblJlbGVhc2VEYXRlOiBTdHJpbmcNCiAgICAgICAgLCBUb2tlbkV4cGlyZURhdGU6IFN0cmluZw0KICAgICAgICAsIENhcmRJRDogVUludDY0DQogICAgICAgICwgVGVtcGxhdGVJRDogU3RyaW5nDQogICAgICAgICkNCg0KICAgIC8vICBlbWl0dGVkIHdoZW4gYSB1c2VyIGluaXRpYXRlcyBhIGJ1cm4gb24gcmVkZWVtYWJsZSBhaXJkcm9wDQogICAgYWNjZXNzKGFsbCkgZXZlbnQgQWlyZHJvcEJ1cm4oDQogICAgICAgIFdhbGxldEFkZHJlc3M6IEFkZHJlc3MNCiAgICAgICAgLCBUb2tlblNlcmlhbDogU3RyaW5nDQogICAgICAgICwgQWlyZHJvcEVkaXRpb25JZDogVUludDY0DQogICAgICAgICkNCg0KICAgIC8qIA0KICAgICogICBOYW1lZCBQYXRocw0KICAgICovDQogICAgYWNjZXNzKGFsbCkgbGV0IE1hbmFnZXJTdG9yYWdlUGF0aDogU3RvcmFnZVBhdGgNCg0KICAgIC8qIA0KICAgICogICBIV0dhcmFnZVBNIGZpZWxkcw0KICAgICovDQogICAgLyogDQogICAgKiAgIEhXR2FyYWdlQ2FyZA0KICAgICovDQogICAgYWNjZXNzKHNlbGYpIGxldCBIV0dhcmFnZUNhcmRzTWludGVkRWRpdGlvbnM6IHsgVUludDY0OiBCb29sfQ0KICAgIGFjY2VzcyhzZWxmKSB2YXIgSFdHYXJhZ2VDYXJkc1NlcXVlbnRpYWxNaW50TWluOiBVSW50NjQNCiAgICBhY2Nlc3MoYWxsKSB2YXIgSFdHYXJhZ2VDYXJkc1RvdGFsU3VwcGx5OiBVSW50NjQNCiAgICAvKiANCiAgICAqICAgSFdHYXJhZ2VQYWNrDQogICAgKi8NCiAgICBhY2Nlc3Moc2VsZikgbGV0IHBhY2tzTWludGVkRWRpdGlvbnM6IHtVSW50NjQ6IEJvb2x9DQogICAgYWNjZXNzKHNlbGYpIGxldCBwYWNrc0J5UGFja0lkTWludGVkRWRpdGlvbnM6IHtVSW50NjQ6IHtVSW50NjQ6Qm9vbH19DQogICAgYWNjZXNzKHNlbGYpIHZhciBwYWNrc1NlcXVlbnRpYWxNaW50TWluOiBVSW50NjQNCiAgICBhY2Nlc3Moc2VsZikgdmFyIHBhY2tzQnlQYWNrSWRTZXF1ZW50aWFsTWludE1pbjoge1VJbnQ2NDogVUludDY0fQ0KICAgIGFjY2VzcyhhbGwpIHZhciBwYWNrVG90YWxTdXBwbHk6IFVJbnQ2NA0KICAgIGFjY2VzcyhhbGwpIHZhciBwYWNrUmVkZWVtU3RhcnRUaW1lOiBVRml4NjQNCg0KICAgIGFjY2VzcyhhbGwpIGVudGl0bGVtZW50IFVwZGF0ZU1ldGFkYXRhDQogICAgYWNjZXNzKGFsbCkgZW50aXRsZW1lbnQgTWludFJlc291cmNlDQogICAgYWNjZXNzKGFsbCkgZW50aXRsZW1lbnQgVXBkYXRlU3RhcnRUaW1lDQoNCiAgICAvKiANCiAgICAqICAgTWFuYWdlciByZXNvdXJjZSBmb3IgYWxsIE5GVHMNCiAgICAqLw0KICAgIGFjY2VzcyhhbGwpIHJlc291cmNlIE1hbmFnZXIgeyAvLyBGbG93VG9rZW4gZm9sbG93cyBzaW1pbGFyIHBhdHRlcm4NCiAgICAgICAgLyogDQogICAgICAgICogICBIV0dhcmFnZUNhcmQNCiAgICAgICAgKi8NCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIHVwZGF0ZUhXR2FyYWdlQ2FyZEVkaXRpb25NZXRhZGF0YShlZGl0aW9uTnVtYmVyOiBVSW50NjQsIG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9LCBwYWNrSGFzaDogU3RyaW5nLCBhZGRyZXNzOiBBZGRyZXNzKSB7DQogICAgICAgICAgICBIV0dhcmFnZUNhcmQuc2V0RWRpdGlvbk1ldGFkYXRhKGVkaXRpb25OdW1iZXI6IGVkaXRpb25OdW1iZXIsIG1ldGFkYXRhOiBtZXRhZGF0YSkNCiAgICAgICAgICAgIGVtaXQgVXBkYXRlVG9rZW5FZGl0aW9uTWV0YWRhdGEoaWQ6IGVkaXRpb25OdW1iZXIsIG1ldGFkYXRhOiBtZXRhZGF0YSwgcGFja0hhc2g6IHBhY2tIYXNoLCBhZGRyZXNzOiBhZGRyZXNzKQ0KICAgICAgICB9DQoNCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIHVwZGF0ZUhXR2FyYWdlQ2FyZENvbGxlY3Rpb25NZXRhZGF0YShtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfSkgew0KICAgICAgICAgICAgSFdHYXJhZ2VDYXJkLnNldENvbGxlY3Rpb25NZXRhZGF0YShtZXRhZGF0YTogbWV0YWRhdGEpDQogICAgICAgICAgICBlbWl0IFVwZGF0ZUhXR2FyYWdlQ2FyZENvbGxlY3Rpb25NZXRhZGF0YSgpDQogICAgICAgIH0NCg0KICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gbWludEhXR2FyYWdlQ2FyZEF0RWRpdGlvbihlZGl0aW9uOiBVSW50NjQsIHBhY2tJRDogVUludDY0KTogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gew0KICAgICAgICAgICAgZW1pdCBBZG1pbk1pbnRIV0dhcmFnZUNhcmQoaWQ6IGVkaXRpb24pDQogICAgICAgICAgICByZXR1cm4gPC1IV0dhcmFnZVBNLm1pbnRIV0dhcmFnZUNhcmQoZWRpdGlvbjogZWRpdGlvbiwgcGFja0lEOiBwYWNrSUQpDQogICAgICAgIH0NCg0KICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gbWludFNlcXVlbnRpYWxIV0dhcmFnZUNhcmQocGFja0lEOiBVSW50NjQpOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSB7DQogICAgICAgICAgICBsZXQgSFdHYXJhZ2VDYXJkIDwtIEhXR2FyYWdlUE0ubWludFNlcXVlbnRpYWxIV0dhcmFnZUNhcmQocGFja0lEOiBwYWNrSUQpDQogICAgICAgICAgICBlbWl0IEFkbWluTWludEhXR2FyYWdlQ2FyZChpZDogSFdHYXJhZ2VDYXJkLmlkKQ0KICAgICAgICAgICAgcmV0dXJuIDwtIEhXR2FyYWdlQ2FyZA0KICAgICAgICB9DQoNCiAgICAgICAgLyogDQogICAgICAgICogICBIV0dhcmFnZVBhY2sNCiAgICAgICAgKi8NCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIHVwZGF0ZVBhY2tFZGl0aW9uTWV0YWRhdGEoZWRpdGlvbk51bWJlcjogVUludDY0LCBtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfSkgew0KICAgICAgICAgICAgSFdHYXJhZ2VQYWNrLnNldEVkaXRpb25NZXRhZGF0YShlZGl0aW9uTnVtYmVyOiBlZGl0aW9uTnVtYmVyLCBtZXRhZGF0YTogbWV0YWRhdGEpDQogICAgICAgICAgICBlbWl0IFVwZGF0ZVBhY2tFZGl0aW9uTWV0YWRhdGEoaWQ6IGVkaXRpb25OdW1iZXIsIG1ldGFkYXRhOiBtZXRhZGF0YSkNCiAgICAgICAgfQ0KDQogICAgICAgIGFjY2VzcyhhbGwpIGZ1biB1cGRhdGVQYWNrQ29sbGVjdGlvbk1ldGFkYXRhKG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9KSB7DQogICAgICAgICAgICBIV0dhcmFnZVBhY2suc2V0Q29sbGVjdGlvbk1ldGFkYXRhKG1ldGFkYXRhOiBtZXRhZGF0YSkNCiAgICAgICAgICAgIGVtaXQgVXBkYXRlUGFja0NvbGxlY3Rpb25NZXRhZGF0YSgpDQogICAgICAgIH0NCg0KICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gbWludFBhY2tBdEVkaXRpb24oZWRpdGlvbjogVUludDY0LCBwYWNrSUQ6IFVJbnQ2NCwgcGFja0VkaXRpb25JRDogVUludDY0LCBhZGRyZXNzOiBBZGRyZXNzLCBwYWNrSGFzaDogU3RyaW5nKTogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gew0KICAgICAgICAgICAgZW1pdCBBZG1pbk1pbnRIV0dhcmFnZUNhcmQoaWQ6IGVkaXRpb24pDQogICAgICAgICAgICBlbWl0IFBhY2tDbGFpbVN1Y2Nlc3MoYWRkcmVzczogYWRkcmVzcywgcGFja0hhc2g6IHBhY2tIYXNoLCBwYWNrSUQ6IHBhY2tJRCkNCiAgICAgICAgICAgIHJldHVybiA8LUhXR2FyYWdlUE0ubWludFBhY2tBdEVkaXRpb24oZWRpdGlvbjogZWRpdGlvbiwgcGFja0lEOiBwYWNrSUQsIHBhY2tFZGl0aW9uSUQ6IHBhY2tFZGl0aW9uSUQsIHBhY2tIYXNoOiBwYWNrSGFzaCkNCiAgICAgICAgfQ0KDQogICAgICAgIGFjY2VzcyhhbGwpIGZ1biBtaW50U2VxdWVudGlhbEhXR2FyYWdlUGFjayhwYWNrSUQ6IFVJbnQ2NCwgYWRkcmVzczogQWRkcmVzcywgcGFja0hhc2g6IFN0cmluZyk6IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9IHsNCiAgICAgICAgICAgIGxldCBIV0dhcmFnZUNhcmQgPC0gSFdHYXJhZ2VQTS5taW50U2VxdWVudGlhbFBhY2socGFja0lEOiBwYWNrSUQsIHBhY2tIYXNoOiBwYWNrSGFzaCkNCiAgICAgICAgICAgIGVtaXQgQWRtaW5NaW50UGFjayhpZDogSFdHYXJhZ2VDYXJkLmlkLCBwYWNrSGFzaDogcGFja0hhc2gpDQogICAgICAgICAgICBlbWl0IFBhY2tDbGFpbVN1Y2Nlc3MoYWRkcmVzczogYWRkcmVzcywgcGFja0hhc2g6IHBhY2tIYXNoLCBwYWNrSUQ6IEhXR2FyYWdlQ2FyZC5pZCkNCiAgICAgICAgICAgIHJldHVybiA8LUhXR2FyYWdlQ2FyZA0KICAgICAgICB9DQoNCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIHVwZGF0ZUhXR2FyYWdlUGFja1JlZGVlbVN0YXJ0VGltZShfIHJlZGVlbVN0YXJ0VGltZTogVUZpeDY0KSB7DQogICAgICAgICAgICBIV0dhcmFnZVBNLnBhY2tSZWRlZW1TdGFydFRpbWUgPSByZWRlZW1TdGFydFRpbWUNCiAgICAgICAgICAgIGVtaXQgVXBkYXRlSFdHYXJhZ2VQYWNrUmVkZWVtSW5mbyhyZWRlZW1TdGFydFRpbWU6IEhXR2FyYWdlUE0ucGFja1JlZGVlbVN0YXJ0VGltZSkNCiAgICAgICAgfQ0KDQogICAgICAgIC8qDQogICAgICAgICogICBIV0dhcmFnZUFpcmRyb3ANCiAgICAgICAgKi8NCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGFpcmRyb3BSZWRlZW1hYmxlKA0KICAgICAgICAgICAgYWlyZHJvcFNlcmllc0lEOiBVSW50NjQNCiAgICAgICAgICAgICwgYWRkcmVzczogQWRkcmVzcw0KICAgICAgICAgICAgLCB0b2tlbk1pbnRJRDogVUludDY0DQogICAgICAgICAgICAsIG9yaWdpbmFsQ2FyZFNlcmlhbDogU3RyaW5nDQogICAgICAgICAgICAsIHRva2VuU2VyaWFsOiBTdHJpbmcNCiAgICAgICAgICAgICwgc2VyaWVzTmFtZTogU3RyaW5nDQogICAgICAgICAgICAsIGNhck5hbWU6IFN0cmluZw0KICAgICAgICAgICAgLCB0b2tlbkltYWdlSGFzaDogU3RyaW5nDQogICAgICAgICAgICAsIHRva2VuUmVsZWFzZURhdGU6IFN0cmluZw0KICAgICAgICAgICAgLCB0b2tlbkV4cGlyZURhdGU6IFN0cmluZw0KICAgICAgICAgICAgLCBjYXJkSUQ6IFVJbnQ2NA0KICAgICAgICAgICAgLCB0ZW1wbGF0ZUlEOiBTdHJpbmcNCiAgICAgICAgICAgICk6IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9IHsNCiAgICAgICAgICAgIGxldCBIV0dhcmFnZUFpcmRyb3AgPC0gSFdHYXJhZ2VQTS5taW50U2VxdWVudGlhbEFpcmRyb3AoDQogICAgICAgICAgICAgICAgYWlyZHJvcElEOiBhaXJkcm9wU2VyaWVzSUQNCiAgICAgICAgICAgICAgICApDQogICAgICAgICAgICBlbWl0IEFpcmRyb3BSZWRlZW1hYmxlKA0KICAgICAgICAgICAgICAgIFdhbGxldEFkZHJlc3M6IGFkZHJlc3MNCiAgICAgICAgICAgICAgICAsIFRva2VuSUQ6SFdHYXJhZ2VBaXJkcm9wLmlkIC8vIHRva2VuRWRpdGlvbklEIA0KICAgICAgICAgICAgICAgICwgVG9rZW5NaW50SUQ6IHRva2VuTWludElEDQogICAgICAgICAgICAgICAgLCBPcmlnaW5hbENhcmRTZXJpYWw6IG9yaWdpbmFsQ2FyZFNlcmlhbA0KICAgICAgICAgICAgICAgICwgVG9rZW5TZXJpYWw6IHRva2VuU2VyaWFsDQogICAgICAgICAgICAgICAgLCBTZXJpZXNOYW1lOiBzZXJpZXNOYW1lDQogICAgICAgICAgICAgICAgLCBOYW1lOiBjYXJOYW1lDQogICAgICAgICAgICAgICAgLCBUb2tlbkltYWdlSGFzaDogdG9rZW5JbWFnZUhhc2gNCiAgICAgICAgICAgICAgICAsIFRva2VuUmVsZWFzZURhdGU6IHRva2VuUmVsZWFzZURhdGUNCiAgICAgICAgICAgICAgICAsIFRva2VuRXhwaXJlRGF0ZTogdG9rZW5FeHBpcmVEYXRlDQogICAgICAgICAgICAgICAgLCBDYXJkSUQ6IGNhcmRJRA0KICAgICAgICAgICAgICAgICwgVGVtcGxhdGVJRDogdGVtcGxhdGVJRA0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgIHJldHVybiA8LUhXR2FyYWdlQWlyZHJvcA0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyogDQogICAgKiAgIEhXR2FyYWdlQ2FyZA0KICAgICoNCiAgICAqICAgTWludCBhIEhXR2FyYWdlQ2FyZA0KICAgICovDQogICAgYWNjZXNzKHNlbGYpIGZ1biBtaW50SFdHYXJhZ2VDYXJkKGVkaXRpb246IFVJbnQ2NCwgcGFja0lEOiBVSW50NjQpOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSB7DQogICAgICAgIHByZSB7DQogICAgICAgICAgICBlZGl0aW9uID49IDE6ICJSZXF1ZXN0ZWQgZWRpdGlvbiBpcyBvdXRpc2RlIHRoZSByZWFsbSBvZiBzcGFjZSBhbmQgdGltZSwgeW91IGp1c3QgbG9zdCB0aGUgZ2FtZS4iDQogICAgICAgICAgICBzZWxmLkhXR2FyYWdlQ2FyZHNNaW50ZWRFZGl0aW9uc1tlZGl0aW9uXSA9PSBuaWwgOiAiUmVxdWVzdGVkIGVkaXRpb24gaGFzIGFscmVhZHkgYmVlbiBtaW50ZWQiDQogICAgICAgIH0NCiAgICAgICAgc2VsZi5IV0dhcmFnZUNhcmRzTWludGVkRWRpdGlvbnNbZWRpdGlvbl0gPSB0cnVlDQoNCiAgICAgICAgbGV0IGh3R2FyYWdlQ2FyZDogQEhXR2FyYWdlQ2FyZC5ORlQgPC0gSFdHYXJhZ2VDYXJkLm1pbnQobmZ0SUQ6IGVkaXRpb24sIHBhY2tJRDogcGFja0lEKQ0KICAgICAgICByZXR1cm4gPC1od0dhcmFnZUNhcmQNCiAgICB9DQoNCiAgICAvLyBsb29rIGZvciB0aGUgbmV4dCBDYXJkIGluIHRoZSBzZXF1ZW5jZSwgYW5kIG1pbnQgdGhlcmUNCiAgICBhY2Nlc3Moc2VsZikgZnVuIG1pbnRTZXF1ZW50aWFsSFdHYXJhZ2VDYXJkKHBhY2tJRDogVUludDY0KTogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gew0KICAgICAgICB2YXIgY3VycmVudEVkaXRpb25OdW1iZXIgPSBIV0dhcmFnZUNhcmQuZ2V0VG90YWxTdXBwbHkoKQ0KICAgICAgICBjdXJyZW50RWRpdGlvbk51bWJlciA9IGN1cnJlbnRFZGl0aW9uTnVtYmVyICsgMQ0KDQogICAgICAgIHNlbGYuSFdHYXJhZ2VDYXJkc1NlcXVlbnRpYWxNaW50TWluID0gY3VycmVudEVkaXRpb25OdW1iZXINCiAgICAgICAgbGV0IGh3R2FyYWdlQ2FyZDogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gPC0gc2VsZi5taW50SFdHYXJhZ2VDYXJkKGVkaXRpb246IGN1cnJlbnRFZGl0aW9uTnVtYmVyLCBwYWNrSUQ6IHBhY2tJRCkNCiAgICAgICAgcmV0dXJuIDwtIGh3R2FyYWdlQ2FyZA0KICAgIH0NCg0KICAgIC8qIA0KICAgICogICBIV0dhcmFnZVBhY2sNCiAgICAqDQogICAgKiAgIE1pbnQgYSBIV0dhcmFnZVBhY2sNCiAgICAqLw0KICAgIGFjY2VzcyhzZWxmKSBmdW4gbWludFBhY2tBdEVkaXRpb24oZWRpdGlvbjogVUludDY0LCBwYWNrSUQ6IFVJbnQ2NCwgcGFja0VkaXRpb25JRDogVUludDY0LCBwYWNrSGFzaDogU3RyaW5nKTogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gew0KICAgICAgICBwcmUgew0KICAgICAgICAgICAgZWRpdGlvbiA+PSAxOiAiUmVxdWVzdGVkIGVkaXRpb24gaXMgb3V0c2lkZSB0aGUgcmVhbG0gb2Ygc3BhY2UgYW5kIHRpbWUsIHlvdSBqdXN0IGxvc3QgdGhlIGdhbWUuIg0KICAgICAgIH0NCg0KICAgICAgICBsZXQgcGFjazogQEhXR2FyYWdlUGFjay5ORlQgPC0gSFdHYXJhZ2VQYWNrLm1pbnQobmZ0SUQ6IGVkaXRpb24sIHBhY2tJRDogcGFja0lELCBwYWNrRWRpdGlvbklEOiBwYWNrRWRpdGlvbklEKQ0KICAgICAgICByZXR1cm4gPC1wYWNrDQogICAgfQ0KDQogICAgLy8gTG9vayBmb3IgdGhlIG5leHQgYXZhaWxhYmxlIHBhY2ssIGFuZCBtaW50IHRoZXJlDQogICAgYWNjZXNzKHNlbGYpIGZ1biBtaW50U2VxdWVudGlhbFBhY2socGFja0lEOiBVSW50NjQsIHBhY2tIYXNoOiBTdHJpbmcpOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSB7DQoNCiAgICAgICAgdmFyIGN1cnJlbnRQYWNrRWRpdGlvbk51bWJlciA9IEhXR2FyYWdlUGFjay5nZXRUb3RhbFN1cHBseSgpICsgMQ0KICAgICAgICBsZXQgbmV3VG9rZW46IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9IDwtIHNlbGYubWludFBhY2tBdEVkaXRpb24oZWRpdGlvbjogVUludDY0KGN1cnJlbnRQYWNrRWRpdGlvbk51bWJlciksIHBhY2tJRDogcGFja0lELCBwYWNrRWRpdGlvbklEOiBVSW50NjQoY3VycmVudFBhY2tFZGl0aW9uTnVtYmVyKSwgcGFja0hhc2g6IHBhY2tIYXNoKQ0KICAgICAgICByZXR1cm4gPC1uZXdUb2tlbg0KICAgIH0NCg0KICAgIC8qIA0KICAgICogICBIV0dhcmFnZUFpcmRyb3ANCiAgICAqDQogICAgKiAgIE1pbnQgYSByZWRlZW1hYmxlIEhXR2FyYWdlQWlyZHJvcCB0b2tlbg0KICAgICovDQogICAgYWNjZXNzKHNlbGYpIGZ1biBtaW50U2VxdWVudGlhbEFpcmRyb3AoYWlyZHJvcElEOiBVSW50NjQpOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSB7DQogICAgICAgIHZhciBjdXJyZW50QWlyZHJvcCA9IEhXR2FyYWdlUGFjay5nZXRUb3RhbFN1cHBseSgpICsgMQ0KICAgICAgICBsZXQgbmV3QWlyZHJvcFRva2VuIDwtIEhXR2FyYWdlUGFjay5taW50KA0KICAgICAgICAgICAgbmZ0SUQ6IGN1cnJlbnRBaXJkcm9wDQogICAgICAgICAgICAsIHBhY2tJRDogYWlyZHJvcElEDQogICAgICAgICAgICAsIHBhY2tFZGl0aW9uSUQ6IGN1cnJlbnRBaXJkcm9wDQogICAgICAgICAgICApDQogICAgICAgIHJldHVybiA8LSBuZXdBaXJkcm9wVG9rZW4NCiAgICB9DQoNCg0KICAgIC8qIA0KICAgICogICBQdWJsaWMgRnVuY3Rpb25zDQogICAgKg0KICAgICogICBIV0dhcmFnZVBhY2sNCiAgICAqLw0KICAgIGFjY2VzcyhhbGwpIGZ1biBjbGFpbVBhY2soYWRkcmVzczogQWRkcmVzcywgcGFja0hhc2g6IFN0cmluZykgew0KICAgICAgICAvLyB0aGlzIGV2ZW50IGlzIHBpY2tlZCB1cCBieSBhIHdlYiBob29rIHRvIHZlcmlmeSBwYWNrSGFzaA0KICAgICAgICAvLyBpZiBwYWNrSGFzaCBpcyB2YWxpZCwgdGhlIGJhY2tlbmQgd2lsbCBtaW50IHRoZSBwYWNrIGFuZA0KICAgICAgICAvLyBkZXBvc2l0IHRvIHRoZSByZWNpcGllbnQgYWRkcmVzcw0KICAgICAgICBlbWl0IFBhY2tDbGFpbUJlZ2luKGFkZHJlc3M6IGFkZHJlc3MsIHBhY2tIYXNoOiBwYWNrSGFzaCkNCiAgICB9DQoNCiAgICBhY2Nlc3MoYWxsKSBmdW4gcHVibGljUmVkZWVtUGFjayhwYWNrOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSwgYWRkcmVzczogQWRkcmVzcywgcGFja0hhc2g6IFN0cmluZykgew0KICAgICAgICBwcmUgew0KICAgICAgICAgICAgZ2V0Q3VycmVudEJsb2NrKCkudGltZXN0YW1wID49IHNlbGYucGFja1JlZGVlbVN0YXJ0VGltZTogIlJlZGVtcHRpb24gaGFzIG5vdCB5ZXQgc3RhcnRlZCINCiAgICAgICAgICAgIHBhY2suaXNJbnN0YW5jZShUeXBlPEBIV0dhcmFnZVBhY2suTkZUPigpKQ0KICAgICAgICB9DQogICAgICAgIGxldCBwYWNrSW5zdGFuY2UgPC0gcGFjayBhcyEgQEhXR2FyYWdlUGFjay5ORlQNCg0KICAgICAgICAvLyBlbWl0IGV2ZW50IHRoYXQgb3VyIGJhY2tlbmQgd2lsbCByZWFkIGFuZCBtaW50IHBhY2sgY29udGVudHMgdG8gdGhlIGFzc29jaWF0ZWQgYWRkcmVzcw0KICAgICAgICBlbWl0IFJlZGVlbVBhY2soaWQ6IHBhY2tJbnN0YW5jZS5pZCwgcGFja0lEOiBwYWNrSW5zdGFuY2UucGFja0lELCBwYWNrRWRpdGlvbklEOiBwYWNrSW5zdGFuY2UucGFja0VkaXRpb25JRCwgYWRkcmVzczogYWRkcmVzcywgcGFja0hhc2g6IHBhY2tIYXNoKQ0KICAgICAgICAvLyBidXJuIHBhY2sgc2luY2UgaXQgd2FzIHJlZGVlbWVkIGZvciBIV0dhcmFnZUNhcmQocykNCiAgICAgICAgZGVzdHJveSBwYWNrSW5zdGFuY2UNCiAgICB9DQoNCg0KICAgIC8vIA0KICAgIGFjY2VzcyhhbGwpIGZ1biBidXJuQWlyZHJvcCgNCiAgICAgICAgd2FsbGV0QWRkcmVzczogQWRkcmVzcw0KICAgICAgICAsIHRva2VuU2VyaWFsOiBTdHJpbmcNCiAgICAgICAgLCBhaXJkcm9wVG9rZW46IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9DQogICAgICAgIA0KICAgICkgew0KICAgICAgICBwcmV7DQogICAgICAgICAgICAvLyBjaGVjayBhaXJkcm9wSWRFZGl0aW9uIGlzIHRoZSBUeXBlDQogICAgICAgICAgICBhaXJkcm9wVG9rZW4uaXNJbnN0YW5jZShUeXBlPEBIV0dhcmFnZVBhY2suTkZUPigpKQ0KICAgICAgICB9DQogICAgICAgIGxldCBhaXJkcm9wSW5zdGFuY2UgPC0gYWlyZHJvcFRva2VuIGFzISBASFdHYXJhZ2VQYWNrLk5GVA0KICAgICAgICAvLyBlbWl0IGV2ZW50IHNpZ25hbGluZyBBaXJkcm9wIGlzIGJ1cm5lZA0KICAgICAgICBlbWl0IEFpcmRyb3BCdXJuKA0KICAgICAgICAgICAgV2FsbGV0QWRkcmVzczogd2FsbGV0QWRkcmVzcw0KICAgICAgICAgICAgLCBUb2tlblNlcmlhbDogdG9rZW5TZXJpYWwNCiAgICAgICAgICAgICwgQWlyZHJvcEVkaXRpb25JZDogYWlyZHJvcEluc3RhbmNlLmlkDQogICAgICAgICAgICApDQogICAgICAgIGRlc3Ryb3kgYWlyZHJvcEluc3RhbmNlDQogICAgfQ0KDQogICAgaW5pdCgpew0KICAgICAgICAvKg0KICAgICAgICAqICAgTm9uLWh1bWFuIG1vZGlmaWFibGUgc3RhdGUgdmFyaWFibGVzDQogICAgICAgICoNCiAgICAgICAgKiAgIEhXR2FyYWdlQ2FyZA0KICAgICAgICAqLw0KICAgICAgICBzZWxmLkhXR2FyYWdlQ2FyZHNUb3RhbFN1cHBseSA9IDANCiAgICAgICAgc2VsZi5IV0dhcmFnZUNhcmRzU2VxdWVudGlhbE1pbnRNaW4gPSAxDQogICAgICAgIC8vIFN0YXJ0IHdpdGggbm8gZXhpc3RpbmcgZWRpdGlvbnMgbWludGVkDQogICAgICAgIHNlbGYuSFdHYXJhZ2VDYXJkc01pbnRlZEVkaXRpb25zID0ge30NCg0KICAgICAgICAvKiANCiAgICAgICAgKiAgIEhXR2FyYWdlUGFjaw0KICAgICAgICAqLw0KICAgICAgICBzZWxmLnBhY2tUb3RhbFN1cHBseSA9IDANCiAgICAgICAgc2VsZi5wYWNrUmVkZWVtU3RhcnRUaW1lID0gMTY1ODM2MTI5MC4wDQogICAgICAgIHNlbGYucGFja3NTZXF1ZW50aWFsTWludE1pbiA9IDENCiAgICAgICAgLy8gc3RhcnQgd2l0aCBubyBleGlzdGluZyBlZGl0aW9ucyBtaW50ZWQNCiAgICAgICAgc2VsZi5wYWNrc01pbnRlZEVkaXRpb25zID0ge30NCiAgICAgICAgLy8gc2V0dXAgd2l0aCBpbml0aWFsIFBhY2tJRA0KICAgICAgICBzZWxmLnBhY2tzQnlQYWNrSWRNaW50ZWRFZGl0aW9ucyA9IHsgMToge319DQogICAgICAgIHNlbGYucGFja3NCeVBhY2tJZFNlcXVlbnRpYWxNaW50TWluID0gezEgOiAxfQ0KDQoNCiAgICAgICAgLy8gbWFuYWdlciByZXNvdXJjZSBpcyBvbmx5IHNhdmVkIHRvIHRoZSBkZXBsb3lpbmcgYWNjb3VudCdzIHN0b3JhZ2UNCiAgICAgICAgc2VsZi5NYW5hZ2VyU3RvcmFnZVBhdGggPSAvc3RvcmFnZS9IV0dhcmFnZVBNDQogICAgICAgIHNlbGYuYWNjb3VudC5zdG9yYWdlLnNhdmUoPC0gY3JlYXRlIE1hbmFnZXIoKSwgdG86IHNlbGYuTWFuYWdlclN0b3JhZ2VQYXRoKQ0KDQogICAgICAgIGVtaXQgQ29udHJhY3RJbml0aWFsaXplZCgpDQogICAgfQ0KfQ0KIA==",
		"HWGaragePMV2": "LyogDQoqICAgQSBjb250cmFjdCB0aGF0IG1hbmFnZXMgdGhlIGNyZWF0aW9uIGFuZCBzYWxlIG9mIHBhY2tzLCBjYXJkcyBhbmQgdG9rZW5zDQoqDQoqLw0KDQppbXBvcnQgTm9uRnVuZ2libGVUb2tlbiBmcm9tIDB4MWQ3ZTU3YWE1NTgxNzQ0OA0KaW1wb3J0IEZ1bmdpYmxlVG9rZW4gZnJvbSAweGYyMzNkY2VlODhmZTBhYmUNCmltcG9ydCBGbG93VG9rZW4gZnJvbSAweDE2NTQ2NTMzOTkwNDBhNjENCmltcG9ydCBIV0dhcmFnZVRva2VuVjIgZnJvbSAweGQwYmNlZmRmMWU2N2VhODUNCmltcG9ydCBIV0dhcmFnZUNhcmRWMiBmcm9tIDB4ZDBiY2VmZGYxZTY3ZWE4NQ0KaW1wb3J0IEhXR2FyYWdlUGFja1YyIGZyb20gMHhkMGJjZWZkZjFlNjdlYTg1DQoNCmFjY2VzcyhhbGwpIGNvbnRyYWN0IEhXR2FyYWdlUE1WMiB7DQogICAgLyogDQogICAgKiAgIEV2ZW50cw0KICAgICoNCiAgICAqICAgZW1pdHRlZCB3aGVuIHRoZSBjb250cmFjdCBpcyBkZXBsb3llZA0KICAgICovDQogICAgYWNjZXNzKGFsbCkgZXZlbnQgQ29udHJhY3RJbml0aWFsaXplZCgpDQoNCiAgICAvKg0KICAgICAqIEhXR2FyYWdlQ2FyZFYyIEFpcmRyb3ANCiAgICAgKi8NCiAgICAvLyBlbWl0dGVkIHdoZW4gYSBuZXcgcGFjayBzZXJpZXMgaXMgYWRkZWQNCiAgICBhY2Nlc3MoYWxsKSBldmVudCBBZG1pbkFkZE5ld1Rva2VuU2VyaWVzKA0KICAgICAgICB0b2tlblNlcmllc0lEOiBVSW50NjQNCiAgICAgICAgKQ0KDQphY2Nlc3MoYWxsKSBldmVudCBBZG1pbk1pbnRUb2tlbigNCiAgICAgICAgdXVpZDogVUludDY0DQogICAgICAgICwgaWQ6IFVJbnQ2NA0KICAgICAgICAsIG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9DQogICAgICAgICkNCiAgICAvLyBlbWl0dGVkIHdoZW4gYW4gYWRtaW4gYWlyZHJvcHMgYSByZWRlZW1hYmxlIGNhcmQgdG8gYW4gYWRkcmVzcw0KICAgIGFjY2VzcyhhbGwpIGV2ZW50IEFpcmRyb3BSZWRlZW1hYmxlKA0KICAgICAgICBXYWxsZXRBZGRyZXNzOiBBZGRyZXNzDQogICAgICAgICwgVG9rZW5JRDpVSW50NjQNCiAgICAgICAgLCBUb2tlbk1pbnRJRDogU3RyaW5nDQogICAgICAgICwgT3JpZ2luYWxDYXJkU2VyaWFsOiBTdHJpbmcNCiAgICAgICAgLCBUb2tlblNlcmlhbDogU3RyaW5nDQogICAgICAgICwgU2VyaWVzTmFtZTogU3RyaW5nDQogICAgICAgICwgTmFtZTogU3RyaW5nDQogICAgICAgICwgVG9rZW5JbWFnZUhhc2g6IFN0cmluZw0KICAgICAgICAsIFRva2VuUmVsZWFzZURhdGU6IFN0cmluZw0KICAgICAgICAsIFRva2VuRXhwaXJlRGF0ZTogU3RyaW5nDQogICAgICAgICwgQ2FyZElEOiBTdHJpbmcNCiAgICAgICAgLCBUZW1wbGF0ZUlEOiBTdHJpbmcNCiAgICAgICAgKQ0KICAgIA0KICAgIC8vIGVtaXR0ZWQgd2hlbiBhIHVzZXIgaW5pdGlhdGVzIGEgYnVybiBvbiBhIHJlZGVlbWFibGUgYWlyZHJvcA0KICAgIGFjY2VzcyhhbGwpIGV2ZW50IEFpcmRyb3BCdXJuKA0KICAgICAgICBXYWxsZXRBZGRyZXNzOiBBZGRyZXNzDQogICAgICAgICwgVG9rZW5TZXJpYWw6IFN0cmluZw0KICAgICAgICAsIEFpcmRyb3BFZGl0aW9uSWQ6IFVJbnQ2NA0KICAgICAgICApDQoNCiAgICAvKiANCiAgICAqICAgSFdHYXJhZ2VDYXJkVjINCiAgICAqDQogICAgKiAgIGVtbWl0ZWQgd2hlbiBhbiBhZG1pbiBoYXMgaW5pdGlhdGVkIGEgbWludCBvZiBhIEhXR2FyYWdlQ2FyZFYyDQogICAgKi8NCiAgICBhY2Nlc3MoYWxsKSBldmVudCBBZG1pbk1pbnRDYXJkKA0KICAgICAgICB1dWlkOiBVSW50NjQNCiAgICAgICAgLCBpZDogVUludDY0DQogICAgICAgICwgbWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30NCiAgICAgICAgLCBwYWNrSGFzaDogU3RyaW5nDQogICAgICAgICwgYWRkcmVzczogQWRkcmVzcw0KICAgICAgICApDQoNCiAgICAvLyBlbWl0dGVkIHdoZW4gYSBuZXcgcGFjayBzZXJpZXMgaXMgYWRkZWQNCiAgICBhY2Nlc3MoYWxsKSBldmVudCBBZG1pbkFkZE5ld0NhcmRTZXJpZXMoDQogICAgICAgIGNhcmRTZXJpZXNJRDogVUludDY0DQogICAgICAgICkNCg0KICAgIC8vIGVtbWl0ZWQgd2hlbiB0aGUgbWV0YWRhdGEgZm9yIGFuIEhXR2FyYWdlQ2FyZFYyIGNvbGxlY3Rpb24gaXMgdXBkYXRlZA0KICAgIGFjY2VzcyhhbGwpIGV2ZW50IFVwZGF0ZUNhcmRDb2xsZWN0aW9uTWV0YWRhdGEoKQ0KDQoNCiAgICAvKiANCiAgICAqICAgSFdHYXJhZ2VQYWNrVjINCiAgICAqDQogICAgKi8NCg0KICAgIC8vIGVtaXR0ZWQgd2hlbiBhIG5ldyBwYWNrIHNlcmllcyBpcyBhZGRlZA0KICAgIGFjY2VzcyhhbGwpIGV2ZW50IEFkbWluQWRkTmV3UGFja1NlcmllcygNCiAgICAgICAgcGFja1Nlcmllc0lEOiBVSW50NjQNCiAgICAgICAgKQ0KDQoNCiAgICAvLyBlbWl0dGVkIHdoZW4gYW4gYWRtaW4gaGFzIGluaXRpYXRlZCBhIG1pbnQgb2YgYSBIV0dhcmFnZUNhcmRWMg0KICAgIGFjY2VzcyhhbGwpIGV2ZW50IEFkbWluTWludFBhY2soDQogICAgICAgIHV1aWQ6IFVJbnQ2NA0KICAgICAgICAsIHBhY2tIYXNoOiBTdHJpbmcNCiAgICAgICAgLCBwYWNrU2VyaWVzSUQ6IFVJbnQ2NA0KICAgICAgICAsIHBhY2tJRDogVUludDY0IC8vIGFrYSBwYWNrRWRpdGlvbklEDQogICAgICAgICwgbWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30NCiAgICAgICAgKQ0KDQoNCiAgICAvLyBlbWl0dGVkIHdoZW4gc29tZW9uZSByZWRlZW1zIGEgSFdHYXJhZ2VDYXJkVjIgZm9yIFRva2Vucw0KICAgIGFjY2VzcyhhbGwpIGV2ZW50IFJlZGVlbVBhY2soDQogICAgICAgIGlkOiBVSW50NjQNCiAgICAgICAgLCBwYWNrSUQ6IFVJbnQ2NCAvLyBha2EgcGFja0VkaXRpb25JRA0KICAgICAgICAsIHBhY2tTZXJpZXNJRDogVUludDY0DQogICAgICAgICwgYWRkcmVzczogQWRkcmVzcw0KICAgICAgICAsIHBhY2tIYXNoOiBTdHJpbmcNCiAgICAgICAgKQ0KDQoNCiAgICAvLyBlbWl0dGVkIHdoZW4gYSB1c2VyIHN1Ym1pdHMgYSBwYWNrSGFzaCB0byBjbGFpbSBhIHBhY2sNCiAgICBhY2Nlc3MoYWxsKSBldmVudCBQYWNrQ2xhaW1CZWdpbigNCiAgICAgICAgYWRkcmVzczogQWRkcmVzcw0KICAgICAgICAsIHBhY2tIYXNoOiBTdHJpbmcNCiAgICAgICAgKQ0KDQoNCiAgICAvLyBlbWl0dGVkIHdoZW4gYSB1c2VyIHN1Y2Nlc3NmdWxseSBjbGFpbXMgYSBwYWNrDQogICAgYWNjZXNzKGFsbCkgZXZlbnQgUGFja0NsYWltU3VjY2VzcygNCiAgICAgICAgYWRkcmVzczogQWRkcmVzcw0KICAgICAgICAsIHBhY2tIYXNoOiBTdHJpbmcNCiAgICAgICAgLCBwYWNrSUQ6IFVJbnQ2NA0KICAgICAgICAsIHNlcmllc1BhY2tNaW50SUQ6IFN0cmluZw0KICAgICAgICApDQoNCiAgICAvLyBlbWl0dGVkIHdoZW4gYSB1c2VyIGJlZ2lucyBhIG1pZ3JhdGlvbiBmcm9tIFdheCB0byBGbG93DQogICAgYWNjZXNzKGFsbCkgZXZlbnQgQ2xhaW1CcmlkZ2VBc3NldCgNCiAgICAgICAgd2F4V2FsbGV0OiBTdHJpbmcNCiAgICAgICAgLCBhc3NldElkczogW1N0cmluZ10NCiAgICAgICAgLCBmbG93V2FsbGV0OiBBZGRyZXNzDQogICAgICAgICkNCiAgICAvLy8gRW5kIG9mIGV2ZW50cyAgDQoNCiAgICAvKiANCiAgICAqICAgTmFtZWQgUGF0aHMNCiAgICAqLw0KICAgIGFjY2VzcyhhbGwpIGxldCBNYW5hZ2VyU3RvcmFnZVBhdGg6IFN0b3JhZ2VQYXRoDQoNCg0KICAgIC8qIA0KICAgICogICBIV0dhcmFnZVBNVjIgZmllbGRzDQogICAgKi8NCiAgICBhY2Nlc3Moc2VsZikgdmFyIEhXR2FyYWdlUE1WMlNlcmllc0lkSXNMaXZlOiB7VUludDY0OiBCb29sfQ0KDQoNCiAgICAvKiANCiAgICAqICAgSFdHYXJhZ2VUb2tlblYyDQogICAgKi8NCiAgICBhY2Nlc3Moc2VsZikgdmFyIEhXR2FyYWdlVG9rZW5WMlNlcmllc0lkSXNMaXZlOiB7VUludDY0OiBCb29sfQ0KDQoNCiAgICAvKiANCiAgICAqICAgSFdHYXJhZ2VDYXJkVjINCiAgICAqLw0KICAgIGFjY2VzcyhzZWxmKSB2YXIgSFdHYXJhZ2VDYXJkVjJTZXJpZXNJZElzTGl2ZToge1VJbnQ2NDogQm9vbH0NCg0KDQogICAgLyogDQogICAgKiAgIEhXR2FyYWdlUGFja1YyDQogICAgKi8NCiAgICAvLyBXZSBuZWVkIGEgd2F5IHRvIHRyYWNrIGlmIGEgc2VyaWVzIGlzIGxpdmUNCiAgICAvLyBUaGlzIGRpY3Rpb25hcnkgd2lsbCBiZSB1cGRhdGVkIGJlZm9yZSBlYWNoIGRyb3AgdG8gaW5zZXJ0IHRoZSBzZXJpZXMgdGhhdCBpcyB0byBiZSByZWxlYXNlZA0KICAgIC8vIEZvciBleGFtcGxlLCB0aGUgY29udHJhY3QgbGF1bmNoZXMgd2l0aCBhbiBlbXB0eSBkaWN0aW9uYXJ5IG9mIHt9DQogICAgLy8gSW4gb3JkZXIgdG8gcHJlcGFyZSBmb3IgYSBkcm9wIHdlIG5lZWQgdG8gaGF2ZSBhbiBhZG1pbiBleGVjdXRlIGFkbWluX2FkZF9wYWNrU2VyaWVzLmNkYw0KICAgIC8vIFRoaXMgdHJhbnNhY3Rpb24gdGFrZXMgYSBVSW50NjQgYXMgYSBwYXJhbWV0ZXINCiAgICAvLyBOT1RFOiBPbmNlIGEgc2VyaWVzIGlzIGFkZGVkLCBpdCBpcyBsaXZlIGFuZCBhIHZhbGlkIHBhY2sgaGFzaCB3aWxsIG1pbnQgdGhhdCBhIHBhY2sgdG8gYSB1c2VyIHdhbGxldA0KICAgIGFjY2VzcyhzZWxmKSB2YXIgSFdHYXJhZ2VQYWNrVjJTZXJpZXNJZElzTGl2ZToge1VJbnQ2NDogQm9vbH0NCg0KDQogICAgLy8gRG8gd2Ugd2FudCB0byB1cGRhdGUgd2hlbiB0aGUgcGFjayBSZWRlZW1pbmcgYmVnaW5zPyBiZWNhdXNlIHdlIGNhbg0KICAgIGFjY2VzcyhhbGwpIHZhciBwYWNrUmVkZWVtU3RhcnRUaW1lOiBVRml4NjQNCiAgICAvLyBzaG91bGQgd2UgaGF2ZSBhIHN0YXRlIHZhcmlhYmxlIHRvIHN0YXJ0L3N0b3AgcGFja0NsYWltDQogICAgLy8gc2hvdWxkIHdlIGhhdmUgYSBzdGF0ZSB2YXJpYWJsZSB0byBzdGFydC9zdG9wIHBhY2tSZWRlZW0NCg0KDQogICAgLyogDQogICAgKiAgIE1hbmFnZXIgcmVzb3VyY2UgZm9yIGFsbCBORlRzDQogICAgKi8NCiAgICBhY2Nlc3MoYWxsKSByZXNvdXJjZSBNYW5hZ2VyIHsNCiAgICAgICAgLyoNCiAgICAgICAgICogIEhXR2FyYWdlUE1WMg0KICAgICAgICAgKi8NCg0KICAgICAgICAgLy8gT25lIGNhbGwgdG8gYWRkIGEgbmV3IHNlcmllc0lEIGZvciBQYWNrcyBhbmQgQ2FyZA0KICAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGFkZE5ld1Nlcmllc0lEKHNlcmllc0lEOiBVSW50NjQpew0KICAgICAgICAgICAgSFdHYXJhZ2VQTVYyLmFkZFNlcmllc0lEKHNlcmllc0lEOiBzZXJpZXNJRCkNCiAgICAgICAgICAgIHNlbGYuYWRkUGFja1Nlcmllc0lEKHBhY2tTZXJpZXNJRDogc2VyaWVzSUQpDQogICAgICAgICAgICBzZWxmLmFkZENhcmRTZXJpZXNJRChwYWNrU2VyaWVzSUQ6IHNlcmllc0lEKQ0KICAgICAgICAgICAgc2VsZi5hZGRUb2tlblNlcmllc0lEKHBhY2tTZXJpZXNJRDogc2VyaWVzSUQpDQogICAgICAgICB9DQoNCg0KICAgICAgICAvKg0KICAgICAgICAgKiBIV0dhcmFnZVRva2VuDQogICAgICAgICAqLw0KICAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGFkZFRva2VuU2VyaWVzSUQocGFja1Nlcmllc0lEOiBVSW50NjQpIHsNCiAgICAgICAgICAgIHByZSB7DQogICAgICAgICAgICAgICAgcGFja1Nlcmllc0lEID49IDE6ICJSZXF1ZXN0ZWQgc2VyaWVzIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgc2NvcGUuIg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBIV0dhcmFnZVBNVjIuYWRkVG9rZW5TZXJpZXNJRCh0b2tlblNlcmllc0lEOiBwYWNrU2VyaWVzSUQpDQogICAgICAgICAgICANCiAgICAgICAgICAgIGVtaXQgQWRtaW5BZGROZXdUb2tlblNlcmllcyh0b2tlblNlcmllc0lEOiBwYWNrU2VyaWVzSUQpDQoNCiAgICAgICAgIH0NCiAgICAgICAgIC8vLyBUbyBhY2NvbW9kYXRlIGFueSBmdXJ0aGVyIGNoYW5nZXMgdG8gdGhlIG1ldGFkYXRhIHdlIGNhbiBlbWl0IHRoZSBlbnRpcmUgDQogICAgICAgICAvLy8gbWV0YWRhdGEgcGF5bG9hZCBmb3IgYW4gYWlyZHJvcHBlZCB0b2tlbiBhbmQgYXZvaWQgc3RhaWNhbGx5IGFzc2lnbmluZyANCiAgICAgICAgIC8vLyBwYXlsb2FkLiBBbGwgZmllbGRzIGNhbiBnZXQgc2VudCB0byB0aGUgdHJhaXRzIHN0cnVjdA0KICAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGFpcmRyb3BSZWRlZW1hYmxlKA0KICAgICAgICAgICAgYWlyZHJvcFNlcmllc0lEOiBVSW50NjQNCiAgICAgICAgICAgICwgYWRkcmVzczogQWRkcmVzcw0KICAgICAgICAgICAgLCB0b2tlbk1pbnRJRDogU3RyaW5nDQogICAgICAgICAgICAsIG9yaWdpbmFsQ2FyZFNlcmlhbDogU3RyaW5nDQogICAgICAgICAgICAsIHRva2VuU2VyaWFsOiBTdHJpbmcNCiAgICAgICAgICAgICwgc2VyaWVzTmFtZTogU3RyaW5nDQogICAgICAgICAgICAsIGNhck5hbWU6IFN0cmluZw0KICAgICAgICAgICAgLCB0b2tlbkltYWdlSGFzaDogU3RyaW5nDQogICAgICAgICAgICAsIHRva2VuUmVsZWFzZURhdGU6IFN0cmluZw0KICAgICAgICAgICAgLCB0b2tlbkV4cGlyZURhdGU6IFN0cmluZw0KICAgICAgICAgICAgLCBjYXJkX0lEOiBTdHJpbmcNCiAgICAgICAgICAgICwgdGVtcGxhdGVfSUQ6IFN0cmluZw0KICAgICAgICAgICAgLCBtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfQ0KICAgICAgICAgICAgKTogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gew0KICAgICAgICAgICAgDQogICAgICAgICAgICBsZXQgSFdHYXJhZ2VBaXJkcm9wIDwtIEhXR2FyYWdlUE1WMi5taW50U2VxdWVudGlhbEFpcmRyb3AoDQogICAgICAgICAgICAgICAgc2VyaWVzSURBaXJkcm9wOiBhaXJkcm9wU2VyaWVzSUQNCiAgICAgICAgICAgICAgICAsIG1ldGFkYXRhOiBtZXRhZGF0YQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgIGVtaXQgQWRtaW5NaW50VG9rZW4oDQogICAgICAgICAgICAgICAgdXVpZDogSFdHYXJhZ2VBaXJkcm9wLnV1aWQNCiAgICAgICAgICAgICAgICAsIGlkOiBIV0dhcmFnZUFpcmRyb3AuaWQNCiAgICAgICAgICAgICAgICAsIG1ldGFkYXRhOiBtZXRhZGF0YQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgZW1pdCBBaXJkcm9wUmVkZWVtYWJsZSgNCiAgICAgICAgICAgICAgICBXYWxsZXRBZGRyZXNzOiBhZGRyZXNzDQogICAgICAgICAgICAgICAgLCBUb2tlbklEOkhXR2FyYWdlQWlyZHJvcC5pZCAvLyB0b2tlbkVkaXRpb25JRA0KICAgICAgICAgICAgICAgICwgVG9rZW5NaW50SUQ6IHRva2VuTWludElEDQogICAgICAgICAgICAgICAgLCBPcmlnaW5hbENhcmRTZXJpYWw6IG9yaWdpbmFsQ2FyZFNlcmlhbA0KICAgICAgICAgICAgICAgICwgVG9rZW5TZXJpYWw6IHRva2VuU2VyaWFsDQogICAgICAgICAgICAgICAgLCBTZXJpZXNOYW1lOiBzZXJpZXNOYW1lDQogICAgICAgICAgICAgICAgLCBOYW1lOiBjYXJOYW1lDQogICAgICAgICAgICAgICAgLCBUb2tlbkltYWdlSGFzaDogdG9rZW5JbWFnZUhhc2gNCiAgICAgICAgICAgICAgICAsIFRva2VuUmVsZWFzZURhdGU6IHRva2VuUmVsZWFzZURhdGUNCiAgICAgICAgICAgICAgICAsIFRva2VuRXhwaXJlRGF0ZTogdG9rZW5FeHBpcmVEYXRlDQogICAgICAgICAgICAgICAgLCBDYXJkSUQ6IGNhcmRfSUQNCiAgICAgICAgICAgICAgICAsIFRlbXBsYXRlSUQ6IHRlbXBsYXRlX0lEDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgcmV0dXJuIDwtIEhXR2FyYWdlQWlyZHJvcCANCiAgICAgICAgIH0NCg0KICAgICAgICAvKiANCiAgICAgICAgKiAgIEhXR2FyYWdlQ2FyZFYyDQogICAgICAgICovDQoNCiAgICAgICAgLy8gQWRkIGEgcGFja1NlcmllcyB0byB0aGUgZGljdGlvbmFyeSB0byBzdXBwb3J0IGEgbmV3IGRyb3ANCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGFkZENhcmRTZXJpZXNJRChwYWNrU2VyaWVzSUQ6IFVJbnQ2NCkgew0KICAgICAgICAgICAgcHJlIHsNCiAgICAgICAgICAgICAgICBwYWNrU2VyaWVzSUQgPj0gMTogIlJlcXVlc3RlZCBzZXJpZXMgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBzY29wZS4iDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIEhXR2FyYWdlUE1WMi5hZGRDYXJkU2VyaWVzSUQoY2FyZFNlcmllc0lEOiBwYWNrU2VyaWVzSUQpDQogICAgICAgICAgICANCiAgICAgICAgICAgIGVtaXQgQWRtaW5BZGROZXdDYXJkU2VyaWVzKGNhcmRTZXJpZXNJRDogcGFja1Nlcmllc0lEKQ0KICAgICAgICB9DQoNCg0KICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gbWludFNlcXVlbnRpYWxIV0dhcmFnZUNhcmRWMigNCiAgICAgICAgICAgIGFkZHJlc3M6IEFkZHJlc3MNCiAgICAgICAgICAgICwgcGFja0hhc2g6IFN0cmluZw0KICAgICAgICAgICAgLCBwYWNrU2VyaWVzSUQ6IFVJbnQ2NA0KICAgICAgICAgICAgLCBwYWNrRWRpdGlvbklEOiBVSW50NjQNCiAgICAgICAgICAgICwgcmVkZWVtYWJsZTogU3RyaW5nDQogICAgICAgICAgICAsIG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9DQogICAgICAgDQogICAgICAgICAgICApOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSB7DQoNCiAgICAgICAgICAgIGxldCBIV0dhcmFnZUNhcmRWMiA8LSBIV0dhcmFnZVBNVjIubWludFNlcXVlbnRpYWxDYXJkKA0KICAgICAgICAgICAgICAgIHBhY2tIYXNoOiBwYWNrSGFzaA0KICAgICAgICAgICAgICAgICwgcGFja1Nlcmllc0lEOiBwYWNrU2VyaWVzSUQNCiAgICAgICAgICAgICAgICAsIHBhY2tFZGl0aW9uSUQ6IHBhY2tFZGl0aW9uSUQNCiAgICAgICAgICAgICAgICAsIHJlZGVlbWFibGU6IHJlZGVlbWFibGUNCiAgICAgICAgICAgICAgICAsIG1ldGFkYXRhOiBtZXRhZGF0YQ0KICAgICAgICAgICAgICAgICkNCg0KICAgICAgICAgICAgZW1pdCBBZG1pbk1pbnRDYXJkKA0KICAgICAgICAgICAgICAgIHV1aWQ6IEhXR2FyYWdlQ2FyZFYyLnV1aWQNCiAgICAgICAgICAgICAgICAsIGlkOiBIV0dhcmFnZUNhcmRWMi5pZA0KICAgICAgICAgICAgICAgICwgbWV0YWRhdGE6IG1ldGFkYXRhDQogICAgICAgICAgICAgICAgLCBwYWNrSGFzaDogcGFja0hhc2gNCiAgICAgICAgICAgICAgICAsIGFkZHJlc3M6IGFkZHJlc3MNCiAgICAgICAgICAgICAgICApDQoNCiAgICAgICAgICAgIHJldHVybiA8LSBIV0dhcmFnZUNhcmRWMg0KICAgICAgICB9DQoNCg0KICAgICAgICAvKiANCiAgICAgICAgKiAgIEhXR2FyYWdlUGFja1YyDQogICAgICAgICovDQoNCiAgICAgICAgLy8gQWRkIGEgcGFja1NlcmllcyB0byB0aGUgZGljdGlvbmFyeSB0byBzdXBwb3J0IGEgbmV3IGRyb3ANCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGFkZFBhY2tTZXJpZXNJRChwYWNrU2VyaWVzSUQ6IFVJbnQ2NCkgew0KICAgICAgICAgICAgcHJlIHsNCiAgICAgICAgICAgICAgICBwYWNrU2VyaWVzSUQgPj0gMTogIlJlcXVlc3RlZCBzZXJpZXMgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBzY29wZS4iDQogICAgICAgICAgICAgICAgLy8gSFdHYXJhZ2VQTVYyLkhXR2FyYWdlUGFja1YyU2VyaWVzSWRJc0xpdmUuY29udGFpbnNLZXkocGFja1Nlcmllc0lEKSA9PSB0cnVlOiAiUmVxdWVzdGVkIHNlcmllcyBhbHJlYWR5IGV4aXN0cy4iDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIEhXR2FyYWdlUE1WMi5hZGRQYWNrU2VyaWVzSUQocGFja1Nlcmllc0lEOiBwYWNrU2VyaWVzSUQpDQogICAgICAgICAgICANCiAgICAgICAgICAgIGVtaXQgQWRtaW5BZGROZXdQYWNrU2VyaWVzKHBhY2tTZXJpZXNJRDogcGFja1Nlcmllc0lEKQ0KICAgICAgICB9DQoNCg0KICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gbWludFNlcXVlbnRpYWxIV0dhcmFnZVBhY2tWMigNCiAgICAgICAgICAgIGFkZHJlc3M6IEFkZHJlc3MNCiAgICAgICAgICAgICwgcGFja0hhc2g6IFN0cmluZw0KICAgICAgICAgICAgLCBwYWNrU2VyaWVzSUQ6IFVJbnQ2NA0KICAgICAgICAgICAgLCBtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfQ0KICAgICAgICAgICAgLy8gLCBwYWNrTmFtZTogU3RyaW5nDQogICAgICAgICAgICAvLyAsIHBhY2tEZXNjcmlwdGlvbjogU3RyaW5nDQogICAgICAgICAgICAvLyAsIHRodW1ibmFpbENJRDogU3RyaW5nDQogICAgICAgICAgICAvLyAsIHRodW1ibmFpbFBhdGg6IFN0cmluZw0KICAgICAgICAgICAgLy8gLCBjb2xsZWN0aW9uTmFtZTogU3RyaW5nDQogICAgICAgICAgICAvLyAsIGNvbGxlY3Rpb25EZXNjcmlwdGlvbjogU3RyaW5nDQogICAgICAgICAgICApOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSB7DQoNCiAgICAgICAgICAgIGxldCBIV0dhcmFnZVBhY2tWMiA8LSBIV0dhcmFnZVBNVjIubWludFNlcXVlbnRpYWxQYWNrKA0KICAgICAgICAgICAgICAgIHBhY2tIYXNoOiBwYWNrSGFzaA0KICAgICAgICAgICAgICAgICwgcGFja1Nlcmllc0lEOiBwYWNrU2VyaWVzSUQNCiAgICAgICAgICAgICAgICAsIG1ldGFkYXRhOiBtZXRhZGF0YQ0KICAgICAgICAgICAgICAgIC8vICwgcGFja05hbWU6IHBhY2tOYW1lDQogICAgICAgICAgICAgICAgLy8gLCBwYWNrRGVzY3JpcHRpb246IHBhY2tEZXNjcmlwdGlvbg0KICAgICAgICAgICAgICAgIC8vICwgdGh1bWJuYWlsQ0lEOiB0aHVtYm5haWxDSUQNCiAgICAgICAgICAgICAgICAvLyAsIHRodW1ibmFpbFBhdGg6IHRodW1ibmFpbFBhdGgNCiAgICAgICAgICAgICAgICAvLyAsIGNvbGxlY3Rpb25OYW1lOiBjb2xsZWN0aW9uTmFtZQ0KICAgICAgICAgICAgICAgIC8vICwgY29sbGVjdGlvbkRlc2NyaXB0aW9uOiBjb2xsZWN0aW9uRGVzY3JpcHRpb24NCiAgICAgICAgICAgICAgICApDQoNCiAgICAgICAgICAgIGVtaXQgQWRtaW5NaW50UGFjaygNCiAgICAgICAgICAgICAgICB1dWlkOkhXR2FyYWdlUGFja1YyLnV1aWQNCiAgICAgICAgICAgICAgICAsIHBhY2tIYXNoOiBwYWNrSGFzaA0KICAgICAgICAgICAgICAgICwgcGFja1Nlcmllc0lEOiBwYWNrU2VyaWVzSUQNCiAgICAgICAgICAgICAgICAsIHBhY2tJRDogSFdHYXJhZ2VQYWNrVjIuaWQgLy8gYWthIHBhY2tFZGl0aW9uSUQNCiAgICAgICAgICAgICAgICAsIG1ldGFkYXRhOiBtZXRhZGF0YQ0KICAgICAgICAgICAgICAgICkNCg0KICAgICAgICAgICAgZW1pdCBQYWNrQ2xhaW1TdWNjZXNzKA0KICAgICAgICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3MNCiAgICAgICAgICAgICAgICAsIHBhY2tIYXNoOiBwYWNrSGFzaA0KICAgICAgICAgICAgICAgICwgcGFja0lEOiBIV0dhcmFnZVBhY2tWMi5pZA0KICAgICAgICAgICAgICAgICwgc2VyaWVzUGFja01pbnRJRDogbWV0YWRhdGFbInNlcmllc1BhY2tNaW50SUQiXSA/PyAiIg0KICAgICAgICAgICAgICAgICkNCg0KICAgICAgICAgICAgcmV0dXJuIDwtSFdHYXJhZ2VQYWNrVjINCiAgICAgICAgfQ0KDQoNCiAgICB9IC8vLyBlbmQgYWRtaW4gYmxvY2sNCg0KICAgIGFjY2VzcyhzZWxmKSBmdW4gYWRkU2VyaWVzSUQoc2VyaWVzSUQ6IFVJbnQ2NCkgew0KICAgICAgICBwcmUgew0KICAgICAgICAgICAgc2VyaWVzSUQgPj0gMTogIlJlcXVlc3RlZCBzZXJpZXMgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBzY29wZS4iDQogICAgICAgIH0NCg0KICAgICAgICBzZWxmLkhXR2FyYWdlUE1WMlNlcmllc0lkSXNMaXZlLmluc2VydChrZXk6IHNlcmllc0lELCB0cnVlKQ0KICAgIH0NCg0KICAgIC8qIA0KICAgICogICBIV0dhcmFnZVRva2VuMg0KICAgICoNCiAgICAqICAgTWludCBhIEhXR2FyYWdlVG9rZW5WMg0KICAgICovDQoNCiAgICAvLyBBZGQgYSBwYWNrU2VyaWVzIHRvIHRoZSBkaWN0aW9uYXJ5IHRvIHN1cHBvcnQgYSBuZXcgZHJvcA0KICAgIGFjY2VzcyhzZWxmKSBmdW4gYWRkVG9rZW5TZXJpZXNJRCh0b2tlblNlcmllc0lEOiBVSW50NjQpIHsNCiAgICAgICAgcHJlIHsNCiAgICAgICAgICAgIHRva2VuU2VyaWVzSUQgPj0gMTogIlJlcXVlc3RlZCBzZXJpZXMgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBzY29wZS4iDQogICAgICAgIH0NCg0KICAgICAgICBzZWxmLkhXR2FyYWdlVG9rZW5WMlNlcmllc0lkSXNMaXZlLmluc2VydChrZXk6IHRva2VuU2VyaWVzSUQsIHRydWUpDQogICAgICAgIA0KICAgICAgICBIV0dhcmFnZVRva2VuVjIuYWRkTmV3U2VyaWVzKG5ld1Rva2VuU2VyaWVzSUQ6IHRva2VuU2VyaWVzSUQpDQogICAgfQ0KICAgIC8vLyB1c2VmdWwgZmllbGRzIHRvIHBhc3MgaW50byBtZXRhZGF0YSANCiAgICAvLyB0aHVtYm5haWxDSUQ6IGlwZnMgaGFzaCBmb3IgdGh1bWJuYWlsIChkZWZhdWx0OiAiVGh1bWJuYWlsQ0lEIG5vdCBzZXQiKQ0KICAgIC8vIHRodW1ibmFpUGF0aDogcGF0aCB0byBpcGZzIHRodW1ibmFpbCByZXNvdXJjZSAoZGVmYXVsdDogIlRodW1ibmFpbFBhdGggbm90IHNldCIpDQogICAgLy8gY2FyZE5hbWU6IGllOiBTZXJpZXMgWCBBaXJkcm9wDQogICAgLy8gY2FyZERlc2NyaXB0aW9uOiBpZTogVGhpcyBhaXJkcm9wIGlzIHJlZGVlbWFibGUgZm9yIFkNCiAgICAvLyB1cmw6IHVybCBmb3IgdGhlIHNpbmdsZSBwcm9kdWN0IHBhZ2UgZm9yIHRoaXMgdG9rZW4NCiAgICAvLy8gdGhlIHJlbWFpbmluZyBmaWVsZHMgYXJlIG9wdGlvbmFsDQogICAgLy8gY29sbGVjdGlvbk5hbWU6IChkZWZhdWx0IHZhbHVlKSBjb2xsZWN0aW9uTmFtZSBub3Qgc2V0DQogICAgLy8gY29sbGVjdGlvbkRlc2NyaXB0aW9uOiAoZGVmYXVsdCB2YWx1ZSkgY29sbGVjdGlvbiBkZXNjcmlwdGlvbiBub3Qgc2V0DQogICAgLy8vIE5PVEU6DQogICAgLy8gICAtIFRoaXMgaXMgYW4gYWRtaW4gZnVuY3Rpb24NCiAgICAvLyAgIC0gYnkgZGVmYXVsdCBhbGwgYWlyZHJvcHBlZCB0b2tlbnMgYXJlIHJlZGVlbWFibGUNCiAgICAvLyAgIC0gcmVxdWlyZSBubyBwYWNrSGFzaCB0byBiZSBtaW50ZWQNCiAgICBhY2Nlc3Moc2VsZikgZnVuIG1pbnRTZXF1ZW50aWFsQWlyZHJvcChzZXJpZXNJREFpcmRyb3A6IFVJbnQ2NCwgbWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30pOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSB7DQogICAgICAgIGxldCBjdXJyZW50QWlyZHJvcCA9IEhXR2FyYWdlVG9rZW5WMi5nZXRUb3RhbFN1cHBseSgpICsgMQ0KICAgICAgICBsZXQgbmV3QWlyZHJvcFRva2VuIDwtIEhXR2FyYWdlVG9rZW5WMi5taW50KA0KICAgICAgICAgICAgbmZ0SUQ6IGN1cnJlbnRBaXJkcm9wDQogICAgICAgICAgICAsIHBhY2tTZXJpZXNJRDogc2VyaWVzSURBaXJkcm9wDQogICAgICAgICAgICAsIG1ldGFkYXRhOiBtZXRhZGF0YQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgcmV0dXJuIDwtIG5ld0FpcmRyb3BUb2tlbg0KICAgIH0gICAgDQoNCg0KICAgIC8qIA0KICAgICogICBIV0dhcmFnZUNhcmRWMg0KICAgICoNCiAgICAqICAgTWludCBhIEhXR2FyYWdlQ2FyZFYyDQogICAgKi8NCg0KICAgIC8vIEFkZCBhIHBhY2tTZXJpZXMgdG8gdGhlIGRpY3Rpb25hcnkgdG8gc3VwcG9ydCBhIG5ldyBkcm9wDQogICAgYWNjZXNzKHNlbGYpIGZ1biBhZGRDYXJkU2VyaWVzSUQoY2FyZFNlcmllc0lEOiBVSW50NjQpIHsNCiAgICAgICAgcHJlIHsNCiAgICAgICAgICAgIGNhcmRTZXJpZXNJRCA+PSAxOiAiUmVxdWVzdGVkIHNlcmllcyBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHNjb3BlLiINCiAgICAgICAgfQ0KDQogICAgICAgIHNlbGYuSFdHYXJhZ2VDYXJkVjJTZXJpZXNJZElzTGl2ZS5pbnNlcnQoa2V5OiBjYXJkU2VyaWVzSUQsIHRydWUpDQogICAgICAgIA0KICAgICAgICBIV0dhcmFnZUNhcmRWMi5hZGROZXdTZXJpZXMobmV3Q2FyZFNlcmllc0lEOiBjYXJkU2VyaWVzSUQpDQogICAgfQ0KDQoNCiAgICAvLyBsb29rIGZvciB0aGUgbmV4dCBDYXJkIGluIHRoZSBzZXF1ZW5jZSwgYW5kIG1pbnQgdGhlcmUNCiAgICBhY2Nlc3Moc2VsZikgZnVuIG1pbnRTZXF1ZW50aWFsQ2FyZCgNCiAgICAgICAgcGFja0hhc2g6IFN0cmluZw0KICAgICAgICAsIHBhY2tTZXJpZXNJRDogVUludDY0DQogICAgICAgICwgcGFja0VkaXRpb25JRDogVUludDY0DQogICAgICAgICwgcmVkZWVtYWJsZTogU3RyaW5nDQogICAgICAgICwgbWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30NCiAgICAgDQogICAgICAgICk6IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9IHsNCiAgICAgICAgcHJlIHsNCiAgICAgICAgICAgIHNlbGYuSFdHYXJhZ2VQTVYyU2VyaWVzSWRJc0xpdmUuY29udGFpbnNLZXkocGFja1Nlcmllc0lEKSA9PSB0cnVlOiAiUmVxdWVzdGVkIHBhY2sgc2VyaWVzIGlzIG5vdCByZWFkeSBhdCB0aGlzIHRpbWUuIg0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGN1cnJlbnRFZGl0aW9uTnVtYmVyID0gSFdHYXJhZ2VDYXJkVjIuZ2V0VG90YWxTdXBwbHkoKSArIDENCiAgICAgICAgDQogICAgICAgIGxldCBuZXdDYXJkIDwtIEhXR2FyYWdlQ2FyZFYyLm1pbnQoDQogICAgICAgICAgICBuZnRJRDpjdXJyZW50RWRpdGlvbk51bWJlcg0KICAgICAgICAgICAgLCBwYWNrU2VyaWVzSUQ6IHBhY2tTZXJpZXNJRA0KICAgICAgICAgICAgLCBjYXJkRWRpdGlvbklEOiBjdXJyZW50RWRpdGlvbk51bWJlcg0KICAgICAgICAgICAgLCBwYWNrSGFzaDogcGFja0hhc2gNCiAgICAgICAgICAgICwgcmVkZWVtYWJsZTogcmVkZWVtYWJsZQ0KICAgICAgICAgICAgLCBtZXRhZGF0YTogbWV0YWRhdGENCiAgICAgICAgICAgICkNCg0KICAgICAgICByZXR1cm4gPC0gbmV3Q2FyZA0KICAgIH0NCg0KDQogICAgLyogDQogICAgKiAgIEhXR2FyYWdlUGFja1YyDQogICAgKg0KICAgICogICBNaW50IGEgSFdHYXJhZ2VQYWNrVjINCiAgICAqLw0KICAgIC8vIEFkZCBhIHBhY2tTZXJpZXMgdG8gdGhlIGRpY3Rpb25hcnkgdG8gc3VwcG9ydCBhIG5ldyBkcm9wDQogICAgYWNjZXNzKHNlbGYpIGZ1biBhZGRQYWNrU2VyaWVzSUQocGFja1Nlcmllc0lEOiBVSW50NjQpIHsNCiAgICAgICAgcHJlIHsNCiAgICAgICAgICAgIHBhY2tTZXJpZXNJRCA+PSAxOiAiUmVxdWVzdGVkIHNlcmllcyBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHNjb3BlLiINCiAgICAgICAgICAgIC8vIHNlbGYuSFdHYXJhZ2VQYWNrVjJTZXJpZXNJZElzTGl2ZS5jb250YWluc0tleShwYWNrU2VyaWVzSUQpID09IHRydWU6ICJSZXF1ZXN0ZWQgc2VyaWVzIGFscmVhZHkgZXhpc3RzLiINCiAgICAgICAgfQ0KDQogICAgICAgIHNlbGYuSFdHYXJhZ2VQYWNrVjJTZXJpZXNJZElzTGl2ZS5pbnNlcnQoa2V5OiBwYWNrU2VyaWVzSUQsIHRydWUpDQoNCiAgICAgICAgSFdHYXJhZ2VQYWNrVjIuYWRkTmV3U2VyaWVzKG5ld1BhY2tTZXJpZXNJRDogcGFja1Nlcmllc0lEKQ0KICAgIH0NCg0KDQogICAgLy8gTG9vayBmb3IgdGhlIG5leHQgYXZhaWxhYmxlIHBhY2ssIGFuZCBtaW50IHRoZXJlDQogICAgYWNjZXNzKHNlbGYpIGZ1biBtaW50U2VxdWVudGlhbFBhY2soDQogICAgICAgIHBhY2tIYXNoOiBTdHJpbmcNCiAgICAgICAgLCBwYWNrU2VyaWVzSUQ6IFVJbnQ2NA0KICAgICAgICAsIG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9DQogICAgICAgIC8vICwgcGFja05hbWU6IFN0cmluZw0KICAgICAgICAvLyAsIHBhY2tEZXNjcmlwdGlvbjogU3RyaW5nDQogICAgICAgIC8vICwgdGh1bWJuYWlsQ0lEOiBTdHJpbmcNCiAgICAgICAgLy8gLCB0aHVtYm5haWxQYXRoOiBTdHJpbmcNCiAgICAgICAgLy8gLCBjb2xsZWN0aW9uTmFtZTogU3RyaW5nDQogICAgICAgIC8vICwgY29sbGVjdGlvbkRlc2NyaXB0aW9uOiBTdHJpbmcNCiAgICApOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSB7DQogICAgICAgIHByZSB7DQogICAgICAgICAgICBwYWNrU2VyaWVzSUQgPj0gMTogIlJlcXVlc3RlZCBzZXJpZXMgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBzY29wZS4iDQogICAgICAgICAgICAvLyBjaGVjayB0byB2ZXJpZnkgaWYgYSB2YWxpZCBzZXJpZXMgaGFzIGJlZW4gcGFzc2VkIGluDQogICAgICAgICAgICBzZWxmLkhXR2FyYWdlUE1WMlNlcmllc0lkSXNMaXZlLmNvbnRhaW5zS2V5KHBhY2tTZXJpZXNJRCkgPT0gdHJ1ZTogIlJlcXVlc3RlZCBwYWNrIHNlcmllcyBpcyBub3QgcmVhZHkgYXQgdGhpcyB0aW1lLiINCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEdyYWIgdGhlIHBhY2tFZGl0aW9uSUQgdG8gbWludCANCiAgICAgICAgdmFyIGN1cnJlbnRQYWNrRWRpdGlvbk51bWJlcjogVUludDY0ID0gSFdHYXJhZ2VQYWNrVjIuZ2V0VG90YWxTdXBwbHkoKSArIDENCg0KICAgICAgICBsZXQgbmV3UGFjazogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gPC0gSFdHYXJhZ2VQYWNrVjIubWludCgNCiAgICAgICAgICAgIG5mdElEOiBjdXJyZW50UGFja0VkaXRpb25OdW1iZXIgLy8gcGFjayBYIG9mIFkNCiAgICAgICAgICAgICwgcGFja0VkaXRpb25JRDogY3VycmVudFBhY2tFZGl0aW9uTnVtYmVyIC8vIHBhY2sgWCBvZiBZDQogICAgICAgICAgICAsIHBhY2tTZXJpZXNJRDogcGFja1Nlcmllc0lEICAvLyBha2Egc2VyaWVzDQogICAgICAgICAgICAsIHBhY2tIYXNoOiBwYWNrSGFzaA0KICAgICAgICAgICAgLCBtZXRhZGF0YTogbWV0YWRhdGENCiAgICAgICAgICAgICkNCg0KICAgICAgICByZXR1cm4gPC1uZXdQYWNrDQogICAgfQ0KDQoNCiAgICAvKiANCiAgICAqICAgUHVibGljIEZ1bmN0aW9ucw0KICAgICoNCiAgICAqICAgSFdHYXJhZ2VQTVYyDQogICAgKi8NCg0KICAgIGFjY2VzcyhhbGwpIGZ1biBnZXRFbmFibGVkU2VyaWVzKCk6IHtVSW50NjQ6IEJvb2x9ew0KICAgICAgICByZXR1cm4gSFdHYXJhZ2VQTVYyLkhXR2FyYWdlUE1WMlNlcmllc0lkSXNMaXZlDQogICAgfQ0KDQogICAgYWNjZXNzKGFsbCkgZnVuIGdldEVuYWJsZWRUb2tlblNlcmllcygpOiB7VUludDY0OiBCb29sfXsNCiAgICAgICAgcmV0dXJuIEhXR2FyYWdlUE1WMi5IV0dhcmFnZVRva2VuVjJTZXJpZXNJZElzTGl2ZQ0KICAgIH0NCiAgICANCiAgICBhY2Nlc3MoYWxsKSBmdW4gZ2V0RW5hYmxlZENhcmRTZXJpZXMoKToge1VJbnQ2NDogQm9vbH17DQogICAgICAgIHJldHVybiBIV0dhcmFnZVBNVjIuSFdHYXJhZ2VDYXJkVjJTZXJpZXNJZElzTGl2ZQ0KICAgIH0NCg0KDQogICAgYWNjZXNzKGFsbCkgZnVuIGdldEVuYWJsZWRQYWNrU2VyaWVzKCk6IHtVSW50NjQ6IEJvb2x9ew0KICAgICAgICByZXR1cm4gSFdHYXJhZ2VQTVYyLkhXR2FyYWdlUGFja1YyU2VyaWVzSWRJc0xpdmUNCiAgICB9DQoNCg0KICAgIC8qDQogICAgICogIFB1YmxpYyBQYWNrIEZ1bmN0aW9ucw0KICAgICAqLw0KDQogICAgYWNjZXNzKGFsbCkgZnVuIGNsYWltUGFjayhhZGRyZXNzOiBBZGRyZXNzLCBwYWNrSGFzaDogU3RyaW5nKSB7DQogICAgICAgIC8vIHRoaXMgZXZlbnQgaXMgcGlja2VkIHVwIGJ5IGEgd2ViIGhvb2sgdG8gdmVyaWZ5IHBhY2tIYXNoDQogICAgICAgIC8vIGlmIHBhY2tIYXNoIGlzIHZhbGlkLCB0aGUgYmFja2VuZCB3aWxsIG1pbnQgdGhlIHBhY2sgYW5kDQogICAgICAgIC8vIGRlcG9zaXQgdG8gdGhlIHJlY2lwaWVudCBhZGRyZXNzDQogICAgICAgIGVtaXQgUGFja0NsYWltQmVnaW4oYWRkcmVzczogYWRkcmVzcywgcGFja0hhc2g6IHBhY2tIYXNoKQ0KICAgIH0NCg0KDQogICAgYWNjZXNzKGFsbCkgZnVuIHB1YmxpY1JlZGVlbVBhY2soDQogICAgICAgIGFkZHJlc3M6IEFkZHJlc3MsDQogICAgICAgIHBhY2s6IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9LA0KICAgICAgICBwYWNrSGFzaDogU3RyaW5nDQogICAgICAgICkgew0KICAgICAgICBwcmUgew0KICAgICAgICAgICAgZ2V0Q3VycmVudEJsb2NrKCkudGltZXN0YW1wID49IHNlbGYucGFja1JlZGVlbVN0YXJ0VGltZTogIlJlZGVtcHRpb24gaGFzIG5vdCB5ZXQgc3RhcnRlZCINCiAgICAgICAgICAgIHBhY2suaXNJbnN0YW5jZShUeXBlPEBIV0dhcmFnZVBhY2tWMi5ORlQ+KCkpDQogICAgICAgIH0NCg0KICAgICAgICBsZXQgcGFja0luc3RhbmNlIDwtIHBhY2sgYXMhIEBIV0dhcmFnZVBhY2tWMi5ORlQNCg0KICAgICAgICAvLyBlbWl0IGV2ZW50IHRoYXQgb3VyIGJhY2tlbmQgd2lsbCByZWFkIGFuZCBtaW50IHBhY2sgY29udGVudHMgdG8gdGhlIGFzc29jaWF0ZWQgYWRkcmVzcw0KICAgICAgICBlbWl0IFJlZGVlbVBhY2soDQogICAgICAgICAgICBpZDogcGFja0luc3RhbmNlLmlkLA0KICAgICAgICAgICAgcGFja0lEOiBwYWNrSW5zdGFuY2UucGFja0VkaXRpb25JRCwgLy8gYWthIHBhY2tFZGl0aW9uSUQNCiAgICAgICAgICAgIHBhY2tTZXJpZXNJRDogcGFja0luc3RhbmNlLnBhY2tTZXJpZXNJRCwNCiAgICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsDQogICAgICAgICAgICBwYWNrSGFzaDogcGFja0hhc2gNCiAgICAgICAgICAgICkNCiAgICAgICAgLy8gYnVybiBwYWNrIHNpbmNlIGl0IHdhcyByZWRlZW1lZCBmb3IgSFdHYXJhZ2VDYXJkVjIocykNCiAgICAgICAgZGVzdHJveSBwYWNrSW5zdGFuY2UNCiAgICB9DQoNCg0KICAgIGFjY2VzcyhhbGwpIGZ1biBnZXRQYWNrRWRpdGlvbklkQnlQYWNrU2VyaWVzSWQoKToge1VJbnQ2NDogVUludDY0fXsNCiAgICAgICAgcmV0dXJuICpIV0dhcmFnZVBhY2tWMi5jdXJyZW50UGFja0VkaXRpb25JZEJ5UGFja1Nlcmllc0lkDQogICAgfQ0KDQoNCiAgICBhY2Nlc3MoYWxsKSBmdW4gZ2V0Q2FyZEVkaXRpb25JZEJ5UGFja1Nlcmllc0lkKCk6IHtVSW50NjQ6IFVJbnQ2NH17DQogICAgICAgIHJldHVybiAqSFdHYXJhZ2VDYXJkVjIuY3VycmVudENhcmRFZGl0aW9uSWRCeVBhY2tTZXJpZXNJZA0KICAgIH0NCg0KICAgIC8qIA0KICAgICAqICBQdWJsaWMgQWlyZHJvcCBmdW5jdGlvbnMNCiAgICAgKi8NCiAgICANCiAgICBhY2Nlc3MoYWxsKSBmdW4gYnVybkFpcmRyb3AoDQogICAgICAgIHdhbGxldEFkZHJlc3M6IEFkZHJlc3MNCiAgICAgICAgLCB0b2tlblNlcmlhbDogU3RyaW5nDQogICAgICAgICwgYWlyZHJvcFRva2VuOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfQ0KICAgICAgICANCiAgICApIHsNCiAgICAgICAgcHJlew0KICAgICAgICAgICAgLy8gY2hlY2sgYWlyZHJvcElkRWRpdGlvbiBpcyB0aGUgVHlwZQ0KICAgICAgICAgICAgYWlyZHJvcFRva2VuLmlzSW5zdGFuY2UoVHlwZTxASFdHYXJhZ2VUb2tlblYyLk5GVD4oKSkNCiAgICAgICAgfQ0KICAgICAgICBsZXQgYWlyZHJvcEluc3RhbmNlIDwtIGFpcmRyb3BUb2tlbiBhcyEgQEhXR2FyYWdlVG9rZW5WMi5ORlQNCiAgICAgICAgLy8gZW1pdCBldmVudCBzaWduYWxpbmcgQWlyZHJvcCBpcyBidXJuZWQNCiAgICAgICAgZW1pdCBBaXJkcm9wQnVybigNCiAgICAgICAgICAgIFdhbGxldEFkZHJlc3M6IHdhbGxldEFkZHJlc3MNCiAgICAgICAgICAgICwgVG9rZW5TZXJpYWw6IHRva2VuU2VyaWFsDQogICAgICAgICAgICAsIEFpcmRyb3BFZGl0aW9uSWQ6IGFpcmRyb3BJbnN0YW5jZS5pZA0KICAgICAgICAgICAgKQ0KICAgICAgICBkZXN0cm95IGFpcmRyb3BJbnN0YW5jZQ0KICAgIH0NCg0KICAgIC8qIA0KICAgICAqICBQdWJsaWMgQnJpZGdlIGZ1bmN0aW9ucw0KICAgICAqLw0KDQogICAgYWNjZXNzKGFsbCkgZnVuIG1pZ3JhdGVBc3NldCgNCiAgICAgICAgd2F4V2FsbGV0OiBTdHJpbmcNCiAgICAgICAgLCBhc3NldElkczogW1N0cmluZ10NCiAgICAgICAgLCBmbG93V2FsbGV0OiBBZGRyZXNzDQogICAgKSB7DQogICAgICAgIC8vIGVtaXQgZXZlbnQgdG8gc3RhcnQgYXNzZXQgbWlncmF0aW9uDQogICAgICAgIGVtaXQgQ2xhaW1CcmlkZ2VBc3NldCgNCiAgICAgICAgICAgIHdheFdhbGxldDogd2F4V2FsbGV0DQogICAgICAgICAgICAsIGFzc2V0SWRzOiBhc3NldElkcw0KICAgICAgICAgICAgLCBmbG93V2FsbGV0OiBmbG93V2FsbGV0DQogICAgICAgICkNCiAgICB9DQoNCg0KICAgIGluaXQoKXsNCiAgICAgICAgLyoNCiAgICAgICAgKiAgIFN0YXRlIHZhcmlhYmxlcw0KICAgICAgICAqICAgSFdHYXJhZ2VQTVYyDQogICAgICAgICovDQogICAgICAgIC8vIHN0YXJ0IHdpdGggbm8gZXhpc3Rpbmcgc2VyaWVzIGVuYWJsZWQNCiAgICAgICAgLy8gezE6IHRydWUsIDI6IHRydWV9IHdoZW4gc2VyaWVzIDEgYW5kIDIgYXJlIGxpdmUNCiAgICAgICAgc2VsZi5IV0dhcmFnZVBNVjJTZXJpZXNJZElzTGl2ZSA9IHt9DQoNCiAgICAgICAgLyoNCiAgICAgICAgKiAgIEhXR2FyYWdlVG9rZW5WMg0KICAgICAgICAqLw0KICAgICAgICBzZWxmLkhXR2FyYWdlVG9rZW5WMlNlcmllc0lkSXNMaXZlID0ge30NCg0KDQogICAgICAgIC8qDQogICAgICAgICogICBIV0dhcmFnZUNhcmRWMg0KICAgICAgICAqLw0KICAgICAgICBzZWxmLkhXR2FyYWdlQ2FyZFYyU2VyaWVzSWRJc0xpdmUgPSB7fQ0KDQoNCiAgICAgICAgLyogDQogICAgICAgICogICBIV0dhcmFnZVBhY2tWMg0KICAgICAgICAqLw0KICAgICAgICBzZWxmLnBhY2tSZWRlZW1TdGFydFRpbWUgPSAxNjU4MzYxMjkwLjANCiAgICAgICAgc2VsZi5IV0dhcmFnZVBhY2tWMlNlcmllc0lkSXNMaXZlID0ge30NCg0KDQogICAgICAgIC8vIG1hbmFnZXIgcmVzb3VyY2UgaXMgb25seSBzYXZlZCB0byB0aGUgZGVwbG95aW5nIGFjY291bnQncyBzdG9yYWdlDQogICAgICAgIHNlbGYuTWFuYWdlclN0b3JhZ2VQYXRoID0gL3N0b3JhZ2UvSFdHYXJhZ2VQTVYyDQogICAgICAgIHNlbGYuYWNjb3VudC5zdG9yYWdlLnNhdmUoPC0gY3JlYXRlIE1hbmFnZXIoKSwgdG86IHNlbGYuTWFuYWdlclN0b3JhZ2VQYXRoKQ0KDQogICAgICAgIGVtaXQgQ29udHJhY3RJbml0aWFsaXplZCgpDQogICAgfQ0KfQ0KIA==",
		"HWGaragePack": "LyoKKgoqICAgVGhpcyBpcyBhbiBpbXBsZW1ldGF0aW9uIG9mIGEgRmxvdyBOb24tRnVuZ2libGUgVG9rZW4KKiAgIEl0IGlzIG5vdCBhIHBhcnQgb2YgdGhlIG9mZmljaWFsIHN0YW5kYXJkIGJ1dCBpdCBpcyBhc3N1bWVkIHRvIGJlCiogICBzaW1pbGFyIHRvIGhvdyBORlRzIHdvdWxkIGltcGxlbWVudCB0aGUgY29yZSBmdW5jdGlvbmFsaXR5CioKKgoqLwoKaW1wb3J0IE5vbkZ1bmdpYmxlVG9rZW4gZnJvbSAweDFkN2U1N2FhNTU4MTc0NDgKaW1wb3J0IFZpZXdSZXNvbHZlciBmcm9tIDB4MWQ3ZTU3YWE1NTgxNzQ0OAppbXBvcnQgTWV0YWRhdGFWaWV3cyBmcm9tIDB4MWQ3ZTU3YWE1NTgxNzQ0OAppbXBvcnQgRnVuZ2libGVUb2tlbiBmcm9tIDB4ZjIzM2RjZWU4OGZlMGFiZQoKYWNjZXNzKGFsbCkgY29udHJhY3QgSFdHYXJhZ2VQYWNrOiBOb25GdW5naWJsZVRva2VuIHsKCiAgICAvKiAKICAgICogICBOb25GdW5naWJsZVRva2VuIFN0YW5kYXJkIEV2ZW50cwogICAgKi8KCiAgICBhY2Nlc3MoYWxsKSBldmVudCBDb250cmFjdEluaXRpYWxpemVkKCkKICAgIGFjY2VzcyhhbGwpIGV2ZW50IFdpdGhkcmF3KGlkOiBVSW50NjQsIGZyb206IEFkZHJlc3M/KQogICAgYWNjZXNzKGFsbCkgZXZlbnQgRGVwb3NpdChpZDogVUludDY0LCB0bzogQWRkcmVzcz8pCgogICAgLyogCiAgICAqICAgUHJvamVjdCBFdmVudHMKICAgICovCgogICAgYWNjZXNzKGFsbCkgZXZlbnQgTWludChpZDogVUludDY0KQogICAgYWNjZXNzKGFsbCkgZXZlbnQgQnVybihpZDogVUludDY0KQogICAgYWNjZXNzKGFsbCkgZXZlbnQgRGVwb3NpdEV2ZW50KAogICAgICAgIHV1aWQ6IFVJbnQ2NCwKICAgICAgICBpZDogVUludDY0LAogICAgICAgIHNlcmllc0lkOiBVSW50NjQsCiAgICAgICAgZWRpdGlvbklkOiBVSW50NjQsCiAgICAgICAgdG86IEFkZHJlc3M/CiAgICApCiAgICBhY2Nlc3MoYWxsKSBldmVudCBUcmFuc2ZlckV2ZW50KAogICAgICAgIHV1aWQ6IFVJbnQ2NCwKICAgICAgICBpZDogVUludDY0LAogICAgICAgIHNlcmllc0lkOiBVSW50NjQsCiAgICAgICAgZWRpdGlvbklkOiBVSW50NjQsCiAgICAgICAgdG86IEFkZHJlc3M/CiAgICApCgogICAgLyogCiAgICAqICAgTmFtZWQgUGF0aHMKICAgICovCgogICAgYWNjZXNzKGFsbCkgbGV0IENvbGxlY3Rpb25TdG9yYWdlUGF0aDogU3RvcmFnZVBhdGgKICAgIGFjY2VzcyhhbGwpIGxldCBDb2xsZWN0aW9uUHVibGljUGF0aDogUHVibGljUGF0aAoKICAgIC8qIAogICAgKiAgIE5vbkZ1bmdpYmxlVG9rZW4gU3RhbmRhcmQgRmllbGRzCiAgICAqLwoKICAgIGFjY2VzcyhhbGwpIHZhciB0b3RhbFN1cHBseTogVUludDY0CgogICAgLyoKICAgICogICBQYWNrIFN0YXRlIFZhcmlhYmxlcwogICAgKi8KCiAgICBhY2Nlc3MoYWxsKSB2YXIgbmFtZTogU3RyaW5nCgogICAgYWNjZXNzKHNlbGYpIHZhciBjb2xsZWN0aW9uTWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30KICAgIGFjY2VzcyhzZWxmKSBsZXQgaWRUb1BhY2tNZXRhZGF0YToge1VJbnQ2NDogUGFja01ldGFkYXRhfQoKICAgIGFjY2VzcyhhbGwpIHN0cnVjdCBQYWNrTWV0YWRhdGEgewogICAgICAgIGFjY2VzcyhhbGwpIGxldCBtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfQoKICAgICAgICBpbml0KG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9KSB7CiAgICAgICAgICAgIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YQogICAgICAgIH0KICAgIH0KCiAgICBhY2Nlc3MoYWxsKSByZXNvdXJjZSBORlQ6IE5vbkZ1bmdpYmxlVG9rZW4uTkZUIHsKICAgICAgICBhY2Nlc3MoYWxsKSBsZXQgaWQ6IFVJbnQ2NAogICAgICAgIGFjY2VzcyhhbGwpIGxldCBwYWNrSUQ6IFVJbnQ2NAogICAgICAgIGFjY2VzcyhhbGwpIGxldCBwYWNrRWRpdGlvbklEOiBVSW50NjQKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRNZXRhZGF0YSgpOiB7U3RyaW5nOiBTdHJpbmd9IHsKICAgICAgICAgICAgaWYgKEhXR2FyYWdlUGFjay5pZFRvUGFja01ldGFkYXRhW3NlbGYuaWRdICE9IG5pbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhXR2FyYWdlUGFjay5pZFRvUGFja01ldGFkYXRhW3NlbGYuaWRdIS5tZXRhZGF0YQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGluaXQoaWQ6IFVJbnQ2NCwgcGFja0lEOiBVSW50NjQsIHBhY2tFZGl0aW9uSUQ6IFVJbnQ2NCkgewogICAgICAgICAgICBzZWxmLmlkID0gaWQKICAgICAgICAgICAgc2VsZi5wYWNrSUQgPSBwYWNrSUQKICAgICAgICAgICAgc2VsZi5wYWNrRWRpdGlvbklEID0gcGFja0VkaXRpb25JRAogICAgICAgICAgICBlbWl0IE1pbnQoaWQ6IHNlbGYuaWQpCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gY3JlYXRlRW1wdHlDb2xsZWN0aW9uKCk6IEB7Tm9uRnVuZ2libGVUb2tlbi5Db2xsZWN0aW9ufSB7CiAgICAgICAgICAgIHJldHVybiA8LUhXR2FyYWdlUGFjay5jcmVhdGVFbXB0eUNvbGxlY3Rpb24obmZ0VHlwZTogVHlwZTxASFdHYXJhZ2VQYWNrLk5GVD4oKSkKICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldFZpZXdzKCk6IFtUeXBlXSB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuRGlzcGxheT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTD4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCkKICAgICAgICAgICAgXQogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gcmVzb2x2ZVZpZXcoXyB2aWV3OiBUeXBlKTogQW55U3RydWN0PyB7CiAgICAgICAgICAgIHN3aXRjaCB2aWV3IHsKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLkRpc3BsYXk+KCk6CiAgICAgICAgICAgICAgICAgICAgdmFyIGlwZnNJbWFnZTogTWV0YWRhdGFWaWV3cy5JUEZTRmlsZSA9IE1ldGFkYXRhVmlld3MuSVBGU0ZpbGUoY2lkOiAiTm8gdGh1bWJuYWlsIGNpZCBzZXQiLCBwYXRoOiAiTm8gdGh1bWJuYWlsIHBhdGggc2V0IikKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRNZXRhZGF0YSgpLmNvbnRhaW5zS2V5KCJ0aHVtYm5haWxDSUQiKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpcGZzSW1hZ2UgPSBNZXRhZGF0YVZpZXdzLklQRlNGaWxlKGNpZDogc2VsZi5nZXRNZXRhZGF0YSgpWyJ0aHVtYm5haWxDSUQiXSEsIHBhdGg6IHNlbGYuZ2V0TWV0YWRhdGEoKVsidGh1bWJuYWlsUGF0aCJdKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5EaXNwbGF5KAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZWxmLmdldE1ldGFkYXRhKClbIm5hbWUiXSA/PyAiSG90IFdoZWVscyBHYXJhZ2UgU2VyaWVzIDQgUGFjayAjIi5jb25jYXQoc2VsZi5wYWNrRWRpdGlvbklELnRvU3RyaW5nKCkpLAogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogc2VsZi5nZXRNZXRhZGF0YSgpWyJkZXNjcmlwdGlvbiJdID8/ICJEaWdpdGFsIFBhY2sgQ29sbGVjdGFibGUgZnJvbSBIb3QgV2hlZWxzIEdhcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbDogaXBmc0ltYWdlCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMPigpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMKCIiKQoKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EYXRhPigpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBIV0dhcmFnZVBhY2sucmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU8QEhXR2FyYWdlUGFjay5ORlQ+KCksIHZpZXdUeXBlOiBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRhdGE+KCkpCgogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXk+KCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhXR2FyYWdlUGFjay5yZXNvbHZlQ29udHJhY3RWaWV3KHJlc291cmNlVHlwZTogVHlwZTxASFdHYXJhZ2VQYWNrLk5GVD4oKSwgdmlld1R5cGU6IFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKSkKCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCk6IAogICAgICAgICAgICAgICAgICAgIHJldHVybiBIV0dhcmFnZVBhY2sucmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU8QEhXR2FyYWdlUGFjay5ORlQ+KCksIHZpZXdUeXBlOiBUeXBlPE1ldGFkYXRhVmlld3MuUm95YWx0aWVzPigpKQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmlsCiAgICAgICAgfQp9CgogICAgYWNjZXNzKGFsbCkgcmVzb3VyY2UgaW50ZXJmYWNlIFBhY2tDb2xsZWN0aW9uUHVibGljIHt9CgogICAgYWNjZXNzKGFsbCkgcmVzb3VyY2UgQ29sbGVjdGlvbjogUGFja0NvbGxlY3Rpb25QdWJsaWMsIE5vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbiB7CgogICAgICAgIGFjY2VzcyhhbGwpIHZhciBvd25lZE5GVHM6IEB7VUludDY0OiB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9fQoKICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gZGVwb3NpdCh0b2tlbjogQHtOb25GdW5naWJsZVRva2VuLk5GVH0pIHsKICAgICAgICAgICAgbGV0IEhXR2FyYWdlUGFjazogQEhXR2FyYWdlUGFjay5ORlQgPC0gdG9rZW4gYXMhIEBIV0dhcmFnZVBhY2suTkZUCiAgICAgICAgICAgIGxldCBIV0dhcmFnZVBhY2tVVUlEOiBVSW50NjQgPSBIV0dhcmFnZVBhY2sudXVpZAogICAgICAgICAgICBsZXQgSFdHYXJhZ2VQYWNrU2VyaWVzSUQ6IFVJbnQ2NCA9IDQKICAgICAgICAgICAgbGV0IEhXR2FyYWdlUGFja0lEOiBVSW50NjQgPSBIV0dhcmFnZVBhY2suaWQKICAgICAgICAgICAgbGV0IEhXR2FyYWdlUGFja3BhY2tFZGl0aW9uSUQ6IFVJbnQ2NCA9IEhXR2FyYWdlUGFjay5wYWNrRWRpdGlvbklECgogICAgICAgICAgICBzZWxmLm93bmVkTkZUc1tIV0dhcmFnZVBhY2tJRF0gPC0hIEhXR2FyYWdlUGFjawogICAgICAgICAgICBlbWl0IERlcG9zaXQoaWQ6IEhXR2FyYWdlUGFja0lELCB0bzogc2VsZi5vd25lcj8uYWRkcmVzcykKICAgICAgICAgICAgZW1pdCBEZXBvc2l0RXZlbnQoCiAgICAgICAgICAgICAgICB1dWlkOiBIV0dhcmFnZVBhY2tVVUlELAogICAgICAgICAgICAgICAgaWQ6IEhXR2FyYWdlUGFja0lELAogICAgICAgICAgICAgICAgc2VyaWVzSWQ6IEhXR2FyYWdlUGFja1Nlcmllc0lELAogICAgICAgICAgICAgICAgZWRpdGlvbklkOiBIV0dhcmFnZVBhY2twYWNrRWRpdGlvbklELAogICAgICAgICAgICAgICAgdG86IHNlbGYub3duZXI/LmFkZHJlc3MKICAgICAgICAgICAgKQogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0TGVuZ3RoKCk6IEludCB7CiAgICAgICAgICAgIHJldHVybiBzZWxmLm93bmVkTkZUcy5sZW5ndGgKICAgICAgICB9CgogICAgICAgIGluaXQoKSB7CiAgICAgICAgICAgIHNlbGYub3duZWRORlRzIDwtIHt9CiAgICAgICAgfQoKICAgICAgICAvLy8gZ2V0U3VwcG9ydGVkTkZUVHlwZXMgcmV0dXJucyBhIGxpc3Qgb2YgTkZUIHR5cGVzIHRoYXQgdGhpcyByZWNlaXZlciBhY2NlcHRzCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0U3VwcG9ydGVkTkZUVHlwZXMoKToge1R5cGU6IEJvb2x9IHsKICAgICAgICAgICAgbGV0IHN1cHBvcnRlZFR5cGVzOiB7VHlwZTogQm9vbH0gPSB7fQogICAgICAgICAgICBzdXBwb3J0ZWRUeXBlc1tUeXBlPEBIV0dhcmFnZVBhY2suTkZUPigpXSA9IHRydWUKICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRlZFR5cGVzCiAgICAgICAgfQoKICAgICAgICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gdHlwZSBpcyBhY2NlcHRlZCBieSB0aGUgY29sbGVjdGlvbgogICAgICAgIC8vLyBBIGNvbGxlY3Rpb24gdGhhdCBjYW4gYWNjZXB0IGFueSB0eXBlIHNob3VsZCBqdXN0IHJldHVybiB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBpc1N1cHBvcnRlZE5GVFR5cGUodHlwZTogVHlwZSk6IEJvb2wgewogICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBUeXBlPEBIV0dhcmFnZVBhY2suTkZUPigpCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoTm9uRnVuZ2libGVUb2tlbi5XaXRoZHJhdykgZnVuIHdpdGhkcmF3KHdpdGhkcmF3SUQ6IFVJbnQ2NCk6IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9IHsKICAgICAgICAgICAgbGV0IHRva2VuOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSA8LSBzZWxmLm93bmVkTkZUcy5yZW1vdmUoa2V5OiB3aXRoZHJhd0lEKSA/PyBwYW5pYygibWlzc2luZyBORlQiKQogICAgICAgICAgICBlbWl0IFdpdGhkcmF3KGlkOiB0b2tlbi5pZCwgZnJvbTogc2VsZi5vd25lcj8uYWRkcmVzcykKICAgICAgICAgICAgcmV0dXJuIDwtIHRva2VuCiAgICAgICAgfQoKICAgICAgICAvLyBhY2Nlc3MoYWxsKSBmdW4gZGVzdHJveU5GVChpZDogVUludDY0KSB7CiAgICAgICAgLy8gICAgIGxldCBuZnQgPC0gc2VsZi5vd25lZE5GVHMucmVtb3ZlKGtleTogaWQpID8/IHBhbmljKCJORlQgbm90IGZvdW5kIGluIGFjY291bnQiKQogICAgICAgIC8vICAgICBlbWl0IEJ1cm4oaWQ6IG5mdC5pZCkKICAgICAgICAvLyAgICAgZGVzdHJveSBuZnQKICAgICAgICAvLyB9CgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldElEcygpOiBbVUludDY0XSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmLm93bmVkTkZUcy5rZXlzCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBib3Jyb3dORlQoXyBpZDogVUludDY0KTogJntOb25GdW5naWJsZVRva2VuLk5GVH0/IHsKICAgICAgICAgICAgcmV0dXJuICgmc2VsZi5vd25lZE5GVHNbaWRdKQogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gYm9ycm93UGFjayhpZDogVUludDY0KTogJk5GVD8gewogICAgICAgICAgICBpZiBsZXQgcGFjazogJntOb25GdW5naWJsZVRva2VuLk5GVH0gPSAmc2VsZi5vd25lZE5GVHNbaWRdIHsKICAgICAgICAgICAgICAgIHJldHVybiBwYWNrIGFzISAmTkZUCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5pbAogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gYm9ycm93Vmlld1Jlc29sdmVyKGlkOiBVSW50NjQpOiAme1ZpZXdSZXNvbHZlci5SZXNvbHZlcn0/IHsKICAgICAgICAgICAgaWYgbGV0IG5mdFJlZjogJntOb25GdW5naWJsZVRva2VuLk5GVH0gPSAmc2VsZi5vd25lZE5GVHNbaWRdIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZnRSZWYgYXMgJntWaWV3UmVzb2x2ZXIuUmVzb2x2ZXJ9CiAgICAgICAgICAgIH0KICAgICAgICByZXR1cm4gbmlsCiAgICAgICAgfQoKCiAgICAgICAgLy8vIEFsbG93cyBhIGdpdmVuIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdAogICAgICAgIC8vLyBvZiBvd25lZCBORlQgSURzIGluIGEgY29sbGVjdGlvbiB3aXRob3V0IGZpcnN0CiAgICAgICAgLy8vIGhhdmluZyB0byBsb2FkIHRoZSBlbnRpcmUgbGlzdCBpbnRvIG1lbW9yeQogICAgICAgIGFjY2VzcyhhbGwpIGZ1biBmb3JFYWNoSUQoXyBmOiBmdW4oVUludDY0KTogQm9vbCkgewogICAgICAgICAgICBzZWxmLm93bmVkTkZUcy5mb3JFYWNoS2V5KGYpCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gY3JlYXRlRW1wdHlDb2xsZWN0aW9uKCk6IEB7Tm9uRnVuZ2libGVUb2tlbi5Db2xsZWN0aW9ufSB7CiAgICAgICAgICAgIHJldHVybiA8LSBIV0dhcmFnZVBhY2suY3JlYXRlRW1wdHlDb2xsZWN0aW9uKG5mdFR5cGU6IFR5cGU8QEhXR2FyYWdlUGFjay5ORlQ+KCkpCiAgICAgICAgfQogICAgfQoKCiAgICAvKiAKICAgICogICBQdWJsaWMgRnVuY3Rpb25zCiAgICAqLwoKICAgIGFjY2VzcyhhbGwpIGZ1biBjcmVhdGVFbXB0eUNvbGxlY3Rpb24obmZ0VHlwZTogVHlwZSk6IEB7Tm9uRnVuZ2libGVUb2tlbi5Db2xsZWN0aW9ufSB7CiAgICAgICAgcmV0dXJuIDwtIGNyZWF0ZSBDb2xsZWN0aW9uKCkKICAgIH0KCiAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRUb3RhbFN1cHBseSgpOiBVSW50NjQgewogICAgICAgIHJldHVybiBzZWxmLnRvdGFsU3VwcGx5CiAgICB9CgogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0TmFtZSgpOiBTdHJpbmcgewogICAgICAgIHJldHVybiBzZWxmLm5hbWUKICAgIH0KCiAgICBhY2Nlc3MoYWxsKSBmdW4gdHJhbnNmZXIodXVpZDogVUludDY0LCBpZDogVUludDY0LCBwYWNrU2VyaWVzSWQ6IFVJbnQ2NCwgcGFja0VkaXRpb25JZDogVUludDY0LCB0b0FkZHJlc3M6IEFkZHJlc3MpIHsKCiAgICAgICAgbGV0IEhXR2FyYWdlUGFja1YyVVVJRDogVUludDY0ID0gdXVpZAogICAgICAgIGxldCBIV0dhcmFnZVBhY2tWMlNlcmllc0lkOiBVSW50NjQgPSBwYWNrU2VyaWVzSWQKICAgICAgICBsZXQgSFdHYXJhZ2VQYWNrVjJJRDogVUludDY0ID0gaWQKICAgICAgICBsZXQgSFdHYXJhZ2VQYWNrVjJwYWNrRWRpdGlvbklEOiBVSW50NjQgPSBwYWNrRWRpdGlvbklkCgogICAgICAgIGVtaXQgVHJhbnNmZXJFdmVudCgKICAgICAgICAgICAgdXVpZDogSFdHYXJhZ2VQYWNrVjJVVUlELAogICAgICAgICAgICBpZDogSFdHYXJhZ2VQYWNrVjJJRCwKICAgICAgICAgICAgc2VyaWVzSWQ6IEhXR2FyYWdlUGFja1YyU2VyaWVzSWQsCiAgICAgICAgICAgIGVkaXRpb25JZDogSFdHYXJhZ2VQYWNrVjJwYWNrRWRpdGlvbklELAogICAgICAgICAgICB0bzogdG9BZGRyZXNzCiAgICAgICAgKQogICAgfQoKICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldENvbGxlY3Rpb25NZXRhZGF0YSgpOiB7U3RyaW5nOiBTdHJpbmd9IHsKICAgICAgICByZXR1cm4gc2VsZi5jb2xsZWN0aW9uTWV0YWRhdGEKICAgIH0KCiAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRFZGl0aW9uTWV0YWRhdGEoXyBlZGl0aW9uOiBVSW50NjQpOiB7U3RyaW5nOiBTdHJpbmd9IHsKICAgICAgICBpZiAoc2VsZi5pZFRvUGFja01ldGFkYXRhW2VkaXRpb25dICE9IG5pbCkgewogICAgICAgICAgICByZXR1cm4gc2VsZi5pZFRvUGFja01ldGFkYXRhW2VkaXRpb25dIS5tZXRhZGF0YQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB7fQogICAgICAgIH0KICAgIH0KCiAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRNZXRhZGF0YUxlbmd0aCgpOiBJbnQgewogICAgICAgIHJldHVybiBzZWxmLmlkVG9QYWNrTWV0YWRhdGEubGVuZ3RoCiAgICB9CgogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0UGFja01ldGFkYXRhKCk6IEFueVN0cnVjdCB7CiAgICAgICAgcmV0dXJuIHNlbGYuaWRUb1BhY2tNZXRhZGF0YQogICAgfQoKICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldENvbnRyYWN0Vmlld3MocmVzb3VyY2VUeXBlOiBUeXBlPyk6IFtUeXBlXSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EYXRhPigpLAogICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXk+KCksCiAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCkKICAgICAgICBdCiAgICB9CgogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gcmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU/LCB2aWV3VHlwZTogVHlwZSk6IEFueVN0cnVjdD8gewogICAgICAgIHN3aXRjaCB2aWV3VHlwZSB7CiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVBhdGg6IEhXR2FyYWdlUGFjay5Db2xsZWN0aW9uU3RvcmFnZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY1BhdGg6IEhXR2FyYWdlUGFjay5Db2xsZWN0aW9uUHVibGljUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljQ29sbGVjdGlvbjogVHlwZTwmSFdHYXJhZ2VQYWNrLkNvbGxlY3Rpb24+KCksCiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0xpbmtlZFR5cGU6IFR5cGU8JkhXR2FyYWdlUGFjay5Db2xsZWN0aW9uPigpLAogICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVFbXB0eUNvbGxlY3Rpb25GdW5jdGlvbjogKGZ1biAoKTogQHtOb25GdW5naWJsZVRva2VuLkNvbGxlY3Rpb259IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8LUhXR2FyYWdlUGFjay5jcmVhdGVFbXB0eUNvbGxlY3Rpb24obmZ0VHlwZTogVHlwZTxASFdHYXJhZ2VQYWNrLk5GVD4oKSkKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXk+KCk6CiAgICAgICAgICAgICAgICAgICAgbGV0IGV4dGVybmFsVVJMID0gTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgiIikKICAgICAgICAgICAgICAgICAgICBsZXQgc3F1YXJlSW1hZ2UgPSBNZXRhZGF0YVZpZXdzLk1lZGlhKAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBNZXRhZGF0YVZpZXdzLkhUVFBGaWxlKHVybDogIiIpLAogICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6ICJpbWFnZS9wbmciCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGxldCBiYW5uZXJJbWFnZSA9IE1ldGFkYXRhVmlld3MuTWVkaWEoCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IE1ldGFkYXRhVmlld3MuSFRUUEZpbGUodXJsOiAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogImltYWdlL3BuZyIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgbGV0IHNvY2lhbE1hcDoge1N0cmluZzogTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTH0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoImh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9ob3R3aGVlbHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhZ3JhbSI6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoImh0dHBzOi8vd3d3Lmluc3RhZ3JhbS5jb20vaG90d2hlZWxzb2ZmaWNpYWwvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgiaHR0cHM6Ly90d2l0dGVyLmNvbS9Ib3RfV2hlZWxzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICJkaXNjb3JkIjogTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgiaHR0cHM6Ly9kaXNjb3JkLmdnL21hdHRlbCIpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EaXNwbGF5KAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAiSG90IFdoZWVscyBHYXJhZ2UgUGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAiRGlnaXRhbCBDb2xsZWN0YWJsZSBmcm9tIEhvdCBXaGVlbHMgR2FyYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxVUkw6IGV4dGVybmFsVVJMLAogICAgICAgICAgICAgICAgICAgICAgICBzcXVhcmVJbWFnZTogc3F1YXJlSW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGJhbm5lckltYWdlOiBiYW5uZXJJbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgc29jaWFsczogc29jaWFsTWFwCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVmlld3MuUm95YWx0aWVzKFtdKQogICAgICAgIH0KICAgICAgICByZXR1cm4gbmlsCiAgICB9CiAgICAvKiAKICAgICogICBBZG1pbiBGdW5jdGlvbnMKICAgICovCiAgICBhY2Nlc3MoYWNjb3VudCkgZnVuIHNldEVkaXRpb25NZXRhZGF0YShlZGl0aW9uTnVtYmVyOiBVSW50NjQsIG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9KSB7CiAgICAgICAgc2VsZi5pZFRvUGFja01ldGFkYXRhW2VkaXRpb25OdW1iZXJdID0gUGFja01ldGFkYXRhKG1ldGFkYXRhOiBtZXRhZGF0YSkKICAgIH0KCiAgICBhY2Nlc3MoYWNjb3VudCkgZnVuIHNldENvbGxlY3Rpb25NZXRhZGF0YShtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfSkgewogICAgICAgIHNlbGYuY29sbGVjdGlvbk1ldGFkYXRhID0gbWV0YWRhdGEKICAgIH0KCiAgICBhY2Nlc3MoYWNjb3VudCkgZnVuIG1pbnQobmZ0SUQ6IFVJbnQ2NCwgcGFja0lEOiBVSW50NjQsIHBhY2tFZGl0aW9uSUQ6IFVJbnQ2NCk6IEBORlQgewogICAgICAgIHNlbGYudG90YWxTdXBwbHkgPSBzZWxmLnRvdGFsU3VwcGx5ICsgMQogICAgICAgIHJldHVybiA8LSBjcmVhdGUgTkZUKGlkOiBuZnRJRCwgcGFja0lEOiBwYWNrSUQsIHBhY2tFZGl0aW9uSUQ6IHBhY2tFZGl0aW9uSUQpCiAgICB9CgogICAgLy8gaW5pdGlhbGl6ZSBjb250cmFjdCBzdGF0ZSB2YXJpYWJsZXMKICAgIGluaXQoKSB7CiAgICAgICAgc2VsZi5uYW1lID0gIkhXR2FyYWdlUGFjayIKICAgICAgICBzZWxmLnRvdGFsU3VwcGx5ID0gMAoKICAgICAgICBzZWxmLmNvbGxlY3Rpb25NZXRhZGF0YSA9IHt9CiAgICAgICAgc2VsZi5pZFRvUGFja01ldGFkYXRhID0ge30KCiAgICAgICAgLy8gc2V0IHRoZSBuYW1lZCBwYXRocwogICAgICAgIHNlbGYuQ29sbGVjdGlvblN0b3JhZ2VQYXRoID0gL3N0b3JhZ2UvSFdHYXJhZ2VQYWNrQ29sbGVjdGlvbgogICAgICAgIHNlbGYuQ29sbGVjdGlvblB1YmxpY1BhdGggPSAvcHVibGljL0hXR2FyYWdlUGFja0NvbGxlY3Rpb24KCiAgICAgICAgLy8gQ3JlYXRlIGEgY29sbGVjdGlvbiByZXNvdXJjZSBhbmQgc2F2ZSBpdCB0byBzdG9yYWdlCiAgICAgICAgbGV0IGNvbGxlY3Rpb246IEBIV0dhcmFnZVBhY2suQ29sbGVjdGlvbiA8LSBjcmVhdGUgQ29sbGVjdGlvbigpCiAgICAgICAgc2VsZi5hY2NvdW50LnN0b3JhZ2Uuc2F2ZSg8LWNvbGxlY3Rpb24sIHRvOiBzZWxmLkNvbGxlY3Rpb25TdG9yYWdlUGF0aCkKCiAgICAgICAgbGV0IGNvbGxlY3Rpb25DYXAgPSBzZWxmLmFjY291bnQuY2FwYWJpbGl0aWVzLnN0b3JhZ2UuaXNzdWU8JkhXR2FyYWdlUGFjay5Db2xsZWN0aW9uPihzZWxmLkNvbGxlY3Rpb25TdG9yYWdlUGF0aCkKICAgICAgICBzZWxmLmFjY291bnQuY2FwYWJpbGl0aWVzLnB1Ymxpc2goY29sbGVjdGlvbkNhcCwgYXQ6IHNlbGYuQ29sbGVjdGlvblB1YmxpY1BhdGgpCgogICAgICAgIGVtaXQgQ29udHJhY3RJbml0aWFsaXplZCgpCiAgICB9Cgp9Cg==",
		"HWGaragePackV2": "LyoKKgoqICAgVGhpcyBpcyBhbiBpbXBsZW1ldGF0aW9uIG9mIGEgRmxvdyBOb24tRnVuZ2libGUgVG9rZW4KKiAgIEl0IGlzIG5vdCBhIHBhcnQgb2YgdGhlIG9mZmljaWFsIHN0YW5kYXJkIGJ1dCBpdCBpcyBhc3N1bWVkIHRvIGJlCiogICBzaW1pbGFyIHRvIGhvdyBORlRzIHdvdWxkIGltcGxlbWVudCB0aGUgY29yZSBmdW5jdGlvbmFsaXR5CioKKgoqLwoKaW1wb3J0IE5vbkZ1bmdpYmxlVG9rZW4gZnJvbSAweDFkN2U1N2FhNTU4MTc0NDgKaW1wb3J0IEZ1bmdpYmxlVG9rZW4gZnJvbSAweGYyMzNkY2VlODhmZTBhYmUKaW1wb3J0IE1ldGFkYXRhVmlld3MgZnJvbSAweDFkN2U1N2FhNTU4MTc0NDgKaW1wb3J0IFZpZXdSZXNvbHZlciBmcm9tIDB4MWQ3ZTU3YWE1NTgxNzQ0OAoKYWNjZXNzKGFsbCkgY29udHJhY3QgSFdHYXJhZ2VQYWNrVjI6IE5vbkZ1bmdpYmxlVG9rZW4gewoKICAgIC8qIAogICAgKiAgIE5vbkZ1bmdpYmxlVG9rZW4gU3RhbmRhcmQgRXZlbnRzCiAgICAqLwogICAgYWNjZXNzKGFsbCkgZXZlbnQgQ29udHJhY3RJbml0aWFsaXplZCgpCiAgICBhY2Nlc3MoYWxsKSBldmVudCBXaXRoZHJhdyhpZDogVUludDY0LCBmcm9tOiBBZGRyZXNzPykKICAgIGFjY2VzcyhhbGwpIGV2ZW50IERlcG9zaXQoaWQ6IFVJbnQ2NCwgdG86IEFkZHJlc3M/KQoKICAgIC8qIAogICAgKiAgIFByb2plY3QgRXZlbnRzCiAgICAqLwogICAgYWNjZXNzKGFsbCkgZXZlbnQgTWludChpZDogVUludDY0KQogICAgYWNjZXNzKGFsbCkgZXZlbnQgQnVybihpZDogVUludDY0KQogICAgYWNjZXNzKGFsbCkgZXZlbnQgRGVwb3NpdEV2ZW50KAogICAgICAgIHV1aWQ6IFVJbnQ2NAogICAgICAgICwgaWQ6IFVJbnQ2NAogICAgICAgICwgc2VyaWVzSWQ6IFVJbnQ2NAogICAgICAgICwgZWRpdGlvbklkOiBVSW50NjQKICAgICAgICAsIHRvOiBBZGRyZXNzPwogICAgICAgICkKCiAgICBhY2Nlc3MoYWxsKSBldmVudCBUcmFuc2ZlckV2ZW50KAogICAgICAgIHV1aWQ6IFVJbnQ2NAogICAgICAgICwgaWQ6IFVJbnQ2NAogICAgICAgICwgc2VyaWVzSWQ6IFVJbnQ2NAogICAgICAgICwgZWRpdGlvbklkOiBVSW50NjQKICAgICAgICAsIHRvOiBBZGRyZXNzPwogICAgICAgICkKICAgIC8qIAogICAgKiAgIE5hbWVkIFBhdGhzCiAgICAqLwogICAgYWNjZXNzKGFsbCkgbGV0IENvbGxlY3Rpb25TdG9yYWdlUGF0aDogU3RvcmFnZVBhdGgKICAgIGFjY2VzcyhhbGwpIGxldCBDb2xsZWN0aW9uUHVibGljUGF0aDogUHVibGljUGF0aAoKICAgIC8qIAogICAgKiAgIE5vbkZ1bmdpYmxlVG9rZW4gU3RhbmRhcmQgRmllbGRzCiAgICAqLwogICAgYWNjZXNzKGFsbCkgdmFyIHRvdGFsU3VwcGx5OiBVSW50NjQKCiAgICAvKgogICAgKiAgIFBhY2sgU3RhdGUgVmFyaWFibGVzCiAgICAqLwogICAgYWNjZXNzKHNlbGYpIHZhciBuYW1lOiBTdHJpbmcKICAgIGFjY2VzcyhhY2NvdW50KSB2YXIgY3VycmVudFBhY2tFZGl0aW9uSWRCeVBhY2tTZXJpZXNJZDoge1VJbnQ2NDogVUludDY0fQoKCiAgICBhY2Nlc3MoYWxsKSByZXNvdXJjZSBORlQ6IE5vbkZ1bmdpYmxlVG9rZW4uTkZUIHsKICAgICAgICBhY2Nlc3MoYWxsKSBsZXQgaWQ6IFVJbnQ2NAogICAgICAgIGFjY2VzcyhhbGwpIGxldCBwYWNrU2VyaWVzSUQ6IFVJbnQ2NAogICAgICAgIGFjY2VzcyhhbGwpIGxldCBwYWNrRWRpdGlvbklEOiBVSW50NjQKICAgICAgICBhY2Nlc3MoYWxsKSBsZXQgcGFja0hhc2g6IFN0cmluZwogICAgICAgIGFjY2VzcyhhbGwpIGxldCBtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfQoKCgogICAgICAgIGluaXQoCiAgICAgICAgICAgIGlkOiBVSW50NjQKICAgICAgICAgICAgLCBwYWNrU2VyaWVzSUQ6IFVJbnQ2NAogICAgICAgICAgICAsIHBhY2tFZGl0aW9uSUQ6IFVJbnQ2NAogICAgICAgICAgICAsIHBhY2tIYXNoOiBTdHJpbmcKICAgICAgICAgICAgLCBtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfQogICAgICAgICAgICApIHsKICAgICAgICAgICAgc2VsZi5pZCA9IGlkCiAgICAgICAgICAgIHNlbGYucGFja1Nlcmllc0lEID0gcGFja1Nlcmllc0lECiAgICAgICAgICAgIHNlbGYucGFja0VkaXRpb25JRCA9IHBhY2tFZGl0aW9uSUQKICAgICAgICAgICAgc2VsZi5wYWNrSGFzaCA9IHBhY2tIYXNoCiAgICAgICAgICAgIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YQogICAgICAgICAgICBlbWl0IE1pbnQoaWQ6IHNlbGYucGFja0VkaXRpb25JRCkKICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIGZ1biBjcmVhdGVFbXB0eUNvbGxlY3Rpb24oKTogQHtOb25GdW5naWJsZVRva2VuLkNvbGxlY3Rpb259IHsKICAgICAgICAgICAgcmV0dXJuIDwtSFdHYXJhZ2VQYWNrVjIuY3JlYXRlRW1wdHlDb2xsZWN0aW9uKG5mdFR5cGU6IFR5cGU8QEhXR2FyYWdlUGFja1YyLk5GVD4oKSkKICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldFZpZXdzKCk6IFtUeXBlXSB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuRGlzcGxheT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTD4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCksCiAgICAgICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuVHJhaXRzPigpCiAgICAgICAgICAgIF0KICAgICAgICB9CgoKICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gcmVzb2x2ZVZpZXcoXyB2aWV3OiBUeXBlKTogQW55U3RydWN0PyB7CiAgICAgICAgICAgIHN3aXRjaCB2aWV3IHsKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLkRpc3BsYXk+KCk6CiAgICAgICAgICAgICAgICAgICAgdmFyIGlwZnNJbWFnZSA9IE1ldGFkYXRhVmlld3MuSVBGU0ZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIGNpZDogc2VsZi5tZXRhZGF0YVsidGh1bWJuYWlsQ0lEIl0gPz8gIk5vIFRodW1uYWlsQ0lEIHNldCIKICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXRoOiBzZWxmLm1ldGFkYXRhWyJ0aHVtYm5haWxQYXRoIl0gPz8gIiIKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXRhZGF0YVZpZXdzLkRpc3BsYXkoCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHNlbGYubWV0YWRhdGFbInBhY2tOYW1lIl0hLmNvbmNhdCgiIFNlcmllcyAiKS5jb25jYXQoc2VsZi5wYWNrU2VyaWVzSUQudG9TdHJpbmcoKSkuY29uY2F0KCIgIyIpLmNvbmNhdChzZWxmLnBhY2tFZGl0aW9uSUQudG9TdHJpbmcoKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzZWxmLm1ldGFkYXRhWyJwYWNrRGVzY3JpcHRpb24iXSA/PyAiRGlnaXRhbCBQYWNrIENvbGxlY3RhYmxlIGZyb20gSG90IFdoZWVscyBHYXJhZ2UiICwKICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsOiBpcGZzSW1hZ2UKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkw+KCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGFbInVybCJdID8/ICIiCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFdHYXJhZ2VQYWNrVjIucmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU8QEhXR2FyYWdlUGFja1YyLk5GVD4oKSwgdmlld1R5cGU6IFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXk+KCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhXR2FyYWdlUGFja1YyLnJlc29sdmVDb250cmFjdFZpZXcocmVzb3VyY2VUeXBlOiBUeXBlPEBIV0dhcmFnZVBhY2tWMi5ORlQ+KCksIHZpZXdUeXBlOiBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXk+KCkpCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5UcmFpdHM+KCk6IAogICAgICAgICAgICAgICAgICAgIGxldCBleGNsdWRlZFRyYWl0cyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGh1bWJuYWlsUGF0aCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJ0aHVtYm5haWxDSUQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiY29sbGVjdGlvbk5hbWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiY29sbGVjdGlvbkRlc2NyaXB0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgInBhY2tEZXNjcmlwdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJ1cmwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgbGV0IHRyYWl0c1ZpZXcgPSBNZXRhZGF0YVZpZXdzLmRpY3RUb1RyYWl0cygKICAgICAgICAgICAgICAgICAgICAgICAgZGljdDogc2VsZi5tZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWROYW1lczpleGNsdWRlZFRyYWl0cwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBsZXQgcGFja0hhc2hUcmFpdCA9IE1ldGFkYXRhVmlld3MuVHJhaXQoCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJwYWNrSGFzaCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxmLnBhY2tIYXNoLAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VHlwZTogIlN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJhcml0eTogbmlsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHRyYWl0c1ZpZXcuYWRkVHJhaXQocGFja0hhc2hUcmFpdCkKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzVmlldwogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuUm95YWx0aWVzPigpOiAKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFdHYXJhZ2VQYWNrVjIucmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU8QEhXR2FyYWdlUGFja1YyLk5GVD4oKSwgdmlld1R5cGU6IFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCkpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuaWwKICAgICAgICB9CgoKICAgIH0KCiAgICBhY2Nlc3MoYWxsKSByZXNvdXJjZSBpbnRlcmZhY2UgUGFja0NvbGxlY3Rpb25QdWJsaWMge30KCiAgICBhY2Nlc3MoYWxsKSByZXNvdXJjZSBDb2xsZWN0aW9uOiBQYWNrQ29sbGVjdGlvblB1YmxpYywgTm9uRnVuZ2libGVUb2tlbi5Db2xsZWN0aW9uIHsKICAgICAgICBhY2Nlc3MoYWxsKSB2YXIgb3duZWRORlRzOiBAe1VJbnQ2NDoge05vbkZ1bmdpYmxlVG9rZW4uTkZUfX0KCiAgICAgICAgaW5pdCgpIHsKICAgICAgICAgICAgc2VsZi5vd25lZE5GVHMgPC0ge30KICAgICAgICB9CgogICAgICAgIC8vLyBnZXRTdXBwb3J0ZWRORlRUeXBlcyByZXR1cm5zIGEgbGlzdCBvZiBORlQgdHlwZXMgdGhhdCB0aGlzIHJlY2VpdmVyIGFjY2VwdHMKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRTdXBwb3J0ZWRORlRUeXBlcygpOiB7VHlwZTogQm9vbH0gewogICAgICAgICAgICBsZXQgc3VwcG9ydGVkVHlwZXM6IHtUeXBlOiBCb29sfSA9IHt9CiAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzW1R5cGU8QEhXR2FyYWdlUGFja1YyLk5GVD4oKV0gPSB0cnVlCiAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRUeXBlcwogICAgICAgIH0KCiAgICAgICAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHR5cGUgaXMgYWNjZXB0ZWQgYnkgdGhlIGNvbGxlY3Rpb24KICAgICAgICAvLy8gQSBjb2xsZWN0aW9uIHRoYXQgY2FuIGFjY2VwdCBhbnkgdHlwZSBzaG91bGQganVzdCByZXR1cm4gdHJ1ZSBieSBkZWZhdWx0CiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gaXNTdXBwb3J0ZWRORlRUeXBlKHR5cGU6IFR5cGUpOiBCb29sIHsKICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gVHlwZTxASFdHYXJhZ2VQYWNrVjIuTkZUPigpCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoTm9uRnVuZ2libGVUb2tlbi5XaXRoZHJhdykgZnVuIHdpdGhkcmF3KHdpdGhkcmF3SUQ6IFVJbnQ2NCk6IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9IHsKICAgICAgICAgICAgbGV0IEhXR2FyYWdlUGFja1YyIDwtIHNlbGYub3duZWRORlRzLnJlbW92ZSgKICAgICAgICAgICAgICAgIGtleTogd2l0aGRyYXdJRAogICAgICAgICAgICAgICAgKSA/PyBwYW5pYygibWlzc2luZyBORlQiKQogICAgICAgICAgICBlbWl0IFdpdGhkcmF3KAogICAgICAgICAgICAgICAgaWQ6IEhXR2FyYWdlUGFja1YyLmlkLAogICAgICAgICAgICAgICAgZnJvbTogc2VsZi5vd25lcj8uYWRkcmVzcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gPC1IV0dhcmFnZVBhY2tWMgogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGRlcG9zaXQodG9rZW46IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9KSB7CiAgICAgICAgICAgIGxldCBIV0dhcmFnZVBhY2tWMiA8LSB0b2tlbiBhcyEgQEhXR2FyYWdlUGFja1YyLk5GVAogICAgICAgICAgICBsZXQgSFdHYXJhZ2VQYWNrVjJVVUlEOiBVSW50NjQgPSBIV0dhcmFnZVBhY2tWMi51dWlkCiAgICAgICAgICAgIGxldCBIV0dhcmFnZVBhY2tWMlNlcmllc0lEOiBVSW50NjQgPSBIV0dhcmFnZVBhY2tWMi5wYWNrU2VyaWVzSUQKICAgICAgICAgICAgbGV0IEhXR2FyYWdlUGFja1YySUQ6IFVJbnQ2NCA9IEhXR2FyYWdlUGFja1YyLmlkCiAgICAgICAgICAgIGxldCBIV0dhcmFnZVBhY2tWMnBhY2tFZGl0aW9uSUQ6IFVJbnQ2NCA9IEhXR2FyYWdlUGFja1YyLnBhY2tFZGl0aW9uSUQKICAgICAgICAgICAgCiAgICAgICAgICAgIHNlbGYub3duZWRORlRzW0hXR2FyYWdlUGFja1YySURdIDwtISBIV0dhcmFnZVBhY2tWMgogICAgICAgICAgICAKICAgICAgICAgICAgZW1pdCBEZXBvc2l0KAogICAgICAgICAgICAgICAgaWQ6IEhXR2FyYWdlUGFja1YySUQsCiAgICAgICAgICAgICAgICB0bzogc2VsZi5vd25lcj8uYWRkcmVzcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbWl0IERlcG9zaXRFdmVudCgKICAgICAgICAgICAgICAgIHV1aWQ6IEhXR2FyYWdlUGFja1YyVVVJRCwKICAgICAgICAgICAgICAgIGlkOiBIV0dhcmFnZVBhY2tWMklELAogICAgICAgICAgICAgICAgc2VyaWVzSWQ6IEhXR2FyYWdlUGFja1YyU2VyaWVzSUQsCiAgICAgICAgICAgICAgICBlZGl0aW9uSWQ6IEhXR2FyYWdlUGFja1YycGFja0VkaXRpb25JRCwKICAgICAgICAgICAgICAgIHRvOiBzZWxmLm93bmVyPy5hZGRyZXNzCiAgICAgICAgICAgICAgICApCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRJRHMoKTogW1VJbnQ2NF0gewogICAgICAgICAgICByZXR1cm4gc2VsZi5vd25lZE5GVHMua2V5cwogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gYm9ycm93TkZUKF8gaWQ6IFVJbnQ2NCk6ICZ7Tm9uRnVuZ2libGVUb2tlbi5ORlR9PyB7CiAgICAgICAgICAgIHJldHVybiAoJnNlbGYub3duZWRORlRzW2lkXSkKICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGJvcnJvd1BhY2soaWQ6IFVJbnQ2NCk6ICZORlQ/IHsKICAgICAgICAgICAgaWYgbGV0IHBhY2tSZWY6ICZ7Tm9uRnVuZ2libGVUb2tlbi5ORlR9ID0gJnNlbGYub3duZWRORlRzW2lkXSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFja1JlZiBhcyEgJk5GVAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG5pbAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBib3Jyb3dWaWV3UmVzb2x2ZXIoaWQ6IFVJbnQ2NCk6ICZ7Vmlld1Jlc29sdmVyLlJlc29sdmVyfT8gewogICAgICAgICAgICBpZiBsZXQgbmZ0UmVmOiAme05vbkZ1bmdpYmxlVG9rZW4uTkZUfSA9ICZzZWxmLm93bmVkTkZUc1tpZF0gewogICAgICAgICAgICAgICAgcmV0dXJuIG5mdFJlZiBhcyAme1ZpZXdSZXNvbHZlci5SZXNvbHZlcn0KICAgICAgICAgICAgfQogICAgICAgIHJldHVybiBuaWwKICAgICAgICB9CgogICAgICAgIC8vLyBBbGxvd3MgYSBnaXZlbiBmdW5jdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3QKICAgICAgICAvLy8gb2Ygb3duZWQgTkZUIElEcyBpbiBhIGNvbGxlY3Rpb24gd2l0aG91dCBmaXJzdAogICAgICAgIC8vLyBoYXZpbmcgdG8gbG9hZCB0aGUgZW50aXJlIGxpc3QgaW50byBtZW1vcnkKICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gZm9yRWFjaElEKF8gZjogZnVuKFVJbnQ2NCk6IEJvb2wpIHsKICAgICAgICAgICAgc2VsZi5vd25lZE5GVHMuZm9yRWFjaEtleShmKQogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGNyZWF0ZUVtcHR5Q29sbGVjdGlvbigpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0gewogICAgICAgICAgICByZXR1cm4gPC0gSFdHYXJhZ2VQYWNrVjIuY3JlYXRlRW1wdHlDb2xsZWN0aW9uKG5mdFR5cGU6IFR5cGU8QEhXR2FyYWdlUGFja1YyLk5GVD4oKSkKICAgICAgICB9CiAgICB9CgogICAgLyogCiAgICAqICAgUHVibGljIEZ1bmN0aW9ucwogICAgKi8KCiAgICBhY2Nlc3MoYWxsKSBmdW4gY3JlYXRlRW1wdHlDb2xsZWN0aW9uKG5mdFR5cGU6IFR5cGUpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0gewogICAgICAgIHJldHVybiA8LSBjcmVhdGUgQ29sbGVjdGlvbigpCiAgICB9CgogICAgYWNjZXNzKGFsbCkgZnVuIGdldFRvdGFsU3VwcGx5KCk6IFVJbnQ2NCB7CiAgICAgICAgcmV0dXJuIHNlbGYudG90YWxTdXBwbHkKICAgIH0KCgogICAgYWNjZXNzKGFsbCkgZnVuIGdldE5hbWUoKTogU3RyaW5nIHsKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCiAgICB9CgoKICAgIGFjY2VzcyhhbGwpIGZ1biB0cmFuc2Zlcih1dWlkOiBVSW50NjQsIGlkOiBVSW50NjQsIHBhY2tTZXJpZXNJZDogVUludDY0LCBwYWNrRWRpdGlvbklkOiBVSW50NjQsIHRvQWRkcmVzczogQWRkcmVzcyl7CgogICAgICAgIGxldCBIV0dhcmFnZVBhY2tWMlVVSUQ6IFVJbnQ2NCA9IHV1aWQKICAgICAgICBsZXQgSFdHYXJhZ2VQYWNrVjJTZXJpZXNJZDogVUludDY0ID0gcGFja1Nlcmllc0lkCiAgICAgICAgbGV0IEhXR2FyYWdlUGFja1YySUQ6IFVJbnQ2NCA9IGlkCiAgICAgICAgbGV0IEhXR2FyYWdlUGFja1YycGFja0VkaXRpb25JRDogVUludDY0ID0gcGFja0VkaXRpb25JZAoKICAgICAgICBlbWl0IFRyYW5zZmVyRXZlbnQoCiAgICAgICAgICAgIHV1aWQ6IEhXR2FyYWdlUGFja1YyVVVJRAogICAgICAgICAgICAsIGlkOiBIV0dhcmFnZVBhY2tWMklECiAgICAgICAgICAgICwgc2VyaWVzSWQ6IEhXR2FyYWdlUGFja1YyU2VyaWVzSWQKICAgICAgICAgICAgLCBlZGl0aW9uSWQ6IEhXR2FyYWdlUGFja1YycGFja0VkaXRpb25JRAogICAgICAgICAgICAsIHRvOiB0b0FkZHJlc3MpCiAgICB9CgogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0Q29udHJhY3RWaWV3cyhyZXNvdXJjZVR5cGU6IFR5cGU/KTogW1R5cGVdIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRhdGE+KCksCiAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKSwKICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLlJveWFsdGllcz4oKQogICAgICAgIF0KICAgIH0KCgogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gcmVzb2x2ZUNvbnRyYWN0VmlldyhyZXNvdXJjZVR5cGU6IFR5cGU/LCB2aWV3VHlwZTogVHlwZSk6IEFueVN0cnVjdD8gewogICAgICAgIHN3aXRjaCB2aWV3VHlwZSB7CgogICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKToKICAgICAgICAgICAgICAgIHJldHVybiBNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EYXRhKAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VQYXRoOiBIV0dhcmFnZVBhY2tWMi5Db2xsZWN0aW9uU3RvcmFnZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgcHVibGljUGF0aDogSFdHYXJhZ2VQYWNrVjIuQ29sbGVjdGlvblB1YmxpY1BhdGgsCiAgICAgICAgICAgICAgICAgICAgcHVibGljQ29sbGVjdGlvbjogVHlwZTwmSFdHYXJhZ2VQYWNrVjIuQ29sbGVjdGlvbj4oKSwKICAgICAgICAgICAgICAgICAgICBwdWJsaWNMaW5rZWRUeXBlOiBUeXBlPCZIV0dhcmFnZVBhY2tWMi5Db2xsZWN0aW9uPigpLAogICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVtcHR5Q29sbGVjdGlvbkZ1bmN0aW9uOiAoZnVuICgpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPC1IV0dhcmFnZVBhY2tWMi5jcmVhdGVFbXB0eUNvbGxlY3Rpb24obmZ0VHlwZTogVHlwZTxASFdHYXJhZ2VQYWNrVjIuTkZUPigpKQogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIAogICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKToKICAgICAgICAgICAgICAgIGxldCBleHRlcm5hbFVSTCA9IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoCiAgICAgICAgICAgICAgICAgICAgIiIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBsZXQgc3F1YXJlSW1hZ2UgPSBNZXRhZGF0YVZpZXdzLk1lZGlhKAogICAgICAgICAgICAgICAgICAgIGZpbGU6IE1ldGFkYXRhVmlld3MuSFRUUEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogIiIKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6ICJpbWFnZS9wbmciKQogICAgICAgICAgICAgICAgbGV0IGJhbm5lckltYWdlID0gTWV0YWRhdGFWaWV3cy5NZWRpYSgKICAgICAgICAgICAgICAgICAgICBmaWxlOiBNZXRhZGF0YVZpZXdzLkhUVFBGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICIiCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiAiaW1hZ2UvcG5nIikKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgbGV0IHNvY2lhbE1hcDoge1N0cmluZzogTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTH0gPSB7CiAgICAgICAgICAgICAgICAgICAgImZhY2Vib29rIjogTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgKICAgICAgICAgICAgICAgICAgICAgICAgImh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9ob3R3aGVlbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgImluc3RhZ3JhbSI6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoCiAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL2hvdHdoZWVsc29mZmljaWFsLyIKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAidHdpdHRlciI6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoCiAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3R3aXR0ZXIuY29tL0hvdF9XaGVlbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgImRpc2NvcmQiOiBNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMKAogICAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly9kaXNjb3JkLmdnL21hdHRlbCIKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXkoCiAgICAgICAgICAgICAgICAgICAgbmFtZTogIkhvdCBXaGVlbHMgR2FyYWdlIFBhY2siLAogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAiRGlnaXRhbCBDb2xsZWN0YWJsZSBmcm9tIEhvdCBXaGVlbHMgR2FyYWdlIiwKICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFVSTDogZXh0ZXJuYWxVUkwsCiAgICAgICAgICAgICAgICAgICAgc3F1YXJlSW1hZ2U6IHNxdWFyZUltYWdlLAogICAgICAgICAgICAgICAgICAgIGJhbm5lckltYWdlOiBiYW5uZXJJbWFnZSwKICAgICAgICAgICAgICAgICAgICBzb2NpYWxzOiBzb2NpYWxNYXAKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCk6CiAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXMoW10pCiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmlsCiAgICB9CgogICAgLyogCiAgICAqICAgQWRtaW4gRnVuY3Rpb25zCiAgICAqLwogICAgYWNjZXNzKGFjY291bnQpIGZ1biBhZGROZXdTZXJpZXMobmV3UGFja1Nlcmllc0lEOiBVSW50NjQpewogICAgICAgIGlmIChuZXdQYWNrU2VyaWVzSUQgPT0gNCl7CiAgICAgICAgICAgIHBhbmljKCJzZXJpZXMgNCBjYW5ub3QgbGl2ZSBoZXJlIikKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWxmLmN1cnJlbnRQYWNrRWRpdGlvbklkQnlQYWNrU2VyaWVzSWQuaW5zZXJ0KGtleTogbmV3UGFja1Nlcmllc0lELCAwKQogICAgICAgIH0KICAgICAgICAKICAgIH0KCiAgICBhY2Nlc3MoYWNjb3VudCkgZnVuIHVwZGF0ZUN1cnJlbnRFZGl0aW9uSWRCeVBhY2tTZXJpZXNJZChwYWNrU2VyaWVzSUQ6IFVJbnQ2NCwgcGFja1Nlcmllc0VkaXRpb246IFVJbnQ2NCl7CiAgICAgICAgc2VsZi5jdXJyZW50UGFja0VkaXRpb25JZEJ5UGFja1Nlcmllc0lkW3BhY2tTZXJpZXNJRF0gPSBwYWNrU2VyaWVzRWRpdGlvbgogICAgfQoKICAgIGFjY2VzcyhhY2NvdW50KSBmdW4gbWludCgKICAgICAgICBuZnRJRDogVUludDY0CiAgICAgICAgLCBwYWNrRWRpdGlvbklEOiBVSW50NjQKICAgICAgICAsIHBhY2tTZXJpZXNJRDogVUludDY0CiAgICAgICAgLCBwYWNrSGFzaDogU3RyaW5nCiAgICAgICAgLCBtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfQogICAgICAgICk6IEB7Tm9uRnVuZ2libGVUb2tlbi5ORlR9IHsKICAgICAgICBzZWxmLnRvdGFsU3VwcGx5ID0gc2VsZi50b3RhbFN1cHBseSArIDEKICAgICAgICBzZWxmLmN1cnJlbnRQYWNrRWRpdGlvbklkQnlQYWNrU2VyaWVzSWRbcGFja1Nlcmllc0lEXSA9IHNlbGYuY3VycmVudFBhY2tFZGl0aW9uSWRCeVBhY2tTZXJpZXNJZFtwYWNrU2VyaWVzSURdISArIDEKICAgICAgICByZXR1cm4gPC0gY3JlYXRlIE5GVCgKICAgICAgICAgICAgaWQ6IG5mdElECiAgICAgICAgICAgICwgcGFja1Nlcmllc0lEOiBwYWNrU2VyaWVzSUQKICAgICAgICAgICAgLCBwYWNrRWRpdGlvbklEOiBzZWxmLmN1cnJlbnRQYWNrRWRpdGlvbklkQnlQYWNrU2VyaWVzSWRbcGFja1Nlcmllc0lEXSEKICAgICAgICAgICAgLCBwYWNrSGFzaDogcGFja0hhc2gKICAgICAgICAgICAgLCBtZXRhZGF0YTogbWV0YWRhdGEKICAgICAgICAgICAgKQogICAgfQogICAgCgogICAgLy8gaW5pdGlhbGl6ZSBjb250cmFjdCBzdGF0ZSB2YXJpYWJsZXMKICAgIGluaXQoKXsKICAgICAgICBzZWxmLm5hbWUgPSAiSG90IFdoZWVscyBHYXJhZ2UgUGFjayB2MiIKICAgICAgICBzZWxmLnRvdGFsU3VwcGx5ID0gMAogICAgICAgIHNlbGYuY3VycmVudFBhY2tFZGl0aW9uSWRCeVBhY2tTZXJpZXNJZCA9IHsxIDogMH0KCiAgICAgICAgLy8gc2V0IHRoZSBuYW1lZCBwYXRocwogICAgICAgIHNlbGYuQ29sbGVjdGlvblN0b3JhZ2VQYXRoID0gL3N0b3JhZ2UvSFdHYXJhZ2VQYWNrVjJDb2xsZWN0aW9uCiAgICAgICAgc2VsZi5Db2xsZWN0aW9uUHVibGljUGF0aCA9IC9wdWJsaWMvSFdHYXJhZ2VQYWNrVjJDb2xsZWN0aW9uCgogICAgICAgIC8vIGNyZWF0ZSBhIGNvbGxlY3Rpb24gcmVzb3VyY2UgYW5kIHNhdmUgaXQgdG8gc3RvcmFnZQogICAgICAgIGxldCBjb2xsZWN0aW9uOiBASFdHYXJhZ2VQYWNrVjIuQ29sbGVjdGlvbiA8LSBjcmVhdGUgQ29sbGVjdGlvbigpCiAgICAgICAgc2VsZi5hY2NvdW50LnN0b3JhZ2Uuc2F2ZSg8LWNvbGxlY3Rpb24sIHRvOiBzZWxmLkNvbGxlY3Rpb25TdG9yYWdlUGF0aCkKCiAgICAgICAgbGV0IGNvbGxlY3Rpb25DYXAgPSBzZWxmLmFjY291bnQuY2FwYWJpbGl0aWVzLnN0b3JhZ2UuaXNzdWU8JkhXR2FyYWdlUGFja1YyLkNvbGxlY3Rpb24+KHNlbGYuQ29sbGVjdGlvblN0b3JhZ2VQYXRoKQogICAgICAgIHNlbGYuYWNjb3VudC5jYXBhYmlsaXRpZXMucHVibGlzaChjb2xsZWN0aW9uQ2FwLCBhdDogc2VsZi5Db2xsZWN0aW9uUHVibGljUGF0aCkKCiAgICAgICAgZW1pdCBDb250cmFjdEluaXRpYWxpemVkKCkKICAgIH0KCn0KIA==",
		"HWGarageTokenV2": "LyoKKgoqICAgQW4gTkZUIGNvbnRyYWN0IGZvciByZWRlZW1pbmcvbWludGluZyB0b2tlbnMgYnkgc2VyaWVzCioKKgoqLwoKaW1wb3J0IE5vbkZ1bmdpYmxlVG9rZW4gZnJvbSAweDFkN2U1N2FhNTU4MTc0NDgKaW1wb3J0IEZ1bmdpYmxlVG9rZW4gZnJvbSAweGYyMzNkY2VlODhmZTBhYmUKaW1wb3J0IE1ldGFkYXRhVmlld3MgZnJvbSAweDFkN2U1N2FhNTU4MTc0NDgKaW1wb3J0IFZpZXdSZXNvbHZlciBmcm9tIDB4MWQ3ZTU3YWE1NTgxNzQ0OAoKYWNjZXNzKGFsbCkgY29udHJhY3QgSFdHYXJhZ2VUb2tlblYyOiBOb25GdW5naWJsZVRva2VuIHsKCiAgICAvKiAKICAgICogICBOb25GdW5naWJsZVRva2VuIFN0YW5kYXJkIEV2ZW50cwogICAgKi8KICAgIGFjY2VzcyhhbGwpIGV2ZW50IENvbnRyYWN0SW5pdGlhbGl6ZWQoKQogICAgYWNjZXNzKGFsbCkgZXZlbnQgV2l0aGRyYXcoaWQ6IFVJbnQ2NCwgZnJvbTogQWRkcmVzcz8pCiAgICBhY2Nlc3MoYWxsKSBldmVudCBEZXBvc2l0KGlkOiBVSW50NjQsIHRvOiBBZGRyZXNzPykKCiAgICAvKiAKICAgICogICBQcm9qZWN0IEV2ZW50cwogICAgKi8KICAgIGFjY2VzcyhhbGwpIGV2ZW50IE1pbnQoaWQ6IFVJbnQ2NCkKICAgIGFjY2VzcyhhbGwpIGV2ZW50IEJ1cm4oaWQ6IFVJbnQ2NCkKICAgIGFjY2VzcyhhbGwpIGV2ZW50IERlcG9zaXRFdmVudCgKICAgICAgICB1dWlkOiBVSW50NjQKICAgICAgICAsIGlkOiBVSW50NjQKICAgICAgICAsIHNlcmllc0lkOiBVSW50NjQKICAgICAgICAsIGVkaXRpb25JZDogVUludDY0CiAgICAgICAgLCB0bzogQWRkcmVzcz8KICAgICAgICApCgogICAgYWNjZXNzKGFsbCkgZXZlbnQgVHJhbnNmZXJFdmVudCgKICAgICAgICB1dWlkOiBVSW50NjQKICAgICAgICAsIGlkOiBVSW50NjQKICAgICAgICAsIHNlcmllc0lkOiBVSW50NjQKICAgICAgICAsIGVkaXRpb25JZDogVUludDY0CiAgICAgICAgLCB0bzogQWRkcmVzcz8KICAgICAgICApCiAgICAvKiAKICAgICogICBOYW1lZCBQYXRocwogICAgKi8KICAgIGFjY2VzcyhhbGwpIGxldCBDb2xsZWN0aW9uU3RvcmFnZVBhdGg6IFN0b3JhZ2VQYXRoCiAgICBhY2Nlc3MoYWxsKSBsZXQgQ29sbGVjdGlvblB1YmxpY1BhdGg6IFB1YmxpY1BhdGgKCiAgICAvKiAKICAgICogICBOb25GdW5naWJsZVRva2VuIFN0YW5kYXJkIEZpZWxkcwogICAgKi8KICAgIGFjY2VzcyhhbGwpIHZhciB0b3RhbFN1cHBseTogVUludDY0CgogICAgLyoKICAgICogICBUb2tlbiBTdGF0ZSBWYXJpYWJsZXMKICAgICovCiAgICBhY2Nlc3Moc2VsZikgdmFyIG5hbWU6IFN0cmluZwogICAgYWNjZXNzKHNlbGYpIHZhciBjdXJyZW50VG9rZW5FZGl0aW9uSWRCeVBhY2tTZXJpZXNJZDoge1VJbnQ2NDogVUludDY0fQoKICAgIGFjY2VzcyhhbGwpIHJlc291cmNlIE5GVDogTm9uRnVuZ2libGVUb2tlbi5ORlQgewogICAgICAgIGFjY2VzcyhhbGwpIGxldCBpZDogVUludDY0CiAgICAgICAgLy8gdGhlIHBhY2sgc2VyaWVzIHRoaXMgVG9rZW4gY2FtZSBmcm9tCiAgICAgICAgYWNjZXNzKGFsbCkgbGV0IHBhY2tTZXJpZXNJRDogVUludDY0CiAgICAgICAgYWNjZXNzKGFsbCkgbGV0IHRva2VuRWRpdGlvbklEOiBVSW50NjQKICAgICAgICBhY2Nlc3MoYWxsKSBsZXQgbWV0YWRhdGE6IHtTdHJpbmc6IFN0cmluZ30KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0Vmlld3MoKTogW1R5cGVdIHsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5EaXNwbGF5PigpLAogICAgICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMPigpLAogICAgICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EYXRhPigpLAogICAgICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EaXNwbGF5PigpLAogICAgICAgICAgICAgICAgVHlwZTxNZXRhZGF0YVZpZXdzLlJveWFsdGllcz4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5UcmFpdHM+KCksCiAgICAgICAgICAgICAgICBUeXBlPE1ldGFkYXRhVmlld3MuUmFyaXR5PigpCiAgICAgICAgICAgIF0KICAgICAgICB9CgogICAgICAgIGFjY2VzcyhhbGwpIGZ1biByZXNvbHZlVmlldyhfIHZpZXc6IFR5cGUpOiBBbnlTdHJ1Y3Q/IHsKICAgICAgICAgICAgc3dpdGNoIHZpZXcgewogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuRGlzcGxheT4oKToKICAgICAgICAgICAgICAgICAgICB2YXIgaXBmc0ltYWdlID0gTWV0YWRhdGFWaWV3cy5JUEZTRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgY2lkOiBzZWxmLm1ldGFkYXRhWyJ0aHVtYm5haWxDSUQiXSA/PyAiVGh1bWJuYWlsQ0lEIG5vdCBzZXQiCiAgICAgICAgICAgICAgICAgICAgICAgICwgcGF0aDogc2VsZi5tZXRhZGF0YVsidGh1bWJuYWlsUGF0aCJdID8/ICIiCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWV0YWRhdGFWaWV3cy5EaXNwbGF5KAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZWxmLm1ldGFkYXRhWyJ0b2tlbk5hbWUiXSA/PyAiSG90IFdoZWVscyBHYXJhZ2UgVG9rZW4gU2VyaWVzICIuY29uY2F0KHNlbGYucGFja1Nlcmllc0lELnRvU3RyaW5nKCkpLmNvbmNhdCgiICMiKS5jb25jYXQoc2VsZi50b2tlbkVkaXRpb25JRC50b1N0cmluZygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHNlbGYubWV0YWRhdGFbInRva2VuRGVzY3JpcHRpb24iXSA/PyAiRGlnaXRhbCBSZWRlZW1hYmxlIFRva2VuIENvbGxlY3RhYmxlIGZyb20gSG90IFdoZWVscyBHYXJhZ2UiICwKICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsOiBpcGZzSW1hZ2UKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkw+KCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YVsidXJsIl0gPz8gIiIKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRhdGE+KCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhXR2FyYWdlVG9rZW5WMi5yZXNvbHZlQ29udHJhY3RWaWV3KHJlc291cmNlVHlwZTogVHlwZTxASFdHYXJhZ2VUb2tlblYyLk5GVD4oKSwgdmlld1R5cGU6IFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKSkKCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFdHYXJhZ2VUb2tlblYyLnJlc29sdmVDb250cmFjdFZpZXcocmVzb3VyY2VUeXBlOiBUeXBlPEBIV0dhcmFnZVRva2VuVjIuTkZUPigpLCB2aWV3VHlwZTogVHlwZTxNZXRhZGF0YVZpZXdzLk5GVENvbGxlY3Rpb25EaXNwbGF5PigpKQogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuVHJhaXRzPigpOiAKICAgICAgICAgICAgICAgICAgICBsZXQgZXhsdWRlZFRyYWl0cyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGh1bWJuYWlsUGF0aCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJ0aHVtYm5haWxDSUQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiY29sbGVjdGlvbk5hbWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiY29sbGVjdGlvbkRlc2NyaXB0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgInRva2VuRGVzY3JpcHRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAidXJsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIGxldCB0cmFpdHNWaWV3ID0gTWV0YWRhdGFWaWV3cy5kaWN0VG9UcmFpdHMoCiAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Q6IHNlbGYubWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkTmFtZXM6IGV4bHVkZWRUcmFpdHMKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c1ZpZXcKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTxNZXRhZGF0YVZpZXdzLlJveWFsdGllcz4oKTogCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhXR2FyYWdlVG9rZW5WMi5yZXNvbHZlQ29udHJhY3RWaWV3KHJlc291cmNlVHlwZTogVHlwZTxASFdHYXJhZ2VUb2tlblYyLk5GVD4oKSwgdmlld1R5cGU6IFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCkpCiAgICAgICAgICAgICAgICBjYXNlIFR5cGU8TWV0YWRhdGFWaWV3cy5SYXJpdHk+KCk6IAogICAgICAgICAgICAgICAgICAgIGxldCByYXJpdHlEZXNjcmlwdGlvbiA9IHNlbGYubWV0YWRhdGFbInJhcml0eSJdCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVmlld3MuUmFyaXR5KAogICAgICAgICAgICAgICAgICAgIHNjb3JlOiBuaWwKICAgICAgICAgICAgICAgICAgICAsIG1heDogbmlsCiAgICAgICAgICAgICAgICAgICAgLGRlc2NyaXB0aW9uOiByYXJpdHlEZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuaWwKICAgICAgICB9CgogICAgICAgIGluaXQoCiAgICAgICAgICAgIGlkOiBVSW50NjQKICAgICAgICAgICAgLCBwYWNrU2VyaWVzSUQ6IFVJbnQ2NAogICAgICAgICAgICAsIHRva2VuRWRpdGlvbklEOiBVSW50NjQKICAgICAgICAgICAgLCBtZXRhZGF0YToge1N0cmluZzogU3RyaW5nfQogICAgICAgICAgICApIHsKICAgICAgICAgICAgc2VsZi5pZCA9IGlkCiAgICAgICAgICAgIHNlbGYucGFja1Nlcmllc0lEID0gcGFja1Nlcmllc0lECiAgICAgICAgICAgIHNlbGYudG9rZW5FZGl0aW9uSUQgPSB0b2tlbkVkaXRpb25JRAogICAgICAgICAgICBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEKICAgICAgICAgICAgZW1pdCBNaW50KGlkOiBzZWxmLmlkKQogICAgICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgZnVuIGNyZWF0ZUVtcHR5Q29sbGVjdGlvbigpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0gewogICAgICAgICAgICByZXR1cm4gPC0gSFdHYXJhZ2VUb2tlblYyLmNyZWF0ZUVtcHR5Q29sbGVjdGlvbihuZnRUeXBlOiBUeXBlPEBIV0dhcmFnZVRva2VuVjIuTkZUPigpKQogICAgICAgIH0KCiAgICB9CgogICAgYWNjZXNzKGFsbCkgcmVzb3VyY2UgaW50ZXJmYWNlIFRva2VuQ29sbGVjdGlvblB1YmxpYyB7fQoKICAgIGFjY2VzcyhhbGwpIHJlc291cmNlIENvbGxlY3Rpb246IFRva2VuQ29sbGVjdGlvblB1YmxpYywgTm9uRnVuZ2libGVUb2tlbi5Db2xsZWN0aW9uIHsKICAgICAgICBhY2Nlc3MoYWxsKSB2YXIgb3duZWRORlRzOiBAe1VJbnQ2NDoge05vbkZ1bmdpYmxlVG9rZW4uTkZUfX0KCiAgICAgICAgaW5pdCgpIHsKICAgICAgICAgICAgc2VsZi5vd25lZE5GVHMgPC0ge30KICAgICAgICB9CgogICAgICAgIC8vLyBnZXRTdXBwb3J0ZWRORlRUeXBlcyByZXR1cm5zIGEgbGlzdCBvZiBORlQgdHlwZXMgdGhhdCB0aGlzIHJlY2VpdmVyIGFjY2VwdHMKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRTdXBwb3J0ZWRORlRUeXBlcygpOiB7VHlwZTogQm9vbH0gewogICAgICAgICAgICBsZXQgc3VwcG9ydGVkVHlwZXM6IHtUeXBlOiBCb29sfSA9IHt9CiAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzW1R5cGU8QEhXR2FyYWdlVG9rZW5WMi5ORlQ+KCldID0gdHJ1ZQogICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkVHlwZXMKICAgICAgICB9CgogICAgICAgIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB0eXBlIGlzIGFjY2VwdGVkIGJ5IHRoZSBjb2xsZWN0aW9uCiAgICAgICAgLy8vIEEgY29sbGVjdGlvbiB0aGF0IGNhbiBhY2NlcHQgYW55IHR5cGUgc2hvdWxkIGp1c3QgcmV0dXJuIHRydWUgYnkgZGVmYXVsdAogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGlzU3VwcG9ydGVkTkZUVHlwZSh0eXBlOiBUeXBlKTogQm9vbCB7CiAgICAgICAgICAgIHJldHVybiB0eXBlID09IFR5cGU8QEhXR2FyYWdlVG9rZW5WMi5ORlQ+KCkKICAgICAgICB9CgogICAgICAgIGFjY2VzcyhOb25GdW5naWJsZVRva2VuLldpdGhkcmF3KSBmdW4gd2l0aGRyYXcod2l0aGRyYXdJRDogVUludDY0KTogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gewogICAgICAgICAgICBsZXQgdG9rZW4gPC0gc2VsZi5vd25lZE5GVHMucmVtb3ZlKGtleTogd2l0aGRyYXdJRCkgPz8gcGFuaWMoIm1pc3NpbmcgTkZUIikKCiAgICAgICAgICAgIGVtaXQgV2l0aGRyYXcoCiAgICAgICAgICAgICAgICBpZDogdG9rZW4uaWQsCiAgICAgICAgICAgICAgICBmcm9tOiBzZWxmLm93bmVyPy5hZGRyZXNzCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4gPC10b2tlbgogICAgICAgIH0KCgogICAgICAgIGFjY2VzcyhhbGwpIGZ1biBkZXBvc2l0KHRva2VuOiBAe05vbkZ1bmdpYmxlVG9rZW4uTkZUfSkgewogICAgICAgICAgICBsZXQgSFdHYXJhZ2VUb2tlblYyOiBASFdHYXJhZ2VUb2tlblYyLk5GVCA8LSB0b2tlbiBhcyEgQEhXR2FyYWdlVG9rZW5WMi5ORlQKICAgICAgICAgICAgbGV0IEhXR2FyYWdlVG9rZW5WMlVVSUQ6IFVJbnQ2NCA9IEhXR2FyYWdlVG9rZW5WMi51dWlkCiAgICAgICAgICAgIGxldCBIV0dhcmFnZVRva2VuVjJTZXJpZXNJRDogVUludDY0ID0gSFdHYXJhZ2VUb2tlblYyLnBhY2tTZXJpZXNJRAogICAgICAgICAgICBsZXQgSFdHYXJhZ2VUb2tlblYySUQ6IFVJbnQ2NCA9IEhXR2FyYWdlVG9rZW5WMi5pZAogICAgICAgICAgICBsZXQgSFdHYXJhZ2VUb2tlblYydG9rZW5FZGl0aW9uSUQ6IFVJbnQ2NCA9IEhXR2FyYWdlVG9rZW5WMi50b2tlbkVkaXRpb25JRAoKICAgICAgICAgICAgc2VsZi5vd25lZE5GVHNbSFdHYXJhZ2VUb2tlblYySURdIDwtISBIV0dhcmFnZVRva2VuVjIKCiAgICAgICAgICAgIGVtaXQgRGVwb3NpdCgKICAgICAgICAgICAgICAgIGlkOiBIV0dhcmFnZVRva2VuVjJJRCwKICAgICAgICAgICAgICAgIHRvOiBzZWxmLm93bmVyPy5hZGRyZXNzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVtaXQgRGVwb3NpdEV2ZW50KAogICAgICAgICAgICAgICAgdXVpZDogSFdHYXJhZ2VUb2tlblYyVVVJRCwKICAgICAgICAgICAgICAgIGlkOiBIV0dhcmFnZVRva2VuVjJJRCwKICAgICAgICAgICAgICAgIHNlcmllc0lkOiBIV0dhcmFnZVRva2VuVjJTZXJpZXNJRCwKICAgICAgICAgICAgICAgIGVkaXRpb25JZDogSFdHYXJhZ2VUb2tlblYydG9rZW5FZGl0aW9uSUQsCiAgICAgICAgICAgICAgICB0bzogc2VsZi5vd25lcj8uYWRkcmVzcwogICAgICAgICAgICAgICAgKQogICAgICAgIH0KCgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldElEcygpOiBbVUludDY0XSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmLm93bmVkTkZUcy5rZXlzCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBnZXRMZW5ndGgoKTogSW50IHsKICAgICAgICAgICAgcmV0dXJuIHNlbGYub3duZWRORlRzLmtleXMubGVuZ3RoCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biBib3Jyb3dORlQoXyBpZDogVUludDY0KTogJntOb25GdW5naWJsZVRva2VuLk5GVH0/IHsKICAgICAgICAgICAgcmV0dXJuICgmc2VsZi5vd25lZE5GVHNbaWRdKQogICAgICAgIH0KCgogICAgICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGJvcnJvd1Rva2VuKGlkOiBVSW50NjQpOiAmTkZUPyB7CiAgICAgICAgICAgIGlmIGxldCB0b2tlblJlZjogJntOb25GdW5naWJsZVRva2VuLk5GVH0gPSAmc2VsZi5vd25lZE5GVHNbaWRdIHsKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblJlZiBhcyEgJk5GVAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG5pbAogICAgICAgICAgICB9CiAgICAgICAgfQoKCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gYm9ycm93Vmlld1Jlc29sdmVyKGlkOiBVSW50NjQpOiAme1ZpZXdSZXNvbHZlci5SZXNvbHZlcn0/IHsKICAgICAgICAgICAgaWYgbGV0IG5mdFJlZjogJntOb25GdW5naWJsZVRva2VuLk5GVH0gPSAmc2VsZi5vd25lZE5GVHNbaWRdIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZnRSZWYgYXMgJntWaWV3UmVzb2x2ZXIuUmVzb2x2ZXJ9CiAgICAgICAgICAgIH0KICAgICAgICByZXR1cm4gbmlsCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSBmdW4gY3JlYXRlRW1wdHlDb2xsZWN0aW9uKCk6IEB7Tm9uRnVuZ2libGVUb2tlbi5Db2xsZWN0aW9ufSB7CiAgICAgICAgICAgIHJldHVybiA8LSBIV0dhcmFnZVRva2VuVjIuY3JlYXRlRW1wdHlDb2xsZWN0aW9uKG5mdFR5cGU6IFR5cGU8QEhXR2FyYWdlVG9rZW5WMi5ORlQ+KCkpCiAgICAgICAgfQogICAgfQoKCgogICAgLyogCiAgICAqICAgUHVibGljIEZ1bmN0aW9ucwogICAgKi8KICAgIGFjY2VzcyhhbGwpIHZpZXcgZnVuIGdldFRvdGFsU3VwcGx5KCk6IFVJbnQ2NCB7CiAgICAgICAgcmV0dXJuIHNlbGYudG90YWxTdXBwbHkKICAgIH0KCgogICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0TmFtZSgpOiBTdHJpbmcgewogICAgICAgIHJldHVybiBzZWxmLm5hbWUKICAgIH0KCgogICAgYWNjZXNzKGFsbCkgZnVuIHRyYW5zZmVyKHV1aWQ6IFVJbnQ2NCwgaWQ6IFVJbnQ2NCwgcGFja1Nlcmllc0lkOiBVSW50NjQsIHRva2VuRWRpdGlvbklkOiBVSW50NjQsIHRvQWRkcmVzczogQWRkcmVzcyl7CgogICAgICAgIGxldCBIV0dhcmFnZVRva2VuVjJVVUlEOiBVSW50NjQgPSB1dWlkCiAgICAgICAgbGV0IEhXR2FyYWdlVG9rZW5WMlNlcmllc0lkOiBVSW50NjQgPSBwYWNrU2VyaWVzSWQKICAgICAgICBsZXQgSFdHYXJhZ2VUb2tlblYySUQ6IFVJbnQ2NCA9IGlkCiAgICAgICAgbGV0IEhXR2FyYWdlVG9rZW5WMnRva2VuRWRpdGlvbklEOiBVSW50NjQgPSB0b2tlbkVkaXRpb25JZAoKICAgICAgICBlbWl0IFRyYW5zZmVyRXZlbnQoCiAgICAgICAgICAgIHV1aWQ6IEhXR2FyYWdlVG9rZW5WMlVVSUQKICAgICAgICAgICAgLCBpZDogSFdHYXJhZ2VUb2tlblYySUQKICAgICAgICAgICAgLCBzZXJpZXNJZDogSFdHYXJhZ2VUb2tlblYyU2VyaWVzSWQKICAgICAgICAgICAgLCBlZGl0aW9uSWQ6IEhXR2FyYWdlVG9rZW5WMnRva2VuRWRpdGlvbklECiAgICAgICAgICAgICwgdG86IHRvQWRkcmVzcykKICAgIH0KCgoKICAgIGFjY2VzcyhhbGwpIGZ1biBjcmVhdGVFbXB0eUNvbGxlY3Rpb24obmZ0VHlwZTogVHlwZSk6IEB7Tm9uRnVuZ2libGVUb2tlbi5Db2xsZWN0aW9ufSB7CiAgICAgICAgcmV0dXJuIDwtIGNyZWF0ZSBDb2xsZWN0aW9uKCkKICAgIH0KCiAgICAgICAgYWNjZXNzKGFsbCkgdmlldyBmdW4gZ2V0Q29udHJhY3RWaWV3cyhyZXNvdXJjZVR5cGU6IFR5cGU/KTogW1R5cGVdIHsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGF0YT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5ORlRDb2xsZWN0aW9uRGlzcGxheT4oKSwKICAgICAgICAgICAgICAgIFR5cGU8TWV0YWRhdGFWaWV3cy5Sb3lhbHRpZXM+KCkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBdCiAgICAgICAgfQoKICAgICAgICBhY2Nlc3MoYWxsKSB2aWV3IGZ1biByZXNvbHZlQ29udHJhY3RWaWV3KHJlc291cmNlVHlwZTogVHlwZT8sIHZpZXdUeXBlOiBUeXBlKTogQW55U3RydWN0PyB7CiAgICAgICAgICAgIHN3aXRjaCB2aWV3VHlwZSB7CgogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRhdGE+KCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VQYXRoOiBIV0dhcmFnZVRva2VuVjIuQ29sbGVjdGlvblN0b3JhZ2VQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNQYXRoOiBIV0dhcmFnZVRva2VuVjIuQ29sbGVjdGlvblB1YmxpY1BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0NvbGxlY3Rpb246IFR5cGU8JkhXR2FyYWdlVG9rZW5WMi5Db2xsZWN0aW9uPigpLAogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNMaW5rZWRUeXBlOiBUeXBlPCZIV0dhcmFnZVRva2VuVjIuQ29sbGVjdGlvbj4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRW1wdHlDb2xsZWN0aW9uRnVuY3Rpb246IGZ1bigpOiBAe05vbkZ1bmdpYmxlVG9rZW4uQ29sbGVjdGlvbn0ge3JldHVybiA8LSBIV0dhcmFnZVRva2VuVjIuY3JlYXRlRW1wdHlDb2xsZWN0aW9uKG5mdFR5cGU6IFR5cGU8QEhXR2FyYWdlVG9rZW5WMi5ORlQ+KCkpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXk+KCk6CiAgICAgICAgICAgICAgICAgICAgbGV0IGV4dGVybmFsVVJMOiBNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMID0gTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgKICAgICAgICAgICAgICAgICAgICAgICAgIiIKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICAgICBsZXQgc3F1YXJlSW1hZ2UgPSBNZXRhZGF0YVZpZXdzLk1lZGlhKAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBNZXRhZGF0YVZpZXdzLkhUVFBGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiAiaW1hZ2UvcG5nIikKCiAgICAgICAgICAgICAgICAgICAgbGV0IGJhbm5lckltYWdlID0gTWV0YWRhdGFWaWV3cy5NZWRpYSgKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogTWV0YWRhdGFWaWV3cy5IVFRQRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogIiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogImltYWdlL3BuZyIpCgogICAgICAgICAgICAgICAgICAgIGxldCBzb2NpYWxNYXA6IHtTdHJpbmc6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkx9ID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBNZXRhZGF0YVZpZXdzLkV4dGVybmFsVVJMKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9ob3R3aGVlbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFncmFtIjogTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL2hvdHdoZWVsc29mZmljaWFsLyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogTWV0YWRhdGFWaWV3cy5FeHRlcm5hbFVSTCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3R3aXR0ZXIuY29tL0hvdF9XaGVlbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAiZGlzY29yZCI6IE1ldGFkYXRhVmlld3MuRXh0ZXJuYWxVUkwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly9kaXNjb3JkLmdnL21hdHRlbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVmlld3MuTkZUQ29sbGVjdGlvbkRpc3BsYXkoCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJIb3QgV2hlZWxzIEdhcmFnZSBSZWRlZW1hYmxlIFRva2VuIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IkRpZ2l0YWwgQ29sbGVjdGFibGUgZnJvbSBIb3QgV2hlZWxzIEdhcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsVVJMOiBleHRlcm5hbFVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgc3F1YXJlSW1hZ2U6IHNxdWFyZUltYWdlLAogICAgICAgICAgICAgICAgICAgICAgICBiYW5uZXJJbWFnZTogYmFubmVySW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHNvY2lhbHM6IHNvY2lhbE1hcAogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgY2FzZSBUeXBlPE1ldGFkYXRhVmlld3MuUm95YWx0aWVzPigpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXRhZGF0YVZpZXdzLlJveWFsdGllcyhbXSkKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmlsCiAgICAgICAgfQoKICAgIC8qIAogICAgKiAgIEFkbWluIEZ1bmN0aW9ucwogICAgKi8KICAgIGFjY2VzcyhhY2NvdW50KSBmdW4gYWRkTmV3U2VyaWVzKG5ld1Rva2VuU2VyaWVzSUQ6IFVJbnQ2NCl7CiAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5FZGl0aW9uSWRCeVBhY2tTZXJpZXNJZC5pbnNlcnQoa2V5OiBuZXdUb2tlblNlcmllc0lELCAwKQogICAgfQoKCiAgICBhY2Nlc3MoYWNjb3VudCkgZnVuIHVwZGF0ZUN1cnJlbnRFZGl0aW9uSWRCeVBhY2tTZXJpZXNJZChwYWNrU2VyaWVzSUQ6IFVJbnQ2NCwgdG9rZW5TZXJpZXNFZGl0aW9uOiBVSW50NjQpewogICAgICAgIHNlbGYuY3VycmVudFRva2VuRWRpdGlvbklkQnlQYWNrU2VyaWVzSWRbcGFja1Nlcmllc0lEXSA9IHRva2VuU2VyaWVzRWRpdGlvbgogICAgfQoKCiAgICBhY2Nlc3MoYWNjb3VudCkgZnVuIG1pbnQoCiAgICAgICAgbmZ0SUQ6IFVJbnQ2NAogICAgICAgICwgcGFja1Nlcmllc0lEOiBVSW50NjQKICAgICAgICAsIG1ldGFkYXRhOiB7U3RyaW5nOiBTdHJpbmd9CiAgICAgICAgKTogQHtOb25GdW5naWJsZVRva2VuLk5GVH0gewoKICAgICAgICBzZWxmLnRvdGFsU3VwcGx5ID0gc2VsZi5nZXRUb3RhbFN1cHBseSgpICsgMQoKICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbkVkaXRpb25JZEJ5UGFja1Nlcmllc0lkW3BhY2tTZXJpZXNJRF0gPSBzZWxmLmN1cnJlbnRUb2tlbkVkaXRpb25JZEJ5UGFja1Nlcmllc0lkW3BhY2tTZXJpZXNJRF0hICsgMQoKICAgICAgICByZXR1cm4gPC0gY3JlYXRlIE5GVCgKICAgICAgICAgICAgaWQ6IG5mdElECiAgICAgICAgICAgICwgcGFja1Nlcmllc0lEOiBwYWNrU2VyaWVzSUQKICAgICAgICAgICAgLCB0b2tlbkVkaXRpb25JRDogc2VsZi5jdXJyZW50VG9rZW5FZGl0aW9uSWRCeVBhY2tTZXJpZXNJZFtwYWNrU2VyaWVzSURdIQogICAgICAgICAgICAsIG1ldGFkYXRhOiBtZXRhZGF0YQogICAgICAgICAgICApCiAgICB9CgogICAgLy8gaW5pdGlhbGl6ZSBjb250cmFjdCBzdGF0ZSB2YXJpYWJsZXMKICAgIGluaXQoKXsKICAgICAgICBzZWxmLm5hbWUgPSAiSG90IFdoZWVscyBHYXJhZ2UgVG9rZW4gdjIiCiAgICAgICAgc2VsZi50b3RhbFN1cHBseSA9IDAKICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbkVkaXRpb25JZEJ5UGFja1Nlcmllc0lkID0gezEgOiAwfQoKICAgICAgICAvLyBzZXQgdGhlIG5hbWVkIHBhdGhzCiAgICAgICAgc2VsZi5Db2xsZWN0aW9uU3RvcmFnZVBhdGggPSAvc3RvcmFnZS9IV0dhcmFnZVRva2VuVjJDb2xsZWN0aW9uCiAgICAgICAgc2VsZi5Db2xsZWN0aW9uUHVibGljUGF0aCA9IC9wdWJsaWMvSFdHYXJhZ2VUb2tlblYyQ29sbGVjdGlvbgoKICAgICAgICAvLyBjcmVhdGUgYSBjb2xsZWN0aW9uIHJlc291cmNlIGFuZCBzYXZlIGl0IHRvIHN0b3JhZ2UKICAgICAgICBsZXQgY29sbGVjdGlvbjogQEhXR2FyYWdlVG9rZW5WMi5Db2xsZWN0aW9uIDwtIGNyZWF0ZSBDb2xsZWN0aW9uKCkKICAgICAgICBzZWxmLmFjY291bnQuc3RvcmFnZS5zYXZlKDwtY29sbGVjdGlvbiwgdG86IHNlbGYuQ29sbGVjdGlvblN0b3JhZ2VQYXRoKQoKICAgICAgICBsZXQgY29sbGVjdGlvbkNhcCA9IHNlbGYuYWNjb3VudC5jYXBhYmlsaXRpZXMuc3RvcmFnZS5pc3N1ZTwmSFdHYXJhZ2VUb2tlblYyLkNvbGxlY3Rpb24+KHNlbGYuQ29sbGVjdGlvblN0b3JhZ2VQYXRoKQogICAgICAgIHNlbGYuYWNjb3VudC5jYXBhYmlsaXRpZXMucHVibGlzaChjb2xsZWN0aW9uQ2FwLCBhdDogc2VsZi5Db2xsZWN0aW9uUHVibGljUGF0aCkKCiAgICAgICAgZW1pdCBDb250cmFjdEluaXRpYWxpemVkKCkgICAKICAgIH0KCn0KIA=="
	},
	"_expandable": {
		"keys": "keys"
	},
	"_links": {
		"_self": "/v1/accounts/d0bcefdf1e67ea85"
	}
}