# Name: gbp_admin_library v0.4.669 # Last modified: 2008-01-27 # MD5: 0aff37fb1d6e93d8405ef97d7b8825bd # GBP's Admin-Side Library # Author: Graeme Porteous # URL: http://rgbp.co.uk/projects/textpattern/gbp_admin_library/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMzp7czozOiJ1cmwiO3M6NzM6IiRIZWFkVVJMOiBodHRwOi8vcmdicC5jby51ay9zdm4v dHhwX3BsdWdpbnMvdHJ1bmsvZ2JwX2FkbWluX2xpYnJhcnkucGhwICQiO3M6NDoiZGF0ZSI7 czoxMDoiMjAwOC0wMS0yNyI7czo4OiJyZXZpc2lvbiI7czoyNzoiJExhc3RDaGFuZ2VkUmV2 aXNpb246IDY2OSAkIjtzOjQ6Im5hbWUiO3M6MTc6ImdicF9hZG1pbl9saWJyYXJ5IjtzOjc6 InZlcnNpb24iO3M6NzoiMC40LjY2OSI7czo2OiJhdXRob3IiO3M6MTU6IkdyYWVtZSBQb3J0 ZW91cyI7czoxMDoiYXV0aG9yX3VyaSI7czo1NzoiaHR0cDovL3JnYnAuY28udWsvcHJvamVj dHMvdGV4dHBhdHRlcm4vZ2JwX2FkbWluX2xpYnJhcnkvIjtzOjExOiJkZXNjcmlwdGlvbiI7 czoyNDoiR0JQJ3MgQWRtaW4tU2lkZSBMaWJyYXJ5IjtzOjQ6InR5cGUiO3M6MToiMiI7czo0 OiJoZWxwIjtzOjE1ODoiPGRpdiBpZD0iYWRtaW5saWJfaGVscCI+CgpoMSgjdG9wKS4gR3Jh ZW1lIFBvcnRlb3VzJyBBZG1pbiBMaWJyYXJ5LgoKUHJvdmlkZXMgYmFzaWMgY2xhc3NlcyBm b3IgYnVpbGRpbmcgdGhlIGFkbWluIHNpZGUgb2YgeW91ciBvd24sIGRlcml2ZWQsIHBsdWdp bnMuCgo8L2Rpdj4iO3M6NDoiY29kZSI7czoyNzY4NDoiCi8vIENvbnN0YW50cwpkZWZpbmUo J2dicF90YWInLCAndGFiJyk7CmRlZmluZSgnZ2JwX2lkJywgJ2lkJyk7CgpjbGFzcyBHQlBQ bHVnaW4gewoJLy8gSW50ZXJuYWwgdmFyaWFibGVzCgl2YXIgJHBsdWdpbl9uYW1lOwoJdmFy ICR0aXRsZTsKCXZhciAkZXZlbnQ7Cgl2YXIgJG1lc3NhZ2UgPSAnJzsKCXZhciAkdGFicyA9 IGFycmF5KCk7Cgl2YXIgJGFjdGl2ZV90YWIgPSAwOwoJdmFyICR1c2VfdGFicyA9IGZhbHNl OwoJdmFyICRncCA9IGFycmF5KCk7Cgl2YXIgJHByZWZlcmVuY2VzID0gYXJyYXkoKTsKCXZh ciAkcGVybWlzc2lvbnMgPSAnMSwyLDMsNCw1LDYnOwoJdmFyICR3aXphcmRfa2V5OwoJdmFy ICR3aXphcmRfaW5zdGFsbGVkID0gZmFsc2U7CgoJLy8gQ29uc3RydWN0b3IKCWZ1bmN0aW9u IEdCUFBsdWdpbiAoJHRpdGxlID0gJycsICRldmVudCA9ICcnLCAkcGFyZW50X3RhYiA9ICcn KSB7CgoJCWdsb2JhbCAkdHhwX2N1cnJlbnRfcGx1Z2luOwoKCQkvLyBTdG9yZSBhIHJlZmVy ZW5jZSB0byB0aGlzIGNsYXNzIHNvIHdlIGNhbiBnZXQgUEhQIDQgdG8gd29yawoJCWlmICh2 ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCAnNS4wLjAnLCAnPCcpKQoJCQlnbG9iYWwg JGdicF9hZG1pbl9saWJfcmVmczsgJGdicF9hZG1pbl9saWJfcmVmc1skdHhwX2N1cnJlbnRf cGx1Z2luXSA9ICYkdGhpczsKCgkJLy8gR2V0IHRoZSBwbHVnaW5fbmFtZSBmcm9tIHRoZSBn bG9iYWwgdHhwX2N1cnJlbnRfcGx1Z2luIHZhcmlhYmxlCgkJJHRoaXMtPnBsdWdpbl9uYW1l ID0gJHR4cF9jdXJyZW50X3BsdWdpbjsKCgkJLy8gV2hlbiBtYWtpbmcgYSBHQlBBZG1pblZp ZXcgdGhlcmUgbXVzdCBiZSBldmVudCBhdHRyaWJ1dGVzCgkJJHRoaXMtPmV2ZW50ID0gJGV2 ZW50OwoKCQkvLyBBZGQgcHJpdnMgZm9yIHRoaXMgZXZlbnQKCQlnbG9iYWwgJHR4cF9wZXJt aXNzaW9uczsKCQkkcGVybXMgPSBAJHR4cF9wZXJtaXNzaW9uc1skdGhpcy0+cGVybWlzc2lv bnNdOwoJCWFkZF9wcml2cygkdGhpcy0+ZXZlbnQsICgkcGVybXMgPyAkcGVybXMgOiAkdGhp cy0+cGVybWlzc2lvbnMpKTsKCgkJaWYgKEB0eHBpbnRlcmZhY2UgPT0gJ2FkbWluJykgewoJ CQkvLyBXZSBhcmUgYWRtaW4tc2lkZS4KCgkJCS8vIFRoZXJlIG11c3QgYmUgdGl0bGUgYW5k IGV2ZW50IGF0dHJpYnV0ZXMKCQkJJHRoaXMtPnRpdGxlID0gJHRpdGxlOwoKCQkJLy8gVGhl IHBhcmVudF90YWIgY2FuIG9ubHkgYmUgb25lIG9mIGZvdXIgdGhpbmdzLCBtYWtlIHN1cmUg aXQgaXMKCQkJaWYgKCRldmVudCBBTkQgJHRpdGxlIEFORCAkcGFyZW50X3RhYiBBTkQgYXJy YXlfc2VhcmNoKCRwYXJlbnRfdGFiLCBhcnJheSgnY29udGVudCcsICdwcmVzZW50YXRpb24n LCAnYWRtaW4nLCAnZXh0ZW5zaW9ucycpKSA9PT0gZmFsc2UpCgkJCQkkcGFyZW50X3RhYiA9 ICdleHRlbnNpb25zJzsKCgkJCS8vIFNldCB1cCB0aGUgZ2V0LXBvc3QgYXJyYXkKCQkJJHRo aXMtPmdwID0gYXJyYXlfbWVyZ2UoYXJyYXkoJ2V2ZW50JywgZ2JwX3RhYiksICR0aGlzLT5n cCk7CgoJCQkvLyBDaGVjayBpZiBvdXIgZXZlbnQgaXMgYWN0aXZlLCBpZiBzbyBjYWxsIHBy ZWxvYWQoKQoJCQlpZiAoZ3BzKCdldmVudCcpID09ICRldmVudCkgewoKCQkJCSR0aGlzLT5s b2FkX3ByZWZlcmVuY2VzKCk7CgoJCQkJJHRoaXMtPnByZWxvYWQoKTsKCgkJCQkvLyBUYWJz IHNob3VsZCBiZSBsb2FkZWQgYnkgbm93CgkJCQlpZiAoJHBhcmVudF90YWIgJiYgJHRoaXMt PnVzZV90YWJzKSB7CgoJCQkJCWZvcmVhY2ggKGFycmF5X2tleXMoJHRoaXMtPnRhYnMpIGFz ICRrZXkpIHsKCQkJCQkJJHRhYiA9ICYkdGhpcy0+dGFic1ska2V5XTsKCQkJCQkJJHRhYi0+ cGhwXzRfZml4KCk7CgkJCQkJCWlmIChpc19hKCR0YWIsICdHQlBXaXphcmRUYWJWaWV3Jykp IHsKCQkJCQkJCSR0aGlzLT53aXphcmRfa2V5ID0gJGtleTsKCQkJCQkJCSR0aGlzLT53aXph cmRfaW5zdGFsbGVkID0gJHRhYi0+aW5zdGFsbGVkKCk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJ CWlmICghJHRoaXMtPndpemFyZF9pbnN0YWxsZWQgJiYgJHRoaXMtPndpemFyZF9rZXkpCgkJ CQkJCSR0aGlzLT5hY3RpdmVfdGFiID0gJHRoaXMtPndpemFyZF9rZXk7CgoJCQkJCS8vIExl dCB0aGUgYWN0aXZlX3RhYiBrbm93IGl0J3MgYWN0aXZlIGFuZCBjYWxsIGl0J3MgcHJlbG9h ZCgpCgkJCQkJJHRhYiA9ICYkdGhpcy0+dGFic1skdGhpcy0+YWN0aXZlX3RhYl07CgkJCQkJ JHRhYi0+aXNfYWN0aXZlID0gMTsKCQkJCQkkdGFiLT5wcmVsb2FkKCk7CgkJCQl9CgkJCX0K CgkJCS8vIENhbGwgdHhwIGZ1bmN0aW9ucyB0byByZWdpc3RlciB0aGlzIHBsdWdpbgoJCQlp ZiAoJHBhcmVudF90YWIpIHsKCQkJCXJlZ2lzdGVyX3RhYigkcGFyZW50X3RhYiwgJGV2ZW50 LCAkdGl0bGUpOwoJCQkJcmVnaXN0ZXJfY2FsbGJhY2soYXJyYXkoJiR0aGlzLCAncmVuZGVy JyksICRldmVudCwgbnVsbCwgMCk7CgkJCX0KCQl9CgkJaWYgKEB0eHBpbnRlcmZhY2UgPT0g J3B1YmxpYycpCgkJCSR0aGlzLT5sb2FkX3ByZWZlcmVuY2VzKCk7Cgl9CgoJZnVuY3Rpb24g bG9hZF9wcmVmZXJlbmNlcyAoKSB7CgkJLyoKCQlHcmFiIGFuZCBzdG9yZSBhbGwgcHJlZmVy ZW5jZXMgd2l0aCBldmVudCBtYXRjaGluZyB0aGlzIHBsdWdpbiwgY29tYmluZSBnYnBfcGFy dGlhbAoJCXJvd3MgYW5kIGRlY29kZSB0aGUgdmFsdWUgaWYgaXQncyBvZiBjdXN0b20gdHlw ZS4KCQkqLwoJCWdsb2JhbCAkcHJlZnM7CgoJCS8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHZh bHVlcyBpZiB0aGUgcHJlZnMgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgcHJlZmVyZW5jZXMg dGFibGUuCgkJJHByZWZlcmVuY2VzID0gc2FmZV9yb3dzKCJuYW1lLCBodG1sIGFzIHR5cGUi LAoJCSd0eHBfcHJlZnMnLCAiZXZlbnQgPSAneyR0aGlzLT5ldmVudH0nIEFORCBodG1sIDw+ ICdnYnBfcGFydGlhbCciKTsKCgkJLy8gQWRkIHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIHdo aWNoIGFyZW4ndCBzYXZlZCBpbiB0aGUgZGIgYnV0IGRlZmluZWQgaW4gdGhlIHBsdWdpbidz IHNvdXJjZS4KCQlmb3JlYWNoICgkdGhpcy0+cHJlZmVyZW5jZXMgYXMgJGtleSA9PiAkcHJl ZikgewoJCQkkZGJfcHJlZiA9IGFycmF5KCduYW1lJyA9PiAkdGhpcy0+cGx1Z2luX25hbWUu J18nLiRrZXksICd0eXBlJyA9PiAkcHJlZlsndHlwZSddKTsKCQkJaWYgKGFycmF5X3NlYXJj aCgkZGJfcHJlZiwgJHByZWZlcmVuY2VzKSA9PT0gZmFsc2UpCgkJCQkkcHJlZmVyZW5jZXNb XSA9ICRkYl9wcmVmICsgYXJyYXkoJ2RlZmF1bHRfdmFsdWUnID0+ICRwcmVmWyd2YWx1ZSdd KTsKCQl9CgoJCWZvcmVhY2ggKCRwcmVmZXJlbmNlcyBhcyAkbmFtZSA9PiAkcHJlZikgewoJ CQkvLyBFeHRyYWN0IHRoZSBuYW1lIGFuZCB0eXBlLgoJCQlleHRyYWN0KCRwcmVmKTsKCgkJ CS8vIFRoZSBiYXNlIG5hbWUgd2hpY2ggZ2JwX3BhcnRpYWwgcHJlZmVyZW5jZXMgY291bGQg c2hhcmUuCgkJCSRiYXNlX25hbWUgPSAkbmFtZTsKCgkJCS8vIENvbWJpbmUgdGhlIGV4dGVu ZGVkIHByZWZlcmVuY2VzLCB3aGljaCBnbyBvdmVyIHR3byByb3dzIGludG8gb25lIHByZWZl cmVuY2UuCgkJCSRpID0gMDsgJHZhbHVlID0gJyc7CgkJCXdoaWxlIChhcnJheV9rZXlfZXhp c3RzKCRuYW1lLCAkcHJlZnMpKSB7CgkJCQkkdmFsdWUgLj0gJHByZWZzWyRuYW1lXTsKCQkJ CXVuc2V0KCRwcmVmc1skbmFtZV0pOwoJCQkJLy8gVXBkYXRlIG5hbWUgZm9yIHRoZSBuZXh0 IGFycmF5X2tleV9leGlzdHMgY2hlY2suCgkJCQkkbmFtZSA9ICRiYXNlX25hbWUuJ18nLisr JGk7CgkJCX0KCgkJCS8vIElmIHRoZXJlIGlzIG5vIHZhbHVlIHRoZW4gcmV2ZXJ0IHRvIHRo ZSBkZWZhdWx0IHZhbHVlIGlmIGl0IGV4aXN0cy4KCQkJaWYgKCghJHZhbHVlIHx8IChAISR2 YWx1ZVswXSAmJiBjb3VudCgkdmFsdWUpIDw9IDEpKSAmJiBpc3NldCgkZGVmYXVsdF92YWx1 ZSkpCgkJCQkkdmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsKCgkJCS8vIEVsc2UgaWYgdGhpcyBh IGN1c3RvbSB0eXBlIChFLmcuIGdicF9zZXJpYWxpemVkIE9SIGdicF9hcnJheV90ZXh0KQoJ CQkvLyBjYWxsIGl0J3MgZGJfZ2V0IG1ldGhvZCB0byBkZWNvZGUgaXQncyB2YWx1ZS4KCQkJ ZWxzZSBpZiAoaXNfY2FsbGFibGUoYXJyYXkoJiR0aGlzLCAkdHlwZSkpKQoJCQkJJHZhbHVl ID0gY2FsbF91c2VyX2Z1bmMoYXJyYXkoJiR0aGlzLCAkdHlwZSksICdkYl9nZXQnLCAkdmFs dWUpOwoKCQkJLy8gUmUtc2V0IHRoZSBjb21iaW5lZCBhbmQgZGVjb2RlZCB2YWx1ZSB0byB0 aGUgZ2xvYmFsIHByZWZzIGFycmF5LgoJCQkkcHJlZnNbJGJhc2VfbmFtZV0gPSAkdmFsdWU7 CgoJCQkvLyBJZiB0aGUgcHJlZmVyZW5jZSBleGlzdHMgaW4gb3VyIHByZWZlcmVuY2UgYXJy YXkgc2V0IHRoZSBuZXcgdmFsdWUgYW5kIGNvcnJlY3QgdHlwZS4KCQkJJGJhc2VfbmFtZSA9 IHN1YnN0cigkYmFzZV9uYW1lLCBzdHJsZW4oJHRoaXMtPnBsdWdpbl9uYW1lLidfJykpOwoJ CQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkYmFzZV9uYW1lLCAkdGhpcy0+cHJlZmVyZW5jZXMp KQoJCQkJJHRoaXMtPnByZWZlcmVuY2VzWyRiYXNlX25hbWVdID0gYXJyYXkoJ3ZhbHVlJyA9 PiAkdmFsdWUsICd0eXBlJyA9PiAkdHlwZSk7CgkJfQoJfQoKCWZ1bmN0aW9uIHNldF9wcmVm ZXJlbmNlICgka2V5LCAkdmFsdWUsICR0eXBlID0gJycpIHsKCQlnbG9iYWwgJHByZWZzLCAk dHhwX2N1cnJlbnRfcGx1Z2luOwoKCQkvLyBJZiB0aGUgcGx1Z2luX25hbWUgb3IgZXZlbnQg aXNuJ3Qgc2V0IGlzIGl0IHNhZmUgdG8gYXNzdW1lCgkJLy8gJHR4cF9jdXJyZW50X3BsdWdp biBhbmQgZ3BzKCdldmVudCcpIGFyZSBjb3JyZWN0PwoJCSRwbHVnaW4gPSAoJHRoaXMtPnBs dWdpbl9uYW1lKSA/ICR0aGlzLT5wbHVnaW5fbmFtZSA6ICR0eHBfY3VycmVudF9wbHVnaW47 CgkJJGV2ZW50ID0gKCR0aGlzLT5ldmVudCkgPyAkdGhpcy0+ZXZlbnQgOiBncHMoJ2V2ZW50 Jyk7CgoJCS8vIFNldCBzb21lIHN0YW5kYXJkIGRiIGZpZWxkcwoJCSRiYXNlX25hbWUgPSAk cGx1Z2luLidfJy4ka2V5OwoJCSRuYW1lID0gJGJhc2VfbmFtZTsKCgkJLy8gSWYgYSB0eXBl IGhhc24ndCBiZWVuIHNwZWNpZmllZCB0aGVuIGxvb2sgdGhlIGtleSB1cCBpbiBvdXIgcHJl ZmVyZW5jZXMuCgkJLy8gRWxzZSBhc3N1bWUgaXQncyB0eXBlIGlzICd0ZXh0X2lucHV0Jy4K CQlpZiAoZW1wdHkoJHR5cGUpICYmIGFycmF5X2tleV9leGlzdHMoJGtleSwgJHRoaXMtPnBy ZWZlcmVuY2VzKSkKCQkJJHR5cGUgPSAkdGhpcy0+cHJlZmVyZW5jZXNbJGtleV1bJ3R5cGUn XTsKCQllbHNlIGlmIChlbXB0eSgkdHlwZSkpCgkJCSR0eXBlID0gJ3RleHRfaW5wdXQnOwoK CQkvLyBTZXQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgZ2xvYmFsIHByZWZzIGFycmF5IGFuZCBp ZiB0aGUgcHJlZmVyZW5jZSBleGlzdHMKCQkvLyB0byBvdXIgb3duIHByZWZlcmVuY2UgYXJy YXkuCgkJJHByZWZzWyRuYW1lXSA9ICR2YWx1ZTsKCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygk a2V5LCAkdGhpcy0+cHJlZmVyZW5jZXMpKQoJCQkkdGhpcy0+cHJlZmVyZW5jZXNbJGtleV0g PSBhcnJheSgndmFsdWUnID0+ICR2YWx1ZSwgJ3R5cGUnID0+ICR0eXBlKTsKCgkJLy8gSWYg dGhpcyBwcmVmZXJlbmNlIGhhcyBhIGN1c3RvbSB0eXBlIChFLmcuIGdicF9zZXJpYWxpemVk IE9SIGdicF9hcnJheV90ZXh0KQoJCS8vIGNhbGwgaXQncyBkYl9zZXQgbWV0aG9kIHRvIGVu Y29kZSB0aGUgdmFsdWUuCgkJaWYgKGlzX2NhbGxhYmxlKGFycmF5KCYkdGhpcywgJHR5cGUp KSkKCQkJJHZhbHVlID0gY2FsbF91c2VyX2Z1bmMoYXJyYXkoJiR0aGlzLCAkdHlwZSksICdk Yl9zZXQnLCAkdmFsdWUpOwoKCQkvLyBJdCBpcyBwb3NzaWJsZSB0byBsZWF2ZSBvbGQgJ2di cF9wYXJ0aWFsJyBwZXJmZXJlbmNlcyB3aGVuIHJlZHVjaW5nIHRoZQoJCS8vIGxlbmdodCBv ZiBhIHByZWZlcmVuY2UuIFJlbW92ZSB0aGVtIGFsbC4KCQkkdGhpcy0+cmVtb3ZlX3ByZWZl cmVuY2UoJG5hbWUpOwoKCQkvLyBNYWtlIHN1cmUgcHJlZmVyZW5jZXMgd2hpY2ggZXF1YWwg TlVMTCBhcmUgc2F2ZWQKCQlpZiAoZW1wdHkoJHZhbHVlKSkKCQkJc2V0X3ByZWYoJG5hbWUs ICcnLCAkZXZlbnQsIDIsICR0eXBlKTsKCgkJJGkgPSAwOyAkdmFsdWUgPSBkb1NsYXNoKCR2 YWx1ZSk7CgkJLy8gTGltaXQgcHJlZmVyZW5jZSB0byBhcHByb3hpbWF0bHkgNEtiIG9mIGRh dGEuIEkgaG9wZSB0aGlzIHdpbGwgYmUgZW5vdWdoCgkJd2hpbGUgKHN0cmxlbigkdmFsdWUp ICYmICRpIDwgMTYpIHsKCQkJLy8gR3JhYiB0aGUgZmlyc3QgMjU1IGNoYXJzIGZyb20gdGhl IHZhbHVlIGFuZCBzdHJpcCBhbnkgYmFja3dhcmQgc2xhc2hlcyB3aGljaAoJCQkvLyBjYXVz ZSB0aGUgU1FMIHRvIGJyZWFrLgoJCQkkdmFsdWVfc2VnbWVudCA9IHJ0cmltKHN1YnN0cigk dmFsdWUsIDAsIDI1NSksICdcXCcpOwoKCQkJLy8gU2V0IHRoZSBwcmVmZXJlbmNlIGFuZCB1 cGRhdGUgbmFtZSBmb3IgdGhlIG5leHQgYXJyYXlfa2V5X2V4aXN0cyBjaGVjay4KCQkJc2V0 X3ByZWYoJG5hbWUsICR2YWx1ZV9zZWdtZW50LCAkZXZlbnQsIDIsICgkaSA/ICdnYnBfcGFy dGlhbCcgOiAkdHlwZSkpOwoJCQkkbmFtZSA9ICRiYXNlX25hbWUuJ18nLisrJGk7CgoJCQkv LyBSZW1vdmUgdGhlIHNlZ21lbnQgb2YgdGhlIHZhbHVlIHdoaWNoIGhhcyBiZWVuIHNhdmVk LgoJCQkkdmFsdWUgPSBzdWJzdHJfcmVwbGFjZSgkdmFsdWUsICcnLCAwLCBzdHJsZW4oJHZh bHVlX3NlZ21lbnQpKTsKCQl9Cgl9CgoJZnVuY3Rpb24gcmVtb3ZlX3ByZWZlcmVuY2UgKCRr ZXkpIHsKCQkkZXZlbnQgPSAkdGhpcy0+ZXZlbnQ7CgkJc2FmZV9kZWxldGUoJ3R4cF9wcmVm cycsICJldmVudCA9ICckZXZlbnQnIEFORCAoKG5hbWUgTElLRSAnJGtleScpIE9SIChuYW1l IExJS0UgJ3ska2V5fV8lJyBBTkQgaHRtbCA9ICdnYnBfcGFydGlhbCcpKSIpOwoJfQoKCWZ1 bmN0aW9uIGdicF9zZXJpYWxpemVkICgkc3RlcCwgJHZhbHVlLCAkaXRlbSA9ICcnKSB7CgkJ c3dpdGNoIChzdHJ0b2xvd2VyKCRzdGVwKSkgewoJCQlkZWZhdWx0OgoJCQljYXNlICd1aV9p bic6CgkJCQlpZiAoIWlzX2FycmF5KCR2YWx1ZSkpICR2YWx1ZSA9IGFycmF5KCR2YWx1ZSk7 CgkJCQlyZXR1cm4gdGV4dF9pbnB1dCgkaXRlbSwgaW1wbG9kZSgnLCcsICR2YWx1ZSksIDUw KTsKCQkJYnJlYWs7CgkJCWNhc2UgJ3VpX291dCc6CgkJCQlyZXR1cm4gZXhwbG9kZSgnLCcs ICR2YWx1ZSk7CgkJCWJyZWFrOwoJCQljYXNlICdkYl9zZXQnOgoJCQkJcmV0dXJuIHNlcmlh bGl6ZSgkdmFsdWUpOwoJCQlicmVhazsKCQkJY2FzZSAnZGJfZ2V0JzoKCQkJCXJldHVybiB1 bnNlcmlhbGl6ZSgkdmFsdWUpOwoJCQlicmVhazsKCQl9CgkJcmV0dXJuICcnOwoJfQoKCWZ1 bmN0aW9uIGdicF9hcnJheV90ZXh0ICgkc3RlcCwgJHZhbHVlLCAkaXRlbSA9ICcnKSB7CgkJ c3dpdGNoIChzdHJ0b2xvd2VyKCRzdGVwKSkgewoJCQlkZWZhdWx0OgoJCQljYXNlICd1aV9p bic6CgkJCQlpZiAoIWlzX2FycmF5KCR2YWx1ZSkpICR2YWx1ZSA9IGFycmF5KCR2YWx1ZSk7 CgkJCQlyZXR1cm4gdGV4dF9pbnB1dCgkaXRlbSwgaW1wbG9kZSgnLCcsICR2YWx1ZSksIDUw KTsKCQkJYnJlYWs7CgkJCWNhc2UgJ3VpX291dCc6CgkJCQlyZXR1cm4gZXhwbG9kZSgnLCcs ICR2YWx1ZSk7CgkJCWJyZWFrOwoJCQljYXNlICdkYl9zZXQnOgoJCQkJcmV0dXJuIGltcGxv ZGUoJywnLCAkdmFsdWUpOwoJCQlicmVhazsKCQkJY2FzZSAnZGJfZ2V0JzoKCQkJCXJldHVy biBleHBsb2RlKCcsJywgJHZhbHVlKTsKCQkJYnJlYWs7CgkJfQoJCXJldHVybiAnJzsKCX0K CglmdW5jdGlvbiAmYWRkX3RhYiAoJHRhYiwgJGlzX2RlZmF1bHQgPSBOVUxMKSB7CgoJCS8v IENoZWNrIHRvIHNlZSBpZiB0aGUgdGFiIGlzIGFjdGl2ZQoJCWlmICgoJGlzX2RlZmF1bHQg JiYgIWdwcyhnYnBfdGFiKSkgfHwgKGdwcyhnYnBfdGFiKSA9PSAkdGFiLT5ldmVudCkpCgkJ CSR0aGlzLT5hY3RpdmVfdGFiID0gY291bnQoJHRoaXMtPnRhYnMpOwoKCQlpZiAoaXNfYSgk dGFiLCAnR0JQV2l6YXJkVGFiVmlldycpKSB7CgkJCSR0YWItPnBhcmVudCA9ICYkdGhpczsK CgkJCS8vIFdpemFyZCByb3V0aW5lcwoJCQkkc3RlcCA9IGdwcygnc3RlcCcpOwoJCQlpZiAo aW5fYXJyYXkoJHN0ZXAsIGFycmF5KCdzZXR1cCcsICdjbGVhbnVwJykpKSB7CgkJCQkkaW5z dGFsbGF0aW9uX3N0ZXBzID0gKCRzdGVwID09ICdzZXR1cCcpCgkJCQkJPyBhcnJheV9rZXlz KCR0YWItPmluc3RhbGxhdGlvbl9zdGVwcykKCQkJCQk6IGFycmF5X3JldmVyc2UoYXJyYXlf a2V5cygkdGFiLT5pbnN0YWxsYXRpb25fc3RlcHMpKTsKCQkJCWZvcmVhY2ggKCRpbnN0YWxs YXRpb25fc3RlcHMgYXMgJGtleSkgewoJCQkJCSRmdW5jdGlvbiA9IGFycmF5KCYkdGFiLCAk c3RlcC4nXycuJGtleSk7CgkJCQkJaWYgKGlzX2NhbGxhYmxlKCRmdW5jdGlvbikpIHsKCQkJ CQkJJG9wdGlvbmFsID0gQCR0YWItPmluc3RhbGxhdGlvbl9zdGVwc1ska2V5XVsnb3B0aW9u YWwnXTsKCQkJCQkJaWYgKCgkb3B0aW9uYWwgJiYgZ3BzKCdvcHRpb25hbF8nLiRrZXkpKSB8 fCAhJG9wdGlvbmFsKQoJCQkJCQkJY2FsbF91c2VyX2Z1bmMoJGZ1bmN0aW9uKTsKCQkJCQkJ ZWxzZQoJCQkJCQkJJHRhYi0+YWRkX3JlcG9ydF9pdGVtKCR0YWItPmluc3RhbGxhdGlvbl9z dGVwc1ska2V5XVskc3RlcF0sICdza2lwcGVkJyk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoK CQkvLyBTdG9yZSB0aGUgdGFiCgkJJHRoaXMtPnRhYnNbXSA9ICR0YWI7CgoJCS8vIFdlJ3Zl IGdvdCBhIHRhYiwgbGV0cyBhc3N1bWUgd2Ugd2FudCB0byB1c2UgaXQKCQkkdGhpcy0+dXNl X3RhYnMgPSB0cnVlOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJZnVuY3Rpb24gcHJlbG9hZCAo KSB7CgkJLy8gT3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpZiB5b3UgcmVxdWlyZSBzdWIgdGFi cy4KCX0KCglmdW5jdGlvbiByZW5kZXIgKCkgewoKCQkvLyByZW5kZXIoKSBnZXRzIGNhbGxl ZCBiZWNhdXNlIGl0IGlzIHNwZWNpZmllZCBpbiB0eHAncyByZWdpc3Rlcl9jYWxsYmFjaygp CgoJCS8vIEFmdGVyIGEgY2FsbGJhY2sgd2UgbG9zZSB0cmFjayBvZiB0aGUgY3VycmVudCBw bHVnaW4gaW4gUEhQIDQKCQlnbG9iYWwgJHR4cF9jdXJyZW50X3BsdWdpbjsKCQkkdHhwX2N1 cnJlbnRfcGx1Z2luID0gJHRoaXMtPnBsdWdpbl9uYW1lOwoKCQkkdGhpcy0+cmVuZGVyX2hl YWRlcigpOwoJCSR0aGlzLT5tYWluKCk7CgoJCWlmICgkdGhpcy0+dXNlX3RhYnMpIHsKCgkJ CSR0aGlzLT5yZW5kZXJfdGFicygpOwoJCQkkdGhpcy0+cmVuZGVyX3RhYl9tYWluKCk7CgkJ fQoKCQkkdGhpcy0+cmVuZGVyX2Zvb3RlcigpOwoJCSR0aGlzLT5lbmQoKTsKCX0KCglmdW5j dGlvbiByZW5kZXJfaGVhZGVyICgpIHsKCgkJLy8gUmVuZGVyIHRoZSBwYWdldG9wLCBhIHR4 cCBmdW5jdGlvbgoJCXBhZ2V0b3AoJHRoaXMtPnRpdGxlLCAkdGhpcy0+bWVzc2FnZSk7CgoJ CS8vIE9uY2UgYSBtZXNzYWdlIGhhcyBiZWVuIHVzZWQgd2UgZGlzY2FyZCBpdAoJCSR0aGlz LT5tZXNzYWdlID0gJyc7Cgl9CgoJZnVuY3Rpb24gcmVuZGVyX3RhYnMgKCkgewoJCS8vIFRo aXMgdGFibGUsIHdoaWNoIGNvbnRhaW5zIHRoZSB0YWdzLCB3aWxsIGhhdmUgdG8gYmUgY2hh bmdlZCBpZiBhbnkgaW1wcm92ZW1lbnRzCgkJLy8gaGFwcGVuIHRvIHRoZSBhZG1pbiBpbnRl cmZhY2UKCQkkb3V0W10gPSAnPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0i MCIgd2lkdGg9IjEwMCUiIHN0eWxlPSJtYXJnaW4tdG9wOi0yZW07bWFyZ2luLWJvdHRvbToy ZW07Ij4nOwoJCSRvdXRbXSA9ICc8dHI+PHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJ0YWJz Ij4nOwoJCSRvdXRbXSA9ICc8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIw IiBhbGlnbj0iY2VudGVyIj48dHI+JzsKCgkJJHN0eWxlID0gJ3N0eWxlPSJwYWRkaW5nOiAw IDMwcHg7Iic7CgkJLy8gRm9yY2UgdGhlIHdpemFyZCB0byBiZSB0aGUgb25seSB0YWIgaWYg dGhlIHBsdWdpbiBpc24ndCBpbnN0YWxsZWQKCQlpZiAoJHRoaXMtPndpemFyZF9pbnN0YWxs ZWQgfHwgISR0aGlzLT53aXphcmRfa2V5KQoJCQlmb3JlYWNoIChhcnJheV9rZXlzKCR0aGlz LT50YWJzKSBhcyAka2V5KSB7CgkJCQkvLyBSZW5kZXIgZWFjaCB0YWIgYnV0IGtlZXAgYSBy ZWZlcmVuY2UgdG8gdGhlIHRhYiBzbyBhbnkgY2hhbmdlcyBtYWRlIGFyZSBzdG9yZWQKCQkJ CSR0YWIgPSAmJHRoaXMtPnRhYnNbJGtleV07CgkJCQkkb3V0W10gPSAkdGFiLT5yZW5kZXJf dGFiKCk7CgkJCQkkZm4gPSBhcnJheSgmJHRhYiAsICdnZXRfY2FudmFzX3N0eWxlJyk7CgkJ CQlpZiAoaXNfY2FsbGFibGUoJGZuKSkgewoJCQkJCSRyZXMgPSBjYWxsX3VzZXJfZnVuYygk Zm4pOwoJCQkJCSRzdHlsZSA9IChmYWxzZSE9PSRyZXMpID8gJHJlcyA6ICRzdHlsZSA7CgkJ CQl9CgkJCX0KCQllbHNlIHsKCQkJJHRhYiA9ICYkdGhpcy0+dGFic1skdGhpcy0+d2l6YXJk X2tleV07CgkJCSRvdXRbXSA9ICR0YWItPnJlbmRlcl90YWIoKTsKCQkJJGZuID0gYXJyYXko JiR0YWIgLCAnZ2V0X2NhbnZhc19zdHlsZScpOwoJCQlpZiAoaXNfY2FsbGFibGUoJGZuKSkg ewoJCQkJJHJlcyA9IGNhbGxfdXNlcl9mdW5jKCRmbik7CgkJCQkkc3R5bGUgPSAoZmFsc2Uh PT0kcmVzKSA/ICRyZXMgOiAkc3R5bGUgOwoJCQl9CgkJfQoKCQkkb3V0W10gPSAnPC90cj48 L3RhYmxlPic7CgkJJG91dFtdID0gJzwvdGQ+PC90cj4nOwoJCSRvdXRbXSA9ICc8L3RhYmxl PjxkaXYgJy4kc3R5bGUuJz4nOwoKCQllY2hvIGpvaW4oJycsICRvdXQpOwoJfQoKCWZ1bmN0 aW9uIG1haW4gKCkgewoJCS8vIE92ZXJyaWRlIHRoaXMgZnVuY3Rpb24KCX0KCglmdW5jdGlv biByZW5kZXJfdGFiX21haW4gKCkgewoKCQkvLyBDYWxsIG1haW4oKSBmb3IgdGhlIGFjdGl2 ZV90YWIKCQkkdGFiID0gJiR0aGlzLT50YWJzWyR0aGlzLT5hY3RpdmVfdGFiXTsKCQlpZiAo KCR0aGlzLT53aXphcmRfaW5zdGFsbGVkIHx8ICEkdGhpcy0+d2l6YXJkX2tleSB8fCAkdGFi LT5ldmVudCA9PSAnd2l6YXJkJykgJiYgaGFzX3ByaXZzKCR0aGlzLT5ldmVudC4nLicuJHRh Yi0+ZXZlbnQpKQoJCQkkdGFiLT5tYWluKCk7CgkJZWxzZQoJCQllY2hvICc8cCBzdHlsZT0i bWFyZ2luLXRvcDozZW07dGV4dC1hbGlnbjpjZW50ZXIiPicuZ1R4dCgncmVzdHJpY3RlZF9h cmVhJykuJzwvcD4nOwoJfQoKCWZ1bmN0aW9uIHJlbmRlcl9mb290ZXIgKCkgewoKCQkvLyBB IHNpbXBsZSBmb290ZXIKCQlnbG9iYWwgJHBsdWdpbnNfdmVyOwoJCSRvdXRbXSA9ICc8L2Rp dj4nOwoJCSRvdXRbXSA9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nLXRvcDogM2VtOyB0ZXh0LWFs aWduOiBjZW50ZXI7IGNsZWFyOiBib3RoOyI+JzsKCQkkb3V0W10gPSAkdGhpcy0+cGx1Z2lu X25hbWU7CgkJaWYgKEAkcGx1Z2luc192ZXJbJHRoaXMtPnBsdWdpbl9uYW1lXSkKCQkgCSRv dXRbXSA9ICcgJiMxODM7ICcgLiAkcGx1Z2luc192ZXJbJHRoaXMtPnBsdWdpbl9uYW1lXTsK CQkkb3V0W10gPSAnPC9kaXY+JzsKCgkJZWNobyBqb2luKCcnLCAkb3V0KTsKCX0KCglmdW5j dGlvbiBlbmQgKCkgewoJCS8vIE92ZXJyaWRlIHRoaXMgZnVuY3Rpb24KCX0KCglmdW5jdGlv biBmb3JtX2lucHV0cyAoKSB7CgoJCSRvdXRbXSA9IGVJbnB1dCgkdGhpcy0+ZXZlbnQpOwoK CQlpZiAoJHRoaXMtPnVzZV90YWJzKSB7CgoJCQkkdGFiID0gJHRoaXMtPnRhYnNbJHRoaXMt PmFjdGl2ZV90YWJdOwoJCQkkb3V0W10gPSBoSW5wdXQoZ2JwX3RhYiwgJHRhYi0+ZXZlbnQp OwoJCX0KCgkJcmV0dXJuIGpvaW4oJycsICRvdXQpOwoJfQoKCWZ1bmN0aW9uIHVybCAoJHZh cnMgPSBhcnJheSgpLCAkZ3AgPSBmYWxzZSkgewoJCS8qCgkJRXhwYW5kcyAkdmFycyBpbnRv IGEgZ2V0IHN0eWxlIHVybCBhbmQgcmVkaXJlY3RzIHRvIHRoYXQgbG9jYXRpb24uIFRoZXNl IGNhbiBiZQoJCW92ZXJyaWRlbiB3aXRoIHRoZSBjdXJyZW50IGdldCwgcG9zdCwgc2Vzc2lv biB2YXJpYWJsZXMgZGVmaW5lZCBpbiAkdGhpcy0+Z3AKCQlieSBzZXR0aW5nICRncCA9IHRy dWUKCQlOT1RFOiBJZiAkdmFycyBpcyBub3QgYW4gYXJyYXkgb3IgaXMgZW1wdHkgdGhlbiB3 ZSBhc3N1bWUgJGdwID0gdHJ1ZS4KCQkqLwoKCQlpZiAoIWlzX2FycmF5KCR2YXJzKSkKCQkJ JHZhcnMgPSBncHNhKCR0aGlzLT5ncCk7CgkJZWxzZSBpZiAoJGdwIHx8ICFjb3VudCgkdmFy cykpCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoZ3BzYSgkdGhpcy0+Z3ApLCAkdmFycyk7CgoJ CWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmICghZW1wdHkoJHZh bHVlKSkKCQkJCSRvdXRbXSA9ICRrZXkuJz0nLiR2YWx1ZTsKCQl9CgoJCSRzY3JpcHQgPSBo dS5iYXNlbmFtZSh0eHBhdGgpLicvaW5kZXgucGhwJzsKCQlyZXR1cm4gJHNjcmlwdCAuIChp c3NldCgkb3V0KQoJCQk/ICc/Jy5qb2luKCcmJywgJG91dCkKCQkJOiAnJyk7Cgl9CgoJZnVu Y3Rpb24gcmVkaXJlY3QgKCR1cmwgPSAnJywgJHN0YXR1cyA9IDMwMykgewoJCS8qCgkJSWYg JHZhcnMgaXMgYW4gYXJyYXksIHVzZSB1cmwoKSB0byBleHBhbmQgYXMgYW4gR0VUIHN0eWxl IHVybCBhbmQgcmVkaXJlY3QgdG8KCQl0aGF0IGxvY2F0aW9uIHVzaW5nIHRoZSBIVFRQIHN0 YXR1cyBjb2RlIGRlZmluaXRpb24gZGVmaW5lZCBieSAkc3RhdHVzLgoJCSovCgoJCXN0YXRp YyAkc3RhdHVzX2RlZmluaXRpb25zID0gYXJyYXkgKAoJCQkzMDEgPT4gIk1vdmVkIFBlcm1h bmVudGx5IiwKCQkJMzAyID0+ICJGb3VuZCIsCgkJCTMwMyA9PiAiU2VlIE90aGVyIiwKCQkJ MzA3ID0+ICJUZW1wb3JhcnkgUmVkaXJlY3QiCgkJKTsKCgkJaWYgKCFpbl9hcnJheSgkc3Rh dHVzLCBhcnJheV9rZXlzKCRzdGF0dXNfZGVmaW5pdGlvbnMpKSkKCQkJJHN0YXR1cyA9IDMw MzsKCgkJaWYgKGlzX2FycmF5KCR1cmwpKQoJCQkkdXJsID0gJHRoaXMtPnVybCgkdXJsKTsK CQllbHNlIHsKCQkJJHVybF9kZXRhaWxzID0gcGFyc2VfdXJsKCR1cmwpOwoJCQlpZiAoIUAk dXJsX2RldGFpbHNbJ3NjaGVtZSddKQoJCQkJJHVybCA9ICdodHRwOi8vJy4kdXJsOwoJCX0K CgkJaWYgKGVtcHR5KCRfU0VSVkVSWydGQ0dJX1JPTEUnXSkgYW5kIGVtcHR5KCRfRU5WWydG Q0dJX1JPTEUnXSkpIHsKCQkJaGVhZGVyKCdIVFRQLzEuMSAnLiRzdGF0dXMuJyAnLiRzdGF0 dXNfZGVmaW5pdGlvbnNbJHN0YXR1c10pOwoJCQloZWFkZXIoJ1N0YXR1czogJy4kc3RhdHVz KTsKCQkJaGVhZGVyKCdMb2NhdGlvbjogJy4kdXJsKTsKCQkJaGVhZGVyKCdDb25uZWN0aW9u OiBjbG9zZScpOwoJCQloZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAwJyk7CgkJCWV4aXQoMCk7 CgkJCX0gZWxzZSB7CgkJCWdsb2JhbCAkc2l0ZW5hbWU7CgkJCSR1cmwgPSBodG1sc3BlY2lh bGNoYXJzKCR1cmwpOwoJCQllY2hvIDw8PEVORAoJCQk8IURPQ1RZUEUgaHRtbCBQVUJMSUMg Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53 My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CgkJCTxodG1s IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxh bmc9ImVuIj4KCQkJPGhlYWQ+CgkJCQk8dGl0bGU+JHNpdGVuYW1lPC90aXRsZT4KCQkJCTxt ZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFy c2V0PXV0Zi04IiAvPgoJCQkJPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0i MDt1cmw9JHVybCIgLz4KCQkJPC9oZWFkPgoJCQk8Ym9keT4KCQkJPGEgaHJlZj0iJHVybCI+ eyRzdGF0dXNfZGVmaW5pdGlvbnNbJHN0YXR1c119PC9hPgoJCQk8L2JvZHk+CgkJCTwvaHRt bD4KRU5EOwoJCX0KCX0KCglmdW5jdGlvbiBwcmVmICgka2V5KSB7CgkJZ2xvYmFsICRwcmVm cywgJHR4cF9jdXJyZW50X3BsdWdpbjsKCgkJJHBsdWdpbiA9ICgkdGhpcy0+cGx1Z2luX25h bWUpID8gJHRoaXMtPnBsdWdpbl9uYW1lIDogJHR4cF9jdXJyZW50X3BsdWdpbjsKCQkka2V5 ID0gJHBsdWdpbi4nXycuJGtleTsKCgkJaWYgKEAkdGhpcy0+cHJlZmVyZW5jZXNbJGtleV0p CgkJCXJldHVybiAkdGhpcy0+cHJlZmVyZW5jZXNbJGtleV1bJ3ZhbHVlJ107CgkJaWYgKEAk cHJlZnNbJGtleV0pCgkJCXJldHVybiAkcHJlZnNbJGtleV07CgkJcmV0dXJuIE5VTEw7Cgl9 Cn0KCmNsYXNzIEdCUEFkbWluVGFiVmlldyB7CgkvLwlJbnRlcm5hbCB2YXJpYWJsZXMKCXZh ciAkdGl0bGU7Cgl2YXIgJGV2ZW50OwoJdmFyICRpc19hY3RpdmU7Cgl2YXIgJHBhcmVudDsK CXZhciAkcGVybWlzc2lvbnMgPSAnMSwyLDMsNCw1LDYnOwoKCS8vCUNvbnN0cnVjdG9yCglm dW5jdGlvbiBHQlBBZG1pblRhYlZpZXcgKCR0aXRsZSwgJGV2ZW50LCAmJHBhcmVudCwgJGlz X2RlZmF1bHQgPSBOVUxMKSB7CgoJCSR0aGlzLT50aXRsZSA9IChmdW5jdGlvbl9leGlzdHMo J21iX2NvbnZlcnRfY2FzZScpKQoJCQk/IG1iX2NvbnZlcnRfY2FzZSgkdGl0bGUsIE1CX0NB U0VfVElUTEUsICJVVEYtOCIpCgkJCTogdWN3b3JkcygkdGl0bGUpOwoKCQkkdGhpcy0+ZXZl bnQgPSAkZXZlbnQ7CgoJCS8vIE5vdGU6ICR0aGlzLT5wYXJlbnQgb25seSBnZXRzIHNldCBj b3JyZWN0bHkgZm9yIFBIUCA1CgkJJHRoaXMtPnBhcmVudCA9JiAkcGFyZW50LT5hZGRfdGFi KCR0aGlzLCAkaXNfZGVmYXVsdCk7CgoJCS8vIEFkZCBwcml2cyBmb3IgdGhpcyB0YWIKCQln bG9iYWwgJHR4cF9wZXJtaXNzaW9uczsKCQkkcGVybXMgPSBAJHR4cF9wZXJtaXNzaW9uc1sk dGhpcy0+cGVybWlzc2lvbnNdOwoJCWFkZF9wcml2cygkdGhpcy0+cGFyZW50LT5ldmVudC4n LicuJHRoaXMtPmV2ZW50LCAoJHBlcm1zID8gJHBlcm1zIDogJHRoaXMtPnBlcm1pc3Npb25z KSk7Cgl9CgoJZnVuY3Rpb24gcGhwXzRfZml4ICgpIHsKCgkJLy8gRml4IHJlZmVyZW5jZXMg aW4gUEhQIDQgc28gc3ViIHRhYnMgY2FuIGFjY2VzcyB0aGVpciBwYXJlbnQgdGFiCgkJaWYg KHZlcnNpb25fY29tcGFyZShwaHB2ZXJzaW9uKCksICc1LjAuMCcsICc8JykpIHsKCQkJZ2xv YmFsICR0eHBfY3VycmVudF9wbHVnaW4sICRnYnBfYWRtaW5fbGliX3JlZnM7CgkJCSR0aGlz LT5wYXJlbnQgPSYgJGdicF9hZG1pbl9saWJfcmVmc1skdHhwX2N1cnJlbnRfcGx1Z2luXTsK CQl9Cgl9CgoJZnVuY3Rpb24gcHJlbG9hZCAoKSB7CgkJLy8gT3ZlcnJpZGUgdGhpcyBmdW5j dGlvbgoJfQoKCWZ1bmN0aW9uIHJlbmRlcl90YWIgKCkgewoKCQkvLyBHcmFiIHRoZSB1cmwg dG8gdGhpcyB0YWIKCQkkdXJsID0gJHRoaXMtPnBhcmVudC0+dXJsKGFycmF5KGdicF90YWIg PT4gJHRoaXMtPmV2ZW50KSwgdHJ1ZSk7CgoJCS8vIFdpbGwgbmVlZCB1cGRhdGluZyBpZiBh bnkgaW1wcm92ZW1lbnRzIGhhcHBlbiB0byB0aGUgYWRtaW4gaW50ZXJmYWNlCgkJJG91dFtd ID0gJzx0ZCBjbGFzcz0iJyAuICgkdGhpcy0+aXNfYWN0aXZlID8gJ3RhYnVwJyA6ICd0YWJk b3duMicpOwoJCSRvdXRbXSA9ICciIG9uY2xpY2s9IndpbmRvdy5sb2NhdGlvbi5ocmVmPVwn JyAuJHVybC4gJ1wnIj4nOwoJCSRvdXRbXSA9ICc8YSBocmVmPSInIC4kdXJsLiAnIiBjbGFz cz0icGxhaW4iPicgLiR0aGlzLT50aXRsZS4gJzwvYT48L3RkPic7CgoJCXJldHVybiBqb2lu KCcnLCAkb3V0KTsKCX0KCglmdW5jdGlvbiBtYWluICgpIHsKCQkvLyBPdmVycmlkZSB0aGlz IGZ1bmN0aW9uCgl9CgoJZnVuY3Rpb24gcHJlZiAoJGtleSkgewoJCXJldHVybiBAJHRoaXMt PnBhcmVudC0+cHJlZigka2V5KTsKCX0KCglmdW5jdGlvbiByZWRpcmVjdCAoJHZhcnMgPSAn JykgewoJCSR0aGlzLT5wYXJlbnQtPnJlZGlyZWN0KCR2YXJzKTsKCX0KCglmdW5jdGlvbiBz ZXRfcHJlZmVyZW5jZSAoJGtleSwgJHZhbHVlLCAkdHlwZSA9ICcnKSB7CgkJcmV0dXJuICR0 aGlzLT5wYXJlbnQtPnNldF9wcmVmZXJlbmNlKCRrZXksICR2YWx1ZSwgJHR5cGUpOwoJfQoK CWZ1bmN0aW9uIHJlbW92ZV9wcmVmZXJlbmNlICgka2V5KSB7CgkJcmV0dXJuICR0aGlzLT5w YXJlbnQtPnJlbW92ZV9wcmVmZXJlbmNlKCRrZXkpOwoJfQoKCWZ1bmN0aW9uIHVybCAoJHZh cnMsICRncCA9IGZhbHNlKSB7CgkJcmV0dXJuICR0aGlzLT5wYXJlbnQtPnVybCgkdmFycywg JGdwKTsKCX0KCglmdW5jdGlvbiBmb3JtX2lucHV0cyAoKSB7CgkJcmV0dXJuICR0aGlzLT5w YXJlbnQtPmZvcm1faW5wdXRzKCk7Cgl9Cn0KCmNsYXNzIEdCUFByZWZlcmVuY2VUYWJWaWV3 IGV4dGVuZHMgR0JQQWRtaW5UYWJWaWV3IHsKCgl2YXIgJHBlcm1pc3Npb25zID0gJ3ByZWZz JzsKCglmdW5jdGlvbiBHQlBQcmVmZXJlbmNlVGFiVmlldyAoJiRwYXJlbnQsICRpc19kZWZh dWx0ID0gTlVMTCkgewoJCS8vIENhbGwgdGhlIHBhcmVudCBjb25zdHJ1Y3RvcgoJCUdCUEFk bWluVGFiVmlldzo6R0JQQWRtaW5UYWJWaWV3KGdUeHQoJ3RhYl9wcmVmZXJlbmNlcycpLCAn cHJlZmVyZW5jZScsICRwYXJlbnQsICRpc19kZWZhdWx0KTsKCX0KCglmdW5jdGlvbiBwcmVs b2FkICgpIHsKCQlpZiAocHMoJ3N0ZXAnKSA9PSAncHJlZnNfc2F2ZScpIHsKCQkJZm9yZWFj aCAoJHRoaXMtPnBhcmVudC0+cHJlZmVyZW5jZXMgYXMgJGtleSA9PiAkcHJlZikgewoJCQkJ ZXh0cmFjdCgkcHJlZik7CgkJCQkkdmFsdWUgPSBwcygka2V5KTsKCQkJCWlmIChpc19jYWxs YWJsZShhcnJheSgmJHRoaXMtPnBhcmVudCwgJHR5cGUpKSkKCQkJCQkkdmFsdWUgPSBjYWxs X3VzZXJfZnVuYyhhcnJheSgmJHRoaXMtPnBhcmVudCwgJHR5cGUpLCAndWlfb3V0JywgJHZh bHVlKTsKCQkJCSR0aGlzLT5wYXJlbnQtPnNldF9wcmVmZXJlbmNlKCRrZXksICR2YWx1ZSk7 CgkJCX0KCQl9Cgl9CgoJZnVuY3Rpb24gbWFpbiAoKSB7CgkJLy8gTWFrZSB0eHBfcHJlZnMu cGhwIGhhcHB5IDopCgkJZ2xvYmFsICRldmVudDsKCQkkZXZlbnQgPSAkdGhpcy0+cGFyZW50 LT5ldmVudDsKCgkJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL2luY2x1ZGUvdHhwX3ByZWZzLnBo cCc7CgoJCWVjaG8KCQkJJzxmb3JtIGFjdGlvbj0iaW5kZXgucGhwIiBtZXRob2Q9InBvc3Qi PicsCgkJCXN0YXJ0VGFibGUoJ2xpc3QnKTsKCgkJZm9yZWFjaCAoJHRoaXMtPnBhcmVudC0+ cHJlZmVyZW5jZXMgYXMgJGtleSA9PiAkcHJlZikgewoJCQlleHRyYWN0KCRwcmVmKTsKCgkJ CSRvdXQgPSB0ZGEoZ1R4dCgka2V5KSwgJyBzdHlsZT0idGV4dC1hbGlnbjpyaWdodDt2ZXJ0 aWNhbC1hbGlnbjptaWRkbGUiJyk7CgoJCQlzd2l0Y2ggKCR0eXBlKSB7CgkJCQljYXNlICd0 ZXh0X2lucHV0JzoKCQkJCQkkb3V0IC49IHRkKHByZWZfZnVuYygndGV4dF9pbnB1dCcsICRr ZXksICR2YWx1ZSwgMjApKTsKCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlpZiAoaXNf Y2FsbGFibGUoYXJyYXkoJiR0aGlzLT5wYXJlbnQsICR0eXBlKSkpCgkJCQkJCSRvdXQgLj0g dGQoY2FsbF91c2VyX2Z1bmMoYXJyYXkoJiR0aGlzLT5wYXJlbnQsICR0eXBlKSwgJ3VpX2lu JywgJHZhbHVlLCAka2V5KSk7CgkJCQkJZWxzZQoJCQkJCQkkb3V0IC49IHRkKHByZWZfZnVu YygkdHlwZSwgJGtleSwgJHZhbHVlLCA1MCkpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCSRvdXQg Lj0gdGRhKCR0aGlzLT5wb3BIZWxwKCRrZXkpLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt aWRkbGUiJyk7CgkJCWVjaG8gdHIoJG91dCk7CgkJfQoKCQllY2hvCgkJCXRyKHRkYShmSW5w dXQoJ3N1Ym1pdCcsICdTdWJtaXQnLCBnVHh0KCdzYXZlX2J1dHRvbicpLCAncHVibGlzaCcp LCAnIGNvbHNwYW49IjMiIGNsYXNzPSJub2xpbmUiJykpLAoJCQllbmRUYWJsZSgpLAoJCQkk dGhpcy0+cGFyZW50LT5mb3JtX2lucHV0cygpLAoJCQlzSW5wdXQoJ3ByZWZzX3NhdmUnKSwK CQkJJzwvZm9ybT4nOwoJfQoKCWZ1bmN0aW9uIHBvcEhlbHAgKCRoZWxwdmFyKSB7CgkJJHNj cmlwdCA9IGh1LmJhc2VuYW1lKHR4cGF0aCkuJy9pbmRleC5waHAnOwoJCXJldHVybiAnPGEg aHJlZj0iJy4kc2NyaXB0Lic/ZXZlbnQ9cGx1Z2luJnN0ZXA9cGx1Z2luX2hlbHAmbmFtZT0n LiR0aGlzLT5wYXJlbnQtPnBsdWdpbl9uYW1lLicjJy4kaGVscHZhci4nIiBjbGFzcz0icG9w aGVscCI+PzwvYT4nOwoJfQp9CgpjbGFzcyBHQlBXaXphcmRUYWJWaWV3IGV4dGVuZHMgR0JQ QWRtaW5UYWJWaWV3IHsKCgl2YXIgJGluc3RhbGxhdGlvbl9zdGVwcyA9IGFycmF5KCk7Cgl2 YXIgJHdpel9yZXBvcnQgPSBhcnJheSgpOwoJdmFyICRwZXJtaXNzaW9ucyA9ICdhZG1pbi5l ZGl0JzsKCglmdW5jdGlvbiBHQlBXaXphcmRUYWJWaWV3ICgmJHBhcmVudCwgJGlzX2RlZmF1 bHQgPSBOVUxMLCAkdGl0bGUgPSAnV2l6YXJkcycpIHsKCQlnbG9iYWwgJHRleHRhcnJheTsK CgkJIwoJCSMJR2V0IHRoZSBzdHJpbmdzIGFuZCBtZXJnZSBpbnRvIHRoZSB0ZXh0YXJyYXkg YmVmb3JlIHdlIGdldCB0aGUgc3RlcHMuLi4KCQkjCgkJJHN0cmluZ3MgPSAkdGhpcy0+Z2V0 X3N0cmluZ3MoKTsKCQkkdGV4dGFycmF5ID0gYXJyYXlfbWVyZ2UoJHN0cmluZ3MgLCAkdGV4 dGFycmF5KTsKCgkJIwoJCSMJTm93IGdldCB0aGUgc3RlcHMuLi4KCQkjCgkJJHRoaXMtPmlu c3RhbGxhdGlvbl9zdGVwcyA9ICR0aGlzLT5nZXRfc3RlcHMoKTsKCgkJLy8gQ2FsbCB0aGUg cGFyZW50IGNvbnN0cnVjdG9yCgkJR0JQQWRtaW5UYWJWaWV3OjpHQlBBZG1pblRhYlZpZXco JHRpdGxlLCAnd2l6YXJkJywgJHBhcmVudCwgJGlzX2RlZmF1bHQpOwoJfQoKCWZ1bmN0aW9u IGdldF9zdGVwcyAoKSB7CgkJIwoJCSMJT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gZGVyaXZl ZCBjbGFzc2VzIHRvIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgc2V0dXAvY2xlYW51cCBzdGVw cy4KCQkjCgkJJHN0ZXBzID0gYXJyYXkoCgkJCSdiYXNpYycgCQk9PiBhcnJheSgnc2V0dXAn ID0+ICdCYXNpYyBzZXR1cCBzdGVwJywgJ2NsZWFudXAnID0+ICdCYXNpYyBjbGVhbnVwIHN0 ZXAnKSwKCQkJJ29wdGlvbmFsJwkJPT4gYXJyYXkoJ3NldHVwJyA9PiAnT3B0aW9uYWwgc2V0 dXAgc3RlcCcsICdjbGVhbnVwJyA9PiAnT3B0aW9uYWwgY2xlYW51cCBzdGVwJywgJ29wdGlv bmFsJyA9PiB0cnVlICwgJ2NoZWNrZWQnID0+IDApLAoJCQknaGFzX29wdGlvbnMnCT0+IGFy cmF5KCdzZXR1cCcgPT4gJ1NldHVwIHN0ZXAgd2l0aCBhIG9wdGlvbicsICdjbGVhbnVwJyA9 PiAnQ2xlYW51cCBzdGVwIHdpdGggYSBvcHRpb24nLCAnaGFzX29wdGlvbnMnID0+IHRydWUp LAoJCSk7CgkJcmV0dXJuICRzdGVwczsKCX0KCglmdW5jdGlvbiBnZXRfc3RyaW5ncyAoJGxh bmd1YWdlID0gJycpIHsKCQkjCgkJIwlPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGRlcml2 ZWQgY2xhc3NlcyB0byBkZWZpbmUvY2hhbmdlIHRoZSBzZXQgb2Ygc3RyaW5ncyB0bwoJCSMg aW5qZWN0IGludG8gJHRleHRhcnJheSB0byBsb2NhbGlzZSB0aGUgd2l6YXJkLgoJCSMKCQkk c3RyaW5ncyA9IGFycmF5KAoJCQknZ2JwX2FkbGliX3dpei12ZXJzaW9uX2Vycm9ycycJCT0+ ICdWZXJzaW9uIEVycm9ycycsCgkJCSdnYnBfYWRsaWJfd2l6LXZlcnNpb25fcmVhc29uJwkJ PT4gJ1RoaXMgcGx1Z2luIGNhbm5vdCBvcGVyYXRlIGluIHRoaXMgaW5zdGFsbGF0aW9uIGJl Y2F1c2UmIzgyMzA7JywKCQkJJ2dicF9hZGxpYl93aXotdmVyc2lvbl9pdGVtJwkJPT4gJ0l0 IHJlcXVpcmVzIDxzdHJvbmcgY2xhc3M9ImZhaWx1cmUiPntuYW1lfSB7bWlufTwvc3Ryb25n PiBvciBhYm92ZSwgY3VycmVudCBpbnN0YWxsIGlzIHtjdXJyZW50fS4nLAoJCQknZ2JwX2Fk bGliX3dpei1zZXR1cCcgCQkJCT0+ICdTZXR1cCcsCgkJCSdnYnBfYWRsaWJfd2l6LXNldHVw X3N0ZXBzJyAJCT0+ICdUaGUgZm9sbG93aW5nIHNldHVwIHN0ZXBzIHdpbGwgYmUgdGFrZW4m IzgyMzA7JywKCQkJJ2dicF9hZGxpYl93aXotc2V0dXBfcmVwb3J0JwkJPT4gJ1NldHVwIFJl cG9ydCYjODIzMDsnLAoJCQknZ2JwX2FkbGliX3dpei1jbGVhbnVwJyAJCQk9PiAnQ2xlYW51 cCcsCgkJCSdnYnBfYWRsaWJfd2l6LWNsZWFudXBfc3RlcHMnIAkJPT4gJ1RoZSBmb2xsb3dp bmcgY2xlYW51cCBzdGVwcyB3aWxsIGJlIHRha2VuJiM4MjMwOycsCgkJCSdnYnBfYWRsaWJf d2l6LWNsZWFudXBfcmVwb3J0JwkJPT4gJ0NsZWFudXAgUmVwb3J0JiM4MjMwOycsCgkJCSdn YnBfYWRsaWJfd2l6LWNsZWFudXBfbmV4dCcgCQk9PiAnVGhlIHBsdWdpbiBjYW4gbm93IGJl IGRpc2FibGVkIGFuZC9vciB1bmluc3RhbGxlZC4nLAoJCQknZ2JwX2FkbGliX3dpei1kb25l JyAJCQkJPT4gJ0RvbmUnLAoJCQknZ2JwX2FkbGliX3dpei1za2lwcGVkJwkJCQk9PiAnU2tp cHBlZCcsCgkJCSdnYnBfYWRsaWJfd2l6LWZhaWxlZCcJCQkJPT4gJ0ZhaWx1cmUnLAoJCQkn Z2JwX2FkbGliX3dpei1zdGVwX2Jhc2ljJwkJCT0+ICdCYXNpYyBTdGVwJywKCQkJJ2dicF9h ZGxpYl93aXotc3RlcF9vcHRpb25hbCcJCT0+ICdPcHRpb25hbCBzdGVwJywKCQkJJ2dicF9h ZGxpYl93aXotc3RlcF9jb21wbGV4JwkJPT4gJ1N0ZXAgd2l0aCBvcHRpb24ocyknLAoJCQkn Z2JwX2FkbGliX3dpei1zdGVwX2NvbXBsZXhfdHh0Jwk9PiAnVGhpcyB7c3RlcH0gc3RlcCBo YXMgYW4gb3B0aW9uL29wdGlvbnMuJywKCQkpOwoJCXJldHVybiAkc3RyaW5nczsKCX0KCglm dW5jdGlvbiB2ZXJzaW9uc19vayAoKSB7CgkJJG1zZyA9ICcnOwoKCQkjCgkJIwlDaGVjayB0 aGUgcGx1Z2luIGNhbiBydW4gaW4gdGhpcyBlbnZpcm9ubWVudC4KCQkjCgkJIwlSZXR1cm46 IFRSVUUgLT4gWWVzLgoJCSMJSFRNTCBmb3JtYXR0ZWQgc3RyaW5nIC0+IE5vLCBhbmQgZXhw bGFpbiB3aHkuCgkJIwoJCSR0ZXN0cyA9ICR0aGlzLT5nZXRfcmVxdWlyZWRfdmVyc2lvbnMo KTsKCQlpZiAoY291bnQoJHRlc3RzKSkKCQkJZm9yZWFjaCAoJHRlc3RzIGFzICRuYW1lID0+ ICR2ZXJzaW9ucykgewoJCQkJaWYoIGFycmF5X2tleV9leGlzdHMoICdjdXN0b21faGFuZGxl cicgLCAkdmVyc2lvbnMgKSAmJiBpc19jYWxsYWJsZSggJHZlcnNpb25zWydjdXN0b21faGFu ZGxlciddICkgKSB7CgkJCQkJIwoJCQkJCSMgQWxsb3cgZGVyaXZlZCBjbGFzc2VzIHRvIGRl ZmluZSB0aGVpciBvd24gY2hlY2tpbmcgcm91dGluZXMuLi4KCQkJCQkjCgkJCQkJJGZuID0g JHZlcnNpb25zWydjdXN0b21faGFuZGxlciddOwoJCQkJCSRyZXMgPSBjYWxsX3VzZXJfZnVu YyggJGZuICwgJG5hbWUgLCAkdmVyc2lvbnMgKTsKCQkJCQlpZiggJHJlcyApCgkJCQkJCSRt c2dbXSA9IHRhZygkcmVzICwgJ2xpJywgJyBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsgcGFk ZGluZy10b3A6IDAuNzVlbTsiJyk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlpZiAodmVyc2lv bl9jb21wYXJlKCR2ZXJzaW9uc1snY3VycmVudCddLCAkdmVyc2lvbnNbJ21pbiddICwgJzwn KSkgewoJCQkJCQkkcmVzID0gZ1R4dCgnZ2JwX2FkbGliX3dpei12ZXJzaW9uX2l0ZW0nICwg YXJyYXkoJ3tuYW1lfScgPT4gJG5hbWUgLCAne21pbn0nID0+ICR2ZXJzaW9uc1snbWluJ10g LCAne2N1cnJlbnR9JyA9PiAkdmVyc2lvbnNbJ2N1cnJlbnQnXSkpOwoJCQkJCQkkbXNnW10g PSB0YWcoJHJlcyAsICdsaScsICcgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmct dG9wOiAwLjc1ZW07IicpOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQlpZiAoIWVtcHR5KCRtc2cp KQoJCQlyZXR1cm4gdGFnKGpvaW4oJycgLCAkbXNnKSAsICdvbCcpOwoKCQlyZXR1cm4gdHJ1 ZTsKCX0KCglmdW5jdGlvbiBnZXRfcmVxdWlyZWRfdmVyc2lvbnMgKCkgewoJCWdsb2JhbCAk cHJlZnM7CgoJCSMKCQkjCU92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGFuIGFy cmF5IG9mIHRlc3RzIHRvIGJlIGNhcnJpZWQgb3V0LgoJCSMKCQkkdGVzdHMgPSBhcnJheSgn VHhQJyA9PiBhcnJheSgKCQkJJ2N1cnJlbnQnCT0+ICRwcmVmc1sndmVyc2lvbiddLAoJCQkn bWluJwkJPT4gJzQuMC4zJywKCQkpKTsKCQlyZXR1cm4gJHRlc3RzOwoJfQoKCWZ1bmN0aW9u IG1haW4gKCkgewoJCSRvdXRbXSA9ICc8c3R5bGUgdHlwZT0idGV4dC9jc3MiPiAuc3VjY2Vz cyB7IGNvbG9yOiAjMDA5OTAwOyB9IC5mYWlsdXJlIHsgY29sb3I6ICNGRjAwMDA7IH0gLnNr aXBwZWQgeyBjb2xvcjogIzAwMDBGRjsgfSA8L3N0eWxlPic7CgkJJG91dFtdID0gJzxkaXYg c3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGdyYXk7IHdpZHRoOiA1MGVtOyB0ZXh0LWFsaWdu OiBjZW50ZXI7IG1hcmdpbjogMWVtIGF1dG87IHBhZGRpbmc6IDFlbTsgY2xlYXI6IGJvdGg7 Ij4nOwoKCQkkZmVhaWxkc2V0X3N0eWxlID0gJyBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsg cGFkZGluZzogMWVtIDAiJzsKCgkJJHN0ZXAgPSBncHMoJ3N0ZXAnKTsKCQlpZiAoZW1wdHko JHN0ZXApKSB7CgkJCSRyZXN1bHQgPSAkdGhpcy0+dmVyc2lvbnNfb2soKTsKCQkJaWYgKGlz X3N0cmluZygkcmVzdWx0KSkKCQkJCSRzdGVwID0gJ3ZlcnNpb25fZXJyb3InOwoJCQllbHNl CgkJCQkkc3RlcCA9ICgkdGhpcy0+aW5zdGFsbGVkKCkpID8gJ2NsZWFudXAtdmVyaWZ5JyA6 ICdzZXR1cC12ZXJpZnknOwoKCQkJJF9QT1NUWydzdGVwJ10gPSAkc3RlcDsKCQl9CgoJCXN3 aXRjaCAoJHN0ZXApIHsKCQkJY2FzZSAndmVyc2lvbl9lcnJvcic6CgkJCQkkb3V0W10gPSBo ZWQoZ1R4dCgnZ2JwX2FkbGliX3dpei12ZXJzaW9uX2Vycm9ycycpICwgMSk7CgkJCQkkb3V0 W10gPSBncmFmKGdUeHQoJ2dicF9hZGxpYl93aXotdmVyc2lvbl9yZWFzb24nKSk7CgkJCQkk b3V0W10gPSAkcmVzdWx0OwoJCQlicmVhazsKCgkJCWNhc2UgJ3NldHVwLXZlcmlmeSc6CgkJ CS8vIFJlbmRlciB0aGUgc2V0dXAgd2l6YXJkIGluaXRpYWwgc3RlcC4uLgoJCQkJJG91dFtd ID0gaGVkKGdUeHQoJ2dicF9hZGxpYl93aXotc2V0dXAnKSAsIDEpOwoJCQkJJG91dFtdID0g Z3JhZihnVHh0KCdnYnBfYWRsaWJfd2l6LXNldHVwX3N0ZXBzJykpOwoJCQkJJG91dFtdID0g dGFnKHRhZygkdGhpcy0+d2l6YXJkX3N0ZXBzKCdzZXR1cCcpICwgJ29sJykgLCAnZmllbGRz ZXQnLCAkZmVhaWxkc2V0X3N0eWxlKTsKCQkJCSRvdXRbXSA9IGZJbnB1dCgnc3VibWl0Jywg JycsIGdUeHQoJ2dicF9hZGxpYl93aXotc2V0dXAnKSwgJycpOwoJCQkJJG91dFtdID0gJHRo aXMtPmZvcm1faW5wdXRzKCk7CgkJCQkkb3V0W10gPSBzSW5wdXQoJ3NldHVwJyk7CgkJCWJy ZWFrOwoKCQkJY2FzZSAnc2V0dXAnOgoJCQkvLyBSZW5kZXIgdGhlIHBvc3Qtc2V0dXAgc2Ny ZWVuLi4uCgkJCQkkb3V0W10gPSBoZWQoZ1R4dCgnZ2JwX2FkbGliX3dpei1zZXR1cF9yZXBv cnQnKSAsIDEpOwoJCQkJJG91dFtdID0gdGFnKCR0aGlzLT53aXphcmRfcmVwb3J0KCkgLCAn ZmllbGRzZXQnLCAkZmVhaWxkc2V0X3N0eWxlKTsKCQkJCSRvdXRbXSA9IGZJbnB1dCgnc3Vi bWl0JywgJycgLCBnVHh0KCduZXh0JykgLCAnJyk7CgkJCQkkb3V0W10gPSBlSW5wdXQoJHRo aXMtPnBhcmVudC0+ZXZlbnQpOwoJCQkJJG91dFtdID0gaElucHV0KGdicF90YWIsICdwcmVm ZXJlbmNlJyk7CgkJCWJyZWFrOwoKCQkJY2FzZSAnY2xlYW51cC12ZXJpZnknOgoJCQkvLyBS ZW5kZXIgdGhlIGNsZWFudXAgd2l6YXJkIGluaXRpYWwgc3RlcC4uLgoJCQkJJG91dFtdID0g aGVkKGdUeHQoJ2dicF9hZGxpYl93aXotY2xlYW51cCcpICwgMSk7CgkJCQkkb3V0W10gPSBn cmFmKGdUeHQoJ2dicF9hZGxpYl93aXotY2xlYW51cF9zdGVwcycpKTsKCQkJCSRvdXRbXSA9 IHRhZyh0YWcoJHRoaXMtPndpemFyZF9zdGVwcygnY2xlYW51cCcpICwgJ29sJykgLCAnZmll bGRzZXQnLCAkZmVhaWxkc2V0X3N0eWxlKTsKCQkJCSRvdXRbXSA9IGZJbnB1dCgnc3VibWl0 JywgJycsIGdUeHQoJ2dicF9hZGxpYl93aXotY2xlYW51cCcpLCAnJyk7CgkJCQkkb3V0W10g PSAkdGhpcy0+Zm9ybV9pbnB1dHMoKTsKCQkJCSRvdXRbXSA9IHNJbnB1dCgnY2xlYW51cCcp OwoJCQlicmVhazsKCgkJCWNhc2UgJ2NsZWFudXAnOgoJCQkvLyBSZW5kZXIgdGhlIHBvc3Qt Y2xlYW51cCBzY3JlZW4uLi4KCQkJCSRvdXRbXSA9IGhlZChnVHh0KCdnYnBfYWRsaWJfd2l6 LWNsZWFudXBfcmVwb3J0JykgLCAxKTsKCQkJCSRvdXRbXSA9IHRhZygkdGhpcy0+d2l6YXJk X3JlcG9ydCgpICwgJ2ZpZWxkc2V0JywgJGZlYWlsZHNldF9zdHlsZSk7CgkJCQkkb3V0W10g PSBncmFmKGdUeHQoJ2dicF9hZGxpYl93aXotY2xlYW51cF9uZXh0JykpOwoJCQkJJG91dFtd ID0gZklucHV0KCdzdWJtaXQnLCAnJyAsIGdUeHQoJ25leHQnKSAsICcnKTsKCQkJCSRvdXRb XSA9IGVJbnB1dCgncGx1Z2luJyk7CgkJCWJyZWFrOwoJCX0KCgkJJG91dFtdID0gJzwvZGl2 Pic7CgoJCSR2ZXJpZnkgPSAoaW5fYXJyYXkoJHN0ZXAsIGFycmF5KCdzZXR1cC12ZXJpZnkn LCAnY2xlYW51cC12ZXJpZnknKSkpCgkJCT8gInZlcmlmeSgnIi5kb1NsYXNoKGdUeHQoJ2Fy ZV95b3Vfc3VyZScpKS4iJykiCgkJCTogJyc7CgoJCWVjaG8gZm9ybShqb2luKG4sICRvdXQp LCAnJywgJHZlcmlmeSk7Cgl9CgoJZnVuY3Rpb24gaW5zdGFsbGVkICgpIHsKCQlyZXR1cm4g ZmFsc2U7Cgl9CgoJZnVuY3Rpb24gd2l6YXJkX3N0ZXBzICgkc3RlcCkgewoJCSRzdGVwX2Rl dGFpbHMgPSAnJzsKCgkJZm9yZWFjaCAoJHRoaXMtPmluc3RhbGxhdGlvbl9zdGVwcyBhcyAk a2V5ID0+ICRkZXRhaWwpIHsKCQkJaWYgKEAkZGV0YWlsWyRzdGVwXSkgewoJCQkJJG9wdGlv bnMgPSAnJzsKCQkJCWlmIChAJGRldGFpbFsnaGFzX29wdGlvbnMnXSkgewoJCQkJCSRmdW5j dGlvbiA9IGFycmF5KCYkdGhpcywgJ29wdGlvbl8nLiRrZXkpOwoJCQkJCWlmIChpc19jYWxs YWJsZSgkZnVuY3Rpb24pKQoJCQkJCQkkb3B0aW9ucyA9IG4udGFnKGNhbGxfdXNlcl9mdW5j KCRmdW5jdGlvbiwgJHN0ZXApLCAnc3BhbicsICcgaWQ9IndpemFyZF8nLiRrZXkuJyIgc3R5 bGU9ImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tcmlnaHQ6IDFlbTsgcGFkZGluZzogMC41ZW07 IGJhY2tncm91bmQtY29sb3I6ICNlZWU7IicpOwoJCQkJfQoKCQkJCSRjaGVja2JveCA9ICcn OwoJCQkJaWYgKEAkZGV0YWlsWydvcHRpb25hbCddKSB7CgkJCQkJJGNoZWNrZWQgPSAoaXNz ZXQoJGRldGFpbFsnY2hlY2tlZCddKSkgPyAkZGV0YWlsWydjaGVja2VkJ10gOiAwIDsKCQkJ CQkkY2hlY2tib3ggPSBjaGVja2JveDIoJ29wdGlvbmFsXycuJGtleSwgJGNoZWNrZWQsICgk b3B0aW9ucyA/ICciIG9uY2xpY2s9InRvZ2dsZURpc3BsYXkoXCd3aXphcmRfJy4ka2V5Lidc Jyk7JyA6ICcnKSk7CgkJCQl9CgoJCQkJJHN0ZXBfZGV0YWlscyAuPSBuLnRhZyhncmFmKAoJ CQkJCXRhZygkZGV0YWlsWyRzdGVwXS4kY2hlY2tib3gsICdsYWJlbCcpLiRvcHRpb25zCgkJ CQkpLCAnbGknKTsKCQkJfQoJCX0KCgkJcmV0dXJuICRzdGVwX2RldGFpbHMubjsKCX0KCglm dW5jdGlvbiB3aXphcmRfcmVwb3J0ICgpIHsKCQkvLyBSZW5kZXIgdGhlIHdpemFyZCByZXBv cnQgYXMgYW4gb3JkZXJlZCBsaXN0LiBUaGVyZSBtYXliZQoJCS8vICdzdWInIHJlcG9ydHMg d2hpY2ggd2UgbmVlZCB0byBhbHNvIHJlbmRlciBhcyBvcmRlcmVkIGxpc3RzCgkJJG91dCA9 IGFycmF5KCk7CgkJZm9yZWFjaCAoJHRoaXMtPndpel9yZXBvcnQgYXMgJHJlcG9ydCkgewoJ CQkkb3V0X3N1YiA9IGFycmF5KCk7CgoJCQkvLyBTa2lwIHRoZSBmaXJzdCBlbGVtZW50IGFz IGl0IGlzIGluIGZhY3QgdGhlIHBhcmVudCByZXBvcnQKCQkJbmV4dCgkcmVwb3J0KTsKCgkJ CS8vIExldHMgZ2VuZXJhdGUgYSBzdWIgcmVwb3J0IC0gaWYgdGhlcmUgYXJlIG1vcmUgZWxl bWVudHMKCQkJd2hpbGUgKGxpc3QoJGtleSwgJHJlcG9ydF9zdWIpID0gZWFjaCgkcmVwb3J0 KSkKCQkJCSRvdXRfc3ViW10gPSB0YWcoJHJlcG9ydF9zdWIgLCAnbGknKTsKCgkJCS8vIENo ZWNrIHRvIHNlZSBpZiB3ZSBhY3R1YWxseSBoYXZlIGEgc3ViIHJlcG9ydCAtIHRhZyBpdCBh cyBuZWNlc3NhcnkKCQkJJG91dF9zdWIgPSAoY291bnQoJG91dF9zdWIpID4gMCkKCQkJCT8g dGFnKGpvaW4obiAsICRvdXRfc3ViKSwgJ29sJykKCQkJCTogJyc7CgoJCQkkb3V0W10gPSB0 YWcoJHJlcG9ydFswXSAuICRvdXRfc3ViICwgJ2xpJyk7CgkJfQoJCXJldHVybiB0YWcoam9p bihuICwgJG91dCkgLCAnb2wnKTsKCX0KCglmdW5jdGlvbiBhZGRfcmVwb3J0X2l0ZW0gKCRz dHJpbmcgLCAkb2sgPSBOVUxMLCAkc3ViID0gZmFsc2UpIHsKCQlpZiAoaXNzZXQoJG9rKSkg ewoJCQlzd2l0Y2ggKCRvaykgewoJCQkJY2FzZSAnMScgOgoJCQkJCSRjbGFzcyA9ICdzdWNj ZXNzJzsKCQkJCQkkb2tmYWlsID0gZ1R4dCgnZ2JwX2FkbGliX3dpei1kb25lJyk7CgkJCQli cmVhazsKCgkJCQlkZWZhdWx0IDoKCQkJCWNhc2UgJzAnIDoKCQkJCQkkY2xhc3MgPSAnZmFp bHVyZSc7CgkJCQkJJG9rZmFpbCA9IGdUeHQoJ2dicF9hZGxpYl93aXotZmFpbGVkJyk7CgkJ CQlicmVhazsKCgkJCQljYXNlICdza2lwcGVkJyA6CgkJCQkJJGNsYXNzID0gJ3NraXBwZWQn OwoJCQkJCSRva2ZhaWwgPSBnVHh0KCdnYnBfYWRsaWJfd2l6LXNraXBwZWQnKTsKCQkJCWJy ZWFrOwoJCQl9CgkJCSRva2ZhaWwgPSAnIDogPHNwYW4gY2xhc3M9IicuJGNsYXNzLiciPicu dGFnKCRva2ZhaWwsICdzdHJvbmcnKS4nPC9zcGFuPic7CgkJfQoKCQkkbGluZSA9IGdyYWYo JHN0cmluZyAuIChpc3NldCgkb2tmYWlsKSA/ICRva2ZhaWwgOiAnJykpOwoKCQlpZiAoJHN1 YiAmJiBjb3VudCgkdGhpcy0+d2l6X3JlcG9ydCkgPiAwKQoJCQkkdGhpcy0+d2l6X3JlcG9y dFtjb3VudCgkdGhpcy0+d2l6X3JlcG9ydCkgLSAxXVtdID0gJGxpbmU7CgkJZWxzZQoJCQkk dGhpcy0+d2l6X3JlcG9ydFtdID0gYXJyYXkoJGxpbmUpOwoJfQoKCWZ1bmN0aW9uIHNldHVw X2Jhc2ljICgpIHsKCQkkdGhpcy0+YWRkX3JlcG9ydF9pdGVtKGdUeHQoJ2dicF9hZGxpYl93 aXotc3RlcF9iYXNpYycpLCB0cnVlKTsKCX0KCglmdW5jdGlvbiBjbGVhbnVwX2Jhc2ljICgp IHsKCQkkdGhpcy0+YWRkX3JlcG9ydF9pdGVtKGdUeHQoJ2dicF9hZGxpYl93aXotc3RlcF9i YXNpYycpLCBmYWxzZSk7Cgl9CgoJZnVuY3Rpb24gc2V0dXBfb3B0aW9uYWwgKCkgewoJCSR0 aGlzLT5hZGRfcmVwb3J0X2l0ZW0oZ1R4dCgnZ2JwX2FkbGliX3dpei1zdGVwX29wdGlvbmFs JyksIHRydWUpOwoJfQoKCWZ1bmN0aW9uIGNsZWFudXBfb3B0aW9uYWwgKCkgewoJCSR0aGlz LT5hZGRfcmVwb3J0X2l0ZW0oZ1R4dCgnZ2JwX2FkbGliX3dpei1zdGVwX29wdGlvbmFsJyks IGZhbHNlKTsKCX0KCglmdW5jdGlvbiBzZXR1cF9oYXNfb3B0aW9ucyAoKSB7CgkJJHRoaXMt PmFkZF9yZXBvcnRfaXRlbShnVHh0KCdnYnBfYWRsaWJfd2l6LXN0ZXBfY29tcGxleCcpLCB0 cnVlKTsKCX0KCglmdW5jdGlvbiBjbGVhbnVwX2hhc19vcHRpb25zICgpIHsKCQkkdGhpcy0+ YWRkX3JlcG9ydF9pdGVtKGdUeHQoJ2dicF9hZGxpYl93aXotc3RlcF9jb21wbGV4JyksIGZh bHNlKTsKCX0KCglmdW5jdGlvbiBvcHRpb25faGFzX29wdGlvbnMgKCRzdGVwKSB7CgkJcmV0 dXJuIGdyYWYoZ1R4dCgnZ2JwX2FkbGliX3dpei1zdGVwX2NvbXBsZXhfdHh0JyAsIGFycmF5 KCd7c3RlcH0nID0+ICRzdGVwKSkpLnllc25vUmFkaW8oJ3dpemFyZF9oYXNfb3B0aW9uc190 ZXN0JywgMSk7Cgl9Cn0KIjtzOjg6ImhlbHBfcmF3IjtzOjE1ODoiPGRpdiBpZD0iYWRtaW5s aWJfaGVscCI+CgpoMSgjdG9wKS4gR3JhZW1lIFBvcnRlb3VzJyBBZG1pbiBMaWJyYXJ5LgoK UHJvdmlkZXMgYmFzaWMgY2xhc3NlcyBmb3IgYnVpbGRpbmcgdGhlIGFkbWluIHNpZGUgb2Yg eW91ciBvd24sIGRlcml2ZWQsIHBsdWdpbnMuCgo8L2Rpdj4iO3M6MzoibWQ1IjtzOjMyOiIw YWZmMzdmYjFkNmU5M2Q4NDA1ZWY5N2Q3Yjg4MjViZCI7fQ==