# smd_slimbox 0.24 # Image gallery lightbox wrapper using Christophe Beyl's Slimbox # Stef Dawson # http://www.stefdawson.com # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTE6InNtZF9zbGltYm94IjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjU6Imh0dHA6Ly93d3cuc3RlZmRhd3Nvbi5jb20iO3M6NzoidmVyc2lvbiI7czo0OiIwLjI0IjtzOjExOiJkZXNjcmlwdGlvbiI7czo2MjoiSW1hZ2UgZ2FsbGVyeSBsaWdodGJveCB3cmFwcGVyIHVzaW5nIENocmlzdG9waGUgQmV5bCdzIFNsaW1ib3giO3M6NDoiaGVscCI7czoxNzYyMDoiPGgxPnNtZF9zbGltYm94PC9oMT4NCjxwIGNsYXNzPSJzbWFsbCI+W3JlcXVpcmVzIHNtZF9saWIgdG8gYmUgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWRdPHA+DQoNCjxwPlllYWgsIHllYWggPGVtPmFub3RoZXI8L2VtPiBsaWdodGJveC1zdHlsZSBpbWFnZSBnYWxsZXJ5ISBCdXQgdGhpcyB0aW1lIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGlnaXRhbGlhLmJlL3NvZnR3YXJlL3NsaW1ib3giPkNocmlzdG9waGUgQmV5bCdzPC9hPiB1bHRyYS1saWdodHdlaWdodCBTbGltYm94IChkaWV0IGNva2UgdmVyc2lvbiBvZiBsaWdodGJveCkgYW5kIG1vb3Rvb2xzLiBBbHNvIHBsYWdpYXJpc2VzIGlkZWFzIGZyb20gPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTUxNzYiPlJvYiBTYWJsZSdzIHJzc190aHVtYnBvcDwvYT4uIFN1cHBvcnRzIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MjA2OTIiPk11bHRpLUxpbmd1YWwgUGFjazwvYT4gKE1MUCkgZm9yIGltYWdlIGNhcHRpb24vYWx0IGFuZCBpbnRlcm5hbCBzdHJpbmcgbG9jYWxpc2F0aW9uLiBNYW55IHRoYW5rcyB0byB0aGUgb3JpZ2luYWwgYXV0aG9ycy48L3A+DQoNCjxoMj5JbnN0YWxsYXRpb248L2gyPg0KDQo8cD5FbnN1cmUgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlIGpzIGZvbGRlciAoPGNvZGU+bW9vdG9vbHMuanM8L2NvZGU+IGFuZCA8Y29kZT5zbGltYm94LmpzPC9jb2RlPikgYW5kIHRoZSBjc3MgZm9sZGVyICg8Y29kZT5zbGltYm94LmNzczwvY29kZT4gYW5kIDQgaW1hZ2VzKSBhcmUgdXBsb2FkZWQgdG8geW91ciBzZXJ2ZXIuIFlvdSBjYW4gcHV0IHRoZSBkaXJlY3RvcmllcyBpbiB0aGUgdGV4dHBhdHRlcm4gcm9vdCBmb2xkZXIgb3Igc29tZXdoZXJlIGVsc2Ugb2YgeW91ciBjaG9pY2UuIEl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGVyZSB5b3UgcHV0IHRoZW0sIHlvdSBqdXN0IGhhdmUgdG8gdGVsbCB0aGUgcGx1Z2luIHdoZXJlIGl0IGlzLjwvcD4NCg0KPHA+V2hlbiBpbnN0YWxsZWQsIHRoaXMgcGx1Z2luIGFkZHMgdHdvIHRhZ3MuIFRoZSBmaXJzdCAoPGNvZGU+c21kX3NsaW1ib3hfaW5jPC9jb2RlPikgZ29lcyBpbiB0aGUgJmx0O2hlYWQmZ3Q7IHNlY3Rpb24gb2YgeW91ciBwYWdlIGFuZCBsb2FkcyB0aGUgcmVxdWlyZWQgbGlicmFyaWVzLiBUaGUgc2Vjb25kICg8Y29kZT5zbWRfc2xpbWJveDwvY29kZT4pIGlzIHRoZSBhY3R1YWwgcGx1Z2luIHRoYXQgZGlzcGxheXMgeW91ciBpbWFnZSBnYWxsZXJ5IChvciBnYWxsZXJpZXMgaWYgeW91J3JlIGZlZWxpbmcgYWR2ZW50dXJvdXMpLjwvcD4NCg0KPHA+QSBxdWljayB3b3JkIGFib3V0IGhvdyBpdCBhbGwgd29ya3M6IHRoZSBwbHVnaW4gb3B0aW9ucyBnb3Zlcm4gd2hpY2ggdGh1bWJuYWlscyB0byB1c2UgYW5kIGhvdyB0aGV5IGFyZSBkaXNwbGF5ZWQgb25seS4gT25jZSB0aGUgdGh1bWJzIGFyZSBjbGlja2VkLCBjb250cm9sIGlzIGhhbmRlZCBvdmVyIHRvIHNsaW1ib3ggYW5kIG1vb3Rvb2xzIHRvIGRvIHRoZSBmYW5jeSB3b3JrLiBUaGVyZWZvcmUsIGlmIHlvdSB3aXNoIHRvIGNvbmZpZ3VyZSB0aGUgbG9vayBvZiB0aGUgImxpZ2h0Ym94IiBwYXJ0LCB5b3UgbmVlZCB0byBlZGl0IDxjb2RlPnNsaW1ib3guanM8L2NvZGU+IGFuZC9vciA8Y29kZT5zbGltYm94LmNzczwvY29kZT4uIE1vcmUgaW5mbyBjYW4gYmUgZm91bmQgb24gPGEgaHJlZj0iaHR0cDovL3d3dy5kaWdpdGFsaWEuYmUvc29mdHdhcmUvc2xpbWJveCI+Q2hyaXN0b3BoZSBCZXlsJ3MgcGFnZTwvYT4uPC9wPg0KDQo8cD5BbHNvLCBpZiB5b3UgYWxyZWFkeSB1c2UgbW9vdG9vbHMgZm9yIHlvdXIgcGFnZSB5b3UgZG9uJ3QgbmVlZCB0byB1cGxvYWQgaXQgYWdhaW4uIEp1c3QgbWFrZSBzdXJlIHRoZSB2ZXJzaW9uIHlvdSB1c2UgaGFzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgcGx1cyB0aGUgImZ4IiBhbmQgIndpbmRvdyIgbW9kdWxlcyBsaXN0ZWQgb24gQ2hyaXN0b3BoZSdzIHBhZ2UuPC9wPg0KDQo8aDI+VXNhZ2U6IHNtZF9zbGltYm94X2luYzwvaDI+DQoNCjxwPlNvbWV3aGVyZSBpbiB0aGUgJmx0O2hlYWQmZ3Q7IG9mIHRoZSBwYWdlIHRoYXQgeW91IHdhbnQgeW91ciBnYWxsZXJ5IG9uLCBhZGQ6PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOnNtZF9zbGltYm94X2luYyBqc2Rpcj0iL2pzIiBjc3NkaXI9Ii9jc3MiIC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPHA+SWYgeW91IGhhdmUgdGhlIGxpYnJhcmllcyBpbiB0aGUganMgYW5kIGNzcyBmb2xkZXJzIGluIHlvdXIgdGV4dHBhdHRlcm4gcm9vdCBmb2xkZXIsIHRoYXQgd2lsbCBiZSBmaW5lLiBJZiBub3QsIHlvdSBjYW4gY2hhbmdlIHdoZXJlIHRoZSBwbHVnaW4gbG9va3MgZm9yIHRoZSBsaWJyYXJpZXMgYnkgYWRqdXN0aW5nIHRoZSB0d28gb3B0aW9ucy48L3A+DQoNCjxwPklmIHlvdSB3YW50IG1vcmUgY29udHJvbCwgeW91IGhhdmUgdHdvIG1vcmUgb3B0aW9ucyBhdmFpbGFibGUuIFRoZSBmaXJzdCBpcyA8Y29kZT5zY3JpcHRzPC9jb2RlPi4gVGhpcyB0YWtlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHVwIHRvIDMgYXJndW1lbnRzIGluIHRoaXMgb3JkZXI6IG1vb3Rvb2xzSlNMb2NhdGlvbiwgc2xpbWJveEpTTG9jYXRpb24sIHNsaW1ib3hDU1NMb2NhdGlvbi4gVGhlIG9yZGVyIGlzIGltcG9ydGFudDogbW9vdG9vbHMgbXVzdCBhcHBlYXIgb24gdGhlIHBhZ2UgYmVmb3JlIHNsaW1ib3guanMhIFNvIGlmIHlvdSBoYXZlIHlvdXIgc2NyaXB0cyBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMgb3IgaGF2ZSByZW5hbWVkIHRoZSBmaWxlcywgaW5zdGVhZCBvZiB0aGUgPGNvZGU+Y3NzZGlyPC9jb2RlPiBhbmQgPGNvZGU+anNkaXI8L2NvZGU+IG9wdGlvbnMgeW91IGNvdWxkIGRvOjwvcD4NCg0KPHA+PGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveF9pbmMgc2NyaXB0cz0iL3NjcmlwdHMvbW9vdG9vbHMuanMsIC9zYm94L3NsaW1ib3guanMsIC9zYmNzcy9zbGltYm94LmNzcyIgLyZndDs8L2NvZGU+PC9wPg0KDQo8cD5UaGUgdGhyZWUgb3B0aW9ucyBjYW4gZWl0aGVyIGJlIGRpcmVjdCBmaWxlIHBhdGhzLCBhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgb3IgZnVsbCBYSFRNTCB0YWdzIGluY2x1ZGluZyA8Y29kZT4mbHQ7c2NyaXB0Jmd0OzwvY29kZT4gb3IgPGNvZGU+Jmx0O2xpbmsmZ3Q7PC9jb2RlPnRhZ3MuIFlvdSBjYW4gbWl4IGFuZCBtYXRjaCB0aGUgb3B0aW9ucyBpbiBhbnkgd2F5IHlvdSBsaWtlLCBhcyBsb25nIGFzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2NyaXB0cyB5b3UgdGVsbCB0aGUgdGFnIHRvIGxvYWQgZG9lc24ndCBleGNlZWQgMy4gU28gYW4gZXF1aXZhbGVudCB0byB0aGUgYWJvdmUgaXM6PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOnNtZF9zbGltYm94X2luYyBzY3JpcHRzPSIvc2NyaXB0cy9tb290b29scy5qcywgL3Nib3gvc2xpbWJveC5qcyIgY3NzZGlyPSIvc2Jjc3MiIC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPHA+SWYgeW91IHdpc2ggdG8gbG9hZCBzb21lIG9yIGFsbCBvZiB0aGUgc2NyaXB0cyAib3V0c2lkZSIgdGhlIHNtZF9zbGltYm94X2luYyBmdW5jdGlvbiB5b3UgY2FuIHVzZSB0aGUgPGNvZGU+c2tpcDwvY29kZT4gb3B0aW9uIHRvIHRlbGwgaXQgaG93IG1hbnkgeW91IGhhdmUgbG9hZGVkLiBJZiwgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIHN0bV9qYXZhc2NyaXB0IGluc3RhbGxlZCB5b3UgY291bGQgZG86PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOmpzIG49Im1vb3Rvb2xzIiAvJmd0OzwvY29kZT48YnIgLz4NCjxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3hfaW5jIHNraXA9IjEiIHNjcmlwdHM9IiwgL3Nib3gvc2xpbWJveC5qcywgL3NiY3NzL3NsaW1ib3guY3NzIiAvJmd0OzwvY29kZT48L3A+DQoNCjxwPk5vdGUgdGhlIGVtcHR5IG9wdGlvbiBhdCB0aGUgc3RhcnQuIFlvdSBkb24ndCBoYXZlIHRvIGRvIHRoYXQgKGJlY2F1c2UgPGNvZGU+c2tpcDwvY29kZT4gd2lsbCBqdW1wIG92ZXIgaXQgZm9yIHlvdSkgYnV0IGlmIHlvdSBsaWtlIHRvIG1ha2UgaXQgb2J2aW91cywgaXQgZG9lcyBubyBoYXJtLiBVc2luZyB0aGUgc29sZSBvcHRpb24gPGNvZGU+c2tpcD0iMyI8L2NvZGU+IG1lYW5zICJJJ3ZlIGxvYWRlZCB0aGVtIGFsbCBteXNlbGYsIEkga25vdyB3aGF0IEknbSBkb2luZyIgOi0pPC9wPg0KDQo8cD5PbmUgbW9yZSB0aGluZyB3aXRoIHRoaXMgZmVhdHVyZTogVFhQIGRvZXMgbm90IGFsbG93IHlvdSB0byBkaXJlY3RseSBlbWJlZCBvdGhlciB0YWdzIGFzIGF0dHJpYnV0ZXMgKHNvIHVuZm9ydHVuYXRlbHkgPGNvZGU+c2NyaXB0cz0iJmx0O3R4cDpjc3MgLyZndDsiPC9jb2RlPiBmYWlscykuIElmIHlvdSBhYnNvbHV0ZWx5IG11c3QgZG8gaXQsIHlvdSBjYW4gY2hlYXQgKHNlZSBXZXQncyBleGNlbGxlbnQgcG9zdCBvbiA8YSBocmVmPSJodHRwOi8vYXdhc3Rlb2Z3b3Jkcy5jb20vYXJ0aWNsZS90ZXh0cGF0dGVybi10YWdzLWluLXRhZ3MtdGhlLWdvcmRpYW4ta25vdCI+dGFncyBpbiB0YWdzPC9hPiBmb3IgbW9yZSBkZXRhaWxzKSBieSBkcm9wcGluZyBpbnRvIFBIUCBhbmQgZG9pbmcgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+DQoNCjxwPjxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3hfaW5jIGNzc2Rpcj0iL2NzcyIgc2NyaXB0cz0iL3NjcmlwdHMvbW9vdG9vbHMuanMsICZsdDt0eHA6cGhwJmd0O2VjaG8ganMoYXJyYXkoICduJyA9PiAnc2xpbWJveCcpKTsmbHQ7L3R4cDpwaHAmZ3Q7IC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPHA+VW5mb3J0dW5hdGVseSwgdGhlIHBsdWdpbiBkb2VzIG5vdCBjaGVjayB0aGF0IHlvdSBoYXZlIGdpdmVuIGl0IHRoZSBjb3JyZWN0IGZpbGUgbG9jYXRpb25zIHRvIHZhbGlkLCByZWFkYWJsZSBmaWxlcyBzbyBpZiB5b3UgaGF2ZSBwcm9ibGVtcyBtYWtpbmcgaXQgd29yaywgY2hlY2sgdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBwYWdlIHRvIHNlZSBpZiB5b3UncmUgbG9hZGluZyB3aGF0IHlvdSB0aGluayB5b3UncmUgbG9hZGluZyBmcm9tIHRoZSBjb3JyZWN0IHBsYWNlcyE8L3A+DQoNCjxwPklmIHlvdSBhcmUgdXNpbmcgUlNTIGZlZWRzIG9yIGp1c3QgZG9uJ3Qgd2FudCB0byB1c2Ugc21kX3NsaW1ib3hfaW5jLCB5b3UgY2FuIHR1cm4gaXQgb2ZmLiBKdXN0IGFkZCBsaWJjaGVjaz0iMCIgdG8gdGhlIHNtZF9zbGltYm94IHRhZy4gU2VlIHRoZSBuZXh0IHNlY3Rpb24uPC9wPg0KDQo8aDI+VXNhZ2U6IHNtZF9zbGltYm94PC9oMj4NCg0KPHA+T25jZSB0aGUgc2NyaXB0cyBhcmUgbG9hZGVkLCB5b3UgYXJlIGZyZWUgdG8gdXNlIDxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3ggLyZndDs8L2NvZGU+IHRvIGRpc3BsYXkgYW4gaW1hZ2UgZ2FsbGVyeS4gV2l0aG91dCBhbnkgb3B0aW9ucyBpdCBkaXNwbGF5cyBldmVyeSBpbWFnZSBpbiB5b3VyIGVudGlyZSBjb2xsZWN0aW9uIGFuZCB3b24ndCBsb29rIHZlcnkgcHJldHR5ICh0aG91Z2ggeW91IGNhbiBoZWxwIGEgYml0IGJ5IHN0YXJ0aW5nIHdpdGggdGhlIDxhIGhyZWY9IiNTdHlsaW5nIj5leGFtcGxlIENTUzwvYT4gZ2l2ZW4gbGF0ZXIpLiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgdGFtZSB0aGUgcGx1Z2luIGEgbGl0dGxlOjwvcD4NCg0KPHA+DQo8dWw+DQo8bGk+PGI+Y2F0ZWdvcnk8L2I+PGJyIC8+Y29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgaW1hZ2UgY2F0ZWdvcnkgbmFtZXMgdG8gc2hvdy4NCjxiciAvPlVzaW5nICI/YyIgYXMgb25lIG9mIHRoZSBvcHRpb25zIHVzZXMgdGhlIGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5IGFzIHRoZSBuYW1lIG9mIGFuIGltYWdlIGNhdGVnb3J5Lg0KPGJyIC8+VXNpbmcgIiFjIiB1c2VzIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBjdXJyZW50IGdsb2JhbCBjYXRlZ29yeS4NCjxiciAvPlVzaW5nICI/cyIgYXMgb25lIG9mIHRoZSBvcHRpb25zIHVzZXMgdGhlIGN1cnJlbnQgc2VjdGlvbiBhcyB0aGUgbmFtZSBvZiBhbiBpbWFnZSBjYXRlZ29yeS4NCjxiciAvPlVzaW5nICIhcyIgdXNlcyBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY3VycmVudCBzZWN0aW9uLg0KPGJyIC8+VXNpbmcgIj90IiBhcyBvbmUgb2YgdGhlIG9wdGlvbnMgdXNlcyB0aGUgY3VycmVudCBhcnRpY2xlJ3MgdXJsPXRpdGxlIGFzIHRoZSBuYW1lIG9mIGFuIGltYWdlIGNhdGVnb3J5Lg0KPGJyIC8+VXNpbmcgIiF0IiB1c2VzIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBjdXJyZW50IGFydGljbGUncyB1cmw9dGl0bGUuDQo8YnIgLz5UbyBtYWtlIGEgcGVyLWFydGljbGUgaW1hZ2UgZ2FsbGVyeSwgdXNlICI/aWQiIHRvIHRha2UgdGhlIGN1cnJlbnQgYXJ0aWNsZSBJRDogaXQgbWFrZXMgdXAgYSBjYXRlZ29yeSBuYW1lIHVzaW5nIHRoZSA8Y29kZT5jYXRsYWJlbDwvY29kZT4gb3B0aW9uIGFuZCB0aGUgSUQgZmllbGQuIEJ5IGRlZmF1bHQgdGhpcyB3aWxsIGJlICJhcnRpY2xlLUlEIi4gWW91IG1heSBuZWdhdGUgdGhlIGFydGljbGUgSUQgYnkgdXNpbmcgIiFpZCIuDQo8YnIgLz5Zb3UgY2FuIGFsc28gdXNlICI/ZmllbGRuYW1lIiB3aGljaCB3aWxsIHBpY2sgdXAgY2F0ZWdvcmllcyBmcm9tIHRoZSBnaXZlbiBmaWVsZG5hbWUgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgYXJ0aWNsZS4gRGVzaWduZWQgcHJpbWFyaWx5IGZvciB1c2Ugd2l0aCBjdXN0b20gZmllbGRzIChlLmcuID9jdXN0b20xKSwgaXQgY291bGQgYWxzbyBiZSBhbnkgb3RoZXIgZmllbGQgKG9yIGZpZWxkcykgZnJvbSB5b3VyIGFydGljbGVzIChlLmcuID9leGNlcnB0IG9yID9jYXRlZ29yeTEgb3IgP2tleXdvcmRzIG9yID9hdXRob3JpZCwgZXRjLikgVGhlIHNreSdzIHRoZSBsaW1pdCBiZWNhdXNlIHRob3NlIGZpZWxkcyBjb3VsZCBjb250YWluIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY2F0ZWdvcmllcy4uLiBiZSB3YXJuZWQ6IGlmIHlvdSB1c2UgP2JvZHkgb3Igc29tZXRoaW5nIGVxdWFsbHkgb3V0cmFnZW91cywgY2hhbmNlcyBhcmUgdGhlIHBsdWdpbiB3aWxsIGV4cGxvZGUuDQo8YnIgLz5UbyBuZWdhdGUgdGhlIGNhdGVnb3J5IHNlbGVjdGlvbiwgdXNlICIhY2F0ZWdvcnlfb3JfZmllbGRfbmFtZSIuIElmIHlvdSBsaXN0IHNwZWNpZmljIGltYWdlIGNhdGVnb3JpZXMgKGUuZy4gIWxhbmRzY2FwZSwgIWJpcmRzKSB0aG9zZSBjYXRlZ29yaWVzIHdpbGwgYmUgZXhjbHVkZWQuIElmIHlvdSBzcGVjaWZ5IGEgZmllbGQgbmFtZSBzdWNoIGFzICFrZXl3b3JkcyBvciAhY3VzdG9tMSwgdGhlIGNvbnRlbnRzIG9mIHRoYXQgZmllbGQgd2lsbCBiZSByZWFkIGFuZCB0aGUgbGlzdCBvZiBpbWFnZSBjYXRlZ29yaWVzIGZvdW5kIHRoZXJlIHdpbGwgYmUgZXhjbHVkZWQuIE5vdGUgdGhhdCBpZiB5b3Ugc3BlY2lmeSBhIGZpZWxkIG5hbWUgYW5kIHRoYXQgZmllbGQgaW4gdGhlIGFydGljbGUgaXMgZW1wdHksIHRoZSBuYW1lIHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3YXMgYW4gaW1hZ2UgY2F0ZWdvcnkuIEFsc28gbm90ZSB0aGF0LCByZWdhcmRsZXNzIG9mIHRoZSBvcmRlciB5b3UgbGlzdCB0aGVtLCBhbGwgJ3Bvc2l0aXZlcycgd2lsbCBiZSBwcm9jZXNzZWQgZmlyc3QsIHRoZW4gYW55IGV4Y2x1c2lvbnMgYXBwbGllZC48L2xpPg0KPGxpPjxiPnN1YmNhdHM9IjEiPC9iPjxiciAvPnRvIGF1dG9tYXRpY2FsbHkgaW5jbHVkZSBhbGwgc3ViLWNhdGVnb3JpZXMgb2YgdGhlIGNob3NlbiBpbWFnZSBjYXRlZ29yaWVzPC9saT4NCjxsaT48Yj5jYXRsYWJlbDwvYj48YnIgLz50aGUgbGFiZWwgdXNlZCBpbiBmcm9udCBvZiB0aGUgY2F0ZWdvcnkgaWYgdGhlICI/aWQiIG9yICIhaWQiIG9wdGlvbiBpcyB1c2VkOyBkZWZhdWx0OiAiYXJ0aWNsZS0iPC9saT4NCjxsaT48Yj5pbWFnZWlkPC9iPjxiciAvPmNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGltYWdlIElEcyB0byBzaG93LiBUaGVzZSBhcmUgYWRkZWQgdG8gYW55IGltYWdlcyBmcm9tIHRoZSA8Y29kZT5jYXRlZ29yeTwvY29kZT4gb3B0aW9uIEJFRk9SRSBhbnkgZXhjbHVzaW9ucyBhcmUgYXBwbGllZC4NCjxiciAvPkFzIHdpdGggdGhlIDxjb2RlPmNhdGVnb3J5PC9jb2RlPiBvcHRpb24sIHlvdSBjYW4gYWxzbyB1c2UgIj9pZCIgYW5kICI/ZmllbGRuYW1lIiB3aGljaCB3aWxsIHBpY2sgdXAgaW1hZ2UgSURzIGZyb20gdGhlIGdpdmVuIGZpZWxkbmFtZSBvZiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBhcnRpY2xlLiBJbnRlcmVzdGluZyBpZiB5b3UgY2hvb3NlID9hcnRpY2xlX2ltYWdlIGJlY2F1c2UgeW91IGNhbiBtYWtlIHlvdXIgYXJ0aWNsZSBpbWFnZSB2aWV3YWJsZSBpbiBhIGxpZ2h0Ym94IQ0KPGJyIC8+VGhpcyBvcHRpb24gYWxzbyBzdXBwb3J0cyBpZCBhbmQgZmllbGQgbmVnYXRpb24gdXNpbmcgdGhlIHNhbWUgdGVybWlub2xvZ3kgYXMgdGhlIDxjb2RlPmNhdGVnb3J5PC9jb2RlPiBvcHRpb24uDQo8L2xpPg0KPGxpPjxiPmxpbWl0PC9iPjxiciAvPjAgKG9yIG9taXR0ZWQpPWVzc2VudGlhbGx5IHVubGltaXRlZDsgb3IgdGhlIG51bWJlciBvZiBpbWFnZSB0aHVtYm5haWxzIHRvIHNob3cgcGVyIHBhZ2U8L2xpPg0KPGxpPjxiPm1heGxpbWl0PC9iPjxiciAvPjAgKG9yIG9taXR0ZWQpPWVzc2VudGlhbGx5IHVubGltaXRlZDsgb3IgdGhlIGFic29sdXRlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyB0byBwdWxsIGZyb20gdGhlIGRhdGFiYXNlPC9saT4NCjxsaT48Yj5vcmRlcmJ5PC9iPjxiciAvPmNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdheXMgdG8gb3JkZXIgdGhlIHJlc3VsdHMuIENob29zZSBmcm9tOiBjYXRlZ29yeSAodGhlIGRlZmF1bHQpLCBuYW1lLCBpZCwgZGF0ZSwgYWx0LCBjYXB0aW9uLCBhdXRob3IsIGV4dCwgd2lkdGgsIGhlaWdodCBvciByYW5kb20uIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHNvcnQgb3JkZXIgYnkgYWRkaW5nIDphc2Mgb3IgOmRlc2MgdG8gYW55IHZhbHVlIChlLmcgY2F0ZWdvcnksIGRhdGU6ZGVzYyB3b3VsZCBzb3J0IGJ5IGNhdGVnb3J5IGZpcnN0LCB0aGVuIGRlc2NlbmRpbmcgZGF0ZSkuIEEgc3BlY2lhbCwgb3ZlcnJpZGluZywgb3B0aW9uICdmaXhlZCcgYWxsb3dzIHRodW1icyB0byBiZSBvdXRwdXQgaW4gdGhlIG9yZGVyIGdpdmVuIGluIHRoZSBpbWFnZWlkIHRhZy4NCjxiciAvPk5vdGUgdGhhdCByYW5kb20gYWN0cyBzbGlnaHRseSBkaWZmZXJlbnRseS4gSWYgaXQgYXBwZWFycyBhcyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCwgcmFuZG9tIGltYWdlcyB3aWxsIGJlIHB1bGxlZCBmcm9tIHRoZSBkYXRhYmFzZSBhbmQgdGhleSB3aWxsIHRoZW4gYmUgc29ydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyBsaXN0ZWQgYWZ0ZXIgaXQuIElmIGl0IGFwcGVhcnMgYW55d2hlcmUgZWxzZSBpbiB0aGUgbGlzdCwgYW55IHNvcnQgaXRlbXMgYmVmb3JlIGl0IHdpbGwgZGV0ZXJtaW5lIHRoZSBvcmRlciBvZiBkYXRhIHB1bGxlZCBmcm9tIHRoZSBkYXRhYmFzZSwgYW5kIHRoZSByZXN1bHRzIHdpbGwgdGhlbiBiZSBvcmRlcmVkIHJhbmRvbWx5IChpbiB0aGF0IGNhc2UsIGFueSBpdGVtcyAgbGlzdGVkIGFmdGVyICdyYW5kb20nIHdpbGwgYmUgaWdub3JlZC4gJ2ZpeGVkJyBpcyBzdGlsbCBob25vdXJlZCwgaG93ZXZlcikuIFNlZSB0aGUgZXhhbXBsZXMgZm9yIG1vcmUgb24gdGhpcyBmZWF0dXJlLjwvbGk+DQo8bGk+PGI+Z3JvdXBuYW1lPC9iPjxiciAvPnRoZSBuYW1lIHRvIGFwcGVuZCB0byB0aGUgW3JlbF0gYXJndW1lbnQgaW4gb3JkZXIgdG8gbG9naWNhbGx5IGdyb3VwIGltYWdlcy4gIj9jIiB1c2VzIHRoZSBpbWFnZSBjYXRlZ29yeSwgb3IgdHJ5ICI/ZmllbGRuYW1lIiB0byBwdWxsIHRoZSBncm91cG5hbWUgZnJvbSB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGN1cnJlbnQgYXJ0aWNsZS4gU2VlIHRoZSA8YSBocmVmPSIjRXhhbXBsZXMiPmV4YW1wbGVzPC9hPiBhbmQgdGhlIFNsaW1ib3ggZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBvbiB0aGlzIGZlYXR1cmUuIERlZmF1bHQ6ICJzbWQiPC9saT4NCjxsaT48Yj5zaG93Y2FwdGlvbjwvYj48YnIgLz4xPXllczsgMD1ubzsgdG8gZGlzcGxheSB0aGUgaW1hZ2UncyBjYXB0aW9uIHdpdGggdGhlIGltYWdlLiBPZmYgYnkgZGVmYXVsdDwvbGk+DQo8bGk+PGI+c2hvd2FsdDwvYj48YnIgLz4xPXllczsgMD1ubzsgdG8gZGlzcGxheSB0aGUgaW1hZ2UncyBhbHQgdGFnIHdpdGggdGhlIGltYWdlLiBPZmYgYnkgZGVmYXVsdDwvbGk+DQo8bGk+PGI+dGV4dHBvczwvYj48YnIgLz5wb3NpdGlvbiBvZiB0aGUgYWx0L2NhcHRpb24gaW5mb3JtYXRpb24uIENob29zZSBmcm9tIG9uZSBvZjoNCjx1bD4NCjxsaT5hYm92ZTogYWJvdmUgdGhlIHRodW1ibmFpbCwgbm90IGNsaWNrYWJsZTwvbGk+DQo8bGk+YmVsb3c6IGJlbG93IHRoZSB0aHVtYm5haWwsIG5vdCBjbGlja2FibGUgKGRlZmF1bHQpPC9saT4NCjxsaT5iZWZvcmU6IGltbWVkaWF0ZWx5IGFib3ZlIHRoZSB0aHVtYm5haWwsIGNsaWNrYWJsZSBhcyBwYXJ0IG9mIHRoZSBsaW5rPC9saT4NCjxsaT5hZnRlcjogaW1tZWRpYXRlbHkgYmVsb3cgdGhlIHRodW1ibmFpbCwgY2xpY2thYmxlIGFzIHBhcnQgb2YgdGhlIGxpbms8L2xpPg0KPC91bD4NCjwvbGk+DQo8bGk+PGI+c2hvd3BhZ2VsaW5rczwvYj48YnIgLz4xPXllczsgMD1ubzsgdG8gZGlzcGxheSBjbGlja2FibGUgbmV4dC9wcmV2aW91cyBsaW5rcy4gT24gYnkgZGVmYXVsdCAoaWYgbGltaXQgaXMgZ3JlYXRlciB0aGFuIDApPC9saT4NCjxsaT48Yj5wcmV2bGFiZWw8L2I+PGJyIC8+TGFiZWwgZm9yIHRoZSAncHJldmlvdXMgcGFnZScgb2YgcGljdHVyZXMgd2hlbiB1c2luZyBzaG93cGFnZWxpbmtzLiBEZWZhdWx0OiAiUHJldiI8L2xpPg0KPGxpPjxiPm5leHRsYWJlbDwvYj48YnIgLz5MYWJlbCBmb3IgdGhlICduZXh0IHBhZ2UnIG9mIHBpY3R1cmVzIHdoZW4gdXNpbmcgc2hvd3BhZ2VsaW5rcy4gRGVmYXVsdDogIk5leHQiPC9saT4NCjxsaT48Yj53cmFwdGFnPC9iPjxiciAvPlRhZyB0byB3cmFwIGVhY2ggJ2NlbGwnIHdpdGguIERvIG5vdCBzcGVjaWZ5IHRoZSAmbHQ7IG9yICZndDsgY2hhcmFjdGVycy4gRm9yIGEgdmFsaWQgcGFnZSwgdGhlIG9ubHkgdXNlZnVsIG9wdGlvbnMgYXJlICJkaXYiLCAibGkiIG9yICJwIi4gRGVmYXVsdDogZW1wdHkgKGkuZS4gbm8gdGFnKTwvbGk+DQo8bGk+PGI+Y2VsbGNsYXNzPC9iPjxiciAvPkNTUyBjbGFzcyBmb3IgZWFjaCAnY2VsbCcgdGhhdCBkaXNwbGF5cyBhIHRodW1ibmFpbC4gRGVmYXVsdDogZW1wdHkgKGkuZS4gbm8gY2xhc3MpPC9saT4NCjxsaT48Yj5jYXB0aW9uY2xhc3M8L2I+PGJyIC8+Q1NTIGNsYXNzIGZvciB0aGUgY2FwdGlvbiB0ZXh0LiBEZWZhdWx0OiBlbXB0eSAoaS5lLiBubyBjbGFzcyk8L2xpPg0KPGxpPjxiPmFsdGNsYXNzPC9iPjxiciAvPkNTUyBjbGFzcyBmb3IgdGhlIGFsdCB0ZXh0LiBEZWZhdWx0OiBlbXB0eSAoaS5lLiBubyBjbGFzcyk8L2xpPg0KPGxpPjxiPm5hdmNsYXNzPC9iPjxiciAvPkNTUyBjbGFzcyBmb3IgdGhlIG5leHQvcHJldiBjb250YWluZXIuIERlZmF1bHQ6IGVtcHR5IChpLmUuIG5vIGNsYXNzKTwvbGk+DQo8bGk+PGI+cHJldmNsYXNzPC9iPjxiciAvPkNTUyBjbGFzcyBmb3IgdGhlICdwcmV2JyBsaW5rLiBEZWZhdWx0OiBzbWRfc2xpbWJveF9wcmV2PC9saT4NCjxsaT48Yj5uZXh0Y2xhc3M8L2I+PGJyIC8+Q1NTIGNsYXNzIGZvciB0aGUgJ25leHQnIGxpbmsuIERlZmF1bHQ6IHNtZF9zbGltYm94X25leHQ8L2xpPg0KPGxpPjxiPmxpYmNoZWNrPC9iPjxiciAvPnNldCB0aGlzIHRvIDAgdG8gYnlwYXNzIHRoZSBsaWJyYXJ5IGNoZWNrLiBVc2VmdWwgaWYgeW91IHdhbnQgdGhlIHRodW1icyB0byBiZSBpbmNsdWRlZCBpbiBhbiBSU1MgZmVlZCB3aXRob3V0IHRoZSBwbHVnaW4gY29tcGxhaW5pbmcgdGhlIGxpYnJhcmllcyBhcmUgbWlzc2luZy4gRGVmYXVsdDogMSAob24pPC9saT4NCjwvdWw+DQo8L3A+DQoNCjxoMj48YSBuYW1lPSJFeGFtcGxlcyI+PC9hPkV4YW1wbGVzPC9oMj4NCg0KPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCBjYXRlZ29yeT0ibGFuZHNjYXBlIiBsaW1pdD0iMTAiIC8mZ3Q7PC9jb2RlPg0KPHA+U2hvdyBhbGwgaW1hZ2VzIGluIHRoZSBsYW5kc2NhcGUgY2F0ZWdvcnksIHRlbiBhdCBhIHRpbWUuPC9wPg0KDQo8Y29kZT4mbHQ7dHhwOnNtZF9zbGltYm94IGNhdGVnb3J5PSJkb2dzLCBiaXJkcyIgbGltaXQ9IjkiIHNob3djYXB0aW9ucz0iMSIgdGV4dHBvcz0iYWZ0ZXIiIHdyYXB0YWc9ImxpIiBjZWxsY2xhc3M9ImNlbGwiIC8mZ3Q7PC9jb2RlPg0KPHA+U2hvdyBhbGwgaW1hZ2VzIGluIHRoZSBkb2dzIGFuZCBiaXJkcyBjYXRlZ29yaWVzLCA5IHBlciBwYWdlLiBBZGQgdGhlIGNhcHRpb25zIHVuZGVyIHRoZSB0aHVtYm5haWxzIGFuZCBtYWtlIHRoZW0gY2xpY2thYmxlIHRvby4gV3JhcCBlYWNoIGltYWdlIGluIGEgPGNvZGU+bGk8L2NvZGU+IHRhZyBhbmQgZ2l2ZSBlYWNoIGEgY2xhc3Mgb2YgJ2NlbGwnIChpbXBsaWVzIHlvdSBtdXN0IG1hbnVhbGx5IGFkZCBhIGNvcnJlc3BvbmRpbmcgPGNvZGU+Jmx0O3VsJmd0OzwvY29kZT4gdGFnIGFyb3VuZCB0aGUgcGx1Z2luIGluIG9yZGVyIHRvIG1haW50YWluIHBhZ2UgdmFsaWRpdHkpLjwvcD4NCg0KPHA+SWYgeW91IGFkZGVkIG9yZGVyYnk9ImRhdGU6ZGVzYywgcmFuZG9tIiB0byB0aGUgYWJvdmUgdGFnLCB5b3Ugd291bGQgZ2V0IHRoZSBtb3N0IHJlY2VudCA5IGltYWdlcyBvbiB0aGUgZmlyc3QgcGFnZSwgYnV0IHNob3duIGluIGEgcmFuZG9tIG9yZGVyLiBUaGUgbmV4dCBwYWdlIHdvdWxkIHNob3cgdGhlIG5leHQgbW9zdC1yZWNlbnQgOSBpbWFnZXMsIGFnYWluIHNvcnRlZCByYW5kb21seSB3aXRoaW4gdGhlbXNlbHZlcy48L3A+DQoNCjxwPlN3aXRjaGluZyB0aGUgc29ydCB0bzogb3JkZXJieT0icmFuZG9tLCBkYXRlOmRlc2MiIHdvdWxkIGNoYW5nZSB0aGUgb3V0cHV0LiBZb3Ugd291bGQgdGhlbiBnZXQgOSByYW5kb20gaW1hZ2VzIG9uIHRoZSBmaXJzdCBwYWdlLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBvbmVzIG9mIHRoZSBncm91cCBzaG93biBmaXJzdC4gQ2xpY2tpbmcgJ05leHQnIHdvdWxkIHNob3cgYW5vdGhlciA5IHJhbmRvbSBpbWFnZXMgKHNvbWUgbWF5IGJlIHRoZSBzYW1lIGFzIHBhZ2UgMSkgc29ydGVkIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgZGF0ZS4gRm9yIHRoaXMgcmVhc29uICh1bmxlc3MgeW91J3JlIHNpbXBseSB1c2luZyB0aGUgcGx1Z2luIHRvIHByZXR0eSB1cCBhIHBhZ2Ugd2l0aCByYW5kb20gaW1hZ2VzKSBpZiB5b3UncmUgdXNpbmcgcmFuZG9tIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBvcmRlcmJ5LCB5b3UgcHJvYmFibHkgd2FudCB0byBkaXNhYmxlIHBhZ2luZyBieSBzZXR0aW5nIHNob3dwYWdlbGlua3M9IjAiLjwvcD4NCg0KPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCBpbWFnZWlkPSI0OCwgMjUsIDQiIGNhdGVnb3J5PSJkb2dzLCA/Y3VzdG9tMSIgc3ViY2F0cz0iMSIgbGltaXQ9IjIwIiBwcmV2bGFiZWw9IkJhY2siIG9yZGVyYnk9Im5hbWU6ZGVzYywgY2F0ZWdvcnkiIC8mZ3Q7PC9jb2RlPg0KPHA+U2hvdyBpbWFnZXMgd2l0aCBJRHMgNDgsIDI1IGFuZCA0IGFzIHdlbGwgYXMgYWxsIGltYWdlcyBpbiB0aGUgZG9ncyBjYXRlZ29yeSBhbmQgYWxzbyBwdWxsIHRoZSBpbWFnZSBjYXRlZ29yeSBuYW1lcyBmcm9tIHRoZSBjdXJyZW50IGFydGljbGUncyBjdXN0b20xIGZpZWxkIChpZiBjdXN0b20xIGhlbGQgImJpcmRzLCBsYW5kc2NhcGVzIiAod2l0aG91dCB0aGUgcXVvdGVzKSB5b3UnZCBnZXQgcGljdHVyZXMgZnJvbSBhbGwgdGhyZWUgY2F0ZWdvcmllcyBhbmQgYWxsIHRoZWlyIHN1YmNhdGVnb3JpZXMpLiBMaW1pdCB0aGUgbnVtYmVyIHBlciBwYWdlIHRvIDIwLCBjaGFuZ2UgdGhlIHByZXZpb3VzIHBhZ2UgbGFiZWwgdG8gIkJhY2siIGFuZCBzb3J0IHRoZSBpbWFnZXMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBuYW1lLCB0aGVuIGNhdGVnb3J5LjwvcD4NCg0KPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCBjYXRlZ29yeT0ic3RhdGljLCA/aWQiIGltYWdlaWQ9IiFhcnRpY2xlX2ltYWdlIiBsaW1pdD0iNiIgZ3JvdXBuYW1lPSI/YyIgc2hvd3BhZ2VsaW5rcz0iMCIgLyZndDs8L2NvZGU+DQo8cD5JZiB0aGUgcGVyc29uIGlzIGN1cnJlbnRseSB2aWV3aW5nIGFydGljbGUgSUQgNjcsIHNob3cgYWxsIGltYWdlcyBmcm9tIHRoZSAnc3RhdGljJyBjYXRlZ29yeSBhbmQgdGhlICdhcnRpY2xlLTY3JyBjYXRlZ29yeS4gSWYgYW55IGltYWdlIGluIGVpdGhlciBvZiB0aG9zZSBjYXRlZ29yaWVzIGlzIGZvdW5kIHRvIGhhdmUgYW4gSUQgb2YgdGhlIGFydGljbGUgaW1hZ2UgZnJvbSB0aGUgY3VycmVudCBhcnRpY2xlLCB0aGF0IHBpY3R1cmUgd2lsbCBiZSBpZ25vcmVkLiBPbmx5IHNob3cgNiBwaWN0dXJlcyBhbmQgZG9uJ3Qgc2hvdyB0aGUgbmV4dC9wcmV2IGxpbmtzIG9uIHRoZSBwYWdlLiBBbHNvLCBncm91cCB0aGUgU2xpbWJveCBwaWN0dXJlcyBieSBpbWFnZSBjYXRlZ29yeS4gVGhpcyBtZWFucyB0aGF0IGlmIHNvbWVvbmUgY2xpY2tzIG9uIGEgcGljdHVyZSBmcm9tIHRoZSAic3RhdGljIiBjYXRlZ29yeSwgdGhlIFNsaW1ib3ggbmV4dC9wcmV2IGxpbmtzIG9ubHkgbmF2aWdhdGUgYmV0d2VlbiB0aG9zZSBwaWN0dXJlcy4gVGhlIHVzZXIgd2lsbCBoYXZlIHRvIGNsb3NlIHRoZSBsaWdodGJveCBhbmQgY2xpY2sgYSBwaWN0dXJlIGluIHRoZSBhcnRpY2xlLTY3IGNhdGVnb3J5IHRvIHNob3cgcGljdHVyZXMgZnJvbSB0aGUgb3RoZXIgZ3JvdXAuPC9wPg0KPHA+T24gdGhlIHN1cmZhY2UgdGhlIGdyb3VwbmFtZSBvcHRpb24gbWF5IHNlZW0gYSBsaXR0bGUgc3VwZXJmbHVvdXMgYnV0IGl0IGNhbiBiZSB1c2VmdWwgdG8gYWxsb3cgcGVvcGxlIHRvIG9ubHkgZmxpY2sgdGhyb3VnaCBhIHN1YnNldCBvZiB0aGUgcGljdHVyZXMgb24gZWFjaCBwYWdlLCBiYXNlZCBvbiB0aGVpciBjYXRlZ29yeSAob3IgYSBmaXhlZCB2YWx1ZSByZWFkIGZyb20gYSBmaWVsZCBpbiB0aGUgY3VycmVudCBhcnRpY2xlLCBlLmcuIGdyb3VwbmFtZT0iP2N1c3RvbTIiKS4gSXQgY29tZXMgaW50byBpdHMgb3duIHdoZW4geW91IHVzZSBDU1MyIHRvIHN0eWxlIGdyb3VwcyBvZiBpbWFnZXMgYmFzZWQgb24gdGhlaXIgW3JlbF0gYXR0cmlidXRlIGJlY2F1c2UgeW91IGNhbiBzdWItZGl2aWRlIHlvdXIgcGljdHVyZXMgZnVydGhlciB0aGFuIHlvdSB3b3VsZCBub3JtYWxseSBiZSBhYmxlLjwvcD4NCg0KPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCBjYXRlZ29yeT0iP2MsID9jdXN0b20xLCAhY3VzdG9tMiwgIXN0YXRpYyIgbGltaXQ9IjgiIG1heGxpbWl0PSIzMiIgLyZndDs8L2NvZGU+DQo8cD5BIGJpdCBvZiBhIGNvbnRyaXZlZCBleGFtcGxlIHRoYXQgc2hvd3MgaG93IGNyYXp5IHlvdSBjYW4gZ2V0OiBUaGlzIHdpbGwgc2hvdyBhIG1heGltdW0gb2YgMzIgaW1hZ2VzIGZyb20gYW4gaW1hZ2UgY2F0ZWdvcnkgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjdXJyZW50IGdsb2JhbCBjYXRlZ29yeSwgcGx1cyBhbGwgaW1hZ2VzIGZyb20gY2F0ZWdvcmllcyBsaXN0ZWQgaW4gdGhlIGN1c3RvbTEgZmllbGQgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSBidXQgPGVtPmV4Y2x1ZGU8L2VtPiBpbWFnZXMgZnJvbSBjYXRlZ29yaWVzIGxpc3RlZCBpbiBjdXN0b20yIGFuZCBhbHNvIGV4Y2x1ZGUgdGhlICdzdGF0aWMnIGNhdGVnb3J5LiBTaG93IDggaW1hZ2UgdGh1bWJuYWlscyBhdCBhIHRpbWUuPC9wPg0KDQo8aDI+PGEgbmFtZT0iU3R5bGluZyI+PC9hPlN0eWxpbmcgd2l0aCBDU1M8L2gyPg0KDQo8cD5UaGVyZSBhcmUgKGRlbGliZXJhdGVseSkgdmVyeSBmZXcgbGF5b3V0IGF0dHJpYnV0ZXMgZm9yIHRoZSBwbHVnaW4gYmVjYXVzZSBwcmV0dHkgbXVjaCBldmVyeXRoaW5nIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIENTUyB0byBsYXkgeW91ciBpbWFnZXMgb3V0IGhvd2V2ZXIgeW91IGxpa2UgdGhlbS4gV2FudCB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiBpbWFnZXMgcGVyIHJvdz8gQ2hhbmdlIHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyAmbHQ7ZGl2Jmd0OyBhbmQgc2V0IHRoZSB3aWR0aCBvZiBlYWNoIHRodW1ibmFpbCBzcGFjZSB0byBhIHBhcnRpY3VsYXIgc2l6ZS48L3A+DQoNCjxwPlRoZSBmb2xsb3dpbmcgbG9naWNhbCBzdHJ1Y3R1cmUgYXBwbGllczo8L3A+DQoNCjx1bD4NCjxsaT5BbiBvcHRpb25hbCB3cmFwdGFnIGFuZCBjbGFzcyBuYW1lIGFyb3VuZCBlYWNoICJjZWxsIiAoaS5lLiB0aHVtYm5haWwpPC9saT4NCjxsaT5BIGxpbmsgZWxlbWVudCBjb250YWluaW5nIHRoZSB0aHVtYm5haWwncyA8Y29kZT4mbHQ7aW1nJmd0OzwvY29kZT4gdGFnPC9saT4NCjxsaT5UaGUgY2FwdGlvbi9hbHQgaXMgYSAmbHQ7c3BhbiZndDsgd2l0aCBhbiBvcHRpb25hbCBjbGFzcyBhbmQgY2FuIGFwcGVhciBhYm92ZSwgYmVsb3cgb3Igd2l0aGluIHRoZSBsaW5rIGVsZW1lbnQ8L2xpPg0KPGxpPlRoZSBuZXh0L3ByZXYgbGlua3MgYXJlIHdyYXBwZWQgaW4gdGhlIG9wdGlvbmFsIHdyYXB0YWcgY29udGFpbmVyIGFuZCBjYW4gYmUgZ2l2ZW4gYW4gb3B0aW9uYWwgY2xhc3MgbmFtZTwvbGk+DQo8bGk+VGhlIG5leHQgbGluayBoYXMgYSAoZGVmYXVsdCkgY2xhc3Mgb2YgInNtZF9zbGltYm94X25leHQiIGFuZCBwcmV2IGhhcyAic21kX3NsaW1ib3hfcHJldiIuIFRoZXNlIGNhbiBiZSBjaGFuZ2VkIG9yIHJlbW92ZWQgaWYgeW91IHdpc2guPC9saT4NCjwvdWw+DQoNCjxwPlVzaW5nIENTUyBzZWxlY3RvcnMgeW91IGNhbiBhY2Nlc3MgZXZlcnkgcGFydCBvZiB0aGUgc3RydWN0dXJlLiBBbiBleGFtcGxlIENTUyBsYXlvdXQgaXMgZ2l2ZW4gaGVyZSB0byBnZXQgeW91IHN0YXJ0ZWQgKGFzc3VtZXMgYSB3cmFwdGFnIG9mICdsaScsIGEgY29udGFpbmluZyAndWwnIGFyb3VuZCB0aGUgcGx1Z2luIHRhZyB3aXRoIGEgY2xhc3Mgb2YgPGNvZGU+c21kX3NsaW1ib3g8L2NvZGU+IGFuZCA8Y29kZT5uYXZjbGFzcz0ic21kX3NsaW1ib3hfbmF2IjwvY29kZT4pLiBQYXN0ZSBpdCBpbnRvIHlvdXIgQ1NTIHRlbXBsYXRlIGFuZCB5b3UncmUgZ29vZCB0byBnby48L3A+DQoNCjxwcmU+DQouc21kX3NsaW1ib3ggew0KCWZsb2F0OmxlZnQ7DQoJd2lkdGg6NjAwcHg7DQoJbWFyZ2luOjFlbSAwOw0KCWNsZWFyOmJvdGg7DQoJbGlzdC1zdHlsZTpub25lOw0KfQ0KLnNtZF9zbGltYm94IGxpIHsNCgl3aWR0aDoxNTBweDsNCgloZWlnaHQ6MTUwcHg7DQoJZmxvYXQ6bGVmdDsNCgltYXJnaW46MWVtIGF1dG87DQoJdGV4dC1hbGlnbjpjZW50ZXI7DQp9DQouc21kX3NsaW1ib3ggaW1nIHsNCgltYXJnaW46MCBhdXRvOw0KfQ0KLnNtZF9zbGltYm94IHNwYW4gew0KCWZsb2F0OmxlZnQ7DQoJd2lkdGg6MTQwcHg7DQoJcGFkZGluZzoycHggMCAwIDVweDsNCn0NCmxpLnNtZF9zbGltYm94X25hdiB7DQoJY2xlYXI6Ym90aDsNCgl3aWR0aDo1MDBweDsNCglwYWRkaW5nOjIwcHg7DQp9DQouc21kX3NsaW1ib3hfcHJldiB7DQoJZmxvYXQ6bGVmdDsNCn0NCi5zbWRfc2xpbWJveF9uZXh0IHsNCglmbG9hdDpyaWdodDsNCn0NCjwvcHJlPiI7czo0OiJjb2RlIjtzOjE2Mjg1OiIvLyB2MC4xICAgSW5pdGlhbCBwdWJsaWMgcmVsZWFzZQ0KLy8gdjAuMTEgQWRkZWQgIWNhdGVnb3J5IHN1cHBvcnQNCi8vIHYwLjEyIEFkZGVkIHRleHRwb3Mgb3B0aW9uICh0aGFua3MgbGVlKSBhbmQgaW1hZ2VpZCBvcHRpb24gKHRoYW5rcyB3b3VhcmVuKQ0KLy8gdjAuMiAgIGpzIGFuZCBjc3MgY2FuIG5vdyBiZSBsb2FkZWQgZWxzZXdoZXJlICh0aGFua3MganN0dWJicykuIEFkZGVkIHdyYXB0YWcgYW5kIGNoYW5nZWQgZGVmYXVsdHMgdG8gbWFrZSBvdXRwdXQgbGVzcyBsaWtlIHRhZy1zb3VwICh0aGFua3Mgd291YXJlbikNCi8vIHYwLjIxIEFkZGVkIG9yZGVyYnk9ImZpeGVkIiB0byBhbGxvd2VkIGZpeGVkIGltYWdlaWQgb3JkZXJpbmcgKHRoYW5rcyBsZWUpLiAkd2hlcmUgd2FybmluZyBzcXVhc2hlZCAodGhhbmtzIGJlbmppYm90KQ0KLy8gdjAuMjIgTm93IHVzZXMgc21kX2xpYiBhbmQgc3ViY2F0cy4gQWxzbyBNTFAoTXVsdGktbGluZ3VhbCktYXdhcmUuDQovLyB2MC4yMyBGaXhlZCBvcmRlcmJ5IHdoZW4gdXNpbmcgcmFuZG9tICh0aGFua3MgbXJkYWxlKSBhbmQgYWRkZWQgYWJpbGl0eSB0byBvdmVycmlkZSBtYXhsaW1pdA0KLy8gdjAuMjQgQWRkZWQgbGliY2hlY2sgKHRoYW5rcyBwYXB1YXNzKS4gTnVtZXJpYyByYW5nZXMgbm93IGFsbG93ZWQgZm9yIElEcyAoc21kX2xpYikuIEZpeGVkIGVtcHR5IGZpZWxkL2ltYWdlaWQgbmVnYXRpb24gYnVncy4gRml4ZWQgbmV4dC9wcmV2IGJ1dHRvbnMgZm9yIE1MUC4NCg0KcmVxdWlyZV9wbHVnaW4oJ3NtZF9saWInKTsNCnJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfc2JveF9lbnVtX3N0cicsICdsMTBuLmVudW1lcmF0ZV9zdHJpbmdzJyk7DQpnbG9iYWwgJHNtZF9zYm94X2xpYnM7DQpnbG9iYWwgJHNtZF9zYm94X3N0cjsNCiRzbWRfc2JveF9zdHIgPSBhcnJheSgNCgknaW5jZXJyJyA9PiAnSWYgdXNpbmcgdGhlIHNjcmlwdHMgb3B0aW9uLCBzcGVjaWZ5IHVwIHRvIHRocmVlIHJlcXVpcmVkIHNjcmlwdHMgaW4gdGhpcyBvcmRlcjogJmx0O3R4cDpzbWRfc2xpbWJveF9pbmMgc2NyaXB0cz0ibW9vdG9vbHNKU0xvY2F0aW9uLCBzbGltYm94SlNMb2NhdGlvbiwgc2xpbWJveENTU0xvY2F0aW9uIiAvJmd0Oy4gSWYgYW55IHBvc2l0aW9ucyBhcmUgbGVmdCBlbXB0eSwgdGhlIG1pc3Npbmcgc2NyaXB0cyBtdXN0IGJlIHN1cHBsaWVkIHZpYSB0aGUganNkaXIvY3NzZGlyIG9wdGlvbnMsIG9yIGxvYWRlZCBleHRlcm5hbGx5IGFuZCB0b2xkIHRvIHNraXAgdGhpcyBzdGVwLiBUaGUgdGhyZWUgdmFsdWVzIGNhbiBlaXRoZXIgYmUgYSBmdWxsIFhIVE1MIHN0cmluZyAoZS5nLiBhcyByZXR1cm5lZCBieSB0eHA6c3RtX2phdmFzY3JpcHQgb3IgdHhwOmNzcywgYWx0aG91Z2ggdGhleSBtYXkgbm90IHdvcmsgZGlyZWN0bHkgd2l0aGluIHRoZSB0YWc7IHNlZSB0aGUgZG9jcykgb3Igc2ltcGx5IHBhdGhzIHRvIHRoZSBmaWxlcy4gTm90ZSB0aGF0IG5vIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIHRvIGNoZWNrIGlmIHRoZSBmaWxlcyBleGlzdC4nLA0KCSdub2luYycgPT4gJ1JlcXVpcmVkIGxpYnJhcmllcyBub3QgbG9hZGVkLiBDYWxsICZsdDt0eHA6c21kX3NsaW1ib3hfaW5jIC8mZ3Q7IGluIHRoZSAmbHQ7aGVhZCZndDsgb2YgdGhpcyBwYWdlLicsDQoJJ25leHRfbGJsJyA9PiAnTmV4dCcsDQoJJ3ByZXZfbGJsJyA9PiAnUHJldicsDQopOw0KDQovLyBVc2UgdGhpcyB0byBpbmNsdWRlIHRoZSBsaWJyYXJpZXMgaW4gdGhlIDxoZWFkPiBzZWN0aW9uIG9mIHRoZSBwYWdlLg0KLy8gQ2FuIG92ZXJyaWRlIHdpdGggc2xpbWJveCB0YWcgbGliX2NoZWNrPSIwIg0KZnVuY3Rpb24gc21kX3NsaW1ib3hfaW5jKCRhdHRzKSB7DQoJZ2xvYmFsICRzbWRfc2JveF9saWJzOw0KCWdsb2JhbCAkc21kX3Nib3hfc3RyOw0KDQoJaWYgKGlzX2FycmF5KCRhdHRzKSkgZXh0cmFjdCgkYXR0cyk7DQoNCgkvLyBGdW5jdGlvbiBvcHRpb25zDQoJJGpzZGlyID0gaXNzZXQoJGpzZGlyKSA/IGRvU2xhc2goJGpzZGlyKSA6ICcnOw0KCSRjc3NkaXIgPSBpc3NldCgkY3NzZGlyKSA/IGRvU2xhc2goJGNzc2RpcikgOiAnJzsNCgkkc2NyaXB0cyA9IGlzc2V0KCRzY3JpcHRzKSA/ICRzY3JpcHRzIDogJyc7DQoJJHNraXAgPSBpc3NldCgkc2tpcCkgPyAkc2tpcCA6ICIwIjsNCg0KCSRtb2RzUmVxdWlyZWQgPSAzOw0KCSRtb2RzTG9hZGVkID0gMDsNCgkkb3V0U3RyID0gJyc7DQoNCglpZiAoJHNraXAgPiAwKSB7DQoJCSRtb2RzTG9hZGVkID0gJHNraXA7DQoJfQ0KDQoJLy8gSW5jbHVkZSB0aGUganMgbGlicyBpZiByZXF1aXJlZA0KCWlmICgkanNkaXIgIT0gJycpIHsNCgkJJG91dFN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyAuJGpzZGlyLiAnL21vb3Rvb2xzLmpzIj48L3NjcmlwdD4nLm47DQoJCSRvdXRTdHIgLj0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicgLiRqc2Rpci4gJy9zbGltYm94LmpzIj48L3NjcmlwdD4nLm47DQoJCSRtb2RzTG9hZGVkICs9IDI7DQoJfQ0KDQoJLy8gRmluZCB3aGljaCBzY3JpcHRzIHRvIGF1dG8tbG9hZA0KCWlmICgoJHNjcmlwdHMgIT0gJycpICYmICgkbW9kc0xvYWRlZCA8ICRtb2RzUmVxdWlyZWQpKSB7DQoJCSRtb2RzTGlzdCA9IHByZWdfc3BsaXQoJy9bLF0rLycsJHNjcmlwdHMsJG1vZHNSZXF1aXJlZCk7DQoJCSRqc3ByZWZpeCA9ICI8c2NyaXB0IjsNCgkJJGNzc3ByZWZpeCA9ICI8bGluayI7DQoJCSR0eHBwcmVmaXggPSAiPHR4cCI7DQoJCWZvcmVhY2ggKCRtb2RzTGlzdCBhcyAkZmlsZW9iaikgew0KCQkJJGZpbGVvYmogPSB0cmltKCRmaWxlb2JqKTsNCgkJCWlmICgkZmlsZW9iaiA9PSAnJykgew0KCQkJCSRtb2RzTG9hZGVkLS07DQoJCQl9IGVsc2UgaWYgKHN1YnN0cigkZmlsZW9iaiwgMCwgc3RybGVuKCRqc3ByZWZpeCkpID09PSAkanNwcmVmaXgpIHsNCgkJCQkkb3V0U3RyIC49ICRmaWxlb2JqLm47DQoJCQl9IGVsc2UgaWYgKHN1YnN0cigkZmlsZW9iaiwgMCwgc3RybGVuKCRjc3NwcmVmaXgpKSA9PT0gJGNzc3ByZWZpeCkgew0KCQkJCSRvdXRTdHIgLj0gJGZpbGVvYmoubjsNCgkJCX0gZWxzZSBpZiAoc3Vic3RyKCRmaWxlb2JqLCAwLCBzdHJsZW4oJHR4cHByZWZpeCkpID09PSAkdHhwcHJlZml4KSB7DQoJCQkJJG91dFN0ciAuPSBwYXJzZSgkZmlsZW9iaik7DQoJCQl9IGVsc2Ugew0KCQkJCWlmICgkbW9kc0xvYWRlZCA8IDIpIHsNCgkJCQkJJG91dFN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyAuJGZpbGVvYmouICciPjwvc2NyaXB0PicubjsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkb3V0U3RyIC49ICc8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9IicgLiRmaWxlb2JqLiAnIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4nLm47DQoJCQkJfQ0KCQkJfQ0KCQkJJG1vZHNMb2FkZWQrKzsNCgkJfQ0KCX0NCg0KCS8vIEluY2x1ZGUgdGhlIGNzcyBmaWxlIGlmIHJlcXVpcmVkDQoJaWYgKCRjc3NkaXIgIT0gJycpIHsNCgkJJG91dFN0ciAuPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSInIC4kY3NzZGlyLiAnL3NsaW1ib3guY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4nLm47DQoJCSRtb2RzTG9hZGVkKys7DQoJfQ0KDQoJLy8gU2V0IHRoZSBmbGFnIHRvIHNheSB0aGUgbGlicyBhcmUgb2suIFNoYW1lIHRoZXJlJ3Mgbm8gZWFzeSBwcm92aXNpb24gZm9yDQoJLy8gY2hlY2tpbmcgdGhlIGZpbGVzIGFjdHVhbGx5IGV4aXN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbnMsIGJ1dCBoZXkNCglpZiAoJG1vZHNMb2FkZWQgPT0gJG1vZHNSZXF1aXJlZCkgew0KCQkkc21kX3Nib3hfbGlicyA9IHRydWU7DQoJfSBlbHNlIHsNCgkJJHNtZF9zYm94X2xpYnMgPSBmYWxzZTsNCgkJJG91dFN0ciA9IHNtZF9nVHh0KCRzbWRfc2JveF9zdHIsJ2luY2VycicpLm47DQoJfQ0KDQoJcmV0dXJuICRvdXRTdHI7DQp9DQoNCmZ1bmN0aW9uIHNtZF9zbGltYm94KCRhdHRzKSB7DQoJZ2xvYmFsICRwcmV0ZXh0LCAkdGhpc2FydGljbGUsICRpbWdfZGlyOw0KCWdsb2JhbCAkc21kX3Nib3hfbGlicywgJHNtZF9zYm94X3N0cjsNCg0KCWlmIChpc19hcnJheSgkYXR0cykpIGV4dHJhY3QoJGF0dHMpOw0KCSRjYXRpZG9wdHMgPSAoaXNzZXQoJGNhdGVnb3J5KSB8fCBpc3NldCgkaW1hZ2VpZCkpID8gdHJ1ZSA6IGZhbHNlOw0KDQoJLy8gUGx1Z2luIG9wdGlvbnMNCgkkbGliY2hlY2sgPSBpc3NldCgkbGliY2hlY2spID8gJGxpYmNoZWNrOiAiMSI7DQoJJGltYWdlaWQgPSBpc3NldCgkaW1hZ2VpZCkgPyBkb1NsYXNoKCRpbWFnZWlkKSA6ICcnOw0KCSRjYXRlZ29yeSA9IGlzc2V0KCRjYXRlZ29yeSkgPyBkb1NsYXNoKCRjYXRlZ29yeSkgOiAoKCRpbWFnZWlkPT0iIikgPyAkcHJldGV4dFsnYyddOiAnJyk7DQoJJHN1YmNhdHMgPSBpc3NldCgkc3ViY2F0cykgPyB0cnVlIDogZmFsc2U7DQoJJGNhdGxhYmVsID0gaXNzZXQoJGNhdGxhYmVsKSA/ICRjYXRsYWJlbDogImFydGljbGUtIjsNCgkkZ3JvdXBuYW1lID0gaXNzZXQoJGdyb3VwbmFtZSkgPyAkZ3JvdXBuYW1lOiAic21kIjsNCgkkbWF4bGltaXQgPSBpc3NldCgkbWF4bGltaXQpID8gJG1heGxpbWl0OiAiOTk5OTkiOw0KCSRsaW1pdCA9IGlzc2V0KCRsaW1pdCkgPyAkbGltaXQ6ICIwIjsNCgkkb3JkZXJieSA9IGlzc2V0KCRvcmRlcmJ5KSA/ICRvcmRlcmJ5OiAiY2F0ZWdvcnkiOw0KCSRzaG93cGFnZWxpbmtzID0gaXNzZXQoJHNob3dwYWdlbGlua3MpID8gJHNob3dwYWdlbGlua3M6ICIxIjsNCgkkcHJldmxhYmVsPSBpc3NldCgkcHJldmxhYmVsKSA/ICRwcmV2bGFiZWw6IHNtZF9nVHh0KCRzbWRfc2JveF9zdHIsICdwcmV2X2xibCcpOw0KCSRuZXh0bGFiZWw9IGlzc2V0KCRuZXh0bGFiZWwpID8gJG5leHRsYWJlbDogc21kX2dUeHQoJHNtZF9zYm94X3N0ciwgJ25leHRfbGJsJyk7DQoJJHNob3djYXB0aW9uID0gaXNzZXQoJHNob3djYXB0aW9uKSA/ICRzaG93Y2FwdGlvbjogIjAiOw0KCSRzaG93YWx0ID0gaXNzZXQoJHNob3dhbHQpID8gJHNob3dhbHQ6ICIwIjsNCgkkdGV4dHBvcyA9IGlzc2V0KCR0ZXh0cG9zKSA/ICR0ZXh0cG9zOiAiYmVsb3ciOw0KCSR3cmFwdGFnID0gaXNzZXQoJHdyYXB0YWcpID8gJHdyYXB0YWc6ICIiOw0KCSRjZWxsY2xhc3MgPSBpc3NldCgkY2VsbGNsYXNzKSA/ICRjZWxsY2xhc3M6ICIiOw0KCSRpbWdjbGFzcyA9IGlzc2V0KCRpbWdjbGFzcykgPyAkaW1nY2xhc3M6ICIiOw0KCSRuYXZjbGFzcyA9IGlzc2V0KCRuYXZjbGFzcykgPyAkbmF2Y2xhc3M6ICIiOw0KCSRwcmV2Y2xhc3MgPSBpc3NldCgkcHJldmNsYXNzKSA/ICRwcmV2Y2xhc3M6ICJzbWRfc2xpbWJveF9wcmV2IjsNCgkkbmV4dGNsYXNzID0gaXNzZXQoJG5leHRjbGFzcykgPyAkbmV4dGNsYXNzOiAic21kX3NsaW1ib3hfbmV4dCI7DQoJJGNhcHRpb25jbGFzcyA9IGlzc2V0KCRjYXB0aW9uY2xhc3MpID8gJGNhcHRpb25jbGFzczogIiI7DQoJJGFsdGNsYXNzID0gaXNzZXQoJGFsdGNsYXNzKSA/ICRhbHRjbGFzczogIiI7DQoNCgkkZml4ZWRPcmRlciA9IGZhbHNlOw0KDQoJLy8gTWFpbiBjb2RlIGJvZHkNCglpZiAoKCRsaWJjaGVjayA9PSAxKSAmJiAoJHNtZF9zYm94X2xpYnMgPT0gZmFsc2UpKSB7DQoJCSRvdXRTdHIgPSBzbWRfZ1R4dCgkc21kX3Nib3hfc3RyLCdub2luYycpOw0KCX0gZWxzZSB7DQoJCS8vIFRoZSBkYXRhYmFzZSBmaWVsZHMgcmVxdWlyZWQNCgkJJGZpZWxkcyA9ICdpZCxuYW1lLGNhcHRpb24sYWx0LGNhdGVnb3J5LGRhdGUsYXV0aG9yLGV4dCx3LGgnOw0KDQoJCS8vIENvbnZlcnQgdGhlIGNhdGVnb3J5IChwb3NzaWJseSBhIGNvbW1hLXNlcCBsaXN0KSBpbnRvIGFuIFNRTC1zdHlsZSAnaW4nIGxpc3QuDQoJCSRmdWxsQ2F0TGlzdCA9IGFycmF5KCk7DQoJCSRub3RDYXRMaXN0ID0gYXJyYXkoKTsNCgkJJGNhdFZhcnMgPSBhcnJheSgiP2MiLCAiIWMiLCAiP3MiLCAiIXMiLCAiP3QiLCAiIXQiLCAiP2lkIiwgIiFpZCIsICI/ZmllbGQiLCAiIWZpZWxkIik7DQoJCSRyZXRBcnJheSA9IHNtZF9nZXRBdHRzKCRjYXRlZ29yeSwgJGNhdFZhcnMsICRjYXRsYWJlbCk7DQoJCSRmdWxsQ2F0TGlzdCA9ICRyZXRBcnJheVswXTsNCgkJJG5vdENhdExpc3QgPSAkcmV0QXJyYXlbMV07DQoNCgkJLy8gQ29udmVydCB0aGUgaW1hZ2VpZCAocG9zc2libHkgYSBjb21tYS1zZXAgbGlzdCkgaW50byBhbiBTUUwtc3R5bGUgJ2luJyBsaXN0Lg0KCQkkZnVsbElETGlzdCA9IGFycmF5KCk7DQoJCSRub3RJRExpc3QgPSBhcnJheSgpOw0KCQkkaWRWYXJzID0gYXJyYXkoIj9pZCIsICIhaWQiLCAiP2ZpZWxkIiwgIiFmaWVsZCIpOw0KCQkkcmV0QXJyYXkgPSBzbWRfZ2V0QXR0cygkaW1hZ2VpZCwgJGlkVmFycyk7DQoJCSRmdWxsSURMaXN0ID0gJHJldEFycmF5WzBdOw0KCQkkbm90SURMaXN0ID0gJHJldEFycmF5WzFdOw0KDQoJCS8vIE1ha2UgdXAgdGhlIFdIRVJFIHN0YXRlbWVudCBmcm9tIHRoZSBjb21iaW5lZCBsaXN0cy4NCgkJLy8gVGhlIGNhdGVnb3JpZXMvaW1hZ2UgSURzIGFyZSBPUmVkIHRvZ2V0aGVyIGluIGJyYWNrZXRzIGZpcnN0DQoJCS8vIGJlZm9yZSB0aGUgbmVnYXRpb24gb3B0aW9ucyBhcmUgdGFja2VkIG9uIGFzIEFORHMgYWZ0ZXJ3YXJkcw0KCQkkd2hlcmVPUiA9IGFycmF5KCk7DQoJCSR3aGVyZUFORCA9IGFycmF5KCk7DQoNCgkJLy8gU3RhcnQgdGhlIFdIRVJFIHN0YXRlbWVudCB3aXRoIHRoZSBjb21iaW5lZCBsaXN0IG9mIGltYWdlIElEcw0KCQlpZiAoY291bnQoJGZ1bGxJRExpc3QpID4gMCkgew0KCQkJZm9yICgkaWR4ID0gY291bnQoJGZ1bGxJRExpc3QpOyAkaWR4ID49MDsgJGlkeC0tKSB7DQoJCQkJaWYgKGVtcHR5KCRmdWxsSURMaXN0WyRpZHhdKSkgew0KCQkJCQl1bnNldCgkZnVsbElETGlzdFskaWR4XSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJGZ1bGxJRExpc3RbJGlkeF0gPSAiJyIgLiAkZnVsbElETGlzdFskaWR4XSAuICInIjsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoY291bnQoJGZ1bGxJRExpc3QpID4gMCkgew0KCQkJCSR3aGVyZU9SW10gPSAiaWQgSU4gKCIgLiBpbXBsb2RlKCIsIiwgJGZ1bGxJRExpc3QpLiAiKSI7DQoJCQl9DQoJCX0NCg0KCQkvLyBpbmNsdWRlZCBjYXRlZ29yaWVzIC0gc29tZSBtYXkgYmUgc3ViY2F0cw0KCQkkdG1wYSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkZnVsbENhdExpc3QpOyAkaWR4KyspIHsNCgkJCWlmICgkc3ViY2F0cykgew0KCQkJCSRjYXRlZ3MgPSBzbWRfZ2V0U3ViQ2F0cygkZnVsbENhdExpc3RbJGlkeF0sJ2ltYWdlJyk7DQoJCQkJZm9yICgkamR4ID0gMDsgJGpkeCA8IGNvdW50KCRjYXRlZ3MpOyAkamR4KyspIHsNCgkJCQkJaWYgKCRjYXRlZ3NbJGpkeF1bJ25hbWUnXSAhPSAicm9vdCIpIHsNCgkJCQkJCSR0bXBhW10gPSAiJyIgLiRjYXRlZ3NbJGpkeF1bJ25hbWUnXS4gIiciOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkdG1wYVtdID0gIiciIC4kZnVsbENhdExpc3RbJGlkeF0uICInIjsNCgkJCX0NCgkJfQ0KCQlpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkJJHdoZXJlT1JbXSA9ICJjYXRlZ29yeSBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCQl9DQoNCgkJaWYgKGNvdW50KCR3aGVyZU9SKSA+IDApIHsNCgkJCSR3aGVyZSA9ICIoIiAuIGltcGxvZGUoIiBPUiAiLCAkd2hlcmVPUikgLiAiKSI7DQoJCX0gZWxzZSB7DQoJCQkkd2hlcmUgPSAiIjsNCgkJfQ0KDQoJCS8vIGV4Y2x1ZGVkIGNhdGVnb3JpZXMNCgkJJHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJG5vdENhdExpc3QpOyAkaWR4KyspIHsNCgkJCWlmICgkc3ViY2F0cykgew0KCQkJCSRjYXRlZ3MgPSBzbWRfZ2V0U3ViQ2F0cygkbm90Q2F0TGlzdFskaWR4XSwnaW1hZ2UnKTsNCgkJCQlmb3IgKCRqZHggPSAwOyAkamR4IDwgY291bnQoJGNhdGVncyk7ICRqZHgrKykgew0KCQkJCQlpZiAoJGNhdGVnc1skamR4XVsnbmFtZSddICE9ICJyb290Iikgew0KCQkJCQkJJHRtcGFbXSA9ICInIiAuJGNhdGVnc1skamR4XVsnbmFtZSddLiAiJyI7DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCSR0bXBhW10gPSAiJyIgLiRub3RDYXRMaXN0WyRpZHhdLiAiJyI7DQoJCQl9DQoJCX0NCgkJaWYgKGNvdW50KCR0bXBhKSA+IDApIHsNCgkJCSR3aGVyZUFORFtdID0gImNhdGVnb3J5IE5PVCBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCQl9DQoNCgkJLy8gQWRkIHRvIHRoZSBXSEVSRSBzdGF0ZW1lbnQgdGhlIGNvbWJpbmVkIGxpc3Qgb2YgTk9UIGltYWdlIElEcw0KCQlpZiAoY291bnQoJG5vdElETGlzdCkgPiAwKSB7DQoJCQlmb3IgKCRpZHggPSBjb3VudCgkbm90SURMaXN0KTsgJGlkeCA+PTA7ICRpZHgtLSkgew0KCQkJCWlmIChlbXB0eSgkbm90SURMaXN0WyRpZHhdKSkgew0KCQkJCQl1bnNldCgkbm90SURMaXN0WyRpZHhdKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkbm90SURMaXN0WyRpZHhdID0gIiciIC4gJG5vdElETGlzdFskaWR4XSAuICInIjsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoY291bnQoJG5vdElETGlzdCkgPiAwKSB7DQoJCQkJJHdoZXJlQU5EW10gPSAiaWQgTk9UIElOICgiIC4gaW1wbG9kZSgiLCIsICRub3RJRExpc3QpLiAiKSI7DQoJCQl9DQoJCX0NCg0KCQlpZiAoY291bnQoJHdoZXJlQU5EKSA+IDApIHsNCgkJCSR3aGVyZSAuPSAoKCR3aGVyZT09IiIpID8gIiIgOiAiIEFORCAiKSAuIGltcGxvZGUoIiBBTkQgIiwgJHdoZXJlQU5EKTsNCgkJfQ0KDQoJCS8vIElmIHRoZSByZWFzb24gbm90aGluZyB3YXMgcmV0dXJuZWQgaXMgYmVjYXVzZSBubyBvcHRpb25zIHdlcmUgZ2l2ZW4NCgkJaWYgKCR3aGVyZSA9PSAiIiAmJiAhJGNhdGlkb3B0cykgew0KCQkJJHdoZXJlID0gIjE9MSI7DQoJCX0NCg0KCQkvLyBDb252ZXJ0IHRoZSBvcmRlcmJ5IGludG8gYSB2YWxpZCBzb3J0aW5nIGhpZXJhcmNoeS4NCgkJLy8gTm90ZSB0aGF0IHJhbmRvbSBpcyBhIHNwZWNpYWwgY2FzZSBhbmQgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToNCgkJLy8gIDEpIEFueXRoaW5nIGFwcGVhcmluZyBiZWZvcmUgcmFuZG9tIGlzIHBhc3NlZCB0byB0aGUgZGF0YWJhc2UgcXVlcnkgZm9yIG9yZGVyaW5nDQoJCS8vICAyKSBBcyBzb29uIGFzIHJhbmRvbSBpcyBlbmNvdW50ZXJlZCwgdGhlIG9yZGVyYnkgc3RyaW5nIGlzIGlnbm9yZWQuDQoJCS8vICAgICBUaGUgcmVzdWx0c2V0IHdpbGwgYmUgc29ydGVkIHJhbmRvbWx5IGluc3RlYWQNCgkJLy8gIDMpIElmIHJhbmRvbSBhcHBlYXJzIGZpcnN0IGluIHRoZSBsaXN0LCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgcmFuZG9tbHkgdGhlbiB0aGUNCgkJLy8gICAgIHJlbWFpbmluZyBvcHRpb25zIHNvcnQgdGhlIHJlc3VsdHNldA0KCQkkd2hlcmVPQiA9IEFycmF5KCk7DQoJCSRwb3N0T3JkZXIgPSBhcnJheSgpOw0KCQkkcnVsZSA9ICJzcWwiOw0KCQkkcG9zdFByZWZpeCA9ICJTT1JUXyI7DQoJCSRyYW5kc29ydCA9IGZhbHNlOw0KCQkkb2JMaXN0ID0gcHJlZ19zcGxpdCgnL1ssXHNdKy8nLCRvcmRlcmJ5LC0xLFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJG9iTGlzdCk7ICRpZHgrKykgew0KCQkJJG9iX2RpciA9IGV4cGxvZGUoJzonLCRvYkxpc3RbJGlkeF0pOw0KCQkJJGRpcmVjdGlvbiA9ICcnOw0KCQkJJGNvbFJlZiA9ICcnOw0KCQkJaWYgKGNvdW50KCRvYl9kaXIpIDw9IDEpIHsNCgkJCQkkb2JfZGlyWzFdID0gImFzYyI7DQoJCQl9DQoJCQlpZiAoJHJ1bGUgPT0gInNxbCIpIHsNCgkJCQkkZGlyZWN0aW9uID0gKCRvYl9kaXJbMV0gPT0gImRlc2MiKSA/ICcgZGVzYycgOiAnIGFzYyc7DQoJCQl9IGVsc2Ugew0KCQkJCSRkaXJlY3Rpb24gPSAoJG9iX2RpclsxXSA9PSAiZGVzYyIpID8gJHBvc3RQcmVmaXguJ0RFU0MnIDogJHBvc3RQcmVmaXguJ0FTQyc7DQoJCQl9DQoJCQlzd2l0Y2ggKCRvYl9kaXJbMF0pIHsNCgkJCQljYXNlICduYW1lJzoNCgkJCQkJJGNvbFJlZiA9ICduYW1lJzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnaWQnOg0KCQkJCQkkY29sUmVmID0gJ2lkJzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnYWx0JzoNCgkJCQkJJGNvbFJlZiA9ICdhbHQnOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdjYXB0aW9uJzoNCgkJCQkJJGNvbFJlZiA9ICdjYXB0aW9uJzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnZGF0ZSc6DQoJCQkJCSRjb2xSZWYgPSAnZGF0ZSc7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2V4dCc6DQoJCQkJCSRjb2xSZWYgPSAnZXh0JzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnYXV0aG9yJzoNCgkJCQkJJGNvbFJlZiA9ICdhdXRob3InOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICd3aWR0aCc6DQoJCQkJCSRjb2xSZWYgPSAndyc7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2hlaWdodCc6DQoJCQkJCSRjb2xSZWYgPSAnaCc7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3JhbmRvbSc6DQoJCQkJCSRydWxlID0gInBvc3QiOw0KCQkJCQlpZiAoJGlkeCA9PSAwKSB7DQoJCQkJCQkkd2hlcmVPQltdID0gJ3JhbmQoKSc7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkkcmFuZHNvcnQgPSB0cnVlOw0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2ZpeGVkJzoNCgkJCQkJLy8gJ2ZpeGVkJyBvbmx5IHdvcmtzIG9uIGltYWdlIGlkcw0KCQkJCQlpZiAoJGltYWdlaWQgIT0gIiIpIHsNCgkJCQkJCSRmaXhlZE9yZGVyID0gdHJ1ZTsNCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlICdjYXRlZ29yeSc6DQoJCQkJZGVmYXVsdDoNCgkJCQkJJGNvbFJlZiA9ICdjYXRlZ29yeSc7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJaWYgKCRydWxlID09ICJzcWwiKSB7DQoJCQkJaWYgKCRjb2xSZWYgIT0gIiIpIHsNCgkJCQkJJHdoZXJlT0JbXSA9ICRjb2xSZWYuJGRpcmVjdGlvbjsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCWlmICghJHJhbmRzb3J0KSB7DQoJCQkJCWlmICgkY29sUmVmICE9ICIiKSB7DQoJCQkJCQkkcG9zdE9yZGVyW10gPSBhcnJheSgiY29sIiA9PiAkY29sUmVmLCAic29ydCIgPT4gJGRpcmVjdGlvbik7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlpZiAoY291bnQoJHdoZXJlT0IpID4gMCkgew0KCQkJJHdoZXJlIC49ICcgT1JERVIgQlkgJyAuIGltcGxvZGUoIiwiLCR3aGVyZU9CKTsNCgkJfQ0KDQoJCS8vIEhhbmRsZSBwYWdpbmcNCgkJaWYgKCgkbGltaXQgPiAwKSAmJiAkc2hvd3BhZ2VsaW5rcykgew0KCQkJJHJzID0gc2FmZV9yb3dzKCRmaWVsZHMsICd0eHBfaW1hZ2UnLCAkd2hlcmUgLicgTElNSVQgMCwnLiRtYXhsaW1pdCk7DQoJCQkkbnVtdGh1bSA9IGNvdW50KCRycyk7DQoJCQkkbnVtUGFnZXMgPSAoJG51bXRodW0gPiAwKSA/IGNlaWwoJG51bXRodW0vJGxpbWl0KSA6IDE7DQoJCQkkdGh1bWJwYWdlID0gKCFncHMoJ3RwZycpKSA/IDEgOiBncHMoJ3RwZycpOw0KCQkJJG9mZnNldCA9ICgkdGh1bWJwYWdlIC0gMSkgKiAkbGltaXQ7DQoJCQkkcnMgPSBzYWZlX3Jvd3MoJGZpZWxkcywgJ3R4cF9pbWFnZScsICR3aGVyZSAuJyBMSU1JVCAnLiRvZmZzZXQuJywnLiRsaW1pdCk7DQoJCX0gZWxzZSB7DQoJCQkvLyBObyBwYWdpbmcgcmVxdWlyZWQNCgkJCSRudW1QYWdlcyA9IDE7DQoJCQkkdGh1bWJwYWdlID0gMTsNCgkJCSRycyA9IHNhZmVfcm93cygkZmllbGRzLCAndHhwX2ltYWdlJywgJHdoZXJlIC4nIExJTUlUIDAsJy4gKCgkbGltaXQ9PTApID8gJG1heGxpbWl0IDogJGxpbWl0KSk7DQoJCX0NCg0KCQkvLyBJcyBwb3N0LW9yZGVyaW5nIHJlcXVpcmVkPyBEbyBpdA0KCQlpZiAoJHJhbmRzb3J0KSB7DQoJCQlzaHVmZmxlKCRycyk7DQoJCX0gZWxzZSBpZiAoY291bnQoJHBvc3RPcmRlcikgPiAwKSB7DQoJCQkvLyBUcmFuc2xhdGUgdGhlIHJvd3MgaW50byBjb2x1bW5zIHRoYXQgY2FuIGJlIHNvcnRlZA0KCQkJZm9yZWFjaCgkcnMgYXMgJGtleSA9PiAkcm93KSB7DQoJCQkJJGNvbF9pZFska2V5XSA9ICRyb3dbJ2lkJ107DQoJCQkJJGNvbF9uYW1lWyRrZXldID0gJHJvd1snbmFtZSddOw0KCQkJCSRjb2xfY2FwdGlvblska2V5XSA9ICRyb3dbJ2NhcHRpb24nXTsNCgkJCQkkY29sX2FsdFska2V5XSA9ICRyb3dbJ2FsdCddOw0KCQkJCSRjb2xfY2F0ZWdvcnlbJGtleV0gPSAkcm93WydjYXRlZ29yeSddOw0KCQkJCSRjb2xfZGF0ZVska2V5XSA9ICRyb3dbJ2RhdGUnXTsNCgkJCQkkY29sX2V4dFska2V5XSA9ICRyb3dbJ2V4dCddOw0KCQkJCSRjb2xfYXV0aG9yWyRrZXldID0gJHJvd1snYXV0aG9yJ107DQoJCQkJJGNvbF93WyRrZXldID0gJHJvd1sndyddOw0KCQkJCSRjb2xfaFska2V5XSA9ICRyb3dbJ2gnXTsNCgkJCX0NCgkJCS8vIE1ha2UgdXAgYW4gYXJyYXlfbXVsdGlzb3J0IGFyZyBsaXN0IGFuZCBleGVjdXRlIGl0DQoJCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHBvc3RPcmRlcik7ICRpZHgrKykgew0KCQkJCSRzb3J0YXJnc1tdID0gJyRjb2xfJy4kcG9zdE9yZGVyWyRpZHhdWydjb2wnXTsNCgkJCQkkc29ydGFyZ3NbXSA9ICRwb3N0T3JkZXJbJGlkeF1bJ3NvcnQnXTsNCgkJCX0NCgkJCSRzb3J0aXQgPSAnYXJyYXlfbXVsdGlzb3J0KCcuaW1wbG9kZSgiLCAiLCRzb3J0YXJncykuJywgJHJzKTsnOw0KCQkJZXZhbCgkc29ydGl0KTsNCgkJfQ0KDQoJCS8vIElzIGZpeGVkLW9yZGVyIG91dHB1dCBkZXNpcmVkPyBJZiBzbywgcmUtb3JkZXIgdGhlICRycw0KCQlpZiAoJGZpeGVkT3JkZXIpIHsNCgkJCSRvcmRlcmVkUlMgPSBBcnJheSgpOw0KCQkJJGlnbm9yZUxpc3QgPSBBcnJheSgpOw0KCQkJJHJlbWFpbmluZ1JTID0gQXJyYXkoKTsNCgkJCS8vIFN1Y2sgb3V0IHRoZSBmaXhlZCBpdGVtcyBmaXJzdA0KCQkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRmdWxsSURMaXN0KTsgJGlkeCsrKSB7DQoJCQkJZm9yZWFjaCgkcnMgYXMgJHJvdykgew0KCQkJCQlpZiAoIiciLiRyb3dbJ2lkJ10uIiciID09ICRmdWxsSURMaXN0WyRpZHhdKSB7DQoJCQkJCQkkb3JkZXJlZFJTW10gPSAkcm93Ow0KCQkJCQkJJGlnbm9yZUxpc3RbXSA9ICRyb3dbJ2lkJ107DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQkvLyBUYWNrIG9uIHRoZSByZW1haW5pbmcgcm93cw0KCQkJZm9yZWFjaCgkcnMgYXMgJHJvdykgew0KCQkJCWlmICghaW5fYXJyYXkoJHJvd1snaWQnXSwgJGlnbm9yZUxpc3QpKSB7DQoJCQkJCSRyZW1haW5pbmdSU1tdID0gJHJvdzsNCgkJCQl9DQoJCQl9DQoJCQkkcnMgPSBhcnJheV9tZXJnZSgkb3JkZXJlZFJTLCAkcmVtYWluaW5nUlMpOw0KCQl9DQoNCgkJLy8gQ29uc3RydWN0IHRoZSBvdXRwdXQNCgkJJG91dFN0ciA9ICcnOw0KCQlpZigkcnMpIHsNCgkJCWZvcmVhY2goJHJzIGFzICRyb3cpIHsNCgkJCQkkdGh1bWIgPSBodS4kaW1nX2Rpci4nLycgLiAkcm93WydpZCddIC4gJ3QnIC4gJHJvd1snZXh0J107DQoJCQkJJGZ1bGwgPSBodS4kaW1nX2Rpci4nLycgLiAkcm93WydpZCddIC4gJHJvd1snZXh0J107DQoJCQkJaWYgKCRncm91cG5hbWUgPT09ICI/YyIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ2NhdGVnb3J5J107DQoJCQkJfSBlbHNlIGlmICgkZ3JvdXBuYW1lWzBdID09PSAiPyIpIHsNCgkJCQkJLy8gU3BsaXQgb2ZmIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlIHF1ZXN0aW9uIG1hcmsNCgkJCQkJJGZpZWxkbmFtZSA9IHN1YnN0cigkZ3JvdXBuYW1lLDEpOw0KCQkJCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWyRmaWVsZG5hbWVdKSkgew0KCQkJCQkJJGdycCA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRncnAgPSAnJzsNCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCSRncnAgPSAkZ3JvdXBuYW1lOw0KCQkJCX0NCg0KCQkJCS8vIEdlbmVyYXRlIHRoZSBjYXB0aW9uL2FsdCBpZiByZXF1aXJlZA0KCQkJCSRjYXBTdHIgPSAoJHNob3dhbHQgJiYgJHJvd1snYWx0J10pID8gJzxzcGFuJyAuICgoJGFsdGNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRhbHRjbGFzcy4gJyInIDogJycpIC4gJz4nIC4kcm93WydhbHQnXS4gJzwvc3Bhbj4nIDogJyc7DQoJCQkJJGNhcFN0ciAuPSAoJHNob3djYXB0aW9uICYmICRyb3dbJ2NhcHRpb24nXSkgPyAnPHNwYW4nIC4gKCgkY2FwdGlvbmNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRjYXB0aW9uY2xhc3MuICciJyA6ICcnKSAuICc+JyAuJHJvd1snY2FwdGlvbiddLiAnPC9zcGFuPicgOiAnJzsNCg0KCQkJCS8vIENvbnN0cnVjdCB0aGUgbGluayBhbmQgcHV0IGNhcHRpb24vYWx0IGluIHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbg0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8JyAuJHdyYXB0YWcuICgoJGNlbGxjbGFzcyAhPSAiIikgPyAnIGNsYXNzPSInIC4kY2VsbGNsYXNzLiAnIicgOiAnJykgLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49ICgkdGV4dHBvcyA9PSAiYWJvdmUiKSA/ICRjYXBTdHIgOiAnJzsNCgkJCQkkb3V0U3RyIC49ICc8YSBocmVmPSInLiRmdWxsLiciIHJlbD0ibGlnaHRib3gtJyAuJGdycC4gJyIgdGl0bGU9IicgLiRyb3dbJ2NhcHRpb24nXS4gJyI+JyAuKCgkdGV4dHBvcyA9PSAiYmVmb3JlIikgPyAkY2FwU3RyIDogJycpLiAnPGltZyBzcmM9IicgLiR0aHVtYi4gJyIgYWx0PSInIC4kcm93WydhbHQnXS4gJyInIC4gKCgkaW1nY2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJGltZ2NsYXNzLiAnIicgOiAnJykgLiAnIC8+JyAuKCgkdGV4dHBvcyA9PSAiYWZ0ZXIiKSA/ICRjYXBTdHIgOiAnJykuICc8L2E+Jy5uOw0KCQkJCSRvdXRTdHIgLj0gKCR0ZXh0cG9zID09ICJiZWxvdyIpID8gJGNhcFN0ciA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8LycgLiR3cmFwdGFnLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49IG47DQoJCQl9DQoNCgkJCS8vIEFkZCB0aGUgcGFnaW5nIGZlYXR1cmVzIGlmIHJlcXVpcmVkDQoJCQlpZiAoKCRsaW1pdCA+IDApICYmICRzaG93cGFnZWxpbmtzKSB7DQoJCQkJJG5leHQgPSAoJG51bVBhZ2VzID4gMSAmJiAkdGh1bWJwYWdlICE9ICRudW1QYWdlcyk7DQoJCQkJJHByZXYgPSAoJG51bVBhZ2VzID4gMSAmJiAkdGh1bWJwYWdlID4gMSk7DQoNCgkJCQkvLyBSZXBsYWNlIGFueSBwYWdpbmcgaW5mbyBpbiB0aGUgcXVlcnkgc3RyaW5nDQoJCQkJJHByZXZQYWdlID0gc21kX2FkZFFTVmFyKCRwcmV0ZXh0WydyZXEnXSwgJ3RwZycsICR0aHVtYnBhZ2UtMSk7DQoJCQkJJG5leHRQYWdlID0gc21kX2FkZFFTVmFyKCRwcmV0ZXh0WydyZXEnXSwgJ3RwZycsICR0aHVtYnBhZ2UrMSk7DQoNCgkJCQkkb3V0U3RyIC49ICgkd3JhcHRhZyAhPSAiIikgPyAnPCcgLiR3cmFwdGFnLiAoKCRuYXZjbGFzcyAhPSAiIikgPyAnIGNsYXNzPSInIC4kbmF2Y2xhc3MuICciJyA6ICcnKSAuICc+JyA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCRwcmV2KSA/ICc8YScgLiAoKCRwcmV2Y2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJHByZXZjbGFzcy4gJyInIDogJycpIC4gJyBocmVmPSInIC4kcHJldlBhZ2UuICciPicgLiRwcmV2bGFiZWwuICc8L2E+Jy5uIDogJyc7DQoJCQkJJG91dFN0ciAuPSAoJG5leHQpID8gJzxhJyAuICgoJG5leHRjbGFzcyAhPSAiIikgPyAnIGNsYXNzPSInIC4kbmV4dGNsYXNzLiAnIicgOiAnJykgLiAnIGhyZWY9IicgLiRuZXh0UGFnZS4gJyI+JyAuJG5leHRsYWJlbC4gJzwvYT4nLm4gOiAnJzsNCgkJCQkkb3V0U3RyIC49ICgkd3JhcHRhZyAhPSAiIikgPyAnPC8nIC4kd3JhcHRhZy4gJz4nIDogJyc7DQoJCQkJJG91dFN0ciAuPSBuOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJcmV0dXJuICRvdXRTdHI7DQp9DQoNCi8vIENhbGxiYWNrIGZvciBNTFAgc3RyaW5nIHJlcGxhY2VtZW50DQpmdW5jdGlvbiBzbWRfc2JveF9lbnVtX3N0cigkZXZlbnQsICRzdGVwPScnLCAkcHJlPTApIHsNCglnbG9iYWwgJHNtZF9zYm94X3N0ciwgJHNtZE1MUDsNCgkkciA9IGFycmF5CSgNCgkJCSdvd25lcicgPT4gJ3NtZF9zbGltYm94JywNCgkJCSdwcmVmaXgnID0+ICRzbWRNTFBbJ3NtZF9zbGltYm94J10sDQoJCQknbGFuZycgPT4gJ2VuLWdiJywgLy8gRGVmYXVsdCBsYW5ndWFnZQ0KCQkJJ2V2ZW50JyA9PiAncHVibGljJywgLy8gcHVibGljL2FkbWluL2NvbW1vbiA9IHdoaWNoIGludGVyZmFjZSB0aGUgc3RyaW5ncyB3aWxsIGJlIGxvYWRlZCBpbnRvDQoJCQknc3RyaW5ncycgPT4gJHNtZF9zYm94X3N0ciwNCgkJKTsNCglyZXR1cm4gJHI7DQp9IjtzOjQ6InR5cGUiO3M6MToiMCI7czozOiJtZDUiO3M6MzI6IjMyNWFkNWQwMDQwMWUxNTFiNTBhOTc2ZmU3MjdiNDUxIjt9