IiIiU3VpdGUgU3RhbmRhcmQgU3VpdGU6IENvbW1vbiB0ZXJtcyBmb3IgbW9zdCBhcHBsaWNhdGlvbnMKTGV2ZWwgMSwgdmVyc2lvbiAxCgpHZW5lcmF0ZWQgZnJvbSBmbGFwOlN5c3RlbSBGb2xkZXI6RXh0ZW5zaW9uczpTY3JpcHRpbmcgQWRkaXRpb25zOkRpYWxlY3RzOkVuZ2xpc2ggRGlhbGVjdApBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCiIiIgoKaW1wb3J0IGFldG9vbHMKaW1wb3J0IE1hY09TCgpfY29kZSA9ICdjb3JlJwoKY2xhc3MgU3RhbmRhcmRfU3VpdGU6CgoJX2FyZ21hcF9jbGFzc19pbmZvID0gewoJCSdfaW4nIDogJ3dyY2QnLAoJfQoKCWRlZiBjbGFzc19pbmZvKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CgkJIiIiY2xhc3MgaW5mbzogR2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdCBjbGFzcwoJCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGNsYXNzIGFib3V0IHdoaWNoIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZAoJCUtleXdvcmQgYXJndW1lbnQgX2luOiB0aGUgaHVtYW4gbGFuZ3VhZ2UgYW5kIHNjcmlwdCBzeXN0ZW0gaW4gd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCgkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQoJCVJldHVybnM6IGEgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIG9iamVjdLlzIHByb3BlcnRpZXMgYW5kIGVsZW1lbnRzCgkJIiIiCgkJX2NvZGUgPSAnY29yZScKCQlfc3ViY29kZSA9ICdxb2JqJwoKCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jbGFzc19pbmZvKQoJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKCgoJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAoJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CgkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CgkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KCglfYXJnbWFwX2Nsb3NlID0gewoJCSdzYXZpbmcnIDogJ3Nhdm8nLAoJCSdzYXZpbmdfaW4nIDogJ2tmaWwnLAoJfQoKCWRlZiBjbG9zZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKCQkiIiJjbG9zZTogQ2xvc2UgYW4gb2JqZWN0CgkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgdG8gY2xvc2UKCQlLZXl3b3JkIGFyZ3VtZW50IHNhdmluZzogc3BlY2lmaWVzIHdoZXRoZXIgY2hhbmdlcyBzaG91bGQgYmUgc2F2ZWQgYmVmb3JlIGNsb3NpbmcKCQlLZXl3b3JkIGFyZ3VtZW50IHNhdmluZ19pbjogdGhlIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgb2JqZWN0CgkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQoJCSIiIgoJCV9jb2RlID0gJ2NvcmUnCgkJX3N1YmNvZGUgPSAnY2xvcycKCgkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY2xvc2UpCgkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAoKCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnc2F2bycsIF9FbnVtX3Nhdm8pCgoJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAoJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CgkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CgkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KCglfYXJnbWFwX2NvdW50ID0gewoJCSdlYWNoJyA6ICdrb2NsJywKCX0KCglkZWYgY291bnQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CgkJIiIiY291bnQ6IFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGEgcGFydGljdWxhciBjbGFzcyB3aXRoaW4gYW4gb2JqZWN0CgkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3Qgd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIGNvdW50ZWQKCQlLZXl3b3JkIGFyZ3VtZW50IGVhY2g6IHRoZSBjbGFzcyBvZiB0aGUgZWxlbWVudHMgdG8gYmUgY291bnRlZC4KCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CgkJUmV0dXJuczogdGhlIG51bWJlciBvZiBlbGVtZW50cwoJCSIiIgoJCV9jb2RlID0gJ2NvcmUnCgkJX3N1YmNvZGUgPSAnY250ZScKCgkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY291bnQpCgkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAoKCgkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCgkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQoJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQoKCV9hcmdtYXBfZGF0YV9zaXplID0gewoJCSdhcycgOiAncnR5cCcsCgl9CgoJZGVmIGRhdGFfc2l6ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKCQkiIiJkYXRhIHNpemU6IFJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBvYmplY3QKCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCB3aG9zZSBkYXRhIHNpemUgaXMgdG8gYmUgcmV0dXJuZWQKCQlLZXl3b3JkIGFyZ3VtZW50IGFzOiB0aGUgZGF0YSB0eXBlIGZvciB3aGljaCB0aGUgc2l6ZSBpcyBjYWxjdWxhdGVkCgkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQoJCVJldHVybnM6IHRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMKCQkiIiIKCQlfY29kZSA9ICdjb3JlJwoJCV9zdWJjb2RlID0gJ2RzaXonCgoJCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2RhdGFfc2l6ZSkKCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CgoKCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgoJCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCgkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgoJCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCgoJZGVmIGRlbGV0ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKCQkiIiJkZWxldGU6IERlbGV0ZSBhbiBlbGVtZW50IGZyb20gYW4gb2JqZWN0CgkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBlbGVtZW50IHRvIGRlbGV0ZQoJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKCQkiIiIKCQlfY29kZSA9ICdjb3JlJwoJCV9zdWJjb2RlID0gJ2RlbG8nCgoJCWlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCgkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAoKCgkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCgkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQoJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQoKCV9hcmdtYXBfZHVwbGljYXRlID0gewoJCSd0bycgOiAnaW5zaCcsCgl9CgoJZGVmIGR1cGxpY2F0ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKCQkiIiJkdXBsaWNhdGU6IER1cGxpY2F0ZSBvYmplY3QocykKCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdChzKSB0byBkdXBsaWNhdGUKCQlLZXl3b3JkIGFyZ3VtZW50IHRvOiB0aGUgbmV3IGxvY2F0aW9uIGZvciB0aGUgb2JqZWN0KHMpCgkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQoJCVJldHVybnM6IHRvIHRoZSBkdXBsaWNhdGVkIG9iamVjdChzKQoJCSIiIgoJCV9jb2RlID0gJ2NvcmUnCgkJX3N1YmNvZGUgPSAnY2xvbicKCgkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfZHVwbGljYXRlKQoJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKCgoJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAoJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CgkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CgkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KCglfYXJnbWFwX2V2ZW50X2luZm8gPSB7CgkJJ19pbicgOiAnd3JjZCcsCgl9CgoJZGVmIGV2ZW50X2luZm8oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CgkJIiIiZXZlbnQgaW5mbzogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBBcHBsZSBldmVudHMgaW4gYSBzdWl0ZQoJCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZXZlbnQgY2xhc3Mgb2YgdGhlIEFwcGxlIGV2ZW50cyBmb3Igd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCgkJS2V5d29yZCBhcmd1bWVudCBfaW46IHRoZSBodW1hbiBsYW5ndWFnZSBhbmQgc2NyaXB0IHN5c3RlbSBpbiB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24KCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CgkJUmV0dXJuczogYSByZWNvcmQgY29udGFpbmluZyB0aGUgZXZlbnRzIGFuZCB0aGVpciBwYXJhbWV0ZXJzCgkJIiIiCgkJX2NvZGUgPSAnY29yZScKCQlfc3ViY29kZSA9ICdndGVpJwoKCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9ldmVudF9pbmZvKQoJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKCgoJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAoJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CgkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CgkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KCglkZWYgZXhpc3RzKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgoJCSIiImV4aXN0czogVmVyaWZ5IGlmIGFuIG9iamVjdCBleGlzdHMKCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBpbiBxdWVzdGlvbgoJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKCQlSZXR1cm5zOiB0cnVlIGlmIGl0IGV4aXN0cywgZmFsc2UgaWYgbm90CgkJIiIiCgkJX2NvZGUgPSAnY29yZScKCQlfc3ViY29kZSA9ICdkb2V4JwoKCQlpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJwoJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKCgoJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAoJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CgkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CgkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KCglfYXJnbWFwX21ha2UgPSB7CgkJJ25ldycgOiAna29jbCcsCgkJJ2F0JyA6ICdpbnNoJywKCQknd2l0aF9kYXRhJyA6ICdkYXRhJywKCQknd2l0aF9wcm9wZXJ0aWVzJyA6ICdwcmR0JywKCX0KCglkZWYgbWFrZShzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgoJCSIiIm1ha2U6IE1ha2UgYSBuZXcgZWxlbWVudAoJCUtleXdvcmQgYXJndW1lbnQgbmV3OiB0aGUgY2xhc3Mgb2YgdGhlIG5ldyBlbGVtZW50LgoJCUtleXdvcmQgYXJndW1lbnQgYXQ6IHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGVsZW1lbnQKCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGhfZGF0YTogdGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGVsZW1lbnQKCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvcGVydGllczogdGhlIGluaXRpYWwgdmFsdWVzIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgZWxlbWVudAoJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKCQlSZXR1cm5zOiB0byB0aGUgbmV3IG9iamVjdChzKQoJCSIiIgoJCV9jb2RlID0gJ2NvcmUnCgkJX3N1YmNvZGUgPSAnY3JlbCcKCgkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbWFrZSkKCQlpZiBfbm9fb2JqZWN0ICE9IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCgoKCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgoJCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCgkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgoJCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCgoJX2FyZ21hcF9tb3ZlID0gewoJCSd0bycgOiAnaW5zaCcsCgl9CgoJZGVmIG1vdmUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CgkJIiIibW92ZTogTW92ZSBvYmplY3QocykgdG8gYSBuZXcgbG9jYXRpb24KCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdChzKSB0byBtb3ZlCgkJS2V5d29yZCBhcmd1bWVudCB0bzogdGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhlIG9iamVjdChzKQoJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKCQlSZXR1cm5zOiB0byB0aGUgb2JqZWN0KHMpIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIG1vdmVkCgkJIiIiCgkJX2NvZGUgPSAnY29yZScKCQlfc3ViY29kZSA9ICdtb3ZlJwoKCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9tb3ZlKQoJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKCgoJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAoJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CgkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CgkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CgkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KCglkZWYgb3BlbihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKCQkiIiJvcGVuOiBPcGVuIHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpCgkJUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBvcGVuCgkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQoJCSIiIgoJCV9jb2RlID0gJ2FldnQnCgkJX3N1YmNvZGUgPSAnb2RvYycKCgkJaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CgoKCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgoJCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCgkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgoJCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCgoJZGVmIF9wcmludChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKCQkiIiJwcmludDogUHJpbnQgdGhlIHNwZWNpZmllZCBvYmplY3QocykKCQlSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzIHRvIHByaW50CgkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQoJCSIiIgoJCV9jb2RlID0gJ2FldnQnCgkJX3N1YmNvZGUgPSAncGRvYycKCgkJaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CgoKCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgoJCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCgkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgoJCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCgoJX2FyZ21hcF9xdWl0ID0gewoJCSdzYXZpbmcnIDogJ3Nhdm8nLAoJfQoKCWRlZiBxdWl0KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CgkJIiIicXVpdDogUXVpdCBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtCgkJS2V5d29yZCBhcmd1bWVudCBzYXZpbmc6IHNwZWNpZmllcyB3aGV0aGVyIHRvIHNhdmUgY3VycmVudGx5IG9wZW4gZG9jdW1lbnRzCgkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQoJCSIiIgoJCV9jb2RlID0gJ2FldnQnCgkJX3N1YmNvZGUgPSAncXVpdCcKCgkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfcXVpdCkKCQlpZiBfbm9fb2JqZWN0ICE9IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCgoJCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdzYXZvJywgX0VudW1fc2F2bykKCgkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCgkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQoJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQoKCV9hcmdtYXBfc2F2ZSA9IHsKCQknX2luJyA6ICdrZmlsJywKCQknYXMnIDogJ2ZsdHAnLAoJfQoKCWRlZiBzYXZlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgoJCSIiInNhdmU6IFNhdmUgYW4gb2JqZWN0CgkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgdG8gc2F2ZQoJCUtleXdvcmQgYXJndW1lbnQgX2luOiB0aGUgZmlsZSBpbiB3aGljaCB0byBzYXZlIHRoZSBvYmplY3QKCQlLZXl3b3JkIGFyZ3VtZW50IGFzOiB0aGUgZmlsZSB0eXBlIG9mIHRoZSBkb2N1bWVudCBpbiB3aGljaCB0byBzYXZlIHRoZSBkYXRhCgkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQoJCSIiIgoJCV9jb2RlID0gJ2NvcmUnCgkJX3N1YmNvZGUgPSAnc2F2ZScKCgkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2F2ZSkKCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CgoKCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgoJCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCgkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgoJCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCgoJX2FyZ21hcF9zdWl0ZV9pbmZvID0gewoJCSdfaW4nIDogJ3dyY2QnLAoJfQoKCWRlZiBzdWl0ZV9pbmZvKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgoJCSIiInN1aXRlIGluZm86IEdldCBpbmZvcm1hdGlvbiBhYm91dCBldmVudCBzdWl0ZShzKQoJCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgc3VpdGUgZm9yIHdoaWNoIHRvIHJldHVybiBpbmZvcm1hdGlvbgoJCUtleXdvcmQgYXJndW1lbnQgX2luOiB0aGUgaHVtYW4gbGFuZ3VhZ2UgYW5kIHNjcmlwdCBzeXN0ZW0gaW4gd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCgkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQoJCVJldHVybnM6IGEgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIHN1aXRlcyBhbmQgdGhlaXIgdmVyc2lvbnMKCQkiIiIKCQlfY29kZSA9ICdjb3JlJwoJCV9zdWJjb2RlID0gJ2d0c2knCgoJCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3N1aXRlX2luZm8pCgkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAoKCgkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCgkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQoJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQoKCmNsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CgkiIiJhcHBsaWNhdGlvbiAtIEFuIGFwcGxpY2F0aW9uIHByb2dyYW0iIiIKCXdhbnQgPSAnY2FwcCcKY2xhc3MgY2xpcGJvYXJkKGFldG9vbHMuTlByb3BlcnR5KToKCSIiImNsaXBib2FyZCAtIHRoZSBjbGlwYm9hcmQiIiIKCXdoaWNoID0gJ3BjbGknCgl3YW50ID0gJyoqKionCmNsYXNzIGZyb250bW9zdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CgkiIiJmcm9udG1vc3QgLSBJcyB0aGlzIHRoZSBmcm9udG1vc3QgYXBwbGljYXRpb24/IiIiCgl3aGljaCA9ICdwaXNmJwoJd2FudCA9ICdib29sJwpjbGFzcyBuYW1lKGFldG9vbHMuTlByb3BlcnR5KToKCSIiIm5hbWUgLSB0aGUgbmFtZSIiIgoJd2hpY2ggPSAncG5hbScKCXdhbnQgPSAnaXR4dCcKY2xhc3Mgc2VsZWN0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKCSIiInNlbGVjdGlvbiAtIHRoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlciIiIgoJd2hpY2ggPSAnc2VsZScKCXdhbnQgPSAnY3NlbCcKY2xhc3MgdmVyc2lvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CgkiIiJ2ZXJzaW9uIC0gdGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0aW9uIiIiCgl3aGljaCA9ICd2ZXJzJwoJd2FudCA9ICd2ZXJzJwoKYXBwbGljYXRpb25zID0gYXBwbGljYXRpb24KCmNsYXNzIGNoYXJhY3RlcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgoJIiIiY2hhcmFjdGVyIC0gQSBjaGFyYWN0ZXIiIiIKCXdhbnQgPSAnY2hhICcKY2xhc3MgY29sb3IoYWV0b29scy5OUHJvcGVydHkpOgoJIiIiY29sb3IgLSB0aGUgY29sb3IiIiIKCXdoaWNoID0gJ2NvbHInCgl3YW50ID0gJ2NSR0InCmNsYXNzIGZvbnQoYWV0b29scy5OUHJvcGVydHkpOgoJIiIiZm9udCAtIHRoZSBuYW1lIG9mIHRoZSBmb250IiIiCgl3aGljaCA9ICdmb250JwoJd2FudCA9ICdjdHh0JwpjbGFzcyBzaXplKGFldG9vbHMuTlByb3BlcnR5KToKCSIiInNpemUgLSB0aGUgc2l6ZSBpbiBwb2ludHMiIiIKCXdoaWNoID0gJ3B0c3onCgl3YW50ID0gJ2ZpeGQnCmNsYXNzIHdyaXRpbmdfY29kZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CgkiIiJ3cml0aW5nIGNvZGUgLSB0aGUgc2NyaXB0IHN5c3RlbSBhbmQgbGFuZ3VhZ2UiIiIKCXdoaWNoID0gJ3BzY3QnCgl3YW50ID0gJ2ludGwnCmNsYXNzIHN0eWxlKGFldG9vbHMuTlByb3BlcnR5KToKCSIiInN0eWxlIC0gdGhlIHRleHQgc3R5bGUiIiIKCXdoaWNoID0gJ3R4c3QnCgl3YW50ID0gJ3RzdHknCmNsYXNzIHVuaWZvcm1fc3R5bGVzKGFldG9vbHMuTlByb3BlcnR5KToKCSIiInVuaWZvcm0gc3R5bGVzIC0gdGhlIHRleHQgc3R5bGUiIiIKCXdoaWNoID0gJ3VzdGwnCgl3YW50ID0gJ3RzdHknCgpjaGFyYWN0ZXJzID0gY2hhcmFjdGVyCgpjbGFzcyBkb2N1bWVudChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgoJIiIiZG9jdW1lbnQgLSBBIGRvY3VtZW50IiIiCgl3YW50ID0gJ2RvY3UnCmNsYXNzIG1vZGlmaWVkKGFldG9vbHMuTlByb3BlcnR5KToKCSIiIm1vZGlmaWVkIC0gSGFzIHRoZSBkb2N1bWVudCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IHNhdmU/IiIiCgl3aGljaCA9ICdpbW9kJwoJd2FudCA9ICdib29sJwoKZG9jdW1lbnRzID0gZG9jdW1lbnQKCmNsYXNzIGZpbGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKCSIiImZpbGUgLSBBIGZpbGUiIiIKCXdhbnQgPSAnZmlsZScKY2xhc3Mgc3RhdGlvbmVyeShhZXRvb2xzLk5Qcm9wZXJ0eSk6CgkiIiJzdGF0aW9uZXJ5IC0gSXMgdGhlIGZpbGUgYSBzdGF0aW9uZXJ5IGZpbGU/IiIiCgl3aGljaCA9ICdwc3BkJwoJd2FudCA9ICdib29sJwoKZmlsZXMgPSBmaWxlCgpjbGFzcyBzZWxlY3Rpb25fMmRfb2JqZWN0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CgkiIiJzZWxlY3Rpb24tb2JqZWN0IC0gdGhlIHNlbGVjdGlvbiB2aXNpYmxlIHRvIHRoZSB1c2VyIiIiCgl3YW50ID0gJ2NzZWwnCmNsYXNzIGNvbnRlbnRzKGFldG9vbHMuTlByb3BlcnR5KToKCSIiImNvbnRlbnRzIC0gdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWxlY3Rpb24iIiIKCXdoaWNoID0gJ3BjbnQnCgl3YW50ID0gJ3R5cGUnCgpjbGFzcyB0ZXh0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CgkiIiJ0ZXh0IC0gVGV4dCIiIgoJd2FudCA9ICdjdHh0JwojIHJlcGVhdGVkIHByb3BlcnR5IGZvbnQgdGhlIG5hbWUgb2YgdGhlIGZvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgoKY2xhc3MgdGV4dF9zdHlsZV9pbmZvKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CgkiIiJ0ZXh0IHN0eWxlIGluZm8gLSBPbiBhbmQgT2ZmIHN0eWxlcyBvZiB0ZXh0IHJ1biIiIgoJd2FudCA9ICd0c3R5JwpjbGFzcyBvbl9zdHlsZXMoYWV0b29scy5OUHJvcGVydHkpOgoJIiIib24gc3R5bGVzIC0gdGhlIHN0eWxlcyB0aGF0IGFyZSBvbiBmb3IgdGhlIHRleHQiIiIKCXdoaWNoID0gJ29uc3QnCgl3YW50ID0gJ3N0eWwnCmNsYXNzIG9mZl9zdHlsZXMoYWV0b29scy5OUHJvcGVydHkpOgoJIiIib2ZmIHN0eWxlcyAtIHRoZSBzdHlsZXMgdGhhdCBhcmUgb2ZmIGZvciB0aGUgdGV4dCIiIgoJd2hpY2ggPSAnb2ZzdCcKCXdhbnQgPSAnc3R5bCcKCnRleHRfc3R5bGVfaW5mb3MgPSB0ZXh0X3N0eWxlX2luZm8KCmNsYXNzIHdpbmRvdyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgoJIiIid2luZG93IC0gQSB3aW5kb3ciIiIKCXdhbnQgPSAnY3dpbicKY2xhc3MgYm91bmRzKGFldG9vbHMuTlByb3BlcnR5KToKCSIiImJvdW5kcyAtIHRoZSBib3VuZGFyeSByZWN0YW5nbGUgZm9yIHRoZSB3aW5kb3ciIiIKCXdoaWNoID0gJ3BibmQnCgl3YW50ID0gJ3FkcnQnCmNsYXNzIGNsb3NlYWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CgkiIiJjbG9zZWFibGUgLSBEb2VzIHRoZSB3aW5kb3cgaGF2ZSBhIGNsb3NlIGJveD8iIiIKCXdoaWNoID0gJ2hjbGInCgl3YW50ID0gJ2Jvb2wnCmNsYXNzIHRpdGxlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CgkiIiJ0aXRsZWQgLSBEb2VzIHRoZSB3aW5kb3cgaGF2ZSBhIHRpdGxlIGJhcj8iIiIKCXdoaWNoID0gJ3B0aXQnCgl3YW50ID0gJ2Jvb2wnCmNsYXNzIGluZGV4KGFldG9vbHMuTlByb3BlcnR5KToKCSIiImluZGV4IC0gdGhlIG51bWJlciBvZiB0aGUgd2luZG93IiIiCgl3aGljaCA9ICdwaWR4JwoJd2FudCA9ICdsb25nJwpjbGFzcyBmbG9hdGluZyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CgkiIiJmbG9hdGluZyAtIERvZXMgdGhlIHdpbmRvdyBmbG9hdD8iIiIKCXdoaWNoID0gJ2lzZmwnCgl3YW50ID0gJ2Jvb2wnCmNsYXNzIG1vZGFsKGFldG9vbHMuTlByb3BlcnR5KToKCSIiIm1vZGFsIC0gSXMgdGhlIHdpbmRvdyBtb2RhbD8iIiIKCXdoaWNoID0gJ3Btb2QnCgl3YW50ID0gJ2Jvb2wnCmNsYXNzIHJlc2l6YWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CgkiIiJyZXNpemFibGUgLSBJcyB0aGUgd2luZG93IHJlc2l6YWJsZT8iIiIKCXdoaWNoID0gJ3Byc3onCgl3YW50ID0gJ2Jvb2wnCmNsYXNzIHpvb21hYmxlKGFldG9vbHMuTlByb3BlcnR5KToKCSIiInpvb21hYmxlIC0gSXMgdGhlIHdpbmRvdyB6b29tYWJsZT8iIiIKCXdoaWNoID0gJ2lzem0nCgl3YW50ID0gJ2Jvb2wnCmNsYXNzIHpvb21lZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CgkiIiJ6b29tZWQgLSBJcyB0aGUgd2luZG93IHpvb21lZD8iIiIKCXdoaWNoID0gJ3B6dW0nCgl3YW50ID0gJ2Jvb2wnCmNsYXNzIHZpc2libGUoYWV0b29scy5OUHJvcGVydHkpOgoJIiIidmlzaWJsZSAtIElzIHRoZSB3aW5kb3cgdmlzaWJsZT8iIiIKCXdoaWNoID0gJ3B2aXMnCgl3YW50ID0gJ2Jvb2wnCgp3aW5kb3dzID0gd2luZG93CgpjbGFzcyBpbnNlcnRpb25fcG9pbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKCSIiImluc2VydGlvbiBwb2ludCAtIEFuIGluc2VydGlvbiBsb2NhdGlvbiBiZXR3ZWVuIHR3byBvYmplY3RzIiIiCgl3YW50ID0gJ2NpbnMnCgppbnNlcnRpb25fcG9pbnRzID0gaW5zZXJ0aW9uX3BvaW50CmFwcGxpY2F0aW9uLl9wcm9wZGljdCA9IHsKCSdjbGlwYm9hcmQnIDogY2xpcGJvYXJkLAoJJ2Zyb250bW9zdCcgOiBmcm9udG1vc3QsCgknbmFtZScgOiBuYW1lLAoJJ3NlbGVjdGlvbicgOiBzZWxlY3Rpb24sCgkndmVyc2lvbicgOiB2ZXJzaW9uLAp9CmFwcGxpY2F0aW9uLl9lbGVtZGljdCA9IHsKfQpjaGFyYWN0ZXIuX3Byb3BkaWN0ID0gewoJJ2NvbG9yJyA6IGNvbG9yLAoJJ2ZvbnQnIDogZm9udCwKCSdzaXplJyA6IHNpemUsCgknd3JpdGluZ19jb2RlJyA6IHdyaXRpbmdfY29kZSwKCSdzdHlsZScgOiBzdHlsZSwKCSd1bmlmb3JtX3N0eWxlcycgOiB1bmlmb3JtX3N0eWxlcywKfQpjaGFyYWN0ZXIuX2VsZW1kaWN0ID0gewp9CmRvY3VtZW50Ll9wcm9wZGljdCA9IHsKCSdtb2RpZmllZCcgOiBtb2RpZmllZCwKfQpkb2N1bWVudC5fZWxlbWRpY3QgPSB7Cn0KZmlsZS5fcHJvcGRpY3QgPSB7Cgknc3RhdGlvbmVyeScgOiBzdGF0aW9uZXJ5LAp9CmZpbGUuX2VsZW1kaWN0ID0gewp9CnNlbGVjdGlvbl8yZF9vYmplY3QuX3Byb3BkaWN0ID0gewoJJ2NvbnRlbnRzJyA6IGNvbnRlbnRzLAp9CnNlbGVjdGlvbl8yZF9vYmplY3QuX2VsZW1kaWN0ID0gewp9CnRleHQuX3Byb3BkaWN0ID0gewoJJ2ZvbnQnIDogZm9udCwKfQp0ZXh0Ll9lbGVtZGljdCA9IHsKfQp0ZXh0X3N0eWxlX2luZm8uX3Byb3BkaWN0ID0gewoJJ29uX3N0eWxlcycgOiBvbl9zdHlsZXMsCgknb2ZmX3N0eWxlcycgOiBvZmZfc3R5bGVzLAp9CnRleHRfc3R5bGVfaW5mby5fZWxlbWRpY3QgPSB7Cn0Kd2luZG93Ll9wcm9wZGljdCA9IHsKCSdib3VuZHMnIDogYm91bmRzLAoJJ2Nsb3NlYWJsZScgOiBjbG9zZWFibGUsCgkndGl0bGVkJyA6IHRpdGxlZCwKCSdpbmRleCcgOiBpbmRleCwKCSdmbG9hdGluZycgOiBmbG9hdGluZywKCSdtb2RhbCcgOiBtb2RhbCwKCSdyZXNpemFibGUnIDogcmVzaXphYmxlLAoJJ3pvb21hYmxlJyA6IHpvb21hYmxlLAoJJ3pvb21lZCcgOiB6b29tZWQsCgkndmlzaWJsZScgOiB2aXNpYmxlLAp9CndpbmRvdy5fZWxlbWRpY3QgPSB7Cn0KaW5zZXJ0aW9uX3BvaW50Ll9wcm9wZGljdCA9IHsKfQppbnNlcnRpb25fcG9pbnQuX2VsZW1kaWN0ID0gewp9CmNsYXNzIHN0YXJ0c193aXRoKGFldG9vbHMuTkNvbXBhcmlzb24pOgoJIiIic3RhcnRzIHdpdGggLSBTdGFydHMgd2l0aCIiIgpjbGFzcyBjb250YWlucyhhZXRvb2xzLk5Db21wYXJpc29uKToKCSIiImNvbnRhaW5zIC0gQ29udGFpbnMiIiIKY2xhc3MgZW5kc193aXRoKGFldG9vbHMuTkNvbXBhcmlzb24pOgoJIiIiZW5kcyB3aXRoIC0gRW5kcyB3aXRoIiIiCmNsYXNzIF8zZF8oYWV0b29scy5OQ29tcGFyaXNvbik6CgkiIiI9IC0gRXF1YWwiIiIKY2xhc3MgXzNlXyhhZXRvb2xzLk5Db21wYXJpc29uKToKCSIiIj4gLSBHcmVhdGVyIHRoYW4iIiIKY2xhc3MgX2IzXyhhZXRvb2xzLk5Db21wYXJpc29uKToKCSIiIoQgLSBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8iIiIKY2xhc3MgXzNjXyhhZXRvb2xzLk5Db21wYXJpc29uKToKCSIiIjwgLSBMZXNzIHRoYW4iIiIKY2xhc3MgX2IyXyhhZXRvb2xzLk5Db21wYXJpc29uKToKCSIiIr4gLSBMZXNzIHRoYW4gb3IgZXF1YWwgdG8iIiIKX0VudW1fc2F2byA9IHsKCSd5ZXMnIDogJ3llcyAnLAkjIFNhdmUgb2JqZWN0cyBub3cKCSdubycgOiAnbm8gICcsCSMgRG8gbm90IHNhdmUgb2JqZWN0cwoJJ2FzaycgOiAnYXNrICcsCSMgQXNrIHRoZSB1c2VyIHdoZXRoZXIgdG8gc2F2ZQp9CgpfRW51bV9rZnJtID0gewoJJ2luZGV4JyA6ICdpbmR4JywJIyBrZXlmb3JtIGRlc2lnbmF0aW5nIGluZGV4ZWQgYWNjZXNzCgknbmFtZWQnIDogJ25hbWUnLAkjIGtleWZvcm0gZGVzaWduYXRpbmcgbmFtZWQgYWNjZXNzCgknaWQnIDogJ0lEICAnLAkjIGtleWZvcm0gZGVzaWduYXRpbmcgYWNjZXNzIGJ5IHVuaXF1ZSBpZGVudGlmaWVyCn0KCl9FbnVtX3N0eWwgPSB7CgkncGxhaW4nIDogJ3BsYW4nLAkjIFBsYWluCgknYm9sZCcgOiAnYm9sZCcsCSMgQm9sZAoJJ2l0YWxpYycgOiAnaXRhbCcsCSMgSXRhbGljCgknb3V0bGluZScgOiAnb3V0bCcsCSMgT3V0bGluZQoJJ3NoYWRvdycgOiAnc2hhZCcsCSMgU2hhZG93CgkndW5kZXJsaW5lJyA6ICd1bmRsJywJIyBVbmRlcmxpbmUKCSdzdXBlcnNjcmlwdCcgOiAnc3BzYycsCSMgU3VwZXJzY3JpcHQKCSdzdWJzY3JpcHQnIDogJ3Nic2MnLAkjIFN1YnNjcmlwdAoJJ3N0cmlrZXRocm91Z2gnIDogJ3N0cmsnLAkjIFN0cmlrZXRocm91Z2gKCSdzbWFsbF9jYXBzJyA6ICdzbWNwJywJIyBTbWFsbCBjYXBzCgknYWxsX2NhcHMnIDogJ2FsY3AnLAkjIEFsbCBjYXBpdGFsIGxldHRlcnMKCSdhbGxfbG93ZXJjYXNlJyA6ICdsb3djJywJIyBMb3dlcmNhc2UKCSdjb25kZW5zZWQnIDogJ2NvbmQnLAkjIENvbmRlbnNlZAoJJ2V4cGFuZGVkJyA6ICdwZXhwJywJIyBFeHBhbmRlZAoJJ2hpZGRlbicgOiAnaGlkbicsCSMgSGlkZGVuCn0KCgojCiMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQojCl9jbGFzc2RlY2xhcmF0aW9ucyA9IHsKCSdkb2N1JyA6IGRvY3VtZW50LAoJJ3RzdHknIDogdGV4dF9zdHlsZV9pbmZvLAoJJ2N0eHQnIDogdGV4dCwKCSdjYXBwJyA6IGFwcGxpY2F0aW9uLAoJJ2NzZWwnIDogc2VsZWN0aW9uXzJkX29iamVjdCwKCSdmaWxlJyA6IGZpbGUsCgknY3dpbicgOiB3aW5kb3csCgknY2hhICcgOiBjaGFyYWN0ZXIsCgknY2lucycgOiBpbnNlcnRpb25fcG9pbnQsCn0KCl9wcm9wZGVjbGFyYXRpb25zID0gewoJJ3B0aXQnIDogdGl0bGVkLAoJJ29uc3QnIDogb25fc3R5bGVzLAoJJ3BuYW0nIDogbmFtZSwKCSdwY2xpJyA6IGNsaXBib2FyZCwKCSd1c3RsJyA6IHVuaWZvcm1fc3R5bGVzLAoJJ3BzY3QnIDogd3JpdGluZ19jb2RlLAoJJ3R4c3QnIDogc3R5bGUsCgkncHZpcycgOiB2aXNpYmxlLAoJJ3BzcGQnIDogc3RhdGlvbmVyeSwKCSdwaXNmJyA6IGZyb250bW9zdCwKCSdzZWxlJyA6IHNlbGVjdGlvbiwKCSdwbW9kJyA6IG1vZGFsLAoJJ2ltb2QnIDogbW9kaWZpZWQsCgknb2ZzdCcgOiBvZmZfc3R5bGVzLAoJJ3B0c3onIDogc2l6ZSwKCSdwenVtJyA6IHpvb21lZCwKCSdoY2xiJyA6IGNsb3NlYWJsZSwKCSdmb250JyA6IGZvbnQsCgkncGNudCcgOiBjb250ZW50cywKCSdpc2ZsJyA6IGZsb2F0aW5nLAoJJ3BpZHgnIDogaW5kZXgsCgknaXN6bScgOiB6b29tYWJsZSwKCSdjb2xyJyA6IGNvbG9yLAoJJ3BibmQnIDogYm91bmRzLAoJJ3ZlcnMnIDogdmVyc2lvbiwKCSdwcnN6JyA6IHJlc2l6YWJsZSwKfQoKX2NvbXBkZWNsYXJhdGlvbnMgPSB7CgknPiAgICcgOiBfM2VfLAoJJ2Jnd3QnIDogc3RhcnRzX3dpdGgsCgknPj0gICcgOiBfYjNfLAoJJz0gICAnIDogXzNkXywKCSc8PSAgJyA6IF9iMl8sCgknY29udCcgOiBjb250YWlucywKCSdlbmRzJyA6IGVuZHNfd2l0aCwKCSc8ICAgJyA6IF8zY18sCn0KCl9lbnVtZGVjbGFyYXRpb25zID0gewoJJ3N0eWwnIDogX0VudW1fc3R5bCwKCSdzYXZvJyA6IF9FbnVtX3Nhdm8sCgkna2ZybScgOiBfRW51bV9rZnJtLAp9Cg==