CREATE TABLE Università(
nome VARCHAR( 30 ) PRIMARY KEY,
valutazione INTEGER,
CHECK ( ( valutazione<= 5 ) AND( valutazione>= 0 ) )
) ;
CREATE TABLE Studenti(
matricola INTEGER PRIMARY KEY,
università REFERENCES Università( nome) ,
nome VARCHAR( 30 ) NOT NULL,
cognome VARCHAR( 30 ) NOT NULL
) ;
CREATE TABLE Professori(
codice INTEGER PRIMARY KEY,
nome VARCHAR( 30 ) NOT NULL,
cognome VARCHAR( 30 ) NOT NULL,
università VARCHAR( 30 ) REFERENCES Univeristà( nome)
) ;
CREATE TABLE Corsi(
codice CHAR( 5 ) PRIMARY KEY,
nome VARCHAR( 30 ) ,
università VARCHAR( 30 ) REFERENCES Università( nome) ,
con voto BOOL NOT NULL,
professore INTEGER REFERENCES Professori( codice)
) ;
CREATE TABLE Aule(
numero INTEGER PRIMARY KEY,
università VARCHAR( 30 ) REFERENCES Università( nome)
) ;
CREATE TABLE AuleCorsi(
"aula" INTEGER REFERENCES Aule( "numero" ) ,
"corso" CHAR( 5 ) REFERENCES Corsi( "codice" ) ,
PRIMARY KEY ( "aula" , "corso" )
) ;
CREATE TABLE Tesi(
"studente" INTEGER REFERENCES Studenti( matricola) PRIMARY KEY,
"professore" INTEGER REFERENCES Professori( codice) ,
"titolo" VARCHAR( 40 ) ,
"sostenuta" BOOL NOT NULL,
"valutazione" INT,
CHECK ( ( NOT( "sostenuta" ) AND( "valutazione" = NULL) ) OR ( "sostenuta" AND "valutazione" >= 18 AND
"valutazione" <= 30 ) )
) ;
/* ORA RIEMPIO IL DATABASE CON ALCUNI DATI */
INSERT INTO Università VALUES ( 'Unipi' , '4' ) ;
INSERT INTO Università VALUES ( 'URSS' , '3' ) ;
INSERT INTO Università VALUES ( 'Unimerda' , '0' ) ;
INSERT INTO Università VALUES ( 'Unistronzi' , '5' ) ;
INSERT INTO Studenti VALUES ( '1' , 'Unimerda' , 'Alfa' , 'Beto' ) ;
INSERT INTO Studenti VALUES ( '2' , 'URSS' , 'Grande' , 'Stronzo' ) ;
INSERT INTO Studenti VALUES ( '3' , 'Unistronzi' , 'Grande' , 'Merda' ) ;
INSERT INTO Studenti VALUES ( '4' , 'URSS' , 'Pinco' , 'Pallino' ) ;
INSERT INTO Studenti VALUES ( '5' , 'URSS' , 'iolo' , 'Merda' ) ;
INSERT INTO Studenti VALUES ( '6' , 'URSS' , 'Testa' , 'di Cazzo' ) ;
INSERT INTO Studenti VALUES ( '7' , 'Unipi' , 'Pezzo' , 'di Merda' ) ;
INSERT INTO Studenti VALUES ( '8' , 'Unipi' , 'Bingo' , 'Bongo' ) ;
INSERT INTO Studenti VALUES ( '9' , 'Unimerda' , 'Uomo' , 'di Merda' ) ;
INSERT INTO Studenti VALUES ( '10' , 'Unistronzi' , 'Rincoglio' , 'Nito' ) ;
INSERT INTO Studenti VALUES ( '11' , 'Unistronzi' , 'Rincreti' , 'Nito' ) ;
INSERT INTO Studenti VALUES ( '12' , 'Unimerda' , 'Scemu' , 'Nito' ) ;
INSERT INTO Studenti VALUES ( '13' , 'Unipi' , 'Grande' , 'Stronzo' ) ;
INSERT INTO Studenti VALUES ( '14' , 'Unipi' , 'Pezzo' , 'di Stronzo' ) ;
INSERT INTO Studenti VALUES ( '15' , 'Unimerda' , 'Grandissima' , 'Merda' ) ;
INSERT INTO Professori VALUES ( '1' , 'Porco' , 'Dio' , 'Unipi' ) ;
INSERT INTO Professori VALUES ( '2' , 'Puttana' , 'Madonna' , 'Unipi' ) ;
INSERT INTO Professori VALUES ( '3' , 'Cane' , 'Dio' , 'URSS' ) ;
INSERT INTO Professori VALUES ( '4' , 'Porco' , 'Dio' , 'URSS' ) ;
INSERT INTO Professori VALUES ( '5' , 'Cazzo' , 'di Budda' , 'Unimerda' ) ;
INSERT INTO Professori VALUES ( '6' , 'Potta' , 'di Kalì' , 'Unimerda' ) ;
INSERT INTO Professori VALUES ( '7' , 'Orca' , 'Madonna' , 'Unistronzi' ) ;
INSERT INTO Corsi VALUES ( 'CAZ01' , 'Cazzometria' , 'URSS' , '1' , '1' ) ;
INSERT INTO Corsi VALUES ( 'MRD01' , 'Merdologia applicata' , 'Unipi' , '1' , '1' ) ;
INSERT INTO Corsi VALUES ( 'CAZ02' , 'Ingegneria del cazzo' , 'Unipi' , '1' , '2' ) ;
INSERT INTO Corsi VALUES ( 'SCH01' , 'Schifo applicato' , 'URSS' , '1' , '3' ) ;
INSERT INTO Corsi VALUES ( 'SCR01' , 'Scoreggiocultura' , 'Unimerda' , '1' , '5' ) ;
INSERT INTO Corsi VALUES ( 'SCR02' , 'Scoreggiocultura' , 'Unipi' , '0' , '5' ) ;
INSERT INTO Corsi VALUES ( 'MRD02' , 'Scienze della merda' , 'Unimerda' , '1' , '6' ) ;
INSERT INTO Corsi VALUES ( 'CAZ03' , 'Cazzometria' , 'Unistronzi' , '1' , '7' ) ;
INSERT INTO Corsi VALUES ( 'SEG01' , 'Segologia antica' , 'Unistronzi' , '1' , '7' ) ;
INSERT INTO Aule VALUES ( '01' , "Unipi" ) ;
INSERT INTO Aule VALUES ( '02' , "Unipi" ) ;
INSERT INTO Aule VALUES ( '03' , "Unipi" ) ;
INSERT INTO Aule VALUES ( '04' , "Unipi" ) ;
INSERT INTO Aule VALUES ( '05' , "Unipi" ) ;
INSERT INTO Aule VALUES ( '06' , "URSS" ) ;
INSERT INTO Aule VALUES ( '07' , "URSS" ) ;
INSERT INTO Aule VALUES ( '08' , "URSS" ) ;
INSERT INTO Aule VALUES ( '09' , "Unimerda" ) ;
INSERT INTO Aule VALUES ( '10' , "Unimerda" ) ;
INSERT INTO Aule VALUES ( '11' , "Unistronzi" ) ;
INSERT INTO AuleCorsi VALUES ( '02' , 'MRD01' ) ;
INSERT INTO AuleCorsi VALUES ( '06' , 'CAZ01' ) ;
INSERT INTO AuleCorsi VALUES ( '02' , 'CAZ02' ) ;
INSERT INTO AuleCorsi VALUES ( '01' , 'MRD01' ) ;
INSERT INTO AuleCorsi VALUES ( '11' , 'CAZ03' ) ;
INSERT INTO AuleCorsi VALUES ( '07' , 'SCH01' ) ;
INSERT INTO AuleCorsi VALUES ( '09' , 'SCR01' ) ;
INSERT INTO AuleCorsi VALUES ( '01' , 'SCR02' ) ;
INSERT INTO AuleCorsi VALUES ( '10' , 'MRD02' ) ;
INSERT INTO AuleCorsi VALUES ( '11' , 'SEG01' ) ;
INSERT INTO Tesi VALUES ( '04' , '3' , 'Leccare il culo al professore' , '1' , '23' ) ;
INSERT INTO Tesi VALUES ( '10' , '7' , 'Per un futuro di merda' , '0' , NULL) ;
INSERT INTO Tesi VALUES ( '12' , '6' , 'La merda e i suoi usi' , '1' , '30' ) ;
INSERT INTO Tesi VALUES ( '03' , '1' , 'Misurazione del cazzo nei secoli' , '1' , '18' ) ;
INSERT INTO Tesi VALUES ( '07' , '1' , 'Cazzometria e Merda, le prospettive' , '0' , NULL) ;
/*ORA FACCIO INTERROGAZIONI AL DATABASE */
/* crea un elenco con tutti i cognomi presenti di alunni e professori*/
CREATE TABLE Cognomi (
cognome VARCHAR( 30 ) PRIMARY KEY
) ;
INSERT INTO Cognomi
SELECT DISTINCT cognome FROM Studenti UNION
SELECT DISTINCT cognome FROM Professori;
SELECT "Tutti i cognomi" ;
SELECT *
FROM Cognomi;
/* esempio di join con prodotto cartesiano Aule x Corsi x AuleCorsi) */
SELECT "Associa ad ogni aula i corsi dai quali viene utilizzata" ;
SELECT Aule.numero , Aule.universit à, Corsi.codice , Corsi.nome , Corsi.professore , Corsi.universit à
FROM Aule, Corsi, AuleCorsi
WHERE ( aula= numero AND corso= codice) ;
SELECT "Seleziona tutte le aule vuote" ;
SELECT *
FROM Aule
MINUS
SELECT Aule.numero , Aule.universit à
FROM AuleCorsi JOIN Aule ON AuleCorsi.aula = Aule.numero ;
SELECT "Elenco dei titoli delle tesi e delle loro valutazioni in decimi" ;
SELECT titolo, valutazione/ 3 AS "valutazione in decimi" ;
FROM Tesi
WHERE ( Sostenuta) ;
SELECT "Associa ad ongi studente il professore con il quale ha sostenuto o sosterrà la tesi" ;
SELECT Tesi.titolo , Studenti.nome , Studenti.cognome , Professori.nome , Professori.cognome
FROM ( Tesi JOIN Studenti ON Tesi.studente = Studenti.matricola )
JOIN Professori ON Tesi.professore = Professori.codice ;
SELECT "Elenco di tutti i campi nei quali si svolgono i corsi" ;
SELECT DISTINCT SUBSTRING( nome, 1 , 3 )
FROM Corsi;
SELECT "Conteggio degli studenti..." ;
SELECT COUNT ( * )
FROM Studenti;
SELECT "Conteggio degli studenti con nomi diversi" ;
SELECT COUNT ( DISTINCT nome)
FROM Studenti;
SELECT "Dati sulle valutazioni delle tesi (min/max/media)" ;
SELECT MIN ( votazione) , MAX ( valutazione) , AVG( valutazione)
FROM Tesi;
SELECT "conteggio studenti in ongi università" ;
SELECT università, COUNT( * )
FROM Studenti
GROUP BY università;
SELECT "conteggio degli studenti in ogni università con valutazione >= 3" ;
SELECT Studenti.universit à, COUNT( * )
FROM Studenti JOIN Università ON Studenti.universit à = Università.nome
GROUP BY Studenti.universit à
HAVING ( Università.valutazione >= 3 ) ;
SELECT "Le tre migliori università" ;
SELECT *
FROM Università
ORDER BY Valutazione DESC
LIMIT 3 ;
Q1JFQVRFIFRBQkxFIFVuaXZlcnNpdMOgKAogICAgbm9tZSBWQVJDSEFSKDMwKSBQUklNQVJZIEtFWSwKICAgIHZhbHV0YXppb25lIElOVEVHRVIsCiAgCUNIRUNLICgodmFsdXRhemlvbmU8PTUpQU5EKHZhbHV0YXppb25lPj0wKSkKKTsKCkNSRUFURSBUQUJMRSBTdHVkZW50aSgKCW1hdHJpY29sYSBJTlRFR0VSIFBSSU1BUlkgS0VZLAoJdW5pdmVyc2l0w6AgUkVGRVJFTkNFUyBVbml2ZXJzaXTDoChub21lKSwKCW5vbWUgVkFSQ0hBUigzMCkgTk9UIE5VTEwsCgljb2dub21lIFZBUkNIQVIoMzApIE5PVCBOVUxMCik7CgpDUkVBVEUgVEFCTEUgUHJvZmVzc29yaSgKCWNvZGljZSBJTlRFR0VSIFBSSU1BUlkgS0VZLAoJbm9tZSBWQVJDSEFSKDMwKSBOT1QgTlVMTCwKCWNvZ25vbWUgVkFSQ0hBUigzMCkgTk9UIE5VTEwsCgl1bml2ZXJzaXTDoCBWQVJDSEFSKDMwKSBSRUZFUkVOQ0VTIFVuaXZlcmlzdMOgKG5vbWUpCik7CgoKQ1JFQVRFIFRBQkxFIENvcnNpKAoJY29kaWNlIENIQVIoNSkgUFJJTUFSWSBLRVksCglub21lIFZBUkNIQVIoMzApLAoJdW5pdmVyc2l0w6AgVkFSQ0hBUigzMCkgUkVGRVJFTkNFUyBVbml2ZXJzaXTDoChub21lKSwKCWNvbiB2b3RvIEJPT0wgTk9UIE5VTEwsCglwcm9mZXNzb3JlIElOVEVHRVIgUkVGRVJFTkNFUyBQcm9mZXNzb3JpKGNvZGljZSkKKTsKCkNSRUFURSBUQUJMRSBBdWxlKAoJbnVtZXJvIElOVEVHRVIgUFJJTUFSWSBLRVksCgl1bml2ZXJzaXTDoCBWQVJDSEFSKDMwKSBSRUZFUkVOQ0VTIFVuaXZlcnNpdMOgKG5vbWUpCik7CgpDUkVBVEUgVEFCTEUgQXVsZUNvcnNpKAoJImF1bGEiIElOVEVHRVIgUkVGRVJFTkNFUyBBdWxlKCJudW1lcm8iKSwKCSJjb3JzbyIgQ0hBUig1KSBSRUZFUkVOQ0VTIENvcnNpKCJjb2RpY2UiKSwKCVBSSU1BUlkgS0VZICgiYXVsYSIsICJjb3JzbyIpCik7CgpDUkVBVEUgVEFCTEUgVGVzaSgKCSJzdHVkZW50ZSIgSU5URUdFUiBSRUZFUkVOQ0VTIFN0dWRlbnRpKG1hdHJpY29sYSkgUFJJTUFSWSBLRVksCgkicHJvZmVzc29yZSIgSU5URUdFUiBSRUZFUkVOQ0VTIFByb2Zlc3NvcmkoY29kaWNlKSwKCSJ0aXRvbG8iIFZBUkNIQVIoNDApLAoJInNvc3RlbnV0YSIgQk9PTCBOT1QgTlVMTCwKCSJ2YWx1dGF6aW9uZSIgSU5ULAoJQ0hFQ0sgKCAoTk9UKCJzb3N0ZW51dGEiKUFORCgidmFsdXRhemlvbmUiPU5VTEwpKSBPUiAoInNvc3RlbnV0YSIgQU5EICJ2YWx1dGF6aW9uZSI+PTE4IEFORCAKCiJ2YWx1dGF6aW9uZSI8PTMwKSApCik7CgoKLyogT1JBIFJJRU1QSU8gSUwgREFUQUJBU0UgQ09OIEFMQ1VOSSBEQVRJICovCgoKSU5TRVJUIElOVE8gVW5pdmVyc2l0w6AgVkFMVUVTICgnVW5pcGknLCc0Jyk7CklOU0VSVCBJTlRPIFVuaXZlcnNpdMOgIFZBTFVFUyAoJ1VSU1MnLCczJyk7CklOU0VSVCBJTlRPIFVuaXZlcnNpdMOgIFZBTFVFUyAoJ1VuaW1lcmRhJywnMCcpOwpJTlNFUlQgSU5UTyBVbml2ZXJzaXTDoCBWQUxVRVMgKCdVbmlzdHJvbnppJywnNScpOwoKSU5TRVJUIElOVE8gU3R1ZGVudGkgVkFMVUVTICgnMScsJ1VuaW1lcmRhJywnQWxmYScsJ0JldG8nKTsKSU5TRVJUIElOVE8gU3R1ZGVudGkgVkFMVUVTICgnMicsJ1VSU1MnLCdHcmFuZGUnLCdTdHJvbnpvJyk7CklOU0VSVCBJTlRPIFN0dWRlbnRpIFZBTFVFUyAoJzMnLCdVbmlzdHJvbnppJywnR3JhbmRlJywnTWVyZGEnKTsKSU5TRVJUIElOVE8gU3R1ZGVudGkgVkFMVUVTICgnNCcsJ1VSU1MnLCdQaW5jbycsJ1BhbGxpbm8nKTsKSU5TRVJUIElOVE8gU3R1ZGVudGkgVkFMVUVTICgnNScsJ1VSU1MnLCdpb2xvJywnTWVyZGEnKTsKSU5TRVJUIElOVE8gU3R1ZGVudGkgVkFMVUVTICgnNicsJ1VSU1MnLCdUZXN0YScsJ2RpIENhenpvJyk7CklOU0VSVCBJTlRPIFN0dWRlbnRpIFZBTFVFUyAoJzcnLCdVbmlwaScsJ1BlenpvJywnZGkgTWVyZGEnKTsKSU5TRVJUIElOVE8gU3R1ZGVudGkgVkFMVUVTICgnOCcsJ1VuaXBpJywnQmluZ28nLCdCb25nbycpOwpJTlNFUlQgSU5UTyBTdHVkZW50aSBWQUxVRVMgKCc5JywnVW5pbWVyZGEnLCdVb21vJywnZGkgTWVyZGEnKTsKSU5TRVJUIElOVE8gU3R1ZGVudGkgVkFMVUVTICgnMTAnLCdVbmlzdHJvbnppJywnUmluY29nbGlvJywnTml0bycpOwpJTlNFUlQgSU5UTyBTdHVkZW50aSBWQUxVRVMgKCcxMScsJ1VuaXN0cm9uemknLCdSaW5jcmV0aScsJ05pdG8nKTsKSU5TRVJUIElOVE8gU3R1ZGVudGkgVkFMVUVTICgnMTInLCdVbmltZXJkYScsJ1NjZW11JywnTml0bycpOwpJTlNFUlQgSU5UTyBTdHVkZW50aSBWQUxVRVMgKCcxMycsJ1VuaXBpJywnR3JhbmRlJywnU3Ryb256bycpOwpJTlNFUlQgSU5UTyBTdHVkZW50aSBWQUxVRVMgKCcxNCcsJ1VuaXBpJywnUGV6em8nLCdkaSBTdHJvbnpvJyk7CklOU0VSVCBJTlRPIFN0dWRlbnRpIFZBTFVFUyAoJzE1JywnVW5pbWVyZGEnLCdHcmFuZGlzc2ltYScsJ01lcmRhJyk7CgpJTlNFUlQgSU5UTyBQcm9mZXNzb3JpIFZBTFVFUyAoJzEnLCdQb3JjbycsJ0RpbycsJ1VuaXBpJyk7CklOU0VSVCBJTlRPIFByb2Zlc3NvcmkgVkFMVUVTICgnMicsJ1B1dHRhbmEnLCdNYWRvbm5hJywnVW5pcGknKTsKSU5TRVJUIElOVE8gUHJvZmVzc29yaSBWQUxVRVMgKCczJywnQ2FuZScsJ0RpbycsJ1VSU1MnKTsKSU5TRVJUIElOVE8gUHJvZmVzc29yaSBWQUxVRVMgKCc0JywnUG9yY28nLCdEaW8nLCdVUlNTJyk7CklOU0VSVCBJTlRPIFByb2Zlc3NvcmkgVkFMVUVTICgnNScsJ0NhenpvJywnZGkgQnVkZGEnLCdVbmltZXJkYScpOwpJTlNFUlQgSU5UTyBQcm9mZXNzb3JpIFZBTFVFUyAoJzYnLCdQb3R0YScsJ2RpIEthbMOsJywnVW5pbWVyZGEnKTsKSU5TRVJUIElOVE8gUHJvZmVzc29yaSBWQUxVRVMgKCc3JywnT3JjYScsJ01hZG9ubmEnLCdVbmlzdHJvbnppJyk7CgpJTlNFUlQgSU5UTyBDb3JzaSBWQUxVRVMgKCdDQVowMScsJ0NhenpvbWV0cmlhJywnVVJTUycsJzEnLCcxJyk7CklOU0VSVCBJTlRPIENvcnNpIFZBTFVFUyAoJ01SRDAxJywnTWVyZG9sb2dpYSBhcHBsaWNhdGEnLCdVbmlwaScsJzEnLCcxJyk7CklOU0VSVCBJTlRPIENvcnNpIFZBTFVFUyAoJ0NBWjAyJywnSW5nZWduZXJpYSBkZWwgY2F6em8nLCdVbmlwaScsJzEnLCcyJyk7CklOU0VSVCBJTlRPIENvcnNpIFZBTFVFUyAoJ1NDSDAxJywnU2NoaWZvIGFwcGxpY2F0bycsJ1VSU1MnLCcxJywnMycpOwpJTlNFUlQgSU5UTyBDb3JzaSBWQUxVRVMgKCdTQ1IwMScsJ1Njb3JlZ2dpb2N1bHR1cmEnLCdVbmltZXJkYScsJzEnLCc1Jyk7CklOU0VSVCBJTlRPIENvcnNpIFZBTFVFUyAoJ1NDUjAyJywnU2NvcmVnZ2lvY3VsdHVyYScsJ1VuaXBpJywnMCcsJzUnKTsKSU5TRVJUIElOVE8gQ29yc2kgVkFMVUVTICgnTVJEMDInLCdTY2llbnplIGRlbGxhIG1lcmRhJywnVW5pbWVyZGEnLCcxJywnNicpOwpJTlNFUlQgSU5UTyBDb3JzaSBWQUxVRVMgKCdDQVowMycsJ0NhenpvbWV0cmlhJywnVW5pc3Ryb256aScsJzEnLCc3Jyk7CklOU0VSVCBJTlRPIENvcnNpIFZBTFVFUyAoJ1NFRzAxJywnU2Vnb2xvZ2lhIGFudGljYScsJ1VuaXN0cm9uemknLCcxJywnNycpOwoKSU5TRVJUIElOVE8gQXVsZSBWQUxVRVMgKCcwMScsIlVuaXBpIik7CklOU0VSVCBJTlRPIEF1bGUgVkFMVUVTICgnMDInLCJVbmlwaSIpOwpJTlNFUlQgSU5UTyBBdWxlIFZBTFVFUyAoJzAzJywiVW5pcGkiKTsKSU5TRVJUIElOVE8gQXVsZSBWQUxVRVMgKCcwNCcsIlVuaXBpIik7CklOU0VSVCBJTlRPIEF1bGUgVkFMVUVTICgnMDUnLCJVbmlwaSIpOwpJTlNFUlQgSU5UTyBBdWxlIFZBTFVFUyAoJzA2JywiVVJTUyIpOwpJTlNFUlQgSU5UTyBBdWxlIFZBTFVFUyAoJzA3JywiVVJTUyIpOwpJTlNFUlQgSU5UTyBBdWxlIFZBTFVFUyAoJzA4JywiVVJTUyIpOwpJTlNFUlQgSU5UTyBBdWxlIFZBTFVFUyAoJzA5JywiVW5pbWVyZGEiKTsKSU5TRVJUIElOVE8gQXVsZSBWQUxVRVMgKCcxMCcsIlVuaW1lcmRhIik7CklOU0VSVCBJTlRPIEF1bGUgVkFMVUVTICgnMTEnLCJVbmlzdHJvbnppIik7CgpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMDInLCdNUkQwMScpOwpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMDYnLCdDQVowMScpOwpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMDInLCdDQVowMicpOwpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMDEnLCdNUkQwMScpOwpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMTEnLCdDQVowMycpOwpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMDcnLCdTQ0gwMScpOwpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMDknLCdTQ1IwMScpOwpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMDEnLCdTQ1IwMicpOwpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMTAnLCdNUkQwMicpOwpJTlNFUlQgSU5UTyBBdWxlQ29yc2kgVkFMVUVTICgnMTEnLCdTRUcwMScpOwoKSU5TRVJUIElOVE8gVGVzaSBWQUxVRVMgKCcwNCcsJzMnLCdMZWNjYXJlIGlsIGN1bG8gYWwgcHJvZmVzc29yZScsJzEnLCcyMycpOwpJTlNFUlQgSU5UTyBUZXNpIFZBTFVFUyAoJzEwJywnNycsJ1BlciB1biBmdXR1cm8gZGkgbWVyZGEnLCcwJyxOVUxMKTsKSU5TRVJUIElOVE8gVGVzaSBWQUxVRVMgKCcxMicsJzYnLCdMYSBtZXJkYSBlIGkgc3VvaSB1c2knLCcxJywnMzAnKTsKSU5TRVJUIElOVE8gVGVzaSBWQUxVRVMgKCcwMycsJzEnLCdNaXN1cmF6aW9uZSBkZWwgY2F6em8gbmVpIHNlY29saScsJzEnLCcxOCcpOwpJTlNFUlQgSU5UTyBUZXNpIFZBTFVFUyAoJzA3JywnMScsJ0NhenpvbWV0cmlhIGUgTWVyZGEsIGxlIHByb3NwZXR0aXZlJywnMCcsTlVMTCk7CgoKLypPUkEgRkFDQ0lPIElOVEVSUk9HQVpJT05JIEFMIERBVEFCQVNFICovCgoKLyogY3JlYSB1biBlbGVuY28gY29uIHR1dHRpIGkgY29nbm9taSBwcmVzZW50aSBkaSBhbHVubmkgZSBwcm9mZXNzb3JpKi8KQ1JFQVRFIFRBQkxFIENvZ25vbWkgKAogICAgY29nbm9tZSBWQVJDSEFSKDMwKSBQUklNQVJZIEtFWQopOwoKSU5TRVJUIElOVE8gQ29nbm9taSAKU0VMRUNUIERJU1RJTkNUIGNvZ25vbWUgRlJPTSBTdHVkZW50aSBVTklPTiAKU0VMRUNUIERJU1RJTkNUIGNvZ25vbWUgRlJPTSBQcm9mZXNzb3JpOwoKU0VMRUNUICJUdXR0aSBpIGNvZ25vbWkiOwpTRUxFQ1QgKgpGUk9NIENvZ25vbWk7CgoKCi8qIGVzZW1waW8gZGkgam9pbiBjb24gcHJvZG90dG8gY2FydGVzaWFubyBBdWxlIHggQ29yc2kgeCBBdWxlQ29yc2kpICovClNFTEVDVCAiQXNzb2NpYSBhZCBvZ25pIGF1bGEgaSBjb3JzaSBkYWkgcXVhbGkgdmllbmUgdXRpbGl6emF0YSI7CgpTRUxFQ1QgQXVsZS5udW1lcm8sIEF1bGUudW5pdmVyc2l0w6AsIENvcnNpLmNvZGljZSwgQ29yc2kubm9tZSwgQ29yc2kucHJvZmVzc29yZSwgQ29yc2kudW5pdmVyc2l0w6AKRlJPTSBBdWxlLCBDb3JzaSwgQXVsZUNvcnNpCldIRVJFIChhdWxhPW51bWVybyBBTkQgY29yc289Y29kaWNlKTsKCgoKU0VMRUNUICJTZWxlemlvbmEgdHV0dGUgbGUgYXVsZSB2dW90ZSI7CgpTRUxFQ1QgKgpGUk9NIEF1bGUKTUlOVVMKU0VMRUNUIEF1bGUubnVtZXJvLEF1bGUudW5pdmVyc2l0w6AKRlJPTSBBdWxlQ29yc2kgSk9JTiBBdWxlIE9OIEF1bGVDb3JzaS5hdWxhID0gQXVsZS5udW1lcm87CgoKClNFTEVDVCAiRWxlbmNvIGRlaSB0aXRvbGkgZGVsbGUgdGVzaSBlIGRlbGxlIGxvcm8gdmFsdXRhemlvbmkgaW4gZGVjaW1pIjsKClNFTEVDVCB0aXRvbG8sIHZhbHV0YXppb25lLzMgQVMgInZhbHV0YXppb25lIGluIGRlY2ltaSI7CkZST00gVGVzaQpXSEVSRSAoU29zdGVudXRhKTsKCgoKU0VMRUNUICJBc3NvY2lhIGFkIG9uZ2kgc3R1ZGVudGUgaWwgcHJvZmVzc29yZSBjb24gaWwgcXVhbGUgaGEgc29zdGVudXRvIG8gc29zdGVycsOgIGxhIHRlc2kiOwoKU0VMRUNUIFRlc2kudGl0b2xvLCBTdHVkZW50aS5ub21lLCBTdHVkZW50aS5jb2dub21lLCBQcm9mZXNzb3JpLm5vbWUsIFByb2Zlc3NvcmkuY29nbm9tZQpGUk9NIChUZXNpIEpPSU4gU3R1ZGVudGkgT04gVGVzaS5zdHVkZW50ZSA9IFN0dWRlbnRpLm1hdHJpY29sYSkKCUpPSU4gUHJvZmVzc29yaSBPTiBUZXNpLnByb2Zlc3NvcmUgPSBQcm9mZXNzb3JpLmNvZGljZTsKCgoKU0VMRUNUICJFbGVuY28gZGkgdHV0dGkgaSBjYW1waSBuZWkgcXVhbGkgc2kgc3ZvbGdvbm8gaSBjb3JzaSI7CgpTRUxFQ1QgRElTVElOQ1QgU1VCU1RSSU5HKG5vbWUsMSwzKQpGUk9NIENvcnNpOwoKCgpTRUxFQ1QgIkNvbnRlZ2dpbyBkZWdsaSBzdHVkZW50aS4uLiI7CgpTRUxFQ1QgQ09VTlQgKCopCkZST00gU3R1ZGVudGk7CgoKClNFTEVDVCAiQ29udGVnZ2lvIGRlZ2xpIHN0dWRlbnRpIGNvbiBub21pIGRpdmVyc2kiOwoKU0VMRUNUIENPVU5UIChESVNUSU5DVCBub21lKQpGUk9NIFN0dWRlbnRpOwoKCgpTRUxFQ1QgIkRhdGkgc3VsbGUgdmFsdXRhemlvbmkgZGVsbGUgdGVzaSAobWluL21heC9tZWRpYSkiOwoKU0VMRUNUIE1JTiAodm90YXppb25lKSwgTUFYICh2YWx1dGF6aW9uZSksIEFWRyh2YWx1dGF6aW9uZSkKRlJPTSBUZXNpOwoKCgpTRUxFQ1QgImNvbnRlZ2dpbyBzdHVkZW50aSBpbiBvbmdpIHVuaXZlcnNpdMOgIjsKClNFTEVDVCB1bml2ZXJzaXTDoCwgQ09VTlQoKikKRlJPTSBTdHVkZW50aQpHUk9VUCBCWSB1bml2ZXJzaXTDoDsKCgoKU0VMRUNUICJjb250ZWdnaW8gZGVnbGkgc3R1ZGVudGkgaW4gb2duaSB1bml2ZXJzaXTDoCBjb24gdmFsdXRhemlvbmUgPj0gMyI7CgpTRUxFQ1QgU3R1ZGVudGkudW5pdmVyc2l0w6AsIENPVU5UKCopCkZST00gU3R1ZGVudGkgSk9JTiBVbml2ZXJzaXTDoCBPTiBTdHVkZW50aS51bml2ZXJzaXTDoCA9IFVuaXZlcnNpdMOgLm5vbWUKR1JPVVAgQlkgU3R1ZGVudGkudW5pdmVyc2l0w6AKSEFWSU5HIChVbml2ZXJzaXTDoC52YWx1dGF6aW9uZSA+PSAzKTsKCgoKU0VMRUNUICJMZSB0cmUgbWlnbGlvcmkgdW5pdmVyc2l0w6AiOwoKU0VMRUNUICoKRlJPTSBVbml2ZXJzaXTDoApPUkRFUiBCWSBWYWx1dGF6aW9uZSBERVNDCkxJTUlUIDM7