A. UML Class Diagram

B. ERD

C. Definition of relational schema with proof that it is in BCNF

D. Table definition and creation SQL statements

(a). Table definition

CREATE DATABASE if not exists contact_tracing;

USE contact_tracing;


drop table if exists lab_result;
drop table if exists testing_sample;
drop table if exists testing_department;
drop table if exists treatment_plan;
drop table if exists treatment_department;
drop table if exists hospital;
drop table if exists contact_to_event;
drop table if exists contact;
drop table if exists contact_event;
drop table if exists patient;
drop table if exists person;
drop table if exists location;



CREATE TABLE location (
zipcode INT NOT NULL PRIMARY KEY,
street VARCHAR(100) NOT NULL,
city VARCHAR(50) NOT NULL,
state VARCHAR(30) NOT NULL);


INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (706, 'Madie Summit', 'North Chad', 'Massachusetts');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (2366, 'McCullough Station', 'West Ivy', 'NewHampshire');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (11266, 'Tobin Curve', 'East Sally', 'Massachusetts');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (12055, 'Boyer Spurs', 'Funkbury', 'Minnesota');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (14458, 'Royce Glens', 'Lake Daron', 'WestVirginia');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (14862, 'Homenick Stream', 'O\'Keefefort', 'Tennessee');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (17657, 'Lillian Radial', 'North Leviburgh', 'SouthCarolina');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (22413, 'Melba Valleys', 'Elmoport', 'Massachusetts');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (34529, 'Turner Route', 'Littelville', 'NewJersey');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (38307, 'Hintz Forges', 'Cleoport', 'Mississippi');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (39384, 'Batz Vista', 'East Shemarton', 'Louisiana');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (43567, 'Nader Common', 'Lake Valentin', 'Indiana');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (44072, 'Bergstrom Plain', 'South Caseyland', 'RhodeIsland');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (48644, 'Koelpin Green', 'East Kathrynborough', 'Connecticut');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (53327, 'Tito Mills', 'West Antonette', 'Wisconsin');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (53710, 'Rowe Fork', 'Wavaview', 'NewYork');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (55668, 'Lindgren Crescent', 'West Veldachester', 'Utah');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (56720, 'Ankunding Grove', 'Michaelafort', 'Alabama');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (62366, 'Brekke Ways', 'Annetteburgh', 'Maryland');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (65399, 'Emmerich Station', 'Roweborough', 'Massachusetts');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (67478, 'Marvin Corners', 'Leuschkeville', 'Texas');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (68925, 'Reed Station', 'Port Justyn', 'Oklahoma');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (69793, 'Aliza Courts', 'North Daisy', 'WestVirginia');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (72806, 'Leda Plains', 'Armstrongborough', 'Utah');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (75439, 'Carroll Club', 'Ericside', 'Connecticut');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (84760, 'Lang Divide', 'Jacintoburgh', 'Arizona');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (89729, 'Eliane Bridge', 'Lake Ora', 'NewHampshire');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (93183, 'Bogan Underpass', 'Croninhaven', 'Nevada');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (93649, 'Tierra Keys', 'Hallemouth', 'Kansas');
INSERT INTO `location` (`zipcode`, `street`, `city`, `state`) VALUES (96844, 'Dale Forge', 'Port Naomiefort', 'Maryland');


CREATE TABLE person (person_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR(30) NOT NULL,
age INT NOT NULL,
gender ENUM('male', 'female') NOT NULL,
zipcode INT NOT NULL,
FOREIGN KEY (zipcode) REFERENCES location(zipcode));


INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (1, 'Thomas', 'O\'Kon', 89, 'female', 53327);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (2, 'Gaston', 'Yost', 87, 'female', 14862);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (3, 'Garth', 'Gorczany', 34, 'male', 53327);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (4, 'Cierra', 'Kessler', 5, 'female', 53327);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (5, 'Dexter', 'Koepp', 41, 'female', 72806);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (6, 'Kayley', 'Hyatt', 61, 'male', 89729);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (7, 'Lexus', 'Berge', 32, 'female', 39384);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (8, 'Anne', 'Pouros', 85, 'male', 75439);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (9, 'Jackson', 'Koelpin', 35, 'female', 55668);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (10, 'Granville', 'Veum', 87, 'female', 68925);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (11, 'Will', 'Monahan', 48, 'female', 93649);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (12, 'Heidi', 'Hand', 44, 'male', 48644);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (13, 'Troy', 'Mertz', 17, 'male', 53327);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (14, 'Anna', 'Sanford', 12, 'male', 11266);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (15, 'Brown', 'Volkman', 18, 'female', 38307);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (16, 'Brandyn', 'Jerde', 73, 'male', 12055);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (17, 'Norma', 'Kuvalis', 95, 'female', 39384);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (18, 'Sandy', 'Bogan', 33, 'female', 14862);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (19, 'Autumn', 'Mueller', 14, 'male', 65399);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (20, 'Moriah', 'Leannon', 20, 'male', 55668);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (21, 'Mia', 'Gerlach', 31, 'male', 55668);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (22, 'Devonte', 'Rohan', 38, 'male', 11266);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (23, 'Elena', 'Bruen', 36, 'male', 44072);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (24, 'Jeanne', 'Hessel', 93, 'male', 55668);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (25, 'May', 'Spinka', 29, 'female', 14458);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (26, 'Mariam', 'Mohr', 48, 'female', 11266);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (27, 'Trever', 'Johns', 25, 'male', 96844);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (28, 'Ila', 'Jenkins', 48, 'male', 2366);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (29, 'Donnie', 'Ernser', 88, 'female', 62366);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (30, 'Ted', 'Ebert', 69, 'male', 89729);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (31, 'Joshuah', 'Beahan', 70, 'female', 75439);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (32, 'Harvey', 'Sipes', 34, 'female', 12055);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (33, 'Marlee', 'Lowe', 41, 'female', 2366);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (34, 'Trycia', 'Wyman', 79, 'female', 34529);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (35, 'Herminio', 'Walker', 12, 'female', 56720);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (36, 'Margie', 'Hilpert', 36, 'male', 84760);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (37, 'Scarlett', 'Stamm', 38, 'female', 14862);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (38, 'Kameron', 'Bruen', 83, 'female', 93183);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (39, 'Maximillian', 'Leffler', 56, 'male', 65399);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (40, 'Helga', 'Barrows', 85, 'female', 68925);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (41, 'Violette', 'Sipes', 88, 'female', 65399);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (42, 'Jeanette', 'Harvey', 89, 'female', 56720);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (43, 'Sean', 'Wilkinson', 42, 'female', 14458);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (44, 'Lamont', 'Olson', 68, 'female', 12055);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (45, 'Dayton', 'Barrows', 72, 'male', 67478);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (46, 'Lavina', 'Corkery', 95, 'female', 53327);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (47, 'Verlie', 'Rogahn', 81, 'male', 22413);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (48, 'Devante', 'Harber', 71, 'male', 2366);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (49, 'Roel', 'Hayes', 32, 'male', 65399);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (50, 'Erik', 'Nikolaus', 28, 'female', 89729);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (51, 'Reyes', 'Maggio', 82, 'male', 56720);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (52, 'Dannie', 'White', 83, 'male', 17657);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (53, 'Shanon', 'Windler', 29, 'male', 93649);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (54, 'Zora', 'Hoeger', 84, 'female', 706);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (55, 'Dejon', 'King', 47, 'male', 72806);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (56, 'Georgianna', 'Robel', 25, 'male', 12055);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (57, 'Leatha', 'Schmitt', 49, 'male', 11266);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (58, 'Demetrius', 'Dare', 37, 'male', 69793);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (59, 'Cornell', 'Pollich', 3, 'female', 14862);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (60, 'Sigmund', 'Jacobs', 47, 'male', 67478);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (61, 'Lola', 'Pagac', 30, 'female', 65399);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (62, 'Kali', 'Schultz', 22, 'female', 96844);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (63, 'Geovany', 'Swift', 26, 'male', 75439);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (64, 'Foster', 'Grant', 25, 'female', 68925);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (65, 'Ashley', 'Hammes', 78, 'female', 34529);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (66, 'Rex', 'Cummerata', 11, 'male', 43567);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (67, 'Dewitt', 'Ondricka', 99, 'male', 55668);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (68, 'Lucas', 'McDermott', 35, 'female', 48644);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (69, 'Edmond', 'Turner', 100, 'male', 38307);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (70, 'Keegan', 'Herzog', 20, 'female', 14862);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (71, 'Joany', 'Deckow', 29, 'female', 14862);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (72, 'Jacynthe', 'Crona', 30, 'male', 96844);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (73, 'Bart', 'Walter', 46, 'female', 72806);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (74, 'Gerson', 'Crona', 78, 'male', 39384);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (75, 'Annabel', 'Christiansen', 23, 'male', 11266);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (76, 'Leta', 'Cruickshank', 19, 'female', 53327);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (77, 'Belle', 'Heidenreich', 23, 'female', 75439);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (78, 'Casey', 'Stroman', 18, 'male', 39384);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (79, 'Carlie', 'Dare', 67, 'female', 53710);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (80, 'Donny', 'Rohan', 54, 'male', 53327);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (81, 'Drew', 'Schimmel', 11, 'female', 17657);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (82, 'Kendrick', 'Hamill', 76, 'male', 12055);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (83, 'Marc', 'Schuster', 93, 'male', 67478);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (84, 'Bette', 'Harber', 38, 'male', 14862);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (85, 'Adriana', 'Green', 33, 'female', 12055);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (86, 'Lesley', 'Ledner', 39, 'male', 48644);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (87, 'Hans', 'Connelly', 97, 'female', 34529);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (88, 'Rahsaan', 'McDermott', 31, 'female', 17657);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (89, 'Kevin', 'Borer', 13, 'female', 17657);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (90, 'Elvis', 'Stiedemann', 43, 'male', 53327);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (91, 'Jaunita', 'Runte', 18, 'female', 93183);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (92, 'Nora', 'Hagenes', 31, 'male', 84760);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (93, 'Bobbie', 'Hartmann', 1, 'male', 53327);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (94, 'Florencio', 'Green', 62, 'female', 68925);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (95, 'Antonina', 'Crist', 40, 'male', 55668);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (96, 'Cicero', 'Hegmann', 100, 'male', 69793);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (97, 'Deon', 'Considine', 50, 'female', 12055);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (98, 'Korbin', 'Labadie', 12, 'female', 12055);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (99, 'Jerrold', 'Lueilwitz', 48, 'male', 17657);
INSERT INTO `person` (`person_id`, `first_name`, `last_name`, `age`, `gender`, `zipcode`) VALUES (100, 'Leanne', 'Watsica', 76, 'male', 44072);



CREATE TABLE patient (patient_id INT, 
    patient_condition ENUM('mild', 'medium', 'severe'),
    PRIMARY KEY (patient_id),
    FOREIGN KEY (patient_id) REFERENCES person(person_id)
);

INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (1, 'severe');
INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (9, 'severe');
INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (12, 'medium');
INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (13, 'severe');
INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (20, 'severe');
INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (53, 'severe');
INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (67, 'severe');
INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (75, 'medium');
INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (87, 'medium');
INSERT INTO `patient` (`patient_id`, `patient_condition`) VALUES (95, 'severe');


CREATE TABLE contact_event(event_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
contact_date DATETIME,
zipcode INT,
FOREIGN KEY (zipcode) REFERENCES location(zipcode)
);


INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (1, '2020-07-16 02:40:04', 55668);
INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (2, '2020-07-01 23:26:26', 68925);
INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (3, '2020-03-26 01:25:06', 68925);
INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (4, '2020-01-12 01:19:00', 11266);
INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (5, '2020-04-12 10:25:41', 43567);
INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (6, '2020-04-13 00:03:36', 14458);
INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (7, '2020-07-16 13:24:08', 67478);
INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (8, '2020-06-01 09:54:29', 89729);
INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (9, '2020-06-12 22:56:16', 55668);
INSERT INTO `contact_event` (`event_id`, `contact_date`, `zipcode`) VALUES (10, '2020-01-14 11:25:00', 62366);




CREATE TABLE contact (person_id INT , 
    contact_degree ENUM('direct', 'indirect'),
    patient_id INT NOT NULL,
    PRIMARY KEY (person_id),
    FOREIGN KEY (person_id) REFERENCES person(person_id),
    FOREIGN KEY (patient_id) REFERENCES patient(patient_id),
    check (person_id<>patient_id)
);



INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (1, 'direct', 75);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (2, 'direct', 53);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (4, 'indirect', 9);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (7, 'indirect', 87);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (8, 'direct', 95);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (9, 'direct', 67);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (11, 'direct', 95);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (15, 'indirect', 95);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (16, 'indirect', 1);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (17, 'direct', 9);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (19, 'indirect', 1);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (24, 'direct', 1);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (27, 'indirect', 20);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (28, 'indirect', 75);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (29, 'direct', 53);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (31, 'indirect', 67);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (33, 'direct', 75);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (34, 'direct', 20);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (35, 'indirect', 75);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (37, 'indirect', 9);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (38, 'indirect', 12);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (39, 'direct', 1);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (40, 'direct', 12);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (41, 'direct', 67);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (44, 'direct', 13);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (46, 'direct', 1);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (49, 'direct', 95);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (53, 'direct', 75);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (55, 'indirect', 95);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (57, 'direct', 13);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (60, 'indirect', 20);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (64, 'indirect', 53);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (68, 'indirect', 75);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (69, 'indirect', 20);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (70, 'indirect', 12);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (71, 'direct', 9);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (74, 'indirect', 67);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (75, 'indirect', 1);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (77, 'indirect', 20);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (80, 'direct', 67);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (84, 'indirect', 1);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (86, 'direct', 13);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (88, 'direct', 53);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (90, 'indirect', 20);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (91, 'indirect', 9);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (92, 'direct', 75);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (93, 'indirect', 20);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (95, 'indirect', 1);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (96, 'indirect', 67);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (98, 'direct', 9);
INSERT INTO `contact` (`person_id`, `contact_degree`, `patient_id`) VALUES (99, 'indirect', 75);



CREATE TABLE contact_to_event(event_id INT,
person_id INT,
PRIMARY KEY (event_id, person_id),
FOREIGN KEY (event_id) REFERENCES contact_event(event_id),
FOREIGN KEY (person_id) REFERENCES contact(person_id)
);




INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 7);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 15);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 38);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 49);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 53);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 64);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 68);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 69);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 74);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 86);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (1, 90);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (2, 19);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (2, 24);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (2, 27);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (2, 35);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (2, 46);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (3, 9);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (3, 11);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (3, 31);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (3, 41);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (3, 46);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (3, 57);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (3, 77);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (3, 86);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (3, 88);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (4, 9);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (4, 19);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (4, 41);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (4, 95);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (4, 99);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (5, 4);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (5, 7);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (5, 24);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (5, 40);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (5, 69);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (5, 77);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (5, 80);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (5, 92);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (6, 17);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (6, 31);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (6, 44);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (6, 49);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (6, 68);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (6, 69);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (6, 88);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (6, 96);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (6, 99);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (7, 31);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (7, 60);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (7, 74);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (7, 98);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (8, 4);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (8, 60);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (8, 69);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (8, 71);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (8, 91);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (9, 4);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (9, 37);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (9, 40);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (9, 71);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (9, 91);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 27);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 31);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 44);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 46);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 49);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 57);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 69);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 74);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 75);
INSERT INTO `contact_to_event` (`event_id`, `person_id`) VALUES (10, 84);


CREATE TABLE hospital(hospital_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
zipcode INT NOT NULL,
FOREIGN KEY (zipcode) REFERENCES location(zipcode)
);

INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (1, 'Lake Hospital', 75439);
INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (2, 'Glover-Von Hospital', 67478);
INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (3, 'Walsh Hospital', 14458);
INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (4, 'Turner Hospital', 93183);
INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (5, 'Crona-Wehner Hospital', 17657);
INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (6, 'Torphy-Lind Hospital', 2366);
INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (7, 'Baumbach Hospital', 65399);
INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (8, 'Nicolas-Terry Hospital', 69793);
INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (9, 'Marry Hospital', 44072);
INSERT INTO `hospital` (`hospital_id`, `name`, `zipcode`) VALUES (10, 'Ankunding-Hudson Hospital', 56720);


CREATE TABLE treatment_department(section_id INT NOT NULL check(section_id<=5),
patient_id INT,
hospital_id INT,
primary key(section_id, patient_id,hospital_id),
FOREIGN KEY (patient_id) REFERENCES patient(patient_id),
FOREIGN KEY (hospital_id) REFERENCES hospital(hospital_id)
);


INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (1, 12, 6);
INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (2, 9, 2);
INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (2, 13, 10);
INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (3, 20, 8);
INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (3, 95, 8);
INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (4, 1, 4);
INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (4, 87, 9);
INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (5, 75, 5);
INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (5, 53, 3);
INSERT INTO `treatment_department` (`section_id`, `patient_id`, `hospital_id`) VALUES (5, 67, 4);



CREATE TABLE treatment_plan(plan_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
patient_id INT,
hospital_id INT,
section_id INT,
plan ENUM('treatment_A', 'treatment_B', 'treatment_C', 'treatment_D'),
unique(section_id, patient_id, hospital_id),
FOREIGN KEY (section_id, patient_id, hospital_id) REFERENCES treatment_department(section_id, patient_id, hospital_id)

);



INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (1, 1, 12, 6, 'treatment_A');
INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (2, 2, 9, 2,  'treatment_B');
INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (3, 2, 13, 10,'treatment_B');
INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (4, 3, 20, 8, 'treatment_B');
INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (5, 3, 95, 8, 'treatment_C');
INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (6, 4, 1, 4,  'treatment_C');
INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (7, 4, 87, 9, 'treatment_C');
INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (8, 5, 75, 5, 'treatment_D');
INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (9, 5, 53, 3, 'treatment_D');
INSERT INTO `treatment_plan` (`plan_id`,`section_id`, `patient_id`, `hospital_id`, `plan`) VALUES (10, 5, 67, 4,'treatment_A');





CREATE TABLE testing_department(section_id INT NOT NULL check(section_id<=5),
person_id INT,
hospital_id INT,
PRIMARY KEY(section_id, person_id, hospital_id),
FOREIGN KEY (person_id) REFERENCES contact(person_id),
FOREIGN KEY (hospital_id) REFERENCES hospital(hospital_id)
);

INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (1, 27, 5);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (1, 29, 5);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (1, 44, 6);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (1, 57, 3);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (2, 2, 4);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (2, 31, 3);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (2, 70, 5);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (2, 86, 4);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (3, 34, 5);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (3, 46, 1);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (3, 49, 7);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (3, 98, 4);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (4, 37, 1);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (4, 35, 9);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (4, 69, 2);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (4, 90, 7);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (4, 91, 8);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (5, 68, 2);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (5, 84, 10);
INSERT INTO `testing_department` (`section_id`, `person_id`, `hospital_id`) VALUES (5, 92, 9);




CREATE TABLE testing_sample(sample_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
section_id INT,
person_id INT,
hospital_id INT,
unique(section_id, person_id, hospital_id),
FOREIGN KEY (section_id, person_id, hospital_id) REFERENCES testing_department(section_id, person_id, hospital_id)

);


INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (1, 1, 27, 5);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (2, 1, 29, 5);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (3, 1, 44, 6);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (4, 1, 57, 3);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (5, 2, 2, 4);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (6, 2, 31, 3);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (7, 2, 70, 5);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (8, 2, 86, 4);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (9, 3, 34, 5);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (10, 3, 46, 1);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (11, 3, 49, 7);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (12, 3, 98, 4);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (13, 4, 37, 1);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (14, 4, 35, 9);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (15, 4, 69, 2);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (16, 4, 90, 7);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (17, 4, 91, 8);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (18, 5, 68, 2);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (19, 5, 84, 10);
INSERT INTO `testing_sample` (`sample_id`, `section_id`, `person_id`, `hospital_id`) VALUES (20, 5, 92, 9);



CREATE TABLE lab_result(result_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
sample_id int,
unique(sample_id),
result ENUM('positive', 'negative') NOT NULL,
FOREIGN KEY (sample_id) REFERENCES testing_sample(sample_id)

);


INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (1, 1, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (2, 3, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (3, 5, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (4, 7, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (5, 9,'negative' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (6, 2, 'negative' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (7, 4, 'negative' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (8, 6, 'negative' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (9, 8, 'negative' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (10, 10, 'negative' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (11, 11, 'negative' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (12, 13, 'negative' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (13, 15, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (14, 17, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (15, 19, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (16, 12, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (17, 14, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (18, 16, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (19, 18, 'positive' );
INSERT INTO `lab_result` (`result_id`, `sample_id`, `result`) VALUES (20, 20, 'positive' );

(b). Queries


-- 1. All contacts who test positive 

SELECT person.first_name, person.last_name, lab_result.result
FROM person, contact, testing_department, testing_sample, lab_result
WHERE contact.person_id = person.person_id
AND contact.person_id = testing_department.person_id
AND testing_department.person_id = testing_sample.person_id
AND testing_department.section_id = testing_sample.section_id
AND testing_department.hospital_id = testing_sample.hospital_id
AND testing_sample.sample_id = lab_result.sample_id
AND lab_result.result = 'positive';


-- 2. Show all the location where the number of contacts who test positive are more than 2. 
SELECT zip as zipcode, str as street, cit as city, stt as state
FROM (
    SELECT COUNT(contact.person_id) AS total_pos, location.zipcode AS zip, location.street AS str, location.city AS cit, location.state AS stt
    FROM person, contact, testing_department, testing_sample, lab_result, location, contact_to_event, contact_event
    WHERE contact.person_id = person.person_id
    AND contact.person_id = testing_department.person_id
    AND testing_department.person_id = testing_sample.person_id
    AND testing_department.section_id = testing_sample.section_id
    AND testing_department.hospital_id = testing_sample.hospital_id
    AND testing_sample.sample_id = lab_result.sample_id
    AND lab_result.result = 'positive'
    AND contact.person_id = contact_to_event.person_id
    AND contact_to_event.event_id = contact_event.event_id
    AND contact_event.zipcode = location.zipcode
    GROUP BY zip
) as alias
WHERE total_pos > 2;



-- 3. Hospital that has treated more than or equal to 2 patients. 
SELECT hospital.name, COUNT(patient.patient_id) AS total_patient
FROM hospital, treatment_department, patient
WHERE hospital.hospital_id = treatment_department.hospital_id
AND treatment_department.patient_id = patient.patient_id
GROUP BY hospital.hospital_id
HAVING total_patient >= 2;


-- 4. Show all the contacts who are contacted in an indirect way and test positive. 
SELECT person.first_name, person.last_name, lab_result.result
FROM person, contact, testing_department, testing_sample, lab_result
WHERE contact.person_id = person.person_id
AND contact.person_id = testing_department.person_id
AND testing_department.person_id = testing_sample.person_id
AND testing_department.section_id = testing_sample.section_id
AND testing_department.hospital_id = testing_sample.hospital_id
AND testing_sample.sample_id = lab_result.sample_id
AND contact.contact_degree = 'indirect'
AND lab_result.result = 'positive';



-- 5. The classification of the number of contact made by each patient
SELECT 
    CASE
        WHEN num_of_contact >= 5 THEN 'num_of_contact >= 5 '
        ELSE 'num_of_contact < 5'
    END AS classification,
    ptt AS patient_id,
    num_of_contact
FROM
    (SELECT 
        patient.patient_id AS ptt,
            COUNT(contact.person_id) AS num_of_contact
    FROM
        contact, patient
    WHERE
        contact.patient_id = patient.patient_id
    GROUP BY patient.patient_id
    ORDER BY num_of_contact) AS alias;

E. Data retrievals into R and show database functions properly

(a). Connect DB with R


library(RMySQL)
mydb = dbConnect(MySQL(), user = 'root', password = 'HEPburn419403210', dbname = 'contact_tracing', host = 'localhost')
dbListTables(mydb)
 [1] "contact"              "contact_event"        "contact_to_event"     "hospital"            
 [5] "lab_result"           "location"             "patient"              "person"              
 [9] "testing_department"   "testing_sample"       "treatment_department" "treatment_plan"      

(b). Load data properly useing query

 rs = dbSendQuery(mydb, "SELECT 
     CASE
         WHEN num_of_contact >= 5 THEN 'num_of_contact >= 5 '
         ELSE 'num_of_contact < 5'
     END AS classification,
     ptt AS patient_id,
     num_of_contact
 FROM
     (SELECT 
         patient.patient_id AS ptt,
             COUNT(contact.person_id) AS num_of_contact
     FROM
         contact, patient
     WHERE
         contact.patient_id = patient.patient_id
     GROUP BY patient.patient_id
     ORDER BY num_of_contact) AS alias")
 output = fetch(rs, n = -1)
 output

(c).Draw a bar plot to show the patient and the number of its corresponding contact.

library(dbplot)
dbplot_bar(output,patient_id,num_of_contact)

LS0tCnRpdGxlOiAiQ1M1MjAwIFByYWN0aWN1bSAjMSBieSBHcm91cCAjMSIKb3V0cHV0OiBodG1sX25vdGVib29rCmRmX3ByaW50OiBwYWdlZAotLS0KCiMgQS4gVU1MIENsYXNzIERpYWdyYW0KCiFbXShwcmFjdGljdW0xIC0gQ29uY2VwdHVhbCBNb2RlbC5qcGVnKQoKCgoKCgoKCgoKCgoKCgoKCiMgQi4gRVJECiFbXShwcmFjdGljdW0xIC0gTG9naWNhbCBNb2RlbC5qcGVnKQoKCgoKCgoKCgoKCgoKCgojIEMuIERlZmluaXRpb24gb2YgcmVsYXRpb25hbCBzY2hlbWEgd2l0aCBwcm9vZiB0aGF0IGl0IGlzIGluIEJDTkYKIVtdKFNjaGVtYUFuZEZEXzEuanBnKQohW10oU2NoZW1hQW5kRkRfMi5qcGcpCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIEQuIFRhYmxlIGRlZmluaXRpb24gYW5kIGNyZWF0aW9uIFNRTCBzdGF0ZW1lbnRzCiMjIChhKS4gVGFibGUgZGVmaW5pdGlvbgpgYGB7c3FsIGNvbm5lY3Rpb249Y29ufQpDUkVBVEUgREFUQUJBU0UgaWYgbm90IGV4aXN0cyBjb250YWN0X3RyYWNpbmc7CgpVU0UgY29udGFjdF90cmFjaW5nOwoKCmRyb3AgdGFibGUgaWYgZXhpc3RzIGxhYl9yZXN1bHQ7CmRyb3AgdGFibGUgaWYgZXhpc3RzIHRlc3Rpbmdfc2FtcGxlOwpkcm9wIHRhYmxlIGlmIGV4aXN0cyB0ZXN0aW5nX2RlcGFydG1lbnQ7CmRyb3AgdGFibGUgaWYgZXhpc3RzIHRyZWF0bWVudF9wbGFuOwpkcm9wIHRhYmxlIGlmIGV4aXN0cyB0cmVhdG1lbnRfZGVwYXJ0bWVudDsKZHJvcCB0YWJsZSBpZiBleGlzdHMgaG9zcGl0YWw7CmRyb3AgdGFibGUgaWYgZXhpc3RzIGNvbnRhY3RfdG9fZXZlbnQ7CmRyb3AgdGFibGUgaWYgZXhpc3RzIGNvbnRhY3Q7CmRyb3AgdGFibGUgaWYgZXhpc3RzIGNvbnRhY3RfZXZlbnQ7CmRyb3AgdGFibGUgaWYgZXhpc3RzIHBhdGllbnQ7CmRyb3AgdGFibGUgaWYgZXhpc3RzIHBlcnNvbjsKZHJvcCB0YWJsZSBpZiBleGlzdHMgbG9jYXRpb247CgoKCkNSRUFURSBUQUJMRSBsb2NhdGlvbiAoCnppcGNvZGUgSU5UIE5PVCBOVUxMIFBSSU1BUlkgS0VZLApzdHJlZXQgVkFSQ0hBUigxMDApIE5PVCBOVUxMLApjaXR5IFZBUkNIQVIoNTApIE5PVCBOVUxMLApzdGF0ZSBWQVJDSEFSKDMwKSBOT1QgTlVMTCk7CgoKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDcwNiwgJ01hZGllIFN1bW1pdCcsICdOb3J0aCBDaGFkJywgJ01hc3NhY2h1c2V0dHMnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDIzNjYsICdNY0N1bGxvdWdoIFN0YXRpb24nLCAnV2VzdCBJdnknLCAnTmV3SGFtcHNoaXJlJyk7CklOU0VSVCBJTlRPIGBsb2NhdGlvbmAgKGB6aXBjb2RlYCwgYHN0cmVldGAsIGBjaXR5YCwgYHN0YXRlYCkgVkFMVUVTICgxMTI2NiwgJ1RvYmluIEN1cnZlJywgJ0Vhc3QgU2FsbHknLCAnTWFzc2FjaHVzZXR0cycpOwpJTlNFUlQgSU5UTyBgbG9jYXRpb25gIChgemlwY29kZWAsIGBzdHJlZXRgLCBgY2l0eWAsIGBzdGF0ZWApIFZBTFVFUyAoMTIwNTUsICdCb3llciBTcHVycycsICdGdW5rYnVyeScsICdNaW5uZXNvdGEnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDE0NDU4LCAnUm95Y2UgR2xlbnMnLCAnTGFrZSBEYXJvbicsICdXZXN0VmlyZ2luaWEnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDE0ODYyLCAnSG9tZW5pY2sgU3RyZWFtJywgJ09cJ0tlZWZlZm9ydCcsICdUZW5uZXNzZWUnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDE3NjU3LCAnTGlsbGlhbiBSYWRpYWwnLCAnTm9ydGggTGV2aWJ1cmdoJywgJ1NvdXRoQ2Fyb2xpbmEnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDIyNDEzLCAnTWVsYmEgVmFsbGV5cycsICdFbG1vcG9ydCcsICdNYXNzYWNodXNldHRzJyk7CklOU0VSVCBJTlRPIGBsb2NhdGlvbmAgKGB6aXBjb2RlYCwgYHN0cmVldGAsIGBjaXR5YCwgYHN0YXRlYCkgVkFMVUVTICgzNDUyOSwgJ1R1cm5lciBSb3V0ZScsICdMaXR0ZWx2aWxsZScsICdOZXdKZXJzZXknKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDM4MzA3LCAnSGludHogRm9yZ2VzJywgJ0NsZW9wb3J0JywgJ01pc3Npc3NpcHBpJyk7CklOU0VSVCBJTlRPIGBsb2NhdGlvbmAgKGB6aXBjb2RlYCwgYHN0cmVldGAsIGBjaXR5YCwgYHN0YXRlYCkgVkFMVUVTICgzOTM4NCwgJ0JhdHogVmlzdGEnLCAnRWFzdCBTaGVtYXJ0b24nLCAnTG91aXNpYW5hJyk7CklOU0VSVCBJTlRPIGBsb2NhdGlvbmAgKGB6aXBjb2RlYCwgYHN0cmVldGAsIGBjaXR5YCwgYHN0YXRlYCkgVkFMVUVTICg0MzU2NywgJ05hZGVyIENvbW1vbicsICdMYWtlIFZhbGVudGluJywgJ0luZGlhbmEnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDQ0MDcyLCAnQmVyZ3N0cm9tIFBsYWluJywgJ1NvdXRoIENhc2V5bGFuZCcsICdSaG9kZUlzbGFuZCcpOwpJTlNFUlQgSU5UTyBgbG9jYXRpb25gIChgemlwY29kZWAsIGBzdHJlZXRgLCBgY2l0eWAsIGBzdGF0ZWApIFZBTFVFUyAoNDg2NDQsICdLb2VscGluIEdyZWVuJywgJ0Vhc3QgS2F0aHJ5bmJvcm91Z2gnLCAnQ29ubmVjdGljdXQnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDUzMzI3LCAnVGl0byBNaWxscycsICdXZXN0IEFudG9uZXR0ZScsICdXaXNjb25zaW4nKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDUzNzEwLCAnUm93ZSBGb3JrJywgJ1dhdmF2aWV3JywgJ05ld1lvcmsnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDU1NjY4LCAnTGluZGdyZW4gQ3Jlc2NlbnQnLCAnV2VzdCBWZWxkYWNoZXN0ZXInLCAnVXRhaCcpOwpJTlNFUlQgSU5UTyBgbG9jYXRpb25gIChgemlwY29kZWAsIGBzdHJlZXRgLCBgY2l0eWAsIGBzdGF0ZWApIFZBTFVFUyAoNTY3MjAsICdBbmt1bmRpbmcgR3JvdmUnLCAnTWljaGFlbGFmb3J0JywgJ0FsYWJhbWEnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDYyMzY2LCAnQnJla2tlIFdheXMnLCAnQW5uZXR0ZWJ1cmdoJywgJ01hcnlsYW5kJyk7CklOU0VSVCBJTlRPIGBsb2NhdGlvbmAgKGB6aXBjb2RlYCwgYHN0cmVldGAsIGBjaXR5YCwgYHN0YXRlYCkgVkFMVUVTICg2NTM5OSwgJ0VtbWVyaWNoIFN0YXRpb24nLCAnUm93ZWJvcm91Z2gnLCAnTWFzc2FjaHVzZXR0cycpOwpJTlNFUlQgSU5UTyBgbG9jYXRpb25gIChgemlwY29kZWAsIGBzdHJlZXRgLCBgY2l0eWAsIGBzdGF0ZWApIFZBTFVFUyAoNjc0NzgsICdNYXJ2aW4gQ29ybmVycycsICdMZXVzY2hrZXZpbGxlJywgJ1RleGFzJyk7CklOU0VSVCBJTlRPIGBsb2NhdGlvbmAgKGB6aXBjb2RlYCwgYHN0cmVldGAsIGBjaXR5YCwgYHN0YXRlYCkgVkFMVUVTICg2ODkyNSwgJ1JlZWQgU3RhdGlvbicsICdQb3J0IEp1c3R5bicsICdPa2xhaG9tYScpOwpJTlNFUlQgSU5UTyBgbG9jYXRpb25gIChgemlwY29kZWAsIGBzdHJlZXRgLCBgY2l0eWAsIGBzdGF0ZWApIFZBTFVFUyAoNjk3OTMsICdBbGl6YSBDb3VydHMnLCAnTm9ydGggRGFpc3knLCAnV2VzdFZpcmdpbmlhJyk7CklOU0VSVCBJTlRPIGBsb2NhdGlvbmAgKGB6aXBjb2RlYCwgYHN0cmVldGAsIGBjaXR5YCwgYHN0YXRlYCkgVkFMVUVTICg3MjgwNiwgJ0xlZGEgUGxhaW5zJywgJ0FybXN0cm9uZ2Jvcm91Z2gnLCAnVXRhaCcpOwpJTlNFUlQgSU5UTyBgbG9jYXRpb25gIChgemlwY29kZWAsIGBzdHJlZXRgLCBgY2l0eWAsIGBzdGF0ZWApIFZBTFVFUyAoNzU0MzksICdDYXJyb2xsIENsdWInLCAnRXJpY3NpZGUnLCAnQ29ubmVjdGljdXQnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDg0NzYwLCAnTGFuZyBEaXZpZGUnLCAnSmFjaW50b2J1cmdoJywgJ0FyaXpvbmEnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDg5NzI5LCAnRWxpYW5lIEJyaWRnZScsICdMYWtlIE9yYScsICdOZXdIYW1wc2hpcmUnKTsKSU5TRVJUIElOVE8gYGxvY2F0aW9uYCAoYHppcGNvZGVgLCBgc3RyZWV0YCwgYGNpdHlgLCBgc3RhdGVgKSBWQUxVRVMgKDkzMTgzLCAnQm9nYW4gVW5kZXJwYXNzJywgJ0Nyb25pbmhhdmVuJywgJ05ldmFkYScpOwpJTlNFUlQgSU5UTyBgbG9jYXRpb25gIChgemlwY29kZWAsIGBzdHJlZXRgLCBgY2l0eWAsIGBzdGF0ZWApIFZBTFVFUyAoOTM2NDksICdUaWVycmEgS2V5cycsICdIYWxsZW1vdXRoJywgJ0thbnNhcycpOwpJTlNFUlQgSU5UTyBgbG9jYXRpb25gIChgemlwY29kZWAsIGBzdHJlZXRgLCBgY2l0eWAsIGBzdGF0ZWApIFZBTFVFUyAoOTY4NDQsICdEYWxlIEZvcmdlJywgJ1BvcnQgTmFvbWllZm9ydCcsICdNYXJ5bGFuZCcpOwoKCkNSRUFURSBUQUJMRSBwZXJzb24gKHBlcnNvbl9pZCBJTlQgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQgUFJJTUFSWSBLRVksCmZpcnN0X25hbWUgVkFSQ0hBUigzMCkgTk9UIE5VTEwsCmxhc3RfbmFtZSBWQVJDSEFSKDMwKSBOT1QgTlVMTCwKYWdlIElOVCBOT1QgTlVMTCwKZ2VuZGVyIEVOVU0oJ21hbGUnLCAnZmVtYWxlJykgTk9UIE5VTEwsCnppcGNvZGUgSU5UIE5PVCBOVUxMLApGT1JFSUdOIEtFWSAoemlwY29kZSkgUkVGRVJFTkNFUyBsb2NhdGlvbih6aXBjb2RlKSk7CgoKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgxLCAnVGhvbWFzJywgJ09cJ0tvbicsIDg5LCAnZmVtYWxlJywgNTMzMjcpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDIsICdHYXN0b24nLCAnWW9zdCcsIDg3LCAnZmVtYWxlJywgMTQ4NjIpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDMsICdHYXJ0aCcsICdHb3JjemFueScsIDM0LCAnbWFsZScsIDUzMzI3KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg0LCAnQ2llcnJhJywgJ0tlc3NsZXInLCA1LCAnZmVtYWxlJywgNTMzMjcpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDUsICdEZXh0ZXInLCAnS29lcHAnLCA0MSwgJ2ZlbWFsZScsIDcyODA2KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg2LCAnS2F5bGV5JywgJ0h5YXR0JywgNjEsICdtYWxlJywgODk3MjkpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDcsICdMZXh1cycsICdCZXJnZScsIDMyLCAnZmVtYWxlJywgMzkzODQpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDgsICdBbm5lJywgJ1BvdXJvcycsIDg1LCAnbWFsZScsIDc1NDM5KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg5LCAnSmFja3NvbicsICdLb2VscGluJywgMzUsICdmZW1hbGUnLCA1NTY2OCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoMTAsICdHcmFudmlsbGUnLCAnVmV1bScsIDg3LCAnZmVtYWxlJywgNjg5MjUpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDExLCAnV2lsbCcsICdNb25haGFuJywgNDgsICdmZW1hbGUnLCA5MzY0OSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoMTIsICdIZWlkaScsICdIYW5kJywgNDQsICdtYWxlJywgNDg2NDQpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDEzLCAnVHJveScsICdNZXJ0eicsIDE3LCAnbWFsZScsIDUzMzI3KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgxNCwgJ0FubmEnLCAnU2FuZm9yZCcsIDEyLCAnbWFsZScsIDExMjY2KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgxNSwgJ0Jyb3duJywgJ1ZvbGttYW4nLCAxOCwgJ2ZlbWFsZScsIDM4MzA3KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgxNiwgJ0JyYW5keW4nLCAnSmVyZGUnLCA3MywgJ21hbGUnLCAxMjA1NSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoMTcsICdOb3JtYScsICdLdXZhbGlzJywgOTUsICdmZW1hbGUnLCAzOTM4NCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoMTgsICdTYW5keScsICdCb2dhbicsIDMzLCAnZmVtYWxlJywgMTQ4NjIpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDE5LCAnQXV0dW1uJywgJ011ZWxsZXInLCAxNCwgJ21hbGUnLCA2NTM5OSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoMjAsICdNb3JpYWgnLCAnTGVhbm5vbicsIDIwLCAnbWFsZScsIDU1NjY4KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgyMSwgJ01pYScsICdHZXJsYWNoJywgMzEsICdtYWxlJywgNTU2NjgpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDIyLCAnRGV2b250ZScsICdSb2hhbicsIDM4LCAnbWFsZScsIDExMjY2KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgyMywgJ0VsZW5hJywgJ0JydWVuJywgMzYsICdtYWxlJywgNDQwNzIpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDI0LCAnSmVhbm5lJywgJ0hlc3NlbCcsIDkzLCAnbWFsZScsIDU1NjY4KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgyNSwgJ01heScsICdTcGlua2EnLCAyOSwgJ2ZlbWFsZScsIDE0NDU4KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgyNiwgJ01hcmlhbScsICdNb2hyJywgNDgsICdmZW1hbGUnLCAxMTI2Nik7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoMjcsICdUcmV2ZXInLCAnSm9obnMnLCAyNSwgJ21hbGUnLCA5Njg0NCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoMjgsICdJbGEnLCAnSmVua2lucycsIDQ4LCAnbWFsZScsIDIzNjYpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDI5LCAnRG9ubmllJywgJ0VybnNlcicsIDg4LCAnZmVtYWxlJywgNjIzNjYpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDMwLCAnVGVkJywgJ0ViZXJ0JywgNjksICdtYWxlJywgODk3MjkpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDMxLCAnSm9zaHVhaCcsICdCZWFoYW4nLCA3MCwgJ2ZlbWFsZScsIDc1NDM5KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgzMiwgJ0hhcnZleScsICdTaXBlcycsIDM0LCAnZmVtYWxlJywgMTIwNTUpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDMzLCAnTWFybGVlJywgJ0xvd2UnLCA0MSwgJ2ZlbWFsZScsIDIzNjYpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDM0LCAnVHJ5Y2lhJywgJ1d5bWFuJywgNzksICdmZW1hbGUnLCAzNDUyOSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoMzUsICdIZXJtaW5pbycsICdXYWxrZXInLCAxMiwgJ2ZlbWFsZScsIDU2NzIwKTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgzNiwgJ01hcmdpZScsICdIaWxwZXJ0JywgMzYsICdtYWxlJywgODQ3NjApOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDM3LCAnU2NhcmxldHQnLCAnU3RhbW0nLCAzOCwgJ2ZlbWFsZScsIDE0ODYyKTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgzOCwgJ0thbWVyb24nLCAnQnJ1ZW4nLCA4MywgJ2ZlbWFsZScsIDkzMTgzKTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgzOSwgJ01heGltaWxsaWFuJywgJ0xlZmZsZXInLCA1NiwgJ21hbGUnLCA2NTM5OSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNDAsICdIZWxnYScsICdCYXJyb3dzJywgODUsICdmZW1hbGUnLCA2ODkyNSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNDEsICdWaW9sZXR0ZScsICdTaXBlcycsIDg4LCAnZmVtYWxlJywgNjUzOTkpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDQyLCAnSmVhbmV0dGUnLCAnSGFydmV5JywgODksICdmZW1hbGUnLCA1NjcyMCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNDMsICdTZWFuJywgJ1dpbGtpbnNvbicsIDQyLCAnZmVtYWxlJywgMTQ0NTgpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDQ0LCAnTGFtb250JywgJ09sc29uJywgNjgsICdmZW1hbGUnLCAxMjA1NSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNDUsICdEYXl0b24nLCAnQmFycm93cycsIDcyLCAnbWFsZScsIDY3NDc4KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg0NiwgJ0xhdmluYScsICdDb3JrZXJ5JywgOTUsICdmZW1hbGUnLCA1MzMyNyk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNDcsICdWZXJsaWUnLCAnUm9nYWhuJywgODEsICdtYWxlJywgMjI0MTMpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDQ4LCAnRGV2YW50ZScsICdIYXJiZXInLCA3MSwgJ21hbGUnLCAyMzY2KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg0OSwgJ1JvZWwnLCAnSGF5ZXMnLCAzMiwgJ21hbGUnLCA2NTM5OSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNTAsICdFcmlrJywgJ05pa29sYXVzJywgMjgsICdmZW1hbGUnLCA4OTcyOSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNTEsICdSZXllcycsICdNYWdnaW8nLCA4MiwgJ21hbGUnLCA1NjcyMCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNTIsICdEYW5uaWUnLCAnV2hpdGUnLCA4MywgJ21hbGUnLCAxNzY1Nyk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNTMsICdTaGFub24nLCAnV2luZGxlcicsIDI5LCAnbWFsZScsIDkzNjQ5KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg1NCwgJ1pvcmEnLCAnSG9lZ2VyJywgODQsICdmZW1hbGUnLCA3MDYpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDU1LCAnRGVqb24nLCAnS2luZycsIDQ3LCAnbWFsZScsIDcyODA2KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg1NiwgJ0dlb3JnaWFubmEnLCAnUm9iZWwnLCAyNSwgJ21hbGUnLCAxMjA1NSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNTcsICdMZWF0aGEnLCAnU2NobWl0dCcsIDQ5LCAnbWFsZScsIDExMjY2KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg1OCwgJ0RlbWV0cml1cycsICdEYXJlJywgMzcsICdtYWxlJywgNjk3OTMpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDU5LCAnQ29ybmVsbCcsICdQb2xsaWNoJywgMywgJ2ZlbWFsZScsIDE0ODYyKTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg2MCwgJ1NpZ211bmQnLCAnSmFjb2JzJywgNDcsICdtYWxlJywgNjc0NzgpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDYxLCAnTG9sYScsICdQYWdhYycsIDMwLCAnZmVtYWxlJywgNjUzOTkpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDYyLCAnS2FsaScsICdTY2h1bHR6JywgMjIsICdmZW1hbGUnLCA5Njg0NCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNjMsICdHZW92YW55JywgJ1N3aWZ0JywgMjYsICdtYWxlJywgNzU0MzkpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDY0LCAnRm9zdGVyJywgJ0dyYW50JywgMjUsICdmZW1hbGUnLCA2ODkyNSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNjUsICdBc2hsZXknLCAnSGFtbWVzJywgNzgsICdmZW1hbGUnLCAzNDUyOSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNjYsICdSZXgnLCAnQ3VtbWVyYXRhJywgMTEsICdtYWxlJywgNDM1NjcpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDY3LCAnRGV3aXR0JywgJ09uZHJpY2thJywgOTksICdtYWxlJywgNTU2NjgpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDY4LCAnTHVjYXMnLCAnTWNEZXJtb3R0JywgMzUsICdmZW1hbGUnLCA0ODY0NCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNjksICdFZG1vbmQnLCAnVHVybmVyJywgMTAwLCAnbWFsZScsIDM4MzA3KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg3MCwgJ0tlZWdhbicsICdIZXJ6b2cnLCAyMCwgJ2ZlbWFsZScsIDE0ODYyKTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg3MSwgJ0pvYW55JywgJ0RlY2tvdycsIDI5LCAnZmVtYWxlJywgMTQ4NjIpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDcyLCAnSmFjeW50aGUnLCAnQ3JvbmEnLCAzMCwgJ21hbGUnLCA5Njg0NCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNzMsICdCYXJ0JywgJ1dhbHRlcicsIDQ2LCAnZmVtYWxlJywgNzI4MDYpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDc0LCAnR2Vyc29uJywgJ0Nyb25hJywgNzgsICdtYWxlJywgMzkzODQpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDc1LCAnQW5uYWJlbCcsICdDaHJpc3RpYW5zZW4nLCAyMywgJ21hbGUnLCAxMTI2Nik7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNzYsICdMZXRhJywgJ0NydWlja3NoYW5rJywgMTksICdmZW1hbGUnLCA1MzMyNyk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoNzcsICdCZWxsZScsICdIZWlkZW5yZWljaCcsIDIzLCAnZmVtYWxlJywgNzU0MzkpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDc4LCAnQ2FzZXknLCAnU3Ryb21hbicsIDE4LCAnbWFsZScsIDM5Mzg0KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg3OSwgJ0NhcmxpZScsICdEYXJlJywgNjcsICdmZW1hbGUnLCA1MzcxMCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoODAsICdEb25ueScsICdSb2hhbicsIDU0LCAnbWFsZScsIDUzMzI3KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg4MSwgJ0RyZXcnLCAnU2NoaW1tZWwnLCAxMSwgJ2ZlbWFsZScsIDE3NjU3KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg4MiwgJ0tlbmRyaWNrJywgJ0hhbWlsbCcsIDc2LCAnbWFsZScsIDEyMDU1KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg4MywgJ01hcmMnLCAnU2NodXN0ZXInLCA5MywgJ21hbGUnLCA2NzQ3OCk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoODQsICdCZXR0ZScsICdIYXJiZXInLCAzOCwgJ21hbGUnLCAxNDg2Mik7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoODUsICdBZHJpYW5hJywgJ0dyZWVuJywgMzMsICdmZW1hbGUnLCAxMjA1NSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoODYsICdMZXNsZXknLCAnTGVkbmVyJywgMzksICdtYWxlJywgNDg2NDQpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDg3LCAnSGFucycsICdDb25uZWxseScsIDk3LCAnZmVtYWxlJywgMzQ1MjkpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDg4LCAnUmFoc2FhbicsICdNY0Rlcm1vdHQnLCAzMSwgJ2ZlbWFsZScsIDE3NjU3KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg4OSwgJ0tldmluJywgJ0JvcmVyJywgMTMsICdmZW1hbGUnLCAxNzY1Nyk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoOTAsICdFbHZpcycsICdTdGllZGVtYW5uJywgNDMsICdtYWxlJywgNTMzMjcpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDkxLCAnSmF1bml0YScsICdSdW50ZScsIDE4LCAnZmVtYWxlJywgOTMxODMpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDkyLCAnTm9yYScsICdIYWdlbmVzJywgMzEsICdtYWxlJywgODQ3NjApOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDkzLCAnQm9iYmllJywgJ0hhcnRtYW5uJywgMSwgJ21hbGUnLCA1MzMyNyk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoOTQsICdGbG9yZW5jaW8nLCAnR3JlZW4nLCA2MiwgJ2ZlbWFsZScsIDY4OTI1KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg5NSwgJ0FudG9uaW5hJywgJ0NyaXN0JywgNDAsICdtYWxlJywgNTU2NjgpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDk2LCAnQ2ljZXJvJywgJ0hlZ21hbm4nLCAxMDAsICdtYWxlJywgNjk3OTMpOwpJTlNFUlQgSU5UTyBgcGVyc29uYCAoYHBlcnNvbl9pZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgLCBgZ2VuZGVyYCwgYHppcGNvZGVgKSBWQUxVRVMgKDk3LCAnRGVvbicsICdDb25zaWRpbmUnLCA1MCwgJ2ZlbWFsZScsIDEyMDU1KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICg5OCwgJ0tvcmJpbicsICdMYWJhZGllJywgMTIsICdmZW1hbGUnLCAxMjA1NSk7CklOU0VSVCBJTlRPIGBwZXJzb25gIChgcGVyc29uX2lkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWAsIGBnZW5kZXJgLCBgemlwY29kZWApIFZBTFVFUyAoOTksICdKZXJyb2xkJywgJ0x1ZWlsd2l0eicsIDQ4LCAnbWFsZScsIDE3NjU3KTsKSU5TRVJUIElOVE8gYHBlcnNvbmAgKGBwZXJzb25faWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCwgYGdlbmRlcmAsIGB6aXBjb2RlYCkgVkFMVUVTICgxMDAsICdMZWFubmUnLCAnV2F0c2ljYScsIDc2LCAnbWFsZScsIDQ0MDcyKTsKCgoKQ1JFQVRFIFRBQkxFIHBhdGllbnQgKHBhdGllbnRfaWQgSU5ULCAKCXBhdGllbnRfY29uZGl0aW9uIEVOVU0oJ21pbGQnLCAnbWVkaXVtJywgJ3NldmVyZScpLAoJUFJJTUFSWSBLRVkgKHBhdGllbnRfaWQpLAoJRk9SRUlHTiBLRVkgKHBhdGllbnRfaWQpIFJFRkVSRU5DRVMgcGVyc29uKHBlcnNvbl9pZCkKKTsKCklOU0VSVCBJTlRPIGBwYXRpZW50YCAoYHBhdGllbnRfaWRgLCBgcGF0aWVudF9jb25kaXRpb25gKSBWQUxVRVMgKDEsICdzZXZlcmUnKTsKSU5TRVJUIElOVE8gYHBhdGllbnRgIChgcGF0aWVudF9pZGAsIGBwYXRpZW50X2NvbmRpdGlvbmApIFZBTFVFUyAoOSwgJ3NldmVyZScpOwpJTlNFUlQgSU5UTyBgcGF0aWVudGAgKGBwYXRpZW50X2lkYCwgYHBhdGllbnRfY29uZGl0aW9uYCkgVkFMVUVTICgxMiwgJ21lZGl1bScpOwpJTlNFUlQgSU5UTyBgcGF0aWVudGAgKGBwYXRpZW50X2lkYCwgYHBhdGllbnRfY29uZGl0aW9uYCkgVkFMVUVTICgxMywgJ3NldmVyZScpOwpJTlNFUlQgSU5UTyBgcGF0aWVudGAgKGBwYXRpZW50X2lkYCwgYHBhdGllbnRfY29uZGl0aW9uYCkgVkFMVUVTICgyMCwgJ3NldmVyZScpOwpJTlNFUlQgSU5UTyBgcGF0aWVudGAgKGBwYXRpZW50X2lkYCwgYHBhdGllbnRfY29uZGl0aW9uYCkgVkFMVUVTICg1MywgJ3NldmVyZScpOwpJTlNFUlQgSU5UTyBgcGF0aWVudGAgKGBwYXRpZW50X2lkYCwgYHBhdGllbnRfY29uZGl0aW9uYCkgVkFMVUVTICg2NywgJ3NldmVyZScpOwpJTlNFUlQgSU5UTyBgcGF0aWVudGAgKGBwYXRpZW50X2lkYCwgYHBhdGllbnRfY29uZGl0aW9uYCkgVkFMVUVTICg3NSwgJ21lZGl1bScpOwpJTlNFUlQgSU5UTyBgcGF0aWVudGAgKGBwYXRpZW50X2lkYCwgYHBhdGllbnRfY29uZGl0aW9uYCkgVkFMVUVTICg4NywgJ21lZGl1bScpOwpJTlNFUlQgSU5UTyBgcGF0aWVudGAgKGBwYXRpZW50X2lkYCwgYHBhdGllbnRfY29uZGl0aW9uYCkgVkFMVUVTICg5NSwgJ3NldmVyZScpOwoKCkNSRUFURSBUQUJMRSBjb250YWN0X2V2ZW50KGV2ZW50X2lkIElOVCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCBQUklNQVJZIEtFWSwKY29udGFjdF9kYXRlIERBVEVUSU1FLAp6aXBjb2RlIElOVCwKRk9SRUlHTiBLRVkgKHppcGNvZGUpIFJFRkVSRU5DRVMgbG9jYXRpb24oemlwY29kZSkKKTsKCgpJTlNFUlQgSU5UTyBgY29udGFjdF9ldmVudGAgKGBldmVudF9pZGAsIGBjb250YWN0X2RhdGVgLCBgemlwY29kZWApIFZBTFVFUyAoMSwgJzIwMjAtMDctMTYgMDI6NDA6MDQnLCA1NTY2OCk7CklOU0VSVCBJTlRPIGBjb250YWN0X2V2ZW50YCAoYGV2ZW50X2lkYCwgYGNvbnRhY3RfZGF0ZWAsIGB6aXBjb2RlYCkgVkFMVUVTICgyLCAnMjAyMC0wNy0wMSAyMzoyNjoyNicsIDY4OTI1KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfZXZlbnRgIChgZXZlbnRfaWRgLCBgY29udGFjdF9kYXRlYCwgYHppcGNvZGVgKSBWQUxVRVMgKDMsICcyMDIwLTAzLTI2IDAxOjI1OjA2JywgNjg5MjUpOwpJTlNFUlQgSU5UTyBgY29udGFjdF9ldmVudGAgKGBldmVudF9pZGAsIGBjb250YWN0X2RhdGVgLCBgemlwY29kZWApIFZBTFVFUyAoNCwgJzIwMjAtMDEtMTIgMDE6MTk6MDAnLCAxMTI2Nik7CklOU0VSVCBJTlRPIGBjb250YWN0X2V2ZW50YCAoYGV2ZW50X2lkYCwgYGNvbnRhY3RfZGF0ZWAsIGB6aXBjb2RlYCkgVkFMVUVTICg1LCAnMjAyMC0wNC0xMiAxMDoyNTo0MScsIDQzNTY3KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfZXZlbnRgIChgZXZlbnRfaWRgLCBgY29udGFjdF9kYXRlYCwgYHppcGNvZGVgKSBWQUxVRVMgKDYsICcyMDIwLTA0LTEzIDAwOjAzOjM2JywgMTQ0NTgpOwpJTlNFUlQgSU5UTyBgY29udGFjdF9ldmVudGAgKGBldmVudF9pZGAsIGBjb250YWN0X2RhdGVgLCBgemlwY29kZWApIFZBTFVFUyAoNywgJzIwMjAtMDctMTYgMTM6MjQ6MDgnLCA2NzQ3OCk7CklOU0VSVCBJTlRPIGBjb250YWN0X2V2ZW50YCAoYGV2ZW50X2lkYCwgYGNvbnRhY3RfZGF0ZWAsIGB6aXBjb2RlYCkgVkFMVUVTICg4LCAnMjAyMC0wNi0wMSAwOTo1NDoyOScsIDg5NzI5KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfZXZlbnRgIChgZXZlbnRfaWRgLCBgY29udGFjdF9kYXRlYCwgYHppcGNvZGVgKSBWQUxVRVMgKDksICcyMDIwLTA2LTEyIDIyOjU2OjE2JywgNTU2NjgpOwpJTlNFUlQgSU5UTyBgY29udGFjdF9ldmVudGAgKGBldmVudF9pZGAsIGBjb250YWN0X2RhdGVgLCBgemlwY29kZWApIFZBTFVFUyAoMTAsICcyMDIwLTAxLTE0IDExOjI1OjAwJywgNjIzNjYpOwoKCgoKQ1JFQVRFIFRBQkxFIGNvbnRhY3QgKHBlcnNvbl9pZCBJTlQgLCAKCWNvbnRhY3RfZGVncmVlIEVOVU0oJ2RpcmVjdCcsICdpbmRpcmVjdCcpLAogICAgcGF0aWVudF9pZCBJTlQgTk9UIE5VTEwsCglQUklNQVJZIEtFWSAocGVyc29uX2lkKSwKCUZPUkVJR04gS0VZIChwZXJzb25faWQpIFJFRkVSRU5DRVMgcGVyc29uKHBlcnNvbl9pZCksCglGT1JFSUdOIEtFWSAocGF0aWVudF9pZCkgUkVGRVJFTkNFUyBwYXRpZW50KHBhdGllbnRfaWQpLAogICAgY2hlY2sgKHBlcnNvbl9pZDw+cGF0aWVudF9pZCkKKTsKCgoKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDEsICdkaXJlY3QnLCA3NSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICgyLCAnZGlyZWN0JywgNTMpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoNCwgJ2luZGlyZWN0JywgOSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg3LCAnaW5kaXJlY3QnLCA4Nyk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg4LCAnZGlyZWN0JywgOTUpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoOSwgJ2RpcmVjdCcsIDY3KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDExLCAnZGlyZWN0JywgOTUpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoMTUsICdpbmRpcmVjdCcsIDk1KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDE2LCAnaW5kaXJlY3QnLCAxKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDE3LCAnZGlyZWN0JywgOSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICgxOSwgJ2luZGlyZWN0JywgMSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICgyNCwgJ2RpcmVjdCcsIDEpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoMjcsICdpbmRpcmVjdCcsIDIwKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDI4LCAnaW5kaXJlY3QnLCA3NSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICgyOSwgJ2RpcmVjdCcsIDUzKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDMxLCAnaW5kaXJlY3QnLCA2Nyk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICgzMywgJ2RpcmVjdCcsIDc1KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDM0LCAnZGlyZWN0JywgMjApOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoMzUsICdpbmRpcmVjdCcsIDc1KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDM3LCAnaW5kaXJlY3QnLCA5KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDM4LCAnaW5kaXJlY3QnLCAxMik7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICgzOSwgJ2RpcmVjdCcsIDEpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoNDAsICdkaXJlY3QnLCAxMik7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg0MSwgJ2RpcmVjdCcsIDY3KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDQ0LCAnZGlyZWN0JywgMTMpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoNDYsICdkaXJlY3QnLCAxKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDQ5LCAnZGlyZWN0JywgOTUpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoNTMsICdkaXJlY3QnLCA3NSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg1NSwgJ2luZGlyZWN0JywgOTUpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoNTcsICdkaXJlY3QnLCAxMyk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg2MCwgJ2luZGlyZWN0JywgMjApOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoNjQsICdpbmRpcmVjdCcsIDUzKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDY4LCAnaW5kaXJlY3QnLCA3NSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg2OSwgJ2luZGlyZWN0JywgMjApOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoNzAsICdpbmRpcmVjdCcsIDEyKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDcxLCAnZGlyZWN0JywgOSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg3NCwgJ2luZGlyZWN0JywgNjcpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoNzUsICdpbmRpcmVjdCcsIDEpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoNzcsICdpbmRpcmVjdCcsIDIwKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDgwLCAnZGlyZWN0JywgNjcpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoODQsICdpbmRpcmVjdCcsIDEpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoODYsICdkaXJlY3QnLCAxMyk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg4OCwgJ2RpcmVjdCcsIDUzKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDkwLCAnaW5kaXJlY3QnLCAyMCk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg5MSwgJ2luZGlyZWN0JywgOSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg5MiwgJ2RpcmVjdCcsIDc1KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDkzLCAnaW5kaXJlY3QnLCAyMCk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg5NSwgJ2luZGlyZWN0JywgMSk7CklOU0VSVCBJTlRPIGBjb250YWN0YCAoYHBlcnNvbl9pZGAsIGBjb250YWN0X2RlZ3JlZWAsIGBwYXRpZW50X2lkYCkgVkFMVUVTICg5NiwgJ2luZGlyZWN0JywgNjcpOwpJTlNFUlQgSU5UTyBgY29udGFjdGAgKGBwZXJzb25faWRgLCBgY29udGFjdF9kZWdyZWVgLCBgcGF0aWVudF9pZGApIFZBTFVFUyAoOTgsICdkaXJlY3QnLCA5KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RgIChgcGVyc29uX2lkYCwgYGNvbnRhY3RfZGVncmVlYCwgYHBhdGllbnRfaWRgKSBWQUxVRVMgKDk5LCAnaW5kaXJlY3QnLCA3NSk7CgoKCkNSRUFURSBUQUJMRSBjb250YWN0X3RvX2V2ZW50KGV2ZW50X2lkIElOVCwKcGVyc29uX2lkIElOVCwKUFJJTUFSWSBLRVkgKGV2ZW50X2lkLCBwZXJzb25faWQpLApGT1JFSUdOIEtFWSAoZXZlbnRfaWQpIFJFRkVSRU5DRVMgY29udGFjdF9ldmVudChldmVudF9pZCksCkZPUkVJR04gS0VZIChwZXJzb25faWQpIFJFRkVSRU5DRVMgY29udGFjdChwZXJzb25faWQpCik7CgoKCgpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDEsIDcpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDEsIDE1KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgxLCAzOCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMSwgNDkpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDEsIDUzKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgxLCA2NCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMSwgNjgpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDEsIDY5KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgxLCA3NCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMSwgODYpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDEsIDkwKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgyLCAxOSk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMiwgMjQpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDIsIDI3KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgyLCAzNSk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMiwgNDYpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDMsIDkpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDMsIDExKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgzLCAzMSk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMywgNDEpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDMsIDQ2KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgzLCA1Nyk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMywgNzcpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDMsIDg2KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgzLCA4OCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoNCwgOSk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoNCwgMTkpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDQsIDQxKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg0LCA5NSk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoNCwgOTkpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDUsIDQpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDUsIDcpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDUsIDI0KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg1LCA0MCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoNSwgNjkpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDUsIDc3KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg1LCA4MCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoNSwgOTIpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDYsIDE3KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg2LCAzMSk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoNiwgNDQpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDYsIDQ5KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg2LCA2OCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoNiwgNjkpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDYsIDg4KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg2LCA5Nik7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoNiwgOTkpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDcsIDMxKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg3LCA2MCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoNywgNzQpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDcsIDk4KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg4LCA0KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg4LCA2MCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoOCwgNjkpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDgsIDcxKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg4LCA5MSk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoOSwgNCk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoOSwgMzcpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDksIDQwKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICg5LCA3MSk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoOSwgOTEpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDEwLCAyNyk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMTAsIDMxKTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgxMCwgNDQpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDEwLCA0Nik7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMTAsIDQ5KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgxMCwgNTcpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDEwLCA2OSk7CklOU0VSVCBJTlRPIGBjb250YWN0X3RvX2V2ZW50YCAoYGV2ZW50X2lkYCwgYHBlcnNvbl9pZGApIFZBTFVFUyAoMTAsIDc0KTsKSU5TRVJUIElOVE8gYGNvbnRhY3RfdG9fZXZlbnRgIChgZXZlbnRfaWRgLCBgcGVyc29uX2lkYCkgVkFMVUVTICgxMCwgNzUpOwpJTlNFUlQgSU5UTyBgY29udGFjdF90b19ldmVudGAgKGBldmVudF9pZGAsIGBwZXJzb25faWRgKSBWQUxVRVMgKDEwLCA4NCk7CgoKQ1JFQVRFIFRBQkxFIGhvc3BpdGFsKGhvc3BpdGFsX2lkIElOVCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCBQUklNQVJZIEtFWSwKbmFtZSBWQVJDSEFSKDUwKSBOT1QgTlVMTCwKemlwY29kZSBJTlQgTk9UIE5VTEwsCkZPUkVJR04gS0VZICh6aXBjb2RlKSBSRUZFUkVOQ0VTIGxvY2F0aW9uKHppcGNvZGUpCik7CgpJTlNFUlQgSU5UTyBgaG9zcGl0YWxgIChgaG9zcGl0YWxfaWRgLCBgbmFtZWAsIGB6aXBjb2RlYCkgVkFMVUVTICgxLCAnTGFrZSBIb3NwaXRhbCcsIDc1NDM5KTsKSU5TRVJUIElOVE8gYGhvc3BpdGFsYCAoYGhvc3BpdGFsX2lkYCwgYG5hbWVgLCBgemlwY29kZWApIFZBTFVFUyAoMiwgJ0dsb3Zlci1Wb24gSG9zcGl0YWwnLCA2NzQ3OCk7CklOU0VSVCBJTlRPIGBob3NwaXRhbGAgKGBob3NwaXRhbF9pZGAsIGBuYW1lYCwgYHppcGNvZGVgKSBWQUxVRVMgKDMsICdXYWxzaCBIb3NwaXRhbCcsIDE0NDU4KTsKSU5TRVJUIElOVE8gYGhvc3BpdGFsYCAoYGhvc3BpdGFsX2lkYCwgYG5hbWVgLCBgemlwY29kZWApIFZBTFVFUyAoNCwgJ1R1cm5lciBIb3NwaXRhbCcsIDkzMTgzKTsKSU5TRVJUIElOVE8gYGhvc3BpdGFsYCAoYGhvc3BpdGFsX2lkYCwgYG5hbWVgLCBgemlwY29kZWApIFZBTFVFUyAoNSwgJ0Nyb25hLVdlaG5lciBIb3NwaXRhbCcsIDE3NjU3KTsKSU5TRVJUIElOVE8gYGhvc3BpdGFsYCAoYGhvc3BpdGFsX2lkYCwgYG5hbWVgLCBgemlwY29kZWApIFZBTFVFUyAoNiwgJ1RvcnBoeS1MaW5kIEhvc3BpdGFsJywgMjM2Nik7CklOU0VSVCBJTlRPIGBob3NwaXRhbGAgKGBob3NwaXRhbF9pZGAsIGBuYW1lYCwgYHppcGNvZGVgKSBWQUxVRVMgKDcsICdCYXVtYmFjaCBIb3NwaXRhbCcsIDY1Mzk5KTsKSU5TRVJUIElOVE8gYGhvc3BpdGFsYCAoYGhvc3BpdGFsX2lkYCwgYG5hbWVgLCBgemlwY29kZWApIFZBTFVFUyAoOCwgJ05pY29sYXMtVGVycnkgSG9zcGl0YWwnLCA2OTc5Myk7CklOU0VSVCBJTlRPIGBob3NwaXRhbGAgKGBob3NwaXRhbF9pZGAsIGBuYW1lYCwgYHppcGNvZGVgKSBWQUxVRVMgKDksICdNYXJyeSBIb3NwaXRhbCcsIDQ0MDcyKTsKSU5TRVJUIElOVE8gYGhvc3BpdGFsYCAoYGhvc3BpdGFsX2lkYCwgYG5hbWVgLCBgemlwY29kZWApIFZBTFVFUyAoMTAsICdBbmt1bmRpbmctSHVkc29uIEhvc3BpdGFsJywgNTY3MjApOwoKCkNSRUFURSBUQUJMRSB0cmVhdG1lbnRfZGVwYXJ0bWVudChzZWN0aW9uX2lkIElOVCBOT1QgTlVMTCBjaGVjayhzZWN0aW9uX2lkPD01KSwKcGF0aWVudF9pZCBJTlQsCmhvc3BpdGFsX2lkIElOVCwKcHJpbWFyeSBrZXkoc2VjdGlvbl9pZCwgcGF0aWVudF9pZCxob3NwaXRhbF9pZCksCkZPUkVJR04gS0VZIChwYXRpZW50X2lkKSBSRUZFUkVOQ0VTIHBhdGllbnQocGF0aWVudF9pZCksCkZPUkVJR04gS0VZIChob3NwaXRhbF9pZCkgUkVGRVJFTkNFUyBob3NwaXRhbChob3NwaXRhbF9pZCkKKTsKCgpJTlNFUlQgSU5UTyBgdHJlYXRtZW50X2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwYXRpZW50X2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICgxLCAxMiwgNik7CklOU0VSVCBJTlRPIGB0cmVhdG1lbnRfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBhdGllbnRfaWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDIsIDksIDIpOwpJTlNFUlQgSU5UTyBgdHJlYXRtZW50X2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwYXRpZW50X2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICgyLCAxMywgMTApOwpJTlNFUlQgSU5UTyBgdHJlYXRtZW50X2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwYXRpZW50X2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICgzLCAyMCwgOCk7CklOU0VSVCBJTlRPIGB0cmVhdG1lbnRfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBhdGllbnRfaWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDMsIDk1LCA4KTsKSU5TRVJUIElOVE8gYHRyZWF0bWVudF9kZXBhcnRtZW50YCAoYHNlY3Rpb25faWRgLCBgcGF0aWVudF9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoNCwgMSwgNCk7CklOU0VSVCBJTlRPIGB0cmVhdG1lbnRfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBhdGllbnRfaWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDQsIDg3LCA5KTsKSU5TRVJUIElOVE8gYHRyZWF0bWVudF9kZXBhcnRtZW50YCAoYHNlY3Rpb25faWRgLCBgcGF0aWVudF9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoNSwgNzUsIDUpOwpJTlNFUlQgSU5UTyBgdHJlYXRtZW50X2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwYXRpZW50X2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICg1LCA1MywgMyk7CklOU0VSVCBJTlRPIGB0cmVhdG1lbnRfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBhdGllbnRfaWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDUsIDY3LCA0KTsKCgoKQ1JFQVRFIFRBQkxFIHRyZWF0bWVudF9wbGFuKHBsYW5faWQgSU5UIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5UIFBSSU1BUlkgS0VZLApwYXRpZW50X2lkIElOVCwKaG9zcGl0YWxfaWQgSU5ULApzZWN0aW9uX2lkIElOVCwKcGxhbiBFTlVNKCd0cmVhdG1lbnRfQScsICd0cmVhdG1lbnRfQicsICd0cmVhdG1lbnRfQycsICd0cmVhdG1lbnRfRCcpLAp1bmlxdWUoc2VjdGlvbl9pZCwgcGF0aWVudF9pZCwgaG9zcGl0YWxfaWQpLApGT1JFSUdOIEtFWSAoc2VjdGlvbl9pZCwgcGF0aWVudF9pZCwgaG9zcGl0YWxfaWQpIFJFRkVSRU5DRVMgdHJlYXRtZW50X2RlcGFydG1lbnQoc2VjdGlvbl9pZCwgcGF0aWVudF9pZCwgaG9zcGl0YWxfaWQpCgopOwoKCgpJTlNFUlQgSU5UTyBgdHJlYXRtZW50X3BsYW5gIChgcGxhbl9pZGAsYHNlY3Rpb25faWRgLCBgcGF0aWVudF9pZGAsIGBob3NwaXRhbF9pZGAsIGBwbGFuYCkgVkFMVUVTICgxLCAxLCAxMiwgNiwgJ3RyZWF0bWVudF9BJyk7CklOU0VSVCBJTlRPIGB0cmVhdG1lbnRfcGxhbmAgKGBwbGFuX2lkYCxgc2VjdGlvbl9pZGAsIGBwYXRpZW50X2lkYCwgYGhvc3BpdGFsX2lkYCwgYHBsYW5gKSBWQUxVRVMgKDIsIDIsIDksIDIsICAndHJlYXRtZW50X0InKTsKSU5TRVJUIElOVE8gYHRyZWF0bWVudF9wbGFuYCAoYHBsYW5faWRgLGBzZWN0aW9uX2lkYCwgYHBhdGllbnRfaWRgLCBgaG9zcGl0YWxfaWRgLCBgcGxhbmApIFZBTFVFUyAoMywgMiwgMTMsIDEwLCd0cmVhdG1lbnRfQicpOwpJTlNFUlQgSU5UTyBgdHJlYXRtZW50X3BsYW5gIChgcGxhbl9pZGAsYHNlY3Rpb25faWRgLCBgcGF0aWVudF9pZGAsIGBob3NwaXRhbF9pZGAsIGBwbGFuYCkgVkFMVUVTICg0LCAzLCAyMCwgOCwgJ3RyZWF0bWVudF9CJyk7CklOU0VSVCBJTlRPIGB0cmVhdG1lbnRfcGxhbmAgKGBwbGFuX2lkYCxgc2VjdGlvbl9pZGAsIGBwYXRpZW50X2lkYCwgYGhvc3BpdGFsX2lkYCwgYHBsYW5gKSBWQUxVRVMgKDUsIDMsIDk1LCA4LCAndHJlYXRtZW50X0MnKTsKSU5TRVJUIElOVE8gYHRyZWF0bWVudF9wbGFuYCAoYHBsYW5faWRgLGBzZWN0aW9uX2lkYCwgYHBhdGllbnRfaWRgLCBgaG9zcGl0YWxfaWRgLCBgcGxhbmApIFZBTFVFUyAoNiwgNCwgMSwgNCwgICd0cmVhdG1lbnRfQycpOwpJTlNFUlQgSU5UTyBgdHJlYXRtZW50X3BsYW5gIChgcGxhbl9pZGAsYHNlY3Rpb25faWRgLCBgcGF0aWVudF9pZGAsIGBob3NwaXRhbF9pZGAsIGBwbGFuYCkgVkFMVUVTICg3LCA0LCA4NywgOSwgJ3RyZWF0bWVudF9DJyk7CklOU0VSVCBJTlRPIGB0cmVhdG1lbnRfcGxhbmAgKGBwbGFuX2lkYCxgc2VjdGlvbl9pZGAsIGBwYXRpZW50X2lkYCwgYGhvc3BpdGFsX2lkYCwgYHBsYW5gKSBWQUxVRVMgKDgsIDUsIDc1LCA1LCAndHJlYXRtZW50X0QnKTsKSU5TRVJUIElOVE8gYHRyZWF0bWVudF9wbGFuYCAoYHBsYW5faWRgLGBzZWN0aW9uX2lkYCwgYHBhdGllbnRfaWRgLCBgaG9zcGl0YWxfaWRgLCBgcGxhbmApIFZBTFVFUyAoOSwgNSwgNTMsIDMsICd0cmVhdG1lbnRfRCcpOwpJTlNFUlQgSU5UTyBgdHJlYXRtZW50X3BsYW5gIChgcGxhbl9pZGAsYHNlY3Rpb25faWRgLCBgcGF0aWVudF9pZGAsIGBob3NwaXRhbF9pZGAsIGBwbGFuYCkgVkFMVUVTICgxMCwgNSwgNjcsIDQsJ3RyZWF0bWVudF9BJyk7CgoKCgoKQ1JFQVRFIFRBQkxFIHRlc3RpbmdfZGVwYXJ0bWVudChzZWN0aW9uX2lkIElOVCBOT1QgTlVMTCBjaGVjayhzZWN0aW9uX2lkPD01KSwKcGVyc29uX2lkIElOVCwKaG9zcGl0YWxfaWQgSU5ULApQUklNQVJZIEtFWShzZWN0aW9uX2lkLCBwZXJzb25faWQsIGhvc3BpdGFsX2lkKSwKRk9SRUlHTiBLRVkgKHBlcnNvbl9pZCkgUkVGRVJFTkNFUyBjb250YWN0KHBlcnNvbl9pZCksCkZPUkVJR04gS0VZIChob3NwaXRhbF9pZCkgUkVGRVJFTkNFUyBob3NwaXRhbChob3NwaXRhbF9pZCkKKTsKCklOU0VSVCBJTlRPIGB0ZXN0aW5nX2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDEsIDI3LCA1KTsKSU5TRVJUIElOVE8gYHRlc3RpbmdfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMSwgMjksIDUpOwpJTlNFUlQgSU5UTyBgdGVzdGluZ19kZXBhcnRtZW50YCAoYHNlY3Rpb25faWRgLCBgcGVyc29uX2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICgxLCA0NCwgNik7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDEsIDU3LCAzKTsKSU5TRVJUIElOVE8gYHRlc3RpbmdfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMiwgMiwgNCk7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDIsIDMxLCAzKTsKSU5TRVJUIElOVE8gYHRlc3RpbmdfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMiwgNzAsIDUpOwpJTlNFUlQgSU5UTyBgdGVzdGluZ19kZXBhcnRtZW50YCAoYHNlY3Rpb25faWRgLCBgcGVyc29uX2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICgyLCA4NiwgNCk7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDMsIDM0LCA1KTsKSU5TRVJUIElOVE8gYHRlc3RpbmdfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMywgNDYsIDEpOwpJTlNFUlQgSU5UTyBgdGVzdGluZ19kZXBhcnRtZW50YCAoYHNlY3Rpb25faWRgLCBgcGVyc29uX2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICgzLCA0OSwgNyk7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDMsIDk4LCA0KTsKSU5TRVJUIElOVE8gYHRlc3RpbmdfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoNCwgMzcsIDEpOwpJTlNFUlQgSU5UTyBgdGVzdGluZ19kZXBhcnRtZW50YCAoYHNlY3Rpb25faWRgLCBgcGVyc29uX2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICg0LCAzNSwgOSk7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDQsIDY5LCAyKTsKSU5TRVJUIElOVE8gYHRlc3RpbmdfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoNCwgOTAsIDcpOwpJTlNFUlQgSU5UTyBgdGVzdGluZ19kZXBhcnRtZW50YCAoYHNlY3Rpb25faWRgLCBgcGVyc29uX2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICg0LCA5MSwgOCk7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX2RlcGFydG1lbnRgIChgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDUsIDY4LCAyKTsKSU5TRVJUIElOVE8gYHRlc3RpbmdfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoNSwgODQsIDEwKTsKSU5TRVJUIElOVE8gYHRlc3RpbmdfZGVwYXJ0bWVudGAgKGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoNSwgOTIsIDkpOwoKCgoKQ1JFQVRFIFRBQkxFIHRlc3Rpbmdfc2FtcGxlKHNhbXBsZV9pZCBJTlQgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQgUFJJTUFSWSBLRVksCnNlY3Rpb25faWQgSU5ULApwZXJzb25faWQgSU5ULApob3NwaXRhbF9pZCBJTlQsCnVuaXF1ZShzZWN0aW9uX2lkLCBwZXJzb25faWQsIGhvc3BpdGFsX2lkKSwKRk9SRUlHTiBLRVkgKHNlY3Rpb25faWQsIHBlcnNvbl9pZCwgaG9zcGl0YWxfaWQpIFJFRkVSRU5DRVMgdGVzdGluZ19kZXBhcnRtZW50KHNlY3Rpb25faWQsIHBlcnNvbl9pZCwgaG9zcGl0YWxfaWQpCgopOwoKCklOU0VSVCBJTlRPIGB0ZXN0aW5nX3NhbXBsZWAgKGBzYW1wbGVfaWRgLCBgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDEsIDEsIDI3LCA1KTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMiwgMSwgMjksIDUpOwpJTlNFUlQgSU5UTyBgdGVzdGluZ19zYW1wbGVgIChgc2FtcGxlX2lkYCwgYHNlY3Rpb25faWRgLCBgcGVyc29uX2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICgzLCAxLCA0NCwgNik7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX3NhbXBsZWAgKGBzYW1wbGVfaWRgLCBgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDQsIDEsIDU3LCAzKTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoNSwgMiwgMiwgNCk7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX3NhbXBsZWAgKGBzYW1wbGVfaWRgLCBgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDYsIDIsIDMxLCAzKTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoNywgMiwgNzAsIDUpOwpJTlNFUlQgSU5UTyBgdGVzdGluZ19zYW1wbGVgIChgc2FtcGxlX2lkYCwgYHNlY3Rpb25faWRgLCBgcGVyc29uX2lkYCwgYGhvc3BpdGFsX2lkYCkgVkFMVUVTICg4LCAyLCA4NiwgNCk7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX3NhbXBsZWAgKGBzYW1wbGVfaWRgLCBgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDksIDMsIDM0LCA1KTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTAsIDMsIDQ2LCAxKTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTEsIDMsIDQ5LCA3KTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTIsIDMsIDk4LCA0KTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTMsIDQsIDM3LCAxKTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTQsIDQsIDM1LCA5KTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTUsIDQsIDY5LCAyKTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTYsIDQsIDkwLCA3KTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTcsIDQsIDkxLCA4KTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTgsIDUsIDY4LCAyKTsKSU5TRVJUIElOVE8gYHRlc3Rpbmdfc2FtcGxlYCAoYHNhbXBsZV9pZGAsIGBzZWN0aW9uX2lkYCwgYHBlcnNvbl9pZGAsIGBob3NwaXRhbF9pZGApIFZBTFVFUyAoMTksIDUsIDg0LCAxMCk7CklOU0VSVCBJTlRPIGB0ZXN0aW5nX3NhbXBsZWAgKGBzYW1wbGVfaWRgLCBgc2VjdGlvbl9pZGAsIGBwZXJzb25faWRgLCBgaG9zcGl0YWxfaWRgKSBWQUxVRVMgKDIwLCA1LCA5MiwgOSk7CgoKCkNSRUFURSBUQUJMRSBsYWJfcmVzdWx0KHJlc3VsdF9pZCBJTlQgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQgUFJJTUFSWSBLRVksCnNhbXBsZV9pZCBpbnQsCnVuaXF1ZShzYW1wbGVfaWQpLApyZXN1bHQgRU5VTSgncG9zaXRpdmUnLCAnbmVnYXRpdmUnKSBOT1QgTlVMTCwKRk9SRUlHTiBLRVkgKHNhbXBsZV9pZCkgUkVGRVJFTkNFUyB0ZXN0aW5nX3NhbXBsZShzYW1wbGVfaWQpCgopOwoKCklOU0VSVCBJTlRPIGBsYWJfcmVzdWx0YCAoYHJlc3VsdF9pZGAsIGBzYW1wbGVfaWRgLCBgcmVzdWx0YCkgVkFMVUVTICgxLCAxLCAncG9zaXRpdmUnICk7CklOU0VSVCBJTlRPIGBsYWJfcmVzdWx0YCAoYHJlc3VsdF9pZGAsIGBzYW1wbGVfaWRgLCBgcmVzdWx0YCkgVkFMVUVTICgyLCAzLCAncG9zaXRpdmUnICk7CklOU0VSVCBJTlRPIGBsYWJfcmVzdWx0YCAoYHJlc3VsdF9pZGAsIGBzYW1wbGVfaWRgLCBgcmVzdWx0YCkgVkFMVUVTICgzLCA1LCAncG9zaXRpdmUnICk7CklOU0VSVCBJTlRPIGBsYWJfcmVzdWx0YCAoYHJlc3VsdF9pZGAsIGBzYW1wbGVfaWRgLCBgcmVzdWx0YCkgVkFMVUVTICg0LCA3LCAncG9zaXRpdmUnICk7CklOU0VSVCBJTlRPIGBsYWJfcmVzdWx0YCAoYHJlc3VsdF9pZGAsIGBzYW1wbGVfaWRgLCBgcmVzdWx0YCkgVkFMVUVTICg1LCA5LCduZWdhdGl2ZScgKTsKSU5TRVJUIElOVE8gYGxhYl9yZXN1bHRgIChgcmVzdWx0X2lkYCwgYHNhbXBsZV9pZGAsIGByZXN1bHRgKSBWQUxVRVMgKDYsIDIsICduZWdhdGl2ZScgKTsKSU5TRVJUIElOVE8gYGxhYl9yZXN1bHRgIChgcmVzdWx0X2lkYCwgYHNhbXBsZV9pZGAsIGByZXN1bHRgKSBWQUxVRVMgKDcsIDQsICduZWdhdGl2ZScgKTsKSU5TRVJUIElOVE8gYGxhYl9yZXN1bHRgIChgcmVzdWx0X2lkYCwgYHNhbXBsZV9pZGAsIGByZXN1bHRgKSBWQUxVRVMgKDgsIDYsICduZWdhdGl2ZScgKTsKSU5TRVJUIElOVE8gYGxhYl9yZXN1bHRgIChgcmVzdWx0X2lkYCwgYHNhbXBsZV9pZGAsIGByZXN1bHRgKSBWQUxVRVMgKDksIDgsICduZWdhdGl2ZScgKTsKSU5TRVJUIElOVE8gYGxhYl9yZXN1bHRgIChgcmVzdWx0X2lkYCwgYHNhbXBsZV9pZGAsIGByZXN1bHRgKSBWQUxVRVMgKDEwLCAxMCwgJ25lZ2F0aXZlJyApOwpJTlNFUlQgSU5UTyBgbGFiX3Jlc3VsdGAgKGByZXN1bHRfaWRgLCBgc2FtcGxlX2lkYCwgYHJlc3VsdGApIFZBTFVFUyAoMTEsIDExLCAnbmVnYXRpdmUnICk7CklOU0VSVCBJTlRPIGBsYWJfcmVzdWx0YCAoYHJlc3VsdF9pZGAsIGBzYW1wbGVfaWRgLCBgcmVzdWx0YCkgVkFMVUVTICgxMiwgMTMsICduZWdhdGl2ZScgKTsKSU5TRVJUIElOVE8gYGxhYl9yZXN1bHRgIChgcmVzdWx0X2lkYCwgYHNhbXBsZV9pZGAsIGByZXN1bHRgKSBWQUxVRVMgKDEzLCAxNSwgJ3Bvc2l0aXZlJyApOwpJTlNFUlQgSU5UTyBgbGFiX3Jlc3VsdGAgKGByZXN1bHRfaWRgLCBgc2FtcGxlX2lkYCwgYHJlc3VsdGApIFZBTFVFUyAoMTQsIDE3LCAncG9zaXRpdmUnICk7CklOU0VSVCBJTlRPIGBsYWJfcmVzdWx0YCAoYHJlc3VsdF9pZGAsIGBzYW1wbGVfaWRgLCBgcmVzdWx0YCkgVkFMVUVTICgxNSwgMTksICdwb3NpdGl2ZScgKTsKSU5TRVJUIElOVE8gYGxhYl9yZXN1bHRgIChgcmVzdWx0X2lkYCwgYHNhbXBsZV9pZGAsIGByZXN1bHRgKSBWQUxVRVMgKDE2LCAxMiwgJ3Bvc2l0aXZlJyApOwpJTlNFUlQgSU5UTyBgbGFiX3Jlc3VsdGAgKGByZXN1bHRfaWRgLCBgc2FtcGxlX2lkYCwgYHJlc3VsdGApIFZBTFVFUyAoMTcsIDE0LCAncG9zaXRpdmUnICk7CklOU0VSVCBJTlRPIGBsYWJfcmVzdWx0YCAoYHJlc3VsdF9pZGAsIGBzYW1wbGVfaWRgLCBgcmVzdWx0YCkgVkFMVUVTICgxOCwgMTYsICdwb3NpdGl2ZScgKTsKSU5TRVJUIElOVE8gYGxhYl9yZXN1bHRgIChgcmVzdWx0X2lkYCwgYHNhbXBsZV9pZGAsIGByZXN1bHRgKSBWQUxVRVMgKDE5LCAxOCwgJ3Bvc2l0aXZlJyApOwpJTlNFUlQgSU5UTyBgbGFiX3Jlc3VsdGAgKGByZXN1bHRfaWRgLCBgc2FtcGxlX2lkYCwgYHJlc3VsdGApIFZBTFVFUyAoMjAsIDIwLCAncG9zaXRpdmUnICk7CgoKCgoKCgoKCgoKYGBgCiMjIChiKS4gUXVlcmllcwpgYGB7c3FsIGNvbm5lY3Rpb249Y29ufQoKLS0gMS4gQWxsIGNvbnRhY3RzIHdobyB0ZXN0IHBvc2l0aXZlIAoKU0VMRUNUIHBlcnNvbi5maXJzdF9uYW1lLCBwZXJzb24ubGFzdF9uYW1lLCBsYWJfcmVzdWx0LnJlc3VsdApGUk9NIHBlcnNvbiwgY29udGFjdCwgdGVzdGluZ19kZXBhcnRtZW50LCB0ZXN0aW5nX3NhbXBsZSwgbGFiX3Jlc3VsdApXSEVSRSBjb250YWN0LnBlcnNvbl9pZCA9IHBlcnNvbi5wZXJzb25faWQKQU5EIGNvbnRhY3QucGVyc29uX2lkID0gdGVzdGluZ19kZXBhcnRtZW50LnBlcnNvbl9pZApBTkQgdGVzdGluZ19kZXBhcnRtZW50LnBlcnNvbl9pZCA9IHRlc3Rpbmdfc2FtcGxlLnBlcnNvbl9pZApBTkQgdGVzdGluZ19kZXBhcnRtZW50LnNlY3Rpb25faWQgPSB0ZXN0aW5nX3NhbXBsZS5zZWN0aW9uX2lkCkFORCB0ZXN0aW5nX2RlcGFydG1lbnQuaG9zcGl0YWxfaWQgPSB0ZXN0aW5nX3NhbXBsZS5ob3NwaXRhbF9pZApBTkQgdGVzdGluZ19zYW1wbGUuc2FtcGxlX2lkID0gbGFiX3Jlc3VsdC5zYW1wbGVfaWQKQU5EIGxhYl9yZXN1bHQucmVzdWx0ID0gJ3Bvc2l0aXZlJzsKCgotLSAyLiBTaG93IGFsbCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIG51bWJlciBvZiBjb250YWN0cyB3aG8gdGVzdCBwb3NpdGl2ZSBhcmUgbW9yZSB0aGFuIDIuIApTRUxFQ1QgemlwIGFzIHppcGNvZGUsIHN0ciBhcyBzdHJlZXQsIGNpdCBhcyBjaXR5LCBzdHQgYXMgc3RhdGUKRlJPTSAoCglTRUxFQ1QgQ09VTlQoY29udGFjdC5wZXJzb25faWQpIEFTIHRvdGFsX3BvcywgbG9jYXRpb24uemlwY29kZSBBUyB6aXAsIGxvY2F0aW9uLnN0cmVldCBBUyBzdHIsIGxvY2F0aW9uLmNpdHkgQVMgY2l0LCBsb2NhdGlvbi5zdGF0ZSBBUyBzdHQKCUZST00gcGVyc29uLCBjb250YWN0LCB0ZXN0aW5nX2RlcGFydG1lbnQsIHRlc3Rpbmdfc2FtcGxlLCBsYWJfcmVzdWx0LCBsb2NhdGlvbiwgY29udGFjdF90b19ldmVudCwgY29udGFjdF9ldmVudAoJV0hFUkUgY29udGFjdC5wZXJzb25faWQgPSBwZXJzb24ucGVyc29uX2lkCglBTkQgY29udGFjdC5wZXJzb25faWQgPSB0ZXN0aW5nX2RlcGFydG1lbnQucGVyc29uX2lkCglBTkQgdGVzdGluZ19kZXBhcnRtZW50LnBlcnNvbl9pZCA9IHRlc3Rpbmdfc2FtcGxlLnBlcnNvbl9pZAoJQU5EIHRlc3RpbmdfZGVwYXJ0bWVudC5zZWN0aW9uX2lkID0gdGVzdGluZ19zYW1wbGUuc2VjdGlvbl9pZAoJQU5EIHRlc3RpbmdfZGVwYXJ0bWVudC5ob3NwaXRhbF9pZCA9IHRlc3Rpbmdfc2FtcGxlLmhvc3BpdGFsX2lkCglBTkQgdGVzdGluZ19zYW1wbGUuc2FtcGxlX2lkID0gbGFiX3Jlc3VsdC5zYW1wbGVfaWQKCUFORCBsYWJfcmVzdWx0LnJlc3VsdCA9ICdwb3NpdGl2ZScKCUFORCBjb250YWN0LnBlcnNvbl9pZCA9IGNvbnRhY3RfdG9fZXZlbnQucGVyc29uX2lkCglBTkQgY29udGFjdF90b19ldmVudC5ldmVudF9pZCA9IGNvbnRhY3RfZXZlbnQuZXZlbnRfaWQKCUFORCBjb250YWN0X2V2ZW50LnppcGNvZGUgPSBsb2NhdGlvbi56aXBjb2RlCglHUk9VUCBCWSB6aXAKKSBhcyBhbGlhcwpXSEVSRSB0b3RhbF9wb3MgPiAyOwoKCgotLSAzLiBIb3NwaXRhbCB0aGF0IGhhcyB0cmVhdGVkIG1vcmUgdGhhbiBvciBlcXVhbCB0byAyIHBhdGllbnRzLiAKU0VMRUNUIGhvc3BpdGFsLm5hbWUsIENPVU5UKHBhdGllbnQucGF0aWVudF9pZCkgQVMgdG90YWxfcGF0aWVudApGUk9NIGhvc3BpdGFsLCB0cmVhdG1lbnRfZGVwYXJ0bWVudCwgcGF0aWVudApXSEVSRSBob3NwaXRhbC5ob3NwaXRhbF9pZCA9IHRyZWF0bWVudF9kZXBhcnRtZW50Lmhvc3BpdGFsX2lkCkFORCB0cmVhdG1lbnRfZGVwYXJ0bWVudC5wYXRpZW50X2lkID0gcGF0aWVudC5wYXRpZW50X2lkCkdST1VQIEJZIGhvc3BpdGFsLmhvc3BpdGFsX2lkCkhBVklORyB0b3RhbF9wYXRpZW50ID49IDI7CgoKLS0gNC4gU2hvdyBhbGwgdGhlIGNvbnRhY3RzIHdobyBhcmUgY29udGFjdGVkIGluIGFuIGluZGlyZWN0IHdheSBhbmQgdGVzdCBwb3NpdGl2ZS4gClNFTEVDVCBwZXJzb24uZmlyc3RfbmFtZSwgcGVyc29uLmxhc3RfbmFtZSwgbGFiX3Jlc3VsdC5yZXN1bHQKRlJPTSBwZXJzb24sIGNvbnRhY3QsIHRlc3RpbmdfZGVwYXJ0bWVudCwgdGVzdGluZ19zYW1wbGUsIGxhYl9yZXN1bHQKV0hFUkUgY29udGFjdC5wZXJzb25faWQgPSBwZXJzb24ucGVyc29uX2lkCkFORCBjb250YWN0LnBlcnNvbl9pZCA9IHRlc3RpbmdfZGVwYXJ0bWVudC5wZXJzb25faWQKQU5EIHRlc3RpbmdfZGVwYXJ0bWVudC5wZXJzb25faWQgPSB0ZXN0aW5nX3NhbXBsZS5wZXJzb25faWQKQU5EIHRlc3RpbmdfZGVwYXJ0bWVudC5zZWN0aW9uX2lkID0gdGVzdGluZ19zYW1wbGUuc2VjdGlvbl9pZApBTkQgdGVzdGluZ19kZXBhcnRtZW50Lmhvc3BpdGFsX2lkID0gdGVzdGluZ19zYW1wbGUuaG9zcGl0YWxfaWQKQU5EIHRlc3Rpbmdfc2FtcGxlLnNhbXBsZV9pZCA9IGxhYl9yZXN1bHQuc2FtcGxlX2lkCkFORCBjb250YWN0LmNvbnRhY3RfZGVncmVlID0gJ2luZGlyZWN0JwpBTkQgbGFiX3Jlc3VsdC5yZXN1bHQgPSAncG9zaXRpdmUnOwoKCgotLSA1LiBUaGUgY2xhc3NpZmljYXRpb24gb2YgdGhlIG51bWJlciBvZiBjb250YWN0IG1hZGUgYnkgZWFjaCBwYXRpZW50ClNFTEVDVCAKICAgIENBU0UKICAgICAgICBXSEVOIG51bV9vZl9jb250YWN0ID49IDUgVEhFTiAnbnVtX29mX2NvbnRhY3QgPj0gNSAnCiAgICAgICAgRUxTRSAnbnVtX29mX2NvbnRhY3QgPCA1JwogICAgRU5EIEFTIGNsYXNzaWZpY2F0aW9uLAogICAgcHR0IEFTIHBhdGllbnRfaWQsCiAgICBudW1fb2ZfY29udGFjdApGUk9NCiAgICAoU0VMRUNUIAogICAgICAgIHBhdGllbnQucGF0aWVudF9pZCBBUyBwdHQsCiAgICAgICAgICAgIENPVU5UKGNvbnRhY3QucGVyc29uX2lkKSBBUyBudW1fb2ZfY29udGFjdAogICAgRlJPTQogICAgICAgIGNvbnRhY3QsIHBhdGllbnQKICAgIFdIRVJFCiAgICAgICAgY29udGFjdC5wYXRpZW50X2lkID0gcGF0aWVudC5wYXRpZW50X2lkCiAgICBHUk9VUCBCWSBwYXRpZW50LnBhdGllbnRfaWQKICAgIE9SREVSIEJZIG51bV9vZl9jb250YWN0KSBBUyBhbGlhczsKYGBgCgojIEUuIERhdGEgcmV0cmlldmFscyBpbnRvIFIgYW5kIHNob3cgZGF0YWJhc2UgZnVuY3Rpb25zIHByb3Blcmx5CiMjIChhKS4gQ29ubmVjdCBEQiB3aXRoIFIKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoIlJNeVNRTCIpCmxpYnJhcnkoUk15U1FMKQpteWRiID0gZGJDb25uZWN0KE15U1FMKCksIHVzZXIgPSAncm9vdCcsIHBhc3N3b3JkID0gJ3Bzc3dkJywgZGJuYW1lID0gJ2NvbnRhY3RfdHJhY2luZycsIGhvc3QgPSAnbG9jYWxob3N0JykKZGJMaXN0VGFibGVzKG15ZGIpCmBgYAojIyAoYikuIExvYWQgZGF0YSBwcm9wZXJseSB1c2VpbmcgcXVlcnkKYGBge3J9CiBycyA9IGRiU2VuZFF1ZXJ5KG15ZGIsICJTRUxFQ1QgCiAgICAgQ0FTRQogICAgICAgICBXSEVOIG51bV9vZl9jb250YWN0ID49IDUgVEhFTiAnbnVtX29mX2NvbnRhY3QgPj0gNSAnCiAgICAgICAgIEVMU0UgJ251bV9vZl9jb250YWN0IDwgNScKICAgICBFTkQgQVMgY2xhc3NpZmljYXRpb24sCiAgICAgcHR0IEFTIHBhdGllbnRfaWQsCiAgICAgbnVtX29mX2NvbnRhY3QKIEZST00KICAgICAoU0VMRUNUIAogICAgICAgICBwYXRpZW50LnBhdGllbnRfaWQgQVMgcHR0LAogICAgICAgICAgICAgQ09VTlQoY29udGFjdC5wZXJzb25faWQpIEFTIG51bV9vZl9jb250YWN0CiAgICAgRlJPTQogICAgICAgICBjb250YWN0LCBwYXRpZW50CiAgICAgV0hFUkUKICAgICAgICAgY29udGFjdC5wYXRpZW50X2lkID0gcGF0aWVudC5wYXRpZW50X2lkCiAgICAgR1JPVVAgQlkgcGF0aWVudC5wYXRpZW50X2lkCiAgICAgT1JERVIgQlkgbnVtX29mX2NvbnRhY3QpIEFTIGFsaWFzIikKIG91dHB1dCA9IGZldGNoKHJzLCBuID0gLTEpCiBvdXRwdXQKYGBgCiMjIChjKS5EcmF3IGEgYmFyIHBsb3QgdG8gc2hvdyB0aGUgcGF0aWVudCBhbmQgdGhlIG51bWJlciBvZiBpdHMgY29ycmVzcG9uZGluZyBjb250YWN0LgpgYGB7cn0KbGlicmFyeShkYnBsb3QpCmRicGxvdF9iYXIob3V0cHV0LHBhdGllbnRfaWQsbnVtX29mX2NvbnRhY3QpCmBgYAoKCg==