# Name: rah_flat v0.3.0 # Edit templates as flat files # Author: Jukka Svahn # URL: http://rahforum.biz # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the "Install plugin" box: # ..................................................................... YToxNDp7czo0OiJuYW1lIjtzOjg6InJhaF9mbGF0IjtzOjc6InZlcnNpb24iO3M6NToiMC4z LjAiO3M6NjoiYXV0aG9yIjtzOjExOiJKdWtrYSBTdmFobiI7czoxMDoiYXV0aG9yX3VyaSI7 czoxOToiaHR0cDovL3JhaGZvcnVtLmJpeiI7czoxMToiZGVzY3JpcHRpb24iO3M6Mjg6IkVk aXQgdGVtcGxhdGVzIGFzIGZsYXQgZmlsZXMiO3M6NDoiaGVscCI7czowOiIiO3M6NDoiY29k ZSI7czoyNTMyNjoiCgovKgogKiByYWhfZmxhdCAtIEZsYXQgdGVtcGxhdGVzIGZvciBUZXh0 cGF0dGVybiBDTVMKICogaHR0cHM6Ly9naXRodWIuY29tL2dvY29tL3JhaF9mbGF0CiAqCiAq IENvcHlyaWdodCAoQykgMjAxNCBKdWtrYSBTdmFobgogKgogKiBUaGlzIGZpbGUgaXMgcGFy dCBvZiByYWhfZmxhdC4KICoKICogcmFoX2ZsYXQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCiAqCiAqIHJhaF9mbGF0 IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAq IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHJhaF9mbGF0 LiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqLwoKLyoq CiAqIFRlbXBsYXRlIGl0ZXJhdG9yLgogKgogKiBUaGlzIGNsYXNzIGl0ZXJhdGVzIG92ZXIg dGVtcGxhdGUgZmlsZXMuCiAqCiAqIDxjb2RlPgogKiAkdGVtcGxhdGUgPSBuZXcgUmFoX0Zs YXRfVGVtcGxhdGVJdGVyYXRvcigpOwogKiB3aGlsZSAoJHRlbXBsYXRlLT52YWxpZCgpKSB7 CiAqICAkdGVtcGxhdGUtPmdldFRlbXBsYXRlTmFtZSgpOwogKiAgJHRlbXBsYXRlLT5nZXRU ZW1wbGF0ZUNvbnRlbnRzKCk7CiAqIH0KICogPC9jb2RlPgogKgogKiBAc2VlIERpcmVjdG9y eUl0ZXJhdG9yCiAqLwoKY2xhc3MgUmFoX0ZsYXRfVGVtcGxhdGVJdGVyYXRvciBleHRlbmRz IERpcmVjdG9yeUl0ZXJhdG9yCnsKICAgIC8qKgogICAgICogVGVtcGxhdGUgbmFtZSBwYXR0 ZXJuLgogICAgICoKICAgICAqIFRoaXMgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gaXMg dXNlZCB0bwogICAgICogdmFsaWRhdGUgdGVtcGxhdGUgZmlsZW5hbWVzLgogICAgICoKICAg ICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KCiAgICBwcm90ZWN0ZWQgJHRlbXBsYXRlTmFtZVBh dHRlcm4gPSAnL1thLXpdW2EtejAtOV9cLVwuXXsxLDYzfVwuW2EtejAtOV0rL2knOwoKICAg IC8qKgogICAgICogR2V0cyB0aGUgdGVtcGxhdGUgY29udGVudHMuCiAgICAgKgogICAgICog QHRocm93cyBFeGNlcHRpb24KICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUZW1w bGF0ZUNvbnRlbnRzKCkKICAgIHsKICAgICAgICBpZiAoKCRjb250ZW50cyA9IGZpbGVfZ2V0 X2NvbnRlbnRzKCR0aGlzLT5nZXRQYXRobmFtZSgpKSkgIT09IGZhbHNlKSB7CiAgICAgICAg ICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9bXHJ8XG5dKyQvJywgJycsICRjb250ZW50cyk7 CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbmFibGUgdG8gcmVh ZC4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgSlNPTiBmaWxlIGNvbnRlbnRzIGFz IGFuIG9iamVjdC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0ZENsYXNzCiAgICAgKiBAdGhy b3dzIEV4Y2VwdGlvbgogICAgICovCgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRlbXBsYXRl SlNPTkNvbnRlbnRzKCkKICAgIHsKICAgICAgICBpZiAoKCRmaWxlID0gJHRoaXMtPmdldFRl bXBsYXRlQ29udGVudHMoKSkgJiYgJGZpbGUgPSBAanNvbl9kZWNvZGUoJGZpbGUpKSB7CiAg ICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBF eGNlcHRpb24oJ0ludmFsaWQgSlNPTiBmaWxlLicpOwogICAgfQoKICAgIC8qKgogICAgICog R2V0cyB0aGUgdGVtcGxhdGUgbmFtZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwog ICAgICovCgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRlbXBsYXRlTmFtZSgpCiAgICB7CiAg ICAgICAgcmV0dXJuIHBhdGhpbmZvKCR0aGlzLT5nZXRGaWxlbmFtZSgpLCBQQVRISU5GT19G SUxFTkFNRSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBWYWxpZGF0ZXMgYSB0ZW1wbGF0ZSBm aWxlIG5hbWUgYW5kIHN0YXRzLgogICAgICoKICAgICAqIFRlbXBsYXRlIGZpbGUgbXVzdCBi ZSBhIHJlZ3VsYXIgZmlsZSBvciBzeW1ib2xpYyBsaW5rcywKICAgICAqIHJlYWRhYmxlIGFu ZCB0aGUgbmFtZSBtdXN0IGJlIGZld2VyIHRoYW4gNjQgY2hhcmFjdGVycyBsb25nLAogICAg ICogc3RhcnQgd2l0aCBhbiBBU0NJSSBjaGFyYWN0ZXIsIGZvbGxvd2VkIGJ5IEEteiwgMC05 LCAtLCBfIGFuZAogICAgICogYW5kIGVuZHMgdG8gYSBmaWxlIGV4dGVuc2lvbi4KICAgICAq CiAgICAgKiBWYWxpZCB0ZW1wbGF0ZSBuYW1lIHdvdWxkIGluY2x1ZGU6CiAgICAgKgogICAg ICogPGNvZGU+CiAgICAgKiBzaXRlbmFtZS5qc29uCiAgICAgKiBkZWZhdWx0LmFydGljbGUu dHhwCiAgICAgKiBmb3JtLm5hbWUubWlzYy50eHAKICAgICAqIGRlZmF1bHQudHhwCiAgICAg KiBlcnJvcl9kZWZhdWx0Lmh0bWwKICAgICAqIDwvY29kZT4KICAgICAqCiAgICAgKiBCdXQg dGhlIGZvbGxvd2luZyB3b3VsZCBiZSBpbnZhbGlkOgogICAgICoKICAgICAqIDxjb2RlPgog ICAgICogLnNpdGVuYW1lCiAgICAgKiBfZm9ybS5taXNjLnR4cAogICAgICogPC9jb2RlPgog ICAgICoKICAgICAqIEByZXR1cm4gYm9vbCBUUlVFIGlmIHRoZSBuYW1lIGlzIHZhbGlkCiAg ICAgKi8KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZFRlbXBsYXRlKCkKICAgIHsKICAg ICAgICBpZiAoISR0aGlzLT5pc0RvdCgpICYmICR0aGlzLT5pc1JlYWRhYmxlKCkgJiYgKCR0 aGlzLT5pc0ZpbGUoKSB8fCAkdGhpcy0+aXNMaW5rKCkpKSB7CiAgICAgICAgICAgIHJldHVy biAoYm9vbCkgcHJlZ19tYXRjaCgkdGhpcy0+dGVtcGxhdGVOYW1lUGF0dGVybiwgJHRoaXMt PmdldEZpbGVuYW1lKCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAg fQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCgogICAgcHVibGljIGZ1 bmN0aW9uIHZhbGlkKCkKICAgIHsKICAgICAgICB3aGlsZSAocGFyZW50Ojp2YWxpZCgpICYm ICEkdGhpcy0+aXNWYWxpZFRlbXBsYXRlKCkpIHsKICAgICAgICAgICAgJHRoaXMtPm5leHQo KTsKICAgICAgICB9CgogICAgICAgIGlmIChwYXJlbnQ6OnZhbGlkKCkpIHsKICAgICAgICAg ICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cmV3aW5kKCk7CiAg ICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CgoKCi8qCiAqIHJhaF9mbGF0IC0gRmxhdCB0 ZW1wbGF0ZXMgZm9yIFRleHRwYXR0ZXJuIENNUwogKiBodHRwczovL2dpdGh1Yi5jb20vZ29j b20vcmFoX2ZsYXQKICoKICogQ29weXJpZ2h0IChDKSAyMDE0IEp1a2thIFN2YWhuCiAqCiAq IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJhaF9mbGF0LgogKgogKiByYWhfZmxhdCBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICog YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24g Mi4KICoKICogcmFoX2ZsYXQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFs b25nIHdpdGggcmFoX2ZsYXQuIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGlj ZW5zZXMvPi4KICovCgovKioKICogRm9ybSBwYXJ0aWFsIGl0ZXJhdG9yLgogKgogKiBAc2Vl IERpcmVjdG9yeUl0ZXJhdG9yCiAqLwoKY2xhc3MgUmFoX0ZsYXRfRm9ybUl0ZXJhdG9yIGV4 dGVuZHMgUmFoX0ZsYXRfVGVtcGxhdGVJdGVyYXRvcgp7CiAgICAvKioKICAgICAqIHtAaW5o ZXJpdGRvY30KICAgICAqLwoKICAgIHByb3RlY3RlZCAkdGVtcGxhdGVOYW1lUGF0dGVybiA9 ICcvW2Etel1bYS16MC05X1wtXC5dezEsNjN9XC5bYS16MC05XXsxLDI4fVwuW2EtejAtOV0r L2knOwoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCgogICAgcHVibGlj IGZ1bmN0aW9uIGdldFRlbXBsYXRlTmFtZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIHBhdGhp bmZvKHBhdGhpbmZvKCR0aGlzLT5nZXRGaWxlbmFtZSgpLCBQQVRISU5GT19GSUxFTkFNRSks IFBBVEhJTkZPX0ZJTEVOQU1FKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgdGhlIHRl bXBsYXRlIHR5cGUuCiAgICAgKgogICAgICogSWYgdGhlIHRlbXBsYXRlIG5hbWUgZG9lc24n dCBzcGVjaWZ5IGEgdHlwZSwgaXQKICAgICAqIGRlZmF1bHRzIHRvICdtaXNjJy4gVGhlIHNl Y29uZCB0byBsYXN0IGV4dGVuc2lvbgogICAgICogaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIHR5 cGUuCiAgICAgKgogICAgICogSWYgdGhlIGZpbGUgaXMgbmFtZWQgYXM6CiAgICAgKgogICAg ICogPGNvZGU+CiAgICAgKiBmaWxlbmFtZS5yZWQuZXh0CiAgICAgKiA8L2NvZGU+CiAgICAg KgogICAgICogVGhlICdyZWQnIHdvdWxkIGJlIHVzZWQgYXMgdGhlIHR5cGUuCiAgICAgKgog ICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRU ZW1wbGF0ZVR5cGUoKQogICAgewogICAgICAgIGlmICgkdHlwZSA9IHBhdGhpbmZvKHBhdGhp bmZvKCR0aGlzLT5nZXRGaWxlbmFtZSgpLCBQQVRISU5GT19GSUxFTkFNRSksIFBBVEhJTkZP X0VYVEVOU0lPTikpIHsKICAgICAgICAgICAgcmV0dXJuICR0eXBlOwogICAgICAgIH0KCiAg ICAgICAgcmV0dXJuICdtaXNjJzsKICAgIH0KfQoKCgovKgogKiByYWhfZmxhdCAtIEZsYXQg dGVtcGxhdGVzIGZvciBUZXh0cGF0dGVybiBDTVMKICogaHR0cHM6Ly9naXRodWIuY29tL2dv Y29tL3JhaF9mbGF0CiAqCiAqIENvcHlyaWdodCAoQykgMjAxNCBKdWtrYSBTdmFobgogKgog KiBUaGlzIGZpbGUgaXMgcGFydCBvZiByYWhfZmxhdC4KICoKICogcmFoX2ZsYXQgaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAq IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9u IDIuCiAqCiAqIHJhaF9mbGF0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBh bG9uZyB3aXRoIHJhaF9mbGF0LiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xp Y2Vuc2VzLz4uCiAqLwoKLyoqCiAqIEludGVyZmFjZSBmb3IgaW1wb3J0IGRlZmluaXRpb25z LgogKgogKiA8Y29kZT4KICogY2xhc3MgQWJjX0ltcG9ydF9EZWZpbml0aW9uIGltcGxlbWVu dHMgUmFoX0ZsYXRfSW1wb3J0X0ltcG9ydEludGVyZmFjZQogKiB7CiAqIH0KICogPC9jb2Rl PgogKi8KCmludGVyZmFjZSBSYWhfRmxhdF9JbXBvcnRfSW1wb3J0SW50ZXJmYWNlCnsKICAg IC8qKgogICAgICogQ29uc3RydWN0b3IuCiAgICAgKgogICAgICogUmVnaXN0ZXJzIHRoZSBp bXBvcnRlciBkZWZpbml0aW9uIHdoZW4gdGhlIGNsYXNzIGlzIGluaXRpYWxpemVkLgogICAg ICogVGhlIHVzZWQgZXZlbnQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHJpdmF0ZSBhbmQgc2hv dWxkIG5vdAogICAgICogYmUgYWNjZXNzZWQgbWFudWFsbHkuCiAgICAgKgogICAgICogPGNv ZGU+CiAgICAgKiBuZXcgUmFoX0ZsYXRfSW1wb3J0X0Zvcm1zKCdmb3JtcycpOwogICAgICog PC9jb2RlPgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpcmVjdG9yeSBUaGUgZGly ZWN0b3J5IGhvc3RpbmcgdGhlIHRlbXBsYXRlcwogICAgICovCgogICAgcHVibGljIGZ1bmN0 aW9uIF9fY29uc3RydWN0KCRkaXJlY3RvcnkpOwoKICAgIC8qKgogICAgICogSW5pdGlhbGl6 ZXMgdGhlIGltcG9ydGVyLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3 aGVuIHRoZSBpbXBvcnQgZXZlbnQgaXMgZXhlY3V0ZWQuCiAgICAgKgogICAgICogQHRocm93 cyBFeGNlcHRpb24KICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBpbml0KCk7CgogICAg LyoqCiAgICAgKiBEcm9wcyBwZXJtaXNzaW9ucyB0byB0aGUgcGFuZWwuCiAgICAgKgogICAg ICogVGhpcyBtYWtlcyBzdXJlIHRoZSB0ZW1wbGF0ZSBpdGVtcyBhcmUgbm90CiAgICAgKiBt b2RpZmllZCB0aHJvdWdoIHRoZSBHVUkuCiAgICAgKgogICAgICogVGhpcyBtZXRob2Qgb25s eSBhZmZlY3RzIHRoZSBhZG1pbi1zaWRlIGludGVyZmFjZSBhbmQgZG9lc24ndAogICAgICog dHJ1bHkgcmVzZXQgcGVybWlzc2lvbnMgYXBwbGljYXRpb24gd2lkZS4gVGhpcyBpcyB0bwog ICAgICogYXZvaWQgdW5uZWNjZXNzYXJ5IEkvTyBhY3Rpdml0eSB0aGF0IHdvdWxkIG90aGVy d2lzZSBoYXZlIHRvCiAgICAgKiB0YWtlIHBsYWNlLgogICAgICovCgogICAgcHVibGljIGZ1 bmN0aW9uIGRyb3BQZXJtaXNzaW9ucygpOwoKICAgIC8qKgogICAgICogRHJvcHMgcmVtb3Zl ZCB0ZW1wbGF0ZSByb3dzIGZyb20gdGhlIGRhdGFiYXNlLgogICAgICoKICAgICAqIEZvciBt b3N0IGltcGxldGF0aW9ucyB0aGlzIG1ldGhvZCByZW1vdmVzIGFsbCByb3dzIHRoYXQgYXJl bid0CiAgICAgKiBwcmVzZW50IGluIHRoZSBmbGF0IGRpcmVjdG9yeSwgYnV0IGZvciBzb21l IGl0IG1pZ2h0CiAgICAgKiBub3QgZG8gYW55dGhpbmcuCiAgICAgKgogICAgICogQHRocm93 cyBFeGNlcHRpb24KICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBkcm9wUmVtb3ZlZChS YWhfRmxhdF9UZW1wbGF0ZUl0ZXJhdG9yICR0ZW1wbGF0ZSk7CgogICAgLyoqCiAgICAgKiBH ZXRzIHRoZSBwYW5lbCBuYW1lLgogICAgICoKICAgICAqIFRoZSBwYW5lbCBuYW1lIGlzIHVz ZWQgdG8gcmVjb2duaXplIHRoZSBjb250ZW50LXR5cGVzCiAgICAgKiByZWdpc3RlcmVkIGV2 ZW50IGFuZCByZW1vdmUgYWNjZXNzIHRvIGl0LgogICAgICoKICAgICAqIEByZXR1cm4gc3Ry aW5nCiAgICAgKi8KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGFuZWxOYW1lKCk7CgogICAg LyoqCiAgICAgKiBHZXRzIGRhdGFiYXNlIHRhYmxlIG5hbWUuCiAgICAgKgogICAgICogQHJl dHVybiBzdHJpbmcKICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUYWJsZU5hbWUo KTsKCiAgICAvKioKICAgICAqIEltcG9ydHMgdGhlIHRlbXBsYXRlIGZpbGUuCiAgICAgKgog ICAgICogVGhpcyBtZXRob2QgZXhlY3V0ZXMgdGhlIFNRTCBzdGF0ZW1lbnQgdG8gaW1wb3J0 CiAgICAgKiB0aGUgdGVtcGxhdGUgZmlsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gIFJhaF9G bGF0X1RlbXBsYXRlSXRlcmF0b3IgJGZpbGUgVGhlIHRlbXBsYXRlIGZpbGUKICAgICAqIEB0 aHJvd3MgRXhjZXB0aW9uCiAgICAgKi8KCiAgICBwdWJsaWMgZnVuY3Rpb24gaW1wb3J0VGVt cGxhdGUoUmFoX0ZsYXRfVGVtcGxhdGVJdGVyYXRvciAkZmlsZSk7CgogICAgLyoqCiAgICAg KiBHZXRzIGFuIGFycmF5IG9mIGRhdGFiYXNlIGNvbHVtbnMgaW4gdGhlIHRhYmxlLgogICAg ICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBn ZXRUYWJsZUNvbHVtbnMoKTsKCiAgICAvKioKICAgICAqIEdldHMgYSBwYXRoIHRvIHRoZSBk aXJlY3RvcnkgaG9zdGluZyB0aGUgZmxhdCBmaWxlcy4KICAgICAqCiAgICAgKiBAcmV0dXJu IHN0cmluZ3xib29sIFRoZSBwYXRoLCBvciBGQUxTRQogICAgICovCgogICAgcHVibGljIGZ1 bmN0aW9uIGdldERpcmVjdG9yeVBhdGgoKTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhl IGNvbnRlbnQtdHlwZSBpcyBlbmFibGVkIGFuZCBoYXMgYSBkaXJlY3RvcnkuCiAgICAgKgog ICAgICogQHJldHVybiBib29sIFRSVUUgaWYgaXRzIGVuYWJsZWQsIEZBTFNFIG90aGVyd2lz ZQogICAgICovCgogICAgcHVibGljIGZ1bmN0aW9uIGlzRW5hYmxlZCgpOwp9CgoKCi8qCiAq IHJhaF9mbGF0IC0gRmxhdCB0ZW1wbGF0ZXMgZm9yIFRleHRwYXR0ZXJuIENNUwogKiBodHRw czovL2dpdGh1Yi5jb20vZ29jb20vcmFoX2ZsYXQKICoKICogQ29weXJpZ2h0IChDKSAyMDE0 IEp1a2thIFN2YWhuCiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJhaF9mbGF0LgogKgog KiByYWhfZmxhdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24sIHZlcnNpb24gMi4KICoKICogcmFoX2ZsYXQgaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hB TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhl CiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAq IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggcmFoX2ZsYXQuIElmIG5vdCwgc2VlIDxodHRw Oi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICovCgovKioKICogQmFzZSBjbGFzcyBmb3Ig aW1wb3J0IGRlZmluaXRpb25zLgogKgogKiBUbyBjcmVhdGUgYSBuZXcgaW1wb3J0YWJsZSB0 ZW1wbGF0ZSBvYmplY3QsIGV4dGVuZAogKiB0aGlzIGNsYXNzIG9yIGl0cyB0aGVyaWF0aXZl cy4KICoKICogRm9yIGluc3RhbmNlIHRoZSBmb2xsb3dpbmcgd291bGQgY3JlYXRlIGEgbmV3 IGltcG9ydAogKiBkZWZpbml0aW9uIHVzaW5nIHRoZSBSYWhfRmxhdF9JbXBvcnRfUGFnZXMg YXMgdGhlCiAqIGJhc2U6CiAqCiAqIDxjb2RlPgogKiBjbGFzcyBBYmNfTXlfSW1wb3J0X0Rl ZmluaXRpb24gZXh0ZW5kcyBSYWhfRmxhdF9JbXBvcnRfUGFnZXMKICogewogKiAgICAgcHVi bGljIGZ1bmN0aW9uIGdldFBhbmVsTmFtZSgpCiAqICAgICB7CiAqICAgICAgICAgcmV0dXJu ICdhYmNfbXlwYW5lbCc7CiAqICAgICB9CiAqICAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VGFi bGVOYW1lKCkKICogICAgIHsKICogICAgICAgICByZXR1cm4gJ2FiY19teXRhYmxlJzsKICog ICAgIH0KICogfQogKiA8L2NvZGU+CiAqCiAqIEl0IHdvdWxkIGF1dG9tYXRpY2FsbHkgZGlz YWJsZSBhY2Nlc3MgdG8gJ2FiY19teXBhbmVsJyBhZG1pbi1zaWRlIHBhbmVsCiAqIGFuZCBp bXBvcnQgaXRlbXMgdG8gJ2FiY19teXRhYmxlJyBkYXRhYmFzZSB0YWJsZSwgY29uc2lzdGlu ZyBvZiAnbmFtZScKICogYW5kICd1c2VyX2h0bWwnIGNvbHVtbnMsIGFzIHdpdGggcGFnZSB0 ZW1wbGF0ZXMgYW5kIGl0cyB0eHBfcGFnZSB0YWJsZS4KICoKICogVG8gaW5pdGlhbGl6ZSB0 aGUgaW1wb3J0LCBqdXN0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuIFBh c3MKICogY29uc3RydWN0b3IgdGhlIGRpcmVjdG9yeSBuYW1lIHRoZSB0ZW1wbGF0ZXMgcmVz aWRlIGluIHRoZSBjb25maWd1cmVkCiAqIHRlbXBsYXRlcyBkaXJlY3RvcnkuCiAqCiAqIDxj b2RlPgogKiBuZXcgQWJjX015X0ltcG9ydF9EZWZpbml0aW9uKCdhYmNfbXlkaXJlY3Rvcnkn KTsKICogPC9jb2RlPgogKi8KCmFic3RyYWN0IGNsYXNzIFJhaF9GbGF0X0ltcG9ydF9CYXNl IGltcGxlbWVudHMgUmFoX0ZsYXRfSW1wb3J0X0ltcG9ydEludGVyZmFjZQp7CiAgICAvKioK ICAgICAqIFRoZSBkaXJlY3RvcnkuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAq LwoKICAgIHByb3RlY3RlZCAkZGlyZWN0b3J5OwoKICAgIC8qKgogICAgICogQW4gYXJyYXkg b2YgZGF0YWJhc2UgdGFibGUgY29sdW1ucy4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAg ICAgKi8KCiAgICBwcml2YXRlICRjb2x1bW5zID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAq IHtAaW5oZXJpdGRvY30KICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVj dCgkZGlyZWN0b3J5KQogICAgewogICAgICAgICR0aGlzLT5kaXJlY3RvcnkgPSAkZGlyZWN0 b3J5OwogICAgICAgIHJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5KCR0aGlzLCAnaW5pdCcpLCAn cmFoX2ZsYXQuaW1wb3J0X3RvX2RhdGFiYXNlJyk7CiAgICAgICAgJHRoaXMtPmRyb3BQZXJt aXNzaW9ucygpOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICov CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRlbXBsYXRlSXRlcmF0b3IoJGRpcmVjdG9yeSkK ICAgIHsKICAgICAgICByZXR1cm4gbmV3IFJhaF9GbGF0X1RlbXBsYXRlSXRlcmF0b3IoJGRp cmVjdG9yeSk7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8K CiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGlyZWN0b3J5UGF0aCgpCiAgICB7CiAgICAgICAg aWYgKCR0aGlzLT5kaXJlY3RvcnkgJiYgKCRkaXJlY3RvcnkgPSBnZXRfcHJlZigncmFoX2Zs YXRfcGF0aCcpKSkgewogICAgICAgICAgICAkZGlyZWN0b3J5ID0gdHhwYXRoIC4gJy8nIC4g JGRpcmVjdG9yeSAuICcvJyAuICR0aGlzLT5kaXJlY3Rvcnk7CiAgICAgICAgICAgIHJldHVy biAkZGlyZWN0b3J5OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoK ICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCgogICAgcHVibGljIGZ1bmN0 aW9uIGlzRW5hYmxlZCgpCiAgICB7CiAgICAgICAgaWYgKCRkaXJlY3RvcnkgPSAkdGhpcy0+ Z2V0RGlyZWN0b3J5UGF0aCgpKSB7CiAgICAgICAgICAgIHJldHVybiBmaWxlX2V4aXN0cygk ZGlyZWN0b3J5KSAmJiBpc19kaXIoJGRpcmVjdG9yeSkgJiYgaXNfcmVhZGFibGUoJGRpcmVj dG9yeSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoq CiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5p dCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewogICAgICAgICAg ICAkdGVtcGxhdGUgPSAkdGhpcy0+Z2V0VGVtcGxhdGVJdGVyYXRvcigkdGhpcy0+Z2V0RGly ZWN0b3J5UGF0aCgpKTsKCiAgICAgICAgICAgIHdoaWxlICgkdGVtcGxhdGUtPnZhbGlkKCkp IHsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+aW1wb3J0VGVtcGxhdGUoJHRlbXBsYXRl KSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9u KCdVbmFibGUgdG8gaW1wb3J0ICcgLiAkdGVtcGxhdGUtPmdldFRlbXBsYXRlTmFtZSgpKTsK ICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGVtcGxhdGUtPm5leHQoKTsK ICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmRyb3BSZW1vdmVkKCR0ZW1wbGF0 ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAg ICovCgogICAgcHVibGljIGZ1bmN0aW9uIGRyb3BQZXJtaXNzaW9ucygpCiAgICB7CiAgICAg ICAgaWYgKHR4cGludGVyZmFjZSA9PT0gJ2FkbWluJyAmJiAkdGhpcy0+aXNFbmFibGVkKCkp IHsKICAgICAgICAgICAgdW5zZXQoJEdMT0JBTFNbJ3R4cF9wZXJtaXNzaW9ucyddWyR0aGlz LT5nZXRQYW5lbE5hbWUoKV0pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIHtA aW5oZXJpdGRvY30KICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUYWJsZUNvbHVt bnMoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmNvbHVtbnMpIHsKICAgICAgICAgICAg JHRoaXMtPmNvbHVtbnMgPSBkb0FycmF5KChhcnJheSkgQGdldFRoaW5ncygnZGVzY3JpYmUg Jy5zYWZlX3BmeCgkdGhpcy0+Z2V0VGFibGVOYW1lKCkpKSwgJ3N0cnRvbG93ZXInKTsKICAg ICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+Y29sdW1uczsKICAgIH0KfQoKCgovKgog KiByYWhfZmxhdCAtIEZsYXQgdGVtcGxhdGVzIGZvciBUZXh0cGF0dGVybiBDTVMKICogaHR0 cHM6Ly9naXRodWIuY29tL2dvY29tL3JhaF9mbGF0CiAqCiAqIENvcHlyaWdodCAoQykgMjAx NCBKdWtrYSBTdmFobgogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiByYWhfZmxhdC4KICoK ICogcmFoX2ZsYXQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLCB2ZXJzaW9uIDIuCiAqCiAqIHJhaF9mbGF0IGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRo ZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgog KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHJhaF9mbGF0LiBJZiBub3QsIHNlZSA8aHR0 cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqLwoKLyoqCiAqIEltcG9ydHMgcGFnZSB0 ZW1wbGF0ZXMuCiAqLwoKY2xhc3MgUmFoX0ZsYXRfSW1wb3J0X1BhZ2VzIGV4dGVuZHMgUmFo X0ZsYXRfSW1wb3J0X0Jhc2UKewogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAg Ki8KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGFuZWxOYW1lKCkKICAgIHsKICAgICAgICBy ZXR1cm4gJ3BhZ2UnOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAg ICovCgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRhYmxlTmFtZSgpCiAgICB7CiAgICAgICAg cmV0dXJuICd0eHBfcGFnZSc7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9 CiAgICAgKi8KCiAgICBwdWJsaWMgZnVuY3Rpb24gaW1wb3J0VGVtcGxhdGUoUmFoX0ZsYXRf VGVtcGxhdGVJdGVyYXRvciAkZmlsZSkKICAgIHsKICAgICAgICBzYWZlX3Vwc2VydCgKICAg ICAgICAgICAgJHRoaXMtPmdldFRhYmxlTmFtZSgpLAogICAgICAgICAgICAidXNlcl9odG1s ID0gJyIuZG9TbGFzaCgkZmlsZS0+Z2V0VGVtcGxhdGVDb250ZW50cygpKS4iJyIsCiAgICAg ICAgICAgICJuYW1lID0gJyIuZG9TbGFzaCgkZmlsZS0+Z2V0VGVtcGxhdGVOYW1lKCkpLiIn IgogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAg Ki8KCiAgICBwdWJsaWMgZnVuY3Rpb24gZHJvcFJlbW92ZWQoUmFoX0ZsYXRfVGVtcGxhdGVJ dGVyYXRvciAkdGVtcGxhdGUpCiAgICB7CiAgICAgICAgJG5hbWUgPSBhcnJheSgpOwoKICAg ICAgICB3aGlsZSAoJHRlbXBsYXRlLT52YWxpZCgpKSB7CiAgICAgICAgICAgICRuYW1lW10g PSAiJyIuZG9TbGFzaCgkdGVtcGxhdGUtPmdldFRlbXBsYXRlTmFtZSgpKS4iJyI7CiAgICAg ICAgICAgICR0ZW1wbGF0ZS0+bmV4dCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuYW1l KSB7CiAgICAgICAgICAgIHNhZmVfZGVsZXRlKCR0aGlzLT5nZXRUYWJsZU5hbWUoKSwgJ25h bWUgbm90IGluICgnLmltcGxvZGUoJywnLCAkbmFtZSkuJyknKTsKICAgICAgICB9IGVsc2Ug ewogICAgICAgICAgICBzYWZlX2RlbGV0ZSgkdGhpcy0+Z2V0VGFibGVOYW1lKCksICcxID0g MScpOwogICAgICAgIH0KICAgIH0KfQoKCgovKgogKiByYWhfZmxhdCAtIEZsYXQgdGVtcGxh dGVzIGZvciBUZXh0cGF0dGVybiBDTVMKICogaHR0cHM6Ly9naXRodWIuY29tL2dvY29tL3Jh aF9mbGF0CiAqCiAqIENvcHlyaWdodCAoQykgMjAxNCBKdWtrYSBTdmFobgogKgogKiBUaGlz IGZpbGUgaXMgcGFydCBvZiByYWhfZmxhdC4KICoKICogcmFoX2ZsYXQgaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCiAq CiAqIHJhaF9mbGF0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3 aXRoIHJhaF9mbGF0LiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2Vz Lz4uCiAqLwoKLyoqCiAqIEltcG9ydHMgZm9ybSBwYXJ0aWFscy4KICovCgpjbGFzcyBSYWhf RmxhdF9JbXBvcnRfRm9ybXMgZXh0ZW5kcyBSYWhfRmxhdF9JbXBvcnRfUGFnZXMKewogICAg LyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KCiAgICBwdWJsaWMgZnVuY3Rpb24g Z2V0UGFuZWxOYW1lKCkKICAgIHsKICAgICAgICByZXR1cm4gJ2Zvcm0nOwogICAgfQoKICAg IC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCgogICAgcHVibGljIGZ1bmN0aW9u IGdldFRhYmxlTmFtZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICd0eHBfZm9ybSc7CiAgICB9 CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KCiAgICBwdWJsaWMgZnVu Y3Rpb24gZ2V0VGVtcGxhdGVJdGVyYXRvcigkZGlyZWN0b3J5KQogICAgewogICAgICAgIHJl dHVybiBuZXcgUmFoX0ZsYXRfRm9ybUl0ZXJhdG9yKCRkaXJlY3RvcnkpOwogICAgfQoKICAg IC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCgogICAgcHVibGljIGZ1bmN0aW9u IGltcG9ydFRlbXBsYXRlKFJhaF9GbGF0X1RlbXBsYXRlSXRlcmF0b3IgJGZpbGUpCiAgICB7 CiAgICAgICAgc2FmZV91cHNlcnQoCiAgICAgICAgICAgICR0aGlzLT5nZXRUYWJsZU5hbWUo KSwKICAgICAgICAgICAgIkZvcm0gPSAnIi5kb1NsYXNoKCRmaWxlLT5nZXRUZW1wbGF0ZUNv bnRlbnRzKCkpLiInLAogICAgICAgICAgICB0eXBlID0gJyIuZG9TbGFzaCgkZmlsZS0+Z2V0 VGVtcGxhdGVUeXBlKCkpLiInIiwKICAgICAgICAgICAgIm5hbWUgPSAnIi5kb1NsYXNoKCRm aWxlLT5nZXRUZW1wbGF0ZU5hbWUoKSkuIiciCiAgICAgICAgKTsKICAgIH0KfQoKCgovKgog KiByYWhfZmxhdCAtIEZsYXQgdGVtcGxhdGVzIGZvciBUZXh0cGF0dGVybiBDTVMKICogaHR0 cHM6Ly9naXRodWIuY29tL2dvY29tL3JhaF9mbGF0CiAqCiAqIENvcHlyaWdodCAoQykgMjAx NCBKdWtrYSBTdmFobgogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiByYWhfZmxhdC4KICoK ICogcmFoX2ZsYXQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLCB2ZXJzaW9uIDIuCiAqCiAqIHJhaF9mbGF0IGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRo ZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgog KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHJhaF9mbGF0LiBJZiBub3QsIHNlZSA8aHR0 cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqLwoKLyoqCiAqIEltcG9ydHMgc2VjdGlv bnMuCiAqLwoKY2xhc3MgUmFoX0ZsYXRfSW1wb3J0X1NlY3Rpb25zIGV4dGVuZHMgUmFoX0Zs YXRfSW1wb3J0X1BhZ2VzCnsKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICov CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFBhbmVsTmFtZSgpCiAgICB7CiAgICAgICAgcmV0 dXJuICdzZWN0aW9uJzsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAg ICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUYWJsZU5hbWUoKQogICAgewogICAgICAg IHJldHVybiAndHhwX3NlY3Rpb24nOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0 ZG9jfQogICAgICovCgogICAgcHVibGljIGZ1bmN0aW9uIGltcG9ydFRlbXBsYXRlKFJhaF9G bGF0X1RlbXBsYXRlSXRlcmF0b3IgJGZpbGUpCiAgICB7CiAgICAgICAgJHNxbCA9IGFycmF5 KCk7CiAgICAgICAgJHdoZXJlID0gIm5hbWUgPSAnIi5kb1NsYXNoKCRmaWxlLT5nZXRUZW1w bGF0ZU5hbWUoKSkuIiciOwoKICAgICAgICBmb3JlYWNoICgkZmlsZS0+Z2V0VGVtcGxhdGVK U09OQ29udGVudHMoKSBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICBpZiAoJGtl eSAhPT0gJ25hbWUnICYmIGluX2FycmF5KHN0cnRvbG93ZXIoKHN0cmluZykgJGtleSksICR0 aGlzLT5nZXRUYWJsZUNvbHVtbnMoKSwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICRzcWxb XSA9ICR0aGlzLT5mb3JtYXRTdGF0ZW1lbnQoJGtleSwgJHZhbHVlKTsKICAgICAgICAgICAg fQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzcWwgJiYgc2FmZV91cHNlcnQoJHRoaXMt PmdldFRhYmxlTmFtZSgpLCBpbXBsb2RlKCcsJywgJHNxbCksICR3aGVyZSk7CiAgICB9Cgog ICAgLyoqCiAgICAgKiBGb3JtYXRzIGEgU1FMIGluc2VydCBzdGF0ZW1lbnQgdmFsdWUuCiAg ICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgJGZpZWxkIFRoZSBmaWVsZAogICAgICogQHBh cmFtICBzdHJpbmcgJHZhbHVlIFRoZSB2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAg ICAqLwoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmb3JtYXRTdGF0ZW1lbnQoJGZpZWxkLCAk dmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAg ICByZXR1cm4gImB7JGZpZWxkfWAgPSBOVUxMIjsKICAgICAgICB9CgogICAgICAgIGlmIChp c19ib29sKCR2YWx1ZSkgfHwgaXNfaW50KCR2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJu ICJgeyRmaWVsZH1gID0gIi5pbnR2YWwoJHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGlm IChpc19hcnJheSgkdmFsdWUpKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IGltcGxvZGUoJywg JywgJHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiYHskZmllbGR9YCA9ICci LmRvU2xhc2goKHN0cmluZykgJHZhbHVlKS4iJyI7CiAgICB9Cn0KCgoKLyoKICogcmFoX2Zs YXQgLSBGbGF0IHRlbXBsYXRlcyBmb3IgVGV4dHBhdHRlcm4gQ01TCiAqIGh0dHBzOi8vZ2l0 aHViLmNvbS9nb2NvbS9yYWhfZmxhdAogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTQgSnVra2Eg U3ZhaG4KICoKICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcmFoX2ZsYXQuCiAqCiAqIHJhaF9m bGF0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgog KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQogKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv biwgdmVyc2lvbiAyLgogKgogKiByYWhfZmxhdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKICogR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UKICogYWxvbmcgd2l0aCByYWhfZmxhdC4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8+LgogKi8KCi8qKgogKiBJbXBvcnRzIHByZWZlcmVuY2VzLgog Ki8KCmNsYXNzIFJhaF9GbGF0X0ltcG9ydF9QcmVmcyBleHRlbmRzIFJhaF9GbGF0X0ltcG9y dF9TZWN0aW9ucwp7CiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwoKICAg IHB1YmxpYyBmdW5jdGlvbiBnZXRQYW5lbE5hbWUoKQogICAgewogICAgICAgIHJldHVybiAn cHJlZnMnOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCgog ICAgcHVibGljIGZ1bmN0aW9uIGdldFRhYmxlTmFtZSgpCiAgICB7CiAgICAgICAgcmV0dXJu ICd0eHBfcHJlZnMnOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAg ICovCgogICAgcHVibGljIGZ1bmN0aW9uIGltcG9ydFRlbXBsYXRlKFJhaF9GbGF0X1RlbXBs YXRlSXRlcmF0b3IgJGZpbGUpCiAgICB7CiAgICAgICAgJHNxbCA9IGFycmF5KCk7CiAgICAg ICAgJHdoZXJlID0gIm5hbWUgPSAnIi5kb1NsYXNoKCRmaWxlLT5nZXRUZW1wbGF0ZU5hbWUo KSkuIicgYW5kIHVzZXJfbmFtZSA9ICcnIjsKCiAgICAgICAgZm9yZWFjaCAoJGZpbGUtPmdl dFRlbXBsYXRlSlNPTkNvbnRlbnRzKCkgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAg ICAgaWYgKGluX2FycmF5KHN0cnRvbG93ZXIoKHN0cmluZykgJGtleSksICR0aGlzLT5nZXRU YWJsZUNvbHVtbnMoKSwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICRzcWxbXSA9ICR0aGlz LT5mb3JtYXRTdGF0ZW1lbnQoJGtleSwgJHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAg IH0KCiAgICAgICAgcmV0dXJuICRzcWwgJiYgc2FmZV91cGRhdGUoJHRoaXMtPmdldFRhYmxl TmFtZSgpLCBpbXBsb2RlKCcsJywgJHNxbCksICR3aGVyZSk7CiAgICB9CgogICAgLyoqCiAg ICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KCiAgICBwdWJsaWMgZnVuY3Rpb24gZHJvcFJl bW92ZWQoUmFoX0ZsYXRfVGVtcGxhdGVJdGVyYXRvciAkdGVtcGxhdGUpCiAgICB7CiAgICB9 CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KCiAgICBwdWJsaWMgZnVu Y3Rpb24gZHJvcFBlcm1pc3Npb25zKCkKICAgIHsKICAgIH0KfQoKCgovKgogKiByYWhfZmxh dCAtIEZsYXQgdGVtcGxhdGVzIGZvciBUZXh0cGF0dGVybiBDTVMKICogaHR0cHM6Ly9naXRo dWIuY29tL2dvY29tL3JhaF9mbGF0CiAqCiAqIENvcHlyaWdodCAoQykgMjAxNCBKdWtrYSBT dmFobgogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiByYWhfZmxhdC4KICoKICogcmFoX2Zs YXQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAq IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LCB2ZXJzaW9uIDIuCiAqCiAqIHJhaF9mbGF0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQogKiBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQogKiBhbG9uZyB3aXRoIHJhaF9mbGF0LiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uCiAqLwoKLyoqCiAqIEltcG9ydHMgdGVtcGxhdGUgc3R5bGVz LgogKi8KCmNsYXNzIFJhaF9GbGF0X0ltcG9ydF9TdHlsZXMgZXh0ZW5kcyBSYWhfRmxhdF9J bXBvcnRfUGFnZXMKewogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KCiAg ICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGFuZWxOYW1lKCkKICAgIHsKICAgICAgICByZXR1cm4g J2Nzcyc7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KCiAg ICBwdWJsaWMgZnVuY3Rpb24gZ2V0VGFibGVOYW1lKCkKICAgIHsKICAgICAgICByZXR1cm4g J3R4cF9jc3MnOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICov CgogICAgcHVibGljIGZ1bmN0aW9uIGltcG9ydFRlbXBsYXRlKFJhaF9GbGF0X1RlbXBsYXRl SXRlcmF0b3IgJGZpbGUpCiAgICB7CiAgICAgICAgc2FmZV91cHNlcnQoCiAgICAgICAgICAg ICR0aGlzLT5nZXRUYWJsZU5hbWUoKSwKICAgICAgICAgICAgImNzcyA9ICciLmRvU2xhc2go JGZpbGUtPmdldFRlbXBsYXRlQ29udGVudHMoKSkuIiciLAogICAgICAgICAgICAibmFtZSA9 ICciLmRvU2xhc2goJGZpbGUtPmdldFRlbXBsYXRlTmFtZSgpKS4iJyIKICAgICAgICApOwog ICAgfQp9CgoKCi8qCiAqIHJhaF9mbGF0IC0gRmxhdCB0ZW1wbGF0ZXMgZm9yIFRleHRwYXR0 ZXJuIENNUwogKiBodHRwczovL2dpdGh1Yi5jb20vZ29jb20vcmFoX2ZsYXQKICoKICogQ29w eXJpZ2h0IChDKSAyMDE0IEp1a2thIFN2YWhuCiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9m IHJhaF9mbGF0LgogKgogKiByYWhfZmxhdCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KICoKICogcmFoX2ZsYXQgaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0 IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFLiBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl IGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggcmFoX2ZsYXQuIElm IG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICovCgovKioKICog TWFpbiBwbHVnaW4gY2xhc3MuCiAqCiAqIEBpbnRlcm5hbAogKi8KCmNsYXNzIFJhaF9GbGF0 CnsKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IuCiAgICAgKi8KCiAgICBwdWJsaWMgZnVu Y3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgIGFkZF9wcml2cygncHJlZnMucmFo X2ZsYXQnLCAnMScpOwogICAgICAgIHJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5KCR0aGlzLCAn aW5zdGFsbCcpLCAncGx1Z2luX2xpZmVjeWNsZS5yYWhfZmxhdCcsICdpbnN0YWxsZWQnKTsK ICAgICAgICByZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgkdGhpcywgJ3VuaW5zdGFsbCcpLCAn cGx1Z2luX2xpZmVjeWNsZS5yYWhfZmxhdCcsICdkZWxldGVkJyk7CgogICAgICAgIGlmIChn ZXRfcHJlZigncmFoX2ZsYXRfcGF0aCcpKSB7CgogICAgICAgICAgICBuZXcgUmFoX0ZsYXRf SW1wb3J0X1ByZWZzKCdwcmVmcycpOwogICAgICAgICAgICBuZXcgUmFoX0ZsYXRfSW1wb3J0 X1NlY3Rpb25zKCdzZWN0aW9ucycpOwogICAgICAgICAgICBuZXcgUmFoX0ZsYXRfSW1wb3J0 X1BhZ2VzKCdwYWdlcycpOwogICAgICAgICAgICBuZXcgUmFoX0ZsYXRfSW1wb3J0X0Zvcm1z KCdmb3JtcycpOwogICAgICAgICAgICBuZXcgUmFoX0ZsYXRfSW1wb3J0X1N0eWxlcygnc3R5 bGVzJyk7CgogICAgICAgICAgICByZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgkdGhpcywgJ2Vu ZHBvaW50JyksICd0ZXh0cGF0dGVybicpOwogICAgICAgICAgICByZWdpc3Rlcl9jYWxsYmFj ayhhcnJheSgkdGhpcywgJ2luaXRXcml0ZScpLCAncmFoX2ZsYXQuaW1wb3J0Jyk7CgogICAg ICAgICAgICBpZiAoZ2V0X3ByZWYoJ3Byb2R1Y3Rpb25fc3RhdHVzJykgIT09ICdsaXZlJykg ewogICAgICAgICAgICAgICAgcmVnaXN0ZXJfY2FsbGJhY2soYXJyYXkoJHRoaXMsICdjYWxs YmFja0hhbmRsZXInKSwgJ3RleHRwYXR0ZXJuJyk7CiAgICAgICAgICAgICAgICByZWdpc3Rl cl9jYWxsYmFjayhhcnJheSgkdGhpcywgJ2NhbGxiYWNrSGFuZGxlcicpLCAnYWRtaW5fc2lk ZScsICdib2R5X2VuZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8q KgogICAgICogSW5zdGFsbGVyLgogICAgICovCgogICAgcHVibGljIGZ1bmN0aW9uIGluc3Rh bGwoKQogICAgewogICAgICAgICRwb3NpdGlvbiA9IDI1MDsKCiAgICAgICAgJG9wdGlvbnMg PSBhcnJheSgKICAgICAgICAgICAgJ3JhaF9mbGF0X3BhdGgnID0+IGFycmF5KCd0ZXh0X2lu cHV0JywgJy4uLy4uL3NyYy90ZW1wbGF0ZXMnKSwKICAgICAgICAgICAgJ3JhaF9mbGF0X2tl eScgID0+IGFycmF5KCd0ZXh0X2lucHV0JywgbWQ1KHVuaXFpZChtdF9yYW5kKCksIHRydWUp KSksCiAgICAgICAgKTsKCiAgICAgICAgZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG5hbWUgPT4g JHZhbCkgewogICAgICAgICAgICBpZiAoZ2V0X3ByZWYoJG5hbWUsIGZhbHNlKSA9PT0gZmFs c2UpIHsKICAgICAgICAgICAgICAgIHNldF9wcmVmKCRuYW1lLCAkdmFsWzFdLCAncmFoX2Zs YXQnLCBQUkVGX0FEVkFOQ0VELCAkdmFsWzBdLCAkcG9zaXRpb24pOwogICAgICAgICAgICB9 CgogICAgICAgICAgICAkcG9zaXRpb24rKzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAg ICAgKiBVbmluc3RhbGxlci4KICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiB1bmluc3Rh bGwoKQogICAgewogICAgICAgIHNhZmVfZGVsZXRlKCd0eHBfcHJlZnMnLCAibmFtZSBsaWtl ICdyYWhcX2ZsYXRcXyUnIik7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyB0 aGUgaW1wb3J0ZXJzLgogICAgICovCgogICAgcHVibGljIGZ1bmN0aW9uIGluaXRXcml0ZSgp CiAgICB7CiAgICAgICAgc2FmZV9xdWVyeSgnTE9DSyBUQUJMRVMgJy5pbXBsb2RlKCcgV1JJ VEUsICcsIGdldFRoaW5ncygnc2hvdyB0YWJsZXMnKSkuJyBXUklURScpOwogICAgICAgIGNh bGxiYWNrX2V2ZW50KCdyYWhfZmxhdC5pbXBvcnRfdG9fZGF0YWJhc2UnKTsKICAgICAgICBz YWZlX3F1ZXJ5KCdVTkxPQ0sgVEFCTEVTJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWdp c3RlcmVkIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKi8KCiAgICBwdWJsaWMgZnVuY3Rpb24g Y2FsbGJhY2tIYW5kbGVyKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjYWxs YmFja19ldmVudCgncmFoX2ZsYXQuaW1wb3J0Jyk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0 aW9uICRlKSB7CiAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoJGUtPmdldE1lc3NhZ2UoKSk7 CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogSW1wb3J0IGVuZHBvaW50LgogICAg ICovCgogICAgcHVibGljIGZ1bmN0aW9uIGVuZHBvaW50KCkKICAgIHsKICAgICAgICBpZiAo IWdldF9wcmVmKCdyYWhfZmxhdF9rZXknKSB8fCBnZXRfcHJlZigncmFoX2ZsYXRfa2V5Jykg IT09IGdwcygncmFoX2ZsYXRfa2V5JykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAg IH0KCiAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNo YXJzZXQ9dXRmLTgnKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY2FsbGJhY2tfZXZl bnQoJ3JhaF9mbGF0LmltcG9ydCcpOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkg ewogICAgICAgICAgICB0eHBfc3RhdHVzX2hlYWRlcignNTAwIEludGVybmFsIFNlcnZlciBF cnJvcicpOwoKICAgICAgICAgICAgZGllKGpzb25fZW5jb2RlKGFycmF5KAogICAgICAgICAg ICAgICAgJ3N1Y2Nlc3MnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgJ2Vycm9yJyAgID0+ ICRlLT5nZXRNZXNzYWdlKCksCiAgICAgICAgICAgICkpKTsKICAgICAgICB9CgogICAgICAg IHVwZGF0ZV9sYXN0bW9kKCk7CgogICAgICAgIGRpZShqc29uX2VuY29kZShhcnJheSgKICAg ICAgICAgICAgJ3N1Y2Nlc3MnID0+IHRydWUsCiAgICAgICAgKSkpOwogICAgfQp9CgpuZXcg UmFoX0ZsYXQoKTsKIjtzOjQ6InR5cGUiO3M6MToiMSI7czo1OiJvcmRlciI7czoxOiI1Ijtz OjU6ImZsYWdzIjtzOjE6IjIiO3M6ODoidGV4dHBhY2siO3M6NTA1OiIjQGFkbWluCnJhaF9m bGF0ID0+IEZsYXQgdGVtcGxhdGUgZmlsZXMKcmFoX2ZsYXRfa2V5ID0+IFNlY3VyaXR5IGtl eSBmb3IgdGhlIHB1YmxpYyBjYWxsYmFjawpyYWhfZmxhdF9wYXRoID0+IFBhdGggdG8gdGhl IHRlbXBsYXRlcyBkaXJlY3RvcnkKCiNAYWRtaW4KI0BsYW5ndWFnZSBmaS1maQpyYWhfZmxh dCA9PiBLaWludGXDpHQgc2l2dXBvaGphdGllZG9zdG90CnJhaF9mbGF0X2tleSA9PiBKdWxr aXNlbiBzb2l0dG9weXludMO2LW9zb2l0dGVlbiBrw6R5dHTDpG3DpCB0aWV0b3R1cnZhLWF2 YWluCnJhaF9mbGF0X3BhdGggPT4gVGllZG9zdG9wb2xrdSBzaXZ1cG9oamEtaGFrZW1pc3Rv b24KCiNAYWRtaW4KI0BsYW5ndWFnZSBmci1mcgpyYWhfZmxhdCA9PiBGaWNoaWVycyBkdSBt b2TDqGxlCnJhaF9mbGF0X2tleSA9PiBDbMOpIHPDqWN1cmlzw6llIHBvdXIgbCdhY2PDqHMg cHVibGljCnJhaF9mbGF0X3BhdGggPT4gQ2hlbWluIHZlcnMgbGUgcsOpcGVydG9pcmUgbW9k w6hsZXMKIjtzOjE1OiJhbGxvd19odG1sX2hlbHAiO2k6MDtzOjg6ImhlbHBfcmF3IjtzOjMz Mjc6ImgxLiByYWhfZmxhdAoKIkRvd25sb2FkIjpodHRwczovL2dpdGh1Yi5jb20vZ29jb20v cmFoX2ZsYXQvcmVsZWFzZXMgfCAiUGFja2FnaXN0IjpodHRwczovL3BhY2thZ2lzdC5vcmcv cGFja2FnZXMvcmFoL3JhaF9mbGF0IHwgIkRvbmF0ZSI6aHR0cDovL3JhaGZvcnVtLmJpei9k b25hdGUvcmFoX2ZsYXQKClRoaXMgcGx1Z2luIG1ha2VzIHlvdXIgIlRleHRwYXR0ZXJuIENN UyI6aHR0cDovL3d3dy50ZXh0cGF0dGVybi5jb20gZGF0YWJhc2UgbW9yZSBmbGF0LCBtYW5h Z2VhYmxlIGFuZCBlZGl0YWJsZS4gRWRpdCB0ZW1wbGF0ZXMsIGZvcm1zLCBwYWdlcywgcHJl ZmVyZW5jZXMgYW5kIHNlY3Rpb25zIGFzIGZsYXQgZmlsZXMuIFVzZSBhbnkgZWRpdG9yLCB3 b3JrIGluIHRlYW1zIGFuZCBzdG9yZSB5b3VyIHdlYnNpdGUncyBzb3VyY2UgdW5kZXIgeW91 ciBmYXZvcml0ZSAidmVyc2lvbiBjb250cm9sIHN5c3RlbSI6aHR0cDovL2VuLndpa2lwZWRp YS5vcmcvd2lraS9SZXZpc2lvbl9jb250cm9sLgoKKldhcm5pbmc6IHRoaXMgcGx1Z2luIHdp bGwgcGVybWFuZW50bHkgcmVtb3ZlIHlvdXIgY3VycmVudCB0ZW1wbGF0ZXMgd2hlbiBhY3Rp dmF0ZWQuKgoKaDIuIEluc3RhbGxpbmcKClVzaW5nICJDb21wb3NlciI6aHR0cDovL2dldGNv bXBvc2VyLm9yZzoKCmJjLiAkIGNvbXBvc2VyIHJlcXVpcmUgcmFoL3JhaF9mbGF0OioKCk9y ICJkb3dubG9hZCI6aHR0cHM6Ly9naXRodWIuY29tL2dvY29tL3JhaF9mbGF0L3JlbGVhc2Vz IGEgcGx1Z2luIHBhY2thZ2UuCgpoMi4gQmFzaWNzCgpSYWhfZmxhdCBpbXBvcnRzIG5vcm1h bCwgZmxhdCBmaWxlcyBmcm9tIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSB0byB5b3VyIFRleHRw YXR0ZXJuIGRhdGFiYXNlLiBUaGlzIGluIGVzc2VuY2UgbGV0cyB5b3UgdG8gZWRpdCB5b3Vy IGRhdGFiYXNlIGNvbnRlbnRzIGZyb20gYW55IHJlZ3VsYXIgZWRpdG9yIGFuZCBzdG9yZSB0 aGUgc291cmNlIGFzIGZsYXQgZmlsZXMuCgpSYWhfZmxhdCBjb21lcyB3aXRoIGJ1aWxkIGlu IHN1cHBvcnQgZm9yIGZldyBlc3NlbnRpYWwgY29udGVudCB0eXBlczogc3R5bGVzLCBmb3Jt cywgcGFnZXMsIHByZWZlcmVuY2VzIGFuZCBzZWN0aW9ucy4gU2VlIHRoZSAidGVtcGxhdGVz IjpodHRwczovL2dpdGh1Yi5jb20vZ29jb20vcmFoX2ZsYXQvdHJlZS9tYXN0ZXIvdGVtcGxh dGVzIGRpcmVjdG9yeSBvbiBHaXRIdWIgZm9yIGFuIGV4YW1wbGUgaG93IHRoaXMgYWxsIHdv cmtzLgoKWW91ciBmbGF0IGZpbGVzIGFyZSBpbXBvcnRlZCB0byB0aGUgZGF0YWJhc2U6Cgoq IEF1dG9tYXRpY2FsbHkgb24gdGhlIGJhY2tncm91bmQgd2hlbiB0aGUgc2l0ZSBpcyBlaXRo ZXIgaW4gRGVidWdnaW5nIG9yIFRlc3RpbmcgbW9kZS4KKiBXaGVuIHRoZSBwdWJsaWMgY2Fs bGJhY2sgaG9vayBVUkwgaXMgYWNjZXNzZWQuIFRoZSBVUkwgY2FuIGJlIHVzZWQgZm9yIGRl cGxveW1lbnQuCgpJZiB5b3Ugd2FudCB0byBleGNsdWRlIGNlcnRhaW4gY29udGVudCB0eXBl IGZyb20gaW1wb3J0aW5nLCBqdXN0IGRvbid0IGNyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgaXQu IE5vIGRpcmVjdG9yeSwgYW5kIHJhaF9mbGF0IHdpbGwgbGVhdmUgdGhlIGRhdGFiYXNlIGFs b25lIHdoZW4gaXQgY29tZXMgdG8gdGhhdCBjb250ZW50IHR5cGUuCgpoMi4gUHJlZmVyZW5j ZXMKClRoZSBwbHVnaW4gaGFzIHNldCBvZiBwcmVmZXJlbmNlcyB5b3UgY2FuIGZpbmQgb24g VGV4dHBhdHRlcm4ncyBub3JtYWwgcHJlZmVyZW5jZXMgcGFuZWwuCgpoMy4gUGF0aCB0byB0 aGUgdGVtcGxhdGVzIGRpcmVjdG9yeQoKU3BlY2lmaWVzIHBhdGggdG8gdGhlIHJvb3QgdGVt cGxhdGVzIGRpcmVjdG9yeSBjb250YWluaW5nIGFsbCB0aGUgY29udGVudC10eXBlIHNwZWNp ZmljIGRpcmVjdG9yaWVzLiBUaGlzIHBhdGggaXMgcmVsYXRpdmUgdG8geW91ciAndGV4dHBh dHRlcm4nIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuIEZvciBpbnN0YW5jZSBhIHBhdGggQC4u L3RlbXBsYXRlc0Agd291bGQgcG9pbnQgYSBkaXJlY3RvcnkgbG9jYXRlZCBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkgYXMgeW91ciBfdGV4dHBhdHRlcm5fIGRpcmVjdG9yeSBhbmQgdGhlIG1h aW4gX2luZGV4LnBocF8gZmlsZS4KCmgzLiBTZWN1cml0eSBrZXkgZm9yIHRoZSBwdWJsaWMg Y2FsbGJhY2sKClNlY3VyaXR5IGtleSBmb3IgdGhlIHB1YmxpYyBjYWxsYmFjayBob29rIFVS TC4gSW1wb3J0aW5nIGlzIGRvbmUgd2hlbiB0aGUgVVJMIGlzIGFjY2Vzc2VkLiBUaGUgVVJM IGZvbGxvd3MgdGhlIGZvcm1hdCBvZjoKCmJjLiBodHRwOi8vZXhhbXBsZS5jb20vP3JhaF9m bGF0X2tleT17eW91cktleX0KCldoZXJlIEBodHRwOi8vZXhhbXBsZS5jb20vQCBpcyB5b3Vy IHNpdGUncyBVUkwgYW5kIEB7eW91cktleX1AIGlzIHRoZSBzZWN1cml0eSBrZXkgeW91IHNw ZWNpZmllZC4KCmgyLiBUb29sc2hlZCBub3RpY2UKClRoaXMgaXMgYSB0b29sc2hlZCBwcm9q ZWN0LiBFeHBlcmltZW50YWwgYW5kIG5vdCBwYXJ0IG9mIHRoZSBtYWluIHN1cHBvcnRlZCBw cm9kdWN0IGxpbmUgb2YgUmFoLiBOb3QgeWV0IGF0IGxlYXN0LiBQbGVhc2UgdXNlIGF0IHlv dXIgb3duIHJpc2suCgpoMi4gQ2hhbmdlbG9nCgpoMy4gVmVyc2lvbiAwLjMuMCAtIDIwMTQv MDMvMjgKCiogQWRkZWQ6IERyb3AgYWNjZXNzIHRvIGEgYWRtaW4tc2lkZSBwYW5lbCBvbmx5 IGlmIHRoZSBzcGVjaWZpYyBjb250ZW50LXR5cGUgaXMgYWN0aXZlIGFuZCBoYXMgYSBkaXJl Y3Rvcnkgc2V0IHVwLgoqIEFkZGVkOiBJbnZva2FibGUgQHJhaF9mbGF0LmltcG9ydEAgY2Fs bGJhY2sgZXZlbnQuCiogQWRkZWQ6IFNlY3Rpb25zIGFuZCBwcmVmZXJlbmNlcyBnZXQgdGhl aXIgbmFtZXMgZnJvbSB0aGUgZmlsZW5hbWUuCiogQWRkZWQ6IFByZWZlcmVuY2VzIGFyZSBh bHdheXMganVzdCB1cGRhdGVkLCBubyBzdHJhbmRzIGFyZSBjcmVhdGVkLgoqIEFkZGVkOiBQ cmVmZXJlbmNlIGZpZWxkcyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkIGluIGEgZmlsZSwgYXJl IGtlcHQgYXMgaXMgaW4gdGhlIGRhdGFiYXNlLgoqIEFkZGVkOiBGcmVuY2ggdHJhbnNsYXRp b24gYnkgIlBhdHJpY2sgTGVmZXZyZSI6aHR0cHM6Ly9naXRodWIuY29tL2NhcmEtdG0uCiog Q2hhbmdlZDogUmVuYW1lZCBjb25mdXNpbmcgQFJhaF9GbGF0X0ltcG9ydF9UZW1wbGF0ZUAg aW50ZXJmYWNlIHRvIEBSYWhfRmxhdF9JbXBvcnRfSW1wb3J0SW50ZXJmYWNlQC4KCmgzLiBW ZXJzaW9uIDAuMi4wIC0gMjAxNC8wMy8xOQoKKiBSZXdvcmtlZC4KCmgzLiBWZXJzaW9uIDAu MS4wIC0gMjAxMy8wNS8wNwoKKiBJbml0aWFsIHJlbGVhc2UuCiI7czozOiJtZDUiO3M6MzI6 IjRmNTRkZjRiYjRkNTgwNTg1OWFjYWQ3YThiNWQ0YjRhIjt9