From dwagstaf@itsnet.com Fri Aug 7 17:23:53 1998 X-UIDL: 6fb4fc791932f70104c5e73ccebffd2c Received: from prv-mail10.provo.novell.com (prv-mail10.Provo.Novell.COM [137.65.1.18]) by amber.ccs.neu.edu (8.8.6/8.8.6) with SMTP id RAA23562 for ; Fri, 7 Aug 1998 17:23:50 -0400 (EDT) Received: from itsnet.com (dhcp-52-183.provo.novell.com [137.65.52.183]) by prv-mail10.provo.novell.com; Fri, 07 Aug 1998 14:34:59 -0600 Message-ID: <35CB6441.7F46BA5C@itsnet.com> Date: Fri, 07 Aug 1998 14:32:01 -0600 From: David Wagstaff X-Mailer: Mozilla 4.04 [en] (Win95; U) MIME-Version: 1.0 To: lieberherr@ccs.neu.edu Subject: A better Demeter Method X-Priority: 2 (High) Content-Type: multipart/mixed; boundary="------------DEC3E02F76DFC0634758A9FC" Status: RO This is a multi-part message in MIME format. --------------DEC3E02F76DFC0634758A9FC Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi Karl, I never took well to the abstractness of Demeter (not surprisingly, I've given up trying to learn JavaCC, too), but I became hooked on Adaptive Programming in Pure Java. To the extent that I did use Demeter Method, I couldn't convince co-workers to try it--even when I gave them Java code produced by DemJava. My portion of the final project explored, in part, Pure Java Adaptive Programming (unfortunately, I sidetracked into fascinating issues of cloned and threaded visitors.) After your class, when I put the principles into real projects, the code evolved into what I think is a better style of Adaptive Java Code. It's more readable and maintainable because it's less tangled. You said, "The art of computer science is later and later binding." DemJava uses JavaCC to weave the aspects into Java Code. My style delays the weaving until runtime. I want to write a paper describing my implementation because (1) I, personally, love and use this approach. I know it works. (2) My co-workers use it, too. (3) I believe this design pattern will go mainstream. I need your advice because (1) You deserve credit. I didn't invent Adaptive Programming. I just invented a clever Java implementation. (2) I want your feedback. You've worked on this technique for years. (3) DemJava could be changed to delay the weaving. (4) You can steer me toward other sources. You had a paper on a Pure Java implementation. I want to read it for comparison/inspiration. (5) Your understanding of DemJava will make a better contrast. My implementation is NOT a complete replacement. The DemJava abstraction is simply too powerful to be replaced. I believe the Pure Java approach is just a great simplification that works in most cases. My code is not well documented. If I wait to do so, then I probably wouldn't have written to you for months to come. I've already delayed months. I finished this work in April. As such, let me explain the break throughs: (1) Traversal object (A) A traversal object does the weaving at runtime. It takes an object to be traversed, a strategy for the traversal, and a visitor. The traverse() method loops: (a) hands the object to the strategy which returns the next subobject. (b) hands the subobject to the visitor. (c) if the subobject can be traversed itself, recurse into it. (B) Before and after traversing, it hands the traversal object itself to the visitor. (2) Strategy object (A)Strategy classes are more tightly coupled with their targets than I'd like; however, if the target object already uses a well-known containment (I've included strategies for enumeration and iterator trees) then strategies decoupled from their targets. In other words, unlike Demeter which is always structure-shy, this approach is sometimes structure-shy. (B)I invented my own interface instead of using a well-known one such as enumeration or iteration because I wanted the traversal to be intentional, not automatic. Suppose my target object implements enumeration, but that's not the order I want. This way I can write my own. If I change my mind and want enumeration order, then I just plug in the enumeration stategy. (3) Vistor object (A) The vistors can have before(Traversal host) and after(Traversal host) methods. See 1B above. I prefer these instead of constructor/destructors(finalize()) because Java only does destruction during garbage collection. (B) The abstract Visitor object uses reflection to avoid changing its code. before(Visitor v, Object host) invokes v.before([correct class] host) if it exists. If it doesn't exist, just return. (4) Filtering Filtering can be done in the object itself, the strategy, or the visitor. I think DemJava can selectively prune out sections of the graph easier. (5) Sample Application--SBack.java (A)I'm responsible for some backup scripts. The script is just too labor intensive and syntactically sensitive to do by hand. To make matter worse, there are changes daily to the list of files. I create two scripts by traversing a file/directory structure. (B) I find 90% of my traversing is file systems. As such I made a Dir class because it made more sense to me than Java's file/dir composite class. At first most people do not like the change. After a while you realize how much easier the visitors become when directories are distinct from files. (C) You may ignore the standard WARNING header on the files. There's no company secrets inside. Whew! I'm sorry for the BOE (Back Of Envelope) discussion. What do you think? Is this worth pursuing publication? ~David Wagstaff --------------DEC3E02F76DFC0634758A9FC Content-Type: application/x-unknown-content-type-java_auto_file; name="Dir.java" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="Dir.java" DQoNCiAvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdXUyBDb2RpbmcgVGVhbQ0KDQog ICAgRGlyLmphdmENCiAgICAgIDcvMzEvOTgNCg0KICAgICAgRGlyZWN0b3J5IG9iamVjdC4g ICBEaXN0aW5xdWlzaGVzIGJldHdlZW4gYSBmaWxlIGFuZCBhIGRpcmVjdG9yeQ0KICAgICAg DQogICAgICBEZXZlbG9wZWQgYnk6ICAgICBEYXZpZCBXYWdzdGFmZg0KICAgICAgICAgICAg ICAgICAgICAgICAgSmVmZiBTYWJpbg0KDQogICAgICBEaXNjbGFpbWVyOg0KDQogICAgICAg ICAgICBUaGlzIHByb2dyYW0gaXMgYW4gdW5wdWJsaXNoZWQgY29weXJpZ2h0ZWQgd29yayB3 aGljaCBpcyBwcm9wcmlldGFyeQ0KICAgICAgICAgICAgdG8gTm92ZWxsLCBJbmMuIGFuZCBj b250YWlucyBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QNCiAgICAgICAg ICAgIHRvIGJlIHJlcHJvZHVjZWQgb3IgZGlzY2xvc2VkIHRvIGFueSBvdGhlciBwZXJzb24g b3IgZW50aXR5IHdpdGhvdXQNCiAgICAgICAgICAgIHByaW9yIHdyaXR0ZW4gY29uc2VudCBm cm9tIE5vdmVsbCwgSW5jLiBpbiBlYWNoIGFuZCBldmVyeSBpbnN0YW5jZS4NCg0KICAgICAg ICAgICAgV0FSTklORzogIFVuYXV0aG9yaXplZCByZXByb2R1Y3Rpb24gb2YgdGhpcyBwcm9n cmFtIGFzIHdlbGwgYXMNCiAgICAgICAgICAgIHVuYXV0aG9yaXplZCBwcmVwYXJhdGlvbiBv ZiBkZXJpdmF0aXZlIHdvcmtzIGJhc2VkIHVwb24gdGhlDQogICAgICAgICAgICBwcm9ncmFt IG9yIGRpc3RyaWJ1dGlvbiBvZiBjb3BpZXMgYnkgc2FsZSwgcmVudGFsLCBsZWFzZSBvcg0K ICAgICAgICAgICAgbGVuZGluZyBhcmUgdmlvbGF0aW9ucyBvZiBmZWRlcmFsIGNvcHlyaWdo dCBsYXdzIGFuZCBzdGF0ZSB0cmFkZQ0KICAgICAgICAgICAgc2VjcmV0IGxhd3MsIHB1bmlz aGFibGUgYnkgY2l2aWwgYW5kIGNyaW1pbmFsIHBlbmFsdGllcy4NCg0KX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fKi8NCg0KaW1wb3J0IGphdmEuaW8uRmlsZTsNCg0KLyoqDQogICoNCiAg KiBEaXJlY3Rvcnkgb2JqZWN0LiAgIERpc3RpbnF1aXNoZXMgYmV0d2VlbiBhIGZpbGUgYW5k IGEgZGlyZWN0b3J5DQogICogDQogICogQHZlcnNpb24gMS4wIDcvMzEvOTgNCiAgKiBAYXV0 aG9yIEplZmYgU2FiaW4vRGF2aWQgV2Fnc3RhZmYNCiAgKg0KICAqLw0KY2xhc3MgRGlyIGV4 dGVuZHMgRmlsZSANCgl7DQoJcHVibGljIFN0cmluZ1tdIGZpbGVMaXN0Ow0KCXB1YmxpYyBp bnQgZmlsZXNMZWZ0Ow0KDQoJcHJpdmF0ZSB2b2lkIGluaXRGaWxlTGlzdCgpDQoJCXsNCgkJ ZmlsZUxpc3Q9bGlzdCgpOw0KCQlmaWxlc0xlZnQ9ZmlsZUxpc3QubGVuZ3RoOw0KCQl9DQoN CglwdWJsaWMgRGlyKCkNCgkJew0KCQlzdXBlcigiLiIpOw0KCQlpbml0RmlsZUxpc3QoKTsN CgkJfQ0KDQoJcHVibGljIERpcihTdHJpbmcgZGlyTmFtZSkNCgkJew0KCQlzdXBlcihkaXJO YW1lKTsNCgkJaW5pdEZpbGVMaXN0KCk7DQoJCX0NCg0KICAgCXB1YmxpYyBEaXIoRGlyIGRp ciwgU3RyaW5nIGZpbGVOYW1lKQ0KCQl7DQoJCXN1cGVyKGRpcixmaWxlTmFtZSk7DQoJCWlu aXRGaWxlTGlzdCgpOw0KCQl9DQoNCiAgIAlwdWJsaWMgRGlyKFN0cmluZyBkaXJOYW1lLCBT dHJpbmcgZmlsZU5hbWUpDQoJCXsNCgkJc3VwZXIoZGlyTmFtZSxmaWxlTmFtZSk7DQoJCWlu aXRGaWxlTGlzdCgpOw0KCQl9DQoJfQ0K --------------DEC3E02F76DFC0634758A9FC Content-Type: application/x-unknown-content-type-java_auto_file; name="EnumerationStrategy.java" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="EnumerationStrategy.java" aW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsNCg0KY2xhc3MgRW51bWVyYXRpb25TdHJh dGVneSBpbXBsZW1lbnRzIFN0cmF0ZWd5DQoJew0KCXB1YmxpYyB2b2lkIEVudW1lcmF0aW9u U3RyYXRlZ3koKSB7fQ0KDQoJcHVibGljIGJvb2xlYW4gaGFzTW9yZUNoaWxkcmVuKE9iamVj dCBvKQ0KCQl7DQoJCWlmIChvIGluc3RhbmNlb2YgRW51bWVyYXRpb24pDQoJCQlyZXR1cm4g KChFbnVtZXJhdGlvbilvKS5oYXNNb3JlRWxlbWVudHMoKTsNCgkJcmV0dXJuIGZhbHNlOw0K CQl9DQoNCglwdWJsaWMgT2JqZWN0IG5leHRDaGlsZChPYmplY3QgbykNCgkJew0KCQlpZiAo byBpbnN0YW5jZW9mIEVudW1lcmF0aW9uKQ0KCQkJcmV0dXJuICgoRW51bWVyYXRpb24pbyku bmV4dEVsZW1lbnQoKTsNCgkJcmV0dXJuIG51bGw7DQoJCX0NCgl9DQo= --------------DEC3E02F76DFC0634758A9FC Content-Type: application/x-unknown-content-type-java_auto_file; name="IteratorStrategy.java" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="IteratorStrategy.java" Y2xhc3MgSXRlcmF0b3JTdHJhdGVneSBpbXBsZW1lbnRzIFN0cmF0ZWd5DQoJew0KCXB1Ymxp YyB2b2lkIEl0ZXJhdG9yU3RyYXRlZ3koKSB7fQ0KCQkJCQkJCQ0KCXB1YmxpYyBib29sZWFu IGhhc01vcmVDaGlsZHJlbihPYmplY3QgbykNCgkJew0KCQlpZiAobyBpbnN0YW5jZW9mIEl0 ZXJhdG9yKQ0KCQkJcmV0dXJuICgoSXRlcmF0b3IpbykuaGFzTmV4dCgpOw0KCQlyZXR1cm4g ZmFsc2U7DQoJCX0NCg0KCXB1YmxpYyBPYmplY3QgbmV4dENoaWxkKE9iamVjdCBvKQ0KCQl7 DQoJCWlmIChvIGluc3RhbmNlb2YgSXRlcmF0b3IpDQoJCQlyZXR1cm4gKChJdGVyYXRvcilv KS5uZXh0KCk7DQoJCXJldHVybiBudWxsOw0KCQl9DQoJfQ0K --------------DEC3E02F76DFC0634758A9FC Content-Type: application/x-unknown-content-type-java_auto_file; name="FileDirectoryStrategy.java" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="FileDirectoryStrategy.java" IC8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1dTIENvZGluZyBUZWFtDQoNCiAgICBG aWxlRGlyZWN0b3J5U3RyYXRlZ3kuamF2YQ0KICAgICAgNy8zMS85OA0KDQogICAgICBBIEZp bGUgYW5kIERpcmVjdG9yeSBUcmF2ZXJzYWwgc3RyYXRlZ3kuDQogICAgICANCiAgICAgIERl dmVsb3BlZCBieTogICAgIERhdmlkIFdhZ3N0YWZmDQogICAgICAgICAgICAgICAgICAgICAg ICBKZWZmIFNhYmluDQoNCiAgICAgIERpc2NsYWltZXI6DQoNCiAgICAgICAgICAgIFRoaXMg cHJvZ3JhbSBpcyBhbiB1bnB1Ymxpc2hlZCBjb3B5cmlnaHRlZCB3b3JrIHdoaWNoIGlzIHBy b3ByaWV0YXJ5DQogICAgICAgICAgICB0byBOb3ZlbGwsIEluYy4gYW5kIGNvbnRhaW5zIGNv bmZpZGVudGlhbCBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdA0KICAgICAgICAgICAgdG8gYmUg cmVwcm9kdWNlZCBvciBkaXNjbG9zZWQgdG8gYW55IG90aGVyIHBlcnNvbiBvciBlbnRpdHkg d2l0aG91dA0KICAgICAgICAgICAgcHJpb3Igd3JpdHRlbiBjb25zZW50IGZyb20gTm92ZWxs LCBJbmMuIGluIGVhY2ggYW5kIGV2ZXJ5IGluc3RhbmNlLg0KDQogICAgICAgICAgICBXQVJO SU5HOiAgVW5hdXRob3JpemVkIHJlcHJvZHVjdGlvbiBvZiB0aGlzIHByb2dyYW0gYXMgd2Vs bCBhcw0KICAgICAgICAgICAgdW5hdXRob3JpemVkIHByZXBhcmF0aW9uIG9mIGRlcml2YXRp dmUgd29ya3MgYmFzZWQgdXBvbiB0aGUNCiAgICAgICAgICAgIHByb2dyYW0gb3IgZGlzdHJp YnV0aW9uIG9mIGNvcGllcyBieSBzYWxlLCByZW50YWwsIGxlYXNlIG9yDQogICAgICAgICAg ICBsZW5kaW5nIGFyZSB2aW9sYXRpb25zIG9mIGZlZGVyYWwgY29weXJpZ2h0IGxhd3MgYW5k IHN0YXRlIHRyYWRlDQogICAgICAgICAgICBzZWNyZXQgbGF3cywgcHVuaXNoYWJsZSBieSBj aXZpbCBhbmQgY3JpbWluYWwgcGVuYWx0aWVzLg0KDQpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18qLw0KDQppbXBvcnQgamF2YS5pby5GaWxlOw0KDQovKioNCiAgKg0KICAqIEEgRmlsZSBh bmQgRGlyZWN0b3J5IFRyYXZlcnNhbCBzdHJhdGVneS4NCiAgKiANCiAgKiBAdmVyc2lvbiAx LjAgNy8zMS85OA0KICAqIEBhdXRob3IgSmVmZiBTYWJpbi9EYXZpZCBXYWdzdGFmZg0KICAq DQogICovDQpjbGFzcyBGaWxlRGlyZWN0b3J5U3RyYXRlZ3kgaW1wbGVtZW50cyBTdHJhdGVn eQ0KCXsNCglwdWJsaWMgdm9pZCBGaWxlRGlyZWN0b3J5U3RyYXRlZ3koKSB7fQ0KCQkJCQkJ CQ0KCXB1YmxpYyBib29sZWFuIGhhc01vcmVDaGlsZHJlbihPYmplY3QgbykNCgkJew0KCQlp ZiAobyBpbnN0YW5jZW9mIERpcikNCgkJCXJldHVybiAoKERpcilvKS5maWxlc0xlZnQgPiAw Ow0KCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCXB1YmxpYyBPYmplY3QgbmV4dENoaWxkKE9i amVjdCBvKQ0KCQl7DQoJCWlmIChvIGluc3RhbmNlb2YgRGlyKQ0KCQkJew0KCQkJRGlyIGQ9 KERpcilvOw0KCQkJRmlsZSBmPW5ldyBGaWxlKGQsZC5maWxlTGlzdFstLWQuZmlsZXNMZWZ0 XSk7DQoJCQlpZiAoZi5pc0ZpbGUoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAN CiAJCQkJcmV0dXJuIGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogCQkJ aWYgKGYuaXNEaXJlY3RvcnkoKSkgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIAkJCQly ZXR1cm4gbmV3IERpcihkLGQuZmlsZUxpc3RbZC5maWxlc0xlZnRdKTsNCiAJCQl9IA0KIAkJ Ly9ub3QgZGlyZWN0b3J5LCBub3QgZmlsZSwgd2hhdCBpcyBpdD8gICAgICAgIA0KIAkJcmV0 dXJuIG51bGw7DQoJCX0NCgl9IA0K --------------DEC3E02F76DFC0634758A9FC Content-Type: application/x-unknown-content-type-java_auto_file; name="Strategy.java" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="Strategy.java" IC8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1dTIENvZGluZyBUZWFtDQoNCiAgICBT dHJhdGVneS5qYXZhDQogICAgICA3LzMxLzk4DQoNCiAgICAgIEludGVyZmFjZSB0aGF0IHRl bGxzIGEgVHJhdmVyc2FsIFZpc2l0b3Igd2hlcmUgdG8gZ28gbmV4dC4NCiAgICAgIA0KICAg ICAgRGV2ZWxvcGVkIGJ5OiAgICAgRGF2aWQgV2Fnc3RhZmYNCiAgICAgICAgICAgICAgICAg ICAgICAgIEplZmYgU2FiaW4NCg0KICAgICAgRGlzY2xhaW1lcjoNCg0KICAgICAgICAgICAg VGhpcyBwcm9ncmFtIGlzIGFuIHVucHVibGlzaGVkIGNvcHlyaWdodGVkIHdvcmsgd2hpY2gg aXMgcHJvcHJpZXRhcnkNCiAgICAgICAgICAgIHRvIE5vdmVsbCwgSW5jLiBhbmQgY29udGFp bnMgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIHRoYXQgaXMgbm90DQogICAgICAgICAgICB0 byBiZSByZXByb2R1Y2VkIG9yIGRpc2Nsb3NlZCB0byBhbnkgb3RoZXIgcGVyc29uIG9yIGVu dGl0eSB3aXRob3V0DQogICAgICAgICAgICBwcmlvciB3cml0dGVuIGNvbnNlbnQgZnJvbSBO b3ZlbGwsIEluYy4gaW4gZWFjaCBhbmQgZXZlcnkgaW5zdGFuY2UuDQoNCiAgICAgICAgICAg IFdBUk5JTkc6ICBVbmF1dGhvcml6ZWQgcmVwcm9kdWN0aW9uIG9mIHRoaXMgcHJvZ3JhbSBh cyB3ZWxsIGFzDQogICAgICAgICAgICB1bmF1dGhvcml6ZWQgcHJlcGFyYXRpb24gb2YgZGVy aXZhdGl2ZSB3b3JrcyBiYXNlZCB1cG9uIHRoZQ0KICAgICAgICAgICAgcHJvZ3JhbSBvciBk aXN0cmlidXRpb24gb2YgY29waWVzIGJ5IHNhbGUsIHJlbnRhbCwgbGVhc2Ugb3INCiAgICAg ICAgICAgIGxlbmRpbmcgYXJlIHZpb2xhdGlvbnMgb2YgZmVkZXJhbCBjb3B5cmlnaHQgbGF3 cyBhbmQgc3RhdGUgdHJhZGUNCiAgICAgICAgICAgIHNlY3JldCBsYXdzLCBwdW5pc2hhYmxl IGJ5IGNpdmlsIGFuZCBjcmltaW5hbCBwZW5hbHRpZXMuDQoNCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXyovDQoNCi8qKg0KICAqDQogICogSW50ZXJmYWNlIHRoYXQgdGVsbHMgYSBUcmF2 ZXJzYWwgVmlzaXRvciB3aGVyZSB0byBnbyBuZXh0Lg0KICAqIA0KICAqIEB2ZXJzaW9uIDEu MCA3LzMxLzk4DQogICogQGF1dGhvciBKZWZmIFNhYmluL0RhdmlkIFdhZ3N0YWZmDQogICoN CiAgKi8NCmludGVyZmFjZSBTdHJhdGVneQ0KCXsNCglwdWJsaWMgYWJzdHJhY3QgYm9vbGVh biBoYXNNb3JlQ2hpbGRyZW4oT2JqZWN0IG8pOw0KCXB1YmxpYyBhYnN0cmFjdCBPYmplY3Qg bmV4dENoaWxkKE9iamVjdCBvKTsNCgl9DQo= --------------DEC3E02F76DFC0634758A9FC Content-Type: application/x-unknown-content-type-java_auto_file; name="Visitor.java" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="Visitor.java" IC8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1dTIENvZGluZyBUZWFtDQoNCiAgICBW aXNpdG9yLmphdmENCiAgICAgIDcvMzEvOTgNCg0KICAgICAgQWJzdHJhY3QgQ2xhc3MgdXNl ZCBmb3IgYnkgVHJhdmVyc2FsIENsYXNzIHRvIHRyYXZlcnNlIHRocm91Z2ggYSB0cmVlIHN0 cnVjdHVyZS4NCiAgICAgIA0KICAgICAgRGV2ZWxvcGVkIGJ5OiAgICAgRGF2aWQgV2Fnc3Rh ZmYNCiAgICAgICAgICAgICAgICAgICAgICAgIEplZmYgU2FiaW4NCg0KICAgICAgRGlzY2xh aW1lcjoNCg0KICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGFuIHVucHVibGlzaGVkIGNv cHlyaWdodGVkIHdvcmsgd2hpY2ggaXMgcHJvcHJpZXRhcnkNCiAgICAgICAgICAgIHRvIE5v dmVsbCwgSW5jLiBhbmQgY29udGFpbnMgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIHRoYXQg aXMgbm90DQogICAgICAgICAgICB0byBiZSByZXByb2R1Y2VkIG9yIGRpc2Nsb3NlZCB0byBh bnkgb3RoZXIgcGVyc29uIG9yIGVudGl0eSB3aXRob3V0DQogICAgICAgICAgICBwcmlvciB3 cml0dGVuIGNvbnNlbnQgZnJvbSBOb3ZlbGwsIEluYy4gaW4gZWFjaCBhbmQgZXZlcnkgaW5z dGFuY2UuDQoNCiAgICAgICAgICAgIFdBUk5JTkc6ICBVbmF1dGhvcml6ZWQgcmVwcm9kdWN0 aW9uIG9mIHRoaXMgcHJvZ3JhbSBhcyB3ZWxsIGFzDQogICAgICAgICAgICB1bmF1dGhvcml6 ZWQgcHJlcGFyYXRpb24gb2YgZGVyaXZhdGl2ZSB3b3JrcyBiYXNlZCB1cG9uIHRoZQ0KICAg ICAgICAgICAgcHJvZ3JhbSBvciBkaXN0cmlidXRpb24gb2YgY29waWVzIGJ5IHNhbGUsIHJl bnRhbCwgbGVhc2Ugb3INCiAgICAgICAgICAgIGxlbmRpbmcgYXJlIHZpb2xhdGlvbnMgb2Yg ZmVkZXJhbCBjb3B5cmlnaHQgbGF3cyBhbmQgc3RhdGUgdHJhZGUNCiAgICAgICAgICAgIHNl Y3JldCBsYXdzLCBwdW5pc2hhYmxlIGJ5IGNpdmlsIGFuZCBjcmltaW5hbCBwZW5hbHRpZXMu DQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXyovDQoNCi8qKg0KICAqDQogICogQWJzdHJh Y3QgQ2xhc3MgdXNlZCBmb3IgYnkgVHJhdmVyc2FsIENsYXNzIHRvIHRyYXZlcnNlIHRocm91 Z2ggYSB0cmVlIHN0cnVjdHVyZS4NCiAgKiANCiAgKiBAdmVyc2lvbiAxLjAgNy8zMS85OA0K ICAqIEBhdXRob3IgSmVmZiBTYWJpbi9EYXZpZCBXYWdzdGFmZg0KICAqDQogICovDQphYnN0 cmFjdCBjbGFzcyBWaXNpdG9yDQoJew0KCXB1YmxpYyB2b2lkIGJlZm9yZShPYmplY3QgaG9z dCkNCgkJew0KICAJCXRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICANCiAgCQkJew0KCQkJT2JqZWN0IHBhcmFtZXRlcnNbXT17aG9zdH07DQog IAkJCUNsYXNzIHBhcmFtZXRlclR5cGVzW109e2hvc3QuZ2V0Q2xhc3MoKX07ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0K ICAgCQkJZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgiYmVmb3JlIiwgcGFyYW1ldGVy VHlwZXMpLmludm9rZSh0aGlzLCBwYXJhbWV0ZXJzKTsNCiAgIAkJCX0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgCQljYXRjaChFeGNlcHRp b24gZSl7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkJfQ0KDQoJcHVi bGljIHZvaWQgYWZ0ZXIoT2JqZWN0IGhvc3QpDQoJCXsNCiAgCQl0cnkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIAkJCXsNCgkJCU9iamVj dCBwYXJhbWV0ZXJzW109e2hvc3R9Ow0KICAJCQlDbGFzcyBwYXJhbWV0ZXJUeXBlc1tdPXto b3N0LmdldENsYXNzKCl9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICANCiAgIAkJCWdldENsYXNzKCkuZ2V0RGVjbGFyZWRN ZXRob2QoImFmdGVyIiwgcGFyYW1ldGVyVHlwZXMpLmludm9rZSh0aGlzLCBwYXJhbWV0ZXJz KTsNCiAgIAkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIA0KICAgCQljYXRjaChFeGNlcHRpb24gZSl7fSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICANCgkJfQ0KCX0NCg== --------------DEC3E02F76DFC0634758A9FC Content-Type: application/x-unknown-content-type-java_auto_file; name="Traversal.java" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="Traversal.java" IC8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1dTIENvZGluZyBUZWFtDQoNCiAgICBU cmF2ZXJzYWwuamF2YQ0KICAgICAgNy8zMS85OA0KDQogICAgICBHZW5lcmljIFRyYXZlcnNh bCBjbGFzcy4gDQogICAgICANCiAgICAgIERldmVsb3BlZCBieTogICAgIERhdmlkIFdhZ3N0 YWZmDQogICAgICAgICAgICAgICAgICAgICAgICBKZWZmIFNhYmluDQoNCiAgICAgIERpc2Ns YWltZXI6DQoNCiAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBhbiB1bnB1Ymxpc2hlZCBj b3B5cmlnaHRlZCB3b3JrIHdoaWNoIGlzIHByb3ByaWV0YXJ5DQogICAgICAgICAgICB0byBO b3ZlbGwsIEluYy4gYW5kIGNvbnRhaW5zIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiB0aGF0 IGlzIG5vdA0KICAgICAgICAgICAgdG8gYmUgcmVwcm9kdWNlZCBvciBkaXNjbG9zZWQgdG8g YW55IG90aGVyIHBlcnNvbiBvciBlbnRpdHkgd2l0aG91dA0KICAgICAgICAgICAgcHJpb3Ig d3JpdHRlbiBjb25zZW50IGZyb20gTm92ZWxsLCBJbmMuIGluIGVhY2ggYW5kIGV2ZXJ5IGlu c3RhbmNlLg0KDQogICAgICAgICAgICBXQVJOSU5HOiAgVW5hdXRob3JpemVkIHJlcHJvZHVj dGlvbiBvZiB0aGlzIHByb2dyYW0gYXMgd2VsbCBhcw0KICAgICAgICAgICAgdW5hdXRob3Jp emVkIHByZXBhcmF0aW9uIG9mIGRlcml2YXRpdmUgd29ya3MgYmFzZWQgdXBvbiB0aGUNCiAg ICAgICAgICAgIHByb2dyYW0gb3IgZGlzdHJpYnV0aW9uIG9mIGNvcGllcyBieSBzYWxlLCBy ZW50YWwsIGxlYXNlIG9yDQogICAgICAgICAgICBsZW5kaW5nIGFyZSB2aW9sYXRpb25zIG9m IGZlZGVyYWwgY29weXJpZ2h0IGxhd3MgYW5kIHN0YXRlIHRyYWRlDQogICAgICAgICAgICBz ZWNyZXQgbGF3cywgcHVuaXNoYWJsZSBieSBjaXZpbCBhbmQgY3JpbWluYWwgcGVuYWx0aWVz Lg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18qLw0KDQoNCi8qKg0KICAqDQogICogR2Vu ZXJpYyBUcmF2ZXJzYWwgY2xhc3MuIA0KICAqIA0KICAqIEB2ZXJzaW9uIDEuMCA3LzMxLzk4 DQogICogQGF1dGhvciBKZWZmIFNhYmluL0RhdmlkIFdhZ3N0YWZmDQogICoNCiAgKi8NCmNs YXNzIFRyYXZlcnNhbA0KCXsNCglwdWJsaWMgVHJhdmVyc2FsKCkge30NCg0KCXByaXZhdGUg dm9pZCB0cmF2ZXJzZShWaXNpdG9yIHYsIE9iamVjdCBvLCBTdHJhdGVneSBzKQ0KCQl7DQoJ CXdoaWxlIChzLmhhc01vcmVDaGlsZHJlbihvKSkNCgkJCXsNCgkJCU9iamVjdCBjaGlsZD1z Lm5leHRDaGlsZChvKTsNCgkJCXYuYmVmb3JlKGNoaWxkKTsNCgkJCWlmIChzLmhhc01vcmVD aGlsZHJlbihjaGlsZCkpDQoJCQkJdHJhdmVyc2UodixjaGlsZCxzKTsNCgkJCXYuYWZ0ZXIo Y2hpbGQpOw0KCQkJfQ0KCQl9IA0KDQoJcHVibGljIHZvaWQgdHJhdmVyc2UoT2JqZWN0IG8s IFZpc2l0b3IgdiwgU3RyYXRlZ3kgcykNCgkJew0KCQl2LmJlZm9yZSh0aGlzKTsgLy9iZWZv cmUgdHJhdmVyc2luZw0KCQl2LmJlZm9yZShvKTsJLy9iZWZvcmUgcm9vdCBvYmplY3QNCgkJ dHJhdmVyc2UodixvLHMpOw0KCQl2LmFmdGVyKG8pOwkJLy9hZnRlciByb290IG9iamVjdA0K CQl2LmFmdGVyKHRoaXMpOwkvL2FmdGVyIHRyYXZlcnNpbmcNCgkJfQ0KIAl9DQo= --------------DEC3E02F76DFC0634758A9FC Content-Type: application/x-unknown-content-type-java_auto_file; name="sback9.java" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="sback9.java" aW1wb3J0IGphdmEuaW8uKjsNCmltcG9ydCBqYXZhLnV0aWwuKjsNCg0KY2xhc3MgU0JhY2sN CiAgIHsNCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQ0KCQl7DQoJ CS8vamF2YS5pby5GaWxlIGhhcyBhIGJ1ZyB3aGVyZSBsaXN0KCkgcmV0dXJucyBudWxsIGZv ciBhIHJvb3QNCiAgICAgCS8vaS5lLiBDOlwsIEY6XCwgXCwgYnV0IGl0IHdvcmtzIGZvciBD OlwuLCBGOlwuLCBcLg0KICAgICAgCS8vV2l0aCB0aGUgLiB3b3JrLWFyb3VuZCwgeW91IGhh dmUgdG8gcHJpbnQgdXNpbmcgZ2V0Q2Fub25pY2FsUGF0aCgpDQogICAgICAJLy9vciB5b3Ug Z2V0IEM6XC5cd2luZG93cywgRjpcLlxnYW1lc1xkaWFibG8sIFwuXGNvbW1hbmQuY29tDQoN CgkJU3RyaW5nIGRpck5hbWU7DQogICAgCWlmIChhcmdzLmxlbmd0aCA9PSAwKQ0KCQkJZGly TmFtZT0iLiI7DQoJCWVsc2UgaWYgKGFyZ3NbMF0uZW5kc1dpdGgoIlxcIikpDQoJCQlkaXJO YW1lPWFyZ3NbMF0rIi4iOw0KCQllbHNlDQoJCQlkaXJOYW1lPWFyZ3NbMF07DQoNCgkJVHJh dmVyc2FsIHQ9bmV3IFRyYXZlcnNhbCgpOw0KCQl0LnRyYXZlcnNlKG5ldyBEaXIoZGlyTmFt ZSksIG5ldyBTeXNWaXNpdG9yKCksIG5ldyBGaWxlRGlyZWN0b3J5U3RyYXRlZ3koKSk7DQoJ CXQudHJhdmVyc2UobmV3IERpcihkaXJOYW1lKSwgbmV3IEJvb3RWaXNpdG9yKCksICBuZXcg RmlsZURpcmVjdG9yeVN0cmF0ZWd5KCkpOw0KCQl9DQoJfQ0KDQoNCg0KDQpjbGFzcyBTeXNW aXNpdG9yIGV4dGVuZHMgVmlzaXRvcg0KCXsNCiAgIAlQcmludFdyaXRlciBvdXQ7DQoNCiAg IAlwdWJsaWMgU3lzVmlzaXRvcigpIHt9DQoNCglwdWJsaWMgdm9pZCBiZWZvcmUoVHJhdmVy c2FsIGhvc3QpCQ0KICAgICAgew0KICAgICAgdHJ5ew0KICAgICAgb3V0ID0gbmV3IFByaW50 V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcigiU1lTLklQUyIpKSx0 cnVlKTsNCiAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ3JlYXRpbmcgU1lTLklQUyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIp Ow0KICAgICAgb3V0LnByaW50bG4oIkBWZXJzaW9uIDQuMDAiKTsNCiAgICAgIG91dC5wcmlu dGxuKCI7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KICAgICAgb3V0LnByaW50bG4o IjsgU1lTLklQUyIpOw0KICAgICAgb3V0LnByaW50bG4oIjsiKTsNCiAgICAgIG91dC5wcmlu dGxuKCI7IFRoaXMgc2NyaXB0IGhhcyBiZWVuIGRldmVsb3BlZCB0byBiYWNrdXAgdGhlIHNl cnZlciBwcmlvciB0byBpbnN0YWxsaW5nIik7DQogICAgICBvdXQucHJpbnRsbigiOwl0aGUg XCJJbnRyYW5ldFdhcmUgU3VwcG9ydCBQYWNrXCIuIik7DQogICAgICBvdXQucHJpbnRsbigi OyIpOw0KICAgICAgb3V0LnByaW50bG4oIjsgRGF0ZTogMTcgQXByaWwgMTk5NyIpOw0KICAg ICAgb3V0LnByaW50bG4oIjsiKTsNCiAgICAgIG91dC5wcmludGxuKCI7IC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLSIpOw0KICAgICAgb3V0LnByaW50bG4oIjsgXCJDb1B5UmlHaFQ9KGMp IDE5OTcgTm92ZWxsLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlwiIik7DQogICAgICBv dXQucHJpbnRsbigiOyBWZVJzSW9OPTQuMDAiKTsNCiAgICAgIG91dC5wcmludGxuKCIiKTsN CiAgICAgIG91dC5wcmludGxuKCIiKTsNCiAgICAgIG91dC5wcmludGxuKCIiKTsNCiAgICAg IG91dC5wcmludGxuKCJARmlsZVNldCIpOw0KICAgICAgb3V0LnByaW50bG4oIglEZXNjcmlw dGlvbjogIFwiTWFraW5nIGJhY2t1cCBvZiBmaWxlcyBvbiB0aGUgU1lTIFZvbHVtZS4uLlwi Iik7DQogICAgICBvdXQucHJpbnRsbigiCU5hbWU6ICBTWVMiKTsNCiAgICAgIG91dC5wcmlu dGxuKCIiKTsNCiAgICAgIG91dC5wcmludGxuKCIJOy0tLS0tIElmIEJBQ0tVUCBpcyAwIHRo ZW4gZG9uJ3QgYmFja3VwIChjb3B5KSBmaWxlcyIpOw0KICAgICAgb3V0LnByaW50bG4oIglH b3RvSWZFcXVhbCAle0JBQ0tVUH0sIDAsIFNZU0RPTkUiKTsNCiAgICAgIG91dC5wcmludGxu KCIiKTsNCiAgICAgIG91dC5wcmludGxuKCIJR2V0UGF0aCBTWVNCYWNrdXBEaXIsIDMsICcl e0JhY2t1cERpcn1cXFxcU1lTJywgJyciKTsNCiAgICAgIG91dC5wcmludGxuKCIiKTsNCiAg ICAgIG91dC5wcmludGxuKCIJOy0tLS0tIEJhY2t1cCBmaWxlcyB0aGF0IHdlcmUgY2hhbmdl ZCBidXQgbm90IGNvcGllZCBvdmVyIChpZS4gLk5DRiwgLkNGRykiKTsNCiAgICAgIG91dC5w cmludGxuKCIJQ29weUZpbGUgMCwwLDAsMCwwLFNZU0RpcixTWVNURU1cXEFVVE9FWEVDLk5D RiwnJywnJyxTWVNCYWNrdXBEaXIsU1lTVEVNLCcnLCcnLDAiKTsNCiAgICAgIG91dC5wcmlu dGxuKCIJQ29weUZpbGUgMCwwLDAsMCwwLFNZU0RpcixFVENcXElOSVRTWVMuTkNGLCcnLCcn LFNZU0JhY2t1cERpcixFVEMsJycsJycsMCIpOw0KICAgICAgb3V0LnByaW50bG4oIglDb3B5 RmlsZSAwLDAsMCwwLDAsU1lTRGlyLEVUQ1xcTkVUSU5GTy5DRkcsJycsJycsU1lTQmFja3Vw RGlyLEVUQywnJywnJywwIik7DQogICAgICBvdXQucHJpbnRsbigiCUNvcHlGaWxlIDAsMCww LDAsMCxTWVNEaXIsRVRDXFxOTFNQLkNGRywnJywnJyxTWVNCYWNrdXBEaXIsRVRDLCcnLCcn LDAiKTsNCiAgICAgIG91dC5wcmludGxuKCIJQ29weUZpbGUgMCwwLDAsMCwwLFNZU0RpcixF VENcXElQWFNQWC5DRkcsJycsJycsU1lTQmFja3VwRGlyLEVUQywnJywnJywwIik7DQogICAg ICBvdXQucHJpbnRsbigiIik7DQogICAgICBvdXQucHJpbnRsbigiIik7CQ0KICAgICAgb3V0 LnByaW50bG4oIiIpOw0KICAgICAgb3V0LnByaW50bG4oIgk7LS0tLS0gIEJhY2t1cCBhbGwg b3RoZXIgZmlsZXMiKTsNCiAgICAgIH1jYXRjaCAoSU9FeGNlcHRpb24gZSl7U3lzdGVtLmVy ci5wcmludGxuKCJFUlJPUiBPcGVuaW5nIFNZUy5JUFMgZm9yIHdyaXRpbmciKTt9DQogICAg ICB9DQoNCglwdWJsaWMgdm9pZCBhZnRlcihUcmF2ZXJzYWwgaG9zdCkNCgkJew0KICAgICAg ICBvdXQucHJpbnRsbigiIik7DQogICAgICAgIG91dC5wcmludGxuKCIiKTsNCiAgICAgICAg b3V0LnByaW50bG4oIgk7LS0tLS0gQWRkIGVudHJ5IHRvIExvZyBmaWxlIC0tLS0tIik7DQov LyAgICAgICAgIG91dC5wcmludGxuKCIJUElfRWRpdE5DRl9BZGRsaW5lICcnIik7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLy8gICAg ICAgICBvdXQucHJpbnRsbigiCVBJX0VkaXROQ0ZfQWRkbGluZSAnXFx0QmFja2VkIHVwIGZp bGVzIG9uIFNZUyB2b2x1bWUgdG8gJXtTWVNCYWNrdXBEaXJ9JyIpOyANCi8vICAgICAgICAg b3V0LnByaW50bG4oIglQSV9FZGl0TkNGCWF1dG9leGVjRGlyLCAnJXtMb2dGaWxlfScsICcu QkFLJywgY0NvZGUiKTsNCgkJICAgb3V0LnByaW50bG4oIiAgICBOTE1FeGVjIDEsJ05XVVBE QVRFXFxcXEFQUEVORCAle0xvZ0ZpbGV9IFwiXFx0QmFja2VkIHVwIGZpbGVzIG9uIFNZUyB2 b2x1bWUgdG8gJXtTWVNCYWNrdXBEaXJ9XCInIik7DQoJCSAgICAgICAgICAgICAgICAgICAg IA0KCQlvdXQucHJpbnRsbigiIik7DQogICAgICAgIG91dC5wcmludGxuKCIiKTsJDQogICAg ICAJb3V0LnByaW50bG4oIkxhYmVsIFNZU0RPTkUiKTsNCiAgICAgIAlvdXQucHJpbnRsbigi Iik7DQogICAgICAJb3V0LnByaW50bG4oIiIpOw0KICAgICAgCW91dC5wcmludGxuKCJARW5k RmlsZVNldCIpOw0KCQlvdXQuY2xvc2UoKTsNCgkJU3lzdGVtLmVyci5wcmludCgiXHIgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFxyIik7DQoJCX0NCg0KCXB1YmxpYyB2b2lkIGJlZm9yZShGaWxlIGhv c3QpDQoJCXsNCiAgICAgIFdoaXJseUdpZy5zcGluKCk7DQogICAgICBpbnQgaTsNCiAgICAg IFN0cmluZyBmaWxlTmFtZT1ob3N0LmdldFBhdGgoKS50b1VwcGVyQ2FzZSgpOw0KCSAgLy9m aWxlcyBiZWxvdyBTeXN0ZW0gUHVibGljIExvZ2luIEV0YyBEb2NzDQogICAgICBpZiAoIChp PWZpbGVOYW1lLmluZGV4T2YoIlNZU1RFTVxcIikpID09IC0xKQ0KICAgICAgICAgaWYgKCAo aT1maWxlTmFtZS5pbmRleE9mKCJQVUJMSUNcXCIpKSA9PSAtMSkNCiAgICAgICAgICAgIGlm ICggKGk9ZmlsZU5hbWUuaW5kZXhPZigiTE9HSU5cXCIpKSA9PSAtMSkNCiAgICAgICAgICAg ICAgIGlmICggKGk9ZmlsZU5hbWUuaW5kZXhPZigiRVRDXFwiKSkgPT0gLTEpDQogICAgICAg ICAgICAgICAgICBpZiAoIChpPWZpbGVOYW1lLmluZGV4T2YoIkRPQ1NcXCIpKSA9PSAtMSkN CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgIGZpbGVOYW1lPWZpbGVOYW1l LnN1YnN0cmluZyhpKTsNCg0KICAgICAgU3RyaW5nIHBhdGhOYW1lPWZpbGVOYW1lLnN1YnN0 cmluZygwLGZpbGVOYW1lLmxhc3RJbmRleE9mKGhvc3QuZ2V0TmFtZSgpLnRvVXBwZXJDYXNl KCkpLTEpOw0KDQogICAgICBvdXQucHJpbnRsbigiQ29weUZpbGUgMCwwLDAsMCwwLFNZU0RJ UiwiICsgZmlsZU5hbWUgKyAiLCcnLCcnLFNZU0JhY2t1cERpciwiICsgcGF0aE5hbWUgKyAi LCcnLCcnLDAiKTsNCgkJfQ0KDQogICBwdWJsaWMgdm9pZCBiZWZvcmUoRGlyIGhvc3QpDQog ICAgICB7DQogICAgICBXaGlybHlHaWcuc3BpbigpOw0KICAgICAgdHJ5ew0KCQlTeXN0ZW0u ZXJyLnByaW50KGhvc3QuZ2V0Q2Fub25pY2FsUGF0aCgpKTsNCiAgICAgIGZvciAoaW50IGk9 NzgtaG9zdC5nZXRDYW5vbmljYWxQYXRoKCkubGVuZ3RoKCk7IGk+MDsgaS0tKQ0KICAgICAg ICAgU3lzdGVtLmVyci5wcmludCgiICIpOw0KICAgICAgfWNhdGNoIChJT0V4Y2VwdGlvbiBl KXtTeXN0ZW0uZXJyLnByaW50bG4oZSk7fQ0KICAgICAgfQ0KCX0NCg0KY2xhc3MgQm9vdFZp c2l0b3IgZXh0ZW5kcyBWaXNpdG9yDQoJew0KICAgCVByaW50V3JpdGVyIG91dDsNCg0KICAg CXB1YmxpYyBCb290VmlzaXRvcigpIHt9DQoNCglwdWJsaWMgdm9pZCBiZWZvcmUoVHJhdmVy c2FsIGhvc3QpDQogICAgICB7DQogICAgICB0cnl7DQogICAgICBvdXQgPSBuZXcgUHJpbnRX cml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKCJCT09ULklQUyIpKSx0 cnVlKTsNCiAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ3JlYXRpbmcgQk9PVC5JUFMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIp Ow0KCSAgb3V0LnByaW50bG4oIkBWZXJzaW9uIDQuMDAiKTsNCgkgIG91dC5wcmludGxuKCI7 IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KCSAgb3V0LnByaW50bG4oIjsgQk9PVC5J UFMiKTsNCgkgIG91dC5wcmludGxuKCI7Iik7DQoJICBvdXQucHJpbnRsbigiOyBUaGlzIHNj cmlwdCBoYXMgYmVlbiBkZXZlbG9wZWQgdG8gYmFja3VwIHRoZSBzZXJ2ZXIgcHJpb3IgdG8g aW5zdGFsbGluZyIpOw0KCSAgb3V0LnByaW50bG4oIjsJdGhlIFwiSW50cmFuZXRXYXJlIFN1 cHBvcnQgUGFja1wiLiIpOw0KCSAgb3V0LnByaW50bG4oIjsiKTsNCgkgIG91dC5wcmludGxu KCI7IERhdGU6IDE3IEFwcmlsIDE5OTciKTsNCgkgIG91dC5wcmludGxuKCI7Iik7DQoJICBv dXQucHJpbnRsbigiOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCgkgIG91dC5wcmlu dGxuKCI7IFwiQ29QeVJpR2hUPShjKSAxOTk3IE5vdmVsbCwgSW5jLiAgQWxsIFJpZ2h0cyBS ZXNlcnZlZC5cIiIpOw0KCSAgb3V0LnByaW50bG4oIjsgVmVSc0lvTj00LjAwIik7DQoJICBv dXQucHJpbnRsbigiIik7DQoJICBvdXQucHJpbnRsbigiQEZpbGVTZXQiKTsNCgkgIG91dC5w cmludGxuKCIJRGVzY3JpcHRpb246ICBcIk1ha2luZyBiYWNrdXAgb2YgZmlsZXMgb24gdGhl IERPUyBQYXJ0aXRpb24uLi5cIiIpOw0KCSAgb3V0LnByaW50bG4oIgkJTmFtZTogIEJPT1Qi KTsNCgkgIG91dC5wcmludGxuKCIiKTsNCgkgIG91dC5wcmludGxuKCIiKTsNCgkgIG91dC5w cmludGxuKCIJOy0tLS0tIElmIEJBQ0tVUCBpcyAwIHRoZW4gZG9uJ3QgYmFja3VwIChjb3B5 KSBmaWxlcyIpOw0KCSAgb3V0LnByaW50bG4oIglHb3RvSWZFcXVhbCAle0JBQ0tVUH0sIDAs IERPU0RPTkUiKTsNCgkgIG91dC5wcmludGxuKCIiKTsNCgkgIG91dC5wcmludGxuKCIJR2V0 UGF0aCBET1NCYWNrdXBEaXIsIDMsICcle0JhY2t1cERpcn1cXFxcQk9PVCcsICcnIik7DQoJ ICBvdXQucHJpbnRsbigiCVNldFZhciBFbmdpbmVOdW0sIDAiKTsNCgkgIG91dC5wcmludGxu KCIiKTsNCgkgIG91dC5wcmludGxuKCIJIik7DQoJICBvdXQucHJpbnRsbigiCTstLS0tLSBJ ZiBTRlQgSUlJIHRoZW4gc2F2ZSB0aGUgZW5naW5lIG51bWJlciwgc2V0IHRoZSBlbmdpbmUg dG8gMC4iKTsNCgkgIG91dC5wcmludGxuKCIJR290b0lmTkVxdWFsIDIsICcle1BJX09TVHlw ZX0nLCBDT1BZX0ZJTEVTIik7DQoJICBvdXQucHJpbnRsbigiCQlHZXRQYXRoIERPU0JhY2t1 cERpciwgMywgJyV7QmFja3VwRGlyfVxcXFxET1NcXFxcRW5naW5lMCcsJyciKTsNCgkgIG91 dC5wcmludGxuKCIgICAgCUdldERPU1NlcnZlciBTYXZlRW5naW5lTnVtIik7DQoJICBvdXQu cHJpbnRsbigiCSAgICBTZXRET1NTZXJ2ZXIgJXtFbmdpbmVOdW19LCBjY29kZSIpOw0KCSAg b3V0LnByaW50bG4oIgkgICAgR290b0lmRXF1YWwgMCwgJXtjY29kZX0sIENPUFlfRklMRVMi KTsNCgkgIG91dC5wcmludGxuKCIgICAgCQlkaXNwbGF5IDAsICdJT0VuZ2luZVsle0VuZ2lu ZU51bX1dIG5vdCBwcmVzZW50ICh3aWxsIGJlIHNraXBwZWQpJyIpOw0KCSAgb3V0LnByaW50 bG4oIgkJICAgIEdvdG8gU1dJVENIX0VOR0lORSIpOw0KCSAgb3V0LnByaW50bG4oIiIpOw0K CSAgb3V0LnByaW50bG4oIkxhYmVsIENPUFlfRklMRVMiKTsNCgkgIG91dC5wcmludGxuKCIJ Oy0tLS0tIEJhY2t1cCBmaWxlcyB0aGF0IHdlcmUgY2hhbmdlZCBidXQgbm90IGNvcGllZCBv dmVyIChpZS4gLk5DRiwgLkNGRykiKTsNCgkgIG91dC5wcmludGxuKCIJQ29weUZpbGUgMCww LDAsMCwwLE5XQk9PVCxTVEFSVFVQLk5DRiwnJywnJyxET1NCYWNrdXBEaXIsJycsJycsJycs MCIpOw0KCSAgb3V0LnByaW50bG4oIglDb3B5RmlsZSAwLDAsMCwwLDAsTldCT09ULE5CSUhX LkNGRywnJywnJyxET1NCYWNrdXBEaXIsJycsJycsJycsMCIpOw0KCSAgb3V0LnByaW50bG4o IiIpOw0KCSAgb3V0LnByaW50bG4oIiIpOw0KCSAgb3V0LnByaW50bG4oIgk7LS0tLS0gQ09Q WSBGSUxFUyIpOw0KICAgICAgfWNhdGNoIChJT0V4Y2VwdGlvbiBlKXtTeXN0ZW0uZXJyLnBy aW50bG4oIkVSUk9SIE9wZW5pbmcgQk9PVC5JUFMgZm9yIHdyaXRpbmciKTt9DQogICAgICB9 DQoNCglwdWJsaWMgdm9pZCBhZnRlcihUcmF2ZXJzYWwgaG9zdCkNCgkgICAgew0KCSAgb3V0 LnByaW50bG4oIgk7LS0tLS0gRU5EIENPUFkgRklMRVMgU0VDVElPTiIpOw0KCSAgb3V0LnBy aW50bG4oIiIpOw0KCSAgb3V0LnByaW50bG4oIiIpOw0KCSAgb3V0LnByaW50bG4oIkxhYmVs IFNXSVRDSF9FTkdJTkUiKTsNCgkgIG91dC5wcmludGxuKCIJOy0tLS0tIElmIFNGVCBJSUkg dGhlbiBzd2l0Y2ggdG8gZW5naW5lICMxIGFuZCBjb3B5IGZpbGVzIGFnYWluIik7DQoJICBv dXQucHJpbnRsbigiCUdvdG9JZk5FcXVhbCAyLCAnJXtQSV9PU1R5cGV9JywgRE9TTE9HIik7 DQoJICBvdXQucHJpbnRsbigiCQk7LS0tLS0gSWYgdGhpcyBpcyBhbHJlYWR5IGVuZ2luZSAj MSB0aGVuIHF1aXQiKTsNCgkgIG91dC5wcmludGxuKCIJCUdvdG9JZkVxdWFsLCAle0VuZ2lu ZU51bX0sIDEgU0ZURE9ORSIpOw0KCSAgb3V0LnByaW50bG4oIiIpOw0KCSAgb3V0LnByaW50 bG4oIgkJR2V0UGF0aCBET1NCYWNrdXBEaXIsIDMsICcle0JhY2t1cERpcn1cXFxcRE9TXFxc XEVuZ2luZTEnLCcnIik7DQoJICBvdXQucHJpbnRsbigiCSAgICBWYWx1ZUFkZCBFbmdpbmVO dW0sIDEiKTsNCgkgIG91dC5wcmludGxuKCIJICAgIFNldERPU1NlcnZlciAle0VuZ2luZU51 bX0sIGNjb2RlIik7DQoJICBvdXQucHJpbnRsbigiCSAgICBHb3RvSWZFcXVhbCAwLCAle2Nj b2RlfSwgQ09QWV9GSUxFUyIpOw0KCSAgb3V0LnByaW50bG4oIgkJCURpc3BsYXkgMCwgJ0lP RW5naW5lWyV7RW5naW5lTnVtfV0gbm90IHByZXNlbnQgKHdpbGwgYmUgc2tpcHBlZCknIik7 DQoJICBvdXQucHJpbnRsbigiCQkJR290byBTRlRET05FIik7DQoJICBvdXQucHJpbnRsbigi Iik7DQoJICBvdXQucHJpbnRsbigiTGFiZWwgU0ZURE9ORSIpOw0KCSAgb3V0LnByaW50bG4o IgkgICAgU2V0RE9TU2VydmVyICV7U2F2ZUVuZ2luZU51bX0sIGNjb2RlIik7DQoJICBvdXQu cHJpbnRsbigiIik7DQoJICBvdXQucHJpbnRsbigiTGFiZWwgRE9TTE9HIik7DQoJICBvdXQu cHJpbnRsbigiIik7DQoJICBvdXQucHJpbnRsbigiCTstLS0tLSBBZGQgZW50cnkgdG8gTG9n IGZpbGUgLS0tLS0iKTsNCi8vIAkgIG91dC5wcmludGxuKCIJUElfRWRpdE5DRl9BZGRsaW5l ICcnIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIA0KLy8gCSAgb3V0LnByaW50bG4oIglQSV9FZGl0TkNGX0FkZGxpbmUgJ1xcdEJh Y2tlZCB1cCBmaWxlcyBvbiBET1MgUGFydGl0aW9uIHRvICV7RE9TQmFja3VwRGlyfSciKTsg DQovLyAJICBvdXQucHJpbnRsbigiCVBJX0VkaXROQ0YJYXV0b2V4ZWNEaXIsICcle0xvZ0Zp bGV9JywgJy5CQUsnLCBjQ29kZSIpOyAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgb3V0 LnByaW50bG4oIiBOTE1FeGVjIDEsJ05XVVBEQVRFXFxcXEFQUEVORCAle0xvZ0ZpbGV9IFwi XFx0QmFja2VkIHVwIGZpbGVzIG9uIERPUyBQYXJ0aXRpb24gdG8gJXtET1NCYWNrdXBEaXJ9 XCInIik7DQoNCgkgIG91dC5wcmludGxuKCIiKTsNCgkgIG91dC5wcmludGxuKCIJIik7DQoJ ICBvdXQucHJpbnRsbigiTGFiZWwgRE9TRE9ORSIpOw0KCSAgb3V0LnByaW50bG4oIiIpOw0K CSAgb3V0LnByaW50bG4oIiIpOw0KCSAgb3V0LnByaW50bG4oIkBFbmRGaWxlU2V0Iik7DQog CQlvdXQuY2xvc2UoKTsNCgkJU3lzdGVtLmVyci5wcmludCgiXHIgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFxyIik7DQoJCX0NCg0KCXB1YmxpYyB2b2lkIGJlZm9yZShGaWxlIGhvc3QpDQoJICB7CQ0K ICAgICAgV2hpcmx5R2lnLnNwaW4oKTsNCiAgICAgIGludCBpOw0KICAgICAgU3RyaW5nIGZp bGVOYW1lPWhvc3QuZ2V0UGF0aCgpLnRvVXBwZXJDYXNlKCk7DQoJICAvL3dlIHdhbnQgZmls ZXMgT05FIGxldmVsIGJlbG93IFN5c3RlbSBhbmQgUEs0MTENCiAgICAgIGlmICggKGk9Zmls ZU5hbWUuaW5kZXhPZigiU1lTVEVNXFwiKSkgPT0gLTEpDQogICAgICAgICBpZiAoIChpPWZp bGVOYW1lLmluZGV4T2YoIlBLNDExXFwiKSkgPT0gLTEpDQogICAgICAgICAgICByZXR1cm47 DQogICAgICBmaWxlTmFtZT1maWxlTmFtZS5zdWJzdHJpbmcoaSk7DQoJICBpZiAoKGk9Zmls ZU5hbWUuaW5kZXhPZigiXFwiKSkgIT0gZmlsZU5hbWUubGFzdEluZGV4T2YoIlxcIikpIA0K CQlyZXR1cm47DQoNCiAgICAgIGZpbGVOYW1lPWZpbGVOYW1lLnN1YnN0cmluZyhpKzEpOw0K DQogICAgICBvdXQucHJpbnRsbigiQ29weUZpbGUgMCwwLDAsMCwwLE5XQk9PVCwiICsgZmls ZU5hbWUgKyAiLCcnLCcnLERPU0JhY2t1cERpciwnJywnJywnJywwIik7DQoJICB9DQoNCiAg IHB1YmxpYyB2b2lkIGJlZm9yZShEaXIgaG9zdCkNCiAgICAgIHsNCiAgICAgIHRyeXsNCgkg IFdoaXJseUdpZy5zcGluKCk7DQoJICBTeXN0ZW0uZXJyLnByaW50KGhvc3QuZ2V0Q2Fub25p Y2FsUGF0aCgpKTsNCiAgICAgIGZvciAoaW50IGk9NzgtaG9zdC5nZXRDYW5vbmljYWxQYXRo KCkubGVuZ3RoKCk7IGk+MDsgaS0tKQ0KICAgICAgICAgU3lzdGVtLmVyci5wcmludCgiICIp Ow0KICAgICAgfWNhdGNoIChJT0V4Y2VwdGlvbiBlKXtTeXN0ZW0uZXJyLnByaW50bG4oZSk7 fQ0KICAgICAgfQ0KCX0NCg0KY2xhc3MgV2hpcmx5R2lnIA0KCXsNCglwcml2YXRlIHN0YXRp YyBjaGFyW10gZ2lnID0geyctJywgJ1xcJywgJ3wnLCAnLyd9Ow0KCXByaXZhdGUgc3RhdGlj IGludCBpPTA7DQoJcHJpdmF0ZSBXaGlybHlHaWcoKSB7fQ0KDQoJcHVibGljIHN0YXRpYyB2 b2lkIHNwaW4oKQ0KCQl7DQoJCWk9KytpJTQ7DQoJCVN5c3RlbS5lcnIucHJpbnQoIlxyIitn aWdbaV0pOw0KCQl9DQoNCgl9DQo= --------------DEC3E02F76DFC0634758A9FC--