π
<-
Chat plein-écran
[^]

img2calc: des scripts Python encore plus petits

img2calc: des scripts Python encore plus petits

Message non lude critor » 08 Jan 2022, 22:07

13917Dans une série d'articles précédents nous te présentions img2calc, notre service en ligne gratuit sur TI-Planet te permettant de convertir tes images pour tes projets sur calculatrices.

Un large choix de formats cible t'était proposé :
  • fichiers à appeler depuis tes programmes en langage Basic :
    • .g3p pour Casio Graph 90+E et fx-CG50/20/10
    • .c2p pour Casio fx-CP400 et fx-CG500
    • .8ca ou .8ci pour TI-83 Premium CE, TI-84 Plus CE et TI-84 Plus C Silver Edition
    • .8xi pour les TI-83 Plus (compatible TI-82 Advanced, TI-82 Plus et TI-84 Plus monochromes),
    • .83i pour les TI-83 (compatible TI-82 Stats et TI-76.fr)
    • .82i pour les autres TI-82
    • .86i pour les TI-86
    • .85i pour les TI-85
    • .73i pour les TI-73
  • fichiers à appeler depuis tes scripts en langage Python :
    • IM8C.8xv pour les éditions Python des TI-83 Premium CE et TI-84 Plus CE
  • scripts Python pour les différentes bibliothèques graphiques des calculatrices :
    • ti_draw (TI-Nspire CX II)
    • graphic (TI-Nspire CX II avec KhiCAS, TI-Nspire CX avec KhiCAS et NumWorks avec KhiCAS)
    • nsp (TI-Nspire avec Micropython)
    • ti_graphics (TI-83 Premium CE et TI-84 Plus CE éditions Python)
    • casioplot (Casio Graph 90/35+E II, fx-9750/9860GIII et fx-CG50)
    • hpprime (HP Prime)
    • kandinsky (NumWorks)
Nous revenons aujourd'hui sur ce dernier point, soit les images converties en scripts Python pour ta calculatrice.

Rappelons que les interpréteurs Python de nos calculatrices font appel à 3 types de mémoires :
  • La mémoire de stockage qui comme son nom l'indique stocke physiquement tes fichiers de scripts Python.
  • La pile (stack) qui référence, à l'exécution, les objets Python créés par tes scripts. Sa capacité limite donc le nombre d'objets Python pouvant coexister simultanément en mémoire.
  • Le tas (heap) qui reçoit, à l'exécution, le contenu des objets Python créés. Il limite donc la taille globale utilisée pour les données de ces différents objets.

Voici quelques consommations heap valides pour les plateformes 32 bits que sont à ce jour nos calculatrices :
  • pour un entier : 24 octets de base + 4 octets si non nul + 4 octets pour chaque groupe de 30 bits utilisés au-delà des premiers 31 bits dans sa représentation binaire
  • pour une liste : 56 octets de base + 8 octets par élément + les tailles de chaque élément
  • pour un tuple : 40 octets de base + 8 octets par élément + les tailles de chaque élément
  • pour une chaîne : 49 octets de base + 1 octet par caractère
  • pour un bytes : 33 octets de base + 1 octet par octet
Comme tu peux le constater le langage Python a le très gros défaut d'être un énorme consommateur de heap, mémoire qui sera bien souvent le facteur le plus limitant pour tes projets sur calculatrices. Rappelons les plus mauvais modèles sur ce critère :
  • NumWorks avec seulement 32,5 Ko de heap
  • éditions Python des TI-83 Premium CE et TI-84 Plus CE avec encore pire 19,7 Ko de heap

Comme déjà expliqué, img2calc a justement été conçu pour minimiser la consommation de heap. Pour cela img2calc mutualise deux approches :
  • La compression de ton image au format RLE.
  • Le compactage des données, avec l'utilisation des types d'objets Python les moins gourmands en mémoire :
    • des tuples pour la palette de couleurs
    • des bytes pour les données de la compression RLE (type d'objet Python s'utilisant comme une chaîne de caractères mais optimisé pour le stockage d'octets)

Prenons un exemple simple. Supposons que tu souhaites afficher l'image 15×15 pixels ci-contre dans un de tes scripts Python sur calculatrice.

Un premier codage très naïf dit true color de ton image pourrait alors ressembler à ça :
Code: Tout sélectionner
image = [
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[054,111,159],[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,204,062],[255,204,062],[255,255,255],
[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],
[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],
[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],
[255,255,255],[054,111,159],[054,111,159],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],[255,204,062],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
]

Il s'agit donc d'une liste des couleurs de pixels, de gauche à droite puis de haut en bas, les couleurs étant codées en triplets de valeurs Rouge-Vert-Bleu, l'implémentation la plus fréquente sur calculatrices.

Ce premier codage est toutefois catastrophique en terme de consommation de mémoire heap. Il consomme à l'exécution
$mathjax$56+15\times 15\times\left(8+56+3\times\left(8+28\right)\right)$mathjax$
soit 38,756 Ko de heap, excluant donc déjà les TI-83 Premium CE, TI-84 Plus CE et même NumWorks.

Mais c'est bête donc de repréciser à chaque fois la valeur de couleur, alors qu'il n'y a ici que 3 couleurs différentes dans notre image, non ? ;)

Outre le passage aux tuples déjà évoqué, une première amélioration majeure est d'externaliser les informations de couleurs dans une palette, ce que l'on appelle une image indexée :
Code: Tout sélectionner
palette = ((255,255,255), (054,111,159), (255,204,062))

image = (
0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,
0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,0,2,2,0,
1,1,1,1,1,1,1,1,1,1,0,0,2,2,2,
1,1,1,1,0,0,0,0,0,0,0,2,2,2,2,
1,1,1,0,0,2,2,2,2,2,2,2,2,2,2,
0,1,1,0,2,2,2,2,2,2,2,2,2,2,2,
0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,
0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,
0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,
0,0,0,0,2,2,2,2,2,0,2,0,0,0,0,
0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,
)


Cela n'occupe plus que
$mathjax$40+3\times\left(8+40+3\times\left(8+28\right)\right)+40+15\times 15\times\left(8+28\right)$mathjax$
soit 8,648 Ko de heap. Notre icône est maintenant fonctionnelle sur tous les modèles ! :bj:

Et nous en arrivons maintenant à la compression RLE. Selon un parcours de l'image de gauche à droite puis de haut en bas, cette compression accompagne chaque information de couleur du nombre de pixels adjacents qui l'utilisent.

Avec notre image d'exemple, cela donne :
Code: Tout sélectionner
0(×5) 1(×5) 0(×9)
1(×1) 0(×1) 1(×5) 0(×8)
1(×7) 0(×11)
1(×4) 0(×5)
1(×10) 0(×4)
1(×11) 0(×1) 2(×2) 0(×1)
1(×10) 0(×2) 2(×3)
1(×4) 0(×7) 2(×4)
1(×3) 0(×2) 2(×10)
0(×1) 1(×2) 0(×1) 2(×11)
0(×4) 2(×10) 0(×5)
2(×4) 0(×11)
2(×7) 0(×8)
2(×5) 0(×1) 2(×1) 0(×9)
2(×5) 0(×5)


Après encodage et compactage de ces informations sur du RLE 2 bits (puisque nous avons plus de 2 couleurs mais moins de 4 couleurs), voici le code Python associé :
Code: Tout sélectionner
palette = (
(255,255,255),(55,109,157),(255,203,64),
)

image = (
b"\x10\x11\x20\x01\x00\x11\x1c\x19(\r\x10%\x0c)\x00\x06\x00%\x04\n\r\x18\x0e\t\x04&\x00\x05\x00*\x0c&\x10\x0e(\x1a\x1c\x12\x00\x02\x20\x12\x10"
)

Nous avions donc au final
$mathjax$40+3×(8+40+3×(8+28))+33+43×1×1$mathjax$
soit 584 octets de consommation heap.

Par contre, tu pouvais noter la longue écriture du bytes sur 140 caractères, et ce alors qu'il ne code que 43 octets.

En effet nombre de valeurs d'octets ne correspondent pas à des caractères affichables, et ont donc besoin d'une notation spéciale dite échappée :
  • \x10 bien que s'écrivant avec 4 caractères, ne code qu'1 octet, de valeur 10 en hexadécimal, soit 16 en décimal
  • \t, \n, et \r sont des notations plus courtes sur seulement 2 caractères codant les octets de valeurs respectives 9, 10 et 13

Cette notation pouvant nécessiter jusqu'à 4 caractères pour écrire 1 octet n'était absolument pas un problème pour la mémoire heap, mais par contre elle pouvait l'être pour la mémoire de stockage.

Prenons par exemple l'image plein écran en 16 couleurs ci-contre.

img2calc te la codait jusqu'à présent de la façon suivante :
Code: Tout sélectionner
palette = (
(215,187,149),(239,183,116),(198,122,27),(90,45,18),(190,143,18),(255,255,247),(0,0,2),(190,172,149),(231,187,99),(239,163,18),(149,105,45),(207,176,107),(73,0,0),(149,67,64),(182,114,116),(247,195,133),
)

image = (
b"\xb0\r\x11\"\x01\xb0&\xe3\x01\xf0\x00\x11\xa0$\x01C\x021\x02\xf3\x00\x01\x10\x93\x01\x01\x80#\x01c\xc1\x013\x01\x13\x91\x01\x02#\x11\x80\"\x01\xf3\x00\x02Q\x02\xf1\x00S\xb1\x01\x023\x01\xb0!\xf3\x00\x12\xa1\x02\x02#\x91\x02\x83\x01\x01\xf0\x1f\x01S\x91\x03\x131\x02a\x12\x91\x01c\x01\xa0\x1fS\x02\xf1\x00\x02\xa1\x01\x02\xf1\x00\x03a\x02\x91\x02\xf3\x00\xf0\x1eS\x91\x01\x02\xa1\x01\x02\xf1\x00\x03a\x02\xb1\x02c\x01\xb0\x1eS\x91\x02\x02\x81\x01B\x03\x02\x91\x02\x02\xd1\x01\x02#\x01\xe0\x1d\x013\xc1\x02\x02\xf1\x00R\x03\xa2\x02\x81\x023\x02\x01\xa0\x1d#\x02A\x02\xf1\x00\x02!\x02\x81\x01\x92\x01\x13\xe2\x02a\x02Q\x023\x80\x1d#\x02Q\x02\xf1\x00\x02\xa1\x01\xb2\x01\x13\x82\x02\xf3\x00\xd1\x013\xb0\x1c\x01\x00\x01#\xf1\x02\x82\x02\x13\x82\x03\x13\x02A\x02a3\x90\x1c3\xc1\x02\xd2\x02#\x92\x03\x13\x02\xc1\x01#\xe0\x1b\x01#\xa1\x02\xf2\x01\xc3\x02\x02\x04\xa2\x02\x03\x121\x02\xf1\x00\x13\x01\xc0\x04\x15\xb0\x16\x01#\x02\x81\x02\xe2\x01\x93\x02\x12S\x12\x04\x82\x02\x13\x02!\x02\x81\x01\x13\x01\xf0\x01\xf5\x00\x005`%\xc0\x015\x80\x14#!\x02A\x02\x81\x01\x92\x01S\x02\x04\x02\xf4\x00Cd\x02\xc3\x01\xe2\x01\xa1\x01\x02\x13\xe0\x01\x05V%\x16\x05\a@\x05&\x05\xb0\x01\x05\x16\x05\xe0\x13\x01\x13\x02\x81\x02\x82\x01C\x02\x84\x02#\xa4\x02\x023\xc2\x011\x12Q#\x01\xb0\x01\x05f\x15\x16%0\x05&\x05\x20\a5\x00\a\x10\x05\x16\x15\a\x05\x00\x050\a\x00\a\xf0\x00%P%P%\a\xd0\x02\x05\x00\x05\x00\x05\x80\x0b#\xf1\x01\x82\x01C\x02\xb4\x02\x13\xe4\x023\xd2\x01\xa1\x01#\xa0\x01%\x16E&5\x105\x20\x156E\x16%\x06\x00\x15\x00E\a\x15\x20\x15&\x15\x10%\x16%\a\x15&\x15`\x05\xa0\x01\x15\x16\x15\x06\x15\xd0\n#\xf1\x01\x02\x03RC\xe4\x02\x13\xe4\x02\x123\xb2\x01\xb1\x01\x13\x02\x90\x01%\x16EV\a\x05\x00\x15\x06\x15\x10\x05V5\x16\x156\x15\x16\x05&\x15\x00\a\x15F\x05\x10\x156\x15\a\x05F\x15@UP\x15f\x05\xb0\n\x01#\xe1\x01\x02\x03R3\x94\x03\x13\xa4\x03\x02#\xb2\x01\xb1\x01\x13\x01\x90\x01\x05\x16\x15\x10\x05f%&%\xf6\x00\x05\a\x05\x16\x056%\xf6\x00%f%V%V\x05@F\x05P\x05\xf6\x00\x05\a\x80\n\x01#Q\x02\xf1\x00\x13R#\xf4\x02H\x13H\xf4\x02\x02\x13\xc2\x01\x01\x02\x91\x01\x13\x80\x01\x05\x16\x15\x10\x05&\x15\x16%&\x156%\a\x15\a\x05V5&\x15&\x15&%\x16%&5\a\x05&%\a@\x056\x05@\x05&5\x16\x05\xf0\t\x01#\x02\xc1\x01\x02\x13B3\xd4\x02\x88\x01\x13h\t\b\xd4\x02#\xb2\x01\xb1\x01\x13\x01`\x05\x16\x15\x10\x05&\x15&\x15&\x15&%\x17\x05\a\x156U\x16%&\x15\x86\x01\x05\a\x0565\a&\x15P\x056\a@\x05&\x15\a\x05\x16\x05\xd0\t\x01C\xc1\x01\x02\x03RC\xa4\x02\t\xa8\x01\x13\x98\x01\xc4\x02\x02#\xb2\x01\xb1\x01\x13`\x05\x16\x15\x10\x05\x16%&\x15&\x15&\x15\a\x15\a%F\x05\a%\x16%&\x15\x86\x01\x05\a\x15&\x15\a%&\a\x050\x05FP\x05&\x05\a\x15\x16\x05\xb0\t\x013\xd1\x01\x02\x03b3\xf4\x01\x98\x019(\x138I\x88\x01\xf4\x013\x92\x01a\x12\x11\x02\x13P\x05&\x05\x10\x05\x16%&\x15&\x156%\x065\x16\x05&\x05\a\x15\x16%&\x15\x16\xc5\x01&E&\x050\x05\a6\x150\x05&5\x16\x05\x90\t\x02#\xe1\x01\x82\x013\xd4\x01\t\xb8\x01i\x18\x03(Y\xf8\x01\xa4\x01\x02\x13\xa2\x01\x91\x01#@\x05&\x05\x10\x05\x16%&\x15&%\xf6\x00%\x16\x15&\x05\a\x05\x16%&\x15&%\x16%&\x05\x16%\x16\x05&\x05`5@\x05\x86\x01\x05\xf0\b\x01#\xf1\x01\x03b3\xb4\x01\x19\xe8\x01i\x18\x13\bi\xb8\x02\x84\x01\x02\x13\x82\x01\x11\x02\xf1\x00\x13@\x05&\x05\x10\x05\x16%&\x15&\x05\x00\x15V\x15\a\x05&\x15&\x15\x16%&5F\x15\x00\x156\x15\x00\x05F\x15\x80\x02\x15f\x05\xf0\b\x13\x81\x02\x82\x01#\xb4\x01\t\x88\x02i\x18\x13\x18Y\x98\x01\t\x98\x01\x84\x01\x02\x13\x82\x01\x91\x01\x13@\x05&\x05\x10\x05\x16%&\x15&\x05\x10\x156%\x00\x05&%\x16\x15\x16\x05\x00\x05&5F\x05\x20\x056\x15\x00%\x16\x15\x90\x02%&\x05\x16\x05\xd0\b\x01\x13\x81\x01\x12A\x92\x01\x13\xb4\x01\xc8\x02Y\x18\x13\x18Y8:\xe8\x01\x84\x01\x02\x03\xf2\x00\x03\x02\xf1\x00S\x00\a%\x205\x17%\x005@E\x205\x00\a\x15\x20\x15\x20%0E@5@5\xc0\x02\xf5\x00\xd0\b\x13\xc1\x01\x02\x11\x82\x01\x13\xa4\x01\x19\xf8\x02\tH\x13\x18Y\b\x8b\x01\xe8\x01\xf4\x00\x02\x13\xf2\x00\x03Q\x02\xf3\x00\x80\x16\x13\x02\xd1\x01\xf2\x00#\xa4\x01\b\t\x98\x02\x1a\x1b\x1a\xf8\x00\x13\xf8\x00\n\xfb\x00\n\xa8\x02\t4\x02\x13\xf2\x00\x03\x02!\x02\x13A#\xf0\x15\x13\xe1\x01\xf2\x00#\x84\x01\x19\xb8\x02\x1a;\nh\x13\xf8\x00\n\xfb\x00\n\xf8\x00)\xf8\x00\x19D\x13\xf2\x00\x03\x02\x11#Q\x13\x01\xd0\x15\x13a\x02a\xf2\x00#\xf4\x00\x98\x01)\xa8\x01\x13K\nX\x13h\nk#Xi\x98\x01\t$\x02\x13bC\xf1\x00\x13\xd0\x15\x13\xc1\x01\xf2\x00#d\xa8\x01I\xa8\x01\n\x13KX\x13X\nk#\nX\xf9\x00\x98\x01\t\x14\x12\x13b\x13\x02\x91\x01\x13\x01\x90\x15\x11\x13\xb1\x01\x82\x01\x13d\t\xf8\x00\x89\x018\x1a\x03J[\nH\x13X\nk\x13\nX\x99\x01\xa8\x014\x13R\x13\x81\x01\x02\x01#\x80\x15\x023\xa1\x01\x82\x01\x13d\x88\x01\x99\x018\n\xcb\x01\nH\x13X\xfb\x00\x13\x0bX\x99\x01\xb8\x01$\x02\x0323\x02a\x12\x11\x13\xe0\x14\x01\x13\x02\x01#\x02Q\x02\x03\xf2\x00\x13d\x88\x01\xb9\x018\n\xcb\x01\nH\x13H\n+\x13\n+\n\x0bX\xa9\x01\xb8\x01\t\x14\x02S\x12\x13\x91\x01\x02\x13\xc0\x14#1#\x021\x13b#d\x98\x01\xb9\x018\n\xcb\x01\nH\x13H\n+#;\nX\xb9\x01X)(\t\x14S\"\x03\x02\xa1\x01\x03\x01\xa0\x14#Q\x02#\x11\x03\xf2\x00\x03\xf4\x00(9H\xb9\x018\n\x0b:#K\x18\t(\x03h\n\x0b#\x0b\n;\nX\xa9\x01HI(\x143R\x03\xa1\x01\x02\x03\xa0\x14#a\x02\x13\x12\x03b\x13d(\xf9\x00\x18\xb9\x018Z\x0b\x13;\n\x18\t(\x03h\x1a\x13\n\x0b\n;\nh\x89\x01HY(\t\x043\xf2\x00\xa1\x01\x03\x01\x80\x14\x13\x02\x81\x01\x02#b\x13d8i8Y\xe8\x01\x0b\x13;\nH\x13(\x14(\x1a\x0b\x18\x1a;\nX\x89\x018\xf9\x00(Sb\x01\x02\x81\x01\x02\x13\xf0\x13\x13A\x02\x01\x02!\x02#2\x13TX\xf9\x00H\t\xa8\x02\n\x0c+\x1a\x0bH\x03\x048\x19\xf8\x00\n\x1b*\x98\x01)Xi83\x04#bA\x021\x02\x13\xd0\x13\x01\x03\x02a\x02!\x03\x02#\x12\x13TX\x89\x01\x88\x03\x0b\x03\x1b\x1ah\x03\xe8\x01\x1a\x1b\xc8\x02i(\x13D\x02\x13R\xb1\x01\x03\x02\xc0\x13\x13\xb1\x01\x03\x12CTh\x89\x01hl\xb8\x01:8\t(\x0c\xe8\x01\x0b\xc8\x02\x19\bY(#T\x13b\xa1\x01\x13\xb0\x13#\xa1\x01\x0323Dh\x89\x01X\x1c=<\xe8\x02\x13\\\xa8\x02\t\xf8\x009()(\x138D#B\xb1\x01\x13\xa0\x13\x131\x02Q\x02\x03234h\x99\x018\x1c\r\x0em,\xa8\x02,\r\x0cM\x1cH\x19\x98\x01\x04\x88\x01\x04\x19\xf8\x00\x13h$\x02\x13R\xf1\x00\x02!\x13\x80\x13\x02\x13\x81\x01\x02\x13BC\x14\th\x89\x018\x0c\xbd\x01,h9HL\x0e\x0c]\x1c(Ih\x19\x88\x01)h\x13\x88\x01$#2\x03\x02\x01\x02\x81\x01\x02\x03\x01\xf0\x12#\x81\x01\x02\x03Rc\b\tX\x89\x018\x0c\xbd\x01,XIHL\x0e\x0c\r\x0e=\x1c89\xf8\x00\t\xa8\x01\th\x038\tX$\x13B\x03\xb1\x01\x13\xf0\x12\x03\x02\x91\x01b\x03D#h\x89\x01(\x0c\x1d\x0e=\x1e]\x1c8Y8,\r\x0c\x03\x0e\x0c\r.-\x1c\x88\x04\x13H9(4\x13\x042\x03\xb1\x01\x03\xe0\x12\x13A\x02AR\x13T#X\xf9\x008\x0c\r>\x9d\x01\x1c\x18\t\bY8\x1c\x1d\x0c\x03\r\x0c\r\x1eM\x0c\x98\x01I89H\t(\x138\xf9\x00\x18$\x02\x03R\x03A\x121\x13\xd0\x12\x03\x02\x91\x01R\x134H\x13X)h\x1c\r>M.-\x0c8Y8\x1c\x1d\x0c\x03\x1c\xfd\x00\x1c\x88\x01I8Ih\x138\x89\x01\x184\x13R\x01\x02\x81\x01\x02\x03\xc0\x12\x02\x03\xa1\x01B\x134\x18\t(#\xe8\x01\x1c\r>=>-\x1c(Y(,\x1d<=\x0e-\x1c\x88\x01I(YX\x13H\xf9\x00(D\x13R\x81\x01\x02\x01\x03\x01\xa0\x12\x02\x13\x91\x01B\x13$\t\xf8\x00#\xd8\x01\x0c=\x0eMN\x1d\x1c(Y(,\x1e,=\x1e-\x1ch\t\x189\x18i8#X\xf9\x00(\t4\x13b\x91\x01\x13\x01\x90\x12#\x81\x01B#$(\x19\x18\t\x18#\xf8\x00\x198\x9d\x01>-\x1c(9H,\x1e\x0c\x03\x0c\r\x1e\r\x1e-\x1cX\x19(\x19(i(\x138\x19\x18\xf9\x0084#b1\x021#\x80\x12\x02\x13\x11\x121\x02\x012#$\x18IH#X9(\x0c]\x1e-\x0eM\x0c(\t8\t(,\x1d,.],\b\t()hY(\x13\xc8\x01)X4\x02\x03b1\x02A\x13\x80\x12#\x91\x01\"#\x02\x14(IX#HI\x18\x0cM.\x8d\x01\x0c\xc8\x01\x1c\x1d,\x8d\x01,H9\xd8\x01\x13\xb8\x01\x0c\x98\x01\t4\x13b\x81\x01#\xf0\x11\x13\x91\x012#\x148Y\x18\t(\x13HI\x18\x0cM.=\x0e-\x1c\xc8\x01\x1c\x1d,\x8d\x01,H9H\th#\x18\tXlh\tD\x03b\x81\x01#\xe0\x11\x13a\x02!2\x03\x12\x14\tH\x19\x88\x01\x13898\x0cM\x0eM\x0e-\x0c\xd8\x01\x1c\x1d,\x1d\x1e=,\xb8\x019h\x03\xf8\x00,]\x1c8\t\x18D\x13R\x91\x01\x13\xe0\x11\x13\x91\x012\x13\x02\x14\t\x98\x02#8\x198\x0c\xfd\x00\x1eM\x0c8)h,\r\x0c\x03\x0c\r>-,(\t(\x99\x01\x18\t\b\x04\x03h\x1c\xad\x01\x0chD\x13R\x91\x01\x13\xc0\x11\x01\x03\xa1\x012\x03\x12\x14hL\xf8\x00#\x88\x01\x04\x1c-\x1e\r\x1e=\x0c(Yh\\\r>\x1d<X\xa9\x01\x18\t\x13\xf8\x00\x0c]\x1eM\x1cX4#B1\x02A\x02\x03\x01\xb0\x11\x13\xa1\x01\"\x13\x02\x14\tH\x8c\x01\x03X#\x88\x01\x1c-\x1e\r\x1e-\x0c8Yh\\\r>\x1d<X\xa9\x01\b\t\x04\x13h\x1c]\x1eM\x1cX\t4\x13B\xa1\x01\x13\x01\x90\x11#\x91\x012\x13\x02\x14H,M<\b\x198\x13\x88\x01\x1c\x8d\x01\x0cH\xf9\x00XL]<X\xb9\x01\x18\x03()\x18\x1c\x1d\x1e\x1d.]\x0c\xf8\x004\x13B\x91\x01\x02\x13\xd0\x04\x15\x90\x0c\x13\x02\x11\x02!\x02\x112\x13\x02$8\x1c\xfd\x00,\x88\x01\x13\x88\x01\x0cM\x1ch\x89\x01h\x13\x0c=Lh\xa9\x01\x18\x13\x189\x18\x1c\x1d.M\x1e-\x1c\xf8\x00$\x13R\x91\x01#0\xf5\x00\xa0\x02U\x16\x05\x80\x0c\x13\x91\x012\x13$\t\x18,=\x1eM\x1c(\tH\x13\xa8\x01\x1c\x98\x01\x89\x01h\x13\x8c\x01\xf8\x009\x04I\b\x1389\x18\x1c\x1d.M\x1e=\x0c\xf8\x004\x13BA\x02A\x130\x05V\x05\xa0\x02\x05&\x15&\x05\xf0\x0b\x13\x91\x012\x13\x14\t(,=\x1eM\x1c()8\x13\xd8\x02\x89\x01h\x03\b\xfc\x00(\tHI\b\x04(\n\x1389\b,\x1d.\xad\x01\x0c\xf8\x004#2A\x02Q\x03\x01\x20\x05f\x05@\x05\x00\a`5&\x15&\x05P%0%\xd0\x02\x17\x05\xd0\x06\x13\x02\x91\x01\"#\x148\x1cM\x1e\r\x1e\x1d,()8#H\tX\t\x88\x01ih\x038\rX\x19h\t\b\x0b\n\b\n\x0b\n\x03HY,-\x0e\x1d.m\x0c\xf8\x004#2\xb1\x01\x13\x20\x05&\x05&\x05\x10\x15\x16\x15\x00U&\x05&\xa5\x01\x00\x05\x16E\x16\x15\x80\x02\x85\x01\xa0\x06\x13a\x02\x112\x13$(,\xfd\x00\x1e\x1d,h*\b\n\x1389H98ih\x03\b\t\x88\x019X\n+\x1a\x03h9\b,].\x1d\x0e=\x0c8\x19(4#2\xa1\x01\x13\x11\x00\x05&\x15\x165f5\xf6\x00\x15&\x15&\x05\a\x05&\x15V\x05@\x05\x1650\x05f\x05\xa0\x06\x03\xa1\x012\x03\x02$(,\x1d\x1e\x8d\x01\x1ch\n+\n\x0b#\x1898Y89\x88\x01\x03\x18\thIh\n\x0b\n\x13\x18#\x0b\x18\x19(,\x9d\x01.-\x0c8)\x18\t$#2\xb1\x01\x13\x01\x00\x05f%\x16%&\a\x15&\x156\x15&\x15&%&\x15&\x05\x06\x15@\x05F\x0505&\x05\xa0\x06\x01\x03\x91\x01B\x03\x02$(,\x1d.-\x0e=\x1ch\n+\n\x0b\b#\x18)8i8)\x88\x01\x03\x98\x01Ih\x0b\x1a\x03\x0b\b\n#\n\x18\t8,\x8d\x01>-\x0c89\b\t$\x02\x132\xb1\x01#\x00\x05V5\x165\x16%&%&\x15&\x15&%&\x15&%P\x05F\x0505&\x05\xa0\x06\x13!\x02Q2\x13$8,\x1d.\x1d.-\x1ch\x1a+\n\x18#\b)8i\x98\x01\x198\x03\x98\x01I(\x19\x18\n\x13\b\n\x0b#\x0b\n\xf8\x00\x1c-.->-8Y\x18$\x02\x132\x01\x02\x81\x01#\x00\x05V5\x165\x16%\x16\x15\a\x05&\x15&%\x16%\x16\a\x05\a\x05&\x15P\x05F\x05@\x15&\x15\xa0\x06\x03\x02\x91\x012\x03\x02$8\x04\x1c]N\x1d\x1ch\n;\n8\x13hI\xa8\x01)8\x03\xa8\x01)X\x04\n\x13\x1b\bK\n()\x18\x1c=\x0e=>\x1d\x0c8Y\x184\x132\xb1\x01\x13\x00\x05V5\x16\x15\a\x05\x16%\x165&\x15&%\x16%\x16\x05\a5&\x05@\x05F\x05@\x15\x16\x15\xb0\x06\x03\xa1\x012\x03\x02$\x18\t\b\x04,MN\x1d\x0ch\n;\x1aH\x13\x04X9\xa8\x01)8\x03\x18\t\xf8\x01\x1a\x03\n\b\nk\n()\x18,\x8d\x01\x0e\x1d\x0e\x1c8Y($\x02\x13\"\xb1\x01#\x05&\x05&%&\x15&%&\x156\x15&%&\x05&%\x16\x15\x16\x05@UP\x05&5\x80\x06\x01\x03\xa1\x012\x034H,M>-\x0c\x18\t(\nK\n\x0bX\x13h\x19X\x198)8\x03\xa8\x02\n\x03\n\b\x0b\x03k\n()(\x1c\xbd\x01\x1cHi\x184#\x12\x81\x01\x02\x11#\x05&\x05&%\xf6\x00%\x86\x01\x15&%V\a\x05\a\x05\x16\x05&\x05PEP\x05V\x05\x80\x06\x13a\x02!\"\x13$\t\x18\x19\x18,]\x0e-\x1c\x18\t\b\x1a[\n\xf8\x00\x13\xd8\x01)()8\x0389\xa8\x01\x03\n\b\x0b\x18\n[\n\x18)H\x1c-.M\x0cXi\x184#\"!\x12Q#\x05&\x15&%f\x17\x15\xf6\x00\x15&\x05\x00\x15F\x05\x10\x05V\x05\xf0\x01\x05f\x05\xf0\x05\x01\x13a\x02\x11\x02\x03\x12\x13$\t\x18\x19(<],H\x1a;\x1aX\t(\x13\x98\x03\x03(iX\x04\x13\n\b\n\x13k\n\xb8\x01,\r.-\x1chi(4#\x12!\x02a#\x85\x01\x20\xf5\x00\x20\xf5\x00\x00E\x20E0e\xf0\x01\x85\x01\xf0\x05\x13\xa1\x01\"\x13\x02$\b\t\x04)(,\rlh\n;\n\xc8\x01\x13X\x19\xf8\x01\x03(\xf9\x00H\x13(\nk\x1a\xe8\x01lX\t(i(4#\"\x91\x01\x02\x13\x01\xf0\x0f\x13\xa1\x01\"\x134Y8\x8c\x01\xf8\x00\x1a\x0b\x1a\x0b\xc8\x01\x13H)\x98\x01*\x18\x13(\xf9\x00H\x13(\nk\x1a8\t\b\t\x98\x01\x1cX9(i(4\x02\x13\"\x91\x01\x02#\xf0\x0f\x13A\x02A\x03\x12\x134\xb8\x03\x1a\x0b(I\x88\x01\x03\x88\x02\n\x0b\b\n\b\x13(\xf9\x00(#8\x1a;\x1a8\xf9\x00\xd8\x01Y\x18i(\t4\x02\x13\x12\x91\x01\x02#\xf0\x0f\x13\x91\x01\x02\x03\x12\x13$(j\x88\x03I8\x198\x13\xd8\x01\n+\n\b\x13(\xf9\x00\x18#h:\x0b(\xa9\x01X\x19XI(Y8D\x13\x12A\x12!\x02#\xe0\x0f\x01\x03\x02\x91\x01\x02\x03\x02#\x14\x18\n\x8b\x01\x1a\x0bhIX\t\x18I(98\x13X*\b\x0b\x1a;\n\b\x13(i(\x13\xd8\x01\t\b\xb9\x018\t\x88\x019(IX4\x13\"1\x031\x02#\xe0\x0f\x01\x03\x02\x91\x01\x13\x02#\x14\x18\n\xab\x01\nhYH\t\x18I(I(#H\n\x0b:K\n\b\x13(Y(\x13\x88\x02\xb9\x01\x98\x01\x1b8\tHIH4\x02\x03\"1\x021\x02#\xe0\x0f\x13!\x02a\x13\x02\x13$\b\n\xdb\x01\n(\xf9\x00\xf8\x00I\x18YH\x13(\xab\x01\n\x18\x13(I(\x13XIX\xc9\x01X\x0b\x1a;*\x98\x019(4\x03\"1\x021\x02#\xe0\x0f\x03\x02\xa1\x01\x03\x12\x13$\n+\x03\n\xab\x01\n\x18\xf9\x00\xe8\x01YX\x13(\n\xfb\x00\n\x0b\x18\x13\x98\x01\x138\x89\x01H\xc9\x01X\x9b\x01\n\xf8\x00Y\x184\x13\x121\x021\x02#\xe0\x0f\x03\x12\x91\x01\x03\x12\x03\x02\x14\b\n\x1b#;\n[\n\x18\xf9\x00\xe8\x01Ih#\x18*+*(\x04\x13\x88\x01#8\x89\x01X\xa9\x01(\t\x18\n\xab\x01\nhY($\x13\x121\x021\x12\x13\x00\a\xc0\x0f\x03\x12\x91\x01\x03\x12\x03\x02\x14\b\n\x0b\x13\x1a;\x03\nK\n\x18\xf9\x00H)h9(\x198#\x18\x1a\x1b*H\x13(\x04\t(#\x18\xb9\x01X\x99\x01h\xbb\x01\nhY(\t\x14#\x12!\x031\x12\x13\x00\a\xb0\x0f\x13\x12\x91\x01\x03\x12\x03\x02\x14\x18\x1a\x0b\n;3\n\x1b\x1a\x18\xf9\x0089\xf8\x00)(9(\x138\x0b\x88\x01\x13(\x19\x18#X\xf9\x00h\x89\x01h\nk3\x1ahY(\t\x14\x02\x13\x12!\x12!\x12\x13\x00\a\xb0\x0f\x13\x12a\x02\x11\x03\x02\x13$8\nK\n3\x0b\x1a\xe8\x01)\xd8\x01I8\x13\xf8\x00)\x18\x13(\t\x18\x04\x13(\t(9\xa8\x03\n;\n+\n\x13\nhiH\x14\x13\"a\x12\x13\x01\x00\a\xa0\x0f\x13\x02\x91\x01\x02\x03\x02\x13\x14\t8\n;\x1a\b:\x0bX\xfc\x00\xf8\x00\t\xa8\x019X\x13\b\t(9\x18\x13H\x1389H\xfc\x00\xb8\x01)8\n\x1b\n\x03;\n\xa8\x01YH\x14\x13\x12A\x02\x11\x12\x13\x01\x00\a\xa0\x0f\x13\x02\x91\x01\x02\x03\x02\x13\x14HK\x1a\x98\x01\xac\x01h\x19\xa8\x01\x19h#89\x18\x13H\x1389(\xac\x01\xa8\x019(\n\x1b\x13;\n\xa8\x01YH\x14\x13\x121\x02\x03\x01\"\x13\x01\x00\a\xa0\x0f\x03\"\x01\x12Q\x02\x03\x02\x13\x148\nK\n\x98\x01\x1c\r\x0c\x8d\x01\x1cX\x04\xc8\x02\x13(9\x18\x13(\x13X9\b<M\\H\x04\x18Y\x18\n\x0b\x13\x1a;\nH)\x18iH\x04\x13\x121\x02\x03\x11\x12#\x00\a\xa0\x0f\x03\"\x81\x01\"\x13\x148*+\nX\x04\b\x1cm\x1e]\x0c8\t\x18I8)\x88\x01#8\t\x18\x13\x18#\x98\x01\x1c\xad\x01<Xi(\n\x03\n\b\n;\n\x0b8I898\x04\x13\"\x11\x12\x03\x11\x12#\x00\a\x90\x0f\x01\x03\"\x81\x01\"\x03\x02\x14X\x0b*\xf8\x00\x1c=\x0e\x1d.]\x0e\x0ch9(Y\x88\x01\x13X\x13\b#\x1898\x0c=\x1e\x8d\x01,\x18\t(I\x88\x01\n;\n(IHI(\x04\x02\x13\x12!\x02\x03\x11\"\x13\x00\x17\x80\x0f\x01\x03\"\xf1\x00\"\x13\x02\x14\xf8\x00\x1a\xf8\x00\x1c=\x0e\x1d.\xfd\x00\x0cX9\x18i8\t\b\t(\x13HC(I\x18,\x1d.\x9d\x01\x1ch)\x98\x01\n;\n(I8Y(\x04\x02\x13\x12!\x02\x03\x11\"\x13\x00\x17\x80\x0f\x01\x03\"\x01\x02\xf1\x00\x02\x13\x14\x98\x02\x1c\x1d\x0e\x1d\x0e-\x0e=\x1e-\x1c8I\x18iH\tH\x13(C(Y\x18,\x1d.-.=,\xa8\x0198\x1a\x1b\x1a\xb8\x01Y(\t\x04\x13\x121\x03\x11\"\x13\x00\x17\x90\x0f\x03\"\x01\x02\xf1\x00#\x14\x98\x02\x0c-\x0e\xfd\x01\x1cH)8\xf9\x00\x1898\x13\x1838I\x18,-\x1eM\x1e=<\x98\x0198*\x0b\xd8\x01Y(\t\x04\x02\x03\x12\x01\x02\x11\x03\x012\x03\x01\x00\x17\xf0\x02S\xb0\x0b\x13\x12\x91\x01#\x14\x98\x02\x0c\xbd\x01\x0cm\x1cX\tHY\xc8\x01\x13\b#8Y\x18\x1c-\x0e\xad\x01\x1e\r,\xa8\x01)H\x04(\t\xc8\x01I(\t\x04\x02\x03\x121\x12\x01\"\x037\xd0\x02\x023\x1f#\x90\x0b\x13\x12\x11\x02#!3\x14\x98\x02\x1c\r\xbc\x02\xb8\x019\xf8\x01CHI\b\x1c-.\x9d\x01\x1e\r,\xc8\x01\t\x88\x01\t\xd8\x01)8\t\x04\x02\x03\"1\x02\x01\x12\x137\xd0\x02\x13\x1f\x03?\x13\x80\x0b\x13\x12\xc3\x01\x02\x93\x05\xf4\x00\x184\x98\x01\x19\b\t\x14\x18C\xa8\x01\x1c-\xac\x02\x93\x02\xa8\x03\x043\x02A\x03\x01\x02\x13G\xc0\x02\x02\x03?\x03?\x13\x80\x0b\xf3\x00!\xf3\x02\x0c3L\xc3\x06\x88\x01L\xa3\x01@W\x00\x97\x01\x20\xb3\x04\"3\x017\xc0\x02\x02\x13\x0f\x03/\x03?\x13\xf0\n\x01#\x02a\x02S\xf8\x03\x13\x1c\x13\xf8\x00\xe3\x03\x10\xc3\x01\x00\a0\xe7\x05\x00'\x20\x1707\x11C\x01g\x80\x02\x12\x13\x02\x13_\x03?\x13\xe0\n3\x81\x013\x14\x88\x02\x03\xdc\x02\xd8\x01\xa3\x01H#\b#\xa0\x01\xf7\t\x00g\x90\x01\x12\xc3\x01\xbf\x01\x03\x02\xc0\n\x01\x13\x12\x81\x01\x02\x13\x02\x14X)\xf8\x00\x1c\xed\x01.\r,\xb8\x03\x13(\x13\b\x13\x97\x0c@\x12\x13\x12\xa8\x01\x02\x13\xff\x00\x03/\x13\xb0\n\x13\x12\xa1\x01\x13\x02\x14\x18\t\bYh,\x0e=\x1e-\x0e-.\x1d\x0c\x98\x02\t\x88\x01\x138\x13\x18\x13\x00\xe7\x0b\x20\x02\x13\x12\x88\x02\x13\xaf\x01\x13\x02\xa0\n\x13\x121\x02Q\x02\x03\x02\x14\x18\x89\x01h\x1c=>\r.\x1d.,\xf8\x00\n\x1b\n\x0b8)X#H\x138\x13\xb7\x0b\x10\x02\x03\x02H:\x0bHI(\x13\xaf\x01\x13\xa0\n\x13\x121\x02a\x03\x02\x14\x18\x89\x01h\x1c=>\x1d\x0e-\x1e\r,h\n;\n89\b\t(\x13X\x13H\x13\x00\x97\x0b\x02\x13\x02HK\n\x0b8Y\x18\x13\xbf\x01\x03\x02\x90\n\x03\"\xf1\x00\x02!\x13\x14\xa9\x01h<\x0e\r>\x8d\x01\x1c\nX\nK\n8Y\x18\x03\xf8\x00\x13X\x13\x00\xd7\n\x02\x03\x0c\xf8\x00\x02\x03[\x1a\x18i\x18\x13\xaf\x01\x13\x90\n\x03\"\xb1\x01\x13\x14\xe9\x018<-\x0e=\x1e=\x0c\xf8\x00k\n(I\x18\x03(9\x18\x138\t(\x13\x20\x17\x20'\xb0\b\x01\x10#\x02\x98\x01\x0b\n\x03k\n\b\xf9\x00\x18\x13?\x03_\x13\x80\n\x03\"\xb1\x01\x02\x03\x14\b\x89\x01\b9HL]\x0e-\x1c\x88\x01k\n()\x18\x138I\b\x138\x19(\x13\xc0\t\x02\x13\x02\xb8\x01\x1a\xbb\x01\bi(\x03\xbf\x01\x13\xf0\t\x03\"\xb1\x01\x02\x03\x14\x18Y(\x19\x04X\nL\xfd\x00\x1c\x88\x01\xfb\x00\n(\t(\x04\x13(Y\b\x138\x198\x13\x90\t\x02\x03\x0c\x02\xd8\x01\nK\n\x03;\b\n\x18Y(\x13\xaf\x01\x13\x02\xe0\t\x032\xb1\x01\x03\x02\x14\b9H\t\x04\t\x18\x0b8\x0b\x03\xac\x01\xb8\x01k\n\x18\t(\x13XI\b\x13(I(\x13\xe0\b\x138\x19\x04\t\xa8\x01\n;\n\x13;\n\x18Y8\x13\xaf\x01\x13\xe0\t\x132\xa1\x01\x13\x14\xc8\x01\x1a\x1b\x1aH\nL\xe8\x01\n[\n8#\xf8\x009\b\x13\b\xf9\x00(\x13\xa0\b\x02,\x03(\x19\x04\x19\x18)hZ\x13+\n(9X\x13\xaf\x01\x13\xd0\t\x01\x03\"!\x02\xf1\x00\x13\x148\x19h\x13;\n\x0b\xf8\x02\x1a;\x03\x0b(#H\t(9\b\x13\b\x99\x01(\x03\xf0\a\aL\r\xf8\x00ih\x04\x18\x1a\x03\x1b\n8\t\x98\x01\x13\xaf\x01\x03\x02\xd0\t\x032\xa1\x01#\x048)X\x13K\n\x88\x01\t\b\t\xb8\x01\x1a;\n\x0b(\x13X\t(9\b\x13\b\xa9\x01\x18\x13\xd0\a\x03\x1c\x1d,\xf8\x00i\xa8\x01J(\x19\x98\x01\x02\x03\xaf\x01\x13\xd0\t\x13\"Q\x121\x13\x04\xc8\x01\x03\x0c[\nhI\xb8\x01\x1a\x1b\x1a\x18\x13\xb8\x019\b\x13\b\xa9\x018\x03\xa0\a\x03\x0c\r\x1e\x1d,\x18\tHi\xb8\x01\x0b\n\x0b8\x19\xa8\x01\x13O\x03O\x13\xc0\t#\"\xa1\x01\x13\x04\xc8\x01\n\x03[\x1aXY\b\t\b\x04\xf8\x00:\x18\x138lH\t\b\x13\b\xb9\x018\x03\xe0\x06\x02\x03\x1cM,\x04\b\x19HY\xf8\x00I(\t\b\x19\x04\x19\xa8\x01\x13\xaf\x01\x13\xc0\t\x13\"\xa1\x01#\x04\xa8\x01\x0b\n\xfb\x00\nHi(I\x88\x01\x038,-L(\t\b#\b\xa9\x01H\x03\xd0\x06\x03\x0c\r\x0e\r.\r,\x04\b\t\xf8\x00\x19X\x99\x01\x18\x19\b)h\t8#\xaf\x01\x03\x02\xb0\t\x132\x91\x01\x02\x13\x04\x98\x01\x0b\n\xab\x018Y(Y\xf8\x00\x13(,M<(\t\b#\b\xa9\x01H\x13\xc0\x06\x0c\r\x1e\r.\r,\x04\xa8\x01\tX\x89\x01H9h)\x18\x02\x13O\x03O\x13\x02\xa0\t\x13B\x91\x01\x02\x03\x048\t(\x1a\xbb\x01\nHI(iH#(\x03\x0c\x9d\x01\x1c\b\x19\b\x138\x89\x01h\x03\xa0\x06\x1c\x1e\r.\r,\x04\x98\x02\x99\x01\xe8\x01I\x18\x02\x03\xbf\x01\x13\xb0\t\x02\x03\"1\x02a\x13()\b\x03k\n\x03K\nX)(\xf9\x008#8\x1c\x1d\x0e=\x0e\x1d\x1c\x18\t\b\x13XY\x88\x01\x03\xf0\x05\x02\x1c\r\x0e-\\\x04\xa8\x02\xf9\x00\xd8\x01i(\x13\xbf\x01\x13\xb0\t\x032\xf1\x00\x02\x11\x13\x04\x18)\b\n[\x1a\x13;\n\xb8\x01\xf9\x00(\x13X\x0c\x1d.-\x0e-\x1c\b\t\b\x13\x88\x01\t\xb8\x01\x13\xc0\x05\x02\x03\xac\x01\x14\x19\xf8\x00*\xf8\x00)\x18\t\xe8\x01\xf9\x00\x18\x02\x03\xbf\x01\x13\x02\xa0\t\x13\"\xf1\x00\x02\x11\x02\x13\x18)\b\nK*\x13;\n\xb8\x01\xf9\x00\x18#H\x1c\x1d.m\x1c\r\t\b\x13\xd8\x02\x13\xc0\x05\x03\x02\xac\x01\x04\b\t(\x04H\n\b\x1a\xf8\x00\t\xf8\x00\x04\x98\x01\xf9\x00(\x03\xcf\x01\x03\x02\xa0\t\x132\xa1\x01\x13(\x19\x18\n+\x1a\b\n\x13+\n\x189hi\x18\x13h\x1c\x1d.-\x0e-,\x18\x138\tH\x0b\x1a+\x1aX\x03\xa0\x05\x03\x028,H\t(\n\x1b\x03\n\x18\n[\x1a\x98\x01\xec\x01\x98\x01\x02\x03\xcf\x01\x03\x10\x025\xb0\b\x01\x032\xa1\x01#\x18\t(\x1a\x0b\n(\x0b\x13\x1b\x1a8\x04\thI\x18#\xf8\x00\x1cm.\x1d,\x18\x13()8\n\xfb\x00\x1a8\x03\x80\x05\x12\x18\th\tH\n+#\xfb\x00\n\x88\x01\x0c-.=>\x1d,8\x19\x18\x13\xbf\x01\x13\x15F\x05\xa0\b\x13\"1\x12Q\x13\b\tH\x1aH\x1a\x0b\x1a\x0b\xa8\x02\x13\x98\x01\x1cM\x1e\r\x0e-,\x18\x13\x189(\n\xab\x01\n8\x13\xd0\x04\x02\x03\x18\x04\xd8\x01K#[\n\x88\x01\x0cM\x1e=>-\x0e\r\x1cX\x02\x03\xcf\x01\x03\x15V\xa0\b\x1321\x02Q\x13\b\tH\x1aX*\x0bh\x04\xa8\x01#\x98\x01\x1cM\x1eM,\x18\x13()(\n\xab\x01\x1a(\x13\xd0\x04\x13\xf8\x01[#K\x1a\x0b\xf8\x00\x0c\r\x0e\x8d\x01>]\x1cX\x13\xbf\x01\x03\x02\x156\x05\xa0\b#2\x91\x01#\xa8\x01\x19\x98\x01\x9c\x01\x03\x18#H\x198\x1c\xbd\x01,\x18\x138\t8\n3\xfb\x00\x1a8\x03\xc0\x04\x03XIX\x8b\x02h,\x1d\x1e\xdd\x01\x0e-\x0cX\x03_\x03_\x03\x02\x15\x16\x15\xb0\b\x132\xa1\x01\x13\xb8\x0198,\x8d\x01<\x03HI8\x1c\xad\x01,\x18\x13H\t8\x1a#\xfb\x00\nH\x03\xb0\x04\x03(\xf9\x00h\xbb\x013\n\x18\t(<].\x8d\x01\x0e-\x0cH\x13\xbf\x01\x13\x15\x16\x05\xc0\b\x132\xb1\x01\x13\xa8\x019(\x1c\x1d\x0em\x1c\b\x13Hi(\x1c\r\x0e\x1d.=\x1c(\x13\xb8\x01\x0b\n\x8b\x01\nX\x13\x90\x04\x02\x18\x89\x018\x19\b\n\xab\x01#\x0b\n\x18\t8L=.=.M,8\x02\x03_\x03O\x13\x02\x05\x16\x05\xc0\x01\a\x00\a\xc0\x06#\"\xb1\x01\x13\xa8\x019(\x1c\x9d\x01\x0c\b#H\xf9\x00\x18\x1c=.-,(\x13\xf8\x00\t8\n+\x13;\nX\x13\x80\x04\x12\x18\x89\x018\x19\b\x04\n\xdb\x01\n\b)(\xfc\x00\xfd\x00.M,H\x03_\x03O\x13\x02\x05\x16\x05\xf0\x00\a\xf5\x00\xc0\x06\x132!\x02!\x02!\x02\x13(9(9\x18\x1c=.\x1d\x1c\b#\b\x0c8\xf9\x00\x18<\x1d.-\x1c8\x13h\x19(\n;#\x1b\x1a\xf8\x00\x03\xf0\x03\x02\x18\x99\x01()\x18*\xbb\x01\n\b)8\x04\xac\x01\x8d\x01<\x04H\x03\xbf\x01#\x05&\x05`\x05f\x05\xc0\x06\x01\x032\xb1\x01\x13(9\xf8\x00\x1cM.\r\x0c\x18\x1c\x18,(i8<M,H\x13h\x19(\n+\x1a#\x1a\x98\x01\x03\xe0\x03\x03\x18\x89\x01(I(\x04\n\x8b\x01\b\n(\tH\x19\x18\x9c\x02\r\x0c\x14H\x13_3\x0f#\x05&\x05P\x05\xf6\x00\x05\a\xc0\x06\x13\"\xb1\x01#\x189\xf8\x00\x1c]\x1e\x0c\b\x03\x1c\b\x03L\x18iX\xfc\x00(\t(\x13\x98\x01\x0b\n;\n\b\x1b\x1a\xa8\x01\x13\xd0\x03\x03\x18\xf9\x00\x98\x01\x1b\b\x0b*;*\x98\x01)($\xdc\x01\x14\b\t83\x0f\xa3\x01\x05&\x050\a\x00\x05\x16%&\x05\xd0\x06\x01\x032\xa1\x01#()\x18\tH\x1cm\x0c\x03\b,\b\\\x18ihL\x88\x01\x13\x98\x01\x1a;\n\x88\x01)H\x13\xc0\x03\x03\x18Y\x98\x01\x02cZ\x04\xb8\x01)\x18$(\xac\x01\x04\x18\t8\xf3\x01\x05&\x05P\x05\x165\x16\x05\xe0\x06\x032\xa1\x01#8I8,\r.\x1d\x0c\x18\x0c\b\x0c\b\x0c-,\x18i\xd8\x01\tX\x13\x98\x01\n\x0b\n+\n\xf8\x009X\x03\xc0\x03\x03\x189\x98\x01\x13\xf2\x00\x13\x02\x98\x01\x02XIH4h\x19H\x04\xf3\x01\x05&\x05@\x05&5\x16\x05\xe0\x06\x01\x03\"1\x02a#(Y(,\r.\r\x0c\x18\x0c(\x0c=<\bY\xa8\x01\t\x98\x01\x138\t\xf8\x00*\x88\x019h\x03\xa0\x03\x12\x18\x19h\t(\x03\xb2\x01\x138\x02\x83\x01\x04\b9\bi\xa8\x01\t8\x04C\xf2\x00#\x05&\x05@\x05&5\x16\x05\xf0\x06\x132\x91\x01#8I(,\x1d\x0e\r\x0c\b\x03\x1c\b\x1c\r\x0e-<\x18Ih\t\x18\x198I\b\x13\x18YX\x0b\n\x18)89(\t8\x03\x90\x03\x03\x88\x01)\x18\x04\x03\xc2\x01\b\x03(\x02\x03\x82\x01\x13\x028\x19\x04\t\xb8\x01\tX\x04\x02#\x92\x01\x13\x05&\x05P\x05\xf6\x00\x05\xf0\x06\x132\x91\x01#8I(,=\x0c\b\x1c\b\x1c\x1d\x1e\x1d<()\xa8\x01\tHI\b\x13\x18i\x88\x01)8)8\x19(\x13\xf0\x02\x02\x03\xb8\x01\x14\x02\x13\xb2\x01\b\x03\x02\b\x02\x13\xa2\x01\x038\x19\x04\xd8\x01\tH\x04\x02\x13\xa2\x01\x13\x05&\x05P\x05\xf6\x00\x05\xf0\x06\x01\x132A\x12\x11\x02#(I(,-\x0c\b\x13\b\x03=\x0e-<\x88\x01)8)(Y\b\x13\x18\xf9\x00\x18\x19(I\xf8\x00I(\x13\xd0\x02\x02\x03H\x03\"\b$\x02\xc3\x01\"\x03\x02\b\x04\x02\x03\xb2\x01\x03\x02(\x19\xa8\x02\x04\x02\x04#\xa2\x01\x13\x05&\x05`\x15&\x05\x16\x05\x80\a\x01\x032\x91\x01\x02\x13(I(<\r\x0c\x03\x0c\x03\b\x03\x0c\xfd\x00,\x88\x01I()(i\x13\b\xf9\x00(9\x189hi8\x03\xc0\x02\x03H\x03\x00\x12C\x02\x00G\x00\a\"c\x02\x04\x13\xd2\x01H\x04#\x028)X4\x03\xc2\x01\x03\x02\x05&\x05\xf0\x00\xf5\x00\x90\a\x132\x91\x01#\x98\x01\x04\x0c\r\x1c#\b\x1c\x8d\x01,hi\x98\x01Y\x13\x18i(\x19\xe8\x01YX\x03\xa0\x02\x02\b\x02(\x03\x02'0\xe7\x01\x20\a\x12\x93\x01B\x038\x02\x132\x13\x02$8D\x02\x13\xc2\x01\x03\x02\x05&\x05\x90\t\x132A\x0213\x18\thL\x03\b\x03\x1c=\x1e-,h\xf9\x00\x88\x01Y\x13\x18i\xb8\x02YX\x03\xa0\x02\x03\x02(\x02\x03\x00\xb7\x01\xf0\x00'\xf0\x00\x12c\"\x038\x02\x03R#\x02\x84\x013\xb2\x01\x13\x02\x05&\x05\xa0\t\x03B\x91\x01#\x98\x01<\x03\b\x03\x0c]\x1e\x1d<X\x89\x01\x98\x019\b\x13\x18i8\x9c\x01hIh\x13\x80\x02\x12(\x13\x02\x17\xf0\x02\a\x10'@\x12C\x02\x18\x04\x03\xf2\x00\xe3\x01\xc2\x01\a\x03\x15&\x05\xa0\t\x13RA\x12\x11#\x88\x01\x04\x03\x0c\x03\b\x1c\r.=\x0e\x1d,\xf8\x00iX)h\x13\x18I8\x1c\x8d\x01,H9\x98\x01\x03\x80\x02C\x02\xc0\x03\xd7\x01\x00\x03(S\xf2\x00c\xf2\x01\x03\x02\x156\x15\x90\t\x13R\x81\x01\x023h\x1c\x13\x0c\x1d>],\x98\x01Ih9X\x04\x03\x189(\x1c\xbd\x01\x0e\x1c(9\xb8\x01\x03\xb0\x02\a\x90\x04\xa7\x01\x003'\x02\xf3\x00\xc2\x02#\x02\a\x05V\x05\x90\t\x13R\x91\x01\x02#\x04\b)\x18\x13\b\x1c\x1d>],\x98\x01\x19\xf8\x00YX\x04\x03\x189(\x0c\x9d\x01\x0e=\x1c\x18\t\x18\t\xb8\x01\x13\x90\a\xf7\x00#\x00G\x12\x93\x01\xd2\x013\x12\a\x05\x036\x05\xa0\t\x01\x13R\x91\x01\x02#4#\x18<.],H:X\n\x0bHYX\x03\x18\x198\x0c=\x1e=.=\x1c\x88\x01*\x0bH\x13\xe0\a\xa7\x02\x05\x93\x02\x02\x10\x12e\xc0\t\x13\xf2\x00\x81\x01\x023\x04#8L=LH\n+\n8\x1a\x0b\nXIX\x03\x04X\x1c\x1dN\x9d\x01\x1ch\n\b;\nX\x03\x90\x01%\x90\x06G\x20\a\x02\x17@\xf7\x01\x00G\x00\x05\x02\x06\a\x05\x80\n\x13\xf2\x001\x02Ac(\t(\x9c\x01h+\n\x03\x0b\x18\n;X9h\x13H\x1c-^-\x0e]\x1chK\nh\x03\x80\x01\x05\x06\x05\xc0\x06\a\x90\x01\x97\x03\x05&\x05\x80\n#b\xa1\x01C\x88\x01\xfc\x00h\n+\x13\x1b\n[H9h\x13H,\x1d^-\x1eM\x1chK\nh\x03\xf0\x00\x15\x06\xb5\x01\x10\a\xc0\x06\xd7\x02\x00\x05&\x05\x90\n\x13\xf2\x00\xa1\x013\xf8\x02\n+#k\nH9h\x13H\x1c-^-\x1e]\x0ch\n;\n(\t8\x13P\x15\xc6\x01\x05\a\xd5\t&\x05\xa0\n\x13\xf2\x00Q\x02!3\x18\t()H\x19\xf8\x00\n+\x1ak\x1aH9(\x19\x18\x138,=\x1e]\x1e]\x0ch\n;\n\x98\x01\x03@\x05\x86\x0c\x05\xb0\n#ba\x02SH9\xd8\x01\n\xab\x01\x1ah\x19(9\b\x138,\xbd\x02\x0c\xf8\x00\n[\n\x0b(\t\x18\x130\x05\x86\x0c\x05\xb0\n#R\x03\x02Q#\x02#H9\xd8\x01\n\x8b\x01*\xc8\x01\t\x04\x19\b\x138,\xed\x01\x1e-\x0c\xf8\x00\n;\x1a\x13\n\x0b8\x130\x156\x005\xe6\n\x05\xb0\n\x01#R\x03\x021#13\x189H\x19\xf8\x00\nk\n\x1b\xd8\x019\b\x138,M\x0e=.\x1d.\x1d\x0ch\x0b\n;#\x0b\x1a\b\t\x18#\x20\x15\x16\x15P\xf5\x04\xd6\x05\x05\xc0\n\x01\x13b\x03\x02\x11\x02\x13\x02A3\xf8\x00Ih\x1a[#\x18\t\x18)\xf8\x00\t\x18\x138,=.-.-\x0e-\x0cH\n#;\x1a\x1b\x1a\b\x19\x18#\x01\x00\x15\x16\x05\xa0\x06\xe5\x04\x16\xf0\n\x01\x13b\x03\x02\x01\x13\xf1\x00CHYH\t\x18\x1a[\x13\x0b89\x98\x01\x138,->=\x1em\x0c8\n\x1b\x13\xfb\x00\x1a\b\x19\bC\x01\x15\x06\x05\x80\x0b\a\x05\x16\x05\xf0\n#b3\xf1\x00\x02CHI8\x19\x18\x1a\xfb\x00\n89\x98\x01\x138,->\xcd\x01\x0c8\n\xcb\x01\n\b\x19\bS\x15\x06\x05\x90\x0b\x05\x06\x15\xf0\n\x013B#\x11\x02\xf1\x00C89H\x198\x1aK\n\x0b(I\x18\th\x138,=\x1e-\x0e=\x1e=\x0cH\n\xab\x01\x1a8\x13\x01\x02#\x15\xb0\x0b\x15\xa0\x0b\x01\x93\x01\xd1\x01#(\x19\xf8\x00\tH*\x0b*h\tX\x1a(\x138\n\x1c\xfd\x00\x1e=\x1e-\x0cX\x1a\x8b\x01\nH\x13!3\xf0\x17#\x02\x03\xe1\x013\xb8\x01\x19H*\xe8\x01\n\x1b\n\x0b\n#\x1a\x18,\x8d\x02\x1cX\x0b\x1aK*8#13\x01\xb0\x17\x01\x00\a\x13\"\x03\xe1\x01#\xb8\x01\x19\xd8\x02;\n\b\n#\x1a\x18,\x8d\x02\x1c8\t(\xfa\x008\x13\x02AC\xc0\x055\xa0\x11\x17\x132\x03\x81\x02#\x98\x019\xa8\x02\nK\n#;\x18,M\x1e\xfd\x00\x1c(9\xc8\x01\x13\xf1\x003\x10\a\xe0\x04%6\x15\x90\x11\a\x13B\x03\x02Q\x12\xf1\x003\xf8\x00)\xc8\x02\x03[\x13+\n(,-.m\x1c(I\xa8\x01\x13\x91\x01C\a\x00\a\xc0\x04\x15V\x15\xa0\x11#b\x81\x023\xf8\x01\xf9\x00X\x0b\nK\x13+\n(\x04<\x0e\xfd\x00,(Y\x98\x01\x03a\x02A3\x00'\xb0\x045&\x05\xc0\x11\x01\x13b\x91\x023\xd8\x01\x99\x01X\nK\x13\x1b\x1aH<]<(i\x88\x01\x13\xc1\x01\x02#\x00'\xc0\x04%&\x05\xd0\x113R\x01\x02\x81\x023\xb8\x01\xa9\x01X\n;\x13\x0b\x1a\x88\x01\x8c\x018\xf9\x00h\x13\xf1\x01#\x10\x17\xd0\x04\x15&\x05\xe0\x113bQ\x02!\x02\xf1\x003\x98\x01\xb9\x018\x0b\x1a+\x13\x1a\xe8\x02iH#1\x02a\x02!\x02\x13\x02\x03G\xc0\x04\x05&\x15\xf0\x11\x01#b\xb1\x0238\t(\xb9\x01(\n#\x1b\n\x13\n\xc8\x02\tH)(C\xf1\x01\x02\x03\"\x03\x01G\xa0\x04\x15\x16E\xf0\x11\x01#R\xc1\x02#h\x89\x018\x0b\n[\n\x13(\t\xa8\x01\x19H\x19\xf8\x003\xa1\x01\x02A\x02\x132\x03g\x90\x04\x05V\x15\x80\x12\x01#b\xb1\x023X\xf9\x008\x1aK\x1a\x13(9\xf8\x00)\xb8\x01C\x81\x02\x02\x132\x13g\x80\x04\x15V\x15\xf0\x11\x17\x10\x13bA\x02\xe1\x013hI8\x1a;*\x03\x04(IXI\x88\x013\xc1\x01\x021\x82\x01\x03\x00g\x80\x04\x85\x01\x90\x127#R\xd1\x02Ch\tXJ\x18\x138Y8YX3\x91\x01\x12\xf1\x00\x82\x01\x13\xf7\x00\xc0\x177\x01#Ra\x02Q\x02Q\x02S\x98\x02\x13(i8\t\b\x19H3\x02\xa1\x02\x02\x03\x82\x01\x13\x87\x01\xe0\x17'\x01\x13b\xc1\x01\x02a\x02S\x88\x02\x13(i\xa8\x01C\xb1\x02\xa2\x01\x13\x00\x87\x01\xf0\x177#b\xd1\x023\xb8\x019\b#\x18i\xf8\x00Ca\x021\x02Q\xd2\x01\x13\x01\x97\x01\x80\x187#b\x03\x02\xf1\x01\x12A3h\t\b)\b#(Ih3\x02\x81\x02\xf2\x01\x13\x01\xb7\x01\x80\x18G\x01#b\x13Q\x12\xe1\x01\bS\x02h#\xa8\x01\x02#\x02\xa1\x02\xf2\x01\x13\x01\x00\xb7\x01\xa0\x187\x003\x82\x01A\x12\x81\x02\x02c\x0283\x018!\x02#\x02\xa1\x02\x82\x02\x13\x01\x00\xc7\x01\xb0\x18G\x01#\xf2\x00\x03\x02a\x12\x91\x02\x02\xd3\x02\xb1\x01\x02A\x92\x02#\x01\xd7\x01\xd0\x18W#\x82\x01\x03\x02\x91\x04#\x01S\xf1\x01\x02\x11\x92\x02#\x01\xf7\x01\xf0\x18W\x013\xf2\x00#\x02\x91\x01\x02\xb1\x02\x13\xd1\x01\x02a\xb2\x02#\x01\x00\xd7\x01\xb0\x19W\x013\xb2\x01\xd1\x03\x13\x81\x01\x021\x02Q\xb2\x02#\x01\x00\xe7\x01\xc0\x19g\x013\xb2\x01\x11\x12Q\x12\xf1\x01\x13A\x021\x12A\xc2\x023\x00\x87\x02\xf0\x19\xf7\x00S\xb2\x01\xd1\x01\x02\x81\x01\x13\xb1\x01\xe2\x023g\x00\xb7\x01\xa0\x1a\x87\x01\x01S\xb2\x01\xb1\x02\x13A\x92\x03C\xb7\x02\xe0\x1a\x97\x01\x01C\xe2\x01\xf1\x01\xf3\x00\xd2\x02S\xb7\x02\x90\x1b\xa7\x01\x00\xf3\x00\xb2\x02\x83\x01\xc2\x02S\x02\x01\x20\xa7\x02\xe0\x1b\xb7\x01\x01c\xe2\x02#\xd2\x01c\x01\xa7\x03\xa0\x1c\xd7\x01\x01c\x82\x02#\x00\x13\x92\x01#\x02\xf7\x03\xc0\x1c\xf7\x01\x01c\xe2\x01#\a\x01\x13\xf2\x00#\x01\x00\xd7\x03\x80\x1d\xa7\x02\x01\xf3\x00b3\x01'\x83\x01\x01\xd7\x03\xf0\x1d\x97\x02\x00\x17\xd3\x01\x01G\x001\x10\xc7\x03\xc0\x1e\x97\x031\xa7\x05\x80\x1f\xc7\b\xd0\x1f\xc7\a\xc0\x20\xf7\x06\x90!\x87\x06\x80\"\xb7\x05\xa0\a5\xb0\x15U`E\x80\x02U\x20\xb7\x04\xf0\x05\xb5\x01\x20\x15\x16\x15\xa0\x15\x056\x05`\x05&\x05\x80\x02\x056\x05`\xb7\x03\xb0\x06\x05\x86\x01\x15\a\x10\x056\x05\xa0\x15\x056\x15@\x056\x05\x80\x02\x056\x05\xb0\x01\xc7\x01\xd0\a\x05\xa6\x01\x05\x10\x056\x05\xa0\x15\x05F\x05@\x056\x05@\a\x00\x05\x00\x05\xf0\x006\x05\xe0\n\x05\xa6\x01\x05\x10\x056\x05\xa0\b\a\xf0\x0c\x056\x05@\x056\x050\x85\x01\a0\x05&\x05\x20E\x20U\x80\x015@%\x90\x01\xf5\x00\xe0\x03\x05\xb6\x01\x10\aE\xa0\x01\xa5\x01\x90\x01\xa5\x01\xd0\x01\xb5\x01\xe0\x0c\x056\x15\x20\x056\x050\x05\xf6\x00\x150\x05&\x050&\x20\x156\x05\a\x005\x00\x156E\x16%`\x05\xf6\x00\x05\xc0\x015\xc0\x01\x056%6\x15\x00U\x80\x01\x15\x96\x01\x05\x80\x01\x05\xa6\x01\x05\xa0\x01\x15V\x056\x05\xf0\x0c\x056\x05\x10\x156\x05\x20\x05\xa6\x01\x05\x10\x15&\x05\x10\x056\x05\x10\a\x056\x05\x10\x05\xb6\x01\x05V\x150\x15\x96\x01\x15\x90\x01\x056\x20\x05\x80\x01\x056%6\x15\x00\x056\x05\x80\x01\x15\x96\x01\x05\x80\x01\x05\xa6\x01\x05\x80\x01\a\x15\xb6\x01\x05\xf0\x0c\x156\x05\x00\x156\x05\x20\a\xa6\x01\x05\x20\x05&\x05\x206\x05\x20\x056\x05\x10\x05\xb6\x02\x050\x05\a\xa6\x01\x05\x80\x01\x15f\x15\xf0\x00\x056%6\x05\x10\x056\x05\x20\x150\x15\x86\x01\x15\x00\a%\a\x20\x05\x96\x01\x05\x20%0\x15\xc6\x01\x05\xf0\x0c\x156\x05\a\x05F\x05\x00\x15F%F\x05\x10\x056\x206\x05\x20\x056\x05\x10\x05\xb6\x02\x050\x05F%F\x05\xf0\x00\x15f\x05\x80\x01\x05\xa6\x01\x05\x00\a\x056\x05\x00\x15\x16\x15\x10\x15\x86\x01\x05\x10\x15\x16\x05\x20\x05\x86\x01\x15\x00\a\x05\x16\a\x05\x20\x1565F\x05\x80\r\x056%6\x05\x10\x156E6\x05\x10\x056\x05\x1060\x056\x05\x10\x05F%V\x15F\x20\x056e&\x05\xf0\x00\a\x05f\x05\x80\x01\x05\x96\x01\x05\x20\x0565&\x05@%F\x05\x10\x056\x05@\x15F\x05\a\x00\x056\x05\x20\a6U6\x05\x80\r\x156\x056\x15\x10\x05F5\a\x05&\x05\x10\x056\x05\x10\x056\x20\x056\x050&\x15\x10\x056\x05\x10\x056\x05\x10\x05\xd6\x01\x05\x80\x01\x95\x01\xf0\x00\x05\xf6\x005\x10\x056%6\x05P\x05F\x05\a\x10\x056\x05P\x056\x05\x20\x056\x05\x10\x056e6\x05\x90\r\x056\x056\x15\x10\x1565\a\x05&\x05\x10\x056\x05\x10\x056\x05\x10\x056\x05\x206\x15\x10\x056\x05\x10\x056\x05\x10\x05\xd6\x01\x05\x80\x01\x05f\x15\xf0\x00\x05V%\a\x05\x20\x0565&\x05@\x05V\x05\x20\x05&\x05P\x05F\x05\x20\x15&\x05\x10\x056e6\x05\x90\r\x056\x056\x05\x20\x156U&\x05\x00\x156\x05\x10\x056\x05\x10\x056\x05\x206\x05\a\x10\x056\x05\x206\x05\x10\x05\xd6\x01\x05\x80\x01\x05f\x15\xf0\x00\x056\x15\xf0\x00\x056\x05\x105P\x056\x15@5@\x156\x05@5\x20\x056e6\x05\x90\r\a\x05f\x050\x156\x15\a\x156\x05\x00\a\x056\x05\x10\x05656\x05\x10\x056\x05\x20\x05&\x050\x05&\x05\x10\x056\xa5\x01\x80\x01\x05f\x15\xf0\x00\x056\x05\x80\x01\x05F0\a`\x056\x15\xd0\x01\x05F\x05\xb0\x01\x05FU6\x05\xa0\r\x05f\x050\x15F%F\x05\x10\x056\x05\x10\x05F\x15F\x05\x10\x056\x05\x20\x05&\x050\x05&\x05\x10\x056e\x06\x15\a\x80\x01\x85\x01\x80\x01\x056\x05\x80\x01\x05F\xa0\x01\x056U\x90\x01\x056U\x90\x01V5F\x05\xa0\r\x05f\x05@\x05V\x05V\x05\x10\x056\x05\x10\x05\xa6\x01\x15\x10\x056\x05\x20\x0560\x05&\x15\x00\x056U\x16\x15\xb0\x01\x15\xd0\x01\x056\x05\x80\x01\x05F\x05\x90\x01\x056U\x90\x01\x056e\x80\x01\x05V%F\x05\xa0\r\x05f\x05P\x05\xa6\x01\x15\x10\x056\x05\x20\x05\x96\x01\x05\x20\x056\x05\x20\x0560\x05&\x15\x00\a\x05\xc6\x01\x05\xa0\x03\x056\x05\x80\x01\x05F\x05\xf0\x00\a\x05\x96\x01\x05\x90\x01\x05\x96\x01\x05\x80\x01\x15\xc6\x01\x05\xa0\r\x15F\x05\a@\a\x15\x96\x01\x05\x20\x056\x05\x20\x15\xf6\x00\x15\x20\x056\x05\x20\x056\x05\x10\a\x05&\x15\x20\x05\x96\x01\x15\xb0\x03\x056\x05\x80\x01\x05F\x05\xf0\x00\x15\x96\x01\x05\x80\x01\x05\xa6\x01\x05\x80\x01\a\x15\xb6\x01\x05\xb0\r\x156\x05\x80\x01\x15F%0\x05&\x150%6%0\x15&\x05\x20\x15\x06\x00\a0\x05&\x150\x15f\x05\xd0\x03\x056\x05\x90\x01\a6\x05\xf0\x00\x05\xa6\x01\x15\xf0\x00\x05\xa6\x01\x05\xb0\x01%&\x156\x05\xb0\re\x90\x01\xf5\x00@EP\xf5\x00PE050E@%\a6\x15\xe0\x03E\x90\x01E\x80\x01\xc5\x01\x80\x01\xc5\x01\xc0\x01\xb5\x01\xe0\r\x05\x90\x02\a\x80\x01\a\xf0\x02\x05\xe0\x01\x05\a\x80\x01\a\x005\xf0\a\x05`\a\xc0\x01\x17\x20\x05\x00\a\xc0Y"
)

Niveau mémoire heap à l'exécution, nous avions donc
$mathjax$40+16×(8+40+3×(8+28))+33+9197×1×1$mathjax$
soit 11,766 Ko ; en théorie ça passait chez tout-le-monde.

En pratique toutefois, rien que pour les données du bytes cette écriture utilisait 32995 caractères, nécessitant donc au moins 32,995 Ko en mémoire de stockage.

Rappelons ici aussi les pires modèles sur ce critère :
  • NumWorks avec seulement 32,766 Ko d'espace de stockage pour les scripts Python
  • éditions Python des TI-83 Premium CE et TI-84 Plus CE qui certes offrent un espace de stockage de 3 Mo, mais limitent la taille maximale de chaque script Python à seulement 64 Ko

Sur les TI-83 Premium CE et TI-84 Plus CE ce n'était pas bien grave, car il te suffisait d'utiliser à la place le format de fichier externe propriétaire IM8C.8xv.

Par contre ici pour le coup, bien que parfaitement exécutable en théorie, il t'était impossible de faire rentrer le script affichant l'image sur la NumWorks. :mj:

Pas question de remettre en cause radicalement cette façon d'écrire, mais on peut mieux faire. Plusieurs améliorations ont été développées dans le cadre du formidable concours de dessin de Noël 2021 par Casio, avec une période de participation accessoirement prolongée jusqu'au 31 janvier 2022.

Ces améliorations viennent d'être mises en place et nous allons te les présenter.

Concernant les échappements courts sur 2 caractères pour coder un octet non affichable sous forme de caractère, img2calc en gérait jusqu'à présent 5 :
  • \a (7)
  • \b (8)
  • \t (9)
  • \n (10)
  • \r (13)

2 nouveaux échappements courts sont maintenant gérés :
  • \v (11)
  • \f (12)

Pour les autres octets correspondant à des caractères non affichables, était donc jusqu'à présent utilisé un échappement hexadécimal sur obligatoirement 4 caractères.

Et bien à la place on peut utiliser un échappement octal, qui a l'avantage d'accepter un nombre variable de chiffres, de 1 à 3. Par exemple :
  • au lieu de \x00, l'octet de valeur 0 peut être écrit \0
  • au lieu de \x07, l'octet de valeur 7 peut être écrit \7
  • au lieu de \x08, l'octet de valeur 8 peut être écrit \10
  • au lieu de \x1F, l'octet de valeur 31 peut être écrit \37
On gagne ainsi 2 caractères dans l'écriture des octets inférieurs à 7, et 1 caractère dans celle des autres octets jusqu'à 31.

La seule contrainte pour les échappements octaux courts avec seulement 1 ou 2 chiffres, est que l'octet suivant si correspondant à un caractère affichable, ne doit pas être un chiffre de 0 à 7.

Reprenons notre icône. Comparons avec ce que donne maintenant img2calc :
Code: Tout sélectionner
palette = (
(255,255,255),(55,109,157),(255,203,64),
)

image = (
#b"\x10\x11\x20\x01\x00\x11\x1c\x19(\r\x10%\x0c)\x00\x06\x00%\x04\n\r\x18\x0e\t\x04&\x00\x05\x00*\x0c&\x10\x0e(\x1a\x1c\x12\x00\x02\x20\x12\x10"
b"\20\21 \1\0\21\34\31(\r\20%\f)\0\6\0%\4\n\r\30\16\t\4&\0\5\0*\f&\20\16(\32\34\22\0\2 \22\20"
)

L'écriture des données du bytes subit une réduction remarquable, n'utilisant plus 140 caractères mais seulement 91. :D

Une formidable réduction en conséquence de 35% de l'espace occupé en mémoire de stockage, il y a de l'espoir... ;)

Revenons donc à notre image plein écran.

Voici ce que sort le nouvel img2calc :

Code: Tout sélectionner
palette = (
(215,187,149),(239,183,116),(198,122,27),(90,45,18),(190,143,18),(255,255,247),(0,0,2),(190,172,149),(231,187,99),(239,163,18),(149,105,45),(207,176,107),(73,0,0),(149,67,64),(182,114,116),(247,195,133),
)

image = (
b'\xb0\r\21"\1\xb0&\xe3\1\xf0\0\21\xa0$\1C\x021\2\xf3\0\1\20\x93\1\1\x80#\1c\xc1\x013\1\23\x91\1\2#\21\x80"\1\xf3\0\2Q\2\xf1\0S\xb1\1\x023\1\xb0!\xf3\0\22\xa1\2\2#\x91\2\x83\1\1\xf0\37\1S\x91\3\x131\2a\22\x91\1c\1\xa0\37S\2\xf1\0\2\xa1\1\2\xf1\0\3a\2\x91\2\xf3\0\xf0\36S\x91\1\2\xa1\1\2\xf1\0\3a\2\xb1\2c\1\xb0\36S\x91\2\2\x81\1B\3\2\x91\2\2\xd1\1\2#\1\xe0\35\x013\xc1\2\2\xf1\0R\3\xa2\2\x81\x023\2\1\xa0\35#\2A\2\xf1\0\2!\2\x81\1\x92\1\23\xe2\2a\2Q\x023\x80\35#\2Q\2\xf1\0\2\xa1\1\xb2\1\23\x82\2\xf3\0\xd1\x013\xb0\34\1\0\1#\xf1\2\x82\2\23\x82\3\23\2A\2a3\x90\x1c3\xc1\2\xd2\2#\x92\3\23\2\xc1\1#\xe0\33\1#\xa1\2\xf2\1\xc3\2\2\4\xa2\2\3\x121\2\xf1\0\23\1\xc0\4\25\xb0\26\1#\2\x81\2\xe2\1\x93\2\22S\22\4\x82\2\23\2!\2\x81\1\23\1\xf0\1\xf5\0\x005`%\xc0\x015\x80\24#!\2A\2\x81\1\x92\1S\2\4\2\xf4\0Cd\2\xc3\1\xe2\1\xa1\1\2\23\xe0\1\5V%\26\5\a@\5&\5\xb0\1\5\26\5\xe0\23\1\23\2\x81\2\x82\1C\2\x84\2#\xa4\2\x023\xc2\x011\22Q#\1\xb0\1\5f\25\26%0\5&\5 \a5\0\a\20\5\26\25\a\5\0\x050\a\0\a\xf0\0%P%P%\a\xd0\2\5\0\5\0\5\x80\v#\xf1\1\x82\1C\2\xb4\2\23\xe4\x023\xd2\1\xa1\1#\xa0\1%\26E&5\x105 \x156E\26%\6\0\25\0E\a\25 \25&\25\20%\26%\a\25&\25`\5\xa0\1\25\26\25\6\25\xd0\n#\xf1\1\2\3RC\xe4\2\23\xe4\2\x123\xb2\1\xb1\1\23\2\x90\1%\26EV\a\5\0\25\6\25\20\5V5\26\x156\25\26\5&\25\0\a\25F\5\20\x156\25\a\5F\25@UP\25f\5\xb0\n\1#\xe1\1\2\3R3\x94\3\23\xa4\3\2#\xb2\1\xb1\1\23\1\x90\1\5\26\25\20\5f%&%\xf6\0\5\a\5\26\x056%\xf6\0%f%V%V\5@F\5P\5\xf6\0\5\a\x80\n\1#Q\2\xf1\0\23R#\xf4\2H\23H\xf4\2\2\23\xc2\1\1\2\x91\1\23\x80\1\5\26\25\20\5&\25\26%&\x156%\a\25\a\5V5&\25&\25&%\26%&5\a\5&%\a@\x056\5@\5&5\26\5\xf0\t\1#\2\xc1\1\2\23B3\xd4\2\x88\1\23h\t\b\xd4\2#\xb2\1\xb1\1\23\1`\5\26\25\20\5&\25&\25&\25&%\27\5\a\x156U\26%&\25\x86\1\5\a\x0565\a&\25P\x056\a@\5&\25\a\5\26\5\xd0\t\1C\xc1\1\2\3RC\xa4\2\t\xa8\1\23\x98\1\xc4\2\2#\xb2\1\xb1\1\23`\5\26\25\20\5\26%&\25&\25&\25\a\25\a%F\5\a%\26%&\25\x86\1\5\a\25&\25\a%&\a\x050\5FP\5&\5\a\25\26\5\xb0\t\x013\xd1\1\2\3b3\xf4\1\x98\19(\238I\x88\1\xf4\x013\x92\1a\22\21\2\23P\5&\5\20\5\26%&\25&\x156%\x065\26\5&\5\a\25\26%&\25\26\xc5\1&E&\x050\5\a6\x150\5&5\26\5\x90\t\2#\xe1\1\x82\x013\xd4\1\t\xb8\1i\30\3(Y\xf8\1\xa4\1\2\23\xa2\1\x91\1#@\5&\5\20\5\26%&\25&%\xf6\0%\26\25&\5\a\5\26%&\25&%\26%&\5\26%\26\5&\5`5@\5\x86\1\5\xf0\b\1#\xf1\1\3b3\xb4\1\31\xe8\1i\30\23\bi\xb8\2\x84\1\2\23\x82\1\21\2\xf1\0\23@\5&\5\20\5\26%&\25&\5\0\25V\25\a\5&\25&\25\26%&5F\25\0\x156\25\0\5F\25\x80\2\25f\5\xf0\b\23\x81\2\x82\1#\xb4\1\t\x88\2i\30\23\30Y\x98\1\t\x98\1\x84\1\2\23\x82\1\x91\1\23@\5&\5\20\5\26%&\25&\5\20\x156%\0\5&%\26\25\26\5\0\5&5F\5 \x056\25\0%\26\25\x90\2%&\5\26\5\xd0\b\1\23\x81\1\22A\x92\1\23\xb4\1\xc8\2Y\30\23\30Y8:\xe8\1\x84\1\2\3\xf2\0\3\2\xf1\0S\0\a% 5\27%\x005@E 5\0\a\25 \25 %0E@5@5\xc0\2\xf5\0\xd0\b\23\xc1\1\2\21\x82\1\23\xa4\1\31\xf8\2\tH\23\30Y\b\x8b\1\xe8\1\xf4\0\2\23\xf2\0\3Q\2\xf3\0\x80\26\23\2\xd1\1\xf2\0#\xa4\1\b\t\x98\2\32\33\32\xf8\0\23\xf8\0\n\xfb\0\n\xa8\2\t4\2\23\xf2\0\3\2!\2\23A#\xf0\25\23\xe1\1\xf2\0#\x84\1\31\xb8\2\32;\nh\23\xf8\0\n\xfb\0\n\xf8\0)\xf8\0\31D\23\xf2\0\3\2\21#Q\23\1\xd0\25\23a\2a\xf2\0#\xf4\0\x98\1)\xa8\1\23K\nX\23h\nk#Xi\x98\1\t$\2\23bC\xf1\0\23\xd0\25\23\xc1\1\xf2\0#d\xa8\1I\xa8\1\n\23KX\23X\nk#\nX\xf9\0\x98\1\t\24\22\23b\23\2\x91\1\23\1\x90\25\21\23\xb1\1\x82\1\23d\t\xf8\0\x89\18\32\3J[\nH\23X\nk\23\nX\x99\1\xa8\x014\23R\23\x81\1\2\1#\x80\25\x023\xa1\1\x82\1\23d\x88\1\x99\18\n\xcb\1\nH\23X\xfb\0\23\vX\x99\1\xb8\1$\2\x0323\2a\22\21\23\xe0\24\1\23\2\1#\2Q\2\3\xf2\0\23d\x88\1\xb9\18\n\xcb\1\nH\23H\n+\23\n+\n\vX\xa9\1\xb8\1\t\24\2S\22\23\x91\1\2\23\xc0\24#1#\x021\23b#d\x98\1\xb9\18\n\xcb\1\nH\23H\n+#;\nX\xb9\1X)(\t\24S"\3\2\xa1\1\3\1\xa0\24#Q\2#\21\3\xf2\0\3\xf4\0(9H\xb9\18\n\v:#K\30\t(\3h\n\v#\v\n;\nX\xa9\1HI(\x143R\3\xa1\1\2\3\xa0\24#a\2\23\22\3b\23d(\xf9\0\30\xb9\18Z\v\23;\n\30\t(\3h\32\23\n\v\n;\nh\x89\1HY(\t\x043\xf2\0\xa1\1\3\1\x80\24\23\2\x81\1\2#b\23d8i8Y\xe8\1\v\23;\nH\23(\24(\32\v\30\32;\nX\x89\18\xf9\0(Sb\1\2\x81\1\2\23\xf0\23\23A\2\1\2!\2#2\23TX\xf9\0H\t\xa8\2\n\f+\32\vH\3\48\31\xf8\0\n\33*\x98\1)Xi83\4#bA\x021\2\23\xd0\23\1\3\2a\2!\3\2#\22\23TX\x89\1\x88\3\v\3\33\32h\3\xe8\1\32\33\xc8\2i(\23D\2\23R\xb1\1\3\2\xc0\23\23\xb1\1\3\22CTh\x89\1hl\xb8\1:8\t(\f\xe8\1\v\xc8\2\31\bY(#T\23b\xa1\1\23\xb0\23#\xa1\1\x0323Dh\x89\1X\34=<\xe8\2\23\\\xa8\2\t\xf8\09()(\238D#B\xb1\1\23\xa0\23\x131\2Q\2\x03234h\x99\18\34\r\16m,\xa8\2,\r\fM\34H\31\x98\1\4\x88\1\4\31\xf8\0\23h$\2\23R\xf1\0\2!\23\x80\23\2\23\x81\1\2\23BC\24\th\x89\18\f\xbd\1,h9HL\16\f]\34(Ih\31\x88\1)h\23\x88\1$#2\3\2\1\2\x81\1\2\3\1\xf0\22#\x81\1\2\3Rc\b\tX\x89\18\f\xbd\1,XIHL\16\f\r\16=\3489\xf8\0\t\xa8\1\th\38\tX$\23B\3\xb1\1\23\xf0\22\3\2\x91\1b\3D#h\x89\1(\f\35\16=\36]\348Y8,\r\f\3\16\f\r.-\34\x88\4\23H9(4\23\x042\3\xb1\1\3\xe0\22\23A\2AR\23T#X\xf9\08\f\r>\x9d\1\34\30\t\bY8\34\35\f\3\r\f\r\36M\f\x98\1I89H\t(\238\xf9\0\30$\2\3R\3A\x121\23\xd0\22\3\2\x91\1R\x134H\23X)h\34\r>M.-\f8Y8\34\35\f\3\34\xfd\0\34\x88\1I8Ih\238\x89\1\x184\23R\1\2\x81\1\2\3\xc0\22\2\3\xa1\1B\x134\30\t(#\xe8\1\34\r>=>-\34(Y(,\35<=\16-\34\x88\1I(YX\23H\xf9\0(D\23R\x81\1\2\1\3\1\xa0\22\2\23\x91\1B\23$\t\xf8\0#\xd8\1\f=\16MN\35\34(Y(,\36,=\36-\34h\t\309\30i8#X\xf9\0(\t4\23b\x91\1\23\1\x90\22#\x81\1B#$(\31\30\t\30#\xf8\0\318\x9d\1>-\34(9H,\36\f\3\f\r\36\r\36-\34X\31(\31(i(\238\31\30\xf9\084#b1\x021#\x80\22\2\23\21\x121\2\x012#$\30IH#X9(\f]\36-\16M\f(\t8\t(,\35,.],\b\t()hY(\23\xc8\1)X4\2\3b1\2A\23\x80\22#\x91\1"#\2\24(IX#HI\30\fM.\x8d\1\f\xc8\1\34\35,\x8d\1,H9\xd8\1\23\xb8\1\f\x98\1\t4\23b\x81\1#\xf0\21\23\x91\x012#\248Y\30\t(\23HI\30\fM.=\16-\34\xc8\1\34\35,\x8d\1,H9H\th#\30\tXlh\tD\3b\x81\1#\xe0\21\23a\2!2\3\22\24\tH\31\x88\1\23898\fM\16M\16-\f\xd8\1\34\35,\35\36=,\xb8\19h\3\xf8\0,]\348\t\30D\23R\x91\1\23\xe0\21\23\x91\x012\23\2\24\t\x98\2#8\318\f\xfd\0\36M\f8)h,\r\f\3\f\r>-,(\t(\x99\1\30\t\b\4\3h\34\xad\1\fhD\23R\x91\1\23\xc0\21\1\3\xa1\x012\3\22\24hL\xf8\0#\x88\1\4\34-\36\r\36=\f(Yh\\\r>\35<X\xa9\1\30\t\23\xf8\0\f]\36M\34X4#B1\2A\2\3\1\xb0\21\23\xa1\1"\23\2\24\tH\x8c\1\3X#\x88\1\34-\36\r\36-\f8Yh\\\r>\35<X\xa9\1\b\t\4\23h\34]\36M\34X\t4\23B\xa1\1\23\1\x90\21#\x91\x012\23\2\24H,M<\b\318\23\x88\1\34\x8d\1\fH\xf9\0XL]<X\xb9\1\30\3()\30\34\35\36\35.]\f\xf8\x004\23B\x91\1\2\23\xd0\4\25\x90\f\23\2\21\2!\2\x112\23\2$8\34\xfd\0,\x88\1\23\x88\1\fM\34h\x89\1h\23\f=Lh\xa9\1\30\23\309\30\34\35.M\36-\34\xf8\0$\23R\x91\1#0\xf5\0\xa0\2U\26\5\x80\f\23\x91\x012\23$\t\30,=\36M\34(\tH\23\xa8\1\34\x98\1\x89\1h\23\x8c\1\xf8\09\4I\b\2389\30\34\35.M\36=\f\xf8\x004\23BA\2A\x130\5V\5\xa0\2\5&\25&\5\xf0\v\23\x91\x012\23\24\t(,=\36M\34()8\23\xd8\2\x89\1h\3\b\xfc\0(\tHI\b\4(\n\2389\b,\35.\xad\1\f\xf8\x004#2A\2Q\3\1 \5f\5@\5\0\a`5&\25&\5P%0%\xd0\2\27\5\xd0\6\23\2\x91\1"#\248\34M\36\r\36\35,()8#H\tX\t\x88\1ih\38\rX\31h\t\b\v\n\b\n\v\n\3HY,-\16\35.m\f\xf8\x004#2\xb1\1\23 \5&\5&\5\20\25\26\25\0U&\5&\xa5\1\0\5\26E\26\25\x80\2\x85\1\xa0\6\23a\2\x112\23$(,\xfd\0\36\35,h*\b\n\2389H98ih\3\b\t\x88\19X\n+\32\3h9\b,].\35\16=\f8\31(4#2\xa1\1\23\21\0\5&\25\x165f5\xf6\0\25&\25&\5\a\5&\25V\5@\5\x1650\5f\5\xa0\6\3\xa1\x012\3\2$(,\35\36\x8d\1\34h\n+\n\v#\3098Y89\x88\1\3\30\thIh\n\v\n\23\30#\v\30\31(,\x9d\1.-\f8)\30\t$#2\xb1\1\23\1\0\5f%\26%&\a\25&\x156\25&\25&%&\25&\5\6\25@\5F\x0505&\5\xa0\6\1\3\x91\1B\3\2$(,\35.-\16=\34h\n+\n\v\b#\30)8i8)\x88\1\3\x98\1Ih\v\32\3\v\b\n#\n\30\t8,\x8d\1>-\f89\b\t$\2\x132\xb1\1#\0\5V5\x165\26%&%&\25&\25&%&\25&%P\5F\x0505&\5\xa0\6\23!\2Q2\23$8,\35.\35.-\34h\32+\n\30#\b)8i\x98\1\318\3\x98\1I(\31\30\n\23\b\n\v#\v\n\xf8\0\34-.->-8Y\30$\2\x132\1\2\x81\1#\0\5V5\x165\26%\26\25\a\5&\25&%\26%\26\a\5\a\5&\25P\5F\5@\25&\25\xa0\6\3\2\x91\x012\3\2$8\4\34]N\35\34h\n;\n8\23hI\xa8\1)8\3\xa8\1)X\4\n\23\33\bK\n()\30\34=\16=>\35\f8Y\x184\x132\xb1\1\23\0\5V5\26\25\a\5\26%\x165&\25&%\26%\26\5\a5&\5@\5F\5@\25\26\25\xb0\6\3\xa1\x012\3\2$\30\t\b\4,MN\35\fh\n;\32H\23\4X9\xa8\1)8\3\30\t\xf8\1\32\3\n\b\nk\n()\30,\x8d\1\16\35\16\348Y($\2\23"\xb1\1#\5&\5&%&\25&%&\x156\25&%&\5&%\26\25\26\5@UP\5&5\x80\6\1\3\xa1\x012\x034H,M>-\f\30\t(\nK\n\vX\23h\31X\318)8\3\xa8\2\n\3\n\b\v\3k\n()(\34\xbd\1\34Hi\x184#\22\x81\1\2\21#\5&\5&%\xf6\0%\x86\1\25&%V\a\5\a\5\26\5&\5PEP\5V\5\x80\6\23a\2!"\23$\t\30\31\30,]\16-\34\30\t\b\32[\n\xf8\0\23\xd8\1)()8\389\xa8\1\3\n\b\v\30\n[\n\30)H\34-.M\fXi\x184#"!\22Q#\5&\25&%f\27\25\xf6\0\25&\5\0\25F\5\20\5V\5\xf0\1\5f\5\xf0\5\1\23a\2\21\2\3\22\23$\t\30\31(<],H\32;\32X\t(\23\x98\3\3(iX\4\23\n\b\n\23k\n\xb8\1,\r.-\34hi(4#\22!\2a#\x85\1 \xf5\0 \xf5\0\0E E0e\xf0\1\x85\1\xf0\5\23\xa1\1"\23\2$\b\t\4)(,\rlh\n;\n\xc8\1\23X\31\xf8\1\3(\xf9\0H\23(\nk\32\xe8\1lX\t(i(4#"\x91\1\2\23\1\xf0\17\23\xa1\1"\x134Y8\x8c\1\xf8\0\32\v\32\v\xc8\1\23H)\x98\1*\30\23(\xf9\0H\23(\nk\328\t\b\t\x98\1\34X9(i(4\2\23"\x91\1\2#\xf0\17\23A\2A\3\22\x134\xb8\3\32\v(I\x88\1\3\x88\2\n\v\b\n\b\23(\xf9\0(#8\32;\328\xf9\0\xd8\1Y\30i(\t4\2\23\22\x91\1\2#\xf0\17\23\x91\1\2\3\22\23$(j\x88\3I8\318\23\xd8\1\n+\n\b\23(\xf9\0\30#h:\v(\xa9\1X\31XI(Y8D\23\22A\22!\2#\xe0\17\1\3\2\x91\1\2\3\2#\24\30\n\x8b\1\32\vhIX\t\30I(98\23X*\b\v\32;\n\b\23(i(\23\xd8\1\t\b\xb9\18\t\x88\19(IX4\23"1\x031\2#\xe0\17\1\3\2\x91\1\23\2#\24\30\n\xab\1\nhYH\t\30I(I(#H\n\v:K\n\b\23(Y(\23\x88\2\xb9\1\x98\1\338\tHIH4\2\3"1\x021\2#\xe0\17\23!\2a\23\2\23$\b\n\xdb\1\n(\xf9\0\xf8\0I\30YH\23(\xab\1\n\30\23(I(\23XIX\xc9\1X\v\32;*\x98\19(4\3"1\x021\2#\xe0\17\3\2\xa1\1\3\22\23$\n+\3\n\xab\1\n\30\xf9\0\xe8\1YX\23(\n\xfb\0\n\v\30\23\x98\1\238\x89\1H\xc9\1X\x9b\1\n\xf8\0Y\x184\23\x121\x021\2#\xe0\17\3\22\x91\1\3\22\3\2\24\b\n\33#;\n[\n\30\xf9\0\xe8\1Ih#\30*+*(\4\23\x88\1#8\x89\1X\xa9\1(\t\30\n\xab\1\nhY($\23\x121\x021\22\23\0\a\xc0\17\3\22\x91\1\3\22\3\2\24\b\n\v\23\32;\3\nK\n\30\xf9\0H)h9(\318#\30\32\33*H\23(\4\t(#\30\xb9\1X\x99\1h\xbb\1\nhY(\t\24#\22!\x031\22\23\0\a\xb0\17\23\22\x91\1\3\22\3\2\24\30\32\v\n;3\n\33\32\30\xf9\089\xf8\0)(9(\238\v\x88\1\23(\31\30#X\xf9\0h\x89\1h\nk3\32hY(\t\24\2\23\22!\22!\22\23\0\a\xb0\17\23\22a\2\21\3\2\23$8\nK\n3\v\32\xe8\1)\xd8\1I8\23\xf8\0)\30\23(\t\30\4\23(\t(9\xa8\3\n;\n+\n\23\nhiH\24\23"a\22\23\1\0\a\xa0\17\23\2\x91\1\2\3\2\23\24\t8\n;\32\b:\vX\xfc\0\xf8\0\t\xa8\19X\23\b\t(9\30\23H\2389H\xfc\0\xb8\1)8\n\33\n\3;\n\xa8\1YH\24\23\22A\2\21\22\23\1\0\a\xa0\17\23\2\x91\1\2\3\2\23\24HK\32\x98\1\xac\1h\31\xa8\1\31h#89\30\23H\2389(\xac\1\xa8\19(\n\33\23;\n\xa8\1YH\24\23\x121\2\3\1"\23\1\0\a\xa0\17\3"\1\22Q\2\3\2\23\248\nK\n\x98\1\34\r\f\x8d\1\34X\4\xc8\2\23(9\30\23(\23X9\b<M\\H\4\30Y\30\n\v\23\32;\nH)\30iH\4\23\x121\2\3\21\22#\0\a\xa0\17\3"\x81\1"\23\248*+\nX\4\b\34m\36]\f8\t\30I8)\x88\1#8\t\30\23\30#\x98\1\34\xad\1<Xi(\n\3\n\b\n;\n\v8I898\4\23"\21\22\3\21\22#\0\a\x90\17\1\3"\x81\1"\3\2\24X\v*\xf8\0\34=\16\35.]\16\fh9(Y\x88\1\23X\23\b#\3098\f=\36\x8d\1,\30\t(I\x88\1\n;\n(IHI(\4\2\23\22!\2\3\21"\23\0\27\x80\17\1\3"\xf1\0"\23\2\24\xf8\0\32\xf8\0\34=\16\35.\xfd\0\fX9\30i8\t\b\t(\23HC(I\30,\35.\x9d\1\34h)\x98\1\n;\n(I8Y(\4\2\23\22!\2\3\21"\23\0\27\x80\17\1\3"\1\2\xf1\0\2\23\24\x98\2\34\35\16\35\16-\16=\36-\348I\30iH\tH\23(C(Y\30,\35.-.=,\xa8\198\32\33\32\xb8\1Y(\t\4\23\x121\3\21"\23\0\27\x90\17\3"\1\2\xf1\0#\24\x98\2\f-\16\xfd\1\34H)8\xf9\0\3098\23\x1838I\30,-\36M\36=<\x98\198*\v\xd8\1Y(\t\4\2\3\22\1\2\21\3\x012\3\1\0\27\xf0\2S\xb0\v\23\22\x91\1#\24\x98\2\f\xbd\1\fm\34X\tHY\xc8\1\23\b#8Y\30\34-\16\xad\1\36\r,\xa8\1)H\4(\t\xc8\1I(\t\4\2\3\x121\22\1"\x037\xd0\2\x023\37#\x90\v\23\22\21\2#!3\24\x98\2\34\r\xbc\2\xb8\19\xf8\1CHI\b\34-.\x9d\1\36\r,\xc8\1\t\x88\1\t\xd8\1)8\t\4\2\3"1\2\1\22\x137\xd0\2\23\37\3?\23\x80\v\23\22\xc3\1\2\x93\5\xf4\0\x184\x98\1\31\b\t\24\30C\xa8\1\34-\xac\2\x93\2\xa8\3\x043\2A\3\1\2\23G\xc0\2\2\3?\3?\23\x80\v\xf3\0!\xf3\2\f3L\xc3\6\x88\1L\xa3\1@W\0\x97\1 \xb3\4"3\x017\xc0\2\2\23\17\3/\3?\23\xf0\n\1#\2a\2S\xf8\3\23\34\23\xf8\0\xe3\3\20\xc3\1\0\a0\xe7\5\0\' \x1707\21C\1g\x80\2\22\23\2\23_\3?\23\xe0\n3\x81\x013\24\x88\2\3\xdc\2\xd8\1\xa3\1H#\b#\xa0\1\xf7\t\0g\x90\1\22\xc3\1\xbf\1\3\2\xc0\n\1\23\22\x81\1\2\23\2\24X)\xf8\0\34\xed\1.\r,\xb8\3\23(\23\b\23\x97\f@\22\23\22\xa8\1\2\23\xff\0\3/\23\xb0\n\23\22\xa1\1\23\2\24\30\t\bYh,\16=\36-\16-.\35\f\x98\2\t\x88\1\238\23\30\23\0\xe7\v \2\23\22\x88\2\23\xaf\1\23\2\xa0\n\23\x121\2Q\2\3\2\24\30\x89\1h\34=>\r.\35.,\xf8\0\n\33\n\v8)X#H\238\23\xb7\v\20\2\3\2H:\vHI(\23\xaf\1\23\xa0\n\23\x121\2a\3\2\24\30\x89\1h\34=>\35\16-\36\r,h\n;\n89\b\t(\23X\23H\23\0\x97\v\2\23\2HK\n\v8Y\30\23\xbf\1\3\2\x90\n\3"\xf1\0\2!\23\24\xa9\1h<\16\r>\x8d\1\34\nX\nK\n8Y\30\3\xf8\0\23X\23\0\xd7\n\2\3\f\xf8\0\2\3[\32\30i\30\23\xaf\1\23\x90\n\3"\xb1\1\23\24\xe9\18<-\16=\36=\f\xf8\0k\n(I\30\3(9\30\238\t(\23 \27 \'\xb0\b\1\20#\2\x98\1\v\n\3k\n\b\xf9\0\30\23?\3_\23\x80\n\3"\xb1\1\2\3\24\b\x89\1\b9HL]\16-\34\x88\1k\n()\30\238I\b\238\31(\23\xc0\t\2\23\2\xb8\1\32\xbb\1\bi(\3\xbf\1\23\xf0\t\3"\xb1\1\2\3\24\30Y(\31\4X\nL\xfd\0\34\x88\1\xfb\0\n(\t(\4\23(Y\b\238\318\23\x90\t\2\3\f\2\xd8\1\nK\n\3;\b\n\30Y(\23\xaf\1\23\2\xe0\t\x032\xb1\1\3\2\24\b9H\t\4\t\30\v8\v\3\xac\1\xb8\1k\n\30\t(\23XI\b\23(I(\23\xe0\b\238\31\4\t\xa8\1\n;\n\23;\n\30Y8\23\xaf\1\23\xe0\t\x132\xa1\1\23\24\xc8\1\32\33\32H\nL\xe8\1\n[\n8#\xf8\09\b\23\b\xf9\0(\23\xa0\b\2,\3(\31\4\31\30)hZ\23+\n(9X\23\xaf\1\23\xd0\t\1\3"!\2\xf1\0\23\248\31h\23;\n\v\xf8\2\32;\3\v(#H\t(9\b\23\b\x99\1(\3\xf0\a\aL\r\xf8\0ih\4\30\32\3\33\n8\t\x98\1\23\xaf\1\3\2\xd0\t\x032\xa1\1#\48)X\23K\n\x88\1\t\b\t\xb8\1\32;\n\v(\23X\t(9\b\23\b\xa9\1\30\23\xd0\a\3\34\35,\xf8\0i\xa8\1J(\31\x98\1\2\3\xaf\1\23\xd0\t\23"Q\x121\23\4\xc8\1\3\f[\nhI\xb8\1\32\33\32\30\23\xb8\19\b\23\b\xa9\18\3\xa0\a\3\f\r\36\35,\30\tHi\xb8\1\v\n\v8\31\xa8\1\23O\3O\23\xc0\t#"\xa1\1\23\4\xc8\1\n\3[\32XY\b\t\b\4\xf8\0:\30\238lH\t\b\23\b\xb9\18\3\xe0\6\2\3\34M,\4\b\31HY\xf8\0I(\t\b\31\4\31\xa8\1\23\xaf\1\23\xc0\t\23"\xa1\1#\4\xa8\1\v\n\xfb\0\nHi(I\x88\1\38,-L(\t\b#\b\xa9\1H\3\xd0\6\3\f\r\16\r.\r,\4\b\t\xf8\0\31X\x99\1\30\31\b)h\t8#\xaf\1\3\2\xb0\t\x132\x91\1\2\23\4\x98\1\v\n\xab\18Y(Y\xf8\0\23(,M<(\t\b#\b\xa9\1H\23\xc0\6\f\r\36\r.\r,\4\xa8\1\tX\x89\1H9h)\30\2\23O\3O\23\2\xa0\t\23B\x91\1\2\3\48\t(\32\xbb\1\nHI(iH#(\3\f\x9d\1\34\b\31\b\238\x89\1h\3\xa0\6\34\36\r.\r,\4\x98\2\x99\1\xe8\1I\30\2\3\xbf\1\23\xb0\t\2\3"1\2a\23()\b\3k\n\3K\nX)(\xf9\08#8\34\35\16=\16\35\34\30\t\b\23XY\x88\1\3\xf0\5\2\34\r\16-\\\4\xa8\2\xf9\0\xd8\1i(\23\xbf\1\23\xb0\t\x032\xf1\0\2\21\23\4\30)\b\n[\32\23;\n\xb8\1\xf9\0(\23X\f\35.-\16-\34\b\t\b\23\x88\1\t\xb8\1\23\xc0\5\2\3\xac\1\24\31\xf8\0*\xf8\0)\30\t\xe8\1\xf9\0\30\2\3\xbf\1\23\2\xa0\t\23"\xf1\0\2\21\2\23\30)\b\nK*\23;\n\xb8\1\xf9\0\30#H\34\35.m\34\r\t\b\23\xd8\2\23\xc0\5\3\2\xac\1\4\b\t(\4H\n\b\32\xf8\0\t\xf8\0\4\x98\1\xf9\0(\3\xcf\1\3\2\xa0\t\x132\xa1\1\23(\31\30\n+\32\b\n\23+\n\309hi\30\23h\34\35.-\16-,\30\238\tH\v\32+\32X\3\xa0\5\3\28,H\t(\n\33\3\n\30\n[\32\x98\1\xec\1\x98\1\2\3\xcf\1\3\20\x025\xb0\b\1\x032\xa1\1#\30\t(\32\v\n(\v\23\33\328\4\thI\30#\xf8\0\34m.\35,\30\23()8\n\xfb\0\328\3\x80\5\22\30\th\tH\n+#\xfb\0\n\x88\1\f-.=>\35,8\31\30\23\xbf\1\23\25F\5\xa0\b\23"1\22Q\23\b\tH\32H\32\v\32\v\xa8\2\23\x98\1\34M\36\r\16-,\30\23\309(\n\xab\1\n8\23\xd0\4\2\3\30\4\xd8\1K#[\n\x88\1\fM\36=>-\16\r\34X\2\3\xcf\1\3\25V\xa0\b\x1321\2Q\23\b\tH\32X*\vh\4\xa8\1#\x98\1\34M\36M,\30\23()(\n\xab\1\32(\23\xd0\4\23\xf8\1[#K\32\v\xf8\0\f\r\16\x8d\1>]\34X\23\xbf\1\3\2\x156\5\xa0\b#2\x91\1#\xa8\1\31\x98\1\x9c\1\3\30#H\318\34\xbd\1,\30\238\t8\n3\xfb\0\328\3\xc0\4\3XIX\x8b\2h,\35\36\xdd\1\16-\fX\3_\3_\3\2\25\26\25\xb0\b\x132\xa1\1\23\xb8\198,\x8d\1<\3HI8\34\xad\1,\30\23H\t8\32#\xfb\0\nH\3\xb0\4\3(\xf9\0h\xbb\x013\n\30\t(<].\x8d\1\16-\fH\23\xbf\1\23\25\26\5\xc0\b\x132\xb1\1\23\xa8\19(\34\35\16m\34\b\23Hi(\34\r\16\35.=\34(\23\xb8\1\v\n\x8b\1\nX\23\x90\4\2\30\x89\18\31\b\n\xab\1#\v\n\30\t8L=.=.M,8\2\3_\3O\23\2\5\26\5\xc0\1\a\0\a\xc0\6#"\xb1\1\23\xa8\19(\34\x9d\1\f\b#H\xf9\0\30\34=.-,(\23\xf8\0\t8\n+\23;\nX\23\x80\4\22\30\x89\18\31\b\4\n\xdb\1\n\b)(\xfc\0\xfd\0.M,H\3_\3O\23\2\5\26\5\xf0\0\a\xf5\0\xc0\6\x132!\2!\2!\2\23(9(9\30\34=.\35\34\b#\b\f8\xf9\0\30<\35.-\348\23h\31(\n;#\33\32\xf8\0\3\xf0\3\2\30\x99\1()\30*\xbb\1\n\b)8\4\xac\1\x8d\1<\4H\3\xbf\1#\5&\5`\5f\5\xc0\6\1\x032\xb1\1\23(9\xf8\0\34M.\r\f\30\34\30,(i8<M,H\23h\31(\n+\32#\32\x98\1\3\xe0\3\3\30\x89\1(I(\4\n\x8b\1\b\n(\tH\31\30\x9c\2\r\f\24H\23_3\17#\5&\5P\5\xf6\0\5\a\xc0\6\23"\xb1\1#\309\xf8\0\34]\36\f\b\3\34\b\3L\30iX\xfc\0(\t(\23\x98\1\v\n;\n\b\33\32\xa8\1\23\xd0\3\3\30\xf9\0\x98\1\33\b\v*;*\x98\1)($\xdc\1\24\b\t83\17\xa3\1\5&\x050\a\0\5\26%&\5\xd0\6\1\x032\xa1\1#()\30\tH\34m\f\3\b,\b\\\30ihL\x88\1\23\x98\1\32;\n\x88\1)H\23\xc0\3\3\30Y\x98\1\2cZ\4\xb8\1)\30$(\xac\1\4\30\t8\xf3\1\5&\5P\5\x165\26\5\xe0\6\x032\xa1\1#8I8,\r.\35\f\30\f\b\f\b\f-,\30i\xd8\1\tX\23\x98\1\n\v\n+\n\xf8\09X\3\xc0\3\3\309\x98\1\23\xf2\0\23\2\x98\1\2XIH4h\31H\4\xf3\1\5&\5@\5&5\26\5\xe0\6\1\3"1\2a#(Y(,\r.\r\f\30\f(\f=<\bY\xa8\1\t\x98\1\238\t\xf8\0*\x88\19h\3\xa0\3\22\30\31h\t(\3\xb2\1\238\2\x83\1\4\b9\bi\xa8\1\t8\4C\xf2\0#\5&\5@\5&5\26\5\xf0\6\x132\x91\1#8I(,\35\16\r\f\b\3\34\b\34\r\16-<\30Ih\t\30\318I\b\23\30YX\v\n\30)89(\t8\3\x90\3\3\x88\1)\30\4\3\xc2\1\b\3(\2\3\x82\1\23\28\31\4\t\xb8\1\tX\4\2#\x92\1\23\5&\5P\5\xf6\0\5\xf0\6\x132\x91\1#8I(,=\f\b\34\b\34\35\36\35<()\xa8\1\tHI\b\23\30i\x88\1)8)8\31(\23\xf0\2\2\3\xb8\1\24\2\23\xb2\1\b\3\2\b\2\23\xa2\1\38\31\4\xd8\1\tH\4\2\23\xa2\1\23\5&\5P\5\xf6\0\5\xf0\6\1\x132A\22\21\2#(I(,-\f\b\23\b\3=\16-<\x88\1)8)(Y\b\23\30\xf9\0\30\31(I\xf8\0I(\23\xd0\2\2\3H\3"\b$\2\xc3\1"\3\2\b\4\2\3\xb2\1\3\2(\31\xa8\2\4\2\4#\xa2\1\23\5&\5`\25&\5\26\5\x80\a\1\x032\x91\1\2\23(I(<\r\f\3\f\3\b\3\f\xfd\0,\x88\1I()(i\23\b\xf9\0(9\309hi8\3\xc0\2\3H\3\0\22C\2\0G\0\a"c\2\4\23\xd2\1H\4#\28)X4\3\xc2\1\3\2\5&\5\xf0\0\xf5\0\x90\a\x132\x91\1#\x98\1\4\f\r\34#\b\34\x8d\1,hi\x98\1Y\23\30i(\31\xe8\1YX\3\xa0\2\2\b\2(\3\2\'0\xe7\1 \a\22\x93\1B\38\2\x132\23\2$8D\2\23\xc2\1\3\2\5&\5\x90\t\x132A\x0213\30\thL\3\b\3\34=\36-,h\xf9\0\x88\1Y\23\30i\xb8\2YX\3\xa0\2\3\2(\2\3\0\xb7\1\xf0\0\'\xf0\0\22c"\38\2\3R#\2\x84\x013\xb2\1\23\2\5&\5\xa0\t\3B\x91\1#\x98\1<\3\b\3\f]\36\35<X\x89\1\x98\19\b\23\30i8\x9c\1hIh\23\x80\2\22(\23\2\27\xf0\2\a\20\'@\22C\2\30\4\3\xf2\0\xe3\1\xc2\1\a\3\25&\5\xa0\t\23RA\22\21#\x88\1\4\3\f\3\b\34\r.=\16\35,\xf8\0iX)h\23\30I8\34\x8d\1,H9\x98\1\3\x80\2C\2\xc0\3\xd7\1\0\3(S\xf2\0c\xf2\1\3\2\x156\25\x90\t\23R\x81\1\x023h\34\23\f\35>],\x98\1Ih9X\4\3\309(\34\xbd\1\16\34(9\xb8\1\3\xb0\2\a\x90\4\xa7\1\x003\'\2\xf3\0\xc2\2#\2\a\5V\5\x90\t\23R\x91\1\2#\4\b)\30\23\b\34\35>],\x98\1\31\xf8\0YX\4\3\309(\f\x9d\1\16=\34\30\t\30\t\xb8\1\23\x90\a\xf7\0#\0G\22\x93\1\xd2\x013\22\a\5\x036\5\xa0\t\1\23R\x91\1\2#4#\30<.],H:X\n\vHYX\3\30\318\f=\36=.=\34\x88\1*\vH\23\xe0\a\xa7\2\5\x93\2\2\20\22e\xc0\t\23\xf2\0\x81\1\x023\4#8L=LH\n+\n8\32\v\nXIX\3\4X\34\35N\x9d\1\34h\n\b;\nX\3\x90\1%\x90\6G \a\2\27@\xf7\1\0G\0\5\2\6\a\5\x80\n\23\xf2\x001\2Ac(\t(\x9c\1h+\n\3\v\30\n;X9h\23H\34-^-\16]\34hK\nh\3\x80\1\5\6\5\xc0\6\a\x90\1\x97\3\5&\5\x80\n#b\xa1\1C\x88\1\xfc\0h\n+\23\33\n[H9h\23H,\35^-\36M\34hK\nh\3\xf0\0\25\6\xb5\1\20\a\xc0\6\xd7\2\0\5&\5\x90\n\23\xf2\0\xa1\x013\xf8\2\n+#k\nH9h\23H\34-^-\36]\fh\n;\n(\t8\23P\25\xc6\1\5\a\xd5\t&\5\xa0\n\23\xf2\0Q\2!3\30\t()H\31\xf8\0\n+\32k\32H9(\31\30\238,=\36]\36]\fh\n;\n\x98\1\3@\5\x86\f\5\xb0\n#ba\2SH9\xd8\1\n\xab\1\32h\31(9\b\238,\xbd\2\f\xf8\0\n[\n\v(\t\30\x130\5\x86\f\5\xb0\n#R\3\2Q#\2#H9\xd8\1\n\x8b\1*\xc8\1\t\4\31\b\238,\xed\1\36-\f\xf8\0\n;\32\23\n\v8\x130\x156\x005\xe6\n\5\xb0\n\1#R\3\x021#13\309H\31\xf8\0\nk\n\33\xd8\19\b\238,M\16=.\35.\35\fh\v\n;#\v\32\b\t\30# \25\26\25P\xf5\4\xd6\5\5\xc0\n\1\23b\3\2\21\2\23\2A3\xf8\0Ih\32[#\30\t\30)\xf8\0\t\30\238,=.-.-\16-\fH\n#;\32\33\32\b\31\30#\1\0\25\26\5\xa0\6\xe5\4\26\xf0\n\1\23b\3\2\1\23\xf1\0CHYH\t\30\32[\23\v89\x98\1\238,->=\36m\f8\n\33\23\xfb\0\32\b\31\bC\1\25\6\5\x80\v\a\5\26\5\xf0\n#b3\xf1\0\2CHI8\31\30\32\xfb\0\n89\x98\1\238,->\xcd\1\f8\n\xcb\1\n\b\31\bS\25\6\5\x90\v\5\6\25\xf0\n\x013B#\21\2\xf1\0C89H\318\32K\n\v(I\30\th\238,=\36-\16=\36=\fH\n\xab\1\328\23\1\2#\25\xb0\v\25\xa0\v\1\x93\1\xd1\1#(\31\xf8\0\tH*\v*h\tX\32(\238\n\34\xfd\0\36=\36-\fX\32\x8b\1\nH\23!3\xf0\27#\2\3\xe1\x013\xb8\1\31H*\xe8\1\n\33\n\v\n#\32\30,\x8d\2\34X\v\32K*8#13\1\xb0\27\1\0\a\23"\3\xe1\1#\xb8\1\31\xd8\2;\n\b\n#\32\30,\x8d\2\348\t(\xfa\08\23\2AC\xc0\x055\xa0\21\27\x132\3\x81\2#\x98\19\xa8\2\nK\n#;\30,M\36\xfd\0\34(9\xc8\1\23\xf1\x003\20\a\xe0\4%6\25\x90\21\a\23B\3\2Q\22\xf1\x003\xf8\0)\xc8\2\3[\23+\n(,-.m\34(I\xa8\1\23\x91\1C\a\0\a\xc0\4\25V\25\xa0\21#b\x81\x023\xf8\1\xf9\0X\v\nK\23+\n(\4<\16\xfd\0,(Y\x98\1\3a\2A3\0\'\xb0\x045&\5\xc0\21\1\23b\x91\x023\xd8\1\x99\1X\nK\23\33\32H<]<(i\x88\1\23\xc1\1\2#\0\'\xc0\4%&\5\xd0\x113R\1\2\x81\x023\xb8\1\xa9\1X\n;\23\v\32\x88\1\x8c\18\xf9\0h\23\xf1\1#\20\27\xd0\4\25&\5\xe0\x113bQ\2!\2\xf1\x003\x98\1\xb9\18\v\32+\23\32\xe8\2iH#1\2a\2!\2\23\2\3G\xc0\4\5&\25\xf0\21\1#b\xb1\x0238\t(\xb9\1(\n#\33\n\23\n\xc8\2\tH)(C\xf1\1\2\3"\3\1G\xa0\4\25\26E\xf0\21\1#R\xc1\2#h\x89\18\v\n[\n\23(\t\xa8\1\31H\31\xf8\x003\xa1\1\2A\2\x132\3g\x90\4\5V\25\x80\22\1#b\xb1\x023X\xf9\08\32K\32\23(9\xf8\0)\xb8\1C\x81\2\2\x132\23g\x80\4\25V\25\xf0\21\27\20\23bA\2\xe1\x013hI8\32;*\3\4(IXI\x88\x013\xc1\1\x021\x82\1\3\0g\x80\4\x85\1\x90\x127#R\xd1\2Ch\tXJ\30\238Y8YX3\x91\1\22\xf1\0\x82\1\23\xf7\0\xc0\x177\1#Ra\2Q\2Q\2S\x98\2\23(i8\t\b\31H3\2\xa1\2\2\3\x82\1\23\x87\1\xe0\27\'\1\23b\xc1\1\2a\2S\x88\2\23(i\xa8\1C\xb1\2\xa2\1\23\0\x87\1\xf0\x177#b\xd1\x023\xb8\19\b#\30i\xf8\0Ca\x021\2Q\xd2\1\23\1\x97\1\x80\x187#b\3\2\xf1\1\22A3h\t\b)\b#(Ih3\2\x81\2\xf2\1\23\1\xb7\1\x80\30G\1#b\23Q\22\xe1\1\bS\2h#\xa8\1\2#\2\xa1\2\xf2\1\23\1\0\xb7\1\xa0\x187\x003\x82\1A\22\x81\2\2c\283\18!\2#\2\xa1\2\x82\2\23\1\0\xc7\1\xb0\30G\1#\xf2\0\3\2a\22\x91\2\2\xd3\2\xb1\1\2A\x92\2#\1\xd7\1\xd0\30W#\x82\1\3\2\x91\4#\1S\xf1\1\2\21\x92\2#\1\xf7\1\xf0\30W\x013\xf2\0#\2\x91\1\2\xb1\2\23\xd1\1\2a\xb2\2#\1\0\xd7\1\xb0\31W\x013\xb2\1\xd1\3\23\x81\1\x021\2Q\xb2\2#\1\0\xe7\1\xc0\31g\x013\xb2\1\21\22Q\22\xf1\1\23A\x021\22A\xc2\x023\0\x87\2\xf0\31\xf7\0S\xb2\1\xd1\1\2\x81\1\23\xb1\1\xe2\x023g\0\xb7\1\xa0\32\x87\1\1S\xb2\1\xb1\2\23A\x92\3C\xb7\2\xe0\32\x97\1\1C\xe2\1\xf1\1\xf3\0\xd2\2S\xb7\2\x90\33\xa7\1\0\xf3\0\xb2\2\x83\1\xc2\2S\2\1 \xa7\2\xe0\33\xb7\1\1c\xe2\2#\xd2\1c\1\xa7\3\xa0\34\xd7\1\1c\x82\2#\0\23\x92\1#\2\xf7\3\xc0\34\xf7\1\1c\xe2\1#\a\1\23\xf2\0#\1\0\xd7\3\x80\35\xa7\2\1\xf3\0b3\1\'\x83\1\1\xd7\3\xf0\35\x97\2\0\27\xd3\1\1G\x001\20\xc7\3\xc0\36\x97\x031\xa7\5\x80\37\xc7\b\xd0\37\xc7\a\xc0 \xf7\6\x90!\x87\6\x80"\xb7\5\xa0\a5\xb0\25U`E\x80\2U \xb7\4\xf0\5\xb5\1 \25\26\25\xa0\25\x056\5`\5&\5\x80\2\x056\5`\xb7\3\xb0\6\5\x86\1\25\a\20\x056\5\xa0\25\x056\25@\x056\5\x80\2\x056\5\xb0\1\xc7\1\xd0\a\5\xa6\1\5\20\x056\5\xa0\25\5F\5@\x056\5@\a\0\5\0\5\xf0\x006\5\xe0\n\5\xa6\1\5\20\x056\5\xa0\b\a\xf0\f\x056\5@\x056\x050\x85\1\a0\5&\5 E U\x80\x015@%\x90\1\xf5\0\xe0\3\5\xb6\1\20\aE\xa0\1\xa5\1\x90\1\xa5\1\xd0\1\xb5\1\xe0\f\x056\25 \x056\x050\5\xf6\0\x150\5&\x050& \x156\5\a\x005\0\x156E\26%`\5\xf6\0\5\xc0\x015\xc0\1\x056%6\25\0U\x80\1\25\x96\1\5\x80\1\5\xa6\1\5\xa0\1\25V\x056\5\xf0\f\x056\5\20\x156\5 \5\xa6\1\5\20\25&\5\20\x056\5\20\a\x056\5\20\5\xb6\1\5V\x150\25\x96\1\25\x90\1\x056 \5\x80\1\x056%6\25\0\x056\5\x80\1\25\x96\1\5\x80\1\5\xa6\1\5\x80\1\a\25\xb6\1\5\xf0\f\x156\5\0\x156\5 \a\xa6\1\5 \5&\5 6\5 \x056\5\20\5\xb6\2\x050\5\a\xa6\1\5\x80\1\25f\25\xf0\0\x056%6\5\20\x056\5 \x150\25\x86\1\25\0\a%\a \5\x96\1\5 %0\25\xc6\1\5\xf0\f\x156\5\a\5F\5\0\25F%F\5\20\x056 6\5 \x056\5\20\5\xb6\2\x050\5F%F\5\xf0\0\25f\5\x80\1\5\xa6\1\5\0\a\x056\5\0\25\26\25\20\25\x86\1\5\20\25\26\5 \5\x86\1\25\0\a\5\26\a\5 \x1565F\5\x80\r\x056%6\5\20\x156E6\5\20\x056\5\x1060\x056\5\20\5F%V\25F \x056e&\5\xf0\0\a\5f\5\x80\1\5\x96\1\5 \x0565&\5@%F\5\20\x056\5@\25F\5\a\0\x056\5 \a6U6\5\x80\r\x156\x056\25\20\5F5\a\5&\5\20\x056\5\20\x056 \x056\x050&\25\20\x056\5\20\x056\5\20\5\xd6\1\5\x80\1\x95\1\xf0\0\5\xf6\x005\20\x056%6\5P\5F\5\a\20\x056\5P\x056\5 \x056\5\20\x056e6\5\x90\r\x056\x056\25\20\x1565\a\5&\5\20\x056\5\20\x056\5\20\x056\5 6\25\20\x056\5\20\x056\5\20\5\xd6\1\5\x80\1\5f\25\xf0\0\5V%\a\5 \x0565&\5@\5V\5 \5&\5P\5F\5 \25&\5\20\x056e6\5\x90\r\x056\x056\5 \x156U&\5\0\x156\5\20\x056\5\20\x056\5 6\5\a\20\x056\5 6\5\20\5\xd6\1\5\x80\1\5f\25\xf0\0\x056\25\xf0\0\x056\5\x105P\x056\25@5@\x156\5@5 \x056e6\5\x90\r\a\5f\x050\x156\25\a\x156\5\0\a\x056\5\20\x05656\5\20\x056\5 \5&\x050\5&\5\20\x056\xa5\1\x80\1\5f\25\xf0\0\x056\5\x80\1\5F0\a`\x056\25\xd0\1\5F\5\xb0\1\5FU6\5\xa0\r\5f\x050\25F%F\5\20\x056\5\20\5F\25F\5\20\x056\5 \5&\x050\5&\5\20\x056e\6\25\a\x80\1\x85\1\x80\1\x056\5\x80\1\5F\xa0\1\x056U\x90\1\x056U\x90\1V5F\5\xa0\r\5f\5@\5V\5V\5\20\x056\5\20\5\xa6\1\25\20\x056\5 \x0560\5&\25\0\x056U\26\25\xb0\1\25\xd0\1\x056\5\x80\1\5F\5\x90\1\x056U\x90\1\x056e\x80\1\5V%F\5\xa0\r\5f\5P\5\xa6\1\25\20\x056\5 \5\x96\1\5 \x056\5 \x0560\5&\25\0\a\5\xc6\1\5\xa0\3\x056\5\x80\1\5F\5\xf0\0\a\5\x96\1\5\x90\1\5\x96\1\5\x80\1\25\xc6\1\5\xa0\r\25F\5\a@\a\25\x96\1\5 \x056\5 \25\xf6\0\25 \x056\5 \x056\5\20\a\5&\25 \5\x96\1\25\xb0\3\x056\5\x80\1\5F\5\xf0\0\25\x96\1\5\x80\1\5\xa6\1\5\x80\1\a\25\xb6\1\5\xb0\r\x156\5\x80\1\25F%0\5&\x150%6%0\25&\5 \25\6\0\a0\5&\x150\25f\5\xd0\3\x056\5\x90\1\a6\5\xf0\0\5\xa6\1\25\xf0\0\5\xa6\1\5\xb0\1%&\x156\5\xb0\re\x90\1\xf5\0@EP\xf5\0PE050E@%\a6\25\xe0\3E\x90\1E\x80\1\xc5\1\x80\1\xc5\1\xc0\1\xb5\1\xe0\r\5\x90\2\a\x80\1\a\xf0\2\5\xe0\1\5\a\x80\1\a\x005\xf0\a\5`\a\xc0\1\27 \5\0\a\xc0Y'
)

15099L'écriture du bytes passe dans des proportions similaires de 32995 à seulement 24816 caractères, soit une économie de 24,79% ! :o

Victoire, ça rentre enfin sur NumWorks ! :bj:

Voici donc dès aujourd'hui accessible le nouvel outil img2calc te permettant de faire rentrer beaucoup plus facilement tes scripts Python d'images sur les calculatrices les moins bien dotées en mémoire de stockage, et d'en faire rentrer beaucoup plus sur les autres ! :D

Liens :
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 41.8%
 
Messages: 41470
Images: 14480
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: img2calc: des scripts Python encore plus petits

Message non lude Adriweb » 08 Jan 2022, 22:14

Bien vu :)
Image

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 80.1%
 
Messages: 14606
Images: 1216
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

Re: img2calc: des scripts Python encore plus petits

Message non lude grosged » 09 Jan 2022, 19:05

Très intéressant comme sujet !
Je me demandais ... Combien de valeurs d'octets ne correspondent-elles pas à des caractères affichables ?
Si j'ai bien compris, il faudrait réserver ces caractères affichables pour les octets les plus "présents", et les autres (avec anti-slash) pour les moins présents, c'est bien ça?
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 30.2%
 
Messages: 770
Images: 75
Inscription: 14 Sep 2011, 12:29
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: img2calc: des scripts Python encore plus petits

Message non lude critor » 09 Jan 2022, 19:28

Merci pour ton retour.

grosged a écrit:Je me demandais ... Combien de valeurs d'octets ne correspondent-elles pas à des caractères affichables ?

Sur nos calculatrices, les codes de caractères affichables vont le plus souvent de 32 à 127.

grosged a écrit:Si j'ai bien compris, il faudrait réserver ces caractères affichables pour les octets les plus "présents", et les autres (avec anti-slash) pour les moins présents, c'est bien ça?

C'est peu utile/pratique dans mon cas, car pour économiser pas mal de place en heap (ce qui reste le facteur le plus important) je fusionne 2 informations au sein d'un même octet : index de couleur + nombre de pixels la réutilisant à la suite.
Autant les index de couleurs pourraient être permutés, autant le nombre de pixels non.
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 41.8%
 
Messages: 41470
Images: 14480
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor


Retourner vers News Divers

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 37 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1212 utilisateurs:
>1201 invités
>6 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)