wp-login.php ยท UTF-8
Save encrypted
Delete
Paste the console unlock script to edit this file.
PD9waHAKLyoqCiAqIFdvcmRQcmVzcyBVc2VyIFBhZ2UKICoKICogSGFuZGxlcyBhdXRoZW50aWNhdGlvbiwgcmVnaXN0ZXJpbmcsIHJlc2V0dGluZyBwYXNzd29yZHMsIGZvcmdvdCBwYXNzd29yZCwKICogYW5kIG90aGVyIHVzZXIgaGFuZGxpbmcuCiAqCiAqIEBwYWNrYWdlIFdvcmRQcmVzcwogKi8KCi8qKiBNYWtlIHN1cmUgdGhhdCB0aGUgV29yZFByZXNzIGJvb3RzdHJhcCBoYXMgcnVuIGJlZm9yZSBjb250aW51aW5nLiAqLwpyZXF1aXJlIF9fRElSX18gLiAnL3dwLWxvYWQucGhwJzsKCi8vIFJlZGlyZWN0IHRvIEhUVFBTIGxvZ2luIGlmIGZvcmNlZCB0byB1c2UgU1NMLgppZiAoIGZvcmNlX3NzbF9hZG1pbigpICYmICEgaXNfc3NsKCkgKSB7CglpZiAoIHN0cl9zdGFydHNfd2l0aCggJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sICdodHRwJyApICkgewoJCXdwX3NhZmVfcmVkaXJlY3QoIHNldF91cmxfc2NoZW1lKCAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSwgJ2h0dHBzJyApICk7CgkJZXhpdDsKCX0gZWxzZSB7CgkJd3Bfc2FmZV9yZWRpcmVjdCggJ2h0dHBzOi8vJyAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICRfU0VSVkVSWydSRVFVRVNUX1VSSSddICk7CgkJZXhpdDsKCX0KfQoKLyoqCiAqIE91dHB1dHMgdGhlIGxvZ2luIHBhZ2UgaGVhZGVyLgogKgogKiBAc2luY2UgMi4xLjAKICoKICogQGdsb2JhbCBzdHJpbmcgICAgICAkZXJyb3IgICAgICAgICBMb2dpbiBlcnJvciBtZXNzYWdlIHNldCBieSBkZXByZWNhdGVkIHBsdWdnYWJsZSB3cF9sb2dpbigpIGZ1bmN0aW9uCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcGx1Z2lucyByZXBsYWNpbmcgaXQuCiAqIEBnbG9iYWwgYm9vbHxzdHJpbmcgJGludGVyaW1fbG9naW4gV2hldGhlciBpbnRlcmltIGxvZ2luIG1vZGFsIGlzIGJlaW5nIGRpc3BsYXllZC4gU3RyaW5nICdzdWNjZXNzJwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwb24gc3VjY2Vzc2Z1bCBsb2dpbi4KICogQGdsb2JhbCBzdHJpbmcgICAgICAkYWN0aW9uICAgICAgICBUaGUgYWN0aW9uIHRoYXQgYnJvdWdodCB0aGUgdmlzaXRvciB0byB0aGUgbG9naW4gcGFnZS4KICoKICogQHBhcmFtIHN0cmluZ3xudWxsICAgJHRpdGxlICAgIE9wdGlvbmFsLiBXb3JkUHJlc3MgbG9naW4gcGFnZSB0aXRsZSB0byBkaXNwbGF5IGluIHRoZSBgPHRpdGxlPmAgZWxlbWVudC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvICdMb2cgSW4nLgogKiBAcGFyYW0gc3RyaW5nICAgICAgICAkbWVzc2FnZSAgT3B0aW9uYWwuIE1lc3NhZ2UgdG8gZGlzcGxheSBpbiBoZWFkZXIuIERlZmF1bHQgZW1wdHkuCiAqIEBwYXJhbSBXUF9FcnJvcnxudWxsICR3cF9lcnJvciBPcHRpb25hbC4gVGhlIGVycm9yIHRvIHBhc3MuIERlZmF1bHRzIHRvIGEgV1BfRXJyb3IgaW5zdGFuY2UuCiAqLwpmdW5jdGlvbiBsb2dpbl9oZWFkZXIoICR0aXRsZSA9IG51bGwsICRtZXNzYWdlID0gJycsICR3cF9lcnJvciA9IG51bGwgKSB7CglnbG9iYWwgJGVycm9yLCAkaW50ZXJpbV9sb2dpbiwgJGFjdGlvbjsKCglpZiAoIG51bGwgPT09ICR0aXRsZSApIHsKCQkkdGl0bGUgPSBfXyggJ0xvZyBJbicgKTsKCX0KCgkvLyBEb24ndCBpbmRleCBhbnkgb2YgdGhlc2UgZm9ybXMuCglhZGRfZmlsdGVyKCAnd3Bfcm9ib3RzJywgJ3dwX3JvYm90c19zZW5zaXRpdmVfcGFnZScgKTsKCWFkZF9hY3Rpb24oICdsb2dpbl9oZWFkJywgJ3dwX3N0cmljdF9jcm9zc19vcmlnaW5fcmVmZXJyZXInICk7CgoJYWRkX2FjdGlvbiggJ2xvZ2luX2hlYWQnLCAnd3BfbG9naW5fdmlld3BvcnRfbWV0YScgKTsKCglpZiAoICEgaXNfd3BfZXJyb3IoICR3cF9lcnJvciApICkgewoJCSR3cF9lcnJvciA9IG5ldyBXUF9FcnJvcigpOwoJfQoKCS8vIFNoYWtlIGl0IQoJJHNoYWtlX2Vycm9yX2NvZGVzID0gYXJyYXkoICdlbXB0eV9wYXNzd29yZCcsICdlbXB0eV9lbWFpbCcsICdpbnZhbGlkX2VtYWlsJywgJ2ludmFsaWRjb21ibycsICdlbXB0eV91c2VybmFtZScsICdpbnZhbGlkX3VzZXJuYW1lJywgJ2luY29ycmVjdF9wYXNzd29yZCcsICdyZXRyaWV2ZV9wYXNzd29yZF9lbWFpbF9mYWlsdXJlJyApOwoJLyoqCgkgKiBGaWx0ZXJzIHRoZSBlcnJvciBjb2RlcyBhcnJheSBmb3Igc2hha2luZyB0aGUgbG9naW4gZm9ybS4KCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nW10gJHNoYWtlX2Vycm9yX2NvZGVzIEVycm9yIGNvZGVzIHRoYXQgc2hha2UgdGhlIGxvZ2luIGZvcm0uCgkgKi8KCSRzaGFrZV9lcnJvcl9jb2RlcyA9IGFwcGx5X2ZpbHRlcnMoICdzaGFrZV9lcnJvcl9jb2RlcycsICRzaGFrZV9lcnJvcl9jb2RlcyApOwoKCWlmICggJHNoYWtlX2Vycm9yX2NvZGVzICYmICR3cF9lcnJvci0+aGFzX2Vycm9ycygpICYmIGluX2FycmF5KCAkd3BfZXJyb3ItPmdldF9lcnJvcl9jb2RlKCksICRzaGFrZV9lcnJvcl9jb2RlcywgdHJ1ZSApICkgewoJCWFkZF9hY3Rpb24oICdsb2dpbl9mb290ZXInLCAnd3Bfc2hha2VfanMnLCAxMiApOwoJfQoKCSRsb2dpbl90aXRsZSA9IGdldF9ibG9naW5mbyggJ25hbWUnLCAnZGlzcGxheScgKTsKCgkvKiB0cmFuc2xhdG9yczogTG9naW4gc2NyZWVuIHRpdGxlLiAxOiBMb2dpbiBzY3JlZW4gbmFtZSwgMjogTmV0d29yayBvciBzaXRlIG5hbWUuICovCgkkbG9naW5fdGl0bGUgPSBzcHJpbnRmKCBfXyggJyUxJHMgJmxzYXF1bzsgJTIkcyAmIzgyMTI7IFdvcmRQcmVzcycgKSwgJHRpdGxlLCAkbG9naW5fdGl0bGUgKTsKCglpZiAoIHdwX2lzX3JlY292ZXJ5X21vZGUoKSApIHsKCQkvKiB0cmFuc2xhdG9yczogJXM6IExvZ2luIHNjcmVlbiB0aXRsZS4gKi8KCQkkbG9naW5fdGl0bGUgPSBzcHJpbnRmKCBfXyggJ1JlY292ZXJ5IE1vZGUgJiM4MjEyOyAlcycgKSwgJGxvZ2luX3RpdGxlICk7Cgl9CgoJLyoqCgkgKiBGaWx0ZXJzIHRoZSB0aXRsZSB0YWcgY29udGVudCBmb3IgbG9naW4gcGFnZS4KCSAqCgkgKiBAc2luY2UgNC45LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRsb2dpbl90aXRsZSBUaGUgcGFnZSB0aXRsZSwgd2l0aCBleHRyYSBjb250ZXh0IGFkZGVkLgoJICogQHBhcmFtIHN0cmluZyAkdGl0bGUgICAgICAgVGhlIG9yaWdpbmFsIHBhZ2UgdGl0bGUuCgkgKi8KCSRsb2dpbl90aXRsZSA9IGFwcGx5X2ZpbHRlcnMoICdsb2dpbl90aXRsZScsICRsb2dpbl90aXRsZSwgJHRpdGxlICk7CgoJPz48IURPQ1RZUEUgaHRtbD4KCTxodG1sIDw/cGhwIGxhbmd1YWdlX2F0dHJpYnV0ZXMoKTsgPz4+Cgk8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iPD9waHAgYmxvZ2luZm8oICdodG1sX3R5cGUnICk7ID8+OyBjaGFyc2V0PTw/cGhwIGJsb2dpbmZvKCAnY2hhcnNldCcgKTsgPz4iIC8+Cgk8dGl0bGU+PD9waHAgZWNobyAkbG9naW5fdGl0bGU7ID8+PC90aXRsZT4KCTw/cGhwCgoJd3BfZW5xdWV1ZV9zdHlsZSggJ2xvZ2luJyApOwoKCS8qCgkgKiBSZW1vdmUgYWxsIHN0b3JlZCBwb3N0IGRhdGEgb24gbG9nZ2luZyBvdXQuCgkgKiBUaGlzIGNvdWxkIGJlIGFkZGVkIGJ5IGFkZF9hY3Rpb24oJ2xvZ2luX2hlYWQnLi4uKSBsaWtlIHdwX3NoYWtlX2pzKCksCgkgKiBidXQgbWF5YmUgYmV0dGVyIGlmIGl0J3Mgbm90IHJlbW92YWJsZSBieSBwbHVnaW5zLgoJICovCglpZiAoICdsb2dnZWRvdXQnID09PSAkd3BfZXJyb3ItPmdldF9lcnJvcl9jb2RlKCkgKSB7CgkJb2Jfc3RhcnQoKTsKCQk/PgoJCTxzY3JpcHQ+aWYoInNlc3Npb25TdG9yYWdlIiBpbiB3aW5kb3cpe3RyeXtmb3IodmFyIGtleSBpbiBzZXNzaW9uU3RvcmFnZSl7aWYoa2V5LmluZGV4T2YoIndwLWF1dG9zYXZlLSIpIT0tMSl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpfX19Y2F0Y2goZSl7fX07PC9zY3JpcHQ+CgkJPD9waHAKCQl3cF9wcmludF9pbmxpbmVfc2NyaXB0X3RhZyggd3BfcmVtb3ZlX3N1cnJvdW5kaW5nX2VtcHR5X3NjcmlwdF90YWdzKCBvYl9nZXRfY2xlYW4oKSApICk7Cgl9CgoJLyoqCgkgKiBFbnF1ZXVlcyBzY3JpcHRzIGFuZCBzdHlsZXMgZm9yIHRoZSBsb2dpbiBwYWdlLgoJICoKCSAqIEBzaW5jZSAzLjEuMAoJICovCglkb19hY3Rpb24oICdsb2dpbl9lbnF1ZXVlX3NjcmlwdHMnICk7CgoJLyoqCgkgKiBGaXJlcyBpbiB0aGUgbG9naW4gcGFnZSBoZWFkZXIgYWZ0ZXIgc2NyaXB0cyBhcmUgZW5xdWV1ZWQuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKi8KCWRvX2FjdGlvbiggJ2xvZ2luX2hlYWQnICk7CgoJJGxvZ2luX2hlYWRlcl91cmwgPSBfXyggJ2h0dHBzOi8vd29yZHByZXNzLm9yZy8nICk7CgoJLyoqCgkgKiBGaWx0ZXJzIGxpbmsgVVJMIG9mIHRoZSBoZWFkZXIgbG9nbyBhYm92ZSBsb2dpbiBmb3JtLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGxvZ2luX2hlYWRlcl91cmwgTG9naW4gaGVhZGVyIGxvZ28gVVJMLgoJICovCgkkbG9naW5faGVhZGVyX3VybCA9IGFwcGx5X2ZpbHRlcnMoICdsb2dpbl9oZWFkZXJ1cmwnLCAkbG9naW5faGVhZGVyX3VybCApOwoKCSRsb2dpbl9oZWFkZXJfdGl0bGUgPSAnJzsKCgkvKioKCSAqIEZpbHRlcnMgdGhlIHRpdGxlIGF0dHJpYnV0ZSBvZiB0aGUgaGVhZGVyIGxvZ28gYWJvdmUgbG9naW4gZm9ybS4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqIEBkZXByZWNhdGVkIDUuMi4wIFVzZSB7QHNlZSAnbG9naW5faGVhZGVydGV4dCd9IGluc3RlYWQuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbG9naW5faGVhZGVyX3RpdGxlIExvZ2luIGhlYWRlciBsb2dvIHRpdGxlIGF0dHJpYnV0ZS4KCSAqLwoJJGxvZ2luX2hlYWRlcl90aXRsZSA9IGFwcGx5X2ZpbHRlcnNfZGVwcmVjYXRlZCgKCQknbG9naW5faGVhZGVydGl0bGUnLAoJCWFycmF5KCAkbG9naW5faGVhZGVyX3RpdGxlICksCgkJJzUuMi4wJywKCQknbG9naW5faGVhZGVydGV4dCcsCgkJX18oICdVc2FnZSBvZiB0aGUgdGl0bGUgYXR0cmlidXRlIG9uIHRoZSBsb2dpbiBsb2dvIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgYWNjZXNzaWJpbGl0eSByZWFzb25zLiBVc2UgdGhlIGxpbmsgdGV4dCBpbnN0ZWFkLicgKQoJKTsKCgkkbG9naW5faGVhZGVyX3RleHQgPSBlbXB0eSggJGxvZ2luX2hlYWRlcl90aXRsZSApID8gX18oICdQb3dlcmVkIGJ5IFdvcmRQcmVzcycgKSA6ICRsb2dpbl9oZWFkZXJfdGl0bGU7CgoJLyoqCgkgKiBGaWx0ZXJzIHRoZSBsaW5rIHRleHQgb2YgdGhlIGhlYWRlciBsb2dvIGFib3ZlIHRoZSBsb2dpbiBmb3JtLgoJICoKCSAqIEBzaW5jZSA1LjIuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGxvZ2luX2hlYWRlcl90ZXh0IFRoZSBsb2dpbiBoZWFkZXIgbG9nbyBsaW5rIHRleHQuCgkgKi8KCSRsb2dpbl9oZWFkZXJfdGV4dCA9IGFwcGx5X2ZpbHRlcnMoICdsb2dpbl9oZWFkZXJ0ZXh0JywgJGxvZ2luX2hlYWRlcl90ZXh0ICk7CgoJJGNsYXNzZXMgPSBhcnJheSggJ2xvZ2luLWFjdGlvbi0nIC4gJGFjdGlvbiwgJ3dwLWNvcmUtdWknLCAnYWRtaW4tY29sb3ItbW9kZXJuJyApOwoKCWlmICggaXNfcnRsKCkgKSB7CgkJJGNsYXNzZXNbXSA9ICdydGwnOwoJfQoKCWlmICggJGludGVyaW1fbG9naW4gKSB7CgkJJGNsYXNzZXNbXSA9ICdpbnRlcmltLWxvZ2luJzsKCgkJPz4KCQk8c3R5bGU+aHRtbHtiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDt9PC9zdHlsZT4KCQk8P3BocAoKCQlpZiAoICdzdWNjZXNzJyA9PT0gJGludGVyaW1fbG9naW4gKSB7CgkJCSRjbGFzc2VzW10gPSAnaW50ZXJpbS1sb2dpbi1zdWNjZXNzJzsKCQl9Cgl9CgoJJGNsYXNzZXNbXSA9ICdsb2NhbGUtJyAuIHNhbml0aXplX2h0bWxfY2xhc3MoIHN0cnRvbG93ZXIoIHN0cl9yZXBsYWNlKCAnXycsICctJywgZ2V0X2xvY2FsZSgpICkgKSApOwoKCS8qKgoJICogRmlsdGVycyB0aGUgbG9naW4gcGFnZSBib2R5IGNsYXNzZXMuCgkgKgoJICogQHNpbmNlIDMuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZ1tdICRjbGFzc2VzIEFuIGFycmF5IG9mIGJvZHkgY2xhc3Nlcy4KCSAqIEBwYXJhbSBzdHJpbmcgICAkYWN0aW9uICBUaGUgYWN0aW9uIHRoYXQgYnJvdWdodCB0aGUgdmlzaXRvciB0byB0aGUgbG9naW4gcGFnZS4KCSAqLwoJJGNsYXNzZXMgPSBhcHBseV9maWx0ZXJzKCAnbG9naW5fYm9keV9jbGFzcycsICRjbGFzc2VzLCAkYWN0aW9uICk7CgoJPz4KCTwvaGVhZD4KCTxib2R5IGNsYXNzPSJsb2dpbiBuby1qcyA8P3BocCBlY2hvIGVzY19hdHRyKCBpbXBsb2RlKCAnICcsICRjbGFzc2VzICkgKTsgPz4iPgoJPD9waHAKCXdwX3ByaW50X2lubGluZV9zY3JpcHRfdGFnKCAiZG9jdW1lbnQuYm9keS5jbGFzc05hbWUgPSBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZS5yZXBsYWNlKCduby1qcycsJ2pzJyk7IiApOwoJPz4KCgk8P3BocAoJLyoqCgkgKiBGaXJlcyBpbiB0aGUgbG9naW4gcGFnZSBoZWFkZXIgYWZ0ZXIgdGhlIGJvZHkgdGFnIGlzIG9wZW5lZC4KCSAqCgkgKiBAc2luY2UgNC42LjAKCSAqLwoJZG9fYWN0aW9uKCAnbG9naW5faGVhZGVyJyApOwoJPz4KCTw/cGhwCglpZiAoICdjb25maXJtX2FkbWluX2VtYWlsJyAhPT0gJGFjdGlvbiAmJiAhIGVtcHR5KCAkdGl0bGUgKSApIDoKCQk/PgoJCTxoMSBjbGFzcz0ic2NyZWVuLXJlYWRlci10ZXh0Ij48P3BocCBlY2hvICR0aXRsZTsgPz48L2gxPgoJCTw/cGhwCgllbmRpZjsKCT8+Cgk8ZGl2IGlkPSJsb2dpbiI+CgkJPGgxIHJvbGU9InByZXNlbnRhdGlvbiIgY2xhc3M9IndwLWxvZ2luLWxvZ28iPjxhIGhyZWY9Ijw/cGhwIGVjaG8gZXNjX3VybCggJGxvZ2luX2hlYWRlcl91cmwgKTsgPz4iPjw/cGhwIGVjaG8gJGxvZ2luX2hlYWRlcl90ZXh0OyA/PjwvYT48L2gxPgoJPD9waHAKCS8qKgoJICogRmlsdGVycyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5IGFib3ZlIHRoZSBsb2dpbiBmb3JtLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgTG9naW4gbWVzc2FnZSB0ZXh0LgoJICovCgkkbWVzc2FnZSA9IGFwcGx5X2ZpbHRlcnMoICdsb2dpbl9tZXNzYWdlJywgJG1lc3NhZ2UgKTsKCglpZiAoICEgZW1wdHkoICRtZXNzYWdlICkgKSB7CgkJZWNobyAkbWVzc2FnZSAuICJcbiI7Cgl9CgoJLy8gSW4gY2FzZSBhIHBsdWdpbiB1c2VzICRlcnJvciByYXRoZXIgdGhhbiB0aGUgJHdwX2Vycm9ycyBvYmplY3QuCglpZiAoICEgZW1wdHkoICRlcnJvciApICkgewoJCSR3cF9lcnJvci0+YWRkKCAnZXJyb3InLCAkZXJyb3IgKTsKCQl1bnNldCggJGVycm9yICk7Cgl9CgoJaWYgKCAkd3BfZXJyb3ItPmhhc19lcnJvcnMoKSApIHsKCQkkZXJyb3JfbGlzdCA9IGFycmF5KCk7CgkJJG1lc3NhZ2VzICAgPSAnJzsKCgkJZm9yZWFjaCAoICR3cF9lcnJvci0+Z2V0X2Vycm9yX2NvZGVzKCkgYXMgJGNvZGUgKSB7CgkJCSRzZXZlcml0eSA9ICR3cF9lcnJvci0+Z2V0X2Vycm9yX2RhdGEoICRjb2RlICk7CgkJCWZvcmVhY2ggKCAkd3BfZXJyb3ItPmdldF9lcnJvcl9tZXNzYWdlcyggJGNvZGUgKSBhcyAkZXJyb3JfbWVzc2FnZSApIHsKCQkJCWlmICggJ21lc3NhZ2UnID09PSAkc2V2ZXJpdHkgKSB7CgkJCQkJJG1lc3NhZ2VzIC49ICc8cD4nIC4gJGVycm9yX21lc3NhZ2UgLiAnPC9wPic7CgkJCQl9IGVsc2UgewoJCQkJCSRlcnJvcl9saXN0W10gPSAkZXJyb3JfbWVzc2FnZTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCAhIGVtcHR5KCAkZXJyb3JfbGlzdCApICkgewoJCQkkZXJyb3JzID0gJyc7CgoJCQlpZiAoIGNvdW50KCAkZXJyb3JfbGlzdCApID4gMSApIHsKCQkJCSRlcnJvcnMgLj0gJzx1bCBjbGFzcz0ibG9naW4tZXJyb3ItbGlzdCI+JzsKCgkJCQlmb3JlYWNoICggJGVycm9yX2xpc3QgYXMgJGl0ZW0gKSB7CgkJCQkJJGVycm9ycyAuPSAnPGxpPicgLiAkaXRlbSAuICc8L2xpPic7CgkJCQl9CgoJCQkJJGVycm9ycyAuPSAnPC91bD4nOwoJCQl9IGVsc2UgewoJCQkJJGVycm9ycyAuPSAnPHA+JyAuICRlcnJvcl9saXN0WzBdIC4gJzwvcD4nOwoJCQl9CgoJCQkvKioKCQkJICogRmlsdGVycyB0aGUgZXJyb3IgbWVzc2FnZXMgZGlzcGxheWVkIGFib3ZlIHRoZSBsb2dpbiBmb3JtLgoJCQkgKgoJCQkgKiBAc2luY2UgMi4xLjAKCQkJICoKCQkJICogQHBhcmFtIHN0cmluZyAkZXJyb3JzIExvZ2luIGVycm9yIG1lc3NhZ2VzLgoJCQkgKi8KCQkJJGVycm9ycyA9IGFwcGx5X2ZpbHRlcnMoICdsb2dpbl9lcnJvcnMnLCAkZXJyb3JzICk7CgoJCQl3cF9hZG1pbl9ub3RpY2UoCgkJCQkkZXJyb3JzLAoJCQkJYXJyYXkoCgkJCQkJJ3R5cGUnICAgICAgICAgICA9PiAnZXJyb3InLAoJCQkJCSdpZCcgICAgICAgICAgICAgPT4gJ2xvZ2luX2Vycm9yJywKCQkJCQkncGFyYWdyYXBoX3dyYXAnID0+IGZhbHNlLAoJCQkJKQoJCQkpOwoJCX0KCgkJaWYgKCAhIGVtcHR5KCAkbWVzc2FnZXMgKSApIHsKCQkJLyoqCgkJCSAqIEZpbHRlcnMgaW5zdHJ1Y3Rpb25hbCBtZXNzYWdlcyBkaXNwbGF5ZWQgYWJvdmUgdGhlIGxvZ2luIGZvcm0uCgkJCSAqCgkJCSAqIEBzaW5jZSAyLjUuMAoJCQkgKgoJCQkgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlcyBMb2dpbiBtZXNzYWdlcy4KCQkJICovCgkJCSRtZXNzYWdlcyA9IGFwcGx5X2ZpbHRlcnMoICdsb2dpbl9tZXNzYWdlcycsICRtZXNzYWdlcyApOwoKCQkJd3BfYWRtaW5fbm90aWNlKAoJCQkJJG1lc3NhZ2VzLAoJCQkJYXJyYXkoCgkJCQkJJ3R5cGUnICAgICAgICAgICAgICAgPT4gJ2luZm8nLAoJCQkJCSdpZCcgICAgICAgICAgICAgICAgID0+ICdsb2dpbi1tZXNzYWdlJywKCQkJCQknYWRkaXRpb25hbF9jbGFzc2VzJyA9PiBhcnJheSggJ21lc3NhZ2UnICksCgkJCQkJJ3BhcmFncmFwaF93cmFwJyAgICAgPT4gZmFsc2UsCgkJCQkpCgkJCSk7CgkJfQoJfQp9IC8vIEVuZCBvZiBsb2dpbl9oZWFkZXIoKS4KCi8qKgogKiBPdXRwdXRzIHRoZSBmb290ZXIgZm9yIHRoZSBsb2dpbiBwYWdlLgogKgogKiBAc2luY2UgMy4xLjAKICoKICogQGdsb2JhbCBib29sfHN0cmluZyAkaW50ZXJpbV9sb2dpbiBXaGV0aGVyIGludGVyaW0gbG9naW4gbW9kYWwgaXMgYmVpbmcgZGlzcGxheWVkLiBTdHJpbmcgJ3N1Y2Nlc3MnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBvbiBzdWNjZXNzZnVsIGxvZ2luLgogKgogKiBAcGFyYW0gc3RyaW5nICRpbnB1dF9pZCBXaGljaCBpbnB1dCB0byBhdXRvLWZvY3VzLgogKi8KZnVuY3Rpb24gbG9naW5fZm9vdGVyKCAkaW5wdXRfaWQgPSAnJyApIHsKCWdsb2JhbCAkaW50ZXJpbV9sb2dpbjsKCgkvLyBEb24ndCBhbGxvdyBpbnRlcmltIGxvZ2lucyB0byBuYXZpZ2F0ZSBhd2F5IGZyb20gdGhlIHBhZ2UuCglpZiAoICEgJGludGVyaW1fbG9naW4gKSB7CgkJPz4KCQk8cCBpZD0iYmFja3RvYmxvZyI+CgkJCTw/cGhwCgkJCSRodG1sX2xpbmsgPSBzcHJpbnRmKAoJCQkJJzxhIGhyZWY9IiVzIj4lczwvYT4nLAoJCQkJZXNjX3VybCggaG9tZV91cmwoICcvJyApICksCgkJCQlzcHJpbnRmKAoJCQkJCS8qIHRyYW5zbGF0b3JzOiAlczogU2l0ZSB0aXRsZS4gKi8KCQkJCQlfeCggJyZsYXJyOyBHbyB0byAlcycsICdzaXRlJyApLAoJCQkJCWdldF9ibG9naW5mbyggJ3RpdGxlJywgJ2Rpc3BsYXknICkKCQkJCSkKCQkJKTsKCQkJLyoqCgkJCSAqIEZpbHRlcnMgdGhlICJHbyB0byBzaXRlIiBsaW5rIGRpc3BsYXllZCBpbiB0aGUgbG9naW4gcGFnZSBmb290ZXIuCgkJCSAqCgkJCSAqIEBzaW5jZSA1LjcuMAoJCQkgKgoJCQkgKiBAcGFyYW0gc3RyaW5nICRsaW5rIEhUTUwgbGluayB0byB0aGUgaG9tZSBVUkwgb2YgdGhlIGN1cnJlbnQgc2l0ZS4KCQkJICovCgkJCWVjaG8gYXBwbHlfZmlsdGVycyggJ2xvZ2luX3NpdGVfaHRtbF9saW5rJywgJGh0bWxfbGluayApOwoJCQk/PgoJCTwvcD4KCQk8P3BocAoKCQl0aGVfcHJpdmFjeV9wb2xpY3lfbGluayggJzxkaXYgY2xhc3M9InByaXZhY3ktcG9saWN5LXBhZ2UtbGluayI+JywgJzwvZGl2PicgKTsKCX0KCgk/PgoJPC9kaXY+PD9waHAgLy8gRW5kIG9mIDxkaXYgaWQ9ImxvZ2luIj4uID8+CgoJPD9waHAKCWlmICgKCQkhICRpbnRlcmltX2xvZ2luICYmCgkJLyoqCgkJICogRmlsdGVycyB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIExhbmd1YWdlIHNlbGVjdG9yIG9uIHRoZSBsb2dpbiBzY3JlZW4uCgkJICoKCQkgKiBAc2luY2UgNS45LjAKCQkgKgoJCSAqIEBwYXJhbSBib29sICRkaXNwbGF5IFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgTGFuZ3VhZ2Ugc2VsZWN0b3Igb24gdGhlIGxvZ2luIHNjcmVlbi4KCQkgKi8KCQlhcHBseV9maWx0ZXJzKCAnbG9naW5fZGlzcGxheV9sYW5ndWFnZV9kcm9wZG93bicsIHRydWUgKQoJKSB7CgkJJGxhbmd1YWdlcyA9IGdldF9hdmFpbGFibGVfbGFuZ3VhZ2VzKCk7CgoJCWlmICggISBlbXB0eSggJGxhbmd1YWdlcyApICkgewoJCQk/PgoJCQk8ZGl2IGNsYXNzPSJsYW5ndWFnZS1zd2l0Y2hlciI+CgkJCQk8Zm9ybSBpZD0ibGFuZ3VhZ2Utc3dpdGNoZXIiIG1ldGhvZD0iZ2V0Ij4KCgkJCQkJPGxhYmVsIGZvcj0ibGFuZ3VhZ2Utc3dpdGNoZXItbG9jYWxlcyI+CgkJCQkJCTw/cGhwIF9lKCAnTGFuZ3VhZ2UnICk7ID8+PHNwYW4gY2xhc3M9ImRhc2hpY29ucyBkYXNoaWNvbnMtdHJhbnNsYXRpb24iIGFyaWEtaGlkZGVuPSJ0cnVlIj48L3NwYW4+CgkJCQkJPC9sYWJlbD4KCgkJCQkJPD9waHAKCQkJCQkkYXJncyA9IGFycmF5KAoJCQkJCQknaWQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbGFuZ3VhZ2Utc3dpdGNoZXItbG9jYWxlcycsCgkJCQkJCSduYW1lJyAgICAgICAgICAgICAgICAgICAgICAgID0+ICd3cF9sYW5nJywKCQkJCQkJJ3NlbGVjdGVkJyAgICAgICAgICAgICAgICAgICAgPT4gZGV0ZXJtaW5lX2xvY2FsZSgpLAoJCQkJCQknc2hvd19hdmFpbGFibGVfdHJhbnNsYXRpb25zJyA9PiBmYWxzZSwKCQkJCQkJJ2V4cGxpY2l0X29wdGlvbl9lbl91cycgICAgICAgPT4gdHJ1ZSwKCQkJCQkJJ2xhbmd1YWdlcycgICAgICAgICAgICAgICAgICAgPT4gJGxhbmd1YWdlcywKCQkJCQkpOwoKCQkJCQkvKioKCQkJCQkgKiBGaWx0ZXJzIGRlZmF1bHQgYXJndW1lbnRzIGZvciB0aGUgTGFuZ3VhZ2Ugc2VsZWN0IGlucHV0IG9uIHRoZSBsb2dpbiBzY3JlZW4uCgkJCQkJICoKCQkJCQkgKiBUaGUgYXJndW1lbnRzIGdldCBwYXNzZWQgdG8gdGhlIHdwX2Ryb3Bkb3duX2xhbmd1YWdlcygpIGZ1bmN0aW9uLgoJCQkJCSAqCgkJCQkJICogQHNpbmNlIDUuOS4wCgkJCQkJICoKCQkJCQkgKiBAcGFyYW0gYXJyYXkgJGFyZ3MgQXJndW1lbnRzIGZvciB0aGUgTGFuZ3VhZ2Ugc2VsZWN0IGlucHV0IG9uIHRoZSBsb2dpbiBzY3JlZW4uCgkJCQkJICovCgkJCQkJd3BfZHJvcGRvd25fbGFuZ3VhZ2VzKCBhcHBseV9maWx0ZXJzKCAnbG9naW5fbGFuZ3VhZ2VfZHJvcGRvd25fYXJncycsICRhcmdzICkgKTsKCQkJCQk/PgoKCQkJCQk8P3BocCBpZiAoICRpbnRlcmltX2xvZ2luICkgeyA/PgoJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpbnRlcmltLWxvZ2luIiB2YWx1ZT0iMSIgLz4KCQkJCQk8P3BocCB9ID8+CgoJCQkJCTw/cGhwIGlmICggaXNzZXQoICRfR0VUWydyZWRpcmVjdF90byddICkgJiYgJycgIT09ICRfR0VUWydyZWRpcmVjdF90byddICkgeyA/PgoJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZWRpcmVjdF90byIgdmFsdWU9Ijw/cGhwIGVjaG8gc2FuaXRpemVfdXJsKCAkX0dFVFsncmVkaXJlY3RfdG8nXSApOyA/PiIgLz4KCQkJCQk8P3BocCB9ID8+CgoJCQkJCTw/cGhwIGlmICggaXNzZXQoICRfR0VUWydhY3Rpb24nXSApICYmICcnICE9PSAkX0dFVFsnYWN0aW9uJ10gKSB7ID8+CgkJCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9Ijw/cGhwIGVjaG8gZXNjX2F0dHIoICRfR0VUWydhY3Rpb24nXSApOyA/PiIgLz4KCQkJCQk8P3BocCB9ID8+CgoJCQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnV0dG9uIiB2YWx1ZT0iPD9waHAgZXNjX2F0dHJfZSggJ0NoYW5nZScgKTsgPz4iPgoKCQkJCQk8L2Zvcm0+CgkJCQk8L2Rpdj4KCQk8P3BocCB9ID8+Cgk8P3BocCB9ID8+CgoJPD9waHAKCglpZiAoICEgZW1wdHkoICRpbnB1dF9pZCApICkgewoJCW9iX3N0YXJ0KCk7CgkJPz4KCQk8c2NyaXB0PgoJCXRyeXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnPD9waHAgZWNobyAkaW5wdXRfaWQ7ID8+JykuZm9jdXMoKTt9Y2F0Y2goZSl7fQoJCWlmKHR5cGVvZiB3cE9ubG9hZD09PSdmdW5jdGlvbicpd3BPbmxvYWQoKTsKCQk8L3NjcmlwdD4KCQk8P3BocAoJCXdwX3ByaW50X2lubGluZV9zY3JpcHRfdGFnKCB3cF9yZW1vdmVfc3Vycm91bmRpbmdfZW1wdHlfc2NyaXB0X3RhZ3MoIG9iX2dldF9jbGVhbigpICkgKTsKCX0KCgkvKioKCSAqIEZpcmVzIGluIHRoZSBsb2dpbiBwYWdlIGZvb3Rlci4KCSAqCgkgKiBAc2luY2UgMy4xLjAKCSAqLwoJZG9fYWN0aW9uKCAnbG9naW5fZm9vdGVyJyApOwoKCT8+Cgk8L2JvZHk+Cgk8L2h0bWw+Cgk8P3BocAp9CgovKioKICogT3V0cHV0cyB0aGUgSmF2YVNjcmlwdCB0byBoYW5kbGUgdGhlIGZvcm0gc2hha2luZyBvbiB0aGUgbG9naW4gcGFnZS4KICoKICogQHNpbmNlIDMuMC4wCiAqLwpmdW5jdGlvbiB3cF9zaGFrZV9qcygpIHsKCXdwX3ByaW50X2lubGluZV9zY3JpcHRfdGFnKCAiZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybScpLmNsYXNzTGlzdC5hZGQoJ3NoYWtlJyk7IiApOwp9CgovKioKICogT3V0cHV0cyB0aGUgdmlld3BvcnQgbWV0YSB0YWcgZm9yIHRoZSBsb2dpbiBwYWdlLgogKgogKiBAc2luY2UgMy43LjAKICovCmZ1bmN0aW9uIHdwX2xvZ2luX3ZpZXdwb3J0X21ldGEoKSB7Cgk/PgoJPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+Cgk8P3BocAp9CgovKgogKiBNYWluIHBhcnQuCiAqCiAqIENoZWNrIHRoZSByZXF1ZXN0IGFuZCByZWRpcmVjdCBvciBkaXNwbGF5IGEgZm9ybSBiYXNlZCBvbiB0aGUgY3VycmVudCBhY3Rpb24uCiAqLwoKJGFjdGlvbiA9IGlzc2V0KCAkX1JFUVVFU1RbJ2FjdGlvbiddICkgJiYgaXNfc3RyaW5nKCAkX1JFUVVFU1RbJ2FjdGlvbiddICkgPyAkX1JFUVVFU1RbJ2FjdGlvbiddIDogJ2xvZ2luJzsKJGVycm9ycyA9IG5ldyBXUF9FcnJvcigpOwoKaWYgKCBpc3NldCggJF9HRVRbJ2tleSddICkgKSB7CgkkYWN0aW9uID0gJ3Jlc2V0cGFzcyc7Cn0KCmlmICggaXNzZXQoICRfR0VUWydjaGVja2VtYWlsJ10gKSApIHsKCSRhY3Rpb24gPSAnY2hlY2tlbWFpbCc7Cn0KCiRkZWZhdWx0X2FjdGlvbnMgPSBhcnJheSgKCSdjb25maXJtX2FkbWluX2VtYWlsJywKCSdwb3N0cGFzcycsCgknbG9nb3V0JywKCSdsb3N0cGFzc3dvcmQnLAoJJ3JldHJpZXZlcGFzc3dvcmQnLAoJJ3Jlc2V0cGFzcycsCgkncnAnLAoJJ3JlZ2lzdGVyJywKCSdjaGVja2VtYWlsJywKCSdjb25maXJtYWN0aW9uJywKCSdsb2dpbicsCglXUF9SZWNvdmVyeV9Nb2RlX0xpbmtfU2VydmljZTo6TE9HSU5fQUNUSU9OX0VOVEVSRUQsCik7CgovLyBWYWxpZGF0ZSBhY3Rpb24gc28gYXMgdG8gZGVmYXVsdCB0byB0aGUgbG9naW4gc2NyZWVuLgppZiAoICEgaW5fYXJyYXkoICRhY3Rpb24sICRkZWZhdWx0X2FjdGlvbnMsIHRydWUgKSAmJiBmYWxzZSA9PT0gaGFzX2ZpbHRlciggJ2xvZ2luX2Zvcm1fJyAuICRhY3Rpb24gKSApIHsKCSRhY3Rpb24gPSAnbG9naW4nOwp9Cgpub2NhY2hlX2hlYWRlcnMoKTsKCmhlYWRlciggJ0NvbnRlbnQtVHlwZTogJyAuIGdldF9ibG9naW5mbyggJ2h0bWxfdHlwZScgKSAuICc7IGNoYXJzZXQ9JyAuIGdldF9ibG9naW5mbyggJ2NoYXJzZXQnICkgKTsKCmlmICggZGVmaW5lZCggJ1JFTE9DQVRFJyApICYmIFJFTE9DQVRFICkgeyAvLyBNb3ZlIGZsYWcgaXMgc2V0LgoJaWYgKCBpc3NldCggJF9TRVJWRVJbJ1BBVEhfSU5GTyddICkgJiYgKCAkX1NFUlZFUlsnUEFUSF9JTkZPJ10gIT09ICRfU0VSVkVSWydQSFBfU0VMRiddICkgKSB7CgkJJF9TRVJWRVJbJ1BIUF9TRUxGJ10gPSBzdHJfcmVwbGFjZSggJF9TRVJWRVJbJ1BBVEhfSU5GTyddLCAnJywgJF9TRVJWRVJbJ1BIUF9TRUxGJ10gKTsKCX0KCgkkdXJsID0gZGlybmFtZSggc2V0X3VybF9zY2hlbWUoICdodHRwOi8vJyAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICRfU0VSVkVSWydQSFBfU0VMRiddICkgKTsKCglpZiAoIGdldF9vcHRpb24oICdzaXRldXJsJyApICE9PSAkdXJsICkgewoJCXVwZGF0ZV9vcHRpb24oICdzaXRldXJsJywgJHVybCApOwoJfQp9CgovLyBTZXQgYSBjb29raWUgbm93IHRvIHNlZSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuCiRzZWN1cmUgPSAoICdodHRwcycgPT09IHBhcnNlX3VybCggd3BfbG9naW5fdXJsKCksIFBIUF9VUkxfU0NIRU1FICkgKTsKc2V0Y29va2llKCBURVNUX0NPT0tJRSwgJ1dQIENvb2tpZSBjaGVjaycsIDAsIENPT0tJRVBBVEgsIENPT0tJRV9ET01BSU4sICRzZWN1cmUsIHRydWUgKTsKCmlmICggU0lURUNPT0tJRVBBVEggIT09IENPT0tJRVBBVEggKSB7CglzZXRjb29raWUoIFRFU1RfQ09PS0lFLCAnV1AgQ29va2llIGNoZWNrJywgMCwgU0lURUNPT0tJRVBBVEgsIENPT0tJRV9ET01BSU4sICRzZWN1cmUsIHRydWUgKTsKfQoKaWYgKCBpc3NldCggJF9HRVRbJ3dwX2xhbmcnXSApICkgewoJc2V0Y29va2llKCAnd3BfbGFuZycsIHNhbml0aXplX3RleHRfZmllbGQoICRfR0VUWyd3cF9sYW5nJ10gKSwgMCwgQ09PS0lFUEFUSCwgQ09PS0lFX0RPTUFJTiwgJHNlY3VyZSwgdHJ1ZSApOwp9CgovKioKICogRmlyZXMgd2hlbiB0aGUgbG9naW4gZm9ybSBpcyBpbml0aWFsaXplZC4KICoKICogQHNpbmNlIDMuMi4wCiAqLwpkb19hY3Rpb24oICdsb2dpbl9pbml0JyApOwoKLyoqCiAqIEZpcmVzIGJlZm9yZSBhIHNwZWNpZmllZCBsb2dpbiBmb3JtIGFjdGlvbi4KICoKICogVGhlIGR5bmFtaWMgcG9ydGlvbiBvZiB0aGUgaG9vayBuYW1lLCBgJGFjdGlvbmAsIHJlZmVycyB0byB0aGUgYWN0aW9uCiAqIHRoYXQgYnJvdWdodCB0aGUgdmlzaXRvciB0byB0aGUgbG9naW4gZm9ybS4KICoKICogUG9zc2libGUgaG9vayBuYW1lcyBpbmNsdWRlOgogKgogKiAgLSBgbG9naW5fZm9ybV9jaGVja2VtYWlsYAogKiAgLSBgbG9naW5fZm9ybV9jb25maXJtX2FkbWluX2VtYWlsYAogKiAgLSBgbG9naW5fZm9ybV9jb25maXJtYWN0aW9uYAogKiAgLSBgbG9naW5fZm9ybV9lbnRlcmVkX3JlY292ZXJ5X21vZGVgCiAqICAtIGBsb2dpbl9mb3JtX2xvZ2luYAogKiAgLSBgbG9naW5fZm9ybV9sb2dvdXRgCiAqICAtIGBsb2dpbl9mb3JtX2xvc3RwYXNzd29yZGAKICogIC0gYGxvZ2luX2Zvcm1fcG9zdHBhc3NgCiAqICAtIGBsb2dpbl9mb3JtX3JlZ2lzdGVyYAogKiAgLSBgbG9naW5fZm9ybV9yZXNldHBhc3NgCiAqICAtIGBsb2dpbl9mb3JtX3JldHJpZXZlcGFzc3dvcmRgCiAqICAtIGBsb2dpbl9mb3JtX3JwYAogKgogKiBAc2luY2UgMi44LjAKICovCmRvX2FjdGlvbiggImxvZ2luX2Zvcm1feyRhY3Rpb259IiApOwoKJGh0dHBfcG9zdCAgICAgPSAoICdQT1NUJyA9PT0gJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gKTsKJGludGVyaW1fbG9naW4gPSBpc3NldCggJF9SRVFVRVNUWydpbnRlcmltLWxvZ2luJ10gKTsKCi8qKgogKiBGaWx0ZXJzIHRoZSBzZXBhcmF0b3IgdXNlZCBiZXR3ZWVuIGxvZ2luIGZvcm0gbmF2aWdhdGlvbiBsaW5rcy4KICoKICogQHNpbmNlIDQuOS4wCiAqCiAqIEBwYXJhbSBzdHJpbmcgJGxvZ2luX2xpbmtfc2VwYXJhdG9yIFRoZSBzZXBhcmF0b3IgdXNlZCBiZXR3ZWVuIGxvZ2luIGZvcm0gbmF2aWdhdGlvbiBsaW5rcy4KICovCiRsb2dpbl9saW5rX3NlcGFyYXRvciA9IGFwcGx5X2ZpbHRlcnMoICdsb2dpbl9saW5rX3NlcGFyYXRvcicsICcgfCAnICk7Cgpzd2l0Y2ggKCAkYWN0aW9uICkgewoKCWNhc2UgJ2NvbmZpcm1fYWRtaW5fZW1haWwnOgoJCS8qCgkJICogTm90ZSB0aGF0IGBpc191c2VyX2xvZ2dlZF9pbigpYCB3aWxsIHJldHVybiBmYWxzZSBpbW1lZGlhdGVseSBhZnRlciBsb2dnaW5nIGluCgkJICogYXMgdGhlIGN1cnJlbnQgdXNlciBpcyBub3Qgc2V0LCBzZWUgd3AtaW5jbHVkZXMvcGx1Z2dhYmxlLnBocC4KCQkgKiBIb3dldmVyIHRoaXMgYWN0aW9uIHJ1bnMgb24gYSByZWRpcmVjdCBhZnRlciBsb2dnaW5nIGluLgoJCSAqLwoJCWlmICggISBpc191c2VyX2xvZ2dlZF9pbigpICkgewoJCQl3cF9zYWZlX3JlZGlyZWN0KCB3cF9sb2dpbl91cmwoKSApOwoJCQlleGl0OwoJCX0KCgkJaWYgKCAhIGVtcHR5KCAkX1JFUVVFU1RbJ3JlZGlyZWN0X3RvJ10gKSApIHsKCQkJJHJlZGlyZWN0X3RvID0gJF9SRVFVRVNUWydyZWRpcmVjdF90byddOwoJCX0gZWxzZSB7CgkJCSRyZWRpcmVjdF90byA9IGFkbWluX3VybCgpOwoJCX0KCgkJaWYgKCBjdXJyZW50X3VzZXJfY2FuKCAnbWFuYWdlX29wdGlvbnMnICkgKSB7CgkJCSRhZG1pbl9lbWFpbCA9IGdldF9vcHRpb24oICdhZG1pbl9lbWFpbCcgKTsKCQl9IGVsc2UgewoJCQl3cF9zYWZlX3JlZGlyZWN0KCAkcmVkaXJlY3RfdG8gKTsKCQkJZXhpdDsKCQl9CgoJCS8qKgoJCSAqIEZpbHRlcnMgdGhlIGludGVydmFsIGZvciBkaXNtaXNzaW5nIHRoZSBhZG1pbiBlbWFpbCBjb25maXJtYXRpb24gc2NyZWVuLgoJCSAqCgkJICogSWYgYDBgICh6ZXJvKSBpcyByZXR1cm5lZCwgdGhlICJSZW1pbmQgbWUgbGF0ZXIiIGxpbmsgd2lsbCBub3QgYmUgZGlzcGxheWVkLgoJCSAqCgkJICogQHNpbmNlIDUuMy4xCgkJICoKCQkgKiBAcGFyYW0gaW50ICRpbnRlcnZhbCBJbnRlcnZhbCB0aW1lIChpbiBzZWNvbmRzKS4gRGVmYXVsdCBpcyAzIGRheXMuCgkJICovCgkJJHJlbWluZF9pbnRlcnZhbCA9IChpbnQpIGFwcGx5X2ZpbHRlcnMoICdhZG1pbl9lbWFpbF9yZW1pbmRfaW50ZXJ2YWwnLCAzICogREFZX0lOX1NFQ09ORFMgKTsKCgkJaWYgKCAhIGVtcHR5KCAkX0dFVFsncmVtaW5kX21lX2xhdGVyJ10gKSApIHsKCQkJaWYgKCAhIHdwX3ZlcmlmeV9ub25jZSggJF9HRVRbJ3JlbWluZF9tZV9sYXRlciddLCAncmVtaW5kX21lX2xhdGVyX25vbmNlJyApICkgewoJCQkJd3Bfc2FmZV9yZWRpcmVjdCggd3BfbG9naW5fdXJsKCkgKTsKCQkJCWV4aXQ7CgkJCX0KCgkJCWlmICggJHJlbWluZF9pbnRlcnZhbCA+IDAgKSB7CgkJCQl1cGRhdGVfb3B0aW9uKCAnYWRtaW5fZW1haWxfbGlmZXNwYW4nLCB0aW1lKCkgKyAkcmVtaW5kX2ludGVydmFsICk7CgkJCX0KCgkJCSRyZWRpcmVjdF90byA9IGFkZF9xdWVyeV9hcmcoICdhZG1pbl9lbWFpbF9yZW1pbmRfbGF0ZXInLCAxLCAkcmVkaXJlY3RfdG8gKTsKCQkJd3Bfc2FmZV9yZWRpcmVjdCggJHJlZGlyZWN0X3RvICk7CgkJCWV4aXQ7CgkJfQoKCQlpZiAoICEgZW1wdHkoICRfUE9TVFsnY29ycmVjdC1hZG1pbi1lbWFpbCddICkgKSB7CgkJCWlmICggISBjaGVja19hZG1pbl9yZWZlcmVyKCAnY29uZmlybV9hZG1pbl9lbWFpbCcsICdjb25maXJtX2FkbWluX2VtYWlsX25vbmNlJyApICkgewoJCQkJd3Bfc2FmZV9yZWRpcmVjdCggd3BfbG9naW5fdXJsKCkgKTsKCQkJCWV4aXQ7CgkJCX0KCgkJCS8qKgoJCQkgKiBGaWx0ZXJzIHRoZSBpbnRlcnZhbCBmb3IgcmVkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGFkbWluIGVtYWlsIGNvbmZpcm1hdGlvbiBzY3JlZW4uCgkJCSAqCgkJCSAqIElmIGAwYCAoemVybykgaXMgcmV0dXJuZWQsIHRoZSB1c2VyIHdpbGwgbm90IGJlIHJlZGlyZWN0ZWQuCgkJCSAqCgkJCSAqIEBzaW5jZSA1LjMuMAoJCQkgKgoJCQkgKiBAcGFyYW0gaW50ICRpbnRlcnZhbCBJbnRlcnZhbCB0aW1lIChpbiBzZWNvbmRzKS4gRGVmYXVsdCBpcyA2IG1vbnRocy4KCQkJICovCgkJCSRhZG1pbl9lbWFpbF9jaGVja19pbnRlcnZhbCA9IChpbnQpIGFwcGx5X2ZpbHRlcnMoICdhZG1pbl9lbWFpbF9jaGVja19pbnRlcnZhbCcsIDYgKiBNT05USF9JTl9TRUNPTkRTICk7CgoJCQlpZiAoICRhZG1pbl9lbWFpbF9jaGVja19pbnRlcnZhbCA+IDAgKSB7CgkJCQl1cGRhdGVfb3B0aW9uKCAnYWRtaW5fZW1haWxfbGlmZXNwYW4nLCB0aW1lKCkgKyAkYWRtaW5fZW1haWxfY2hlY2tfaW50ZXJ2YWwgKTsKCQkJfQoKCQkJd3Bfc2FmZV9yZWRpcmVjdCggJHJlZGlyZWN0X3RvICk7CgkJCWV4aXQ7CgkJfQoKCQlsb2dpbl9oZWFkZXIoIF9fKCAnQ29uZmlybSB5b3VyIGFkbWluaXN0cmF0aW9uIGVtYWlsJyApLCAnJywgJGVycm9ycyApOwoKCQkvKioKCQkgKiBGaXJlcyBiZWZvcmUgdGhlIGFkbWluIGVtYWlsIGNvbmZpcm0gZm9ybS4KCQkgKgoJCSAqIEBzaW5jZSA1LjMuMAoJCSAqCgkJICogQHBhcmFtIFdQX0Vycm9yICRlcnJvcnMgQSBgV1BfRXJyb3JgIG9iamVjdCBjb250YWluaW5nIGFueSBlcnJvcnMgZ2VuZXJhdGVkIGJ5IHVzaW5nIGludmFsaWQKCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscy4gTm90ZSB0aGF0IHRoZSBlcnJvciBvYmplY3QgbWF5IG5vdCBjb250YWluIGFueSBlcnJvcnMuCgkJICovCgkJZG9fYWN0aW9uKCAnYWRtaW5fZW1haWxfY29uZmlybScsICRlcnJvcnMgKTsKCgkJPz4KCgkJPGZvcm0gY2xhc3M9ImFkbWluLWVtYWlsLWNvbmZpcm0tZm9ybSIgbmFtZT0iYWRtaW4tZW1haWwtY29uZmlybS1mb3JtIiBhY3Rpb249Ijw/cGhwIGVjaG8gZXNjX3VybCggc2l0ZV91cmwoICd3cC1sb2dpbi5waHA/YWN0aW9uPWNvbmZpcm1fYWRtaW5fZW1haWwnLCAnbG9naW5fcG9zdCcgKSApOyA/PiIgbWV0aG9kPSJwb3N0Ij4KCQkJPD9waHAKCQkJLyoqCgkJCSAqIEZpcmVzIGluc2lkZSB0aGUgYWRtaW4tZW1haWwtY29uZmlybS1mb3JtIGZvcm0gdGFncywgYmVmb3JlIHRoZSBoaWRkZW4gZmllbGRzLgoJCQkgKgoJCQkgKiBAc2luY2UgNS4zLjAKCQkJICovCgkJCWRvX2FjdGlvbiggJ2FkbWluX2VtYWlsX2NvbmZpcm1fZm9ybScgKTsKCgkJCXdwX25vbmNlX2ZpZWxkKCAnY29uZmlybV9hZG1pbl9lbWFpbCcsICdjb25maXJtX2FkbWluX2VtYWlsX25vbmNlJyApOwoKCQkJPz4KCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVkaXJlY3RfdG8iIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCAkcmVkaXJlY3RfdG8gKTsgPz4iIC8+CgoJCQk8aDEgY2xhc3M9ImFkbWluLWVtYWlsX19oZWFkaW5nIj4KCQkJCTw/cGhwIF9lKCAnQWRtaW5pc3RyYXRpb24gZW1haWwgdmVyaWZpY2F0aW9uJyApOyA/PgoJCQk8L2gxPgoJCQk8cCBjbGFzcz0iYWRtaW4tZW1haWxfX2RldGFpbHMiPgoJCQkJPD9waHAgX2UoICdQbGVhc2UgdmVyaWZ5IHRoYXQgdGhlIDxzdHJvbmc+YWRtaW5pc3RyYXRpb24gZW1haWw8L3N0cm9uZz4gZm9yIHRoaXMgd2Vic2l0ZSBpcyBzdGlsbCBjb3JyZWN0LicgKTsgPz4KCQkJCTw/cGhwCgoJCQkJLyogdHJhbnNsYXRvcnM6IFVSTCB0byB0aGUgV29yZFByZXNzIGhlbHAgc2VjdGlvbiBhYm91dCBhZG1pbiBlbWFpbC4gKi8KCQkJCSRhZG1pbl9lbWFpbF9oZWxwX3VybCA9IF9fKCAnaHR0cHM6Ly93b3JkcHJlc3Mub3JnL2RvY3VtZW50YXRpb24vYXJ0aWNsZS9zZXR0aW5ncy1nZW5lcmFsLXNjcmVlbi8jZW1haWwtYWRkcmVzcycgKTsKCgkJCQkkYWNjZXNzaWJpbGl0eV90ZXh0ID0gc3ByaW50ZigKCQkJCQknPHNwYW4gY2xhc3M9InNjcmVlbi1yZWFkZXItdGV4dCI+ICVzPC9zcGFuPicsCgkJCQkJLyogdHJhbnNsYXRvcnM6IEhpZGRlbiBhY2Nlc3NpYmlsaXR5IHRleHQuICovCgkJCQkJX18oICcob3BlbnMgaW4gYSBuZXcgdGFiKScgKQoJCQkJKTsKCgkJCQlwcmludGYoCgkJCQkJJzxhIGhyZWY9IiVzIiB0YXJnZXQ9Il9ibGFuayI+JXMlczwvYT4nLAoJCQkJCWVzY191cmwoICRhZG1pbl9lbWFpbF9oZWxwX3VybCApLAoJCQkJCV9fKCAnV2h5IGlzIHRoaXMgaW1wb3J0YW50PycgKSwKCQkJCQkkYWNjZXNzaWJpbGl0eV90ZXh0CgkJCQkpOwoKCQkJCT8+CgkJCTwvcD4KCQkJPHAgY2xhc3M9ImFkbWluLWVtYWlsX19kZXRhaWxzIj4KCQkJCTw/cGhwCgoJCQkJcHJpbnRmKAoJCQkJCS8qIHRyYW5zbGF0b3JzOiAlczogQWRtaW4gZW1haWwgYWRkcmVzcy4gKi8KCQkJCQlfXyggJ0N1cnJlbnQgYWRtaW5pc3RyYXRpb24gZW1haWw6ICVzJyApLAoJCQkJCSc8c3Ryb25nPicgLiBlc2NfaHRtbCggJGFkbWluX2VtYWlsICkgLiAnPC9zdHJvbmc+JwoJCQkJKTsKCgkJCQk/PgoJCQk8L3A+CgkJCTxwIGNsYXNzPSJhZG1pbi1lbWFpbF9fZGV0YWlscyI+CgkJCQk8P3BocCBfZSggJ1RoaXMgZW1haWwgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHlvdXIgcGVyc29uYWwgZW1haWwgYWRkcmVzcy4nICk7ID8+CgkJCTwvcD4KCgkJCTxkaXYgY2xhc3M9ImFkbWluLWVtYWlsX19hY3Rpb25zIj4KCQkJCTxkaXYgY2xhc3M9ImFkbWluLWVtYWlsX19hY3Rpb25zLXByaW1hcnkiPgoJCQkJCTw/cGhwCgoJCQkJCSRjaGFuZ2VfbGluayA9IGFkbWluX3VybCggJ29wdGlvbnMtZ2VuZXJhbC5waHAnICk7CgkJCQkJJGNoYW5nZV9saW5rID0gYWRkX3F1ZXJ5X2FyZyggJ2hpZ2hsaWdodCcsICdjb25maXJtX2FkbWluX2VtYWlsJywgJGNoYW5nZV9saW5rICk7CgoJCQkJCT8+CgkJCQkJPGEgY2xhc3M9ImJ1dHRvbiBidXR0b24tbGFyZ2UiIGhyZWY9Ijw/cGhwIGVjaG8gZXNjX3VybCggJGNoYW5nZV9saW5rICk7ID8+Ij48P3BocCBfZSggJ1VwZGF0ZScgKTsgPz48L2E+CgkJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iY29ycmVjdC1hZG1pbi1lbWFpbCIgaWQ9ImNvcnJlY3QtYWRtaW4tZW1haWwiIGNsYXNzPSJidXR0b24gYnV0dG9uLXByaW1hcnkgYnV0dG9uLWxhcmdlIiB2YWx1ZT0iPD9waHAgZXNjX2F0dHJfZSggJ1RoZSBlbWFpbCBpcyBjb3JyZWN0JyApOyA/PiIgLz4KCQkJCTwvZGl2PgoJCQkJPD9waHAgaWYgKCAkcmVtaW5kX2ludGVydmFsID4gMCApIDogPz4KCQkJCQk8ZGl2IGNsYXNzPSJhZG1pbi1lbWFpbF9fYWN0aW9ucy1zZWNvbmRhcnkiPgoJCQkJCQk8P3BocAoKCQkJCQkJJHJlbWluZF9tZV9saW5rID0gd3BfbG9naW5fdXJsKCAkcmVkaXJlY3RfdG8gKTsKCQkJCQkJJHJlbWluZF9tZV9saW5rID0gYWRkX3F1ZXJ5X2FyZygKCQkJCQkJCWFycmF5KAoJCQkJCQkJCSdhY3Rpb24nICAgICAgICAgID0+ICdjb25maXJtX2FkbWluX2VtYWlsJywKCQkJCQkJCQkncmVtaW5kX21lX2xhdGVyJyA9PiB3cF9jcmVhdGVfbm9uY2UoICdyZW1pbmRfbWVfbGF0ZXJfbm9uY2UnICksCgkJCQkJCQkpLAoJCQkJCQkJJHJlbWluZF9tZV9saW5rCgkJCQkJCSk7CgoJCQkJCQk/PgoJCQkJCQk8YSBocmVmPSI8P3BocCBlY2hvIGVzY191cmwoICRyZW1pbmRfbWVfbGluayApOyA/PiI+PD9waHAgX2UoICdSZW1pbmQgbWUgbGF0ZXInICk7ID8+PC9hPgoJCQkJCTwvZGl2PgoJCQkJPD9waHAgZW5kaWY7ID8+CgkJCTwvZGl2PgoJCTwvZm9ybT4KCgkJPD9waHAKCgkJbG9naW5fZm9vdGVyKCk7CgkJYnJlYWs7CgoJY2FzZSAncG9zdHBhc3MnOgoJCSRyZWRpcmVjdF90byA9ICRfUE9TVFsncmVkaXJlY3RfdG8nXSA/PyB3cF9nZXRfcmVmZXJlcigpOwoKCQlpZiAoICEgaXNzZXQoICRfUE9TVFsncG9zdF9wYXNzd29yZCddICkgfHwgISBpc19zdHJpbmcoICRfUE9TVFsncG9zdF9wYXNzd29yZCddICkgKSB7CgkJCXdwX3NhZmVfcmVkaXJlY3QoICRyZWRpcmVjdF90byApOwoJCQlleGl0OwoJCX0KCgkJcmVxdWlyZV9vbmNlIEFCU1BBVEggLiBXUElOQyAuICcvY2xhc3MtcGhwYXNzLnBocCc7CgkJJGhhc2hlciA9IG5ldyBQYXNzd29yZEhhc2goIDgsIHRydWUgKTsKCgkJLyoqCgkJICogRmlsdGVycyB0aGUgbGlmZSBzcGFuIG9mIHRoZSBwb3N0IHBhc3N3b3JkIGNvb2tpZS4KCQkgKgoJCSAqIEJ5IGRlZmF1bHQsIHRoZSBjb29raWUgZXhwaXJlcyAxMCBkYXlzIGZyb20gY3JlYXRpb24uIFRvIHR1cm4gdGhpcwoJCSAqIGludG8gYSBzZXNzaW9uIGNvb2tpZSwgcmV0dXJuIDAuCgkJICoKCQkgKiBAc2luY2UgMy43LjAKCQkgKgoJCSAqIEBwYXJhbSBpbnQgJGV4cGlyZXMgVGhlIGV4cGlyeSB0aW1lLCBhcyBwYXNzZWQgdG8gc2V0Y29va2llKCkuCgkJICovCgkJJGV4cGlyZSA9IGFwcGx5X2ZpbHRlcnMoICdwb3N0X3Bhc3N3b3JkX2V4cGlyZXMnLCB0aW1lKCkgKyAxMCAqIERBWV9JTl9TRUNPTkRTICk7CgoJCWlmICggJHJlZGlyZWN0X3RvICkgewoJCQkkc2VjdXJlID0gKCAnaHR0cHMnID09PSBwYXJzZV91cmwoICRyZWRpcmVjdF90bywgUEhQX1VSTF9TQ0hFTUUgKSApOwoJCX0gZWxzZSB7CgkJCSRzZWN1cmUgPSBmYWxzZTsKCQl9CgoJCXNldGNvb2tpZSggJ3dwLXBvc3RwYXNzXycgLiBDT09LSUVIQVNILCAkaGFzaGVyLT5IYXNoUGFzc3dvcmQoIHdwX3Vuc2xhc2goICRfUE9TVFsncG9zdF9wYXNzd29yZCddICkgKSwgJGV4cGlyZSwgQ09PS0lFUEFUSCwgQ09PS0lFX0RPTUFJTiwgJHNlY3VyZSApOwoKCQl3cF9zYWZlX3JlZGlyZWN0KCAkcmVkaXJlY3RfdG8gKTsKCQlleGl0OwoKCWNhc2UgJ2xvZ291dCc6CgkJY2hlY2tfYWRtaW5fcmVmZXJlciggJ2xvZy1vdXQnICk7CgoJCSR1c2VyID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOwoKCQl3cF9sb2dvdXQoKTsKCgkJaWYgKCAhIGVtcHR5KCAkX1JFUVVFU1RbJ3JlZGlyZWN0X3RvJ10gKSAmJiBpc19zdHJpbmcoICRfUkVRVUVTVFsncmVkaXJlY3RfdG8nXSApICkgewoJCQkkcmVkaXJlY3RfdG8gICAgICAgICAgID0gJF9SRVFVRVNUWydyZWRpcmVjdF90byddOwoJCQkkcmVxdWVzdGVkX3JlZGlyZWN0X3RvID0gJHJlZGlyZWN0X3RvOwoJCX0gZWxzZSB7CgkJCSRyZWRpcmVjdF90byA9IGFkZF9xdWVyeV9hcmcoCgkJCQlhcnJheSgKCQkJCQknbG9nZ2Vkb3V0JyA9PiAndHJ1ZScsCgkJCQkJJ3dwX2xhbmcnICAgPT4gZ2V0X3VzZXJfbG9jYWxlKCAkdXNlciApLAoJCQkJKSwKCQkJCXdwX2xvZ2luX3VybCgpCgkJCSk7CgoJCQkkcmVxdWVzdGVkX3JlZGlyZWN0X3RvID0gJyc7CgkJfQoKCQkvKioKCQkgKiBGaWx0ZXJzIHRoZSBsb2cgb3V0IHJlZGlyZWN0IFVSTC4KCQkgKgoJCSAqIEBzaW5jZSA0LjIuMAoJCSAqCgkJICogQHBhcmFtIHN0cmluZyAgJHJlZGlyZWN0X3RvICAgICAgICAgICBUaGUgcmVkaXJlY3QgZGVzdGluYXRpb24gVVJMLgoJCSAqIEBwYXJhbSBzdHJpbmcgICRyZXF1ZXN0ZWRfcmVkaXJlY3RfdG8gVGhlIHJlcXVlc3RlZCByZWRpcmVjdCBkZXN0aW5hdGlvbiBVUkwgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgoJCSAqIEBwYXJhbSBXUF9Vc2VyICR1c2VyICAgICAgICAgICAgICAgICAgVGhlIFdQX1VzZXIgb2JqZWN0IGZvciB0aGUgdXNlciB0aGF0J3MgbG9nZ2luZyBvdXQuCgkJICovCgkJJHJlZGlyZWN0X3RvID0gYXBwbHlfZmlsdGVycyggJ2xvZ291dF9yZWRpcmVjdCcsICRyZWRpcmVjdF90bywgJHJlcXVlc3RlZF9yZWRpcmVjdF90bywgJHVzZXIgKTsKCgkJd3Bfc2FmZV9yZWRpcmVjdCggJHJlZGlyZWN0X3RvICk7CgkJZXhpdDsKCgljYXNlICdsb3N0cGFzc3dvcmQnOgoJY2FzZSAncmV0cmlldmVwYXNzd29yZCc6CgkJaWYgKCAkaHR0cF9wb3N0ICkgewoJCQkkZXJyb3JzID0gcmV0cmlldmVfcGFzc3dvcmQoKTsKCgkJCWlmICggISBpc193cF9lcnJvciggJGVycm9ycyApICkgewoJCQkJJHJlZGlyZWN0X3RvID0gISBlbXB0eSggJF9SRVFVRVNUWydyZWRpcmVjdF90byddICkgPyAkX1JFUVVFU1RbJ3JlZGlyZWN0X3RvJ10gOiAnd3AtbG9naW4ucGhwP2NoZWNrZW1haWw9Y29uZmlybSc7CgkJCQl3cF9zYWZlX3JlZGlyZWN0KCAkcmVkaXJlY3RfdG8gKTsKCQkJCWV4aXQ7CgkJCX0KCQl9CgoJCWlmICggaXNzZXQoICRfR0VUWydlcnJvciddICkgKSB7CgkJCWlmICggJ2ludmFsaWRrZXknID09PSAkX0dFVFsnZXJyb3InXSApIHsKCQkJCSRlcnJvcnMtPmFkZCggJ2ludmFsaWRrZXknLCBfXyggJzxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+IFlvdXIgcGFzc3dvcmQgcmVzZXQgbGluayBhcHBlYXJzIHRvIGJlIGludmFsaWQuIFBsZWFzZSByZXF1ZXN0IGEgbmV3IGxpbmsgYmVsb3cuJyApICk7CgkJCX0gZWxzZWlmICggJ2V4cGlyZWRrZXknID09PSAkX0dFVFsnZXJyb3InXSApIHsKCQkJCSRlcnJvcnMtPmFkZCggJ2V4cGlyZWRrZXknLCBfXyggJzxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+IFlvdXIgcGFzc3dvcmQgcmVzZXQgbGluayBoYXMgZXhwaXJlZC4gUGxlYXNlIHJlcXVlc3QgYSBuZXcgbGluayBiZWxvdy4nICkgKTsKCQkJfQoJCX0KCgkJJGxvc3RwYXNzd29yZF9yZWRpcmVjdCA9ICEgZW1wdHkoICRfUkVRVUVTVFsncmVkaXJlY3RfdG8nXSApID8gJF9SRVFVRVNUWydyZWRpcmVjdF90byddIDogJyc7CgkJLyoqCgkJICogRmlsdGVycyB0aGUgVVJMIHJlZGlyZWN0ZWQgdG8gYWZ0ZXIgc3VibWl0dGluZyB0aGUgbG9zdHBhc3N3b3JkL3JldHJpZXZlcGFzc3dvcmQgZm9ybS4KCQkgKgoJCSAqIEBzaW5jZSAzLjAuMAoJCSAqCgkJICogQHBhcmFtIHN0cmluZyAkbG9zdHBhc3N3b3JkX3JlZGlyZWN0IFRoZSByZWRpcmVjdCBkZXN0aW5hdGlvbiBVUkwuCgkJICovCgkJJHJlZGlyZWN0X3RvID0gYXBwbHlfZmlsdGVycyggJ2xvc3RwYXNzd29yZF9yZWRpcmVjdCcsICRsb3N0cGFzc3dvcmRfcmVkaXJlY3QgKTsKCgkJLyoqCgkJICogRmlyZXMgYmVmb3JlIHRoZSBsb3N0IHBhc3N3b3JkIGZvcm0uCgkJICoKCQkgKiBAc2luY2UgMS41LjEKCQkgKiBAc2luY2UgNS4xLjAgQWRkZWQgdGhlIGAkZXJyb3JzYCBwYXJhbWV0ZXIuCgkJICoKCQkgKiBAcGFyYW0gV1BfRXJyb3IgJGVycm9ycyBBIGBXUF9FcnJvcmAgb2JqZWN0IGNvbnRhaW5pbmcgYW55IGVycm9ycyBnZW5lcmF0ZWQgYnkgdXNpbmcgaW52YWxpZAoJCSAqICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzLiBOb3RlIHRoYXQgdGhlIGVycm9yIG9iamVjdCBtYXkgbm90IGNvbnRhaW4gYW55IGVycm9ycy4KCQkgKi8KCQlkb19hY3Rpb24oICdsb3N0X3Bhc3N3b3JkJywgJGVycm9ycyApOwoKCQlsb2dpbl9oZWFkZXIoCgkJCV9fKCAnTG9zdCBQYXNzd29yZCcgKSwKCQkJd3BfZ2V0X2FkbWluX25vdGljZSgKCQkJCV9fKCAnUGxlYXNlIGVudGVyIHlvdXIgdXNlcm5hbWUgb3IgZW1haWwgYWRkcmVzcy4gWW91IHdpbGwgcmVjZWl2ZSBhbiBlbWFpbCBtZXNzYWdlIHdpdGggaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byByZXNldCB5b3VyIHBhc3N3b3JkLicgKSwKCQkJCWFycmF5KAoJCQkJCSd0eXBlJyAgICAgICAgICAgICAgID0+ICdpbmZvJywKCQkJCQknYWRkaXRpb25hbF9jbGFzc2VzJyA9PiBhcnJheSggJ21lc3NhZ2UnICksCgkJCQkpCgkJCSksCgkJCSRlcnJvcnMKCQkpOwoKCQkkdXNlcl9sb2dpbiA9ICcnOwoKCQlpZiAoIGlzc2V0KCAkX1BPU1RbJ3VzZXJfbG9naW4nXSApICYmIGlzX3N0cmluZyggJF9QT1NUWyd1c2VyX2xvZ2luJ10gKSApIHsKCQkJJHVzZXJfbG9naW4gPSB3cF91bnNsYXNoKCAkX1BPU1RbJ3VzZXJfbG9naW4nXSApOwoJCX0KCgkJPz4KCgkJPGZvcm0gbmFtZT0ibG9zdHBhc3N3b3JkZm9ybSIgaWQ9Imxvc3RwYXNzd29yZGZvcm0iIGFjdGlvbj0iPD9waHAgZWNobyBlc2NfdXJsKCBuZXR3b3JrX3NpdGVfdXJsKCAnd3AtbG9naW4ucGhwP2FjdGlvbj1sb3N0cGFzc3dvcmQnLCAnbG9naW5fcG9zdCcgKSApOyA/PiIgbWV0aG9kPSJwb3N0Ij4KCQkJPHA+CgkJCQk8bGFiZWwgZm9yPSJ1c2VyX2xvZ2luIj48P3BocCBfZSggJ1VzZXJuYW1lIG9yIEVtYWlsIEFkZHJlc3MnICk7ID8+PC9sYWJlbD4KCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VyX2xvZ2luIiBpZD0idXNlcl9sb2dpbiIgY2xhc3M9ImlucHV0IGx0ciIgdmFsdWU9Ijw/cGhwIGVjaG8gZXNjX2F0dHIoICR1c2VyX2xvZ2luICk7ID8+IiBzaXplPSIyMCIgYXV0b2NhcGl0YWxpemU9Im9mZiIgYXV0b2NvbXBsZXRlPSJ1c2VybmFtZSIgcmVxdWlyZWQ9InJlcXVpcmVkIiAvPgoJCQk8L3A+CgkJCTw/cGhwCgoJCQkvKioKCQkJICogRmlyZXMgaW5zaWRlIHRoZSBsb3N0cGFzc3dvcmQgZm9ybSB0YWdzLCBiZWZvcmUgdGhlIGhpZGRlbiBmaWVsZHMuCgkJCSAqCgkJCSAqIEBzaW5jZSAyLjEuMAoJCQkgKi8KCQkJZG9fYWN0aW9uKCAnbG9zdHBhc3N3b3JkX2Zvcm0nICk7CgoJCQk/PgoJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZWRpcmVjdF90byIgdmFsdWU9Ijw/cGhwIGVjaG8gZXNjX2F0dHIoICRyZWRpcmVjdF90byApOyA/PiIgLz4KCQkJPHAgY2xhc3M9InN1Ym1pdCI+CgkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ3cC1zdWJtaXQiIGlkPSJ3cC1zdWJtaXQiIGNsYXNzPSJidXR0b24gYnV0dG9uLXByaW1hcnkgYnV0dG9uLWxhcmdlIiB2YWx1ZT0iPD9waHAgZXNjX2F0dHJfZSggJ0dldCBOZXcgUGFzc3dvcmQnICk7ID8+IiAvPgoJCQk8L3A+CgkJPC9mb3JtPgoKCQk8cCBpZD0ibmF2Ij4KCQkJPGEgY2xhc3M9IndwLWxvZ2luLWxvZy1pbiIgaHJlZj0iPD9waHAgZWNobyBlc2NfdXJsKCB3cF9sb2dpbl91cmwoKSApOyA/PiI+PD9waHAgX2UoICdMb2cgaW4nICk7ID8+PC9hPgoJCQk8P3BocAoKCQkJaWYgKCBnZXRfb3B0aW9uKCAndXNlcnNfY2FuX3JlZ2lzdGVyJyApICkgewoJCQkJJHJlZ2lzdHJhdGlvbl91cmwgPSBzcHJpbnRmKCAnPGEgY2xhc3M9IndwLWxvZ2luLXJlZ2lzdGVyIiBocmVmPSIlcyI+JXM8L2E+JywgZXNjX3VybCggd3BfcmVnaXN0cmF0aW9uX3VybCgpICksIF9fKCAnUmVnaXN0ZXInICkgKTsKCgkJCQllY2hvIGVzY19odG1sKCAkbG9naW5fbGlua19zZXBhcmF0b3IgKTsKCgkJCQkvKiogVGhpcyBmaWx0ZXIgaXMgZG9jdW1lbnRlZCBpbiB3cC1pbmNsdWRlcy9nZW5lcmFsLXRlbXBsYXRlLnBocCAqLwoJCQkJZWNobyBhcHBseV9maWx0ZXJzKCAncmVnaXN0ZXInLCAkcmVnaXN0cmF0aW9uX3VybCApOwoJCQl9CgoJCQk/PgoJCTwvcD4KCQk8P3BocAoKCQlsb2dpbl9mb290ZXIoICd1c2VyX2xvZ2luJyApOwoJCWJyZWFrOwoKCWNhc2UgJ3Jlc2V0cGFzcyc6CgljYXNlICdycCc6CgkJbGlzdCggJHJwX3BhdGggKSA9IGV4cGxvZGUoICc/Jywgd3BfdW5zbGFzaCggJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gKSApOwoJCSRycF9jb29raWUgICAgICAgPSAnd3AtcmVzZXRwYXNzLScgLiBDT09LSUVIQVNIOwoKCQlpZiAoIGlzc2V0KCAkX0dFVFsna2V5J10gKSAmJiBpc3NldCggJF9HRVRbJ2xvZ2luJ10gKSApIHsKCQkJJHZhbHVlID0gc3ByaW50ZiggJyVzOiVzJywgd3BfdW5zbGFzaCggJF9HRVRbJ2xvZ2luJ10gKSwgd3BfdW5zbGFzaCggJF9HRVRbJ2tleSddICkgKTsKCQkJc2V0Y29va2llKCAkcnBfY29va2llLCAkdmFsdWUsIDAsICRycF9wYXRoLCBDT09LSUVfRE9NQUlOLCBpc19zc2woKSwgdHJ1ZSApOwoKCQkJd3Bfc2FmZV9yZWRpcmVjdCggcmVtb3ZlX3F1ZXJ5X2FyZyggYXJyYXkoICdrZXknLCAnbG9naW4nICkgKSApOwoJCQlleGl0OwoJCX0KCgkJaWYgKCBpc3NldCggJF9DT09LSUVbICRycF9jb29raWUgXSApICYmIDAgPCBzdHJwb3MoICRfQ09PS0lFWyAkcnBfY29va2llIF0sICc6JyApICkgewoJCQlsaXN0KCAkcnBfbG9naW4sICRycF9rZXkgKSA9IGV4cGxvZGUoICc6Jywgd3BfdW5zbGFzaCggJF9DT09LSUVbICRycF9jb29raWUgXSApLCAyICk7CgoJCQkkdXNlciA9IGNoZWNrX3Bhc3N3b3JkX3Jlc2V0X2tleSggJHJwX2tleSwgJHJwX2xvZ2luICk7CgoJCQlpZiAoIGlzc2V0KCAkX1BPU1RbJ3Bhc3MxJ10gKSAmJiAhIGhhc2hfZXF1YWxzKCAkcnBfa2V5LCAkX1BPU1RbJ3JwX2tleSddICkgKSB7CgkJCQkkdXNlciA9IGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJJHVzZXIgPSBmYWxzZTsKCQl9CgoJCWlmICggISAkdXNlciB8fCBpc193cF9lcnJvciggJHVzZXIgKSApIHsKCQkJc2V0Y29va2llKCAkcnBfY29va2llLCAnICcsIHRpbWUoKSAtIFlFQVJfSU5fU0VDT05EUywgJHJwX3BhdGgsIENPT0tJRV9ET01BSU4sIGlzX3NzbCgpLCB0cnVlICk7CgoJCQlpZiAoICR1c2VyICYmICR1c2VyLT5nZXRfZXJyb3JfY29kZSgpID09PSAnZXhwaXJlZF9rZXknICkgewoJCQkJd3BfcmVkaXJlY3QoIHNpdGVfdXJsKCAnd3AtbG9naW4ucGhwP2FjdGlvbj1sb3N0cGFzc3dvcmQmZXJyb3I9ZXhwaXJlZGtleScgKSApOwoJCQl9IGVsc2UgewoJCQkJd3BfcmVkaXJlY3QoIHNpdGVfdXJsKCAnd3AtbG9naW4ucGhwP2FjdGlvbj1sb3N0cGFzc3dvcmQmZXJyb3I9aW52YWxpZGtleScgKSApOwoJCQl9CgoJCQlleGl0OwoJCX0KCgkJJGVycm9ycyA9IG5ldyBXUF9FcnJvcigpOwoKCQkvLyBDaGVjayBpZiBwYXNzd29yZCBpcyBvbmUgb3IgYWxsIGVtcHR5IHNwYWNlcy4KCQlpZiAoICEgZW1wdHkoICRfUE9TVFsncGFzczEnXSApICkgewoJCQkkX1BPU1RbJ3Bhc3MxJ10gPSB0cmltKCAkX1BPU1RbJ3Bhc3MxJ10gKTsKCgkJCWlmICggZW1wdHkoICRfUE9TVFsncGFzczEnXSApICkgewoJCQkJJGVycm9ycy0+YWRkKCAncGFzc3dvcmRfcmVzZXRfZW1wdHlfc3BhY2UnLCBfXyggJ1RoZSBwYXNzd29yZCBjYW5ub3QgYmUgYSBzcGFjZSBvciBhbGwgc3BhY2VzLicgKSApOwoJCQl9CgkJfQoKCQkvLyBDaGVjayBpZiBwYXNzd29yZCBmaWVsZHMgZG8gbm90IG1hdGNoLgoJCWlmICggISBlbXB0eSggJF9QT1NUWydwYXNzMSddICkgJiYgdHJpbSggJF9QT1NUWydwYXNzMiddICkgIT09ICRfUE9TVFsncGFzczEnXSApIHsKCQkJJGVycm9ycy0+YWRkKCAncGFzc3dvcmRfcmVzZXRfbWlzbWF0Y2gnLCBfXyggJzxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+IFRoZSBwYXNzd29yZHMgZG8gbm90IG1hdGNoLicgKSApOwoJCX0KCgkJLyoqCgkJICogRmlyZXMgYmVmb3JlIHRoZSBwYXNzd29yZCByZXNldCBwcm9jZWR1cmUgaXMgdmFsaWRhdGVkLgoJCSAqCgkJICogQHNpbmNlIDMuNS4wCgkJICoKCQkgKiBAcGFyYW0gV1BfRXJyb3IgICAgICAgICAkZXJyb3JzIFdQIEVycm9yIG9iamVjdC4KCQkgKiBAcGFyYW0gV1BfVXNlcnxXUF9FcnJvciAkdXNlciAgIFdQX1VzZXIgb2JqZWN0IGlmIHRoZSBsb2dpbiBhbmQgcmVzZXQga2V5IG1hdGNoLiBXUF9FcnJvciBvYmplY3Qgb3RoZXJ3aXNlLgoJCSAqLwoJCWRvX2FjdGlvbiggJ3ZhbGlkYXRlX3Bhc3N3b3JkX3Jlc2V0JywgJGVycm9ycywgJHVzZXIgKTsKCgkJaWYgKCAoICEgJGVycm9ycy0+aGFzX2Vycm9ycygpICkgJiYgaXNzZXQoICRfUE9TVFsncGFzczEnXSApICYmICEgZW1wdHkoICRfUE9TVFsncGFzczEnXSApICkgewoJCQlyZXNldF9wYXNzd29yZCggJHVzZXIsICRfUE9TVFsncGFzczEnXSApOwoJCQlsb2dpbl9oZWFkZXIoCgkJCQlfXyggJ1Bhc3N3b3JkIFJlc2V0JyApLAoJCQkJd3BfZ2V0X2FkbWluX25vdGljZSgKCQkJCQlfXyggJ1lvdXIgcGFzc3dvcmQgaGFzIGJlZW4gcmVzZXQuJyApIC4gJyA8YSBocmVmPSInIC4gZXNjX3VybCggd3BfbG9naW5fdXJsKCkgKSAuICciPicgLiBfXyggJ0xvZyBpbicgKSAuICc8L2E+JywKCQkJCQlhcnJheSgKCQkJCQkJJ3R5cGUnICAgICAgICAgICAgICAgPT4gJ2luZm8nLAoJCQkJCQknYWRkaXRpb25hbF9jbGFzc2VzJyA9PiBhcnJheSggJ21lc3NhZ2UnLCAncmVzZXQtcGFzcycgKSwKCQkJCQkpCgkJCQkpCgkJCSk7CgkJCWxvZ2luX2Zvb3RlcigpOwoJCQlleGl0OwoJCX0KCgkJd3BfZW5xdWV1ZV9zY3JpcHQoICd1dGlscycgKTsKCQl3cF9lbnF1ZXVlX3NjcmlwdCggJ3VzZXItcHJvZmlsZScgKTsKCgkJbG9naW5faGVhZGVyKAoJCQlfXyggJ1Jlc2V0IFBhc3N3b3JkJyApLAoJCQl3cF9nZXRfYWRtaW5fbm90aWNlKAoJCQkJX18oICdFbnRlciB5b3VyIG5ldyBwYXNzd29yZCBiZWxvdyBvciBnZW5lcmF0ZSBvbmUuJyApLAoJCQkJYXJyYXkoCgkJCQkJJ3R5cGUnICAgICAgICAgICAgICAgPT4gJ2luZm8nLAoJCQkJCSdhZGRpdGlvbmFsX2NsYXNzZXMnID0+IGFycmF5KCAnbWVzc2FnZScsICdyZXNldC1wYXNzJyApLAoJCQkJKQoJCQkpLAoJCQkkZXJyb3JzCgkJKTsKCgkJPz4KCQk8Zm9ybSBuYW1lPSJyZXNldHBhc3Nmb3JtIiBpZD0icmVzZXRwYXNzZm9ybSIgYWN0aW9uPSI8P3BocCBlY2hvIGVzY191cmwoIG5ldHdvcmtfc2l0ZV91cmwoICd3cC1sb2dpbi5waHA/YWN0aW9uPXJlc2V0cGFzcycsICdsb2dpbl9wb3N0JyApICk7ID8+IiBtZXRob2Q9InBvc3QiIGF1dG9jb21wbGV0ZT0ib2ZmIj4KCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9InVzZXJfbG9naW4iIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCAkcnBfbG9naW4gKTsgPz4iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgoKCQkJPGRpdiBjbGFzcz0idXNlci1wYXNzMS13cmFwIj4KCQkJCTxwPgoJCQkJCTxsYWJlbCBmb3I9InBhc3MxIj48P3BocCBfZSggJ05ldyBwYXNzd29yZCcgKTsgPz48L2xhYmVsPgoJCQkJPC9wPgoKCQkJCTxkaXYgY2xhc3M9IndwLXB3ZCI+CgkJCQkJPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzMSIgaWQ9InBhc3MxIiBjbGFzcz0iaW5wdXQgcGFzc3dvcmQtaW5wdXQgbHRyIiBzaXplPSIyNCIgdmFsdWU9IiIgYXV0b2NvbXBsZXRlPSJuZXctcGFzc3dvcmQiIHNwZWxsY2hlY2s9ImZhbHNlIiBkYXRhLXJldmVhbD0iMSIgZGF0YS1wdz0iPD9waHAgZWNobyBlc2NfYXR0ciggd3BfZ2VuZXJhdGVfcGFzc3dvcmQoIDE2ICkgKTsgPz4iIGFyaWEtZGVzY3JpYmVkYnk9InBhc3Mtc3RyZW5ndGgtcmVzdWx0IiAvPgoKCQkJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IHdwLWhpZGUtcHcgaGlkZS1pZi1uby1qcyIgZGF0YS10b2dnbGU9IjAiIGFyaWEtbGFiZWw9Ijw/cGhwIGVzY19hdHRyX2UoICdIaWRlIHBhc3N3b3JkJyApOyA/PiI+CgkJCQkJCTxzcGFuIGNsYXNzPSJkYXNoaWNvbnMgZGFzaGljb25zLWhpZGRlbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkJCQk8L2J1dHRvbj4KCQkJCQk8ZGl2IGlkPSJwYXNzLXN0cmVuZ3RoLXJlc3VsdCIgY2xhc3M9ImhpZGUtaWYtbm8tanMiIGFyaWEtbGl2ZT0icG9saXRlIj48P3BocCBfZSggJ1N0cmVuZ3RoIGluZGljYXRvcicgKTsgPz48L2Rpdj4KCQkJCTwvZGl2PgoJCQkJPGRpdiBjbGFzcz0icHctd2VhayI+CgkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJwd193ZWFrIiBpZD0icHctd2VhayIgY2xhc3M9InB3LWNoZWNrYm94IiAvPgoJCQkJCTxsYWJlbCBmb3I9InB3LXdlYWsiPjw/cGhwIF9lKCAnQ29uZmlybSB1c2Ugb2Ygd2VhayBwYXNzd29yZCcgKTsgPz48L2xhYmVsPgoJCQkJPC9kaXY+CgkJCTwvZGl2PgoKCQkJPHAgY2xhc3M9InVzZXItcGFzczItd3JhcCI+CgkJCQk8bGFiZWwgZm9yPSJwYXNzMiI+PD9waHAgX2UoICdDb25maXJtIG5ldyBwYXNzd29yZCcgKTsgPz48L2xhYmVsPgoJCQkJPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzMiIgaWQ9InBhc3MyIiBjbGFzcz0iaW5wdXQiIHNpemU9IjIwIiB2YWx1ZT0iIiBhdXRvY29tcGxldGU9Im5ldy1wYXNzd29yZCIgc3BlbGxjaGVjaz0iZmFsc2UiIC8+CgkJCTwvcD4KCgkJCTxwIGNsYXNzPSJkZXNjcmlwdGlvbiBpbmRpY2F0b3ItaGludCI+PD9waHAgZWNobyB3cF9nZXRfcGFzc3dvcmRfaGludCgpOyA/PjwvcD4KCgkJCTw/cGhwCgoJCQkvKioKCQkJICogRmlyZXMgZm9sbG93aW5nIHRoZSAnU3RyZW5ndGggaW5kaWNhdG9yJyBtZXRlciBpbiB0aGUgdXNlciBwYXNzd29yZCByZXNldCBmb3JtLgoJCQkgKgoJCQkgKiBAc2luY2UgMy45LjAKCQkJICoKCQkJICogQHBhcmFtIFdQX1VzZXIgJHVzZXIgVXNlciBvYmplY3Qgb2YgdGhlIHVzZXIgd2hvc2UgcGFzc3dvcmQgaXMgYmVpbmcgcmVzZXQuCgkJCSAqLwoJCQlkb19hY3Rpb24oICdyZXNldHBhc3NfZm9ybScsICR1c2VyICk7CgoJCQk/PgoJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJycF9rZXkiIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCAkcnBfa2V5ICk7ID8+IiAvPgoJCQk8cCBjbGFzcz0ic3VibWl0IHJlc2V0LXBhc3Mtc3VibWl0Ij4KCQkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnV0dG9uIHdwLWdlbmVyYXRlLXB3IGhpZGUtaWYtbm8tanMgc2tpcC1hcmlhLWV4cGFuZGVkIj48P3BocCBfZSggJ0dlbmVyYXRlIFBhc3N3b3JkJyApOyA/PjwvYnV0dG9uPgoJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0id3Atc3VibWl0IiBpZD0id3Atc3VibWl0IiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IGJ1dHRvbi1sYXJnZSIgdmFsdWU9Ijw/cGhwIGVzY19hdHRyX2UoICdTYXZlIFBhc3N3b3JkJyApOyA/PiIgLz4KCQkJPC9wPgoJCTwvZm9ybT4KCgkJPHAgaWQ9Im5hdiI+CgkJCTxhIGNsYXNzPSJ3cC1sb2dpbi1sb2ctaW4iIGhyZWY9Ijw/cGhwIGVjaG8gZXNjX3VybCggd3BfbG9naW5fdXJsKCkgKTsgPz4iPjw/cGhwIF9lKCAnTG9nIGluJyApOyA/PjwvYT4KCQkJPD9waHAKCgkJCWlmICggZ2V0X29wdGlvbiggJ3VzZXJzX2Nhbl9yZWdpc3RlcicgKSApIHsKCQkJCSRyZWdpc3RyYXRpb25fdXJsID0gc3ByaW50ZiggJzxhIGNsYXNzPSJ3cC1sb2dpbi1yZWdpc3RlciIgaHJlZj0iJXMiPiVzPC9hPicsIGVzY191cmwoIHdwX3JlZ2lzdHJhdGlvbl91cmwoKSApLCBfXyggJ1JlZ2lzdGVyJyApICk7CgoJCQkJZWNobyBlc2NfaHRtbCggJGxvZ2luX2xpbmtfc2VwYXJhdG9yICk7CgoJCQkJLyoqIFRoaXMgZmlsdGVyIGlzIGRvY3VtZW50ZWQgaW4gd3AtaW5jbHVkZXMvZ2VuZXJhbC10ZW1wbGF0ZS5waHAgKi8KCQkJCWVjaG8gYXBwbHlfZmlsdGVycyggJ3JlZ2lzdGVyJywgJHJlZ2lzdHJhdGlvbl91cmwgKTsKCQkJfQoKCQkJPz4KCQk8L3A+CgkJPD9waHAKCgkJbG9naW5fZm9vdGVyKCAncGFzczEnICk7CgkJYnJlYWs7CgoJY2FzZSAncmVnaXN0ZXInOgoJCWlmICggaXNfbXVsdGlzaXRlKCkgKSB7CgkJCS8qKgoJCQkgKiBGaWx0ZXJzIHRoZSBNdWx0aXNpdGUgc2lnbiB1cCBVUkwuCgkJCSAqCgkJCSAqIEBzaW5jZSAzLjAuMAoJCQkgKgoJCQkgKiBAcGFyYW0gc3RyaW5nICRzaWduX3VwX3VybCBUaGUgc2lnbiB1cCBVUkwuCgkJCSAqLwoJCQl3cF9yZWRpcmVjdCggYXBwbHlfZmlsdGVycyggJ3dwX3NpZ251cF9sb2NhdGlvbicsIG5ldHdvcmtfc2l0ZV91cmwoICd3cC1zaWdudXAucGhwJyApICkgKTsKCQkJZXhpdDsKCQl9CgoJCWlmICggISBnZXRfb3B0aW9uKCAndXNlcnNfY2FuX3JlZ2lzdGVyJyApICkgewoJCQl3cF9yZWRpcmVjdCggc2l0ZV91cmwoICd3cC1sb2dpbi5waHA/cmVnaXN0cmF0aW9uPWRpc2FibGVkJyApICk7CgkJCWV4aXQ7CgkJfQoKCQkkdXNlcl9sb2dpbiA9ICcnOwoJCSR1c2VyX2VtYWlsID0gJyc7CgoJCWlmICggJGh0dHBfcG9zdCApIHsKCQkJaWYgKCBpc3NldCggJF9QT1NUWyd1c2VyX2xvZ2luJ10gKSAmJiBpc19zdHJpbmcoICRfUE9TVFsndXNlcl9sb2dpbiddICkgKSB7CgkJCQkkdXNlcl9sb2dpbiA9IHdwX3Vuc2xhc2goICRfUE9TVFsndXNlcl9sb2dpbiddICk7CgkJCX0KCgkJCWlmICggaXNzZXQoICRfUE9TVFsndXNlcl9lbWFpbCddICkgJiYgaXNfc3RyaW5nKCAkX1BPU1RbJ3VzZXJfZW1haWwnXSApICkgewoJCQkJJHVzZXJfZW1haWwgPSB3cF91bnNsYXNoKCAkX1BPU1RbJ3VzZXJfZW1haWwnXSApOwoJCQl9CgoJCQkkZXJyb3JzID0gcmVnaXN0ZXJfbmV3X3VzZXIoICR1c2VyX2xvZ2luLCAkdXNlcl9lbWFpbCApOwoKCQkJaWYgKCAhIGlzX3dwX2Vycm9yKCAkZXJyb3JzICkgKSB7CgkJCQkkcmVkaXJlY3RfdG8gPSAhIGVtcHR5KCAkX1BPU1RbJ3JlZGlyZWN0X3RvJ10gKSA/ICRfUE9TVFsncmVkaXJlY3RfdG8nXSA6ICd3cC1sb2dpbi5waHA/Y2hlY2tlbWFpbD1yZWdpc3RlcmVkJzsKCQkJCXdwX3NhZmVfcmVkaXJlY3QoICRyZWRpcmVjdF90byApOwoJCQkJZXhpdDsKCQkJfQoJCX0KCgkJJHJlZ2lzdHJhdGlvbl9yZWRpcmVjdCA9ICEgZW1wdHkoICRfUkVRVUVTVFsncmVkaXJlY3RfdG8nXSApID8gJF9SRVFVRVNUWydyZWRpcmVjdF90byddIDogJyc7CgoJCS8qKgoJCSAqIEZpbHRlcnMgdGhlIHJlZ2lzdHJhdGlvbiByZWRpcmVjdCBVUkwuCgkJICoKCQkgKiBAc2luY2UgMy4wLjAKCQkgKiBAc2luY2UgNS45LjAgQWRkZWQgdGhlIGAkZXJyb3JzYCBwYXJhbWV0ZXIuCgkJICoKCQkgKiBAcGFyYW0gc3RyaW5nICAgICAgICRyZWdpc3RyYXRpb25fcmVkaXJlY3QgVGhlIHJlZGlyZWN0IGRlc3RpbmF0aW9uIFVSTC4KCQkgKiBAcGFyYW0gaW50fFdQX0Vycm9yICRlcnJvcnMgICAgICAgICAgICAgICAgVXNlciBpZCBpZiByZWdpc3RyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsCgkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQX0Vycm9yIG9iamVjdCBvdGhlcndpc2UuCgkJICovCgkJJHJlZGlyZWN0X3RvID0gYXBwbHlfZmlsdGVycyggJ3JlZ2lzdHJhdGlvbl9yZWRpcmVjdCcsICRyZWdpc3RyYXRpb25fcmVkaXJlY3QsICRlcnJvcnMgKTsKCgkJbG9naW5faGVhZGVyKAoJCQlfXyggJ1JlZ2lzdHJhdGlvbiBGb3JtJyApLAoJCQl3cF9nZXRfYWRtaW5fbm90aWNlKAoJCQkJX18oICdSZWdpc3RlciBGb3IgVGhpcyBTaXRlJyApLAoJCQkJYXJyYXkoCgkJCQkJJ3R5cGUnICAgICAgICAgICAgICAgPT4gJ2luZm8nLAoJCQkJCSdhZGRpdGlvbmFsX2NsYXNzZXMnID0+IGFycmF5KCAnbWVzc2FnZScsICdyZWdpc3RlcicgKSwKCQkJCSkKCQkJKSwKCQkJJGVycm9ycwoJCSk7CgoJCT8+CgkJPGZvcm0gbmFtZT0icmVnaXN0ZXJmb3JtIiBpZD0icmVnaXN0ZXJmb3JtIiBhY3Rpb249Ijw/cGhwIGVjaG8gZXNjX3VybCggc2l0ZV91cmwoICd3cC1sb2dpbi5waHA/YWN0aW9uPXJlZ2lzdGVyJywgJ2xvZ2luX3Bvc3QnICkgKTsgPz4iIG1ldGhvZD0icG9zdCIgbm92YWxpZGF0ZT0ibm92YWxpZGF0ZSI+CgkJCTxwPgoJCQkJPGxhYmVsIGZvcj0idXNlcl9sb2dpbiI+PD9waHAgX2UoICdVc2VybmFtZScgKTsgPz48L2xhYmVsPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJfbG9naW4iIGlkPSJ1c2VyX2xvZ2luIiBjbGFzcz0iaW5wdXQgbHRyIiB2YWx1ZT0iPD9waHAgZWNobyBlc2NfYXR0ciggJHVzZXJfbG9naW4gKTsgPz4iIHNpemU9IjIwIiBhdXRvY2FwaXRhbGl6ZT0ib2ZmIiBhdXRvY29tcGxldGU9InVzZXJuYW1lIiByZXF1aXJlZD0icmVxdWlyZWQiIC8+CgkJCTwvcD4KCQkJPHA+CgkJCQk8bGFiZWwgZm9yPSJ1c2VyX2VtYWlsIj48P3BocCBfZSggJ0VtYWlsJyApOyA/PjwvbGFiZWw+CgkJCQk8aW5wdXQgdHlwZT0iZW1haWwiIG5hbWU9InVzZXJfZW1haWwiIGlkPSJ1c2VyX2VtYWlsIiBjbGFzcz0iaW5wdXQiIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCAkdXNlcl9lbWFpbCApOyA/PiIgc2l6ZT0iMjUiIGF1dG9jb21wbGV0ZT0iZW1haWwiIHJlcXVpcmVkPSJyZXF1aXJlZCIgLz4KCQkJPC9wPgoJCQk8P3BocAoKCQkJLyoqCgkJCSAqIEZpcmVzIGZvbGxvd2luZyB0aGUgJ0VtYWlsJyBmaWVsZCBpbiB0aGUgdXNlciByZWdpc3RyYXRpb24gZm9ybS4KCQkJICoKCQkJICogQHNpbmNlIDIuMS4wCgkJCSAqLwoJCQlkb19hY3Rpb24oICdyZWdpc3Rlcl9mb3JtJyApOwoKCQkJPz4KCQkJPHAgaWQ9InJlZ19wYXNzbWFpbCI+CgkJCQk8P3BocCBfZSggJ1JlZ2lzdHJhdGlvbiBjb25maXJtYXRpb24gd2lsbCBiZSBlbWFpbGVkIHRvIHlvdS4nICk7ID8+CgkJCTwvcD4KCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVkaXJlY3RfdG8iIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCAkcmVkaXJlY3RfdG8gKTsgPz4iIC8+CgkJCTxwIGNsYXNzPSJzdWJtaXQiPgoJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0id3Atc3VibWl0IiBpZD0id3Atc3VibWl0IiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IGJ1dHRvbi1sYXJnZSIgdmFsdWU9Ijw/cGhwIGVzY19hdHRyX2UoICdSZWdpc3RlcicgKTsgPz4iIC8+CgkJCTwvcD4KCQk8L2Zvcm0+CgoJCTxwIGlkPSJuYXYiPgoJCQk8YSBjbGFzcz0id3AtbG9naW4tbG9nLWluIiBocmVmPSI8P3BocCBlY2hvIGVzY191cmwoIHdwX2xvZ2luX3VybCgpICk7ID8+Ij48P3BocCBfZSggJ0xvZyBpbicgKTsgPz48L2E+CgkJCTw/cGhwCgoJCQllY2hvIGVzY19odG1sKCAkbG9naW5fbGlua19zZXBhcmF0b3IgKTsKCgkJCSRodG1sX2xpbmsgPSBzcHJpbnRmKCAnPGEgY2xhc3M9IndwLWxvZ2luLWxvc3QtcGFzc3dvcmQiIGhyZWY9IiVzIj4lczwvYT4nLCBlc2NfdXJsKCB3cF9sb3N0cGFzc3dvcmRfdXJsKCkgKSwgX18oICdMb3N0IHlvdXIgcGFzc3dvcmQ/JyApICk7CgoJCQkvKiogVGhpcyBmaWx0ZXIgaXMgZG9jdW1lbnRlZCBpbiB3cC1sb2dpbi5waHAgKi8KCQkJZWNobyBhcHBseV9maWx0ZXJzKCAnbG9zdF9wYXNzd29yZF9odG1sX2xpbmsnLCAkaHRtbF9saW5rICk7CgoJCQk/PgoJCTwvcD4KCQk8P3BocAoKCQlsb2dpbl9mb290ZXIoICd1c2VyX2xvZ2luJyApOwoJCWJyZWFrOwoKCWNhc2UgJ2NoZWNrZW1haWwnOgoJCSRyZWRpcmVjdF90byA9IGFkbWluX3VybCgpOwoJCSRlcnJvcnMgICAgICA9IG5ldyBXUF9FcnJvcigpOwoKCQlpZiAoICdjb25maXJtJyA9PT0gJF9HRVRbJ2NoZWNrZW1haWwnXSApIHsKCQkJJGVycm9ycy0+YWRkKAoJCQkJJ2NvbmZpcm0nLAoJCQkJc3ByaW50ZigKCQkJCQkvKiB0cmFuc2xhdG9yczogJXM6IExpbmsgdG8gdGhlIGxvZ2luIHBhZ2UuICovCgkJCQkJX18oICdDaGVjayB5b3VyIGVtYWlsIGZvciB0aGUgY29uZmlybWF0aW9uIGxpbmssIHRoZW4gdmlzaXQgdGhlIDxhIGhyZWY9IiVzIj5sb2dpbiBwYWdlPC9hPi4nICksCgkJCQkJZXNjX3VybCggd3BfbG9naW5fdXJsKCkgKQoJCQkJKSwKCQkJCSdtZXNzYWdlJwoJCQkpOwoJCX0gZWxzZWlmICggJ3JlZ2lzdGVyZWQnID09PSAkX0dFVFsnY2hlY2tlbWFpbCddICkgewoJCQkkZXJyb3JzLT5hZGQoCgkJCQkncmVnaXN0ZXJlZCcsCgkJCQlzcHJpbnRmKAoJCQkJCS8qIHRyYW5zbGF0b3JzOiAlczogTGluayB0byB0aGUgbG9naW4gcGFnZS4gKi8KCQkJCQlfXyggJ1JlZ2lzdHJhdGlvbiBjb21wbGV0ZS4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwsIHRoZW4gdmlzaXQgdGhlIDxhIGhyZWY9IiVzIj5sb2dpbiBwYWdlPC9hPi4nICksCgkJCQkJZXNjX3VybCggd3BfbG9naW5fdXJsKCkgKQoJCQkJKSwKCQkJCSdtZXNzYWdlJwoJCQkpOwoJCX0KCgkJLyoqIFRoaXMgYWN0aW9uIGlzIGRvY3VtZW50ZWQgaW4gd3AtbG9naW4ucGhwICovCgkJJGVycm9ycyA9IGFwcGx5X2ZpbHRlcnMoICd3cF9sb2dpbl9lcnJvcnMnLCAkZXJyb3JzLCAkcmVkaXJlY3RfdG8gKTsKCgkJbG9naW5faGVhZGVyKCBfXyggJ0NoZWNrIHlvdXIgZW1haWwnICksICcnLCAkZXJyb3JzICk7CgkJbG9naW5fZm9vdGVyKCk7CgkJYnJlYWs7CgoJY2FzZSAnY29uZmlybWFjdGlvbic6CgkJaWYgKCAhIGlzc2V0KCAkX0dFVFsncmVxdWVzdF9pZCddICkgKSB7CgkJCXdwX2RpZSggX18oICdNaXNzaW5nIHJlcXVlc3QgSUQuJyApICk7CgkJfQoKCQlpZiAoICEgaXNzZXQoICRfR0VUWydjb25maXJtX2tleSddICkgKSB7CgkJCXdwX2RpZSggX18oICdNaXNzaW5nIGNvbmZpcm0ga2V5LicgKSApOwoJCX0KCgkJJHJlcXVlc3RfaWQgPSAoaW50KSAkX0dFVFsncmVxdWVzdF9pZCddOwoJCSRrZXkgICAgICAgID0gc2FuaXRpemVfdGV4dF9maWVsZCggd3BfdW5zbGFzaCggJF9HRVRbJ2NvbmZpcm1fa2V5J10gKSApOwoJCSRyZXN1bHQgICAgID0gd3BfdmFsaWRhdGVfdXNlcl9yZXF1ZXN0X2tleSggJHJlcXVlc3RfaWQsICRrZXkgKTsKCgkJaWYgKCBpc193cF9lcnJvciggJHJlc3VsdCApICkgewoJCQl3cF9kaWUoICRyZXN1bHQgKTsKCQl9CgoJCS8qKgoJCSAqIEZpcmVzIGFuIGFjdGlvbiBob29rIHdoZW4gdGhlIGFjY291bnQgYWN0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZCBieSB0aGUgdXNlci4KCQkgKgoJCSAqIFVzaW5nIHRoaXMgeW91IGNhbiBhc3N1bWUgdGhlIHVzZXIgaGFzIGFncmVlZCB0byBwZXJmb3JtIHRoZSBhY3Rpb24gYnkKCQkgKiBjbGlja2luZyBvbiB0aGUgbGluayBpbiB0aGUgY29uZmlybWF0aW9uIGVtYWlsLgoJCSAqCgkJICogQWZ0ZXIgZmlyaW5nIHRoaXMgYWN0aW9uIGhvb2sgdGhlIHBhZ2Ugd2lsbCByZWRpcmVjdCB0byB3cC1sb2dpbiBhIGNhbGxiYWNrCgkJICogcmVkaXJlY3RzIG9yIGV4aXRzIGZpcnN0LgoJCSAqCgkJICogQHNpbmNlIDQuOS42CgkJICoKCQkgKiBAcGFyYW0gaW50ICRyZXF1ZXN0X2lkIFJlcXVlc3QgSUQuCgkJICovCgkJZG9fYWN0aW9uKCAndXNlcl9yZXF1ZXN0X2FjdGlvbl9jb25maXJtZWQnLCAkcmVxdWVzdF9pZCApOwoKCQkkbWVzc2FnZSA9IF93cF9wcml2YWN5X2FjY291bnRfcmVxdWVzdF9jb25maXJtZWRfbWVzc2FnZSggJHJlcXVlc3RfaWQgKTsKCgkJbG9naW5faGVhZGVyKCBfXyggJ1VzZXIgYWN0aW9uIGNvbmZpcm1lZC4nICksICRtZXNzYWdlICk7CgkJbG9naW5fZm9vdGVyKCk7CgkJZXhpdDsKCgljYXNlICdsb2dpbic6CglkZWZhdWx0OgoJCSRzZWN1cmVfY29va2llICAgPSAnJzsKCQkkY3VzdG9taXplX2xvZ2luID0gaXNzZXQoICRfUkVRVUVTVFsnY3VzdG9taXplLWxvZ2luJ10gKTsKCgkJaWYgKCAkY3VzdG9taXplX2xvZ2luICkgewoJCQl3cF9lbnF1ZXVlX3NjcmlwdCggJ2N1c3RvbWl6ZS1iYXNlJyApOwoJCX0KCgkJLy8gSWYgdGhlIHVzZXIgd2FudHMgU1NMIGJ1dCB0aGUgc2Vzc2lvbiBpcyBub3QgU1NMLCBmb3JjZSBhIHNlY3VyZSBjb29raWUuCgkJaWYgKCAhIGVtcHR5KCAkX1BPU1RbJ2xvZyddICkgJiYgISBmb3JjZV9zc2xfYWRtaW4oKSApIHsKCQkJJHVzZXJfbmFtZSA9IHNhbml0aXplX3VzZXIoIHdwX3Vuc2xhc2goICRfUE9TVFsnbG9nJ10gKSApOwoJCQkkdXNlciAgICAgID0gZ2V0X3VzZXJfYnkoICdsb2dpbicsICR1c2VyX25hbWUgKTsKCgkJCWlmICggISAkdXNlciAmJiBzdHJwb3MoICR1c2VyX25hbWUsICdAJyApICkgewoJCQkJJHVzZXIgPSBnZXRfdXNlcl9ieSggJ2VtYWlsJywgJHVzZXJfbmFtZSApOwoJCQl9CgoJCQlpZiAoICR1c2VyICkgewoJCQkJaWYgKCBnZXRfdXNlcl9vcHRpb24oICd1c2Vfc3NsJywgJHVzZXItPklEICkgKSB7CgkJCQkJJHNlY3VyZV9jb29raWUgPSB0cnVlOwoJCQkJCWZvcmNlX3NzbF9hZG1pbiggdHJ1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoIGlzc2V0KCAkX1JFUVVFU1RbJ3JlZGlyZWN0X3RvJ10gKSAmJiBpc19zdHJpbmcoICRfUkVRVUVTVFsncmVkaXJlY3RfdG8nXSApICkgewoJCQkkcmVkaXJlY3RfdG8gPSAkX1JFUVVFU1RbJ3JlZGlyZWN0X3RvJ107CgkJCS8vIFJlZGlyZWN0IHRvIEhUVFBTIGlmIHVzZXIgd2FudHMgU1NMLgoJCQlpZiAoICRzZWN1cmVfY29va2llICYmIHN0cl9jb250YWlucyggJHJlZGlyZWN0X3RvLCAnd3AtYWRtaW4nICkgKSB7CgkJCQkkcmVkaXJlY3RfdG8gPSBwcmVnX3JlcGxhY2UoICd8Xmh0dHA6Ly98JywgJ2h0dHBzOi8vJywgJHJlZGlyZWN0X3RvICk7CgkJCX0KCQl9IGVsc2UgewoJCQkkcmVkaXJlY3RfdG8gPSBhZG1pbl91cmwoKTsKCQl9CgoJCSRyZWF1dGggPSAhIGVtcHR5KCAkX1JFUVVFU1RbJ3JlYXV0aCddICk7CgoJCSR1c2VyID0gd3Bfc2lnbm9uKCBhcnJheSgpLCAkc2VjdXJlX2Nvb2tpZSApOwoKCQlpZiAoIGVtcHR5KCAkX0NPT0tJRVsgTE9HR0VEX0lOX0NPT0tJRSBdICkgKSB7CgkJCWlmICggaGVhZGVyc19zZW50KCkgKSB7CgkJCQkkdXNlciA9IG5ldyBXUF9FcnJvcigKCQkJCQkndGVzdF9jb29raWUnLAoJCQkJCXNwcmludGYoCgkJCQkJCS8qIHRyYW5zbGF0b3JzOiAxOiBCcm93c2VyIGNvb2tpZSBkb2N1bWVudGF0aW9uIFVSTCwgMjogU3VwcG9ydCBmb3J1bXMgVVJMLiAqLwoJCQkJCQlfXyggJzxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+IENvb2tpZXMgYXJlIGJsb2NrZWQgZHVlIHRvIHVuZXhwZWN0ZWQgb3V0cHV0LiBGb3IgaGVscCwgcGxlYXNlIHNlZSA8YSBocmVmPSIlMSRzIj50aGlzIGRvY3VtZW50YXRpb248L2E+IG9yIHRyeSB0aGUgPGEgaHJlZj0iJTIkcyI+c3VwcG9ydCBmb3J1bXM8L2E+LicgKSwKCQkJCQkJX18oICdodHRwczovL2RldmVsb3Blci53b3JkcHJlc3Mub3JnL2FkdmFuY2VkLWFkbWluaXN0cmF0aW9uL3dvcmRwcmVzcy9jb29raWVzLycgKSwKCQkJCQkJX18oICdodHRwczovL3dvcmRwcmVzcy5vcmcvc3VwcG9ydC9mb3J1bXMvJyApCgkJCQkJKQoJCQkJKTsKCQkJfSBlbHNlaWYgKCBpc3NldCggJF9QT1NUWyd0ZXN0Y29va2llJ10gKSAmJiBlbXB0eSggJF9DT09LSUVbIFRFU1RfQ09PS0lFIF0gKSApIHsKCQkJCS8vIElmIGNvb2tpZXMgYXJlIGRpc2FibGVkLCB0aGUgdXNlciBjYW4ndCBsb2cgaW4gZXZlbiB3aXRoIGEgdmFsaWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgoJCQkJJHVzZXIgPSBuZXcgV1BfRXJyb3IoCgkJCQkJJ3Rlc3RfY29va2llJywKCQkJCQlzcHJpbnRmKAoJCQkJCQkvKiB0cmFuc2xhdG9yczogJXM6IEJyb3dzZXIgY29va2llIGRvY3VtZW50YXRpb24gVVJMLiAqLwoJCQkJCQlfXyggJzxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+IENvb2tpZXMgYXJlIGJsb2NrZWQgb3Igbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuIFlvdSBtdXN0IDxhIGhyZWY9IiVzIj5lbmFibGUgY29va2llczwvYT4gdG8gdXNlIFdvcmRQcmVzcy4nICksCgkJCQkJCV9fKCAnaHR0cHM6Ly9kZXZlbG9wZXIud29yZHByZXNzLm9yZy9hZHZhbmNlZC1hZG1pbmlzdHJhdGlvbi93b3JkcHJlc3MvY29va2llcy8jZW5hYmxlLWNvb2tpZXMtaW4teW91ci1icm93c2VyJyApCgkJCQkJKQoJCQkJKTsKCQkJfQoJCX0KCgkJJHJlcXVlc3RlZF9yZWRpcmVjdF90byA9IGlzc2V0KCAkX1JFUVVFU1RbJ3JlZGlyZWN0X3RvJ10gKSAmJiBpc19zdHJpbmcoICRfUkVRVUVTVFsncmVkaXJlY3RfdG8nXSApID8gJF9SRVFVRVNUWydyZWRpcmVjdF90byddIDogJyc7CgoJCS8qKgoJCSAqIEZpbHRlcnMgdGhlIGxvZ2luIHJlZGlyZWN0IFVSTC4KCQkgKgoJCSAqIEBzaW5jZSAzLjAuMAoJCSAqCgkJICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgJHJlZGlyZWN0X3RvICAgICAgICAgICBUaGUgcmVkaXJlY3QgZGVzdGluYXRpb24gVVJMLgoJCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICRyZXF1ZXN0ZWRfcmVkaXJlY3RfdG8gVGhlIHJlcXVlc3RlZCByZWRpcmVjdCBkZXN0aW5hdGlvbiBVUkwgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgoJCSAqIEBwYXJhbSBXUF9Vc2VyfFdQX0Vycm9yICR1c2VyICAgICAgICAgICAgICAgICAgV1BfVXNlciBvYmplY3QgaWYgbG9naW4gd2FzIHN1Y2Nlc3NmdWwsIFdQX0Vycm9yIG9iamVjdCBvdGhlcndpc2UuCgkJICovCgkJJHJlZGlyZWN0X3RvID0gYXBwbHlfZmlsdGVycyggJ2xvZ2luX3JlZGlyZWN0JywgJHJlZGlyZWN0X3RvLCAkcmVxdWVzdGVkX3JlZGlyZWN0X3RvLCAkdXNlciApOwoKCQlpZiAoICEgaXNfd3BfZXJyb3IoICR1c2VyICkgJiYgISAkcmVhdXRoICkgewoJCQlpZiAoICRpbnRlcmltX2xvZ2luICkgewoJCQkJJG1lc3NhZ2UgICAgICAgPSAnPHAgY2xhc3M9Im1lc3NhZ2UiPicgLiBfXyggJ1lvdSBoYXZlIGxvZ2dlZCBpbiBzdWNjZXNzZnVsbHkuJyApIC4gJzwvcD4nOwoJCQkJJGludGVyaW1fbG9naW4gPSAnc3VjY2Vzcyc7CgkJCQlsb2dpbl9oZWFkZXIoICcnLCAkbWVzc2FnZSApOwoKCQkJCT8+CgkJCQk8L2Rpdj4KCQkJCTw/cGhwCgoJCQkJLyoqIFRoaXMgYWN0aW9uIGlzIGRvY3VtZW50ZWQgaW4gd3AtbG9naW4ucGhwICovCgkJCQlkb19hY3Rpb24oICdsb2dpbl9mb290ZXInICk7CgoJCQkJaWYgKCAkY3VzdG9taXplX2xvZ2luICkgewoJCQkJCW9iX3N0YXJ0KCk7CgkJCQkJPz4KCQkJCQk8c2NyaXB0PnNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7IG5ldyB3cC5jdXN0b21pemUuTWVzc2VuZ2VyKHsgdXJsOiAnPD9waHAgZWNobyB3cF9jdXN0b21pemVfdXJsKCk7ID8+JywgY2hhbm5lbDogJ2xvZ2luJyB9KS5zZW5kKCdsb2dpbicpIH0sIDEwMDAgKTs8L3NjcmlwdD4KCQkJCQk8P3BocAoJCQkJCXdwX3ByaW50X2lubGluZV9zY3JpcHRfdGFnKCB3cF9yZW1vdmVfc3Vycm91bmRpbmdfZW1wdHlfc2NyaXB0X3RhZ3MoIG9iX2dldF9jbGVhbigpICkgKTsKCQkJCX0KCgkJCQk/PgoJCQkJPC9ib2R5PjwvaHRtbD4KCQkJCTw/cGhwCgoJCQkJZXhpdDsKCQkJfQoKCQkJLy8gQ2hlY2sgaWYgaXQgaXMgdGltZSB0byBhZGQgYSByZWRpcmVjdCB0byB0aGUgYWRtaW4gZW1haWwgY29uZmlybWF0aW9uIHNjcmVlbi4KCQkJaWYgKCAkdXNlciBpbnN0YW5jZW9mIFdQX1VzZXIgJiYgJHVzZXItPmV4aXN0cygpICYmICR1c2VyLT5oYXNfY2FwKCAnbWFuYWdlX29wdGlvbnMnICkgKSB7CgkJCQkkYWRtaW5fZW1haWxfbGlmZXNwYW4gPSAoaW50KSBnZXRfb3B0aW9uKCAnYWRtaW5fZW1haWxfbGlmZXNwYW4nICk7CgoJCQkJLyoKCQkJCSAqIElmIGAwYCAob3IgYW55dGhpbmcgImZhbHNleSIgYXMgaXQgaXMgY2FzdCB0byBpbnQpIGlzIHJldHVybmVkLCB0aGUgdXNlciB3aWxsIG5vdCBiZSByZWRpcmVjdGVkCgkJCQkgKiB0byB0aGUgYWRtaW4gZW1haWwgY29uZmlybWF0aW9uIHNjcmVlbi4KCQkJCSAqLwoJCQkJLyoqIFRoaXMgZmlsdGVyIGlzIGRvY3VtZW50ZWQgaW4gd3AtbG9naW4ucGhwICovCgkJCQkkYWRtaW5fZW1haWxfY2hlY2tfaW50ZXJ2YWwgPSAoaW50KSBhcHBseV9maWx0ZXJzKCAnYWRtaW5fZW1haWxfY2hlY2tfaW50ZXJ2YWwnLCA2ICogTU9OVEhfSU5fU0VDT05EUyApOwoKCQkJCWlmICggJGFkbWluX2VtYWlsX2NoZWNrX2ludGVydmFsID4gMCAmJiB0aW1lKCkgPiAkYWRtaW5fZW1haWxfbGlmZXNwYW4gKSB7CgkJCQkJJHJlZGlyZWN0X3RvID0gYWRkX3F1ZXJ5X2FyZygKCQkJCQkJYXJyYXkoCgkJCQkJCQknYWN0aW9uJyAgPT4gJ2NvbmZpcm1fYWRtaW5fZW1haWwnLAoJCQkJCQkJJ3dwX2xhbmcnID0+IGdldF91c2VyX2xvY2FsZSggJHVzZXIgKSwKCQkJCQkJKSwKCQkJCQkJd3BfbG9naW5fdXJsKCAkcmVkaXJlY3RfdG8gKQoJCQkJCSk7CgkJCQl9CgkJCX0KCgkJCWlmICggKCBlbXB0eSggJHJlZGlyZWN0X3RvICkgfHwgJ3dwLWFkbWluLycgPT09ICRyZWRpcmVjdF90byB8fCBhZG1pbl91cmwoKSA9PT0gJHJlZGlyZWN0X3RvICkgKSB7CgkJCQkvLyBJZiB0aGUgdXNlciBkb2Vzbid0IGJlbG9uZyB0byBhIGJsb2csIHNlbmQgdGhlbSB0byB1c2VyIGFkbWluLiBJZiB0aGUgdXNlciBjYW4ndCBlZGl0IHBvc3RzLCBzZW5kIHRoZW0gdG8gdGhlaXIgcHJvZmlsZS4KCQkJCWlmICggaXNfbXVsdGlzaXRlKCkgJiYgISBnZXRfYWN0aXZlX2Jsb2dfZm9yX3VzZXIoICR1c2VyLT5JRCApICYmICEgaXNfc3VwZXJfYWRtaW4oICR1c2VyLT5JRCApICkgewoJCQkJCSRyZWRpcmVjdF90byA9IHVzZXJfYWRtaW5fdXJsKCk7CgkJCQl9IGVsc2VpZiAoIGlzX211bHRpc2l0ZSgpICYmICEgJHVzZXItPmhhc19jYXAoICdyZWFkJyApICkgewoJCQkJCSRyZWRpcmVjdF90byA9IGdldF9kYXNoYm9hcmRfdXJsKCAkdXNlci0+SUQgKTsKCQkJCX0gZWxzZWlmICggISAkdXNlci0+aGFzX2NhcCggJ2VkaXRfcG9zdHMnICkgKSB7CgkJCQkJJHJlZGlyZWN0X3RvID0gJHVzZXItPmhhc19jYXAoICdyZWFkJyApID8gYWRtaW5fdXJsKCAncHJvZmlsZS5waHAnICkgOiBob21lX3VybCgpOwoJCQkJfQoKCQkJCXdwX3JlZGlyZWN0KCAkcmVkaXJlY3RfdG8gKTsKCQkJCWV4aXQ7CgkJCX0KCgkJCXdwX3NhZmVfcmVkaXJlY3QoICRyZWRpcmVjdF90byApOwoJCQlleGl0OwoJCX0KCgkJJGVycm9ycyA9ICR1c2VyOwoJCS8vIENsZWFyIGVycm9ycyBpZiBsb2dnZWRvdXQgaXMgc2V0LgoJCWlmICggISBlbXB0eSggJF9HRVRbJ2xvZ2dlZG91dCddICkgfHwgJHJlYXV0aCApIHsKCQkJJGVycm9ycyA9IG5ldyBXUF9FcnJvcigpOwoJCX0KCgkJaWYgKCBlbXB0eSggJF9QT1NUICkgJiYgJGVycm9ycy0+Z2V0X2Vycm9yX2NvZGVzKCkgPT09IGFycmF5KCAnZW1wdHlfdXNlcm5hbWUnLCAnZW1wdHlfcGFzc3dvcmQnICkgKSB7CgkJCSRlcnJvcnMgPSBuZXcgV1BfRXJyb3IoICcnLCAnJyApOwoJCX0KCgkJaWYgKCAkaW50ZXJpbV9sb2dpbiApIHsKCQkJaWYgKCAhICRlcnJvcnMtPmhhc19lcnJvcnMoKSApIHsKCQkJCSRlcnJvcnMtPmFkZCggJ2V4cGlyZWQnLCBfXyggJ1lvdXIgc2Vzc2lvbiBoYXMgZXhwaXJlZC4gUGxlYXNlIGxvZyBpbiB0byBjb250aW51ZSB3aGVyZSB5b3UgbGVmdCBvZmYuJyApLCAnbWVzc2FnZScgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIFNvbWUgcGFydHMgb2YgdGhpcyBzY3JpcHQgdXNlIHRoZSBtYWluIGxvZ2luIGZvcm0gdG8gZGlzcGxheSBhIG1lc3NhZ2UuCgkJCWlmICggaXNzZXQoICRfR0VUWydsb2dnZWRvdXQnXSApICYmICRfR0VUWydsb2dnZWRvdXQnXSApIHsKCQkJCSRlcnJvcnMtPmFkZCggJ2xvZ2dlZG91dCcsIF9fKCAnWW91IGFyZSBub3cgbG9nZ2VkIG91dC4nICksICdtZXNzYWdlJyApOwoJCQl9IGVsc2VpZiAoIGlzc2V0KCAkX0dFVFsncmVnaXN0cmF0aW9uJ10gKSAmJiAnZGlzYWJsZWQnID09PSAkX0dFVFsncmVnaXN0cmF0aW9uJ10gKSB7CgkJCQkkZXJyb3JzLT5hZGQoICdyZWdpc3RlcmRpc2FibGVkJywgX18oICc8c3Ryb25nPkVycm9yOjwvc3Ryb25nPiBVc2VyIHJlZ2lzdHJhdGlvbiBpcyBjdXJyZW50bHkgbm90IGFsbG93ZWQuJyApICk7CgkJCX0gZWxzZWlmICggc3RyX2NvbnRhaW5zKCAkcmVkaXJlY3RfdG8sICdhYm91dC5waHA/dXBkYXRlZCcgKSApIHsKCQkJCSRlcnJvcnMtPmFkZCggJ3VwZGF0ZWQnLCBfXyggJzxzdHJvbmc+WW91IGhhdmUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgV29yZFByZXNzITwvc3Ryb25nPiBQbGVhc2UgbG9nIGJhY2sgaW4gdG8gc2VlIHdoYXQmIzgyMTc7cyBuZXcuJyApLCAnbWVzc2FnZScgKTsKCQkJfSBlbHNlaWYgKCBXUF9SZWNvdmVyeV9Nb2RlX0xpbmtfU2VydmljZTo6TE9HSU5fQUNUSU9OX0VOVEVSRUQgPT09ICRhY3Rpb24gKSB7CgkJCQkkZXJyb3JzLT5hZGQoICdlbnRlcl9yZWNvdmVyeV9tb2RlJywgX18oICdSZWNvdmVyeSBNb2RlIEluaXRpYWxpemVkLiBQbGVhc2UgbG9nIGluIHRvIGNvbnRpbnVlLicgKSwgJ21lc3NhZ2UnICk7CgkJCX0gZWxzZWlmICggaXNzZXQoICRfR0VUWydyZWRpcmVjdF90byddICkgJiYgaXNfc3RyaW5nKCAkX0dFVFsncmVkaXJlY3RfdG8nXSApCgkJCQkmJiBzdHJfY29udGFpbnMoICRfR0VUWydyZWRpcmVjdF90byddLCAnd3AtYWRtaW4vYXV0aG9yaXplLWFwcGxpY2F0aW9uLnBocCcgKQoJCQkpIHsKCQkJCSRxdWVyeV9jb21wb25lbnQgPSB3cF9wYXJzZV91cmwoICRfR0VUWydyZWRpcmVjdF90byddLCBQSFBfVVJMX1FVRVJZICk7CgkJCQkkcXVlcnkgICAgICAgICAgID0gYXJyYXkoKTsKCQkJCWlmICggJHF1ZXJ5X2NvbXBvbmVudCApIHsKCQkJCQlwYXJzZV9zdHIoICRxdWVyeV9jb21wb25lbnQsICRxdWVyeSApOwoJCQkJfQoKCQkJCWlmICggISBlbXB0eSggJHF1ZXJ5WydhcHBfbmFtZSddICkgKSB7CgkJCQkJLyogdHJhbnNsYXRvcnM6IDE6IFdlYnNpdGUgbmFtZSwgMjogQXBwbGljYXRpb24gbmFtZS4gKi8KCQkJCQkkbWVzc2FnZSA9IHNwcmludGYoIF9fKCAnUGxlYXNlIGxvZyBpbiB0byAlMSRzIHRvIGF1dGhvcml6ZSAlMiRzIHRvIGNvbm5lY3QgdG8geW91ciBhY2NvdW50LicgKSwgZ2V0X2Jsb2dpbmZvKCAnbmFtZScsICdkaXNwbGF5JyApLCAnPHN0cm9uZz4nIC4gZXNjX2h0bWwoICRxdWVyeVsnYXBwX25hbWUnXSApIC4gJzwvc3Ryb25nPicgKTsKCQkJCX0gZWxzZSB7CgkJCQkJLyogdHJhbnNsYXRvcnM6ICVzOiBXZWJzaXRlIG5hbWUuICovCgkJCQkJJG1lc3NhZ2UgPSBzcHJpbnRmKCBfXyggJ1BsZWFzZSBsb2cgaW4gdG8gJXMgdG8gcHJvY2VlZCB3aXRoIGF1dGhvcml6YXRpb24uJyApLCBnZXRfYmxvZ2luZm8oICduYW1lJywgJ2Rpc3BsYXknICkgKTsKCQkJCX0KCgkJCQkkZXJyb3JzLT5hZGQoICdhdXRob3JpemVfYXBwbGljYXRpb24nLCAkbWVzc2FnZSwgJ21lc3NhZ2UnICk7CgkJCX0KCQl9CgoJCS8qKgoJCSAqIEZpbHRlcnMgdGhlIGxvZ2luIHBhZ2UgZXJyb3JzLgoJCSAqCgkJICogQHNpbmNlIDMuNi4wCgkJICoKCQkgKiBAcGFyYW0gV1BfRXJyb3IgJGVycm9ycyAgICAgIFdQIEVycm9yIG9iamVjdC4KCQkgKiBAcGFyYW0gc3RyaW5nICAgJHJlZGlyZWN0X3RvIFJlZGlyZWN0IGRlc3RpbmF0aW9uIFVSTC4KCQkgKi8KCQkkZXJyb3JzID0gYXBwbHlfZmlsdGVycyggJ3dwX2xvZ2luX2Vycm9ycycsICRlcnJvcnMsICRyZWRpcmVjdF90byApOwoKCQkvLyBDbGVhciBhbnkgc3RhbGUgY29va2llcy4KCQlpZiAoICRyZWF1dGggKSB7CgkJCXdwX2NsZWFyX2F1dGhfY29va2llKCk7CgkJfQoKCQkvLyBPYnRhaW4gdXNlciBmcm9tIHBhc3N3b3JkIHJlc2V0IGNvb2tpZSBmbG93IGJlZm9yZSBjbGVhcmluZyB0aGUgY29va2llLgoJCSRycF9jb29raWUgPSAnd3AtcmVzZXRwYXNzLScgLiBDT09LSUVIQVNIOwoJCWlmICggaXNzZXQoICRfQ09PS0lFWyAkcnBfY29va2llIF0gKSAmJiBpc19zdHJpbmcoICRfQ09PS0lFWyAkcnBfY29va2llIF0gKSApIHsKCQkJJHVzZXJfbG9naW4gICAgICA9IHNhbml0aXplX3VzZXIoIHN0cnRvayggd3BfdW5zbGFzaCggJF9DT09LSUVbICRycF9jb29raWUgXSApLCAnOicgKSApOwoJCQlsaXN0KCAkcnBfcGF0aCApID0gZXhwbG9kZSggJz8nLCB3cF91bnNsYXNoKCAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSApICk7CgkJCXNldGNvb2tpZSggJHJwX2Nvb2tpZSwgJyAnLCB0aW1lKCkgLSBZRUFSX0lOX1NFQ09ORFMsICRycF9wYXRoLCBDT09LSUVfRE9NQUlOLCBpc19zc2woKSwgdHJ1ZSApOwoJCX0KCgkJbG9naW5faGVhZGVyKCBfXyggJ0xvZyBJbicgKSwgJycsICRlcnJvcnMgKTsKCgkJaWYgKCBpc3NldCggJF9QT1NUWydsb2cnXSApICkgewoJCQkkdXNlcl9sb2dpbiA9ICggJ2luY29ycmVjdF9wYXNzd29yZCcgPT09ICRlcnJvcnMtPmdldF9lcnJvcl9jb2RlKCkgfHwgJ2VtcHR5X3Bhc3N3b3JkJyA9PT0gJGVycm9ycy0+Z2V0X2Vycm9yX2NvZGUoKSApID8gd3BfdW5zbGFzaCggJF9QT1NUWydsb2cnXSApIDogJyc7CgkJfQoKCQkkcmVtZW1iZXJtZSA9ICEgZW1wdHkoICRfUE9TVFsncmVtZW1iZXJtZSddICk7CgoJCSRhcmlhX2Rlc2NyaWJlZGJ5ID0gJyc7CgkJJGhhc19lcnJvcnMgICAgICAgPSAkZXJyb3JzLT5oYXNfZXJyb3JzKCk7CgoJCWlmICggJGhhc19lcnJvcnMgKSB7CgkJCSRhcmlhX2Rlc2NyaWJlZGJ5ID0gJyBhcmlhLWRlc2NyaWJlZGJ5PSJsb2dpbl9lcnJvciInOwoJCX0KCgkJaWYgKCAkaGFzX2Vycm9ycyAmJiAnbWVzc2FnZScgPT09ICRlcnJvcnMtPmdldF9lcnJvcl9kYXRhKCkgKSB7CgkJCSRhcmlhX2Rlc2NyaWJlZGJ5ID0gJyBhcmlhLWRlc2NyaWJlZGJ5PSJsb2dpbi1tZXNzYWdlIic7CgkJfQoKCQl3cF9lbnF1ZXVlX3NjcmlwdCggJ3VzZXItcHJvZmlsZScgKTsKCQl3cF9lbnF1ZXVlX3NjcmlwdCggJ3dwLXRvb2x0aXAnICk7CgkJPz4KCgkJPGZvcm0gbmFtZT0ibG9naW5mb3JtIiBpZD0ibG9naW5mb3JtIiBhY3Rpb249Ijw/cGhwIGVjaG8gZXNjX3VybCggc2l0ZV91cmwoICd3cC1sb2dpbi5waHAnLCAnbG9naW5fcG9zdCcgKSApOyA/PiIgbWV0aG9kPSJwb3N0Ij4KCQkJPHA+CgkJCQk8bGFiZWwgZm9yPSJ1c2VyX2xvZ2luIj48P3BocCBfZSggJ1VzZXJuYW1lIG9yIEVtYWlsIEFkZHJlc3MnICk7ID8+PC9sYWJlbD4KCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsb2ciIGlkPSJ1c2VyX2xvZ2luIjw/cGhwIGVjaG8gJGFyaWFfZGVzY3JpYmVkYnk7ID8+IGNsYXNzPSJpbnB1dCBsdHIiIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCAkdXNlcl9sb2dpbiApOyA/PiIgc2l6ZT0iMjAiIGF1dG9jYXBpdGFsaXplPSJvZmYiIGF1dG9jb21wbGV0ZT0idXNlcm5hbWUiIHJlcXVpcmVkPSJyZXF1aXJlZCIgLz4KCQkJPC9wPgoKCQkJPGRpdiBjbGFzcz0idXNlci1wYXNzLXdyYXAiPgoJCQkJPGxhYmVsIGZvcj0idXNlcl9wYXNzIj48P3BocCBfZSggJ1Bhc3N3b3JkJyApOyA/PjwvbGFiZWw+CgkJCQk8ZGl2IGNsYXNzPSJ3cC1wd2QiPgoJCQkJCTxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icHdkIiBpZD0idXNlcl9wYXNzIjw/cGhwIGVjaG8gJGFyaWFfZGVzY3JpYmVkYnk7ID8+IGNsYXNzPSJpbnB1dCBwYXNzd29yZC1pbnB1dCBsdHIiIHZhbHVlPSIiIHNpemU9IjIwIiBhdXRvY29tcGxldGU9ImN1cnJlbnQtcGFzc3dvcmQiIHNwZWxsY2hlY2s9ImZhbHNlIiByZXF1aXJlZD0icmVxdWlyZWQiIC8+CgkJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidXR0b24gYnV0dG9uLXNlY29uZGFyeSB3cC1oaWRlLXB3IGhpZGUtaWYtbm8tanMiIGRhdGEtdG9nZ2xlPSIwIiBhcmlhLWxhYmVsPSI8P3BocCBlc2NfYXR0cl9lKCAnU2hvdyBwYXNzd29yZCcgKTsgPz4iPgoJCQkJCQk8c3BhbiBjbGFzcz0iZGFzaGljb25zIGRhc2hpY29ucy12aXNpYmlsaXR5IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgoJCQkJCTwvYnV0dG9uPgoJCQkJPC9kaXY+CgkJCTwvZGl2PgoJCQk8P3BocAoKCQkJLyoqCgkJCSAqIEZpcmVzIGZvbGxvd2luZyB0aGUgJ1Bhc3N3b3JkJyBmaWVsZCBpbiB0aGUgbG9naW4gZm9ybS4KCQkJICoKCQkJICogQHNpbmNlIDIuMS4wCgkJCSAqLwoJCQlkb19hY3Rpb24oICdsb2dpbl9mb3JtJyApOwoKCQkJPz4KCQkJPD9waHAKCQkJLyoqCgkJCSAqIEZpbHRlcnMgdGhlIGhlbHAgdGV4dCBzaG93biBpbiB0aGUgIlJlbWVtYmVyIE1lIiB0b29sdGlwIG9uIHRoZSBsb2dpbiBmb3JtLgoJCQkgKgoJCQkgKiBSZXR1cm5pbmcgYW4gZW1wdHkgc3RyaW5nIHJlbW92ZXMgdGhlIHRvb2x0aXAgdG9nZ2xlIGZyb20gdGhlIGZvcm0uCgkJCSAqCgkJCSAqIEBzaW5jZSA3LjEuMAoJCQkgKgoJCQkgKiBAcGFyYW0gc3RyaW5nICRyZW1lbWJlcm1lX2hlbHBfdGV4dCBUaGUgdG9vbHRpcCBoZWxwIHRleHQuCgkJCSAqLwoJCQkkcmVtZW1iZXJtZV9oZWxwX3RleHQgPSBhcHBseV9maWx0ZXJzKAoJCQkJJ2xvZ2luX3JlbWVtYmVyX21lX2hlbHBfdGV4dCcsCgkJCQlfXyggJ1NlbGVjdGluZyAiUmVtZW1iZXIgTWUiIGluY3JlYXNlcyB0aGUgbGVuZ3RoIG9mIHRpbWUgdW50aWwgeW91JiM4MjE3O3JlIGFza2VkIHRvIGxvZyBpbiBhZ2FpbiBvbiB0aGlzIGRldmljZS4gVG8ga2VlcCB5b3VyIGFjY291bnQgc2VjdXJlLCB1c2UgdGhpcyBvcHRpb24gb25seSBvbiB5b3VyIHBlcnNvbmFsIGRldmljZXMuJyApCgkJCSk7CgkJCT8+CgkJCTxwIGNsYXNzPSJmb3JnZXRtZW5vdCI+CgkJCQk8aW5wdXQgbmFtZT0icmVtZW1iZXJtZSIgdHlwZT0iY2hlY2tib3giIGlkPSJyZW1lbWJlcm1lIiB2YWx1ZT0iZm9yZXZlciIgPD9waHAgY2hlY2tlZCggJHJlbWVtYmVybWUgKTsgPz4gLz4KCQkJCTxsYWJlbCBmb3I9InJlbWVtYmVybWUiPjw/cGhwIGVzY19odG1sX2UoICdSZW1lbWJlciBNZScgKTsgPz48L2xhYmVsPgoJCQkJPD9waHAKCQkJCWVjaG8gd3BfZ2V0X3RvZ2dsZXRpcCgKCQkJCQkkcmVtZW1iZXJtZV9oZWxwX3RleHQsCgkJCQkJYXJyYXkoCgkJCQkJCSdpZCcgICAgPT4gJ3JlbWVtYmVybWUtaGVscC10b2dnbGV0aXAnLAoJCQkJCQknbGFiZWwnID0+IF9fKCAnSGVscCcgKSwKCQkJCQkpCgkJCQkpOwoJCQkJPz4KCQkJPC9wPgoJCQk8cCBjbGFzcz0ic3VibWl0Ij4KCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9IndwLXN1Ym1pdCIgaWQ9IndwLXN1Ym1pdCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tcHJpbWFyeSBidXR0b24tbGFyZ2UiIHZhbHVlPSI8P3BocCBlc2NfYXR0cl9lKCAnTG9nIEluJyApOyA/PiIgLz4KCQkJCTw/cGhwCgoJCQkJaWYgKCAkaW50ZXJpbV9sb2dpbiApIHsKCQkJCQk/PgoJCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImludGVyaW0tbG9naW4iIHZhbHVlPSIxIiAvPgoJCQkJCTw/cGhwCgkJCQl9IGVsc2UgewoJCQkJCT8+CgkJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVkaXJlY3RfdG8iIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCAkcmVkaXJlY3RfdG8gKTsgPz4iIC8+CgkJCQkJPD9waHAKCQkJCX0KCgkJCQlpZiAoICRjdXN0b21pemVfbG9naW4gKSB7CgkJCQkJPz4KCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjdXN0b21pemUtbG9naW4iIHZhbHVlPSIxIiAvPgoJCQkJCTw/cGhwCgkJCQl9CgoJCQkJPz4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRlc3Rjb29raWUiIHZhbHVlPSIxIiAvPgoJCQk8L3A+CgkJPC9mb3JtPgoKCQk8P3BocAoKCQlpZiAoICEgJGludGVyaW1fbG9naW4gKSB7CgkJCT8+CgkJCTxwIGlkPSJuYXYiPgoJCQkJPD9waHAKCgkJCQlpZiAoIGdldF9vcHRpb24oICd1c2Vyc19jYW5fcmVnaXN0ZXInICkgKSB7CgkJCQkJJHJlZ2lzdHJhdGlvbl91cmwgPSBzcHJpbnRmKCAnPGEgY2xhc3M9IndwLWxvZ2luLXJlZ2lzdGVyIiBocmVmPSIlcyI+JXM8L2E+JywgZXNjX3VybCggd3BfcmVnaXN0cmF0aW9uX3VybCgpICksIF9fKCAnUmVnaXN0ZXInICkgKTsKCgkJCQkJLyoqIFRoaXMgZmlsdGVyIGlzIGRvY3VtZW50ZWQgaW4gd3AtaW5jbHVkZXMvZ2VuZXJhbC10ZW1wbGF0ZS5waHAgKi8KCQkJCQllY2hvIGFwcGx5X2ZpbHRlcnMoICdyZWdpc3RlcicsICRyZWdpc3RyYXRpb25fdXJsICk7CgoJCQkJCWVjaG8gZXNjX2h0bWwoICRsb2dpbl9saW5rX3NlcGFyYXRvciApOwoJCQkJfQoKCQkJCSRodG1sX2xpbmsgPSBzcHJpbnRmKCAnPGEgY2xhc3M9IndwLWxvZ2luLWxvc3QtcGFzc3dvcmQiIGhyZWY9IiVzIj4lczwvYT4nLCBlc2NfdXJsKCB3cF9sb3N0cGFzc3dvcmRfdXJsKCkgKSwgX18oICdMb3N0IHlvdXIgcGFzc3dvcmQ/JyApICk7CgoJCQkJLyoqCgkJCQkgKiBGaWx0ZXJzIHRoZSBsaW5rIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHJlc2V0IHRoZSBsb3N0IHBhc3N3b3JkLgoJCQkJICoKCQkJCSAqIEBzaW5jZSA2LjEuMAoJCQkJICoKCQkJCSAqIEBwYXJhbSBzdHJpbmcgJGh0bWxfbGluayBIVE1MIGxpbmsgdG8gdGhlIGxvc3QgcGFzc3dvcmQgZm9ybS4KCQkJCSAqLwoJCQkJZWNobyBhcHBseV9maWx0ZXJzKCAnbG9zdF9wYXNzd29yZF9odG1sX2xpbmsnLCAkaHRtbF9saW5rICk7CgoJCQkJPz4KCQkJPC9wPgoJCQk8P3BocAoJCX0KCgkJJGxvZ2luX3NjcmlwdCAgPSAnZnVuY3Rpb24gd3BfYXR0ZW1wdF9mb2N1cygpIHsnOwoJCSRsb2dpbl9zY3JpcHQgLj0gJ3NldFRpbWVvdXQoIGZ1bmN0aW9uKCkgeyc7CgkJJGxvZ2luX3NjcmlwdCAuPSAndHJ5IHsnOwoKCQlpZiAoICR1c2VyX2xvZ2luICkgewoJCQkkbG9naW5fc2NyaXB0IC49ICdkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICJ1c2VyX3Bhc3MiICk7IGQudmFsdWUgPSAiIjsnOwoJCX0gZWxzZSB7CgkJCSRsb2dpbl9zY3JpcHQgLj0gJ2QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggInVzZXJfbG9naW4iICk7JzsKCgkJCWlmICggJGVycm9ycy0+Z2V0X2Vycm9yX2NvZGUoKSA9PT0gJ2ludmFsaWRfdXNlcm5hbWUnICkgewoJCQkJJGxvZ2luX3NjcmlwdCAuPSAnZC52YWx1ZSA9ICIiOyc7CgkJCX0KCQl9CgoJCSRsb2dpbl9zY3JpcHQgLj0gJ2QuZm9jdXMoKTsgZC5zZWxlY3QoKTsnOwoJCSRsb2dpbl9zY3JpcHQgLj0gJ30gY2F0Y2goIGVyICkge30nOwoJCSRsb2dpbl9zY3JpcHQgLj0gJ30sIDIwMCk7JzsKCQkkbG9naW5fc2NyaXB0IC49ICJ9XG4iOyAvLyBFbmQgb2Ygd3BfYXR0ZW1wdF9mb2N1cygpLgoKCQkvKioKCQkgKiBGaWx0ZXJzIHdoZXRoZXIgdG8gcHJpbnQgdGhlIGNhbGwgdG8gYHdwX2F0dGVtcHRfZm9jdXMoKWAgb24gdGhlIGxvZ2luIHNjcmVlbi4KCQkgKgoJCSAqIEBzaW5jZSA0LjguMAoJCSAqCgkJICogQHBhcmFtIGJvb2wgJHByaW50IFdoZXRoZXIgdG8gcHJpbnQgdGhlIGZ1bmN0aW9uIGNhbGwuIERlZmF1bHQgdHJ1ZS4KCQkgKi8KCQlpZiAoIGFwcGx5X2ZpbHRlcnMoICdlbmFibGVfbG9naW5fYXV0b2ZvY3VzJywgdHJ1ZSApICYmICEgJGVycm9yICkgewoJCQkkbG9naW5fc2NyaXB0IC49ICJ3cF9hdHRlbXB0X2ZvY3VzKCk7XG4iOwoJCX0KCgkJLy8gUnVuIGB3cE9ubG9hZCgpYCBpZiBkZWZpbmVkLgoJCSRsb2dpbl9zY3JpcHQgLj0gImlmICggdHlwZW9mIHdwT25sb2FkID09PSAnZnVuY3Rpb24nICkgeyB3cE9ubG9hZCgpIH0iOwoKCQl3cF9wcmludF9pbmxpbmVfc2NyaXB0X3RhZyggJGxvZ2luX3NjcmlwdCApOwoKCQlpZiAoICRpbnRlcmltX2xvZ2luICkgewoJCQlvYl9zdGFydCgpOwoJCQk/PgoJCQk8c2NyaXB0PgoJCQkoIGZ1bmN0aW9uKCkgewoJCQkJdHJ5IHsKCQkJCQl2YXIgaSwgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ2EnICk7CgkJCQkJZm9yICggaSBpbiBsaW5rcyApIHsKCQkJCQkJaWYgKCBsaW5rc1tpXS5ocmVmICkgewoJCQkJCQkJbGlua3NbaV0udGFyZ2V0ID0gJ19ibGFuayc7CgkJCQkJCX0KCQkJCQl9CgkJCQl9IGNhdGNoKCBlciApIHt9CgkJCX0oKSk7CgkJCTwvc2NyaXB0PgoJCQk8P3BocAoJCQl3cF9wcmludF9pbmxpbmVfc2NyaXB0X3RhZyggd3BfcmVtb3ZlX3N1cnJvdW5kaW5nX2VtcHR5X3NjcmlwdF90YWdzKCBvYl9nZXRfY2xlYW4oKSApICk7CgkJfQoKCQlsb2dpbl9mb290ZXIoKTsKCQlicmVhazsKfSAvLyBFbmQgYWN0aW9uIHN3aXRjaC4K
Working...