chroma / source /Design Patterns- Elements of Reusable Object-Oriented Software.html
anubhav77's picture
initial commit
e6eabd3
<html><head><title> Design Patterns- Elements of Reusable Object-Oriented Software</title><meta name="Source" content="Book Notes"/>
<meta name="Created" content="2022-11-23T02:42:00.000Z"/>
<meta name="Notes" content="2023-01-02T08:40:00.000+05:30 Builder Design Pattern,2023-01-02T18:54:00.000+05:30 Factory Method,2022-07-22T10:11:00.000+05:30 AbstractFactory Design Pattern,2023-01-03T08:56:00.000+05:30 Prototype Design Pattern,2023-01-04T08:42:00.000+05:30 Singleton Design Pattern,2023-01-09T08:47:00.000+05:30 Structural Patterns,2023-01-09T08:52:00.000+05:30 Adapter Design Pattern,2023-01-09T09:45:00.000+05:30 Bridge design Pattern,2023-01-10T09:30:00.000+05:30 Composite Design Pattern,2023-01-11T08:27:00.000+05:30 Decorator Design Pattern,2023-01-11T09:36:00.000+05:30 Facade Design Pattern,2023-01-11T10:43:00.000+05:30 Flyweight Design Pattern,2023-01-12T09:48:00.000+05:30 Proxy Design Pattern,2023-01-13T09:41:00.000+05:30 Behavioral Patterns,2023-01-13T09:45:00.000+05:30 Chain of Responsibility Design Pattern,2023-01-13T20:17:00.000+05:30 Command Design Pattern,2023-01-13T20:41:00.000+05:30 Interpreter Design Pattern,2023-01-17T08:07:00.000+05:30 Iterator Design Pattern,2023-01-17T08:37:00.000+05:30 Mediator Design Pattern,2023-01-17T09:01:00.000+05:30 Memento Design Pattern,2023-01-17T09:20:00.000+05:30 Observer Design Pattern,2023-01-17T13:18:00.000+05:30 State Design Pattern,2023-01-17T14:15:00.000+05:30 Table-based lookup- alternative to State Design Pattern,2023-01-17T14:30:00.000+05:30 Strategy Design Pattern,2023-01-17T15:14:00.000+05:30 Template Method Design Pattern"/>
<meta name="Already Read" content="false"/>
<meta name="Name" content=" Design Patterns- Elements of Reusable Object-Oriented Software"/>
<meta name="parent" content="References"/>
</head><body><H1> Design Patterns- Elements of Reusable Object-Oriented Software</H1><a href="https://www.notion.so/Design-Patterns-Elements-of-Reusable-Object-Oriented-Software-1fe1c3ef2b2e4dfcbe31df82ce0b7712">Link to original Notion Page</a></p><table border='1'><tr><td><b>Property</b></td><td><b>Value</b></td></tr><tr><td>Source</td><td>Book Notes</td></tr>
<tr><td>Created</td><td>2022-11-23T02:42:00.000Z</td></tr>
<tr><td>Notes</td><td><a href="../Notes-box/2023-01-02T08:40:00.000+05:30 Builder Design Pattern.html">2023-01-02T08:40:00.000+05:30 Builder Design Pattern</a>,<a href="../Notes-box/2023-01-02T18:54:00.000+05:30 Factory Method.html">2023-01-02T18:54:00.000+05:30 Factory Method</a>,<a href="../Notes-box/2022-07-22T10:11:00.000+05:30 AbstractFactory Design Pattern.html">2022-07-22T10:11:00.000+05:30 AbstractFactory Design Pattern</a>,<a href="../Notes-box/2023-01-03T08:56:00.000+05:30 Prototype Design Pattern.html">2023-01-03T08:56:00.000+05:30 Prototype Design Pattern</a>,<a href="../Notes-box/2023-01-04T08:42:00.000+05:30 Singleton Design Pattern.html">2023-01-04T08:42:00.000+05:30 Singleton Design Pattern</a>,<a href="../Notes-box/2023-01-09T08:47:00.000+05:30 Structural Patterns.html">2023-01-09T08:47:00.000+05:30 Structural Patterns</a>,<a href="../Notes-box/2023-01-09T08:52:00.000+05:30 Adapter Design Pattern.html">2023-01-09T08:52:00.000+05:30 Adapter Design Pattern</a>,<a href="../Notes-box/2023-01-09T09:45:00.000+05:30 Bridge design Pattern.html">2023-01-09T09:45:00.000+05:30 Bridge design Pattern</a>,<a href="../Notes-box/2023-01-10T09:30:00.000+05:30 Composite Design Pattern.html">2023-01-10T09:30:00.000+05:30 Composite Design Pattern</a>,<a href="../Notes-box/2023-01-11T08:27:00.000+05:30 Decorator Design Pattern.html">2023-01-11T08:27:00.000+05:30 Decorator Design Pattern</a>,<a href="../Notes-box/2023-01-11T09:36:00.000+05:30 Facade Design Pattern.html">2023-01-11T09:36:00.000+05:30 Facade Design Pattern</a>,<a href="../Notes-box/2023-01-11T10:43:00.000+05:30 Flyweight Design Pattern.html">2023-01-11T10:43:00.000+05:30 Flyweight Design Pattern</a>,<a href="../Notes-box/2023-01-12T09:48:00.000+05:30 Proxy Design Pattern.html">2023-01-12T09:48:00.000+05:30 Proxy Design Pattern</a>,<a href="../Notes-box/2023-01-13T09:41:00.000+05:30 Behavioral Patterns.html">2023-01-13T09:41:00.000+05:30 Behavioral Patterns</a>,<a href="../Notes-box/2023-01-13T09:45:00.000+05:30 Chain of Responsibility Design Pattern.html">2023-01-13T09:45:00.000+05:30 Chain of Responsibility Design Pattern</a>,<a href="../Notes-box/2023-01-13T20:17:00.000+05:30 Command Design Pattern.html">2023-01-13T20:17:00.000+05:30 Command Design Pattern</a>,<a href="../Notes-box/2023-01-13T20:41:00.000+05:30 Interpreter Design Pattern.html">2023-01-13T20:41:00.000+05:30 Interpreter Design Pattern</a>,<a href="../Notes-box/2023-01-17T08:07:00.000+05:30 Iterator Design Pattern.html">2023-01-17T08:07:00.000+05:30 Iterator Design Pattern</a>,<a href="../Notes-box/2023-01-17T08:37:00.000+05:30 Mediator Design Pattern.html">2023-01-17T08:37:00.000+05:30 Mediator Design Pattern</a>,<a href="../Notes-box/2023-01-17T09:01:00.000+05:30 Memento Design Pattern.html">2023-01-17T09:01:00.000+05:30 Memento Design Pattern</a>,<a href="../Notes-box/2023-01-17T09:20:00.000+05:30 Observer Design Pattern.html">2023-01-17T09:20:00.000+05:30 Observer Design Pattern</a>,<a href="../Notes-box/2023-01-17T13:18:00.000+05:30 State Design Pattern.html">2023-01-17T13:18:00.000+05:30 State Design Pattern</a>,<a href="../Notes-box/2023-01-17T14:15:00.000+05:30 Table-based lookup- alternative to State Design Pattern.html">2023-01-17T14:15:00.000+05:30 Table-based lookup- alternative to State Design Pattern</a>,<a href="../Notes-box/2023-01-17T14:30:00.000+05:30 Strategy Design Pattern.html">2023-01-17T14:30:00.000+05:30 Strategy Design Pattern</a>,<a href="../Notes-box/2023-01-17T15:14:00.000+05:30 Template Method Design Pattern.html">2023-01-17T15:14:00.000+05:30 Template Method Design Pattern</a></td></tr>
<tr><td>Already Read</td><td>false</td></tr>
<tr><td>Name</td><td> Design Patterns- Elements of Reusable Object-Oriented Software</td></tr>
<tr><td>parent</td><td>References</td></tr>
</table>&nbsp;<div><h1 class='n_heading_1'>Introduction </h1 ><h3 class='n_heading_3'>What is a design Pattern ?</h3 ><ul><li class='n_bulleted_list_item'>Design patterns make it easier to reuse successful designs and architectures.</li ><li class='n_bulleted_list_item'>A design pattern names, abstracts, and identifies the key aspects of a common design structure that make it useful for creating a reusable object-oriented design. The design pattern identifies the participating classes and instances, their roles and collaborations, and the distribution of responsibilities</li ><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/b369d288-826f-4ce9-88f6-291b0c71261e/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213418Z&X-Amz-Expires=3600&X-Amz-Signature=32c61766b3322146bf7c1052e4292527f2c59bf2b80c6ffb671063ed0893c203&X-Amz-SignedHeaders=host&x-id=GetObject'/><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/43b8ea71-bc37-455a-ad20-de1d496c200e/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213418Z&X-Amz-Expires=3600&X-Amz-Signature=f96f30d1b4b1a5413b1032f4da9d1bfe30a4e52dadd1d5ba7dc392022f50fadd&X-Amz-SignedHeaders=host&x-id=GetObject'/><ul><li class='n_bulleted_list_item'>Design patterns help you define interfaces by identifying their key elements and the kinds of data that get sent across an interface. A design pattern might also tell you what not to put in the interface.</li ><li class='n_bulleted_list_item'>Design patterns also specify relationships between interfaces. In particular, they often require some classes to have similar interfaces, or they place constraints on the interfaces of some classes. </li ><li class='n_bulleted_list_item'><code>An abstract class is one whose main purpose is to define a common interface for its subclasses. An abstract class will defer some or all of its implementation to operations defined in subclasses; hence an abstract class cannot be instantiated.</code></li ><li class='n_bulleted_list_item'><code>The names of abstract classes appear in slanted type to distinguish them from concrete classes.</code>[for the notations section].</li ></ul><h3 class='n_heading_3'>Design Principles</h3 ><ul><li class='n_bulleted_list_item'><b>Programming to an an interface, not an implementation</b><div><ul><li class='n_bulleted_list_item'>implementation reuse is only half the story. Inheritance's ability to define families of objects with identical interfaces (usually by inheriting from an abstract class) is also important. Why? Because polymorphism depends on it.</li ><li class='n_bulleted_list_item'>There are two benefits to manipulating objects solely in terms of the interface defined by abstract classes:<div><p class='n_paragraph'>1. Clients remain unaware of the specific types of objects they use, as long as the objects adhere to the interface that clients expect.</p ><p class='n_paragraph'>2. Clients remain unaware of the classes that implement these objects. Clients only know about the abstract class(es) defining the interface.</p ></div></li ><li class='n_bulleted_list_item'>This so greatly reduces implementation dependencies between subsystems that it leads to the following principle of reusable object-oriented design: Program to an interface, not an implementation.</li ></ul></div></li ><li class='n_bulleted_list_item'><b>Inheritance versus Composition</b><div><ul><li class='n_bulleted_list_item'>Inheritance is “compile time“ and white-box. The details of parent are visible to sub-classes. <div><ul><li class='n_bulleted_list_item'>It is easier to use and modification of reused implementation is easier</li ><li class='n_bulleted_list_item'>"inheritance breaks encapsulation" . The implementation of a subclass becomes so bound up with the implementation of its parent class that any change in the parent's implementation will force the subclass to change.</li ></ul></div></li ><li class='n_bulleted_list_item'>Composition or assembly is “run-time” by objects acquiring reference to other objects. <div><ul><li class='n_bulleted_list_item'>All communications happen only through defined interfaces to encapsulation is better preserved.</li ><li class='n_bulleted_list_item'>Composition requires objects to respect each others' interfaces, which in turn requires carefully designed interfaces that don't stop you from using one object with many others.</li ><li class='n_bulleted_list_item'>Favoring object composition over class inheritance helps you keep each class encapsulated and focused on one task. Your classes and class hierarchies will remain small and will be less likely to grow into unmanageable monsters</li ><li class='n_bulleted_list_item'>However, a design based on object composition will have more objects (if fewer classes), and the system's behavior will depend on their interrelationships instead of being defined in one class.</li ><li class='n_bulleted_list_item'>Reuse by inheritance makes it easier to make new components that can be composed with old ones.</li ></ul></div></li ></ul><p class='n_paragraph'>Hence the principle:</p ><p class='n_paragraph'> Favor object composition over class inheritance [ie prefer ‘have’ relation over ‘type of’ relation]</p ></div></li ><li class='n_bulleted_list_item'><b>Delegation</b><div><ul><li class='n_bulleted_list_item'>Delegation is a way of making composition as powerful for reuse as inheritance. In delegation, two objects are involved in handling a request: a receiving object delegates operations to its <b>delegate</b>. This is analogous to subclasses deferring requests to parent classes. The call however is explicit [instead of through inheritance.</li ><li class='n_bulleted_list_item'>The receiver passes itself to the delegate to let the delegated operation refer to the receiver.</li ><li class='n_bulleted_list_item'>The main advantage of delegation is that it makes it easy to compose behaviors at run-time and to change the way they're composed.</li ><li class='n_bulleted_list_item'>Delegation has a disadvantage it shares with other techniques that make software more flexible through object composition: Dynamic, highly parameterized software is harder to understand than more static software. There are also run-time inefficiencies, but the human inefficiencies are more important in the long run.</li ><li class='n_bulleted_list_item'>Delegation is a good design choice only when it simplifies more than it complicates.</li ></ul></div></li ><li class='n_bulleted_list_item'><b>Inheritance versus Parameterized Types</b><div><ul><li class='n_bulleted_list_item'>Parameterized type is also called generics. or templates Recall class parameterization in c++/java.</li ><li class='n_bulleted_list_item'>Parameterized types let you change the types that a class can use. But neither inheritance nor parameterized types can change at run-time</li ></ul></div></li ></ul><h3 class='n_heading_3'>What is a framework ?</h3 ><p class='n_paragraph'> The framework dictates the architecture of your application. It will define the overall structure, its partitioning into classes and objects, the key responsibilities thereof, how the classes and objects collaborate, and the thread of control. A framework predefines these design parameters so that you, the application designer/implementer, can concentrate on the specifics of your application. The framework captures the design decisions that are common to its application domain.</p ><p class='n_paragraph'>Frameworks thus emphasize design reuse over code reuse, though a framework will usually include concrete subclasses you can put to work immediately.</p ><p class='n_paragraph'></p ><h3 class='n_heading_3'>Design Aspects that design pattern let you vary ?</h3 ><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/084e52bb-a942-4427-a790-a36817069be2/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213418Z&X-Amz-Expires=3600&X-Amz-Signature=b3b4dc9bea15e2f9cce9834cfb3836414176b997ba1fbe883226373547a63fe8&X-Amz-SignedHeaders=host&x-id=GetObject'/><p class='n_paragraph'></p ><ul><li class='n_bulleted_list_item'>Design for changes<div><ul><li class='n_bulleted_list_item'>Encapsulate the concept that varies</li ></ul></div></li ></ul><p class='n_paragraph'></p ><ul><li class='n_bulleted_list_item'>Well-designed object-oriented systems are just like this – they have multiple patterns embedded in them – but not because their designers necessarily thought in these terms. Composition at the pattern level rather than the class or object levels lets us achieve the same synergy with greater ease.</li ></ul><p class='n_paragraph'></p ><ul><li class='n_bulleted_list_item'><b>Design Pattern as aid in identifying targets for Refactoring</b><div><ul><li class='n_bulleted_list_item'>In developing reusable software we have to often reorganize or refactor. Design patterns help you determine how to reorganize a design, and they can reduce the amount of refactoring you need to do later.</li ><li class='n_bulleted_list_item'>The lifecycle of object-oriented software has several phases. Brian Foote identifies these phases as the prototyping, expansionary, and consolidating phases.<div><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/3aed6c29-9a6f-4dab-8b26-cf7bcc132cd5/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213429Z&X-Amz-Expires=3600&X-Amz-Signature=26ef888e988efe1963aa0619fdf97578a3e7e9f506707e703adc93e886c4c105&X-Amz-SignedHeaders=host&x-id=GetObject'/></div></li ><li class='n_bulleted_list_item'>Refactoring involves tearing apart classes into special-and general-purpose components, moving operations up or down the class hierarchy, and rationalizing the interfaces of
classes. This consolidation phase produces many new kinds of objects, often by decomposing existing objects and using object composition instead of inheritance. Hence black-box reuse replaces white-box reuse. The continual need to satisfy more requirements along with the need for more reuse propels object-oriented software through repeated phases of expansion and consolidation – expansion as new requirements are satisfied, and consolidation as the software becomes more general.</li ><li class='n_bulleted_list_item'>This cycle is unavoidable. But good designers are aware of the changes that can prompt refactorings. Good designers also know class and object structures that can help avoid refactorings – their designs are robust in the face of requirement changes. A thorough requirements analysis will highlight those requirements that are likely to change during the life of the software, and a good design will be robust to them.</li ><li class='n_bulleted_list_item'>Our design patterns capture many of the structures that result from refactoring. Using these patterns early in the life of a design prevents later refactorings. But even if you don't see how to apply a pattern until after you've built your system, the pattern can still show you how to change it. Design patterns thus provide targets for your refactorings.</li ></ul><p class='n_paragraph'></p ></div></li ></ul><h3 class='n_heading_3'><b>UML notations</b></h3 ><ul><li class='n_bulleted_list_item'><b>Class diagram notations</b><div><ul><li class='n_bulleted_list_item'>Abstract and concrete classes</li ><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/3bc88fc3-f9e0-496a-9d0e-57762cfb58a7/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213429Z&X-Amz-Expires=3600&X-Amz-Signature=f01e494eaeb136604cd0c03483d735f844449198eb1ae9543a2df2b8f2d2b301&X-Amz-SignedHeaders=host&x-id=GetObject'/><ul><li class='n_bulleted_list_item'>Participant vs implied Client class<div><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/3f7a899e-2b88-49be-9c81-59278e79796a/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213429Z&X-Amz-Expires=3600&X-Amz-Signature=9695b51f617716120f42465e8eaab4518ce2cd90e910b5264c7d3ca0164ba78f&X-Amz-SignedHeaders=host&x-id=GetObject'/></div></li ><li class='n_bulleted_list_item'>Class relationships</li ><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/3688a306-f836-452f-a849-faf613d88dbb/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213429Z&X-Amz-Expires=3600&X-Amz-Signature=aefbcfa54f8f063785020e384b47bcffe41df6da1ecef82ceb14c433a9829277&X-Amz-SignedHeaders=host&x-id=GetObject'/><p class='n_paragraph'></p ><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/7a9b8a59-26b7-4299-88af-d72c4a9c1a60/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213429Z&X-Amz-Expires=3600&X-Amz-Signature=fc4b9e52ded0a8db77d1e975f8d6bd60bc6636e6940faab0ae759e20e5588bcb&X-Amz-SignedHeaders=host&x-id=GetObject'/><ul><li class='n_bulleted_list_item'>Pseudocode annotation<div><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/130f1ba4-b960-476a-903e-8b2ddd4c2834/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213429Z&X-Amz-Expires=3600&X-Amz-Signature=18914a093528e687cedac3a74408891b0ea427b821617b42f8873822195facf8&X-Amz-SignedHeaders=host&x-id=GetObject'/></div></li ></ul></div></li ><li class='n_bulleted_list_item'><b>Object Diagram</b> <div><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/db5ab894-091c-4a06-8848-d01613c19336/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213429Z&X-Amz-Expires=3600&X-Amz-Signature=f6416a04d501e763d269b5747ca7b6e3cae8bd8fec89e93d4236da247d4cb138&X-Amz-SignedHeaders=host&x-id=GetObject'/><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/c94bf3db-d3b8-45a4-8d25-4898a2e1e818/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213429Z&X-Amz-Expires=3600&X-Amz-Signature=8553d0754f63e377ec07e6c07492a3cf01d785d488844759edad7fac4b08cc1d&X-Amz-SignedHeaders=host&x-id=GetObject'/></div></li ><li class='n_bulleted_list_item'><b>Interaction Diagram</b><div><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/4f2f6b12-64cd-4f69-878d-7e9bbad10bab/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213430Z&X-Amz-Expires=3600&X-Amz-Signature=a7d26dfc8966ef98f1b54297a34efbf3b845402061b79ce4b2eb4ed1909b812a&X-Amz-SignedHeaders=host&x-id=GetObject'/><img src='https://s3.us-west-2.amazonaws.com/secure.notion-static.com/e3f7d8fe-304e-473d-b78b-3fb619421eb0/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230118%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230118T213430Z&X-Amz-Expires=3600&X-Amz-Signature=d8ee6d3afcfb34678aec829b88173a74cddeee440c7bfb01497d8f4697b6e1a3&X-Amz-SignedHeaders=host&x-id=GetObject'/><p class='n_paragraph'></p ></div></li ></ul></div></body></html>