From e241fe8bd613397bebb5a1a0f77c4a97e04483cb Mon Sep 17 00:00:00 2001 From: boris Date: Thu, 21 Mar 2024 22:58:58 +0000 Subject: [PATCH] vault backup: 2024-03-21 22:58:58 --- .obsidian/workspace.json | 114 ++---- .../Week 10/Week 10 Database Systems.md | 77 ++++ .../Week 9/Week 9 Database Systems.md | 266 ++++++++++++ Semester 2/Programming 2/Assessment 4 Notes | 65 +++ .../Project/Part 2/Diary$1.class | Bin 0 -> 163 bytes .../Part 2/Diary$DayInDiary$Entry.class | Bin 0 -> 1062 bytes .../Project/Part 2/Diary$DayInDiary.class | Bin 0 -> 3947 bytes .../Programming 2/Project/Part 2/Diary.class | Bin 0 -> 3408 bytes .../Programming 2/Project/Part 2/Diary.ctxt | 17 + .../Programming 2/Project/Part 2/Diary.java | 205 ++++++++++ .../Project/Part 2/Library.class | Bin 6105 -> 9113 bytes .../Programming 2/Project/Part 2/Library.ctxt | 41 +- .../Programming 2/Project/Part 2/Library.java | 310 +++++++++++--- .../Project/Part 2/LibraryItem.class | Bin 2455 -> 2455 bytes .../Project/Part 2/LibraryItem.java | 14 +- .../Project/Part 2/LibraryReservation.class | Bin 1657 -> 3144 bytes .../Project/Part 2/LibraryReservation.ctxt | 67 ++-- .../Project/Part 2/LibraryReservation.java | 38 ++ .../Project/Part 2/LibraryUser.ctxt | 2 +- .../Project/Part 2/LibraryUser.java | 2 +- .../Part 2/data/testreservationwrite.txt | 1 + .../Project/Part 2/data/testuserwrite.txt | 9 +- .../Project/Part 2/doc/DateUtil.html | 379 ++++++++++++++++++ .../Project/Part 2/doc/Diary.html | 220 ++++++++++ .../Project/Part 2/doc/Library.html | 174 ++++++++ .../Project/Part 2/doc/allclasses-frame.html | 6 +- .../Part 2/doc/allclasses-noframe.html | 6 +- .../Project/Part 2/doc/constant-values.html | 4 +- .../Project/Part 2/doc/index.html | 6 +- .../Project/Part 2/doc/logfile.txt | 12 +- .../Project/Part 2/doc/package-frame.html | 6 +- .../Project/Part 2/doc/package-summary.html | 8 +- .../Programming 2/Project/Part 2/nullnull | 5 +- .../Project/Part 2/package.bluej | 2 +- .../Programming 2/Week 10 Revision/Q1.md | 1 + .../Programming 2/Week 10 Revision/Q3.md | 15 + .../Programming 2/Week 10 Revision/Q4.md | 35 ++ .../Programming 2/Week 10 Revision/Q5.md | 53 +++ images/Pasted image 20240312131440.png | Bin 0 -> 8974 bytes images/Pasted image 20240312161656.png | Bin 0 -> 5108 bytes images/Pasted image 20240312161927.png | Bin 0 -> 7169 bytes images/Pasted image 20240312161933.png | Bin 0 -> 7169 bytes images/Pasted image 20240319160609.png | Bin 0 -> 15207 bytes images/Pasted image 20240319161202.png | Bin 0 -> 33906 bytes images/Pasted image 20240319162824.png | Bin 0 -> 10951 bytes images/Pasted image 20240319163053.png | Bin 0 -> 10578 bytes images/Pasted image 20240319224232.png | Bin 0 -> 4040 bytes images/Pasted image 20240319225420.png | Bin 0 -> 13526 bytes images/Pasted image 20240319234142.png | Bin 0 -> 6621 bytes 49 files changed, 1950 insertions(+), 210 deletions(-) create mode 100644 Semester 2/Database Systems/Week 10/Week 10 Database Systems.md create mode 100644 Semester 2/Database Systems/Week 9/Week 9 Database Systems.md create mode 100644 Semester 2/Programming 2/Assessment 4 Notes create mode 100644 Semester 2/Programming 2/Project/Part 2/Diary$1.class create mode 100644 Semester 2/Programming 2/Project/Part 2/Diary$DayInDiary$Entry.class create mode 100644 Semester 2/Programming 2/Project/Part 2/Diary$DayInDiary.class create mode 100644 Semester 2/Programming 2/Project/Part 2/Diary.class create mode 100644 Semester 2/Programming 2/Project/Part 2/Diary.ctxt create mode 100644 Semester 2/Programming 2/Project/Part 2/Diary.java create mode 100644 Semester 2/Programming 2/Project/Part 2/data/testreservationwrite.txt create mode 100644 Semester 2/Programming 2/Project/Part 2/doc/DateUtil.html create mode 100644 Semester 2/Programming 2/Project/Part 2/doc/Diary.html create mode 100644 Semester 2/Programming 2/Project/Part 2/doc/Library.html create mode 100644 Semester 2/Programming 2/Week 10 Revision/Q1.md create mode 100644 Semester 2/Programming 2/Week 10 Revision/Q3.md create mode 100644 Semester 2/Programming 2/Week 10 Revision/Q4.md create mode 100644 Semester 2/Programming 2/Week 10 Revision/Q5.md create mode 100644 images/Pasted image 20240312131440.png create mode 100644 images/Pasted image 20240312161656.png create mode 100644 images/Pasted image 20240312161927.png create mode 100644 images/Pasted image 20240312161933.png create mode 100644 images/Pasted image 20240319160609.png create mode 100644 images/Pasted image 20240319161202.png create mode 100644 images/Pasted image 20240319162824.png create mode 100644 images/Pasted image 20240319163053.png create mode 100644 images/Pasted image 20240319224232.png create mode 100644 images/Pasted image 20240319225420.png create mode 100644 images/Pasted image 20240319234142.png diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index c7116c2..d5e25c3 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,57 +4,22 @@ "type": "split", "children": [ { - "id": "74175e978d06be55", + "id": "18e28060fe2de0a2", "type": "tabs", "children": [ { - "id": "e96e468fb0a709e5", + "id": "f5285cbbb611ecba", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Semester 2/Database Systems/Week 8/Week 8 Database Systems.md", + "file": "Semester 2/Programming 2/Week 10 Revision/Q5.md", "mode": "source", "source": false } } - }, - { - "id": "1dda09aee43b18f4", - "type": "leaf", - "state": { - "type": "full-calendar-view", - "state": {} - } } ] - }, - { - "id": "97b758ffb617daa3", - "type": "tabs", - "children": [ - { - "id": "fdb9dea18c7f9c15", - "type": "leaf", - "state": { - "type": "pdf", - "state": { - "file": "Semester 2/Database Systems/Booklet of Lecture Slides for Semester Two (2).pdf" - } - } - }, - { - "id": "bde983126ec4558f", - "type": "leaf", - "state": { - "type": "pdf", - "state": { - "file": "Semester 2/Database Systems/Exercise Booklet.pdf" - } - } - } - ], - "currentTab": 1 } ], "direction": "vertical" @@ -105,7 +70,8 @@ } ], "direction": "horizontal", - "width": 200 + "width": 200, + "collapsed": true }, "right": { "id": "ee8f6df41634f71e", @@ -121,7 +87,7 @@ "state": { "type": "backlink", "state": { - "file": "Semester 2/Database Systems/Week 8/Week 8 Database Systems.md", + "file": "Semester 2/Programming 2/Week 10 Revision/Q5.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -138,7 +104,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "Semester 2/Database Systems/Week 8/Week 8 Database Systems.md", + "file": "Semester 2/Programming 2/Week 10 Revision/Q5.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -161,7 +127,7 @@ "state": { "type": "outline", "state": { - "file": "Semester 2/Database Systems/Week 8/Week 8 Database Systems.md" + "file": "Semester 2/Programming 2/Week 10 Revision/Q5.md" } } }, @@ -201,31 +167,42 @@ "switcher:Open quick switcher": false } }, - "active": "e96e468fb0a709e5", + "active": "f5285cbbb611ecba", "lastOpenFiles": [ - "images/Pasted image 20240308103937.png", - "images/Pasted image 20240308103720.png", - "images/Pasted image 20240308102031.png", - "images/Pasted image 20240308101739.png", - "Semester 2/Programming 2/Project/Part 2/Library.java#", + "Semester 2/Programming 2/Assessment 4 Notes", + "images/Pasted image 20240319234142.png", + "images/Pasted image 20240319225420.png", + "Semester 2/Programming 2/Week 10 Revision/Q4.md", + "Semester 2/Programming 2/Week 10 Revision/Q5.md", + "images/Pasted image 20240319224232.png", + "Semester 2/Programming 2/Week 10 Revision/Q3.md", "Semester 2/Database Systems/Exercise Booklet.pdf", - "Semester 2/Database Systems/Week 8/Week 8 Database Systems.md", - "Semester 2/Database Systems/Week 7/Week 7 Database Systems.md", "Semester 2/Database Systems/Booklet of Lecture Slides for Semester Two (2).pdf", - "images/Pasted image 20240305135229.png", - "images/Pasted image 20240305135043.png", - "images/Pasted image 20240305134944.png", - "images/Pasted image 20240305134930.png", - "images/Pasted image 20240305134835.png", - "images/Pasted image 20240305134734.png", - "images/Pasted image 20240305134506.png", + "Semester 2/Database Systems/Week 10/Week 10 Database Systems.md", + "images/Pasted image 20240319163053.png", + "images/Pasted image 20240319162824.png", + "images/Pasted image 20240319161202.png", + "images/Pasted image 20240319160609.png", + "Semester 2/Programming 2/Week 10 Revision/Q1.md", + "Semester 2/Programming 2/Week 10 Revision", + "Semester 2/Database Systems/Week 2/Week 2 Database Systems.md", + "Semester 2/Database Systems/Week 1/Week 1 Database Systems.md", + "Semester 1/Database Systems/Week 10/Week 10 Database Systems.md", + "Semester 2/Database Systems/Week 3/Week 3 Database Systems.md", + "Semester 2/Database Systems/Week 4/Week 4 Database Systems.md", + "Semester 2/Database Systems/Week 10", + "Semester 2/Database Systems/Week 9/Week 9 Database Systems.md", + "images/Pasted image 20240312161933.png", + "images/Pasted image 20240312161927.png", + "images/Pasted image 20240312161656.png", + "Semester 2/Database Systems/Week 8/Week 8 Database Systems.md", + "Semester 2/Database Systems/Week 9", + "Semester 2/Untitled", + "Semester 2/Programming 2/Project/Part 2/__SHELL1.class", + "Semester 2/Programming 2/Project/Part 2/__SHELL1.java", + "Semester 2/Programming 2/Project/Part 2/Library.java#", + "Semester 2/Database Systems/Week 7/Week 7 Database Systems.md", "Semester 2/Programming 2/Project/Part 2/Book.java#", - "Semester 2/Programming 2/Project/Part 2/Periodical.java#", - "Semester 2/Programming 2/Project/Part 2/LibraryItem.java#", - "Semester 2/Programming 2/Project/Part 2/LibraryUser.java#", - "Semester 2/Programming 2/Project/Part 2/CD.java#", - "Semester 2/Programming 2/Project/Part 2/DVD.java#", - "Semester 2/Programming 2/Project/Part 2/AudioVisual.java#", "Semester 2/Database Systems/Week 6/Week 6 Database Systems.md", "Semester 2/Computer Systems Internals & Linux/Week 6/Week 6 Computer Systems Internals.md", "Semester 2/Programming 2/Assessment 3 Revision/Parameter Passing WS3.md", @@ -233,22 +210,11 @@ "Semester 2/Programming 2/Assessment 3 Revision/Parameter Passing WS2.md", "Semester 2/Programming 2/Assessment 3 Revision/Parameter Passing WS1.md", "Semester 2/Database Systems/Week 5/Week 5 Database Systems.md", - "Semester 2/Database Systems/Week 4/Week 4 Database Systems.md", "Semester 2/HCI/Week 2/Week 2 Human Computer Interfaces.md", "Semester 2/HCI/Week 3/Week 3 Human Computer Interfaces.md", - "Semester 1/Database Systems/Week 10/Week 10 Database Systems.md", "Semester 1/Database Systems/Week 11/Week 11 Database Systems.md", "Semester 1/Database Systems/Week 5/Week 5 Database Systems.md", "Semester 1/Database Systems/Week 3/Week 3 Database Systems.md", - "Semester 1/Database Systems/Week 2/Week 2 Database Systems.md", - "Semester 1/Database Systems/Week 9/Week 9 Database Systems.md", - "Semester 1/Database Systems/Week 8/Week 8 Database Systems.md", - "Semester 1/Database Systems/Week 7/Week 7 Database Systems.md", - "Semester 1/Database Systems/Week 4/Week 4 Database Systems - Data Description Language.md", - "Semester 1/Database Systems/Week 6/Week 6 Database Systems.md", - "Semester 2/Database Systems/Week 3/Week 3 Database Systems.md", - "Semester 2/Database Systems/Week 2/Week 2 Database Systems.md", - "CCNA/1 - Networking Today/1.2 - Network Components.md", "Database Systems/Untitled.canvas", "Untitled 1.canvas", "Untitled.canvas" diff --git a/Semester 2/Database Systems/Week 10/Week 10 Database Systems.md b/Semester 2/Database Systems/Week 10/Week 10 Database Systems.md new file mode 100644 index 0000000..d5c9adc --- /dev/null +++ b/Semester 2/Database Systems/Week 10/Week 10 Database Systems.md @@ -0,0 +1,77 @@ +# Query Optimisation Revision + +1. Obtaining the desired information from a database system in a predictable and reliable fashion is Query Processing. Getting these results back in a timely manner deals with the technique of Query Optimization. +2. r(rID, rName, rDescription), 5000 tuples. + tuple header(24b) + rID(6b) + rName(10b) + rDescription(100b) + Disc Block(1024b) + Disc Block Header(24b) + Block Space 1000b + 1. (24+6+10+100)=140b + We can fit 7 tuples in 1 block. + 5000/7 = 715 blocks required. + 2. (24+6+10) = 40b + 25 tuples per block + 5000/25 = 200 blocks required. + 3. Since the projection uses significantly less blocks, we access the disc less in queries compared to using every attribute. 715/200 = 3.6x less disc block accesses. +3. Write relational algebra expressions for the following SQL query. + SELECT lecturers.name, students.name, courses.name + FROM lecturers, students, assessors, courses + WHERE lecturers.lid=assessors.lid + AND students.sid=assessors.sid + AND students.cid=courses.cid + AND courses.cid=“CS”; + π lecturers.name, students.name, courses.name ( + σ courses.cid = "CS" ( + lecturers ⨝ ( + assessors ⨝ ( + students ⨝ courses)))) + Or, + π lecturers.name, students.name, courses.name + (σ lecturers.lid=assessors.lid + (σ students.sid=accessors.sid + (σ courses.cid=students.did + (σ courses.cid='CS'(courses\*students) + )\* assessors + )\* lecturers + ) + 1. Draw query tree + +4. List heuristics that optimisers apply to reduce cost of optimisation. + - Begin with initial query tree for SQL + - Move SELECT operations down the tree + - Apply more restrictive SELECT operations first ( eg. equalities before range queries ) + - Replace Cartesian products followed by selection with theta joins ( eg. *sigma(f) ( RxS )* -> *R theta(f) S* ) + - Move PROJECT operations down the query tree ( add project operations as inputs to theta joins ). +5. Draw a near optimal query tree for the following: + SELECT hotels.name + FROM hotels, ratings + WHERE hotels.rid=ratings.rid + AND hotels.hid=10 + AND ratings.rating>7; + 1. Write relational algebra expressions for this tree + + +# Precedence Graphs Revision + +1. State True / False + 1. A transaction in which all steps must be completed successfully or none of them will be completed is called a durable transaction. + False, this is the definition of an atomic transaction + 2. Two-phased locking can be used to ensure that transactions are serializable + True + 3. Although two transactions may be correct in themselves, interleaving of operations may produce an incorrect result. + True + 4. Transactions should be written to the log before they are applied to the database itself. + True +2. Consider the following precedence graph for a non-serial schedule consisting of four transactions. Is the corresponding schedule conflict serializable? Justify your answer. If it is conflict-serializable give a corresponding serial schedule. + ![](Pasted%20image%2020240319160609.png) + The following is serialisable, since there are no cycles in the precedence graph. T1, T2, T3, T4. + 3. For each of the schedules shown in Table 36.1, draw a precedence graph, determine whether it is conflict serializable and justify your answer. + ![](Pasted%20image%2020240319161202.png) + ![](Pasted%20image%2020240319162824.png) + Not serialisable, directed cycle in graph. + ![](Pasted%20image%2020240319163053.png) + Not serialisable, directed cycle in graph + \ No newline at end of file diff --git a/Semester 2/Database Systems/Week 9/Week 9 Database Systems.md b/Semester 2/Database Systems/Week 9/Week 9 Database Systems.md new file mode 100644 index 0000000..1c465d8 --- /dev/null +++ b/Semester 2/Database Systems/Week 9/Week 9 Database Systems.md @@ -0,0 +1,266 @@ +# Data Security + +## Threats + +- Accidental Loss + - Human Error + - Software Failure + - Hardware Failure +- Theft, Fraud, Sabotage +- Improper Data Access + - Loss of privacy ( personal data ) + - Loss of confidentiality ( corporate data ) +- Loss of data integrity +- Loss of availability + +## Non Computer-Based Controls + +- Policies, agreements, administrative controls + - Security policies + - Contingency plans + - Personnel Controls + - Secure positioning of equipment + - Maintenance agreements + - Physical access controls + +## Computer-Based Controls + +- Backup + - Periodical copies of database & journal to offline media. +- Journaling + - Keeping and maintaining a log file / journal of all changes made to database to enable recovery. +- Checkpointing + - Syncro between database and transaction log. Buffers are force-written to storage. +- Integrity + - Prevents data invalidity. +- Encryption + - Encoding of data by algorithm; renders data unreadable without decryption key. +- Authorisation + - Granting of right or privilege, enabling subject legitimate access to a system / object. +- Authentication + - Determines the authenticity of a user. +- Views + - Dynamic result of one or more relational operations on the base relations to produce another relation. + +## Authorisation + +### Authorisation Types for Schemas + +- Resources: allows creation of new relations +- Alteration: allows the addition / deletion of attributes +- Index: allows creation / deletion of indices +- Drop: allows deletion of relations + +### Authorisation Types for Data + +- Read: allows read only access +- Insert: allows insertion ( not modification ) of new data +- Update: allows modification ( not deletion ) of existing data +- Delete: allows deletion of data. + +### Authorisation Grant Graph + +- Passage of auth from one user to another may be represented in a grant graph. +- Nodes = users +- Root = db admin +- Edge indicates user granted authorisation for a specific transaction to another user. +- All edges must be part of some path connecting to the db admin. +- ![](Pasted%20image%2020240312131440.png) + +If DBA revokes auth from U1: + +- Auth must be revoked from U4, since U1 no longer has authorisation. +- Auth must not be revoked from U5, since another auth path exists. + +## View + +- Alike to a window, through which data is seen. +- Creation of a view does not require significant memory, not a new relation. +- Extremely useful in restricting access to data. +- Users can be given authorisation on views, without being given any authorisation on the relations themselves. +- Ability of views to hide data serves to simplify usage of system, and enhance security by allowing users specific access. +- Combination of relational-level security and view-level security can be used to limit, precisely, user access. +- To create a view, a user must have read auth on all relations the view accesses. + +### Example + +Suppose a bank clerk needs to know the names of the customers that have a loan and which branch they bank with, but is not authorised to see specific loan information. + +1. Deny bank clerk direct access to loan relation +2. Create view to provide necessary information. + + ```SQL + CREATE VIEW cust-loan AS + SELECT branchname, customer-name + FROM borrower, loan + WHERE borrower.loan-number = loan.loan-num + + +``` +3. Grant bank clerk access to view + +The clerk is now authorised to see the result of a query on the view +```SQL +SELECT * +FROM cust-loan +``` + +If the creator of the cust-loan view has only read auth on borrower and loan, the creator will only have read auth on the view. + +## Granting Privileges in SQL + +```SQL +GRANT +ON +TO +``` + +- GRANT statement is used to confer authorisation +- Lists the privileges to be granted +- Specifies the relation / view that will be effected +- Stipulates who is being authorised. + - user id + - PUBLIC ( all valid users ) + - role +- Granting privilege on a view does not imply privilege on any relation. +- Grantor of privilege must hold the privilege, or be the administrator. + +### Types of Privilege + +- SELECT: allows read access +- INSERT: allows use of INSERT INTO +- UPDATE: allows use of UPDATE +- DELETE: allows tuples to be deleted +- REFERENCES: allows foreign keys to be declared when creating relations +- ALL PRIVILEGES: used as a short term for all. + +### Allowing Granting + +- Users can be allowed to pass a privilege on to other users. + +```SQL +GRANT SELECT +ON branch +TO U1 +WITH GRANT OPTION +``` + +- This gives U1 the select privilege on branch and allows U1 to grant this privilege to other users. + +### Revoking Privilege + +- REVOKE is used to remove authorisation +- Lists all privileges to be revokes +- If list contains ALL, all privileges will be removed +- Specifies relation or view that will be effected. + +```SQL +REVOKE +ON +FROM +[RESTRICT | CASCADE] +``` + +- If same privilege granted twice to same user by different grantors, user may retain privilege after revoke. +- All privileges that depend solely on privilege being revoked are also revoked. +- If revoking a privilege from a user causes other users to lose that privilege, the revoke is CASCADED. +- Cascading can be prevented by specifying RESTRICT +- With restrict, the revoke command fails if cascading revokes are necessary. +- If \ includes public, all users lose the privilege, except those granted explicitly. + +## Roles + +Roles permit common privileges for a class of users +Privileges can be granted or revoked from roles +Roles can be assigned to users, and also other roles + +### Roles in SQL + +```SQL +CREATE ROLE teller; +CREATE ROLE manager; +GRANT SELECT ON branch TO teller; +GRANT UPDATE(balance) ON account TO teller; +GRANT ALL PRIVILEGES ON account TO manager; +GRANT teller to manager; +GRANT teller TO alice, bob; +GRANT manager TO avi; +``` + +## Limitations of SQL Authorisation + +No support for tuple-level authorisation +All end-users of an application may be mapped to a single user. +Task of auth in above cases falls on application program + +- Auth must be performed at an application level, rather than SQL. +- Checking for absence of loopholes becomes difficult, since it requires reading a larger amount of code. + +# Tutorial + +1. Define following terms: + 1. Authentication + - The process of verifying the authenticity of a user. + 2. Authorisation + - The process of verifying permission / privilege to access a system / object. + 3. Roles within SQL + - Permit common privileges for users, allowing groups of user's permissions to be changed. +2. Explain the following parts of an auth grant graph: + 1. Nodes + - Nodes represent users + 2. Root Node + - Root node represents db admin + 3. Edge + - Edges represent permission grants between users. +3. Consider the following: + ![](Pasted%20image%2020240312161656.png) + What would be the result of U1 revoking auth from U4? + - U6 would have its privilege revoked, as there is no path to the root node. All other nodes would be unaffected, since they all have a path to the root. +4. Consider the following: + ![](Pasted%20image%2020240312161933.png) + What would be the result of DBA revoking auth from U1? + - U2, U4, and U6 all have auth revoked, as here is no path to the root. +5. Suppose a database includes the following relations. + Student(sNo, sName, sAddress, sLevel, sMno, sPerformance) + Module(mNo, mTitle, mLevel, mLecturer) + + 1. Users are: + - Alfred - Authorised to do anything + - Christian - See and change student details, cannot register or delete + - Robin - Same auth as christian + - George - Same auth as Robin + 2. There is another User, Jessica, who can only see final year students and final year modules. Jessica is not authorised to do anything else. Write SQL statements that implement this. Hint: you can use a view to achieve this! + 3. Now suppose that George has now moved to another university and, therefore, should no longer have access to the database. Write SQL statements to implement this. + +##### Q5 Answers + +1. . + +```SQL +GRANT ALL PRIVILEGES ON student TO alfred; +GRANT ALL PRIVILEGES ON module TO alfred; +GRANT select, update ON student TO christian, robin, george; +``` + +1. . + +```SQL +CREATE VIEW studentFinal AS + SELECT * + FROM student + WHERE sLevel = 6 +CREATE VIEW moduleFinal AS + SELECT * + FROM module + WHERE mLevel = 6; + +REVOKE ALL PRIVILEGES ON student, module FROM jessica RESTRICT; +GRANT SELECT ON studentFinal TO jessica; +GRANT SELECT ON moduleFinal TO jessica; +``` + +1. . + +```SQL +REVOKE ALL PRIVILEGES ON * FROM george; +``` diff --git a/Semester 2/Programming 2/Assessment 4 Notes b/Semester 2/Programming 2/Assessment 4 Notes new file mode 100644 index 0000000..bd0040e --- /dev/null +++ b/Semester 2/Programming 2/Assessment 4 Notes @@ -0,0 +1,65 @@ +private void readFilmData(String fileName) throws IOException //1 +{ + File filmFile = new File(filename); //2 + Scanner scanner1 = new Scanner( filmFile ); //3 + while (scanner1.hasNext() ) //4 could throw a FileNotFoundExcpetion + { + String line = scanner1.nextLine(); //5 + Scanner scanner2 = new Scanner(line); + scanner2.useDelimiter("[ ]*(,)[ ]*"); + String filmTitle = scanner2.next(); + String filmRating = scanner2.next(); + int short = scanner2.nextInt(); + // other code here to read & store rest of data + scanner2.close(); + } + scanner1.close(); +} + +Citizen -> + English -> + Mancunian, + Londoner + Scots + +Citizen person1; +English person2; +Scots person3; +Mancunian person4; +Londoner person5; + +person1 = new Londoner(); +person1 type Citizen. Legal + +person2 = new Mancunian(); +person2 type English. Legal + +person5 = new English(); +person5 type Londoner. Illegal + +persona2 = new Scots(); +person2 type English. Illegal + +factorial(3) -> + x = 2 + y = factorial(2) + factorial(2) -> + x = 1 + y = factorial(1) -> 1 + n*y = 2*1 = 2 + n*y = 2*3 = 6 + + + +public int countTree(BinTreeNode t) +{ + int count; + if (t == null) + count = 0; + else + count = countTree(t.leftChild) + 1 + countTree(t.rightChild); + return count; +} + + + diff --git a/Semester 2/Programming 2/Project/Part 2/Diary$1.class b/Semester 2/Programming 2/Project/Part 2/Diary$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a27cfb1f728b25567166308f21cd737437362067 GIT binary patch literal 163 zcmX^0Z`VEs1_l!bZgvKCb_PyH2Cm@z(xT*4x6GVWAjc&$v8YlnE3qt*k%8YeFF7Z_ zI5RKZH?<@qKZTuvi;;mHtU|?*k%7lEFE6#oIVZ8WIJKCOK>(ylKPNFSUEe<`D>b=< sk%1MgRzQJ)k%0+lDF`qFAp?-d!oUioSs2)WBnJ?40o5=9X$Aof0A3&=LI3~& literal 0 HcmV?d00001 diff --git a/Semester 2/Programming 2/Project/Part 2/Diary$DayInDiary$Entry.class b/Semester 2/Programming 2/Project/Part 2/Diary$DayInDiary$Entry.class new file mode 100644 index 0000000000000000000000000000000000000000..d6212bfc10cc60b89492b1d3f95083fb1085c47b GIT binary patch literal 1062 zcmZ`%O>fgc5Pj>!u@g*dLMi1VC4~Tq6Y|kUT!Of?AVrEm0@OnfNSm-Ku2M&`-75W8 zAQ44Ehyx!7_)&-%+iFS@F1s^t=goUF_U}KRzXE8Zor8gge3Y|vRB|xka8%`^X5f*5 zy1=R%s^eEGQ2wb5-H|7-*6X=_U;1Yk(2l^0KP%dkX9A)tkO|+rL8)b+DUc(y>+QM3 z6tKFUr~KWa3<4Dh0mHdGUFfiEd?IAiXg%>6kST9$WnV>=CV4#Aa^tee= z*B8AfE&s#T#!Uk)ft^KSXPI6%vE1tL^xBxH+IX9f9f9omBiVXAI`IeUxy#GQMf@VZ8iWQ&(w;9DFk*IyEt!YOOGZm`xUo$NY9& yb3ToUP1+bcHnEk=W#Vo$7i0HOine*5Dl|M`Nt!lA8){&c5QCx(y6+GU+x!c98qAjf literal 0 HcmV?d00001 diff --git a/Semester 2/Programming 2/Project/Part 2/Diary$DayInDiary.class b/Semester 2/Programming 2/Project/Part 2/Diary$DayInDiary.class new file mode 100644 index 0000000000000000000000000000000000000000..722bc711cd4def4d982a503b75521b3c3b94154b GIT binary patch literal 3947 zcma)8`&%5<8GdJXVV2DVwuIaWNv9DjEK3L^rY)q=5WG-}&*k z@ltEOx3$`fccX@;UZb)k#@o;RANq6uhdhs_?>95-E}Oxp@a#EfzWHwFJ@5CO`S-V< zeFecdJf6Z}zFUDB*o$btWn10>1+5*Stk$e^f-Vm^Il62bv21g! zI6G;&cNvp;N}5NUDI-5&xRyMJ!i0p8ceP0}UgNasG3yEjn>#wIB37f&8~x@x_ufSJ zcbWy$J#BcFV>1i-KQS_5O}admsy9qUvG^P2nb^+ZljSo>Tb?;vr6|X=hJ*Fvo-uX* zs4?g7Tg9ykl145U9`%-vsIbEVXH!iK1uap!qz&mZ<_K-fyy=;t=gpCx#c`b(&}_?9 z(1-jWEj(w?9P-@-nX+b7yh6s#xt8sfafo+_!$!9PCXbCwC|D1gDqdA^&02&BWA_e- zgV;Rj7Mt&tp^wZizhu1_Q&VQ4(B8Y7Dw)t*6{QEFF!AwQvFsDejS-d-c|~cDD0N0C zMY*pw+`E?HT7+GRc>S7&YY-_l?iAfA^JYs*D&<$rF6j&!260Hk4Y*Om?YKk3QQWQJ zHjHTaF@B<9AATe&%J$-V1sfu|iH6iINkLv!1{z++8wxhnR%$>O4R7L%M0iWX z+jvLASuBz(8vcoM8vccMHN1y+RJ^a@1ANF@^ApG$_H@rUTbw;TShVsv(`B9M8a~2# z89pZe^(tC*6goA0f=^W}X((Y?!v$Pa@tKB8_?(2(`6qT?uvukw7KAQB=Ol$+%C54R zOh!LqoAYz#lxOC2({&wJw`@IU73T8BLdfWjPMwMh21R|$(WO$@g!PkDmVQOgo~aic z-SYIpj8n|#bldUtNmE>TGbY`!gXrQ!(!5*6S1hJl+$gGGaCq_*QzGt_a~bwb*YF%7 zq6Vfc3|1PuP@J7h$UGdf%SSQrz+SaNt$jkRU00JiEbq=JPAk}RwLx@om8(Ak0IX$;auOi1xW0rC1jk!6~X0qKKfkqVt2deR0#Y!5st%keyb<%SJ zQEkqFln#QDTb&U1?YGjrU4vd|CD>{_ZQdR(??Sn&n^zF=KLx_uIw|uJej9|J4TGll zfN9bxJ8y+izH;re5NZ_`A(6fdi*-zCj5nd&&b&!{dP3*-R+gV=am1vNKtUg$V%WnU zdk&CJOBbR{ql8U~8vT4aPK!9_)=bwD)XXxHnd}l8GMA7#wv2U4(9ZjQ1~@h&!SNw9 z@B^(8kMKk5QS7H=6Ft%ceu@K}WhD_~{AWYtC~wV$lz8fu2 z2;BtfAEX{zE8mEdSD1jL&@E0%SigVU7ib)fAK1R_3|h0>MY_F&rmvB{fbWez7FQOp z{5LDX;(oAJh6A2Pk{^TX@hn>K9IoZu#ZO1sM~2Ru(1s!01tD!(OklYqZL3?v;khg2E6De zpa(W(AX_ksF&~u{9A*LnDX*6>#wUELqkX?J8sO0~)_oBh75oD_7n>9ii2lUZ1i|P! zi-xU<(M8lRUipt`XG_@ZXA(fOlb`@E(c{b5fmd-IubT|sKsU~iPH&MeZrQ(Q+iJg}zjLFp)Y(N>{cI8CQ1?lrRU&E6hW6LFM zCHGpJx0TSw-}dGmT$J$r67+DRquFqyN4W?#I@Zl?%5F>e0ks+~U}xgKeRWmtuAvus z-QIjHR~zfZ^AAJWb$kdSEM7Ughz&Gr?qEEbJA=7|jGSD6S0Bp=yj_zx$JM*U>OG#% z2V}s9IKeyc8Jx%SSR$e&B6xwC7k&Kp^2Bb#K_9CGHG6T4c6I#S;$teMc&<#lH(8!S zJ0V*m65pVYWSh8*dtyy#5a)YBCLCr~QWt8bE4z&P3c-T%DwdCqD&+%H@pJYAsYw;T z@at7p_u@Xp(@7YZ44q3YNLqB>wv4)H=K*uYWzYh|Wx!lbK*u=@uxZh_HTSumA8S!ZApd;0n)2R>Ap`U5YL?jWb?MMM+wMkew6=AIWAI8l2 deqtCy9=kZV645T!X*VTlu6j71pd9Js{{SpmiZcKJ literal 0 HcmV?d00001 diff --git a/Semester 2/Programming 2/Project/Part 2/Diary.class b/Semester 2/Programming 2/Project/Part 2/Diary.class new file mode 100644 index 0000000000000000000000000000000000000000..de3e262128908387e98727b0112a65f4a39f2cf9 GIT binary patch literal 3408 zcmbtXYjYIG6+JEOYF4As!;1)r7&3qi(n_+-!w!}}7y&YZl^{q)1{}wu-9{R`nptK> zvgLPT$Ipa3oDiGXPHZRMyvs=?LWEQ*UlLdOQ~r)!_;Gq>Us{Q(RE45?x_fTlKKI;n z?~XqH{O|t+uor*Qu@k2>d_zYaPBmf&PV1P!q#7P*!Wm3ycu+?IXVv1I8qTZbLpr{R zht=?{Mmz#5foUBXWHm?~Nt{aHf_ly3vbJv8jM9Xl8jsPF1N zBM>|6X6dUnZ98&&er{TNlh$;OJIS=0v2tfD&sOW=W-OSs30jL>(_4#`&7PLN^cJkZ zb{&BYUFozv?J=CH?Ll=@J%bYvqrA)xl{p#6syL}c20tT%sy!mzxe96b`L+2_Xzh|%^a*#~%g7O1WlIl{ z->L8!=*L~Wz9OAtmOo3X4D_H^!?OmS!?z852hVGG!N7O%A}OwoTzPrPz{_~Wz^i!8 z!1wTd4VMl406#SFBm7vy>jr*;p9-8!rBdcm&vQM~cFZ{$%(_`KYy0_}wOC9?SNDK9 zIV(*+FEjQ9TV_o%Wvc9&wr@_$3$7>4Kp7}9qZjn5;fjHu;SI{Fmigg%JC~K7z*aqq zeZZ_{)ucx=FFl)347`b}27ZpWs3H27ZU<4g6ja{RjL}ARgv}d8x#G za{8jo1T4NNRl8Vxl@v$%tFn&tsWiK)8d)mTAPcA@+hkXFZEXlN(PrE|d4cVN8fCL! z;Wk$;4Es}4#&rVAcKj2PrM z*VS8uNWcO+)^Jdat{N95U}ZAW_d9pp#bQZytuFnwN^n&5jD#Zl0rq509r<{%_P4FB z;@WsgDht>jmce6EvRD2OEsCU9Cw0+h=VYj^;%a^5-*)>?sm{lYOKXlDX4oe1Alt){|3gm?wDT4(WscF)km~}k`hV4m)kSv5^Q^_R?FZ$2g+KD;ZFVZ(eu9m?!IN|Dg6i-^_jljY z{hB`-*ve0$o%~c1{61p;=d+KiI^2mk=lrSQxQjc(sOJo5OI?FV-9X*hYpDMlVt)>; zcXMo^1+W1zbf6WRu!k!nI>QgKySWm$2VXDx`wui)0w;Tx5Fd*TZRWG#eGI4midgS; zXmz-Xjp5=35@%Dr;u;#SL$AkF(W0pi|3ac?^D>OyWi*eyP%jE!{6oR1hk~<>A69CN zV>{v8f!oo=KzeYPK_27YI73trQ-q=6e(b}&VE`wKU{j$=O#kdz_XH>3VD zXc`WR?oa7d;65CRViM=*pn)cZ9wKUa3oU;^YqD(#w-s=O(;G;Vv~|h$C9LmR##i`A zZs0)UaK4fAC3MhUo!i7`&v;+&62AI2ruvp~`#`MXq$8$IZ!VqKqDbirX?qi!ii?P$ zfp|xJ8DA@)NqIHtmA;zC3tto}Tn(d*u=kO%L9D|;ru{y~doT>`7*l^5NAMty!ovuj zC3}}Kir2}?6{PVF-+w@^6qiE`|1$X+Cd+Z27~#32)aDU|sw@cjW&r}pkI z^Sd7LbvJPj3BHLF8jgJmjsIyjTGq~gnTj}%jjYtpy(^S45bKDM<*gmDWo%o*_N! dayInDiaryMap; + + /** + * Constructor for objects of class Diary + */ + public Diary() + { + // create diary as a map + dayInDiaryMap = new HashMap(); + } + + /** + * Method for adding a reservation to the diary. + * @parameter itemReservation, of type ItemReservation + */ + public void addReservation(LibraryReservation itemReservation) + { + Date date = itemReservation.getStartDate(); + for(int day=1; day<=itemReservation.getNoOfDays(); day++) + { + if( !dayInDiaryMap.containsKey(date) ) + { + // add new day to diary if no previous entries for this day + dayInDiaryMap.put(date, new DayInDiary(date)); + } + + dayInDiaryMap.get(date).addEntry(itemReservation, day); + date = DateUtil.nextDate(date); + } + } + + /** + * Method for displaying the reservations between specified dates. + * + * @parameter startDate, of type Date + * @parameter endDate, of type Date + */ + public void printEntries(Date startDate, Date endDate) + { + if( DateUtil.daysBetween(startDate, endDate)<0 ) + { + // startDate after endDate + System.out.println("*** Error in method displayEntries(): The specified end date is before the start date ***"); + } + else + { + System.out.println("\n\nDiary: Reservations for period " + DateUtil.convertDateToShortString(startDate) + + " to " + DateUtil.convertDateToShortString(endDate) + " inclusive"); + System.out.println("================================================================="); + for(Date date=startDate; date.compareTo(endDate)<=0; date = DateUtil.nextDate(date)) + { + String longDate = DateUtil.convertDateToLongString(date); + System.out.print(longDate + ":"); + if( dayInDiaryMap.containsKey(date) ) + { + DayInDiary dayInDiary = dayInDiaryMap.get(date); + dayInDiary.printEntries(); + } + else + System.out.println(" No reservations\n"); + } + } + } + + /** + * Method for deleting a reservation from the diary. + * @parameter itemReservation, of type ItemReservation + */ + public void deleteReservation(LibraryReservation itemReservation) + { + Date date = itemReservation.getStartDate(); + for(int day=1; day<=itemReservation.getNoOfDays(); day++) + { + DayInDiary dayInDiary = dayInDiaryMap.get(date); + dayInDiary.deleteEntry(itemReservation); + + if( dayInDiary.getDaysEntries().size()==0 ) + dayInDiaryMap.remove(date); + + date = DateUtil.nextDate(date); + } + } + + /** + * Accessor method for returning all reservations that have entries + * in the diary for a particular date. + * + * @parameter date, of type Date + * @return an array of reservations, or null if no entry for that date + */ + public LibraryReservation[] getReservations(Date date) + { + DayInDiary dayinDiary = dayInDiaryMap.get(date); + if( dayinDiary==null ) + return null; + else + return dayinDiary.getReservations(); + } + + // inner class, only needed in the Diary class + private class DayInDiary + { + // reservations for the day + private ArrayList daysEntries; + private Date date; + + /* + * Constructor for objects of class DayInDiary + */ + private DayInDiary(Date date) + { + this.date = date; + daysEntries = new ArrayList(); + } + + private ArrayList getDaysEntries() + { + return daysEntries; + } + + private LibraryReservation[] getReservations() + { + int noOfEntries = daysEntries.size(); + LibraryReservation[] itemReservations = new LibraryReservation[noOfEntries]; + for(int i=0; i0 ) + { + System.out.println(" " + size + " reservation(s)"); + for( Entry entry: daysEntries ) + { + LibraryReservation itemReservation = entry.getReservation(); + int reservationDay = DateUtil.daysBetween(itemReservation.getStartDate(), date) + 1;; + System.out.println(" " + itemReservation + ", day " + reservationDay + " of " + itemReservation.getNoOfDays()); + } + } + else + { + System.out.println("*** Unexpected error in displayEntries() ***"); + System.out.println("*** No entries for this date so it should not be in the diary ***"); + } + System.out.println(); + } + + // an inner class of the DaysDiary class + private class Entry + { + private LibraryReservation itemReservation; + private int reservationDay; // e.g. second day is day 2 of 4 for a reservation spanning 4 days + + private Entry(LibraryReservation itemReservation, int reservationDay) + { + this.itemReservation = itemReservation; + this.reservationDay = reservationDay; + } + + private LibraryReservation getReservation() + { + return itemReservation; + } + } + } +} \ No newline at end of file diff --git a/Semester 2/Programming 2/Project/Part 2/Library.class b/Semester 2/Programming 2/Project/Part 2/Library.class index cba157e27d07ea49d74f9af472929f1531a4b60f..03f2c79b5c77be8274d47eb0335e725f6ac793e4 100644 GIT binary patch literal 9113 zcmbVS3w%`Nl|LslnLD|;gb)}=czHpPBqY3)C=*3U0uo5VBM5@1OlEG9fyqpmM*>z` zpS9IiZPjYTx7DaJ za_76}e&6}d`Jewe-?`h%bTsAKMXBK&uq>ghjZ$$$FkzchMZrvJB2AJCs< z?uT;wkw(XLnn~~Y)+~Sp_@mParV?f@^0P;0FBfa<(`i1vg9~ez%zhb_$VK;aDb%o0 z%9FUPlqYk!T&8GT;peH?pQrgb;OFTY&w#~pSE+FotdrqPn98$sp3QS$CC}CPG(Vd< zHS#>U%-8sIjTgvpp#Z>3psh%{4Nr)p)TOTj%F`oi5-deqQS5W%8(4cB%36 za*bE$v_%$e;WOoOmRuJ3d8Pa|2ukp+p3fF@&JkIypI7-g=;uZN#plZ9Jh`m)^ZD|- zMlNgp+~ntGKezblu%FlYdA-IL=(G<3xO16jknI^aG3k`&p zX428vQV1Fm$j)d_Je1BPEv98-pPp;q#zOI)rJd|pXXCn9ila$7WRb!7UwtmO7kR}7MhwnR7-+Yw4e<=zo`)4kCYK+5?ofC0{= zB`z?PSLYrmmy~`1glW>42f0-On|qalQLW0TC;3(C0km|cL*e~^#4%@v+S`eN%XOw1 zc}ra4Mp0dwEP%^2EoYZ|8dIRhid)H0+H#3I5}00HGoA!Y9L3*OAy+6KiAJzaCRdD~ zs_|~7vYc}9srYzU(SwL$%!>Dl44#xz9@6@}KtL46A(n8@n!ehB2n zsdOj_BRp0-!Zd3z2~LdPv?Y`dVQzOa)Cc;N+p0o?>80yM0%x@DXv}I#!25vfA!M*C zmgo_8m1P4gKJ8cgvd5* zX3`2pPG$9^h?NdSW1WaUc*8W+Hc$n_5n}fW7xf$|N-cmE)%Gs_81hh(2V@d=^BVo> zL;cqJSf~dF1Jm@r(EbS^WC~6|rSU--FKMj-G0Ro4a8VwJN+JqJRbjJh1u`DtguMXM zA5U!VZV4R%ADoCOpXDJO_F$>Tm*8;I_)^d-rs`nW z+_ldNrwvqueH!mKIL3Vj$2nnezo@cjx{_4m0|qA<8HYs~9$?zOJ&`c`Lh(bUU~jgz zq)frB2arb0?nKfIXOc-Po;H#BJyx9=jfcUX6pkazwS{KaAv0ulhr%e$W}@3%zD(mm zgAdZ%sEh?$?L(|76OBczq``;ya)Up`SIFo}gFh``RJqt-wkVRPOjO|{to;mMrSa7U zU⋙UKo5GUvKbd`39*)*5g|)mPUgHOAV3L~(Yr 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 TxpLHbpRB{~|AbwO=%4=wvhn*O literal 6105 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 diff --git a/Semester 2/Programming 2/Project/Part 2/Library.ctxt b/Semester 2/Programming 2/Project/Part 2/Library.ctxt index f596dd7..51b5b4d 100644 --- a/Semester 2/Programming 2/Project/Part 2/Library.ctxt +++ b/Semester 2/Programming 2/Project/Part 2/Library.ctxt @@ -5,22 +5,41 @@ comment0.text=\n\ Constructor\ for\ objects\ of\ class\ Library\n comment1.params=item comment1.target=void\ storeItem(LibraryItem) comment1.text=\n\ Inserts\ object\ value\ item\ alongside\ key\ of\ @itemCode\ into\ @itemsMap.\n +comment10.params= +comment10.target=void\ writeUserData() +comment10.text=\n\ A\ method\ to\ output\ all\ user\ data\ to\ a\ file\ using\ a\ fileDialog\ to\ specify\ file\ location.\n\ \n +comment11.params= +comment11.target=void\ readLibraryReservationData() +comment11.text=\n\ Read\ Library\ Reservation\ Data\ from\ a\ file\ specified\ by\ the\ user.\n +comment12.params= +comment12.target=void\ readData() +comment12.text=\n\ A\ method\ to\ read\ all\ data\ from\ files\ using\ a\ fileDialog\ to\ specify\ file\ location.\n\ This\ will\ create\ the\ corresponding\ objects\ depending\ on\ flags\ contained\ in\ the\ file\n\ and\ populate\ it's\ fields.\n\ \n\ Default\ flag\ value\:\ "book",\ to\ support\ legacy\ files.\ This\ will\ not\ interfere\ with\ \n\ files\ of\ different\ flag\ orders.\n +comment13.params=userID\ itemCode\ startDate\ noOfDays +comment13.target=boolean\ makeLibraryReservation(java.lang.String,\ java.lang.String,\ java.lang.String,\ int) +comment13.text=\n\ Create\ a\ reservation\ to\ allow\ a\ user\ to\ reserve\ an\ item\ from\ the\ library.\n +comment14.params=reservationNo +comment14.target=void\ deleteLibraryReservation(java.lang.String) comment2.params=user comment2.target=void\ storeUser(LibraryUser) comment2.text=\n\ Inserts\ object\ value\ user\ alongside\ key\ of\ @userID\ into\ @customerMap.\n\ If\ the\ userID\ is\ set\ to\ unknown,\ it\ will\ call\ @generateUserID.\n comment3.params=reservation comment3.target=void\ storeLibraryReservation(LibraryReservation) comment3.text=\n\ Inserts\ object\ value\ reservation\ alongside\ key\ of\ @reservationNo\ into\ @libraryReservationMap.\n -comment4.params=prefix\ length -comment4.target=java.lang.String\ generateUserID(java.lang.String,\ int) -comment4.text=\n\ Returns\ a\ random\ unique\ user\ ID\ by\ specifying\ \n\ @prefix\ -\ arbitrary\ alphanumeric\ prefix\n\ @length\ -\ length\ of\ numeric\ ID\n\ and\ returning\ a\ unique\ user\ id\n\ @uuid\ -\ a\ unique\ string\ starting\ with\ @prefix,\ and\ concat.\ with\ a\ random\ number\n\ \n\ Example\:\ length\ \=\ 6,\ expected\ result\ should\ be\ under\ 999,999\ and\ above\ 99,999.\n\ If\ we\ just\ use\ 10^(length),\ this\ would\ generate\ any\ number\ under\ 1,000,000.\n\ This\ is\ an\ issue\ since\ any\ integers\ below\ 100,000\ can\ be\ used,\ which\ would\ be\ incorrect.\n\ By\ using\ the\ offset\ of\ a\ factor\ of\ 10\ below\ the\ desired\ length\ we\ can\ generate\ between\ 0\ and\ 899,999.\n\ After\ this,\ we\ can\ add\ 100,000\ back\ to\ the\ number\ to\ ensure\ a\ baseline\ length\ is\ maintained.\n\ \n\ Note\:\ I\ am\ aware\ that\ this\ is\ overengineered,\ and\ that\ several\ random\ integers\ of\ amount\ @length\ could\ be\ used,\ \n\ but\ this\ is\ considerably\ more\ efficient\ since\ there\ is\ no\ iteration\ involved\ in\ the\ creation\ of\ the\ ID.\ O(1)\n -comment5.params= -comment5.target=void\ writeUserData() -comment5.text=\n\ A\ method\ to\ output\ all\ user\ data\ to\ a\ file\ using\ a\ fileDialog\ to\ specify\ file\ location.\n\ \n\ Note\:\ Potentially\ could\ implement\ the\ HashSet\ made\ for\ GenerateUserID\ to\ avoid\ unnecessary\ recursion.\n +comment4.params= +comment4.target=java.lang.String\ generateReservationNo() +comment4.text=\n\ Generate\ a\ sequential\ reservation\ number.\ Since\ Maps\ do\ not\ have\ an\ index,\ we\ cannot\ simply\ get\ the\ last\ value,\ \n\ and\ recursion\ would\ be\ too\ intensive\ for\ this\ application.\ As\ a\ placeholder\ for\ the\ file\ output,\ a\ field\ variable\n\ is\ used\ to\ hold\ the\ last\ highest\ value\ for\ the\ reservation\ number.\ Unlike\ @generateUserID,\ this\ has\ a\ maximum\ value\n\ hardcoded\ to\ the\ spec.\ This\ likely\ will\ not\ be\ an\ issue\ since\ we\ can\ still\ have\ 1,000,000\ reservations.\n +comment5.params=prefix\ length +comment5.target=java.lang.String\ generateUserID(java.lang.String,\ int) +comment5.text=\n\ Returns\ a\ random\ unique\ user\ ID\ by\ specifying\ \n\ @prefix\ -\ arbitrary\ alphanumeric\ prefix\n\ @length\ -\ length\ of\ numeric\ ID\n\ and\ returning\ a\ unique\ user\ id\n\ @uuid\ -\ a\ unique\ string\ starting\ with\ @prefix,\ and\ concat.\ with\ a\ random\ number\n\ \n\ Example\:\ length\ \=\ 6,\ expected\ result\ should\ be\ under\ 999,999\ and\ above\ 99,999.\n\ If\ we\ just\ use\ 10^(length),\ this\ would\ generate\ any\ number\ under\ 1,000,000.\n\ This\ is\ an\ issue\ since\ any\ integers\ below\ 100,000\ can\ be\ used,\ which\ would\ be\ incorrect.\n\ By\ using\ the\ offset\ of\ a\ factor\ of\ 10\ below\ the\ desired\ length\ we\ can\ generate\ between\ 0\ and\ 899,999.\n\ After\ this,\ we\ can\ add\ 100,000\ back\ to\ the\ number\ to\ ensure\ a\ baseline\ length\ is\ maintained.\n\ \n\ Note\:\ I\ am\ aware\ that\ this\ is\ overengineered,\ and\ that\ several\ random\ integers\ of\ amount\ @length\ could\ be\ used,\ \n\ but\ this\ is\ considerably\ more\ efficient\ since\ there\ is\ no\ iteration\ involved\ in\ the\ creation\ of\ the\ ID.\ O(1)\n comment6.params= -comment6.target=void\ printAll() -comment6.text=\n\ Prints\ to\ the\ terminal,\ in\ a\ human-readable\ format,\ all\ items\ in\ the\ itemList\n\ \n\ Contains\ a\ marker\ at\ the\ start\ and\ end\ to\ visualise\ in\ terminal\ output.\n +comment6.target=void\ printLibraryReservations() +comment6.text=\n\ Prints\ to\ the\ terminal,\ in\ a\ human-readable\ format,\ library\ reservation\ in\ the\ itemList\n\ \n\ Contains\ a\ marker\ at\ the\ start\ and\ end\ to\ visualise\ in\ terminal\ output.\n comment7.params= -comment7.target=void\ readData() -comment7.text=\n\ A\ method\ to\ read\ all\ data\ from\ files\ using\ a\ fileDialog\ to\ specify\ file\ location.\n\ This\ will\ create\ the\ corresponding\ objects\ depending\ on\ flags\ contained\ in\ the\ file\n\ and\ populate\ it's\ fields.\n\ \n\ Default\ flag\ value\:\ "book",\ to\ support\ legacy\ files.\ This\ will\ not\ interfere\ with\ \n\ files\ of\ different\ flag\ orders.\n -numComments=8 +comment7.target=void\ printAll() +comment7.text=\n\ Prints\ to\ the\ terminal,\ in\ a\ human-readable\ format,\ all\ items\ in\ the\ itemList\n\ \n\ Contains\ a\ marker\ at\ the\ start\ and\ end\ to\ visualise\ in\ terminal\ output.\n +comment8.params=start\ end +comment8.target=void\ printDiaryEntries(java.lang.String,\ java.lang.String) +comment9.params= +comment9.target=void\ writeLibraryReservationData() +comment9.text=\n\ Write\ all\ current\ library\ reservations\ to\ a\ file\ specified\ by\ the\ user.\n +numComments=15 diff --git a/Semester 2/Programming 2/Project/Part 2/Library.java b/Semester 2/Programming 2/Project/Part 2/Library.java index 8aef1d9..dcd81ad 100644 --- a/Semester 2/Programming 2/Project/Part 2/Library.java +++ b/Semester 2/Programming 2/Project/Part 2/Library.java @@ -1,11 +1,3 @@ - -/** - * Class to create objects of a Library, which can hold and report on assets held within - * - * @George Wilkinson - * @3.0 - */ - // Import all required libraries. Not using .* as it is not good practice due to potential conflicts. import java.util.List; import java.util.ArrayList; @@ -14,21 +6,33 @@ import java.util.Scanner; import java.util.Random; import java.util.Map; import java.util.HashMap; +import java.util.Date; import java.io.File; import java.io.IOException; import java.awt.FileDialog; import java.awt.Frame; import java.io.PrintWriter; +/** + * Class to create objects of a Library, which can hold and report on assets held within + * + * @author George Wilkinson + * @version 3.0 + */ public class Library { // private List itemList; // Initialise an ArrayList of name itemList to store Library Items // private List userList; // Initialise an ArrayList of name userList to store Library Users - private HashSet uuidSet; // Initialise a Hash Set of name uuidSet ( unique user identifier ) to store unique user IDs for efficient O(1) searching + /* No longer needed, as we can use the keys of customerMap. + private HashSet uuidSet; // Initialise a Hash Set of name uuidSet ( unique user identifier ) to store unique user IDs for efficient O(1) searching + */ + private Map customerMap; private Map itemsMap; private Map libraryReservationMap; + + private Diary diary; /* * Constructor for objects of class Library */ @@ -36,17 +40,26 @@ public class Library { // itemList = new ArrayList(); // userList = new ArrayList(); - uuidSet = new HashSet(); + /* No longer needed, can use keys of customerMap. + uuidSet = new HashSet(); + */ + customerMap = new HashMap(); itemsMap = new HashMap(); libraryReservationMap = new HashMap(); + diary = new Diary(); } + + /** + * Storing Objects Start + */ + /* * Inserts object value item alongside key of @itemCode into @itemsMap. */ - public void storeItem( LibraryItem item ) + private void storeItem( LibraryItem item ) { // itemList.add( item ); itemsMap.put( item.getItemCode(), item ); @@ -56,31 +69,55 @@ public class Library * Inserts object value user alongside key of @userID into @customerMap. * If the userID is set to unknown, it will call @generateUserID. */ - public void storeUser( LibraryUser user ) + private void storeUser( LibraryUser user ) { // userList.add( user ); - System.out.println( "User Storing: " + user.getFirstName() ); if ( user.getUserID().equals( "unknown" ) ) { user.setUserID( generateUserID( "AB-", 6 ) ); } - customerMap.put( user.getUserID(), user ); + customerMap.put( user.getUserID(), user ); // Store the user along with the userID. } /* * Inserts object value reservation alongside key of @reservationNo into @libraryReservationMap. */ - public void storeLibraryReservation( LibraryReservation reservation ) + private void storeLibraryReservation( LibraryReservation reservation ) { libraryReservationMap.put( reservation.getReservationNo(), reservation ); + diary.addReservation( reservation ); } - public void generateReservationNo() + /** + * Storing Objects End + */ + + + /** + * Generate IDs Start + */ + + /* + * Generate a sequential reservation number. Since Maps do not have an index, we cannot simply get the last value, + * and recursion would be too intensive for this application. As a placeholder for the file output, a field variable + * is used to hold the last highest value for the reservation number. Unlike @generateUserID, this has a maximum value + * hardcoded to the spec. This likely will not be an issue since we can still have 1,000,000 reservations. + */ + public String generateReservationNo() { - if( libraryReservationMap.values() = null ) - return "000001"; - + /* + * Originally, I did not check if the number was already taken, however the last part of step 4 introduced deletion. + * When a reservation is deleted that does not have the highest reservation number, conflicting reservation numbers are generated. + * e.g. 5 reservations, reservation 3 ID: 000003 is deleted. The next reservation number would be 000004, as the size + 1 = 4 + */ + String candidateNo = String.format("%06d", libraryReservationMap.size() + 1); + for ( int i = 1; libraryReservationMap.containsKey( candidateNo ); i++ ) + { + candidateNo = String.format( "%06d", libraryReservationMap.size() + i ); + } + return candidateNo; } + /* * Returns a random unique user ID by specifying * @prefix - arbitrary alphanumeric prefix @@ -97,13 +134,13 @@ public class Library * Note: I am aware that this is overengineered, and that several random integers of amount @length could be used, * but this is considerably more efficient since there is no iteration involved in the creation of the ID. O(1) */ - public String generateUserID( String prefix, int length ) + private String generateUserID( String prefix, int length ) { Random random = new Random(); final int offset = (int) Math.pow( 10, (length-1) ); // Static integer equal to 10^(length-1) lower than length. This will allow for the factor to be consistent. int intLength = (int) ( Math.pow( 10, length ) ) - offset ; // Integer equal to 10^(length) minus the offset. This creates a ceiling for the ID range. - if ( uuidSet.size() > ( intLength - 1 ) ) { // No idea why I get an error for equals FIX LATER + if ( customerMap.size() == intLength ) { System.out.println("Too many user IDs delegated for current range, increasing ID range by a factor of 10"); return generateUserID( prefix, length+1 ); /* @@ -118,19 +155,100 @@ public class Library * Add the offset to a random number, to create a floor to the ID range. */ - if ( uuidSet.contains( uuid ) ) + if ( customerMap.containsKey( uuid ) ) // Previously uuidSet.contains, replaced to de-dupe held data. { generateUserID( prefix, length ); // If the ID generated is already contained in the hashset, the method should be called again. } - - uuidSet.add( uuid ); // Add the UUID to the hash set so it cannot be returned from this method more than once. + + /* No longer needed, as we add the user and the ID to the customerMap when storing. + * uuidSet.add( uuid ) + */ return uuid; } + /** + * Generate IDs End + */ + + /** + * Print Object Details Start + */ + + /* + * Prints to the terminal, in a human-readable format, library reservation in the itemList + * + * Contains a marker at the start and end to visualise in terminal output. + */ + public void printLibraryReservations() { + System.out.println( "Reservation Details Start" ); + for ( LibraryReservation reservation : libraryReservationMap.values() ){ + System.out.println("---------------"); + reservation.printDetails(); + } + System.out.println( "---------------\nReservation Details End\n" ); + } + + /* + * Prints to the terminal, in a human-readable format, all items in the itemList + * + * Contains a marker at the start and end to visualise in terminal output. + */ + public void printAll() + { + System.out.println("\n\nItem Details Start"); + for( LibraryItem item : itemsMap.values() ) + { + System.out.println("---------------"); + item.printDetails(); + } + System.out.println("---------------"); + System.out.println("Items Details End\n\n---------------\n\nUser Details Start\n"); + for ( LibraryUser user : customerMap.values() ) + { + System.out.println("---------------"); + user.printDetails(); + } + System.out.println("---------------\nUser Details End\n"); + printLibraryReservations(); + } + + public void printDiaryEntries( String start, String end ) + { + diary.printEntries( DateUtil.convertStringToDate( start ), DateUtil.convertStringToDate( end ) ); + } + + /** + * Print Object Details End + */ + + /** + * Write Files Start + */ + + /* + * Write all current library reservations to a file specified by the user. + */ + public void writeLibraryReservationData() + { + try { + Frame frame = null; // Initialise null frame + FileDialog fileBox = new FileDialog( frame, "Save", FileDialog.SAVE ); // Initialise file dialog box to save written data. + fileBox.setVisible( true ); + PrintWriter writer = new PrintWriter( new File( fileBox.getDirectory() + fileBox.getFile() ) ); + + for ( LibraryReservation reservation : libraryReservationMap.values() ) { + reservation.writeData( writer ); + } + writer.close(); + } + catch( IOException e ) { // Catch any IO Exceptions that may occur from improper file selection. + System.err.println( "Caught IOException: " + e.getMessage() + "\nAn I/O Exception has occurred, please check file is readable and correct format." ); + } + } + /* * A method to output all user data to a file using a fileDialog to specify file location. * - * Note: Potentially could implement the HashSet made for GenerateUserID to avoid unnecessary recursion. */ public void writeUserData() { @@ -140,6 +258,7 @@ public class Library fileBox.setVisible( true ); PrintWriter writer = new PrintWriter( new File( fileBox.getDirectory() + fileBox.getFile() ) ); // for ( LibraryUser user : userList ){ + writer.println("[Library User data]"); for ( LibraryUser user : customerMap.values() ) { user.writeData( writer ); } @@ -150,20 +269,37 @@ public class Library } } - /* - * Prints to the terminal, in a human-readable format, all items in the itemList - * - * Contains a marker at the start and end to visualise in terminal output. + /** + * Write Files End */ - public void printAll() + + /** + * Read Files Start + */ + + /* + * Read Library Reservation Data from a file specified by the user. + */ + public void readLibraryReservationData() { - System.out.println("\n\nStart Detail Print"); - for( LibraryItem item : itemsMap.values() ) - { - System.out.println("---------------"); - item.printDetails(); + try { + Frame frame = null; // Initialise null frame + FileDialog fileBox = new FileDialog( frame, "Load", FileDialog.LOAD ); // Initialise file dialog box to save written data. + fileBox.setVisible( true ); + Scanner reservationScanner = new Scanner ( new File( fileBox.getDirectory() + fileBox.getFile() ) ); + while ( reservationScanner.hasNextLine() ) + { + Scanner detailScanner = new Scanner( reservationScanner.nextLine() ).useDelimiter(","); + LibraryReservation reservation = new LibraryReservation(); + reservation.readData( detailScanner ); + storeLibraryReservation( reservation ); + detailScanner.close(); + } + reservationScanner.close(); // Close Scanner + } + catch( IOException e ) { // Catch any IO Exceptions that may occur from improper file selection. + System.err.println( "Caught IOException: " + e.getMessage() + "\nAn I/O Exception has occurred, please check file is readable and correct format." ); } - System.out.println("End Detail Print\n"); } /* @@ -184,7 +320,7 @@ public class Library Scanner fileScanner = new Scanner( new File( fileBox.getDirectory() + fileBox.getFile() ) ); String typeFlag = "book"; // Set a default flag to support legacy files. - while( fileScanner.hasNextLine() ){ + while( fileScanner.hasNextLine() ) { String lineItem = fileScanner.nextLine(); @@ -211,54 +347,116 @@ public class Library } - // Could be a switch case to be more efficient + // Unfortunately cannot use switch case with string comparisons in Java 8. // Check current flag for data processing. else { + Scanner detailScanner = new Scanner ( lineItem ).useDelimiter(","); // Create a new scanner to grab the values in a comma separated list + LibraryItem item = null; // Initialise LibraryItem object. Java compiler was being cautious here, so I have to assign the value null. if ( typeFlag.equals( "book" ) ) { // Process Book Data - Scanner detailScanner = new Scanner ( lineItem ).useDelimiter(","); // Create a new scanner to grab the values in a comma separated list - LibraryItem book = new Book(); - book.readItemData( detailScanner ); - storeItem( book ); // Store the new LibraryItem in the itemList + item = new Book(); } else if ( typeFlag.equals( "periodical" ) ) { // Process Periodic Data - Scanner detailScanner = new Scanner ( lineItem ).useDelimiter(","); - LibraryItem periodical = new Periodical(); - periodical.readItemData( detailScanner ); - storeItem( periodical ); + item = new Periodical(); } else if ( typeFlag.equals( "cd" ) ) { //Process CD Data - Scanner detailScanner = new Scanner ( lineItem ).useDelimiter(","); - LibraryItem cd = new CD(); - cd.readItemData( detailScanner ); - storeItem( cd ); + item = new CD(); } else if ( typeFlag.equals( "dvd" ) ) { //Process DVD Data - Scanner detailScanner = new Scanner ( lineItem ).useDelimiter(","); - LibraryItem dvd = new DVD(); - dvd.readItemData( detailScanner ); - storeItem( dvd ); + item = new DVD(); } else if ( typeFlag.equals( "user" ) ) { //Process User Data - System.out.println( "User: " + lineItem ); - Scanner detailScanner = new Scanner ( lineItem ).useDelimiter(","); LibraryUser user = new LibraryUser(); user.readData( detailScanner ); storeUser( user ); + continue; } else if ( typeFlag.equals( "generic" ) ) { // Output unaccepted lines to terminal System.out.println( lineItem ); + continue; } + + item.readItemData( detailScanner ); + storeItem( item ); + detailScanner.close(); } } + fileScanner.close(); } catch( IOException e ) { // Catch any IO Exceptions that may occur from improper file selection. System.err.println( "Caught IOException: " + e.getMessage() + "\nAn I/O Exception has occurred, please check file is readable and correct format." ); } } + + /** + * Read Files End + */ + + /** + * Other Methods + */ + + /* + * Create a reservation to allow a user to reserve an item from the library. + */ + public boolean makeLibraryReservation( String userID, String itemCode, String startDate, int noOfDays ) + { + if ( !customerMap.containsKey( userID ) ) + { + System.out.println( "User does not exist" ); + return false; + } + if ( !itemsMap.containsKey( itemCode ) ) + { + System.out.println( "Item does not exist in library" ); + return false; + } + if ( !DateUtil.isValidDateString( startDate ) ) + { + System.out.println( "Date is not valid" ); + return false; + } + if ( !(noOfDays > 0) ) + { + System.out.println( "Reservation must be more than 0 days" ); + return false; + } + + + Date start = DateUtil.convertStringToDate( startDate ); + /* + * Unneeded, since addReservations returns any item currently on loan. Dates do not need to be checked for every day in loan. + * Date end = DateUtil.incrementDate( start, noOfDays-1 ); + */ + String rID = generateReservationNo(); + LibraryReservation reservation = new LibraryReservation( rID, itemCode, userID, startDate, noOfDays ); + /** Instead of the following For loop, I could've implemented + * Arrays.asList( diary.getReservation( start, end ).contains( reservation ) + * Although this would've been easier, this implementation is more in the scope of what we have learned. + **/ + for ( LibraryReservation diaryReservation : diary.getReservations( start ) ) + { + if ( diaryReservation.toString().equals( reservation.toString() ) ) + { + return false; + } + } + + storeLibraryReservation( reservation ); + return true; + } + + public void deleteLibraryReservation( String reservationNo ) + { + if ( libraryReservationMap.containsKey( reservationNo ) ) + { + diary.deleteReservation( libraryReservationMap.get( reservationNo ) ); + libraryReservationMap.remove( reservationNo ); + } + } } diff --git a/Semester 2/Programming 2/Project/Part 2/LibraryItem.class b/Semester 2/Programming 2/Project/Part 2/LibraryItem.class index 37afb76007e7047316f1a0ad58beb7f12d34bf7a..3755f8a1326f62b78d6887aa670f598d1c2ec9e6 100644 GIT binary patch delta 189 zcmbO(JY9H0GAkqZaz4BGVU+$nypB$wxUlB-0sK7%~|688R897_t~N7_u467;+d~81g2k HaT)>uRFNw# delta 189 zcmbO(JY9H0GAkqRVU^$nyvDBx!2fXalMvcI&j>?Ug)V%5Id3&X9z$nn{ zlv{IyF$2Y+^#T6hP2tdG196RNbJ49iQ;o$r$Dgt1s)Up&dS$zM+4fyIhnMkS!6l%r z#iBds+y2U>cJ7268xoJHz|(nCZ|Kl^Xa=k$mL3sU`Lpp>y2Iz zr7QBuKPi3_O3gPgpnZ0zFtG2~742qQ=tdQ^RJLoi(8~LRwU66q;y_QmJ zplT#IPp#mTBf&+n9Vb4dT5guShF^BhxzgtC>pM9j1h()bMl3vrtcAyA*@tWro`og6 zYhgbQSa<>lY2V5A@rGNiIKBlRLS0&p;;AG83k@uj5|KJ)HQ`QVNeNT($qE_eXqu8x zwvd-Y#*~rZx5Y)LR^~vRpwnBp%{rL*hOZ`1u6(Q*=*?C*GfBK>;eAXHz~Ll5uy6+x z7CyvC5+7OkSO9%u;ZxZ^v+z0Y3g6dJnmuV}H$8X5DFl00Rvw(R&UxQzLX zCtnO4=+?9d%|wgClCYPSoLa@ekw@!C9+9xDG>l*>t<+gH4xZN_vW~eRD#u==!Hy87 z1fKCq3tkg(8*7`JT?clM#924UZAAU5O3iuHaSbHZlvnvgKKxyeG&`lfbH83~)E5kF zQC^~x$k(an+-7FclvS>LvwqJL6WJ$W!wm?Gf;qL~}iymP( zr5+)<+R1aZlj3S8%enW#;6My1F5U`krUXkZVOaiYB}-nSw-^{S_O-Ael|tyNa|~%i=xLr)3p& zicDfl=pAj6xQCwv389WmKHroRBH1BolUl5qod2+ZT z_w72ALKMmhQ7AVNg-1c8!0Z@a!_GFKO{#Ur@Csf)5yusnZ8~79?UVd#^BmzAc%HyD ztnaBKu*Qe~!kHX>?pnicVO~p&wZ(W-45=9EJiuT`$(ZVtrsQdsXbhY2BFTA%uliY* zVw`I}f^EEoZJfA|6VnM|A>sa^qJfhw;GuBYf=(eVuFhIveJg z&JAlqcDnn9|GK}8xJ$RvO!E!Y&|c=q=w`J`#sP@Du)1VF5ZaFsU(u4uD=BFfRFhu) E4xrN-+qX`hxo<5&Y8ThH$8vH^l_OBlDfX#uJ8?~IPUJd9rLUsNK}#b)OKutOHi#iTHsx|T%j!}wR&LVWEIG)1d@P~?X z;Gm9Dl!9gU+^*NOp4%+a?5GawJbs<>w5d~uvO4K(#wnYo`#L?KhdNErq)s`y#3GOA zh*ky*wA(ngn!X_P2;yVB8VA@BK~qiFIkh~no~evw1oB5u;(dCFhh6= zCMi$wlqV?46D)CN2~=qcwt%Nkh*xng8{bJ7>A4!4yae%s%3Dx~1y + + + + + + +DateUtil + + + + + + + + + + + + +
+ +
+ +

+Class DateUtil

+
+java.lang.Object
+  extended by DateUtil
+
+
+
+
public class DateUtil
extends java.lang.Object
+ + +

+A class DateUtil with the following methods for dealing with dates. + + public static String convertDateToLongString(Date date) + public static String convertDateToShortString(Date date) + public static Date convertStringToDate(String dateString) + public static int daysBetween(Date startDate, Date endDate) + public static Date incrementDate(Date date, int noOfDays) + public static boolean isLeapYear(int year) + public static boolean isValidDateString(String dateString) + public static Date nextDate(Date date) +

+ +

+

+
Author:
+
D E Newton
+
+
+ +

+ + + + + + + + + + + +
+Field Summary
+static java.text.SimpleDateFormatdateFormatter + +
+           
+  + + + + + + + + + + +
+Constructor Summary
DateUtil() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+static java.lang.StringconvertDateToLongString(java.util.Date date) + +
+          Converts a Date object to a corresponding String in + the long date pattern style "Saturday, 25 March 2023".
+static java.lang.StringconvertDateToShortString(java.util.Date date) + +
+          Converts a Date object to a corresponding String in + the short date pattern style "25-03-2023".
+static java.util.DateconvertStringToDate(java.lang.String dateString) + +
+          Converts a string in the short date pattern style "25-03-2023" + to a corresponding Date object.
+static intdaysBetween(java.util.Date startDate, + java.util.Date endDate) + +
+          Calculates the number of days between two given dates, startDate and endDate.
+static java.util.DateincrementDate(java.util.Date date, + int noOfDays) + +
+          Given date, a Date object, and noOfDays, an int, the method returns + a Date object corresponding to noOfDays later than date.
+static booleanisLeapYear(int year) + +
+          Given year, an int, the method checks to see if the year + is a leap year.
+static booleanisValidDateString(java.lang.String dateString) + +
+          Given dateString, a String, the method checks to see if string + corresponds to a valid shortDatePattern.
+static java.util.DatenextDate(java.util.Date date) + +
+          Given date, a Date object, the method returns + a Date object corresponding to the next day.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+dateFormatter

+
+public static java.text.SimpleDateFormat dateFormatter
+
+
+
+
+ + + + + + + + +
+Constructor Detail
+ +

+DateUtil

+
+public DateUtil()
+
+
+ + + + + + + + +
+Method Detail
+ +

+convertDateToLongString

+
+public static java.lang.String convertDateToLongString(java.util.Date date)
+
+
Converts a Date object to a corresponding String in + the long date pattern style "Saturday, 25 March 2023". +

+

+
Parameters:
date - a Date object +
Returns:
a String, containing a long date pattern
+
+
+
+ +

+convertDateToShortString

+
+public static java.lang.String convertDateToShortString(java.util.Date date)
+
+
Converts a Date object to a corresponding String in + the short date pattern style "25-03-2023". +

+

+
Parameters:
date - a Date object +
Returns:
a String, containing a short date pattern
+
+
+
+ +

+convertStringToDate

+
+public static java.util.Date convertStringToDate(java.lang.String dateString)
+
+
Converts a string in the short date pattern style "25-03-2023" + to a corresponding Date object. + + Any leading or trailing spaces are first removed from the date string. + The String parameter that represent a date as a string must be in the + format dd-mm-yyy (e.g. 25-03-2023 or 25-3-2023) where dd represents + one or two digits representing the day in the month, similarly for + mm representing the month in the year and yyyy represents the four + digits for the year. + + A RuntimeException is thrown if the date string is not recognised as + a valid date. Such exceptions do not need to be caught or thrown as + they are unchecked exceptions, but can be caught if necessary. +

+

+
Parameters:
dateString - a Date object +
Returns:
the Date object
+
+
+
+ +

+daysBetween

+
+public static int daysBetween(java.util.Date startDate,
+                              java.util.Date endDate)
+
+
Calculates the number of days between two given dates, startDate and endDate. + + If startDate is after endDate then the number of days returned will be negative. +

+

+
Parameters:
startDate - a Date object
endDate - a Date object +
Returns:
an int, number of days between the dates
+
+
+
+ +

+incrementDate

+
+public static java.util.Date incrementDate(java.util.Date date,
+                                           int noOfDays)
+
+
Given date, a Date object, and noOfDays, an int, the method returns + a Date object corresponding to noOfDays later than date. + + If noOfDays is negative, the resulting Date object will be before date. +

+

+
Parameters:
date - a Date object
noOfDays - an int +
Returns:
a Date
+
+
+
+ +

+isLeapYear

+
+public static boolean isLeapYear(int year)
+
+
Given year, an int, the method checks to see if the year + is a leap year. +

+

+
Parameters:
year, - an int +
Returns:
a boolean, true only if the year is a leap year.
+
+
+
+ +

+isValidDateString

+
+public static boolean isValidDateString(java.lang.String dateString)
+
+
Given dateString, a String, the method checks to see if string + corresponds to a valid shortDatePattern. +

+

+
Parameters:
dateString, - a String +
Returns:
a boolean, true only if the dateString is a valid pattern
+
+
+
+ +

+nextDate

+
+public static java.util.Date nextDate(java.util.Date date)
+
+
Given date, a Date object, the method returns + a Date object corresponding to the next day. +

+

+
Parameters:
noOfDays - an int +
Returns:
a Date
+
+
+ +
+ +
+ + + diff --git a/Semester 2/Programming 2/Project/Part 2/doc/Diary.html b/Semester 2/Programming 2/Project/Part 2/doc/Diary.html new file mode 100644 index 0000000..4f33bfd --- /dev/null +++ b/Semester 2/Programming 2/Project/Part 2/doc/Diary.html @@ -0,0 +1,220 @@ + + + + + + + +Diary + + + + + + + + + + + + +
+ +
+ +

+Class Diary

+
+java.lang.Object
+  extended by Diary
+
+
+
+
public class Diary
extends java.lang.Object
+ + +

+A class Diary that represents a "diary" of library item reservations. + + The diary is structured as a Map of entries in which each entry corresponds + to a specific day. As the map is not accessed in a sequential fashion, it + doesn't matter whether the actual map class is a TreeMap or a HashMap. +

+ +

+

+
Author:
+
D E Newton
+
+
+ +

+ + + + + + + + + + + +
+Constructor Summary
Diary() + +
+          Constructor for objects of class Diary
+  + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidaddReservation(LibraryReservation itemReservation) + +
+          Method for adding a reservation to the diary.
+ voiddeleteReservation(LibraryReservation itemReservation) + +
+          Method for deleting a reservation from the diary.
+ LibraryReservation[]getReservations(java.util.Date date) + +
+          Accessor method for returning all reservations that have entries + in the diary for a particular date.
+ voidprintEntries(java.util.Date startDate, + java.util.Date endDate) + +
+          Method for displaying the reservations between specified dates.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Diary

+
+public Diary()
+
+
Constructor for objects of class Diary +

+

+ + + + + + + + +
+Method Detail
+ +

+addReservation

+
+public void addReservation(LibraryReservation itemReservation)
+
+
Method for adding a reservation to the diary. +

+

+
+
+
+
+ +

+deleteReservation

+
+public void deleteReservation(LibraryReservation itemReservation)
+
+
Method for deleting a reservation from the diary. +

+

+
+
+
+
+ +

+getReservations

+
+public LibraryReservation[] getReservations(java.util.Date date)
+
+
Accessor method for returning all reservations that have entries + in the diary for a particular date. +

+

+ +
Returns:
an array of reservations, or null if no entry for that date
+
+
+
+ +

+printEntries

+
+public void printEntries(java.util.Date startDate,
+                         java.util.Date endDate)
+
+
Method for displaying the reservations between specified dates. +

+

+
+
+
+ +
+ +
+ + + diff --git a/Semester 2/Programming 2/Project/Part 2/doc/Library.html b/Semester 2/Programming 2/Project/Part 2/doc/Library.html new file mode 100644 index 0000000..ff54237 --- /dev/null +++ b/Semester 2/Programming 2/Project/Part 2/doc/Library.html @@ -0,0 +1,174 @@ + + + + + + + +Library + + + + + + + + + + + + +
+ +
+ +

+Class Library

+
+java.lang.Object
+  extended by Library
+
+
+
+
public class Library
extends java.lang.Object
+ + +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Library() + +
+           
+  + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidprintAll() + +
+           
+ voidreadData() + +
+           
+ voidwriteUserData() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Library

+
+public Library()
+
+
+ + + + + + + + +
+Method Detail
+ +

+printAll

+
+public void printAll()
+
+
+
+
+
+
+ +

+readData

+
+public void readData()
+
+
+
+
+
+
+ +

+writeUserData

+
+public void writeUserData()
+
+
+
+
+
+ +
+ +
+ + + diff --git a/Semester 2/Programming 2/Project/Part 2/doc/allclasses-frame.html b/Semester 2/Programming 2/Project/Part 2/doc/allclasses-frame.html index 7555051..44570b1 100644 --- a/Semester 2/Programming 2/Project/Part 2/doc/allclasses-frame.html +++ b/Semester 2/Programming 2/Project/Part 2/doc/allclasses-frame.html @@ -2,13 +2,13 @@ - + All Classes - + @@ -22,7 +22,7 @@ All Classes - diff --git a/Semester 2/Programming 2/Project/Part 2/doc/allclasses-noframe.html b/Semester 2/Programming 2/Project/Part 2/doc/allclasses-noframe.html index 0ed21b1..a70f196 100644 --- a/Semester 2/Programming 2/Project/Part 2/doc/allclasses-noframe.html +++ b/Semester 2/Programming 2/Project/Part 2/doc/allclasses-noframe.html @@ -2,13 +2,13 @@ - + All Classes - + @@ -22,7 +22,7 @@ All Classes
Book +DateUtil
- diff --git a/Semester 2/Programming 2/Project/Part 2/doc/constant-values.html b/Semester 2/Programming 2/Project/Part 2/doc/constant-values.html index 82e3e81..30ce2ab 100644 --- a/Semester 2/Programming 2/Project/Part 2/doc/constant-values.html +++ b/Semester 2/Programming 2/Project/Part 2/doc/constant-values.html @@ -2,13 +2,13 @@ - + Constant Field Values - + diff --git a/Semester 2/Programming 2/Project/Part 2/doc/index.html b/Semester 2/Programming 2/Project/Part 2/doc/index.html index b4acacd..94e8ba4 100644 --- a/Semester 2/Programming 2/Project/Part 2/doc/index.html +++ b/Semester 2/Programming 2/Project/Part 2/doc/index.html @@ -2,7 +2,7 @@ - + Generated Documentation (Untitled) @@ -23,7 +23,7 @@ Generated Documentation (Untitled) </HEAD> <FRAMESET cols="20%,80%" title="" onLoad="top.loadFrames()"> <FRAME src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)"> -<FRAME src="Book.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes"> +<FRAME src="DateUtil.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes"> <NOFRAMES> <H2> Frame Alert</H2> @@ -31,7 +31,7 @@ Frame Alert</H2> <P> This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. <BR> -Link to<A HREF="Book.html">Non-frame version.</A> +Link to<A HREF="DateUtil.html">Non-frame version.</A> </NOFRAMES> </FRAMESET> </HTML> diff --git a/Semester 2/Programming 2/Project/Part 2/doc/logfile.txt b/Semester 2/Programming 2/Project/Part 2/doc/logfile.txt index a92397d..a9eba20 100644 --- a/Semester 2/Programming 2/Project/Part 2/doc/logfile.txt +++ b/Semester 2/Programming 2/Project/Part 2/doc/logfile.txt @@ -23,13 +23,16 @@ UTF-8 /usr/share/bluej/bjdoclet.jar -doclet bluej.doclet.doclets.formats.html.HtmlDoclet -/home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/Book.java +/home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/DateUtil.java <---- end of javadoc command ----> -Loading source file /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/Book.java... +Loading source file /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/DateUtil.java... Constructing Javadoc information... -Standard Doclet version 1.8.0_392 +Standard Doclet version 1.8.0_402 Building tree for all the packages and classes... -Generating /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/doc/Book.html... +Generating /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/doc/DateUtil.html... +/home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/DateUtil.java:224: warning - @param argument "year," is not a parameter name. +/home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/DateUtil.java:238: warning - @param argument "dateString," is not a parameter name. +/home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/DateUtil.java:259: warning - @param argument "noOfDays" is not a parameter name. Generating /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/doc/package-frame.html... Generating /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/doc/package-summary.html... Generating /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/doc/constant-values.html... @@ -39,3 +42,4 @@ Generating /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2 Generating /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/doc/allclasses-noframe.html... Generating /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/doc/index.html... Generating /home/boris/OneDrive/Computer Science Year 1/Semester 2/Programming 2/Project/Part 2/doc/stylesheet.css... +3 warnings diff --git a/Semester 2/Programming 2/Project/Part 2/doc/package-frame.html b/Semester 2/Programming 2/Project/Part 2/doc/package-frame.html index c832d17..de7f41a 100644 --- a/Semester 2/Programming 2/Project/Part 2/doc/package-frame.html +++ b/Semester 2/Programming 2/Project/Part 2/doc/package-frame.html @@ -2,13 +2,13 @@ <!--NewPage--> <HTML> <HEAD> -<!-- Generated by javadoc (build 1.8.0_392) on Thu Feb 29 11:54:14 GMT 2024 --> +<!-- Generated by javadoc (build 1.8.0_402) on Thu Mar 21 22:06:18 GMT 2024 --> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE> <Unnamed> - + @@ -24,7 +24,7 @@ Classes 
-Book
+DateUtil
Book +DateUtil
diff --git a/Semester 2/Programming 2/Project/Part 2/doc/package-summary.html b/Semester 2/Programming 2/Project/Part 2/doc/package-summary.html index fa693de..e8d3aab 100644 --- a/Semester 2/Programming 2/Project/Part 2/doc/package-summary.html +++ b/Semester 2/Programming 2/Project/Part 2/doc/package-summary.html @@ -2,13 +2,13 @@ - + - + @@ -29,8 +29,8 @@ Package <Unnamed> Class Summary -Book -  +DateUtil +A class DateUtil with the following methods for dealing with dates.   diff --git a/Semester 2/Programming 2/Project/Part 2/nullnull b/Semester 2/Programming 2/Project/Part 2/nullnull index 750a51a..960f224 100644 --- a/Semester 2/Programming 2/Project/Part 2/nullnull +++ b/Semester 2/Programming 2/Project/Part 2/nullnull @@ -1,4 +1 @@ -AB-906182, Smith, Sara, C, Ms -AB-241496, Evans, David, , Dr -AB-769390, Newton, David, E, Dr -AB-396038, Gregson, Brian, R T, Mr +[Library User data] diff --git a/Semester 2/Programming 2/Project/Part 2/package.bluej b/Semester 2/Programming 2/Project/Part 2/package.bluej index 17e5490..30276f6 100644 --- a/Semester 2/Programming 2/Project/Part 2/package.bluej +++ b/Semester 2/Programming 2/Project/Part 2/package.bluej @@ -165,7 +165,7 @@ target8.width=80 target8.x=70 target8.y=10 target9.editor.height=1049 -target9.editor.width=960 +target9.editor.width=1920 target9.editor.x=0 target9.editor.y=31 target9.height=50 diff --git a/Semester 2/Programming 2/Week 10 Revision/Q1.md b/Semester 2/Programming 2/Week 10 Revision/Q1.md new file mode 100644 index 0000000..aea9f5e --- /dev/null +++ b/Semester 2/Programming 2/Week 10 Revision/Q1.md @@ -0,0 +1 @@ +File Input / Output \ No newline at end of file diff --git a/Semester 2/Programming 2/Week 10 Revision/Q3.md b/Semester 2/Programming 2/Week 10 Revision/Q3.md new file mode 100644 index 0000000..a1323f9 --- /dev/null +++ b/Semester 2/Programming 2/Week 10 Revision/Q3.md @@ -0,0 +1,15 @@ +Recursion via factorial function +```java +int fact(int n) + { + int result; + if(n==0 || n==1) + return 1; + + result = fact(n-1) * n; + return result; + } +``` +Since factorial(0) or factorial(1) is just 1, we return 1 in these scenarios +If we have factorial(2), we would do factorial(1)\*2 = 2 +fact(5) = factorial(4) \* 5 = 5\*4\*3\*2\*1 = 120 diff --git a/Semester 2/Programming 2/Week 10 Revision/Q4.md b/Semester 2/Programming 2/Week 10 Revision/Q4.md new file mode 100644 index 0000000..9a61215 --- /dev/null +++ b/Semester 2/Programming 2/Week 10 Revision/Q4.md @@ -0,0 +1,35 @@ +```java +public class IntNode +{ +public int info; +public IntNode next; +} +``` +![](Pasted%20image%2020240319224232.png) +a) Write code to add 50 to the appropriate field of the node pointed to by temp. + +```java +temp.info += 50; +``` + +b) Write code to remove from the list the item after temp. +```java +temp.next = temp.next.next; +``` + +c) Write the code to remove from the list temp. +```java +temp.info = temp.next.info; // Assign the next node's value to temp - this will overwrite temp's value. +temp.next = temp.next.next; // Set the pointer for temp's next node to the node after the value taken for temp - this effectively clones temp.next and replaces temp. +``` + +d) Write code to go through the list and to sum all the values within the list. You may assume the existence of head, a reference to the start of the list. + +```java +IntNode current = head; +int sum = 0; +while ( current != null ) { + sum += current.info; + current = current.next; +} +``` \ No newline at end of file diff --git a/Semester 2/Programming 2/Week 10 Revision/Q5.md b/Semester 2/Programming 2/Week 10 Revision/Q5.md new file mode 100644 index 0000000..7162371 --- /dev/null +++ b/Semester 2/Programming 2/Week 10 Revision/Q5.md @@ -0,0 +1,53 @@ +a) List the order in which the nodes are visited in: +post-order. +![](Pasted%20image%2020240319225420.png) +D,B,F,G,E,C,A + +pre-order +A,B,D,C,E,F,G + +in-order +D,B,F,E,G,C,A + +b) +```java +public class BinTreeNode +{ + public String info; + public BinTreeNode leftChild, rightChild; +} +``` + +```java +public void postTraverse( BinTreeNode node ) +{ + if ( node != null ) + { + postTraverse( node.leftNode ); + postTraverse( node.rightNode ); + System.out.println( node.info ); + } +} +``` + +c) The following method counts the number of nodes in the tree +```java +public int countTree(BinTreeNode t) +{ + int count; + if (t == null) + count = 0 + else + count = countTree(t.leftChild)+countTree(t.rightChild)+1; + return count; +} +``` +![](Pasted%20image%2020240319234142.png) + +countTree(root) +-> count = countTree(t.leftChild) + countTree(t.rightChild+1) +countTree(t.leftChild) +-> return 1, since left and right child null +countTree(t.rightChild) +-> return 1, since left and right child null +count = 1 + 1 + 1 = 3 \ No newline at end of file diff --git a/images/Pasted image 20240312131440.png b/images/Pasted image 20240312131440.png new file mode 100644 index 0000000000000000000000000000000000000000..200c4b848794e3c3a3f09546384ad47a574a0b96 GIT binary patch literal 8974 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 literal 0 HcmV?d00001 diff --git a/images/Pasted image 20240312161927.png b/images/Pasted image 20240312161927.png new file mode 100644 index 0000000000000000000000000000000000000000..07962a13e3842ac738a020cd1e5e77d6ae5f021f GIT binary patch literal 7169 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 literal 0 HcmV?d00001 diff --git a/images/Pasted image 20240312161933.png b/images/Pasted image 20240312161933.png new file mode 100644 index 0000000000000000000000000000000000000000..07962a13e3842ac738a020cd1e5e77d6ae5f021f GIT binary patch literal 7169 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 literal 0 HcmV?d00001 diff --git a/images/Pasted image 20240319160609.png b/images/Pasted image 20240319160609.png new file mode 100644 index 0000000000000000000000000000000000000000..d62f4f1f90a8c7f18dbc64502fe5c7a5f1acf718 GIT binary patch literal 15207 zcmX9_2RxQ*8-L9tL`k6{N(k8@BqMthy|&1Rk`N**5!p#HBde^+ma;R-$VikGWi+Ld z#P@&BcYaQt!|Q#Y=f1D|y8i3AZlI^mNY6n}B9Rz1HB^o8_ay$Uq@%^3C(ixI!(Y@F zl{HQ1@J|4pLnQv6-Am2f%lP~muS<5GjwGjZ=iMEJFP`>vbUb&_`MlRxs%MILks$FR z6;DSyFPHP@xJ_K#9Z4qMj@)9h+`4w2+~T6*lH6j_a-zf+x4N#$^=@|_5{a9nse0VR zH~n*lpZRvPzw752;>*i4Ni?c7ES48kS{Z46yP6gbpF1}+{B-E#10Tb&QC*AAV^(c> zuUu(L3U};?s>uoEFXd))NI0GVW9(>d<}Ri&Lki3F$U+7(9>H%HtOlRK}}Z&z?23w7d}- zO3BK~%6;q@m;J+Ce0+S&bkyaQl{8ts5hW$UH)3M$mX&RlkdQDxbt>ffd$B-%AzQ}6 z?H#k8tUGqxt*O~HH8m9(8L4#coXGxdo4dNYY@MA8-M-`F4Qy=UMn}ncnv08z`4*2TZ~F2f+;*Xd54a!ZmQxFk(j-I_m;mmGBpjKp0;;5bB0G=es_UhM)UjU zadxLqQ*GbAeHRBub4LfA@?B;hA0KA=a9kn(;lmN;LMKJS!^6AA2Ai9eZzd<(tuD{s zRt%I|TU)brcW2br*3RErt=-H~9+sGt6t=SBtE#HX&BH_K?d@Iu=uva_@i5WLzuXx1 z$g$#`Po6y4EA${gpLW}IYMunTgL>(W*S8AojX?= zo_pG`5$|khVG;e}g-*cge1XiBHJKMLUpC=B&yUONWXSEXwzhUJ&AoSzIw2upWwGp; z$LCQgjXWc|aOGml+HDs<_JkYo4>l&0SJ2zfi{b}Sv9b9qyeHy|iUeM!%O+j<`}s(s z#{SPIKMp-GbNTV%^7ckiAXtvsuv?W$^P%T19@K}8#HE_8;hS8!E|Tjg!dg)mZl zUfzMvW7TmkvbsiQX6k`|e;pt#_Z9t0nmTdiFJn_v(_DYMB~|BId^|JCcKS!}vFCkvRZ?#ax{mvO+;f9Nir%cu zTFu;i*MO%SV=+aghJ(ZYbMNYC^!4@ee&WLF2a1b}%bojqaBR6HC2`1h=x8snmeUSy z!};#I#VabxeB#6jhC@afsS-{(HqWle1g*4Yd`=e^T1xkfXK&Az0J+dl#kE6 zv?s@s&CSgx^HQuSNms93%X#`V(@w2!>scjX7PJyvD7(a&#+H^a7g<*cr=H#4{sg4U zdDGiJyzL?@x0N$ddCSdPx29LVzn}E1rK6`e^4o~m%B9SgROx@&*w}b^@%7f9KYtSa zL{oEfS9iCeu`!i`g2Fdnd2w%J^0VE&d)K_dzw&-W%hKVI z&9!9WI7*y(5nNDk@Z8&)yGuVNDqIFUX1kJUvxWu-v+L?Ou3fu^k7gWZEY?=`t6jxJrCAR%(julz$snaB)4DfsDd~4a7O#1I4Gl%24B96u{*G#VzV(n5OMwbb@Ja!U&r^5&Nfz|1!fds zGMqWXxBT;Ge}O(%{w&E?j(>8xExK=Dpyk_C%aEYT_qQD!(;jOp7jWBD=s?B~cB`walZq+E&_;Yte19}LKAvfJK>uaR&6`)N$NjfhitOY( za?ZqJXIAef(l5sVPCFZw3W=!gQpb*E8SX)?_^y20ce2<#>vG=q^ReiFlFHWT@` z^pET5F$EWVWj!?*5r~zhr*f^Qxe*oB{3=hIX#c&6e;H0ck5$vs(#rij*co**EiD=+ z`XQ|wFV1)H^!}lH6t$Kj7!90^t?NhBV|Ry`2!>~5?1|m05QS=xu6>uUo5sw{oNe?E zZLGYa;%Y`lhSuMQl2@g&+2-CnK1kx0m1Q3q8WO&fU+L@bZ$H%>zDvf#_VF01qIqnL zvvEME{^i|;)=`Y|NL3z&U7||7)sL+>@;BxB&?F`%c64<`-MDdsf8V|k7g_fY=!FMJ z6=z;@$43eV3A7Yv*nW4q_S^`ii$RFIsAk)>GIXV+gqw7%H(5v45!S+4-A%;mZI*X zlKHb<^mw}jG`Z&XcG~{_{>ZpEbr%b_Q+A+HHehG_yNB)(D-zd+rfp!McgnY znjv~PD;pb+fWT()R0e;4f8v6A(q+T0{9A3p0CcGp_S{$xB+7^sZ2I72Q+Ic?om$4G z;b4x?NCT|d|AEL|jQk_#$6MdkUt&R{dLG9W);%leq&l~_m|I%P^!v-Z#Xi~>9UYBP zI}XJsBv2@3#o=hQT$=LH>nt!*Slx81+(o$>t6cyE&Jw8);r>k^c37jjvVQF z@xo!%gTnxWmuQU?+=mVwlJl4(9pK}86-u+kdF9*G^1DkD{YeM)Z{I5Vf%ZX#y^{1> za^MhmpqrncR~QI*SLe-p*FXc9ikl|~XlY@fU@Jv78mh6D7JZBQ^37MT2<*d0YMt_M z{ybXQG;_~lvluBpLoMB~V?wj$!g=7QLy~3>F z=iv#Zr>7@dZAyCnx*zj%pOLY#05^BG8kOE{(GZ+zj?aI8PXrBMhjj5lZ>KYkq8>gS^RzJ2>j#y29ku5e$vbjg1<*=+91yLuCA>+$JdrlzJC z+QTQ`WKa$VyWhKa@9MdUr@GN>!Z}X^|Gq-k>TGV#384sA-uG{Hu?(oUv^2KLee6U} zPY-qQc)$q7+vDetmX5(iv@`OOG8z=KpiZ%vA6Q z0P51q^EeMe(sFz`14 z+Ln8dZ4_Ensq)Ph9Sk9*gdOzZt>$s^|P-_-Is1XIn=~qzzAAGEYC7- z*EmZt&>54=#N52l@)>ZJxVU%@+I2!iLPi&X@y zH}mzY{#f<-gQ+_Czb-AES5{Uo4BA+i1Vtd0Su^j|iLteh$2Rt1Sw`zG9UdAUcD-k9 zbv2Nsj0c4gi8<30w#m@SDhBmp_u)kwE6`MY_iSNN(eVox#9HmeK-utO0|SF#wE4S$ zTUAw6yN>z@VX-Gae%y5S>|)gwsTi*y3|$R<{pa0>pWQ&$KhmMH^6&S=>6dq;CV%{) z+q(5RP>K{eNZZ8Jlz0;qU|~rKP26*1k*Ir8qoGo^hlFL#{V?(km~R6ug~vkCVk7=Slbl1x*P(k zf>xgUL^Niv0>`tB^?GriSUv%MekB)|qNU6Ci;GpkVX=?#Ad6^7GBPraO-&Ryi{%d= zhJe4+Sc>?{?*%#^^=^$DW-zz0DSNVDVrG_GS6A1hNv-6Uxc2v+VE~IxVoFMcc8bVU zV+a-C>PWerO0=f#x$!60(YILYeLjZ*1-JhMhC_cf^Wza%w=yxgiqU;9Kff7GJvKJh z!^0!Ep`l@E|KjVitYO~N44Dg*SpiF%L6*LKNIP#o(~$to9a>*sFU~zkU~6={v-<}F zF~G4jhS<)?NV>Q6m$rh*VvOJ_xOqHkEkQ_>ZEU#ENxN=Npm~-*ejL`&pa8ggB8DRz zb3Cl~BfcJ__xwFoQBUD0&W?9W$jFF67Xq$`Y_rFoGcz;X2M?;VJJzbl?VTHMIO@MV zM{)G%(b=8-56lkF?#$MUa`G-hg@I%K`tmLsgTcQ22D|TKNwu7tq;ru;6#DcOn!|}x zr&332H%7yP*8gle>hnp-%}wY-?|-Av7B|TFLG{Yo_vhyIJ|&}d(NR(HSy^$dt*Yrq zFEJ53pwj^x-xXb}#BDHMH#R!j+}cY0=g%L;Ti7~mii%*eGEai-WMjx}nF~Cbm%qr4 zym{lYEbn%NN|5Qp(rmZPr7ydCGLCK{iAqXRr*xZIhp+}w@Run^J&OvmAd~IaR=yLz zd5vigy@kb?PZqOaf(A3tj>6?%7=c^P4i`6J;Rj2-T|;YXWPC4Q2G3WWwXGkWe9jfr zs(q~Z1979Hw^vmxYUK>vdJiix)4h{Qb+z%}oM6i-?YnuCoc- z7QVrt|^@INg4O0%{Ics>(TvMk)7Df+~;U9hrj% zH{konRpaa{Y$Y>veY^=Izq<7@8j z-h$=c!^35#tE(IKv21C{6U0$V_Sv@y;q1)Jy=d&w01Vsr?%i7=czG_O&(v~%4+Q2hPwmjV@5TpDJhZC)6)k9k78#G4Gjs@hGDq{%XRtkWu4oi z6lG7A=;h_*C6}@-aX5}%`Z9^e*@Wv0tDd-0uPgB6_9VLO+{CkEo}QjJ{obZ3;VOjK zc%`H&n=ZP#x(Z?<-Hh9#%Ywa`oSbyZJlxsYx$>p{Yx&vNB3QK3T{i`~*zPNQi3g)3 z?xnBKfH=+r1KZQ2-9yXD%2pdX?)au8BqgaF`?tK^&)+{05WvsZw+|R_Zsg%Ep(oE8c04?3a(5B(Z)b#A(0d=TuNZ>j;lB}HE zD=_aYS!S~&)}1>Ct}$|UfUJ`G@Y6Z`pk(}*uy724dw5UW$lht~8&YcBFdFMxsRFu3 zk&WpgA)Lpub+3H3RlQID+MgdTjlmQ%b8{N2tE;*khBh`?=$jb|mrvF{vlJ=Fy0Utm z6ps<}XJw@?e9O*V@;o^u7S)Ln5t}HoF|1$V7@3aRxKmlzc!XG5S!qI%rDfW!fl@T7 zE|mW9^2kK|g9nEwxXsL7JFW8@72O2rpG!8g-nVt@)>ZU;xtI5huB$4O*&HM}*xM^#{P3cG?!B%>jo19P7|tWH zq&{HwJG=c~?{;Mu6%f#rwHxT|EmPUQTlT^d@jq)8l7=f9iMnZp!YqfvqX$59SP>RF@ z+J)yQo-Y6Sn02WuVFl_JwNiV2qZ2gl?P4YMr0&Hzgl-26=tw@1#((IL3iM7aBb$&piBRPa6t#j*iCy|)`L_1rCV*CVpL!<_2p_E2 z;xIS^L>nPexelk$xW$WIA{{|M+>2}`!y40!#st}>m2^i;#3abm_ zSZ~@J7XhGn=Erfxf#8q5S?ZRSyCJX8f+fX7yPbzvIQ8MfHH_@^V?miNvgDBN*@X%U zSQLaDI_cti-d&%2m^Fz{w;Aw_WzU`%@F%`%m;PX=uXJ0soQ;2H`WjbCh}9%+At9ZQ z=UR2C`m7O6+kps{cd_gBf16RF>;hGni zXC$y~`*zb&r@rjt1LDe#cleLF2J_ww&At}n}2ud5Ohjhd3e z{`6@(N5>)C!03J15QYt4XObgS+d6|s`;e0m}4zs%34 zmmYb@taK84tf8ZG)m-QV6!JRnMcRW056W+>{qUU%-`NKdGI<%8%np-N#`haHnA0o% zQ0vFE#ej~!zA{3>!Vf*Bl#>N%f-y_o-qlq$IeFIZhAe~rD=H=BUJ<9UpE9MJhDE^1 z@Yt2LUBCh1=nQ~9ro(r+p^^ihs^N{K-A4LEniA#c>)eze7(u?KBn1Qnn2b;K^e~k* z{37S}2CYnO>X=>Pd+kjKrsYn(djZa~v54Q6mO^1ZfF%(MBpN7>m>A2mf4|bYzT4tG zJibjHm%p-B(_eRn@it&Gv7t*dogO|uCySIxyTlzda>I69SCt7^5xuH>cd7Q%1i!L2 zhS@%G@on(ha49GJ{A#;?ZrJeY-l5*IWy{;Aft(m=d!)+~`TAz9`!GjmW@np#5=(xR z>Srmg{2DvY8MqD_rX-Sbq*kv9%B|ShVIi1JmB+RHX1jL0$W-72o<0agq|j5`R88I_ znW3;I(8O|&i6buUw!EKbSZ}G#vshq*BYzJF_+kn_U0*#*a<2M&(iDq6H9Z}QGw-2uzC_*oGUh=V1MTeM;ufGc%X%M1`-kSUo?5vlQBytOnUcc?C4%j$V5*R=c>>Z%<*Jtx~`j1G1r<>vB|q!?Ge zdQATZ;9;1NNT*Mqj!Aw%$NQY4{C$p$rs?NTeUexdg7E0@wLk(kG&75U z_w00M(n0i^aP&A&s|YuWu`O+Jqi+}syL*G_semI=4EOx~_1XBt`@*ua=Ro8S?OJFn zyDxfqnVg9Hd#R%Oj7{sM6I5VvlyhsegR@SJ;9?|a@sHP}_wm5VsHv&RMvv-v`LYca z(ARwS2bh3Ow@-`cvsSx%v{4Xb2533E(Bc|=ra^O-fgsEGsf|A z(B`3q3}F!wT9PBPE6vL)0??93FjkWfEf(^JRtmvDs%LZdP8k6p7H-ADWP0n0u??6qVq)*TB>{p5c3v2_n_F@!$IhXXpHu zkdjKaJHW^eh(P)&!hp|1D-Mf}*3MlE>y@}oePZUT(Om*9y6EXi%IXTDEdjD& zkfUSXk|5-+!G#Rdir_mMhlUdRXPuNV7vVVH&CVu41>yKxg3`2D(}TtI5Xe&}U4{kI zGz^FdedXHnve#~TUuKXWbf^~SQKqF97etN>`Q@5YLECNV>RL$Ma}=iN%1n|zY3*>J zDVco7lPwHlq4fFjV$Xk3Y~_zR4N@$WAi~tt)(S|Nx-3-tf3AED+4J=$e_meR8(hcs z>SxL~#T{FZ?CR2D*0b0{K_YQf6IlQj2&i`M?lI7!2_KlzI;Z*;v|5tELmHDO-_5+W z47EY6gsh*eq*e!Gb}`o7{rB%5#ah`}a)x9(yoN5eas|(XOZ&b4urrgumBY~g2^SoO z+@Qw#bEseU+kSrd@L>gR;)TUwVZxFEvnPD)s;YMM=&8lUu|ldmsSXEmLR|?^d^VpR z@lx$9u+Dx~`XY2fxt$631t6=?kv4}b~(Hqd2Xks+5x}I{R@j~vnQ?;lI+VXEE$`v zuF#q=v$Ed%(f{eyz`%utK>=SsKdG_Hqd63C4W{0|4}+yC=p?Yn1N-DSd@OX|$;HL) zigX|K*I5)H1wS;ctgJwh;~>0<0ST}sbz=BWeERWTqGcN`4b5GP>T~GB8r+t4CqEuj7zie&OH$HyR65gj z)f~fwQEm|tCV;X~d^2A!qpM>knH0|OP{SExbKBEa3-hRZv* z>=bePZrUZm=zRWs9F}DN!Gos(bD(E%>=?_O`S8IW5Ra5uHKU_{p`R_|E)8|&wJny9 z&oC0!w)f&m!V!1TEFoUC0ug2M%a>TSXtv5H7tYohy`P@$Xlo0Hr$3L`%keqi{V?Q7 z=YOj||1r znP9p&F#Y-RF&@*cn;q*GU~yF3c8}Bq0aQiVaqo>&x2SS+8B!EF33M2=ZQu6DvvxBXDr)VgZpdkl5_-))7 z47&BCpd3Ga~Nfhb^35?nQKWh#OosSqj)Kr)RWLk<{8HKU3( zzy&|_WM~5gvT||hrw@k?7u8J9_#H=j+ptbLt2&za)Ma4N2o+aVLbc#&gMq2$Ew9!46 zVealOOz^a`Weq1t&Oo88?CeEG?1G%}k^C|;=6**#CL1XbT3KMtH3XM&Avjp@N`NBG zrcFowW0izo0(0F39zR5}5+-jJ!wA?C+ag*F6%R^PBK6P*U$C)a&(O;ETN?X z#3|9x(8N^veayIoNgPA!1LY8qm96dnaqhCQxw(c@Px?L^8=Gm*T1lTz=I|z-bj=nz zD)HpRDXvCBH=rZAzj+jn<}xIF|E0YDa^$%GqA;Zr`MqUoRCiKSivqldr8PA*mqEr8VX6_dR`}fIm2Y;?jCn|sh!O#Z z4|E9^K@Pw~8m;p_gnsJj<#mr{3!4ElL*&^acU%x!Ndn3Wm3|{9m-IZpKpPM&53v|ApnU0^EI~c%P;PBzHk~YO8Fi7~x z_aGQ2DRF0md%^llBs=br_l?Ifny>wsnG41M!K%M}^p_KEr^~5fqaN<(0LrGlqLoiT zL?j=&aN@IP#}Jf=0Uj-VweI5LvJ8BigpSJ2!SMaCdv3yA2#<=#h%i0h-=b_Sh z0d*4wQfGgE0@QeCXuQkNTq}y)cyidbdsW@a$>CXB9?%~F^@d=d8MN-FlPXRF14O}p zxz9W?2L0c`$w@_s?L7#LjL)ZC_a8hUPz4dn8ixIn^6%S}%BS%LPE3&Jt=G4I?>bc0 z`0kyR)2rKU?d|qBTe`6(C~g9af*mymKl%VQ@Ho!p`pWyQH{dQ{w@eQ)xuZouSTlpD z$$Q`c4JI}=`}x()+eJ^eGXPZvKYtJQNhI4)WBo6DR?W2J+jx?-E=)Dk5UOx<_!h$Q zfI^ReQXEoL4|ZfuZ{)C02?7=#A++_kZ!PEM=bI1#z-qRGuujd)z}zl8Sqpjryi;@e zw+N(TLJJ;z{Tg{3Chc27O-Q1Z7O5yf-ng><#|i4?`yn%%Hdr{`XXq?2R}#|G-#Wi= zK-Me%=FP#o_D>Z3m+7FFG{esihj?g*o}(XWrQr?X3&J*NS~%32`}gk~oI14`xcL8(!|d{MW-J`R5fNp9jc`};UAbM0pFMS>j$Hv$p|6^X`u@5F{!AT8D_oa!A^_?iP^P)^QTc&LL zbJXaVn9dly*#M5Mx%71}6vAsWGY*7DwS`Tn&sTwP_8~j4u(NMY(6|aP2s4=Q>)})( zOcNFp!-&u%;lU&(ZUcRQOV;1 z?l;G)n1&BUtrVEGM z&q8q9_4t&Of;9_6!w|$acd@fKb#>9>)W8AjdWJuC$@_ZLD_*Nequ9aBB4Sw+j3^Qh z5Fzk6(wJt}39LaO1w|d}4d!HW^Z5AQbLYwFit0@rb1x%O56$6 zVG*(BOKR%rDeZjweKh+W<4RCbY3Vi4B6Fc@$c3(R`f_Z4H9l_b_w(W7#{(LwLb}Ym zci+JIYiVnvfz#XqC2KIMXLuY3%@$fY!HnQq+!8wV3ZD|$H(5&SZT)L zg1kHeyAnA`=vcvoev<3Q<;`AlY!KF(%+aF{lI^Z(-V(OBh8}eq+7yu>qNJn*ti6ix zMdgT}$H$&MP-m*OgtW;QRZF6=85zpL^Gg=ANZ+tTg)WPd0gI4zrz4r!kU+7Y0q= zr|^5S#5zDH$blo>I6$ff9MjOyXoTj87X%~IVUubVnYRyFHYLbtp zWHHt)LOd*1hc66R`mX zoJT8MZf0b>Tk!1e?iNr~%(M>puI72+!d={PVqDzTK)9)_+qVyVusaFg&+F5O7~!B0 zu@2bEgmz6>M({hFFHGS46F3@5rj+d3%ZUk_k4~x1R7g1?`Pm=4=O~fn05U(^k3KjL zE9!tq%GhLU0HjK?RD$f$qiHy-&M>|m+}(8%EXzTq8Q~V|=brg|=5T*kmkcxJgr!Id zZc!H}g}2sneC8MS$HC67|I_4otRSJAw}F(J3!SS%TOnmn0>_$C0H;0S|Hy}e{XCOf_0NYG^7AESvAKV%` zmQk@rKouo!ZsJ;>23`&`mwN`CM&ctEWi~d2<^M72t@I$KV4hW280fX$e?~} zNQ9zpiCAd?8UdC@woDnI@npIvDQ4*-Wx5|61gVt&ho})6(&5shf^|h?To8#!Fu2{* z-hK_J5SglA#r2ib!(M{TPd5!RBTfxFR~bwPiUZc;^W;XorD z+3u7TNPGD3Vc0H@OutT6yhL#88v-!7PoM5Zpaly zkeL|^k%}-G5J-SH7hxi(hLA^8RFr|0)w_;(=#wiyU)yjpI(*@WAFvlOdJ#Ci*=1#M zdye|p;vg2!kJ2G4O+XM}dP1KC1?alJFNrZ!K>*&~4A(?Saikk}M2chLXygm~?CT|~~6M$d?uQD}VUGIAqzJZSZ9j97c zShHaM_G7K1vfyPX91U%4BEv`Yr}4{Q#e^T2qVH_N#)rW`CIDQ9F4sG3QU_s+tN<~S zNC0^uXqS2~*`W7|LtDN&GGdMf9OEJ@$9PtWmVh-qS;w{_1_@Lt0l5T-jJRoVpo~t- zF%~>wLV{$fg6tuxY_pk}89bmi?7+?kh2}BkrJH|ps#D_c}*8t@pnH~@6=d`^& zJVrKTTXrH$4=d=@h_!+6W3W*uV7n9*6_LD17w2<5%a7=dn_IEg&lnD=`)?)W|| z5E?B)5GH~(0!~*I>O4#K|)Jk|Mk^YkxeMOMC6-EbMNYp@cx`Ynukc1VHlPN z{`J8#4VASzZNlfsWO7>fLR5KgFd0(PCXxhg08)vHaNJRCYXDIk-GXf&e>BZ{5_uDd z+)P==@8>pE1(Q|#DeG!$T`H}CVjC1vY8&le^hl)zOsA+wGE z?D=v%79&NdVk9D02CE~vtE{+~niP}A^HmGmz=I7SW%d*e@BzLf@YM`>&RJqSbJGUW z7in^^$XJlwAmMT7^Y;RAad|(9--xpOG5SS}7&><{9+sbbCkOSD7`!Bt9+KtBle9=0 z;gmj>-53nsv*o@Tc=F_@Pd5y6PfS5N;5d|mw|f7gFbakoxG?!IrIM$oID`VCkD$aW zyXLxx9lP55Q3aVPkkkL{%-9pQOG8>t=(lWQ;^Lw3Dq#+x2ex;a-aBBtNn5*HI&W)t zPY*3AquUp~GmE0~29MoGi29Oj8$Zx%%<9zwfsm5-h%J0WT#?k*QFupWb1tu8JvWZ+ zK2nA2kYIjZMJf;?hhl&X;nHGy-oBNaR9>A;J~RI+Z}Ph@9=HnD*l!P=w&vnTCOkP2 z0xR3u&Dp{%4B6`MzkaoYN5$W{69rm`CvJ3i%XpAzX=(8Qhdnu}2hZP7prO-~5QmN& zR&R5T0`o{m#0>ga8~kv5*yD0q2NDD#89BLWgr#8Ounl+)PJ@#JII1BpnC5R-FIP;# zPDJD&A{GLL;khqQp}bP=ZPz^@ij0ho+W-3W2It?!oJzbEsV8n`I*+9p%{3$kp*~B2 zE{!1X2w6)E_GU)Z+&iM}FeAgzRdWZzVAFrMJtzqN`W?TLi;-wv;mk7N>BW^l5$5Gc z$cT6`b#T6ZmL9k+o*-gT%eO>4nI8NN&kqGlakt=!FU0w_Q)FKn_lp3>7)ZRcAMgY< zu0fhZA9ld&LZoarP1b*X$_tU3QVH2$Te4nKu~q#oQXd=_XdZa*D1&x5c+b@xhfXq+ zw$X>PvalRSh)zeFhX)ZA9$-;k(jZK-IuN;mM7bTs6i4ZBdtDatn2`vQ98Az?EzGZ| zki?TwWk{wRJvsmdlYMA_9nWutXdv*~*r?>`;lWL+xbXgjmY&{lT`V46(9+Pzer*$! z@t+Dw$W7$e{X1+KM=0JvTJrPrL-GYY7P4pzRNe}sYK{FlNSO>^2RlYaZlmq1B8D)e z_0Eb#dcWGH1A>C|HUZyhfKG^qjf74;qDJsV3EDI9JlpqG)G;{YH+X=H>j8*T9&80WzDG;L@@&i^pBn- z{)&v>B%Z25j^NH64&pcQKnCzWWR)&8ZstaW@G#eOxK5;8ld?UCfI*(2FWR!L@dX&FgELMmiLkq{A)GPC#2 zUf<`@b$|Z){r$ThkNdjru8a5kJdg7@Ua#kRodFtZid#1`ZKj~0*s65uq$UN$niKe+ zKGg>N8};nr3H*c7@wk#U75;LkGV#Zs8J*CzfhG zYwbMpGp#B-Ju%8`prP>o3$s8iz23W=-bdH)u-~ql;t)O@^VZ92+}Nvmj|j`Y^BH{; zuA}G8<32QspOsDf(5M#|8q1-y)0>SdE&64yBpa3Y_nrQixT(BvQu*Rv{(t{Yk-R#5 zlUeL4&7M7~_Vz*)y1KefBTaP7%uhHCIXF2tr0Jf{x!O8fn3NM18>^exV21c&|1@cE^srSCs}EdJ=y($o|b6#Q6QI}w}COI5t=(j0!- z$cR18Yen3;G2OJUI%c>fH!{n*@r_jjPiI%x6Zh~7`PVW%7H8Z>uNYTHi%G!EtzR8=d#V}{9ul3JY`?$HO z3=IuqU3(c{s6J6>FZ7rnNQyg`>tGsr``Gd0YwhjrXA?`j?#0BYo;-OnGBo4WD-J%s zyHCVy+kQA(TUp^J4@kSsoJ_Q8`mw>*)>bV>qV&#|-J=8KJG^oVRMTI*GWqdBwd%2G zkn2=$#Yoqe;1g-OZ*dRGr%zk{c(GN3l_eq~f}4k@_{$gHkUf${mo7a$YObS07Z4C| zFDlB&*!Xr*Qc~xPW@hHf&=le`onaP*`}~(}IF%e*NsQ$B&h7+>qe8AIK3C_(GA8E=; zc>et4=viG|`pPJN2d(QXlmRVhL%(iV;J9my@U|`_r(WB!TUdut*HqC3tf2hl5-k7#}_3BlBYrdFO z*5mbC=q`9wrCp2{X=;$cr z`t_Nf%Qvv~4hjgE|9)f2B6XccU0uE4!v`g0<<9T%Cnm)wr>1_tw@;|%ADeCEY>`4rrN&!fmux~|JFSc+DwN{{6($}pBo4kYYY3Crq6Yu(EWS_htkXR^r$?S zu|wZtrS-}G=TM4JR#twV6z8d@muYkde-!apaH{zEQ#UXuD6-}Qman3!O2u=zUQ1m` zU3&VSww@l3QUr%(mY(JE!gNGdRu(NQtH2!}pHm805`5EvG+kc&zyU6<(-$vZjCk_o zNsHmJuN4(%+_$^AxecUd6yh=>o+Tt4I2MQ-u5)INjE?3@(dIcQBy{F#WlhZkv+C%B zF-Pr>UzN1)^r1YpZ{NPa8ri8T;X3P#57+YJF4Fk;4QHRWMhWS!OWcCZ&3@=m$lToZ zox664J9JZVsmGekPxjz&*!O&;(@i%Bh>zb#5fv51cd_7{eR|nmH);U^f%&YrZ-pBg z8jdZW8tSfyREd>(bbI6W6&VdJZSBu^q^C}u`dD1-trW>wQN!5U(t_fzad+F;Nv-su zfq|5%-0p4@iqf5o*4EZheCLmwnQ?C1#`5(2`-jQN+!XU}D=Ybm3JPsHaqH!-3tnZU zj*N)F2mT4*ioG=c=M(i_DF&s8Qz|MZC_Ln8QZpZ+MmeI8aO!_L=bmx#18v6Y`$H46 zySQ|8bnZQPprxU4?9?g$&i8mukB`_iX&4x&JUL<`h!rcqM=Z)NM{KP*vYLFb(MCmH zem&3q&HMN7&rQST!AV6a5fT-ZPpH+<()!Wgr>dfooSZ!O!*h%G_;|}#lv^y<>lYS4KG}XSt{b? z;kn9q{V~okPT|v9i{zIti+}w(w^A7AKDlYEXjR73)6=Q{`x;|oV^X+dYETJy3U9Mf zeH)9~@wK7h{^!pp3s)Ab>+0&dDYPzLti~a)wGfe7nd>?#A<;Q9@-6*Be)k0)Mn*=; z4I3thGK!9*?84ThW)ktov#I*_ZDMBT%kSTh{Qar6vC7;{Ogw--mGtsuV2q@TrjE|~ zj}573>GtROp6N?$zABJSaaK=ay?9XnXGIa_JrNalIs;48=O|kkDorRL81Bi>imgo*N)(bqFNc* z+IlrM+T4wd+;#QpRs4(2j*d0Q8q+TbiHMlA<~hI5&(}J4?v#N6i%rwJ4iu-qqpi&P z`uZrTqDz&AgrRU3JSN0X{6?fpcbLS3= z;3()q=(8`=fTORF|zCrOl+eW{)IwmM9%Q-T=nZd)u<4Z7eS*CGWck@t3 ziQm*0W?LFMI(alIPEJmh=%YKfY}r!xCJc1*NU;l+gW8`z$b}ejO z1@tkT;dA=>UEST!r>Hd|INrQ@Q(jY(1Qc^rT)b6BacXL+;_KJq`g(11E~S#)N~)^s z2W`)K$p+N2iHhFu>@>SkZ>LutB|ugO%fZyuldY zT6a%R>kI>maOtV6ckk{^PCC3wOLNwhm7>PsCr~7KWse&TFx7NYg`&HMM~_koke8-` z!Cma2pFe+Y_t3}ZoptSfWbPjlqWf;uaTCH=teEDhX*Vv6HJwP{nw-+>?aUSkuJlSyhZ*C#8u?CtC<(nl*#3Knc^ z&3Ab)%O=(%ke`;uZ(A^-5H#<1+04whsHkXZVQGG9xVV`X8gcfzNcX{qqSo~5Hc*F!3W(db&u5NCp-KI8bS65dhtiYEOBMBK98BR09zx{4}+aNA3zLO1=NvZFHy3G7Z2YdVQ;^N}xj~_Fo zyn3bbSj;xI{)H-Y%InwT@zX*Q5_*G8S*dFI<@*kZ1SllLKYO-TQBhICd9c2v)zTig zyT3kV7p^ECz%yB!2U~W~>$AwcfB)?he%tKl#xLW8UHf8O7{nb+99>dN z?XO+?Qdbv|mnVUGdD_#n(8#w?oY1=23V@oqg`tdqpr8bov9`O+Vj;KIZ9KBdXSpT( z@#Da(EKxwDNo60LZ(*a)RIwg2=TR^lUoG$Yq(L)!J0fDI%*veco!@7(f#AjH@ zg3flet)K$ zrcc8D!r^(En_p`ruc#Oq6~*b9(2PbA;kaRQo~D)-bDG*g@5@_^uUtX>HGiDX%&&{~ zzkdDtPO-dT5E{VbT>CBsN0&r-9&T=ncTss%zWgcx0$MLrEJv@tJExZx1wb^x-1-GD zkU_@%DB6n6X!^TTppj^&DoGb8OXy#KbY1*#L)1k~@73$qf@l*ff5ntfonjLgKcCcE zRYkpV<3`ktxuj+hh~-Y4)$Vm;ifU@xw$Sta0eaP> zEWs7VXJoWLzr?`Es06$rP%vJ6d)O+K%R7Gjl(M=y*Wtqvzu%fy+Th-vJ!8K%{7ViT zwy>~pyHtt=8ku=bY+_!XUTu!*lOvfRft)c3hDDxLF_I7Phb;eMrBI$7)OQr4Zrzeg z2+;ZV?HlfA8wh>irHA3+a?mC8(&)v+#9}@s)LQt5h9g)`F(z1Y1I>yLUa9hF`Fy9+2x`|Mfct5>VrS7yZKbM;Z4(bRg; z75ayU(64U;+(0of1~j5DF*VJ^WB(7imjWJh^?2du+r3t$gXsC!4l1Ump3N{@nwz-0 zS6WYIv@gz!lZPj;r}Du%L7OHKnZ;q@i*6&L;?9M3UIFrr#rsb~L_keiRZ>yuMuA@X z`$PTjV8a#&7f%Zx{&*%IM0ALJ1?X=@&nI ztxG)JGvqP#P3%g``yFS`o<;EtLR*$y8o&Kay)nbE4;7J`u~uee>G7iz0Gz%-DHfNk z0cb3*sJJ}U`)$%EC?i7vWry?V(TBL-ScnLmYSHDmo6MY?jf8ovF7?SyzAfL%d}O>z zxMsXok@Yfqt*fheM#1Ffj*booR} zCL+QiB^8Z}+sn$z+LUcmiN1%%AOHGw7(R)}Cmc!~92{Zy@0V^7C}7(yc34czyzaRY zKzin};nGsVuy>B(+yOe3X!Aj!(>^;aAeNqSTx(@{|S=#mZ~w>!&97 z>+0!kK8Dqx>$6~3b0qoID{a2aHFl1U3AXKp!)+g)aK&EthQuZ4I%yK)d-27ZuC~ALk zb#(|z&&+7+mLE{;lG^jdZX8L7l3JD+`pF+DxqpvZF%I7w+1{)Q62;r#jY zfjge3rt+fD0f0^cEDZ9+Rg{-M1wuw`m-%CuG`*8l+O3R-yQ79CAo#h?wz~9)sDaP% z>AmyEMzNphlz*qk@3HW=s|JsJB;PcC=O8b&>;s;K3pQE%>aozrVl5J5M`1J3$#4 znLrAj7DKWVp9>j(5j3lMsL(DfD%u0xOy}L!y;2X`KDb4Ohp(v*-Kz=^Gb@Rw5OLr% z01YY{12{AGslBsv4^Rd$7;x-$6cw^;1qCcvaWHkdtW$rdr(JvQpZ%5V$WAJJ1PI*FZZWX`SbLUsijnz=gOb9B+@VL4g z7Zw&IJ`IP)dM;R!hN7)aiyQbK&EPcde% zbW^k^C-=$$V}~1ka$jfvq@{St{-E#E=d~70X@>ijSh1^OobMK|)>>r+tDOu8zq|$V z@i7SUjxGuEj@Pb5tm;o#eD}3+_`s;c4>K; zZUpq_b4kf(mRieE0$1m6yj>S2CiHKD(uxnwXtU zkH>fM#=wCaGsE*A7kBL4TOBI9l1%0M`}c46#gQB+FDnCmCEEEUSl&E+_702Ig0#ieloI?`U!T$^)jHx6=r19?Ru)M9ynkAlqh z`t92;TdzfCfe(Lof(O1II&ccR-uvm(jEvBPgoJ0&X3zs9uMM+ta8TY?mIp+ENC7-@ zR_z)yBjZ7?ml~-J+S=OVzl=kLAnCaJ?B22C6Z)dMoZK4JKImZmQbm%$2@oPC`4-?K z9JTvHVdyb^-{56D8XI(|$-&eNBb?xxSn1jyKf3-CEa%e;a~`VF`{=&H5eEvKR|lGc z`boI#rd^!n3B{EoYIw||2YURb3!GU295J9qrJ_p^}G7cRh)VTAfM*<_tjF=FUBPxOeY zI9XOa4GyJec)SJ6GtC8aok4hN;O0KKA{4K+gN;*Z`Z*y`?uY>Z(}66Fe)g5iU+*1+ z!YhP!pcW^i3KiTv4JuRaCHi9!MD3lNh_w2*zjobCR?oRLfG-j*qkOE5Z_U*q2)i~G z-65Mgkdc{rsEQMU?wNDvxObO85a;CJIC)6vJ25!`@ql*%b8^INKTOkuF%uFFKnmp% z&PSxRg5RAxmn|(TpmTJ;*$6#oZgFu6dgIr|uT@prCVfJ}!p3Or!_7INc-V1}4nkOE ztKXPb(hjYUiH?TSl8~LPduIN1%70tBx%tUI2xAQ+O;3*r2)`qLtgs8d)C<%+Xs#e1 z?;UyqJEv--rl`TB0JG6gD*pGoi&$!SJ-Gsp=sNwTOV-xBt7D)hgM))k zA&(B5Zf;OZ-DcHr=lBluvZV1@lSnpCq2iJBd~y}qy*;^X6wd4xd-=mRM0 z`)wX~Ka?N5hlgh~03*zla|PFhaCMhEKL@}txnyfwQ=6dJ(}lyMe&)=M0|yQSp6`d6 zHSdMpUvYoES4M}f>*~sKw1jiuj{OSU3hy*lmwtTy+?~F5pZ_LWIU1(RHa7fYYk;3V zx3|YR_ElfDu<%bx;sOd|!&U~-#WE{FjCu6vk<`TJUDSIdXd$bB8&!P!mYANt?IwsU z5KajSMmJ+O_R8_&$GeA^7#RNa_P)@P{8C?k4>kRbaoINF7v5zQc3OxA<@NI`yI^Zc zxBrA3jnn)0?=`fw;q_6XFBHu8K3Q69Uo}JVhQ)cmpg?LH%h8X&GKr90T3fpV-(I-7 z;)d^p`oIA~2%(gKOSBb0rf$HVzM|D-0aQacW4^c`0|SFoYHCp#(iY#@VwCS_c%>Fx z8_{cNX(56@_2P~lJD?-?rx(3tVBCD1SJbgr<%L>IQ$Ku!m8vIV>U$gJvA5dX#xCQ8 zl?LqwEcipd`@Kyf+NE#RWY=S?#bI+b& zKfjHD0w!36$t*6FhaVwxq`Z8o`F8+<{fR_PA^XmgF+8{K-@hL%?&u3iwS9VQpTfWD zUnnxj>Wrm8nLp>5rkhG|(3&-Cy1To9w9sCH+)uwuN-7HyDD=n4O-xMu)!a-JFqG2% z=A4WI^Ixs4G0=)N4rP4Tkh$FdJ$^E4!}h&*Z{1o$Zk|E#*ws*f|BoL(-ZYPORY)oV z)GBFdDX86HtVOhv}tZ>=`l6`W)nFYy=WX7BU4j(KtEAYQHaTP@h3L6 zd98ZH{O-iLA08eCd##hcpmmpey_|)8(>u!&*_Dayxr2Z7Z9jl3dL%G@nx38}>b1Rk z!f~2UujS#Y-WU6@CAbm@1_S|=|JlIMknB#&Rj;_jFEuq|QDtcOmrYF@x~J&r=mz)( zH=wb1`scmR;ZoWe!9m!$RQSy5Po``Zoy_$K|Ca?=37>n==q(~TvWjay>O6Q)Z4uh1 zILaV7X)|?on%J9cXN|3^pg-lJ!Ns`b?Z5+o>7K4s=IiG-G<@X!9!T`)0xmfhtmz&< zo+--8(`oYBLA~k?dF=$8=YkEdK8dxvmw*bsx9jkJwhWaPn6f|nlO13o;fs?)*g5bR z=JN;JiB}mEWL=k8TU!gNu$Z2{pK3Oe%GXN{;w(T_WNhrAoYn%@NXVMIcJ114PGL#2 zbLVjrlWv>JGth%BWKtRd37|N3g)Bxre*6{v-*)kC-z*fN8kcqtt_;atKE3ST9flgm zj!^)Sk;=}`$>}>hd`00d!zYv*x*m~|;$k~z=Tht|sDMUBM>n(9$ac!~pnsHok^n zdC0J^3aXcXKtOn0EgVbG$u9xBxTv;l`H}K!!*s%Nz|7qKd4Ra`Z{KuS09HQ%klb1* z{g9oVZREr)B1x7A7zfU5aI_BPA5?(%d3lH3X0CL0c0xB=^Yq0FU#v@c>cW=In@L?n z`|a)ul{G_aqyQ>8yZ6lA|HM;B#=qWK?t-TA@+A+T)@S%*zq4(a(dOx3bnlmx)E_J6nb@0bH0VfP`|(_O7ljB_*Zs91W<>9RmXuvC?k8@?8WXI5I7N za2`K#f=-eKV(&=0l(SBtdR`W#3c3BOG29*Lu)b&XoV^B%q4Hibvw1SpnqecS! zL5SF09Vbg9M7p;h$gP9Sy)ww%xo+J$!nvU4?OWijtue z*(2US@Px}K3$&R@&S~tbT}({M0E%dU&>e?VVpSd;POLrl>mjfuZc<24@Djev9W;f2 zTv}RM4NcACDk{`B4Z@aYt>1&I%%f|BV15h&mP3F6U_yf;N)eJHiNcJKBJ3fckyDN)7%)uo1ReY`jn$RciH6?%9;#fyLX z^d?Gr<^IFaNkJY-nS@AKu)4A+5myvh-;ZyBmi5iCMw%<9{k{F|^72#jKeHjS1s{4U z10Hzh%o&2)!L|HQiR#ky#Y%;cMvz!v@xN7lee)&-*d{bJ^X~F+hkVp_{0028Jy^l9 zQM`@G%w_A=t(&N**rcRbvh+wd8fnhyt54B#XmUy3UJQg7n05(G9`xZbLLBsb=WfCd zseB-Cmhu}E?Zd*trBlb_&j(zZ+kFK89XcjZ=yUM-z*z;5On`X&1sAn_B6nnD1c%lX zy8;xk&3#H0{g9kbUfoxh(A7zP1W&=p%4+jX=t?jyAlt8<4&eHke&MvGB~gcu0K~h` zb@&0cC}%#EtT#9?Cu(in^k=*5`bDw5G98aH6$>C33qX+Ax#w=8@pH7yxIgGK4}i5 z(BF`{`_rdS(5`nSdmWjFkOf6$O?^_R7vcL9o9&k7>~j|$v57D%SqK3Xa=_Q`9rZ=3 z0tE3nSlvNRPK7$FEC)9^xm&cTza)zRo-YyCjI0Ssg(xM|iVR5LU)3d_Nq7!~9IsTC zaUoy#v9P(?kHV9@JwrphG16|?|I@8cW0N&l?#`(=o}kS`2k`=3Mm|#;nvn0I3wZ!p zKP{BL0AXqB>sJDuJaLNgbq<48S7__8+b4gYcf6h9@1~~1=G81ackX=bz{xmW%fo=2N9Qh~Ji=01R z&*lQNyzKt){dgDHA9mok)?oV7f&zo^hLl_HRp}|^jzRM-1(ZPV?;TYLGP`mG#^Ghc zjej&YmQ_^^XP1%G5qy7$a;X+I)zxOer@>}464%F{vitS29^mA3KzGU?`pXKC4cOlH zT<=hk`uRp$aL8b_6#_}pfEQ_lb_@J;&2}69C4{s@6(Atp2wE?KCJ+Do`J*2zjLaCC zb!7%pS;YPsed$G<2DFi2`l|~G*ibM~Qr$e=*$F#7j+F%hwF6<7Uxeg?eMRzbfoFb` zhVM2rY;*c|UT&_CQ@_UiH0s&8Orz30vuPj)biBIXGYpG3*O%ZDkRkX6U^h0WR|H8N zA4`NStaTveCoC4Q&SA4E2J}l>XG<_Va8nXTxe1XO$+U{f%C64=yP#Be_4FLb*bVi( z2T;JE(EU+=zeVZAzrgjxMno5-b#`a+@$&<>F81HC|K>vTA7t%H0gy#cDk>uO;d|%K zdN|2lDB%T3J5#`zkMq`t@k{gZsifOG!v298F^{em0NuN2c?Jmfpkez@29D{oSm`DhMN}Np0gNru;uyJE|7T@+@eu@A_A_=+0Bt3km(BkX)R)L({`&oU2YMv*6%q;|R>fTw@d*4T$QX9$ zl>}!eNJ^lXmXp)ow{Ht!l^_UQ`Sto1Wcl*GtK14v5fR?XiJB%xvokYf!O%`NCdXM; zfBR+%N*_2SiA;pn09EEXc^bWgXkJKp9raicfhr2RU(v8L-)X=b$t~y@oLpQRU0hsZ zKDuxv?xz3;Ig{ETQ8P_+0;FZO)rTIDdlYaXO;^~mj-zmSMxVrJzz}_*#8n^SBI5a! z%L(%MOYuC_lMx!5Iml})tFaPRy^jx&jNHoLUuXG zj@b{^A0*)GX`z!39w~&az-R)RNIru6?taA(8U_Y`<-~$aegT1^q`DoQN6ype33+*W z;jE$e`@09VT!KnrfDG3A_eW#;?x^aVJ-nw+ps z@cQ^A4yC*y2?;Rkr_ijS|9ay;4Qboi8*sRfHGoG(TADtK`s0~OokoGQ-(+^;dpRX8V8}mikg(&yy*Fzk?@W{yhvN_g>5N#yUIBBuGw{Rjtf9w!X^rCTGhE;|>tP>z5F)at;gyL;(nPt*jy9z`hf{udN#ot)MuOssDDl^mh(@(;n&20q(GWCqH*7m zUeAVR`kV^>Q;@|9CJZbLyP0 zpWZq+$&Zy2t^UsL!0-Ftx^*krYK995zwXw}IgZnVI`CecoA~+o5UBlBSve%O>o?rloC8yVYkQ{ank${m(Zb1Y>!& zo!2||KUEo0I5uMy5aEAv@cB0;n?P2yC`%v$g0DBgG~T^i@yeB9o5ppUXVoZAbcB

z?dq{b0`&n*X-fmah<+7%NPsBD24IpR|BjJo(7&@*+b9S0hkqyK>7;)EKT`Ly-Tt-_e z@K{I7)c1=Vr#ungVEOCK^x|-p?CO#*>Jcb_mX6LHoB_!A;j`_!XV1Qca0CJ8c1lW$ zfm;{UIaBCx$2=(X^RMv(&qEK{KhY1E~MVFq9Sl{<*X? z(`i5x!5xw|P?wsZ1gPLU|K{W&6Iw`6TygH+FtGssdJ%SILo^W)07|6@Ncf=HZ{U)n z1~4GEfhB@;pkJGWx(7wIzrCoa+ynFy@hH}jmZTRe`Yp->E z+4|<~TQHLQ&7>_NatXjG5l0LsT-0+|YY!hivWK+<4}@SaWKkdv(<3B|l!kynD0U=7 zQL38=uBgi{i-7w@)jW!heia#{o~SwTl{do?3uQNk(NeW(@g_V$e%{oHu&9Bhdt z?sX+{lz>ZywYm^FVNhTt&7tK$G(4lJ=?!RPkpAWqihIu`CRWxO#C6bOkXfwU#l4m3 z>$#?1zqqR>${Mk2@f!nw8@_zm03MG!feiRkO^^5eEE8+-2vG4m9wCa0*P%u<92zXU0L%_Vp|fTC}VN;e~Uf>OQ}p*SNf=f_n#MP(HgZORH+ zUF)}R-e}gZ+SmaK5-o=uRwxe-p*=!o)n_OVbQRog(JU}6H`4PE7Od34%+eTLRn~2fkViS-(lOgFEV6m7$yW-{j3cklvyLx*! zd_)Rzd}hWB_CAZagAXj6&Y>aL-dmAof1jJ%@#hak{cbfqc=C`6$Os5J1&0y|T9c-X zB%&X7Xr@DtGP0SWz&jNc6%siWXl9rV0cyL2GX~Xy1OS0YNz4@&L~tNH6C>m;mzKx8 zHj?-#;0p;rLU8_hl2l8P8-Fcgs4KTZdOimu8j%;u!Jtq9gZE+ZWbWW1U?1bea)6oM zo1LqED6}qE;RL*N^m=r*@fOFL%U7?WpKn9un_N2vjR341p)<3|?g}R;dxamIkw8O~ zgp~HlN`ZBMdU{H6{CZZvG9HG?ES$ua_Pz@xO2s!68Q}7F=<(Cj7{ASZ@!|!lb4O<4>nN$Hsg+kh8te}v7vI#(tOebBOQ0(oL$Cm3?dFdm? zyz8^^KZNIs=)Tg|P*zg|s7=bvx37UW4%}r?mzl$x`kNt356z~n)hShnn~zVsJL(GC z)kyt^U#x_wR?9wqq{z}+5?iWC*6xg(NlVs#si2h_P^3e;w_K!xG|J-#x7opWsSQ?e zbfGOYp5Wzk2FFB@1@>O(GcQyhQy@C8h0sZ?KTdeZ=xE#XAw({5gdNm9JOLCM4(^nr zQpVv9zG_YTXAp8g zZ{sjKWdc10*wP?2p3bM24f<{vhZ5nIyA9pL$q35TjI^`^K)SH{S%Az|=4-rU#tWZ6 zf6i?tp8E3Txk7hrjw(ydJ4c{lkzp_vsr4OlJ8(U(a1)r}IA4oc%U5*aIk0WoPXrI4 z4nX@MhaNn*F6A&Wb>Su9mJsZ%OHkY%Q>%C73LnO)>pZk?kOJ$JaL^Cg$7g%Ow=h zj!C#rNI5Mfg+zn^42>^e{xmnyHILoRC}iYw{pSG@<{i|mLiF_X2-k3bRW?I<>uRe6 z6kj+nB))+lgs^R!l&k#&ngkg%>wf$OoR-u{(uYjxyp|>up~T;YVurm3lQkBUkz2tR zCF%eh+p*ZR<}B;oH`yx&3G2t`8S{}VWH^PGT8R8213q@WSDR*Z_e5Mr(Q8ayktAV)&~{tqTu%dLc?geiGV^avaO!@PVr@JICcQ>0MfoB#BsIdDCA%A6)1ZY zAo6d~>q)j}FeQmW!igIqFme#8g=%oTvEug??`X&#{5z7<&U5(nmG;6I#OB2>fx^`S z{39_lam-6V?)@I2!%JHvq4)xxOb$V;hYExeu#p@i4OYP-jCsJ?k|vQgNT?|=Vfp!k z0mtv2e`~fz@NzLFf?nL}K9~x*1$iFkLI{dA>GH6>;dxYAqTLt37ryDfi~%Ie-Niz`?3)%_v&I0H@HErgs6bchRD#*%}wOZrRcW z!W!41A4Q6sU3g@rcjIAzD>UD(J~ z?d^tV6mzn(qY&}y92=_%->*pSr+`yEp*AcoPJq?g+`Nor2><^53+s7_;{tlWZ#9cDTFF_Hsxh~E6#c}N#$*%!wGk^)32q%RoARpQILmF>4SuPcKh zg5ElZSrNpDQKvE;`_x>$*FQyk7^oxW3LgMFAXpF-GB%~1fU7=gaS-F=H>p5J4)53x z<0lxCKzPCf-{aSf6-;eI_e?+n3AO*EsKcXNH4E6Q&4jX@= zCc-dkI{3JUkRq{?Kkn+qXgSk-7oSy^N+YHB4rMj6v~H zpDJp2*MKV`dB#O{=723!E8vH-f0bzV9@#;yAK-gHAZPPYt1Lb94Zl&|%zrkvv@B&a z+QYOWXB)`_b3irZ*e0iHWZz;7T=baMDXnI>30y|bInes(Xwar&4|YxspGC+|B!>g2 z(DSGVg>ect+hB{tIumnq;mgH73bW!{ic2^Ye2YE$IyyexJE(+S1CK>c7A%j9vI%i zAoF7Z{;AbZpHe`8in#^{*c;(D*uLu6@8##6eDrrE?zpO&rYrV%#t<_0Nla5_S8d9J zBmG(JzU)4w2=;Y1jIpDrHgArYjTI}es^Z}0_J@iRQ$uW8xD|s@eRqR`v^YlJ??&%O z0!!y&wzDM0@^m=(=7sT~B-)w(33>y-`LJ3BDZ}wVcj4=yThNXGV}Z{3K*fZ9EhQC= z&7>U~|-)X#nDu_x6)RIB_IqFFC4zV!$5)ipW6*;3-6uPukgy?=c*j{daxI zu%pNs`~F=cHw}yqOi9pl={lMlW~A=7Bg}@8YGH_4Pi2lq-MbeS8Ce3=3;CoGFWu(iw3lJ<`z2Yks0wzEN_>7)j zASRKq0sGJ&tmpI2} zK8KMBn|?ornk6MAiLUx3ly&>Z&eEWsVMTC3%ok8Y%FK;}5hRhgp8yInmAOY1hXd`X z?MK?1f7b))_b$5rA%pi62rDBmo1mM@D1Ac&8ws&ETh z^StpZM_S6tHsYAPP*yu`2++}A%tbqM_?qv zzfntp?&*=ug{}R3ZVAs4nX)UB)0i(2g9j!jC-+J(D^Mp@*S@=a2kFFktlzH>UA3<`416gdKW2)N93`h0WEy7BRGjcDZa$77Wh|LxIp z$V=e)a^dv`$e_DsX2VaZyJF;>D`g0FW5&z6<_3Gc!Y+8zSQw8Lh3)@DdRe)ZiNeTkpYS3L&}_;zAQ+ zt=0onP+H^ZrVtrN#uG5OpRz>m_68(1!#D=g--H2No;iQM!fR!Ul?25FFRul=F@t7Z zFx%!gez{y|gU~ zq|ed`(hYhUrDv7mVR)KPE@JaerBfW?9+4ioE}mZ959XP~{6!D;O-p&iRzu^fj`>+u z740Y!Hy@}t{<3a|&KOOqwloi9oLJyGtL~mxJbREgFIyZ{fH|K4 zmpaKvYHz8+Mh_M%TKl;$2m*lo%3!b&*}v2??9X1Bxi}~8M{0oesKr@~;?Ts}<8|_{T#^ok1&>lVA|y2LMS4g0|QEsBlYz32pD-$raf(r{0K1@Mkzw~NFqJt zCspp43fL`-ZVD#I=!}ebBz?cn^0rk_W-eVn3;TH0Jx;u#I4%Z_!S- zUqKYD5?-4tL={nGMKlC^3`|?C`@4(*85$o6d42sS#5D$%hIs~_M0zpup+wKJ7>>hR zBs4U>pJ;5Q53TTKs~3km>M%fs_DZs;Oh>Mq8>weRtO-#D);uR4DqrWjQBm}eva(u( zC3qp&Ld>ua9({%YEs(SoU-+U}9uBF7YtBPd98JwSSf_gJ?gAta>FuX)snpO@L~jLI zd_5|5=LKtDsUh$bGN}tsBdhhk#1Kf|JB!-mCX_|Df%e~JWs%f4?Fc)=Pa%wvv4Oc~ z=kKFZ7X^$Be*A|-gxS~>uv#<}#60-_@$Wa8C`(}bBNOov0WK1A073kNm7jG+8k%Nh zWpQldXm=}m+XNyw4cC#Qm%==63E(;FLJQad_C~yJDl%PU_SdC#70HFqpFd0eb;YCp zJIX|js1-SB7$@z(e}YH-8ZX8GD?4RjVG*qU1~C1IZQIiKm^3w1H3-Wo6DtUFxMLs$ zlT6ZobGKtc8+oSMx;l0s3V1U!>5Hk_JkYk(QB+RE>C^Zq4yAvx!$lEe9w|{lhwf7- z$Q8`C1tgR8NXA3LDl1Qc3!@TWE}UMHzKf>|AYfhKg|x;40YlIJo7$S1#mFs^nN{p( zydc8?)^)yT83JO+f&rb+YV^@lcGTt@w{}B7eFKM2z3O3q3y8F!mM+8ySoLgfAV1j`joOVJM?6-!tQf+PY*vlgseg&mpW-P zaCJcu@M4Kz3^%N```drUbFO0}oJtrt$ACk9|0gUnH%r;JJxR4 z6o5CJ6f)qBKpA2K_@WK}#xe2og0txc@ldv1=GFI8 z6-PRi=>tmbBG4Vcr5LB}k+>r#vfdqt%HjKHXlZ?*e^cOHC?*T1~kXp1l%N!88ARAQyBe3 zwE@d~jX<0$D-1^rh#rMx5p(DR8&#HEUJ!7KB}hsgT5%$HkuofO%_7g`=kWec6Db9P zCZ5l8Y{}Dc9y5=$FJ3%^*Qn6Z(<>8e>mBj~_~SssS;PC$F)@h{TIPRYWZ{DeNWAUF z4I7lfuJh32@i81J4OW)W*EJz{Jx6rX5~~#fE02Wt=OrO@X@Woh`y#xF1&B3*;-ILg z&V=Of$Vejg8fM&-P)2vMp%ymu7r5jd!a`~q89i&s#@k>vh3RHo*^muIEyctu3Y@ifCY<&Fu z@Yf=ja*-0l{lV>;zO}-hT;Ymmo;L9T?Ia;BEjT77=Gg@Z>qyi*OH5pU6EGf;JMz8~ zyji6(^e5WL4)3W{AvvX zg>H-(Ws(uq}O6US5h?^Y5`04N8j1b__N2+i-k`0Rrm##07 z6zI8g{v1jyvYyfK6u*|GoXyy)A$|!70Tf^C{|h@<#%2o|$ctIXxd|faps;n0j;cZXT6%c(zv%_z zvJg|ey$WtP9qtSEBwmuUpO254n3Ck>EvVE;zT>?DXD(h;L)&GYD`>z+lY)rob_fKs z@(~;!tp3!ejjWe2IE=HInU!UVyvU>sNpku52|IL`TZMYS$zw7UmZRAlos*Meq>lqU zpeFg?-aWhi@B0wYJBg8UQ&ZDPV^bXVZWk-mFfz)5%1nj?goQ!y!uCqvc$${>4Fwfe z2QhMFu3?x60VopkIo8AS0jp2mT!XEHU{eC@J&dO+#!`5|*(C4Ja&i*E06*06E)W{D zKSJUt$gIxB?R%dC+JQzP3WM&m8Lv@+xq^@gP%1OkwryWpS_%~U(yH-!nEpD9N4TD+ z@swe~^&PMnp-3ozj9}P>)NeRY<-12qE1`pJ^W47-7t_(c{Z}mH(zCX#vEV zMwMgk-@AulraPT*=$C0JNnzlD4!zj)#HW%5=P^m7kDes0fVRTlu!}ZXoqmNOAO?Zmz&{($*)mcNcFqg?%uWQ1QZVvYQ`1{ ztRW_DMMcWY5|Iw^S`vu-mMm|RlL2vpMa&bO;5=adUypF!U z*^||?Ac;^)9U47Qo47JI^P)WS^KV7LgJwm0J4n44`<6~?;AK5G!{*1p0(dDLLUC7s zC>kwd>>-YmAUJ}%>QDVb*BQ^#Qh9=C7k@BQwbw6!PV5> zWQUgsLNnyIRg{;<3j>h}d)orzMIKj+U1kJA_@7L#0nA2N49xcYa4WDP1zY_e9)SOExtcxS`BSWKC>SZ z$xsz5HOgh%jUj&5MTqp|Q~~Bz?)sYAtEn6TJ#quS#0*{EB|3lp9klWw_I>4G`NUK- z$ibTjv2ev0<_oxcm*ePB2E_2mfD&E>0Tde5*Ci87CQWg*@LO?O$Yge4z6<#&XqxCn zs?e$j+CE64SYy(Z6+YQGVue3%bnb*7RW}k@Io2z;x1BW!l6fs?nX9Cj*zTK%Z`R`S zOAC==QbFtw*ckFvKt{&ct`Tb+RG(m@d>jf9i|@zmTPd)_-*8Un@bQd?O{k#s5apVL z8rva-q-^uOkmnS>Dvbwz6DZ8eAOQ?t6B$C>ls)*Nxf>!Tw_)00N^JGyq6Y>l?l2)o z{|DpA6f~*kFT(*-&vC}L>pf5RGhZKR5)%2G6*TqBu#b}QoP?DISBN9-1bK7DlPY)?<}=E7Y35_2G6$& zAwfwrxpIdT`R5{ zfML`Ttq~Xa&wE{R2C2~xu~`(L>50l%w--v2DPbTy$PNVO;d~4NBnjVFX)aHAW$^3+b zkDo+*TK!_8)&u`Fm^P%uXHv>hd^UE7A#dZrA+*Y8cGd;?0?O}XYL!Pe3XhOoNGLNq zUy}<_aNYbRb;=S6bc35D?|n^d@D);%=pUt`c|jNm1zzENv!xZgOd)IjsJ!4S@|GO9 zGRJIO5~|7TM2;NMHAu)OV`zwiX=-1kUE#tT3$f>|5WhQDcJJQ3?{FxZMipY5@f7gp zjnATaTTnm|(ipuFi~}o=s5z=+ppjK2o*d~jNP+}Xw^N{7mNqplgiM=*$CV@MHFk8l z-;?BR7KQ{iP&3%o82Ev=qJcELr-%v(QOhc$UB~S`P8}E!aQQ#BEniy*nI1#IiJ5^& zANau%RX(%5_ZoyzU0TU}wB#c6*LBk%W(uU0Gfle6V<$*ogLV)?gB6S4L7%`-Y2$Sn{ib{?VfGTK`(|Z zbOK73H7zyXw1~590@G{OBVC{5DQb{^5^)IK1^L- zxNsrXYsK}cgSIU002PhgJ`%yCU!8sd8ohJJ4mr?1gzxtW2&l{agi!%qbEDVt^n*?o z9pH+S7?mh^E+8dkU~EzVyn+)J_T)(rC<*+J!+7kvl;exYbg@a@#!7?&3VXulp&=F zg<&HPYxs6nnODio#-^sFxD7g&2iTP)3=OMq4SrA&#ZYwZ&_B^H_6*+kvliJ0l+O*x zEbsc8vUnvVB#1)`>W7^2F+3$mM@#|S2%R!WUgJCAOZ^FQ!o(v#zm0gGDD-l|hY<8S zpL2B&PC9vy6~OCv2qa|G9qRJ`E9y+3dd}N6p0ULkl_{wq&6H4NDAJk9j)|Ns5J-+Q^P z>%Q*lTSvZ0JgzU&O~SbgL|w#jkrz+aaZ#n<1kEXf`PrG1lhg5r)*`ncZPO^Sxob{j z8^UiIGsy6*LkR2&BCej)+y5>q1GIbQvu7XRsPwy0PQOcWHhP!{CB?lp?XDuK4N8MI|u=K zVx|wixBZL4VwDqLFi|m=Sd1(~wftteX%M^u#mdr?uh!9^x|Uuy-uSue^w~`T$1NsJ z+Rlt04_@qnC6H6botzOhF|exk#f!}H0A-?K%CNJ1I6vIy&d$FnJ~h`iTmWh!i;Gd5 zs+yYgwm~~G6FZzejLpZ`eY#>@axIRW0Z7QDZ6p0Ny%&N>^TX$);6$u*6eMvKpAfzG ziQEVjp4($@4k*)*zee-U*uNKG(z?COUOKzv;5ij7lOYW})>7lLkp4Lmp__%7X!8V~@S^0WRsS_=V)jh2@j z1l$aAUP}a;G<&xCz<~pKwy#^B1Zf(}{S#RU08$PD7#snzkb-6~WPhLHtr<_nhNh+i zr(Pj^e3b0FiX!XG2x4YeaG`2QFLBYMB}sk$U+-lw@p%0KAIt7rT@La9#XSO4UDJJi z97hvn9f}X9$ZB5ukzGp(DkJlseR$epHqDpAkq71*>YS;H1*s)%0ItPI8_;;`m1|%R zLYb+}oNS!kgYVM&^cO@ds2r1x-7v^p<&w7Zzn4-(1AQF65#4+Cbns{)A{rG#FzTHf zyD4+QNM4P4z2^1-jzd*trO^MNID9fdegy{TLwLi-U{{{i*7i%B{b0-4_%{Xo`5r?T zr;pxws5FQV)~@0L9ss8RTmv_{EMB}7h2amHMmeDTz8&f8#tIb{IrNUS#p#5G>P}^e z;wd&@z^mQcV%(-cvMIk%<@t;7ABK!UBfx{{$g@zb#Qv@GyOos-Xc6~-SInW?j86^w2IxrE%C5(Q|a1PaCZ0gm`uReRzOPQn5t9?!3B z$qcCjLtX+|(qvhr)xG;45N#Bpak$+!;e!nOQqZdBNwB9bW+gHR-82nkCQ1i%cSn&=2^>m#N0RfQCF)j*|$avQ;W2TgcZ!yG` zjY}(J4HyW%1e)INgahQ@)NJDb6pcQue)DV`&17|`0zaYx>;Kw%>Xa#12HnDuls_SQ zd+yP{l;uZFZIz{-ju=Wuu@neD&wzeSFlss?p0*is3M0?5qf9X^TDGi<%u^L5`$~n* z8NyzEH$4L>I^@!Rk+>oF*WmRLG}&az_;5gW@X!d^!h+JdhM8+_3dt7_m`U=vMZr*>iE?Ml2>{c&yyVUcI%|AkPVbMIfh&kWI&_$j?P(ueGvRe$*9&F^Cq-{EY^P9?a7jlBc zrS2BrvYN^N*fqUp>7O#7>_Ho{wWxC~swoW5btE8P3|Cy$4{G>Jt-E$55yo z*S8-&%sM$NHYVnq2?jc%Do7mO11>I#wjGYdHu)%!tWq(>1!4r;Z?4=qs2>m`$B+O{ zH=GK7U-N}V+IUHwJEu=?Z23Uv7HX2}kUHiE3J!jFd%piu&IY5#s=4|3m<;s7;scRI zSM*(-yL7R&T(*1Hu4+2J$LHopfQGSD=bt8O`_gPql)YLxqi7PSyZMZ|7-2g+pGWS z5v@P@`QWdfTFlcnwq(r(4a8V;XWANzb`{}wk5$-+Bo0Ib9_vqtdyy9su>=NWFiyxV zs9qrhr_UMV%`Xc0Mhq8CI&u*RZc!l_c@&4hi06@IZ{XD}(pLL8Jsq9#GtBZ(22#*V za!udt@IK}sDiq+yhFqOD*|YomP}%NRQI1C!C~^FKYO(aOEL z(g~I7;GsiPfZ&}n=3%FHW>#F@_nT1JMmWgxQX-UgPk9wAE8Grcru332L@7p zQdd7=TOi(vSDz{trCYLnYP)vdPXu zXK5Z*JFczu;twC*W~ISO7rX6Lvil+;=07csdBn_sapT}weKE4wd-sG$wt$uyfBI+T zYOC>tBFWFh@IZx`369B>olT}<6v(Ou+mln0exe>gb!W(n?A5i1LK0MQdNooW!6m>y zYK9}ZM?wTgD6{%VqfI|-zyl9(qg=jh^TDWDE*$;2))5#$1}CBHimG1x#nzM*8-4Ud z@Li-*!$fj4cmlUqP(ZP_!k%DE!3F?j6$aVN&9{}T{Wq@<7v#>U`ed6Zr*G&QR`rpQ zkx4fK)UnK^sF*&tAQ8NEss|>@Jxm#P>cuhWw78Nhh;_tB1pPCyL#{hIrycZQ3ZdKL(Q2j8En&onuj(G` zEM)S+s>e;(BVJ4goDe`Ac*JO*725$Wp=6RR9Fbm*|B#b$w^7CIAr0jy0E^kDS{>O# z&|JC%xL@cL84$L3lM}6)-dzCYHGcnv0@oi*0msf3!f|x z75}yz5)sWQRhhxW1XvI;pIdY}5fPf;xODbyL!;8b8TRd;JJvaVGMYVRPZ@lub4ps0 zJ(OF1DhxIBM0-p#jHJ#3r9toBTY=HQlYI5e7U(lS5+n5vzdwj!dep&DpK|9{hEZQK3WcprWB7XeI;LU0v}r@R@4&?ua^~_PVynctIw#0EhXRMa?S~F&z)&A(@&pZ-ZsPIJ2bC9d z=h)kO0Xzk5@W5bzG7E36Owng!lKjg`!&|(%`Qb}xleYG=-m7WKFI0F_X2T4F?W%hPtJPZRCxzgXRI;$uvK|e@pL@4F~QIvOZh?Ca+3z(Qi(-BW*;(HJ2(AaEH|NeW? z7(!nfoyJ}SSw!Z82ci6=+MhE-2=61tD#XD2a2G2>{+)7KEw86!9&`j@rDOG}FKK_nc(!76u(zW+P9DMvF{d&DD8FqYKUTa@- z<=2+`PP#oR{yy}vTSEHkd4;a-g|F)MhzQsh8WqDk!eBugzu6J(UyctH^^qhluOs$x zA`XI9EPwkeXRRwBHW1|3t4W`-a`2hT?@(Vkt#Fdm2!FM<6$MzY@IM+>%HsGUVx9iK?MC4;FMN;MfR7}-tP{p6xKd` zz1l;1gMGR?_^NZs(HuOz#M%Gb7h4`2Oa4Jd_Q|PU+!aaejcb`(0LNZP5H|kQ_TLvT z2p>aamH>@J@TD`GSInl%-g)in)ujXeX?p+OSzH}Vye8y^M?_>3ZHbIwy`w$P4Q&De zBPEY#5T36Jm5pQ7@;a6_Afc0OU6al1oe2TR{F^Us72?6FpgG;{~ z1$qIy4&sQybbk1PWUPot=39wDQb1!|!Z9}Qbf1ym@NqF=SBHI8Z-E3= z{Nabt#QXQ}i?y;C2b)Ij4GFm`OeO*A-=~R#DB@9ZfH`J>EeP}ur!7l(uyjzPv1;~_ z(1{!mHy9y?nXO6(2^J7cfiD^G)Uj*~g|y5Kq@Sm5B|+98&T^*A6T1`1>Gk#JJ`N-~ zJSWKq*Np7++wXra_&BJ5kL2jrVD6hl&(22_ogL)OWR%-PK4wtvd(1>1gIy%L^q)xL z^x|n0M^CV{kPdzYrFY;DoqTyfKm60Z|8B#9W5kxc}qrr7TWg9e2;-NbFZd!>Sbfq{L3+cw6p zxR`<&6Z3K}I!~42l3&MzaAR@+8TglIRoiJZu*8}5s_oJ)n}KK|txr$J$=|?WYQwR) zP1h1~u4|jR!l9e5UcGv0-pNk%EJ9JV&dpR)R*v-XV+Kpx(6B4SAi9W$D7EZxGXVUB zLYTn@sS#J`L@~Hvu*x^nl6%GoIsT08Vk}+H%{qhGxvj1mzJ=e3G?09M*6zY)q5nx6 z<|JfGDGa&~SPdiEmy)ICEmSq@Nif_!S^{;L4j1BDbg>VI9vkc-1MJRkgbFZ^zz{(G z{Hz_L?wo>7`U%$>aSf6fhmX&<@u^)sHZdd*^~g8>w!HPL`bNgd#D$*zY#USFkRh}T zPME9$OED50iJXby+95z?SW)lLwV(!&O?1u4l(EQ@HzVuub*$h}3(~@6Nh>ZsjNDV$ zpc|hXr-Gtxfz|pC!xm-H*^`1SmsN>L!q#)NR9;wTloVg4mv@m3#{Xgj{S{?Rr`M8VBl~Pi26t>^?C(iF` zFs;uc*Y)eRl?)a$lCeue1_ zQ)@b1pu%peR=w4%d5lkJb*XoG+{yx%aXt=roi4sfHyJr{s0d7)@7sBtjt`*(KcZU+iA7v^-n4{P7%q8rbw~ z=7hm#$FE+qhSK*8KXs+3Q13IW{IUxKV2&nH6Veop=k@KsFFw@(>YK5BZ2LK&xVD%Ewt-i%H<%=vGdBLS+uUR$yv=rWP`m~j{ObWI^(Y56E=JraeT@awpMS~anplsDBUY8)3iaSO?`E!-m z!P0P_CQow=Ret)(AhFko6$&H-OcaZfyw8<5qEG@v9gi&&;reGR7U)O7GQ`P|DF6li zRfd`x8X|AwhEHbS28k*#=?aaYtSLkKevdM>M%7K6bby-@9nuY$c4pYjJ^2pOlCb@A zlCgvX{G9V}g086+l$}*H8IgcG!ng5c3E|O<$)(?@hE4oFo_EL}1TN2ui-WvO9Z?K8 zp&?=wM(f@!6@(=d2x=e~;(MnUzvTGL9DnM1F%rXdMl3u9+au3&hcf+z5{E2ke9Qo> zskGn3z8ZgBi^?&r&B34J&x3K}c5{LHDs9a*(NTn3i{YY)Nk-A7M|pW5{gEh{h0J9d zq4}W!6uE3S$XkH^hC@o zjN6>=g9XB|IRhy{4qwTi5<_cz`>Ks|P>EM!+aQNU;NtvtXNbF{tIVq6P*7~j{AEsJ z!C}F35I*w{SR26{Zd8vjs92gaToSi%{D{Ap21GCFJwxZ8239}$xEZ_ViC|6)(Z!Kp zT;{T2TxC5aw|yXDQ7M!gN}ukuFP)mdQCy>;_r2Ep_>4dW+c+L3p+XT0EqVM35`b01f%-@^SQ)9SA9+7v?C%a6UL2vJ6wG zqYCy8vc+I;Xs9`pbD#f4%7UF<>`GIpVR}36>5PzoxNbP?q11hSCYUf6oRMM^hsCK_ zIq^K*{XQVSkj;ldxs_neBIOJE()zJVsrmIq=n}CwqzX!RO^0sZ1ek%wm>Haks;Vs! z5fLZe-3I0E)U|8a{Xw?C47V|nfN*rzz5ciFTRr|}<)v)1_0L{vmmHDf@_?l+9Q)ZV zhtM(*7&Pl((PM}A0OXnb)f*Z~6mQIKCf|EP6T@k*s;e8=G3n`nCQQC$jFgZUQ(MSo zmC+)IBu($rT*o{2?@tY}_Rk`KZ0%?}Q|TW(JM7_6T6eo2#UNJv0h$?E0_Ruam`L3z zY7qp0soF}mH}*SRSkzu7Bo11?JtzVpt0!DID@)5=4!&gSeMAHN33kxnEh^`-$da+K zW5*7B|DgyYQsxrK3Gm;x8(f5R6+qLjjZHL9E`PV-_rc*kevco|m7&mzk%Y)<3_pGA z;<-#5?!Uwb<{q3|JK-sUl&a+oj$k?Af$s0Fa&2r|G{=`{6#UE^1|}{ydHhxrd7>(N~sU!NH8wYe|FcHnR@T;y_Z z-oKAqd-BUll*4_QoWkgQeC`c=?8!#P1zzQbCMJi-lsQm4n#Zznp$Q)lVDL>Ekig1h zDz8`{V;cZs1j{smz%J%at6Nr%KopM;?(}wdI4S3Gd^Sm|E)^aN??T>Qpj2P}oCk z9jiziazEwFn-PS92$<P4?ldy0ollC^jL&nk#@4F%4iMRRwz;D3|77I72BAdg+rO%wWT^ z@&lTS=I7DmeZu+S8Ny(2JN@2K2yP~UsP+xMbt*bq{2(CggSa;Y5)t9NDozlBWlTbunLgN=-;L6c>#Y+zaikF5U`9cc~dQ6==7%t=K(gMMyi z$V9=&VR=<$AhSiCdYhVWkSE9t7`?3cpqlk+p_vewvFtygOZGZZ%ynrX5k7nVJPq@_ z6<%KZ+%wSrM~MVb$&`U9aR&u1fs<_$nz4dWf2-8wbOEkA*pQ|es}ZX&ufg(hN3VN# ztE|ki>>OnIXRf`H-#`frE(f7OdBdU7pi*hcEE%6<2o5zE$4YO5X=>o@Fu*`G2Y>F| zc_%wNn9^$1vs-OImF_^`;oT$phle@6kj`+?9maIfFP~$E1%}sP_S5OoovKv-ugs19 zV-a7yxXj5q6WBMCRVKC%$N3-3Q~Y)rvPc=AN9j-Z>8fCrK#Tg3)P_A|Pi_WAzGyXZ zqo3&)AYYw(K^L$xoFil`oFNhjQmkC8@S93LHzgXEFRQ3mx9e)uK-VVz)j;{fv9sVv z5`j}PGXvpz^grYl6l{q3_QyACQ(OV%|2Az{htTNG#0ys_@^@qGHz_Ez4Y!yu&X!aZ z+Vs1Hg=n}&j2wx!Ar)5mAr)11@@}FIJ?Z$en=~~PwR^+ECl|0u-91nzcDI@DF}d$w716S@Bff0>1{8GSl!zvevx9c*7W_MOJ6Z4^SE(jn3oBmXp@Gi!M?`@93ilyHJ*fg%V*K}L1Z z8le@^KugCc^9-mX=zCA$o*>YkS<|s8I?`RU zMUQ6I#^c0OlnXgDxgEbg_;w83XdoI*Q=Ss*c1kf9`t?6BP76H)eI`21Klxh#Dhjl~ zkkw8v^y^W9dDpyeM5jBW82Mv4>K-i72bt4d5T0A#@gOI992IUbF?7WUpaBf za3_sAEn7t8zI7yK2Yb*b;R(JKF`Te>^sM=MamK9DOW*Ue(mc&^BGt~y+9kE3NVWf) z&=sjRtv^!HDX3CByrZXKGI)0QwKHM57S;pbO^W$rN^~XU?p=TYWZy0<&_${iYZu?A z9~N^?IM!UaI6lUfiBbxSd+C=Dp;dg0ws literal 0 HcmV?d00001 diff --git a/images/Pasted image 20240319162824.png b/images/Pasted image 20240319162824.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe20d4d95d0b80497af1ea77f0b5633d5555c24 GIT binary patch literal 10951 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 literal 0 HcmV?d00001 diff --git a/images/Pasted image 20240319163053.png b/images/Pasted image 20240319163053.png new file mode 100644 index 0000000000000000000000000000000000000000..37c606f72e45f66da607b81b76f8e8d2945b68f0 GIT binary patch literal 10578 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 GM*kbJ_^0jw literal 0 HcmV?d00001 diff --git a/images/Pasted image 20240319225420.png b/images/Pasted image 20240319225420.png new file mode 100644 index 0000000000000000000000000000000000000000..bc324e204209172064439160538352ee38830ad6 GIT binary patch literal 13526 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