@@ -13,46 +13,46 @@ |
||
| 13 | 13 | |
| 14 | 14 | class ProtegerAmpTest extends TestCase |
| 15 | 15 | { |
| 16 | - public static function setUpBeforeClass(): void { |
|
| 17 | - find_in_path('inc/filtres.php', '', true); |
|
| 18 | - } |
|
| 16 | + public static function setUpBeforeClass(): void { |
|
| 17 | + find_in_path('inc/filtres.php', '', true); |
|
| 18 | + } |
|
| 19 | 19 | |
| 20 | - #[DataProvider('providerFiltresProtegerAmp')] |
|
| 21 | - public function testFiltresProtegerAmp($expected, ...$args): void { |
|
| 22 | - $actual = proteger_amp(...$args); |
|
| 23 | - $this->assertSame($expected, $actual); |
|
| 24 | - } |
|
| 20 | + #[DataProvider('providerFiltresProtegerAmp')] |
|
| 21 | + public function testFiltresProtegerAmp($expected, ...$args): void { |
|
| 22 | + $actual = proteger_amp(...$args); |
|
| 23 | + $this->assertSame($expected, $actual); |
|
| 24 | + } |
|
| 25 | 25 | |
| 26 | - public static function providerFiltresProtegerAmp(): array { |
|
| 27 | - return [ |
|
| 28 | - 0 => [ |
|
| 29 | - 0 => '', |
|
| 30 | - 1 => '', |
|
| 31 | - ], |
|
| 32 | - 1 => [ |
|
| 33 | - 0 => '0', |
|
| 34 | - 1 => '0', |
|
| 35 | - ], |
|
| 36 | - 2 => [ |
|
| 37 | - 0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net', |
|
| 38 | - 1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net', |
|
| 39 | - ], |
|
| 40 | - 3 => [ |
|
| 41 | - 0 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;', |
|
| 42 | - 1 => 'Un texte avec des entités &<>"', |
|
| 43 | - ], |
|
| 44 | - 4 => [ |
|
| 45 | - 0 => 'Un texte sans entites &<>"\'', |
|
| 46 | - 1 => 'Un texte sans entites &<>"\'', |
|
| 47 | - ], |
|
| 48 | - 5 => [ |
|
| 49 | - 0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 50 | - 1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 51 | - ], |
|
| 52 | - 6 => [ |
|
| 53 | - 0 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>', |
|
| 54 | - 1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>', |
|
| 55 | - ], |
|
| 56 | - ]; |
|
| 57 | - } |
|
| 26 | + public static function providerFiltresProtegerAmp(): array { |
|
| 27 | + return [ |
|
| 28 | + 0 => [ |
|
| 29 | + 0 => '', |
|
| 30 | + 1 => '', |
|
| 31 | + ], |
|
| 32 | + 1 => [ |
|
| 33 | + 0 => '0', |
|
| 34 | + 1 => '0', |
|
| 35 | + ], |
|
| 36 | + 2 => [ |
|
| 37 | + 0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net', |
|
| 38 | + 1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net', |
|
| 39 | + ], |
|
| 40 | + 3 => [ |
|
| 41 | + 0 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;', |
|
| 42 | + 1 => 'Un texte avec des entités &<>"', |
|
| 43 | + ], |
|
| 44 | + 4 => [ |
|
| 45 | + 0 => 'Un texte sans entites &<>"\'', |
|
| 46 | + 1 => 'Un texte sans entites &<>"\'', |
|
| 47 | + ], |
|
| 48 | + 5 => [ |
|
| 49 | + 0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 50 | + 1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 51 | + ], |
|
| 52 | + 6 => [ |
|
| 53 | + 0 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>', |
|
| 54 | + 1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>', |
|
| 55 | + ], |
|
| 56 | + ]; |
|
| 57 | + } |
|
| 58 | 58 | } |
@@ -13,30 +13,30 @@ |
||
| 13 | 13 | |
| 14 | 14 | class AttributHtmlTest extends TestCase |
| 15 | 15 | { |
| 16 | - public static function setUpBeforeClass(): void { |
|
| 17 | - find_in_path('./inc/filtres.php', '', true); |
|
| 18 | - } |
|
| 16 | + public static function setUpBeforeClass(): void { |
|
| 17 | + find_in_path('./inc/filtres.php', '', true); |
|
| 18 | + } |
|
| 19 | 19 | |
| 20 | - #[DataProvider('providerAttributHtml')] |
|
| 21 | - public function testAttributHtml($expected, $texte): void { |
|
| 22 | - $actual = attribut_html($texte); |
|
| 23 | - $this->assertSame($expected, $actual); |
|
| 24 | - } |
|
| 20 | + #[DataProvider('providerAttributHtml')] |
|
| 21 | + public function testAttributHtml($expected, $texte): void { |
|
| 22 | + $actual = attribut_html($texte); |
|
| 23 | + $this->assertSame($expected, $actual); |
|
| 24 | + } |
|
| 25 | 25 | |
| 26 | - public static function providerAttributHtml(): array { |
|
| 27 | - return [ |
|
| 28 | - 0 => [ |
|
| 29 | - 'expected' => 'aujourd'hui > "30" → 50', |
|
| 30 | - 'texte' => 'aujourd\'hui > "30" → <a href=\'http://www.spip.net\'>50</a>', |
|
| 31 | - ], |
|
| 32 | - 1 => [ |
|
| 33 | - 'expected' => 'L'histoire 'très' "folle" des métas en iitalik', |
|
| 34 | - 'texte' => 'L\'histoire \'très\' "folle" <strong>des</strong> métas<p>en <em>ii</em>talik</p>', |
|
| 35 | - ], |
|
| 36 | - 2 => [ |
|
| 37 | - 'expected' => 'allons à la mer', |
|
| 38 | - 'texte' => 'allons ' . chr(195) . chr(160) . ' la mer', // le a` risque de matcher \s |
|
| 39 | - ], |
|
| 40 | - ]; |
|
| 41 | - } |
|
| 26 | + public static function providerAttributHtml(): array { |
|
| 27 | + return [ |
|
| 28 | + 0 => [ |
|
| 29 | + 'expected' => 'aujourd'hui > "30" → 50', |
|
| 30 | + 'texte' => 'aujourd\'hui > "30" → <a href=\'http://www.spip.net\'>50</a>', |
|
| 31 | + ], |
|
| 32 | + 1 => [ |
|
| 33 | + 'expected' => 'L'histoire 'très' "folle" des métas en iitalik', |
|
| 34 | + 'texte' => 'L\'histoire \'très\' "folle" <strong>des</strong> métas<p>en <em>ii</em>talik</p>', |
|
| 35 | + ], |
|
| 36 | + 2 => [ |
|
| 37 | + 'expected' => 'allons à la mer', |
|
| 38 | + 'texte' => 'allons ' . chr(195) . chr(160) . ' la mer', // le a` risque de matcher \s |
|
| 39 | + ], |
|
| 40 | + ]; |
|
| 41 | + } |
|
| 42 | 42 | } |
@@ -35,7 +35,7 @@ |
||
| 35 | 35 | ], |
| 36 | 36 | 2 => [ |
| 37 | 37 | 'expected' => 'allons à la mer', |
| 38 | - 'texte' => 'allons ' . chr(195) . chr(160) . ' la mer', // le a` risque de matcher \s |
|
| 38 | + 'texte' => 'allons '.chr(195).chr(160).' la mer', // le a` risque de matcher \s |
|
| 39 | 39 | ], |
| 40 | 40 | ]; |
| 41 | 41 | } |
@@ -13,68 +13,68 @@ |
||
| 13 | 13 | |
| 14 | 14 | class CorrigerEntitesHtmlTest extends TestCase |
| 15 | 15 | { |
| 16 | - public static function setUpBeforeClass(): void { |
|
| 17 | - find_in_path('./inc/filtres.php', '', true); |
|
| 18 | - } |
|
| 16 | + public static function setUpBeforeClass(): void { |
|
| 17 | + find_in_path('./inc/filtres.php', '', true); |
|
| 18 | + } |
|
| 19 | 19 | |
| 20 | - #[DataProvider('providerFiltresCorrigerEntitesHtml')] |
|
| 21 | - public function testFiltresCorrigerEntitesHtml($expected, ...$args): void { |
|
| 22 | - $actual = corriger_entites_html(...$args); |
|
| 23 | - $this->assertSame($expected, $actual); |
|
| 24 | - } |
|
| 20 | + #[DataProvider('providerFiltresCorrigerEntitesHtml')] |
|
| 21 | + public function testFiltresCorrigerEntitesHtml($expected, ...$args): void { |
|
| 22 | + $actual = corriger_entites_html(...$args); |
|
| 23 | + $this->assertSame($expected, $actual); |
|
| 24 | + } |
|
| 25 | 25 | |
| 26 | - public static function providerFiltresCorrigerEntitesHtml(): array { |
|
| 27 | - return [ |
|
| 28 | - 0 => [ |
|
| 29 | - 0 => '', |
|
| 30 | - 1 => '', |
|
| 31 | - ], |
|
| 32 | - 1 => [ |
|
| 33 | - 0 => '0', |
|
| 34 | - 1 => '0', |
|
| 35 | - ], |
|
| 36 | - 2 => [ |
|
| 37 | - 0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net', |
|
| 38 | - 1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net', |
|
| 39 | - ], |
|
| 40 | - 3 => [ |
|
| 41 | - 0 => 'Un texte avec des entités &<>"', |
|
| 42 | - 1 => 'Un texte avec des entités &<>"', |
|
| 43 | - ], |
|
| 44 | - 4 => [ |
|
| 45 | - 0 => 'Un texte avec des entit&eacute;s echap&eacute; &&lt;&gt;&quot;', |
|
| 46 | - 1 => 'Un texte avec des entit&eacute;s echap&eacute; &amp;&lt;&gt;&quot;', |
|
| 47 | - ], |
|
| 48 | - 5 => [ |
|
| 49 | - 0 => 'Un texte avec des entités numériques &<>"', |
|
| 50 | - 1 => 'Un texte avec des entités numériques &<>"', |
|
| 51 | - ], |
|
| 52 | - 6 => [ |
|
| 53 | - 0 => 'Un texte avec des entités numériques echapées &#38;&#60;&#62;&quot;', |
|
| 54 | - 1 => 'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &#38;&#60;&#62;&quot;', |
|
| 55 | - ], |
|
| 56 | - 7 => [ |
|
| 57 | - 0 => 'Un texte sans entites &<>"\'', |
|
| 58 | - 1 => 'Un texte sans entites &<>"\'', |
|
| 59 | - ], |
|
| 60 | - 8 => [ |
|
| 61 | - 0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 62 | - 1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 63 | - ], |
|
| 64 | - 9 => [ |
|
| 65 | - 0 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>', |
|
| 66 | - 1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>', |
|
| 67 | - ], |
|
| 68 | - 10 => [ |
|
| 69 | - 0 => 'Un texte avec des retour |
|
| 26 | + public static function providerFiltresCorrigerEntitesHtml(): array { |
|
| 27 | + return [ |
|
| 28 | + 0 => [ |
|
| 29 | + 0 => '', |
|
| 30 | + 1 => '', |
|
| 31 | + ], |
|
| 32 | + 1 => [ |
|
| 33 | + 0 => '0', |
|
| 34 | + 1 => '0', |
|
| 35 | + ], |
|
| 36 | + 2 => [ |
|
| 37 | + 0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net', |
|
| 38 | + 1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net', |
|
| 39 | + ], |
|
| 40 | + 3 => [ |
|
| 41 | + 0 => 'Un texte avec des entités &<>"', |
|
| 42 | + 1 => 'Un texte avec des entités &<>"', |
|
| 43 | + ], |
|
| 44 | + 4 => [ |
|
| 45 | + 0 => 'Un texte avec des entit&eacute;s echap&eacute; &&lt;&gt;&quot;', |
|
| 46 | + 1 => 'Un texte avec des entit&eacute;s echap&eacute; &amp;&lt;&gt;&quot;', |
|
| 47 | + ], |
|
| 48 | + 5 => [ |
|
| 49 | + 0 => 'Un texte avec des entités numériques &<>"', |
|
| 50 | + 1 => 'Un texte avec des entités numériques &<>"', |
|
| 51 | + ], |
|
| 52 | + 6 => [ |
|
| 53 | + 0 => 'Un texte avec des entités numériques echapées &#38;&#60;&#62;&quot;', |
|
| 54 | + 1 => 'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &#38;&#60;&#62;&quot;', |
|
| 55 | + ], |
|
| 56 | + 7 => [ |
|
| 57 | + 0 => 'Un texte sans entites &<>"\'', |
|
| 58 | + 1 => 'Un texte sans entites &<>"\'', |
|
| 59 | + ], |
|
| 60 | + 8 => [ |
|
| 61 | + 0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 62 | + 1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 63 | + ], |
|
| 64 | + 9 => [ |
|
| 65 | + 0 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>', |
|
| 66 | + 1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>', |
|
| 67 | + ], |
|
| 68 | + 10 => [ |
|
| 69 | + 0 => 'Un texte avec des retour |
|
| 70 | 70 | a la ligne et meme des |
| 71 | 71 | |
| 72 | 72 | paragraphes', |
| 73 | - 1 => 'Un texte avec des retour |
|
| 73 | + 1 => 'Un texte avec des retour |
|
| 74 | 74 | a la ligne et meme des |
| 75 | 75 | |
| 76 | 76 | paragraphes', |
| 77 | - ], |
|
| 78 | - ]; |
|
| 79 | - } |
|
| 77 | + ], |
|
| 78 | + ]; |
|
| 79 | + } |
|
| 80 | 80 | } |
@@ -9,214 +9,214 @@ |
||
| 9 | 9 | |
| 10 | 10 | class ExtraireAttributTest extends TestCase |
| 11 | 11 | { |
| 12 | - public static function setUpBeforeClass(): void { |
|
| 13 | - find_in_path('inc/filtres.php', '', true); |
|
| 14 | - } |
|
| 12 | + public static function setUpBeforeClass(): void { |
|
| 13 | + find_in_path('inc/filtres.php', '', true); |
|
| 14 | + } |
|
| 15 | 15 | |
| 16 | - #[DataProvider('providerExtraireAttribut')] |
|
| 17 | - public function testExtraireAttribut($expected, ...$args): void { |
|
| 18 | - $actual = extraire_attribut(...$args); |
|
| 19 | - $this->assertSame($expected, $actual); |
|
| 20 | - } |
|
| 16 | + #[DataProvider('providerExtraireAttribut')] |
|
| 17 | + public function testExtraireAttribut($expected, ...$args): void { |
|
| 18 | + $actual = extraire_attribut(...$args); |
|
| 19 | + $this->assertSame($expected, $actual); |
|
| 20 | + } |
|
| 21 | 21 | |
| 22 | - public static function providerExtraireAttribut(): array { |
|
| 23 | - find_in_path('inc/filtres.php', '', true); |
|
| 24 | - return [ |
|
| 25 | - 'img-src' => [ |
|
| 26 | - 'expected' => 'sha\'dok', |
|
| 27 | - 'balise' => '<img src="sha\'dok" width="10" height=100 />', |
|
| 28 | - 'attribut' => 'src', |
|
| 29 | - ], |
|
| 30 | - 'img-width' => [ |
|
| 31 | - 'expected' => '10', |
|
| 32 | - 'balise' => '<img src="sha\'dok" width="10" height=100 />', |
|
| 33 | - 'attribut' => 'width', |
|
| 34 | - ], |
|
| 35 | - 'img-height' => [ |
|
| 36 | - 'expected' => '100', |
|
| 37 | - 'balise' => '<img src="sha\'dok" width="10" height=100 />', |
|
| 38 | - 'attribut' => 'height', |
|
| 39 | - ], |
|
| 40 | - 'img-entites' => [ |
|
| 41 | - 'expected' => '"&\'', |
|
| 42 | - 'balise' => inserer_attribut('<img width=10>', 'src', '"&\''), |
|
| 43 | - 'attribut' => 'src', |
|
| 44 | - ], |
|
| 45 | - 'img-entites-width' => [ |
|
| 46 | - 'expected' => '10', |
|
| 47 | - 'balise' => inserer_attribut('<img width=10>', 'src', '"&\''), |
|
| 48 | - 'attribut' => 'width', |
|
| 49 | - ], |
|
| 50 | - // Dans les crayons on s'etait fait avoir par un titre |
|
| 51 | - // qui valait "<span class="color:xxx;">Titre</span> |
|
| 52 | - // et que inserer_attribut detruisait en inserant a tort |
|
| 53 | - // le style='width:560px' dans l'attribut value="" du <input/> |
|
| 54 | - // (bon je sais c'est pas clair) |
|
| 55 | - 'attribut imbrique' => [ |
|
| 56 | - 'expected' => '<span style="color:red;">ho</span>', |
|
| 57 | - 'balise' => inserer_attribut( |
|
| 58 | - inserer_attribut('<input />', 'value', '<span style="color:red;">ho</span>'), |
|
| 59 | - 'style', |
|
| 60 | - 'width: 120px;' |
|
| 61 | - ), |
|
| 62 | - 'attribut' => 'value', |
|
| 63 | - ], |
|
| 64 | - // attribut autodefini |
|
| 65 | - 'attribut autodefini #1' => [ |
|
| 66 | - 'expected' => 'checked', |
|
| 67 | - 'balise' => '<input checked />', |
|
| 68 | - 'attribut' => 'checked', |
|
| 69 | - ], |
|
| 70 | - 'attribut autodefini #2' => [ |
|
| 71 | - 'expected' => 'checked', |
|
| 72 | - 'balise' => '<input checked/>', |
|
| 73 | - 'attribut' => 'checked', |
|
| 74 | - ], |
|
| 75 | - 'attribut autodefini #3' => [ |
|
| 76 | - 'expected' => 'checked', |
|
| 77 | - 'balise' => '<input checked>', |
|
| 78 | - 'attribut' => 'checked', |
|
| 79 | - ], |
|
| 80 | - // inserer un attribut deja existant |
|
| 81 | - 'remplacement attribut' => [ |
|
| 82 | - 'expected' => 'b', |
|
| 83 | - 'balise' => inserer_attribut('<img src="a" width=12>', 'src', 'b'), |
|
| 84 | - 'attribut' => 'src', |
|
| 85 | - ], |
|
| 86 | - // Ne pas confondre "", "0" et attribut autodefini |
|
| 87 | - 'title=\'\'' => [ |
|
| 88 | - 'expected' => '', |
|
| 89 | - 'balise' => '<a title=\'\'>', |
|
| 90 | - 'attribut' => 'title', |
|
| 91 | - ], |
|
| 92 | - 'title=""' => [ |
|
| 93 | - 'expected' => '', |
|
| 94 | - 'balise' => '<a title="">', |
|
| 95 | - 'attribut' => 'title', |
|
| 96 | - ], |
|
| 97 | - 'width=0' => [ |
|
| 98 | - 'expected' => '0', |
|
| 99 | - 'balise' => '<img width=0>', |
|
| 100 | - 'attribut' => 'width', |
|
| 101 | - ], |
|
| 102 | - 'width=\'0\'' => [ |
|
| 103 | - 'expected' => '0', |
|
| 104 | - 'balise' => '<img width=\'0\'>', |
|
| 105 | - 'attribut' => 'width', |
|
| 106 | - ], |
|
| 107 | - 'width="0"' => [ |
|
| 108 | - 'expected' => '0', |
|
| 109 | - 'balise' => '<img width="0">', |
|
| 110 | - 'attribut' => 'width', |
|
| 111 | - ], |
|
| 112 | - // extraire un attribut d'une balise xml:truc : |
|
| 113 | - 'xml:deuxpoints' => [ |
|
| 114 | - 'expected' => 'a', |
|
| 115 | - 'balise' => '<chose:truc machin=\'a\'/>', |
|
| 116 | - 'attribut' => 'machin', |
|
| 117 | - ], |
|
| 118 | - // manipuler des listes de balises |
|
| 119 | - 'liste' => [ |
|
| 120 | - 'expected' => ['a', 'b'], |
|
| 121 | - 'balise' => ['<chose machin="a"/>', '<chose machin="b"/>'], |
|
| 122 | - 'attribut' => 'machin', |
|
| 123 | - ], |
|
| 124 | - // ne pas confondre d’attribut |
|
| 125 | - 'nom attribut partiel #1' => [ |
|
| 126 | - 'expected' => null, |
|
| 127 | - 'balise' => '<img mysrc="test">', |
|
| 128 | - 'attribut' => 'src', |
|
| 129 | - ], |
|
| 130 | - 'nom attribut partiel #2' => [ |
|
| 131 | - 'expected' => null, |
|
| 132 | - 'balise' => '<img src-alt="test">', |
|
| 133 | - 'attribut' => 'src', |
|
| 134 | - ], |
|
| 135 | - 'nom attribut partiel #3' => [ |
|
| 136 | - 'expected' => null, |
|
| 137 | - 'balise' => '<img data-src="test">', |
|
| 138 | - 'attribut' => 'src', |
|
| 139 | - ], |
|
| 140 | - // Attrapper un attribut d'un tag interne (oui oui)... |
|
| 141 | - 'extraction tag interne' => [ |
|
| 142 | - 'expected' => 'image', |
|
| 143 | - 'balise' => '<a href="url"><img src="image" /></a>', |
|
| 144 | - 'attribut' => 'src', |
|
| 145 | - ], |
|
| 146 | - // autoriser les points et tirets dans les attributs |
|
| 147 | - 'points et tirets #1' => [ |
|
| 148 | - 'expected' => '1', |
|
| 149 | - 'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />', |
|
| 150 | - 'attribut' => 'toto', |
|
| 151 | - ], |
|
| 152 | - 'points et tirets #2' => [ |
|
| 153 | - 'expected' => 'yo', |
|
| 154 | - 'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />', |
|
| 155 | - 'attribut' => 'chose.truc', |
|
| 156 | - ], |
|
| 157 | - 'points et tirets #3' => [ |
|
| 158 | - 'expected' => 'ouais', |
|
| 159 | - 'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />', |
|
| 160 | - 'attribut' => 'machin-lol', |
|
| 161 | - ], |
|
| 162 | - 'tirets et pas tirets #1' => [ |
|
| 163 | - 'expected' => 'a', |
|
| 164 | - 'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />', |
|
| 165 | - 'attribut' => 'toto-a', |
|
| 166 | - ], |
|
| 167 | - 'tirets et pas tirets #2' => [ |
|
| 168 | - 'expected' => 'b', |
|
| 169 | - 'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />', |
|
| 170 | - 'attribut' => 'toto-b', |
|
| 171 | - ], |
|
| 172 | - 'tirets et pas tirets #3' => [ |
|
| 173 | - 'expected' => '1', |
|
| 174 | - 'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />', |
|
| 175 | - 'attribut' => 'toto', |
|
| 176 | - ], |
|
| 177 | - ]; |
|
| 178 | - } |
|
| 22 | + public static function providerExtraireAttribut(): array { |
|
| 23 | + find_in_path('inc/filtres.php', '', true); |
|
| 24 | + return [ |
|
| 25 | + 'img-src' => [ |
|
| 26 | + 'expected' => 'sha\'dok', |
|
| 27 | + 'balise' => '<img src="sha\'dok" width="10" height=100 />', |
|
| 28 | + 'attribut' => 'src', |
|
| 29 | + ], |
|
| 30 | + 'img-width' => [ |
|
| 31 | + 'expected' => '10', |
|
| 32 | + 'balise' => '<img src="sha\'dok" width="10" height=100 />', |
|
| 33 | + 'attribut' => 'width', |
|
| 34 | + ], |
|
| 35 | + 'img-height' => [ |
|
| 36 | + 'expected' => '100', |
|
| 37 | + 'balise' => '<img src="sha\'dok" width="10" height=100 />', |
|
| 38 | + 'attribut' => 'height', |
|
| 39 | + ], |
|
| 40 | + 'img-entites' => [ |
|
| 41 | + 'expected' => '"&\'', |
|
| 42 | + 'balise' => inserer_attribut('<img width=10>', 'src', '"&\''), |
|
| 43 | + 'attribut' => 'src', |
|
| 44 | + ], |
|
| 45 | + 'img-entites-width' => [ |
|
| 46 | + 'expected' => '10', |
|
| 47 | + 'balise' => inserer_attribut('<img width=10>', 'src', '"&\''), |
|
| 48 | + 'attribut' => 'width', |
|
| 49 | + ], |
|
| 50 | + // Dans les crayons on s'etait fait avoir par un titre |
|
| 51 | + // qui valait "<span class="color:xxx;">Titre</span> |
|
| 52 | + // et que inserer_attribut detruisait en inserant a tort |
|
| 53 | + // le style='width:560px' dans l'attribut value="" du <input/> |
|
| 54 | + // (bon je sais c'est pas clair) |
|
| 55 | + 'attribut imbrique' => [ |
|
| 56 | + 'expected' => '<span style="color:red;">ho</span>', |
|
| 57 | + 'balise' => inserer_attribut( |
|
| 58 | + inserer_attribut('<input />', 'value', '<span style="color:red;">ho</span>'), |
|
| 59 | + 'style', |
|
| 60 | + 'width: 120px;' |
|
| 61 | + ), |
|
| 62 | + 'attribut' => 'value', |
|
| 63 | + ], |
|
| 64 | + // attribut autodefini |
|
| 65 | + 'attribut autodefini #1' => [ |
|
| 66 | + 'expected' => 'checked', |
|
| 67 | + 'balise' => '<input checked />', |
|
| 68 | + 'attribut' => 'checked', |
|
| 69 | + ], |
|
| 70 | + 'attribut autodefini #2' => [ |
|
| 71 | + 'expected' => 'checked', |
|
| 72 | + 'balise' => '<input checked/>', |
|
| 73 | + 'attribut' => 'checked', |
|
| 74 | + ], |
|
| 75 | + 'attribut autodefini #3' => [ |
|
| 76 | + 'expected' => 'checked', |
|
| 77 | + 'balise' => '<input checked>', |
|
| 78 | + 'attribut' => 'checked', |
|
| 79 | + ], |
|
| 80 | + // inserer un attribut deja existant |
|
| 81 | + 'remplacement attribut' => [ |
|
| 82 | + 'expected' => 'b', |
|
| 83 | + 'balise' => inserer_attribut('<img src="a" width=12>', 'src', 'b'), |
|
| 84 | + 'attribut' => 'src', |
|
| 85 | + ], |
|
| 86 | + // Ne pas confondre "", "0" et attribut autodefini |
|
| 87 | + 'title=\'\'' => [ |
|
| 88 | + 'expected' => '', |
|
| 89 | + 'balise' => '<a title=\'\'>', |
|
| 90 | + 'attribut' => 'title', |
|
| 91 | + ], |
|
| 92 | + 'title=""' => [ |
|
| 93 | + 'expected' => '', |
|
| 94 | + 'balise' => '<a title="">', |
|
| 95 | + 'attribut' => 'title', |
|
| 96 | + ], |
|
| 97 | + 'width=0' => [ |
|
| 98 | + 'expected' => '0', |
|
| 99 | + 'balise' => '<img width=0>', |
|
| 100 | + 'attribut' => 'width', |
|
| 101 | + ], |
|
| 102 | + 'width=\'0\'' => [ |
|
| 103 | + 'expected' => '0', |
|
| 104 | + 'balise' => '<img width=\'0\'>', |
|
| 105 | + 'attribut' => 'width', |
|
| 106 | + ], |
|
| 107 | + 'width="0"' => [ |
|
| 108 | + 'expected' => '0', |
|
| 109 | + 'balise' => '<img width="0">', |
|
| 110 | + 'attribut' => 'width', |
|
| 111 | + ], |
|
| 112 | + // extraire un attribut d'une balise xml:truc : |
|
| 113 | + 'xml:deuxpoints' => [ |
|
| 114 | + 'expected' => 'a', |
|
| 115 | + 'balise' => '<chose:truc machin=\'a\'/>', |
|
| 116 | + 'attribut' => 'machin', |
|
| 117 | + ], |
|
| 118 | + // manipuler des listes de balises |
|
| 119 | + 'liste' => [ |
|
| 120 | + 'expected' => ['a', 'b'], |
|
| 121 | + 'balise' => ['<chose machin="a"/>', '<chose machin="b"/>'], |
|
| 122 | + 'attribut' => 'machin', |
|
| 123 | + ], |
|
| 124 | + // ne pas confondre d’attribut |
|
| 125 | + 'nom attribut partiel #1' => [ |
|
| 126 | + 'expected' => null, |
|
| 127 | + 'balise' => '<img mysrc="test">', |
|
| 128 | + 'attribut' => 'src', |
|
| 129 | + ], |
|
| 130 | + 'nom attribut partiel #2' => [ |
|
| 131 | + 'expected' => null, |
|
| 132 | + 'balise' => '<img src-alt="test">', |
|
| 133 | + 'attribut' => 'src', |
|
| 134 | + ], |
|
| 135 | + 'nom attribut partiel #3' => [ |
|
| 136 | + 'expected' => null, |
|
| 137 | + 'balise' => '<img data-src="test">', |
|
| 138 | + 'attribut' => 'src', |
|
| 139 | + ], |
|
| 140 | + // Attrapper un attribut d'un tag interne (oui oui)... |
|
| 141 | + 'extraction tag interne' => [ |
|
| 142 | + 'expected' => 'image', |
|
| 143 | + 'balise' => '<a href="url"><img src="image" /></a>', |
|
| 144 | + 'attribut' => 'src', |
|
| 145 | + ], |
|
| 146 | + // autoriser les points et tirets dans les attributs |
|
| 147 | + 'points et tirets #1' => [ |
|
| 148 | + 'expected' => '1', |
|
| 149 | + 'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />', |
|
| 150 | + 'attribut' => 'toto', |
|
| 151 | + ], |
|
| 152 | + 'points et tirets #2' => [ |
|
| 153 | + 'expected' => 'yo', |
|
| 154 | + 'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />', |
|
| 155 | + 'attribut' => 'chose.truc', |
|
| 156 | + ], |
|
| 157 | + 'points et tirets #3' => [ |
|
| 158 | + 'expected' => 'ouais', |
|
| 159 | + 'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />', |
|
| 160 | + 'attribut' => 'machin-lol', |
|
| 161 | + ], |
|
| 162 | + 'tirets et pas tirets #1' => [ |
|
| 163 | + 'expected' => 'a', |
|
| 164 | + 'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />', |
|
| 165 | + 'attribut' => 'toto-a', |
|
| 166 | + ], |
|
| 167 | + 'tirets et pas tirets #2' => [ |
|
| 168 | + 'expected' => 'b', |
|
| 169 | + 'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />', |
|
| 170 | + 'attribut' => 'toto-b', |
|
| 171 | + ], |
|
| 172 | + 'tirets et pas tirets #3' => [ |
|
| 173 | + 'expected' => '1', |
|
| 174 | + 'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />', |
|
| 175 | + 'attribut' => 'toto', |
|
| 176 | + ], |
|
| 177 | + ]; |
|
| 178 | + } |
|
| 179 | 179 | |
| 180 | - public function testExtraireAttributSpecial() { |
|
| 181 | - $this->assertStringNotContainsString( |
|
| 182 | - 'x', |
|
| 183 | - inserer_attribut('<a><img src="x"/></a>', 'src', 'y'), |
|
| 184 | - 'erreur remplacement tag interne' |
|
| 185 | - ); |
|
| 180 | + public function testExtraireAttributSpecial() { |
|
| 181 | + $this->assertStringNotContainsString( |
|
| 182 | + 'x', |
|
| 183 | + inserer_attribut('<a><img src="x"/></a>', 'src', 'y'), |
|
| 184 | + 'erreur remplacement tag interne' |
|
| 185 | + ); |
|
| 186 | 186 | |
| 187 | - $balise = <<<HTML |
|
| 187 | + $balise = <<<HTML |
|
| 188 | 188 | <img |
| 189 | 189 | src='sites/sunny/local/cache-gd2/648a4f8c1b5f8885415bc80228800d87.png' |
| 190 | 190 | width='96' height='96' style='height:96px;width:96px;' |
| 191 | 191 | class='format_png' /> |
| 192 | 192 | HTML; |
| 193 | - $this->assertSame( |
|
| 194 | - 'sites/sunny/local/cache-gd2/648a4f8c1b5f8885415bc80228800d87.png', |
|
| 195 | - extraire_attribut($balise, 'src'), |
|
| 196 | - 'Une image + src parfois ca casse, va comprendre' |
|
| 197 | - ); |
|
| 198 | - } |
|
| 193 | + $this->assertSame( |
|
| 194 | + 'sites/sunny/local/cache-gd2/648a4f8c1b5f8885415bc80228800d87.png', |
|
| 195 | + extraire_attribut($balise, 'src'), |
|
| 196 | + 'Une image + src parfois ca casse, va comprendre' |
|
| 197 | + ); |
|
| 198 | + } |
|
| 199 | 199 | |
| 200 | 200 | |
| 201 | - #[DataProvider('providerBase64')] |
|
| 202 | - public function testBase64($expected, ...$args): void { |
|
| 203 | - $actual = extraire_attribut(...$args); |
|
| 204 | - $this->assertSame($expected, $actual); |
|
| 205 | - } |
|
| 201 | + #[DataProvider('providerBase64')] |
|
| 202 | + public function testBase64($expected, ...$args): void { |
|
| 203 | + $actual = extraire_attribut(...$args); |
|
| 204 | + $this->assertSame($expected, $actual); |
|
| 205 | + } |
|
| 206 | 206 | |
| 207 | - public static function providerBase64(): array { |
|
| 208 | - return [ |
|
| 209 | - 'base64 #1' => [ |
|
| 210 | - 'expected' => 'PGEgbmFtZT0nZm9ybTEnPjwvYT4KPGRpdiBjbGFzcz0nc3BpcF9mb3Jtcyc+Cgo8ZGl2IGNsYXNzPSdzcGlwX2Rlc2NyaXB0aWYnPjwvZGl2PgoKCgoKIAoJIAoJPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249J0NvbnRhY3QuaHRtbCNmb3JtMScKCQllbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KCQkKCQk8ZGl2PgoJCQoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9hZG1pbi8talF1ZXJ5L2ltZ19wYWNrL2xheWVyLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvanMvc3BpcF9iYXJyZS5qcyI+PC9zY3JpcHQ+PHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnTWV0dHJlIGVuIHtpdGFsaXF1ZX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7e2dyYXN9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnQ2l0ZXIgdW4gbWVzc2FnZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnIHZhbGlnbj0nbWlkZGxlJz48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc0JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc2Jz48aW5wdXQgZGlzYWJsZWQ9J2Rpc2FibGVkJyB0eXBlPSd0ZXh0JyBpZD0nYmFycmVfMScgc2l6ZT0nNDUnIG1heGxlbmd0aD0nMTAwJyBzdHlsZT0nd2lkdGg6YXV0bzsgZm9udC1zaXplOjExcHg7IGNvbG9yOiBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsgYm9yZGVyOiAwcHggc29saWQgI2RlZGVkZTsnCnZhbHVlPSJVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZSIgLz48L3RkPjwvdHI+PC90YWJsZT48ZGl2IGlkPSdMYXllcjEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjInIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIzJyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0cj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87IHRleHQtYWxpZ246Y2VudGVyOyI+PHN0cm9uZz5HZXN0aW9uIGRlcyBhbmNyZXM8L3N0cm9uZz48L3RkPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+VHJhbnNmb3JtZXIgZW4gYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9ub20iPjxpPk5vbSBkZSBsJ2FuY3JlPC9pPjwvbGFiZWw+IDxiciAvPg0KICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX25vbSIgaWQ9ImFuY3JlX25vbSIgLz4NCgkgIA0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2FuY3JlKCdbJywgJzwtJywgJ10nLCBhbmNyZV9ub20udmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPg0KICAgIDwvdGQ+DQoJPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5Qb2ludGVyIHZlcnMgdW5lIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfY2libGUiPjxpPkFuY3JlIGNpYmxlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9jaWJsZSIgaWQ9ImFuY3JlX2NpYmxlIiAvPjxiciAvPg0KCTxsYWJlbCBmb3I9ImFuY3JlX2J1bGxlIj48aT5CdWxsZSBkJ2FpZGUgYW5jcmU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2J1bGxlIiBpZD0iYW5jcmVfYnVsbGUiIC8+DQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZSgnWycsICctPiMnLCAnXScsIGFuY3JlX2NpYmxlLnZhbHVlLCBhbmNyZV9idWxsZS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI0JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM5Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFjdXRlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwZTYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ0EgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTyBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7aXRhbGlxdWV9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdNZXR0cmUgZW4ge3tncmFzfX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3Jhcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgZW4ge3tncmFzfX0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbGllbi5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclNUNuJTVDbiUzQ3F1b3RlJTNFJywnJTNDL3F1b3RlJTNFJTVDbiU1Q24nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaXRlciB1biBtZXNzYWdlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NpdGVyIHVuIG1lc3NhZ2UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnOScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2xhdmllci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNic+PGlucHV0IGRpc2FibGVkPSdkaXNhYmxlZCcgdHlwZT0ndGV4dCcgaWQ9J2JhcnJlXzInIHNpemU9JzQ1JyBtYXhsZW5ndGg9JzEwMCcgc3R5bGU9J3dpZHRoOmF1dG87IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7IGJvcmRlcjogMHB4IHNvbGlkICNkZWRlZGU7Jwp2YWx1ZT0iVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UiIC8+PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXI2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4NCk5iIGNvbG9ubmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJjb2xvbmVzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAgIC8+PC90ZD48dGQ+DQpOYiBsaWduZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYnJhbmdzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAvPjwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2VudGV0ZSIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBFbnRldGU8L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9jYXB0aW9uIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IENhcHRpb24gZXQgUiZlYWN1dGU7c3VtJmVhY3V0ZTs8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6DQogICAgYmFycmVfbmJjb2xvbmVzLnZhbHVlID0gTWF0aC5hYnMoYmFycmVfbmJjb2xvbmVzLnZhbHVlKTsgYmFycmVfbmJyYW5ncy52YWx1ZQ0KICAgID0gTWF0aC5hYnMoYmFycmVfbmJyYW5ncy52YWx1ZSk7DQogICAgaWYgKCEoYmFycmVfbmJjb2xvbmVzLnZhbHVlID09IDAgfHwgYmFycmVfbmJyYW5ncy52YWx1ZSA9PSAwKSkgew0KICAgIGJhcnJlX3RhYmxlYXUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpLCBiYXJyZV9uYmNvbG9uZXMudmFsdWUsIGJhcnJlX25icmFuZ3MudmFsdWUsDQogICAgYmFycmVfZG9lbnRldGUuY2hlY2tlZCwgYmFycmVfZG9jYXB0aW9uLmNoZWNrZWQpOyB9ICIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI3JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHIgY2xhc3M9InNwaXBfYmFycmUiPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6MzAlOyI+Q2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4PC90ZD4NCiAgICA8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDBhYn4nLCd+XHUwMGJiJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDA5MycsJ1x1MDA5NCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0VudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMtc2ltcGxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzAnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnQScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJm9lbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmT0VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08gbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jY2VkaWwtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZldXJvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V1cm8ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIC8+PC9hPiZuYnNwOw0KICAgIDwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZCBzdHlsZT0id2lkdGg6IDI1JTsiPkNoZXJjaGVyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX2NoZXJjaGVyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+PC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2Nhc2UiIHZhbHVlPSJ5ZXMiIC8+UmVzcGVjdGVyIGxhIGNhc3NlPGJyIC8+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfZW50aWVyIiB2YWx1ZT0ieWVzIiAvPg0KTW90IGVudGllcg0KPC90ZD48dGQgIHN0eWxlPSJ3aWR0aDogMjUlOyI+UmVtcGxhY2VyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX3JlbXBsYWNlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPiANCjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY190b3V0IiB2YWx1ZT0ieWVzIiAvPlRvdXQgcmVtcGxhY2VyPC90ZD48dGQgc3R5bGU9IndpZHRoOiAxMCU7Ij4NCiAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIg0KICBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX3NlYXJjaHJlcGxhY2UoZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9jaGVyY2hlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9yZW1wbGFjZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX3RvdXQuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfY2FzZS5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19lbnRpZXIuY2hlY2tlZCxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PgoJPHRleHRhcmVhIG5hbWU9J3RleHRlXzInIHJvd3M9JzEwJyBjbGFzcz0nZm9ybWwgICAnIGNvbHM9JzgwJwoJaWQ9J2lucHV0LTEtdGV4dGVfMicKCW9uc2VsZWN0PSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25rZXl1cD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmRibGNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOyc+PC90ZXh0YXJlYT4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKIAoJPC9maWVsZHNldD4KCiAKIAoJCgk8cCBzdHlsZT0nZGlzcGxheTpub25lOyc+PGxhYmVsIGZvcj0ibm9ib3Rub2JvdC0xIj5WZXVpbGxleiBsYWlzc2VyIGNlIGNoYW1wIHZpZGUmbmJzcDs6PC9sYWJlbD4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJub2JvdG5vYm90IiBpZD0ibm9ib3Rub2JvdC0xIiB2YWx1ZT0iIiBzaXplPSIxMCIgLz48L3A+CgkKCTxkaXYgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnIGNsYXNzPSdzcGlwX2JvdXRvbic+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0nVmFsaWRlcicgdmFsdWU9IlZhbGlkZXIiIC8+PC9kaXY+CgoKPHNjcmlwdCBzcmM9Imh0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvZm9ybXMvamF2YXNjcmlwdC9qdGlwLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KJCgnaW5wdXQuZm9ybW8nKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbycpLmFkZENsYXNzKCdmb3Jtby1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbycpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybW8tZm9jdXMnKS5hZGRDbGFzcygnZm9ybW8nKTt9KTsKJCgnaW5wdXQuZm9ybWwnKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbCcpLmFkZENsYXNzKCdmb3JtbC1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbCcpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybWwtZm9jdXMnKS5hZGRDbGFzcygnZm9ybWwnKTt9KTsKCi8vLS0+PC9zY3JpcHQ+CgoJIAoJPC9mb3JtPgoJCgkKCQoKCjwvZGl2Pg==', |
|
| 211 | - 'balise' => '<div class="base64" title="PGEgbmFtZT0nZm9ybTEnPjwvYT4KPGRpdiBjbGFzcz0nc3BpcF9mb3Jtcyc+Cgo8ZGl2IGNsYXNzPSdzcGlwX2Rlc2NyaXB0aWYnPjwvZGl2PgoKCgoKIAoJIAoJPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249J0NvbnRhY3QuaHRtbCNmb3JtMScKCQllbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KCQkKCQk8ZGl2PgoJCQoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9hZG1pbi8talF1ZXJ5L2ltZ19wYWNrL2xheWVyLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvanMvc3BpcF9iYXJyZS5qcyI+PC9zY3JpcHQ+PHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnTWV0dHJlIGVuIHtpdGFsaXF1ZX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7e2dyYXN9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnQ2l0ZXIgdW4gbWVzc2FnZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnIHZhbGlnbj0nbWlkZGxlJz48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc0JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc2Jz48aW5wdXQgZGlzYWJsZWQ9J2Rpc2FibGVkJyB0eXBlPSd0ZXh0JyBpZD0nYmFycmVfMScgc2l6ZT0nNDUnIG1heGxlbmd0aD0nMTAwJyBzdHlsZT0nd2lkdGg6YXV0bzsgZm9udC1zaXplOjExcHg7IGNvbG9yOiBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsgYm9yZGVyOiAwcHggc29saWQgI2RlZGVkZTsnCnZhbHVlPSJVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZSIgLz48L3RkPjwvdHI+PC90YWJsZT48ZGl2IGlkPSdMYXllcjEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjInIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIzJyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0cj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87IHRleHQtYWxpZ246Y2VudGVyOyI+PHN0cm9uZz5HZXN0aW9uIGRlcyBhbmNyZXM8L3N0cm9uZz48L3RkPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+VHJhbnNmb3JtZXIgZW4gYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9ub20iPjxpPk5vbSBkZSBsJ2FuY3JlPC9pPjwvbGFiZWw+IDxiciAvPg0KICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX25vbSIgaWQ9ImFuY3JlX25vbSIgLz4NCgkgIA0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2FuY3JlKCdbJywgJzwtJywgJ10nLCBhbmNyZV9ub20udmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPg0KICAgIDwvdGQ+DQoJPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5Qb2ludGVyIHZlcnMgdW5lIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfY2libGUiPjxpPkFuY3JlIGNpYmxlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9jaWJsZSIgaWQ9ImFuY3JlX2NpYmxlIiAvPjxiciAvPg0KCTxsYWJlbCBmb3I9ImFuY3JlX2J1bGxlIj48aT5CdWxsZSBkJ2FpZGUgYW5jcmU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2J1bGxlIiBpZD0iYW5jcmVfYnVsbGUiIC8+DQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZSgnWycsICctPiMnLCAnXScsIGFuY3JlX2NpYmxlLnZhbHVlLCBhbmNyZV9idWxsZS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI0JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM5Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFjdXRlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwZTYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ0EgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTyBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7aXRhbGlxdWV9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdNZXR0cmUgZW4ge3tncmFzfX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3Jhcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgZW4ge3tncmFzfX0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbGllbi5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclNUNuJTVDbiUzQ3F1b3RlJTNFJywnJTNDL3F1b3RlJTNFJTVDbiU1Q24nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaXRlciB1biBtZXNzYWdlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NpdGVyIHVuIG1lc3NhZ2UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnOScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2xhdmllci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNic+PGlucHV0IGRpc2FibGVkPSdkaXNhYmxlZCcgdHlwZT0ndGV4dCcgaWQ9J2JhcnJlXzInIHNpemU9JzQ1JyBtYXhsZW5ndGg9JzEwMCcgc3R5bGU9J3dpZHRoOmF1dG87IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7IGJvcmRlcjogMHB4IHNvbGlkICNkZWRlZGU7Jwp2YWx1ZT0iVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UiIC8+PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXI2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4NCk5iIGNvbG9ubmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJjb2xvbmVzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAgIC8+PC90ZD48dGQ+DQpOYiBsaWduZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYnJhbmdzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAvPjwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2VudGV0ZSIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBFbnRldGU8L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9jYXB0aW9uIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IENhcHRpb24gZXQgUiZlYWN1dGU7c3VtJmVhY3V0ZTs8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6DQogICAgYmFycmVfbmJjb2xvbmVzLnZhbHVlID0gTWF0aC5hYnMoYmFycmVfbmJjb2xvbmVzLnZhbHVlKTsgYmFycmVfbmJyYW5ncy52YWx1ZQ0KICAgID0gTWF0aC5hYnMoYmFycmVfbmJyYW5ncy52YWx1ZSk7DQogICAgaWYgKCEoYmFycmVfbmJjb2xvbmVzLnZhbHVlID09IDAgfHwgYmFycmVfbmJyYW5ncy52YWx1ZSA9PSAwKSkgew0KICAgIGJhcnJlX3RhYmxlYXUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpLCBiYXJyZV9uYmNvbG9uZXMudmFsdWUsIGJhcnJlX25icmFuZ3MudmFsdWUsDQogICAgYmFycmVfZG9lbnRldGUuY2hlY2tlZCwgYmFycmVfZG9jYXB0aW9uLmNoZWNrZWQpOyB9ICIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI3JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHIgY2xhc3M9InNwaXBfYmFycmUiPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6MzAlOyI+Q2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4PC90ZD4NCiAgICA8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDBhYn4nLCd+XHUwMGJiJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDA5MycsJ1x1MDA5NCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0VudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMtc2ltcGxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzAnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnQScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJm9lbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmT0VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08gbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jY2VkaWwtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZldXJvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V1cm8ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIC8+PC9hPiZuYnNwOw0KICAgIDwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZCBzdHlsZT0id2lkdGg6IDI1JTsiPkNoZXJjaGVyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX2NoZXJjaGVyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+PC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2Nhc2UiIHZhbHVlPSJ5ZXMiIC8+UmVzcGVjdGVyIGxhIGNhc3NlPGJyIC8+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfZW50aWVyIiB2YWx1ZT0ieWVzIiAvPg0KTW90IGVudGllcg0KPC90ZD48dGQgIHN0eWxlPSJ3aWR0aDogMjUlOyI+UmVtcGxhY2VyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX3JlbXBsYWNlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPiANCjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY190b3V0IiB2YWx1ZT0ieWVzIiAvPlRvdXQgcmVtcGxhY2VyPC90ZD48dGQgc3R5bGU9IndpZHRoOiAxMCU7Ij4NCiAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIg0KICBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX3NlYXJjaHJlcGxhY2UoZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9jaGVyY2hlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9yZW1wbGFjZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX3RvdXQuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfY2FzZS5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19lbnRpZXIuY2hlY2tlZCxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PgoJPHRleHRhcmVhIG5hbWU9J3RleHRlXzInIHJvd3M9JzEwJyBjbGFzcz0nZm9ybWwgICAnIGNvbHM9JzgwJwoJaWQ9J2lucHV0LTEtdGV4dGVfMicKCW9uc2VsZWN0PSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25rZXl1cD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmRibGNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOyc+PC90ZXh0YXJlYT4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKIAoJPC9maWVsZHNldD4KCiAKIAoJCgk8cCBzdHlsZT0nZGlzcGxheTpub25lOyc+PGxhYmVsIGZvcj0ibm9ib3Rub2JvdC0xIj5WZXVpbGxleiBsYWlzc2VyIGNlIGNoYW1wIHZpZGUmbmJzcDs6PC9sYWJlbD4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJub2JvdG5vYm90IiBpZD0ibm9ib3Rub2JvdC0xIiB2YWx1ZT0iIiBzaXplPSIxMCIgLz48L3A+CgkKCTxkaXYgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnIGNsYXNzPSdzcGlwX2JvdXRvbic+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0nVmFsaWRlcicgdmFsdWU9IlZhbGlkZXIiIC8+PC9kaXY+CgoKPHNjcmlwdCBzcmM9Imh0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvZm9ybXMvamF2YXNjcmlwdC9qdGlwLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KJCgnaW5wdXQuZm9ybW8nKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbycpLmFkZENsYXNzKCdmb3Jtby1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbycpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybW8tZm9jdXMnKS5hZGRDbGFzcygnZm9ybW8nKTt9KTsKJCgnaW5wdXQuZm9ybWwnKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbCcpLmFkZENsYXNzKCdmb3JtbC1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbCcpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybWwtZm9jdXMnKS5hZGRDbGFzcygnZm9ybWwnKTt9KTsKCi8vLS0+PC9zY3JpcHQ+CgoJIAoJPC9mb3JtPgoJCgkKCQoKCjwvZGl2Pg==" ></div>', |
|
| 212 | - 'attribut' => 'title', |
|
| 213 | - ], |
|
| 214 | - 'base64 #2' => [ |
|
| 215 | - 'expected' => 'bW9kZWxlIDogYTo3OntzOjQ6JnF1b3Q7bGFuZyZxdW90OztzOjI6JnF1b3Q7ZnImcXVvdDs7czo0OiZxdW90O2ZvbmQmcXVvdDs7czoxMjomcXVvdDttb2RlbGVzL2Zvcm0mcXVvdDs7czoxMDomcXVvdDtkaXJfcmFjaW5lJnF1b3Q7O3M6MzomcXVvdDsuLi8mcXVvdDs7czoyOiZxdW90O2lkJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NzomcXVvdDtpZF9mb3JtJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NDomcXVvdDtkYXRlJnF1b3Q7O3M6MTk6JnF1b3Q7MjAwNy0wNS0xMSAxMTo0MjoxOSZxdW90OztzOjEwOiZxdW90O2RhdGVfcmVkYWMmcXVvdDs7czoxOTomcXVvdDsyMDA3LTA1LTExIDExOjQyOjE5JnF1b3Q7O30KCmljaXRvdG8KCjxhIG5hbWU9J2Zvcm0xJz48L2E+CjxkaXYgY2xhc3M9J3NwaXBfZm9ybXMnPgoKPGRpdiBjbGFzcz0nc3BpcF9kZXNjcmlwdGlmJz48L2Rpdj4KCgoKCiAKCQkKCQk8ZGl2PgoJCQo8aW5wdXQgbmFtZT0nZXhlYycgdmFsdWU9J2FydGljbGVzJyB0eXBlPSdoaWRkZW4nIC8+CjxpbnB1dCBuYW1lPSdpZF9hcnRpY2xlJyB2YWx1ZT0nOCcgdHlwZT0naGlkZGVuJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaUlITnlZejBpTGk0dmNHeDFaMmx1Y3k5aFpHMXBiaTh0YWxGMVpYSjVMMmx0WjE5d1lXTnJMMnhoZVdWeUxtcHpJajQ4TDNOamNtbHdkRDQ9JyA+PC9kaXY+Cgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpSUhOeVl6MGlMaTR2Y0d4MVoybHVjeTltYjI1amRHbHZibTVoYkdsMFpYTXZZbUZ5Y21WZmRIbHdiMTlsWTI5c2IyZHBjWFZsTDJwekwzTndhWEJmWW1GeWNtVXVhbk1pUGp3dmMyTnlhWEIwUGc9PScgPjwvZGl2PgoKPHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2dyYXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHt7Z3Jhc319IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWyonLCcqXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiBbKiZlYWN1dGU7dmlkZW5jZSpdIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9taXNlZW5ldmlkZW5jZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyUzQ3N1cCUzRScsJyUzQy9zdXAlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3N1cCZndDtleHBvc2FudCZsdDsvc3VwJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXhwb3NhbnQucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzYyUzRScsJyUzQy9zYyUzRScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c2MmZ3Q7cGV0aXRlcyBjYXBpdGFsZXMmbHQ7L3NjJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcGV0aXRlc2NhcGl0YWxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxMScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2xpZW4ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTVDbiU1Q24lM0NxdW90ZSUzRScsJyUzQy9xdW90ZSUzRSU1Q24lNUNuJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2l0ZXIgdW4gbWVzc2FnZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWz8nLCddJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXdpa2kucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzEwJywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYmFycmUtdGFibGVhdS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biB0YWJsZWF1IiAvPjwvYT4mbmJzcDwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNCcsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNoZXJjaGVyIFJlbXBsYWNlciI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2hlcmNoZXJfcmVtcGxhY2VyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNoZXJjaGVyIFJlbXBsYWNlciIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJHZXN0aW9uIGRlcyBhbmNyZXMiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FuY3JlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ikdlc3Rpb24gZGVzIGFuY3JlcyIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTMnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NsYXZpZXIucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQ7JyB2YWxpZ249J21pZGRsZSc+Jm5ic3A7Jm5ic3A7PGEgY2xhc3M9J2FpZGUnIGhyZWY9J2h0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvZWNyaXJlLz9leGVjPWFpZGVfaW5kZXgmYW1wO2FpZGU9cmFjY291cmNpcyZhbXA7dmFyX2xhbmc9ZnInIHRhcmdldD0ic3BpcF9haWRlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKHRoaXMuaHJlZiwnc3BpcF9haWRlJywgJ3Njcm9sbGJhcnM9eWVzLCByZXNpemFibGU9eWVzLCB3aWR0aD03NDAsIGhlaWdodD01ODAnKTsgcmV0dXJuIGZhbHNlOyI+PGltZyBzcmM9J2ltZ19wYWNrL2FpZGUuZ2lmJwphbHQ9IkFJREUiIHRpdGxlPSJEZSBsJ2FpZGUgc3VyIGNldCAmZWFjdXRlO2wmZWFjdXRlO21lbnQiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgYWxpZ249Im1pZGRsZSIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID48dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQ+DQpOYiBjb2xvbm5lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25iY29sb25lcyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgICAvPjwvdGQ+PHRkPg0KTmIgbGlnbmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJyYW5ncyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgLz48L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9lbnRldGUiIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gRW50ZXRlPC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvY2FwdGlvbiIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBDYXB0aW9uIGV0IFImZWFjdXRlO3N1bSZlYWN1dGU7PC90ZD48dGQ+DQogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0Og0KICAgIGJhcnJlX25iY29sb25lcy52YWx1ZSA9IE1hdGguYWJzKGJhcnJlX25iY29sb25lcy52YWx1ZSk7IGJhcnJlX25icmFuZ3MudmFsdWUNCiAgICA9IE1hdGguYWJzKGJhcnJlX25icmFuZ3MudmFsdWUpOw0KICAgIGlmICghKGJhcnJlX25iY29sb25lcy52YWx1ZSA9PSAwIHx8IGJhcnJlX25icmFuZ3MudmFsdWUgPT0gMCkpIHsNCiAgICBiYXJyZV90YWJsZWF1KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSwgYmFycmVfbmJjb2xvbmVzLnZhbHVlLCBiYXJyZV9uYnJhbmdzLnZhbHVlLA0KICAgIGJhcnJlX2RvZW50ZXRlLmNoZWNrZWQsIGJhcnJlX2RvY2FwdGlvbi5jaGVja2VkKTsgfSAiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMicgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTMnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyIGNsYXNzPSJzcGlwX2JhcnJlIj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOjMwJTsiPkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eDwvdGQ+DQogICAgPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwYWJ+Jywnflx1MDBiYicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwOTMnLCdcdTAwOTQnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLXNpbXBsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGMwJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZvZWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJk9FbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2NlZGlsLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ldXJvLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiAvPjwvYT4mbmJzcDsNCiAgICA8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1sqJywnKl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbWlzZWVuZXZpZGVuY2UucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuIFsqJmVhY3V0ZTt2aWRlbmNlKl0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzdXAlM0UnLCclM0Mvc3VwJTNFJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V4cG9zYW50LnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c3VwJmd0O2V4cG9zYW50Jmx0Oy9zdXAmZ3Q7IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTNDc2MlM0UnLCclM0Mvc2MlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL3BldGl0ZXNjYXBpdGFsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzYyZndDtwZXRpdGVzIGNhcGl0YWxlcyZsdDsvc2MmZ3Q7IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTYnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1s/JywnXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9iYXJyZS13aWtpLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIHRhYmxlYXUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXRhYmxlYXUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSIgLz48L2E+Jm5ic3A8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTknLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaGVyY2hlciBSZW1wbGFjZXIiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NoZXJjaGVyX3JlbXBsYWNlci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaGVyY2hlciBSZW1wbGFjZXIiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iR2VzdGlvbiBkZXMgYW5jcmVzIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hbmNyZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJHZXN0aW9uIGRlcyBhbmNyZXMiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE4JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4Ij48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0OycgdmFsaWduPSdtaWRkbGUnPiZuYnNwOyZuYnNwOzxhIGNsYXNzPSdhaWRlJyBocmVmPSdodHRwOi8vcHJlcHJvZC5ub3RyZS12aWxsZS5uZXQvfnN0c2ViL2VjcmlyZS8/ZXhlYz1haWRlX2luZGV4JmFtcDthaWRlPXJhY2NvdXJjaXMmYW1wO3Zhcl9sYW5nPWZyJyB0YXJnZXQ9InNwaXBfYWlkZSIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3Blbih0aGlzLmhyZWYsJ3NwaXBfYWlkZScsICdzY3JvbGxiYXJzPXllcywgcmVzaXphYmxlPXllcywgd2lkdGg9NzQwLCBoZWlnaHQ9NTgwJyk7IHJldHVybiBmYWxzZTsiPjxpbWcgc3JjPSdpbWdfcGFjay9haWRlLmdpZicKYWx0PSJBSURFIiB0aXRsZT0iRGUgbCdhaWRlIHN1ciBjZXQgJmVhY3V0ZTtsJmVhY3V0ZTttZW50IiB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGFsaWduPSJtaWRkbGUiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgaWQ9J0xheWVyMTUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTcnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsgdGV4dC1hbGlnbjpjZW50ZXI7Ij48c3Ryb25nPkdlc3Rpb24gZGVzIGFuY3Jlczwvc3Ryb25nPjwvdGQ+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5UcmFuc2Zvcm1lciBlbiBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX25vbSI+PGk+Tm9tIGRlIGwnYW5jcmU8L2k+PC9sYWJlbD4gPGJyIC8+DQogICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfbm9tIiBpZD0iYW5jcmVfbm9tIiAvPg0KCSAgDQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfYW5jcmUoJ1snLCAnPC0nLCAnXScsIGFuY3JlX25vbS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+DQogICAgPC90ZD4NCgk8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlBvaW50ZXIgdmVycyB1bmUgYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9jaWJsZSI+PGk+QW5jcmUgY2libGU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2NpYmxlIiBpZD0iYW5jcmVfY2libGUiIC8+PGJyIC8+DQoJPGxhYmVsIGZvcj0iYW5jcmVfYnVsbGUiPjxpPkJ1bGxlIGQnYWlkZSBhbmNyZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfYnVsbGUiIGlkPSJhbmNyZV9idWxsZSIgLz4NCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlKCdbJywgJy0+IycsICddJywgYW5jcmVfY2libGUudmFsdWUsIGFuY3JlX2J1bGxlLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE4JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzknLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWN1dGUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBlNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM3Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE5JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkIHN0eWxlPSJ3aWR0aDogMjUlOyI+Q2hlcmNoZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfY2hlcmNoZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz48L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfY2FzZSIgdmFsdWU9InllcyIgLz5SZXNwZWN0ZXIgbGEgY2Fzc2U8YnIgLz48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19lbnRpZXIiIHZhbHVlPSJ5ZXMiIC8+DQpNb3QgZW50aWVyDQo8L3RkPjx0ZCAgc3R5bGU9IndpZHRoOiAyNSU7Ij5SZW1wbGFjZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfcmVtcGxhY2VyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+IA0KPC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX3RvdXQiIHZhbHVlPSJ5ZXMiIC8+VG91dCByZW1wbGFjZXI8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDEwJTsiPg0KICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iDQogIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfc2VhcmNocmVwbGFjZShkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX2NoZXJjaGVyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX3JlbXBsYWNlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfdG91dC5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19jYXNlLmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2VudGllci5jaGVja2VkLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+Cgk8dGV4dGFyZWEgbmFtZT0ndGV4dGVfMicgcm93cz0nMTAnIGNsYXNzPSdmb3JtbCAgICcgY29scz0nODAnCglpZD0naW5wdXQtMS10ZXh0ZV8yJwoJb25zZWxlY3Q9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25jbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmtleXVwPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uZGJsY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7Jz48L3RleHRhcmVhPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJPHNwYW4gY2xhc3M9J25ldHRveWV1cic+IDwvc3Bhbj4KCQkJCgkJPC9kaXY+CgkKCgogCgk8L2ZpZWxkc2V0PgoKIAogCgkKCTxwIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48bGFiZWwgZm9yPSJub2JvdG5vYm90LTEiPlZldWlsbGV6IGxhaXNzZXIgY2UgY2hhbXAgdmlkZSZuYnNwOzo8L2xhYmVsPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5vYm90bm9ib3QiIGlkPSJub2JvdG5vYm90LTEiIHZhbHVlPSIiIHNpemU9IjEwIiAvPjwvcD4KCQoJPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpyaWdodCcgY2xhc3M9J3NwaXBfYm91dG9uJz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSdWYWxpZGVyJyB2YWx1ZT0iVmFsaWRlciIgLz48L2Rpdj4KCgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQnpjbU05SW1oMGRIQTZMeTl3Y21Wd2NtOWtMbTV2ZEhKbExYWnBiR3hsTG01bGRDOStjM1J6WldJdmNHeDFaMmx1Y3k5bWIyNWpkR2x2Ym01aGJHbDBaWE12Wm05eWJYTXZhbUYyWVhOamNtbHdkQzlxZEdsd0xtcHpJaUIwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd3ZjMk55YVhCMFBnPT0nID48L2Rpdj4KCgoKPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd2hMUzBLSkNnbmFXNXdkWFF1Wm05eWJXOG5LUzVpYVc1a0tDZG1iMk4xY3ljc1puVnVZM1JwYjI0b0tYc2tLSFJvYVhNcExuSmxiVzkyWlVOc1lYTnpLQ2RtYjNKdGJ5Y3BMbUZrWkVOc1lYTnpLQ2RtYjNKdGJ5MW1iMk4xY3ljcE8zMHBPd29rS0NkcGJuQjFkQzVtYjNKdGJ5Y3BMbUpwYm1Rb0oySnNkWEluTEdaMWJtTjBhVzl1S0NsN0pDaDBhR2x6S1M1eVpXMXZkbVZEYkdGemN5Z25abTl5Ylc4dFptOWpkWE1uS1M1aFpHUkRiR0Z6Y3lnblptOXliVzhuS1R0OUtUc0tKQ2duYVc1d2RYUXVabTl5Yld3bktTNWlhVzVrS0NkbWIyTjFjeWNzWm5WdVkzUnBiMjRvS1hza0tIUm9hWE1wTG5KbGJXOTJaVU5zWVhOektDZG1iM0p0YkNjcExtRmtaRU5zWVhOektDZG1iM0p0YkMxbWIyTjFjeWNwTzMwcE93b2tLQ2RwYm5CMWRDNW1iM0p0YkNjcExtSnBibVFvSjJKc2RYSW5MR1oxYm1OMGFXOXVLQ2w3SkNoMGFHbHpLUzV5WlcxdmRtVkRiR0Z6Y3lnblptOXliV3d0Wm05amRYTW5LUzVoWkdSRGJHRnpjeWduWm05eWJXd25LVHQ5S1RzS0NpOHZMUzArUEM5elkzSnBjSFErJyA+PC9kaXY+CgoKCgkKCQoJCgoKPC9kaXY+', |
|
| 216 | - 'balise' => '<div class="base64" title="bW9kZWxlIDogYTo3OntzOjQ6JnF1b3Q7bGFuZyZxdW90OztzOjI6JnF1b3Q7ZnImcXVvdDs7czo0OiZxdW90O2ZvbmQmcXVvdDs7czoxMjomcXVvdDttb2RlbGVzL2Zvcm0mcXVvdDs7czoxMDomcXVvdDtkaXJfcmFjaW5lJnF1b3Q7O3M6MzomcXVvdDsuLi8mcXVvdDs7czoyOiZxdW90O2lkJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NzomcXVvdDtpZF9mb3JtJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NDomcXVvdDtkYXRlJnF1b3Q7O3M6MTk6JnF1b3Q7MjAwNy0wNS0xMSAxMTo0MjoxOSZxdW90OztzOjEwOiZxdW90O2RhdGVfcmVkYWMmcXVvdDs7czoxOTomcXVvdDsyMDA3LTA1LTExIDExOjQyOjE5JnF1b3Q7O30KCmljaXRvdG8KCjxhIG5hbWU9J2Zvcm0xJz48L2E+CjxkaXYgY2xhc3M9J3NwaXBfZm9ybXMnPgoKPGRpdiBjbGFzcz0nc3BpcF9kZXNjcmlwdGlmJz48L2Rpdj4KCgoKCiAKCQkKCQk8ZGl2PgoJCQo8aW5wdXQgbmFtZT0nZXhlYycgdmFsdWU9J2FydGljbGVzJyB0eXBlPSdoaWRkZW4nIC8+CjxpbnB1dCBuYW1lPSdpZF9hcnRpY2xlJyB2YWx1ZT0nOCcgdHlwZT0naGlkZGVuJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaUlITnlZejBpTGk0dmNHeDFaMmx1Y3k5aFpHMXBiaTh0YWxGMVpYSjVMMmx0WjE5d1lXTnJMMnhoZVdWeUxtcHpJajQ4TDNOamNtbHdkRDQ9JyA+PC9kaXY+Cgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpSUhOeVl6MGlMaTR2Y0d4MVoybHVjeTltYjI1amRHbHZibTVoYkdsMFpYTXZZbUZ5Y21WZmRIbHdiMTlsWTI5c2IyZHBjWFZsTDJwekwzTndhWEJmWW1GeWNtVXVhbk1pUGp3dmMyTnlhWEIwUGc9PScgPjwvZGl2PgoKPHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2dyYXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHt7Z3Jhc319IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWyonLCcqXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiBbKiZlYWN1dGU7dmlkZW5jZSpdIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9taXNlZW5ldmlkZW5jZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyUzQ3N1cCUzRScsJyUzQy9zdXAlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3N1cCZndDtleHBvc2FudCZsdDsvc3VwJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXhwb3NhbnQucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzYyUzRScsJyUzQy9zYyUzRScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c2MmZ3Q7cGV0aXRlcyBjYXBpdGFsZXMmbHQ7L3NjJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcGV0aXRlc2NhcGl0YWxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxMScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2xpZW4ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTVDbiU1Q24lM0NxdW90ZSUzRScsJyUzQy9xdW90ZSUzRSU1Q24lNUNuJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2l0ZXIgdW4gbWVzc2FnZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWz8nLCddJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXdpa2kucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzEwJywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYmFycmUtdGFibGVhdS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biB0YWJsZWF1IiAvPjwvYT4mbmJzcDwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNCcsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNoZXJjaGVyIFJlbXBsYWNlciI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2hlcmNoZXJfcmVtcGxhY2VyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNoZXJjaGVyIFJlbXBsYWNlciIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJHZXN0aW9uIGRlcyBhbmNyZXMiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FuY3JlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ikdlc3Rpb24gZGVzIGFuY3JlcyIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTMnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NsYXZpZXIucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQ7JyB2YWxpZ249J21pZGRsZSc+Jm5ic3A7Jm5ic3A7PGEgY2xhc3M9J2FpZGUnIGhyZWY9J2h0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvZWNyaXJlLz9leGVjPWFpZGVfaW5kZXgmYW1wO2FpZGU9cmFjY291cmNpcyZhbXA7dmFyX2xhbmc9ZnInIHRhcmdldD0ic3BpcF9haWRlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKHRoaXMuaHJlZiwnc3BpcF9haWRlJywgJ3Njcm9sbGJhcnM9eWVzLCByZXNpemFibGU9eWVzLCB3aWR0aD03NDAsIGhlaWdodD01ODAnKTsgcmV0dXJuIGZhbHNlOyI+PGltZyBzcmM9J2ltZ19wYWNrL2FpZGUuZ2lmJwphbHQ9IkFJREUiIHRpdGxlPSJEZSBsJ2FpZGUgc3VyIGNldCAmZWFjdXRlO2wmZWFjdXRlO21lbnQiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgYWxpZ249Im1pZGRsZSIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID48dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQ+DQpOYiBjb2xvbm5lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25iY29sb25lcyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgICAvPjwvdGQ+PHRkPg0KTmIgbGlnbmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJyYW5ncyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgLz48L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9lbnRldGUiIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gRW50ZXRlPC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvY2FwdGlvbiIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBDYXB0aW9uIGV0IFImZWFjdXRlO3N1bSZlYWN1dGU7PC90ZD48dGQ+DQogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0Og0KICAgIGJhcnJlX25iY29sb25lcy52YWx1ZSA9IE1hdGguYWJzKGJhcnJlX25iY29sb25lcy52YWx1ZSk7IGJhcnJlX25icmFuZ3MudmFsdWUNCiAgICA9IE1hdGguYWJzKGJhcnJlX25icmFuZ3MudmFsdWUpOw0KICAgIGlmICghKGJhcnJlX25iY29sb25lcy52YWx1ZSA9PSAwIHx8IGJhcnJlX25icmFuZ3MudmFsdWUgPT0gMCkpIHsNCiAgICBiYXJyZV90YWJsZWF1KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSwgYmFycmVfbmJjb2xvbmVzLnZhbHVlLCBiYXJyZV9uYnJhbmdzLnZhbHVlLA0KICAgIGJhcnJlX2RvZW50ZXRlLmNoZWNrZWQsIGJhcnJlX2RvY2FwdGlvbi5jaGVja2VkKTsgfSAiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMicgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTMnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyIGNsYXNzPSJzcGlwX2JhcnJlIj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOjMwJTsiPkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eDwvdGQ+DQogICAgPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwYWJ+Jywnflx1MDBiYicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwOTMnLCdcdTAwOTQnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLXNpbXBsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGMwJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZvZWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJk9FbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2NlZGlsLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ldXJvLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiAvPjwvYT4mbmJzcDsNCiAgICA8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1sqJywnKl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbWlzZWVuZXZpZGVuY2UucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuIFsqJmVhY3V0ZTt2aWRlbmNlKl0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzdXAlM0UnLCclM0Mvc3VwJTNFJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V4cG9zYW50LnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c3VwJmd0O2V4cG9zYW50Jmx0Oy9zdXAmZ3Q7IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTNDc2MlM0UnLCclM0Mvc2MlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL3BldGl0ZXNjYXBpdGFsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzYyZndDtwZXRpdGVzIGNhcGl0YWxlcyZsdDsvc2MmZ3Q7IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTYnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1s/JywnXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9iYXJyZS13aWtpLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIHRhYmxlYXUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXRhYmxlYXUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSIgLz48L2E+Jm5ic3A8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTknLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaGVyY2hlciBSZW1wbGFjZXIiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NoZXJjaGVyX3JlbXBsYWNlci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaGVyY2hlciBSZW1wbGFjZXIiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iR2VzdGlvbiBkZXMgYW5jcmVzIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hbmNyZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJHZXN0aW9uIGRlcyBhbmNyZXMiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE4JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4Ij48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0OycgdmFsaWduPSdtaWRkbGUnPiZuYnNwOyZuYnNwOzxhIGNsYXNzPSdhaWRlJyBocmVmPSdodHRwOi8vcHJlcHJvZC5ub3RyZS12aWxsZS5uZXQvfnN0c2ViL2VjcmlyZS8/ZXhlYz1haWRlX2luZGV4JmFtcDthaWRlPXJhY2NvdXJjaXMmYW1wO3Zhcl9sYW5nPWZyJyB0YXJnZXQ9InNwaXBfYWlkZSIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3Blbih0aGlzLmhyZWYsJ3NwaXBfYWlkZScsICdzY3JvbGxiYXJzPXllcywgcmVzaXphYmxlPXllcywgd2lkdGg9NzQwLCBoZWlnaHQ9NTgwJyk7IHJldHVybiBmYWxzZTsiPjxpbWcgc3JjPSdpbWdfcGFjay9haWRlLmdpZicKYWx0PSJBSURFIiB0aXRsZT0iRGUgbCdhaWRlIHN1ciBjZXQgJmVhY3V0ZTtsJmVhY3V0ZTttZW50IiB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGFsaWduPSJtaWRkbGUiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgaWQ9J0xheWVyMTUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTcnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsgdGV4dC1hbGlnbjpjZW50ZXI7Ij48c3Ryb25nPkdlc3Rpb24gZGVzIGFuY3Jlczwvc3Ryb25nPjwvdGQ+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5UcmFuc2Zvcm1lciBlbiBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX25vbSI+PGk+Tm9tIGRlIGwnYW5jcmU8L2k+PC9sYWJlbD4gPGJyIC8+DQogICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfbm9tIiBpZD0iYW5jcmVfbm9tIiAvPg0KCSAgDQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfYW5jcmUoJ1snLCAnPC0nLCAnXScsIGFuY3JlX25vbS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+DQogICAgPC90ZD4NCgk8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlBvaW50ZXIgdmVycyB1bmUgYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9jaWJsZSI+PGk+QW5jcmUgY2libGU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2NpYmxlIiBpZD0iYW5jcmVfY2libGUiIC8+PGJyIC8+DQoJPGxhYmVsIGZvcj0iYW5jcmVfYnVsbGUiPjxpPkJ1bGxlIGQnYWlkZSBhbmNyZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfYnVsbGUiIGlkPSJhbmNyZV9idWxsZSIgLz4NCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlKCdbJywgJy0+IycsICddJywgYW5jcmVfY2libGUudmFsdWUsIGFuY3JlX2J1bGxlLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE4JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzknLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWN1dGUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBlNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM3Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE5JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkIHN0eWxlPSJ3aWR0aDogMjUlOyI+Q2hlcmNoZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfY2hlcmNoZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz48L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfY2FzZSIgdmFsdWU9InllcyIgLz5SZXNwZWN0ZXIgbGEgY2Fzc2U8YnIgLz48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19lbnRpZXIiIHZhbHVlPSJ5ZXMiIC8+DQpNb3QgZW50aWVyDQo8L3RkPjx0ZCAgc3R5bGU9IndpZHRoOiAyNSU7Ij5SZW1wbGFjZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfcmVtcGxhY2VyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+IA0KPC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX3RvdXQiIHZhbHVlPSJ5ZXMiIC8+VG91dCByZW1wbGFjZXI8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDEwJTsiPg0KICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iDQogIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfc2VhcmNocmVwbGFjZShkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX2NoZXJjaGVyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX3JlbXBsYWNlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfdG91dC5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19jYXNlLmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2VudGllci5jaGVja2VkLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+Cgk8dGV4dGFyZWEgbmFtZT0ndGV4dGVfMicgcm93cz0nMTAnIGNsYXNzPSdmb3JtbCAgICcgY29scz0nODAnCglpZD0naW5wdXQtMS10ZXh0ZV8yJwoJb25zZWxlY3Q9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25jbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmtleXVwPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uZGJsY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7Jz48L3RleHRhcmVhPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJPHNwYW4gY2xhc3M9J25ldHRveWV1cic+IDwvc3Bhbj4KCQkJCgkJPC9kaXY+CgkKCgogCgk8L2ZpZWxkc2V0PgoKIAogCgkKCTxwIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48bGFiZWwgZm9yPSJub2JvdG5vYm90LTEiPlZldWlsbGV6IGxhaXNzZXIgY2UgY2hhbXAgdmlkZSZuYnNwOzo8L2xhYmVsPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5vYm90bm9ib3QiIGlkPSJub2JvdG5vYm90LTEiIHZhbHVlPSIiIHNpemU9IjEwIiAvPjwvcD4KCQoJPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpyaWdodCcgY2xhc3M9J3NwaXBfYm91dG9uJz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSdWYWxpZGVyJyB2YWx1ZT0iVmFsaWRlciIgLz48L2Rpdj4KCgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQnpjbU05SW1oMGRIQTZMeTl3Y21Wd2NtOWtMbTV2ZEhKbExYWnBiR3hsTG01bGRDOStjM1J6WldJdmNHeDFaMmx1Y3k5bWIyNWpkR2x2Ym01aGJHbDBaWE12Wm05eWJYTXZhbUYyWVhOamNtbHdkQzlxZEdsd0xtcHpJaUIwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd3ZjMk55YVhCMFBnPT0nID48L2Rpdj4KCgoKPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd2hMUzBLSkNnbmFXNXdkWFF1Wm05eWJXOG5LUzVpYVc1a0tDZG1iMk4xY3ljc1puVnVZM1JwYjI0b0tYc2tLSFJvYVhNcExuSmxiVzkyWlVOc1lYTnpLQ2RtYjNKdGJ5Y3BMbUZrWkVOc1lYTnpLQ2RtYjNKdGJ5MW1iMk4xY3ljcE8zMHBPd29rS0NkcGJuQjFkQzVtYjNKdGJ5Y3BMbUpwYm1Rb0oySnNkWEluTEdaMWJtTjBhVzl1S0NsN0pDaDBhR2x6S1M1eVpXMXZkbVZEYkdGemN5Z25abTl5Ylc4dFptOWpkWE1uS1M1aFpHUkRiR0Z6Y3lnblptOXliVzhuS1R0OUtUc0tKQ2duYVc1d2RYUXVabTl5Yld3bktTNWlhVzVrS0NkbWIyTjFjeWNzWm5WdVkzUnBiMjRvS1hza0tIUm9hWE1wTG5KbGJXOTJaVU5zWVhOektDZG1iM0p0YkNjcExtRmtaRU5zWVhOektDZG1iM0p0YkMxbWIyTjFjeWNwTzMwcE93b2tLQ2RwYm5CMWRDNW1iM0p0YkNjcExtSnBibVFvSjJKc2RYSW5MR1oxYm1OMGFXOXVLQ2w3SkNoMGFHbHpLUzV5WlcxdmRtVkRiR0Z6Y3lnblptOXliV3d0Wm05amRYTW5LUzVoWkdSRGJHRnpjeWduWm05eWJXd25LVHQ5S1RzS0NpOHZMUzArUEM5elkzSnBjSFErJyA+PC9kaXY+CgoKCgkKCQoJCgoKPC9kaXY+" ></div>', |
|
| 217 | - 'attribut' => 'title', |
|
| 218 | - ], |
|
| 207 | + public static function providerBase64(): array { |
|
| 208 | + return [ |
|
| 209 | + 'base64 #1' => [ |
|
| 210 | + 'expected' => 'PGEgbmFtZT0nZm9ybTEnPjwvYT4KPGRpdiBjbGFzcz0nc3BpcF9mb3Jtcyc+Cgo8ZGl2IGNsYXNzPSdzcGlwX2Rlc2NyaXB0aWYnPjwvZGl2PgoKCgoKIAoJIAoJPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249J0NvbnRhY3QuaHRtbCNmb3JtMScKCQllbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KCQkKCQk8ZGl2PgoJCQoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9hZG1pbi8talF1ZXJ5L2ltZ19wYWNrL2xheWVyLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvanMvc3BpcF9iYXJyZS5qcyI+PC9zY3JpcHQ+PHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnTWV0dHJlIGVuIHtpdGFsaXF1ZX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7e2dyYXN9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnQ2l0ZXIgdW4gbWVzc2FnZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnIHZhbGlnbj0nbWlkZGxlJz48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc0JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc2Jz48aW5wdXQgZGlzYWJsZWQ9J2Rpc2FibGVkJyB0eXBlPSd0ZXh0JyBpZD0nYmFycmVfMScgc2l6ZT0nNDUnIG1heGxlbmd0aD0nMTAwJyBzdHlsZT0nd2lkdGg6YXV0bzsgZm9udC1zaXplOjExcHg7IGNvbG9yOiBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsgYm9yZGVyOiAwcHggc29saWQgI2RlZGVkZTsnCnZhbHVlPSJVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZSIgLz48L3RkPjwvdHI+PC90YWJsZT48ZGl2IGlkPSdMYXllcjEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjInIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIzJyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0cj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87IHRleHQtYWxpZ246Y2VudGVyOyI+PHN0cm9uZz5HZXN0aW9uIGRlcyBhbmNyZXM8L3N0cm9uZz48L3RkPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+VHJhbnNmb3JtZXIgZW4gYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9ub20iPjxpPk5vbSBkZSBsJ2FuY3JlPC9pPjwvbGFiZWw+IDxiciAvPg0KICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX25vbSIgaWQ9ImFuY3JlX25vbSIgLz4NCgkgIA0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2FuY3JlKCdbJywgJzwtJywgJ10nLCBhbmNyZV9ub20udmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPg0KICAgIDwvdGQ+DQoJPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5Qb2ludGVyIHZlcnMgdW5lIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfY2libGUiPjxpPkFuY3JlIGNpYmxlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9jaWJsZSIgaWQ9ImFuY3JlX2NpYmxlIiAvPjxiciAvPg0KCTxsYWJlbCBmb3I9ImFuY3JlX2J1bGxlIj48aT5CdWxsZSBkJ2FpZGUgYW5jcmU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2J1bGxlIiBpZD0iYW5jcmVfYnVsbGUiIC8+DQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZSgnWycsICctPiMnLCAnXScsIGFuY3JlX2NpYmxlLnZhbHVlLCBhbmNyZV9idWxsZS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI0JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM5Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFjdXRlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwZTYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ0EgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTyBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7aXRhbGlxdWV9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdNZXR0cmUgZW4ge3tncmFzfX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3Jhcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgZW4ge3tncmFzfX0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbGllbi5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclNUNuJTVDbiUzQ3F1b3RlJTNFJywnJTNDL3F1b3RlJTNFJTVDbiU1Q24nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaXRlciB1biBtZXNzYWdlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NpdGVyIHVuIG1lc3NhZ2UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnOScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2xhdmllci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNic+PGlucHV0IGRpc2FibGVkPSdkaXNhYmxlZCcgdHlwZT0ndGV4dCcgaWQ9J2JhcnJlXzInIHNpemU9JzQ1JyBtYXhsZW5ndGg9JzEwMCcgc3R5bGU9J3dpZHRoOmF1dG87IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7IGJvcmRlcjogMHB4IHNvbGlkICNkZWRlZGU7Jwp2YWx1ZT0iVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UiIC8+PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXI2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4NCk5iIGNvbG9ubmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJjb2xvbmVzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAgIC8+PC90ZD48dGQ+DQpOYiBsaWduZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYnJhbmdzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAvPjwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2VudGV0ZSIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBFbnRldGU8L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9jYXB0aW9uIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IENhcHRpb24gZXQgUiZlYWN1dGU7c3VtJmVhY3V0ZTs8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6DQogICAgYmFycmVfbmJjb2xvbmVzLnZhbHVlID0gTWF0aC5hYnMoYmFycmVfbmJjb2xvbmVzLnZhbHVlKTsgYmFycmVfbmJyYW5ncy52YWx1ZQ0KICAgID0gTWF0aC5hYnMoYmFycmVfbmJyYW5ncy52YWx1ZSk7DQogICAgaWYgKCEoYmFycmVfbmJjb2xvbmVzLnZhbHVlID09IDAgfHwgYmFycmVfbmJyYW5ncy52YWx1ZSA9PSAwKSkgew0KICAgIGJhcnJlX3RhYmxlYXUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpLCBiYXJyZV9uYmNvbG9uZXMudmFsdWUsIGJhcnJlX25icmFuZ3MudmFsdWUsDQogICAgYmFycmVfZG9lbnRldGUuY2hlY2tlZCwgYmFycmVfZG9jYXB0aW9uLmNoZWNrZWQpOyB9ICIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI3JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHIgY2xhc3M9InNwaXBfYmFycmUiPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6MzAlOyI+Q2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4PC90ZD4NCiAgICA8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDBhYn4nLCd+XHUwMGJiJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDA5MycsJ1x1MDA5NCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0VudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMtc2ltcGxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzAnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnQScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJm9lbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmT0VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08gbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jY2VkaWwtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZldXJvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V1cm8ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIC8+PC9hPiZuYnNwOw0KICAgIDwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZCBzdHlsZT0id2lkdGg6IDI1JTsiPkNoZXJjaGVyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX2NoZXJjaGVyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+PC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2Nhc2UiIHZhbHVlPSJ5ZXMiIC8+UmVzcGVjdGVyIGxhIGNhc3NlPGJyIC8+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfZW50aWVyIiB2YWx1ZT0ieWVzIiAvPg0KTW90IGVudGllcg0KPC90ZD48dGQgIHN0eWxlPSJ3aWR0aDogMjUlOyI+UmVtcGxhY2VyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX3JlbXBsYWNlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPiANCjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY190b3V0IiB2YWx1ZT0ieWVzIiAvPlRvdXQgcmVtcGxhY2VyPC90ZD48dGQgc3R5bGU9IndpZHRoOiAxMCU7Ij4NCiAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIg0KICBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX3NlYXJjaHJlcGxhY2UoZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9jaGVyY2hlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9yZW1wbGFjZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX3RvdXQuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfY2FzZS5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19lbnRpZXIuY2hlY2tlZCxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PgoJPHRleHRhcmVhIG5hbWU9J3RleHRlXzInIHJvd3M9JzEwJyBjbGFzcz0nZm9ybWwgICAnIGNvbHM9JzgwJwoJaWQ9J2lucHV0LTEtdGV4dGVfMicKCW9uc2VsZWN0PSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25rZXl1cD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmRibGNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOyc+PC90ZXh0YXJlYT4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKIAoJPC9maWVsZHNldD4KCiAKIAoJCgk8cCBzdHlsZT0nZGlzcGxheTpub25lOyc+PGxhYmVsIGZvcj0ibm9ib3Rub2JvdC0xIj5WZXVpbGxleiBsYWlzc2VyIGNlIGNoYW1wIHZpZGUmbmJzcDs6PC9sYWJlbD4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJub2JvdG5vYm90IiBpZD0ibm9ib3Rub2JvdC0xIiB2YWx1ZT0iIiBzaXplPSIxMCIgLz48L3A+CgkKCTxkaXYgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnIGNsYXNzPSdzcGlwX2JvdXRvbic+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0nVmFsaWRlcicgdmFsdWU9IlZhbGlkZXIiIC8+PC9kaXY+CgoKPHNjcmlwdCBzcmM9Imh0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvZm9ybXMvamF2YXNjcmlwdC9qdGlwLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KJCgnaW5wdXQuZm9ybW8nKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbycpLmFkZENsYXNzKCdmb3Jtby1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbycpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybW8tZm9jdXMnKS5hZGRDbGFzcygnZm9ybW8nKTt9KTsKJCgnaW5wdXQuZm9ybWwnKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbCcpLmFkZENsYXNzKCdmb3JtbC1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbCcpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybWwtZm9jdXMnKS5hZGRDbGFzcygnZm9ybWwnKTt9KTsKCi8vLS0+PC9zY3JpcHQ+CgoJIAoJPC9mb3JtPgoJCgkKCQoKCjwvZGl2Pg==', |
|
| 211 | + 'balise' => '<div class="base64" title="PGEgbmFtZT0nZm9ybTEnPjwvYT4KPGRpdiBjbGFzcz0nc3BpcF9mb3Jtcyc+Cgo8ZGl2IGNsYXNzPSdzcGlwX2Rlc2NyaXB0aWYnPjwvZGl2PgoKCgoKIAoJIAoJPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249J0NvbnRhY3QuaHRtbCNmb3JtMScKCQllbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KCQkKCQk8ZGl2PgoJCQoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9hZG1pbi8talF1ZXJ5L2ltZ19wYWNrL2xheWVyLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvanMvc3BpcF9iYXJyZS5qcyI+PC9zY3JpcHQ+PHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnTWV0dHJlIGVuIHtpdGFsaXF1ZX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7e2dyYXN9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnQ2l0ZXIgdW4gbWVzc2FnZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnIHZhbGlnbj0nbWlkZGxlJz48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc0JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc2Jz48aW5wdXQgZGlzYWJsZWQ9J2Rpc2FibGVkJyB0eXBlPSd0ZXh0JyBpZD0nYmFycmVfMScgc2l6ZT0nNDUnIG1heGxlbmd0aD0nMTAwJyBzdHlsZT0nd2lkdGg6YXV0bzsgZm9udC1zaXplOjExcHg7IGNvbG9yOiBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsgYm9yZGVyOiAwcHggc29saWQgI2RlZGVkZTsnCnZhbHVlPSJVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZSIgLz48L3RkPjwvdHI+PC90YWJsZT48ZGl2IGlkPSdMYXllcjEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjInIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIzJyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0cj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87IHRleHQtYWxpZ246Y2VudGVyOyI+PHN0cm9uZz5HZXN0aW9uIGRlcyBhbmNyZXM8L3N0cm9uZz48L3RkPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+VHJhbnNmb3JtZXIgZW4gYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9ub20iPjxpPk5vbSBkZSBsJ2FuY3JlPC9pPjwvbGFiZWw+IDxiciAvPg0KICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX25vbSIgaWQ9ImFuY3JlX25vbSIgLz4NCgkgIA0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2FuY3JlKCdbJywgJzwtJywgJ10nLCBhbmNyZV9ub20udmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPg0KICAgIDwvdGQ+DQoJPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5Qb2ludGVyIHZlcnMgdW5lIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfY2libGUiPjxpPkFuY3JlIGNpYmxlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9jaWJsZSIgaWQ9ImFuY3JlX2NpYmxlIiAvPjxiciAvPg0KCTxsYWJlbCBmb3I9ImFuY3JlX2J1bGxlIj48aT5CdWxsZSBkJ2FpZGUgYW5jcmU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2J1bGxlIiBpZD0iYW5jcmVfYnVsbGUiIC8+DQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZSgnWycsICctPiMnLCAnXScsIGFuY3JlX2NpYmxlLnZhbHVlLCBhbmNyZV9idWxsZS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI0JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM5Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFjdXRlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwZTYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ0EgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTyBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7aXRhbGlxdWV9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdNZXR0cmUgZW4ge3tncmFzfX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3Jhcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgZW4ge3tncmFzfX0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbGllbi5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclNUNuJTVDbiUzQ3F1b3RlJTNFJywnJTNDL3F1b3RlJTNFJTVDbiU1Q24nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaXRlciB1biBtZXNzYWdlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NpdGVyIHVuIG1lc3NhZ2UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnOScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2xhdmllci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNic+PGlucHV0IGRpc2FibGVkPSdkaXNhYmxlZCcgdHlwZT0ndGV4dCcgaWQ9J2JhcnJlXzInIHNpemU9JzQ1JyBtYXhsZW5ndGg9JzEwMCcgc3R5bGU9J3dpZHRoOmF1dG87IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7IGJvcmRlcjogMHB4IHNvbGlkICNkZWRlZGU7Jwp2YWx1ZT0iVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UiIC8+PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXI2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4NCk5iIGNvbG9ubmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJjb2xvbmVzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAgIC8+PC90ZD48dGQ+DQpOYiBsaWduZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYnJhbmdzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAvPjwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2VudGV0ZSIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBFbnRldGU8L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9jYXB0aW9uIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IENhcHRpb24gZXQgUiZlYWN1dGU7c3VtJmVhY3V0ZTs8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6DQogICAgYmFycmVfbmJjb2xvbmVzLnZhbHVlID0gTWF0aC5hYnMoYmFycmVfbmJjb2xvbmVzLnZhbHVlKTsgYmFycmVfbmJyYW5ncy52YWx1ZQ0KICAgID0gTWF0aC5hYnMoYmFycmVfbmJyYW5ncy52YWx1ZSk7DQogICAgaWYgKCEoYmFycmVfbmJjb2xvbmVzLnZhbHVlID09IDAgfHwgYmFycmVfbmJyYW5ncy52YWx1ZSA9PSAwKSkgew0KICAgIGJhcnJlX3RhYmxlYXUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpLCBiYXJyZV9uYmNvbG9uZXMudmFsdWUsIGJhcnJlX25icmFuZ3MudmFsdWUsDQogICAgYmFycmVfZG9lbnRldGUuY2hlY2tlZCwgYmFycmVfZG9jYXB0aW9uLmNoZWNrZWQpOyB9ICIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI3JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHIgY2xhc3M9InNwaXBfYmFycmUiPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6MzAlOyI+Q2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4PC90ZD4NCiAgICA8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDBhYn4nLCd+XHUwMGJiJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDA5MycsJ1x1MDA5NCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0VudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMtc2ltcGxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzAnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnQScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJm9lbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmT0VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08gbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jY2VkaWwtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZldXJvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V1cm8ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIC8+PC9hPiZuYnNwOw0KICAgIDwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZCBzdHlsZT0id2lkdGg6IDI1JTsiPkNoZXJjaGVyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX2NoZXJjaGVyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+PC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2Nhc2UiIHZhbHVlPSJ5ZXMiIC8+UmVzcGVjdGVyIGxhIGNhc3NlPGJyIC8+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfZW50aWVyIiB2YWx1ZT0ieWVzIiAvPg0KTW90IGVudGllcg0KPC90ZD48dGQgIHN0eWxlPSJ3aWR0aDogMjUlOyI+UmVtcGxhY2VyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX3JlbXBsYWNlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPiANCjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY190b3V0IiB2YWx1ZT0ieWVzIiAvPlRvdXQgcmVtcGxhY2VyPC90ZD48dGQgc3R5bGU9IndpZHRoOiAxMCU7Ij4NCiAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIg0KICBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX3NlYXJjaHJlcGxhY2UoZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9jaGVyY2hlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9yZW1wbGFjZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX3RvdXQuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfY2FzZS5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19lbnRpZXIuY2hlY2tlZCxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PgoJPHRleHRhcmVhIG5hbWU9J3RleHRlXzInIHJvd3M9JzEwJyBjbGFzcz0nZm9ybWwgICAnIGNvbHM9JzgwJwoJaWQ9J2lucHV0LTEtdGV4dGVfMicKCW9uc2VsZWN0PSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25rZXl1cD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmRibGNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOyc+PC90ZXh0YXJlYT4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKIAoJPC9maWVsZHNldD4KCiAKIAoJCgk8cCBzdHlsZT0nZGlzcGxheTpub25lOyc+PGxhYmVsIGZvcj0ibm9ib3Rub2JvdC0xIj5WZXVpbGxleiBsYWlzc2VyIGNlIGNoYW1wIHZpZGUmbmJzcDs6PC9sYWJlbD4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJub2JvdG5vYm90IiBpZD0ibm9ib3Rub2JvdC0xIiB2YWx1ZT0iIiBzaXplPSIxMCIgLz48L3A+CgkKCTxkaXYgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnIGNsYXNzPSdzcGlwX2JvdXRvbic+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0nVmFsaWRlcicgdmFsdWU9IlZhbGlkZXIiIC8+PC9kaXY+CgoKPHNjcmlwdCBzcmM9Imh0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvZm9ybXMvamF2YXNjcmlwdC9qdGlwLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KJCgnaW5wdXQuZm9ybW8nKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbycpLmFkZENsYXNzKCdmb3Jtby1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbycpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybW8tZm9jdXMnKS5hZGRDbGFzcygnZm9ybW8nKTt9KTsKJCgnaW5wdXQuZm9ybWwnKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbCcpLmFkZENsYXNzKCdmb3JtbC1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbCcpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybWwtZm9jdXMnKS5hZGRDbGFzcygnZm9ybWwnKTt9KTsKCi8vLS0+PC9zY3JpcHQ+CgoJIAoJPC9mb3JtPgoJCgkKCQoKCjwvZGl2Pg==" ></div>', |
|
| 212 | + 'attribut' => 'title', |
|
| 213 | + ], |
|
| 214 | + 'base64 #2' => [ |
|
| 215 | + 'expected' => 'bW9kZWxlIDogYTo3OntzOjQ6JnF1b3Q7bGFuZyZxdW90OztzOjI6JnF1b3Q7ZnImcXVvdDs7czo0OiZxdW90O2ZvbmQmcXVvdDs7czoxMjomcXVvdDttb2RlbGVzL2Zvcm0mcXVvdDs7czoxMDomcXVvdDtkaXJfcmFjaW5lJnF1b3Q7O3M6MzomcXVvdDsuLi8mcXVvdDs7czoyOiZxdW90O2lkJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NzomcXVvdDtpZF9mb3JtJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NDomcXVvdDtkYXRlJnF1b3Q7O3M6MTk6JnF1b3Q7MjAwNy0wNS0xMSAxMTo0MjoxOSZxdW90OztzOjEwOiZxdW90O2RhdGVfcmVkYWMmcXVvdDs7czoxOTomcXVvdDsyMDA3LTA1LTExIDExOjQyOjE5JnF1b3Q7O30KCmljaXRvdG8KCjxhIG5hbWU9J2Zvcm0xJz48L2E+CjxkaXYgY2xhc3M9J3NwaXBfZm9ybXMnPgoKPGRpdiBjbGFzcz0nc3BpcF9kZXNjcmlwdGlmJz48L2Rpdj4KCgoKCiAKCQkKCQk8ZGl2PgoJCQo8aW5wdXQgbmFtZT0nZXhlYycgdmFsdWU9J2FydGljbGVzJyB0eXBlPSdoaWRkZW4nIC8+CjxpbnB1dCBuYW1lPSdpZF9hcnRpY2xlJyB2YWx1ZT0nOCcgdHlwZT0naGlkZGVuJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaUlITnlZejBpTGk0dmNHeDFaMmx1Y3k5aFpHMXBiaTh0YWxGMVpYSjVMMmx0WjE5d1lXTnJMMnhoZVdWeUxtcHpJajQ4TDNOamNtbHdkRDQ9JyA+PC9kaXY+Cgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpSUhOeVl6MGlMaTR2Y0d4MVoybHVjeTltYjI1amRHbHZibTVoYkdsMFpYTXZZbUZ5Y21WZmRIbHdiMTlsWTI5c2IyZHBjWFZsTDJwekwzTndhWEJmWW1GeWNtVXVhbk1pUGp3dmMyTnlhWEIwUGc9PScgPjwvZGl2PgoKPHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2dyYXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHt7Z3Jhc319IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWyonLCcqXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiBbKiZlYWN1dGU7dmlkZW5jZSpdIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9taXNlZW5ldmlkZW5jZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyUzQ3N1cCUzRScsJyUzQy9zdXAlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3N1cCZndDtleHBvc2FudCZsdDsvc3VwJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXhwb3NhbnQucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzYyUzRScsJyUzQy9zYyUzRScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c2MmZ3Q7cGV0aXRlcyBjYXBpdGFsZXMmbHQ7L3NjJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcGV0aXRlc2NhcGl0YWxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxMScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2xpZW4ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTVDbiU1Q24lM0NxdW90ZSUzRScsJyUzQy9xdW90ZSUzRSU1Q24lNUNuJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2l0ZXIgdW4gbWVzc2FnZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWz8nLCddJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXdpa2kucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzEwJywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYmFycmUtdGFibGVhdS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biB0YWJsZWF1IiAvPjwvYT4mbmJzcDwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNCcsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNoZXJjaGVyIFJlbXBsYWNlciI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2hlcmNoZXJfcmVtcGxhY2VyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNoZXJjaGVyIFJlbXBsYWNlciIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJHZXN0aW9uIGRlcyBhbmNyZXMiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FuY3JlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ikdlc3Rpb24gZGVzIGFuY3JlcyIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTMnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NsYXZpZXIucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQ7JyB2YWxpZ249J21pZGRsZSc+Jm5ic3A7Jm5ic3A7PGEgY2xhc3M9J2FpZGUnIGhyZWY9J2h0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvZWNyaXJlLz9leGVjPWFpZGVfaW5kZXgmYW1wO2FpZGU9cmFjY291cmNpcyZhbXA7dmFyX2xhbmc9ZnInIHRhcmdldD0ic3BpcF9haWRlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKHRoaXMuaHJlZiwnc3BpcF9haWRlJywgJ3Njcm9sbGJhcnM9eWVzLCByZXNpemFibGU9eWVzLCB3aWR0aD03NDAsIGhlaWdodD01ODAnKTsgcmV0dXJuIGZhbHNlOyI+PGltZyBzcmM9J2ltZ19wYWNrL2FpZGUuZ2lmJwphbHQ9IkFJREUiIHRpdGxlPSJEZSBsJ2FpZGUgc3VyIGNldCAmZWFjdXRlO2wmZWFjdXRlO21lbnQiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgYWxpZ249Im1pZGRsZSIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID48dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQ+DQpOYiBjb2xvbm5lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25iY29sb25lcyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgICAvPjwvdGQ+PHRkPg0KTmIgbGlnbmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJyYW5ncyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgLz48L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9lbnRldGUiIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gRW50ZXRlPC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvY2FwdGlvbiIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBDYXB0aW9uIGV0IFImZWFjdXRlO3N1bSZlYWN1dGU7PC90ZD48dGQ+DQogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0Og0KICAgIGJhcnJlX25iY29sb25lcy52YWx1ZSA9IE1hdGguYWJzKGJhcnJlX25iY29sb25lcy52YWx1ZSk7IGJhcnJlX25icmFuZ3MudmFsdWUNCiAgICA9IE1hdGguYWJzKGJhcnJlX25icmFuZ3MudmFsdWUpOw0KICAgIGlmICghKGJhcnJlX25iY29sb25lcy52YWx1ZSA9PSAwIHx8IGJhcnJlX25icmFuZ3MudmFsdWUgPT0gMCkpIHsNCiAgICBiYXJyZV90YWJsZWF1KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSwgYmFycmVfbmJjb2xvbmVzLnZhbHVlLCBiYXJyZV9uYnJhbmdzLnZhbHVlLA0KICAgIGJhcnJlX2RvZW50ZXRlLmNoZWNrZWQsIGJhcnJlX2RvY2FwdGlvbi5jaGVja2VkKTsgfSAiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMicgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTMnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyIGNsYXNzPSJzcGlwX2JhcnJlIj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOjMwJTsiPkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eDwvdGQ+DQogICAgPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwYWJ+Jywnflx1MDBiYicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwOTMnLCdcdTAwOTQnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLXNpbXBsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGMwJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZvZWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJk9FbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2NlZGlsLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ldXJvLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiAvPjwvYT4mbmJzcDsNCiAgICA8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1sqJywnKl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbWlzZWVuZXZpZGVuY2UucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuIFsqJmVhY3V0ZTt2aWRlbmNlKl0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzdXAlM0UnLCclM0Mvc3VwJTNFJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V4cG9zYW50LnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c3VwJmd0O2V4cG9zYW50Jmx0Oy9zdXAmZ3Q7IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTNDc2MlM0UnLCclM0Mvc2MlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL3BldGl0ZXNjYXBpdGFsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzYyZndDtwZXRpdGVzIGNhcGl0YWxlcyZsdDsvc2MmZ3Q7IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTYnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1s/JywnXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9iYXJyZS13aWtpLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIHRhYmxlYXUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXRhYmxlYXUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSIgLz48L2E+Jm5ic3A8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTknLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaGVyY2hlciBSZW1wbGFjZXIiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NoZXJjaGVyX3JlbXBsYWNlci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaGVyY2hlciBSZW1wbGFjZXIiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iR2VzdGlvbiBkZXMgYW5jcmVzIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hbmNyZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJHZXN0aW9uIGRlcyBhbmNyZXMiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE4JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4Ij48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0OycgdmFsaWduPSdtaWRkbGUnPiZuYnNwOyZuYnNwOzxhIGNsYXNzPSdhaWRlJyBocmVmPSdodHRwOi8vcHJlcHJvZC5ub3RyZS12aWxsZS5uZXQvfnN0c2ViL2VjcmlyZS8/ZXhlYz1haWRlX2luZGV4JmFtcDthaWRlPXJhY2NvdXJjaXMmYW1wO3Zhcl9sYW5nPWZyJyB0YXJnZXQ9InNwaXBfYWlkZSIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3Blbih0aGlzLmhyZWYsJ3NwaXBfYWlkZScsICdzY3JvbGxiYXJzPXllcywgcmVzaXphYmxlPXllcywgd2lkdGg9NzQwLCBoZWlnaHQ9NTgwJyk7IHJldHVybiBmYWxzZTsiPjxpbWcgc3JjPSdpbWdfcGFjay9haWRlLmdpZicKYWx0PSJBSURFIiB0aXRsZT0iRGUgbCdhaWRlIHN1ciBjZXQgJmVhY3V0ZTtsJmVhY3V0ZTttZW50IiB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGFsaWduPSJtaWRkbGUiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgaWQ9J0xheWVyMTUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTcnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsgdGV4dC1hbGlnbjpjZW50ZXI7Ij48c3Ryb25nPkdlc3Rpb24gZGVzIGFuY3Jlczwvc3Ryb25nPjwvdGQ+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5UcmFuc2Zvcm1lciBlbiBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX25vbSI+PGk+Tm9tIGRlIGwnYW5jcmU8L2k+PC9sYWJlbD4gPGJyIC8+DQogICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfbm9tIiBpZD0iYW5jcmVfbm9tIiAvPg0KCSAgDQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfYW5jcmUoJ1snLCAnPC0nLCAnXScsIGFuY3JlX25vbS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+DQogICAgPC90ZD4NCgk8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlBvaW50ZXIgdmVycyB1bmUgYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9jaWJsZSI+PGk+QW5jcmUgY2libGU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2NpYmxlIiBpZD0iYW5jcmVfY2libGUiIC8+PGJyIC8+DQoJPGxhYmVsIGZvcj0iYW5jcmVfYnVsbGUiPjxpPkJ1bGxlIGQnYWlkZSBhbmNyZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfYnVsbGUiIGlkPSJhbmNyZV9idWxsZSIgLz4NCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlKCdbJywgJy0+IycsICddJywgYW5jcmVfY2libGUudmFsdWUsIGFuY3JlX2J1bGxlLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE4JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzknLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWN1dGUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBlNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM3Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE5JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkIHN0eWxlPSJ3aWR0aDogMjUlOyI+Q2hlcmNoZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfY2hlcmNoZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz48L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfY2FzZSIgdmFsdWU9InllcyIgLz5SZXNwZWN0ZXIgbGEgY2Fzc2U8YnIgLz48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19lbnRpZXIiIHZhbHVlPSJ5ZXMiIC8+DQpNb3QgZW50aWVyDQo8L3RkPjx0ZCAgc3R5bGU9IndpZHRoOiAyNSU7Ij5SZW1wbGFjZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfcmVtcGxhY2VyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+IA0KPC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX3RvdXQiIHZhbHVlPSJ5ZXMiIC8+VG91dCByZW1wbGFjZXI8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDEwJTsiPg0KICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iDQogIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfc2VhcmNocmVwbGFjZShkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX2NoZXJjaGVyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX3JlbXBsYWNlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfdG91dC5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19jYXNlLmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2VudGllci5jaGVja2VkLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+Cgk8dGV4dGFyZWEgbmFtZT0ndGV4dGVfMicgcm93cz0nMTAnIGNsYXNzPSdmb3JtbCAgICcgY29scz0nODAnCglpZD0naW5wdXQtMS10ZXh0ZV8yJwoJb25zZWxlY3Q9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25jbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmtleXVwPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uZGJsY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7Jz48L3RleHRhcmVhPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJPHNwYW4gY2xhc3M9J25ldHRveWV1cic+IDwvc3Bhbj4KCQkJCgkJPC9kaXY+CgkKCgogCgk8L2ZpZWxkc2V0PgoKIAogCgkKCTxwIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48bGFiZWwgZm9yPSJub2JvdG5vYm90LTEiPlZldWlsbGV6IGxhaXNzZXIgY2UgY2hhbXAgdmlkZSZuYnNwOzo8L2xhYmVsPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5vYm90bm9ib3QiIGlkPSJub2JvdG5vYm90LTEiIHZhbHVlPSIiIHNpemU9IjEwIiAvPjwvcD4KCQoJPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpyaWdodCcgY2xhc3M9J3NwaXBfYm91dG9uJz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSdWYWxpZGVyJyB2YWx1ZT0iVmFsaWRlciIgLz48L2Rpdj4KCgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQnpjbU05SW1oMGRIQTZMeTl3Y21Wd2NtOWtMbTV2ZEhKbExYWnBiR3hsTG01bGRDOStjM1J6WldJdmNHeDFaMmx1Y3k5bWIyNWpkR2x2Ym01aGJHbDBaWE12Wm05eWJYTXZhbUYyWVhOamNtbHdkQzlxZEdsd0xtcHpJaUIwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd3ZjMk55YVhCMFBnPT0nID48L2Rpdj4KCgoKPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd2hMUzBLSkNnbmFXNXdkWFF1Wm05eWJXOG5LUzVpYVc1a0tDZG1iMk4xY3ljc1puVnVZM1JwYjI0b0tYc2tLSFJvYVhNcExuSmxiVzkyWlVOc1lYTnpLQ2RtYjNKdGJ5Y3BMbUZrWkVOc1lYTnpLQ2RtYjNKdGJ5MW1iMk4xY3ljcE8zMHBPd29rS0NkcGJuQjFkQzVtYjNKdGJ5Y3BMbUpwYm1Rb0oySnNkWEluTEdaMWJtTjBhVzl1S0NsN0pDaDBhR2x6S1M1eVpXMXZkbVZEYkdGemN5Z25abTl5Ylc4dFptOWpkWE1uS1M1aFpHUkRiR0Z6Y3lnblptOXliVzhuS1R0OUtUc0tKQ2duYVc1d2RYUXVabTl5Yld3bktTNWlhVzVrS0NkbWIyTjFjeWNzWm5WdVkzUnBiMjRvS1hza0tIUm9hWE1wTG5KbGJXOTJaVU5zWVhOektDZG1iM0p0YkNjcExtRmtaRU5zWVhOektDZG1iM0p0YkMxbWIyTjFjeWNwTzMwcE93b2tLQ2RwYm5CMWRDNW1iM0p0YkNjcExtSnBibVFvSjJKc2RYSW5MR1oxYm1OMGFXOXVLQ2w3SkNoMGFHbHpLUzV5WlcxdmRtVkRiR0Z6Y3lnblptOXliV3d0Wm05amRYTW5LUzVoWkdSRGJHRnpjeWduWm05eWJXd25LVHQ5S1RzS0NpOHZMUzArUEM5elkzSnBjSFErJyA+PC9kaXY+CgoKCgkKCQoJCgoKPC9kaXY+', |
|
| 216 | + 'balise' => '<div class="base64" title="bW9kZWxlIDogYTo3OntzOjQ6JnF1b3Q7bGFuZyZxdW90OztzOjI6JnF1b3Q7ZnImcXVvdDs7czo0OiZxdW90O2ZvbmQmcXVvdDs7czoxMjomcXVvdDttb2RlbGVzL2Zvcm0mcXVvdDs7czoxMDomcXVvdDtkaXJfcmFjaW5lJnF1b3Q7O3M6MzomcXVvdDsuLi8mcXVvdDs7czoyOiZxdW90O2lkJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NzomcXVvdDtpZF9mb3JtJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NDomcXVvdDtkYXRlJnF1b3Q7O3M6MTk6JnF1b3Q7MjAwNy0wNS0xMSAxMTo0MjoxOSZxdW90OztzOjEwOiZxdW90O2RhdGVfcmVkYWMmcXVvdDs7czoxOTomcXVvdDsyMDA3LTA1LTExIDExOjQyOjE5JnF1b3Q7O30KCmljaXRvdG8KCjxhIG5hbWU9J2Zvcm0xJz48L2E+CjxkaXYgY2xhc3M9J3NwaXBfZm9ybXMnPgoKPGRpdiBjbGFzcz0nc3BpcF9kZXNjcmlwdGlmJz48L2Rpdj4KCgoKCiAKCQkKCQk8ZGl2PgoJCQo8aW5wdXQgbmFtZT0nZXhlYycgdmFsdWU9J2FydGljbGVzJyB0eXBlPSdoaWRkZW4nIC8+CjxpbnB1dCBuYW1lPSdpZF9hcnRpY2xlJyB2YWx1ZT0nOCcgdHlwZT0naGlkZGVuJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaUlITnlZejBpTGk0dmNHeDFaMmx1Y3k5aFpHMXBiaTh0YWxGMVpYSjVMMmx0WjE5d1lXTnJMMnhoZVdWeUxtcHpJajQ4TDNOamNtbHdkRDQ9JyA+PC9kaXY+Cgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpSUhOeVl6MGlMaTR2Y0d4MVoybHVjeTltYjI1amRHbHZibTVoYkdsMFpYTXZZbUZ5Y21WZmRIbHdiMTlsWTI5c2IyZHBjWFZsTDJwekwzTndhWEJmWW1GeWNtVXVhbk1pUGp3dmMyTnlhWEIwUGc9PScgPjwvZGl2PgoKPHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2dyYXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHt7Z3Jhc319IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWyonLCcqXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiBbKiZlYWN1dGU7dmlkZW5jZSpdIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9taXNlZW5ldmlkZW5jZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyUzQ3N1cCUzRScsJyUzQy9zdXAlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3N1cCZndDtleHBvc2FudCZsdDsvc3VwJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXhwb3NhbnQucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzYyUzRScsJyUzQy9zYyUzRScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c2MmZ3Q7cGV0aXRlcyBjYXBpdGFsZXMmbHQ7L3NjJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcGV0aXRlc2NhcGl0YWxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxMScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2xpZW4ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTVDbiU1Q24lM0NxdW90ZSUzRScsJyUzQy9xdW90ZSUzRSU1Q24lNUNuJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2l0ZXIgdW4gbWVzc2FnZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWz8nLCddJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXdpa2kucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzEwJywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYmFycmUtdGFibGVhdS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biB0YWJsZWF1IiAvPjwvYT4mbmJzcDwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNCcsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNoZXJjaGVyIFJlbXBsYWNlciI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2hlcmNoZXJfcmVtcGxhY2VyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNoZXJjaGVyIFJlbXBsYWNlciIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJHZXN0aW9uIGRlcyBhbmNyZXMiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FuY3JlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ikdlc3Rpb24gZGVzIGFuY3JlcyIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTMnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NsYXZpZXIucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQ7JyB2YWxpZ249J21pZGRsZSc+Jm5ic3A7Jm5ic3A7PGEgY2xhc3M9J2FpZGUnIGhyZWY9J2h0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvZWNyaXJlLz9leGVjPWFpZGVfaW5kZXgmYW1wO2FpZGU9cmFjY291cmNpcyZhbXA7dmFyX2xhbmc9ZnInIHRhcmdldD0ic3BpcF9haWRlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKHRoaXMuaHJlZiwnc3BpcF9haWRlJywgJ3Njcm9sbGJhcnM9eWVzLCByZXNpemFibGU9eWVzLCB3aWR0aD03NDAsIGhlaWdodD01ODAnKTsgcmV0dXJuIGZhbHNlOyI+PGltZyBzcmM9J2ltZ19wYWNrL2FpZGUuZ2lmJwphbHQ9IkFJREUiIHRpdGxlPSJEZSBsJ2FpZGUgc3VyIGNldCAmZWFjdXRlO2wmZWFjdXRlO21lbnQiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgYWxpZ249Im1pZGRsZSIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID48dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQ+DQpOYiBjb2xvbm5lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25iY29sb25lcyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgICAvPjwvdGQ+PHRkPg0KTmIgbGlnbmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJyYW5ncyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgLz48L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9lbnRldGUiIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gRW50ZXRlPC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvY2FwdGlvbiIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBDYXB0aW9uIGV0IFImZWFjdXRlO3N1bSZlYWN1dGU7PC90ZD48dGQ+DQogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0Og0KICAgIGJhcnJlX25iY29sb25lcy52YWx1ZSA9IE1hdGguYWJzKGJhcnJlX25iY29sb25lcy52YWx1ZSk7IGJhcnJlX25icmFuZ3MudmFsdWUNCiAgICA9IE1hdGguYWJzKGJhcnJlX25icmFuZ3MudmFsdWUpOw0KICAgIGlmICghKGJhcnJlX25iY29sb25lcy52YWx1ZSA9PSAwIHx8IGJhcnJlX25icmFuZ3MudmFsdWUgPT0gMCkpIHsNCiAgICBiYXJyZV90YWJsZWF1KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSwgYmFycmVfbmJjb2xvbmVzLnZhbHVlLCBiYXJyZV9uYnJhbmdzLnZhbHVlLA0KICAgIGJhcnJlX2RvZW50ZXRlLmNoZWNrZWQsIGJhcnJlX2RvY2FwdGlvbi5jaGVja2VkKTsgfSAiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMicgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTMnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyIGNsYXNzPSJzcGlwX2JhcnJlIj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOjMwJTsiPkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eDwvdGQ+DQogICAgPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwYWJ+Jywnflx1MDBiYicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwOTMnLCdcdTAwOTQnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLXNpbXBsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGMwJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZvZWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJk9FbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2NlZGlsLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ldXJvLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiAvPjwvYT4mbmJzcDsNCiAgICA8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1sqJywnKl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbWlzZWVuZXZpZGVuY2UucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuIFsqJmVhY3V0ZTt2aWRlbmNlKl0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzdXAlM0UnLCclM0Mvc3VwJTNFJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V4cG9zYW50LnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c3VwJmd0O2V4cG9zYW50Jmx0Oy9zdXAmZ3Q7IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTNDc2MlM0UnLCclM0Mvc2MlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL3BldGl0ZXNjYXBpdGFsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzYyZndDtwZXRpdGVzIGNhcGl0YWxlcyZsdDsvc2MmZ3Q7IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTYnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1s/JywnXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9iYXJyZS13aWtpLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIHRhYmxlYXUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXRhYmxlYXUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSIgLz48L2E+Jm5ic3A8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTknLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaGVyY2hlciBSZW1wbGFjZXIiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NoZXJjaGVyX3JlbXBsYWNlci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaGVyY2hlciBSZW1wbGFjZXIiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iR2VzdGlvbiBkZXMgYW5jcmVzIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hbmNyZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJHZXN0aW9uIGRlcyBhbmNyZXMiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE4JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4Ij48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0OycgdmFsaWduPSdtaWRkbGUnPiZuYnNwOyZuYnNwOzxhIGNsYXNzPSdhaWRlJyBocmVmPSdodHRwOi8vcHJlcHJvZC5ub3RyZS12aWxsZS5uZXQvfnN0c2ViL2VjcmlyZS8/ZXhlYz1haWRlX2luZGV4JmFtcDthaWRlPXJhY2NvdXJjaXMmYW1wO3Zhcl9sYW5nPWZyJyB0YXJnZXQ9InNwaXBfYWlkZSIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3Blbih0aGlzLmhyZWYsJ3NwaXBfYWlkZScsICdzY3JvbGxiYXJzPXllcywgcmVzaXphYmxlPXllcywgd2lkdGg9NzQwLCBoZWlnaHQ9NTgwJyk7IHJldHVybiBmYWxzZTsiPjxpbWcgc3JjPSdpbWdfcGFjay9haWRlLmdpZicKYWx0PSJBSURFIiB0aXRsZT0iRGUgbCdhaWRlIHN1ciBjZXQgJmVhY3V0ZTtsJmVhY3V0ZTttZW50IiB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGFsaWduPSJtaWRkbGUiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgaWQ9J0xheWVyMTUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTcnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsgdGV4dC1hbGlnbjpjZW50ZXI7Ij48c3Ryb25nPkdlc3Rpb24gZGVzIGFuY3Jlczwvc3Ryb25nPjwvdGQ+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5UcmFuc2Zvcm1lciBlbiBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX25vbSI+PGk+Tm9tIGRlIGwnYW5jcmU8L2k+PC9sYWJlbD4gPGJyIC8+DQogICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfbm9tIiBpZD0iYW5jcmVfbm9tIiAvPg0KCSAgDQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfYW5jcmUoJ1snLCAnPC0nLCAnXScsIGFuY3JlX25vbS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+DQogICAgPC90ZD4NCgk8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlBvaW50ZXIgdmVycyB1bmUgYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9jaWJsZSI+PGk+QW5jcmUgY2libGU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2NpYmxlIiBpZD0iYW5jcmVfY2libGUiIC8+PGJyIC8+DQoJPGxhYmVsIGZvcj0iYW5jcmVfYnVsbGUiPjxpPkJ1bGxlIGQnYWlkZSBhbmNyZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfYnVsbGUiIGlkPSJhbmNyZV9idWxsZSIgLz4NCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlKCdbJywgJy0+IycsICddJywgYW5jcmVfY2libGUudmFsdWUsIGFuY3JlX2J1bGxlLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE4JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzknLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWN1dGUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBlNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM3Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE5JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkIHN0eWxlPSJ3aWR0aDogMjUlOyI+Q2hlcmNoZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfY2hlcmNoZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz48L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfY2FzZSIgdmFsdWU9InllcyIgLz5SZXNwZWN0ZXIgbGEgY2Fzc2U8YnIgLz48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19lbnRpZXIiIHZhbHVlPSJ5ZXMiIC8+DQpNb3QgZW50aWVyDQo8L3RkPjx0ZCAgc3R5bGU9IndpZHRoOiAyNSU7Ij5SZW1wbGFjZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfcmVtcGxhY2VyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+IA0KPC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX3RvdXQiIHZhbHVlPSJ5ZXMiIC8+VG91dCByZW1wbGFjZXI8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDEwJTsiPg0KICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iDQogIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfc2VhcmNocmVwbGFjZShkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX2NoZXJjaGVyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX3JlbXBsYWNlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfdG91dC5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19jYXNlLmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2VudGllci5jaGVja2VkLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+Cgk8dGV4dGFyZWEgbmFtZT0ndGV4dGVfMicgcm93cz0nMTAnIGNsYXNzPSdmb3JtbCAgICcgY29scz0nODAnCglpZD0naW5wdXQtMS10ZXh0ZV8yJwoJb25zZWxlY3Q9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25jbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmtleXVwPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uZGJsY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7Jz48L3RleHRhcmVhPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJPHNwYW4gY2xhc3M9J25ldHRveWV1cic+IDwvc3Bhbj4KCQkJCgkJPC9kaXY+CgkKCgogCgk8L2ZpZWxkc2V0PgoKIAogCgkKCTxwIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48bGFiZWwgZm9yPSJub2JvdG5vYm90LTEiPlZldWlsbGV6IGxhaXNzZXIgY2UgY2hhbXAgdmlkZSZuYnNwOzo8L2xhYmVsPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5vYm90bm9ib3QiIGlkPSJub2JvdG5vYm90LTEiIHZhbHVlPSIiIHNpemU9IjEwIiAvPjwvcD4KCQoJPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpyaWdodCcgY2xhc3M9J3NwaXBfYm91dG9uJz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSdWYWxpZGVyJyB2YWx1ZT0iVmFsaWRlciIgLz48L2Rpdj4KCgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQnpjbU05SW1oMGRIQTZMeTl3Y21Wd2NtOWtMbTV2ZEhKbExYWnBiR3hsTG01bGRDOStjM1J6WldJdmNHeDFaMmx1Y3k5bWIyNWpkR2x2Ym01aGJHbDBaWE12Wm05eWJYTXZhbUYyWVhOamNtbHdkQzlxZEdsd0xtcHpJaUIwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd3ZjMk55YVhCMFBnPT0nID48L2Rpdj4KCgoKPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd2hMUzBLSkNnbmFXNXdkWFF1Wm05eWJXOG5LUzVpYVc1a0tDZG1iMk4xY3ljc1puVnVZM1JwYjI0b0tYc2tLSFJvYVhNcExuSmxiVzkyWlVOc1lYTnpLQ2RtYjNKdGJ5Y3BMbUZrWkVOc1lYTnpLQ2RtYjNKdGJ5MW1iMk4xY3ljcE8zMHBPd29rS0NkcGJuQjFkQzVtYjNKdGJ5Y3BMbUpwYm1Rb0oySnNkWEluTEdaMWJtTjBhVzl1S0NsN0pDaDBhR2x6S1M1eVpXMXZkbVZEYkdGemN5Z25abTl5Ylc4dFptOWpkWE1uS1M1aFpHUkRiR0Z6Y3lnblptOXliVzhuS1R0OUtUc0tKQ2duYVc1d2RYUXVabTl5Yld3bktTNWlhVzVrS0NkbWIyTjFjeWNzWm5WdVkzUnBiMjRvS1hza0tIUm9hWE1wTG5KbGJXOTJaVU5zWVhOektDZG1iM0p0YkNjcExtRmtaRU5zWVhOektDZG1iM0p0YkMxbWIyTjFjeWNwTzMwcE93b2tLQ2RwYm5CMWRDNW1iM0p0YkNjcExtSnBibVFvSjJKc2RYSW5MR1oxYm1OMGFXOXVLQ2w3SkNoMGFHbHpLUzV5WlcxdmRtVkRiR0Z6Y3lnblptOXliV3d0Wm05amRYTW5LUzVoWkdSRGJHRnpjeWduWm05eWJXd25LVHQ5S1RzS0NpOHZMUzArUEM5elkzSnBjSFErJyA+PC9kaXY+CgoKCgkKCQoJCgoKPC9kaXY+" ></div>', |
|
| 217 | + 'attribut' => 'title', |
|
| 218 | + ], |
|
| 219 | 219 | |
| 220 | - ]; |
|
| 221 | - } |
|
| 220 | + ]; |
|
| 221 | + } |
|
| 222 | 222 | } |
@@ -9,186 +9,186 @@ |
||
| 9 | 9 | |
| 10 | 10 | class SqlInMysqlTest extends TestCase |
| 11 | 11 | { |
| 12 | - public static function setUpBeforeClass(): void { |
|
| 13 | - find_in_path('base/abstract_sql.php', '', true); |
|
| 14 | - } |
|
| 12 | + public static function setUpBeforeClass(): void { |
|
| 13 | + find_in_path('base/abstract_sql.php', '', true); |
|
| 14 | + } |
|
| 15 | 15 | |
| 16 | - protected function setUp(): void { |
|
| 17 | - if ($this->getSqlType() !== 'mysql') { |
|
| 18 | - $this->markTestSkipped('Needs a Mysql database'); |
|
| 19 | - } |
|
| 20 | - } |
|
| 16 | + protected function setUp(): void { |
|
| 17 | + if ($this->getSqlType() !== 'mysql') { |
|
| 18 | + $this->markTestSkipped('Needs a Mysql database'); |
|
| 19 | + } |
|
| 20 | + } |
|
| 21 | 21 | |
| 22 | - #[DataProvider('providerMysqlSqliIn')] |
|
| 23 | - public function testMysqlSqlIn($expected, ...$args): void { |
|
| 24 | - $this->assertEquals($expected, sql_in(...$args)); |
|
| 25 | - } |
|
| 22 | + #[DataProvider('providerMysqlSqliIn')] |
|
| 23 | + public function testMysqlSqlIn($expected, ...$args): void { |
|
| 24 | + $this->assertEquals($expected, sql_in(...$args)); |
|
| 25 | + } |
|
| 26 | 26 | |
| 27 | - public static function providerMysqlSqliIn(): array { |
|
| 28 | - return [ |
|
| 29 | - 0 => |
|
| 30 | - [ |
|
| 31 | - 0 => '(id_rubrique IN (1,2,3))', |
|
| 32 | - 1 => 'id_rubrique', |
|
| 33 | - 2 => '1,2,3', |
|
| 34 | - ], |
|
| 35 | - 1 => |
|
| 36 | - [ |
|
| 37 | - 0 => '(id_rubrique IN (1,2,3))', |
|
| 38 | - 1 => 'id_rubrique', |
|
| 39 | - 2 => |
|
| 40 | - [ |
|
| 41 | - 0 => 1, |
|
| 42 | - 1 => 2, |
|
| 43 | - 2 => 3, |
|
| 44 | - ], |
|
| 45 | - ], |
|
| 46 | - 2 => |
|
| 47 | - [ |
|
| 48 | - 0 => '(id_rubrique NOT IN (1,2,3))', |
|
| 49 | - 1 => 'id_rubrique', |
|
| 50 | - 2 => '1,2,3', |
|
| 51 | - 3 => 'NOT', |
|
| 52 | - ], |
|
| 53 | - 3 => |
|
| 54 | - [ |
|
| 55 | - 0 => '(id_rubrique NOT IN (1,2,3))', |
|
| 56 | - 1 => 'id_rubrique', |
|
| 57 | - 2 => |
|
| 58 | - [ |
|
| 59 | - 0 => 1, |
|
| 60 | - 1 => 2, |
|
| 61 | - 2 => 3, |
|
| 62 | - ], |
|
| 63 | - 3 => 'NOT', |
|
| 64 | - ], |
|
| 65 | - 4 => |
|
| 66 | - [ |
|
| 67 | - 0 => '0=1', |
|
| 68 | - 1 => 'id_rubrique', |
|
| 69 | - 2 => |
|
| 70 | - [], |
|
| 71 | - ], |
|
| 72 | - 5 => |
|
| 73 | - [ |
|
| 74 | - 0 => '(id_rubrique IN (\'\',0,\'Un texte avec des <a href=\"http://spip.net\">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net\',\'Un texte avec des entités &<>"\',\'Un texte avec des entit&eacute;s echap&eacute; &amp;&lt;&gt;&quot;\',\'Un texte avec des entités numériques &<>"\',\'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &#38;&#60;&#62;&quot;\',\'Un texte sans entites &<>\"\\\'\',\'{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>\',\'Un modele <modeleinexistant|lien=[->https://www.spip.net]>\',\'Un texte avec des retour |
|
| 27 | + public static function providerMysqlSqliIn(): array { |
|
| 28 | + return [ |
|
| 29 | + 0 => |
|
| 30 | + [ |
|
| 31 | + 0 => '(id_rubrique IN (1,2,3))', |
|
| 32 | + 1 => 'id_rubrique', |
|
| 33 | + 2 => '1,2,3', |
|
| 34 | + ], |
|
| 35 | + 1 => |
|
| 36 | + [ |
|
| 37 | + 0 => '(id_rubrique IN (1,2,3))', |
|
| 38 | + 1 => 'id_rubrique', |
|
| 39 | + 2 => |
|
| 40 | + [ |
|
| 41 | + 0 => 1, |
|
| 42 | + 1 => 2, |
|
| 43 | + 2 => 3, |
|
| 44 | + ], |
|
| 45 | + ], |
|
| 46 | + 2 => |
|
| 47 | + [ |
|
| 48 | + 0 => '(id_rubrique NOT IN (1,2,3))', |
|
| 49 | + 1 => 'id_rubrique', |
|
| 50 | + 2 => '1,2,3', |
|
| 51 | + 3 => 'NOT', |
|
| 52 | + ], |
|
| 53 | + 3 => |
|
| 54 | + [ |
|
| 55 | + 0 => '(id_rubrique NOT IN (1,2,3))', |
|
| 56 | + 1 => 'id_rubrique', |
|
| 57 | + 2 => |
|
| 58 | + [ |
|
| 59 | + 0 => 1, |
|
| 60 | + 1 => 2, |
|
| 61 | + 2 => 3, |
|
| 62 | + ], |
|
| 63 | + 3 => 'NOT', |
|
| 64 | + ], |
|
| 65 | + 4 => |
|
| 66 | + [ |
|
| 67 | + 0 => '0=1', |
|
| 68 | + 1 => 'id_rubrique', |
|
| 69 | + 2 => |
|
| 70 | + [], |
|
| 71 | + ], |
|
| 72 | + 5 => |
|
| 73 | + [ |
|
| 74 | + 0 => '(id_rubrique IN (\'\',0,\'Un texte avec des <a href=\"http://spip.net\">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net\',\'Un texte avec des entités &<>"\',\'Un texte avec des entit&eacute;s echap&eacute; &amp;&lt;&gt;&quot;\',\'Un texte avec des entités numériques &<>"\',\'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &#38;&#60;&#62;&quot;\',\'Un texte sans entites &<>\"\\\'\',\'{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>\',\'Un modele <modeleinexistant|lien=[->https://www.spip.net]>\',\'Un texte avec des retour |
|
| 75 | 75 | a la ligne et meme des |
| 76 | 76 | |
| 77 | 77 | paragraphes\'))', |
| 78 | - 1 => 'id_rubrique', |
|
| 79 | - 2 => |
|
| 80 | - [ |
|
| 81 | - 0 => '', |
|
| 82 | - 1 => '0', |
|
| 83 | - 2 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net', |
|
| 84 | - 3 => 'Un texte avec des entités &<>"', |
|
| 85 | - 4 => 'Un texte avec des entit&eacute;s echap&eacute; &amp;&lt;&gt;&quot;', |
|
| 86 | - 5 => 'Un texte avec des entités numériques &<>"', |
|
| 87 | - 6 => 'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &#38;&#60;&#62;&quot;', |
|
| 88 | - 7 => 'Un texte sans entites &<>"\'', |
|
| 89 | - 8 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 90 | - 9 => 'Un modele <modeleinexistant|lien=[->https://www.spip.net]>', |
|
| 91 | - 10 => 'Un texte avec des retour |
|
| 78 | + 1 => 'id_rubrique', |
|
| 79 | + 2 => |
|
| 80 | + [ |
|
| 81 | + 0 => '', |
|
| 82 | + 1 => '0', |
|
| 83 | + 2 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net', |
|
| 84 | + 3 => 'Un texte avec des entités &<>"', |
|
| 85 | + 4 => 'Un texte avec des entit&eacute;s echap&eacute; &amp;&lt;&gt;&quot;', |
|
| 86 | + 5 => 'Un texte avec des entités numériques &<>"', |
|
| 87 | + 6 => 'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &#38;&#60;&#62;&quot;', |
|
| 88 | + 7 => 'Un texte sans entites &<>"\'', |
|
| 89 | + 8 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 90 | + 9 => 'Un modele <modeleinexistant|lien=[->https://www.spip.net]>', |
|
| 91 | + 10 => 'Un texte avec des retour |
|
| 92 | 92 | a la ligne et meme des |
| 93 | 93 | |
| 94 | 94 | paragraphes', |
| 95 | - ], |
|
| 96 | - ], |
|
| 97 | - 6 => |
|
| 98 | - [ |
|
| 99 | - 0 => '(id_rubrique IN (0,-1,1,2,3,4,5,6,7,10,20,30,50,100,1000,10000))', |
|
| 100 | - 1 => 'id_rubrique', |
|
| 101 | - 2 => |
|
| 102 | - [ |
|
| 103 | - 0 => 0, |
|
| 104 | - 1 => -1, |
|
| 105 | - 2 => 1, |
|
| 106 | - 3 => 2, |
|
| 107 | - 4 => 3, |
|
| 108 | - 5 => 4, |
|
| 109 | - 6 => 5, |
|
| 110 | - 7 => 6, |
|
| 111 | - 8 => 7, |
|
| 112 | - 9 => 10, |
|
| 113 | - 10 => 20, |
|
| 114 | - 11 => 30, |
|
| 115 | - 12 => 50, |
|
| 116 | - 13 => 100, |
|
| 117 | - 14 => 1000, |
|
| 118 | - 15 => 10000, |
|
| 119 | - ], |
|
| 120 | - ], |
|
| 121 | - 7 => |
|
| 122 | - [ |
|
| 123 | - 0 => '0=1', |
|
| 124 | - 1 => 'id_rubrique', |
|
| 125 | - 2 => |
|
| 126 | - [ |
|
| 127 | - 0 => |
|
| 128 | - [], |
|
| 129 | - 1 => |
|
| 130 | - [ |
|
| 131 | - 0 => '', |
|
| 132 | - 1 => '0', |
|
| 133 | - 2 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net', |
|
| 134 | - 3 => 'Un texte avec des entités &<>"', |
|
| 135 | - 4 => 'Un texte avec des entit&eacute;s echap&eacute; &amp;&lt;&gt;&quot;', |
|
| 136 | - 5 => 'Un texte avec des entités numériques &<>"', |
|
| 137 | - 6 => 'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &#38;&#60;&#62;&quot;', |
|
| 138 | - 7 => 'Un texte sans entites &<>"\'', |
|
| 139 | - 8 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 140 | - 9 => 'Un modele <modeleinexistant|lien=[->https://www.spip.net]>', |
|
| 141 | - 10 => 'Un texte avec des retour |
|
| 95 | + ], |
|
| 96 | + ], |
|
| 97 | + 6 => |
|
| 98 | + [ |
|
| 99 | + 0 => '(id_rubrique IN (0,-1,1,2,3,4,5,6,7,10,20,30,50,100,1000,10000))', |
|
| 100 | + 1 => 'id_rubrique', |
|
| 101 | + 2 => |
|
| 102 | + [ |
|
| 103 | + 0 => 0, |
|
| 104 | + 1 => -1, |
|
| 105 | + 2 => 1, |
|
| 106 | + 3 => 2, |
|
| 107 | + 4 => 3, |
|
| 108 | + 5 => 4, |
|
| 109 | + 6 => 5, |
|
| 110 | + 7 => 6, |
|
| 111 | + 8 => 7, |
|
| 112 | + 9 => 10, |
|
| 113 | + 10 => 20, |
|
| 114 | + 11 => 30, |
|
| 115 | + 12 => 50, |
|
| 116 | + 13 => 100, |
|
| 117 | + 14 => 1000, |
|
| 118 | + 15 => 10000, |
|
| 119 | + ], |
|
| 120 | + ], |
|
| 121 | + 7 => |
|
| 122 | + [ |
|
| 123 | + 0 => '0=1', |
|
| 124 | + 1 => 'id_rubrique', |
|
| 125 | + 2 => |
|
| 126 | + [ |
|
| 127 | + 0 => |
|
| 128 | + [], |
|
| 129 | + 1 => |
|
| 130 | + [ |
|
| 131 | + 0 => '', |
|
| 132 | + 1 => '0', |
|
| 133 | + 2 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net', |
|
| 134 | + 3 => 'Un texte avec des entités &<>"', |
|
| 135 | + 4 => 'Un texte avec des entit&eacute;s echap&eacute; &amp;&lt;&gt;&quot;', |
|
| 136 | + 5 => 'Un texte avec des entités numériques &<>"', |
|
| 137 | + 6 => 'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &#38;&#60;&#62;&quot;', |
|
| 138 | + 7 => 'Un texte sans entites &<>"\'', |
|
| 139 | + 8 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>', |
|
| 140 | + 9 => 'Un modele <modeleinexistant|lien=[->https://www.spip.net]>', |
|
| 141 | + 10 => 'Un texte avec des retour |
|
| 142 | 142 | a la ligne et meme des |
| 143 | 143 | |
| 144 | 144 | paragraphes', |
| 145 | - ], |
|
| 146 | - 2 => |
|
| 147 | - [ |
|
| 148 | - 0 => 0, |
|
| 149 | - 1 => -1, |
|
| 150 | - 2 => 1, |
|
| 151 | - 3 => 2, |
|
| 152 | - 4 => 3, |
|
| 153 | - 5 => 4, |
|
| 154 | - 6 => 5, |
|
| 155 | - 7 => 6, |
|
| 156 | - 8 => 7, |
|
| 157 | - 9 => 10, |
|
| 158 | - 10 => 20, |
|
| 159 | - 11 => 30, |
|
| 160 | - 12 => 50, |
|
| 161 | - 13 => 100, |
|
| 162 | - 14 => 1000, |
|
| 163 | - 15 => 10000, |
|
| 164 | - ], |
|
| 165 | - 3 => |
|
| 166 | - [ |
|
| 167 | - 0 => true, |
|
| 168 | - 1 => false, |
|
| 169 | - ], |
|
| 170 | - ], |
|
| 171 | - ], |
|
| 172 | - 8 => |
|
| 173 | - [ |
|
| 174 | - 0 => '(id_rubrique IN (2))', |
|
| 175 | - 1 => 'id_rubrique', |
|
| 176 | - 2 => 2, |
|
| 177 | - ], |
|
| 178 | - 9 => |
|
| 179 | - [ |
|
| 180 | - 0 => '(id_rubrique IN (1,0))', |
|
| 181 | - 1 => 'id_rubrique', |
|
| 182 | - 2 => |
|
| 183 | - [ |
|
| 184 | - 0 => true, |
|
| 185 | - 1 => false, |
|
| 186 | - ], |
|
| 187 | - ], |
|
| 188 | - ]; |
|
| 189 | - } |
|
| 145 | + ], |
|
| 146 | + 2 => |
|
| 147 | + [ |
|
| 148 | + 0 => 0, |
|
| 149 | + 1 => -1, |
|
| 150 | + 2 => 1, |
|
| 151 | + 3 => 2, |
|
| 152 | + 4 => 3, |
|
| 153 | + 5 => 4, |
|
| 154 | + 6 => 5, |
|
| 155 | + 7 => 6, |
|
| 156 | + 8 => 7, |
|
| 157 | + 9 => 10, |
|
| 158 | + 10 => 20, |
|
| 159 | + 11 => 30, |
|
| 160 | + 12 => 50, |
|
| 161 | + 13 => 100, |
|
| 162 | + 14 => 1000, |
|
| 163 | + 15 => 10000, |
|
| 164 | + ], |
|
| 165 | + 3 => |
|
| 166 | + [ |
|
| 167 | + 0 => true, |
|
| 168 | + 1 => false, |
|
| 169 | + ], |
|
| 170 | + ], |
|
| 171 | + ], |
|
| 172 | + 8 => |
|
| 173 | + [ |
|
| 174 | + 0 => '(id_rubrique IN (2))', |
|
| 175 | + 1 => 'id_rubrique', |
|
| 176 | + 2 => 2, |
|
| 177 | + ], |
|
| 178 | + 9 => |
|
| 179 | + [ |
|
| 180 | + 0 => '(id_rubrique IN (1,0))', |
|
| 181 | + 1 => 'id_rubrique', |
|
| 182 | + 2 => |
|
| 183 | + [ |
|
| 184 | + 0 => true, |
|
| 185 | + 1 => false, |
|
| 186 | + ], |
|
| 187 | + ], |
|
| 188 | + ]; |
|
| 189 | + } |
|
| 190 | 190 | |
| 191 | - private function getSqlType(): string { |
|
| 192 | - return $GLOBALS['connexions'][0]['type'] ?? ''; |
|
| 193 | - } |
|
| 191 | + private function getSqlType(): string { |
|
| 192 | + return $GLOBALS['connexions'][0]['type'] ?? ''; |
|
| 193 | + } |
|
| 194 | 194 | } |
@@ -63,8 +63,8 @@ discard block |
||
| 63 | 63 | #[Depends('testInsertData')] |
| 64 | 64 | public function testMajTimestamp() { |
| 65 | 65 | $table = 'spip_test_tintin'; |
| 66 | - $where1 = 'id_tintin=' . sql_quote(1); |
|
| 67 | - $where2 = 'id_tintin=' . sql_quote(2); |
|
| 66 | + $where1 = 'id_tintin='.sql_quote(1); |
|
| 67 | + $where2 = 'id_tintin='.sql_quote(2); |
|
| 68 | 68 | |
| 69 | 69 | // lecture du timestamp actuel |
| 70 | 70 | $maj1 = sql_getfetsel('maj', $table, $where1); |
@@ -123,17 +123,17 @@ discard block |
||
| 123 | 123 | $this->assertEquals(count($data), sql_count($res), 'sql_count() ne renvoie pas la valeur attendue'); |
| 124 | 124 | |
| 125 | 125 | // selection float |
| 126 | - $res = sql_select('*', 'spip_test_tintin', ['un_double>' . sql_quote(3)]); |
|
| 126 | + $res = sql_select('*', 'spip_test_tintin', ['un_double>'.sql_quote(3)]); |
|
| 127 | 127 | $n = count(array_filter($data, fn ($entry) => $entry['un_double'] > 3)); |
| 128 | 128 | $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un float'); |
| 129 | 129 | |
| 130 | 130 | // selection REGEXP |
| 131 | - $res = sql_select('*', 'spip_test_tintin', ['un_varchar REGEXP ' . sql_quote('^De')]); |
|
| 131 | + $res = sql_select('*', 'spip_test_tintin', ['un_varchar REGEXP '.sql_quote('^De')]); |
|
| 132 | 132 | $n = count(array_filter($data, fn ($entry) => str_starts_with($entry['un_varchar'], 'De'))); |
| 133 | 133 | $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur une REGEXP'); |
| 134 | 134 | |
| 135 | 135 | // selection LIKE |
| 136 | - $res = sql_select('*', 'spip_test_tintin', ['un_varchar LIKE ' . sql_quote('De%')]); |
|
| 136 | + $res = sql_select('*', 'spip_test_tintin', ['un_varchar LIKE '.sql_quote('De%')]); |
|
| 137 | 137 | $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un LIKE'); |
| 138 | 138 | |
| 139 | 139 | // selection array(champs) |
@@ -167,7 +167,7 @@ discard block |
||
| 167 | 167 | 'en' => 'Krack', |
| 168 | 168 | ] as $lg => $res |
| 169 | 169 | ) { |
| 170 | - $multi = sql_getfetsel(sql_multi('grrrr', $lg), 'spip_test_milou', 'id_milou=' . sql_quote(2)); |
|
| 170 | + $multi = sql_getfetsel(sql_multi('grrrr', $lg), 'spip_test_milou', 'id_milou='.sql_quote(2)); |
|
| 171 | 171 | $this->assertEquals($res, $multi, 'sql_multi mal rendu'); |
| 172 | 172 | } |
| 173 | 173 | |
@@ -178,7 +178,7 @@ discard block |
||
| 178 | 178 | 'en' => 'Aérieny', |
| 179 | 179 | ] as $lg => $res |
| 180 | 180 | ) { |
| 181 | - $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(2)); |
|
| 181 | + $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock='.sql_quote(2)); |
|
| 182 | 182 | $this->assertEquals($res, $multi, 'sql_multi avec accents, mal rendu'); |
| 183 | 183 | } |
| 184 | 184 | |
@@ -190,7 +190,7 @@ discard block |
||
| 190 | 190 | 'de' => 'Un début de chaine : Vinasse, et [la fin]', |
| 191 | 191 | ] as $lg => $res |
| 192 | 192 | ) { |
| 193 | - $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(4)); |
|
| 193 | + $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock='.sql_quote(4)); |
|
| 194 | 194 | $this->assertEquals($res, $multi, 'sql_multi avec crochets, mal rendu'); |
| 195 | 195 | } |
| 196 | 196 | } |
@@ -291,10 +291,10 @@ discard block |
||
| 291 | 291 | '2.0/2' => (2.0 / 2), |
| 292 | 292 | '2/2' => (2 / 2), |
| 293 | 293 | 'md5(8)' => md5('8'), |
| 294 | - 'md5(' . sql_quote('a') . ')' => md5('a'), |
|
| 294 | + 'md5('.sql_quote('a').')' => md5('a'), |
|
| 295 | 295 | ] as $func => $expected |
| 296 | 296 | ) { |
| 297 | - $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]); |
|
| 297 | + $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin='.sql_quote(1)]); |
|
| 298 | 298 | $this->assertEquals($expected, $nb, "Selection {$func} en echec"); |
| 299 | 299 | } |
| 300 | 300 | } |
@@ -307,11 +307,11 @@ discard block |
||
| 307 | 307 | function testStringFunctions() { |
| 308 | 308 | foreach ( |
| 309 | 309 | [ |
| 310 | - 'CONCAT(' . sql_quote('cou') . ',' . sql_quote('cou') . ')' => 'coucou', |
|
| 311 | - 'CONCAT(' . sql_quote('cou,') . ',' . sql_quote('cou') . ')' => 'cou,cou', |
|
| 310 | + 'CONCAT('.sql_quote('cou').','.sql_quote('cou').')' => 'coucou', |
|
| 311 | + 'CONCAT('.sql_quote('cou,').','.sql_quote('cou').')' => 'cou,cou', |
|
| 312 | 312 | ] as $func => $expected |
| 313 | 313 | ) { |
| 314 | - $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]); |
|
| 314 | + $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin='.sql_quote(1)]); |
|
| 315 | 315 | $this->assertEquals($expected, $nb, "Selection {$func} en echec"); |
| 316 | 316 | } |
| 317 | 317 | } |
@@ -339,11 +339,11 @@ discard block |
||
| 339 | 339 | #[Depends('testInsertData')] |
| 340 | 340 | public function testUpdateData() { |
| 341 | 341 | // ajouter un champ |
| 342 | - $nb = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1)); |
|
| 342 | + $nb = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin='.sql_quote(1)); |
|
| 343 | 343 | sql_update('spip_test_tintin', [ |
| 344 | 344 | 'un_bigint' => 'un_bigint+2', |
| 345 | 345 | ]); |
| 346 | - $nb2 = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1)); |
|
| 346 | + $nb2 = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin='.sql_quote(1)); |
|
| 347 | 347 | $this->assertEquals($nb + 2, $nb2, 'sql_update n’a pas fait l’adition !'); |
| 348 | 348 | } |
| 349 | 349 | |
@@ -355,7 +355,7 @@ discard block |
||
| 355 | 355 | public function test_delete_data() { |
| 356 | 356 | $nb = sql_countsel('spip_test_tintin'); |
| 357 | 357 | // supprimer une ligne |
| 358 | - sql_delete('spip_test_tintin', 'id_tintin=' . sql_quote(1)); |
|
| 358 | + sql_delete('spip_test_tintin', 'id_tintin='.sql_quote(1)); |
|
| 359 | 359 | $this->assertEquals($nb - 1, sql_countsel('spip_test_tintin'), "sql_delete n’a pas supprimé la ligne"); |
| 360 | 360 | |
| 361 | 361 | // supprimer tout |
@@ -10,689 +10,689 @@ |
||
| 10 | 10 | |
| 11 | 11 | class SqlSchemaTableTest extends TestCase |
| 12 | 12 | { |
| 13 | - public static function setUpBeforeClass(): void |
|
| 14 | - { |
|
| 15 | - find_in_path('base/abstract_sql.php', '', true); |
|
| 16 | - } |
|
| 17 | - |
|
| 18 | - #[DataProvider('providerTablesData')] |
|
| 19 | - public function testDropTablesSetup($table, $desc, $data): void |
|
| 20 | - { |
|
| 21 | - $this->assertTrue(sql_drop_table($table, true)); |
|
| 22 | - } |
|
| 23 | - |
|
| 24 | - #[Depends('testDropTablesSetup')] |
|
| 25 | - #[DataProvider('providerTablesData')] |
|
| 26 | - public function testCreateTables($table, $desc, $data): void |
|
| 27 | - { |
|
| 28 | - $this->assertTrue(sql_create($table, $desc['field'], $desc['key'])); |
|
| 29 | - } |
|
| 30 | - |
|
| 31 | - /** |
|
| 32 | - * Creation/suppression/analyse de tables dans la base de donnee |
|
| 33 | - * |
|
| 34 | - * Permet de verifier que |
|
| 35 | - * - tous les champs sont correctement ajoutes |
|
| 36 | - * - que les PRIMARY sont pris en compte |
|
| 37 | - * - que les KEY sont prises en compte |
|
| 38 | - */ |
|
| 39 | - #[Depends('testCreateTables')] |
|
| 40 | - #[DataProvider('providerTablesData')] |
|
| 41 | - public function testShowTable($table, $desc, $data) { |
|
| 42 | - // lire la structure de la table |
|
| 43 | - // la structure doit avoir le meme nombre de champs et de cle |
|
| 44 | - // attention : la primary key DOIT etre dans les cle aussi |
|
| 45 | - $_desc = sql_showtable($table); |
|
| 46 | - $this->assertCount(count($desc['field']), $_desc['field']); |
|
| 47 | - $this->assertCount($desc['nb_key_attendues'], $_desc['key']); |
|
| 48 | - } |
|
| 49 | - |
|
| 50 | - #[Depends('testCreateTables')] |
|
| 51 | - #[DataProvider('providerTablesData')] |
|
| 52 | - public function testInsertData($table, $desc, $data) { |
|
| 53 | - $this->assertNotFalse(sql_insertq_multi($table, $data)); |
|
| 54 | - $this->assertEquals(count($data), sql_countsel($table)); |
|
| 55 | - } |
|
| 56 | - |
|
| 57 | - /** |
|
| 58 | - * Teste que le champ "maj" s'actualise bien sur les update |
|
| 59 | - * ainsi que les autres champs ! |
|
| 60 | - * |
|
| 61 | - * utilise sql_quote, sql_getfetsel, sql_update et sql_updateq. |
|
| 62 | - */ |
|
| 63 | - #[Depends('testInsertData')] |
|
| 64 | - public function testMajTimestamp() { |
|
| 65 | - $table = 'spip_test_tintin'; |
|
| 66 | - $where1 = 'id_tintin=' . sql_quote(1); |
|
| 67 | - $where2 = 'id_tintin=' . sql_quote(2); |
|
| 68 | - |
|
| 69 | - // lecture du timestamp actuel |
|
| 70 | - $maj1 = sql_getfetsel('maj', $table, $where1); |
|
| 71 | - $this->assertNotEmpty($maj1, "Le champ 'maj' n'a vraisemblablement pas recu de timestamp à l'insertion"); |
|
| 72 | - |
|
| 73 | - $maj2 = sql_getfetsel('maj', $table, $where2); |
|
| 74 | - $this->assertNotEmpty($maj2, "Le champ 'maj' n'a vraisemblablement pas recu de timestamp à l'insertion"); |
|
| 75 | - |
|
| 76 | - // 1s de plus, sinon le timestamp ne change pas ! |
|
| 77 | - sleep(1); |
|
| 78 | - |
|
| 79 | - // update |
|
| 80 | - $texte = 'nouveau texte'; |
|
| 81 | - sql_update($table, [ |
|
| 82 | - 'un_texte' => sql_quote($texte), |
|
| 83 | - ], $where1); |
|
| 84 | - |
|
| 85 | - // comparaison timastamp |
|
| 86 | - $maj_update = sql_getfetsel('maj', $table, $where1); |
|
| 87 | - $this->assertNotEmpty($maj_update, "Le champ 'maj' est vide à l’update"); |
|
| 88 | - $this->assertNotFalse(strtotime($maj_update), "Le champ 'maj' est incorrect à l’update"); |
|
| 89 | - $this->assertNotEquals($maj1, $maj_update, "Le champ 'maj' n'a vraisemblablement pas été mis a jour lors de l'update"); |
|
| 90 | - |
|
| 91 | - // comparaison texte |
|
| 92 | - $texte_update = sql_getfetsel('un_texte', $table, $where1); |
|
| 93 | - $this->assertNotEmpty($texte_update, "Le champ 'un_texte' est vide à l’update"); |
|
| 94 | - $this->assertEquals($texte, $texte_update, "Le champ 'un_texte' n'est pas correctement rempli a l'update"); |
|
| 95 | - |
|
| 96 | - // idem avec updateq |
|
| 97 | - $texte = 'encore un nouveau texte'; |
|
| 98 | - sql_updateq($table, [ |
|
| 99 | - 'un_texte' => $texte, |
|
| 100 | - ], $where2); |
|
| 101 | - |
|
| 102 | - // comparaison timastamp |
|
| 103 | - $maj_updateq = sql_getfetsel('maj', $table, $where2); |
|
| 104 | - $this->assertNotEmpty($maj_updateq, "Le champ 'maj' est vide à l’updateq"); |
|
| 105 | - $this->assertNotFalse(strtotime($maj_updateq), "Le champ 'maj' est incorrect à l’updateq"); |
|
| 106 | - $this->assertNotEquals($maj1, $maj_updateq, "Le champ 'maj' n'a vraisemblablement pas été mis a jour lors de l'updateq"); |
|
| 107 | - |
|
| 108 | - // comparaison texte |
|
| 109 | - $texte_updateq = sql_getfetsel('un_texte', $table, $where2); |
|
| 110 | - $this->assertNotEmpty($texte_updateq, "Le champ 'un_texte' est vide à l’updateq"); |
|
| 111 | - $this->assertEquals($texte, $texte_updateq, "Le champ 'un_texte' n'est pas correctement rempli a l'updateq"); |
|
| 112 | - } |
|
| 113 | - |
|
| 114 | - /** |
|
| 115 | - * Selections diverses selon criteres |
|
| 116 | - */ |
|
| 117 | - #[Depends('testInsertData')] |
|
| 118 | - public function testSelections() { |
|
| 119 | - $data = $this->providerTablesData()['tintin'][2]; |
|
| 120 | - |
|
| 121 | - $res = sql_select('*', 'spip_test_tintin'); |
|
| 122 | - $this->assertNotFalse($res); |
|
| 123 | - $this->assertEquals(count($data), sql_count($res), 'sql_count() ne renvoie pas la valeur attendue'); |
|
| 124 | - |
|
| 125 | - // selection float |
|
| 126 | - $res = sql_select('*', 'spip_test_tintin', ['un_double>' . sql_quote(3)]); |
|
| 127 | - $n = count(array_filter($data, fn ($entry) => $entry['un_double'] > 3)); |
|
| 128 | - $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un float'); |
|
| 129 | - |
|
| 130 | - // selection REGEXP |
|
| 131 | - $res = sql_select('*', 'spip_test_tintin', ['un_varchar REGEXP ' . sql_quote('^De')]); |
|
| 132 | - $n = count(array_filter($data, fn ($entry) => str_starts_with($entry['un_varchar'], 'De'))); |
|
| 133 | - $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur une REGEXP'); |
|
| 134 | - |
|
| 135 | - // selection LIKE |
|
| 136 | - $res = sql_select('*', 'spip_test_tintin', ['un_varchar LIKE ' . sql_quote('De%')]); |
|
| 137 | - $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un LIKE'); |
|
| 138 | - |
|
| 139 | - // selection array(champs) |
|
| 140 | - $res = sql_fetsel(['id_tintin', 'un_varchar'], 'spip_test_tintin'); |
|
| 141 | - $this->assertArrayHasKey('id_tintin', $res); |
|
| 142 | - $this->assertArrayHasKey('un_varchar', $res); |
|
| 143 | - |
|
| 144 | - // selection array(champs=>alias) |
|
| 145 | - $res = sql_fetsel(['id_tintin AS id', 'un_varchar AS vchar'], 'spip_test_tintin'); |
|
| 146 | - $this->assertArrayHasKey('id', $res); |
|
| 147 | - $this->assertArrayHasKey('vchar', $res); |
|
| 148 | - } |
|
| 149 | - |
|
| 150 | - |
|
| 151 | - #[Depends('testInsertData')] |
|
| 152 | - public function testSelectionsMulti() { |
|
| 153 | - $data = $this->providerTablesData()['milou'][2]; |
|
| 154 | - |
|
| 155 | - // selection avec sql_multi |
|
| 156 | - $res = sql_select(['id_milou', sql_multi('grrrr', 'fr')], 'spip_test_milou', orderby: 'multi'); |
|
| 157 | - $this->assertNotFalse($res); |
|
| 158 | - $this->assertEquals(count($data), sql_count($res), 'sql_multi mal interprété'); |
|
| 159 | - $this->assertEquals(3, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté'); |
|
| 160 | - $this->assertEquals(2, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté'); |
|
| 161 | - $this->assertEquals(1, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté'); |
|
| 162 | - |
|
| 163 | - // le bon texte avec multi |
|
| 164 | - foreach ( |
|
| 165 | - [ |
|
| 166 | - 'fr' => 'Crac', |
|
| 167 | - 'en' => 'Krack', |
|
| 168 | - ] as $lg => $res |
|
| 169 | - ) { |
|
| 170 | - $multi = sql_getfetsel(sql_multi('grrrr', $lg), 'spip_test_milou', 'id_milou=' . sql_quote(2)); |
|
| 171 | - $this->assertEquals($res, $multi, 'sql_multi mal rendu'); |
|
| 172 | - } |
|
| 173 | - |
|
| 174 | - // le bon texte avec multi et accents |
|
| 175 | - foreach ( |
|
| 176 | - [ |
|
| 177 | - 'fr' => 'Aérien', |
|
| 178 | - 'en' => 'Aérieny', |
|
| 179 | - ] as $lg => $res |
|
| 180 | - ) { |
|
| 181 | - $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(2)); |
|
| 182 | - $this->assertEquals($res, $multi, 'sql_multi avec accents, mal rendu'); |
|
| 183 | - } |
|
| 184 | - |
|
| 185 | - // le bon texte avec multi et debut et fin de chaine |
|
| 186 | - foreach ( |
|
| 187 | - [ |
|
| 188 | - 'fr' => 'Un début de chaine : Vinasse, et [la fin]', |
|
| 189 | - 'en' => 'Un début de chaine : Vinassy, et [la fin]', |
|
| 190 | - 'de' => 'Un début de chaine : Vinasse, et [la fin]', |
|
| 191 | - ] as $lg => $res |
|
| 192 | - ) { |
|
| 193 | - $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(4)); |
|
| 194 | - $this->assertEquals($res, $multi, 'sql_multi avec crochets, mal rendu'); |
|
| 195 | - } |
|
| 196 | - } |
|
| 197 | - |
|
| 198 | - |
|
| 199 | - |
|
| 200 | - /** |
|
| 201 | - * Selections diverses entre plusieurs tables |
|
| 202 | - */ |
|
| 203 | - #[Depends('testInsertData')] |
|
| 204 | - public function testSelectionsEntreTable() { |
|
| 205 | - // selection 2 tables |
|
| 206 | - // ! nombre en dur ! |
|
| 207 | - $res = sql_select( |
|
| 208 | - ['spip_test_tintin.id_tintin', 'spip_test_milou.id_milou'], |
|
| 209 | - ['spip_test_tintin', 'spip_test_milou'], |
|
| 210 | - ['spip_test_milou.id_tintin=spip_test_tintin.id_tintin'] |
|
| 211 | - ); |
|
| 212 | - $this->assertEquals(3, sql_count($res), 'Echec sélection'); |
|
| 213 | - |
|
| 214 | - // selection 2 tables avec alias => |
|
| 215 | - // ! nombre en dur ! |
|
| 216 | - $res = sql_select( |
|
| 217 | - ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 218 | - [ |
|
| 219 | - 'a' => 'spip_test_tintin', |
|
| 220 | - 'b' => 'spip_test_milou', |
|
| 221 | - ], |
|
| 222 | - ['a.id_tintin=b.id_tintin'] |
|
| 223 | - ); |
|
| 224 | - $this->assertEquals(3, sql_count($res), 'Echec sélection avec alias de colonnes et tables'); |
|
| 225 | - |
|
| 226 | - // selection 2 tables avec alias AS |
|
| 227 | - // ! nombre en dur ! |
|
| 228 | - $res = sql_select( |
|
| 229 | - ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 230 | - ['spip_test_tintin AS a', 'spip_test_milou AS b'], |
|
| 231 | - ['a.id_tintin=b.id_tintin'] |
|
| 232 | - ); |
|
| 233 | - $this->assertEquals(3, sql_count($res)); |
|
| 234 | - |
|
| 235 | - // selection 2 tables avec INNER JOIN + ON |
|
| 236 | - // ! nombre en dur ! |
|
| 237 | - $res = sql_select( |
|
| 238 | - ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 239 | - ['spip_test_tintin AS a INNER JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)'] |
|
| 240 | - ); |
|
| 241 | - $this->assertEquals(3, sql_count($res), 'Echec sélection avec INNER JOIN + ON'); |
|
| 242 | - |
|
| 243 | - // selection 2 tables avec LEFT JOIN + ON |
|
| 244 | - // ! nombre en dur ! |
|
| 245 | - $res = sql_select( |
|
| 246 | - ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 247 | - ['spip_test_tintin AS a LEFT JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)'] |
|
| 248 | - ); |
|
| 249 | - $this->assertEquals(4, sql_count($res), 'Echec sélection avec LEFT JOIN + ON'); |
|
| 250 | - |
|
| 251 | - |
|
| 252 | - // selection 2 tables avec jointure INNER JOIN + USING |
|
| 253 | - // ! nombre en dur ! |
|
| 254 | - // SQLite 2 se plante : il ne connait pas USING (enleve de la requete, |
|
| 255 | - // et du coup ne fait pas correctement la jointure) |
|
| 256 | - $res = sql_select( |
|
| 257 | - ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 258 | - ['spip_test_tintin AS a INNER JOIN spip_test_milou AS b USING (id_tintin)'] |
|
| 259 | - ); |
|
| 260 | - $this->assertEquals(3, sql_count($res), 'Echec sélection avec INNER JOIN + USING'); |
|
| 261 | - } |
|
| 262 | - |
|
| 263 | - |
|
| 264 | - /** |
|
| 265 | - * Selections mathematiques |
|
| 266 | - */ |
|
| 267 | - #[Depends('testInsertData')] |
|
| 268 | - function testMathFunctions() { |
|
| 269 | - foreach ( |
|
| 270 | - [ |
|
| 271 | - 'COUNT' => 3, |
|
| 272 | - 'SUM' => 9000, |
|
| 273 | - 'AVG' => 3000, |
|
| 274 | - ] as $func => $expected |
|
| 275 | - ) { |
|
| 276 | - $nb = sql_getfetsel("{$func}(un_int) AS nb", ['spip_test_tintin']); |
|
| 277 | - $this->assertEquals($expected, $nb, "Selection {$func} en echec"); |
|
| 278 | - } |
|
| 279 | - |
|
| 280 | - foreach ( |
|
| 281 | - [ |
|
| 282 | - 'EXP(0)' => exp(0), |
|
| 283 | - 'ROUND(3.56)' => round(3.56), |
|
| 284 | - 'ROUND(3.5684,2)' => round(3.5684, 2), |
|
| 285 | - 'SQRT(9)' => 3, |
|
| 286 | - //'1/2'=>(0), // Le standard SQL : entier divise par entier = division entiere (pas trouve la reference) |
|
| 287 | - '1.0/2' => (1 / 2), // Le standart SQL : reel divise par entier = reel |
|
| 288 | - //'4/3'=>1, |
|
| 289 | - 'ROUND(4.0/3,2)' => round(4 / 3, 2), |
|
| 290 | - '1.5/2' => (1.5 / 2), |
|
| 291 | - '2.0/2' => (2.0 / 2), |
|
| 292 | - '2/2' => (2 / 2), |
|
| 293 | - 'md5(8)' => md5('8'), |
|
| 294 | - 'md5(' . sql_quote('a') . ')' => md5('a'), |
|
| 295 | - ] as $func => $expected |
|
| 296 | - ) { |
|
| 297 | - $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]); |
|
| 298 | - $this->assertEquals($expected, $nb, "Selection {$func} en echec"); |
|
| 299 | - } |
|
| 300 | - } |
|
| 301 | - |
|
| 302 | - /** |
|
| 303 | - * Selections mathematiques |
|
| 304 | - */ |
|
| 305 | - #[Depends('testInsertData')] |
|
| 306 | - |
|
| 307 | - function testStringFunctions() { |
|
| 308 | - foreach ( |
|
| 309 | - [ |
|
| 310 | - 'CONCAT(' . sql_quote('cou') . ',' . sql_quote('cou') . ')' => 'coucou', |
|
| 311 | - 'CONCAT(' . sql_quote('cou,') . ',' . sql_quote('cou') . ')' => 'cou,cou', |
|
| 312 | - ] as $func => $expected |
|
| 313 | - ) { |
|
| 314 | - $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]); |
|
| 315 | - $this->assertEquals($expected, $nb, "Selection {$func} en echec"); |
|
| 316 | - } |
|
| 317 | - } |
|
| 318 | - |
|
| 319 | - /** |
|
| 320 | - * retours des fonctions d'erreurs lors d'une requete |
|
| 321 | - */ |
|
| 322 | - #[Depends('testCreateTables')] |
|
| 323 | - |
|
| 324 | - function testErrorFunctions() { |
|
| 325 | - // requete sans erreur |
|
| 326 | - sql_select('*', 'spip_test_tintin'); |
|
| 327 | - $this->assertEquals('', sql_error(), 'sql_error() non vide lors d’une requete sans erreur'); |
|
| 328 | - $this->assertEquals(0, sql_errno(), 'sql_errno() ne retourne pas 0 lors d’une requete sans erreur'); |
|
| 329 | - |
|
| 330 | - // requete en erreur |
|
| 331 | - sql_select('*', 'spip_test_toto'); |
|
| 332 | - $this->assertNotEquals('', sql_error(), 'sql_error() vide lors d’une requete en erreur'); |
|
| 333 | - $this->assertNotEquals(0, sql_errno(), 'sql_errno() retourne 0 lors d’une requete en erreur'); |
|
| 334 | - } |
|
| 335 | - |
|
| 336 | - /** |
|
| 337 | - * Update de data |
|
| 338 | - */ |
|
| 339 | - #[Depends('testInsertData')] |
|
| 340 | - public function testUpdateData() { |
|
| 341 | - // ajouter un champ |
|
| 342 | - $nb = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1)); |
|
| 343 | - sql_update('spip_test_tintin', [ |
|
| 344 | - 'un_bigint' => 'un_bigint+2', |
|
| 345 | - ]); |
|
| 346 | - $nb2 = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1)); |
|
| 347 | - $this->assertEquals($nb + 2, $nb2, 'sql_update n’a pas fait l’adition !'); |
|
| 348 | - } |
|
| 349 | - |
|
| 350 | - /** |
|
| 351 | - * Delete de data |
|
| 352 | - */ |
|
| 353 | - #[Depends('testInsertData')] |
|
| 354 | - |
|
| 355 | - public function test_delete_data() { |
|
| 356 | - $nb = sql_countsel('spip_test_tintin'); |
|
| 357 | - // supprimer une ligne |
|
| 358 | - sql_delete('spip_test_tintin', 'id_tintin=' . sql_quote(1)); |
|
| 359 | - $this->assertEquals($nb - 1, sql_countsel('spip_test_tintin'), "sql_delete n’a pas supprimé la ligne"); |
|
| 360 | - |
|
| 361 | - // supprimer tout |
|
| 362 | - sql_delete('spip_test_tintin'); |
|
| 363 | - $this->assertEquals(0, sql_countsel('spip_test_tintin'), "sql_delete n’a pas vidé la table"); |
|
| 364 | - } |
|
| 365 | - |
|
| 366 | - /** |
|
| 367 | - * Alter colonne |
|
| 368 | - */ |
|
| 369 | - #[Depends('testCreateTables')] |
|
| 370 | - function testAlterColumns() { |
|
| 371 | - $table = 'spip_test_tintin'; |
|
| 372 | - |
|
| 373 | - // supprimer une colonne |
|
| 374 | - sql_alter("TABLE {$table} DROP COLUMN un_bigint"); |
|
| 375 | - $desc = sql_showtable($table); |
|
| 376 | - $this->assertIsArray($desc, 'sql_alter rate DROP COLUMN (plus de table ou sql_showtable en erreur?)'); |
|
| 377 | - $this->assertArrayNotHasKey('un_bigint', $desc['field']); |
|
| 378 | - $this->assertArrayHasKey('un_smallint', $desc['field']); |
|
| 379 | - |
|
| 380 | - // supprimer une colonne (sans COLUMN) |
|
| 381 | - sql_alter("TABLE {$table} DROP un_smallint"); |
|
| 382 | - $desc = sql_showtable($table); |
|
| 383 | - $this->assertIsArray($desc, 'sql_alter rate DROP sans COLUMN (plus de table ou sql_showtable en erreur?)'); |
|
| 384 | - $this->assertArrayNotHasKey('un_smallint', $desc['field']); |
|
| 385 | - |
|
| 386 | - // renommer une colonne |
|
| 387 | - sql_alter("TABLE {$table} CHANGE un_varchar deux_varchars VARCHAR(30) NOT NULL DEFAULT ''"); |
|
| 388 | - $desc = sql_showtable($table); |
|
| 389 | - $this->assertIsArray($desc, 'sql_alter rate CHANGE (plus de table ou sql_showtable en erreur?)'); |
|
| 390 | - $this->assertArrayHasKey('deux_varchars', $desc['field']); |
|
| 391 | - $this->assertArrayNotHasKey('un_varchar', $desc['field']); |
|
| 392 | - |
|
| 393 | - // changer le type d'une colonne |
|
| 394 | - $table = 'spip_test_milou'; |
|
| 395 | - sql_alter("TABLE {$table} MODIFY schtroumf TEXT NOT NULL DEFAULT ''"); |
|
| 396 | - $desc = sql_showtable($table); |
|
| 397 | - $this->assertIsArray($desc, 'sql_alter rate MODIFY (plus de table ou sql_showtable en erreur?)'); |
|
| 398 | - $this->assertArrayHasKey('schtroumf', $desc['field'], 'sql_alter rate MODIFY varchar en text'); |
|
| 399 | - $this->assertStringContainsStringIgnoringCase('TEXT', $desc['field']['schtroumf'], 'sql_alter rate MODIFY varchar en text'); |
|
| 400 | - |
|
| 401 | - // ajouter des colonnes |
|
| 402 | - sql_alter("TABLE {$table} ADD COLUMN houba BIGINT(21) NOT NULL DEFAULT '0'"); |
|
| 403 | - $desc = sql_showtable($table); |
|
| 404 | - $this->assertIsArray($desc, 'sql_alter rate ADD COLUMN (plus de table ou sql_showtable en erreur?)'); |
|
| 405 | - $this->assertArrayHasKey('houba', $desc['field'], 'sql_alter rate ADD COLUMN'); |
|
| 406 | - $this->assertStringContainsStringIgnoringCase('INT', $desc['field']['houba'], 'sql_alter rate ADD COLUMN'); |
|
| 407 | - |
|
| 408 | - // ajouter des colonnes avec "AFTER" |
|
| 409 | - sql_alter("TABLE {$table} ADD COLUMN hop BIGINT(21) NOT NULL DEFAULT '0' AFTER id_tintin"); |
|
| 410 | - $desc = sql_showtable($table); |
|
| 411 | - $this->assertIsArray($desc, 'sql_alter rate ADD COLUMN avec AFTER (plus de table ou sql_showtable en erreur?)'); |
|
| 412 | - $this->assertArrayHasKey('hop', $desc['field'], 'sql_alter rate ADD COLUMN avec AFTER'); |
|
| 413 | - $this->assertStringContainsStringIgnoringCase('INT', $desc['field']['hop'], 'sql_alter rate ADD COLUMN avec AFTER'); |
|
| 414 | - } |
|
| 415 | - |
|
| 416 | - |
|
| 417 | - /** |
|
| 418 | - * Renomme table |
|
| 419 | - */ |
|
| 420 | - #[Depends('testCreateTables')] |
|
| 421 | - |
|
| 422 | - public function testAlterRenameTable() { |
|
| 423 | - |
|
| 424 | - $table_before = 'spip_test_tintin'; |
|
| 425 | - $table_after = 'spip_test_castafiore'; |
|
| 426 | - sql_drop_table($table_after, true); |
|
| 427 | - $this->assertEmpty(sql_showtable($table_after)); |
|
| 428 | - $this->assertIsArray(sql_showtable($table_before)); |
|
| 429 | - |
|
| 430 | - // renommer une table |
|
| 431 | - sql_alter("TABLE {$table_before} RENAME {$table_after}"); |
|
| 432 | - $this->assertEmpty(sql_showtable($table_before)); |
|
| 433 | - $this->assertIsArray(sql_showtable($table_after)); |
|
| 434 | - |
|
| 435 | - sql_alter("TABLE {$table_after} RENAME {$table_before}"); |
|
| 436 | - $this->assertEmpty(sql_showtable($table_after)); |
|
| 437 | - $this->assertIsArray(sql_showtable($table_before)); |
|
| 438 | - } |
|
| 439 | - |
|
| 440 | - |
|
| 441 | - /** |
|
| 442 | - * pointer l'index |
|
| 443 | - */ |
|
| 444 | - #[Depends('testCreateTables')] |
|
| 445 | - |
|
| 446 | - public function testAlterIndex() { |
|
| 447 | - $table = 'spip_test_milou'; |
|
| 448 | - |
|
| 449 | - // supprimer un index |
|
| 450 | - sql_alter("TABLE {$table} DROP INDEX sons"); |
|
| 451 | - $desc = sql_showtable($table); |
|
| 452 | - $this->assertIsArray($desc, 'sql_alter rate DROP INDEX sons (plus de table ou sql_showtable en erreur?)'); |
|
| 453 | - $this->assertArrayNotHasKey('KEY sons', $desc['key'], 'sql_alter rate DROP INDEX sons'); |
|
| 454 | - |
|
| 455 | - // ajouter un index simple |
|
| 456 | - sql_alter("TABLE {$table} ADD INDEX (wouaf)"); |
|
| 457 | - $desc = sql_showtable($table); |
|
| 458 | - $this->assertIsArray($desc, 'sql_alter rate ADD INDEX (wouaf) (plus de table ou sql_showtable en erreur?)'); |
|
| 459 | - $this->assertArrayHasKey('KEY wouaf', $desc['key'], 'sql_alter rate ADD INDEX (wouaf)'); |
|
| 460 | - |
|
| 461 | - // ajouter un index nomme |
|
| 462 | - sql_alter("TABLE {$table} ADD INDEX pluie (grrrr)"); |
|
| 463 | - $desc = sql_showtable($table); |
|
| 464 | - $this->assertIsArray($desc, 'sql_alter rate ADD INDEX pluie (grrrr) (plus de table ou sql_showtable en erreur?)'); |
|
| 465 | - $this->assertArrayHasKey('KEY pluie', $desc['key'], 'sql_alter rate ADD INDEX pluie (grrrr)'); |
|
| 466 | - |
|
| 467 | - // supprimer un index |
|
| 468 | - sql_alter("TABLE {$table} DROP INDEX pluie"); |
|
| 469 | - $desc = sql_showtable($table); |
|
| 470 | - $this->assertIsArray($desc, 'sql_alter rate DROP INDEX pluie (plus de table ou sql_showtable en erreur?)'); |
|
| 471 | - $this->assertArrayNotHasKey('KEY pluie', $desc['key'], 'sql_alter rate DROP INDEX pluie'); |
|
| 472 | - |
|
| 473 | - // ajouter un index nomme double |
|
| 474 | - sql_alter("TABLE {$table} ADD INDEX dring (grrrr, wouaf)"); |
|
| 475 | - $desc = sql_showtable($table); |
|
| 476 | - $this->assertIsArray($desc, 'sql_alter rate ADD INDEX dring (grrrr, wouaf) (plus de table ou sql_showtable en erreur?)'); |
|
| 477 | - $this->assertArrayHasKey('KEY dring', $desc['key'], 'sql_alter rate ADD INDEX dring (grrrr, wouaf)'); |
|
| 478 | - } |
|
| 479 | - |
|
| 480 | - |
|
| 481 | - /** |
|
| 482 | - * dezinguer la primary |
|
| 483 | - */ |
|
| 484 | - #[Depends('testCreateTables')] |
|
| 485 | - |
|
| 486 | - public function testAlterPrimary() { |
|
| 487 | - $table = 'spip_test_kirikou'; |
|
| 488 | - sql_drop_table($table, true); |
|
| 489 | - |
|
| 490 | - // creer une table pour jouer |
|
| 491 | - sql_create( |
|
| 492 | - $table, |
|
| 493 | - [ |
|
| 494 | - 'un' => 'INTEGER NOT NULL', |
|
| 495 | - 'deux' => 'INTEGER NOT NULL', |
|
| 496 | - 'trois' => 'INTEGER NOT NULL', |
|
| 497 | - ], |
|
| 498 | - [ |
|
| 499 | - 'PRIMARY KEY' => 'un', |
|
| 500 | - ] |
|
| 501 | - ); |
|
| 502 | - |
|
| 503 | - // supprimer une primary |
|
| 504 | - $desc = sql_showtable($table); |
|
| 505 | - sql_alter("TABLE {$table} DROP PRIMARY KEY"); |
|
| 506 | - $desc = sql_showtable($table); |
|
| 507 | - $this->assertIsArray($desc, 'sql_alter rate DROP PRIMARY KEY (plus de table ou sql_showtable en erreur?)'); |
|
| 508 | - $this->assertArrayNotHasKey('PRIMARY KEY', $desc['key'], 'sql_alter rate DROP PRIMARY KEY'); |
|
| 509 | - |
|
| 510 | - // ajouter une primary |
|
| 511 | - $desc = sql_showtable($table); |
|
| 512 | - sql_alter("TABLE {$table} ADD PRIMARY KEY (deux, trois)"); |
|
| 513 | - $desc = sql_showtable($table); |
|
| 514 | - $this->assertIsArray($desc, 'sql_alter rate ADD PRIMARY KEY (plus de table ou sql_showtable en erreur?)'); |
|
| 515 | - $this->assertArrayHasKey('PRIMARY KEY', $desc['key'], 'sql_alter rate ADD PRIMARY KEY'); |
|
| 516 | - |
|
| 517 | - sql_drop_table($table, true); |
|
| 518 | - } |
|
| 519 | - |
|
| 520 | - /** |
|
| 521 | - * Alter colonne |
|
| 522 | - */ |
|
| 523 | - #[Depends('testAlterColumns')] |
|
| 524 | - #[Depends('testAlterIndex')] |
|
| 525 | - |
|
| 526 | - function testAlterMultiple() { |
|
| 527 | - $table = 'spip_test_milou'; |
|
| 528 | - |
|
| 529 | - // supprimer des colonnes |
|
| 530 | - sql_alter("TABLE {$table} DROP INDEX dring, DROP COLUMN wouaf, DROP COLUMN grrrr"); |
|
| 531 | - $desc = sql_showtable($table); |
|
| 532 | - $this->assertIsArray($desc, 'sql_alter rate DROP multiples (plus de table ou sql_showtable en erreur?)'); |
|
| 533 | - $this->assertArrayNotHasKey('waouf', $desc['field'], 'sql_alter rate DROP multiples'); |
|
| 534 | - $this->assertArrayNotHasKey('grrrr', $desc['field'], 'sql_alter rate DROP multiples'); |
|
| 535 | - $this->assertArrayNotHasKey('KEY dring', $desc['key'], 'sql_alter rate DROP multiples'); |
|
| 536 | - |
|
| 537 | - // ajouter des colonnes |
|
| 538 | - sql_alter("TABLE {$table} ADD COLUMN a INT, ADD COLUMN b INT, ADD COLUMN c INT, ADD INDEX abc (a,b,c)"); |
|
| 539 | - $desc = sql_showtable($table); |
|
| 540 | - $this->assertIsArray($desc, 'sql_alter rate ADD multiples (plus de table ou sql_showtable en erreur?)'); |
|
| 541 | - $this->assertArrayHasKey('a', $desc['field'], 'sql_alter rate ADD multiples'); |
|
| 542 | - $this->assertArrayHasKey('b', $desc['field'], 'sql_alter rate ADD multiples'); |
|
| 543 | - $this->assertArrayHasKey('c', $desc['field'], 'sql_alter rate ADD multiples'); |
|
| 544 | - $this->assertArrayHasKey('KEY abc', $desc['key'], 'sql_alter rate ADD multiples'); |
|
| 545 | - } |
|
| 546 | - |
|
| 547 | - #[Depends('testCreateTables')] |
|
| 548 | - #[DataProvider('providerTablesData')] |
|
| 549 | - public function testDropTables($table, $desc, $data): void |
|
| 550 | - { |
|
| 551 | - $this->assertTrue(sql_drop_table($table, false)); |
|
| 552 | - } |
|
| 553 | - |
|
| 554 | - /** |
|
| 555 | - * Description des tables & données de tests |
|
| 556 | - */ |
|
| 557 | - public static function providerTablesData(): array |
|
| 558 | - { |
|
| 559 | - return [ |
|
| 560 | - 'tintin' => [ |
|
| 561 | - 'spip_test_tintin', |
|
| 562 | - [ |
|
| 563 | - 'field' => [ |
|
| 564 | - "id_tintin" => "INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY", |
|
| 565 | - "un_bigint" => "BIGINT(21) NOT NULL DEFAULT '0'", |
|
| 566 | - "un_int" => "BIGINT(21) NOT NULL DEFAULT '0'", |
|
| 567 | - "un_smallint" => "SMALLINT(3) NOT NULL DEFAULT '0'", |
|
| 568 | - "un_double" => "DOUBLE NOT NULL DEFAULT '0'", |
|
| 569 | - "un_tinyint" => "TINYINT(2) NOT NULL DEFAULT '0'", |
|
| 570 | - "un_varchar" => "VARCHAR(30) NOT NULL DEFAULT ''", |
|
| 571 | - "un_texte" => "TEXT NOT NULL DEFAULT ''", |
|
| 572 | - "maj" => "TIMESTAMP" |
|
| 573 | - ], |
|
| 574 | - 'key' => [ |
|
| 575 | - |
|
| 576 | - ], |
|
| 577 | - 'nb_key_attendues' => 1 // attention : la primary key DOIT etre dans les cle aussi |
|
| 578 | - ], |
|
| 579 | - [ |
|
| 580 | - [ |
|
| 581 | - "id_tintin" => 1, |
|
| 582 | - "un_bigint" => 30000, |
|
| 583 | - "un_int" => 2000, |
|
| 584 | - "un_smallint" => 40, |
|
| 585 | - "un_double" => 2.58, |
|
| 586 | - "un_tinyint" => 8, |
|
| 587 | - "un_varchar" => "Premier varchar", |
|
| 588 | - "un_texte" => "Premier texte", |
|
| 589 | - //"maj" => "" // doit se remplir automatiquement |
|
| 590 | - ], |
|
| 591 | - [ |
|
| 592 | - "id_tintin" => 2, |
|
| 593 | - "un_bigint" => 40000, |
|
| 594 | - "un_int" => 3000, |
|
| 595 | - "un_smallint" => 50, |
|
| 596 | - "un_double" => 3.58, |
|
| 597 | - "un_tinyint" => 9, |
|
| 598 | - "un_varchar" => "Deuxieme varchar", |
|
| 599 | - "un_texte" => "Second texte", |
|
| 600 | - //"maj" => "" // doit se remplir automatiquement |
|
| 601 | - ], |
|
| 602 | - [ |
|
| 603 | - "id_tintin" => 3, |
|
| 604 | - "un_bigint" => 60000, |
|
| 605 | - "un_int" => 4000, |
|
| 606 | - "un_smallint" => 70, |
|
| 607 | - "un_double" => 8.58, |
|
| 608 | - "un_tinyint" => 3, |
|
| 609 | - "un_varchar" => "Troisieme varchar", |
|
| 610 | - "un_texte" => "Troisieme texte", |
|
| 611 | - //"maj" => "" // doit se remplir automatiquement |
|
| 612 | - ], |
|
| 613 | - ], |
|
| 614 | - |
|
| 615 | - ], |
|
| 616 | - 'milou' => [ |
|
| 617 | - 'spip_test_milou', |
|
| 618 | - [ |
|
| 619 | - 'field' => [ |
|
| 620 | - "id_milou" => "INTEGER NOT NULL AUTO_INCREMENT", |
|
| 621 | - "id_tintin" => "INTEGER NOT NULL", |
|
| 622 | - "un_enum" => "ENUM('blanc','noir') NOT NULL DEFAULT 'blanc'", |
|
| 623 | - "wouaf" => "VARCHAR(80) NOT NULL DEFAULT ''", |
|
| 624 | - "grrrr" => "VARCHAR(80) NOT NULL DEFAULT ''", |
|
| 625 | - "schtroumf" => "VARCHAR(80) NOT NULL DEFAULT ''", |
|
| 626 | - "maj" => "TIMESTAMP" |
|
| 627 | - ], |
|
| 628 | - 'key' => [ |
|
| 629 | - "PRIMARY KEY" => "id_milou", |
|
| 630 | - "KEY id_tintin" => "id_tintin", |
|
| 631 | - "KEY sons" => "wouaf, grrrr", |
|
| 632 | - ], |
|
| 633 | - 'nb_key_attendues' => 3 // attention : la primary key DOIT etre dans les cle aussi |
|
| 634 | - ], |
|
| 635 | - [ |
|
| 636 | - [ |
|
| 637 | - "id_milou" => 1, |
|
| 638 | - "id_tintin" => 1, |
|
| 639 | - "un_enum" => "blanc", |
|
| 640 | - "wouaf" => "Warf !!", |
|
| 641 | - "grrrr" => "Grogne !", |
|
| 642 | - // "maj" => "" // doit se remplir automatiquement |
|
| 643 | - ], |
|
| 644 | - [ |
|
| 645 | - "id_milou" => 2, |
|
| 646 | - "id_tintin" => 1, |
|
| 647 | - "un_enum" => "noir", |
|
| 648 | - "wouaf" => "Wouf", |
|
| 649 | - "grrrr" => "<multi>[fr]Crac[en]Krack</multi>", |
|
| 650 | - // "maj" => "" // doit se remplir automatiquement |
|
| 651 | - ], |
|
| 652 | - [ |
|
| 653 | - "id_milou" => 3, |
|
| 654 | - "id_tintin" => 2, |
|
| 655 | - "un_enum" => "blanc", |
|
| 656 | - "wouaf" => "Wif", |
|
| 657 | - "grrrr" => "Ahrg", |
|
| 658 | - // "maj" => "" // doit se remplir automatiquement |
|
| 659 | - ], |
|
| 660 | - ], |
|
| 661 | - |
|
| 662 | - ], |
|
| 663 | - 'haddock' => [ |
|
| 664 | - 'spip_test_haddock', |
|
| 665 | - [ |
|
| 666 | - 'field' => [ |
|
| 667 | - "id_haddock" => "INTEGER NOT NULL AUTO_INCREMENT", |
|
| 668 | - "alcool" => "VARCHAR(80) NOT NULL DEFAULT ''", |
|
| 669 | - |
|
| 670 | - ], |
|
| 671 | - 'key' => [ |
|
| 672 | - "PRIMARY KEY" => "id_haddock", |
|
| 673 | - ], |
|
| 674 | - 'nb_key_attendues' => 1 // attention : la primary key DOIT etre dans les cle aussi |
|
| 675 | - ], |
|
| 676 | - [ |
|
| 677 | - [ |
|
| 678 | - "id_haddock" => 1, |
|
| 679 | - "alcool" => "<multi>[fr]Agile[en]Agily</multi>", |
|
| 680 | - ], |
|
| 681 | - [ |
|
| 682 | - "id_haddock" => 2, |
|
| 683 | - "alcool" => "<multi>[fr]Aérien[en]Aérieny</multi>", |
|
| 684 | - ], |
|
| 685 | - [ |
|
| 686 | - "id_haddock" => 3, |
|
| 687 | - "alcool" => "<multi>[fr]Vinasse[en]Vinassy</multi>", |
|
| 688 | - ], |
|
| 689 | - [ |
|
| 690 | - "id_haddock" => 4, |
|
| 691 | - "alcool" => "Un début de chaine : <multi>[fr]Vinasse[en]Vinassy</multi>, et [la fin]", |
|
| 692 | - ], |
|
| 693 | - ], |
|
| 694 | - |
|
| 695 | - ], |
|
| 696 | - ]; |
|
| 697 | - } |
|
| 13 | + public static function setUpBeforeClass(): void |
|
| 14 | + { |
|
| 15 | + find_in_path('base/abstract_sql.php', '', true); |
|
| 16 | + } |
|
| 17 | + |
|
| 18 | + #[DataProvider('providerTablesData')] |
|
| 19 | + public function testDropTablesSetup($table, $desc, $data): void |
|
| 20 | + { |
|
| 21 | + $this->assertTrue(sql_drop_table($table, true)); |
|
| 22 | + } |
|
| 23 | + |
|
| 24 | + #[Depends('testDropTablesSetup')] |
|
| 25 | + #[DataProvider('providerTablesData')] |
|
| 26 | + public function testCreateTables($table, $desc, $data): void |
|
| 27 | + { |
|
| 28 | + $this->assertTrue(sql_create($table, $desc['field'], $desc['key'])); |
|
| 29 | + } |
|
| 30 | + |
|
| 31 | + /** |
|
| 32 | + * Creation/suppression/analyse de tables dans la base de donnee |
|
| 33 | + * |
|
| 34 | + * Permet de verifier que |
|
| 35 | + * - tous les champs sont correctement ajoutes |
|
| 36 | + * - que les PRIMARY sont pris en compte |
|
| 37 | + * - que les KEY sont prises en compte |
|
| 38 | + */ |
|
| 39 | + #[Depends('testCreateTables')] |
|
| 40 | + #[DataProvider('providerTablesData')] |
|
| 41 | + public function testShowTable($table, $desc, $data) { |
|
| 42 | + // lire la structure de la table |
|
| 43 | + // la structure doit avoir le meme nombre de champs et de cle |
|
| 44 | + // attention : la primary key DOIT etre dans les cle aussi |
|
| 45 | + $_desc = sql_showtable($table); |
|
| 46 | + $this->assertCount(count($desc['field']), $_desc['field']); |
|
| 47 | + $this->assertCount($desc['nb_key_attendues'], $_desc['key']); |
|
| 48 | + } |
|
| 49 | + |
|
| 50 | + #[Depends('testCreateTables')] |
|
| 51 | + #[DataProvider('providerTablesData')] |
|
| 52 | + public function testInsertData($table, $desc, $data) { |
|
| 53 | + $this->assertNotFalse(sql_insertq_multi($table, $data)); |
|
| 54 | + $this->assertEquals(count($data), sql_countsel($table)); |
|
| 55 | + } |
|
| 56 | + |
|
| 57 | + /** |
|
| 58 | + * Teste que le champ "maj" s'actualise bien sur les update |
|
| 59 | + * ainsi que les autres champs ! |
|
| 60 | + * |
|
| 61 | + * utilise sql_quote, sql_getfetsel, sql_update et sql_updateq. |
|
| 62 | + */ |
|
| 63 | + #[Depends('testInsertData')] |
|
| 64 | + public function testMajTimestamp() { |
|
| 65 | + $table = 'spip_test_tintin'; |
|
| 66 | + $where1 = 'id_tintin=' . sql_quote(1); |
|
| 67 | + $where2 = 'id_tintin=' . sql_quote(2); |
|
| 68 | + |
|
| 69 | + // lecture du timestamp actuel |
|
| 70 | + $maj1 = sql_getfetsel('maj', $table, $where1); |
|
| 71 | + $this->assertNotEmpty($maj1, "Le champ 'maj' n'a vraisemblablement pas recu de timestamp à l'insertion"); |
|
| 72 | + |
|
| 73 | + $maj2 = sql_getfetsel('maj', $table, $where2); |
|
| 74 | + $this->assertNotEmpty($maj2, "Le champ 'maj' n'a vraisemblablement pas recu de timestamp à l'insertion"); |
|
| 75 | + |
|
| 76 | + // 1s de plus, sinon le timestamp ne change pas ! |
|
| 77 | + sleep(1); |
|
| 78 | + |
|
| 79 | + // update |
|
| 80 | + $texte = 'nouveau texte'; |
|
| 81 | + sql_update($table, [ |
|
| 82 | + 'un_texte' => sql_quote($texte), |
|
| 83 | + ], $where1); |
|
| 84 | + |
|
| 85 | + // comparaison timastamp |
|
| 86 | + $maj_update = sql_getfetsel('maj', $table, $where1); |
|
| 87 | + $this->assertNotEmpty($maj_update, "Le champ 'maj' est vide à l’update"); |
|
| 88 | + $this->assertNotFalse(strtotime($maj_update), "Le champ 'maj' est incorrect à l’update"); |
|
| 89 | + $this->assertNotEquals($maj1, $maj_update, "Le champ 'maj' n'a vraisemblablement pas été mis a jour lors de l'update"); |
|
| 90 | + |
|
| 91 | + // comparaison texte |
|
| 92 | + $texte_update = sql_getfetsel('un_texte', $table, $where1); |
|
| 93 | + $this->assertNotEmpty($texte_update, "Le champ 'un_texte' est vide à l’update"); |
|
| 94 | + $this->assertEquals($texte, $texte_update, "Le champ 'un_texte' n'est pas correctement rempli a l'update"); |
|
| 95 | + |
|
| 96 | + // idem avec updateq |
|
| 97 | + $texte = 'encore un nouveau texte'; |
|
| 98 | + sql_updateq($table, [ |
|
| 99 | + 'un_texte' => $texte, |
|
| 100 | + ], $where2); |
|
| 101 | + |
|
| 102 | + // comparaison timastamp |
|
| 103 | + $maj_updateq = sql_getfetsel('maj', $table, $where2); |
|
| 104 | + $this->assertNotEmpty($maj_updateq, "Le champ 'maj' est vide à l’updateq"); |
|
| 105 | + $this->assertNotFalse(strtotime($maj_updateq), "Le champ 'maj' est incorrect à l’updateq"); |
|
| 106 | + $this->assertNotEquals($maj1, $maj_updateq, "Le champ 'maj' n'a vraisemblablement pas été mis a jour lors de l'updateq"); |
|
| 107 | + |
|
| 108 | + // comparaison texte |
|
| 109 | + $texte_updateq = sql_getfetsel('un_texte', $table, $where2); |
|
| 110 | + $this->assertNotEmpty($texte_updateq, "Le champ 'un_texte' est vide à l’updateq"); |
|
| 111 | + $this->assertEquals($texte, $texte_updateq, "Le champ 'un_texte' n'est pas correctement rempli a l'updateq"); |
|
| 112 | + } |
|
| 113 | + |
|
| 114 | + /** |
|
| 115 | + * Selections diverses selon criteres |
|
| 116 | + */ |
|
| 117 | + #[Depends('testInsertData')] |
|
| 118 | + public function testSelections() { |
|
| 119 | + $data = $this->providerTablesData()['tintin'][2]; |
|
| 120 | + |
|
| 121 | + $res = sql_select('*', 'spip_test_tintin'); |
|
| 122 | + $this->assertNotFalse($res); |
|
| 123 | + $this->assertEquals(count($data), sql_count($res), 'sql_count() ne renvoie pas la valeur attendue'); |
|
| 124 | + |
|
| 125 | + // selection float |
|
| 126 | + $res = sql_select('*', 'spip_test_tintin', ['un_double>' . sql_quote(3)]); |
|
| 127 | + $n = count(array_filter($data, fn ($entry) => $entry['un_double'] > 3)); |
|
| 128 | + $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un float'); |
|
| 129 | + |
|
| 130 | + // selection REGEXP |
|
| 131 | + $res = sql_select('*', 'spip_test_tintin', ['un_varchar REGEXP ' . sql_quote('^De')]); |
|
| 132 | + $n = count(array_filter($data, fn ($entry) => str_starts_with($entry['un_varchar'], 'De'))); |
|
| 133 | + $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur une REGEXP'); |
|
| 134 | + |
|
| 135 | + // selection LIKE |
|
| 136 | + $res = sql_select('*', 'spip_test_tintin', ['un_varchar LIKE ' . sql_quote('De%')]); |
|
| 137 | + $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un LIKE'); |
|
| 138 | + |
|
| 139 | + // selection array(champs) |
|
| 140 | + $res = sql_fetsel(['id_tintin', 'un_varchar'], 'spip_test_tintin'); |
|
| 141 | + $this->assertArrayHasKey('id_tintin', $res); |
|
| 142 | + $this->assertArrayHasKey('un_varchar', $res); |
|
| 143 | + |
|
| 144 | + // selection array(champs=>alias) |
|
| 145 | + $res = sql_fetsel(['id_tintin AS id', 'un_varchar AS vchar'], 'spip_test_tintin'); |
|
| 146 | + $this->assertArrayHasKey('id', $res); |
|
| 147 | + $this->assertArrayHasKey('vchar', $res); |
|
| 148 | + } |
|
| 149 | + |
|
| 150 | + |
|
| 151 | + #[Depends('testInsertData')] |
|
| 152 | + public function testSelectionsMulti() { |
|
| 153 | + $data = $this->providerTablesData()['milou'][2]; |
|
| 154 | + |
|
| 155 | + // selection avec sql_multi |
|
| 156 | + $res = sql_select(['id_milou', sql_multi('grrrr', 'fr')], 'spip_test_milou', orderby: 'multi'); |
|
| 157 | + $this->assertNotFalse($res); |
|
| 158 | + $this->assertEquals(count($data), sql_count($res), 'sql_multi mal interprété'); |
|
| 159 | + $this->assertEquals(3, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté'); |
|
| 160 | + $this->assertEquals(2, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté'); |
|
| 161 | + $this->assertEquals(1, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté'); |
|
| 162 | + |
|
| 163 | + // le bon texte avec multi |
|
| 164 | + foreach ( |
|
| 165 | + [ |
|
| 166 | + 'fr' => 'Crac', |
|
| 167 | + 'en' => 'Krack', |
|
| 168 | + ] as $lg => $res |
|
| 169 | + ) { |
|
| 170 | + $multi = sql_getfetsel(sql_multi('grrrr', $lg), 'spip_test_milou', 'id_milou=' . sql_quote(2)); |
|
| 171 | + $this->assertEquals($res, $multi, 'sql_multi mal rendu'); |
|
| 172 | + } |
|
| 173 | + |
|
| 174 | + // le bon texte avec multi et accents |
|
| 175 | + foreach ( |
|
| 176 | + [ |
|
| 177 | + 'fr' => 'Aérien', |
|
| 178 | + 'en' => 'Aérieny', |
|
| 179 | + ] as $lg => $res |
|
| 180 | + ) { |
|
| 181 | + $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(2)); |
|
| 182 | + $this->assertEquals($res, $multi, 'sql_multi avec accents, mal rendu'); |
|
| 183 | + } |
|
| 184 | + |
|
| 185 | + // le bon texte avec multi et debut et fin de chaine |
|
| 186 | + foreach ( |
|
| 187 | + [ |
|
| 188 | + 'fr' => 'Un début de chaine : Vinasse, et [la fin]', |
|
| 189 | + 'en' => 'Un début de chaine : Vinassy, et [la fin]', |
|
| 190 | + 'de' => 'Un début de chaine : Vinasse, et [la fin]', |
|
| 191 | + ] as $lg => $res |
|
| 192 | + ) { |
|
| 193 | + $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(4)); |
|
| 194 | + $this->assertEquals($res, $multi, 'sql_multi avec crochets, mal rendu'); |
|
| 195 | + } |
|
| 196 | + } |
|
| 197 | + |
|
| 198 | + |
|
| 199 | + |
|
| 200 | + /** |
|
| 201 | + * Selections diverses entre plusieurs tables |
|
| 202 | + */ |
|
| 203 | + #[Depends('testInsertData')] |
|
| 204 | + public function testSelectionsEntreTable() { |
|
| 205 | + // selection 2 tables |
|
| 206 | + // ! nombre en dur ! |
|
| 207 | + $res = sql_select( |
|
| 208 | + ['spip_test_tintin.id_tintin', 'spip_test_milou.id_milou'], |
|
| 209 | + ['spip_test_tintin', 'spip_test_milou'], |
|
| 210 | + ['spip_test_milou.id_tintin=spip_test_tintin.id_tintin'] |
|
| 211 | + ); |
|
| 212 | + $this->assertEquals(3, sql_count($res), 'Echec sélection'); |
|
| 213 | + |
|
| 214 | + // selection 2 tables avec alias => |
|
| 215 | + // ! nombre en dur ! |
|
| 216 | + $res = sql_select( |
|
| 217 | + ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 218 | + [ |
|
| 219 | + 'a' => 'spip_test_tintin', |
|
| 220 | + 'b' => 'spip_test_milou', |
|
| 221 | + ], |
|
| 222 | + ['a.id_tintin=b.id_tintin'] |
|
| 223 | + ); |
|
| 224 | + $this->assertEquals(3, sql_count($res), 'Echec sélection avec alias de colonnes et tables'); |
|
| 225 | + |
|
| 226 | + // selection 2 tables avec alias AS |
|
| 227 | + // ! nombre en dur ! |
|
| 228 | + $res = sql_select( |
|
| 229 | + ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 230 | + ['spip_test_tintin AS a', 'spip_test_milou AS b'], |
|
| 231 | + ['a.id_tintin=b.id_tintin'] |
|
| 232 | + ); |
|
| 233 | + $this->assertEquals(3, sql_count($res)); |
|
| 234 | + |
|
| 235 | + // selection 2 tables avec INNER JOIN + ON |
|
| 236 | + // ! nombre en dur ! |
|
| 237 | + $res = sql_select( |
|
| 238 | + ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 239 | + ['spip_test_tintin AS a INNER JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)'] |
|
| 240 | + ); |
|
| 241 | + $this->assertEquals(3, sql_count($res), 'Echec sélection avec INNER JOIN + ON'); |
|
| 242 | + |
|
| 243 | + // selection 2 tables avec LEFT JOIN + ON |
|
| 244 | + // ! nombre en dur ! |
|
| 245 | + $res = sql_select( |
|
| 246 | + ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 247 | + ['spip_test_tintin AS a LEFT JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)'] |
|
| 248 | + ); |
|
| 249 | + $this->assertEquals(4, sql_count($res), 'Echec sélection avec LEFT JOIN + ON'); |
|
| 250 | + |
|
| 251 | + |
|
| 252 | + // selection 2 tables avec jointure INNER JOIN + USING |
|
| 253 | + // ! nombre en dur ! |
|
| 254 | + // SQLite 2 se plante : il ne connait pas USING (enleve de la requete, |
|
| 255 | + // et du coup ne fait pas correctement la jointure) |
|
| 256 | + $res = sql_select( |
|
| 257 | + ['a.id_tintin AS x', 'b.id_milou AS y'], |
|
| 258 | + ['spip_test_tintin AS a INNER JOIN spip_test_milou AS b USING (id_tintin)'] |
|
| 259 | + ); |
|
| 260 | + $this->assertEquals(3, sql_count($res), 'Echec sélection avec INNER JOIN + USING'); |
|
| 261 | + } |
|
| 262 | + |
|
| 263 | + |
|
| 264 | + /** |
|
| 265 | + * Selections mathematiques |
|
| 266 | + */ |
|
| 267 | + #[Depends('testInsertData')] |
|
| 268 | + function testMathFunctions() { |
|
| 269 | + foreach ( |
|
| 270 | + [ |
|
| 271 | + 'COUNT' => 3, |
|
| 272 | + 'SUM' => 9000, |
|
| 273 | + 'AVG' => 3000, |
|
| 274 | + ] as $func => $expected |
|
| 275 | + ) { |
|
| 276 | + $nb = sql_getfetsel("{$func}(un_int) AS nb", ['spip_test_tintin']); |
|
| 277 | + $this->assertEquals($expected, $nb, "Selection {$func} en echec"); |
|
| 278 | + } |
|
| 279 | + |
|
| 280 | + foreach ( |
|
| 281 | + [ |
|
| 282 | + 'EXP(0)' => exp(0), |
|
| 283 | + 'ROUND(3.56)' => round(3.56), |
|
| 284 | + 'ROUND(3.5684,2)' => round(3.5684, 2), |
|
| 285 | + 'SQRT(9)' => 3, |
|
| 286 | + //'1/2'=>(0), // Le standard SQL : entier divise par entier = division entiere (pas trouve la reference) |
|
| 287 | + '1.0/2' => (1 / 2), // Le standart SQL : reel divise par entier = reel |
|
| 288 | + //'4/3'=>1, |
|
| 289 | + 'ROUND(4.0/3,2)' => round(4 / 3, 2), |
|
| 290 | + '1.5/2' => (1.5 / 2), |
|
| 291 | + '2.0/2' => (2.0 / 2), |
|
| 292 | + '2/2' => (2 / 2), |
|
| 293 | + 'md5(8)' => md5('8'), |
|
| 294 | + 'md5(' . sql_quote('a') . ')' => md5('a'), |
|
| 295 | + ] as $func => $expected |
|
| 296 | + ) { |
|
| 297 | + $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]); |
|
| 298 | + $this->assertEquals($expected, $nb, "Selection {$func} en echec"); |
|
| 299 | + } |
|
| 300 | + } |
|
| 301 | + |
|
| 302 | + /** |
|
| 303 | + * Selections mathematiques |
|
| 304 | + */ |
|
| 305 | + #[Depends('testInsertData')] |
|
| 306 | + |
|
| 307 | + function testStringFunctions() { |
|
| 308 | + foreach ( |
|
| 309 | + [ |
|
| 310 | + 'CONCAT(' . sql_quote('cou') . ',' . sql_quote('cou') . ')' => 'coucou', |
|
| 311 | + 'CONCAT(' . sql_quote('cou,') . ',' . sql_quote('cou') . ')' => 'cou,cou', |
|
| 312 | + ] as $func => $expected |
|
| 313 | + ) { |
|
| 314 | + $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]); |
|
| 315 | + $this->assertEquals($expected, $nb, "Selection {$func} en echec"); |
|
| 316 | + } |
|
| 317 | + } |
|
| 318 | + |
|
| 319 | + /** |
|
| 320 | + * retours des fonctions d'erreurs lors d'une requete |
|
| 321 | + */ |
|
| 322 | + #[Depends('testCreateTables')] |
|
| 323 | + |
|
| 324 | + function testErrorFunctions() { |
|
| 325 | + // requete sans erreur |
|
| 326 | + sql_select('*', 'spip_test_tintin'); |
|
| 327 | + $this->assertEquals('', sql_error(), 'sql_error() non vide lors d’une requete sans erreur'); |
|
| 328 | + $this->assertEquals(0, sql_errno(), 'sql_errno() ne retourne pas 0 lors d’une requete sans erreur'); |
|
| 329 | + |
|
| 330 | + // requete en erreur |
|
| 331 | + sql_select('*', 'spip_test_toto'); |
|
| 332 | + $this->assertNotEquals('', sql_error(), 'sql_error() vide lors d’une requete en erreur'); |
|
| 333 | + $this->assertNotEquals(0, sql_errno(), 'sql_errno() retourne 0 lors d’une requete en erreur'); |
|
| 334 | + } |
|
| 335 | + |
|
| 336 | + /** |
|
| 337 | + * Update de data |
|
| 338 | + */ |
|
| 339 | + #[Depends('testInsertData')] |
|
| 340 | + public function testUpdateData() { |
|
| 341 | + // ajouter un champ |
|
| 342 | + $nb = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1)); |
|
| 343 | + sql_update('spip_test_tintin', [ |
|
| 344 | + 'un_bigint' => 'un_bigint+2', |
|
| 345 | + ]); |
|
| 346 | + $nb2 = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1)); |
|
| 347 | + $this->assertEquals($nb + 2, $nb2, 'sql_update n’a pas fait l’adition !'); |
|
| 348 | + } |
|
| 349 | + |
|
| 350 | + /** |
|
| 351 | + * Delete de data |
|
| 352 | + */ |
|
| 353 | + #[Depends('testInsertData')] |
|
| 354 | + |
|
| 355 | + public function test_delete_data() { |
|
| 356 | + $nb = sql_countsel('spip_test_tintin'); |
|
| 357 | + // supprimer une ligne |
|
| 358 | + sql_delete('spip_test_tintin', 'id_tintin=' . sql_quote(1)); |
|
| 359 | + $this->assertEquals($nb - 1, sql_countsel('spip_test_tintin'), "sql_delete n’a pas supprimé la ligne"); |
|
| 360 | + |
|
| 361 | + // supprimer tout |
|
| 362 | + sql_delete('spip_test_tintin'); |
|
| 363 | + $this->assertEquals(0, sql_countsel('spip_test_tintin'), "sql_delete n’a pas vidé la table"); |
|
| 364 | + } |
|
| 365 | + |
|
| 366 | + /** |
|
| 367 | + * Alter colonne |
|
| 368 | + */ |
|
| 369 | + #[Depends('testCreateTables')] |
|
| 370 | + function testAlterColumns() { |
|
| 371 | + $table = 'spip_test_tintin'; |
|
| 372 | + |
|
| 373 | + // supprimer une colonne |
|
| 374 | + sql_alter("TABLE {$table} DROP COLUMN un_bigint"); |
|
| 375 | + $desc = sql_showtable($table); |
|
| 376 | + $this->assertIsArray($desc, 'sql_alter rate DROP COLUMN (plus de table ou sql_showtable en erreur?)'); |
|
| 377 | + $this->assertArrayNotHasKey('un_bigint', $desc['field']); |
|
| 378 | + $this->assertArrayHasKey('un_smallint', $desc['field']); |
|
| 379 | + |
|
| 380 | + // supprimer une colonne (sans COLUMN) |
|
| 381 | + sql_alter("TABLE {$table} DROP un_smallint"); |
|
| 382 | + $desc = sql_showtable($table); |
|
| 383 | + $this->assertIsArray($desc, 'sql_alter rate DROP sans COLUMN (plus de table ou sql_showtable en erreur?)'); |
|
| 384 | + $this->assertArrayNotHasKey('un_smallint', $desc['field']); |
|
| 385 | + |
|
| 386 | + // renommer une colonne |
|
| 387 | + sql_alter("TABLE {$table} CHANGE un_varchar deux_varchars VARCHAR(30) NOT NULL DEFAULT ''"); |
|
| 388 | + $desc = sql_showtable($table); |
|
| 389 | + $this->assertIsArray($desc, 'sql_alter rate CHANGE (plus de table ou sql_showtable en erreur?)'); |
|
| 390 | + $this->assertArrayHasKey('deux_varchars', $desc['field']); |
|
| 391 | + $this->assertArrayNotHasKey('un_varchar', $desc['field']); |
|
| 392 | + |
|
| 393 | + // changer le type d'une colonne |
|
| 394 | + $table = 'spip_test_milou'; |
|
| 395 | + sql_alter("TABLE {$table} MODIFY schtroumf TEXT NOT NULL DEFAULT ''"); |
|
| 396 | + $desc = sql_showtable($table); |
|
| 397 | + $this->assertIsArray($desc, 'sql_alter rate MODIFY (plus de table ou sql_showtable en erreur?)'); |
|
| 398 | + $this->assertArrayHasKey('schtroumf', $desc['field'], 'sql_alter rate MODIFY varchar en text'); |
|
| 399 | + $this->assertStringContainsStringIgnoringCase('TEXT', $desc['field']['schtroumf'], 'sql_alter rate MODIFY varchar en text'); |
|
| 400 | + |
|
| 401 | + // ajouter des colonnes |
|
| 402 | + sql_alter("TABLE {$table} ADD COLUMN houba BIGINT(21) NOT NULL DEFAULT '0'"); |
|
| 403 | + $desc = sql_showtable($table); |
|
| 404 | + $this->assertIsArray($desc, 'sql_alter rate ADD COLUMN (plus de table ou sql_showtable en erreur?)'); |
|
| 405 | + $this->assertArrayHasKey('houba', $desc['field'], 'sql_alter rate ADD COLUMN'); |
|
| 406 | + $this->assertStringContainsStringIgnoringCase('INT', $desc['field']['houba'], 'sql_alter rate ADD COLUMN'); |
|
| 407 | + |
|
| 408 | + // ajouter des colonnes avec "AFTER" |
|
| 409 | + sql_alter("TABLE {$table} ADD COLUMN hop BIGINT(21) NOT NULL DEFAULT '0' AFTER id_tintin"); |
|
| 410 | + $desc = sql_showtable($table); |
|
| 411 | + $this->assertIsArray($desc, 'sql_alter rate ADD COLUMN avec AFTER (plus de table ou sql_showtable en erreur?)'); |
|
| 412 | + $this->assertArrayHasKey('hop', $desc['field'], 'sql_alter rate ADD COLUMN avec AFTER'); |
|
| 413 | + $this->assertStringContainsStringIgnoringCase('INT', $desc['field']['hop'], 'sql_alter rate ADD COLUMN avec AFTER'); |
|
| 414 | + } |
|
| 415 | + |
|
| 416 | + |
|
| 417 | + /** |
|
| 418 | + * Renomme table |
|
| 419 | + */ |
|
| 420 | + #[Depends('testCreateTables')] |
|
| 421 | + |
|
| 422 | + public function testAlterRenameTable() { |
|
| 423 | + |
|
| 424 | + $table_before = 'spip_test_tintin'; |
|
| 425 | + $table_after = 'spip_test_castafiore'; |
|
| 426 | + sql_drop_table($table_after, true); |
|
| 427 | + $this->assertEmpty(sql_showtable($table_after)); |
|
| 428 | + $this->assertIsArray(sql_showtable($table_before)); |
|
| 429 | + |
|
| 430 | + // renommer une table |
|
| 431 | + sql_alter("TABLE {$table_before} RENAME {$table_after}"); |
|
| 432 | + $this->assertEmpty(sql_showtable($table_before)); |
|
| 433 | + $this->assertIsArray(sql_showtable($table_after)); |
|
| 434 | + |
|
| 435 | + sql_alter("TABLE {$table_after} RENAME {$table_before}"); |
|
| 436 | + $this->assertEmpty(sql_showtable($table_after)); |
|
| 437 | + $this->assertIsArray(sql_showtable($table_before)); |
|
| 438 | + } |
|
| 439 | + |
|
| 440 | + |
|
| 441 | + /** |
|
| 442 | + * pointer l'index |
|
| 443 | + */ |
|
| 444 | + #[Depends('testCreateTables')] |
|
| 445 | + |
|
| 446 | + public function testAlterIndex() { |
|
| 447 | + $table = 'spip_test_milou'; |
|
| 448 | + |
|
| 449 | + // supprimer un index |
|
| 450 | + sql_alter("TABLE {$table} DROP INDEX sons"); |
|
| 451 | + $desc = sql_showtable($table); |
|
| 452 | + $this->assertIsArray($desc, 'sql_alter rate DROP INDEX sons (plus de table ou sql_showtable en erreur?)'); |
|
| 453 | + $this->assertArrayNotHasKey('KEY sons', $desc['key'], 'sql_alter rate DROP INDEX sons'); |
|
| 454 | + |
|
| 455 | + // ajouter un index simple |
|
| 456 | + sql_alter("TABLE {$table} ADD INDEX (wouaf)"); |
|
| 457 | + $desc = sql_showtable($table); |
|
| 458 | + $this->assertIsArray($desc, 'sql_alter rate ADD INDEX (wouaf) (plus de table ou sql_showtable en erreur?)'); |
|
| 459 | + $this->assertArrayHasKey('KEY wouaf', $desc['key'], 'sql_alter rate ADD INDEX (wouaf)'); |
|
| 460 | + |
|
| 461 | + // ajouter un index nomme |
|
| 462 | + sql_alter("TABLE {$table} ADD INDEX pluie (grrrr)"); |
|
| 463 | + $desc = sql_showtable($table); |
|
| 464 | + $this->assertIsArray($desc, 'sql_alter rate ADD INDEX pluie (grrrr) (plus de table ou sql_showtable en erreur?)'); |
|
| 465 | + $this->assertArrayHasKey('KEY pluie', $desc['key'], 'sql_alter rate ADD INDEX pluie (grrrr)'); |
|
| 466 | + |
|
| 467 | + // supprimer un index |
|
| 468 | + sql_alter("TABLE {$table} DROP INDEX pluie"); |
|
| 469 | + $desc = sql_showtable($table); |
|
| 470 | + $this->assertIsArray($desc, 'sql_alter rate DROP INDEX pluie (plus de table ou sql_showtable en erreur?)'); |
|
| 471 | + $this->assertArrayNotHasKey('KEY pluie', $desc['key'], 'sql_alter rate DROP INDEX pluie'); |
|
| 472 | + |
|
| 473 | + // ajouter un index nomme double |
|
| 474 | + sql_alter("TABLE {$table} ADD INDEX dring (grrrr, wouaf)"); |
|
| 475 | + $desc = sql_showtable($table); |
|
| 476 | + $this->assertIsArray($desc, 'sql_alter rate ADD INDEX dring (grrrr, wouaf) (plus de table ou sql_showtable en erreur?)'); |
|
| 477 | + $this->assertArrayHasKey('KEY dring', $desc['key'], 'sql_alter rate ADD INDEX dring (grrrr, wouaf)'); |
|
| 478 | + } |
|
| 479 | + |
|
| 480 | + |
|
| 481 | + /** |
|
| 482 | + * dezinguer la primary |
|
| 483 | + */ |
|
| 484 | + #[Depends('testCreateTables')] |
|
| 485 | + |
|
| 486 | + public function testAlterPrimary() { |
|
| 487 | + $table = 'spip_test_kirikou'; |
|
| 488 | + sql_drop_table($table, true); |
|
| 489 | + |
|
| 490 | + // creer une table pour jouer |
|
| 491 | + sql_create( |
|
| 492 | + $table, |
|
| 493 | + [ |
|
| 494 | + 'un' => 'INTEGER NOT NULL', |
|
| 495 | + 'deux' => 'INTEGER NOT NULL', |
|
| 496 | + 'trois' => 'INTEGER NOT NULL', |
|
| 497 | + ], |
|
| 498 | + [ |
|
| 499 | + 'PRIMARY KEY' => 'un', |
|
| 500 | + ] |
|
| 501 | + ); |
|
| 502 | + |
|
| 503 | + // supprimer une primary |
|
| 504 | + $desc = sql_showtable($table); |
|
| 505 | + sql_alter("TABLE {$table} DROP PRIMARY KEY"); |
|
| 506 | + $desc = sql_showtable($table); |
|
| 507 | + $this->assertIsArray($desc, 'sql_alter rate DROP PRIMARY KEY (plus de table ou sql_showtable en erreur?)'); |
|
| 508 | + $this->assertArrayNotHasKey('PRIMARY KEY', $desc['key'], 'sql_alter rate DROP PRIMARY KEY'); |
|
| 509 | + |
|
| 510 | + // ajouter une primary |
|
| 511 | + $desc = sql_showtable($table); |
|
| 512 | + sql_alter("TABLE {$table} ADD PRIMARY KEY (deux, trois)"); |
|
| 513 | + $desc = sql_showtable($table); |
|
| 514 | + $this->assertIsArray($desc, 'sql_alter rate ADD PRIMARY KEY (plus de table ou sql_showtable en erreur?)'); |
|
| 515 | + $this->assertArrayHasKey('PRIMARY KEY', $desc['key'], 'sql_alter rate ADD PRIMARY KEY'); |
|
| 516 | + |
|
| 517 | + sql_drop_table($table, true); |
|
| 518 | + } |
|
| 519 | + |
|
| 520 | + /** |
|
| 521 | + * Alter colonne |
|
| 522 | + */ |
|
| 523 | + #[Depends('testAlterColumns')] |
|
| 524 | + #[Depends('testAlterIndex')] |
|
| 525 | + |
|
| 526 | + function testAlterMultiple() { |
|
| 527 | + $table = 'spip_test_milou'; |
|
| 528 | + |
|
| 529 | + // supprimer des colonnes |
|
| 530 | + sql_alter("TABLE {$table} DROP INDEX dring, DROP COLUMN wouaf, DROP COLUMN grrrr"); |
|
| 531 | + $desc = sql_showtable($table); |
|
| 532 | + $this->assertIsArray($desc, 'sql_alter rate DROP multiples (plus de table ou sql_showtable en erreur?)'); |
|
| 533 | + $this->assertArrayNotHasKey('waouf', $desc['field'], 'sql_alter rate DROP multiples'); |
|
| 534 | + $this->assertArrayNotHasKey('grrrr', $desc['field'], 'sql_alter rate DROP multiples'); |
|
| 535 | + $this->assertArrayNotHasKey('KEY dring', $desc['key'], 'sql_alter rate DROP multiples'); |
|
| 536 | + |
|
| 537 | + // ajouter des colonnes |
|
| 538 | + sql_alter("TABLE {$table} ADD COLUMN a INT, ADD COLUMN b INT, ADD COLUMN c INT, ADD INDEX abc (a,b,c)"); |
|
| 539 | + $desc = sql_showtable($table); |
|
| 540 | + $this->assertIsArray($desc, 'sql_alter rate ADD multiples (plus de table ou sql_showtable en erreur?)'); |
|
| 541 | + $this->assertArrayHasKey('a', $desc['field'], 'sql_alter rate ADD multiples'); |
|
| 542 | + $this->assertArrayHasKey('b', $desc['field'], 'sql_alter rate ADD multiples'); |
|
| 543 | + $this->assertArrayHasKey('c', $desc['field'], 'sql_alter rate ADD multiples'); |
|
| 544 | + $this->assertArrayHasKey('KEY abc', $desc['key'], 'sql_alter rate ADD multiples'); |
|
| 545 | + } |
|
| 546 | + |
|
| 547 | + #[Depends('testCreateTables')] |
|
| 548 | + #[DataProvider('providerTablesData')] |
|
| 549 | + public function testDropTables($table, $desc, $data): void |
|
| 550 | + { |
|
| 551 | + $this->assertTrue(sql_drop_table($table, false)); |
|
| 552 | + } |
|
| 553 | + |
|
| 554 | + /** |
|
| 555 | + * Description des tables & données de tests |
|
| 556 | + */ |
|
| 557 | + public static function providerTablesData(): array |
|
| 558 | + { |
|
| 559 | + return [ |
|
| 560 | + 'tintin' => [ |
|
| 561 | + 'spip_test_tintin', |
|
| 562 | + [ |
|
| 563 | + 'field' => [ |
|
| 564 | + "id_tintin" => "INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY", |
|
| 565 | + "un_bigint" => "BIGINT(21) NOT NULL DEFAULT '0'", |
|
| 566 | + "un_int" => "BIGINT(21) NOT NULL DEFAULT '0'", |
|
| 567 | + "un_smallint" => "SMALLINT(3) NOT NULL DEFAULT '0'", |
|
| 568 | + "un_double" => "DOUBLE NOT NULL DEFAULT '0'", |
|
| 569 | + "un_tinyint" => "TINYINT(2) NOT NULL DEFAULT '0'", |
|
| 570 | + "un_varchar" => "VARCHAR(30) NOT NULL DEFAULT ''", |
|
| 571 | + "un_texte" => "TEXT NOT NULL DEFAULT ''", |
|
| 572 | + "maj" => "TIMESTAMP" |
|
| 573 | + ], |
|
| 574 | + 'key' => [ |
|
| 575 | + |
|
| 576 | + ], |
|
| 577 | + 'nb_key_attendues' => 1 // attention : la primary key DOIT etre dans les cle aussi |
|
| 578 | + ], |
|
| 579 | + [ |
|
| 580 | + [ |
|
| 581 | + "id_tintin" => 1, |
|
| 582 | + "un_bigint" => 30000, |
|
| 583 | + "un_int" => 2000, |
|
| 584 | + "un_smallint" => 40, |
|
| 585 | + "un_double" => 2.58, |
|
| 586 | + "un_tinyint" => 8, |
|
| 587 | + "un_varchar" => "Premier varchar", |
|
| 588 | + "un_texte" => "Premier texte", |
|
| 589 | + //"maj" => "" // doit se remplir automatiquement |
|
| 590 | + ], |
|
| 591 | + [ |
|
| 592 | + "id_tintin" => 2, |
|
| 593 | + "un_bigint" => 40000, |
|
| 594 | + "un_int" => 3000, |
|
| 595 | + "un_smallint" => 50, |
|
| 596 | + "un_double" => 3.58, |
|
| 597 | + "un_tinyint" => 9, |
|
| 598 | + "un_varchar" => "Deuxieme varchar", |
|
| 599 | + "un_texte" => "Second texte", |
|
| 600 | + //"maj" => "" // doit se remplir automatiquement |
|
| 601 | + ], |
|
| 602 | + [ |
|
| 603 | + "id_tintin" => 3, |
|
| 604 | + "un_bigint" => 60000, |
|
| 605 | + "un_int" => 4000, |
|
| 606 | + "un_smallint" => 70, |
|
| 607 | + "un_double" => 8.58, |
|
| 608 | + "un_tinyint" => 3, |
|
| 609 | + "un_varchar" => "Troisieme varchar", |
|
| 610 | + "un_texte" => "Troisieme texte", |
|
| 611 | + //"maj" => "" // doit se remplir automatiquement |
|
| 612 | + ], |
|
| 613 | + ], |
|
| 614 | + |
|
| 615 | + ], |
|
| 616 | + 'milou' => [ |
|
| 617 | + 'spip_test_milou', |
|
| 618 | + [ |
|
| 619 | + 'field' => [ |
|
| 620 | + "id_milou" => "INTEGER NOT NULL AUTO_INCREMENT", |
|
| 621 | + "id_tintin" => "INTEGER NOT NULL", |
|
| 622 | + "un_enum" => "ENUM('blanc','noir') NOT NULL DEFAULT 'blanc'", |
|
| 623 | + "wouaf" => "VARCHAR(80) NOT NULL DEFAULT ''", |
|
| 624 | + "grrrr" => "VARCHAR(80) NOT NULL DEFAULT ''", |
|
| 625 | + "schtroumf" => "VARCHAR(80) NOT NULL DEFAULT ''", |
|
| 626 | + "maj" => "TIMESTAMP" |
|
| 627 | + ], |
|
| 628 | + 'key' => [ |
|
| 629 | + "PRIMARY KEY" => "id_milou", |
|
| 630 | + "KEY id_tintin" => "id_tintin", |
|
| 631 | + "KEY sons" => "wouaf, grrrr", |
|
| 632 | + ], |
|
| 633 | + 'nb_key_attendues' => 3 // attention : la primary key DOIT etre dans les cle aussi |
|
| 634 | + ], |
|
| 635 | + [ |
|
| 636 | + [ |
|
| 637 | + "id_milou" => 1, |
|
| 638 | + "id_tintin" => 1, |
|
| 639 | + "un_enum" => "blanc", |
|
| 640 | + "wouaf" => "Warf !!", |
|
| 641 | + "grrrr" => "Grogne !", |
|
| 642 | + // "maj" => "" // doit se remplir automatiquement |
|
| 643 | + ], |
|
| 644 | + [ |
|
| 645 | + "id_milou" => 2, |
|
| 646 | + "id_tintin" => 1, |
|
| 647 | + "un_enum" => "noir", |
|
| 648 | + "wouaf" => "Wouf", |
|
| 649 | + "grrrr" => "<multi>[fr]Crac[en]Krack</multi>", |
|
| 650 | + // "maj" => "" // doit se remplir automatiquement |
|
| 651 | + ], |
|
| 652 | + [ |
|
| 653 | + "id_milou" => 3, |
|
| 654 | + "id_tintin" => 2, |
|
| 655 | + "un_enum" => "blanc", |
|
| 656 | + "wouaf" => "Wif", |
|
| 657 | + "grrrr" => "Ahrg", |
|
| 658 | + // "maj" => "" // doit se remplir automatiquement |
|
| 659 | + ], |
|
| 660 | + ], |
|
| 661 | + |
|
| 662 | + ], |
|
| 663 | + 'haddock' => [ |
|
| 664 | + 'spip_test_haddock', |
|
| 665 | + [ |
|
| 666 | + 'field' => [ |
|
| 667 | + "id_haddock" => "INTEGER NOT NULL AUTO_INCREMENT", |
|
| 668 | + "alcool" => "VARCHAR(80) NOT NULL DEFAULT ''", |
|
| 669 | + |
|
| 670 | + ], |
|
| 671 | + 'key' => [ |
|
| 672 | + "PRIMARY KEY" => "id_haddock", |
|
| 673 | + ], |
|
| 674 | + 'nb_key_attendues' => 1 // attention : la primary key DOIT etre dans les cle aussi |
|
| 675 | + ], |
|
| 676 | + [ |
|
| 677 | + [ |
|
| 678 | + "id_haddock" => 1, |
|
| 679 | + "alcool" => "<multi>[fr]Agile[en]Agily</multi>", |
|
| 680 | + ], |
|
| 681 | + [ |
|
| 682 | + "id_haddock" => 2, |
|
| 683 | + "alcool" => "<multi>[fr]Aérien[en]Aérieny</multi>", |
|
| 684 | + ], |
|
| 685 | + [ |
|
| 686 | + "id_haddock" => 3, |
|
| 687 | + "alcool" => "<multi>[fr]Vinasse[en]Vinassy</multi>", |
|
| 688 | + ], |
|
| 689 | + [ |
|
| 690 | + "id_haddock" => 4, |
|
| 691 | + "alcool" => "Un début de chaine : <multi>[fr]Vinasse[en]Vinassy</multi>, et [la fin]", |
|
| 692 | + ], |
|
| 693 | + ], |
|
| 694 | + |
|
| 695 | + ], |
|
| 696 | + ]; |
|
| 697 | + } |
|
| 698 | 698 | } |
@@ -13,92 +13,92 @@ |
||
| 13 | 13 | |
| 14 | 14 | class TableObjetTest extends TestCase |
| 15 | 15 | { |
| 16 | - public static function setUpBeforeClass(): void { |
|
| 17 | - find_in_path('base/connect_sql.php', '', true); |
|
| 18 | - } |
|
| 16 | + public static function setUpBeforeClass(): void { |
|
| 17 | + find_in_path('base/connect_sql.php', '', true); |
|
| 18 | + } |
|
| 19 | 19 | |
| 20 | - #[DataProvider('providerConnectSqlTableObjet')] |
|
| 21 | - public function testConnectSqlTableObjet($expected, ...$args): void { |
|
| 22 | - $actual = table_objet(...$args); |
|
| 23 | - $this->assertSame($expected, $actual); |
|
| 24 | - } |
|
| 20 | + #[DataProvider('providerConnectSqlTableObjet')] |
|
| 21 | + public function testConnectSqlTableObjet($expected, ...$args): void { |
|
| 22 | + $actual = table_objet(...$args); |
|
| 23 | + $this->assertSame($expected, $actual); |
|
| 24 | + } |
|
| 25 | 25 | |
| 26 | - public static function providerConnectSqlTableObjet(): array { |
|
| 27 | - return [[ |
|
| 28 | - 0 => 'articles', |
|
| 29 | - 1 => 'articles', |
|
| 30 | - ], [ |
|
| 31 | - 0 => 'articles', |
|
| 32 | - 1 => 'article', |
|
| 33 | - ], [ |
|
| 34 | - 0 => 'articles', |
|
| 35 | - 1 => 'spip_articles', |
|
| 36 | - ], [ |
|
| 37 | - 0 => 'articles', |
|
| 38 | - 1 => 'id_article', |
|
| 39 | - ], [ |
|
| 40 | - 0 => 'rubriques', |
|
| 41 | - 1 => 'rubrique', |
|
| 42 | - ], [ |
|
| 43 | - 0 => 'rubriques', |
|
| 44 | - 1 => 'spip_rubriques', |
|
| 45 | - ], [ |
|
| 46 | - 0 => 'rubriques', |
|
| 47 | - 1 => 'id_rubrique', |
|
| 48 | - ], [ |
|
| 49 | - 0 => 'mots', |
|
| 50 | - 1 => 'mot', |
|
| 51 | - ], [ |
|
| 52 | - 0 => 'mots', |
|
| 53 | - 1 => 'spip_mots', |
|
| 54 | - ], [ |
|
| 55 | - 0 => 'mots', |
|
| 56 | - 1 => 'id_mot', |
|
| 57 | - ], [ |
|
| 58 | - 0 => 'groupes_mots', |
|
| 59 | - 1 => 'groupe_mots', |
|
| 60 | - ], [ |
|
| 61 | - 0 => 'groupes_mots', |
|
| 62 | - 1 => 'spip_groupes_mots', |
|
| 63 | - ], [ |
|
| 64 | - 0 => 'groupes_mots', |
|
| 65 | - 1 => 'id_groupe', |
|
| 66 | - ], [ |
|
| 67 | - 0 => 'groupes_mots', |
|
| 68 | - 1 => 'groupes_mot', |
|
| 69 | - ], [ |
|
| 70 | - 0 => 'syndic', |
|
| 71 | - 1 => 'syndic', |
|
| 72 | - ], [ |
|
| 73 | - 0 => 'syndic', |
|
| 74 | - 1 => 'site', |
|
| 75 | - ], [ |
|
| 76 | - 0 => 'syndic', |
|
| 77 | - 1 => 'spip_syndic', |
|
| 78 | - ], [ |
|
| 79 | - 0 => 'syndic', |
|
| 80 | - 1 => 'id_syndic', |
|
| 81 | - ], [ |
|
| 82 | - 0 => 'syndic_articles', |
|
| 83 | - 1 => 'syndic_article', |
|
| 84 | - ], [ |
|
| 85 | - 0 => 'syndic_articles', |
|
| 86 | - 1 => 'spip_syndic_articles', |
|
| 87 | - ], [ |
|
| 88 | - 0 => 'syndic_articles', |
|
| 89 | - 1 => 'id_syndic_article', |
|
| 90 | - ], [ |
|
| 91 | - 0 => 'syndic_articles', |
|
| 92 | - 1 => 'syndic_article', |
|
| 93 | - ], ['articles', 'article'], ['auteurs', 'auteur'], ['documents', 'document'], ['documents', 'doc'], [ |
|
| 94 | - 'documents', |
|
| 95 | - 'img', |
|
| 96 | - ], ['documents', 'img'], ['forums', 'forum'], [ |
|
| 97 | - 'groupes_mots', |
|
| 98 | - 'groupe_mots', |
|
| 99 | - ], ['groupes_mots', 'groupe_mot'], ['groupes_mots', 'groupe'], ['mots', 'mot'], ['rubriques', 'rubrique'], [ |
|
| 100 | - 'syndic', |
|
| 101 | - 'syndic', |
|
| 102 | - ], ['syndic', 'site'], ['syndic_articles', 'syndic_article'], ['types_documents', 'type_document']]; |
|
| 103 | - } |
|
| 26 | + public static function providerConnectSqlTableObjet(): array { |
|
| 27 | + return [[ |
|
| 28 | + 0 => 'articles', |
|
| 29 | + 1 => 'articles', |
|
| 30 | + ], [ |
|
| 31 | + 0 => 'articles', |
|
| 32 | + 1 => 'article', |
|
| 33 | + ], [ |
|
| 34 | + 0 => 'articles', |
|
| 35 | + 1 => 'spip_articles', |
|
| 36 | + ], [ |
|
| 37 | + 0 => 'articles', |
|
| 38 | + 1 => 'id_article', |
|
| 39 | + ], [ |
|
| 40 | + 0 => 'rubriques', |
|
| 41 | + 1 => 'rubrique', |
|
| 42 | + ], [ |
|
| 43 | + 0 => 'rubriques', |
|
| 44 | + 1 => 'spip_rubriques', |
|
| 45 | + ], [ |
|
| 46 | + 0 => 'rubriques', |
|
| 47 | + 1 => 'id_rubrique', |
|
| 48 | + ], [ |
|
| 49 | + 0 => 'mots', |
|
| 50 | + 1 => 'mot', |
|
| 51 | + ], [ |
|
| 52 | + 0 => 'mots', |
|
| 53 | + 1 => 'spip_mots', |
|
| 54 | + ], [ |
|
| 55 | + 0 => 'mots', |
|
| 56 | + 1 => 'id_mot', |
|
| 57 | + ], [ |
|
| 58 | + 0 => 'groupes_mots', |
|
| 59 | + 1 => 'groupe_mots', |
|
| 60 | + ], [ |
|
| 61 | + 0 => 'groupes_mots', |
|
| 62 | + 1 => 'spip_groupes_mots', |
|
| 63 | + ], [ |
|
| 64 | + 0 => 'groupes_mots', |
|
| 65 | + 1 => 'id_groupe', |
|
| 66 | + ], [ |
|
| 67 | + 0 => 'groupes_mots', |
|
| 68 | + 1 => 'groupes_mot', |
|
| 69 | + ], [ |
|
| 70 | + 0 => 'syndic', |
|
| 71 | + 1 => 'syndic', |
|
| 72 | + ], [ |
|
| 73 | + 0 => 'syndic', |
|
| 74 | + 1 => 'site', |
|
| 75 | + ], [ |
|
| 76 | + 0 => 'syndic', |
|
| 77 | + 1 => 'spip_syndic', |
|
| 78 | + ], [ |
|
| 79 | + 0 => 'syndic', |
|
| 80 | + 1 => 'id_syndic', |
|
| 81 | + ], [ |
|
| 82 | + 0 => 'syndic_articles', |
|
| 83 | + 1 => 'syndic_article', |
|
| 84 | + ], [ |
|
| 85 | + 0 => 'syndic_articles', |
|
| 86 | + 1 => 'spip_syndic_articles', |
|
| 87 | + ], [ |
|
| 88 | + 0 => 'syndic_articles', |
|
| 89 | + 1 => 'id_syndic_article', |
|
| 90 | + ], [ |
|
| 91 | + 0 => 'syndic_articles', |
|
| 92 | + 1 => 'syndic_article', |
|
| 93 | + ], ['articles', 'article'], ['auteurs', 'auteur'], ['documents', 'document'], ['documents', 'doc'], [ |
|
| 94 | + 'documents', |
|
| 95 | + 'img', |
|
| 96 | + ], ['documents', 'img'], ['forums', 'forum'], [ |
|
| 97 | + 'groupes_mots', |
|
| 98 | + 'groupe_mots', |
|
| 99 | + ], ['groupes_mots', 'groupe_mot'], ['groupes_mots', 'groupe'], ['mots', 'mot'], ['rubriques', 'rubrique'], [ |
|
| 100 | + 'syndic', |
|
| 101 | + 'syndic', |
|
| 102 | + ], ['syndic', 'site'], ['syndic_articles', 'syndic_article'], ['types_documents', 'type_document']]; |
|
| 103 | + } |
|
| 104 | 104 | } |
@@ -13,95 +13,95 @@ |
||
| 13 | 13 | |
| 14 | 14 | class TableObjetSqlTest extends TestCase |
| 15 | 15 | { |
| 16 | - public static function setUpBeforeClass(): void { |
|
| 17 | - find_in_path('base/connect_sql.php', '', true); |
|
| 18 | - } |
|
| 16 | + public static function setUpBeforeClass(): void { |
|
| 17 | + find_in_path('base/connect_sql.php', '', true); |
|
| 18 | + } |
|
| 19 | 19 | |
| 20 | - #[DataProvider('providerConnectSqlTableObjetSql')] |
|
| 21 | - public function testConnectSqlTableObjetSql($expected, ...$args): void { |
|
| 22 | - $actual = table_objet_sql(...$args); |
|
| 23 | - $this->assertSame($expected, $actual); |
|
| 24 | - } |
|
| 20 | + #[DataProvider('providerConnectSqlTableObjetSql')] |
|
| 21 | + public function testConnectSqlTableObjetSql($expected, ...$args): void { |
|
| 22 | + $actual = table_objet_sql(...$args); |
|
| 23 | + $this->assertSame($expected, $actual); |
|
| 24 | + } |
|
| 25 | 25 | |
| 26 | - public static function providerConnectSqlTableObjetSql(): array { |
|
| 27 | - return [[ |
|
| 28 | - 0 => 'spip_articles', |
|
| 29 | - 1 => 'articles', |
|
| 30 | - ], [ |
|
| 31 | - 0 => 'spip_articles', |
|
| 32 | - 1 => 'article', |
|
| 33 | - ], [ |
|
| 34 | - 0 => 'spip_articles', |
|
| 35 | - 1 => 'spip_articles', |
|
| 36 | - ], [ |
|
| 37 | - 0 => 'spip_articles', |
|
| 38 | - 1 => 'id_article', |
|
| 39 | - ], [ |
|
| 40 | - 0 => 'spip_rubriques', |
|
| 41 | - 1 => 'rubrique', |
|
| 42 | - ], [ |
|
| 43 | - 0 => 'spip_rubriques', |
|
| 44 | - 1 => 'spip_rubriques', |
|
| 45 | - ], [ |
|
| 46 | - 0 => 'spip_rubriques', |
|
| 47 | - 1 => 'id_rubrique', |
|
| 48 | - ], [ |
|
| 49 | - 0 => 'spip_mots', |
|
| 50 | - 1 => 'mot', |
|
| 51 | - ], [ |
|
| 52 | - 0 => 'spip_mots', |
|
| 53 | - 1 => 'spip_mots', |
|
| 54 | - ], [ |
|
| 55 | - 0 => 'spip_mots', |
|
| 56 | - 1 => 'id_mot', |
|
| 57 | - ], [ |
|
| 58 | - 0 => 'spip_groupes_mots', |
|
| 59 | - 1 => 'groupe_mots', |
|
| 60 | - ], [ |
|
| 61 | - 0 => 'spip_groupes_mots', |
|
| 62 | - 1 => 'spip_groupes_mots', |
|
| 63 | - ], [ |
|
| 64 | - 0 => 'spip_groupes_mots', |
|
| 65 | - 1 => 'id_groupe', |
|
| 66 | - ], [ |
|
| 67 | - 0 => 'spip_groupes_mots', |
|
| 68 | - 1 => 'groupes_mot', |
|
| 69 | - ], [ |
|
| 70 | - 0 => 'spip_syndic', |
|
| 71 | - 1 => 'syndic', |
|
| 72 | - ], [ |
|
| 73 | - 0 => 'spip_syndic', |
|
| 74 | - 1 => 'site', |
|
| 75 | - ], [ |
|
| 76 | - 0 => 'spip_syndic', |
|
| 77 | - 1 => 'spip_syndic', |
|
| 78 | - ], [ |
|
| 79 | - 0 => 'spip_syndic', |
|
| 80 | - 1 => 'id_syndic', |
|
| 81 | - ], [ |
|
| 82 | - 0 => 'spip_syndic_articles', |
|
| 83 | - 1 => 'syndic_article', |
|
| 84 | - ], [ |
|
| 85 | - 0 => 'spip_syndic_articles', |
|
| 86 | - 1 => 'spip_syndic_articles', |
|
| 87 | - ], [ |
|
| 88 | - 0 => 'spip_syndic_articles', |
|
| 89 | - 1 => 'id_syndic_article', |
|
| 90 | - ], [ |
|
| 91 | - 0 => 'spip_syndic_articles', |
|
| 92 | - 1 => 'syndic_article', |
|
| 93 | - ], ['spip_articles', 'article'], ['spip_auteurs', 'auteur'], ['spip_documents', 'document'], [ |
|
| 94 | - 'spip_documents', |
|
| 95 | - 'doc', |
|
| 96 | - ], ['spip_documents', 'img'], ['spip_documents', 'img'], ['spip_forum', 'forum'], [ |
|
| 97 | - 'spip_groupes_mots', |
|
| 98 | - 'groupes_mots', |
|
| 99 | - ], ['spip_groupes_mots', 'groupe_mots'], ['spip_groupes_mots', 'groupe_mot'], [ |
|
| 100 | - 'spip_groupes_mots', |
|
| 101 | - 'groupe', |
|
| 102 | - ], ['spip_mots', 'mot'], ['spip_rubriques', 'rubrique'], ['spip_syndic', 'syndic'], [ |
|
| 103 | - 'spip_syndic', |
|
| 104 | - 'site', |
|
| 105 | - ], ['spip_syndic_articles', 'syndic_article'], ['spip_types_documents', 'type_document']]; |
|
| 106 | - } |
|
| 26 | + public static function providerConnectSqlTableObjetSql(): array { |
|
| 27 | + return [[ |
|
| 28 | + 0 => 'spip_articles', |
|
| 29 | + 1 => 'articles', |
|
| 30 | + ], [ |
|
| 31 | + 0 => 'spip_articles', |
|
| 32 | + 1 => 'article', |
|
| 33 | + ], [ |
|
| 34 | + 0 => 'spip_articles', |
|
| 35 | + 1 => 'spip_articles', |
|
| 36 | + ], [ |
|
| 37 | + 0 => 'spip_articles', |
|
| 38 | + 1 => 'id_article', |
|
| 39 | + ], [ |
|
| 40 | + 0 => 'spip_rubriques', |
|
| 41 | + 1 => 'rubrique', |
|
| 42 | + ], [ |
|
| 43 | + 0 => 'spip_rubriques', |
|
| 44 | + 1 => 'spip_rubriques', |
|
| 45 | + ], [ |
|
| 46 | + 0 => 'spip_rubriques', |
|
| 47 | + 1 => 'id_rubrique', |
|
| 48 | + ], [ |
|
| 49 | + 0 => 'spip_mots', |
|
| 50 | + 1 => 'mot', |
|
| 51 | + ], [ |
|
| 52 | + 0 => 'spip_mots', |
|
| 53 | + 1 => 'spip_mots', |
|
| 54 | + ], [ |
|
| 55 | + 0 => 'spip_mots', |
|
| 56 | + 1 => 'id_mot', |
|
| 57 | + ], [ |
|
| 58 | + 0 => 'spip_groupes_mots', |
|
| 59 | + 1 => 'groupe_mots', |
|
| 60 | + ], [ |
|
| 61 | + 0 => 'spip_groupes_mots', |
|
| 62 | + 1 => 'spip_groupes_mots', |
|
| 63 | + ], [ |
|
| 64 | + 0 => 'spip_groupes_mots', |
|
| 65 | + 1 => 'id_groupe', |
|
| 66 | + ], [ |
|
| 67 | + 0 => 'spip_groupes_mots', |
|
| 68 | + 1 => 'groupes_mot', |
|
| 69 | + ], [ |
|
| 70 | + 0 => 'spip_syndic', |
|
| 71 | + 1 => 'syndic', |
|
| 72 | + ], [ |
|
| 73 | + 0 => 'spip_syndic', |
|
| 74 | + 1 => 'site', |
|
| 75 | + ], [ |
|
| 76 | + 0 => 'spip_syndic', |
|
| 77 | + 1 => 'spip_syndic', |
|
| 78 | + ], [ |
|
| 79 | + 0 => 'spip_syndic', |
|
| 80 | + 1 => 'id_syndic', |
|
| 81 | + ], [ |
|
| 82 | + 0 => 'spip_syndic_articles', |
|
| 83 | + 1 => 'syndic_article', |
|
| 84 | + ], [ |
|
| 85 | + 0 => 'spip_syndic_articles', |
|
| 86 | + 1 => 'spip_syndic_articles', |
|
| 87 | + ], [ |
|
| 88 | + 0 => 'spip_syndic_articles', |
|
| 89 | + 1 => 'id_syndic_article', |
|
| 90 | + ], [ |
|
| 91 | + 0 => 'spip_syndic_articles', |
|
| 92 | + 1 => 'syndic_article', |
|
| 93 | + ], ['spip_articles', 'article'], ['spip_auteurs', 'auteur'], ['spip_documents', 'document'], [ |
|
| 94 | + 'spip_documents', |
|
| 95 | + 'doc', |
|
| 96 | + ], ['spip_documents', 'img'], ['spip_documents', 'img'], ['spip_forum', 'forum'], [ |
|
| 97 | + 'spip_groupes_mots', |
|
| 98 | + 'groupes_mots', |
|
| 99 | + ], ['spip_groupes_mots', 'groupe_mots'], ['spip_groupes_mots', 'groupe_mot'], [ |
|
| 100 | + 'spip_groupes_mots', |
|
| 101 | + 'groupe', |
|
| 102 | + ], ['spip_mots', 'mot'], ['spip_rubriques', 'rubrique'], ['spip_syndic', 'syndic'], [ |
|
| 103 | + 'spip_syndic', |
|
| 104 | + 'site', |
|
| 105 | + ], ['spip_syndic_articles', 'syndic_article'], ['spip_types_documents', 'type_document']]; |
|
| 106 | + } |
|
| 107 | 107 | } |
@@ -13,92 +13,92 @@ |
||
| 13 | 13 | |
| 14 | 14 | class IdTableObjetTest extends TestCase |
| 15 | 15 | { |
| 16 | - public static function setUpBeforeClass(): void { |
|
| 17 | - find_in_path('base/connect_sql.php', '', true); |
|
| 18 | - } |
|
| 16 | + public static function setUpBeforeClass(): void { |
|
| 17 | + find_in_path('base/connect_sql.php', '', true); |
|
| 18 | + } |
|
| 19 | 19 | |
| 20 | - #[DataProvider('providerConnectSqlIdTableObjet')] |
|
| 21 | - public function testConnectSqlIdTableObjet($expected, ...$args): void { |
|
| 22 | - $actual = id_table_objet(...$args); |
|
| 23 | - $this->assertSame($expected, $actual); |
|
| 24 | - } |
|
| 20 | + #[DataProvider('providerConnectSqlIdTableObjet')] |
|
| 21 | + public function testConnectSqlIdTableObjet($expected, ...$args): void { |
|
| 22 | + $actual = id_table_objet(...$args); |
|
| 23 | + $this->assertSame($expected, $actual); |
|
| 24 | + } |
|
| 25 | 25 | |
| 26 | - public static function providerConnectSqlIdTableObjet(): array { |
|
| 27 | - return [[ |
|
| 28 | - 0 => 'id_article', |
|
| 29 | - 1 => 'articles', |
|
| 30 | - ], [ |
|
| 31 | - 0 => 'id_article', |
|
| 32 | - 1 => 'article', |
|
| 33 | - ], [ |
|
| 34 | - 0 => 'id_article', |
|
| 35 | - 1 => 'spip_articles', |
|
| 36 | - ], [ |
|
| 37 | - 0 => 'id_article', |
|
| 38 | - 1 => 'id_article', |
|
| 39 | - ], [ |
|
| 40 | - 0 => 'id_rubrique', |
|
| 41 | - 1 => 'rubriques', |
|
| 42 | - ], [ |
|
| 43 | - 0 => 'id_rubrique', |
|
| 44 | - 1 => 'spip_rubriques', |
|
| 45 | - ], [ |
|
| 46 | - 0 => 'id_rubrique', |
|
| 47 | - 1 => 'id_rubrique', |
|
| 48 | - ], [ |
|
| 49 | - 0 => 'id_mot', |
|
| 50 | - 1 => 'mots', |
|
| 51 | - ], [ |
|
| 52 | - 0 => 'id_mot', |
|
| 53 | - 1 => 'spip_mots', |
|
| 54 | - ], [ |
|
| 55 | - 0 => 'id_mot', |
|
| 56 | - 1 => 'id_mot', |
|
| 57 | - ], [ |
|
| 58 | - 0 => 'id_groupe', |
|
| 59 | - 1 => 'groupes_mots', |
|
| 60 | - ], [ |
|
| 61 | - 0 => 'id_groupe', |
|
| 62 | - 1 => 'spip_groupes_mots', |
|
| 63 | - ], [ |
|
| 64 | - 0 => 'id_groupe', |
|
| 65 | - 1 => 'id_groupe', |
|
| 66 | - ], [ |
|
| 67 | - 0 => 'id_groupe', |
|
| 68 | - 1 => 'groupes_mot', |
|
| 69 | - ], [ |
|
| 70 | - 0 => 'id_syndic', |
|
| 71 | - 1 => 'syndic', |
|
| 72 | - ], [ |
|
| 73 | - 0 => 'id_syndic', |
|
| 74 | - 1 => 'site', |
|
| 75 | - ], [ |
|
| 76 | - 0 => 'id_syndic', |
|
| 77 | - 1 => 'spip_syndic', |
|
| 78 | - ], [ |
|
| 79 | - 0 => 'id_syndic', |
|
| 80 | - 1 => 'id_syndic', |
|
| 81 | - ], [ |
|
| 82 | - 0 => 'id_syndic_article', |
|
| 83 | - 1 => 'syndic_articles', |
|
| 84 | - ], [ |
|
| 85 | - 0 => 'id_syndic_article', |
|
| 86 | - 1 => 'spip_syndic_articles', |
|
| 87 | - ], [ |
|
| 88 | - 0 => 'id_syndic_article', |
|
| 89 | - 1 => 'id_syndic_article', |
|
| 90 | - ], [ |
|
| 91 | - 0 => 'id_syndic_article', |
|
| 92 | - 1 => 'syndic_article', |
|
| 93 | - ], ['id_article', 'article'], ['id_auteur', 'auteur'], ['id_document', 'document'], ['id_document', 'doc'], [ |
|
| 94 | - 'id_document', |
|
| 95 | - 'img', |
|
| 96 | - ], ['id_document', 'img'], ['id_forum', 'forum'], ['id_groupe', 'groupe_mots'], [ |
|
| 97 | - 'id_groupe', |
|
| 98 | - 'groupe_mot', |
|
| 99 | - ], ['id_groupe', 'groupes_mots'], ['id_groupe', 'groupe'], ['id_mot', 'mot'], ['id_rubrique', 'rubrique'], [ |
|
| 100 | - 'id_syndic', |
|
| 101 | - 'syndic', |
|
| 102 | - ], ['id_syndic', 'site'], ['id_syndic_article', 'syndic_article'], ['extension', 'type_document']]; |
|
| 103 | - } |
|
| 26 | + public static function providerConnectSqlIdTableObjet(): array { |
|
| 27 | + return [[ |
|
| 28 | + 0 => 'id_article', |
|
| 29 | + 1 => 'articles', |
|
| 30 | + ], [ |
|
| 31 | + 0 => 'id_article', |
|
| 32 | + 1 => 'article', |
|
| 33 | + ], [ |
|
| 34 | + 0 => 'id_article', |
|
| 35 | + 1 => 'spip_articles', |
|
| 36 | + ], [ |
|
| 37 | + 0 => 'id_article', |
|
| 38 | + 1 => 'id_article', |
|
| 39 | + ], [ |
|
| 40 | + 0 => 'id_rubrique', |
|
| 41 | + 1 => 'rubriques', |
|
| 42 | + ], [ |
|
| 43 | + 0 => 'id_rubrique', |
|
| 44 | + 1 => 'spip_rubriques', |
|
| 45 | + ], [ |
|
| 46 | + 0 => 'id_rubrique', |
|
| 47 | + 1 => 'id_rubrique', |
|
| 48 | + ], [ |
|
| 49 | + 0 => 'id_mot', |
|
| 50 | + 1 => 'mots', |
|
| 51 | + ], [ |
|
| 52 | + 0 => 'id_mot', |
|
| 53 | + 1 => 'spip_mots', |
|
| 54 | + ], [ |
|
| 55 | + 0 => 'id_mot', |
|
| 56 | + 1 => 'id_mot', |
|
| 57 | + ], [ |
|
| 58 | + 0 => 'id_groupe', |
|
| 59 | + 1 => 'groupes_mots', |
|
| 60 | + ], [ |
|
| 61 | + 0 => 'id_groupe', |
|
| 62 | + 1 => 'spip_groupes_mots', |
|
| 63 | + ], [ |
|
| 64 | + 0 => 'id_groupe', |
|
| 65 | + 1 => 'id_groupe', |
|
| 66 | + ], [ |
|
| 67 | + 0 => 'id_groupe', |
|
| 68 | + 1 => 'groupes_mot', |
|
| 69 | + ], [ |
|
| 70 | + 0 => 'id_syndic', |
|
| 71 | + 1 => 'syndic', |
|
| 72 | + ], [ |
|
| 73 | + 0 => 'id_syndic', |
|
| 74 | + 1 => 'site', |
|
| 75 | + ], [ |
|
| 76 | + 0 => 'id_syndic', |
|
| 77 | + 1 => 'spip_syndic', |
|
| 78 | + ], [ |
|
| 79 | + 0 => 'id_syndic', |
|
| 80 | + 1 => 'id_syndic', |
|
| 81 | + ], [ |
|
| 82 | + 0 => 'id_syndic_article', |
|
| 83 | + 1 => 'syndic_articles', |
|
| 84 | + ], [ |
|
| 85 | + 0 => 'id_syndic_article', |
|
| 86 | + 1 => 'spip_syndic_articles', |
|
| 87 | + ], [ |
|
| 88 | + 0 => 'id_syndic_article', |
|
| 89 | + 1 => 'id_syndic_article', |
|
| 90 | + ], [ |
|
| 91 | + 0 => 'id_syndic_article', |
|
| 92 | + 1 => 'syndic_article', |
|
| 93 | + ], ['id_article', 'article'], ['id_auteur', 'auteur'], ['id_document', 'document'], ['id_document', 'doc'], [ |
|
| 94 | + 'id_document', |
|
| 95 | + 'img', |
|
| 96 | + ], ['id_document', 'img'], ['id_forum', 'forum'], ['id_groupe', 'groupe_mots'], [ |
|
| 97 | + 'id_groupe', |
|
| 98 | + 'groupe_mot', |
|
| 99 | + ], ['id_groupe', 'groupes_mots'], ['id_groupe', 'groupe'], ['id_mot', 'mot'], ['id_rubrique', 'rubrique'], [ |
|
| 100 | + 'id_syndic', |
|
| 101 | + 'syndic', |
|
| 102 | + ], ['id_syndic', 'site'], ['id_syndic_article', 'syndic_article'], ['extension', 'type_document']]; |
|
| 103 | + } |
|
| 104 | 104 | } |