Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#521 2008-12-08 02:47:12

truist
Plugin Author
From: Ohio, USA
Registered: 2004-11-09
Posts: 256
Website

Re: tru_tags: A tagging plugin for textpattern

Markus, I updated the documentation according to your suggestion. Thanks.

I’m working (this minute!) on finalizing the documentation for v3.3 and updating the roadmap. Look for an “official” announcement of v3.3 sometime tonight :)

Offline

#522 2008-12-08 02:47:44

truist
Plugin Author
From: Ohio, USA
Registered: 2004-11-09
Posts: 256
Website

Re: tru_tags: A tagging plugin for textpattern

P.S. – I have updated my sites to TXP 4.0.7 and I haven’t seen any problems with tru_tags.

Offline

#523 2008-12-08 04:07:32

truist
Plugin Author
From: Ohio, USA
Registered: 2004-11-09
Posts: 256
Website

Re: tru_tags: A tagging plugin for textpattern

All –

I have finally “officially” announced tru_tags v3.3 on my releases page, because all the features from v3.2 are finally documented.

Most of the valuable stuff in v3.3 was really released in v3.2 (see the forum post for details) – specifically, the ability to make a tag-based archive page. But v3.2 still points to my old website (truist.com) which I sold recently, so if you’re using v3.2, your documentation links won’t work. v3.3 fixes that.

But: v3.3 requires TXP 4.0.7. I fixed a bug and updated v3.3 to support article expiration dates (so tru_tags will hide expired articles from the cloud), but that support means that you have to have 4.0.7. So if you really don’t want to upgrade to TXP 4.0.7, please don’t upgrade tru_tags past v3.2.

Sorry for all the confusion – I will avoid overlapping releases in the future =)

I have also made minor updates to the roadmap, just to make sure it was synced up with the requests here in the forum. Please shout if I’m missing something.

Enjoy!
Nathan

Offline

#524 2008-12-08 14:16:35

merz1
Member
From: Hamburg
Registered: 2006-05-04
Posts: 994
Website

Re: tru_tags: A tagging plugin for textpattern

I also updated to TXP 4.0.7 and to the updated tru_tags 3.3. No problems with tru_tags.

@Nathan You should have announced 3.3.1 (or 3.4) to make clear that this is a new updated 3.3.n version. Not everybody will read your announcement until or immediately note “updated v3.3” :)

Last edited by merz1 (2008-12-08 14:18:20)


Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML

Offline

#525 2008-12-09 00:13:05

truist
Plugin Author
From: Ohio, USA
Registered: 2004-11-09
Posts: 256
Website

Re: tru_tags: A tagging plugin for textpattern

Good point. But I don’t think there’s much harm in it – the only thing missing from the earlier copy of v3.3 is the bugfix and the article expiration date support, which seem minor. And since they require TXP 4.0.7, maybe anyone who already has v3.3 on TxP 4.0.6 is happy that way :)

Offline

#526 2008-12-09 17:19:29

merz1
Member
From: Hamburg
Registered: 2006-05-04
Posts: 994
Website

Re: tru_tags: A tagging plugin for textpattern

maybe anyone who already has v3.3 on TxP 4.0.6 is happy that way :)

Yes I was for sure :) but that’s the point. Maybe somebody who has 4.0.6 and is downloading the ‘updated 3.3’ now without reading the release note is not so happy this way.


Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML

Offline

#527 2009-01-03 07:32:44

fdsafdsa
Member
From: cn
Registered: 2007-04-19
Posts: 47
Website

Re: tru_tags: A tagging plugin for textpattern

i need tru tag 3.3,autor’s site offline

Offline

#528 2009-01-03 10:40:44

jstubbs
Moderator
From: Hong Kong
Registered: 2004-12-13
Posts: 2,395
Website

Re: tru_tags: A tagging plugin for textpattern

Here you go:

# tru_tags v3.3
# Article tagging
# Nathan Arthur
# http://www.rainskit.com/

# ......................................................................
# This is a plugin for Textpattern - http://textpattern.com/
# To install: textpattern > admin > plugins
# Paste the following text into the 'Install plugin' box:
# ......................................................................

YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjM6IjMu

MyI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki

O3M6MjQ6Imh0dHA6Ly93d3cucmFpbnNraXQuY29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6

MTU6IkFydGljbGUgdGFnZ2luZyI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjg6InRy

dV90YWdzIjtzOjQ6ImhlbHAiO3M6Njc1OiIJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVf

dGFncywgY2hlY2sgb3V0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9i

bG9nLzQ5My90cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuIj5pbnRy

b2R1Y3RvcnkgYXJ0aWNsZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29t

L3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMiPnJlbGVhc2VzIHBhZ2U8L2E+LCA8

YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3Mt

ZmVhdHVyZS1saXN0Ij5mZWF0dXJlIGxpc3Q8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnJh

aW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAiPnJvYWRtYXA8L2E+

LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90

cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+dXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPi48L3A+

CgoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0YWlsZWQgaGVscCBvdXQgb2YgdGhlIHBs

dWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRvbyBiaWcgYW5kIHRvbyBkaWZmaWN1bHQg

dG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRlIGFuZCBpbiB0aGUgcGx1Z2luLjwvcD4i

O3M6NDoiY29kZSI7czozOTQ4MzoiCiNDb3B5cmlnaHQgMjAwOCBOYXRoYW4gQXJ0aHVyCiNS

ZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBzZWUgaHR0cDovL3d3dy5v

cGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAgZm9yIGRldGFpbHMKI1Ro

aXMgd29yayBpcyBpbnNwaXJlZCBieSByYW5fdGFncyBieSBSYW4gQXJvdXNzaSwgb3JpZ2lu

YWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNsZS80NS90YWdnaW5nLXRl

eHRwYXR0ZXJuCgoKIyMjIENPTkZJR1VSQVRJT04gIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMj

IwoKIyBUVVJOIEJBQ0shICBDb25maWd1cmF0aW9uIGlzIG5vIGxvbmdlciBoYW5kbGVkIGJ5

IGVkaXRpbmcgdGhlIHBsdWdpbi4KIyBDaGVjayBvdXQgdGhlICdFeHRlbnNpb25zJyB0YWIg

aW4gdGhlIFRleHRwYXR0ZXJuIGFkbWluIDopCgoKIyBDaGFuZ2luZyB0aGVzZSB3b24ndCBk

byBhbnkgZ29vZC4gIFRoZXkncmUganVzdCBoZXJlIGFzIGEgY29udmVuaWVuY2UgZm9yIGRl

dmVsb3BtZW50LgpkZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRzJyk7CmRlZmlu

ZSgnQ0xFQU5fVVJMUycsICdjbGVhbl91cmxzJyk7CmRlZmluZSgnVEFHX1NFQ1RJT04nLCAn

dGFnX3NlY3Rpb24nKTsKZGVmaW5lKCdQQVJNX05BTUUnLCAncGFybScpOwpkZWZpbmUoJ1RB

R1NfSU5fRkVFRF9DQVRFR09SSUVTJywgJ3RhZ3NfaW5fZmVlZF9jYXRlZ29yaWVzJyk7CmRl

ZmluZSgnVEFHU19JTl9GRUVEX0JPRFknLCAndGFnc19pbl9mZWVkX2JvZHknKTsKZGVmaW5l

KCdUQUdTX0lOX1dSSVRFX1RBQicsICd0YWdzX2luX3dyaXRlX3RhYicpOwoKZ2xvYmFsICR0

cnVfdGFnc19wcmVmczsKJHRydV90YWdzX3ByZWZzID0gdHJ1X3RhZ3NfbG9hZF9wcmVmcygp

OwoKCiMjIyBQUklNQVJZIFRBRyBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMj

IyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc19oYW5kbGVyKCRhdHRzKSB7CgkkdGFnX3Bh

cmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSwgZmFsc2UpOwoJaWYg

KCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpIHsKCQlpZiAodHJ1X3RhZ3NfcmVkaXJlY3RfaWZf

bmVlZGVkKCR0YWdfcGFyYW1ldGVyKSkgewoJCQlyZXR1cm4gJyc7CgkJfQoJCSRjbGVhbl9h

dHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIp

OwoJCSRyZXN1bHQgPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlv

biBpbiBUWFAgY29kZQoJCWlmICh0cmltKCRyZXN1bHQpID09ICcnKSB7CgkJCWlmIChpc3Nl

dCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJCQkJdHJ1X3RhZ3NfcmVkaXJlY3QoJGF0dHNb

J25vYXJ0aWNsZXMnXSwgdHJ1ZSk7CgkJCX0gZWxzZSB7CgkJCQl0eHBfZGllKGdUeHQoJzQw

NF9ub3RfZm91bmQnKSwgJzQwNCcpOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXN1

bHQ7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpOwoJfQp9

CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYXJjaGl2ZSgkYXR0cykgewoJZ2xvYmFsICR0cnVfdGFn

c19jdXJyZW50X2FyY2hpdmVfdGFnOwoJJHRhZ3MgPSBhcnJheV91bmlxdWUodHJ1X3RhZ3Nf

Y2xvdWRfcXVlcnkodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZh

bHNlLCBmYWxzZSkpKTsKCXNvcnQoJHRhZ3MpOwoJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykg

ewoJCSR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnID0gJHRhZzsKCQkkY2xlYW5fYXR0

cyA9IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWcpOwoJCSRyZXN1bHRz

W10gPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBUWFAg

Y29kZQoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkcmVzdWx0cyk7Cn0KCgpmdW5jdGlvbiB0cnVf

dGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKCRhdHRzKSB7CglnbG9iYWwgJHRydV90YWdzX2N1

cnJlbnRfYXJjaGl2ZV90YWc7CglleHRyYWN0KGxBdHRzKGFycmF5KCdsaW5rJyA9PiAnMCcp

LCAgJGF0dHMsIDApKTsKCWlmICgkbGluaykgewoJCXJldHVybiAnPGEgaHJlZj0iJyAuIHRy

dV90YWdzX2xpbmtpZnlfdGFnKCR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKSAuICci

PicgLiAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZyAuICc8L2E+JzsKCX0gZWxzZSB7

CgkJcmV0dXJuICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOwoJfQp9CgoKZnVuY3Rp

b24gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpIHsKCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90

YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsKfQoK

CmZ1bmN0aW9uIHRydV90YWdzX2xpc3QoJGF0dHMpIHsKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0

X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKCSRhbGxfdGFncyA9

IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsKCglyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVy

X2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpmdW5jdGlvbiB0cnVf

dGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRy

YWN0KCR0aGlzYXJ0aWNsZSk7CgoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9y

X2FydGljbGUoJHRoaXNpZCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv

dWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAk

YWxsX3RhZ3M7CglpZiAoJGF0dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCSRhbGxfdGFn

c19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJfQoKCXJldHVy

biB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zv

cl93ZWlnaHQpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0

aGluZykgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsK

CgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoKCSRycyA9IHNhZmVfcm93KCR0YWdz

X2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVsZCA8

PiAnJyIpOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpmdW5j

dGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpIHsKCWV4dHJhY3Qo

bEF0dHMoYXJyYXkoJ3RhZycgPT4gJycpLCAgJGF0dHMsIDApKTsKCgkkdGFnX3BhcmFtZXRl

ciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gMSks

IGZhbHNlKTsKCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgPyB0cnVl

IDogZmFsc2U7CglpZiAoJGNvbmRpdGlvbiAmJiAhZW1wdHkoJHRhZykpIHsKCQkkY29uZGl0

aW9uID0gKCR0YWdfcGFyYW1ldGVyID09ICR0YWcpOwoJfQoJcmV0dXJuIHBhcnNlKEV2YWxF

bHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3Bh

cmFtZXRlcigkYXR0cywgJHNhZmVodG1sID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFnc19w

cmVmczsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJzAnLCAndXJs

ZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBf

dGFncyhncHMoJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlKSkpOwoJaWYgKCds

b29rdXAnID09ICRzdHJpcGh5cGhlbnMpIHsKCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFu

ZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCBmYWxzZSk7CgkJJHRhZ19saXN0ID0g

YXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CgkJZm9yZWFjaCAo

JHRhZ19saXN0IGFzICRjbG91ZF90YWcpIHsKCQkJaWYgKCRwYXJtID09IHN0cl9yZXBsYWNl

KCcgJywgJy0nLCAkY2xvdWRfdGFnKSkgewoJCQkJJHBhcm0gPSAkY2xvdWRfdGFnOwoJCQkJ

YnJlYWs7CgkJCX0KCQl9Cgl9IGVsc2UgaWYgKCRzdHJpcGh5cGhlbnMpIHsKCQkkcGFybSA9

IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkcGFybSk7Cgl9CglpZiAoJHVybGVuY29kZSkgewoJ

CSRwYXJtID0gdXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgewoJ

CSRwYXJtID0gaHRtbHNwZWNpYWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJtOwp9

CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpIHsKCXRyaWdnZXJfZXJy

b3IoZ1R4dCgnZGVwcmVjYXRlZF90YWcnKSwgRV9VU0VSX05PVElDRSk7CglyZXR1cm4gc3Ry

aXBfdGFncyhncHMoJ3EnKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZWxhdGVkX3RhZ3Nf

ZnJvbV9zZWFyY2goJGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3Bh

cmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglleHRyYWN0KGxBdHRzKGFycmF5KCd0YWdfcGFy

YW1ldGVyJyA9PiAkdGFnX3BhcmFtZXRlciksICAkYXR0cywgMCkpOwoJaWYgKCFlbXB0eSgk

dGFnX3BhcmFtZXRlcikpIHsKICAgICAgICAkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxE

OwoJCSRhbGxfdGFncyA9IGFycmF5KCk7CgoJCSRxdWVyeV9hdHRzID0gdHJ1X3RhZ3NfZml4

dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpOwoJCSRycyA9IHRydV90YWdz

X3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOwoJCWlmICgkcnMpIHsKCQkJd2hp

bGUgKCRhID0gbmV4dFJvdygkcnMpKSB7CgkJCQkkYXJ0aWNsZV90YWdzID0gYXJyYXkoKTsK

CQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxkLCAkYSkpIHsKCQkJCQkkYXJ0

aWNsZV90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkYVsk

dGFnc19maWVsZF0pKSk7CgkJCQl9CgkJCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgkYWxs

X3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkYXJ0aWNsZV90YWdzKSk7CgkJCX0KCQl9CgoJ

CSRhbHRfdGFnX3BhcmFtZXRlciA9IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkdGFnX3BhcmFt

ZXRlcik7CgkJZm9yZWFjaCAoJGFsbF90YWdzIGFzICRrZXkgPT4gJHRhZykgewoJCQlpZiAo

JHRhZyA9PSAkdGFnX3BhcmFtZXRlciB8fCAkdGFnID09ICRhbHRfdGFnX3BhcmFtZXRlcikg

ewoJCQkJdW5zZXQoJGFsbF90YWdzWyRrZXldKTsKCQkJfQoJCX0KCgkJJGNsb3VkX2F0dHMg

PSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNl

KTsKCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9ICRhbGxfdGFnczsKCQlpZiAoJGNsb3VkX2F0

dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9IHRy

dV90YWdzX2Nsb3VkX3F1ZXJ5KCRjbG91ZF9hdHRzKTsKCQl9CgoJCXJldHVybiB0cnVfdGFn

c19yZW5kZXJfY2xvdWQoJGNsb3VkX2F0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93

ZWlnaHQpOwoJfSBlbHNlIHsKCQlyZXR1cm4gJyc7Cgl9Cn0KCgojIyMgQ0xPVUQgU1VQUE9S

VCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0

aW9uIHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCAkaXNMaXN0LCAk

aXNBcnRpY2xlKSB7CglyZXR1cm4gbEF0dHMoYXJyYXkoJ3dyYXB0YWcnCT0+ICgkaXNMaXN0

ID8gJ3VsJyA6ICcnKSwKCQkJJ2JyZWFrJwkJPT4gKCRpc0xpc3QgPyAnbGknIDogJywgJyks

CgkJCSdjbGFzcycJCT0+ICcnLAoJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJCSdzZWN0aW9u

Jwk9PiAnJywKCQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQknbWF4cGVyY2VudCcJPT4g

KCRpc0xpc3QgfHwgJGlzQXJ0aWNsZSA/ICcxMDAnIDogJzIwMCcpLAoJCQknc2hvd2NvdW50

cycJPT4gJycsCgkJCSdjb3VudHdyYXBjaGFycycJPT4gJ1tdJywKCQkJJ3VzZXJlbHRhZycJ

PT4gKCRpc0FydGljbGUgPyAnMScgOiAnJyksCgkJCSdnZW5lcmF0ZWxpbmtzJwk9PiAnMScs

CgkJCSdtaW50YWdjb3VudCcJPT4gJzAnLAoJCQknbWF4dGFnY291bnQnCT0+ICcxMDAwJywK

CQkJJ3NldHNpemVzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd1c2Vub2Zv

bGxvdycJPT4gJycsCgkJCSdzb3J0JwkJPT4gJ2FscGhhJywKCQkJJ3VzZW92ZXJhbGxjb3Vu

dHMnCT0+ICcnLAoJCQknc2V0Y2xhc3NlcycJPT4gKCRpc0FydGljbGUgPyAnMCcgOiAnMScp

LAoJCQkndGl0bGUnCQk9PiAnJywKCQkJJ2xpc3RsaW1pdCcJPT4gJycsCgkJCSdrZWVwJwkJ

PT4gJ2xhcmdlc3QnLAoJCQknY3V0b2ZmJwk9PiAnY2h1bmsnLAoJCQkndGV4dHRyYW5zZm9y

bScJPT4gJ25vbmUnLAoJCQknbGlua3BhdGgnCT0+ICcnLAoJCQknbGlua3BhdGh0YWlsJwk9

PiAnJywKCQkJJ2ZpbHRlcnNlYXJjaCcJPT4gJzEnLAoJCQknZXhjbHVkZXNlY3Rpb24nPT4g

JycsCgkJCSdhY3RpdmVjbGFzcycJPT4gJ3RhZ0FjdGl2ZScsCgkJCSd0aW1lJwkJPT4gJ3Bh

c3QnCgkJKSwkYXR0cywgMCk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZF9xdWVyeSgk

YXR0cykgewoJZXh0cmFjdCgkYXR0cyk7CgoJJHNlY3Rpb25fY2xhdXNlID0gJyc7CglpZiAo

JHNlY3Rpb24gPD4gJycpIHsKCQkka2V5cyA9IHNwbGl0KCcsJywgJHNlY3Rpb24pOwoJCWZv

cmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKCQkJJGtleXBhcnRzW10gPSAiIFNlY3Rpb24gPSAn

IiAuIHRyaW0oJGtleSkgLiAiJyI7CgkJfQoJCSRzZWN0aW9uX2NsYXVzZSA9ICIgQU5EICgi

IC4gam9pbignIG9yICcsICRrZXlwYXJ0cykgLiAiKSI7Cgl9CgoJJHRhZ3NfZmllbGQgPSBU

UlVfVEFHU19GSUVMRDsKCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3NlYXJjaC5w

aHAnOwoKCSRmaWx0ZXIgPSB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0

aW9uKTsKCSRmaWx0ZXIgLj0gKCRmaWx0ZXJzZWFyY2ggPyBmaWx0ZXJTZWFyY2goKSA6ICcn

KTsKCglzd2l0Y2ggKCR0aW1lKSB7CgkJY2FzZSAnYW55JzoKCQkJJHRpbWUgPSAiIjsgYnJl

YWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPiBub3coKSI7

IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDw9IG5vdygpIjsK

CX0KCWdsb2JhbCAkcHJlZnM7CglleHRyYWN0KCRwcmVmcyk7CglpZiAoISRwdWJsaXNoX2V4

cGlyZWRfYXJ0aWNsZXMpIHsKCQkkdGltZSAuPSAiIGFuZCAobm93KCkgPD0gRXhwaXJlcyBv

ciBFeHBpcmVzID0gIi5OVUxMREFURVRJTUUuIikiOwoJfQoKCSRhbGxfdGFncyA9IGFycmF5

KCk7CgkkcnMgPSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxkIiwgInRleHRwYXR0ZXJuIiwgIiR0

YWdzX2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVzZSAuICRmaWx0ZXIgLiAiIGFuZCBT

dGF0dXMgPj0gJzQnIiAuICR0aW1lKTsKCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJJHRl

bXBfYXJyYXkgPSBhcnJheSgpOwoJCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxk

LCAkcm93KSkgewoJCQkkdGVtcF9hcnJheSA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdz

X3N0cnRvbG93ZXIoJHJvd1skdGFnc19maWVsZF0pKSk7CgkJfQoJCSRhbGxfdGFncyA9IGFy

cmF5X21lcmdlKCRhbGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdzKCR0ZW1wX2FycmF5KSk7

Cgl9CgoJcmV0dXJuICRhbGxfdGFnczsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2ZpbHRlcl9z

ZWN0aW9ucygkZXhjbHVkZXNlY3Rpb24pIHsKCSRzZWN0aW9ucyA9IGV4cGxvZGUoJywnLCAk

ZXhjbHVkZXNlY3Rpb24pOwoJJGZpbHRlcnMgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHNlY3Rp

b25zIGFzICRzZWN0aW9uKSB7CgkJJGZpbHRlcnNbXSA9ICJhbmQgU2VjdGlvbiAhPSAnIi5k

b1NsYXNoKCRzZWN0aW9uKS4iJyI7Cgl9CglyZXR1cm4gam9pbignICcsICRmaWx0ZXJzKTsK

fQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAk

YWxsX3RhZ3NfZm9yX3dlaWdodCkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWV4dHJh

Y3QoJGF0dHMpOwoKCSR0YWdzX3dlaWdodCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3Rh

Z3NfZm9yX3dlaWdodCk7CgoJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdl

aWdodCkgewoJCWlmICghaW5fYXJyYXkoJHRhZywgJGFsbF90YWdzKQoJCSAgIHx8ICR0YWdz

X3dlaWdodFskdGFnXSA8ICRtaW50YWdjb3VudAoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFn

XSA+ICRtYXh0YWdjb3VudCkgewoJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOwoJCX0K

CX0KCgkkc29ydF9ieV9jb3VudCA9IChzdHJwb3MoJHNvcnQsICdjb3VudCcpICE9PSBmYWxz

ZSk7Cgkkc29ydF9hc2NlbmRpbmcgPSAoc3RycG9zKCRzb3J0LCAnYXNjJykgIT09IGZhbHNl

KTsKCSR0YWdzX3dlaWdodCA9IHRydV90YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRz

b3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpOwoKCWlmICgkbGlzdGxpbWl0ID4gMCAm

JiAkbGlzdGxpbWl0IDwgY291bnQoJHRhZ3Nfd2VpZ2h0KSkgewoJCSRyZXNvcnRlZF90YWdz

ID0gYXJyYXkoKTsKCQlpZiAoJGtlZXAgPT0gJ2xhcmdlc3QnKSB7CgkJCSRyZXNvcnRlZF90

YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCB0cnVl

LCBmYWxzZSkpOwoJCX0gZWxzZSB7CgkJCWlmICgka2VlcCA9PSAncmFuZG9tJykgewoJCQkJ

Zm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCQkJCSRyZXNv

cnRlZF90YWdzWyR0YWddID0gcmFuZCgwLCAkd2VpZ2h0KTsKCQkJCX0KCQkJCSRyZXNvcnRl

ZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHJlc29ydGVkX3RhZ3Ms

IHRydWUsIGZhbHNlKSk7CgkJCX0gZWxzZSBpZiAoJGtlZXAgPT0gJ2FscGhhJykgewoJCQkJ

JHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKCR0YWdzX3dlaWdodCk7CgkJCQluYXRjYXNl

c29ydCgkcmVzb3J0ZWRfdGFncyk7CgkJCX0KCQkJJGN1dG9mZiA9ICdleGFjdCc7CgkJfQoK

CQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAtIDE7CgkJaWYgKCRjdXRvZmYgPT0g

J2NodW5rJykgeyAvL2FsdGVybmF0aXZlIGlzICdleGFjdCcKCQkJJGxhc3Rfd2VpZ2h0ID0g

LTE7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRsaXN0bGltaXQgKyAxOyAkaSsrKSB7CgkJCQkk

bmV3X3dlaWdodCA9ICR0YWdzX3dlaWdodFskcmVzb3J0ZWRfdGFnc1skaV1dOwoJCQkJaWYg

KCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dlaWdodCkgewoJCQkJCSRsYXN0X2dvb2RfaW5kZXgg

PSAkaSAtIDE7CgkJCQkJJGxhc3Rfd2VpZ2h0ID0gJG5ld193ZWlnaHQ7CgkJCQl9CgkJCX0K

CQkJaWYgKCRsYXN0X2dvb2RfaW5kZXggPCAwKSB7CgkJCQkkbGFzdF9nb29kX2luZGV4ID0g

JGxpc3RsaW1pdCAtIDE7CgkJCX0KCQl9CgoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfY2h1

bmsoJHJlc29ydGVkX3RhZ3MsICRsYXN0X2dvb2RfaW5kZXggKyAxKTsKCQkkcmVzb3J0ZWRf

dGFncyA9ICRyZXNvcnRlZF90YWdzWzBdOwoKCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMg

JHRhZyA9PiAkd2VpZ2h0KSB7CgkJCWlmICghaW5fYXJyYXkoJHRhZywgJHJlc29ydGVkX3Rh

Z3MpKSB7CgkJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOwoJCQl9CgkJfQoJfQoKCWlm

ICgkZ2VuZXJhdGVsaW5rcykgewoJCWlmICgkbGlua3BhdGgpIHsKCQkJJHVybHByZWZpeCA9

ICRsaW5rcGF0aDsKCQkJJHVybHN1ZmZpeCA9ICRsaW5rcGF0aHRhaWw7CgkJfSBlbHNlIHsK

CQkJaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkgewoJCQkJJHVybHByZWZpeCA9IGh1IC4g

JHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLyc7CgkJCX0gZWxzZSB7

CgkJCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD

VElPTl0tPnZhbHVlIC4gJyZhbXA7JyAuICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52

YWx1ZSAuICc9JzsKCQkJfQoJCQkkdXJsc3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMo

KSA/ICcvJyA6ICcnKTsKCQl9CgoJCWlmICgkdXNlcmVsdGFnKSB7CgkJCWlmICgkdXNlbm9m

b2xsb3cpIHsKCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcgbm9mb2xsb3cnOwoJCQl9

IGVsc2UgewoJCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRhZyc7CgkJCX0KCQl9IGVsc2Ug

aWYgKCR1c2Vub2ZvbGxvdykgewoJCQkkdXJsc3VmZml4IC49ICciIHJlbD0ibm9mb2xsb3cn

OwoJCX0KCX0KCglpZiAoY291bnQoJHRhZ3Nfd2VpZ2h0KSA+IDApIHsKCQkkbWF4ID0gbWF4

KCR0YWdzX3dlaWdodCk7CgkJJG1pbiA9IG1pbigkdGFnc193ZWlnaHQpOwoJfSBlbHNlIHsK

CQkkbWF4ID0gJG1pbiA9IDA7Cgl9Cgkkc3RlcHZhbHVlID0gKCRtYXggPT0gJG1pbikgPyAw

IDogKCRtYXhwZXJjZW50IC0gJG1pbnBlcmNlbnQpIC8gKCRtYXggLSAkbWluKTsKCgkkdGFn

c19odG1sID0gYXJyYXkoKTsKCSR0YWdfc2VhcmNoX3RhZyA9IHRydV90YWdzX3RhZ19wYXJh

bWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJzEnKSk7CgkkdGFnX3NlYXJjaF90YWcg

PSBmdW5jdGlvbl9leGlzdHMoImh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlIikgPyBodG1sc3Bl

Y2lhbGNoYXJzX2RlY29kZSgkdGFnX3NlYXJjaF90YWcpIDogaHRtbF9lbnRpdHlfZGVjb2Rl

KCR0YWdfc2VhcmNoX3RhZyk7Cglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAk

d2VpZ2h0KSB7CgkJJHRhZ193ZWlnaHQgPSBmbG9vcigkbWlucGVyY2VudCArICgkd2VpZ2h0

IC0gJG1pbikgKiAkc3RlcHZhbHVlKTsKCgkJJHN0eWxlID0gJyc7CgkJaWYgKCRzZXRzaXpl

cykKCQkJJHN0eWxlID0gJyBzdHlsZT0iZm9udC1zaXplOiAnIC4gJHRhZ193ZWlnaHQgLiAn

JTsiJzsKCgkJJHRhZ19jbGFzcyA9ICcnOwoJCWlmICgkc2V0Y2xhc3NlcykgewoJCQkkdGFn

X2NsYXNzID0gJyBjbGFzcz0iJzsKCQkJaWYgKCR3ZWlnaHQgPT0gJG1pbikgewoJCQkJJHRh

Z19jbGFzcyAuPSAidGFnU2l6ZVNtYWxsZXN0IjsKCQkJfSBlbHNlIGlmICgkd2VpZ2h0ID09

ICRtYXgpIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVMYXJnZXN0IjsKCQkJfSBlbHNl

IHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOwoJCQl9CgkJCSR0YWdfY2xh

c3MgLj0gJyB0YWdTaXplJyAuICgkd2VpZ2h0ICsgMSAtICRtaW4pOwoJCQlpZiAoJHRhZyA9

PSAkdGFnX3NlYXJjaF90YWcpIHsKCQkJCSR0YWdfY2xhc3MgLj0gJyAnIC4gJGFjdGl2ZWNs

YXNzOwoJCQl9CgkJCSR0YWdfY2xhc3MgLj0gJyInOwoJCX0KCgkJLy9hZGFwdGVkIGZyb20g

Y29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3Zp

ZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1CgkJJHRpdGxlY291bnQgPSAnJzsKCQlp

ZiAoJHRpdGxlKQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAnIic7

CgkJJGRpc3BsYXljb3VudD0gJyc7CgkJJGNvdW50ID0gJGNvdW50d3JhcGNoYXJzezB9IC4g

JHdlaWdodCAuICRjb3VudHdyYXBjaGFyc3sxfTsKCQlpZiAoJHNob3djb3VudHMgPT0gJ3Rp

dGxlJyB8fCAkc2hvd2NvdW50cyA9PSAnYm90aCcpCgkJCSR0aXRsZWNvdW50ID0gJyB0aXRs

ZT0iJyAuICR0aXRsZSAuICRjb3VudCAuICciJzsKCQlpZiAoJHNob3djb3VudHMgJiYgJHNo

b3djb3VudHMgIT0gJ3RpdGxlJykKCQkJJGRpc3BsYXljb3VudCA9ICcgJyAuICRjb3VudDsK

CgkJaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBpdGFsaXplJykgewoJCQkkdGFnID0gdWN3

b3JkcygkdGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICd1cHBlcmNhc2Un

KSB7CgkJCSR0YWcgPSBzdHJ0b3VwcGVyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFu

c2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHsKCQkJJHRhZyA9IHN0cnRvbG93ZXIoJHRhZyk7CgkJ

fSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwZmlyc3QnKSB7CgkJCSR0YWcgPSB1

Y2ZpcnN0KCR0YWcpOwoJCX0KCgkJaWYgKCRnZW5lcmF0ZWxpbmtzKSB7CgkJCSR3aG9sZXVy

bCA9ICciJyAuICR1cmxwcmVmaXggLiB1cmxlbmNvZGUoc3RyX3JlcGxhY2UoJyAnLCAnLScs

ICR0YWcpKSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVm

PScgLiAkd2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAn

PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsK

CQl9IGVsc2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7CgkJ

CSR0YWdzX2h0bWxbXSA9ICc8c3BhbicgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxl

Y291bnQgLiAnPicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvc3Bhbj4nIC4gJGRp

c3BsYXljb3VudDsKCQl9IGVsc2UgewoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNo

YXJzKCR0YWcpIC4gJGRpc3BsYXljb3VudDsKCQl9Cgl9CglyZXR1cm4gdHJ1X3RhZ3NfZG9f

d3JhcCgkdGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNz

KTsKfQoKCiMjIyBDTEVBTiBVUkwgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMj

IyMjIyMjIyMKCmlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCXJlZ2lzdGVyX2NhbGxi

YWNrKCd0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jyk7Cn0KCgpmdW5j

dGlvbiB0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CglnbG9i

YWwgJHRydV90YWdzX3ByZWZzOwoJJHN1YnBhdGggPSBwcmVnX3JlcGxhY2UoIi9odHRwcz86

XC9cLy4qKFwvLiopL1VpIiwiJDEiLGh1KTsKCSRyZWdzYWZlc3VicGF0aCA9IHByZWdfcXVv

dGUoJHN1YnBhdGgsICcvJyk7CgkkcmVxID0gcHJlZ19yZXBsYWNlKCIvXiRyZWdzYWZlc3Vi

cGF0aC9pIiwnLycsJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOwoKCSRxcyA9IHN0cnBvcygk

cmVxLCAnPycpOwoJJHFhdHRzID0gKCRxcyA/ICcmJy5zdWJzdHIoJHJlcSwgJHFzICsgMSkg

OiAnJyk7CglpZiAoJHFzKSAkcmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7CgoJJHBhcnRz

ID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcihzcGxpdCgnLycsICRyZXEpKSk7CglpZiAo

Y291bnQoJHBhcnRzKSA9PSAyICYmICRwYXJ0c1swXSA9PSAkdHJ1X3RhZ3NfcHJlZnNbVEFH

X1NFQ1RJT05dLT52YWx1ZSkgewoJCSR0YWcgPSAkcGFydHNbMV07CgkJJF9TRVJWRVJbJ1FV

RVJZX1NUUklORyddID0gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0n

IC4gJHRhZyAuICRxYXR0czsKCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRzdWJwYXRo

IC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLz8nIC4gJF9TRVJW

RVJbJ1FVRVJZX1NUUklORyddOwoJCWlmIChjb3VudCgkX1BPU1QpID4gMCkgewoJCQkkX1BP

U1RbJ3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOwoJ

CQkkX1BPU1RbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7CgkJ

fSBlbHNlIHsKCQkJJF9HRVRbJ3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD

VElPTl0tPnZhbHVlOwoJCQkkX0dFVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFs

dWVdID0gJHRhZzsKCQl9Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxzKCkg

ewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCXJldHVybiAoJ2NsZWFuJyA9PSAkdHJ1X3Rh

Z3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKTsKfQoKCiMjIyBBRE1JTiBTSURFIEZVTkNU

SU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaWYgKEB0eHBpbnRlcmZh

Y2UgPT0gJ2FkbWluJykgewoJYWRkX3ByaXZzKCd0cnVfdGFncycsICcxLDInKTsKCXJlZ2lz

dGVyX3RhYignZXh0ZW5zaW9ucycsICd0cnVfdGFncycsICd0cnVfdGFncycpOwoJcmVnaXN0

ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3RhYicsICd0cnVfdGFncycpOwoKCWlmICgk

dHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkgewoJCXJlZ2lzdGVy

X2NhbGxiYWNrKCd0cnVfdGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcicsICdhcnRpY2xl

Jyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl90YWIoJGV2ZW50LCAkc3RlcCkg

ewoJcmVxdWlyZV9wcml2cygndHJ1X3RhZ3MnKTsKCgkkcmVzdWx0cyA9IHRydV90YWdzX2Fk

bWluX3RhYl9oYW5kbGVfaW5wdXQoKTsKCgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFy

ZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCBmYWxzZSk7CgkkYWxsX3RhZ3MgPSB0cnVf

dGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7CgkkY2xvdWQgPSB0cnVfdGFnc19yZW5kZXJfY2xv

dWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzKTsKCgkkcmVkaXJlY3RzID0gdHJ1X3Rh

Z3NfbG9hZF9yZWRpcmVjdHMoKTsKCgl0cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2Uo

JHJlc3VsdHMsICRjbG91ZCwgJHJlZGlyZWN0cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19h

ZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJlc3VsdHMsICRjbG91ZCwgJHJlZGlyZWN0cykgewoJ

Z2xvYmFsICRldmVudDsKCXBhZ2V0b3AoJ3RydV90YWdzJywgJycpOwoKCWluY2x1ZGUodHhw

YXRoIC4gJy9pbmNsdWRlL3R4cF9wcmVmcy5waHAnKTsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJl

ZnM7CgoJZWNobyBzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcxMHB4JykuJzx0cj48

dGQgc3R5bGU9ImJvcmRlci1yaWdodDoycHggc29saWQgZ3JheSI+Jy4gICMgSSBrbm93LCBJ

IGtub3cuLi4KCQlzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcnLCAnMTBweCcpLic8

dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5Ij4nLgoJCQlzdGFy

dFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuCgkJCQl0cihoQ2VsbChnVHh0

KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQkJdHIodGQoJGNsb3VkKSkuCgkJCWVuZFRhYmxlKCku

CgkJJzwvdGQ+PC90cj48dHI+PHRkPicuCgkJCXN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycs

ICcnLCAnMzAwcHgnKS4KCQkJCXRyKGhDZWxsKGdUeHQoJ3RydV90YWdzIFJlZmVyZW5jZScp

KSkuCgkJCQl0cih0ZCgnPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJl

bmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+VXNhZ2UgaW5zdHJ1Y3Rpb25z

PC9hPicuCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20v

dmlld3RvcGljLnBocD9pZD0xNTA4NCI+Rm9ydW0gcGFnZXM8L2E+Jy4KCQkJCSc8YnI+PGEg

aHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1y

ZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8v

d3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAiPlJlbGVh

c2Ugcm9hZG1hcDwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0

LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0Ij5GZWF0dXJlIGxpc3Q8

L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Js

b2cvNDkzL3RydXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPnRydV90

YWdzPC9hPiwgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vIj5OYXRoYW4g

QXJ0aHVyPC9hPicuCgkJCQknPGJyPjxicj4nLgoJCQkJJzxkaXYgaWQ9InBheXBhbCI+PGZv

cm0gYWN0aW9uPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRo

b2Q9InBvc3QiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhj

bGljayIgLz48aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNv

bS9lbl9VUy9pL2J0bi94LWNsaWNrLWJ1dDA0LmdpZiIgbmFtZT0ic3VibWl0IiBhbHQ9Ik1h

a2UgYSBkb25hdGlvbiB0byBOYXRoYW4gQXJ0aHVyIiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0i

MCIgc3JjPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvc2NyL3BpeGVsLmdpZiIg

d2lkdGg9IjEiIGhlaWdodD0iMSIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJlbmNy

eXB0ZWQiIHZhbHVlPSItLS0tLUJFR0lOIFBLQ1M3LS0tLS1NSUlIVHdZSktvWklodmNOQVFj

RW9JSUhRRENDQnp3Q0FRRXhnZ0V3TUlJQkxBSUJBRENCbERDQmpqRUxNQWtHQTFVRUJoTUNW

Vk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJR

d0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBj

ekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhC

aGVYQmhiQzVqYjIwQ0FRQXdEUVlKS29aSWh2Y05BUUVCQlFBRWdZQzhpMVQyN2xqS2ZwTlRF

UWkwd0tIY2RHdWx4eGtNcXdkQ01tYkd2czg3bi80VHNKdGlBc3FNbzJoeXM3WnNHeTVSRi9P

N3MrQjJvUTc2elVsVDUyV1c3UWVYVUszR3AwbnIyY1AzaW9CU3ROdStSWjZqa2FtMkUwRkdM

WHlWNitVTlZFT3doOGxtb0lTUm90dlN2SWdReVRMbkVlREhxRzlxdlV6cXZGM1NxakVMTUFr

R0JTc09Bd0lhQlFBd2djd0dDU3FHU0liM0RRRUhBVEFVQmdncWhraUc5dzBEQndRSXBtUFpy

bHJaZlptQWdhaWVQVmIrbjlzVmRzdWZnR3JtQXcyclhBelIzOWtZcVBVSjduMExpTkRtZEFx

NzNKb1A1M2taeThnU3BvdnVjTDJTMGpDMXNYcmNwRUxBcExMOEJGU0hmZExpWm9aU1YvQ1lP

cHBINStkeDJZcUZJZHlDQ2RqSVg3b09QZ1F5QXVnUmEyUXIzYit5dXR1RzBERnNkK0xBSkdi

OGw0Q25ucmJtd2RZSzNOblZEQlBPbXhFT2psWFVnRXpsRkxYbUUzdzUrTW9QS1FjcDJuOGZk

SkxzZ0cxNXhvVlBGekNkL0syZ2dnT0hNSUlEZ3pDQ0F1eWdBd0lCQWdJQkFEQU5CZ2txaGtp

Rzl3MEJBUVVGQURDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdG

QVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1

akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhj

R2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd0hoY05NRFF3TWpF

ek1UQXhNekUxV2hjTk16VXdNakV6TVRBeE16RTFXakNCampFTE1Ba0dBMVVFQmhNQ1ZWTXhD

ekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZ

RFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJN

QThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhC

aGJDNWpiMjB3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU1GSFR0MzhS

TXhMWEp5TzJTbVMrTmRsNzJUN29LSjR1NHV3KzZhd250QUxXaDAzUGV3bUlKdXpiQUxTY3NU

UzRzWm9TMWZLY2lCR29oMTFnSWZIenlsdmtkTmUvaEpsNjYvUkdxcmo1ckZiMDhzQUFCTlR6

RFRpcXFOcEplQnNZcy9jMmFpR296cHRYMlJsbkJrdEgrU1VOcEFhalc3MjROdjJXdmhpZjZz

RkFnTUJBQUdqZ2U0d2dlc3dIUVlEVlIwT0JCWUVGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFda

SlJyTUlHN0JnTlZIU01FZ2JNd2diQ0FGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyb1lH

VXBJR1JNSUdPTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZC

QWNURFUxdmRXNTBZV2x1SUZacFpYY3hGREFTQmdOVkJBb1RDMUJoZVZCaGJDQkpibU11TVJN

d0VRWURWUVFMRkFwc2FYWmxYMk5sY25Sek1SRXdEd1lEVlFRREZBaHNhWFpsWDJGd2FURWNN

Qm9HQ1NxR1NJYjNEUUVKQVJZTmNtVkFjR0Y1Y0dGc0xtTnZiWUlCQURBTUJnTlZIUk1FQlRB

REFRSC9NQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBSUZmT2xhYWdGcmw3MStqcTZPS2lkYldG

U0UrUTRGcVJPdmRnSU9OdGgrOGtTSy8vWS80aWh1RTRZbXZ6bjVjZUUzUy9pQlNRUU1qeXZi

K3MyVFdiUVlEd2NwMTI5T1BJYkQ5ZXBkcjR0Sk9VTmlTb2p3N0JId1lSaVBoNThTMXhHbEZn

SEZYd3JFQmIzZGdOYk1VYSt1NHFlY3RzTUFYcFZIbkQ5d0l5Zm1ITVlJQm1qQ0NBWllDQVFF

d2daUXdnWTR4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVC

eE1OVFc5MWJuUmhhVzRnVm1sbGR6RVVNQklHQTFVRUNoTUxVR0Y1VUdGc0lFbHVZeTR4RXpB

UkJnTlZCQXNVQ214cGRtVmZZMlZ5ZEhNeEVUQVBCZ05WQkFNVUNHeHBkbVZmWVhCcE1Sd3dH

Z1lKS29aSWh2Y05BUWtCRmcxeVpVQndZWGx3WVd3dVkyOXRBZ0VBTUFrR0JTc09Bd0lhQlFD

Z1hUQVlCZ2txaGtpRzl3MEJDUU14Q3dZSktvWklodmNOQVFjQk1Cd0dDU3FHU0liM0RRRUpC

VEVQRncwd09EQTNNRE13TkRFME1USmFNQ01HQ1NxR1NJYjNEUUVKQkRFV0JCVDB0a2o0ZFpM

ZS9FNFF3YmliMjlYRWRIeEFZakFOQmdrcWhraUc5dzBCQVFFRkFBU0JnTDVKc1FIalE5U2c0

WTNlRFdLRE8xNnIrdGZFejRSWUFEdCs2aDk4MWZrVkN4Zk5IRkR4b2ZEY3h5elJNWXI3eTk1

Y2RuVmk0QU5Rd01VWTZ5Slc1am0vR0QxN3JqZ1N4Wk1FdnNBZTZZY0NTTEs1WmFwQ3cxcWx5

U3BQR1pCQTNNVHQ2T0Qrb3ZWb2EvMXY4Q05zRWNIcDdmNHRPeE9VU3c1UDRuSHlMUFdqLS0t

LS1FTkQgUEtDUzctLS0tLSI+PC9mb3JtPjwvZGl2PicKCQkJCSkpLgoJCQllbmRUYWJsZSgp

LgoJCSc8L3RkPjwvdHI+Jy5lbmRUYWJsZSgpLgoJJzwvdGQ+PHRkPicuCgkJc3RhcnRUYWJs

ZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90

dG9tOjJweCBzb2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMpIHsK

CQkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJCXRy

KGhDZWxsKGdUeHQoJ1Jlc3VsdHMnKSkpLgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBzdHls

ZT0iY29sb3I6cmVkIicpLgoJCQllbmRUYWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+PHRy

Pjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCQl9CgoKCQll

Y2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWco

Z1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0

aXZlJykuJyEpJywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3JtKAoJ

CQkJCXRkYShnVHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt

aWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJ

CQkJCXRkYShnVHh0KCd0bycpLic6JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxl

IicpLgoJCQkJCXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJCQkJ

CXRkKGZJbnB1dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gn

KS5lSW5wdXQoJ3RydV90YWdzJykpLAoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdh

cmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0oCgkJ

CQkJdGRhKGdUeHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p

ZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lucHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJ

CQkJCXRkY3MoJycsIDIpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdU

eHQoJ1J1bicpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcg

dmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSku

CgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVy

LWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0Jywg

JycsICcnLCAnJywgJzEwMCUnKS4KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAn

dGgnLCAnIGNvbHNwYW49IjQiJykpOwoJCQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0

dGFnID0+ICRyaWdodHRhZykgewoJCQkJZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVmdHRh

ZywgdHJ1X3RhZ3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGln

bjogY2VudGVyIicpLgoJCQkJCXRkYShodG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxl

PSJ0ZXh0LWFsaWduOiBjZW50ZXIiJykuCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVf

dGFnc19saW5raWZ5X3RhZygkcmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2Vu

dGVyIicpLgoJCQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1w

O2RlbGV0ZV9yZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJl

dHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4n

KQoJCQkJKTsKCQkJfQoJCQllY2hvIHRyKAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0IiBp

ZD0icmVkaXJlY3QiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9dHJ1

X3RhZ3MiIG9uc3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUn

KS4nXCcpIj4nLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAn

IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFy

cygnPT4nKSwgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2Vu

dGVyIicpLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwgJyBz

dHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiJykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNs

aWNrPSJpZiAodmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVu

dC5nZXRFbGVtZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7

Ij5BZGQgbmV3PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJ

CQlmSW5wdXQoJ2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicKCgkJ

CSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQllY2hv

IHN0YXJ0VGFibGUoJ2xpc3QnKS4KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0

aCcsICcgY29sc3Bhbj0iMiInKSkuCgkJCWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgn

VXNlIGNsZWFuIFVSTHMnKS4nICgnLmdUeHQoJ3NpdGUgZGVmYXVsdCBpcycpLicgJy4kdHJ1

X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPmRlZmF1bHRfdmFsdWUuJyk6ICcsICcgc3R5bGU9

InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZChyYWRpb19saXN0KENMRUFOX1VS

TFMsCgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0

KCdtZXNzeScpKSwKCQkJCQkJCSR0cnVfdGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUp

KQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdUYWcgc2VjdGlvbiBuYW1lJykuJyAo

ZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT5kZWZhdWx0X3Zh

bHVlLiciKTogJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRk

KHRleHRfaW5wdXQoVEFHX1NFQ1RJT04sICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0t

PnZhbHVlLCAnMTUnKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVVJMIHBhcmFt

ZXRlciBmb3IgdGFnIHNlYXJjaCcpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZz

W1BBUk1fTkFNRV0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLgoJCQkJCQknPGJyPih5b3Ugc2hv

dWxkblwndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFy

ZSBkb2luZyknLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQo

dGV4dF9pbnB1dChQQVJNX05BTUUsICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1

ZSwgJzE1JykpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8g

UlNTL0F0b20gZmVlZHMsIGluICJDYXRlZ29yeSIgZWxlbWVudHMnKS4KCQkJCQkJJzogPGJy

Pih5b3UgcHJvYmFibHkgd2FudCB0aGlzKScsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p

ZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAk

dHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkpCgkJCQkp

LgoJCQkJdHIoCgkJCQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRoZSBib2R5IG9m

IFJTUy9BdG9tIGZlZWRzLCAnLgoJCQkJCQknd2l0aCBsaW5rcywgYW5kIHdpdGggcmVsPSJ0

YWciOjxicj5JZiB0aGlzIGlzIHR1cm5lZCBvbiwnLgoJCQkJCQkneW91IGNhbiBkZWZpbmUg

YSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3RhZ3MgJy4KCQkJCQkJJ3RoYXQg

d2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgdGFncyBpbiB0aGUgZmVlZC4nLAoJCQkJCQkn

IHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhU

QUdTX0lOX0ZFRURfQk9EWSwgJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXS0+

dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdTaG93IGEgY2xpY2thYmxl

IGxpc3Qgb2YgdGFncyBvbiB0aGUgIldyaXRlIiBwYWdlJykuJzogJywKCQkJCQkJJyBzdHls

ZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19J

Tl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVl

KSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZCgnJykuCgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0

JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3Mn

KSwgJyBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCInKQoJCQkJKSwKCQkJCScnLCAnIHZlcmlm

eShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkpLgoJCWVuZFRhYmxl

KCkuJzwvdGQ+PC90cj4nLgoJCWVuZFRhYmxlKCk7CgoJZWNobyAnPC90ZD48L3RyPicuZW5k

VGFibGUoKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQo

KSB7CglpZiAoZ3BzKCdwcmVmcycpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3VwZGF0

ZV9wcmVmcygpOwoJfSBlbHNlIGlmIChncHMoJ2RlbGV0ZScpKSB7CgkJcmV0dXJuIHRydV90

YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7Cgl9IGVsc2UgaWYgKGdw

cygncmVwbGFjZScpKSB7CgkJJHJlc3VsdCA9IHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFn

KGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdyZXBsYWNldGFnJyksIGZhbHNlKTsKCQlyZXR1cm4g

JHJlc3VsdCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21h

dGNodGFnJyksIGdwcygncmVwbGFjZXRhZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdyZWRpcmVj

dCcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ2xlZnR0

YWcnKSwgZ3BzKCdyaWdodHRhZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJl

Y3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9kZWxldGVfcmVkaXJlY3QoZ3BzKCdk

ZWxldGVfcmVkaXJlY3QnKSk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCmZ1bmN0

aW9uIHRydV90YWdzX2FkbWluX3VwZGF0ZV9wcmVmcygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3Nf

cHJlZnM7CgkkcmVzdWx0cyA9IGFycmF5KCk7Cglmb3JlYWNoICgkdHJ1X3RhZ3NfcHJlZnMg

YXMgJHByZWYpIHsKCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRhdGVfdmFsdWUoZ3Bz

KCRwcmVmLT5uYW1lKSk7CgkJaWYgKCR2YWxpZF92YWx1ZSAmJiAkdmFsaWRfdmFsdWUgPD4g

Z3BzKCRwcmVmLT5uYW1lKSkgewoJCQlyZXR1cm4gJHZhbGlkX3ZhbHVlOyAgIyMjIHRoaXMg

aXMgYSBzbmVha3kgd2F5IHRvIGhhbmRsZSB2YWxpZGF0aW9uIC0gc29ycnkgOykKCQl9CgkJ

aWYgKCR2YWxpZF92YWx1ZSA8PiAkcHJlZi0+dmFsdWUpIHsKCQkJaWYgKCR2YWxpZF92YWx1

ZSA9PSAkcHJlZi0+ZGVmYXVsdF92YWx1ZSkgewoJCQkJJHJlc3VsdCA9IHRydV90YWdzX2Rl

bGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQgPSB0cnVf

dGFnc191cHNlcnRfcHJlZigkcHJlZi0+bmFtZSwgJHZhbGlkX3ZhbHVlKTsKCQkJfQoJCQlp

ZiAoJHJlc3VsdCkgewoJCQkJJHJlc3VsdHNbXSA9ICdVcGRhdGVkICcgLiAkcHJlZi0+bmFt

ZTsKCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSRy

ZXN1bHRzW10gPSAnRXJyb3IgdXBkYXRpbmcgJyAuICRwcmVmLT5uYW1lOwoJCQl9CgkJfQoJ

fQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAwKSB7CgkJcmV0dXJuICdObyByZWNvcmRzIG5l

ZWQgdXBkYXRpbmcnOwoJfSBlbHNlIHsKCQlyZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRz

KTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3Vwc2VydF9wcmVmKCRuYW1lLCAkdmFsdWUp

IHsKCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNh

ZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpLgoJCScgKG5hbWUgdmFyY2hhcigyNTUpIHByaW1h

cnkga2V5LCAnLgoJCSd2YWx1ZSB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsKCQlyZXR1

cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngo

J3RydV90YWdzX3ByZWZzJykgLiAnIHRhYmxlLic7Cgl9CgoJcmV0dXJuIHNhZmVfdXBzZXJ0

KCd0cnVfdGFnc19wcmVmcycsICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFt

ZS4nIicpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZGVsZXRlX3ByZWYoJG5hbWUpIHsKCWlm

IChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcHJlZnMnLCAnbmFtZT0iJy4kbmFtZS4nIicpKSB7

CgkJaWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZl

X3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsK

CQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0gZWxzZSB7CgkJcmV0dXJu

IGZhbHNlOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3RhZygkZGVs

ZXRldGFnKSB7CglpZiAodHJpbSgkZGVsZXRldGFnKSkgewoJCXJldHVybiB0cnVfdGFnc19h

ZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7Cgl9IGVsc2UgewoJCXJl

dHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf

YWRtaW5fcmVwbGFjZV90YWcoJG1hdGNodGFnLCAkcmVwbGFjZXRhZywgJGFsbG93X2JsYW5r

X3JlcGxhY2V0YWcpIHsKCSRtYXRjaHRhZyA9IHRyaW0oJG1hdGNodGFnKTsKCSRyZXBsYWNl

dGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7CglpZiAoJG1hdGNodGFnICYmICgkYWxsb3dfYmxh

bmtfcmVwbGFjZXRhZyB8fCAkcmVwbGFjZXRhZykpIHsKCQlpZiAoc2FmZV91cGRhdGUoJ3Rl

eHRwYXR0ZXJuJywgVFJVX1RBR1NfRklFTEQuJz10cmltKGJvdGggXCcsXCcgZnJvbSByZXBs

YWNlKGNvbmNhdCgiLCIsICcuVFJVX1RBR1NfRklFTEQuJywgIiwiKSwgY29uY2F0KCIsIiwg

XCcnLmFkZHNsYXNoZXMoJG1hdGNodGFnKS4nXCcsICIsIiksIFwnLCcuYWRkc2xhc2hlcygk

cmVwbGFjZXRhZykuJyxcJykpJywgJzEnKSkgewoJCQlyZXR1cm4gJ1VwZGF0ZWQgJy5teXNx

bF9hZmZlY3RlZF9yb3dzKCkuJyByb3dzICgiJy5odG1sc3BlY2lhbGNoYXJzKCRtYXRjaHRh

ZykuJyI9PiInLmh0bWxzcGVjaWFsY2hhcnMoJHJlcGxhY2V0YWcpLiciKSc7CgkJfSBlbHNl

IHsKCQkJcmV0dXJuICdFcnJvcjogJyAuIG15c3FsX2Vycm9yKCk7CgkJfQoJfSBlbHNlIHsK

CQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGluIGJvdGggZmllbGRzJzsKCX0KfQoK

CmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZygkbGVmdHRhZywgJHJpZ2h0

dGFnKSB7CgkkbGVmdHRhZyA9IGFkZHNsYXNoZXModHJ1X3RhZ3Nfc3RydG9sb3dlcih0cmlt

KCRsZWZ0dGFnKSkpOwoJJHJpZ2h0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xv

d2VyKHRyaW0oJHJpZ2h0dGFnKSkpOwoJaWYgKCEkbGVmdHRhZyB8fCAhJHJpZ2h0dGFnKSB7

CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBpbiBib3RoIGZpZWxkcyc7Cgl9CgoJ

aWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyAnIC4gc2FmZV9w

ZngoJ3RydV90YWdzX3JlZGlyZWN0cycpLgoJCScgKGxlZnR0YWcgdmFyY2hhcigyNTUpIHBy

aW1hcnkga2V5LCAnLgoJCSdyaWdodHRhZyB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsK

CQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2Fm

ZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpIC4gJyB0YWJsZS4nOwoJfQoKCWlmIChzYWZl

X2luc2VydCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xlZnR0YWc9IicuJGxlZnR0YWcuJyIs

cmlnaHR0YWc9IicuJHJpZ2h0dGFnLiciJykpIHsKCQlyZXR1cm4gJ1JlZGlyZWN0IGFkZGVk

ICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIj0+IicuaHRtbHNwZWNpYWxjaGFy

cygkcmlnaHR0YWcpLiciKSAtIHBsZWFzZSB0ZXN0IGl0ISc7Cgl9IGVsc2UgewoJCXJldHVy

biAnRXJyb3IgYWRkaW5nIHJlY29yZCAtIGRvZXMgaXQgYWxyZWFkeSBleGlzdD8nOwoJfQp9

CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KCRsZWZ0dGFnKSB7

CglpZiAoc2FmZV9kZWxldGUoJ3RydV90YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSInLmFk

ZHNsYXNoZXMoJGxlZnR0YWcpLiciJykpIHsKCQlpZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3Nf

cmVkaXJlY3RzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBz

YWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykpKSB7CgkJCXJldHVybiAnUmVkaXJlY3Qg

ZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3Rh

Z3NfcmVkaXJlY3RzJyk7CgkJfQoJCXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCAoIicuaHRt

bHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyIpJzsKCX0gZWxzZSB7CgkJcmV0dXJuICdFcnJv

ciBkZWxldGluZyByZWRpcmVjdCc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl93

cml0ZV90YWJfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CgkkYXR0cyA9IHRydV90YWdzX2dl

dF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUpOwoJJGF0dHNbJ3Rp

bWUnXSA9ICdhbnknOwoJJGNsb3VkID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1

ZXJ5KCRhdHRzKSk7Cglzb3J0KCRjbG91ZCk7CgoJJGlkID0gKGVtcHR5KCRHTE9CQUxTWydJ

RCddKSA/IGdwcygnSUQnKSA6ICRHTE9CQUxTWydJRCddKTsKCSRhcnRpY2xlX3RhZ3MgPSAo

ZW1wdHkoJGlkKSA/IGFycmF5KCkgOiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgk

aWQpKTsKCgkkbGlua3MgPSBhcnJheSgpOwoJZm9yZWFjaCAoJGNsb3VkIGFzICR0YWcpIHsK

CQkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywgJGFydGljbGVfdGFncykgPyAnIGNsYXNzPSJ0

YWdfY2hvc2VuIicgOiAnJyk7CgkJJGxpbmtzW10gPSAnPGEgaHJlZj0iI2FkdmFuY2VkIicu

JHN0eWxlLicgb25jbGljaz0idGhpcy5zZXRBdHRyaWJ1dGUoXFxcJ2NsYXNzXFxcJywgdG9n

Z2xlVGFnKFxcXCcnLmFkZHNsYXNoZXMoYWRkc2xhc2hlcygkdGFnKSkuJ1xcXCcpKTsgcmV0

dXJuIGZhbHNlOyI+JyAuIGFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycygkdGFnKSkgLiAn

PFwvYT4nOwoJfQoJJHRvX2luc2VydCA9IGpvaW4oJywgJywgJGxpbmtzKTsKCSR0b19pbnNl

cnQgPSAiPHN0eWxlPmEudGFnX2Nob3NlbntiYWNrZ3JvdW5kLWNvbG9yOiAjRkVCOyBjb2xv

cjogYmxhY2s7fTwvc3R5bGU+IiAuICR0b19pbnNlcnQ7CgoJJGpzID0gPDw8RU9GCgkJdmFy

IGtleXdvcmRzRmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsK

CQl2YXIgcGFyZW50ID0ga2V5d29yZHNGaWVsZC5wYXJlbnROb2RlOwoJCXBhcmVudC5hcHBl

bmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKCQl2YXIgY2xvdWQgPSBk

b2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CgkJY2xvdWQuc2V0QXR0cmlidXRlKCdj

bGFzcycsICd0cnVfdGFnc19hZG1pbl90YWdzJyk7CgkJY2xvdWQuaW5uZXJIVE1MID0gJ3sk

dG9faW5zZXJ0fSc7CgkJcGFyZW50LmFwcGVuZENoaWxkKGNsb3VkKTsKCgkJZnVuY3Rpb24g

dG9nZ2xlVGFnKHRhZ05hbWUpIHsKCQkJdmFyIHJlZ2V4VGFnID0gdGFnTmFtZS5yZXBsYWNl

KC8oW1xcXFxcXlxcJCorW1xcXT97fS49IToofCldKS9nLCJcXFxcJDEiKTsKCQkJdmFyIHRh

Z1JlZ2V4ID0gbmV3IFJlZ0V4cCgiKChefCwpXFxccyopIiArIHJlZ2V4VGFnICsgIlxcXHMq

KCxcXFxzKnwkKSIpOwoJCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ

ZCgna2V5d29yZHMnKTsKCQkJdmFyIGN1cnZhbCA9IHRleHRhcmVhLnZhbHVlLnJlcGxhY2Uo

Lyw/XHMrJC8sICcnKTsKCQkJaWYgKCcnID09IGN1cnZhbCkgewoJCQkJdGV4dGFyZWEudmFs

dWUgPSB0YWdOYW1lOwoJCQl9IGVsc2UgaWYgKGN1cnZhbC5tYXRjaCh0YWdSZWdleCkpIHsK

CQkJCXRleHRhcmVhLnZhbHVlID0gY3VydmFsLnJlcGxhY2UodGFnUmVnZXgsICckMScpLnJl

cGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJCXJldHVybiAnJzsKCQkJfSBlbHNlIGlmICgnLCcg

PT0gY3VydmFsLmNoYXJBdChjdXJ2YWwubGVuZ3RoIC0gMSkpIHsKCQkJCXRleHRhcmVhLnZh

bHVlICs9ICcgJyArIHRhZ05hbWU7CgkJCX0gZWxzZSB7CgkJCQl0ZXh0YXJlYS52YWx1ZSAr

PSAnLCAnICsgdGFnTmFtZTsKCQkJfQoJCQlyZXR1cm4gJ3RhZ19jaG9zZW4nOwoJCX0KRU9G

OwoKCWVjaG8gc2NyaXB0X2pzKCRqcyk7Cn0KCgojIyMgQVRPTS9SU1MgRkVFRCBGVU5DVElP

TlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnJlZ2lzdGVyX2NhbGxi

YWNrKCd0cnVfdGFnc19hdG9tX2hhbmRsZXInLCAnYXRvbV9lbnRyeScpOwpmdW5jdGlvbiB0

cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3Nf

ZmVlZF9oYW5kbGVyKHRydWUpOyB9CnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19yc3Nf

aGFuZGxlcicsICdyc3NfZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfcnNzX2hhbmRsZXIo

JGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKGZhbHNlKTsg

fQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKCRhdG9tKSB7CglnbG9iYWwgJHRo

aXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJ

JHRhZ3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkdGhpc2lkKTsKCglpZiAo

JHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXS0+dmFsdWUpIHsKCQkkZXh0cmFi

b2R5ID0gJyc7CgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3RhZ3MnOwoJCWlmIChm

ZXRjaCgnZm9ybScsICd0eHBfZm9ybScsICduYW1lJywgJEZPUk1fTkFNRSkpIHsKCQkJJGZv

cm0gPSBmZXRjaF9mb3JtKCRGT1JNX05BTUUpOwoJCQkkZXh0cmFib2R5ID0gdHJpbShwYXJz

ZSgkZm9ybSkpOwoJCX0gZWxzZSB7CgkJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJk

X2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIHRydWUpOwoJCQkkZXh0cmFib2R5ID0gJzxw

PnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICR0YWdzLCAkdGFncykg

LiAnPC9wPic7CgkJfQoJCWdsb2JhbCAkdGhpc2FydGljbGU7CgkJaWYgKHRyaW0oJHRoaXNh

cnRpY2xlWydleGNlcnB0J10pKSB7CgkJCSR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddID0gdHJp

bSgkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSkubi4kZXh0cmFib2R5Lm47CgkJfQoJCSR0aGlz

YXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2FydGljbGVbJ2JvZHknXSkubi4kZXh0cmFi

b2R5Lm47Cgl9CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklF

U10tPnZhbHVlKSB7CgkJJG91dHB1dCA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJHRhZ3MgYXMg

JHRhZykgewoJCQlpZiAoJGF0b20pIHsKCQkJCSRvdXRwdXRbXSA9ICc8Y2F0ZWdvcnkgdGVy

bT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnIiAvPic7CgkJCX0gZWxzZSB7CgkJ

CQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4g

JzwvY2F0ZWdvcnk+JzsKCQkJfQoJCX0KCQlyZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47

Cgl9Cn0KCgojIyMgUFJFRlMgRlVOQ1RJT05TIC8gQ0xBU1NFUyAjIyMKIyMjIyMjIyMjIyMj

IyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjbGFzcyB0cnVfdGFnc19wcmVmIHsKCWZ1bmN0aW9u

IHRydV90YWdzX3ByZWYoJG5hbWUsICRkZWZhdWx0X3ZhbHVlLCAkdHlwZSkgewoJCSR0aGlz

LT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnZhbHVlID0gJGRlZmF1bHRfdmFsdWU7CgkJJHRo

aXMtPmRlZmF1bHRfdmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsKCQkkdGhpcy0+dHlwZSA9ICR0

eXBlOwoJfQoKCWZ1bmN0aW9uIHZhbGlkYXRlX3ZhbHVlKCR2YWx1ZSkgewoJCWlmICgkdmFs

dWUpIHsKCQkJcmV0dXJuICR2YWx1ZTsKCQl9IGVsc2UgaWYgKCR0aGlzLT50eXBlID09ICdi

b29sZWFuJykgewoJCQlyZXR1cm4gJzAnOwoJCX0gZWxzZSB7CgkJCXJldHVybiAnUGxlYXNl

IGVudGVyIGEgdmFsdWUgZm9yICcgLiAkdGhpcy0+bmFtZTsKCQl9Cgl9Cn0KCmZ1bmN0aW9u

IHRydV90YWdzX2xvYWRfcHJlZnMoKSB7CgkkcHJlZnMgPSBhcnJheSgpOwoKCWdsb2JhbCAk

cGVybWxpbmtfbW9kZTsKCSRwcmVmc1tDTEVBTl9VUkxTXSA9IG5ldyB0cnVfdGFnc19wcmVm

KENMRUFOX1VSTFMsICgkcGVybWxpbmtfbW9kZSAhPSAnbWVzc3knID8gJ2NsZWFuJyA6ICdt

ZXNzeScpLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHX1NFQ1RJT05dID0gbmV3IHRydV90YWdz

X3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5nJyk7CgkkcHJlZnNbUEFSTV9OQU1F

XSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwgJ3QnLCAnc3RyaW5nJyk7CgkkcHJl

ZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19J

Tl9GRUVEX0NBVEVHT1JJRVMsICcxJywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tUQUdTX0lOX0ZF

RURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZFRURfQk9EWSwgJzAnLCAn

Ym9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19w

cmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29sZWFuJyk7CgoJaWYgKG15c3FsX3F1

ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRydV90YWdzX3ByZWZzIikpIHsKCQkkcnMgPSBz

YWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcHJlZnMnLCAnMScpOwoJCWZvcmVhY2ggKCRycyBh

cyAkcm93KSB7CgkJCSRwcmVmc1skcm93WyduYW1lJ11dLT52YWx1ZSA9ICRyb3dbJ3ZhbHVl

J107CgkJfQoJfQoKCXJldHVybiAkcHJlZnM7Cn0KCgojIyMgT1RIRVIgU1VQUE9SVCBGVU5D

VElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRy

dV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgkdGFnX3BhcmFtZXRlcikgewoJJHJlZGlyZWN0

cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7Cglmb3JlYWNoICgkcmVkaXJlY3RzIGFz

ICRsZWZ0dGFnID0+ICRyaWdodHRhZykgewoJCWlmICgkbGVmdHRhZyA9PSAkdGFnX3BhcmFt

ZXRlciB8fCAkbGVmdHRhZyA9PSBzdHJfcmVwbGFjZSgnLScsICcgJywgJHRhZ19wYXJhbWV0

ZXIpKSB7CgkJCXRydV90YWdzX3JlZGlyZWN0KCRyaWdodHRhZywgZmFsc2UpOwoJCQlyZXR1

cm4gdHJ1ZTsKCQl9Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf

bG9hZF9yZWRpcmVjdHMoKSB7CgkkcmVkaXJlY3RzID0gYXJyYXkoKTsKCWlmIChteXNxbF9x

dWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVfdGFnc19yZWRpcmVjdHMiKSkgewoJCSRy

cyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMSBvcmRlciBieSBs

ZWZ0dGFnJyk7CgkJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkJJHJlZGlyZWN0c1skcm93

WydsZWZ0dGFnJ11dID0gJHJvd1sncmlnaHR0YWcnXTsKCQl9Cgl9CglyZXR1cm4gJHJlZGly

ZWN0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0KCRkZXN0aW5hdGlvbiwgJGlz

X2Z1bGxfdXJsKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYgKCRpc19mdWxsX3Vy

bCkgewoJCSR1cmwgPSAkZGVzdGluYXRpb247CgkJJG1lc3NhZ2UgPSAnVGhlIHJlc291cmNl

IHlvdSByZXF1ZXN0ZWQgaGFzIG1vdmVkIHRvICcgLiAkZGVzdGluYXRpb247Cgl9IGVsc2Ug

ewoJCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5X3RhZygkZGVzdGluYXRpb24sIGZhbHNlKTsK

CQkkbWVzc2FnZSA9ICdUaGUgcmVxdWVzdGVkIHRhZyBoYXMgYmVlbiByZXBsYWNlZCBieSAn

IC4gJGRlc3RpbmF0aW9uOwoJfQoKCWhlYWRlcignTG9jYXRpb246ICcgLiAkdXJsKTsKCXR4

cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xpbmtpZnlf

dGFnKCR0YWcsICR1c2VfYW1wID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsK

CWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1

X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsKCX0gZWxzZSB7CgkJJHVy

bHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52

YWx1ZSAuICgkdXNlX2FtcCA/ICcmYW1wOycgOiAnJicpIC4gJHRydV90YWdzX3ByZWZzW1BB

Uk1fTkFNRV0tPnZhbHVlIC4gJz0nOwoJfQoJJHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVh

bl91cmxzKCkgPyAnLycgOiAnJyk7CglyZXR1cm4gJHVybHByZWZpeCAuIHVybGVuY29kZShz

dHJfcmVwbGFjZSgnICcsICctJywgJHRhZykpIC4gJHVybHN1ZmZpeDsKfQoKCmZ1bmN0aW9u

IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRhcnRpY2xlSUQpIHsKCSR0YWdzX2Zp

ZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRl

eHRwYXR0ZXJuIiwgIklEPSckYXJ0aWNsZUlEJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsK

CSRhbGxfdGFncyA9IGFycmF5KCk7CglpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVs

ZCwgJHJzKSkgewoJCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0

cnRvbG93ZXIoJHJzWyR0YWdzX2ZpZWxkXSkpKTsKCX0KCglyZXR1cm4gdHJ1X3RhZ3NfdHJp

bV90YWdzKCRhbGxfdGFncyk7Cn0KCgojIGZpeGVzIGJ1ZyB3aXRoIDQuMC40J3MgdmVyc2lv

biBvZiBkb1dyYXAgdGhhdCBjYXVzZWQgc3BhY2VzIHRvIHNob3cgdXAgYmVmb3JlIHRoZSBj

b21tYXMKZnVuY3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVh

aywgJGNsYXNzLCAkYnJlYWtjbGFzcykgewoJaWYgKCEkd3JhcHRhZyAmJiAhcHJlZ19tYXRj

aCgnL15cdyskLycsICRicmVhaykpIHsKCQlyZXR1cm4gam9pbigkYnJlYWsubiwgJGxpc3Qp

OwoJfSBlbHNlIHsKCQlyZXR1cm4gZG9XcmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAk

Y2xhc3MsICRicmVha2NsYXNzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFn

cygkdGFnX2FycmF5KSB7CgkkdHJpbW1lZCA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGFnX2Fy

cmF5IGFzICR0YWcpIHsKCQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgewoJCQkkdHJpbW1lZFtd

ID0gdHJpbSgkdGFnKTsKCQl9Cgl9CglyZXR1cm4gJHRyaW1tZWQ7Cn0KCgpmdW5jdGlvbiB0

cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcikgewoJJGtl

eXdvcmRzID0gZXhwbG9kZSgnLCcsICR0YWdfcGFyYW1ldGVyKTsKCWZvcmVhY2ggKCRrZXl3

b3JkcyBhcyAka2V5d29yZCkgewoJCWlmIChzdHJwb3MoJGtleXdvcmQsICctJykgIT09IGZh

bHNlKSB7CgkJCSRrZXl3b3Jkc1tdID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRrZXl3b3Jk

KTsKCQl9Cgl9CgkkYXR0c1sna2V5d29yZHMnXSA9IGltcGxvZGUoJywnLCAka2V5d29yZHMp

OwoKCWlmIChpc3NldCgkYXR0c1snc2VjdGlvbiddKSAmJiBzdHJwb3MoJGF0dHNbJ3NlY3Rp

b24nXSwgJywnKSAhPT0gZmFsc2UpIHsKCQkkYXR0c1snc2VjdGlvbiddID0gJyc7Cgl9CgoJ

aWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgewoJCXVuc2V0KCRhdHRzWydl

eGNsdWRlc2VjdGlvbiddKTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ25vYXJ0aWNsZXMnXSkp

IHsKCQl1bnNldCgkYXR0c1snbm9hcnRpY2xlcyddKTsKCX0KCglpZiAoIWlzc2V0KCRhdHRz

WydsaW1pdCddKSkgewoJCSRhdHRzWydsaW1pdCddID0gJzEwMDAnOwoJfQoKCWlmICghaXNz

ZXQoJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSkpIHsKCQkkYXR0c1snYWxsb3dvdmVycmlkZSdd

ID0gdHJ1ZTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ3NlYXJjaGZvcm0nXSkgJiYgIWlzc2V0

KCRhdHRzWydsaXN0Zm9ybSddKSkgewoJCSRhdHRzWydsaXN0Zm9ybSddID0gJGF0dHNbJ3Nl

YXJjaGZvcm0nXTsKCX0KCglyZXR1cm4gJGF0dHM7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19z

dHJ0b2xvd2VyKCRzdHIpIHsKCWlmIChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cnRvbG93ZXIi

KSkgewoJCXJldHVybiBtYl9zdHJ0b2xvd2VyKCRzdHIsICJVVEYtOCIpOwoJfSBlbHNlIHsK

CQlyZXR1cm4gc3RydG9sb3dlcigkc3RyKTsKCX0KfQoKCi8vdGhlc2UgbmV4dCB0d28gZnVu

Y3Rpb25zIGFyZSBncm9zcywgYnV0IEkgY2FuJ3QgZmlndXJlIG91dCBhbm90aGVyIHdheSB0

byBkbyBpdApmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29y

dF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKSB7CglnbG9iYWwgJHRydV90YWdzX3RhZ3Nf

d2VpZ2h0LCAkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCwgJHRydV90YWdzX3NvcnRfYXNjZW5k

aW5nOwoKCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dlaWdodDsKCSR0cnVfdGFn

c19zb3J0X2J5X2NvdW50ID0gJHNvcnRfYnlfY291bnQ7CgkkdHJ1X3RhZ3Nfc29ydF9hc2Nl

bmRpbmcgPSAkc29ydF9hc2NlbmRpbmc7CgoJJHRlbXBfYXJyYXkgPSBhcnJheV9rZXlzKCR0

YWdzX3dlaWdodCk7Cgl1c29ydCgkdGVtcF9hcnJheSwgInRydV90YWdzX3NvcnRfdGFnc19j

b21wYXJhdG9yIik7CgoJJHNvcnRlZF9hcnJheSA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGVt

cF9hcnJheSBhcyAkdGFnKSB7CgkJJHNvcnRlZF9hcnJheVskdGFnXSA9ICR0YWdzX3dlaWdo

dFskdGFnXTsKCX0KCglyZXR1cm4gJHNvcnRlZF9hcnJheTsKfQoKCmZ1bmN0aW9uIHRydV90

YWdzX3NvcnRfdGFnc19jb21wYXJhdG9yKCRsZWZ0LCAkcmlnaHQpIHsKCWdsb2JhbCAkdHJ1

X3RhZ3NfdGFnc193ZWlnaHQsICR0cnVfdGFnc19zb3J0X2J5X2NvdW50LCAkdHJ1X3RhZ3Nf

c29ydF9hc2NlbmRpbmc7CgoJaWYgKCR0cnVfdGFnc19zb3J0X2J5X2NvdW50KSB7CgkJJGxl

ZnRfd2VpZ2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRsZWZ0XTsKCQkkcmlnaHRfd2Vp

Z2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdodF07CgkJaWYgKCRsZWZ0X3dlaWdo

dCA9PSAkcmlnaHRfd2VpZ2h0KSB7CgkJCXJldHVybiBzdHJuYXRjYXNlY21wKCRsZWZ0LCAk

cmlnaHQpOwoJCX0gZWxzZSBpZiAoJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nKSB7CgkJCXJl

dHVybiAkbGVmdF93ZWlnaHQgLSAkcmlnaHRfd2VpZ2h0OwoJCX0gZWxzZSB7CgkJCXJldHVy

biAkcmlnaHRfd2VpZ2h0IC0gJGxlZnRfd2VpZ2h0OwoJCX0KCX0gZWxzZSB7CgkJcmV0dXJu

IHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7Cgl9Cn0KCgoKIyMjIEJBU1RBUkQgRlVO

Q1RJT05TIFRIQVQgU0hPVUxETidUIEhBVkUgVE8gRVhJU1QgIyMjCiMjIyMjIyMjIyMjIyMj

IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCmZ1bmN0aW9uIHRy

dV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJGF0dHMpIHsKCSR0aGVBdHRzID0gbEF0dHMo

YXJyYXkoJ2xpbWl0JyAgICAgPT4gMTAwMCwKCQkJCSdjYXRlZ29yeScgID0+ICcnLAoJCQkJ

J3NlY3Rpb24nICAgPT4gJycsCgkJCQknZXhjZXJwdGVkJyA9PiAnJywKCQkJCSdhdXRob3In

ICAgID0+ICcnLAoJCQkJJ3NvcnRieScgICAgPT4gJ1Bvc3RlZCcsCgkJCQknc29ydGRpcicg

ICA9PiAnZGVzYycsCgkJCQknbW9udGgnICAgICA9PiAnJywKCQkJCSdrZXl3b3JkcycgID0+

ICcnLAoJCQkJJ2Zyb250cGFnZScgPT4gJycsCgkJCQknaWQnICAgICAgICA9PiAnJywKCQkJ

CSd0aW1lJyAgICAgID0+ICdwYXN0JywKCQkJCSdzdGF0dXMnICAgID0+ICc0JywKCQkJCSdv

ZmZzZXQnICAgID0+IDAKCQkJKSwkYXR0cywgMCk7CglleHRyYWN0KCR0aGVBdHRzKTsKCgkv

L0J1aWxkaW5nIHF1ZXJ5IHBhcnRzCgkkZnJvbnRwYWdlID0gKCRmcm9udHBhZ2UpID8gZmls

dGVyRnJvbnRQYWdlKCkgOiAnJzsKCSRjYXRlZ29yeSAgPSAoISRjYXRlZ29yeSkgID8gJycg

OiAiIGFuZCAoKENhdGVnb3J5MT0nIi5kb3NsYXNoKCRjYXRlZ29yeSkuIicpIG9yIChDYXRl

Z29yeTI9JyIuZG9TbGFzaCgkY2F0ZWdvcnkpLiInKSkgIjsKCSRzZWN0aW9uICAgPSAoISRz

ZWN0aW9uKSAgID8gJycgOiAiIGFuZCBTZWN0aW9uID0gJyIuZG9zbGFzaCgkc2VjdGlvbiku

IiciOwoJJGV4Y2VycHRlZCA9ICgkZXhjZXJwdGVkPT0neScpICA/ICIgYW5kIEV4Y2VycHQg

IT0nJyIgOiAnJzsKCSRhdXRob3IgICAgPSAoISRhdXRob3IpICAgID8gJycgOiAiIGFuZCBB

dXRob3JJRCA9ICciLmRvc2xhc2goJGF1dGhvcikuIiciOwoJJG1vbnRoICAgICA9ICghJG1v

bnRoKSAgICAgPyAnJyA6ICIgYW5kIFBvc3RlZCBsaWtlICciLmRvU2xhc2goJG1vbnRoKS4i

JSciOwoJJGlkICAgICAgICA9ICghJGlkKSAgICAgICAgPyAnJyA6ICIgYW5kIElEID0gJyIu

aW50dmFsKCRpZCkuIiciOwoJc3dpdGNoICgkdGltZSkgewoJCWNhc2UgJ2FueSc6CgkJCSR0

aW1lID0gIiI7IGJyZWFrOwoJCWNhc2UgJ2Z1dHVyZSc6CgkJCSR0aW1lID0gIiBhbmQgUG9z

dGVkID4gbm93KCkiOyBicmVhazsKCQlkZWZhdWx0OgoJCQkkdGltZSA9ICIgYW5kIFBvc3Rl

ZCA8IG5vdygpIjsKCX0KCWlmICghaXNfbnVtZXJpYygkc3RhdHVzKSkKCQkkc3RhdHVzID0g

Z2V0U3RhdHVzTnVtKCRzdGF0dXMpOwoKCSRjdXN0b20gPSAnJzsKCS8vIHRyeWluZyBjdXN0

b20gZmllbGRzIGhlcmUKCSRjdXN0b21GaWVsZHMgPSBnZXRDdXN0b21GaWVsZHMoKTsKCWlm

ICgkY3VzdG9tRmllbGRzKSB7CgkJZm9yZWFjaCgkY3VzdG9tRmllbGRzIGFzICRjRmllbGQp

IHsKCQkJaWYgKGlzc2V0KCRhdHRzWyRjRmllbGRdKSkKCQkJCSRjdXN0b21QYWlyc1skY0Zp

ZWxkXSA9ICRhdHRzWyRjRmllbGRdOwoJCX0KCQlpZighZW1wdHkoJGN1c3RvbVBhaXJzKSkK

CQkJJGN1c3RvbSA9ICBidWlsZEN1c3RvbVNxbCgkY3VzdG9tRmllbGRzLCRjdXN0b21QYWly

cyk7CgkJZWxzZQoJCQkkY3VzdG9tID0gJyc7Cgl9CgoJLy9BbGxvdyBrZXl3b3JkcyBmb3Ig

bm8tY3VzdG9tIGFydGljbGVzLiBUaGF0IHRhZ2dpbmcgbW9kZSwgeW91IGtub3cKCWlmICgk

a2V5d29yZHMpIHsKCQkka2V5cyA9IGRvU2xhc2goYXJyYXlfbWFwKCd0cmltJywgc3BsaXQo

JywnLCAka2V5d29yZHMpKSk7CgkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewoJCQkka2V5

cGFydHNbXSA9ICJGSU5EX0lOX1NFVCgnIi4ka2V5LiInLEtleXdvcmRzKSI7CgkJfQoJCSRr

ZXl3b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9yICcsJGtleXBhcnRzKSAuICIpIjsKCX0K

CglpZiAoJGlkKQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzID49ICc0JyI7CgllbHNlCgkJ

JHN0YXR1c3EgPSAiIGFuZCBTdGF0dXM9JyIuZG9TbGFzaCgkc3RhdHVzKS4iJyI7CgoJJHdo

ZXJlID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLgoJCSRpZCAuICRjYXRlZ29yeSAuICRzZWN0

aW9uIC4gJGV4Y2VycHRlZCAuICRtb250aCAuICRhdXRob3IgLiAka2V5d29yZHMgLiAkY3Vz

dG9tIC4gJGZyb250cGFnZTsKCgkJJHBnb2Zmc2V0ID0gJG9mZnNldCAuICcsICc7CgoJJHJz

ID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0

ZWQiLCAndGV4dHBhdHRlcm4nLAoJCSR3aGVyZS4gJyBvcmRlciBieSAnIC4gZG9zbGFzaCgk

c29ydGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBsaW1pdCAnIC4gZG9TbGFz

aCgkbGltaXQpKTsKCglyZXR1cm4gJHJzOwp9CgoKIjtzOjg6ImhlbHBfcmF3IjtzOjU5Mzoi

VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSAiaW50cm9kdWN0

b3J5IGFydGljbGUiOmh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3RydXRhZ3Mt

YS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4sICJyZWxlYXNlcyBwYWdlIjpodHRw

Oi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJlbGVhc2VzLCAi

ZmVhdHVyZSBsaXN0IjpodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3Ry

dXRhZ3MtZmVhdHVyZS1saXN0LCAicm9hZG1hcCI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20v

cmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwLCBhbmQgInVzYWdlIGluc3RydWN0aW9u

cyI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdl

LWluc3RydWN0aW9ucy4KCkkndmUgdGFrZW4gdGhlIGRldGFpbGVkIGhlbHAgb3V0IG9mIHRo

ZSBwbHVnaW47IG15IGFwb2xvZ2llcy4gIEl0IHdhcyB0b28gYmlnIGFuZCB0b28gZGlmZmlj

dWx0IHRvIGtlZXAgbWFpbnRhaW5pbmcgb24gbXkgc2l0ZSBhbmQgaW4gdGhlIHBsdWdpbi4i

O3M6MzoibWQ1IjtzOjMyOiI0MDdjYTA2YTJmYjg0NWVkZGJhYWUzNGFhM2YyOGRhNyI7fQ==

Last edited by jstubbs (2009-01-03 14:54:21)

Offline

#529 2009-01-03 13:53:05

christopheradams
Member
Registered: 2008-12-04
Posts: 11

Re: tru_tags: A tagging plugin for textpattern

I’m trying to use tru_tags to display search results by section, rather than in one long list.

However, I finally realized that this doesn’t work:

<txp:tru_tags_if_tag_search>
Section A matching <txp:tru_tags_tag_parameter />: <txp:tru_tags_handler section="SectionA">
Section B matching <txp:tru_tags_tag_parameter />: <txp:tru_tags_handler section="SectionB">
</txp:tru_tags_if_tag_search>

Unless the sections BOTH contain the tag being searched for. If one section does not, that call to tru_tags_handler returns a 404 error.

Is there any way to list search results by section? Or to ask tru_tags to just do nothing if it can’t match a tag for that section? I suppose that I could render the section name alongside each article, but I would rather have two separate lists.

It seems the way tru_tags_handler is implemented, I either have to show search results for only one section, or for all of them. Am I missing something?

Offline

#530 2009-01-03 14:27:49

els
Admin
From: The Netherlands
Registered: 2004-06-06
Posts: 7,458

Re: tru_tags: A tagging plugin for textpattern

jstubbs wrote:

Here you go:

Jonathan, the code you posted seems to have the same problem as I had a while ago while trying to post the MLP strings, if someone copies that it won’t work. See here how to solve it.

Last edited by els (2009-01-03 14:29:24)

Offline

Board footer

Powered by FluxBB