{"id":670,"date":"2024-06-06T13:34:53","date_gmt":"2024-06-06T16:34:53","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/?p=670"},"modified":"2024-06-10T15:10:22","modified_gmt":"2024-06-10T18:10:22","slug":"componentizando-a-aplicacao","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/componentizando-a-aplicacao\/","title":{"rendered":"Componentizando a aplica\u00e7\u00e3o"},"content":{"rendered":"\n<p>Uma das t\u00e9cnicas que mais utilizo dentro de aplicativos m\u00f3veis e quando necess\u00e1rio tamb\u00e9m em aplica\u00e7\u00f5es VCL \u00e9 a: componentiza\u00e7\u00e3o. Essa t\u00e9cnica \u00e9 simples, muito pr\u00e1tica e abre um leque de possibilidades. Tamb\u00e9m \u00e9 interessante porque melhora muito a limpeza do c\u00f3digo-fonte, deixando parte da intelig\u00eancia do software no componente, muito mais f\u00e1cil de dar manuten\u00e7\u00e3o mais tarde.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"has-medium-font-size\"><strong>O que \u00e9 componentiza\u00e7\u00e3o?<\/strong><\/p>\n\n\n\n<p>O termo pode confundir os alunos e seguidores que podem achar que vamos criar componentes instal\u00e1veis no Delphi, que tamb\u00e9m \u00e9 uma t\u00e9cnica bem interessante, mas n\u00e3o&#8230;.n\u00e3o \u00e9 isso. O que vamos abordar aqui \u00e9 outra forma de componentizar nossos aplicativos e softwares. <\/p>\n\n\n\n<p>A pr\u00e1tica \u00e9 usada por outras linguagens como React e Flutter e pode ser empregada aqui no Delphi tranquilamente, inclusive sempre foi poss\u00edvel. Trata-se de criar um Form ou Frame, desenhar o bot\u00e3o, item, card como desejar, e depois criar m\u00e9todos para exportar esse &#8220;design&#8221; para onde desejamos us\u00e1-los. Em Firemonkey (FMX) a t\u00e9cnica \u00e9 mais f\u00e1cil e produtiva de ser aplicada, por\u00e9m em VCL tamb\u00e9m \u00e9 poss\u00edvel sem grandes esfor\u00e7os. Vamos nos focar aqui em FMX.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Por onde come\u00e7ar?<\/strong><\/p>\n\n\n\n<p>O primeiro grande aprendizado \u00e9 que podemos adicionar qualquer objeto dentro de qualquer controle no Firemonkey, o que nos favorece bastante, diferentemente da VCL. Isso significa que podemos arrastar um Label para dentro de um Edit, um Edit para dentro de um Button e assim sucessivamente. \u00c9 com essa vantagem que vamos nos beneficiar. Sabendo disso, podemos criar qualquer design, exportar e adicionar com AddObject dentro de outro objeto. Vamos fazer um exemplo bem simples pra que seja f\u00e1cil entendermos a t\u00e9cnica.<\/p>\n\n\n\n<p>A primeira etapa consiste em criar nosso &#8220;componente&#8221;. Crie um aplicativo novo no Delphi usando <em><strong>File > New > Muilti-Device Application Delphi<\/strong><\/em>. Salve o Form1, d\u00ea um nome a ele (sugiro FrmMain) e salve o projeto. Em seguida crie um novo form utilizando <em><strong>File > New > Multi-Device Form<\/strong><\/em>. D\u00ea o nome de <strong>Card<\/strong> e a unit de uCard. N\u00f3s vamos criar um design que se parecer\u00e1 muito com um Card para ser mostrado com informa\u00e7\u00f5es diversas.<\/p>\n\n\n\n<p>Nesse novo form, arraste um <em>TLayout <\/em>para ele e desenhe-o de forma que se pare\u00e7a um Card na vertical. As dimens\u00f5es recomendadas s\u00e3o <strong>300px<\/strong> de altura por <strong>220px<\/strong> de largura. D\u00ea o nome de <strong>LytCard<\/strong> a esse layout. Insira um TRectangle dentro desse layout e coloque sua propriedade <em>Align<\/em> como <em>Contents<\/em> para que ocupe toda a \u00e1rea do ret\u00e2ngulo. Clique duas vezes na propriedade <strong>Fill<\/strong>. Preencha o fundo com a cor Branca e em <em>Stroke<\/em> coloque como <em>None<\/em>, assim n\u00e3o teremos bordas. Tamb\u00e9m modifique as propriedades <em>XRadius<\/em> e <em>YRadius<\/em> adicionando uns 20px para que tenhamos os cantos arredondados. Agora adicione outro <em>TLayout<\/em> dentro do <em>LytCard<\/em>. Mantenha o ret\u00e2ngulo ao fundo clicando com o bot\u00e3o direito nele e em seguida em <em>Control > Send to back<\/em>. Vamos usar o ret\u00e2ngulo apenas para colorir o card.<\/p>\n\n\n\n<p>Esse novo <em>Layout<\/em> alinhe-o ao topo pela propriedade <em>Align<\/em> e deixe sua altura em 150px, metade da altura total do card. Adicione agora um TImagem no layout novo de modo que ele fique centralizado (recomendo colocar como Client no alinhamento e 20px de margem em todos os cantos), vamos receber uma imagem nesse <em>TImage<\/em>. Na segunda metade do Card adicione um novo layout alinhado como <em>Client<\/em>. E dentro desse mais um Layout com o nome <em>Detail<\/em>. Coloque as margens (margins) desse novo layout com um espa\u00e7amento de 20px nos quatro lados.<\/p>\n\n\n\n<p>Na parte inferior n\u00f3s vamos adicionar alguns labels que v\u00e3o receber informa\u00e7\u00f5es como se fossem dados de um produto, tais como: <em><strong>Nome, Pre\u00e7o <\/strong><\/em>e<em><strong> Numera\u00e7\u00e3o<\/strong><\/em>. Imagine um Card representando um cal\u00e7ado a ser vendido em uma loja virtual. Por isso, adicione um total de 03 Labels todos alinhados ao Topo.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Label1\n<ul class=\"wp-block-list\">\n<li>Nome: LblNome<\/li>\n\n\n\n<li>Text: Vazio<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Label2:\n<ul class=\"wp-block-list\">\n<li>Nome: LblNumeracao<\/li>\n\n\n\n<li>Text: Vazio<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Label3:\n<ul class=\"wp-block-list\">\n<li>Nome: LblValor<\/li>\n\n\n\n<li>Text: R$ 99,99<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>A essa altura do campeonato, j\u00e1 deve ter entendido que poder\u00e1 mudar as propriedades e desenhar um layout interessante, com cores, negritos, e etc. Deixe sua criatividade fluir nesse ponto. Segue um exemplo de card para se inspirar.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"665\" height=\"504\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image.png\" alt=\"\" class=\"wp-image-674\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image.png 665w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-300x227.png 300w\" sizes=\"(max-width: 665px) 100vw, 665px\" \/><\/figure><\/div>\n\n\n<p class=\"has-medium-font-size\"><strong>Codificando o Card<\/strong><\/p>\n\n\n\n<p>O card componentizado s\u00f3 ser\u00e1 \u00fatil se pudermos dar vida a ele, e \u00e9 bem f\u00e1cil fazer isso. A primeira provid\u00eancia que precisamos tomar \u00e9 exportar o <strong>LytCard<\/strong> para ser usado nas telas de nosso interesse. Para isso n\u00f3s vamos criar uma fun\u00e7\u00e3o que devolve a inst\u00e2ncia do <em>LytCard<\/em>. Abra ent\u00e3o o editor de c\u00f3digo, v\u00e1 at\u00e9 a se\u00e7\u00e3o <strong><em>public<\/em><\/strong> e crie o m\u00e9todo como abaixo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">function New: TFMXObject;<\/pre><\/div>\n\n\n\n<p>O nome em si pode ser criado como voc\u00ea achar mais interessante, tal como: Novo, Add, Adicionar, como achar melhor. Eu prefiro chamar de <strong>New<\/strong>. Note o retorno do tipo TFMXObject. Essa \u00e9 a classe que precisaremos para &#8220;importar&#8221; esse controle para dentro de outro controle ao usarmos <strong>AddObject<\/strong>. Pressione <em>Control + Shift + C<\/em> para que o Delphi crie o escopo da fun\u00e7\u00e3o e ent\u00e3o codifique como abaixo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">function TCard.New: TFMXOBject;\nbegin\n  Result := LytCard;\nend;<\/pre><\/div>\n\n\n\n<p>Muito f\u00e1cil. Sempre que esse m\u00e9todo for chamado, o Layout LytCard ser\u00e1 retornado no Result, o que significa que podemos incluir esse card dentro de qualquer outro objeto. Vejamos um teste.<\/p>\n\n\n\n<p>Retorne ao formul\u00e1rio principal, adicione um Bot\u00e3o em qualquer parte da tela (talvez no canto esquerdo superior seja interessante) e coloque um TLayout no form ocupando quase a \u00e1rea toda do form. Mais ou menos como abaixo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"985\" height=\"635\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-1.png\" alt=\"\" class=\"wp-image-675\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-1.png 985w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-1-300x193.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-1-768x495.png 768w\" sizes=\"(max-width: 985px) 100vw, 985px\" \/><\/figure>\n\n\n\n<p>Troque o texto do bot\u00e3o se preferir como fiz no meu exemplo. A ideia aqui \u00e9 simples. Vamos clicar no bot\u00e3o e um novo card aparecer\u00e1 dentro do TLayout. Pra fazer isso precisaremos antes adicionar a unit do card no form principal, por isso abaixo do <strong>Implementation<\/strong> adicione a <strong>uses<\/strong> <strong>uCard<\/strong>; Esse foi o nome que dei para o form que cont\u00e9m o componente, caso tenha dado outro nome, coloque-o.<\/p>\n\n\n\n<p>Agora no evento OnClick do bot\u00e3o vamos escrever o seguinte c\u00f3digo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >procedure TMain.Button1Click(Sender: TObject);\nbegin\n  Layout1\n    .AddObject(\n      TCard.Create(nil)\n      .New\n    );\nend;<\/pre><\/div>\n\n\n\n<p>Execute o aplicativo no Windows mesmo e clique no bot\u00e3o. Veja o que acontece. Muito provavelmente deva ter obtido o restultado da figura abaixo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"985\" height=\"664\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-2.png\" alt=\"\" class=\"wp-image-676\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-2.png 985w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-2-300x202.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-2-768x518.png 768w\" sizes=\"(max-width: 985px) 100vw, 985px\" \/><\/figure>\n\n\n\n<p>Muito legal n\u00e3o? Bom, mas temos problemas. O primeiro deles \u00e9 que o card n\u00e3o ficou no canto superior esquerdo do TLayout, ele ficou na posi\u00e7\u00e3o em que ele foi adicionado dentro do seu form. Outro problema \u00e9 que se clicarmos novamente no bot\u00e3o um outro card ser\u00e1 criado, mas sobre o primeiro, dando a impress\u00e3o que n\u00e3o aconteceu nada. E por fim, a figura e os textos n\u00e3o foram alterados porque, claro, ainda n\u00e3o programamos eles. \u00c9 isso que vamos resolver agora.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Melhorando a apar\u00eancia<\/strong><\/p>\n\n\n\n<p>O posicionamento do objeto dentro do Layout do form principal podemos resolver de uma maneira bastante simples, trocando o TLayout por um <strong>TFlowLayout<\/strong>, que vai ajustar automaticamente os objetos. A programa\u00e7\u00e3o do bot\u00e3o vai mudar levemente. Mudando apenas o nome do objeto, o restante permance igual. Fa\u00e7a o teste e clique v\u00e1rias vezes no bot\u00e3o. Os cards ficar\u00e3o grudados, mas j\u00e1 vamos resolver isso.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >procedure TMain.Button1Click(Sender: TObject);\nbegin\n  FlowLayout1\n    .AddObject(\n      TCard.Create(nil)\n      .New\n    );\nend;<\/pre><\/div>\n\n\n\n<p>Volte no form do Card. Cique duas vezes sobre a propriedade Fill do ret\u00e2ngulo de fundo, em seguida em Stroke e clique em Solid, para votarmos a ter um contorno no cart\u00e3o. Aproveite e mude as propriedades Margins do cart\u00e3o adicionando 8px nos quatro lados, assim teremos uma margem de seguran\u00e7a dentro do LytCard. J\u00e1 no LytCard v\u00e1 na propriedade Padding, que s\u00e3o as margens internas do objeto, adicione os valores 8px em tudo. Isso vai dar um respiro.<\/p>\n\n\n\n<p>Execute novamente o app. Veja.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"985\" height=\"664\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-3.png\" alt=\"\" class=\"wp-image-677\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-3.png 985w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-3-300x202.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-3-768x518.png 768w\" sizes=\"(max-width: 985px) 100vw, 985px\" \/><\/figure>\n\n\n\n<p>Melhorou bastante. <\/p>\n\n\n\n<p>Agora vamos atualizar os labels na parte inferior e depois vamos trabalhar com a imagem. Para atualizar os labels, vamos usar a t\u00e9cnica da programa\u00e7\u00e3o funcional. Fica bem legal trabalhar assim. Abra o editor de c\u00f3digo em em <strong>public<\/strong> vamos adicionar os seguintes m\u00e9todos.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >...\n  public\n    { Public declarations }\n    function Nome(const ANome: string): TCard;\n    function Numeracao(const ANumeracao: string): TCard;\n    function Valor(const AValor: Double): TCard;\n\n    function New: TFMXObject;\n  end;\n...<\/pre><\/div>\n\n\n\n<p>Para cada label na tela, teremos um m\u00e9todo capaz de receber um valor e atualizar o label. Perceba um detalhe sutil: o retorno da <strong>function<\/strong> \u00e9 a classe do form do nosso card, ou seja, <strong>TCard<\/strong>. Isso permite que a gente chame os m\u00e9todos de forma encadeada. Pressione <strong>Control + Shift + C<\/strong> e vamos codificar.<\/p>\n\n\n\n<p>Cada m\u00e9todo precisa obrigatoriamente ter o <code>Result := Self<\/code> para que possamos encadear as fun\u00e7\u00f5es, e o restante s\u00e3o as atualiza\u00e7\u00f5es normais dos labels. Veja como o c\u00f3digo fica.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >function TCard.Nome(const ANome: string): TCard;\nbegin\n  LblNome.Text := ANome;\n  Result := Self;\nend;\n\nfunction TCard.Numeracao(const ANumeracao: string): TCard;\nbegin\n  LblNumero.Text := Format('N\u00famera\u00e7\u00e3o: %s', [ANumeracao]);\n  Result := Self;\nend;\n\nfunction TCard.Valor(const AValor: Double): TCard;\nbegin\n  LblValor.Text := FormatFloat('R$ ###,###.##', AValor);\n  Result := Self;\nend;<\/pre><\/div>\n\n\n\n<p>Show de bola. Ent\u00e3o o que fazemos \u00e9 alterar o texto do label e em seguida fazer o result. Bem f\u00e1cil. Agora, no formul\u00e1rio <strong>Main<\/strong>, precisamos somente alterar o c\u00f3digo do bot\u00e3o para o modelo abaixo. Perceba que agora podemos chamar <em>.Nome, .Numeracao<\/em> e <em>.Valor<\/em> e passar os valores. E veja mais abaixo o resultado ao clicar no bot\u00e3o v\u00e1rias vezes.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >  FlowLayout1\n    .AddObject(\n      TCard.Create(nil)\n      .Nome('T\u00eanis Nike Classic')\n      .Numeracao('40-50')\n      .Valor(459.75)\n      .New\n    );<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAA9kAAAKYCAIAAADopazAAAAgAElEQVR4Ae3de3Bc55nf+S4V\/5JsiRfbIpxKJSKmJtmqmUlhNpmsOXZVHKOISBmOZ323RdvciTwMxo4vmuxcbM9OdKPYsj2SBSm+xZZMkEZ40YUidbFkiZlFnDFpRRdSHFm2Ic+uaVkQKfOVREIkZ+h3F\/0CL05fcfrtPt3P8+D7FEpqNE6ffs\/neYjz09EBWFr1u1+sfNy0av2Nq9\/+hV99V\/k3L7\/+L7bcMnbrlzZcecPaD1679oPXvmnDNeFB\/T\/ftOHqtRuuWbvhmg1X3jB2y3\/+7OYvvvmDs582+\/jqvvu+el39V7d\/68E95blXLTy+cvy+B+dq7lXlXQ9+60uVl39pz4O7tmff5crx+8KXMq+a3zjsue4l2Ze39fhNG65+y4eu+fPrbx675T9vuLIcXluhuHrtLEjtx5suvyo8ueFT5ZvHbv3MdTf99gdrt8m8atu2B+7aktnJlh37vnzt1Ws3bNt2z85Pxeev3Xl3+PTWux7YsS28\/FPf3Hf3N79SefyVL98TXnX12rjlhqs\/9c19D8xV5auZL63dcPWWHQ9su7XFwhb\/0psuv+otH7r6s9fd9MWbb738U1vCquLhZ45xblfxS\/lkrl6bOdiwtwWcDNr8gVQkL79q7TU77toxvvbyqz55+977s1V5cu3lVyV8zB7pB6+qHOktl39yS9jD7OE0+YhfuvxTW7548y2fufbG397QdOP5nXzly3v2fvma2c0+efve8VsWtt+y4\/7xWxo\/OXuwe3Z88vKr1t5y5\/33z242v7fEB4UfaWWdoS133f6VudVmnpw9hFvuvH+hWZFlfPz+O7fMgscHmcdNDz+7ccVkfjyq32X2S1t2VPznST95+96FFcY3nf\/q2svjwmZfmxm2qp0kt6PgRlQtvrLI8fEwSPEA44PskFe1ZmHGwohWDMMQjo9n\/+jdP2uS9Vx4vLDDBi\/ZsuP+++eavvBeaaQ98pw7nHneeHQRMz5o8sc87ejWXn5VwQd4VfzuNL\/CuYHJTH6l5ZU\/uXEe5jeutC9qVP\/ZqdomDFs88bV8MHvIBZ6Aqs+q4YyTPYfGx\/FBZbVz56OWT2ZOzZUz9Pw5fe6kmT3xLTyuigrzZ\/+GTy5+7q4\/O4dn2iede68NV5bHbrn1s5tbp51KnLtu97d27bnnwWw4jDnwa1\/dNx8DK\/+ejXnX7b5n3+4rK7nuyvH77hn\/WiWDfW0+XsbXzu48s0F98sz1zPs+vff9n9n3nk\/fu+HP9358y94\/+vzeKz+39\/f\/0953\/9m97\/v0vvd9eu87\/uy+j129a\/Pnv\/QX13\/+s9fd8OWvff2O3bNVH5jXfvDa37r8ul9\/7\/W\/+u5d9\/zoJ\/eN3bjqd29adesPfvrzH5Rmg\/j62SA++K4b3rzx+lsnHnrofxx67vkXXn7lZPsfp15+pfsfL71yquYj57vUvKqjT0+eeqnhR93aWr7LzEuvtPw4OfNSVz\/cyZmWH6+6k80+wgubfbXV8ydOvlrzUfcup93JhY+ajU+cPN2rjzMnTub9+MXJMz39OHXmF21+vHjqTFsfC\/uvObTK+7bY1cIL21xhwxe2eKOl9KXTL56S\/PHqi6dyfoSjyLlxEZvNvHhK8sepF0+p\/Zg59WLvPk6+OBM+evmmKe91fOaUvI+Z4zOSP149PtO7j2Mzr+b+OH1spr2P4zOn2\/34wc+O3ffXT92848Bt335o5xduWLX+xlVjf\/P\/\/OzpUgjiv\/beLZ+84VtPTx1tP3\/HyN79FB4yd326VZjFW0bwENB7msLTo3ZdsK7N5XXZunaDbBB3s8k7ZveepfDwRlKD+Ml8Qbx6s5zJtUEgDlm8Oli32FuDPVS\/NucGLd5iSX7JRhYvIl63u0+xWVxtCj+VElI7Du5k8eSULzmIz8gL4u3l75jX203hNdv\/7fET+\/7rxD97\/\/Wrxp7626N\/UwpXxD95w3aBKXwJZfFeB\/H6fNy1ZzLZei5k18X3hYvimSze4yB+Os9F8Z5eC89en1403caN57fMk18bp+TqLL7ofhrvZH4ZOb+66LssvQ3I4u1m7hbbC4zj3QjivbssXXT4jpe944Oi37Go\/cu7KH6Ki+Ih7ou6HF4TxCufnjk+c+bjN3zrV77wf\/\/kp0dKq9\/++TdvvL6DK+JFXQ5vFsRfyn0bTP0F9fRnGt6gcrL25pnm+295XdxKEK9P4eEZpVlcQRDPxOg84bVBUM7s4Rf57nJpsBOCeD66lj0ii7fI1glfkhbHi8qCHV9+7v3CYv7OPuj9Mjp9R5EpXHgQ79FF8dwpPNy+0t518UapOs+dKrPJu\/7j0E+ef8vG61e\/\/fOlf\/Lu8q3\/9SFFF8WtZfGuBvGXZm8QfzX1HvH0S+PNUjhZvI1Anz\/RxovimSTdMufN3UpeFaOzO6m8dZ49vJh\/kc23zPlGS2wzsnhC4G79kr7G8ZmZFxc+Oo19CgN3i0PORvD4uMX2nX8pvstJqQE67XYU4fei1C+vR7eJt5PF2wvix9q\/QXw+uzcI4iGa37zjkV99V7n0G+\/b\/OB3n0zN4sVeFH+50U9G5rxZvOFrm1+3XuwKd8Pr4o2W1+QtmlwX73YQF5jF6y6Kv5q9X7zyY5rhVhZx96i0EaOzuTb5cfPwupCh63c+\/6o8yXVhP6cqP4o6\/9rwfNt7qH551c6bfCnPWyzVbcjirYN1u1\/taxA\/lQ3iM7aSdOfJ+NT8z2UuRORCiWzl72xqrw+78ZnsZnIulvciizcP4m3H7nhreHwwH6zzXAjPbtM0iB+fOXPfXx\/59fdeX\/qXl1\/77E+fXzSLP\/Xf\/8fE6Mdv\/o1\/8dUVF99+0etv+I1\/vmP04z\/473+dPxknbFmfa9vaSf3L058pIosXEMRfmvu9KA1\/fUr6Ze9Gebpqbw2vi7d81ewt45kg\/mqvfndKNvEv8rOb4rJ4TRCvzrt5ImxVXM786Gee13Z+RTznuyzVzSRn8dO5f49Ku4m5uO37msUXroiHUN6V\/MpOUgTsBvEWCbsmiLfYMmb33jwoPIs3D+Kvxjyd9iA1hZ+uvy+l5pkf\/Oz4b11+Xen\/\/\/2LrYP4sekXbv+Dj3561cBnVw5ctXLg8ytWf\/Wi13\/9tav+eOXq61cO3PaRPzz2wrG2InKejRuG5jwvzG7TcCeJT9Zk8TauiIcr7nXXxYsJ4s2zeFV0bpmSU7asz+KLvkXdS7IpuTePVWXxjoN4szCdJ\/tWhfjq\/wbI+aU877K0txGexcPyiovOrffc12Cd8EsSa7M4l8ZTYnRXLpbbzeIt0rPALN7fFJ5yX3hNZE\/K4q0uh2cT+doN1yySxY+98MLnhi\/945UDm3\/tN48\/+5OZE27mxIkTU88+fdvWLb\/15j9fOfCxlQOffdulx6a7HMfrE3M2ZOd8XL+T9GeyWby9IF6Xwl\/p8i8Rr\/xK8ldfOjn30ehm8ZR4vWiYrtmgJlvXfLXm05qNK5\/2Jn9n30V9Fm83vNbn5px7qH9hu8\/kfKMlvJmKLN6XC+SCg3iDzF1zd0r9p31LpV2JtvJ2kr3RZeGxrQjeInY3\/JK0LK4+iKfeJp4\/i19dWrvh6hbXxb\/2kT\/8xMrVf7Ry9dff\/QFfXX93+vSuP\/zEh1YOfGjVG2\/6g9Gc+Tj\/ZtncnP9V2S2ze+j0cUoWb5TCCwniM80vhxf4e8Rr4nVbnwrI4sKCeOaOkdqYW3NFPHxauTidM7nW7jBzYbvzPbTYefhSzrdgM9l\/3U\/8T4XWF7CL+6rIRE4W7\/+vWTT245j1MbqtZ2I0r3lVfL4PD47NzOT7aPWX8lzx70fPO++8Ul2dd955V\/z70Za3pnThong2i\/\/jNYN3P\/Bg\/WXyux948JLBX6l+vktZ\/PHJ735o1Rs\/snLgD1cO3Pqey733\/+8zP9z0z\/\/lZ\/73d33vwYe89+f+\/u83v\/1dH1o1cPmqNz42+d1sDg6PL7lkTaT7xm2312+Q9swVV3zkbcPDrV\/bafjOXvzOBvFOfo9hIfelLBrEw29W6cWl8Rxx\/HTYRnIW7\/Vt4jFqZyLyQsCNX615kDuLL+yqbv\/542+LnbT+Uv63YMuKQIy8Yh8Ul7YX3bO8OE4W73MWP\/mixL\/2siYH9\/LTmqgd3rrmycI\/zZe8Gwb0pnH8vPPOm\/yf\/\/PHP3++5uPg4afOO++8xbJ4F35qM8bxux948OLVq2vieMMnj7f6WzzPHJtZ+Fi7oeV18S9u+tjHVg78h+VvuPy1K695x7tns\/jhp35\/xeoPr7j43170ur3bv+W9\/8kTT35g1cD7Vw3cuOlj9eH4kkvWHDr8VP3zyc98+8GHSqXS24aHW2TxAlN4COXZmN7qcd118UKy+OytKZWA2\/DnNeVcF2\/49\/vEv3Gzlz+72eqKuI4gPn8RPU9+bZiV87wwu03DnSz6ZHYPPM4tIDaFh4UtmpgL3UBYHE\/J4tw73q27dGbvSLF1L0rnqb3wnL3oXyTUQRCfaRGpS6XSj3\/+fMMNSqVSw+czT3Yni8c7yO+qxPG7HngwPFPzadxssQe5s\/gf\/fr\/+s7Xrlx7wUVvuWD5n1Sy+NShwxuWv+HDKwfev3Lg\/YP\/5O\/Onv3lL3\/50X\/2L967auAPfuM36xN217N4eItv3HZ7syxeeBBPvi7e\/SDe+h7xbDSXcFG8dRbP3sZd6ONWQfxEzbXn3nxad7l6IeO2WEAH18Vzh8JGv5W8xWrrvtTuG7H9vIDkOF5o1F505zayeLyJvFup1Op+Fu7\/bvRrEO1l8WySTsvl2T305\/FSyOLHZk7H\/B0fLJa86\/97IHcWf\/tFr\/vtCy4auXDVO1ZcfMN7Zu8Xf\/bQ4d+76PVXrFy9cdXAB1YO\/PRHP\/be\/6fffed7Vg28+3VvzJPFv3Hb7fGulW8\/+NDLr5w6dPipSy5Zc8UVHymVSi+\/cuqSS9bEbQ4dfuptw8OlUumSS9Zkd97PLN7qQnjNLynPXBfvfhCfvTWl8lObcz8J2uhHNmMcl5XF+\/qrDGVn8Rbhu+ZLdcF3IcEv9qX5wDcXtVt\/mn+39Vu23jNfbS5AFl80lMcNBKTzxKvjXCBf9D8hqrI4l8BzCPQnf2cvli+RLB7j+MWrV8cL5O3E8YUgfmzmzCL3qPz2BRdddtHr3rty9TsuXPVHv\/fOkMXfufLiD60c+MCqgfe+7o0vHX\/Re\/9\/\/uuRd69c\/Z5VA9m4HB5n7xc\/dPipcIdJ+NKhw0+VSqVDh58KD+Ld5JdcsiZc8776mmtLpVLI628bHo4bvPzKKTVZvJAIHn8Ni64sPvdX\/PQ1iJ8+cVJeFq8J2Xk+XSxt18fi7DPNI2BVOs++JPlxzvfSstnxU2eOd+Gvu69ybnTsvc\/iMdrmeeu4sZAHeuP4omF0KW9QFcS5LzxHEG\/xe8QbXmXPFdzjxdOGD7IpPD5OjeNNbxY\/NvNqZ\/eodPrLxRuG7HBFPHcWrwrf2ZvFF8\/i7\/qnv\/aOFRf\/7oWr\/rfzXxvuUXn28FPvWbl6dOXqT6wcGPvg\/+G9f+Wll9958T9878rVn\/i1ofrfx3LJJZccOnw4Pn\/1Nddcfc3CrzO\/4oorvnHb7YcOH85e9o63tXz7wYfijShXX3Pt1ddcG7N+f7J4G1fE53+neLFZPIbyqgd1F8glXBSfW0Pdj2wWejtKw53rz+L5g3g21mde1Sj8VaXD5OTd7IWLvqOKDUIQ70kczxOIu7tNTNX5dxtfIuGB0ji+lKN262OvCeLcF14fpmOSzn4pPpl9kN2g5nF2s\/4+XuT3HnacxZsF\/fpbR3I9E29NiQ8a5vX5J1sF8cWz+HVXbHrXije86fwL\/\/VrV\/xf73qv93760OGvv3bV9teu+s6\/\/b1XX\/yF937PjV+8csXq\/7hy4BsfGY2ZOz5YNIt\/+8GHKln8kpizhWbxtoP4qewNJP17vHBPefwF5PM\/69nrjF4XxHv585oxlyvP4plI3Sz4zj2fDeLJP+tZs5M8n+ZfYVe3LDTNZ1N4fFzkO+YPxF3ZsiZM599nzQv7+ClZvHW0FfjV2rTd7I7w8Hy+q8I1QdP2pzmjc2uEnDsperNFgvjxynXxqZ8\/f3ymwZalUin7fOZHNpvl7+zzuZL3fKSe27gmf9d8WrNxzSXwhp8uco\/Kgf1\/9W8uXPWWC5b\/mwtX3fCu93nvz7qXpu\/Z99KTh375y19673988Pt\/+fp\/cOvyN3x+xerD+\/8qRvD4oCaLz9+jcvLlV04eOny4coP47AMF18XzZ\/HeXAt\/pXIz+uLvRRaPKTw8aJXF+\/ZLVPJk3LBNW\/k17nb+VXniY1XEj3vI82D+Xar20Ksn8xxa8jYxf2cfJO8t3wvzB+KubJmN0Tl3mH2JkMfSErnABCxnSU2zOLE7n0DMx63Tduuvxp30+UHL21pmo\/N555138PBT9Tn70I+ncvxOw2z4rnncdhZvmLwbPjkfyhe5KL74dfGXXzn5pxs+\/LbXrnz3Ra\/71mVvz\/5VP3\/\/d3\/3377+jS+8\/o3bX7vqtgtff9eH\/13M39kHNVn85VdOxp\/LrNwsfjj+7KaV6+JVt4sUdTk8BPHF43iDID772w9f6fEVcTm\/U7zF\/eKnFQTx+cvbyWE3Twqs2nmeCN7xqqresYPsnufokrfJpvB2H6e+ac5M3MXNhETqTpYhJ47LSb0CV9I0iHNfeL4g3jph5\/xqd\/J3yxjd8JeIJzz5asd\/109NBA+fth3EXzj16iWDv9LwhzXveuDBf7xmcD5\/Z\/fcjSz+\/M+nr3jzv\/rY8jdcs2L1lzd8aPvHP7n9P3ziv3xgwzX\/aPDL51+4+4IVO16zaveb33rs59PZCJ778akYwbv1oKjfaZj3unjxWTwbxFv9LZ7Ng3jvsnjr32Mo5x6V0784GT7OSE\/kxUfVqmSsKouHlacG36o75ut30m7+rtm+fof5nulizs65q05ysJDXConjAhOwkCW1COLcF54zRne4maIUHoJ7wyTd+ZPZxJz38Qun2v1J0G5k8ZdfOfn8z6e\/8eF\/97kVq2++8HXfvGD5Ny9Yvu2C5bsvWHHHa1bsfs2KBzdsPJ4YxE92K39n99PnLL74TSMdhvVXX1o8izdI4eFm8bmL4lKyeM3dI735tME9KvNBXMOl8fazeL7Mt5BEF7J4ziAu5rp4XHm7h9zW9jUhO+enbb1F9cY5M3S3NhOSpztZBlm875m7VdrmvvDkK9\/HZk4d68LfM6ouiLf6O4Dq71pp55m8+bvR1e4OX1sV0Be5Xzx7efvww\/t3\/P4fTPzK\/7LzNSt3vmbF7sF\/+vCHf\/+Z7zyS3abNx92\/KP5y3qvXNb8IvMmn4W\/ZbOMv9+nJz2umZvHwl8\/39p8L18X7\/asMW90sXrkWbui6eHU4rg52C5m75vkYZBcetM7i7f9XwcKeC35tzaF199Oc4bt+s9RldCtk59xPJyFYyGs7y+Lpvyw8\/g0+8UHfM3F\/FpCcNXlhrwQ6jeM9uS8l3srS+fXvZnvoME938vK6LP6eT\/1lmxl69icvO\/soJIWHq+PdvC7+yqmX2vtL73uSxcOl91Y3ize+Lt7bFB5vSZ+N4zKCeNObxaXfl5LNxIum2Ljx\/JZ5ImDjlBx31fDB\/P4bv7bfX81z1Gnb1IfstGdePJUzHPd4MyF5usNlzMfxbgbrmLDzP+hPFH5xpp\/v26s02eFNGkv85R1lcYJ4Ny6TV2Xx93zqL0sPPPBAZ8G63VxeYBDv8nXxhKvshd+jkucWF1FZ\/NW6X2XYm3tRat6lwa0p8e\/9UZPFFw24NaG5sn2exNkgT9fsqubT+ZXEnTfYw\/w2ffxSXF4XH6Ql77pXnT5+KtdHzyN7hyG4ey+fefXF9I\/8cbnQLfuZifuSyAninQuEG1Fq\/tnObhfN2bM3uiR9xAvVPXvQ7Hp2h893cj27W6+tyuIPPPAAWbzJDSoJQXz2OnqerFz0NoKyeF0Ql\/PzmgvpXHoWzx9qGyXmPDG0Ki7X7KThp41SftVO8q+54C3zHH5b29Sl6tm\/ibP9j1xBPOT13sbx7oXpU+3uav5i9qlOUnh8baEhO\/\/OTcXxdhLhEr\/wnOvw8wfiduTNZPEOA3ezl3crTLe7n6rwXfNbxnufxYu9KN636+IiIniM+GRxWxfF86TV+sQ8\/6o8QbMqRtfvKj4zv8+wfXbPVXuo3qy\/X8ousiuP24\/dDZO62Cx++sW2M3S7mTvf9ukXxUMczx+XC92SLJ4rlbaTNe3sMGcWbxNnkSye803rNuvZtfD4Rs3CdOfPtxuju7K9lCxeeArvWxBv9YsFYz5OfdDqvvCG+2wQxPtxpzi\/U7x7vx5x0Wgbs3J4UL19ngBaFZdr9pb9tMmeq15evY2EL+URaGubbsTxNrL48f7cWZ4vMRcV3CvXyDuK44Um7LZ2bieOtxkK7YTmgg68Lu\/W3jqS+r7N4njt\/psvIAbi\/j7oPHbn2UNXovaiOxGRxQsP4l3+kc32blBpmIm78WT2V6bkvfRem8Vng\/grPf77fbK\/PkXC\/eILt6PEe8RPzP1Ccf2\/xzCblat\/g8ovTjX9rSk10bMqMdfsMH46H7Kzr6164fwGMp\/MLrvDx73P4jU3l\/fqrpU+xvH5+1WMxPGZvty93cU3TQ2FxPHGAs1DcFVczsOec1ftbNbf\/J3z3fOE7JzbLBqju7LBEsjifQ3iRd4j3kYWr43g4ReKv3Sy8vtMQhbv0a8VXwjild+gIjSL2\/md4jErhweVQNxu1lxIzzV7y37aaM8LL5QdxMM622VZdPsOQnl718VrsnivrpQLyOJL+97xPFGMbeQItJN3qzJ3wxe2Pq6GL+nSky3T8Kszx\/J\/zLTcVadfzRm182zWlbTdeif9z+K2L4p3P4u77CXwGMezTzZ43DiL9+nulLk4Xv2rDGMor7mZuwefNrgurjWLZ8Nxw8eNEnOzTNkgSdfvszpk1+yqwR6qtxe1Qc3iO\/+0gyx+pj5et\/tM8VfH+5jFM2\/d0aVx3feOt05jfFWaQJei8FxMb3103X2v6r21DNAignieeJ1\/m9YZuitfbRXEj82cmfvZTUchgAACCCCAAAIIIIBAbwXI4r315t0QQAABBBBAAAEEEJgXIIvPS\/BvBBBAAAEEEEAAAQR6K0AW760374YAAggggAACCCCAwLwAWXxegn8jgAACCCCAAAIIINBbAbJ4b715NwQQQAABBBBAAAEE5gXI4vMS\/BsBBBBAAAEEEEAAgd4KkMV76827IYAAAggggAACCCAwL7B4Fn\/66Ivv+OazA9c+PXDt06U\/fYqPfgmEFrzjm88+ffTF+fbxbwQQQAABBBBAAAHFArNZ\/K0f+8tmR\/D9qWMrrvqbqx56\/m+Pz\/zt8ZmzVP8EQguueuj5FVf9zfd+fKxZy3geAQQQQAABBBBAQIvAIln87bdNfeGvpvuXP3nnBgI3Tb7wO9+Y0jJhrBMBBBBAAAEEEECgmcAiWfzCvzhy7OXTDfIgT\/VP4BcnT1\/w50816yjPI4AAAggggAACCGgRIIv3L1OnvjNZXMufLtaJAAIIIIAAAgi0Flgki5f+5FBqYuR1BQqU\/uRQ677yVQQQQAABBBBAAAH5AmTxAhNzcbsmi8v\/o8UKEUAAAQQQQACBRQXI4sUF5gL3TBZfdLLZAAEEEEAAAQQQkC9QyeIf\/UKzhXKPSoGBuoNdk8WbTSzPI4AAAggggAACigTuv\/\/+0lvJ4h3E4r68lCyu6M8YS0UAAQQQQAABBJoJkMX7kqU7fVOyeLOB5nkEEEAAAQQQQECRAFm801jcl9eTxRX9GWOpCCCAAAIIIIBAMwGyeF+ydKdvShZvNtA8jwACCCCAAAIIKBIgi3cai\/vyerK4oj9jLBUBBBBAAAEEEGgmQBbvS5bu9E3J4s0GmucRQAABBBBAAAFFAmTxTmNxX15PFlf0Z4ylIoAAAggggAACzQRms\/j999\/f7Mv8fvG+RO1F35Qs3mxieR4BBBBAAAEEEFAkMJvFt32Vv+tn0fQrawOyuKI\/YywVAQQQQAABBBBoJiAoi69Zs2bTpk0x8z7zzDNr1qyJn3blwTPPPFOar82bN7e7z23btpVKpf3792\/evPmZZ55p9+Vd3J4s3mygeR4BBBBAAAEEEFAkICuLh6QbMmvXs\/j+\/ftLpVLM0Nnc3yIll0ql+NUQ39esWbNu3br4ZF8ekMUV\/RljqQgggAACCCCAQDMBWVl827Zt8Vp417P4mjVrYhDPH6CzWTz\/q4rekizebKB5HgEEEEAAAQQQUCQwm8WF\/OxmyMqbNm0Kl5+zWTxc0g53l2zbtu3s2bNr1qzZv39\/iLybN28OF7k3b948fwfKwvXvsM3+\/fsbXswOt52EV4Udbtu2bdOmTeHid9xb2H\/Np2fPnq1fWNEpPOyfLK7ozxhLRQABBBBAAAEEmgnIui4erluHO0liFg83ecdL2uE+lpCYQzANIT57TT1E5Gws3r9\/f+ubUmJYD+k8+3bZ\/WTfseHC6jcu4hmyeLOB5nkEEEAAAQQQQECRgMQsvm3btnXr1sUsno3dZ8+e3Vyps2fPhrtHYobetGlTuGQesu+6devihfNwAbvhdfFwiT1c8A4b1Lxd9h6VmuvuNVvGhRURvmv2SRZX9GeMpSKAAAIIIIAAAs0EJGbxs2fPhiQd7h2vj7whc4fwvWnTppC567N4vLYdgmz2BzdjtI33usRMX\/N2MYvHO2FCfH\/mmWdqtty8eXP2PwbiWxTxgCzebKB5HgEEEEAAAQQQUCQgNIvv379\/TaXOnj1bfytICNkhPcef9ay5RyU+H6NwuKodPw23rMQf6Ny0aVPD6+Jxg3jZO\/4+lmYLi29R3AOyuKI\/YywVAQQQQAABBBBoJjCbxUX97GbMr+EHKMOn2R+RzN55smbNmuyvCc\/eQxL3k32Q\/UnNcA07vqRZFt+0aVOpVNq0aVNI3qVSad26dTGgN1tY9nRMCpcAACAASURBVE2LeEwWbzbQPI8AAggggAACCCgSmM3ib\/0of+9mEYG5wH2SxRX9GWOpCCCAAAIIIIBAMwGyeIGJubhdk8WbDTTPI4AAAggggAACigTI4sUF5gL3TBZX9GeMpSKAAAIIIIAAAs0EyOIFJubidk0WbzbQPI8AAggggAACCCgSIIsXF5gL3DNZXNGfMZaKAAIIIIAAAgg0EyCLF5iYi9s1WbzZQPM8AggggAACCCCgSIAsXlxgLnDPZHFFf8ZYKgIIIIAAAggg0EyALF5gYi5u12TxZgPN8wgggAACCCCAgCIBsnhxgbnAPZPFFf0ZY6kIIIAAAggggEAzAbJ4gYm5uF2TxZsNNM8jgAACCCCAAAKKBMjixQXmAvdMFlf0Z4ylIoAAAggggAACzQQWy+J\/\/GSBiZJdpwqU\/vjJZh3leQQQQAABBBBAAAEtAvfdd1\/prR\/9QrPlXvjZJ58\/cSo1MfK6QgSOvXTqgk8\/0axlPI8AAggggAACCCCgRYAsXkhcLnSnZHEtf7pYJwIIIIAAAggg0FpgNovfd999zTb6na8+\/bmHf3rmzJlCwyU7zy9w5syZzz3809\/56tPNWsbzCCCAAAIIIIAAAloEFsni3\/vR9Io\/+95n7pl69oWXn33h5TOVyh8c2bIrAoE9tOAz90yt+LPvfe9H01omjHUigAACCCCAAAIINBNYJIs7557+6fG3f+mxi\/908uI\/nSx99BE++iUQWvD2Lz329E+PN2snzyOAAAIIIIAAAggoElg8iys6GJaKAAIIIIAAAggggIAiAbK4omaxVAQQQAABBBBAAAFTAmRxU+3kYBBAAAEEEEAAAQQUCZDFFTWLpSKAAAIIIIAAAgiYEiCLm2onB4MAAggggAACCCCgSIAsrqhZLBUBBBBAAAEEEEDAlABZ3FQ7ORgEEEAAAQQQQAABRQJkcUXNYqkIIIAAAggggAACpgTI4qbaycEggAACCCCAAAIIKBKYzeL33nuvohWzVAQQQAABBBBAAAEEbAjce++9ZHEbreQoEEAAAQQQQAABBJQJkMWVNYzlIoAAAggggAACCJgRIIubaSUHggACCCCAAAIIIKBMYDaLb9++XdmqWS4CCCCAAAIIIIAAAvoFtm\/fzv3i+tvIESCAAAIIIIAAAggoFOAeFYVNY8kIIIAAAggggAACJgQKz+LT09Nbt27duHHjpZdeOjQ0NDAwUKKWjMDAwMDQ0NCll166cePGrVu3Tk9PS\/hTw0wumQFscKDMZAMUnuqrgMyZlPC9mjUgsEQECsziY2Nj69evX7Zs2bp1626++eY9e\/YcPHjw6NGj586d89QSEDh37tzRo0cPHjy4Z8+em2++ed26dcuWLVu\/fv3Y2Fi\/\/nQxk0tg7lodIjPZSoev9UNA4Ew6CgEEeitQSBYfHx8fGhoaHh4eHx8\/ceKEpxCoCJw4cWJ8fHx4eHhoaGh8fNz1sJhJZrChADPZkIUn+yjQx5l0FAII9EOgy1n8wIEDIWnt3r3bUwg0Edi9e3f4r7UDBw64gouZbNIEnq4SYCarOPhEgEAvZ9JRCCDQP4FuZvEdO3YsX778xhtv9BQCOQRuvPHG5cuX79ixwxVWzGSOPrDJggAzuWDBIxkCPZhJRyGAQF8FupbFy+Xy8uXL9+7d6ykEcgvs3bt3+fLl5XLZFVDMZO4+sOGCADO5YMEjGQKFzqSjEECg3wLdyeJbtmw5\/\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\/XJ+\/6Z1q8z9TUVDaIxy3J4pGiwwcJ55ie5Z44ivFBwsEykwlo\/X0JM9nudXG+TxY9sQkz6SgEEJAnIDqLT01NxZtWwh0mITGHJ+N17sHBwfjV8KVyuewzFXJP2Ft4OibvcqWy55jR0dGY6gYHB8MOY4gPL4+vyrzJ7MOYxcNOwmvDNvGGlrDsmk+zO4z3RdQcRc172f404RwTu9Z1mex1cWay67xadshM8n1S2qwmzKSjEEBAnoDoLB7T1dTUVLyrOz45ODgYLkyGLD45ORnTua+umKXK5XK4maRZFi+Xy3EnMVh772uugpfL5Zp0Ht4w+5LwTAzZcdnh+ZpP42YjIyNLOYLHviWcY2pI4646fxDnJ9yoEHbITHYOq2sPzGTM4nyfFDK6CTPpKAQQkCcgN4tPTk6G68rxn\/FM4CsV83S8Ll4qlbL3mofNvPfZLBUSfHxtDMHhpydjEA+pK751qVTK3pAQXxXfIjyIWTx79TRk65GRkWygr\/k07rC4QFmzVOGfJpxjiqOL88NMCh+bQpfHTIbvwCOVitTZb5J8n4wsvXmQMJOOQgABeQKis3g2GftKxQydzeUxi4fYXSqVai4txyzlvQ+Xz+OF7RiCR0dHwx0p4Y2yV0DjM\/HB5ORkNljH50MWz94ME\/fvvQ\/Px4PKfho3Ky5QxkWqeJBwjimOLs5Pw\/\/3wkyqmKjOF8lMhu+6fJ\/sfJa6tYeEmXQUAgjIE5CbxUMazl6Nzubv7ONsFo9p22cqZqnwXLgmHW4yiSE4JKqJiYkYslvfLlJzcSj7e1SyP7E0ODhY8x8GNZExfBqX0fpNM8dk\/GHCOaYGtotA2fmpufKXncPsY2ayi\/5CdsVMxgnn+6TemXQUAgjIExCdxbO3BNTc5x3PCuFm7qmpqezG2V8lXnOPSrw+3TCLe+\/L5XLMW\/F\/v8aA7jOV\/QHN8I7xHpX485ejo6Mhi8ddhfet+TRm8XA44as1IT7zzvYfis092TFjJu0PYuYImcnsd12+T2ZGo28PE2bSUQggIE9AXBb3FAKVv+Cp3T8sxV0XpyEIhP9Nx0wyCaIEyOLt\/pFkewRkCpDFPSVQIOEcQxYX2EdLS2ImLXXTxrEkzKSjEEBAngBZ3FMCBRLOMWRxgX20tCRm0lI3bRxLwkw6CgEE5AmQxT0lUCDhHEMWF9hHS0tiJi1108axJMykoxBAQJ4AWdxTAgUSzjFkcYF9tLQkZtJSN20cS8JMOgoBBOQJkMU9JVAg4RxDFhfYR0tLYiYtddPGsSTMpKMQQECeAFncUwIFEs4xZHGBfbS0JGbSUjdtHEvCTDoKAQTkCZDFPSVQIOEcQxYX2EdLS2ImLXXTxrEkzKSjEEBAngBZ3FMCBRLOMWRxgX20gWpf7QAAIABJREFUtCRm0lI3bRxLwkw6CgEE5AmQxT0lUCDhHEMWF9hHS0tiJi1108axJMykoxBAQJ4AWdxTAgUSzjFkcYF9tLQkZtJSN20cS8JMOgoBBOQJkMU9JVAg4RxDFhfYR0tLYiYtddPGsSTMpKMQQECewGwWv\/POO9tdGLnHU0UKJJxjmMkiG8K+PTPJEEgTSJhJRyGAgDyBO++8kyzuKWkCCecYsri0JhpbDzNprKEGDidhJh2FAALyBMjinhIokHCOIYsL7KOlJTGTlrpp41gSZtJRCCAgT4As7imBAgnnGLK4wD5aWhIzaambNo4lYSYdhQAC8gTI4p4SKJBwjiGLC+yjpSUxk5a6aeNYEmbSUQggIE+ALO4pgQIJ5xiyuMA+WloSM2mpmzaOJWEmHYUAAvIEyOKeEiiQcI4hiwvso6UlMZOWumnjWBJm0lEIICBPgCzuKYECCecYsrjAPlpaEjNpqZs2jiVhJh2FAALyBMjinhIokHCOIYsL7KOlJTGTlrpp41gSZtJRCCAgT4As7imBAgnnGLK4wD5aWhIzaambNo4lYSYdhQAC8gTI4p4SKJBwjiGLC+yjpSUxk5a6aeNYEmbSUQggIE+ALO4pgQIJ5xiyuMA+WloSM2mpmzaOJWEmHYUAAvIEZGXxwcHB0dFRP19TU1ODg4Pzn83+e2pqqlQqTU1NZZ8s9HGpVBodHZ2amiqXywlvVCqVJicnwwsnJiZKlcoeY3afo6OjYYNSqTQxMRG+NDIyEp6M+8m+xOrjhHNMQVmcmWQmw58yZrLFdxu+T7bAKe5LCTPpKAQQkCcgLotnw2t9Fh8ZGfE9rMlKlcvltP8ACC8MGTr8V0RY++DgYMNgPTo6GiN42LJcLofgPjk5WfOfJWEDq\/9MOMcUl8WZyeyYMZMudzGT2clp9pjvk81kFn0+4fukoxBAQJ6AuCw+MTERQ2d9Fm8YYb3ImpqaGqlUWHO5UmGlMc3ULHxkZKTmAAcHB+P\/BGiW4Gt2YuPThHNMcbmHmcwOFTPpchczmZ2cho\/5PtmQJeeTCd8nHYUAAvIExGXxqamp0dHRcENIzOLxQbhNJYT1ycnJkZGRcF\/HyMhIuPBcKpXizSTxmXhVO+w5bBPvGMle9QxXaEqlUrgAn71pxM9X\/F\/28VaThik5LCnG6\/jAex9WPr+\/hX\/H21HCu2eP2ntff9V84ZXmHiWcY4rLPcxk\/BPBTLp2ipkM966E7098n+z69+mE75PtzC\/bIoBAjwQkZnHvfUjP8cQfH9Rk8Xhf9WCl4g3lvlLxRBguvYQ4Gy+6h22yybhcLje7ByZe1R4cHIy3kYyMjITcX3+OidvHCB4fZN8xrqHmweDgYLlczh41WdwtVrHdNZgdfhovAzOTzORiM1j7dWbSe8\/3yQ6\/BbV4OVm89o8cnyOgU0BoFp+YmAjXlUN0zqbS+Dh7dTl7zTiEp8nJyXgBOzyoj7ODg4PhSyGCZ+Oyr1T2ynp9EMkuIGwf\/pl9Pu4zPshm8bjCmltTwh7ikYbdZo8x+3YmHyecY4rOPcxk9o8kM+lyFDOZ\/XZX852K75M1IAmfJnyfzDG2bIIAAr0WEJrFw9WU+AOL2VQaH2e\/lWdzaszi9Re5azYLCTjuJxuXay6xh+vc8a19pSYnJ+NtKuGZ8M94q0mM2hMTE\/HGG+99vGqefVX2cVxSvLvGex8v0Ga3tPo44RxTdO5hJsMfKGbS5S5mMmRxvk8W9I064ftk7uFlQwQQ6J2A3Cwegni8pSQmgHK5nL1f3FeqJmSHn3fM3gjeYrPR0dEQMmruUckm73DTSAjE2XtUwuP6e1TC28X0Fk5I8VgWTdXxTpiY4GM6j3u2\/SDhHNOD3MNMhv+5FG7NYibdYsVMhu+BfJ8s6Nt1wvfJxWaWryOAQB8E5Gbxmtu7409Vjo6O5szi2dtUwoWZbGTP7jBeQY8\/rBmeiVe4YyYO97KHC97xh0TzZPFwOTy8MKZ5X13xOnrcc0j\/4fnqbY1\/lnCO6UHuYSbD2MWbu4xPYfXhMZN8n6yeiP5\/ljCTjkIAAXkCsrK4F1AhjgtYyJJeQsI5pqAsLqENzKSELjCT2S4wk1mNfj1OmElHIYCAPAGyuK+v8Bdt1j\/PMz0TSDjHGM7i4Xp8\/E3zPesCb5QVYCazGsxkjUZfPk2YSUchgIA8AbK4z1b4xSnxxu7sl3jcS4GEc4zVLM5M9nLwWrwXMxlxmMlI0d8HCTPpKAQQkCdAFveUQIGEc4zVLC6wO0tzSczk0uy75KNOmElHIYCAPAGyuKcECiScY8jiAvtoaUnMpKVu2jiWhJl0FAIIyBMgi3tKoEDCOYYsLrCPlpbETFrqpo1jSZhJRyGAgDwBsrinBAoknGPI4gL7aGlJzKSlbto4loSZdBQCCMgTIIt7SqBAwjmGLC6wj5aWxExa6qaNY0mYSUchgIA8AbK4pwQKJJxjyOIC+2hpScykpW7aOJaEmXQUAgjIEyCLe0qgQMI5hiwusI+WlsRMWuqmjWNJmElHIYCAPAGyuKcECiScY8jiAvtoaUnMpKVu2jiWhJl0FAIIyBMgi3tKoEDCOYYsLrCPlpbETFrqpo1jSZhJRyGAgDwBsrinBAoknGPI4gL7aGlJzKSlbto4loSZdBQCCMgTIIt7SqBAwjmGLC6wj5aWxExa6qaNY0mYSUchgIA8AbK4pwQKJJxjyOIC+2hpScykpW7aOJaEmXQUAgjIEyCLe0qgQMI5hiwusI+WlsRMWuqmjWNJmElHIYCAPAGyuKcECiScY8jiAvtoaUnMpKVu2jiWhJl0FAIIyBMgi3tKoEDCOYYsLrCPlpbETFrqpo1jSZhJRyGAgDwBsrinBAoknGPI4gL7aGlJzKSlbto4loSZdBQCCMgTIIt7SqBAwjmGLC6wj5aWxExa6qaNY0mYSUchgIA8AbK4pwQKJJxjyOIC+2hpScykpW7aOJaEmXQUAgjIEyCLe0qgQMI5hiwusI+WlsRMWuqmjWNJmElHIYCAPAGyuKcECiScY8jiAvtoaUnMpKVu2jiWhJl0FAIIyBNQk8VHR0c9tWQEEs4xvc\/izOSSmcfZA2Uml1S7VRxswkw6CgEE5AnMZvE77rij3YUVlHsGBwdL8zUxMeHna\/65UvbJ+S\/O\/ntiYmJwcDA8Mzk5GbcfGRkJT05MTIQna\/JTuVyOG4cH3vuGe8i+HY+LFkg4xzCTRTdlie+fmcx+q+T7pIQ\/Dgkz6SgEEJAncMcdd8jK4lNTU977qampUqkUHo+MjExOTo6Ojk5NTTXL4oOV8pWanJyMETw+E4Pa4OBgs52UKxXOMTV7CPvhnz0TSDjHxBZ3d5GDg4PMZHdJle6NmQyN4\/uknAFOmElHIYCAPAGhWdx7PzIyEjJQuOBdcz3bZyqcG+J18YmJiZqN48kjXEGv+WrcUwxz9XuI2\/CgNwIJ55jYvu6uMGZxZrK7sOr2xkyGlsU\/aHyf7PsMJ8ykoxBAQJ6A0Cw+OTkZs\/Xo6OjIyEizAD01NRVSe9w+3o4Sr6xns3j9VXNfqYmJiXK5HB\/H\/xsb\/nsgPM8\/eyaQcI6JEaG7i4xZnJnsLqy6vTGT4VoG3yfljG7CTDoKAQTkCYjL4iEE19wiMjo6Wio1vlk8RKWpqamYxf18lcvl8GS4\/zs8PVKp+U0W\/h0j18JT3sc9ZJ\/kcQ8EEs4xxWVxZrIHHZf\/Fsyk957vk6IGNWEmHYUAAvIExGXxcB06XtL28zU6Ojo4OBgvyYSnR0dHw83fDbN49swRf0YzXGWf3+vcv5tdLM\/uoeYlfFqoQMI5prgszkwW2mstO2cm+T4pbVYTZtJRCCAgT0BoFp+YmKi\/NF4TuMPPd8abScIDX131V3Gy96vEbcvlcrMf6KzfQ3wVD4oTSDjHFJ3Fmcni2q1iz8wk3yelDWrCTDoKAQTkCQjN4uGC9OTkpK\/cKOK9D5fAawK6n6+amB6eLpfLNduH+D7\/ooV\/Nwvc9XtYeA2PihRIOMcUncWZySIbrmDfzCTfJ6WNacJMOgoBBOQJyM3i4UcwQwoP17zr7wj385XN4uHm8lKpFLfPXkGPP4sZf09L+Fs85vc0++\/6PWS\/yuMeCCScY3qQxZnJHrRe7FswkzV\/xPg+2fdZTZhJRyGAgDwBWVncN69mv0el+SsW+UrNJfNFtubLvRVIOMfUBIUerJeZ7AGynLdgJuX0gpUEgYSZdBQCCMgTUJPFfVdrcnKy5sdAu7p7dtapQMI5pvdZvNODrH49M1ntIe4zZlJcS5b8ghJm0lEIICBPYIlmcU\/JFkg4x2jP4rIbwuo8M8kQSBNImElHIYCAPAGyuKcECiScY8jiAvtoaUnMpKVu2jiWhJl0FAIIyBMgi3tKoEDCOYYsLrCPlpbETFrqpo1jSZhJRyGAgDwBsrinBAoknGPI4gL7aGlJzKSlbto4loSZdBQCCMgTmM3iu3fvbndhpVLp3LlznkKgAIFz584lnGOYyQJawS7nBJhJRkGaQNpMOgoBBOQJJGbxgYGBo0ePegqBAgSOHj06MDDg2ixmsoBWsMs5AWaSUZAmkDaTjkIAAXkCiVl8aGjo4MGDnkKgAIGDBw8ODQ25NouZLKAV7HJOgJlkFKQJpM2koxBAQJ5AYha\/9NJL9+zZ4ykEChDYs2fPZZdd5tosZrKAVrDLOQFmklGQJpA2k45CAAF5AolZfOPGjWNjY55CoACBsbGxjRs3ujaLmSygFexyToCZZBSkCaTNpKMQQECeQGIW37p167p16zyFQAEC69at27p1q2uzmMkCWsEu5wSYSUZBmkDaTDoKAQTkCSRm8enp6WXLlp04ccJTCHRV4MSJE8uWLZuennZtFjPZ1T6wswUBZnLBgkcyBJJn0lEIICBPIDGLO+fWr18\/Pj7uKQS6KjA+Pr5+\/XqXVMxkV1vBzuYEmElGQZpAJzPpKAQQECaQnsXHxsaGh4c9hUBXBYaHh8fGxlxSMZNdbQU7mxNgJhkFaQKdzKSjEEBAmEB6FnfODQ0N7d6921MIdElg9+7dCb\/N0GWKmexSK9jNnAAzyShIE+h8Jh2FAAKSBDrK4uPj40NDQ55CoEsCQ0ND4+PjroNiJrvUCnYzJ8BMMgrSBDqfSUchgIAkgY6yuHNueHj4pptu8hQCHQvcdNNNw8PDruNiJjtuBTuYE2AmGQVpAt2aSUchgIAYgU6z+IEDB5YvX753715PIdCBwN69e5cvX37gwAHXcTGTHfSBly4IMJMLFjySIdDFmXQUAgiIEeg0izvnduzYsXz58iNHjngKgSSBI0eOLF++fMeOHa5LxUwm9YEXLQgwkwsWPJIh0PWZdBQCCMgQ6EIWd85t2bLl\/PPPJ457qn2BI0eOnH\/++Vu2bOnunwhmsv1W8Io5AWaSUZAmUNBMOgoBBAQIdCeLO+fK5TI3q3iqTYHwv1zL5XIRfxaYyTa7weazAswkcyBNoNCZdBQCCPRbYPfu3aXdu3d3ZRnhxoAbb7zRUwjkELjxxhu7e2uKqytmMkcf2GRBgJlcsOCRDIEezKSjEECgrwLdzOLOuQMHDgwPD\/M7nj3VUiD8ftzh4eGu\/LBm6z9BzGTLVvDFOQFmklGQJtDLmXQUAgj0T6DLWTwcSPgdz8PDw+Pj4ydOnPAUAhWBEydOjI+Ph\/9a6\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\/rB4BBBBAAAEEEEBArwBZXG\/vWDkCCCCAAAIIIICAboHZLL5r1y7dB8HqEUAAAQQQQAABBBBQKLBr1y6yuMK+sWQEEEAAAQQQQAAB\/QJkcf095AgQQAABBBBAAAEEdAqQxXX2jVUjgAACCCCAAAII6Bcgi+vvIUeAAAIIIIAAAgggoFOALK6zb6waAQQQQAABBBBAQL8AWVx\/DzkCBBBAAAEEEEAAAZ0CZHGdfWPVCCCAAAIIIIAAAvoFyOL6e8gRIIAAAggggAACCOgUIIvr7BurRgABBBBAAAEEENAvQBbX30OOAAEEEEAAAQQQQECnAFlcZ99YNQIIIIAAAggggIB+AbK4\/h5yBAgggAACCCCAAAI6BcjiOvvGqhFAAAEEEEAAAQT0C5DF9feQI0AAAQQQQAABBBDQKTCbxXfu3Klz8awaAQQQQAABBBBAAAHFAjt37iSLK+4fS0cAAQQQQAABBBDQK0AW19s7Vo4AAggggAACCCCgW4Asrrt\/rB4BBBBAAAEEEEBArwBZXG\/vWDkCCCCAAAIIIICAbgGyuO7+sXoEEEAAAQQQQAABvQJkcb29Y+UIIIAAAggggAACugXI4rr7x+oRQAABBBBAAAEE9AqQxfX2jpUjgAACCCCAAAII6BYgi+vuH6tHAAEEEEAAAQQQ0CtAFtfbO1aOAAIIIIAAAgggoFuALK67f6weAQQQQAABBBBAQK8AWVxv71g5AggggAACCCCAgG4Bsrju\/rF6BBBAAAEEEEAAAb0CZHG9vWPlCCCAAAIIIIAAAroFyOK6+8fqEUAAAQQQQAABBPQKkMX19o6VI4AAAggggAACCOgWIIvr7h+rRwABBBBAAAEEENArQBbX2ztWjgACCCCAAAIIIKBbgCyuu3+sHgEEEEAAAQQQQECvAFlcb+9YOQIIIIAAAggggIBuAbK47v6xegQQQAABBBBAAAG9AmRxvb1j5QgggAACCCCAAAK6BcjiuvvH6hFAAAEEEEAAAQT0CpDF9faOlSOAAAIIIIAAAgjoFiCL6+4fq0cAAQQQQAABBBDQK0AW19s7Vo4AAggggAACCCCgW4Asrrt\/rB4BBBBAAAEEEEBArwBZXG\/vWDkCCCCAAAIIIICAbgGyuO7+sXoEEEAAAQQQQAABvQJkcb29Y+UIIIAAAggggAACugXI4rr7x+oRQAABBBBAAAEE9AqQxfX2jpUjgAACCCCAAAII6BYgi+vuH6tHAAEEEEAAAQQQ0CtAFtfbO1aOAAIIIIAAAgggoFuALK67f6weAQQQQAABBBBAQK8AWVxv71g5AggggAACCCCAgG4Bsrju\/rF6BBBAAAEEEEAAAb0CZHG9vWPlCCCAAAIIIIAAAroFyOK6+8fqEUAAAQQQQAABBPQKkMX19o6VI4AAAggggAACCOgWIIvr7h+rRwABBBBAAAEEENArQBbX2ztWjgACCCCAAAIIIKBbgCyuu3+sHgEEEEAAAQQQQECvAFlcb+9YOQKTjDcGAAAGzklEQVQIIIAAAggggIBuAbK47v6xegQQQAABBBBAAAG9AmRxvb1j5QgggAACCCCAAAK6BcjiuvvH6hFAAAEEEEAAAQT0CpDF9faOlSOAAAIIIIAAAgjoFiCL6+4fq0cAAQQQQAABBBDQK0AW19s7Vo4AAggggAACCCCgW4Asrrt\/rB4BBBBAAAEEEEBArwBZXG\/vWDkCCCCAAAIIIICAbgGyuO7+sXoEEEAAAQQQQAABvQJkcb29Y+UIIIAAAggggAACugXI4rr7x+oRQAABBBBAAAEE9AqQxfX2jpUjgAACCCCAAAII6BYgi+vuH6tHAAEEEEAAAQQQ0CtAFtfbO1aOAAIIIIAAAgggoFuALK67f6weAQQQQAABBBBAQK8AWVxv71g5AggggAACCCCAgG4Bsrju\/rF6BBBAAAEEEEAAAb0CZHG9vWPlCCCAAAIIIIAAAroFyOK6+8fqEUAAAQQQQAABBPQKkMX19o6VI4AAAggggAACCOgWIIvr7h+rRwABBBBAAAEEENArQBbX2ztWjgACCCCAAAIIIKBbgCyuu3+sHgEEEEAAAQQQQECvAFlcb+9YOQIIIIAAAggggIBuAbK47v6xegQQQAABBBBAAAG9AmRxvb1j5QgggAACCCCAAAK6BcjiuvvH6hFAAAEEEEAAAQT0CpDF9faOlSOAAAIIIIAAAgjoFiCL6+4fq0cAAQQQQAABBBDQK0AW19s7Vo4AAggggAACCCCgW4Asrrt\/rB4BBBBAAAEEEEBArwBZXG\/vWDkCCCCAAAIIIICAbgGyuO7+sXoEEEAAAQQQQAABvQJkcb29Y+UIIIAAAggggAACugXI4rr7x+oRQAABBBBAAAEE9AqQxfX2jpUjgAACCCCAAAII6BYgi+vuH6tHAAEEEEAAAQQQ0CtAFtfbO1aOAAIIIIAAAgggoFuALK67f6weAQQQQAABBBBAQK8AWVxv71g5AggggAACCCCAgG4Bsrju\/rF6BBBAAAEEEEAAAb0CZHG9vWPlCCCAAAIIIIAAAroFyOK6+8fqEUAAAQQQQAABBPQKkMX19o6VI4AAAggggAACCOgWIIvr7h+rRwABBBBAAAEEENArQBbX2ztWjgACCCCAAAIIIKBbYNeuXaWdO3fqPghWjwACCCCAAAIIIICAQgGyuMKmsWQEEEAAAQQQQAABEwJkcRNt5CAQQAABBBBAAAEEFAqQxRU2jSUjgAACCCCAAAIImBAgi5toIweBAAIIIIAAAgggoFCALK6waSwZAQQQQAABBBBAwIQAWdxEGzkIBBBAAAEEEEAAAYUCZHGFTWPJCCCAAAIIIIAAAiYEyOIm2shBIIAAAggggAACCCgUIIsrbBpLRgABBBBAAAEEEDAhQBY30UYOAgEEEEAAAQQQQEChAFlcYdNYMgIIIIAAAggggIAJAbK4iTZyEAgggAACCCCAAAIKBcjiCpvGkhFAAAEEEEAAAQRMCJDFTbSRg0AAAQQQQAABBBBQKLBz587Szp07Fa6cJSOAAAIIIIAAAgggoFuALK67f6weAQQQQAABBBBAQK8AWVxv71g5AggggAACCCCAgG4Bsrju\/rF6BBBAAAEEEEAAAb0CZHG9vWPlCCCAAAIIIIAAAroFyOK6+8fqEUAAAQQQQAABBPQKzGbxXbt26T0AVo4AAggggAACCCCAgFKB2d8vThZX2jyWjQACCCCAAAIIIKBaYDaL33HHHdPT06oPg8UjgAACCCCAAAIIIKBLYHp6+s477yzde++9P\/rRj3QtndUigAACCCCAAAIIIKBa4Ic\/\/OG9995bevjhhx999FHVR8LiEUAAAQQQQAABBBDQJfDoo48+\/PDDpQMHDtxxxx3PPfecrtWzWgQQQAABBBBAAAEElAo899xzd9xxx4EDB0pPPPHE\/v37H3nkEaVHwrIRQAABBBBAAAEEENAl8EilnnjiidKTTz752GOP7du375FHHvnZz36m6zBYLQIIIIAAAggggAACigSee+65Rx55ZO\/evY899tiTTz5ZOnTo0OOPP\/7oo49+5zvf2bVr1\/e\/\/\/1nnnnm+eefV3RILBUBBBBAAAEEEEAAAckCzz\/\/\/A9\/+MPvf\/\/7u3bt+s53vvPoo48+8cQThw4dmr0u\/vjjjz\/22GOPPvrod7\/73QceeODuu++emJjYvn37+Pj41sXqm92o22XUbQLq6zLqv1AZga9SGYGvUAgg0BOBzB873Q+\/1nFlvh\/386GM83N3VtF53pER3G7vRgjtwj4WC8tbx8fHt2\/fvmPHjrvvvvvb3\/72d7\/73UcfffSxxx57\/PHHDx069P8BowR\/Q3NqDawAAAAASUVORK5CYII=\" alt=\"\"><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/adrianosantos.link\/treinamentos\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"150\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/02\/Banner-Hotmart-1.png\" alt=\"\" class=\"wp-image-222\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/02\/Banner-Hotmart-1.png 800w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/02\/Banner-Hotmart-1-300x56.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/02\/Banner-Hotmart-1-768x144.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<p>Agora \u00e9 claro, os valores v\u00e3o se repetir. Esses valores poderiam vir de uma tabela do banco, ent\u00e3o ter\u00edamos um loop simples e uma codifica\u00e7\u00e3o muito parecida com:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >  DM.QryProdutos.First;\n  while not DM.QryProdutos.EOF do\n  begin\n\n    FlowLayout1\n      .AddObject(\n        TCard.Create(nil)\n        .Nome(DM.QryProdutos.FieldByName('Nome').AsString)\n        .Numeracao(DM.QryProdutos.FieldByName('Numeracao').AsString)\n        .Valor(DM.QryProdutos.FieldByName('Valor').AsFloat)\n        .New\n      );\n\n    DM.QryProdutos.Next;\n  end;<\/pre><\/div>\n\n\n\n<p>Perfeito. Agora vamos fazer uma \u00faltima altera\u00e7\u00e3o, o restante deixo pra voc\u00ea personalizar. Vamos alterar a imagem, beleza? Eu procurei aleatoriamente fotos de t\u00eanis na internet, peguei apenas 04 imagens. N\u00e3o me preocupei muito com a apar\u00eancia das fotos, o objetivo central \u00e9 entender como podemos adicionar uma foto no TImage do card. <\/p>\n\n\n\n<p>Essas fotos coloquei dentro de um TImageList no form principal. N\u00f3s faremos um loop pra criar 04 cards na tela e exibir os t\u00eanis da nossa loja virtual. Certo?<\/p>\n\n\n\n<p>Bom, agora v\u00e1 at\u00e9 o card e vamos adicionar um novo m\u00e9todo <code>function Imagem(const AImage: TBitmap): TCard;<\/code>. F\u00e1cil assim. J\u00e1 imaginou o c\u00f3digo n\u00e9? Vamos l\u00e1?<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >function TCard.Imagem(const AImagem: TBitmap): TCard;\nbegin\n  Image1.Bitmap.Assign(AImagem);\n  Result := Self;\nend;<\/pre><\/div>\n\n\n\n<p>Pronto, agora s\u00f3 voltar ao formul\u00e1rio principal e melhorar nosso c\u00f3digo. Como sabemos que temos 04 imagens no ImageList, vamos fazer um <code>for I <\/code>e criar valores aleat\u00f3rios pra preecher os cards.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >...\nuses\n   System.Math;\n...\n\nprocedure TMain.Button1Click(Sender: TObject);\nvar\n  I: Integer;\n  LValor: Double;\n  LAno: Integer;\n\nbegin\n  Randomize;\n  for I := 0 to 3 do\n  begin\n    LValor := Random(500);\n    FlowLayout1\n      .AddObject(\n        TCard.Create(nil)\n          .Nome(Format('T\u00eanis Nike Classic Ano: %d', [RandomRange(1999, 2010)]))\n          .Numeracao('40-50')\n          .Valor(RandomRange(230, 480))\n          .Imagem(ImageList1.Bitmap(TSizeF.Create(200, 200), I))\n          .New\n        );\n  end;\nend;<\/pre><\/div>\n\n\n\n<p>Perfeito. Explicando um pouco o c\u00f3digo. Fizemos um for de 0 a 3 para pegar todas as imagens que est\u00e3o no ImageList. Criei um rand\u00f4mico pra simular pre\u00e7os de diferentes de t\u00eanis, usamos a fun\u00e7\u00e3o <strong>RandomRange<\/strong> da unit <strong>System.Math<\/strong> do Delphi. Fizemos a mesma coisa com o ano de fabrica\u00e7\u00e3o, simulando fabrica\u00e7\u00f5es diferentes de t\u00eanis classicos.<\/p>\n\n\n\n<p>As \u00fanicas altera\u00e7\u00f5es que fizemos no Card foram melhorar as margens entre os labels para que n\u00e3o ficassem encavalados e aumentamos a altura do label do nome do cal\u00e7ado. Olha o resultado abaixo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"905\" height=\"703\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-4.png\" alt=\"\" class=\"wp-image-682\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-4.png 905w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-4-300x233.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-4-768x597.png 768w\" sizes=\"(max-width: 905px) 100vw, 905px\" \/><\/figure>\n\n\n\n<p>Aqui clicamos duas vezes no bot\u00e3o para simular 08 pares de t\u00eanis dispon\u00edveis. Lembrando mais uma vez que poder\u00edamos trazer esses dados de uma tabela no banco, o que daria ainda mais credibilidade ao exemplo. Deixarei essa etapa para o leitor fazer seus pr\u00f3prios testes.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>O que mais podemos fazer?<\/strong><\/p>\n\n\n\n<p>Eu sei, eu sei. Deve estar pensando? Mas, e como interajo com esses cards? Como posso colocar um bot\u00e3o que realiza alguma opera\u00e7\u00e3o como &#8220;Comprar&#8221; o t\u00eanis por exemplo? Vejamos se consigo te ajudar rs. \u00c9 relativamente simples fazer isso, s\u00f3 precisamos criar uma fun\u00e7\u00e3o que receba um Evento, associar a um bot\u00e3o e bingo, tudo certinho. Vamos ao trabalho. <\/p>\n\n\n\n<p>Acesse o Card, adicione um bot\u00e3o na parte inferior do Card e crie um m\u00e9todo assim:<\/p>\n\n\n\n<p><code>function OnClickComprar(const AEvent: TNotifyEvent: TCard;<\/code><\/p>\n\n\n\n<p>O c\u00f3digo ser\u00e1 como abaixo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >function TCard.OnClickComprar(const AEvent: TNotifyEvent): TCard;\nbegin\n  if Assigned(AEvent) then\n    Button1.OnClick := AEvent;\n\n  Result := Self;\nend;<\/pre><\/div>\n\n\n\n<p>F\u00e1cil de entender. Caso o m\u00e9todo tenha recebido um evento v\u00e1lido, associamos ele ao evento OnClick do bot\u00e3o.<\/p>\n\n\n\n<p>Agora retorne ao formul\u00e1rio principal. Precisamos criar o evento OnClick para ser repassado como par\u00e2metro. V\u00e1 at\u00e9 a se\u00e7\u00e3o public e inclua o m\u00e9todo <code>procedure DoClickComprar(Sender: TObject);<\/code> e pressione <strong><em>Ctrl + Shift + C<\/em><\/strong> pra criar o escopo. O m\u00e9todo novo e a altera\u00e7\u00e3o do c\u00f3digo do bot\u00e3o est\u00e3o na listagem abaixo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >procedure TMain.Button1Click(Sender: TObject);\nvar\n  I: Integer;\n  LValor: Double;\n  LAno: Integer;\n\nbegin\n  Randomize;\n  for I := 0 to 3 do\n  begin\n    LValor := Random(500);\n    FlowLayout1\n      .AddObject(\n        TCard.Create(nil)\n          .Nome(Format('T\u00eanis Nike Classic Ano: %d', [RandomRange(1999, 2010)]))\n          .Numeracao('40-50')\n          .Valor(RandomRange(230, 480))\n          .Imagem(ImageList1.Bitmap(TSizeF.Create(200, 200), I))\n          .OnClickComprar(DoClickComprar)\n          .New\n        );\n  end;\nend;\n\nprocedure TMain.DoClickComprar(Sender: TObject);\nbegin\n  ShowMessage('Clicou em comprar');\nend;<\/pre><\/div>\n\n\n\n<p>No c\u00f3digo do bot\u00e3o adicionamos a chamada <code>.OnClickComprar(DoClickComprar)<\/code> passando pra ele o nosso novo evento. E o c\u00f3digo desse evento apenas faz um <code>ShowMessage<\/code>. Execute a aplica\u00e7\u00e3o e veja o resultado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"902\" height=\"418\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-5.png\" alt=\"\" class=\"wp-image-683\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-5.png 902w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-5-300x139.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-5-768x356.png 768w\" sizes=\"(max-width: 902px) 100vw, 902px\" \/><\/figure>\n\n\n\n<p>Tenho certeza que vai me pedir para saber como identificar em &#8220;qual card&#8221; clicamos. Isso tamb\u00e9m \u00e9 f\u00e1cil, basta criarmos um identificador \u00fanico que pode ser a chave prim\u00e1ria da tabela ou qualquer outro identificador. Vamos adicionar isso no Card na propriedade Tag de um dos objetos, assim podemos fazer um TypeCast e descobrir qual o &#8220;dono&#8221; do bot\u00e3o clicado e consequentemente descobrir o ID dele.<\/p>\n\n\n\n<p>Volte no Card e adicione uma fun\u00e7\u00e3o para receber o ID. Assim:<\/p>\n\n\n\n<p><code>function ID (const AID: Integer): TCard;<\/code><\/p>\n\n\n\n<p>Onde teremos a seguinte codifica\u00e7\u00e3o:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >function TCard.ID(const AID: Integer): TCard;\nbegin\n  LytCard.Tag := AID;\n  Result := Self;\nend;<\/pre><\/div>\n\n\n\n<p>Na propriedade TAG do LytCard vamos armazenar o ID. Para alimentar esse ID, retorne ao c\u00f3digo do bot\u00e3o na tela principal e inclua <code>.ID(I)<\/code>, assim n\u00f3s vamos passar o valor de &#8220;i&#8221; para o ID, como se ele fosse a chave prim\u00e1ria. Agora vai ficar f\u00e1cil identificar.<\/p>\n\n\n\n<p>No c\u00f3dido do evento <code>DoClickComprar <\/code>teremos apenas que fazer alguns <code>Typecasts <\/code>pra chegar at\u00e9 o &#8220;dono&#8221; do componente TButton no Card, que nesse caso \u00e9 o LytCard e nele vamos acessar o ID. De posse dessa informa\u00e7\u00e3o, ficaria f\u00e1cil fazer um Select no banco, excluir o registro entre outras coisas. Modifique o c\u00f3digo do evento conforme abaixo.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >  ShowMessage('T\u00eanis selecionado ID: ' + TLayout(TButton(Sender).Parent).Parent.Tag.ToString);<\/pre><\/div>\n\n\n\n<p>O resultado \u00e9 bem interessante. Colocamos o ShowMessage mostrando o ID respectivo ao bot\u00e3o clicado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"985\" height=\"664\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-6.png\" alt=\"\" class=\"wp-image-684\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-6.png 985w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-6-300x202.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/06\/image-6-768x518.png 768w\" sizes=\"(max-width: 985px) 100vw, 985px\" \/><\/figure>\n\n\n\n<p>\u00c9 claro que h\u00e1 muita tarefa a ser realizada para melhorar nosso exemplo, mas creio que com essa base voc\u00ea ser\u00e1 capaz de criar seus pr\u00f3prios componentes e seguir em frente em seus estudos.<\/p>\n\n\n\n<p>Assista a esses dois v\u00eddeos complementares:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Componentizando o Aplicativo Firemonkey\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/esfEFWnkS54?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Componetizando o software na VCL\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/jr8LHdFQQMo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"has-large-font-size\"><strong>Conclus\u00e3o<\/strong><\/p>\n\n\n\n<p>A componentiza\u00e7\u00e3o \u00e9 algo extremamente ben\u00e9fico pois facilita e centraliza toda intelig\u00eancia do componente em um \u00fanico lugar. \u00c9 pr\u00e1tico e altamente personaliz\u00e1vel. <\/p>\n\n\n\n<p>O que achou do conte\u00fado? Deixe suas perguntas e coment\u00e1rios abaixo.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Comunidade no <a href=\"https:\/\/t.me\/AdrianoSantosCommunity\">Telegram<\/a><\/p>\n\n\n\n<p>\ud83d\ude80Comente no campo abaixo \ud83d\udc47\ud83d\udc47\ud83d\udc47 o que achou e qual sua d\u00favida.<\/p>\n\n\n\n<p>Te vejo na pr\u00f3xima<\/p>\n\n\n\n<p>Adriano Santos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das t\u00e9cnicas que mais utilizo dentro de aplicativos m\u00f3veis e quando necess\u00e1rio tamb\u00e9m em aplica\u00e7\u00f5es VCL \u00e9 a: componentiza\u00e7\u00e3o. Essa t\u00e9cnica \u00e9 simples, muito pr\u00e1tica e abre um leque de possibilidades. Tamb\u00e9m \u00e9 interessante porque melhora muito a limpeza do c\u00f3digo-fonte, deixando parte da intelig\u00eancia do software no componente, muito mais f\u00e1cil de dar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":686,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-670","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=670"}],"version-history":[{"count":10,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/670\/revisions"}],"predecessor-version":[{"id":688,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/670\/revisions\/688"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/686"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}