68 - CLI: comandos punto

Desde la interfaz de línea de comandos de sqlite3.exe podemos ejecutar cualquiera de los comandos SQL que hemos aprendido durante todo este tutorial, pero además podemos ejecutar un conjunto de comandos especiales que se diferencian de los comandos SQL debido a que comienzan por el caracter punto.

En el concepto anterior vimos el primer comando de punto que nos permite crear o abrir una base de datos:

.open [nombre de la base de datos]

El segundo comando de punto que veremos se llama help y tiene por objetivo mostrarnos una lista de todos los comandos punto existentes:

.help

Tenemos como resultado:

SQLite CLI .help

Los comandos de punto no finalizan con un punto y coma.

Listar las tablas de una base de datos.

Luego de abrir una base de datos con el comando ".open" mediante el comando ".tables" podemos conocer todas las tablas existentes en dicha base de datos:

SQLite CLI .tables

Primero abrimos la base de datos "base1.db" que creamos en el concepto anterior, luego mediante el comando ".tables" mostramos todas las tablas contenidas en dicha base de datos.

Comando "mode"

Mediante el comando mode podemos fijar un formato de salida de datos. Veamos con ejemplos como funciona:

.mode column

SQLite CLI .mode column

Si pasamos el parámetro 'html' al comando de punto 'mode' luego se genera una tabla HTML con las filas resultantes del select.

.mode html

SQLite CLI .mode html

Podemos generar comandos SQL 'insert' con la sintaxis:

.mode insert

SQLite CLI .mode insert

Podemos pasar otro parámetro al comando '.mode' indicando el nombre de la tabla:

.mode insert nuevoslibros

Otros formatos de salida para el comando 'mode' las podemos consultar siempre mediante el comando punto .help:

SQLite CLI .mode

Comando "output" y "once"

Por defecto las salidas son a pantalla, pero podemos forzar la salida a un archivo de texto mediante el comando de punto 'output'.

SQLite CLI .output

Luego de activar el comando 'output' cuando ejecutamos el comando SQL select el resultado se redirige al archivo 'datos.txt'.

Cada resultado del comando 'select' se agrega al final del archivo 'datos.txt'.

Para volver a activar la salida por pantalla debemos ejecutar el comando:

.output stdout

Una variante del comando "output" es "once" (significa 'una vez'), mediante este comando activa la salida a un archivo de texto para el siguiente comando SQL 'select' y vuelve a activar la salida a pantalla para los próximos:SQLite CLI .once

Si pasamos el parámetro -x al comando 'once' el próximo resultado de un select generará un archivo con formato 'csv' y lo abrirá un programa de hoja de cálculo configurado en la computadora:

SQLite CLI .once -x

Un alias del comando '.once -x' es el comando '.excel'. Tengamos en cuenta que se abre el gestor de hojas de cálculo que tengamos instalada por defecto y no necesariamente el famoso Microsoft Excel.

Funciones para lectura y escritura de archivos binarios.

Si tenemos que almacenar por ejemplo una imagen, un archivo mp3 etc. en una columna de una tabla utilizando sqlite3 podemos hacer uso de la función 'readfile' e indicar el nombre del archivo a leer. Veamos con un ejemplo el uso de estas funciones.

Abrir la base de datos 'base1.db':

.open base1.db

Borrar la tabla usuarios si existe:

drop table if exists usuarios;

Crear la tabla "usuarios" con la siguiente extructura:

create table usuarios(
  nombre text primary key,
  clave text,
  foto blob
);

Primero debemos copiar un archivo llamado 'foto1.jpg' con la imagen de un usuario a la carpeta donde se encuentra el programa sqlite3.exe :

SQLite CLI readfile

Ahora procederemos a leer ese archivo y cargarlo en una fila de la tabla "usuarios":

insert into usuarios(nombre,clave,foto) values('diego','123abc',readfile('foto1.jpg'));

Para recuperar la foto de una determinada fila debemos emplear la función 'writefile' indicando un nombre de archivo donde se almacenará los datos recuperados de la foto:

select writefile('foto1nueva.jpg',foto) from usuarios where nombre='diego';

Tengamos en cuenta que la foto no se muestra en la pantalla, sino se genera un archivo con el nombre indicado en la función 'writefile':

SQLite CLI writefile

Función edit.

Otra función que nos puede ser muy útil cuando trabajamos desde el CLI provisto por SQLite es la posibilidad de llamar otro programa para efectuar cambios sobre un campo. Probemos de modificar el nombre de usuario de la tabla "usuarios" utilizando el programa 'notepad':

update usuarios set nombre=edit(nombre,'notepad') where nombre='diego';

Cuando ejecutamos este comando se abre el editor de texto 'notepad' para modificar el nombre de usuario (seguramente es más conveniente cuando modificamos campos con gran cantidad de texto):

SQLite CLI edit

Comando '.schema'

Vimos que el comando de punto '.tables' obtenemos un listado de todas las tablas y vistas de la base de datos abierta. Tenemos otro comando llamado '.schema' que nos retorna la estructura de dichas tablas:

SQLite CLI .schema

Comando '.databases'

Mediante el comando de punto '.databases' obtenemos la última base de datos abierta con '.open':

.databases

Copiar una base de datos completa a un archivo de texto.

Si queremos generar un archivo de texto con todos los comandos SQL que puedan regenerar una base de datos el algoritmo será el siguiente:

.open base1.bd
.once base1.txt
.dump

Primero abrimos la base de datos 'base1.bd', seguidamente indicamos que el próximo comando de salida de datos se efectúe a un archivo llamado 'base1.txt', finalmente mediante el comando '.dump' se generan todos los comandos para regenerar la base de datos.

Luego podemos abrir con un editor de texto el archivo 'base1.txt' podemos encontrarnos con el siguiente contenido:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE generos(
codigo integer primary key,
descripcion text
);
INSERT INTO generos VALUES(1,'Aventura');
INSERT INTO generos VALUES(2,'Romance');
INSERT INTO generos VALUES(3,'Acción');
CREATE TABLE peliculas (
codigo integer primary key,
titulo text,
actor text,
duracion integer,
genero integer
);
INSERT INTO peliculas VALUES(1,'Mision imposible','Tom Cruise',120,3);
INSERT INTO peliculas VALUES(2,'Harry Potter y la piedra filosofal','Daniel R.',180,1);
INSERT INTO peliculas VALUES(3,'Harry Potter y la camara secreta','Daniel R.',190,1);
INSERT INTO peliculas VALUES(4,'Mision imposible 2','Tom Cruise',120,3);
INSERT INTO peliculas VALUES(5,'Mujer bonita','Richard Gere',120,2);
INSERT INTO peliculas VALUES(6,'Elsa y Fred','China Zorrilla',110,2);
CREATE TABLE usuarios(
  nombre text primary key,
  clave text,
  foto blob
);
INSERT INTO usuarios VALUES('diego','123abc',X'ffd8ffe000104a46494600010101007800780000ffe1005a4578696600004d4d002a00000008000503010005000000010000004a03030001000000010000000051100001000000010100000051110004000000010000127451120004000000010000127400000000000186a00000b18fffdb0043000201010201010202020202020202030503030303030604040305070607070706070708090b0908080a0807070a0d0a0a0b0c0c0c0c07090e0f0d0c0e0b0c0c0cffdb004301020202030303060303060c0807080c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cffc0001108006e009503012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00fdfca28a2800a28acaf1af8e745f86de19b9d6bc45ac697a068f65b7ed17fa95dc76b6d06e708bbe4721572ecaa32792c075349b495d974e9cea4d53a69b9376496adb7b24bb9ab4579be87fb63fc22f13eb767a6e9bf153e1c6a1a8ea13a5b5adadb789aca59ee65760a91a22c8599d9880140249200af48a985584f5834fd0e8c5e0315856a38aa72837b7326aff007851451567205145140051581f117e2af85fe1068916a5e2df12683e17d3a79c5b4775abea11594124a5598461e56552e551c85ce70ac7b1af04d73fe0b19fb36f87b5bbcb09fe265ac93d8cef6f235b691a85d40cc8c549496281a391723874665618209041ae7ad8cc3d176ab351f5697e67bb9570be7599c5cf2dc255ac9758539cff00f494cfa6a8af2df82dfb6dfc24fda1ff00b363f07fc42f0b6af7dabf9bf64d37edab6fa9cde56fdffe872edb81811bb7318ca0dc3e520d7a95694eac2a479a9b4d796a79f8fcb71781acf0f8da52a735f6671717bdb6693dd35ea828a28ad0e20a28a2800a28a2800a28a2803e32ff0082b4ff00c14f7fe189fc330f847c291f9ff12bc4963f6ab69e68375b68768cef18ba2186d9652d1c8b1c7ca8285a4f942c72fc3bf0a3fe099ffb44ff00c14a350b2f88fe3ad7ff00b3b4bd73c99adf56f12dd3c9733d8cb34aecd656880ec89373c91c4df678984c8633b1b703fe0aa7676ff07bfe0b089e28f1a68bfda1e12bdbed075f7b3f2e1bafed6d3608ade0b84f299b69dcd6b711ec976eedbcfcac09fd90f85df147c3ff001abe1f695e2af0aeab6badf87f5b805c59de5b93b255c9041040657560cac8c03232b2b00c081f190a0b34c756a78b9b51a6eca09dafe6ff00aebbd8feaec56713f0ef8472cc670de1a32af8d829d4c4ca2a4e32693f651e89adacf4b464f95c9b71fcccd73fe0db2bdb7d12f1f4df8c16b77a8a40ed6b05cf861ade09a50a7623c8b75232296c02c11ca824856c60f876bde17fda73fe08b3e26b4bb8b51f2bc25a95f0457b5b83a8f86f589b6432c91bc2e15a19592211ef290cccb0ca2272aa5abf70ebe65ff82b57c79f027c1ffd8b7c61a4f8ca4b5b9bdf1ae9775a5685a5b429713de5e98ff753ac6dc05b790c5334a71e5954c132346adbe3f87b07428cb11876e94a2af7bbfc6efaf91e370678ddc519ce674724cf294330a15e4a32a72a50bd9eee3c914af1f8bde4d593d57c4bbefd897f6c4f0ffedc3f026d3c6ba0db5d69eeb3b69faa69f700b3e9b7a888f24224c059576c88cb2281b95d7211b722fae57e65ff00c1b71e0bd4ec7c13f163c452db6dd1f54bed374db5b8f310f9b716d1dcc9326dcee1b56ea0392003e6704956c7e9a57b393e2ea627074ebd55ef35fadaff003dcfca7c52e1bc1641c558cca72e97352a725cbadedcd18cb96fd791c9c75d74d75b857cdfff00052aff008284699fb027c24b5bc4b1fed7f18f89bce83c3d612238b6678827993dc38c6228bcd8c94521e42eaabb417923fa42bf16ff00e0a6da7cbfb447fc167ec3c09e21bebafec49355f0ef85e036cb1c53d9d95d25b492046d8417f32f2770ce1f05c0e54051867d8ea985c2de8fc526a2bc9bebf81ed7831c1f81e21e2074f34ff77c3d39d6a91d6f28c2cb974eee4afde29a4d369995fb347fc13fbe34ff00c158f5b9be23f8dbc617563e1f9a796d935ed6964bb9ee40699da3b0b50513ecf1cec54aabc512191c47b9a3741f5ce87ff06ea7c22b7d12cd352f187c48bbd452045ba9edaeacade09a50a37ba46d6d232296c90a5dca820166c64fdeda1e8765e18d12cf4dd36ced74fd3b4f812dad6d6da258a0b689142a4688a02aaaa80028000000156ab0c2f0d60e9c6f5d73cdeeddf5febef3d7e23f1f78a31b8871ca6afd4f0d1d214a9a8a518f4bbe5bb76df68df68a3f28bf696ff8376753d134fd4353f851e32fedaf2b0f6fa16bf1a4173222c24b2ade2622795e550115e2850093e6906cdcd6ff00e094dff0559f147853e2841f05fe344fafea177a86aa74bd2756d504b2ea9a6ea0f2f97f61bcdf99595a53b55db2f0b9d8dfbac183f54abf23bfe0e31f83da2f85be2dfc3df1a58c1f67d63c5d637965a9ec48d23b9fb11b7f2666c2866976dc98cb3337c90c2a0009cf9d99e5f1cb17f68607ddb35cd1e8d376febf0b58fb7f0ff8e2b788153fd4ae304ab3ab197b1adca954a73845caf7495f48efbbb5a5cca5a7eb8d15c0feca9e35d4fe24fecbdf0dfc45ad5cfdb758d7fc2da66a37f71e5a47e7dc4d6914923ed401572cc4e140033c002bbeafafa7353829aeba9fcc58dc24f0b88a986a9f1424e2edb5d3b3b051451567285145140051451401e31fb707ec3fe12fdba7e123f877c449f62d52cb7cda26b70c41ee747b86001603237c4fb544911203851cabac7227e6178bff00e09bff00b54ffc13efc55a8eb1f0c350d7f5ad1219e0bc6bdf08de36fd404770eb6e973a6eef327750c19e2f2e789566705d97ccc7ed2515e3e6191e1f173f6aef19afb51d1ff5f8f99fa9f0478bb9df0de19e5b050af8493bba3563cd0d5dddbaabef6d637f79c5b3f16f5cfdaa7f6fdf10e8979613e97f172382fa07b791adbe1eadaceaaea5494962b259237c1e1d19594e0820806ba9f81dff000438f8c3fb457c419fc4bf1d3c4b75e1f492745bc6b8d4975bd775558c42a00943c912298b7a2c8f23b21894792cb835faf74570c78669ca4a58aab3a89746f43eb311e3fe3b0f4254b8732fc360653d253a54d7374db451fbe32e96b58c0f85df0bbc3ff057e1f695e15f0ae956ba2787f44805bd9d9db83b225c9249249667662cccec4b3b333312c493bf4515f4b18a8ae58ab247e0b5ebd4ad5255ab49ca526db6dddb6f56db7ab6deec2bf307fe0bc5fb01f883c67adafc6bf09585adf5969ba5c769e27b3b3b50b791ac2d215d45c8e67558d92390e37449046df34618c5fa7d4570e6597d3c6d0742a7c9f667d6f0171b63785339a79c6052938dd4a2f6941ef1bf4ee9f4693b35a3f827fe09d7ff0005aaf097c66f04d9f877e2e6bba5f84bc7765fb8fed3bbc5ae99aea2c6cde7997021b6970843a39446764f2beff951fdd9a1ebb65e27d12cf52d36f2d750d3b50812e6d6eada55960b989d432488ea4ab2b29043024104115f0efed4dff0411f863f1ab5b6d5bc11a95d7c31d46e6732dddbdb5afdbf4b94334aee52d9a44685cb3a00239044891855886770f96f5cff0083753e2f5beb7789a6f8c3e1c5de9c93badacf73757b6f3cd1063b1de35b69151cae0950ee14920336327c4a78bcdf0b1f655a8fb5b6d24ed7f5dff247eb78ee1bf0cb88eb3c7e599a3cb9cf5951a949ca316f75069c629764a72b74b2b25fa53fb4b7fc140fe127ec9fa7ea1ff096f8c74b5d634fc236836132ddeaef2342668e336e84b47bd40daf2ec8fe74dcea1813f9330e87f13bfe0b95fb695c6a49676ba0e91610456d3ddac5e659f8574b592468e367c2b5c5c3334a55490d2bb391e54487cafa17e0b7fc1b87ff0020dbaf889f123fe7aff68697e1cb1ff7c45e55ece7feb9b36eb5fef20ed257e8afc06fd9ebc19fb317c3e8fc2de04d06d7c3da1c73c9726089de579a573f3492492334923e02aee76242a228c2aa8133c1e3f339a58d8fb3a4b5e54eedf6bbff0086f4eaba30dc55c1dc0186ab2e13ad2c766338f27b6943969d25b49c232ddbdd7c69ab5e76bc65d4e87a1d9786344b3d374db3b5d3f4ed3e04b6b5b5b6896282da2450a91a2280aaaaa000a000000055aa28afacdb447f35ca4e4dca4eed85145140828a28a0028a28a0028a28a002bf307f6f8ff82db7882e3e287fc2bbfd9efecba94fe7a69efe2286c86a33ea17a6540b0e9d110d1c8b9063f31924f34c87ca002a4b27d87ff0540f8c3adfc07fd833e237897c3b3fd935882c61b2b7b90f24725afdaae61b469a364656495167674607e5755382060fc79ff06eff00ecc9e1fd43c2be2af8b57f6f6b7fe20b4d55bc3da4996025f4854b78e49e58db715df32dca479d8191627018acaeb5f399be231157134f2ec34b95c95e52ea9797ddf9799fbc78659164b80e1fc671ce7d43eb10a1354a9517f0caab49de6ad6714a51deeadcda49f2a3c8ff00e14fff00c140bfe47ffb5fc52ffa183ecbff0009343ff5dfcbfecaf3ff000fb27d9ffe99f95fc15eb9fb03ff00c16dbc416ff143fe15dfed09f65d367f3df4f4f114d6434e9f4fbd12b86875188058e35c911f98a91f94631e68219e58ff004fabf307fe0e20fd993c3fa7f857c2bf16ac2ded6c3c4177aaaf87b56314043eaeaf6f24904b236e0bbe15b678f3b0b3aca80b058916b8719976232da7f5cc2d694b9759293ba6baff005bf667d770af1ce4dc798f8f0cf11e59468fb6bc6955a10e49d3924dc55ef26d3b5bf96f6e68f2ddafd3ea2bc13fe097ff001875bf8f1fb067c39f12f88a7fb5eb13d8cd6571725e4924bafb2dccd68b348cecccf2bac0aeec4fccecc7001c0f7bafabc3d655a946ac76924fefd4fe6ccef2aab9666388cb6bbbce8ce7076daf0938bb7cd0514515b1e60514514005145140051451400514514005145140051451401c0fed45f0034cfda97f67ef1578035693c8b5f1258b40971b5dbec770a4496f3ed5742fe54c91c9b3700fb369e09afc8eff008270feda9adffc12dbf681f127c37f8a9a46a9a6787353be8e1d66de432492f876ed4616f228949496292364f30c60b491ac2f1b3845493f6bebc3bf6c3ff82787c31fdb82d2d9fc65a5dd43ae5841f66b3d734c9fecda85ac5e62c863dc434722e4300b2a384f36429b59cb57879b65b56ad4862f08d2ab0efb35d9ff005d7e6bf60f0db8f72dcbb058ae1ae24a52a997e2acdf2fc74e6b6a91dbb479bafbb1b2767195aff878a7c09ff8427fb7ff00e16d780bec3f61fed0f2bfb621fb6f97e5f99b7ec99fb479b8e3c9f2fccddf2edddc57e5bffc147bf6d4d6ff00e0a93fb40f86fe1bfc2bd2354d4fc39a65f490e8d6f1992397c4576c30d792c4c42451471abf966401a38da6791903b247ecff00f10d6ffd568ffcb43ffbb6bed7fd8f3fe09e1f0c7f61fb4b97f06e977536b97f07d9af35cd4e7fb4ea1751798d208f700b1c6b92a0ac4881fca8cbee640d5e6d6a19ae60beaf898aa54fed59ddbf25abfebbec7dd6579cf871c135659ce4388a998631292a4a5094214db56e69f3460de8daf76fdad1ba92ea7f641f80d17ecc5fb31f827c0891dac73f87b4b8a2be36d34934135ebe64bb951a4c3ed7b8795c021701800aa0051e914515f574a9c69c15386c9597c8fe70cc31d5b1b8aa98cc4be69d493949f7949ddbf9b614514559c81451450014514500145145001451450014515f84ff00f05a0ff85a1ff0d9be23ff0084f3fb53fe11cfb749ff00089edfb5ff0063fd93c8b6ff008f4f3be4f37cbfb3fda7caf97cfdfdb6d7939c669f50a0ab72736b6edf7bd4fd2fc2cf0eff00d72cda595fd6a343960e576b99bb34ad18f346ef5bbd745aea7eb8f8d7fe0a29f027c03e19b9d5afbe2d780a7b5b4dbbd34dd621d4ae5b73841b20b6324afcb0ced438196380091c17fc3e93f668ff00a295ff0096f6abff00c8d5f879f05bfe10aff8599a6ffc2c4ff84a7fe10efdeff687fc239e47f69ffaa7f2bcaf3ff75feb7cbddbbf837639c57d0ba1e9ff00b11eadadd9dacf7dfb4d69905cce91497972ba334168acc0195c448f215507242233601c2b1c03f2b4f8ab1757587b38ff0089bff35a1fd1b8dfa3870d65afd962a58daeed7e6a31872a5dbe093e6d2fa746b43eecff0088897e0a7fd0aff14bff0005b61ffc9947fc444bf053fe857f8a5ff82db0ff00e4caf2dff8d687f9ff0084aa8ff8d687f9ff0084aababebf987fd0551ffc0bfe01f3bfea67047fd13f9b7fe097ff00c99bff00117fe0e41f0be99adc49e12f85fafeb7a71803493eafab45a5ce92ee6ca08e28ee54aed08436f049661b46016c0ff8894bfea8bffe5ddffdc55f47f81bfe187bfe109d1fec1ff0ce1f61fb0c3f66fed3fecafb6f97e5aedf3fed3fe91e6e31bbcefde6eceff9b35abff1853ff56b7ff941ae8b6672d56320be51ff0023c38d5e01a2bd94b8631526b4bca75949faa52493f248f96ffe2252ff00aa2fff009777ff007151ff0011297fd517ff00cbbbff00b8abea4ff8c29ffab5bffca0d1ff001853ff0056b7ff00941a39333ffa0c87dd1ff22beb9e1fff00d12d89ff00c195ff00f933e5bff8894bfea8bffe5ddffdc547fc44a5ff00545fff002eeffee2afa93fe30a7fead6ff00f28347fc614ffd5adffe5068e4ccff00e8321f747fc83eb9e1ff00fd12d89ffc195fff00933e6ff057fc1c8fa2df789ada2f117c27d534bd1db77da2eb4dd7a3bfb98be4257642f040af97da0e655c024f246d3df7fc444bf053fe857f8a5ff82db0ff00e4caecfe28e8ff00b0c6b9f0fb5587567fd9e934e480dc5c1d12e74fb7d40ac4449885ac996e4b9d98d909dcf92986ddb4fcf5ff001ad0ff003ff0955653af9952d1e2a93ff1597e48eec264dc079927569f0e6610b696a519d48fab729dd37db6b25e67ae687ff070afc0fd5b5bb3b59f46f891a641733a4525e5ce976ad05a2b300657115cbc85541c9088cd8070ac700fa47fc3e93f668ffa295ff96f6abffc8d5f28eb9a7ffc135b56d12f2d60bebad327b981e28ef2d97c4ad3da3329025412a3c65d49c80e8cb9032ac320fccbff001853ff005749ff00941ac279de3e8e8ead19dfb37fa58f6707e12f06e6b7953cb733c372f49538c6f7eab9d4eff26add51fb35e06fdb7fe0e7c49fec74d17e28f80af6eb5ff2458597f6e5bc77b3bcdb7cb8beceee26594960be5b2070c7695078af52afe613c73fd8bff09b6b1ff08d7f6a7fc239f6e9bfb2bfb4fcbfb6fd93cc6f27cff2fe4f37cbdbbb67cbbb38e2bee1ff00820d7fc2dbff008698d3bfb07fe129ff00854bfe9fff00091fdefec4f3becabb3eff00eebed5e6fd8bfd5fefbcbebfbadf5ae5dc593af888e1ea52dddaf17f8dbb7cf63cfe3bfa3661327c9ab67583cc1a8d2839f2558a4dd95f954935efbd92e577969a1fb35451457da9fc981451450078c78d7fe09d9f027c7de19b9d26fbe12780a0b5bbdbbdf4dd1e1d36e576b871b2e2d8472a72a33b5c64654e4120f05ff0e5bfd9a3fe89affe5c3aafff0024d7d494571cf2ec24dde74a2ffedd5fe47d56138eb8970b0f6786cc2bc237bda356a257ef652dcf827fe21daf829ff4347c52ff00c19587ff0021d1ff0010ed7c14ff00a1a3e297fe0cac3ff90ebef6a2b93fb072ff00f9f48fa4ff0088cdc6ff00f432a9f7aff23f3075cff836cacae35bbc7d37e305d5a69cf3bb5ac173e185b89e188b1d88f22dd46aee1700b0440c41215738157fe21adffaad1ff9687ff76d7ea451587fab1963d7d97e32ff0033d88fd20f8fe2945661ff0094a8ff00f2b3f2dffe21adff00aad1ff009687ff0076d1ff0010d6ff00d568ff00cb43ff00bb6bf5228a5feabe59ff003ebff2697f995ff130be207fd07ffe52a1ff00cacfcb7ff886b7feab47fe5a1ffddb47fc435bff0055a3ff002d0ffeedafd48a28ff0055f2cff9f5ff00934bfcc3fe2617c40ffa0fff00ca543ff959f997e0aff836e345b1f135b4be22f8b1aa6a9a3aeefb45ae9ba0c761732fc842ec99e79d530fb49cc4d9008e09dc3beff8876be0a7fd0d1f14bff06561ff00c875f7b515ac38772e82b2a4be777f9b3cfc5f8e5c75899f3d4cc669edeea8457dd18a57f3b5cf84f43ff837abe07e93add9dd4facfc48d4e0b69d2592cee754b5582ed558131398ad9240ac06094756c138653823d23fe1cb7fb347fd135ffcb8755ffe49afa928ade1936021b518fcd27f99e362fc55e31c4b52a999d756fe5a9287fe92d5fe6796f81bf620f839f0dbfb1df45f85de02b2bad03c93617bfd876f25ec0f0edf2e5fb43a199a50543798ce5cb0dc589e6bd4a8a2bbe9d285356a692f43e371b9962f1b3f698cab2a92ef29393fbdb614514568711fffd9');
COMMIT;