LyoKQ29weXJpZ2h0IChjKSAyMDA5LCBTaGxvbXkgR2FudHogQmx1ZUJyaWNrIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKgoqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAoqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQoqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBTaGxvbXkgR2FudHogb3IgQmx1ZUJyaWNrIEluYy4gbm9yIHRoZQoqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCiogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCioKKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFNITE9NWSBHQU5UWi9CTFVFQlJJQ0sgSU5DLiAnJ0FTIElTJycgQU5EIEFOWQoqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU0hMT01ZIEdBTlRaL0JMVUVCUklDSyBJTkMuIEJFIExJQUJMRSBGT1IgQU5ZCiogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwoqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoqLwoKLyoqCiogSlNHYW50dCBjb21wb25lbnQgaXMgYSBVSSBjb250cm9sIHRoYXQgZGlzcGxheXMgZ2FudHQgY2hhcnRzIGJhc2VkIGJ5IHVzaW5nIENTUyBhbmQgSFRNTCAKKiBAbW9kdWxlICAgIGpzZ2FudHQKKiBAdGl0bGUgICAgSlNHYW50dAoqLwoKdmFyIEpTR2FudHQ7IGlmICghSlNHYW50dCkgSlNHYW50dCA9IHt9OwoKdmFyIHZUaW1lb3V0ID0gMDsKdmFyIHZCZW5jaFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKCi8qKgoqIENyZWF0ZXMgYSB0YXNrIChvbmUgcm93KSBpbiBnYW50dCBvYmplY3QKKiBAY2xhc3MgVGFza0l0ZW0gCiogQG5hbWVzcGFjZSBKU0dhbnR0CiogQGNvbnN0cnVjdG9yCiogQGZvciBKU0dhbnR0CgoqIEBwYXJhbSBwSUQge051bWJlcn0gVGFzayB1bmlxdWUgbnVtZXJpYyBJRAoqIEBwYXJhbSBwTmFtZSB7U3RyaW5nfSBUYXNrIE5hbWUKKiBAcGFyYW0gcFN0YXJ0IHtEYXRlfSBUYXNrIHN0YXJ0IGRhdGUvdGltZSAobm90IHJlcXVpcmVkIGZvciBwR3JvdXA9MSApCiogQHBhcmFtIHBFbmQge0RhdGV9IFRhc2sgZW5kIGRhdGUvdGltZSwgeW91IGNhbiBzZXQgdGhlIGVuZCB0aW1lIHRvIDEyOjAwIHRvIGluZGljYXRlIGhhbGYtZGF5IChub3QgcmVxdWlyZWQgZm9yIHBHcm91cD0xICkKKiBAcGFyYW0gcENvbG9yIHtTdHJpbmd9IFRhc2sgYmFyIFJHQiB2YWx1ZQoqIEBwYXJhbSBwTGluayB7U3RyaW5nfSBUYXNrIFVSTCwgY2xpY2tpbmcgb24gdGhlIHRhc2sgd2lsbCByZWRpcmVjdCB0byB0aGlzIHVybC4gTGVhdmUgZW1wdHkgaWYgeW91IGRvIG5vdCB3aXRoIHRoZSBUYXNrIGFsc28gc2VydmUgYXMgYSBsaW5rCiogQHBhcmFtIHBNaWxlIHtCb29sZWFufSBEZXRlcm1pbmVzIHdoZXRoZXIgdGFzayBpcyBhIG1pbGVzdG9uZSAoMT1ZZXMsMD1ObykKKiBAcGFyYW0gcFJlcyB7U3RyaW5nfSBSZXNvdXJjZSB0byBwZXJmb3JtIHRoZSB0YXNrCiogQHBhcmFtIHBDb21wIHtOdW1iZXJ9IFBlcmNlbnQgY29tcGxldGUgKE51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCkKKiBAcGFyYW0gcEdyb3VwIHtCb29sZWFufQoqIEBwYXJhbSBwUGFyZW50IHtOdW1iZXJ9IElEIG9mIHRoZSBwYXJlbnQgdGFzawoqIEBwYXJhbSBwT3BlbiB7Qm9vbGVhbn0KKiBAcGFyYW0gcERlcGVuZCB7U3RyaW5nfSBDb21tYSBzZXBlcmF0ZWQgbGlzdCBvZiBJRHMgdGhpcyB0YXNrIGRlcGVuZHMgb24KKiBAcGFyYW0gcENhcHRpb24ge1N0cmluZ30gQ2FwdGlvbiB0byBiZSB1c2VkIGluc3RlYWQgb2YgZGVmYXVsdCBjYXB0aW9uIChSZXNvdXJjZSkuIAoqIG5vdGUgOiB5b3Ugc2hvdWxkIHVzZSBzZXRDYXB0aW9uKCJDYXB0aW9uIikgaW4gb3JkZXIgdG8gZGlzcGxheSB0aGUgY2FwdGlvbgoqIEByZXR1cm4gdm9pZAoqLwpKU0dhbnR0LlRhc2tJdGVtID0gZnVuY3Rpb24ocElELCBwTmFtZSwgcFN0YXJ0LCBwRW5kLCBwQ29sb3IsIHBMaW5rLCBwTWlsZSwgcFJlcywgcENvbXAsIHBHcm91cCwgcFBhcmVudCwgcE9wZW4sIHBEZXBlbmQsIHBDYXB0aW9uKQp7CgovKioKKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgoqIEBwcm9wZXJ0eSB2SUQgCiogQHR5cGUgU3RyaW5nIAoqIEBkZWZhdWx0IHBJRAoqIEBwcml2YXRlCiovICAgIAp2YXIgdklEICAgID0gcElEOwoKLyoqCiogQHByb3BlcnR5IHZOYW1lIAoqIEB0eXBlIFN0cmluZyAKKiBAZGVmYXVsdCBwTmFtZQoqIEBwcml2YXRlCiovICAgCnZhciB2TmFtZSAgPSBwTmFtZTsKCi8qKgoqIEBwcm9wZXJ0eSB2U3RhcnQgCiogQHR5cGUgRGF0ZXRpbWUgCiogQGRlZmF1bHQgbmV3IERhdGUoKQoqIEBwcml2YXRlCiovICAgIAp2YXIgdlN0YXJ0ID0gbmV3IERhdGUoKTsJCgovKioKKiBAcHJvcGVydHkgdkVuZCAKKiBAdHlwZSBEYXRldGltZSAKKiBAZGVmYXVsdCBuZXcgRGF0ZSgpCiogQHByaXZhdGUKKi8gICAgCnZhciB2RW5kICAgPSBuZXcgRGF0ZSgpOwoKLyoqCiogQHByb3BlcnR5IHZDb2xvciAKKiBAdHlwZSBTdHJpbmcgCiogQGRlZmF1bHQgcENvbG9yCiogQHByaXZhdGUKKi8gICAgCnZhciB2Q29sb3IgPSBwQ29sb3I7CgovKioKKiBAcHJvcGVydHkgdkxpbmsgCiogQHR5cGUgU3RyaW5nIAoqIEBkZWZhdWx0IHBMaW5rCiogQHByaXZhdGUKKi8gICAgCnZhciB2TGluayAgPSBwTGluazsKCi8qKgoqIEBwcm9wZXJ0eSB2TWlsZSAKKiBAdHlwZSBCb29sZWFuIAoqIEBkZWZhdWx0IHBNaWxlCiogQHByaXZhdGUKKi8gICAgCnZhciB2TWlsZSAgPSBwTWlsZTsKCi8qKgoqIEBwcm9wZXJ0eSB2UmVzIAoqIEB0eXBlIFN0cmluZyAKKiBAZGVmYXVsdCBwUmVzCiogQHByaXZhdGUKKi8gICAgCnZhciB2UmVzICAgPSBwUmVzOwoKLyoqCiogQHByb3BlcnR5IHZDb21wIAoqIEB0eXBlIE51bWJlciAKKiBAZGVmYXVsdCBwQ29tcAoqIEBwcml2YXRlCiovICAgIAp2YXIgdkNvbXAgID0gcENvbXA7CgovKioKKiBAcHJvcGVydHkgdkdyb3VwIAoqIEB0eXBlIEJvb2xlYW4gCiogQGRlZmF1bHQgcEdyb3VwCiogQHByaXZhdGUKKi8gICAgCnZhciB2R3JvdXAgPSBwR3JvdXA7CgovKioKKiBAcHJvcGVydHkgdlBhcmVudCAKKiBAdHlwZSBOdW1iZXIgCiogQGRlZmF1bHQgcFBhcmVudAoqIEBwcml2YXRlCiovICAgIAp2YXIgdlBhcmVudCA9IHBQYXJlbnQ7CgovKioKKiBAcHJvcGVydHkgdk9wZW4gCiogQHR5cGUgQm9vbGVhbiAKKiBAZGVmYXVsdCBwT3BlbgoqIEBwcml2YXRlCiovICAgIAp2YXIgdk9wZW4gICA9IHBPcGVuOwoKLyoqCiogQHByb3BlcnR5IHZEZXBlbmQgCiogQHR5cGUgU3RyaW5nIAoqIEBkZWZhdWx0IHBEZXBlbmQKKiBAcHJpdmF0ZQoqLyAgICAKdmFyIHZEZXBlbmQgPSBwRGVwZW5kOwoKLyoqCiogQHByb3BlcnR5IHZDYXB0aW9uIAoqIEB0eXBlIFN0cmluZyAKKiBAZGVmYXVsdCBwQ2FwdGlvbgoqIEBwcml2YXRlCiovICAgIAp2YXIgdkNhcHRpb24gPSBwQ2FwdGlvbjsKCi8qKgoqIEBwcm9wZXJ0eSB2RHVyYXRpb24gCiogQHR5cGUgTnVtYmVyIAoqIEBkZWZhdWx0ICcnCiogQHByaXZhdGUKKi8gICAgCnZhciB2RHVyYXRpb24gPSAnJzsKCi8qKgoqIEBwcm9wZXJ0eSB2TGV2ZWwgCiogQHR5cGUgTnVtYmVyIAoqIEBkZWZhdWx0IDAKKiBAcHJpdmF0ZQoqLyAgICAKdmFyIHZMZXZlbCA9IDA7CgovKioKKiBAcHJvcGVydHkgdk51bUtpZCAKKiBAdHlwZSBOdW1iZXIgCiogQGRlZmF1bHQgMAoqIEBwcml2YXRlCiovICAgCnZhciB2TnVtS2lkID0gMDsKCi8qKgoqIEBwcm9wZXJ0eSB2VmlzaWJsZSAKKiBAdHlwZSBCb29sZWFuIAoqIEBkZWZhdWx0IDAKKiBAcHJpdmF0ZQoqLyAgIAp2YXIgdlZpc2libGUgID0gMTsKICAgICAgdmFyIHgxLCB5MSwgeDIsIHkyOwoKCiAgICAgIGlmICh2R3JvdXAgIT0gMSkKICAgICAgeyAgCiAgICAgICAgIHZTdGFydCA9IEpTR2FudHQucGFyc2VEYXRlU3RyKHBTdGFydCxnLmdldERhdGVJbnB1dEZvcm1hdCgpKTsKICAgICAgICAgdkVuZCAgID0gSlNHYW50dC5wYXJzZURhdGVTdHIocEVuZCxnLmdldERhdGVJbnB1dEZvcm1hdCgpKTsKICAgICAgfQovKioKKiBSZXR1cm5zIHRhc2sgSUQKKiBAbWV0aG9kIGdldElECiogQHJldHVybiB7TnVtYmVyfQoqLwogICAgICB0aGlzLmdldElEICAgICAgID0gZnVuY3Rpb24oKXsgcmV0dXJuIHZJRCB9OwovKioKKiBSZXR1cm5zIHRhc2sgbmFtZQoqIEBtZXRob2QgZ2V0TmFtZQoqIEByZXR1cm4ge1N0cmluZ30KKi8KICAgICAgdGhpcy5nZXROYW1lICAgICA9IGZ1bmN0aW9uKCl7IHJldHVybiB2TmFtZSB9OwovKioKKiBSZXR1cm5zIHRhc2sgc3RhcnQgZGF0ZQoqIEBtZXRob2QgZ2V0U3RhcnQKKiBAcmV0dXJuIHtEYXRldGltZX0KKi8KICAgICAgdGhpcy5nZXRTdGFydCAgICA9IGZ1bmN0aW9uKCl7IHJldHVybiB2U3RhcnR9OwovKioKKiBSZXR1cm5zIHRhc2sgZW5kIGRhdGUKKiBAbWV0aG9kIGdldEVuZAoqIEByZXR1cm4ge0RhdGV0aW1lfQoqLyAgICB0aGlzLmdldEVuZCAgICAgID0gZnVuY3Rpb24oKXsgcmV0dXJuIHZFbmQgIH07CgovKioKKiBSZXR1cm5zIHRhc2sgYmFyIGNvbG9yIChpLmUuIDAwRkYwMCkKKiBAbWV0aG9kIGdldENvbG9yCiogQHJldHVybiB7U3RyaW5nfQoqLyAgICB0aGlzLmdldENvbG9yICAgID0gZnVuY3Rpb24oKXsgcmV0dXJuIHZDb2xvcn07CgovKioKKiBSZXR1cm5zIHRhc2sgVVJMIChpLmUuIGh0dHA6Ly93d3cuanNnYW50dC5jb20pCiogQG1ldGhvZCBnZXRMaW5rCiogQHJldHVybiB7U3RyaW5nfQoqLyAgICB0aGlzLmdldExpbmsgICAgID0gZnVuY3Rpb24oKXsgcmV0dXJuIHZMaW5rIH07CgovKioKKiBSZXR1cm5zIHdoZXRoZXIgdGFzayBpcyBhIG1pbGVzdG9uZSAoMT1ZZXMsMD1ObykKKiBAbWV0aG9kIGdldE1pbGUKKiBAcmV0dXJuIHtCb29sZWFufQoqLyAgICB0aGlzLmdldE1pbGUgICAgID0gZnVuY3Rpb24oKXsgcmV0dXJuIHZNaWxlIH07CgovKioKKiBSZXR1cm5zIHRhc2sgZGVwZW5kZW5jaWVzIGFzIGxpc3Qgb2YgdmFsdWVzIChpLmUuIDEyMywxMjIpCiogQG1ldGhvZCBnZXREZXBlbmQKKiBAcmV0dXJuIHtTdHJpbmd9CiovICAgIHRoaXMuZ2V0RGVwZW5kICAgPSBmdW5jdGlvbigpeyBpZih2RGVwZW5kKSByZXR1cm4gdkRlcGVuZDsgZWxzZSByZXR1cm4gbnVsbCB9OwoKLyoqCiogUmV0dXJucyB0YXNrIGNhcHRpb24gKGlmIGl0IGV4aXN0cykKKiBAbWV0aG9kIGdldENhcHRpb24KKiBAcmV0dXJuIHtTdHJpbmd9CiovICAgIHRoaXMuZ2V0Q2FwdGlvbiAgPSBmdW5jdGlvbigpeyBpZih2Q2FwdGlvbikgcmV0dXJuIHZDYXB0aW9uOyBlbHNlIHJldHVybiAnJzsgfTsKCi8qKgoqIFJldHVybnMgdGFzayByZXNvdXJjZSBuYW1lIGFzIHN0cmluZwoqIEBtZXRob2QgZ2V0UmVzb3VyY2UKKiBAcmV0dXJuIHtTdHJpbmd9CiovICAgIHRoaXMuZ2V0UmVzb3VyY2UgPSBmdW5jdGlvbigpeyBpZih2UmVzKSByZXR1cm4gdlJlczsgZWxzZSByZXR1cm4gJyZuYnNwJzsgIH07CgovKioKKiBSZXR1cm5zIHRhc2sgY29tcGxldGlvbiBwZXJjZW50IGFzIG51bWVyaWMgdmFsdWUKKiBAbWV0aG9kIGdldENvbXBWYWwKKiBAcmV0dXJuIHtCb29sZWFufQoqLyAgICB0aGlzLmdldENvbXBWYWwgID0gZnVuY3Rpb24oKXsgaWYodkNvbXApIHJldHVybiB2Q29tcDsgZWxzZSByZXR1cm4gMDsgfTsKCi8qKgoqIFJldHVybnMgdGFzayBjb21wbGV0aW9uIHBlcmNlbnQgYXMgZm9ybWF0dGVkIHN0cmluZyAoIyMlKQoqIEBtZXRob2QgZ2V0Q29tcFN0cgoqIEByZXR1cm4ge1N0cmluZ30KKi8gICAgdGhpcy5nZXRDb21wU3RyICA9IGZ1bmN0aW9uKCl7IGlmKHZDb21wKSByZXR1cm4gdkNvbXArJyUnOyBlbHNlIHJldHVybiAnJzsgfTsKCi8qKgoqIFJldHVybnMgdGFzayBkdXJhdGlvbiBhcyBhIGZvcnRtYXR0ZWQgc3RyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlbGVjdGVkIGZvcm1hdAoqIEBtZXRob2QgZ2V0RHVyYXRpb24KKiBAcGFyYW0gdkZvcm1hdCB7U3RyaW5nfSBzZWxlY3RlZCBmb3JtYXQgKG1pbnV0ZSxob3VyLGRheSx3ZWVrLG1vbnRoKQoqIEByZXR1cm4ge1N0cmluZ30KKi8gCSAgdGhpcy5nZXREdXJhdGlvbiA9IGZ1bmN0aW9uKHZGb3JtYXQpeyAKICAgICAgICAgaWYgKHZNaWxlKSAKICAgICAgICAgICAgdkR1cmF0aW9uID0gJy0nOwogICAgICAgICAgICBlbHNlIGlmICh2Rm9ybWF0PT0naG91cicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRtcFBlciA9ICBNYXRoLmNlaWwoKHRoaXMuZ2V0RW5kKCkgLSB0aGlzLmdldFN0YXJ0KCkpIC8gICggNjAgKiA2MCAqIDEwMDApICk7CiAgICAgICAgICAgICAgICBpZih0bXBQZXIgPT0gMSkgIAogICAgICAgICAgICAgICAgICAgIHZEdXJhdGlvbiA9ICcxIEhvdXInOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHZEdXJhdGlvbiA9IHRtcFBlciArICcgSG91cnMnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBlbHNlIGlmICh2Rm9ybWF0PT0nbWludXRlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG1wUGVyID0gIE1hdGguY2VpbCgodGhpcy5nZXRFbmQoKSAtIHRoaXMuZ2V0U3RhcnQoKSkgLyAgKCA2MCAqIDEwMDApICk7CiAgICAgICAgICAgICAgICBpZih0bXBQZXIgPT0gMSkgIAogICAgICAgICAgICAgICAgICAgIHZEdXJhdGlvbiA9ICcxIE1pbnV0ZSc7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgdkR1cmF0aW9uID0gdG1wUGVyICsgJyBNaW51dGVzJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAKIAkJICAgZWxzZSB7IC8vaWYodkZvcm1hdCA9PSAnZGF5JykgewogICAgICAgICAgICB0bXBQZXIgPSAgTWF0aC5jZWlsKCh0aGlzLmdldEVuZCgpIC0gdGhpcy5nZXRTdGFydCgpKSAvICAoMjQgKiA2MCAqIDYwICogMTAwMCkgKyAxKTsKICAgICAgICAgICAgaWYodG1wUGVyID09IDEpICB2RHVyYXRpb24gPSAnMSBEYXknOwogICAgICAgICAgICBlbHNlICAgICAgICAgICAgIHZEdXJhdGlvbiA9IHRtcFBlciArICcgRGF5cyc7CiAgICAgICAgIH0KCiAgICAgICAgIC8vZWxzZSBpZih2Rm9ybWF0ID09ICd3ZWVrJykgewogICAgICAgICAvLyAgIHRtcFBlciA9ICAoKHRoaXMuZ2V0RW5kKCkgLSB0aGlzLmdldFN0YXJ0KCkpIC8gICgyNCAqIDYwICogNjAgKiAxMDAwKSArIDEpLzc7CiAgICAgICAgIC8vICAgaWYodG1wUGVyID09IDEpICB2RHVyYXRpb24gPSAnMSBXZWVrJzsKICAgICAgICAgLy8gICBlbHNlICAgICAgICAgICAgIHZEdXJhdGlvbiA9IHRtcFBlciArICcgV2Vla3MnOyAKICAgICAgICAgLy99CgogICAgICAgICAvL2Vsc2UgaWYodkZvcm1hdCA9PSAnbW9udGgnKSB7CiAgICAgICAgIC8vICAgdG1wUGVyID0gICgodGhpcy5nZXRFbmQoKSAtIHRoaXMuZ2V0U3RhcnQoKSkgLyAgKDI0ICogNjAgKiA2MCAqIDEwMDApICsgMSkvMzA7CiAgICAgICAgIC8vICAgaWYodG1wUGVyID09IDEpIHZEdXJhdGlvbiA9ICcxIE1vbnRoJzsKICAgICAgICAgLy8gICBlbHNlICAgICAgICAgICAgdkR1cmF0aW9uID0gdG1wUGVyICsgJyBNb250aHMnOyAKICAgICAgICAgLy99CgogICAgICAgICAvL2Vsc2UgaWYodkZvcm1hdCA9PSAncXVhdGVyJykgewogICAgICAgICAvLyAgIHRtcFBlciA9ICAoKHRoaXMuZ2V0RW5kKCkgLSB0aGlzLmdldFN0YXJ0KCkpIC8gICgyNCAqIDYwICogNjAgKiAxMDAwKSArIDEpLzEyMDsKICAgICAgICAgLy8gICBpZih0bXBQZXIgPT0gMSkgdkR1cmF0aW9uID0gJzEgUXRyJzsKICAgICAgICAgLy8gICBlbHNlICAgICAgICAgICAgdkR1cmF0aW9uID0gdG1wUGVyICsgJyBRdHJzJzsgCiAgICAgICAgIC8vfQogICAgICAgICByZXR1cm4oIHZEdXJhdGlvbiApCiAgICAgIH07CgovKioKKiBSZXR1cm5zIHRhc2sgcGFyZW50IElECiogQG1ldGhvZCBnZXRQYXJlbnQKKiBAcmV0dXJuIHtOdW1iZXJ9CiovICAgICAgdGhpcy5nZXRQYXJlbnQgICA9IGZ1bmN0aW9uKCl7IHJldHVybiB2UGFyZW50IH07CgovKioKKiBSZXR1cm5zIHdoZXRoZXIgdGFzayBpcyBhIGdyb3VwICgxPVllcywwPU5vKQoqIEBtZXRob2QgZ2V0R3JvdXAKKiBAcmV0dXJuIHtOdW1iZXJ9CiovICAgIHRoaXMuZ2V0R3JvdXAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4gdkdyb3VwIH07CgovKioKKiBSZXR1cm5zIHdoZXRoZXIgdGFzayBpcyBvcGVuICgxPVllcywwPU5vKQoqIEBtZXRob2QgZ2V0T3BlbgoqIEByZXR1cm4ge0Jvb2xlYW59CiovICAgIHRoaXMuZ2V0T3BlbiAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4gdk9wZW4gfTsKCi8qKgoqIFJldHVybnMgdGFzayB0cmVlIGxldmVsICgwLDEsMiwzLi4uKQoqIEBtZXRob2QgZ2V0TGV2ZWwKKiBAcmV0dXJuIHtCb29sZWFufQoqLyAgICB0aGlzLmdldExldmVsICAgID0gZnVuY3Rpb24oKXsgcmV0dXJuIHZMZXZlbCB9OwoKLyoqCiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkIHRhc2tzCiogQG1ldGhvZCBnZXROdW1LaWRzCiogQHJldHVybiB7TnVtYmVyfQoqLyAgICB0aGlzLmdldE51bUtpZHMgID0gZnVuY3Rpb24oKXsgcmV0dXJuIHZOdW1LaWQgfTsKICAvKioKKiBSZXR1cm5zIHRoZSBYIHBvc2l0aW9uIG9mIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHRhc2sgYmFyIG9uIHRoZSBncmFwaCAocmlnaHQgc2lkZSkKKiBAbWV0aG9kIGdldFN0YXJ0WAoqIEByZXR1cm4ge051bWJlcn0KKi8gICAgdGhpcy5nZXRTdGFydFggICA9IGZ1bmN0aW9uKCl7IHJldHVybiB4MSB9OwoKLyoqCiogUmV0dXJucyB0aGUgWSBwb3NpdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSB0YXNrIGJhciBvbiB0aGUgZ3JhcGggKHJpZ2h0IHNpZGUpCiogQG1ldGhvZCBnZXRTdGFydFkKKiBAcmV0dXJuIHtOdW1iZXJ9CiovICAgIHRoaXMuZ2V0U3RhcnRZICAgPSBmdW5jdGlvbigpeyByZXR1cm4geTEgfTsKCi8qKgoqIFJldHVybnMgdGhlIFggcG9zaXRpb24gb2YgdGhlIHJpZ2h0IG9mIHRoZSB0YXNrIGJhciBvbiB0aGUgZ3JhcGggKHJpZ2h0IHNpZGUpCiogQG1ldGhvZCBnZXRFbmRYCiogQHJldHVybiB7SW50fQoqLyAgICB0aGlzLmdldEVuZFggICAgID0gZnVuY3Rpb24oKXsgcmV0dXJuIHgyIH07CgovKioKKiBSZXR1cm5zIHRoZSBZIHBvc2l0aW9uIG9mIHRoZSBib3R0b20gb2YgdGhlIHRhc2sgYmFyIG9uIHRoZSBncmFwaCAocmlnaHQgc2lkZSkKKiBAbWV0aG9kIGdldEVuZFkKKiBAcmV0dXJuIHtOdW1iZXJ9CiovICAgIHRoaXMuZ2V0RW5kWSAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4geTIgfTsKCi8qKgoqIFJldHVybnMgd2hldGhlciB0YXNrIGlzIHZpc2libGUgICgxPVllcywwPU5vKQoqIEBtZXRob2QgZ2V0VmlzaWJsZQoqIEByZXR1cm4ge0Jvb2xlYW59CiovICAgIHRoaXMuZ2V0VmlzaWJsZSAgPSBmdW5jdGlvbigpeyByZXR1cm4gdlZpc2libGUgfTsKCi8qKgoqIFNldCB0YXNrIGRlcGVuZGVuY2llcwoqIEBtZXRob2Qgc2V0RGVwZW5kCiogQHBhcmFtIHBEZXBlbmQge1N0cmluZ30gQSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiB0YXNrIElEcyB0aGUgY3VycmVudCB0YXNrIGRlcGVuZHMgb24uCiogQHJldHVybiB7dm9pZH0KKi8gIHRoaXMuc2V0RGVwZW5kICAgPSBmdW5jdGlvbihwRGVwZW5kKXsgdkRlcGVuZCA9IHBEZXBlbmQ7fTsKCi8qKgoqIFNldCB0YXNrIHN0YXJ0IGRhdGUvdGltZQoqIEBtZXRob2Qgc2V0U3RhcnQKKiBAcGFyYW0gcFN0YXJ0IHtEYXRldGltZX0gCiogQHJldHVybiB7dm9pZH0KKi8gICAgdGhpcy5zZXRTdGFydCAgICA9IGZ1bmN0aW9uKHBTdGFydCl7IHZTdGFydCA9IHBTdGFydDt9OwoKLyoqCiogU2V0IHRhc2sgZW5kIGRhdGUvdGltZQoqIEBtZXRob2Qgc2V0RW5kCiogQHBhcmFtIHBFbmQge0RhdGV0aW1lfQoqIEByZXR1cm4ge3ZvaWR9CiovICAgIHRoaXMuc2V0RW5kICAgICAgPSBmdW5jdGlvbihwRW5kKSAgeyB2RW5kICAgPSBwRW5kOyAgfTsKCi8qKgoqIFNldCB0YXNrIHRyZWUgbGV2ZWwgKDAsMSwyLDMuLi4pCiogQG1ldGhvZCBzZXRMZXZlbAoqIEBwYXJhbSBwTGV2ZWwge051bWJlcn0gCiogQHJldHVybiB7dm9pZH0KKi8gICAgdGhpcy5zZXRMZXZlbCAgICA9IGZ1bmN0aW9uKHBMZXZlbCl7IHZMZXZlbCA9IHBMZXZlbDt9OwoKLyoqCiogU2V0IE51bWJlciBvZiBjaGlsZHJlbiBmb3IgdGhlIHRhc2sKKiBAbWV0aG9kIHNldE51bUtpZAoqIEBwYXJhbSBwTnVtS2lkIHtOdW1iZXJ9CiogQHJldHVybiB7dm9pZH0KKi8gICAgdGhpcy5zZXROdW1LaWQgICA9IGZ1bmN0aW9uKHBOdW1LaWQpeyB2TnVtS2lkID0gcE51bUtpZDt9OwoKLyoqCiogU2V0IHRhc2sgY29tcGxldGlvbiBwZXJjZW50YWdlCiogQG1ldGhvZCBzZXRDb21wVmFsCiogQHBhcmFtIHBDb21wVmFsIHtOdW1iZXJ9IAoqIEByZXR1cm4ge3ZvaWR9CiovICAgIHRoaXMuc2V0Q29tcFZhbCAgPSBmdW5jdGlvbihwQ29tcFZhbCl7IHZDb21wID0gcENvbXBWYWw7fTsKCi8qKgoqIFNldCBhIHRhc2sgYmFyIHN0YXJ0aW5nIHBvc2l0aW9uIChsZWZ0KQoqIEBtZXRob2Qgc2V0U3RhcnRYCiogQHBhcmFtIHBYIHtOdW1iZXJ9IAoqIEByZXR1cm4ge3ZvaWR9CiovICAgIHRoaXMuc2V0U3RhcnRYICAgPSBmdW5jdGlvbihwWCkge3gxID0gcFg7IH07CgovKioKKiBTZXQgYSB0YXNrIGJhciBzdGFydGluZyBwb3NpdGlvbiAodG9wKQoqIEBtZXRob2Qgc2V0U3RhcnRZCiogQHBhcmFtIHBZIHtOdW1iZXJ9IAoqIEByZXR1cm4ge1N0cmluZ30KKi8gICAgdGhpcy5zZXRTdGFydFkgICA9IGZ1bmN0aW9uKHBZKSB7eTEgPSBwWTsgfTsKCi8qKgoqIFNldCBhIHRhc2sgYmFyIHN0YXJ0aW5nIHBvc2l0aW9uIChyaWdodCkKKiBAbWV0aG9kIHNldEVuZFgKKiBAcGFyYW0gcFgge051bWJlcn0gCiogQHJldHVybiB7U3RyaW5nfQoqLyAgICB0aGlzLnNldEVuZFggICAgID0gZnVuY3Rpb24ocFgpIHt4MiA9IHBYOyB9OwoKLyoqCiogU2V0IGEgdGFzayBiYXIgc3RhcnRpbmcgcG9zaXRpb24gKGJvdHRvbSkKKiBAbWV0aG9kIHNldEVuZFkKKiBAcGFyYW0gcFkge051bWJlcn0gCiogQHJldHVybiB7U3RyaW5nfQoqLyAgICB0aGlzLnNldEVuZFkgICAgID0gZnVuY3Rpb24ocFkpIHt5MiA9IHBZOyB9OwoKLyoqCiogU2V0IHRhc2sgb3Blbi9jbG9zZWQKKiBAbWV0aG9kIHNldE9wZW4KKiBAcGFyYW0gcE9wZW4ge0Jvb2xlYW59IAoqIEByZXR1cm4ge3ZvaWR9CiovICAgIHRoaXMuc2V0T3BlbiAgICAgPSBmdW5jdGlvbihwT3Blbikge3ZPcGVuID0gcE9wZW47IH07CgovKioKKiBTZXQgdGFzayB2aXNpYmlsaXR5CiogQG1ldGhvZCBzZXRWaXNpYmxlCiogQHBhcmFtIHBWaXNpYmxlIHtCb29sZWFufSAKKiBAcmV0dXJuIHt2b2lkfQoqLyAgICB0aGlzLnNldFZpc2libGUgID0gZnVuY3Rpb24ocFZpc2libGUpIHt2VmlzaWJsZSA9IHBWaXNpYmxlOyB9OwoKICB9OwoJCgkKLyoqCiogQ3JlYXRlcyB0aGUgZ2FudCBjaGFydC4gZm9yIGV4YW1wbGU6Cgo8cD52YXIgZyA9IG5ldyBKU0dhbnR0LkdhbnR0Q2hhcnQoJ2cnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdHYW50dENoYXJ0RElWJyksICdkYXknKTs8L3A+CiAKdmFyIGcgPSBuZXcgSlNHYW50dC5HYW50dENoYXJ0KCAtIGFzc2lnbiB0aGUgZ2FudHQgY2hhcnQgdG8gYSBqYXZhc2NyaXB0IHZhcmlhYmxlIGNhbGxlZCAnZycKJ2cnIC0gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgd2FzIGp1c3QgYXNzaWduZWQgKHdpbGwgYmUgdXNlZCBsYXRlciBzbyB0aGF0IGdhbnR0IG9iamVjdCBjYW4gcmVmZXJlbmNlIGl0c2VsZikKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0dhbnR0Q2hhcnRESVYnKSAtIHJlZmVyZW5jZSB0byB0aGUgRElWIHRoYXQgd2lsbCBob2xkIHRoZSBnYW50dCBjaGFydAonZGF5JyAtIGRlZmF1bHQgZm9ybWF0IHdpbGwgYmUgYnkgZGF5CgoqCiogQGNsYXNzIEdhbnR0Q2hhcnQgCiogQHBhcmFtIHBHYW50dFZhciB7U3RyaW5nfSB0aGUgbmFtZSBvZiB0aGUgZ2FudHQgY2hhcnQgdmFyaWFibGUKKiBAcGFyYW0gcERpdiB7U3RyaW5nfSByZWZlcmVuY2UgdG8gdGhlIERJViB0aGF0IHdpbGwgaG9sZCB0aGUgZ2FudHQgY2hhcnQKKiBAcGFyYW0gcEZvcm1hdCB7U3RyaW5nfSBkZWZhdWx0IGZvcm1hdCAobWludXRlLGhvdXIsZGF5LHdlZWssbW9udGgscXVhcnRlcikKKiBAcmV0dXJuIHZvaWQKKi8KCkpTR2FudHQuR2FudHRDaGFydCA9ICBmdW5jdGlvbihwR2FudHRWYXIsIHBEaXYsIHBGb3JtYXQpCnsKLyoqCiogVGhlIG5hbWUgb2YgdGhlIGdhbnR0IGNoYXJ0IHZhcmlhYmxlCiogQHByb3BlcnR5IHZHYW50dFZhciAKKiBAdHlwZSBTdHJpbmcgCiogQGRlZmF1bHQgcEdhbnR0VmFyCiogQHByaXZhdGUKKi8gdmFyIHZHYW50dFZhciA9IHBHYW50dFZhcjsKLyoqCiogVGhlIG5hbWUgb2YgdGhlIGdhbnR0IGNoYXJ0IERJVgoqIEBwcm9wZXJ0eSB2RGl2IAoqIEB0eXBlIFN0cmluZyAKKiBAZGVmYXVsdCBwRGl2CiogQHByaXZhdGUKKi8gIHZhciB2RGl2ICAgICAgPSBwRGl2OwovKioKKiBTZWxlY3RlZCBmb3JtYXQgKG1pbnV0ZSxob3VyLGRheSx3ZWVrLG1vbnRoKQoqIEBwcm9wZXJ0eSB2Rm9ybWF0IAoqIEB0eXBlIFN0cmluZyAKKiBAZGVmYXVsdCBwRm9ybWF0CiogQHByaXZhdGUKKi8gdmFyIHZGb3JtYXQgICA9IHBGb3JtYXQ7Ci8qKgoqIFNob3cgcmVzb3VyY2UgY29sdW1uIAoqIEBwcm9wZXJ0eSB2U2hvd1JlcyAKKiBAdHlwZSBOdW1iZXIgCiogQGRlZmF1bHQgMQoqIEBwcml2YXRlCiovIHZhciB2U2hvd1JlcyAgPSAxOwovKioKKiBTaG93IGR1cmF0aW9uIGNvbHVtbiAKKiBAcHJvcGVydHkgdlNob3dEdXIgCiogQHR5cGUgTnVtYmVyIAoqIEBkZWZhdWx0IDEKKiBAcHJpdmF0ZQoqLyB2YXIgdlNob3dEdXIgID0gMTsKLyoqCiogU2hvdyBwZXJjZW50IGNvbXBsZXRlIGNvbHVtbiAKKiBAcHJvcGVydHkgdlNob3dDb21wIAoqIEB0eXBlIE51bWJlciAKKiBAZGVmYXVsdCAxCiogQHByaXZhdGUKKi8gdmFyIHZTaG93Q29tcCA9IDE7Ci8qKgoqIFNob3cgc3RhcnQgZGF0ZSBjb2x1bW4gCiogQHByb3BlcnR5IHZTaG93U3RhcnREYXRlIAoqIEB0eXBlIE51bWJlciAKKiBAZGVmYXVsdCAxCiogQHByaXZhdGUKKi8gdmFyIHZTaG93U3RhcnREYXRlID0gMTsKLyoqCiogU2hvdyBlbmQgZGF0ZSBjb2x1bW4gCiogQHByb3BlcnR5IHZTaG93RW5kRGF0ZSAKKiBAdHlwZSBOdW1iZXIgCiogQGRlZmF1bHQgMQoqIEBwcml2YXRlCiovIHZhciB2U2hvd0VuZERhdGUgPSAxOwovKioKKiBEYXRlIGlucHV0IGZvcm1hdCAKKiBAcHJvcGVydHkgdkRhdGVJbnB1dEZvcm1hdCAKKiBAdHlwZSBTdHJpbmcgCiogQGRlZmF1bHQgIm1tL2RkL3l5eXkiCiogQHByaXZhdGUKKi92YXIgdkRhdGVJbnB1dEZvcm1hdCA9ICJtbS9kZC95eXl5IjsKLyoqCiogRGF0ZSBkaXNwbGF5IGZvcm1hdCAKKiBAcHJvcGVydHkgdkRhdGVEaXNwbGF5Rm9ybWF0IAoqIEB0eXBlIFN0cmluZyAKKiBAZGVmYXVsdCAibW0vZGQveXkiCiogQHByaXZhdGUKKi92YXIgdkRhdGVEaXNwbGF5Rm9ybWF0ID0gIm1tL2RkL3l5IjsKCgkgIHZhciB2TnVtVW5pdHMgID0gMDsKICAgICAgdmFyIHZDYXB0aW9uVHlwZTsKICAgICAgdmFyIHZEZXBJZCA9IDE7CiAgICAgIHZhciB2VGFza0xpc3QgICAgID0gbmV3IEFycmF5KCk7CQoJICB2YXIgdkZvcm1hdEFycgk9IG5ldyBBcnJheSgiZGF5Iiwid2VlayIsIm1vbnRoIiwicXVhcnRlciIpOwogICAgICB2YXIgdlF1YXJ0ZXJBcnIgICA9IG5ldyBBcnJheSgxLDEsMSwyLDIsMiwzLDMsMyw0LDQsNCk7CiAgICAgIHZhciB2TW9udGhEYXlzQXJyID0gbmV3IEFycmF5KDMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxKTsKICAgICAgdmFyIHZNb250aEFyciAgICAgPSBuZXcgQXJyYXkoIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIik7Ci8qKgoqIFNldCBjdXJyZW50IGRpc3BsYXkgZm9ybWF0IChtaW51dGUvaG91ci9kYXkvd2Vlay9tb250aC9xdWFydGVyKQoqIE9ubHkgdGhlIGZpcnN0IDQgYXJndW1lbnRzIGFyZSB1c2VkLCBmb3IgZXhhbXBsZToKKiA8Y29kZT4KKiBnLnNldEZvcm1hdEFycigiZGF5Iiwid2VlayIsIm1vbnRoIik7CiogPC9jb2RlPgoqIHdpbGwgc2hvdyAzIGZvcm1hdHRpbmcgb3B0aW9ucyAoZGF5L3dlZWsvbW9udGgpIGF0IHRoZSBib3R0b20gcmlnaHQgb2YgdGhlIGdhbnR0IGNoYXJ0CiogQG1ldGhvZCBzZXRGb3JtYXRBcnIKKiBAcmV0dXJuIHt2b2lkfQoqLyB0aGlzLnNldEZvcm1hdEFyciA9IGZ1bmN0aW9uKCkgCSB7CgkJCQkJCQkJCQkgIHZGb3JtYXRBcnIgPSBuZXcgQXJyYXkoKTsKCQkJCQkJCQkJCSAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge3ZGb3JtYXRBcnJbaV0gPSBhcmd1bWVudHNbaV07fQoJCQkJCQkJCQkJICBpZih2Rm9ybWF0QXJyLmxlbmd0aD40KXt2Rm9ybWF0QXJyLmxlbmd0aD00O30KCQkJCQkJCQkJCSB9OwovKioKKiBTaG93L0hpZGUgcmVzb3VyY2UgY29sdW1uCiogQHBhcmFtIHBTaG93IHtOdW1iZXJ9IDE9U2hvdywwPUhpZGUKKiBAbWV0aG9kIHNldFNob3dSZXMKKiBAcmV0dXJuIHt2b2lkfQoqLyB0aGlzLnNldFNob3dSZXMgID0gZnVuY3Rpb24ocFNob3cpIHsgdlNob3dSZXMgID0gcFNob3c7IH07Ci8qKgoqIFNob3cvSGlkZSBkdXJhdGlvbiBjb2x1bW4KKiBAcGFyYW0gcFNob3cge051bWJlcn0gMT1TaG93LDA9SGlkZQoqIEBtZXRob2Qgc2V0U2hvd0R1cgoqIEByZXR1cm4ge3ZvaWR9CiovIHRoaXMuc2V0U2hvd0R1ciAgPSBmdW5jdGlvbihwU2hvdykgeyB2U2hvd0R1ciAgPSBwU2hvdzsgfTsKLyoqCiogU2hvdy9IaWRlIGNvbXBsZXRlZCBjb2x1bW4KKiBAcGFyYW0gcFNob3cge051bWJlcn0gMT1TaG93LDA9SGlkZQoqIEBtZXRob2Qgc2V0U2hvd0NvbXAKKiBAcmV0dXJuIHt2b2lkfQoqLyB0aGlzLnNldFNob3dDb21wID0gZnVuY3Rpb24ocFNob3cpIHsgdlNob3dDb21wID0gcFNob3c7IH07Ci8qKgoqIFNob3cvSGlkZSBzdGFydCBkYXRlIGNvbHVtbgoqIEBwYXJhbSBwU2hvdyB7TnVtYmVyfSAxPVNob3csMD1IaWRlCiogQG1ldGhvZCBzZXRTaG93U3RhcnREYXRlCiogQHJldHVybiB7dm9pZH0KKi8gdGhpcy5zZXRTaG93U3RhcnREYXRlID0gZnVuY3Rpb24ocFNob3cpIHsgdlNob3dTdGFydERhdGUgPSBwU2hvdzsgfTsKLyoqCiogU2hvdy9IaWRlIGVuZCBkYXRlIGNvbHVtbgoqIEBwYXJhbSBwU2hvdyB7TnVtYmVyfSAxPVNob3csMD1IaWRlCiogQG1ldGhvZCBzZXRTaG93RW5kRGF0ZQoqIEByZXR1cm4ge3ZvaWR9CiovIHRoaXMuc2V0U2hvd0VuZERhdGUgPSBmdW5jdGlvbihwU2hvdykgeyB2U2hvd0VuZERhdGUgPSBwU2hvdzsgfTsKLyoqCiogT3ZlcmFsbCBkYXRlIGlucHV0IGZvcm1hdCAKKiBAcGFyYW0gcFNob3cge1N0cmluZ30gKG1tL2RkL3l5eXksZGQvbW0veXl5eSx5eXl5LW1tLWRkKQoqIEBtZXRob2Qgc2V0RGF0ZUlucHV0Rm9ybWF0CiogQHJldHVybiB7dm9pZH0KKi8gICAgICB0aGlzLnNldERhdGVJbnB1dEZvcm1hdCA9IGZ1bmN0aW9uKHBTaG93KSB7IHZEYXRlSW5wdXRGb3JtYXQgPSBwU2hvdzsgfTsKLyoqCiogT3ZlcmFsbCBkYXRlIGRpc3BsYXkgZm9ybWF0IAoqIEBwYXJhbSBwU2hvdyB7U3RyaW5nfSAobW0vZGQveXl5eSxkZC9tbS95eXl5LHl5eXktbW0tZGQpCiogQG1ldGhvZCBzZXREYXRlRGlzcGxheUZvcm1hdAoqIEByZXR1cm4ge3ZvaWR9CiovICAgICAgdGhpcy5zZXREYXRlRGlzcGxheUZvcm1hdCA9IGZ1bmN0aW9uKHBTaG93KSB7IHZEYXRlRGlzcGxheUZvcm1hdCA9IHBTaG93OyB9OwovKioKKiBTZXQgZ2FudHQgY2FwdGlvbgoqIEBwYXJhbSBwVHlwZSB7U3RyaW5nfSAKPHA+Q2FwdGlvbi1EaXNwbGF5cyBhIGN1c3RvbSBjYXB0aW9uIHNldCBpbiBUYXNrSXRlbTxicj4KUmVzb3VyY2UtRGlzcGxheXMgdGFzayByZXNvdXJjZTxicj4KRHVyYXRpb24tRGlzcGxheXMgdGFzayBkdXJhdGlvbjxicj4KQ29tcGxldGUtRGlzcGxheXMgdGFzayBwZXJjZW50IGNvbXBsZXRlPC9wPgoqIEBtZXRob2Qgc2V0Q2FwdGlvblR5cGUKKiBAcmV0dXJuIHt2b2lkfQoqLyAgdGhpcy5zZXRDYXB0aW9uVHlwZSA9IGZ1bmN0aW9uKHBUeXBlKSB7IHZDYXB0aW9uVHlwZSA9IHBUeXBlIH07Ci8qKgoqIFNldCBjdXJyZW50IGRpc3BsYXkgZm9ybWF0IGFuZCByZWRyYXcgZ2FudHQgY2hhcnQgKG1pbnV0ZS9ob3VyL2RheS93ZWVrL21vbnRoL3F1YXJ0ZXIpCiogQHBhcmFtIHBGb3JtYXQge1N0cmluZ30gKG1tL2RkL3l5eXksZGQvbW0veXl5eSx5eXl5LW1tLWRkKQoqIEBtZXRob2Qgc2V0Rm9ybWF0CiogQHJldHVybiB7dm9pZH0KKi8gdGhpcy5zZXRGb3JtYXQgPSBmdW5jdGlvbihwRm9ybWF0KXsgCiAgICAgICAgIHZGb3JtYXQgPSBwRm9ybWF0OyAKICAgICAgICAgdGhpcy5EcmF3KCk7IAogICAgICB9OwovKioKKiBSZXR1cm5zIHdoZXRoZXIgcmVzb3VyY2UgY29sdW1uIGlzIHNob3duCiogQG1ldGhvZCBnZXRTaG93UmVzCiogQHJldHVybiB7TnVtYmVyfQoqLyAgdGhpcy5nZXRTaG93UmVzICA9IGZ1bmN0aW9uKCl7IHJldHVybiB2U2hvd1JlcyB9OwovKioKKiBSZXR1cm5zIHdoZXRoZXIgZHVyYXRpb24gY29sdW1uIGlzIHNob3duCiogQG1ldGhvZCBnZXRTaG93RHVyCiogQHJldHVybiB7TnVtYmVyfQoqLyAgdGhpcy5nZXRTaG93RHVyICA9IGZ1bmN0aW9uKCl7IHJldHVybiB2U2hvd0R1ciB9OwovKioKKiBSZXR1cm5zIHdoZXRoZXIgcGVyY2VudCBjb21wbGV0ZSBjb2x1bW4gaXMgc2hvd24KKiBAbWV0aG9kIGdldFNob3dDb21wCiogQHJldHVybiB7TnVtYmVyfQoqLyAgdGhpcy5nZXRTaG93Q29tcCA9IGZ1bmN0aW9uKCl7IHJldHVybiB2U2hvd0NvbXAgfTsKLyoqCiogUmV0dXJucyB3aGV0aGVyIHN0YXJ0IGRhdGUgY29sdW1uIGlzIHNob3duCiogQG1ldGhvZCBnZXRTaG93U3RhcnREYXRlCiogQHJldHVybiB7TnVtYmVyfQoqLyAgdGhpcy5nZXRTaG93U3RhcnREYXRlID0gZnVuY3Rpb24oKXsgcmV0dXJuIHZTaG93U3RhcnREYXRlIH07Ci8qKgoqIFJldHVybnMgd2hldGhlciBlbmQgZGF0ZSBjb2x1bW4gaXMgc2hvd24KKiBAbWV0aG9kIGdldFNob3dFbmREYXRlCiogQHJldHVybiB7TnVtYmVyfQoqLyAgdGhpcy5nZXRTaG93RW5kRGF0ZSA9IGZ1bmN0aW9uKCl7IHJldHVybiB2U2hvd0VuZERhdGUgfTsKLyoqCiogUmV0dXJucyBkYXRlIGlucHV0IGZvcm1hdCAKKiBAbWV0aG9kIGdldERhdGVJbnB1dEZvcm1hdAoqIEByZXR1cm4ge1N0cmluZ30KKi8gIHRoaXMuZ2V0RGF0ZUlucHV0Rm9ybWF0ID0gZnVuY3Rpb24oKSB7IHJldHVybiB2RGF0ZUlucHV0Rm9ybWF0IH07Ci8qKgoqIFJldHVybnMgY3VycmVudCBkaXNwbGF5IGZvcm1hdAoqIEBtZXRob2QgZ2V0RGF0ZURpc3BsYXlGb3JtYXQKKiBAcmV0dXJuIHtTdHJpbmd9CiovICB0aGlzLmdldERhdGVEaXNwbGF5Rm9ybWF0ID0gZnVuY3Rpb24oKSB7IHJldHVybiB2RGF0ZURpc3BsYXlGb3JtYXQgfTsKLyoqCiogUmV0dXJucyBjdXJyZW50IGdhbnR0IGNhcHRpb24gdHlwZQoqIEBtZXRob2QgZ2V0Q2FwdGlvblR5cGUKKiBAcmV0dXJuIHtTdHJpbmd9CiovICB0aGlzLmdldENhcHRpb25UeXBlID0gZnVuY3Rpb24oKSB7IHJldHVybiB2Q2FwdGlvblR5cGUgfTsKLyoqCiogQ2FsY3VsYXRlcyBYL1kgY29vcmRpbmF0ZXMgb2YgYSB0YXNrIGFuZCBzZXRzIHRoZSBTdGFydCBhbmQgRW5kIHByb3BlcnRpZXMgb2YgdGhlIFRhc2tJdGVtCiogQG1ldGhvZCBDYWxjVGFza1hZCiogQHJldHVybiB7Vm9pZH0KKi8gIHRoaXMuQ2FsY1Rhc2tYWSA9IGZ1bmN0aW9uICgpIAogICAgICB7CiAgICAgICAgIHZhciB2TGlzdCA9IHRoaXMuZ2V0TGlzdCgpOwogICAgICAgICB2YXIgdlRhc2tEaXY7CiAgICAgICAgIHZhciB2UGFyRGl2OwogICAgICAgICB2YXIgdkxlZnQsIHZUb3AsIHZIZWlnaHQsIHZXaWR0aDsKCiAgICAgICAgIGZvcihpID0gMDsgaSA8IHZMaXN0Lmxlbmd0aDsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgIHZJRCA9IHZMaXN0W2ldLmdldElEKCk7CiAgICAgICAgICAgIHZUYXNrRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRhc2tiYXJfIit2SUQpOwogICAgICAgICAgICB2QmFyRGl2ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiYXJkaXZfIit2SUQpOwogICAgICAgICAgICB2UGFyRGl2ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGlsZGdyaWRfIit2SUQpOwoKICAgICAgICAgICAgaWYodkJhckRpdikgewogICAgICAgICAgICAgICB2TGlzdFtpXS5zZXRTdGFydFgoIHZCYXJEaXYub2Zmc2V0TGVmdCApOwogICAgICAgICAgICAgICB2TGlzdFtpXS5zZXRTdGFydFkoIHZQYXJEaXYub2Zmc2V0VG9wK3ZCYXJEaXYub2Zmc2V0VG9wKzYgKTsKICAgICAgICAgICAgICAgdkxpc3RbaV0uc2V0RW5kWCggdkJhckRpdi5vZmZzZXRMZWZ0ICsgdkJhckRpdi5vZmZzZXRXaWR0aCApOwogICAgICAgICAgICAgICB2TGlzdFtpXS5zZXRFbmRZKCB2UGFyRGl2Lm9mZnNldFRvcCt2QmFyRGl2Lm9mZnNldFRvcCs2ICk7CiAgICAgICAgICAgIH07CiAgICAgICAgIH07CiAgICAgIH07CgovKioKKiBBZGRzIGEgVGFza0l0ZW0gdG8gdGhlIEdhbnR0IG9iamVjdCB0YXNrIGxpc3QgYXJyYXkKKiBAbWV0aG9kIEFkZFRhc2tJdGVtCiogQHJldHVybiB7Vm9pZH0KKi8gIHRoaXMuQWRkVGFza0l0ZW0gPSBmdW5jdGlvbih2YWx1ZSkKICAgICAgewogICAgICAgICB2VGFza0xpc3QucHVzaCh2YWx1ZSk7CiAgICAgIH07Ci8qKgoqIFJldHVybnMgdGFzayBsaXN0IEFycmF5CiogQG1ldGhvZCBnZXRMaXN0CiogQHJldHVybiB7QXJyYXl9CiovIHRoaXMuZ2V0TGlzdCAgID0gZnVuY3Rpb24oKSB7IHJldHVybiB2VGFza0xpc3QgfTsKCi8qKgoqIENsZWFycyBkZXBlbmRlbmN5IGxpbmVzIGJldHdlZW4gdGFza3MKKiBAbWV0aG9kIGNsZWFyRGVwZW5kZW5jaWVzCiogQHJldHVybiB7Vm9pZH0KKi8gdGhpcy5jbGVhckRlcGVuZGVuY2llcyA9IGZ1bmN0aW9uKCkKICAgICAgewogICAgICAgICB2YXIgcGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JpZ2h0c2lkZScpOwogICAgICAgICB2YXIgZGVwTGluZTsKICAgICAgICAgdmFyIHZNYXhJZCA9IHZEZXBJZDsKICAgICAgICAgZm9yICggaT0xOyBpPHZNYXhJZDsgaSsrICkgewogICAgICAgICAgICBkZXBMaW5lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxpbmUiK2kpOwogICAgICAgICAgICBpZiAoZGVwTGluZSkgeyBwYXJlbnQucmVtb3ZlQ2hpbGQoZGVwTGluZSk7IH0KICAgICAgICAgfTsKICAgICAgICAgdkRlcElkID0gMTsKICAgICAgfTsKLyoqCiogRHJhdyBhIHN0cmFpZ2h0IGxpbmUgKGNvbG9yZWQgb25lLXBpeGVsIHdpZGUgRElWKSwgbmVlZCB0byBwYXJhbWV0ZXJpemUgZG9jIGl0ZW0KKiBAbWV0aG9kIHNMaW5lCiogQHJldHVybiB7Vm9pZH0KKi8gIHRoaXMuc0xpbmUgPSBmdW5jdGlvbih4MSx5MSx4Mix5MikgewoKICAgICAgICAgdkxlZnQgPSBNYXRoLm1pbih4MSx4Mik7CiAgICAgICAgIHZUb3AgID0gTWF0aC5taW4oeTEseTIpOwogICAgICAgICB2V2lkICA9IE1hdGguYWJzKHgyLXgxKSArIDE7CiAgICAgICAgIHZIZ3QgID0gTWF0aC5hYnMoeTIteTEpICsgMTsKCiAgICAgICAgIHZEb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmlnaHRzaWRlJyk7CgoJCSAvLyByZXRyaWV2ZSBESVYKCQkgdmFyIG9EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCQoJCSBvRGl2LmlkID0gImxpbmUiK3ZEZXBJZCsrOwoJCQkgb0Rpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJIG9EaXYuc3R5bGUubWFyZ2luID0gIjBweCI7CgkJIG9EaXYuc3R5bGUucGFkZGluZyA9ICIwcHgiOwoJCSBvRGl2LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJIG9EaXYuc3R5bGUuYm9yZGVyID0gIjBweCI7CgoJCSAvLyBzZXQgYXR0cmlidXRlcwoJCSBvRGl2LnN0eWxlLnpJbmRleCA9IDA7CgkJIG9EaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gInJlZCI7CgkJCgkJIG9EaXYuc3R5bGUubGVmdCA9IHZMZWZ0ICsgInB4IjsKCQkgb0Rpdi5zdHlsZS50b3AgPSB2VG9wICsgInB4IjsKCQkgb0Rpdi5zdHlsZS53aWR0aCA9IHZXaWQgKyAicHgiOwoJCSBvRGl2LnN0eWxlLmhlaWdodCA9IHZIZ3QgKyAicHgiOwoJCgkJIG9EaXYuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKCQkKCQkgdkRvYy5hcHBlbmRDaGlsZChvRGl2KTsKCiAgICAgIH07CgovKioKKiBEcmF3IGEgZGlhZ2Fub2wgbGluZSAoY2FsYyBsaW5lIHgseSBwYWlycyBhbmQgZHJhdyBtdWx0aXBsZSBvbmUtYnktb25lIHNMaW5lcykKKiBAbWV0aG9kIGRMaW5lCiogQHJldHVybiB7Vm9pZH0KKi8gIHRoaXMuZExpbmUgPSBmdW5jdGlvbih4MSx5MSx4Mix5MikgewoKICAgICAgICAgdmFyIGR4ID0geDIgLSB4MTsKICAgICAgICAgdmFyIGR5ID0geTIgLSB5MTsKICAgICAgICAgdmFyIHggPSB4MTsKICAgICAgICAgdmFyIHkgPSB5MTsKCiAgICAgICAgIHZhciBuID0gTWF0aC5tYXgoTWF0aC5hYnMoZHgpLE1hdGguYWJzKGR5KSk7CiAgICAgICAgIGR4ID0gZHggLyBuOwogICAgICAgICBkeSA9IGR5IC8gbjsKICAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbjsgaSsrICkKICAgICAgICAgewogICAgICAgICAgICB2eCA9IE1hdGgucm91bmQoeCk7IAogICAgICAgICAgICB2eSA9IE1hdGgucm91bmQoeSk7CiAgICAgICAgICAgIHRoaXMuc0xpbmUodngsdnksdngsdnkpOwogICAgICAgICAgICB4ICs9IGR4OwogICAgICAgICAgICB5ICs9IGR5OwogICAgICAgICB9OwoKICAgICAgfTsKCi8qKgoqIERyYXcgZGVwZW5kZW5jeSBsaW5lIGJldHdlZW4gdHdvIHBvaW50cyAodGFzayAxIGVuZCAtPiB0YXNrIDIgc3RhcnQpCiogQG1ldGhvZCBkcmF3RGVwZW5kZW5jeQoqIEByZXR1cm4ge1ZvaWR9CiovIHRoaXMuZHJhd0RlcGVuZGVuY3kgPWZ1bmN0aW9uKHgxLHkxLHgyLHkyKQogICAgICB7CiAgICAgICAgIGlmKHgxICsgMTAgPCB4MikKICAgICAgICAgeyAKICAgICAgICAgICAgdGhpcy5zTGluZSh4MSx5MSx4MSs0LHkxKTsKICAgICAgICAgICAgdGhpcy5zTGluZSh4MSs0LHkxLHgxKzQseTIpOwogICAgICAgICAgICB0aGlzLnNMaW5lKHgxKzQseTIseDIseTIpOwogICAgICAgICAgICB0aGlzLmRMaW5lKHgyLHkyLHgyLTMseTItMyk7CiAgICAgICAgICAgIHRoaXMuZExpbmUoeDIseTIseDItMyx5MiszKTsKICAgICAgICAgICAgdGhpcy5kTGluZSh4Mi0xLHkyLHgyLTMseTItMik7CiAgICAgICAgICAgIHRoaXMuZExpbmUoeDItMSx5Mix4Mi0zLHkyKzIpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICB0aGlzLnNMaW5lKHgxLHkxLHgxKzQseTEpOwogICAgICAgICAgICB0aGlzLnNMaW5lKHgxKzQseTEseDErNCx5Mi0xMCk7CiAgICAgICAgICAgIHRoaXMuc0xpbmUoeDErNCx5Mi0xMCx4Mi04LHkyLTEwKTsKICAgICAgICAgICAgdGhpcy5zTGluZSh4Mi04LHkyLTEwLHgyLTgseTIpOwogICAgICAgICAgICB0aGlzLnNMaW5lKHgyLTgseTIseDIseTIpOwogICAgICAgICAgICB0aGlzLmRMaW5lKHgyLHkyLHgyLTMseTItMyk7CiAgICAgICAgICAgIHRoaXMuZExpbmUoeDIseTIseDItMyx5MiszKTsKICAgICAgICAgICAgdGhpcy5kTGluZSh4Mi0xLHkyLHgyLTMseTItMik7CiAgICAgICAgICAgIHRoaXMuZExpbmUoeDItMSx5Mix4Mi0zLHkyKzIpOwogICAgICAgICB9CiAgICAgIH07CgovKioKKiBEcmF3IGFsbCB0YXNrIGRlcGVuZGVuY2llcyAKKiBAbWV0aG9kIERyYXdEZXBlbmRlbmNpZXMKKiBAcmV0dXJuIHtWb2lkfQoqLyAgdGhpcy5EcmF3RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgLy9GaXJzdCByZWNhbGN1bGF0ZSB0aGUgeCx5CiAgICAgICAgIHRoaXMuQ2FsY1Rhc2tYWSgpOwoKICAgICAgICAgdGhpcy5jbGVhckRlcGVuZGVuY2llcygpOwoKICAgICAgICAgdmFyIHZMaXN0ID0gdGhpcy5nZXRMaXN0KCk7CiAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB2TGlzdC5sZW5ndGg7IGkrKykKICAgICAgICAgewoKICAgICAgICAgICAgdkRlcGVuZCA9IHZMaXN0W2ldLmdldERlcGVuZCgpOwogICAgICAgICAgICBpZih2RGVwZW5kKSB7CiAgICAgICAgIAogICAgICAgICAgICAgICB2YXIgdkRlcGVuZFN0ciA9IHZEZXBlbmQgKyAnJzsKICAgICAgICAgICAgICAgdmFyIHZEZXBMaXN0ID0gdkRlcGVuZFN0ci5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICB2YXIgbiA9IHZEZXBMaXN0Lmxlbmd0aDsKCiAgICAgICAgICAgICAgIGZvcih2YXIgaz0wO2s8bjtrKyspIHsKICAgICAgICAgICAgICAgICAgdmFyIHZUYXNrID0gdGhpcy5nZXRBcnJheUxvY2F0aW9uQnlJRCh2RGVwTGlzdFtrXSk7CgogICAgICAgICAgICAgICAgICBpZih2TGlzdFt2VGFza10uZ2V0VmlzaWJsZSgpPT0xKQogICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdEZXBlbmRlbmN5KHZMaXN0W3ZUYXNrXS5nZXRFbmRYKCksdkxpc3RbdlRhc2tdLmdldEVuZFkoKSx2TGlzdFtpXS5nZXRTdGFydFgoKS0xLHZMaXN0W2ldLmdldFN0YXJ0WSgpKQogICAgICAgICAgICAgICB9CiAgCSAgICB9CiAgICAgICAgIH0KICAgICAgfTsKCi8qKgoqIEZpbmQgbG9jYXRpb24gb2YgVGFza0l0ZW0gYmFzZWQgb24gdGhlIHRhc2sgSUQKKiBAbWV0aG9kIGdldEFycmF5TG9jYXRpb25CeUlECiogQHJldHVybiB7Vm9pZH0KKi8gIHRoaXMuZ2V0QXJyYXlMb2NhdGlvbkJ5SUQgPSBmdW5jdGlvbihwSWQpICB7CgogICAgICAgICB2YXIgdkxpc3QgPSB0aGlzLmdldExpc3QoKTsKICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHZMaXN0Lmxlbmd0aDsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgIGlmKHZMaXN0W2ldLmdldElEKCk9PXBJZCkKICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KICAgICAgfTsKCi8qKgoqIERyYXcgZ2FudHQgY2hhcnQKKiBAbWV0aG9kIERyYXcKKiBAcmV0dXJuIHtWb2lkfQoqLyB0aGlzLkRyYXcgPSBmdW5jdGlvbigpCiAgIHsKICAgICAgdmFyIHZNYXhEYXRlID0gbmV3IERhdGUoKTsKICAgICAgdmFyIHZNaW5EYXRlID0gbmV3IERhdGUoKTsJCiAgICAgIHZhciB2VG1wRGF0ZSA9IG5ldyBEYXRlKCk7CiAgICAgIHZhciB2Tnh0RGF0ZSA9IG5ldyBEYXRlKCk7CiAgICAgIHZhciB2Q3VyckRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgdlRhc2tMZWZ0ID0gMDsKICAgICAgdmFyIHZUYXNrUmlnaHQgPSAwOwogICAgICB2YXIgdk51bUNvbHMgPSAwOwogICAgICB2YXIgdklEID0gMDsKICAgICAgdmFyIHZNYWluVGFibGUgPSAiIjsKICAgICAgdmFyIHZMZWZ0VGFibGUgPSAiIjsKICAgICAgdmFyIHZSaWdodFRhYmxlID0gIiI7CiAgICAgIHZhciB2RGF0ZVJvd1N0ciA9ICIiOwogICAgICB2YXIgdkl0ZW1Sb3dTdHIgPSAiIjsKICAgICAgdmFyIHZDb2xXaWR0aCA9IDA7CiAgICAgIHZhciB2Q29sVW5pdCA9IDA7CiAgICAgIHZhciB2Q2hhcnRXaWR0aCA9IDA7CiAgICAgIHZhciB2TnVtRGF5cyA9IDA7CiAgICAgIHZhciB2RGF5V2lkdGggPSAwOwogICAgICB2YXIgdlN0ciA9ICIiOwogICAgICB2YXIgdk5hbWVXaWR0aCA9IDIyMDsJCiAgICAgIHZhciB2U3RhdHVzV2lkdGggPSA3MDsKICAgICAgdmFyIHZMZWZ0V2lkdGggPSAxNSArIDIyMCArIDcwICsgNzAgKyA3MCArIDcwICsgNzA7CgogICAgICBpZih2VGFza0xpc3QubGVuZ3RoID4gMCkKICAgICAgewogICAgICAgIAoJCSAgIC8vIFByb2Nlc3MgYWxsIHRhc2tzIHByZXNldCBwYXJlbnQgZGF0ZSBhbmQgY29tcGxldGlvbiAlCiAgICAgICAgIEpTR2FudHQucHJvY2Vzc1Jvd3ModlRhc2tMaXN0LCAwLCAtMSwgMSwgMSk7CgogICAgICAgICAvLyBnZXQgb3ZlcmFsbCBtaW4vbWF4IGRhdGVzIHBsdXMgcGFkZGluZwogICAgICAgICB2TWluRGF0ZSA9IEpTR2FudHQuZ2V0TWluRGF0ZSh2VGFza0xpc3QsIHZGb3JtYXQpOwogICAgICAgICB2TWF4RGF0ZSA9IEpTR2FudHQuZ2V0TWF4RGF0ZSh2VGFza0xpc3QsIHZGb3JtYXQpOwoKICAgICAgICAgLy8gQ2FsY3VsYXRlIGNoYXJ0IHdpZHRoIHZhcmlhYmxlcy4gIHZDb2xXaWR0aCBjYW4gYmUgYWx0ZXJlZCBtYW51YWxseSB0byBjaGFuZ2UgZWFjaCBjb2x1bW4gd2lkdGgKICAgICAgICAgLy8gTWF5IGJlIHNtYXJ0IHRvIG1ha2UgdGhpcyBhIHBhcmFtZXRlciBvZiBHYW50dENoYXJ0IG9yIHNldCBpdCBiYXNlZCBvbiBleGlzdGluZyBwV2lkdGggcGFyYW1ldGVyCiAgICAgICAgIGlmKHZGb3JtYXQgPT0gJ2RheScpIHsKICAgICAgICAgICAgdkNvbFdpZHRoID0gMTg7CiAgICAgICAgICAgIHZDb2xVbml0ID0gMTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmKHZGb3JtYXQgPT0gJ3dlZWsnKSB7CiAgICAgICAgICAgIHZDb2xXaWR0aCA9IDM3OwogICAgICAgICAgICB2Q29sVW5pdCA9IDc7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZih2Rm9ybWF0ID09ICdtb250aCcpIHsKICAgICAgICAgICAgdkNvbFdpZHRoID0gMzc7CiAgICAgICAgICAgIHZDb2xVbml0ID0gMzA7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZih2Rm9ybWF0ID09ICdxdWFydGVyJykgewogICAgICAgICAgICB2Q29sV2lkdGggPSA2MDsKICAgICAgICAgICAgdkNvbFVuaXQgPSA5MDsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgZWxzZSBpZih2Rm9ybWF0PT0naG91cicpCiAgICAgICAgIHsKICAgICAgICAgICAgdkNvbFdpZHRoID0gMTg7CiAgICAgICAgICAgIHZDb2xVbml0ID0gMTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgZWxzZSBpZih2Rm9ybWF0PT0nbWludXRlJykKICAgICAgICAgewogICAgICAgICAgICB2Q29sV2lkdGggPSAxODsKICAgICAgICAgICAgdkNvbFVuaXQgPSAxOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICB2TnVtRGF5cyA9IChEYXRlLnBhcnNlKHZNYXhEYXRlKSAtIERhdGUucGFyc2Uodk1pbkRhdGUpKSAvICggMjQgKiA2MCAqIDYwICogMTAwMCk7CiAgICAgICAgIHZOdW1Vbml0cyA9IHZOdW1EYXlzIC8gdkNvbFVuaXQ7CiAgICAgICAgICAKICAgICAgICAgCiAgICAgICAgIHZDaGFydFdpZHRoID0gdk51bVVuaXRzICogdkNvbFdpZHRoICsgMTsKICAgICAgICAgdkRheVdpZHRoID0gKHZDb2xXaWR0aCAvIHZDb2xVbml0KSArICgxL3ZDb2xVbml0KTsKCiAgICAgICAgIHZNYWluVGFibGUgPQogICAgICAgICAgICAnPFRBQkxFIGlkPXRoZVRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCBib3JkZXI9MD48VEJPRFk+PFRSPicgKwogICAgICAgICAgICAnPFREIHZBbGlnbj10b3AgYmdDb2xvcj0jZmZmZmZmPic7CgogICAgICAgICBpZih2U2hvd1JlcyAhPTEpIHZOYW1lV2lkdGgrPXZTdGF0dXNXaWR0aDsKICAgICAgICAgaWYodlNob3dEdXIgIT0xKSB2TmFtZVdpZHRoKz12U3RhdHVzV2lkdGg7CiAgICAgICAgIGlmKHZTaG93Q29tcCE9MSkgdk5hbWVXaWR0aCs9dlN0YXR1c1dpZHRoOwoJCSAgIGlmKHZTaG93U3RhcnREYXRlIT0xKSB2TmFtZVdpZHRoKz12U3RhdHVzV2lkdGg7CgkJICAgaWYodlNob3dFbmREYXRlIT0xKSB2TmFtZVdpZHRoKz12U3RhdHVzV2lkdGg7CiAgICAgICAgCgkJICAgLy8gRFJBVyB0aGUgTGVmdC1zaWRlIG9mIHRoZSBjaGFydCAobmFtZXMsIHJlc291cmNlcywgY29tcCUpCiAgICAgICAgIHZMZWZ0VGFibGUgPQogICAgICAgICAgICAnPERJViBjbGFzcz1zY3JvbGwgaWQ9bGVmdHNpZGUgc3R5bGU9IndpZHRoOicgKyB2TGVmdFdpZHRoICsgJ3B4Ij48VEFCTEUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIGJvcmRlcj0wPjxUQk9EWT4nICsKICAgICAgICAgICAgJzxUUiBzdHlsZT0iSEVJR0hUOiAxN3B4Ij4nICsKICAgICAgICAgICAgJyAgPFREIHN0eWxlPSJXSURUSDogMTVweDsgSEVJR0hUOiAxN3B4Ij48L1REPicgKwogICAgICAgICAgICAnICA8VEQgc3R5bGU9IldJRFRIOiAnICsgdk5hbWVXaWR0aCArICdweDsgSEVJR0hUOiAxN3B4Ij48Tk9CUj48L05PQlI+PC9URD4nOyAKCiAgICAgICAgIGlmKHZTaG93UmVzID09MSkgdkxlZnRUYWJsZSArPSAnICA8VEQgc3R5bGU9IldJRFRIOiAnICsgdlN0YXR1c1dpZHRoICsgJ3B4OyBIRUlHSFQ6IDE3cHgiPjwvVEQ+JyA7CiAgICAgICAgIGlmKHZTaG93RHVyID09MSkgdkxlZnRUYWJsZSArPSAnICA8VEQgc3R5bGU9IldJRFRIOiAnICsgdlN0YXR1c1dpZHRoICsgJ3B4OyBIRUlHSFQ6IDE3cHgiPjwvVEQ+JyA7CiAgICAgICAgIGlmKHZTaG93Q29tcD09MSkgdkxlZnRUYWJsZSArPSAnICA8VEQgc3R5bGU9IldJRFRIOiAnICsgdlN0YXR1c1dpZHRoICsgJ3B4OyBIRUlHSFQ6IDE3cHgiPjwvVEQ+JyA7CgkJCWlmKHZTaG93U3RhcnREYXRlPT0xKSB2TGVmdFRhYmxlICs9ICcgIDxURCBzdHlsZT0iV0lEVEg6ICcgKyB2U3RhdHVzV2lkdGggKyAncHg7IEhFSUdIVDogMTdweCI+PC9URD4nIDsKCQkJaWYodlNob3dFbmREYXRlPT0xKSB2TGVmdFRhYmxlICs9ICcgIDxURCBzdHlsZT0iV0lEVEg6ICcgKyB2U3RhdHVzV2lkdGggKyAncHg7IEhFSUdIVDogMTdweCI+PC9URD4nIDsKCiAgICAgICAgIHZMZWZ0VGFibGUgKz0KICAgICAgICAgICAgJzxUUiBzdHlsZT0iSEVJR0hUOiAyMHB4Ij4nICsKICAgICAgICAgICAgJyAgPFREIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgV0lEVEg6IDE1cHg7IEhFSUdIVDogMjBweCI+PC9URD4nICsKICAgICAgICAgICAgJyAgPFREIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgV0lEVEg6ICcgKyB2TmFtZVdpZHRoICsgJ3B4OyBIRUlHSFQ6IDIwcHgiPjxOT0JSPjwvTk9CUj48L1REPicgOwoKICAgICAgICAgaWYodlNob3dSZXMgPT0xKSB2TGVmdFRhYmxlICs9ICcgIDxURCBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyBXSURUSDogNjBweDsgSEVJR0hUOiAyMHB4IiBhbGlnbj1jZW50ZXIgbm93cmFwPlJlc291cmNlPC9URD4nIDsKICAgICAgICAgaWYodlNob3dEdXIgPT0xKSB2TGVmdFRhYmxlICs9ICcgIDxURCBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyBXSURUSDogNjBweDsgSEVJR0hUOiAyMHB4IiBhbGlnbj1jZW50ZXIgbm93cmFwPkR1cmF0aW9uPC9URD4nIDsKICAgICAgICAgaWYodlNob3dDb21wPT0xKSB2TGVmdFRhYmxlICs9ICcgIDxURCBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyBXSURUSDogNjBweDsgSEVJR0hUOiAyMHB4IiBhbGlnbj1jZW50ZXIgbm93cmFwPiUgQ29tcC48L1REPicgOwogICAgICAgICBpZih2U2hvd1N0YXJ0RGF0ZT09MSkgdkxlZnRUYWJsZSArPSAnICA8VEQgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsgV0lEVEg6IDYwcHg7IEhFSUdIVDogMjBweCIgYWxpZ249Y2VudGVyIG5vd3JhcD5TdGFydCBEYXRlPC9URD4nIDsKICAgICAgICAgaWYodlNob3dFbmREYXRlPT0xKSB2TGVmdFRhYmxlICs9ICcgIDxURCBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyBXSURUSDogNjBweDsgSEVJR0hUOiAyMHB4IiBhbGlnbj1jZW50ZXIgbm93cmFwPkVuZCBEYXRlPC9URD4nIDsKIAogICAgICAgICB2TGVmdFRhYmxlICs9ICc8L1RSPic7CgogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCB2VGFza0xpc3QubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgaWYoIHZUYXNrTGlzdFtpXS5nZXRHcm91cCgpKSB7CiAgICAgICAgICAgICAgICAgIHZCR0NvbG9yID0gImYzZjNmMyI7CiAgICAgICAgICAgICAgICAgIHZSb3dUeXBlID0gImdyb3VwIjsKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdkJHQ29sb3IgID0gImZmZmZmZiI7CiAgICAgICAgICAgICAgICAgIHZSb3dUeXBlICA9ICJyb3ciOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICB2SUQgPSB2VGFza0xpc3RbaV0uZ2V0SUQoKTsKCiAgCQkgICAgICAgICBpZih2VGFza0xpc3RbaV0uZ2V0VmlzaWJsZSgpID09IDApIAogICAgICAgICAgICAgICAgICB2TGVmdFRhYmxlICs9ICc8VFIgaWQ9Y2hpbGRfJyArIHZJRCArICcgYmdjb2xvcj0jJyArIHZCR0NvbG9yICsgJyBzdHlsZT0iZGlzcGxheTpub25lIiAgb25Nb3VzZW92ZXI9Zy5tb3VzZU92ZXIodGhpcywnICsgdklEICsgJywibGVmdCIsIicgKyB2Um93VHlwZSArICciKSBvbk1vdXNlb3V0PWcubW91c2VPdXQodGhpcywnICsgdklEICsgJywibGVmdCIsIicgKyB2Um93VHlwZSArICciKT4nIDsKCQkJICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gJzxUUiBpZD1jaGlsZF8nICsgdklEICsgJyBiZ2NvbG9yPSMnICsgdkJHQ29sb3IgKyAnIG9uTW91c2VvdmVyPWcubW91c2VPdmVyKHRoaXMsJyArIHZJRCArICcsImxlZnQiLCInICsgdlJvd1R5cGUgKyAnIikgb25Nb3VzZW91dD1nLm1vdXNlT3V0KHRoaXMsJyArIHZJRCArICcsImxlZnQiLCInICsgdlJvd1R5cGUgKyAnIik+JyA7CgoJCQkgICAgICB2TGVmdFRhYmxlICs9IAogICAgICAgICAgICAgICAgICAnICA8VEQgY2xhc3M9Z2RhdGVoZWFkIHN0eWxlPSJXSURUSDogMTVweDsgSEVJR0hUOiAyMHB4OyBCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7Ij4mbmJzcDs8L1REPicgKwogICAgICAgICAgICAgICAgICAnICA8VEQgY2xhc3M9Z25hbWUgc3R5bGU9IldJRFRIOiAnICsgdk5hbWVXaWR0aCArICdweDsgSEVJR0hUOiAyMHB4OyBCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyIgbm93cmFwPjxOT0JSPjxzcGFuIHN0eWxlPSJjb2xvcjogI2FhYWFhYSI+JzsKCiAgICAgICAgICAgICAgIGZvcihqPTE7IGo8dlRhc2tMaXN0W2ldLmdldExldmVsKCk7IGorKykgewogICAgICAgICAgICAgICAgICB2TGVmdFRhYmxlICs9ICcmbmJzcCZuYnNwJm5ic3AmbmJzcCc7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gJzwvc3Bhbj4nOwoKICAgICAgICAgICAgICAgaWYoIHZUYXNrTGlzdFtpXS5nZXRHcm91cCgpKSB7CiAgICAgICAgICAgICAgICAgIGlmKCB2VGFza0xpc3RbaV0uZ2V0T3BlbigpID09IDEpIAogICAgICAgICAgICAgICAgICAgICB2TGVmdFRhYmxlICs9ICc8U1BBTiBpZD0iZ3JvdXBfJyArIHZJRCArICciIHN0eWxlPSJjb2xvcjojMDAwMDAwOyBjdXJzb3I6cG9pbnRlcjsgZm9udC13ZWlnaHQ6Ym9sZDsgRk9OVC1TSVpFOiAxMnB4OyIgb25jbGljaz0iSlNHYW50dC5mb2xkZXIoJyArIHZJRCArICcsJyt2R2FudHRWYXIrJyk7Jyt2R2FudHRWYXIrJy5EcmF3RGVwZW5kZW5jaWVzKCk7Ij4mbmRhc2g7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMDAwMDAwIj4mbmJzcDwvU1BBTj4nIDsKICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB2TGVmdFRhYmxlICs9ICc8U1BBTiBpZD0iZ3JvdXBfJyArIHZJRCArICciIHN0eWxlPSJjb2xvcjojMDAwMDAwOyBjdXJzb3I6cG9pbnRlcjsgZm9udC13ZWlnaHQ6Ym9sZDsgRk9OVC1TSVpFOiAxMnB4OyIgb25jbGljaz0iSlNHYW50dC5mb2xkZXIoJyArIHZJRCArICcsJyt2R2FudHRWYXIrJyk7Jyt2R2FudHRWYXIrJy5EcmF3RGVwZW5kZW5jaWVzKCk7Ij4rPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMDAwMDAwIj4mbmJzcDwvU1BBTj4nIDsKCQkJCSAKICAgICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gJzxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6Ym9sZDsgRk9OVC1TSVpFOiAxMnB4OyI+Jm5ic3AmbmJzcCZuYnNwPC9zcGFuPic7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gCiAgICAgICAgICAgICAgICAgICc8c3BhbiBvbmNsaWNrPUpTR2FudHQudGFza0xpbmsoIicgKyB2VGFza0xpc3RbaV0uZ2V0TGluaygpICsgJyIsMzAwLDIwMCk7IHN0eWxlPSJjdXJzb3I6cG9pbnRlciI+ICcgKyB2VGFza0xpc3RbaV0uZ2V0TmFtZSgpICsgJzwvc3Bhbj48L05PQlI+PC9URD4nIDsKCiAgICAgICAgICAgICAgIGlmKHZTaG93UmVzID09MSkgdkxlZnRUYWJsZSArPSAnICA8VEQgY2xhc3M9Z25hbWUgc3R5bGU9IldJRFRIOiA2MHB4OyBIRUlHSFQ6IDIwcHg7IFRFWFQtQUxJR046IGNlbnRlcjsgQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyIgYWxpZ249Y2VudGVyPjxOT0JSPicgKyB2VGFza0xpc3RbaV0uZ2V0UmVzb3VyY2UoKSArICc8L05PQlI+PC9URD4nIDsKICAgICAgICAgICAgICAgaWYodlNob3dEdXIgPT0xKSB2TGVmdFRhYmxlICs9ICcgIDxURCBjbGFzcz1nbmFtZSBzdHlsZT0iV0lEVEg6IDYwcHg7IEhFSUdIVDogMjBweDsgVEVYVC1BTElHTjogY2VudGVyOyBCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiBhbGlnbj1jZW50ZXI+PE5PQlI+JyArIHZUYXNrTGlzdFtpXS5nZXREdXJhdGlvbih2Rm9ybWF0KSArICc8L05PQlI+PC9URD4nIDsKICAgICAgICAgICAgICAgaWYodlNob3dDb21wPT0xKSB2TGVmdFRhYmxlICs9ICcgIDxURCBjbGFzcz1nbmFtZSBzdHlsZT0iV0lEVEg6IDYwcHg7IEhFSUdIVDogMjBweDsgVEVYVC1BTElHTjogY2VudGVyOyBCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiBhbGlnbj1jZW50ZXI+PE5PQlI+JyArIHZUYXNrTGlzdFtpXS5nZXRDb21wU3RyKCkgICsgJzwvTk9CUj48L1REPicgOwogICAgICAgICAgICAgICBpZih2U2hvd1N0YXJ0RGF0ZT09MSkgdkxlZnRUYWJsZSArPSAnICA8VEQgY2xhc3M9Z25hbWUgc3R5bGU9IldJRFRIOiA2MHB4OyBIRUlHSFQ6IDIwcHg7IFRFWFQtQUxJR046IGNlbnRlcjsgQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyIgYWxpZ249Y2VudGVyPjxOT0JSPicgKyBKU0dhbnR0LmZvcm1hdERhdGVTdHIoIHZUYXNrTGlzdFtpXS5nZXRTdGFydCgpLCB2RGF0ZURpc3BsYXlGb3JtYXQpICsgJzwvTk9CUj48L1REPicgOwogICAgICAgICAgICAgICBpZih2U2hvd0VuZERhdGU9PTEpIHZMZWZ0VGFibGUgKz0gJyAgPFREIGNsYXNzPWduYW1lIHN0eWxlPSJXSURUSDogNjBweDsgSEVJR0hUOiAyMHB4OyBURVhULUFMSUdOOiBjZW50ZXI7IEJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsiIGFsaWduPWNlbnRlcj48Tk9CUj4nICsgSlNHYW50dC5mb3JtYXREYXRlU3RyKCB2VGFza0xpc3RbaV0uZ2V0RW5kKCksIHZEYXRlRGlzcGxheUZvcm1hdCkgKyAnPC9OT0JSPjwvVEQ+JyA7CgogICAgICAgICAgICAgICB2TGVmdFRhYmxlICs9ICc8L1RSPic7CgogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBEUkFXIHRoZSBkYXRlIGZvcm1hdCBzZWxlY3RvciBhdCBib3R0b20gbGVmdC4gIEFub3RoZXIgcG90ZW50aWFsIEdhbnR0Q2hhcnQgcGFyYW1ldGVyIHRvIGhpZGUvc2hvdyB0aGlzIHNlbGVjdG9yCiAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gJzwvVEQ+PC9UUj4nICsKICAgICAgICAgICAgICAnPFRSPjxURCBib3JkZXI9MSBjb2xzcGFuPTUgYWxpZ249bGVmdCBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTFweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyBoZWlnaHQ9MThweCI+Jm5ic3A7Jm5ic3A7UG93ZXJlZCBieSA8YSBocmVmPWh0dHA6Ly93d3cuanNnYW50dC5jb20+anNHYW50dDwvYT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtGb3JtYXQ6JzsKCQkKCQkJaWYgKHZGb3JtYXRBcnIuam9pbigpLmluZGV4T2YoIm1pbnV0ZSIpIT0tMSkgeyAKICAgICAgICAgICAgaWYgKHZGb3JtYXQ9PSdtaW51dGUnKSB2TGVmdFRhYmxlICs9ICc8SU5QVVQgVFlQRT1SQURJTyBOQU1FPSJyYWRGb3JtYXQiIFZBTFVFPSJtaW51dGUiIGNoZWNrZWQ+TWludXRlJzsKICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICB2TGVmdFRhYmxlICs9ICc8SU5QVVQgVFlQRT1SQURJTyBOQU1FPSJyYWRGb3JtYXQiIG9uY2xpY2s9SlNHYW50dC5jaGFuZ2VGb3JtYXQoIm1pbnV0ZSIsJyt2R2FudHRWYXIrJyk7IFZBTFVFPSJtaW51dGUiPk1pbnV0ZSc7CgkJCX0KCQkJCgkJCWlmICh2Rm9ybWF0QXJyLmpvaW4oKS5pbmRleE9mKCJob3VyIikhPS0xKSB7IAogICAgICAgICAgICBpZiAodkZvcm1hdD09J2hvdXInKSB2TGVmdFRhYmxlICs9ICc8SU5QVVQgVFlQRT1SQURJTyBOQU1FPSJyYWRGb3JtYXQiIFZBTFVFPSJob3VyIiBjaGVja2VkPkhvdXInOwogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gJzxJTlBVVCBUWVBFPVJBRElPIE5BTUU9InJhZEZvcm1hdCIgb25jbGljaz1KU0dhbnR0LmNoYW5nZUZvcm1hdCgiaG91ciIsJyt2R2FudHRWYXIrJyk7IFZBTFVFPSJob3VyIj5Ib3VyJzsKCQkJfQoJCQkKCQkJaWYgKHZGb3JtYXRBcnIuam9pbigpLmluZGV4T2YoImRheSIpIT0tMSkgeyAKICAgICAgICAgICAgaWYgKHZGb3JtYXQ9PSdkYXknKSB2TGVmdFRhYmxlICs9ICc8SU5QVVQgVFlQRT1SQURJTyBOQU1FPSJyYWRGb3JtYXQiIFZBTFVFPSJkYXkiIGNoZWNrZWQ+RGF5JzsKICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICB2TGVmdFRhYmxlICs9ICc8SU5QVVQgVFlQRT1SQURJTyBOQU1FPSJyYWRGb3JtYXQiIG9uY2xpY2s9SlNHYW50dC5jaGFuZ2VGb3JtYXQoImRheSIsJyt2R2FudHRWYXIrJyk7IFZBTFVFPSJkYXkiPkRheSc7CgkJCX0KCQkJCgkJCWlmICh2Rm9ybWF0QXJyLmpvaW4oKS5pbmRleE9mKCJ3ZWVrIikhPS0xKSB7IAogICAgICAgICAgICBpZiAodkZvcm1hdD09J3dlZWsnKSB2TGVmdFRhYmxlICs9ICc8SU5QVVQgVFlQRT1SQURJTyBOQU1FPSJyYWRGb3JtYXQiIFZBTFVFPSJ3ZWVrIiBjaGVja2VkPldlZWsnOwogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gJzxJTlBVVCBUWVBFPVJBRElPIE5BTUU9InJhZEZvcm1hdCIgb25jbGljaz1KU0dhbnR0LmNoYW5nZUZvcm1hdCgid2VlayIsJyt2R2FudHRWYXIrJykgVkFMVUU9IndlZWsiPldlZWsnOwoJCQl9CgkJCQoJCQlpZiAodkZvcm1hdEFyci5qb2luKCkuaW5kZXhPZigibW9udGgiKSE9LTEpIHsgCiAgICAgICAgICAgIGlmICh2Rm9ybWF0PT0nbW9udGgnKSB2TGVmdFRhYmxlICs9ICc8SU5QVVQgVFlQRT1SQURJTyBOQU1FPSJyYWRGb3JtYXQiIFZBTFVFPSJtb250aCIgY2hlY2tlZD5Nb250aCc7CiAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgdkxlZnRUYWJsZSArPSAnPElOUFVUIFRZUEU9UkFESU8gTkFNRT0icmFkRm9ybWF0IiBvbmNsaWNrPUpTR2FudHQuY2hhbmdlRm9ybWF0KCJtb250aCIsJyt2R2FudHRWYXIrJykgVkFMVUU9Im1vbnRoIj5Nb250aCc7CgkJCX0KCQkJCgkJCWlmICh2Rm9ybWF0QXJyLmpvaW4oKS5pbmRleE9mKCJxdWFydGVyIikhPS0xKSB7IAogICAgICAgICAgICBpZiAodkZvcm1hdD09J3F1YXJ0ZXInKSB2TGVmdFRhYmxlICs9ICc8SU5QVVQgVFlQRT1SQURJTyBOQU1FPSJyYWRGb3JtYXQiIFZBTFVFPSJxdWFydGVyIiBjaGVja2VkPlF1YXJ0ZXInOwogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gJzxJTlBVVCBUWVBFPVJBRElPIE5BTUU9InJhZEZvcm1hdCIgb25jbGljaz1KU0dhbnR0LmNoYW5nZUZvcm1hdCgicXVhcnRlciIsJyt2R2FudHRWYXIrJykgVkFMVUU9InF1YXJ0ZXIiPlF1YXJ0ZXInOwoJCQl9CgkJCQovLyAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gJzxJTlBVVCBUWVBFPVJBRElPIE5BTUU9Im90aGVyIiBWQUxVRT0ib3RoZXIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPiAuJzsKCiAgICAgICAgICAgIHZMZWZ0VGFibGUgKz0gJzwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+PC9URD4nOwoKICAgICAgICAgICAgdk1haW5UYWJsZSArPSB2TGVmdFRhYmxlOwoKICAgICAgICAgICAgLy8gRHJhdyB0aGUgQ2hhcnQgUm93cwogICAgICAgICAgICB2UmlnaHRUYWJsZSA9IAogICAgICAgICAgICAnPFREIHN0eWxlPSJ3aWR0aDogJyArIHZDaGFydFdpZHRoICsgJ3B4OyIgdkFsaWduPXRvcCBiZ0NvbG9yPSNmZmZmZmY+JyArCiAgICAgICAgICAgICc8RElWIGNsYXNzPXNjcm9sbDIgaWQ9cmlnaHRzaWRlPicgKwogICAgICAgICAgICAnPFRBQkxFIHN0eWxlPSJ3aWR0aDogJyArIHZDaGFydFdpZHRoICsgJ3B4OyIgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIGJvcmRlcj0wPicgKwogICAgICAgICAgICAnPFRCT0RZPjxUUiBzdHlsZT0iSEVJR0hUOiAxOHB4Ij4nOwoKICAgICAgICAgICAgdlRtcERhdGUuc2V0RnVsbFllYXIodk1pbkRhdGUuZ2V0RnVsbFllYXIoKSwgdk1pbkRhdGUuZ2V0TW9udGgoKSwgdk1pbkRhdGUuZ2V0RGF0ZSgpKTsKICAgICAgICAgICAgdlRtcERhdGUuc2V0SG91cnMoMCk7CiAgICAgICAgICAgIHZUbXBEYXRlLnNldE1pbnV0ZXMoMCk7CgogICAgICAgICAvLyBNYWpvciBEYXRlIEhlYWRlcgogICAgICAgICB3aGlsZShEYXRlLnBhcnNlKHZUbXBEYXRlKSA8PSBEYXRlLnBhcnNlKHZNYXhEYXRlKSkKICAgICAgICAgewkKICAgICAgICAgICAgdlN0ciA9IHZUbXBEYXRlLmdldEZ1bGxZZWFyKCkgKyAnJzsKICAgICAgICAgICAgdlN0ciA9IHZTdHIuc3Vic3RyaW5nKDIsNCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaWYodkZvcm1hdCA9PSAnbWludXRlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzx0ZCBjbGFzcz1nZGF0ZWhlYWQgc3R5bGU9IkZPTlQtU0laRTogMTJweDsgSEVJR0hUOiAxOXB4OyIgYWxpZ249Y2VudGVyIGNvbHNwYW49NjA+JyA7CiAgICAgICAgICAgICAgICB2UmlnaHRUYWJsZSArPSBKU0dhbnR0LmZvcm1hdERhdGVTdHIodlRtcERhdGUsIHZEYXRlRGlzcGxheUZvcm1hdCkgKyAnICcgKyB2VG1wRGF0ZS5nZXRIb3VycygpICsgJzowMCAtJyArIHZUbXBEYXRlLmdldEhvdXJzKCkgKyAnOjU5IDwvdGQ+JzsKICAgICAgICAgICAgICAgIHZUbXBEYXRlLnNldEhvdXJzKHZUbXBEYXRlLmdldEhvdXJzKCkrMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHZGb3JtYXQgPT0gJ2hvdXInKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2UmlnaHRUYWJsZSArPSAnPHRkIGNsYXNzPWdkYXRlaGVhZCBzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBIRUlHSFQ6IDE5cHg7IiBhbGlnbj1jZW50ZXIgY29sc3Bhbj0yND4nIDsKICAgICAgICAgICAgICAgIHZSaWdodFRhYmxlICs9IEpTR2FudHQuZm9ybWF0RGF0ZVN0cih2VG1wRGF0ZSwgdkRhdGVEaXNwbGF5Rm9ybWF0KSArICc8L3RkPic7CiAgICAgICAgICAgICAgICB2VG1wRGF0ZS5zZXREYXRlKHZUbXBEYXRlLmdldERhdGUoKSsxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAJICAgICAgICAgaWYodkZvcm1hdCA9PSAnZGF5JykKICAgICAgICAgICAgewoJCQkgICAgICB2UmlnaHRUYWJsZSArPSAnPHRkIGNsYXNzPWdkYXRlaGVhZCBzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBIRUlHSFQ6IDE5cHg7IiBhbGlnbj1jZW50ZXIgY29sc3Bhbj03PicgKwoJCQkgICAgICBKU0dhbnR0LmZvcm1hdERhdGVTdHIodlRtcERhdGUsdkRhdGVEaXNwbGF5Rm9ybWF0LnN1YnN0cmluZygwLDUpKSArICcgLSAnOwogICAgICAgICAgICAgICB2VG1wRGF0ZS5zZXREYXRlKHZUbXBEYXRlLmdldERhdGUoKSs2KTsKCQkgICAgICAgICB2UmlnaHRUYWJsZSArPSBKU0dhbnR0LmZvcm1hdERhdGVTdHIodlRtcERhdGUsIHZEYXRlRGlzcGxheUZvcm1hdCkgKyAnPC90ZD4nOwogICAgICAgICAgICAgICB2VG1wRGF0ZS5zZXREYXRlKHZUbXBEYXRlLmdldERhdGUoKSsxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHZGb3JtYXQgPT0gJ3dlZWsnKQogICAgICAgICAgICB7CiAgCQkgICAgICAgICB2UmlnaHRUYWJsZSArPSAnPHRkIGNsYXNzPWdkYXRlaGVhZCBhbGlnbj1jZW50ZXIgc3R5bGU9IkZPTlQtU0laRTogMTJweDsgSEVJR0hUOiAxOXB4OyIgd2lkdGg9Jyt2Q29sV2lkdGgrJ3B4PmAnKyB2U3RyICsgJzwvdGQ+JzsKICAgICAgICAgICAgICAgdlRtcERhdGUuc2V0RGF0ZSh2VG1wRGF0ZS5nZXREYXRlKCkrNyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih2Rm9ybWF0ID09ICdtb250aCcpCiAgICAgICAgICAgIHsKCSAgICAgICAgICAgIHZSaWdodFRhYmxlICs9ICc8dGQgY2xhc3M9Z2RhdGVoZWFkIGFsaWduPWNlbnRlciBzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBIRUlHSFQ6IDE5cHg7IiB3aWR0aD0nK3ZDb2xXaWR0aCsncHg+YCcrIHZTdHIgKyAnPC90ZD4nOwogICAgICAgICAgICAgICB2VG1wRGF0ZS5zZXREYXRlKHZUbXBEYXRlLmdldERhdGUoKSArIDEpOwogICAgICAgICAgICAgICB3aGlsZSh2VG1wRGF0ZS5nZXREYXRlKCkgPiAxKQogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdlRtcERhdGUuc2V0RGF0ZSh2VG1wRGF0ZS5nZXREYXRlKCkgKyAxKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodkZvcm1hdCA9PSAncXVhcnRlcicpCiAgICAgICAgICAgIHsKCSAgICAgICAgICAgIHZSaWdodFRhYmxlICs9ICc8dGQgY2xhc3M9Z2RhdGVoZWFkIGFsaWduPWNlbnRlciBzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBIRUlHSFQ6IDE5cHg7IiB3aWR0aD0nK3ZDb2xXaWR0aCsncHg+YCcrIHZTdHIgKyAnPC90ZD4nOwogICAgICAgICAgICAgICB2VG1wRGF0ZS5zZXREYXRlKHZUbXBEYXRlLmdldERhdGUoKSArIDgxKTsKICAgICAgICAgICAgICAgd2hpbGUodlRtcERhdGUuZ2V0RGF0ZSgpID4gMSkKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZUbXBEYXRlLnNldERhdGUodlRtcERhdGUuZ2V0RGF0ZSgpICsgMSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgfQoKICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzwvVFI+PFRSPic7CgogICAgICAgICAvLyBNaW5vciBEYXRlIGhlYWRlciBhbmQgQ2VsbCBSb3dzCiAgICAgICAgIHZUbXBEYXRlLnNldEZ1bGxZZWFyKHZNaW5EYXRlLmdldEZ1bGxZZWFyKCksIHZNaW5EYXRlLmdldE1vbnRoKCksIHZNaW5EYXRlLmdldERhdGUoKSk7CiAgICAgICAgIHZOeHREYXRlLnNldEZ1bGxZZWFyKHZNaW5EYXRlLmdldEZ1bGxZZWFyKCksIHZNaW5EYXRlLmdldE1vbnRoKCksIHZNaW5EYXRlLmdldERhdGUoKSk7CiAgICAgICAgIHZOdW1Db2xzID0gMDsKIAogICAgICAgICB3aGlsZShEYXRlLnBhcnNlKHZUbXBEYXRlKSA8PSBEYXRlLnBhcnNlKHZNYXhEYXRlKSkKICAgICAgICAgewkKICAgICAgICAgICAgaWYgKHZGb3JtYXQgPT0gJ21pbnV0ZScpCiAgICAgICAgICAgIHsKCQkJCgkJCSAgaWYoIHZUbXBEYXRlLmdldE1pbnV0ZXMoKSA9PTAgKSAKICAgICAgICAgICAgICAgICAgdldlZWtkYXlDb2xvciA9ICJjY2NjZmYiOwogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHZXZWVrZGF5Q29sb3IgPSAiZmZmZmZmIjsKCQkJCSAgCgkJCQkgIAogICAgICAgICAgICAgICAgdkRhdGVSb3dTdHIgKz0gJzx0ZCBjbGFzcz0iZ2hlYWQiIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBIRUlHSFQ6IDE5cHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsiICBiZ2NvbG9yPSMnICsgdldlZWtkYXlDb2xvciArICcgYWxpZ249Y2VudGVyPjxkaXYgc3R5bGU9IndpZHRoOiAnK3ZDb2xXaWR0aCsncHgiPicgKyB2VG1wRGF0ZS5nZXRNaW51dGVzKCkgKyAnPC9kaXY+PC90ZD4nOwogICAgICAgICAgICAgICAgdkl0ZW1Sb3dTdHIgKz0gJzx0ZCBjbGFzcz0iZ2hlYWQiIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IGN1cnNvcjogZGVmYXVsdDsiICBiZ2NvbG9yPSMnICsgdldlZWtkYXlDb2xvciArICcgYWxpZ249Y2VudGVyPjxkaXYgc3R5bGU9IndpZHRoOiAnK3ZDb2xXaWR0aCsncHgiPiZuYnNwJm5ic3A8L2Rpdj48L3RkPic7CiAgICAgICAgICAgICAgICB2VG1wRGF0ZS5zZXRNaW51dGVzKHZUbXBEYXRlLmdldE1pbnV0ZXMoKSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgICAgZWxzZSBpZiAodkZvcm1hdCA9PSAnaG91cicpCiAgICAgICAgICAgIHsKCQkJCgkJCSAgIGlmKCAgdlRtcERhdGUuZ2V0SG91cnMoKSA9PTAgICkgCiAgICAgICAgICAgICAgICAgIHZXZWVrZGF5Q29sb3IgPSAiY2NjY2ZmIjsKICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICB2V2Vla2RheUNvbG9yID0gImZmZmZmZiI7CgkJCQkgIAoJCQkJICAKICAgICAgICAgICAgICAgIHZEYXRlUm93U3RyICs9ICc8dGQgY2xhc3M9ImdoZWFkIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgSEVJR0hUOiAxOXB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiAgYmdjb2xvcj0jJyArIHZXZWVrZGF5Q29sb3IgKyAnIGFsaWduPWNlbnRlcj48ZGl2IHN0eWxlPSJ3aWR0aDogJyt2Q29sV2lkdGgrJ3B4Ij4nICsgdlRtcERhdGUuZ2V0SG91cnMoKSArICc8L2Rpdj48L3RkPic7CiAgICAgICAgICAgICAgICB2SXRlbVJvd1N0ciArPSAnPHRkIGNsYXNzPSJnaGVhZCIgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsgY3Vyc29yOiBkZWZhdWx0OyIgIGJnY29sb3I9IycgKyB2V2Vla2RheUNvbG9yICsgJyBhbGlnbj1jZW50ZXI+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+Jm5ic3AmbmJzcDwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgIHZUbXBEYXRlLnNldEhvdXJzKHZUbXBEYXRlLmdldEhvdXJzKCkgKyAxKTsKICAgICAgICAgICAgfQoKCSAgICAgICAgZWxzZSBpZih2Rm9ybWF0ID09ICdkYXknICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgaWYoIEpTR2FudHQuZm9ybWF0RGF0ZVN0cih2Q3VyckRhdGUsJ21tL2RkL3l5eXknKSA9PSBKU0dhbnR0LmZvcm1hdERhdGVTdHIodlRtcERhdGUsJ21tL2RkL3l5eXknKSkgewogICAgICAgICAgICAgICAgICB2V2Vla2RheUNvbG9yICA9ICJjY2NjZmYiOwogICAgICAgICAgICAgICAgICB2V2Vla2VuZENvbG9yICA9ICI5OTk5ZmYiOwogICAgICAgICAgICAgICAgICB2V2Vla2RheUdDb2xvciAgPSAiYmJiYmZmIjsKICAgICAgICAgICAgICAgICAgdldlZWtlbmRHQ29sb3IgPSAiODg4OGZmIjsKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdldlZWtkYXlDb2xvciA9ICJmZmZmZmYiOwogICAgICAgICAgICAgICAgICB2V2Vla2VuZENvbG9yID0gImNmY2ZjZiI7CiAgICAgICAgICAgICAgICAgIHZXZWVrZGF5R0NvbG9yID0gImYzZjNmMyI7CiAgICAgICAgICAgICAgICAgIHZXZWVrZW5kR0NvbG9yID0gImMzYzNjMyI7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGlmKHZUbXBEYXRlLmdldERheSgpICUgNiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgIHZEYXRlUm93U3RyICArPSAnPHRkIGNsYXNzPSJnaGVhZHdrZW5kIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgSEVJR0hUOiAxOXB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiBiZ2NvbG9yPSMnICsgdldlZWtlbmRDb2xvciArICcgYWxpZ249Y2VudGVyPjxkaXYgc3R5bGU9IndpZHRoOiAnK3ZDb2xXaWR0aCsncHgiPicgKyB2VG1wRGF0ZS5nZXREYXRlKCkgKyAnPC9kaXY+PC90ZD4nOwogICAgICAgICAgICAgICAgICB2SXRlbVJvd1N0ciAgKz0gJzx0ZCBjbGFzcz0iZ2hlYWR3a2VuZCIgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsgY3Vyc29yOiBkZWZhdWx0OyIgIGJnY29sb3I9IycgKyB2V2Vla2VuZENvbG9yICsgJyBhbGlnbj1jZW50ZXI+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+Jm5ic3A8L2Rpdj48L3RkPic7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgIHZEYXRlUm93U3RyICs9ICc8dGQgY2xhc3M9ImdoZWFkIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgSEVJR0hUOiAxOXB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiAgYmdjb2xvcj0jJyArIHZXZWVrZGF5Q29sb3IgKyAnIGFsaWduPWNlbnRlcj48ZGl2IHN0eWxlPSJ3aWR0aDogJyt2Q29sV2lkdGgrJ3B4Ij4nICsgdlRtcERhdGUuZ2V0RGF0ZSgpICsgJzwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgICAgaWYoIEpTR2FudHQuZm9ybWF0RGF0ZVN0cih2Q3VyckRhdGUsJ21tL2RkL3l5eXknKSA9PSBKU0dhbnR0LmZvcm1hdERhdGVTdHIodlRtcERhdGUsJ21tL2RkL3l5eXknKSkgCiAgICAgICAgICAgICAgICAgICAgIHZJdGVtUm93U3RyICs9ICc8dGQgY2xhc3M9ImdoZWFkIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyBjdXJzb3I6IGRlZmF1bHQ7IiAgYmdjb2xvcj0jJyArIHZXZWVrZGF5Q29sb3IgKyAnIGFsaWduPWNlbnRlcj48ZGl2IHN0eWxlPSJ3aWR0aDogJyt2Q29sV2lkdGgrJ3B4Ij4mbmJzcCZuYnNwPC9kaXY+PC90ZD4nOwogICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHZJdGVtUm93U3RyICs9ICc8dGQgY2xhc3M9ImdoZWFkIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyBjdXJzb3I6IGRlZmF1bHQ7IiAgYWxpZ249Y2VudGVyPjxkaXYgc3R5bGU9IndpZHRoOiAnK3ZDb2xXaWR0aCsncHgiPiZuYnNwJm5ic3A8L2Rpdj48L3RkPic7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHZUbXBEYXRlLnNldERhdGUodlRtcERhdGUuZ2V0RGF0ZSgpICsgMSk7CgogICAgICAgICAgICB9CgoJICAgICAgICAgZWxzZSBpZih2Rm9ybWF0ID09ICd3ZWVrJykKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgdk54dERhdGUuc2V0RGF0ZSh2Tnh0RGF0ZS5nZXREYXRlKCkgKyA3KTsKCiAgICAgICAgICAgICAgIGlmKCB2Q3VyckRhdGUgPj0gdlRtcERhdGUgJiYgdkN1cnJEYXRlIDwgdk54dERhdGUgKSAKICAgICAgICAgICAgICAgICAgdldlZWtkYXlDb2xvciA9ICJjY2NjZmYiOwogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHZXZWVrZGF5Q29sb3IgPSAiZmZmZmZmIjsKCiAgICAgICAgICAgICAgIGlmKHZOeHREYXRlIDw9IHZNYXhEYXRlKSB7CiAgICAgICAgICAgICAgICAgIHZEYXRlUm93U3RyICs9ICc8dGQgY2xhc3M9ImdoZWFkIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgSEVJR0hUOiAxOXB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiBiZ2NvbG9yPSMnICsgdldlZWtkYXlDb2xvciArICcgYWxpZ249Y2VudGVyIHdpZHRoOicrdkNvbFdpZHRoKydweD48ZGl2IHN0eWxlPSJ3aWR0aDogJyt2Q29sV2lkdGgrJ3B4Ij4nICsgKHZUbXBEYXRlLmdldE1vbnRoKCkrMSkgKyAnLycgKyB2VG1wRGF0ZS5nZXREYXRlKCkgKyAnPC9kaXY+PC90ZD4nOwogICAgICAgICAgICAgICAgICBpZiggdkN1cnJEYXRlID49IHZUbXBEYXRlICYmIHZDdXJyRGF0ZSA8IHZOeHREYXRlICkgCiAgICAgICAgICAgICAgICAgICAgIHZJdGVtUm93U3RyICs9ICc8dGQgY2xhc3M9ImdoZWFkIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyIgYmdjb2xvcj0jJyArIHZXZWVrZGF5Q29sb3IgKyAnIGFsaWduPWNlbnRlcj48ZGl2IHN0eWxlPSJ3aWR0aDogJyt2Q29sV2lkdGgrJ3B4Ij4mbmJzcCZuYnNwPC9kaXY+PC90ZD4nOwogICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHZJdGVtUm93U3RyICs9ICc8dGQgY2xhc3M9ImdoZWFkIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyIgYWxpZ249Y2VudGVyPjxkaXYgc3R5bGU9IndpZHRoOiAnK3ZDb2xXaWR0aCsncHgiPiZuYnNwJm5ic3A8L2Rpdj48L3RkPic7CgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB2RGF0ZVJvd1N0ciArPSAnPHRkIGNsYXNzPSJnaGVhZCIgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEhFSUdIVDogMTlweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyBiZ2NvbG9yPSMnICsgdldlZWtkYXlDb2xvciArICcgQk9SREVSLVJJR0hUOiAjZWZlZmVmIDFweCBzb2xpZDsiIGFsaWduPWNlbnRlciB3aWR0aDonK3ZDb2xXaWR0aCsncHg+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+JyArICh2VG1wRGF0ZS5nZXRNb250aCgpKzEpICsgJy8nICsgdlRtcERhdGUuZ2V0RGF0ZSgpICsgJzwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgICAgaWYoIHZDdXJyRGF0ZSA+PSB2VG1wRGF0ZSAmJiB2Q3VyckRhdGUgPCB2Tnh0RGF0ZSApIAogICAgICAgICAgICAgICAgICAgICB2SXRlbVJvd1N0ciArPSAnPHRkIGNsYXNzPSJnaGVhZCIgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsgQk9SREVSLVJJR0hUOiAjZWZlZmVmIDFweCBzb2xpZDsiIGJnY29sb3I9IycgKyB2V2Vla2RheUNvbG9yICsgJyBhbGlnbj1jZW50ZXI+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+Jm5ic3AmbmJzcDwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB2SXRlbVJvd1N0ciArPSAnPHRkIGNsYXNzPSJnaGVhZCIgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsgQk9SREVSLVJJR0hUOiAjZWZlZmVmIDFweCBzb2xpZDsiIGFsaWduPWNlbnRlcj48ZGl2IHN0eWxlPSJ3aWR0aDogJyt2Q29sV2lkdGgrJ3B4Ij4mbmJzcCZuYnNwPC9kaXY+PC90ZD4nOwoKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdlRtcERhdGUuc2V0RGF0ZSh2VG1wRGF0ZS5nZXREYXRlKCkgKyA3KTsKCiAgICAgICAgICAgIH0KCgkgICAgICAgICBlbHNlIGlmKHZGb3JtYXQgPT0gJ21vbnRoJykKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgdk54dERhdGUuc2V0RnVsbFllYXIodlRtcERhdGUuZ2V0RnVsbFllYXIoKSwgdlRtcERhdGUuZ2V0TW9udGgoKSwgdk1vbnRoRGF5c0Fyclt2VG1wRGF0ZS5nZXRNb250aCgpXSk7CiAgICAgICAgICAgICAgIGlmKCB2Q3VyckRhdGUgPj0gdlRtcERhdGUgJiYgdkN1cnJEYXRlIDwgdk54dERhdGUgKSAKICAgICAgICAgICAgICAgICAgdldlZWtkYXlDb2xvciA9ICJjY2NjZmYiOwogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHZXZWVrZGF5Q29sb3IgPSAiZmZmZmZmIjsKCiAgICAgICAgICAgICAgIGlmKHZOeHREYXRlIDw9IHZNYXhEYXRlKSB7CiAgICAgICAgICAgICAgICAgIHZEYXRlUm93U3RyICs9ICc8dGQgY2xhc3M9ImdoZWFkIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgSEVJR0hUOiAxOXB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiBiZ2NvbG9yPSMnICsgdldlZWtkYXlDb2xvciArICcgYWxpZ249Y2VudGVyIHdpZHRoOicrdkNvbFdpZHRoKydweD48ZGl2IHN0eWxlPSJ3aWR0aDogJyt2Q29sV2lkdGgrJ3B4Ij4nICsgdk1vbnRoQXJyW3ZUbXBEYXRlLmdldE1vbnRoKCldLnN1YnN0cigwLDMpICsgJzwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgICAgaWYoIHZDdXJyRGF0ZSA+PSB2VG1wRGF0ZSAmJiB2Q3VyckRhdGUgPCB2Tnh0RGF0ZSApIAogICAgICAgICAgICAgICAgICAgICB2SXRlbVJvd1N0ciArPSAnPHRkIGNsYXNzPSJnaGVhZCIgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsiIGJnY29sb3I9IycgKyB2V2Vla2RheUNvbG9yICsgJyBhbGlnbj1jZW50ZXI+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+Jm5ic3AmbmJzcDwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB2SXRlbVJvd1N0ciArPSAnPHRkIGNsYXNzPSJnaGVhZCIgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsiIGFsaWduPWNlbnRlcj48ZGl2IHN0eWxlPSJ3aWR0aDogJyt2Q29sV2lkdGgrJ3B4Ij4mbmJzcCZuYnNwPC9kaXY+PC90ZD4nOwogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB2RGF0ZVJvd1N0ciArPSAnPHRkIGNsYXNzPSJnaGVhZCIgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEhFSUdIVDogMTlweDsgQk9SREVSLUxFRlQ6ICNlZmVmZWYgMXB4IHNvbGlkOyBCT1JERVItUklHSFQ6ICNlZmVmZWYgMXB4IHNvbGlkOyIgYmdjb2xvcj0jJyArIHZXZWVrZGF5Q29sb3IgKyAnIGFsaWduPWNlbnRlciB3aWR0aDonK3ZDb2xXaWR0aCsncHg+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+JyArIHZNb250aEFyclt2VG1wRGF0ZS5nZXRNb250aCgpXS5zdWJzdHIoMCwzKSArICc8L2Rpdj48L3RkPic7CiAgICAgICAgICAgICAgICAgIGlmKCB2Q3VyckRhdGUgPj0gdlRtcERhdGUgJiYgdkN1cnJEYXRlIDwgdk54dERhdGUgKSAKICAgICAgICAgICAgICAgICAgICAgdkl0ZW1Sb3dTdHIgKz0gJzx0ZCBjbGFzcz0iZ2hlYWQiIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IEJPUkRFUi1SSUdIVDogI2VmZWZlZiAxcHggc29saWQ7IiBiZ2NvbG9yPSMnICsgdldlZWtkYXlDb2xvciArICcgYWxpZ249Y2VudGVyPjxkaXYgc3R5bGU9IndpZHRoOiAnK3ZDb2xXaWR0aCsncHgiPiZuYnNwJm5ic3A8L2Rpdj48L3RkPic7CiAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgdkl0ZW1Sb3dTdHIgKz0gJzx0ZCBjbGFzcz0iZ2hlYWQiIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IEJPUkRFUi1SSUdIVDogI2VmZWZlZiAxcHggc29saWQ7IiBhbGlnbj1jZW50ZXI+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+Jm5ic3AmbmJzcDwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdlRtcERhdGUuc2V0RGF0ZSh2VG1wRGF0ZS5nZXREYXRlKCkgKyAxKTsKCiAgICAgICAgICAgICAgIHdoaWxlKHZUbXBEYXRlLmdldERhdGUoKSA+IDEpIAogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHZUbXBEYXRlLnNldERhdGUodlRtcERhdGUuZ2V0RGF0ZSgpICsgMSk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCgkgICAgICAgICBlbHNlIGlmKHZGb3JtYXQgPT0gJ3F1YXJ0ZXInKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICB2Tnh0RGF0ZS5zZXREYXRlKHZOeHREYXRlLmdldERhdGUoKSArIDEyMik7CiAgICAgICAgICAgICAgIGlmKCB2VG1wRGF0ZS5nZXRNb250aCgpPT0wIHx8IHZUbXBEYXRlLmdldE1vbnRoKCk9PTEgfHwgdlRtcERhdGUuZ2V0TW9udGgoKT09MiApCiAgICAgICAgICAgICAgICAgIHZOeHREYXRlLnNldEZ1bGxZZWFyKHZUbXBEYXRlLmdldEZ1bGxZZWFyKCksIDIsIDMxKTsKICAgICAgICAgICAgICAgZWxzZSBpZiggdlRtcERhdGUuZ2V0TW9udGgoKT09MyB8fCB2VG1wRGF0ZS5nZXRNb250aCgpPT00IHx8IHZUbXBEYXRlLmdldE1vbnRoKCk9PTUgKQogICAgICAgICAgICAgICAgICB2Tnh0RGF0ZS5zZXRGdWxsWWVhcih2VG1wRGF0ZS5nZXRGdWxsWWVhcigpLCA1LCAzMCk7CiAgICAgICAgICAgICAgIGVsc2UgaWYoIHZUbXBEYXRlLmdldE1vbnRoKCk9PTYgfHwgdlRtcERhdGUuZ2V0TW9udGgoKT09NyB8fCB2VG1wRGF0ZS5nZXRNb250aCgpPT04ICkKICAgICAgICAgICAgICAgICAgdk54dERhdGUuc2V0RnVsbFllYXIodlRtcERhdGUuZ2V0RnVsbFllYXIoKSwgOCwgMzApOwogICAgICAgICAgICAgICBlbHNlIGlmKCB2VG1wRGF0ZS5nZXRNb250aCgpPT05IHx8IHZUbXBEYXRlLmdldE1vbnRoKCk9PTEwIHx8IHZUbXBEYXRlLmdldE1vbnRoKCk9PTExICkKICAgICAgICAgICAgICAgICAgdk54dERhdGUuc2V0RnVsbFllYXIodlRtcERhdGUuZ2V0RnVsbFllYXIoKSwgMTEsIDMxKTsKCiAgICAgICAgICAgICAgIGlmKCB2Q3VyckRhdGUgPj0gdlRtcERhdGUgJiYgdkN1cnJEYXRlIDwgdk54dERhdGUgKSAKICAgICAgICAgICAgICAgICAgdldlZWtkYXlDb2xvciA9ICJjY2NjZmYiOwogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHZXZWVrZGF5Q29sb3IgPSAiZmZmZmZmIjsKCiAgICAgICAgICAgICAgIGlmKHZOeHREYXRlIDw9IHZNYXhEYXRlKSB7CiAgICAgICAgICAgICAgICAgIHZEYXRlUm93U3RyICs9ICc8dGQgY2xhc3M9ImdoZWFkIiBzdHlsZT0iQk9SREVSLVRPUDogI2VmZWZlZiAxcHggc29saWQ7IEZPTlQtU0laRTogMTJweDsgSEVJR0hUOiAxOXB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiBiZ2NvbG9yPSMnICsgdldlZWtkYXlDb2xvciArICcgYWxpZ249Y2VudGVyIHdpZHRoOicrdkNvbFdpZHRoKydweD48ZGl2IHN0eWxlPSJ3aWR0aDogJyt2Q29sV2lkdGgrJ3B4Ij5RdHIuICcgKyB2UXVhcnRlckFyclt2VG1wRGF0ZS5nZXRNb250aCgpXSArICc8L2Rpdj48L3RkPic7CiAgICAgICAgICAgICAgICAgIGlmKCB2Q3VyckRhdGUgPj0gdlRtcERhdGUgJiYgdkN1cnJEYXRlIDwgdk54dERhdGUgKSAKICAgICAgICAgICAgICAgICAgICAgdkl0ZW1Sb3dTdHIgKz0gJzx0ZCBjbGFzcz0iZ2hlYWQiIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiBiZ2NvbG9yPSMnICsgdldlZWtkYXlDb2xvciArICcgYWxpZ249Y2VudGVyPjxkaXYgc3R5bGU9IndpZHRoOiAnK3ZDb2xXaWR0aCsncHgiPiZuYnNwJm5ic3A8L2Rpdj48L3RkPic7CiAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgdkl0ZW1Sb3dTdHIgKz0gJzx0ZCBjbGFzcz0iZ2hlYWQiIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IiBhbGlnbj1jZW50ZXI+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+Jm5ic3AmbmJzcDwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdkRhdGVSb3dTdHIgKz0gJzx0ZCBjbGFzcz0iZ2hlYWQiIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBIRUlHSFQ6IDE5cHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsgQk9SREVSLVJJR0hUOiAjZWZlZmVmIDFweCBzb2xpZDsiIGJnY29sb3I9IycgKyB2V2Vla2RheUNvbG9yICsgJyBhbGlnbj1jZW50ZXIgd2lkdGg6Jyt2Q29sV2lkdGgrJ3B4PjxkaXYgc3R5bGU9IndpZHRoOiAnK3ZDb2xXaWR0aCsncHgiPlF0ci4gJyArIHZRdWFydGVyQXJyW3ZUbXBEYXRlLmdldE1vbnRoKCldICsgJzwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgICAgaWYoIHZDdXJyRGF0ZSA+PSB2VG1wRGF0ZSAmJiB2Q3VyckRhdGUgPCB2Tnh0RGF0ZSApIAogICAgICAgICAgICAgICAgICAgICB2SXRlbVJvd1N0ciArPSAnPHRkIGNsYXNzPSJnaGVhZCIgc3R5bGU9IkJPUkRFUi1UT1A6ICNlZmVmZWYgMXB4IHNvbGlkOyBGT05ULVNJWkU6IDEycHg7IEJPUkRFUi1MRUZUOiAjZWZlZmVmIDFweCBzb2xpZDsgQk9SREVSLVJJR0hUOiAjZWZlZmVmIDFweCBzb2xpZDsiIGJnY29sb3I9IycgKyB2V2Vla2RheUNvbG9yICsgJyBhbGlnbj1jZW50ZXI+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+Jm5ic3AmbmJzcDwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICAgdkl0ZW1Sb3dTdHIgKz0gJzx0ZCBjbGFzcz0iZ2hlYWQiIHN0eWxlPSJCT1JERVItVE9QOiAjZWZlZmVmIDFweCBzb2xpZDsgRk9OVC1TSVpFOiAxMnB4OyBCT1JERVItTEVGVDogI2VmZWZlZiAxcHggc29saWQ7IEJPUkRFUi1SSUdIVDogI2VmZWZlZiAxcHggc29saWQ7IiBhbGlnbj1jZW50ZXI+PGRpdiBzdHlsZT0id2lkdGg6ICcrdkNvbFdpZHRoKydweCI+Jm5ic3AmbmJzcDwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdlRtcERhdGUuc2V0RGF0ZSh2VG1wRGF0ZS5nZXREYXRlKCkgKyA4MSk7CgogICAgICAgICAgICAgICB3aGlsZSh2VG1wRGF0ZS5nZXREYXRlKCkgPiAxKSAKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB2VG1wRGF0ZS5zZXREYXRlKHZUbXBEYXRlLmdldERhdGUoKSArIDEpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIHZSaWdodFRhYmxlICs9IHZEYXRlUm93U3RyICsgJzwvVFI+JzsKICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzwvVEJPRFk+PC9UQUJMRT4nOwoKICAgICAgICAgLy8gRHJhdyBlYWNoIHJvdwoKICAgICAgICAgZm9yKGkgPSAwOyBpIDwgdlRhc2tMaXN0Lmxlbmd0aDsgaSsrKQoKICAgICAgICAgewoKICAgICAgICAgICAgdlRtcERhdGUuc2V0RnVsbFllYXIodk1pbkRhdGUuZ2V0RnVsbFllYXIoKSwgdk1pbkRhdGUuZ2V0TW9udGgoKSwgdk1pbkRhdGUuZ2V0RGF0ZSgpKTsKICAgICAgICAgICAgdlRhc2tTdGFydCA9IHZUYXNrTGlzdFtpXS5nZXRTdGFydCgpOwogICAgICAgICAgICB2VGFza0VuZCAgID0gdlRhc2tMaXN0W2ldLmdldEVuZCgpOwoKICAgICAgICAgICAgdk51bUNvbHMgPSAwOwogICAgICAgICAgICB2SUQgPSB2VGFza0xpc3RbaV0uZ2V0SUQoKTsKCiAgICAgICAgICAgLy8gdk51bVVuaXRzID0gTWF0aC5jZWlsKCh2VGFza0xpc3RbaV0uZ2V0RW5kKCkgLSB2VGFza0xpc3RbaV0uZ2V0U3RhcnQoKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkpICsgMTsKICAgICAgICAgICAgdk51bVVuaXRzID0gKHZUYXNrTGlzdFtpXS5nZXRFbmQoKSAtIHZUYXNrTGlzdFtpXS5nZXRTdGFydCgpKSAvICgyNCAqIDYwICogNjAgKiAxMDAwKSArIDE7CgkgICAgICAgaWYgKHZGb3JtYXQ9PSdob3VyJykKCSAgICAgICB7CiAgICAgICAgICAgICAgICB2TnVtVW5pdHMgPSAodlRhc2tMaXN0W2ldLmdldEVuZCgpIC0gdlRhc2tMaXN0W2ldLmdldFN0YXJ0KCkpIC8gKCAgNjAgKiAxMDAwKSArIDE7CgkgICAgICAgfQoJICAgICAgIGVsc2UgaWYgKHZGb3JtYXQ9PSdtaW51dGUnKQoJICAgICAgIHsKICAgICAgICAgICAgICAgIHZOdW1Vbml0cyA9ICh2VGFza0xpc3RbaV0uZ2V0RW5kKCkgLSB2VGFza0xpc3RbaV0uZ2V0U3RhcnQoKSkgLyAoICA2MCAqIDEwMDApICsgMTsKCSAgICAgICB9CgkgICAgICAgCgkgICAgICAgICBpZih2VGFza0xpc3RbaV0uZ2V0VmlzaWJsZSgpID09IDApIAogICAgICAgICAgICAgICB2UmlnaHRUYWJsZSArPSAnPERJViBpZD1jaGlsZGdyaWRfJyArIHZJRCArICcgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyBkaXNwbGF5Om5vbmU7Ij4nOwogICAgICAgICAgICBlbHNlCgkJICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzxESVYgaWQ9Y2hpbGRncmlkXycgKyB2SUQgKyAnIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZSI+JzsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKCB2VGFza0xpc3RbaV0uZ2V0TWlsZSgpKSB7CgogICAgICAgICAgICAgICB2UmlnaHRUYWJsZSArPSAnPERJVj48VEFCTEUgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyB0b3A6MHB4OyB3aWR0aDogJyArIHZDaGFydFdpZHRoICsgJ3B4OyIgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIGJvcmRlcj0wPicgKwogICAgICAgICAgICAgICAgICAnPFRSIGlkPWNoaWxkcm93XycgKyB2SUQgKyAnIGNsYXNzPXllc2Rpc3BsYXkgc3R5bGU9IkhFSUdIVDogMjBweCIgb25Nb3VzZW92ZXI9Zy5tb3VzZU92ZXIodGhpcywnICsgdklEICsgJywicmlnaHQiLCJtaWxlIikgb25Nb3VzZW91dD1nLm1vdXNlT3V0KHRoaXMsJyArIHZJRCArICcsInJpZ2h0IiwibWlsZSIpPicgKyB2SXRlbVJvd1N0ciArICc8L1RSPjwvVEFCTEU+PC9ESVY+JzsKCiAgICAgICAgICAgICAgIC8vIEJ1aWxkIGRhdGUgc3RyaW5nIGZvciBUaXRsZQogICAgICAgICAgICAgICB2RGF0ZVJvd1N0ciA9IEpTR2FudHQuZm9ybWF0RGF0ZVN0cih2VGFza1N0YXJ0LHZEYXRlRGlzcGxheUZvcm1hdCk7CgogICAgICAgICAgICAgICB2VGFza0xlZnQgPSAoRGF0ZS5wYXJzZSh2VGFza0xpc3RbaV0uZ2V0U3RhcnQoKSkgLSBEYXRlLnBhcnNlKHZNaW5EYXRlKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCk7CiAgICAgICAgICAgICAgIHZUYXNrUmlnaHQgPSAxOwoKICAJICAgICAgICAgICAgdlJpZ2h0VGFibGUgKz0KICAgICAgICAgICAgICAgICAgJzxkaXYgaWQ9YmFyZGl2XycgKyB2SUQgKyAnIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjBweDsgbGVmdDonICsgTWF0aC5jZWlsKCh2VGFza0xlZnQgKiAodkRheVdpZHRoKSArIDEpKSArICdweDsgaGVpZ2h0OiAxOHB4OyB3aWR0aDoxNjBweDsgb3ZlcmZsb3c6aGlkZGVuOyI+JyArCiAgICAgICAgICAgICAgICAgICcgIDxkaXYgaWQ9dGFza2Jhcl8nICsgdklEICsgJyB0aXRsZT0iJyArIHZUYXNrTGlzdFtpXS5nZXROYW1lKCkgKyAnOiAnICsgdkRhdGVSb3dTdHIgKyAnIiBzdHlsZT0iaGVpZ2h0OiAxNnB4OyB3aWR0aDoxMnB4OyBvdmVyZmxvdzpoaWRkZW47IGN1cnNvcjogcG9pbnRlcjsiIG9uY2xpY2s9SlNHYW50dC50YXNrTGluaygiJyArIHZUYXNrTGlzdFtpXS5nZXRMaW5rKCkgKyAnIiwzMDAsMjAwKTs+JzsKCiAgICAgICAgICAgICAgIGlmKHZUYXNrTGlzdFtpXS5nZXRDb21wVmFsKCkgPCAxMDApCiAJCSAgICAgICAgICAgIHt2UmlnaHRUYWJsZSArPSAnJmxvejs8L2Rpdj4nIDt9CiAgICAgICAgICAgICAgIGVsc2UKIAkJICAgICAgICAgICB7IHZSaWdodFRhYmxlICs9ICcmZGlhbXM7PC9kaXY+JyA7fQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGcuZ2V0Q2FwdGlvblR5cGUoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdkNhcHRpb25TdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBnLmdldENhcHRpb25UeXBlKCkgKSB7ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ2FwdGlvbic6ICAgIHZDYXB0aW9uU3RyID0gdlRhc2tMaXN0W2ldLmdldENhcHRpb24oKTsgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSZXNvdXJjZSc6ICAgdkNhcHRpb25TdHIgPSB2VGFza0xpc3RbaV0uZ2V0UmVzb3VyY2UoKTsgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEdXJhdGlvbic6ICAgdkNhcHRpb25TdHIgPSB2VGFza0xpc3RbaV0uZ2V0RHVyYXRpb24odkZvcm1hdCk7ICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ29tcGxldGUnOiAgIHZDYXB0aW9uU3RyID0gdlRhc2tMaXN0W2ldLmdldENvbXBTdHIoKTsgIGJyZWFrOwoJCSAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92UmlnaHRUYWJsZSArPSAnPGRpdiBzdHlsZT0iRk9OVC1TSVpFOjEycHg7IHBvc2l0aW9uOmFic29sdXRlOyBsZWZ0OiA2cHg7IHRvcDoxcHg7Ij4nICsgdkNhcHRpb25TdHIgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzxkaXYgc3R5bGU9IkZPTlQtU0laRToxMnB4OyBwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjJweDsgd2lkdGg6MTIwcHg7IGxlZnQ6MTJweCI+JyArIHZDYXB0aW9uU3RyICsgJzwvZGl2Pic7CgkgICAgICAgICAgICAgICAgICB9OwoKICAJICAgICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzwvZGl2Pic7CgoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgIC8vIEJ1aWxkIGRhdGUgc3RyaW5nIGZvciBUaXRsZQogICAgICAgICAgICAgICB2RGF0ZVJvd1N0ciA9IEpTR2FudHQuZm9ybWF0RGF0ZVN0cih2VGFza1N0YXJ0LHZEYXRlRGlzcGxheUZvcm1hdCkgKyAnIC0gJyArIEpTR2FudHQuZm9ybWF0RGF0ZVN0cih2VGFza0VuZCx2RGF0ZURpc3BsYXlGb3JtYXQpOwoKICAgICAgICAgICAgICAgIGlmICh2Rm9ybWF0PT0nbWludXRlJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2VGFza1JpZ2h0ID0gKERhdGUucGFyc2UodlRhc2tMaXN0W2ldLmdldEVuZCgpKSAtIERhdGUucGFyc2UodlRhc2tMaXN0W2ldLmdldFN0YXJ0KCkpKSAvICggNjAgKiAxMDAwKSArIDEvdkNvbFVuaXQ7CiAgICAgICAgICAgICAgICAgICAgdlRhc2tMZWZ0ID0gTWF0aC5jZWlsKChEYXRlLnBhcnNlKHZUYXNrTGlzdFtpXS5nZXRTdGFydCgpKSAtIERhdGUucGFyc2Uodk1pbkRhdGUpKSAvICggNjAgKiAxMDAwKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh2Rm9ybWF0PT0naG91cicpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdlRhc2tSaWdodCA9IChEYXRlLnBhcnNlKHZUYXNrTGlzdFtpXS5nZXRFbmQoKSkgLSBEYXRlLnBhcnNlKHZUYXNrTGlzdFtpXS5nZXRTdGFydCgpKSkgLyAoIDYwICogNjAgKiAxMDAwKSArIDEvdkNvbFVuaXQ7CiAgICAgICAgICAgICAgICAgICAgdlRhc2tMZWZ0ID0gKERhdGUucGFyc2UodlRhc2tMaXN0W2ldLmdldFN0YXJ0KCkpIC0gRGF0ZS5wYXJzZSh2TWluRGF0ZSkpIC8gKCA2MCAqIDYwICogMTAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdlRhc2tSaWdodCA9IChEYXRlLnBhcnNlKHZUYXNrTGlzdFtpXS5nZXRFbmQoKSkgLSBEYXRlLnBhcnNlKHZUYXNrTGlzdFtpXS5nZXRTdGFydCgpKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkgKyAxL3ZDb2xVbml0OwogICAgICAgICAgICAgICAgICAgIHZUYXNrTGVmdCA9IE1hdGguY2VpbCgoRGF0ZS5wYXJzZSh2VGFza0xpc3RbaV0uZ2V0U3RhcnQoKSkgLSBEYXRlLnBhcnNlKHZNaW5EYXRlKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkpOwogICAgICAgICAgICAgICAgICAgIGlmICh2Rm9ybWF0PSdkYXknKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRUaW1lPW5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRUaW1lLnNldFRpbWUoRGF0ZS5wYXJzZSh2VGFza0xpc3RbaV0uZ2V0U3RhcnQoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodFRpbWUuZ2V0TWludXRlcygpID4gMjkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2VGFza0xlZnQrPS41OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIC8vIERyYXcgR3JvdXAgQmFyICB3aGljaCBoYXMgb3V0ZXIgZGl2IHdpdGggaW5uZXIgZ3JvdXAgZGl2IGFuZCBzZXZlcmFsIHNtYWxsIGRpdnMgdG8gbGVmdCBhbmQgcmlnaHQgdG8gY3JlYXRlIGFuZ2xlZC1lbmQgaW5kaWNhdG9ycwogICAgICAgICAgICAgICBpZiggdlRhc2tMaXN0W2ldLmdldEdyb3VwKCkpIHsKICAgICAgICAgICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzxESVY+PFRBQkxFIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsgdG9wOjBweDsgd2lkdGg6ICcgKyB2Q2hhcnRXaWR0aCArICdweDsiIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCBib3JkZXI9MD4nICsKICAgICAgICAgICAgICAgICAgICAgJzxUUiBpZD1jaGlsZHJvd18nICsgdklEICsgJyBjbGFzcz15ZXNkaXNwbGF5IHN0eWxlPSJIRUlHSFQ6IDIwcHgiIGJnQ29sb3I9I2YzZjNmMyBvbk1vdXNlb3Zlcj1nLm1vdXNlT3Zlcih0aGlzLCcgKyB2SUQgKyAnLCJyaWdodCIsImdyb3VwIikgb25Nb3VzZW91dD1nLm1vdXNlT3V0KHRoaXMsJyArIHZJRCArICcsInJpZ2h0IiwiZ3JvdXAiKT4nICsgdkl0ZW1Sb3dTdHIgKyAnPC9UUj48L1RBQkxFPjwvRElWPic7CiAgICAgICAgICAgICAgICAgIHZSaWdodFRhYmxlICs9CiAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGlkPWJhcmRpdl8nICsgdklEICsgJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IHRvcDo1cHg7IGxlZnQ6JyArIE1hdGguY2VpbCh2VGFza0xlZnQgKiAodkRheVdpZHRoKSArIDEpICsgJ3B4OyBoZWlnaHQ6IDdweDsgd2lkdGg6JyArIE1hdGguY2VpbCgodlRhc2tSaWdodCkgKiAodkRheVdpZHRoKSAtIDEpICsgJ3B4Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBpZD10YXNrYmFyXycgKyB2SUQgKyAnIHRpdGxlPSInICsgdlRhc2tMaXN0W2ldLmdldE5hbWUoKSArICc6ICcgKyB2RGF0ZVJvd1N0ciArICciIGNsYXNzPWd0YXNrIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7IGhlaWdodDogN3B4OyB3aWR0aDonICsgTWF0aC5jZWlsKCh2VGFza1JpZ2h0KSAqICh2RGF5V2lkdGgpIC0xKSArICdweDsgIGN1cnNvcjogcG9pbnRlcjtvcGFjaXR5OjAuOTsiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9IlotSU5ERVg6IC00OyBmbG9hdDpsZWZ0OyBiYWNrZ3JvdW5kLWNvbG9yOiM2NjY2NjY7IGhlaWdodDozcHg7IG92ZXJmbG93OiBoaWRkZW47IG1hcmdpbi10b3A6MXB4OyAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXJnaW4tbGVmdDoxcHg7IG1hcmdpbi1yaWdodDoxcHg7IGZpbHRlcjogYWxwaGEob3BhY2l0eT04MCk7IG9wYWNpdHk6MC44OyB3aWR0aDonICsgdlRhc2tMaXN0W2ldLmdldENvbXBTdHIoKSArICc7ICcgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3I6IHBvaW50ZXI7IiBvbmNsaWNrPUpTR2FudHQudGFza0xpbmsoIicgKyB2VGFza0xpc3RbaV0uZ2V0TGluaygpICsgJyIsMzAwLDIwMCk7PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9IlotSU5ERVg6IC00OyBmbG9hdDpsZWZ0OyBiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7IGhlaWdodDo0cHg7IG92ZXJmbG93OiBoaWRkZW47IHdpZHRoOjFweDsiPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iWi1JTkRFWDogLTQ7IGZsb2F0OnJpZ2h0OyBiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7IGhlaWdodDo0cHg7IG92ZXJmbG93OiBoaWRkZW47IHdpZHRoOjFweDsiPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iWi1JTkRFWDogLTQ7IGZsb2F0OmxlZnQ7IGJhY2tncm91bmQtY29sb3I6IzAwMDAwMDsgaGVpZ2h0OjNweDsgb3ZlcmZsb3c6IGhpZGRlbjsgd2lkdGg6MXB4OyI+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJaLUlOREVYOiAtNDsgZmxvYXQ6cmlnaHQ7IGJhY2tncm91bmQtY29sb3I6IzAwMDAwMDsgaGVpZ2h0OjNweDsgb3ZlcmZsb3c6IGhpZGRlbjsgd2lkdGg6MXB4OyI+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJaLUlOREVYOiAtNDsgZmxvYXQ6bGVmdDsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDAwOyBoZWlnaHQ6MnB4OyBvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDoxcHg7Ij48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9IlotSU5ERVg6IC00OyBmbG9hdDpyaWdodDsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDAwOyBoZWlnaHQ6MnB4OyBvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDoxcHg7Ij48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9IlotSU5ERVg6IC00OyBmbG9hdDpsZWZ0OyBiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7IGhlaWdodDoxcHg7IG92ZXJmbG93OiBoaWRkZW47IHdpZHRoOjFweDsiPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iWi1JTkRFWDogLTQ7IGZsb2F0OnJpZ2h0OyBiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7IGhlaWdodDoxcHg7IG92ZXJmbG93OiBoaWRkZW47IHdpZHRoOjFweDsiPjwvZGl2PicgOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGcuZ2V0Q2FwdGlvblR5cGUoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdkNhcHRpb25TdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBnLmdldENhcHRpb25UeXBlKCkgKSB7ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ2FwdGlvbic6ICAgIHZDYXB0aW9uU3RyID0gdlRhc2tMaXN0W2ldLmdldENhcHRpb24oKTsgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSZXNvdXJjZSc6ICAgdkNhcHRpb25TdHIgPSB2VGFza0xpc3RbaV0uZ2V0UmVzb3VyY2UoKTsgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEdXJhdGlvbic6ICAgdkNhcHRpb25TdHIgPSB2VGFza0xpc3RbaV0uZ2V0RHVyYXRpb24odkZvcm1hdCk7ICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ29tcGxldGUnOiAgIHZDYXB0aW9uU3RyID0gdlRhc2tMaXN0W2ldLmdldENvbXBTdHIoKTsgIGJyZWFrOwoJCSAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92UmlnaHRUYWJsZSArPSAnPGRpdiBzdHlsZT0iRk9OVC1TSVpFOjEycHg7IHBvc2l0aW9uOmFic29sdXRlOyBsZWZ0OiA2cHg7IHRvcDoxcHg7Ij4nICsgdkNhcHRpb25TdHIgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzxkaXYgc3R5bGU9IkZPTlQtU0laRToxMnB4OyBwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0zcHg7IHdpZHRoOjEyMHB4OyBsZWZ0OicgKyAoTWF0aC5jZWlsKCh2VGFza1JpZ2h0KSAqICh2RGF5V2lkdGgpIC0gMSkgKyA2KSArICdweCI+JyArIHZDYXB0aW9uU3RyICsgJzwvZGl2Pic7CgkgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzwvZGl2PicgOwoKICAgICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAgIHZEaXZTdHIgPSAnPERJVj48VEFCTEUgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyB0b3A6MHB4OyB3aWR0aDogJyArIHZDaGFydFdpZHRoICsgJ3B4OyIgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIGJvcmRlcj0wPicgKwogICAgICAgICAgICAgICAgICAgICAnPFRSIGlkPWNoaWxkcm93XycgKyB2SUQgKyAnIGNsYXNzPXllc2Rpc3BsYXkgc3R5bGU9IkhFSUdIVDogMjBweCIgYmdDb2xvcj0jZmZmZmZmIG9uTW91c2VvdmVyPWcubW91c2VPdmVyKHRoaXMsJyArIHZJRCArICcsInJpZ2h0Iiwicm93Iikgb25Nb3VzZW91dD1nLm1vdXNlT3V0KHRoaXMsJyArIHZJRCArICcsInJpZ2h0Iiwicm93Iik+JyArIHZJdGVtUm93U3RyICsgJzwvVFI+PC9UQUJMRT48L0RJVj4nOwogICAgICAgICAgICAgICAgICB2UmlnaHRUYWJsZSArPSB2RGl2U3RyOwogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgLy8gRHJhdyBUYXNrIEJhciAgd2hpY2ggaGFzIG91dGVyIERJViB3aXRoIGVuY2xvc2VkIGNvbG9yZWQgYmFyIGRpdiwgYW5kIG9wYXF1ZSBjb21wbGV0aW9uIGRpdgoJICAgICAgICAgICAgdlJpZ2h0VGFibGUgKz0KICAgICAgICAgICAgICAgICAgICAgJzxkaXYgaWQ9YmFyZGl2XycgKyB2SUQgKyAnIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjRweDsgbGVmdDonICsgTWF0aC5jZWlsKHZUYXNrTGVmdCAqICh2RGF5V2lkdGgpICsgMSkgKyAncHg7IGhlaWdodDoxOHB4OyB3aWR0aDonICsgTWF0aC5jZWlsKCh2VGFza1JpZ2h0KSAqICh2RGF5V2lkdGgpIC0gMSkgKyAncHgiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBpZD10YXNrYmFyXycgKyB2SUQgKyAnIHRpdGxlPSInICsgdlRhc2tMaXN0W2ldLmdldE5hbWUoKSArICc6ICcgKyB2RGF0ZVJvd1N0ciArICciIGNsYXNzPWd0YXNrIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiMnICsgdlRhc2tMaXN0W2ldLmdldENvbG9yKCkgKyc7IGhlaWdodDogMTNweDsgd2lkdGg6JyArIE1hdGguY2VpbCgodlRhc2tSaWdodCkgKiAodkRheVdpZHRoKSAtIDEpICsgJ3B4OyBjdXJzb3I6IHBvaW50ZXI7b3BhY2l0eTowLjk7IiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uY2xpY2s9SlNHYW50dC50YXNrTGluaygiJyArIHZUYXNrTGlzdFtpXS5nZXRMaW5rKCkgKyAnIiwzMDAsMjAwKTsgPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1nY29tcGxldGUgc3R5bGU9IlotSU5ERVg6IC00OyBmbG9hdDpsZWZ0OyBiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyBoZWlnaHQ6NXB4OyBvdmVyZmxvdzogYXV0bzsgbWFyZ2luLXRvcDo0cHg7IGZpbHRlcjogYWxwaGEob3BhY2l0eT00MCk7IG9wYWNpdHk6MC40OyB3aWR0aDonICsgdlRhc2tMaXN0W2ldLmdldENvbXBTdHIoKSArICc7IG92ZXJmbG93OmhpZGRlbiI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiggZy5nZXRDYXB0aW9uVHlwZSgpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICB2Q2FwdGlvblN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGcuZ2V0Q2FwdGlvblR5cGUoKSApIHsgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDYXB0aW9uJzogICAgdkNhcHRpb25TdHIgPSB2VGFza0xpc3RbaV0uZ2V0Q2FwdGlvbigpOyAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1Jlc291cmNlJzogICB2Q2FwdGlvblN0ciA9IHZUYXNrTGlzdFtpXS5nZXRSZXNvdXJjZSgpOyAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0R1cmF0aW9uJzogICB2Q2FwdGlvblN0ciA9IHZUYXNrTGlzdFtpXS5nZXREdXJhdGlvbih2Rm9ybWF0KTsgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDb21wbGV0ZSc6ICAgdkNhcHRpb25TdHIgPSB2VGFza0xpc3RbaV0uZ2V0Q29tcFN0cigpOyAgYnJlYWs7CgkJICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZSaWdodFRhYmxlICs9ICc8ZGl2IHN0eWxlPSJGT05ULVNJWkU6MTJweDsgcG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6IDZweDsgdG9wOi0zcHg7Ij4nICsgdkNhcHRpb25TdHIgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdlJpZ2h0VGFibGUgKz0gJzxkaXYgc3R5bGU9IkZPTlQtU0laRToxMnB4OyBwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0zcHg7IHdpZHRoOjEyMHB4OyBsZWZ0OicgKyAoTWF0aC5jZWlsKCh2VGFza1JpZ2h0KSAqICh2RGF5V2lkdGgpIC0gMSkgKyA2KSArICdweCI+JyArIHZDYXB0aW9uU3RyICsgJzwvZGl2Pic7CgkgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHZSaWdodFRhYmxlICs9ICc8L2Rpdj4nIDsKCiAgICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2UmlnaHRUYWJsZSArPSAnPC9ESVY+JzsKCiAgICAgICAgIH0KCiAgICAgICAgIHZNYWluVGFibGUgKz0gdlJpZ2h0VGFibGUgKyAnPC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT48L0JPRFk+PC9IVE1MPic7CgoJCSAgIHZEaXYuaW5uZXJIVE1MID0gdk1haW5UYWJsZTsKCiAgICAgIH0KCiAgIH07IC8vdGhpcy5kcmF3CgovKioKKiBNb3VzZW92ZXIgYmVoYXZpb3VyIGZvciBnYW50dCByb3cKKiBAbWV0aG9kIG1vdXNlT3ZlcgoqIEByZXR1cm4ge1ZvaWR9CiovICB0aGlzLm1vdXNlT3ZlciA9IGZ1bmN0aW9uKCBwT2JqLCBwSUQsIHBQb3MsIHBUeXBlICkgewogICAgICBpZiggcFBvcyA9PSAncmlnaHQnICkgIHZJRCA9ICdjaGlsZF8nICsgcElEOwogICAgICBlbHNlIHZJRCA9ICdjaGlsZHJvd18nICsgcElEOwogICAgICAKICAgICAgcE9iai5iZ0NvbG9yID0gIiNmZmZmYWEiOwogICAgICB2Um93T2JqID0gSlNHYW50dC5maW5kT2JqKHZJRCk7CiAgICAgIGlmICh2Um93T2JqKSB2Um93T2JqLmJnQ29sb3IgPSAiI2ZmZmZhYSI7CiAgIH07CgovKioKKiBNb3VzZW91dCBiZWhhdmlvdXIgZm9yIGdhbnR0IHJvdwoqIEBtZXRob2QgbW91c2VPdXQKKiBAcmV0dXJuIHtWb2lkfQoqLyAgdGhpcy5tb3VzZU91dCA9IGZ1bmN0aW9uKCBwT2JqLCBwSUQsIHBQb3MsIHBUeXBlICkgewogICAgICBpZiggcFBvcyA9PSAncmlnaHQnICkgIHZJRCA9ICdjaGlsZF8nICsgcElEOwogICAgICBlbHNlIHZJRCA9ICdjaGlsZHJvd18nICsgcElEOwogICAgICAKICAgICAgcE9iai5iZ0NvbG9yID0gIiNmZmZmZmYiOwogICAgICB2Um93T2JqID0gSlNHYW50dC5maW5kT2JqKHZJRCk7CiAgICAgIGlmICh2Um93T2JqKSB7CiAgICAgICAgIGlmKCBwVHlwZSA9PSAiZ3JvdXAiKSB7CiAgICAgICAgICAgIHBPYmouYmdDb2xvciA9ICIjZjNmM2YzIjsKICAgICAgICAgICAgdlJvd09iai5iZ0NvbG9yID0gIiNmM2YzZjMiOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwT2JqLmJnQ29sb3IgPSAiI2ZmZmZmZiI7CiAgICAgICAgICAgIHZSb3dPYmouYmdDb2xvciA9ICIjZmZmZmZmIjsKICAgICAgICAgfQogICAgICB9CiAgIH07Cgp9OyAvL0dhbnR0Q2hhcnQKCgovKioKKiAKQGNsYXNzIAoqLwoKLyoqCiogQ2hlY2tzIHdoZXRoZXIgYnJvd3NlciBpcyBJRQoqIAoqIEBtZXRob2QgaXNJRSAKKi8KSlNHYW50dC5pc0lFID0gZnVuY3Rpb24gKCkgewoJCglpZih0eXBlb2YgZG9jdW1lbnQuYWxsICE9ICd1bmRlZmluZWQnKQoJCXtyZXR1cm4gdHJ1ZTt9CgllbHNlCgkJe3JldHVybiBmYWxzZTt9Cn07CgkKLyoqCiogUmVjdXJzaXZlbHkgcHJvY2VzcyB0YXNrIHRyZWUgLi4uIHNldCBtaW4sIG1heCBkYXRlcyBvZiBwYXJlbnQgdGFza3MgYW5kIGlkZW50ZnkgdGFzayBsZXZlbC4KKgoqIEBtZXRob2QgcHJvY2Vzc1Jvd3MKKiBAcGFyYW0gcExpc3Qge0FycmF5fSAtIEFycmF5IG9mIFRhc2tJdGVtIE9iamVjdHMKKiBAcGFyYW0gcElEIHtOdW1iZXJ9IC0gdGFzayBJRAoqIEBwYXJhbSBwUm93IHtOdW1iZXJ9IC0gUm93IGluIGNoYXJ0CiogQHBhcmFtIHBMZXZlbCB7TnVtYmVyfSAtIEN1cnJlbnQgdHJlZSBsZXZlbAoqIEBwYXJhbSBwT3BlbiB7Qm9vbGVhbn0KKiBAcmV0dXJuIHZvaWQKKi8gCkpTR2FudHQucHJvY2Vzc1Jvd3MgPSBmdW5jdGlvbihwTGlzdCwgcElELCBwUm93LCBwTGV2ZWwsIHBPcGVuKQp7CgogICB2YXIgdk1pbkRhdGUgPSBuZXcgRGF0ZSgpOwogICB2YXIgdk1heERhdGUgPSBuZXcgRGF0ZSgpOwogICB2YXIgdk1pblNldCAgPSAwOwogICB2YXIgdk1heFNldCAgPSAwOwogICB2YXIgdkxpc3QgICAgPSBwTGlzdDsKICAgdmFyIHZMZXZlbCAgID0gcExldmVsOwogICB2YXIgaSAgICAgICAgPSAwOwogICB2YXIgdk51bUtpZCAgPSAwOwogICB2YXIgdkNvbXBTdW0gPSAwOwogICB2YXIgdlZpc2libGUgPSBwT3BlbjsKICAgCiAgIGZvcihpID0gMDsgaSA8IHBMaXN0Lmxlbmd0aDsgaSsrKQogICB7CiAgICAgIGlmKHBMaXN0W2ldLmdldFBhcmVudCgpID09IHBJRCkgewoJCSB2VmlzaWJsZSA9IHBPcGVuOwogICAgICAgICBwTGlzdFtpXS5zZXRWaXNpYmxlKHZWaXNpYmxlKTsKICAgICAgICAgaWYodlZpc2libGU9PTEgJiYgcExpc3RbaV0uZ2V0T3BlbigpID09IDApIAogICAgICAgICAgIHt2VmlzaWJsZSA9IDA7fQogICAgICAgICAgICAKICAgICAgICAgcExpc3RbaV0uc2V0TGV2ZWwodkxldmVsKTsKICAgICAgICAgdk51bUtpZCsrOwoKICAgICAgICAgaWYocExpc3RbaV0uZ2V0R3JvdXAoKSA9PSAxKSB7CiAgICAgICAgICAgIEpTR2FudHQucHJvY2Vzc1Jvd3Modkxpc3QsIHBMaXN0W2ldLmdldElEKCksIGksIHZMZXZlbCsxLCB2VmlzaWJsZSk7CiAgICAgICAgIH07CgogICAgICAgICBpZiggdk1pblNldD09MCB8fCBwTGlzdFtpXS5nZXRTdGFydCgpIDwgdk1pbkRhdGUpIHsKICAgICAgICAgICAgdk1pbkRhdGUgPSBwTGlzdFtpXS5nZXRTdGFydCgpOwogICAgICAgICAgICB2TWluU2V0ID0gMTsKICAgICAgICAgfTsKCiAgICAgICAgIGlmKCB2TWF4U2V0PT0wIHx8IHBMaXN0W2ldLmdldEVuZCgpID4gdk1heERhdGUpIHsKICAgICAgICAgICAgdk1heERhdGUgPSBwTGlzdFtpXS5nZXRFbmQoKTsKICAgICAgICAgICAgdk1heFNldCA9IDE7CiAgICAgICAgIH07CgogICAgICAgICB2Q29tcFN1bSArPSBwTGlzdFtpXS5nZXRDb21wVmFsKCk7CgogICAgICB9CiAgIH0KCiAgIGlmKHBSb3cgPj0gMCkgewogICAgICBwTGlzdFtwUm93XS5zZXRTdGFydCh2TWluRGF0ZSk7CiAgICAgIHBMaXN0W3BSb3ddLnNldEVuZCh2TWF4RGF0ZSk7CiAgICAgIHBMaXN0W3BSb3ddLnNldE51bUtpZCh2TnVtS2lkKTsKICAgICAgcExpc3RbcFJvd10uc2V0Q29tcFZhbChNYXRoLmNlaWwodkNvbXBTdW0vdk51bUtpZCkpOwogICB9Cgp9OwoKLyoqCiogRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIGRhdGUgb2YgYWxsIHRhc2tzIGFuZCBzZXQgbG93ZXIgYm91bmQgYmFzZWQgb24gZm9ybWF0CioKKiBAbWV0aG9kIGdldE1pbkRhdGUKKiBAcGFyYW0gcExpc3Qge0FycmF5fSAtIEFycmF5IG9mIFRhc2tJdGVtIE9iamVjdHMKKiBAcGFyYW0gcEZvcm1hdCB7U3RyaW5nfSAtIGN1cnJlbnQgZm9ybWF0IChtaW51dGUsaG91cixkYXkuLi4pCiogQHJldHVybiB7RGF0ZXRpbWV9CiovCkpTR2FudHQuZ2V0TWluRGF0ZSA9IGZ1bmN0aW9uIGdldE1pbkRhdGUocExpc3QsIHBGb3JtYXQpICAKICAgICAgewoKICAgICAgICAgdmFyIHZEYXRlID0gbmV3IERhdGUoKTsKCiAgICAgICAgIHZEYXRlLnNldEZ1bGxZZWFyKHBMaXN0WzBdLmdldFN0YXJ0KCkuZ2V0RnVsbFllYXIoKSwgcExpc3RbMF0uZ2V0U3RhcnQoKS5nZXRNb250aCgpLCBwTGlzdFswXS5nZXRTdGFydCgpLmdldERhdGUoKSk7CgogICAgICAgICAvLyBQYXJzZSBhbGwgVGFzayBFbmQgZGF0ZXMgdG8gZmluZCBtaW4KICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcExpc3QubGVuZ3RoOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgaWYoRGF0ZS5wYXJzZShwTGlzdFtpXS5nZXRTdGFydCgpKSA8IERhdGUucGFyc2UodkRhdGUpKQogICAgICAgICAgICAgICB2RGF0ZS5zZXRGdWxsWWVhcihwTGlzdFtpXS5nZXRTdGFydCgpLmdldEZ1bGxZZWFyKCksIHBMaXN0W2ldLmdldFN0YXJ0KCkuZ2V0TW9udGgoKSwgcExpc3RbaV0uZ2V0U3RhcnQoKS5nZXREYXRlKCkpOwogICAgICAgICB9CgogICAgICAgICBpZiAoIHBGb3JtYXQ9PSAnbWludXRlJykKICAgICAgICAgewogICAgICAgICAgICB2RGF0ZS5zZXRIb3VycygwKTsKICAgICAgICAgICAgdkRhdGUuc2V0TWludXRlcygwKTsKICAgICAgICAgfQoJCSBlbHNlIGlmIChwRm9ybWF0ID09ICdob3VyJyApCiAgICAgICAgIHsKICAgICAgICAgICAgdkRhdGUuc2V0SG91cnMoMCk7CiAgICAgICAgICAgIHZEYXRlLnNldE1pbnV0ZXMoMCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gQWRqdXN0IG1pbiBkYXRlIHRvIHNwZWNpZmljIGZvcm1hdCBib3VuZGFyaWVzIChmaXJzdCBvZiB3ZWVrIG9yIGZpcnN0IG9mIG1vbnRoKQogICAgICAgICBlbHNlIGlmIChwRm9ybWF0PT0nZGF5JykKICAgICAgICAgewogICAgICAgICAgICB2RGF0ZS5zZXREYXRlKHZEYXRlLmdldERhdGUoKSAtIDEpOwogICAgICAgICAgICB3aGlsZSh2RGF0ZS5nZXREYXkoKSAlIDcgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2RGF0ZS5zZXREYXRlKHZEYXRlLmdldERhdGUoKSAtIDEpOwogICAgICAgICAgICB9CgogICAgICAgICB9CgogICAgICAgICBlbHNlIGlmIChwRm9ybWF0PT0nd2VlaycpCiAgICAgICAgIHsKICAgICAgICAgICAgdkRhdGUuc2V0RGF0ZSh2RGF0ZS5nZXREYXRlKCkgLSA3KTsKICAgICAgICAgICAgd2hpbGUodkRhdGUuZ2V0RGF5KCkgJSA3ID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdkRhdGUuc2V0RGF0ZSh2RGF0ZS5nZXREYXRlKCkgLSAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgfQoKICAgICAgICAgZWxzZSBpZiAocEZvcm1hdD09J21vbnRoJykKICAgICAgICAgewogICAgICAgICAgICB3aGlsZSh2RGF0ZS5nZXREYXRlKCkgPiAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2RGF0ZS5zZXREYXRlKHZEYXRlLmdldERhdGUoKSAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIGVsc2UgaWYgKHBGb3JtYXQ9PSdxdWFydGVyJykKICAgICAgICAgewogICAgICAgICAgICBpZiggdkRhdGUuZ2V0TW9udGgoKT09MCB8fCB2RGF0ZS5nZXRNb250aCgpPT0xIHx8IHZEYXRlLmdldE1vbnRoKCk9PTIgKQogICAgICAgICAgICAgICB7dkRhdGUuc2V0RnVsbFllYXIodkRhdGUuZ2V0RnVsbFllYXIoKSwgMCwgMSk7fQogICAgICAgICAgICBlbHNlIGlmKCB2RGF0ZS5nZXRNb250aCgpPT0zIHx8IHZEYXRlLmdldE1vbnRoKCk9PTQgfHwgdkRhdGUuZ2V0TW9udGgoKT09NSApCiAgICAgICAgICAgICAgIHt2RGF0ZS5zZXRGdWxsWWVhcih2RGF0ZS5nZXRGdWxsWWVhcigpLCAzLCAxKTt9CiAgICAgICAgICAgIGVsc2UgaWYoIHZEYXRlLmdldE1vbnRoKCk9PTYgfHwgdkRhdGUuZ2V0TW9udGgoKT09NyB8fCB2RGF0ZS5nZXRNb250aCgpPT04ICkKICAgICAgICAgICAgICAge3ZEYXRlLnNldEZ1bGxZZWFyKHZEYXRlLmdldEZ1bGxZZWFyKCksIDYsIDEpO30KICAgICAgICAgICAgZWxzZSBpZiggdkRhdGUuZ2V0TW9udGgoKT09OSB8fCB2RGF0ZS5nZXRNb250aCgpPT0xMCB8fCB2RGF0ZS5nZXRNb250aCgpPT0xMSApCiAgICAgICAgICAgICAgIHt2RGF0ZS5zZXRGdWxsWWVhcih2RGF0ZS5nZXRGdWxsWWVhcigpLCA5LCAxKTt9CgogICAgICAgICB9OwoKICAgICAgICAgcmV0dXJuKHZEYXRlKTsKCiAgICAgIH07CgoKCgovKioKKiBVc2VkIHRvIGRldGVybWluZSB0aGUgbWluaW11bSBkYXRlIG9mIGFsbCB0YXNrcyBhbmQgc2V0IGxvd2VyIGJvdW5kIGJhc2VkIG9uIGZvcm1hdAoqCiogQG1ldGhvZCBnZXRNYXhEYXRlCiogQHBhcmFtIHBMaXN0IHtBcnJheX0gLSBBcnJheSBvZiBUYXNrSXRlbSBPYmplY3RzCiogQHBhcmFtIHBGb3JtYXQge1N0cmluZ30gLSBjdXJyZW50IGZvcm1hdCAobWludXRlLGhvdXIsZGF5Li4uKQoqIEByZXR1cm4ge0RhdGV0aW1lfQoqLwpKU0dhbnR0LmdldE1heERhdGUgPSBmdW5jdGlvbiAocExpc3QsIHBGb3JtYXQpCnsKICAgdmFyIHZEYXRlID0gbmV3IERhdGUoKTsKCiAgICAgICAgIHZEYXRlLnNldEZ1bGxZZWFyKHBMaXN0WzBdLmdldEVuZCgpLmdldEZ1bGxZZWFyKCksIHBMaXN0WzBdLmdldEVuZCgpLmdldE1vbnRoKCksIHBMaXN0WzBdLmdldEVuZCgpLmdldERhdGUoKSk7CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgICAgICAgIC8vIFBhcnNlIGFsbCBUYXNrIEVuZCBkYXRlcyB0byBmaW5kIG1heAogICAgICAgICBmb3IoaSA9IDA7IGkgPCBwTGlzdC5sZW5ndGg7IGkrKykKICAgICAgICAgewogICAgICAgICAgICBpZihEYXRlLnBhcnNlKHBMaXN0W2ldLmdldEVuZCgpKSA+IERhdGUucGFyc2UodkRhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy92RGF0ZS5zZXRGdWxsWWVhcihwTGlzdFswXS5nZXRFbmQoKS5nZXRGdWxsWWVhcigpLCBwTGlzdFswXS5nZXRFbmQoKS5nZXRNb250aCgpLCBwTGlzdFswXS5nZXRFbmQoKS5nZXREYXRlKCkpOwogICAgICAgICAgICAgICAgIHZEYXRlLnNldFRpbWUoRGF0ZS5wYXJzZShwTGlzdFtpXS5nZXRFbmQoKSkpOwoJCQl9CQoJICAgICB9CgkgICAgIAoJICAgICBpZiAocEZvcm1hdCA9PSAnbWludXRlJykKICAgICAgICAgewogICAgICAgICAgICB2RGF0ZS5zZXRIb3Vycyh2RGF0ZS5nZXRIb3VycygpICsgMSk7CiAgICAgICAgICAgIHZEYXRlLnNldE1pbnV0ZXMoNTkpOwogICAgICAgICB9CQoJICAgICAKICAgICAgICAgaWYgKHBGb3JtYXQgPT0gJ2hvdXInKQogICAgICAgICB7CiAgICAgICAgICAgIHZEYXRlLnNldEhvdXJzKHZEYXRlLmdldEhvdXJzKCkgKyAyKTsKICAgICAgICAgfQkJCQkKCQkJCQogICAgICAgICAvLyBBZGp1c3QgbWF4IGRhdGUgdG8gc3BlY2lmaWMgZm9ybWF0IGJvdW5kYXJpZXMgKGVuZCBvZiB3ZWVrIG9yIGVuZCBvZiBtb250aCkKICAgICAgICAgaWYgKHBGb3JtYXQ9PSdkYXknKQogICAgICAgICB7CiAgICAgICAgICAgIHZEYXRlLnNldERhdGUodkRhdGUuZ2V0RGF0ZSgpICsgMSk7CgogICAgICAgICAgICB3aGlsZSh2RGF0ZS5nZXREYXkoKSAlIDYgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2RGF0ZS5zZXREYXRlKHZEYXRlLmdldERhdGUoKSArIDEpOwogICAgICAgICAgICB9CgogICAgICAgICB9CgogICAgICAgICBpZiAocEZvcm1hdD09J3dlZWsnKQogICAgICAgICB7CiAgICAgICAgICAgIC8vRm9yIHdlZWtzLCB3aGF0IGlzIHRoZSBsYXN0IGxvZ2ljYWwgYm91bmRhcnk/CiAgICAgICAgICAgIHZEYXRlLnNldERhdGUodkRhdGUuZ2V0RGF0ZSgpICsgMTEpOwoKICAgICAgICAgICAgd2hpbGUodkRhdGUuZ2V0RGF5KCkgJSA2ID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdkRhdGUuc2V0RGF0ZSh2RGF0ZS5nZXREYXRlKCkgKyAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgfQoKICAgICAgICAgLy8gU2V0IHRvIGxhc3QgZGF5IG9mIGN1cnJlbnQgTW9udGgKICAgICAgICAgaWYgKHBGb3JtYXQ9PSdtb250aCcpCiAgICAgICAgIHsKICAgICAgICAgICAgd2hpbGUodkRhdGUuZ2V0RGF5KCkgPiAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2RGF0ZS5zZXREYXRlKHZEYXRlLmdldERhdGUoKSArIDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2RGF0ZS5zZXREYXRlKHZEYXRlLmdldERhdGUoKSAtIDEpOwogICAgICAgICB9CgogICAgICAgICAvLyBTZXQgdG8gbGFzdCBkYXkgb2YgY3VycmVudCBRdWFydGVyCiAgICAgICAgIGlmIChwRm9ybWF0PT0ncXVhcnRlcicpCiAgICAgICAgIHsKICAgICAgICAgICAgaWYoIHZEYXRlLmdldE1vbnRoKCk9PTAgfHwgdkRhdGUuZ2V0TW9udGgoKT09MSB8fCB2RGF0ZS5nZXRNb250aCgpPT0yICkKICAgICAgICAgICAgICAgdkRhdGUuc2V0RnVsbFllYXIodkRhdGUuZ2V0RnVsbFllYXIoKSwgMiwgMzEpOwogICAgICAgICAgICBlbHNlIGlmKCB2RGF0ZS5nZXRNb250aCgpPT0zIHx8IHZEYXRlLmdldE1vbnRoKCk9PTQgfHwgdkRhdGUuZ2V0TW9udGgoKT09NSApCiAgICAgICAgICAgICAgIHZEYXRlLnNldEZ1bGxZZWFyKHZEYXRlLmdldEZ1bGxZZWFyKCksIDUsIDMwKTsKICAgICAgICAgICAgZWxzZSBpZiggdkRhdGUuZ2V0TW9udGgoKT09NiB8fCB2RGF0ZS5nZXRNb250aCgpPT03IHx8IHZEYXRlLmdldE1vbnRoKCk9PTggKQogICAgICAgICAgICAgICB2RGF0ZS5zZXRGdWxsWWVhcih2RGF0ZS5nZXRGdWxsWWVhcigpLCA4LCAzMCk7CiAgICAgICAgICAgIGVsc2UgaWYoIHZEYXRlLmdldE1vbnRoKCk9PTkgfHwgdkRhdGUuZ2V0TW9udGgoKT09MTAgfHwgdkRhdGUuZ2V0TW9udGgoKT09MTEgKQogICAgICAgICAgICAgICB2RGF0ZS5zZXRGdWxsWWVhcih2RGF0ZS5nZXRGdWxsWWVhcigpLCAxMSwgMzEpOwoKICAgICAgICAgfQoKICAgICAgICAgcmV0dXJuKHZEYXRlKTsKCiAgICAgIH07CgoKLyoqCiogUmV0dXJucyBhbiBvYmplY3QgZnJvbSB0aGUgY3VycmVudCBET00KKgoqIEBtZXRob2QgZmluZE9iagoqIEBwYXJhbSB0aGVPYmoge1N0cmluZ30gLSBPYmplY3QgbmFtZQoqIEBwYXJhbSB0aGVEb2Mge0RvY3VtZW50fSAtIGN1cnJlbnQgZG9jdW1lbnQgKERPTSkKKiBAcmV0dXJuIHtPYmplY3R9CiovCkpTR2FudHQuZmluZE9iaiA9IGZ1bmN0aW9uICh0aGVPYmosIHRoZURvYykKCiAgICAgIHsKCiAgICAgICAgIHZhciBwLCBpLCBmb3VuZE9iajsKCiAgICAgICAgIGlmKCF0aGVEb2MpIHt0aGVEb2MgPSBkb2N1bWVudDt9CgogICAgICAgICBpZiggKHAgPSB0aGVPYmouaW5kZXhPZigiPyIpKSA+IDAgJiYgcGFyZW50LmZyYW1lcy5sZW5ndGgpewoKICAgICAgICAgICAgdGhlRG9jID0gcGFyZW50LmZyYW1lc1t0aGVPYmouc3Vic3RyaW5nKHArMSldLmRvY3VtZW50OwoKICAgICAgICAgICAgdGhlT2JqID0gdGhlT2JqLnN1YnN0cmluZygwLHApOwoKICAgICAgICAgfQoKICAgICAgICAgaWYoIShmb3VuZE9iaiA9IHRoZURvY1t0aGVPYmpdKSAmJiB0aGVEb2MuYWxsKSAKCiAgICAgICAgICAgIHtmb3VuZE9iaiA9IHRoZURvYy5hbGxbdGhlT2JqXTt9CgoKCiAgICAgICAgIGZvciAoaT0wOyAhZm91bmRPYmogJiYgaSA8IHRoZURvYy5mb3Jtcy5sZW5ndGg7IGkrKykgCgogICAgICAgICAgICB7Zm91bmRPYmogPSB0aGVEb2MuZm9ybXNbaV1bdGhlT2JqXTt9CgoKCiAgICAgICAgIGZvcihpPTA7ICFmb3VuZE9iaiAmJiB0aGVEb2MubGF5ZXJzICYmIGkgPCB0aGVEb2MubGF5ZXJzLmxlbmd0aDsgaSsrKQoKICAgICAgICAgICAge2ZvdW5kT2JqID0gSlNHYW50dC5maW5kT2JqKHRoZU9iaix0aGVEb2MubGF5ZXJzW2ldLmRvY3VtZW50KTt9CgoKCiAgICAgICAgIGlmKCFmb3VuZE9iaiAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCkKCiAgICAgICAgICAgIHtmb3VuZE9iaiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoZU9iaik7fQoKCgogICAgICAgICByZXR1cm4gZm91bmRPYmo7CgogICAgICB9OwoKCi8qKgoqIENoYW5nZSBkaXNwbGF5IGZvcm1hdCBvZiBjdXJyZW50IGdhbnR0IGNoYXJ0CioKKiBAbWV0aG9kIGNoYW5nZUZvcm1hdAoqIEBwYXJhbSBwRm9ybWF0IHtTdHJpbmd9IC0gQ3VycmVudCBmb3JtYXQgKG1pbnV0ZSxob3VyLGRheS4uLikKKiBAcGFyYW0gZ2FudHRPYmoge0dhbnR0Q2hhcnR9IC0gVGhlIGdhbnR0IG9iamVjdAoqIEByZXR1cm4ge3ZvaWR9CiovCkpTR2FudHQuY2hhbmdlRm9ybWF0ID0gICAgICBmdW5jdGlvbihwRm9ybWF0LGdhbnR0T2JqKSB7CgogICAgICAgIGlmKGdhbnR0T2JqKSAKCQl7CgkJZ2FudHRPYmouc2V0Rm9ybWF0KHBGb3JtYXQpOwoJCWdhbnR0T2JqLkRyYXdEZXBlbmRlbmNpZXMoKTsKCQl9CiAgICAgICAgZWxzZQogICAgICAgIHthbGVydCgnQ2hhcnQgdW5kZWZpbmVkJyk7fTsKICAgICAgfTsKCgovKioKKiBPcGVuL0Nsb3NlIGFuZCBoaWRlL3Nob3cgY2hpbGRyZW4gb2Ygc3BlY2lmaWVkIHRhc2sKKgoqIEBtZXRob2QgZm9sZGVyCiogQHBhcmFtIHBJRCB7TnVtYmVyfSAtIFRhc2sgSUQKKiBAcGFyYW0gZ2FudHRPYmoge0dhbnR0Q2hhcnR9IC0gVGhlIGdhbnR0IG9iamVjdAoqIEByZXR1cm4ge3ZvaWR9CiovCkpTR2FudHQuZm9sZGVyPSBmdW5jdGlvbiAocElELGdhbnR0T2JqKSB7CgogICB2YXIgdkxpc3QgPSBnYW50dE9iai5nZXRMaXN0KCk7CgogICBmb3IoaSA9IDA7IGkgPCB2TGlzdC5sZW5ndGg7IGkrKykKICAgewogICAgICBpZih2TGlzdFtpXS5nZXRJRCgpID09IHBJRCkgewoKICAgICAgICAgaWYoIHZMaXN0W2ldLmdldE9wZW4oKSA9PSAxICkgewogICAgICAgICAgICB2TGlzdFtpXS5zZXRPcGVuKDApOwogICAgICAgICAgICBKU0dhbnR0LmhpZGUocElELGdhbnR0T2JqKTsKCiAgICAgICAgICAgIGlmIChKU0dhbnR0LmlzSUUoKSkgCiAgICAgICAgICAgICAgIHtKU0dhbnR0LmZpbmRPYmooJ2dyb3VwXycrcElEKS5pbm5lclRleHQgPSAnKyc7fQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIHtKU0dhbnR0LmZpbmRPYmooJ2dyb3VwXycrcElEKS50ZXh0Q29udGVudCA9ICcrJzt9CgkJCQkKICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgIHZMaXN0W2ldLnNldE9wZW4oMSk7CgogICAgICAgICAgICBKU0dhbnR0LnNob3cocElELCAxLCBnYW50dE9iaik7CgogICAgICAgICAgICAgICBpZiAoSlNHYW50dC5pc0lFKCkpIAogICAgICAgICAgICAgICAgICB7SlNHYW50dC5maW5kT2JqKCdncm91cF8nK3BJRCkuaW5uZXJUZXh0ID0gJ5YnO30KICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICB7SlNHYW50dC5maW5kT2JqKCdncm91cF8nK3BJRCkudGV4dENvbnRlbnQgPSAnlic7fQoKICAgICAgICAgfQoKICAgICAgfQogICB9Cn07CgovKioKKiBIaWRlIGNoaWxkcmVuIG9mIGEgdGFzawoqCiogQG1ldGhvZCBoaWRlCiogQHBhcmFtIHBJRCB7TnVtYmVyfSAtIFRhc2sgSUQKKiBAcGFyYW0gZ2FudHRPYmoge0dhbnR0Q2hhcnR9IC0gVGhlIGdhbnR0IG9iamVjdAoqIEByZXR1cm4ge3ZvaWR9CiovCkpTR2FudHQuaGlkZT0gICAgIGZ1bmN0aW9uIChwSUQsZ2FudHRPYmopIHsKICAgdmFyIHZMaXN0ID0gZ2FudHRPYmouZ2V0TGlzdCgpOwogICB2YXIgdklEICAgPSAwOwoKICAgZm9yKHZhciBpID0gMDsgaSA8IHZMaXN0Lmxlbmd0aDsgaSsrKQogICB7CiAgICAgIGlmKHZMaXN0W2ldLmdldFBhcmVudCgpID09IHBJRCkgewogICAgICAgICB2SUQgPSB2TGlzdFtpXS5nZXRJRCgpOwogICAgICAgICBKU0dhbnR0LmZpbmRPYmooJ2NoaWxkXycgKyB2SUQpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgIEpTR2FudHQuZmluZE9iaignY2hpbGRncmlkXycgKyB2SUQpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgIHZMaXN0W2ldLnNldFZpc2libGUoMCk7CiAgICAgICAgIGlmKHZMaXN0W2ldLmdldEdyb3VwKCkgPT0gMSkgCiAgICAgICAgICAgIHtKU0dhbnR0LmhpZGUodklELGdhbnR0T2JqKTt9CiAgICAgIH0KCiAgIH0KfTsKCi8qKgoqIFNob3cgY2hpbGRyZW4gb2YgYSB0YXNrCioKKiBAbWV0aG9kIHNob3cKKiBAcGFyYW0gcElEIHtOdW1iZXJ9IC0gVGFzayBJRAoqIEBwYXJhbSBnYW50dE9iaiB7R2FudHRDaGFydH0gLSBUaGUgZ2FudHQgb2JqZWN0CiogQHJldHVybiB7dm9pZH0KKi8KSlNHYW50dC5zaG93ID0gIGZ1bmN0aW9uIChwSUQsIHBUb3AsIGdhbnR0T2JqKSB7CiAgIHZhciB2TGlzdCA9IGdhbnR0T2JqLmdldExpc3QoKTsKICAgdmFyIHZJRCAgID0gMDsKCiAgIGZvcih2YXIgaSA9IDA7IGkgPCB2TGlzdC5sZW5ndGg7IGkrKykKICAgewogICAgICBpZih2TGlzdFtpXS5nZXRQYXJlbnQoKSA9PSBwSUQpIHsKICAgICAgICAgdklEID0gdkxpc3RbaV0uZ2V0SUQoKTsKICAgICAgICAgaWYocFRvcCA9PSAxKSB7CiAgICAgICAgICAgIGlmIChKU0dhbnR0LmlzSUUoKSkgeyAvLyBJRTsKCiAgICAgICAgICAgICAgIGlmKCBKU0dhbnR0LmZpbmRPYmooJ2dyb3VwXycrcElEKS5pbm5lclRleHQgPT0gJysnKSB7CiAgICAgICAgICAgICAgICAgIEpTR2FudHQuZmluZE9iaignY2hpbGRfJyt2SUQpLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgICAgICAgICAgICAgSlNHYW50dC5maW5kT2JqKCdjaGlsZGdyaWRfJyt2SUQpLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgICAgICAgICAgICAgdkxpc3RbaV0uc2V0VmlzaWJsZSgxKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSBlbHNlIHsKIAogICAgICAgICAgICAgICBpZiggSlNHYW50dC5maW5kT2JqKCdncm91cF8nK3BJRCkudGV4dENvbnRlbnQgPT0gJysnKSB7CiAgICAgICAgICAgICAgICAgIEpTR2FudHQuZmluZE9iaignY2hpbGRfJyt2SUQpLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgICAgICAgICAgICAgSlNHYW50dC5maW5kT2JqKCdjaGlsZGdyaWRfJyt2SUQpLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgICAgICAgICAgICAgdkxpc3RbaV0uc2V0VmlzaWJsZSgxKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgIGlmIChKU0dhbnR0LmlzSUUoKSkgeyAvLyBJRTsKICAgICAgICAgICAgICAgaWYoIEpTR2FudHQuZmluZE9iaignZ3JvdXBfJytwSUQpLmlubmVyVGV4dCA9PSAnlicpIHsKICAgICAgICAgICAgICAgICAgSlNHYW50dC5maW5kT2JqKCdjaGlsZF8nK3ZJRCkuc3R5bGUuZGlzcGxheSA9ICIiOwogICAgICAgICAgICAgICAgICBKU0dhbnR0LmZpbmRPYmooJ2NoaWxkZ3JpZF8nK3ZJRCkuc3R5bGUuZGlzcGxheSA9ICIiOwogICAgICAgICAgICAgICAgICB2TGlzdFtpXS5zZXRWaXNpYmxlKDEpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgaWYoIEpTR2FudHQuZmluZE9iaignZ3JvdXBfJytwSUQpLnRleHRDb250ZW50ID09ICeWJykgewogICAgICAgICAgICAgICAgICBKU0dhbnR0LmZpbmRPYmooJ2NoaWxkXycrdklEKS5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgICAgICAgICAgICAgIEpTR2FudHQuZmluZE9iaignY2hpbGRncmlkXycrdklEKS5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgICAgICAgICAgICAgIHZMaXN0W2ldLnNldFZpc2libGUoMSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICBpZih2TGlzdFtpXS5nZXRHcm91cCgpID09IDEpIAogICAgICAgICAgICB7SlNHYW50dC5zaG93KHZJRCwgMCxnYW50dE9iaik7fQoKICAgICAgfQogICB9Cn07Ci8qKgoqIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIHRhc2sgbmFtZSwgY3VycmVudGx5IG9wZW5zIGEgbmV3IHdpbmRvdwoqCiogQG1ldGhvZCB0YXNrTGluawoqIEBwYXJhbSBwUmVmIHtTdHJpbmd9IC0gVVJMIGZvciB3aW5kb3cKKiBAcGFyYW0gcFdpZHRoIHtOdW1iZXJ9IC0gV2lkdGggb2Ygd2luZG93CiogQHBhcmFtIHBIZWlnaHQge051bWJlcn0gLSBIZWlnaHQgb2Ygd2luZG93CiogQHJldHVybiB7dm9pZH0KKi8KSlNHYW50dC50YXNrTGluayA9IGZ1bmN0aW9uKHBSZWYscFdpZHRoLHBIZWlnaHQpIAoKICB7CgogICAgaWYocFdpZHRoKSAge3ZXaWR0aCA9cFdpZHRoO30gIGVsc2Uge3ZXaWR0aCA9NDAwO30KICAgIGlmKHBIZWlnaHQpIHt2SGVpZ2h0PXBIZWlnaHQ7fSBlbHNlIHt2SGVpZ2h0PTQwMDt9CgogICAgdmFyIE9wZW5XaW5kb3c9d2luZG93Lm9wZW4ocFJlZiwgIm5ld3dpbiIsICJoZWlnaHQ9Iit2SGVpZ2h0KyIsd2lkdGg9Iit2V2lkdGgpOyAKCiAgfTsKCi8qKgoqIFBhcnNlIGRhdGVzIGJhc2VkIG9uIGdhbnR0IGRhdGUgZm9ybWF0IHNldHRpbmcgYXMgZGVmaW5lZCBpbiBKU0dhbnR0LkdhbnR0Q2hhcnQuc2V0RGF0ZUlucHV0Rm9ybWF0KCkKKgoqIEBtZXRob2QgcGFyc2VEYXRlU3RyCiogQHBhcmFtIHBEYXRlU3RyIHtTdHJpbmd9IC0gQSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgZGF0ZSAoaS5lLiAiMDEvMDEvMDkiKQoqIEBwYXJhbSBwRm9ybWF0U3RyIHtTdHJpbmd9IC0gVGhlIGRhdGUgZm9ybWF0IChtbS9kZC95eXl5LGRkL21tL3l5eXkseXl5eS1tbS1kZCkKKiBAcmV0dXJuIHtEYXRldGltZX0KKi8KSlNHYW50dC5wYXJzZURhdGVTdHIgPSBmdW5jdGlvbihwRGF0ZVN0cixwRm9ybWF0U3RyKSB7CiAgIHZhciB2RGF0ZSA9bmV3IERhdGUoKTsJCiAgIHZEYXRlLnNldFRpbWUoIERhdGUucGFyc2UocERhdGVTdHIpKTsKCiAgIHN3aXRjaChwRm9ybWF0U3RyKSAKICAgewoJICBjYXNlICdtbS9kZC95eXl5JzoKCSAgICAgdmFyIHZEYXRlUGFydHMgPSBwRGF0ZVN0ci5zcGxpdCgnLycpOwogICAgICAgICB2RGF0ZS5zZXRGdWxsWWVhcihwYXJzZUludCh2RGF0ZVBhcnRzWzJdLCAxMCksIHBhcnNlSW50KHZEYXRlUGFydHNbMF0sIDEwKSAtIDEsIHBhcnNlSW50KHZEYXRlUGFydHNbMV0sIDEwKSk7CiAgICAgICAgIGJyZWFrOwoJICBjYXNlICdkZC9tbS95eXl5JzoKCSAgICAgdmFyIHZEYXRlUGFydHMgPSBwRGF0ZVN0ci5zcGxpdCgnLycpOwogICAgICAgICB2RGF0ZS5zZXRGdWxsWWVhcihwYXJzZUludCh2RGF0ZVBhcnRzWzJdLCAxMCksIHBhcnNlSW50KHZEYXRlUGFydHNbMV0sIDEwKSAtIDEsIHBhcnNlSW50KHZEYXRlUGFydHNbMF0sIDEwKSk7CiAgICAgICAgIGJyZWFrOwoJICBjYXNlICd5eXl5LW1tLWRkJzoKCSAgICAgdmFyIHZEYXRlUGFydHMgPSBwRGF0ZVN0ci5zcGxpdCgnLScpOwogICAgICAgICB2RGF0ZS5zZXRGdWxsWWVhcihwYXJzZUludCh2RGF0ZVBhcnRzWzBdLCAxMCksIHBhcnNlSW50KHZEYXRlUGFydHNbMV0sIDEwKSAtIDEsIHBhcnNlSW50KHZEYXRlUGFydHNbMV0sIDEwKSk7CiAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybih2RGF0ZSk7CiAgICAKfTsKCi8qKgoqIERpc3BsYXkgYSBmb3JtYXR0ZWQgZGF0ZSBiYXNlZCBvbiBnYW50dCBkYXRlIGZvcm1hdCBzZXR0aW5nIGFzIGRlZmluZWQgaW4gSlNHYW50dC5HYW50dENoYXJ0LnNldERhdGVEaXNwbGF5Rm9ybWF0KCkKKgoqIEBtZXRob2QgZm9ybWF0RGF0ZVN0cgoqIEBwYXJhbSBwRGF0ZSB7RGF0ZX0gLSBBIGphdmFzY3JpcHQgZGF0ZSBvYmplY3QKKiBAcGFyYW0gcEZvcm1hdFN0ciB7U3RyaW5nfSAtIFRoZSBkYXRlIGZvcm1hdCAobW0vZGQveXl5eSxkZC9tbS95eXl5LHl5eXktbW0tZGQuLi4pCiogQHJldHVybiB7U3RyaW5nfQoqLwpKU0dhbnR0LmZvcm1hdERhdGVTdHIgPSBmdW5jdGlvbihwRGF0ZSxwRm9ybWF0U3RyKSB7CiAgICAgICB2WWVhcjRTdHIgPSBwRGF0ZS5nZXRGdWxsWWVhcigpICsgJyc7CiAJICAgdlllYXIyU3RyID0gdlllYXI0U3RyLnN1YnN0cmluZygyLDQpOwogICAgICAgdk1vbnRoU3RyID0gKHBEYXRlLmdldE1vbnRoKCkrMSkgKyAnJzsKICAgICAgIHZEYXlTdHIgICA9IHBEYXRlLmdldERhdGUoKSArICcnOwoKICAgICAgdmFyIHZEYXRlU3RyID0gIiI7CQoKICAgICAgc3dpdGNoKHBGb3JtYXRTdHIpIHsKCSAgICAgICAgY2FzZSAnbW0vZGQveXl5eSc6CiAgICAgICAgICAgICAgIHJldHVybiggdk1vbnRoU3RyICsgJy8nICsgdkRheVN0ciArICcvJyArIHZZZWFyNFN0ciApOwoJICAgICAgICBjYXNlICdkZC9tbS95eXl5JzoKICAgICAgICAgICAgICAgcmV0dXJuKCB2RGF5U3RyICsgJy8nICsgdk1vbnRoU3RyICsgJy8nICsgdlllYXI0U3RyICk7CgkgICAgICAgIGNhc2UgJ3l5eXktbW0tZGQnOgogICAgICAgICAgICAgICByZXR1cm4oIHZZZWFyNFN0ciArICctJyArIHZNb250aFN0ciArICctJyArIHZEYXlTdHIgKTsKCSAgICAgICAgY2FzZSAnbW0vZGQveXknOgogICAgICAgICAgICAgICByZXR1cm4oIHZNb250aFN0ciArICcvJyArIHZEYXlTdHIgKyAnLycgKyB2WWVhcjJTdHIgKTsKCSAgICAgICAgY2FzZSAnZGQvbW0veXknOgogICAgICAgICAgICAgICByZXR1cm4oIHZEYXlTdHIgKyAnLycgKyB2TW9udGhTdHIgKyAnLycgKyB2WWVhcjJTdHIgKTsKCSAgICAgICAgY2FzZSAneXktbW0tZGQnOgogICAgICAgICAgICAgICByZXR1cm4oIHZZZWFyMlN0ciArICctJyArIHZNb250aFN0ciArICctJyArIHZEYXlTdHIgKTsKCSAgICAgICAgY2FzZSAnbW0vZGQnOgogICAgICAgICAgICAgICByZXR1cm4oIHZNb250aFN0ciArICcvJyArIHZEYXlTdHIgKTsKCSAgICAgICAgY2FzZSAnZGQvbW0nOgogICAgICAgICAgICAgICByZXR1cm4oIHZEYXlTdHIgKyAnLycgKyB2TW9udGhTdHIgKTsKICAgICAgfQkJIAoJICAKfTsKCi8qKgoqIFBhcnNlIGFuIGV4dGVybmFsIFhNTCBmaWxlIGNvbnRhaW5pbmcgdGFzayBpdGVtcy4KKgoqIEBtZXRob2QgcGFyc2VYTUwKKiBAcGFyYW0gVGhpc0ZpbGUge1N0cmluZ30gLSBVUkwgdG8gWE1MIGZpbGUKKiBAcGFyYW0gcEdhbnR0VmFyIHtHYW50dH0gLSBHYW50dCBvYmplY3QKKiBAcmV0dXJuIHt2b2lkfQoqLwpKU0dhbnR0LnBhcnNlWE1MID0gZnVuY3Rpb24oVGhpc0ZpbGUscEdhbnR0VmFyKXsKCXZhciBpc19jaHJvbWUgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY2hyb21lJykgPiAtMTsgICAvLyBJcyB0aGlzIENocm9tZSAKCQoJdHJ5IHsgLy9JbnRlcm5ldCBFeHBsb3JlciAgCgkJeG1sRG9jPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIik7CgkJfQoJY2F0Y2goZSkgewoJCXRyeSB7IC8vRmlyZWZveCwgTW96aWxsYSwgT3BlcmEsIENocm9tZSBldGMuIAoJCQlpZiAoaXNfY2hyb21lPT1mYWxzZSkgeyAgeG1sRG9jPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCIiLG51bGwpOyB9CgkJfQoJCWNhdGNoKGUpIHsKCQkJYWxlcnQoZS5tZXNzYWdlKTsKCQkJcmV0dXJuOwoJCX0KCX0KCglpZiAoaXNfY2hyb21lPT1mYWxzZSkgeyAJLy8gY2FuJ3QgdXNlIHhtbERvYy5sb2FkIGluIGNocm9tZSBhdCB0aGUgbW9tZW50CgkJeG1sRG9jLmFzeW5jPWZhbHNlOwoJCXhtbERvYy5sb2FkKFRoaXNGaWxlKTsJCS8vIHdlIGNhbiB1c2UgIGxvYWR4bWwKCQlKU0dhbnR0LkFkZFhNTFRhc2socEdhbnR0VmFyKTsKCQl4bWxEb2M9bnVsbDsJCQkvLyBhIGxpdHRsZSB0aWR5aW5nCgkJVGFzayA9IG51bGw7Cgl9CgllbHNlIHsKCQlKU0dhbnR0LkNocm9tZUxvYWRYTUwoVGhpc0ZpbGUscEdhbnR0VmFyKTsJCgkJdGE9bnVsbDsJLy8gYSBsaXR0bGUgdGlkeWluZwkKCX0KfTsKCi8qKgoqIEFkZCBhIHRhc2sgYmFzZWQgb24gcGFyc2VkIFhNTCBkb2MKKgoqIEBtZXRob2QgQWRkWE1MVGFzawoqIEBwYXJhbSBwR2FudHRWYXIge0dhbnR0fSAtIEdhbnR0IG9iamVjdAoqIEByZXR1cm4ge3ZvaWR9CiovCkpTR2FudHQuQWRkWE1MVGFzayA9IGZ1bmN0aW9uKHBHYW50dFZhcil7CgoJVGFzaz14bWxEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRhc2siKTsKCQoJdmFyIG4gPSB4bWxEb2MuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOwkvLyB0aGUgbnVtYmVyIG9mIHRhc2tzLiBJRSBnZXRzIHRoaXMgcmlnaHQsIGJ1dCBtb3ppbGxhIGFkZCBleHRyYSBvbmVzIChXaGl0ZXNwYWNlKQoJCglmb3IodmFyIGk9MDtpPG47aSsrKSB7CgkKCQkvLyBvcHRpb25hbCBwYXJhbWV0ZXJzIG1heSBub3QgaGF2ZSBhbiBlbnRyeSAoV2hpdGVzcGFjZSBmcm9tIG1vemlsbGEgYWxzbyByZXR1cm5zIGFuIGVycm9yICkKCQkvLyBUYXNrIElEIG11c3QgTk9UIGJlIHplcm8gb3RoZXIgd2lzZSBpdCB3aWxsIGJlIHNraXBwZWQKCQl0cnkgeyBwSUQgPSBUYXNrW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwSUQiKVswXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsKCQl9IGNhdGNoIChlcnJvcikge3BJRCA9MDt9CgkJcElEICo9IDE7CS8vIG1ha2Ugc3VyZSB0aGF0IHRoZXNlIGFyZSBudW1iZXJzIHJhdGhlciB0aGFuIHN0cmluZ3MgaW4gb3JkZXIgdG8gbWFrZSBqc2dhbnR0LmpzIGJlaGF2ZSBhcyBleHBlY3RlZC4KCgkJaWYocElEIT0wKXsKCSAJCXRyeSB7IHBOYW1lID0gVGFza1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicE5hbWUiKVswXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsKCQkJfSBjYXRjaCAoZXJyb3IpIHtwTmFtZSA9Ik5vIFRhc2sgTmFtZSI7fQkJCS8vIElmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIFhNTCBmaWxlIHRoZSBzZXQgYSBkZWZhdWx0LgoJCQoJCQl0cnkgeyBwQ29sb3IgPSBUYXNrW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwQ29sb3IiKVswXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsKCQkJfSBjYXRjaCAoZXJyb3IpIHtwQ29sb3IgPSIwMDAwZmYiO30KCQkJCgkJCXRyeSB7IHBQYXJlbnQgPSBUYXNrW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwUGFyZW50IilbMF0uY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU7CgkJCX0gY2F0Y2ggKGVycm9yKSB7cFBhcmVudCA9MDt9CgkJCXBQYXJlbnQgKj0gMTsKCQoJCQl0cnkgeyBwU3RhcnQgPSBUYXNrW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwU3RhcnQiKVswXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsKCQkJfSBjYXRjaCAoZXJyb3IpIHtwU3RhcnQgPSIiO30KCgkJCXRyeSB7IHBFbmQgPSBUYXNrW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwRW5kIilbMF0uY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU7CgkJCX0gY2F0Y2ggKGVycm9yKSB7IHBFbmQgPSIiO30KCgkJCXRyeSB7IHBMaW5rID0gVGFza1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicExpbmsiKVswXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsKCQkJfSBjYXRjaCAoZXJyb3IpIHsgcExpbmsgPSIiO30KCQoJCQl0cnkgeyBwTWlsZSA9IFRhc2tbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBNaWxlIilbMF0uY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU7CgkJCX0gY2F0Y2ggKGVycm9yKSB7IHBNaWxlPTA7fQoJCQlwTWlsZSAqPSAxOwoKCQkJdHJ5IHsgcFJlcyA9IFRhc2tbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBSZXMiKVswXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsKCQkJfSBjYXRjaCAoZXJyb3IpIHsgcFJlcyA9IiI7fQoKCQkJdHJ5IHsgcENvbXAgPSBUYXNrW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwQ29tcCIpWzBdLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOwoJCQl9IGNhdGNoIChlcnJvcikge3BDb21wID0wO30KCQkJcENvbXAgKj0gMTsKCgkJCXRyeSB7IHBHcm91cCA9IFRhc2tbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBHcm91cCIpWzBdLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOwoJCQl9IGNhdGNoIChlcnJvcikge3BHcm91cCA9MDt9CgkJCXBHcm91cCAqPSAxOwoKCQkJdHJ5IHsgcE9wZW4gPSBUYXNrW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwT3BlbiIpWzBdLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOwoJCQl9IGNhdGNoIChlcnJvcikgeyBwT3BlbiA9MTt9CgkJCXBPcGVuICo9IDE7CgoJCQl0cnkgeyBwRGVwZW5kID0gVGFza1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicERlcGVuZCIpWzBdLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOwoJCQl9IGNhdGNoIChlcnJvcikgeyBwRGVwZW5kID0wO30KCQkJLy9wRGVwZW5kICo9IDE7CgkJCWlmIChwRGVwZW5kLmxlbmd0aD09MCl7cERlcGVuZD0nJ30gLy8gbmVlZCB0aGlzIHRvIGRyYXcgdGhlIGRlcGVuZGVuY3kgbGluZXMKCQkJCgkJCXRyeSB7IHBDYXB0aW9uID0gVGFza1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicENhcHRpb24iKVswXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsKCQkJfSBjYXRjaCAoZXJyb3IpIHsgcENhcHRpb24gPSIiO30KCQkJCgkJCQoJCQkvLyBGaW5hbGx5IGFkZCB0aGUgdGFzawoJCQlwR2FudHRWYXIuQWRkVGFza0l0ZW0obmV3IEpTR2FudHQuVGFza0l0ZW0ocElEICwgcE5hbWUsIHBTdGFydCwgcEVuZCwgcENvbG9yLCAgcExpbmssIHBNaWxlLCBwUmVzLCAgcENvbXAsIHBHcm91cCwgcFBhcmVudCwgcE9wZW4sIHBEZXBlbmQscENhcHRpb24pKTsKCQl9Cgl9Cn07CgovKioKKiBMb2FkIGFuIFhNTCBkb2N1bWVudCBpbiBDaHJvbWUKKgoqIEBtZXRob2QgQ2hyb21lTG9hZFhNTAoqIEBwYXJhbSBUaGlzRmlsZSB7U3RyaW5nfSAtIFVSTCB0byBYTUwgZmlsZQoqIEBwYXJhbSBwR2FudHRWYXIge0dhbnR0fSAtIEdhbnR0IG9iamVjdAoqIEByZXR1cm4ge3ZvaWR9CiovCkpTR2FudHQuQ2hyb21lTG9hZFhNTCA9IGZ1bmN0aW9uKFRoaXNGaWxlLHBHYW50dFZhcil7Ci8vIFRoYW5rcyB0byB2b2RvYmFzIGF0IG1pbmRsZW5jZSxjb20gZm9yIHRoZSBpbml0aWFsIHBvaW50ZXJzIGhlcmUuCglYTUxMb2FkZXIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCVhNTExvYWRlci5vbnJlYWR5c3RhdGVjaGFuZ2U9IGZ1bmN0aW9uKCl7CiAgICBKU0dhbnR0LkNocm9tZVhNTFBhcnNlKHBHYW50dFZhcik7Cgl9OwoJWE1MTG9hZGVyLm9wZW4oIkdFVCIsIFRoaXNGaWxlLCBmYWxzZSk7CglYTUxMb2FkZXIuc2VuZChudWxsKTsKfTsKCi8qKgoqIFBhcnNlIFhNTCBkb2N1bWVudCBpbiBDaHJvbWUKKgoqIEBtZXRob2QgQ2hyb21lWE1MUGFyc2UKKiBAcGFyYW0gcEdhbnR0VmFyIHtHYW50dH0gLSBHYW50dCBvYmplY3QKKiBAcmV0dXJuIHt2b2lkfQoqLwoKSlNHYW50dC5DaHJvbWVYTUxQYXJzZSA9IGZ1bmN0aW9uIChwR2FudHRWYXIpewovLyBNYW51YWxseSBwYXJzZSB0aGUgZmlsZSBhcyBpdCBpcyBsb2FkcyBxdWlja2VyCglpZiAoWE1MTG9hZGVyLnJlYWR5U3RhdGUgPT0gNCkgewoJCXZhciB0YT1YTUxMb2FkZXIucmVzcG9uc2VUZXh0LnNwbGl0KC88dGFzaz4vZ2kpOwoKCQl2YXIgbiA9IHRhLmxlbmd0aDsJLy8gdGhlIG51bWJlciBvZiB0YXNrcy4gCgkJZm9yKHZhciBpPTE7aTxuO2krKykgewoJCQlUYXNrID0gdGFbaV0ucmVwbGFjZSgvPFsvXXAvZywgJzxwJyk7CQoJCQl2YXIgdGUgPSBUYXNrLnNwbGl0KC88cGlkPi9pKTsKCQoJCQlpZih0ZS5sZW5ndGg+IDIpe3ZhciBwSUQ9dGVbMV07fSBlbHNlIHt2YXIgcElEID0gMDt9CgkJCXBJRCAqPSAxOwoJCgkJCXZhciB0ZSA9IFRhc2suc3BsaXQoLzxwTmFtZT4vaSk7CgkJCWlmKHRlLmxlbmd0aD4gMil7dmFyIHBOYW1lPXRlWzFdO30gZWxzZSB7dmFyIHBOYW1lID0gIk5vIFRhc2sgTmFtZSI7fQoJCgkJCXZhciB0ZSA9IFRhc2suc3BsaXQoLzxwc3RhcnQ+L2kpOwoJCQlpZih0ZS5sZW5ndGg+IDIpe3ZhciBwU3RhcnQ9dGVbMV07fSBlbHNlIHt2YXIgcFN0YXJ0ID0gIiI7fQoJCgkJCXZhciB0ZSA9IFRhc2suc3BsaXQoLzxwRW5kPi9pKTsKCQkJaWYodGUubGVuZ3RoPiAyKXt2YXIgcEVuZD10ZVsxXTt9IGVsc2Uge3ZhciBwRW5kID0gIiI7fQoJCgkJCXZhciB0ZSA9IFRhc2suc3BsaXQoLzxwQ29sb3I+L2kpOwoJCQlpZih0ZS5sZW5ndGg+IDIpe3ZhciBwQ29sb3I9dGVbMV07fSBlbHNlIHt2YXIgcENvbG9yID0gJzAwMDBmZic7fQoKCQkJdmFyIHRlID0gVGFzay5zcGxpdCgvPHBMaW5rPi9pKTsKCQkJaWYodGUubGVuZ3RoPiAyKXt2YXIgcExpbms9dGVbMV07fSBlbHNlIHt2YXIgcExpbmsgPSAiIjt9CgkKCQkJdmFyIHRlID0gVGFzay5zcGxpdCgvPHBNaWxlPi9pKTsKCQkJaWYodGUubGVuZ3RoPiAyKXt2YXIgcE1pbGU9dGVbMV07fSBlbHNlIHt2YXIgcE1pbGUgPSAwO30KCQkJcE1pbGUgICo9IDE7CgkKCQkJdmFyIHRlID0gVGFzay5zcGxpdCgvPHBSZXM+L2kpOwoJCQlpZih0ZS5sZW5ndGg+IDIpe3ZhciBwUmVzPXRlWzFdO30gZWxzZSB7dmFyIHBSZXMgPSAiIjt9CQoJCgkJCXZhciB0ZSA9IFRhc2suc3BsaXQoLzxwQ29tcD4vaSk7CgkJCWlmKHRlLmxlbmd0aD4gMil7dmFyIHBDb21wPXRlWzFdO30gZWxzZSB7dmFyIHBDb21wID0gMDt9CQoJCQlwQ29tcCAgKj0gMTsKCQoJCQl2YXIgdGUgPSBUYXNrLnNwbGl0KC88cEdyb3VwPi9pKTsKCQkJaWYodGUubGVuZ3RoPiAyKXt2YXIgcEdyb3VwPXRlWzFdO30gZWxzZSB7dmFyIHBHcm91cCA9IDA7fQkKCQkJcEdyb3VwICo9IDE7CgoJCQl2YXIgdGUgPSBUYXNrLnNwbGl0KC88cFBhcmVudD4vaSk7CgkJCWlmKHRlLmxlbmd0aD4gMil7dmFyIHBQYXJlbnQ9dGVbMV07fSBlbHNlIHt2YXIgcFBhcmVudCA9IDA7fQkKCQkJcFBhcmVudCAqPSAxOwoJCgkJCXZhciB0ZSA9IFRhc2suc3BsaXQoLzxwT3Blbj4vaSk7CgkJCWlmKHRlLmxlbmd0aD4gMil7dmFyIHBPcGVuPXRlWzFdO30gZWxzZSB7dmFyIHBPcGVuID0gMTt9CgkJCXBPcGVuICo9IDE7CgkKCQkJdmFyIHRlID0gVGFzay5zcGxpdCgvPHBEZXBlbmQ+L2kpOwoJCQlpZih0ZS5sZW5ndGg+IDIpe3ZhciBwRGVwZW5kPXRlWzFdO30gZWxzZSB7dmFyIHBEZXBlbmQgPSAiIjt9CQoJCQkvL3BEZXBlbmQgKj0gMTsKCQkJaWYgKHBEZXBlbmQubGVuZ3RoPT0wKXtwRGVwZW5kPScnfSAvLyBuZWVkIHRoaXMgdG8gZHJhdyB0aGUgZGVwZW5kZW5jeSBsaW5lcwoJCQkKCQkJdmFyIHRlID0gVGFzay5zcGxpdCgvPHBDYXB0aW9uPi9pKTsKCQkJaWYodGUubGVuZ3RoPiAyKXt2YXIgcENhcHRpb249dGVbMV07fSBlbHNlIHt2YXIgcENhcHRpb24gPSAiIjt9CgkJCQoJCQkvLyBGaW5hbGx5IGFkZCB0aGUgdGFzawoJCQlwR2FudHRWYXIuQWRkVGFza0l0ZW0obmV3IEpTR2FudHQuVGFza0l0ZW0ocElEICwgcE5hbWUsIHBTdGFydCwgcEVuZCwgcENvbG9yLCAgcExpbmssIHBNaWxlLCBwUmVzLCAgcENvbXAsIHBHcm91cCwgcFBhcmVudCwgcE9wZW4sIHBEZXBlbmQscENhcHRpb24gCSkpOwoJCX07Cgl9Owp9OwovKioKKiBVc2VkIGZvciBiZW5jaG1hcmtpbmcgcGVyZm9ybWFjZQoqCiogQG1ldGhvZCBiZW5jaE1hcmsKKiBAcGFyYW0gcEl0ZW0ge1Rhc2tJdGVtfSAtIFRhc2tJdGVtIG9iamVjdAoqIEByZXR1cm4ge3ZvaWR9CiovCkpTR2FudHQuYmVuY2hNYXJrID0gZnVuY3Rpb24ocEl0ZW0pewogICB2YXIgdkVuZFRpbWU9bmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgIGFsZXJ0KHBJdGVtICsgJzogRWxhcHNlZCB0aW1lOiAnKygodkVuZFRpbWUtdkJlbmNoVGltZSkvMTAwMCkrJyBzZWNvbmRzLicpOwogICB2QmVuY2hUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpOwp9OwoK