From 2b7bc61a5d59f431c54b6e8f1f128686fd4d8a08 Mon Sep 17 00:00:00 2001 From: Glenn Hutchings Date: Sun, 3 Apr 2016 15:46:07 +0100 Subject: [PATCH] Add chapter 4. --- chapters/04.rst | 547 +++++++++++++++++++++++++++++++++++++++++++ images/heidiobj1.png | Bin 0 -> 2136 bytes images/heidiobj2.png | Bin 0 -> 2272 bytes images/heidiobj3.png | Bin 0 -> 2355 bytes images/heidiobj4.png | Bin 0 -> 2384 bytes images/heidiobj5.png | Bin 0 -> 2387 bytes images/heidiobj6.png | Bin 0 -> 2559 bytes images/heidiobj7.png | Bin 0 -> 2519 bytes images/heidiobj8.png | Bin 0 -> 2484 bytes 9 files changed, 547 insertions(+) create mode 100644 chapters/04.rst create mode 100644 images/heidiobj1.png create mode 100644 images/heidiobj2.png create mode 100644 images/heidiobj3.png create mode 100644 images/heidiobj4.png create mode 100644 images/heidiobj5.png create mode 100644 images/heidiobj6.png create mode 100644 images/heidiobj7.png create mode 100644 images/heidiobj8.png diff --git a/chapters/04.rst b/chapters/04.rst new file mode 100644 index 0000000..1c326c4 --- /dev/null +++ b/chapters/04.rst @@ -0,0 +1,547 @@ +====================== + Reviewing the basics +====================== + +.. epigraph:: + + | *G was a gamester, who had but ill-luck;* + | *H was a hunter, and hunted a buck.* + +Going through the design of our first game in the previous chapter has +introduced all sorts of Inform concepts, often without giving you much +detail about what's been happening. So let's review some of what we've +learnt so far, in a slightly more organised fashion. We'll talk about +"Constants and variables" on page 49, "Object definitions" on page 50, +"Object relationships -- the object tree" on page 52, "Things in quotes" on +page 55, and "Routines and statements" on page 56. + +Constants and variables +======================= + +Superficially similar, constants and variables are actually very different +beasts. + +.. rubric:: Constants + +A **constant** is a name to which a value is given once and once only; you +can't later use that name to stand for a different value. Think of it as a +stone tablet on which you carve a number: a carving can't be undone, so +that you see the same number every time you look at the stone. + +So far, we've seen a ``Constant`` being set up with its value as a string +of characters:: + + Constant Story "Heidi"; + +and as a number:: + + Constant MAX_CARRIED 1; + +Those two examples represent the most common ways in which constants are +used in Inform. + +.. rubric:: Variables + +A **variable** is a name to which a value is given, but that value can be +changed to a different one at any time. Think of it as a blackboard on +which you mark a number in chalk: whenever you need to, just wipe the board +and write up a new number. + +We haven't set up any variables of our own yet, though we've used a couple +which the library created like this:: + + Global location; + Global deadflag; + +The value of a **global variable** created in this way is initially 0, but +you can change it at any time. For example, we used the statement:: + + location = before_cottage; + +to reset the value of the location variable to the ``before_cottage`` +object, and we wrote:: + + if (nest in branch) deadflag = 2; + +to reset the value of the ``deadflag`` variable to 2. + +Later, we'll talk about the **local variable** (see "Routines" on page 179) +and about using object properties as variables (see "Objects" on page 177). + +Object definitions +================== + +The most important information you should have gleaned from the previous +chapter is that your entire game is defined as a series of objects. Each +room is an object, each item that the player sees and touches is an object; +indeed the player herself is also an object (one that's automatically +defined by the library). + +The general model of an **object** definition looks like this:: + + Object obj_id "external_name" parent_obj_id + with property value , + property value , + ... + property value , + has attribute attribute ... attribute + ; + +The definition starts with the word ``Object`` and ends with a semicolon; +in between are three major blocks of information: + +* immediately after the word ``Object`` is the header information; +* the word ``with`` introduces the object's **properties**; +* the word ``has`` introduces the object's **attributes**. + +.. rubric:: Object headers + +An object header comprises up to three items, all optional: + +* An internal ``obj_id`` by which other objects refer to this object. It's + a single word (though it can contain digits and underscores) of up to + thirty-two characters, and it must be unique within the game. You can + omit the ``obj_id`` if this object isn't referred to by any other + objects. + + For example: ``bird``, ``tree``, ``top_of_tree``. + +* An ``external_name``, in double quotes, which is what the interpreter + uses when referring to the object. It can be one or more words, and need + not be unique (for instance, you might have several ``"Somewhere in the + desert"`` rooms). Although not mandatory, it's best to give *every* + object an ``external_name``. For example: ``"baby bird"``, ``"tall + sycamore tree"``, ``"At the top of the tree"``. + +* The internal ``obj_id`` of another object which is the initial location + of this object (its "parent" -- see the next section) at the start of the + game. This is omitted from objects which have no initial parent; it's + *always* omitted from a room. + + For example: the definition of the ``bird`` starts like this, specifying + that at the start of the game, it can be found in the ``forest`` room + (though later the player character will pick it up and move it around):: + + Object bird "baby bird" forest + ... + + The ``tree`` starts like this; the only real difference is that, because + the player character can't move a ``scenery`` object, it's always going + to be in the ``clearing``:: + + Object tree "tall sycamore tree" clearing + ... + + .. note:: + + There's an alternative method for defining an object's initial + location, using "arrows" rather than the parent's internal ``obj_id``. + For example, the definition of the bird could have started like this:: + + Object -> bird "baby bird" + ... + + We don't use the arrows method in this guide, though we do describe + how it works in "Setting up the object tree" on page 185. + +.. rubric:: Object properties + +An object's property definitions are introduced by the ``with`` keyword. +An object can have any number of properties, and they can be defined in any +order. Each definition has two parts: a name, and a value; there's a space +between the two parts, and a comma at the end. + +Think of each property as a variable which is specifically associated with +that object. The variable's initial setting is the supplied value; if +necessary, it can be reset to other values during play (though in fact most +property values don't change in this way). + +Here are examples of the properties that we've come across so far:: + + description "The nest is carefully woven of twigs and moss.", + e_to forest, + name 'baby' 'bird' 'nestling', + each_turn [; if (nest in branch) deadflag = 2; ], + +By happy coincidence, those examples also demonstrate most of the different +types of value which can be assigned to a property. The value associated +with the ``description`` property in this particular example is a string of +characters in double quotes; the value associated with this ``e_to`` +property is the internal identity of an object; the ``name`` property is a +bit unusual -- its value is a list of dictionary words, each in single +quotes; the ``each_turn`` property has a value which is an **embedded +routine** (see "Embedded routines" on page 58). The only other type of +value which is commonly found is a simple number; for example:: + + capacity 10, + +In all, the library defines around forty-eight standard properties -- like +``name`` and ``each_turn`` -- which you can associate with your objects; +there's a complete list in "Object properties" on page 266. And in +"William Tell: in his prime" on page 91 we show you how to invent your own +property variables. + +.. rubric:: Object attributes + +An object's attribute list is introduced by the ``has`` keyword. An object +can have any number of attributes, and they can be listed in any order, +with a space between each. + +As with properties, you can think of each attribute as a variable which is +specifically associated with that object. However, an attribute is a much +more limited form of variable, since it can have only two possible states: +present, and absent (also known as set/clear, on/off, or true/false; +incidentally, a two-state variable like this is often called a **flag**). +Initially, an attribute is either present (if you mention its name in the +list) or absent (otherwise); if necessary, its state can change during play +(and this is relatively common). We often say that a certain object +currently *has* a certain attribute, or that conversely it *hasn't* got it. + +The attributes that we've come across so far are:: + + container light open scenery static supporter + +Each of those answers a question: Is this object a container? Does it +provide light? and so on. If the attribute is present then the answer is +Yes; if the attribute isn't present, the answer is No. + +The library defines around thirty standard attributes, listed in "Object +attributes" on page 269. Although you *can* devise additional attributes +-- see "Common properties and attributes" on page 185 -- in practice you +seldom need to. + +Object relationships -- the object tree +======================================= + +Not only is your game composed entirely of objects, but also Inform takes +great care to keep track of the relationships between those objects. By +"relationship" we don't mean that Walter is Wilhelm's son, while Helga and +Wilhelm are just good friends; it's a much more comprehensive exercise in +recording exactly where each object is located, relative to the other +objects in the game. + +Despite what we just said, Inform relationships *are* managed in terms of +**parent** and **child** objects, though in a much broader sense than +Wilhelm and Walter. When the player character is in a particular room -- +for example the forest -- we can say that: + +* the forest object is *the* parent of the player object, or alternatively +* the player object is *a* child of the forest object. + +Also, if the player is carrying an object -- for example the nest -- we say +that: + +* the player object is *the* parent of the nest object, or that +* the nest object is *a* child of the player object. + +Note the emphasis there: an object has exactly *one* parent (or no parent +at all), but can have *any number* of child objects (including none). + +For an example of an object having more than one child, think about the way +we defined the nest and tree objects:: + + Object nest "bird's nest" clearing + ... + + Object tree "tall sycamore tree" clearing + ... + +We used the third of the header items to say that the clearing was the +parent of the nest, and also that the clearing was the parent of the tree; +that is, both nest and tree are child objects of the clearing. + +.. note:: + + A "room" isn't anything magical; it's just an object which *never* has a + parent, and which *may* from time to time have the player object as a + child. + +When we defined the bird, we placed it in the forest, like so:: + + Object bird "baby bird" forest + ... + +We didn't place any other objects in that room, so at the start of the game +the forest was the parent of the bird (and the bird was the only child of +the forest). But what happens when the player character, initially in the +``before_cottage`` room, goes EAST to the forest? Answer: the player's +parent is now the forest, and the forest has two children -- the bird *and* +the player. This is a key principle of the way Inform manages its objects: +the parent--child relationships between objects change continuously, often +dramatically, as the game progresses. + +Another example of this: suppose the player character picks up the bird. +This causes another change in the relationships. The bird is now a child +of the player (and *not* of the forest), and the player is both a parent +(of the bird) and a child (of the forest). + +In this diagram, we show how the object relationships change during the +course of the game. The straight lines represent parent--child +relationships, with the parent object at the top of the line, and the child +object at the bottom. + +.. list-table:: + :widths: 1 3 5 + + * - 1. + - At the start of the game: + - .. image:: /images/heidiobj1.* + + * - 2. + - The player types: ``GO EAST`` + - .. image:: /images/heidiobj2.* + + * - 3. + - The player types: ``TAKE THE BIRD`` + - .. image:: /images/heidiobj3.* + + * - 4. + - The player types: ``GO NORTHEAST`` + - .. image:: /images/heidiobj4.* + + * - 5. + - The player types: ``PUT BIRD IN NEST`` + - .. image:: /images/heidiobj5.* + + * - 6. + - The player types: ``TAKE NEST`` + - .. image:: /images/heidiobj6.* + + * - 7. + - The player types: ``UP`` + - .. image:: /images/heidiobj7.* + + * - 8. + - The player types: ``PUT NEST ON BRANCH`` + - .. image:: /images/heidiobj8.* + +In this short example, we've taken a lot of time and space to spell out +exactly how the objects relationship patterns -- generally known as the +**object tree** -- appear at each stage. Normally you wouldn't bother with +this much detail (a) because the interpreter does most of the work for you, +and (b) because in a real game there are usually too many objects for you +to keep track of. What's important is that you understand the basic +principles: at any moment in time an object either has no parent (which +probably means either that it's a room, or that it's floating in hyperspace +and not currently part of the game) or exactly one parent -- the object +that it's "in" or "on" or "a part of". However, there's no restriction on +the number of children that an object can have. + +There's a practical use for these relationships, covered in detail further +on. As a designer, you can refer to the current parent or children of any +given object with the ``parent``, ``child`` and ``children`` routines, and +this is one feature that you will be using frequently. There are also +other routines associated with the object tree, to help you keep track of +the objects or move them around. We'll see them one by one in the next +chapters. For a quick summary, see "Objects" on page 177. + +Things in quotes +================ + +Inform makes careful distinction between double and single quotes. + +.. rubric:: Double quotes + +Double quotes "..." surround a **string** -- a letter, a word, a paragraph, +or almost any number of characters -- which you want the interpreter to +display while the game is being played. You can use the tilde ``~`` to +represent a double quote inside the string, and the circumflex ``^`` to +represent a newline (line break) character. Upper-case and lower-case +letters are treated as different. + +A long string can be split over several lines; Inform transforms each line +break (and any spaces around it) into a single space (extra spaces not at a +line break are preserved, though). These two strings are equivalent:: + + "This is a string of characters." + + "This + is + a string + of characters." + +When the interpreter displays a long character string -- for example, while +describing a feature-packed room -- it employs automatic word-wrapping to +fit the text to the player's screen. This is where you might insert ``^`` +characters to force line breaks to appear, thus presenting the text as a +series of paragraphs. So far, we've seen strings used as the value of a +``Constant``:: + + Constant Headline + "^A simple Inform example + ^by Roger Firth and Sonja Kesserich.^"; + +which could equally have been defined thus:: + + Constant Headline + "^A simple Inform example^by Roger Firth and Sonja Kesserich.^"; + +and as the value of an object description property:: + + description "Too young to fly, the nestling tweets helplessly.", + +Later, you'll find that they're also very common in ``print`` statements. + +.. rubric:: Single quotes + +Single quotes '...' surround a **dictionary word**. This has to be a +single word -- no spaces -- and generally contains only letters (and +occasionally numbers and hyphens), though you can use ``^`` to represent an +apostrophe inside the word. Upper-case and lower-case letters are treated +as identical; also, the interpreter normally looks only at the first nine +characters of each word that the player types. + +When the player types a command, the interpreter divides what was typed +into individual words, which it then looks up in the dictionary. If it +finds all the words, and they seem to represent a sensible course of +action, that's what happens next. + +So far, we've seen dictionary words used as the values of an object +``name`` property:: + + name 'bird^s' 'nest' 'twigs' 'moss', + +and indeed that's just about the only place where they commonly occur. +You'll save yourself a lot of confusion by remembering the distinction: +Double quotes for Output, Single quotes for Input (DOSI). + +Routines and statements +======================= + +A routine is a collection of statements, which are performed (or we often +say "are executed") at run-time by the interpreter. There are two types of +routine, and about two dozen types of statement (there's a complete list in +"Statements" on page 174; see also "Inform language" on page 257). + +.. rubric:: Statements + +A **statement** is an instruction telling the interpreter to perform a +particular task -- to "do something" -- while the game is being played. A +real game usually has lots and lots of statements, but so far we've +encountered only a few. We saw:: + + location = before_cottage; + +which is an example of an **assignment** statement, so-called because the +equals sign ``=`` assigns a new value (the internal ID of our +``before_cottage`` room) to a variable (the global variable ``location`` +which is part of the library). Later we saw:: + + if (nest in branch) deadflag = 2; + +which is actually *two* statements: an assignment, preceded by an ``if`` +statement:: + + if (nest in branch) ... + +The ``if`` statement tests a particular condition; if the condition is +true, the interpreter executes whatever statement comes next; if it isn't +true, the interpreter ignores the next statement. In this example, the +interpreter is testing whether the ``nest`` object is "in" or "on" (which +we now know means "is a child of") the ``branch`` object. For most of the +game, that condition is not true, and so the interpreter ignores the +following statement. Eventually, when the condition becomes true, the +interpreter executes that statement: it performs an assignment:: + + deadflag = 2; + +which changes the value of the library variable ``deadflag`` from its +current value to 2. Incidentally, if statements are often written on two +lines, with the "controlled" statement indented. This makes it easier to +read, but doesn't change the way that it works:: + + if (nest in branch) + deadflag = 2; + +The thing that's being controlled by the ``if`` statement doesn't have to +be an assignment; it can be any kind of statement. In fact, you can have +lots of statements, not just one, controlled by an ``if`` statement. We'll +talk about these other possibilities later. For now, just remember that +the only place where you'll find statements are within standalone routines +and embedded routines. + +.. rubric:: Standalone routines + +A **standalone routine** is a series of statements, collected together and +given a name. When the routine is "called" -- by its given name -- those +statements are executed. Here's the one that we've defined:: + + [ Initialise; location = before_cottage; ]; + +Because it's such a tiny routine, we placed it all on a single line. Let's +rewrite it to use several lines (as with the ``if`` statement, this improves +the readability, but doesn't affect how it works):: + + [ Initialise; + location = before_cottage; + ]; + +The ``[ Initialise;`` is the start of the routine, and defines the name by +which it can be "called". The ``];`` is the end of the routine. In +between are the statements -- sometimes known as the body of the routine -- +which are executed when the routine is called. And how is that done? By a +statement like this:: + + Initialise(); + +That single statement, the routine's name followed by opening and closing +parentheses, is all that it takes to call a routine. When it comes across +a line like this, the interpreter executes the statements -- in this +example there's only one, but there may be ten, twenty, even a hundred of +them -- in the body of the routine. Having done that, the interpreter +resumes what it was doing, on the line following the ``Initialise();`` +call. + +.. note:: + + You may have noticed that, although we've defined a routine named + ``Initialise``, we've never actually called it. Don't worry -- the + routine is called, by the Inform library, right at the start of a game. + +.. rubric:: Embedded routines + +An **embedded routine** is much like a standalone routine, though it +doesn't have a name and doesn't end in a semicolon. This is the one that +we defined:: + + [; if (nest in branch) deadflag = 2; ] + +except that we didn't write it in isolation like that: instead, we defined +it to be the value of an object property:: + + each_turn [; if (nest in branch) deadflag = 2; ], + +which would have worked just the same if we'd written it like this:: + + each_turn [; + if (nest in branch) + deadflag = 2; + ], + +All embedded routines are defined in this manner: as the value of an object +property. That's where they're embedded -- inside an object. The +introductory characters ``[;`` maybe look a little odd, but it's really +only the same syntax as for a standalone routine, only without a name +between the ``[`` and ``;``. + +For calling an embedded routine, thus causing the statements it contains to +be executed, the method that we described for a standalone routine won't +work. An embedded routine has no name, and needs none; it's +*automatically* called by the library at appropriate moments, which are +determined by the role of the property for which it is the value. In our +example, that's at the end of every turn in which the player character is +in the same room as the branch. Later, we'll see other examples of +embedded routines, each designed to perform a task which is appropriate for +the property whose value it is; we'll also see that it is possible to call +an embedded routine yourself, using an ``obj_id.property()`` syntax -- in +this example, we could call the routine by writing ``branch.each_turn()``. +There's more about these topics in "Routines and arguments" on page 67, "A +diversion: working with routines" on page 104 and in "Routines" on +page 179. + +That ends our review of the ground covered in our first game. We'll have +more to say about most of this later, but we're trying not to overload you +with facts at this early stage. What we'd like you to do is to look back +at the source of the game, and ensure that you can recognise all the +elements which this chapter has described. Then, we'll move on to fix a +few of the game's more important defects. diff --git a/images/heidiobj1.png b/images/heidiobj1.png new file mode 100644 index 0000000000000000000000000000000000000000..6caa0e3471fe0e5f87254d90eb3782ecbad24403 GIT binary patch literal 2136 zcmY+FdpOhI1IItaBiC=D+$HjjX4ytA%Se_>jHt*p%w-iOW0-s7x~#tCGBK43x#Y5t zYWkX@(ok-rVsn{Xa$Omk?|$|D&x5DB(KSpq;kNpj0iRKP+w7n|ciEkpII05s6HE+_yX{0RWb zX#lVx7)qW2fG7w6%=!WVybu5s!i!s-%>)y|{`NLV0C;pw3nn1(a9ekrAZ>qD>o=Fo z0YJ>z4rzHNW@N$3;;&YSykjAeehPv{*AEztGTl8!!Y(;sdxXqV6qZE3yfg?Gsl9G6 zY2&jlCu}S1RMs~2zV=!BL|iOsU0cW^^IZ3B*)i$$cTMtRW#CsoF!sxc5tn$<|Di|K z`j5GmK$-F37=9V+b#Hd*&$P?(*Z8U}p;pZ-lcF7zZOkx~%Eq>ZJvHPnaaFbRdnHID z-;oI(DP65hmydWZA!`_y8~HH~xtrtKl^pEXB-qJP%81%rSrA2hxIQ#KxS=7kgXu-~ zE=mrb2+rbI6cPUx3)Vrss7BAc(wEu4ANA_m4Sh>HjW7^FKGJ?*@8_OJl`V<gcjxqGh+I zMN(EhuY&CTT``)Rx!1_W>cNuLqh+1=Cqp@;!Bt%aZsCa-C1?Jd@$I9QGrZ63sM_9C zsIu+TgK0-O(KaLpl{>pk+qRIFQuy~6?|9yEtWEYy!7{}6xPYJ@u@Sw4wNi;GW+{-z zM0j1$!jKw5bLF$%L)o}Q<=!Y+QUBs0(7hn@lr5_q)1h1zH@?CVk$&NwMgh@*v7Jw4 zI(X%r*KpEsI5N83ADj3m9(tHFgf65>MZD>n=V^z!%DM3}+|nw8HcMOE10ysu-txGL z5A{>MU@+5tm_~BT$=3Wy@wCcyUW;q!wc)l}G z>et!*C-uIaQrGiLCUI03B3j3-=?q(txf6{LW?Q5}tM(*a<0yh9bfu5?V}_NU?7dj5 zVtfEQR~4J_p|XA&!63&R?)x_Ci_2tU)0L%-%Wg>4>3n?2VM!}|mA@*kz@yaYul7;$ z`pzvwgEV{SDh;F2buX$iRhl|CFYb!4?s>*tl6amt(N<+L@CEr*m3o7iPZ?{l?_)-> zUnDh_ZZ=*)G;)&EIl&pe=w34^AX6(2RAyQ_wOzw0haSZjm@xB0DYy{@#^VJ(owk`1 z@7_o^fN!_+9xNXqI$D7?x9YM>A#+|PZ6e$Lqw_4jZ-)7t7lB6I>KfFVBkYEsc!8CanhVx_T?evH@A#_|Mhip3^PY(ZNiLJEfcxytZ#`%U^V^ zLmMx}%_f>tR%08oU7DS#inr0#?+{6?ob$#Z?OV=1+zxUS-;dGrM@Rx07CTuELCUgO z@A2?MA92O^X2YE!DBN$4u8J*yMsR^#-uWmc7&V z8ArwbC5>Rq{!>+3gJlyC8d?dSD?HnYN*9s>bXUa zMkJZGJ0EcKP|gzLYA7$*>_mLbBf#0Cn(G|ms9`E>S9Jv+Y#wtz^^C$EjjA>4^sSKP zTMbQBU)9>_|2uQPiuheBtwHys(DV1`0^$ZCv63tbcD-!f?h@UUA{b{fE20Ysal9glHlC*z>a=c zlVPzcDlak$m;kbptIg$*S_1k+XARllaXar7Bi%)j5;}f=NxDs~B^kP$DsX-5RkHxIl-MI3+s+zIQ z$Kh4010Ggek#`Z5vYd5R$1yjv!$bJ_pI=xb3^AV_gg8d0E14#z?&!&HkcpNNq)#<{ zf#3a+wb4$$Ac?moMYVh$iiLlo47ssbR8ixyDIQNfRF`JsnZ4MT&yJ%$SpN?u%~d)g zs;5D7f?rlU^2E8w0KdpUI65Lw5C9AUH3CBn!4T*f7!(eJ2?_`Tg+n067mJzy5kj#6 n7lL910tEI;Fg*i30yi{(8=CwUeCPx*fdJT@a75M~_r3BDSeO&{ literal 0 HcmV?d00001 diff --git a/images/heidiobj2.png b/images/heidiobj2.png new file mode 100644 index 0000000000000000000000000000000000000000..255a32a0ef98a84436dbb73c553ec8d6b968fc9b GIT binary patch literal 2272 zcmY+F4LH;58^?b-btsYEC`Q;n5!q%^TVDQ)VJaj=CMz0Bi)t)v=JkYm8xuK{mvBr{ zOx})mkmke)jhQ;4d24Bmyfysy_di|N`Cr%lJooc??)!V+*L_{jbv+5rj&@4h)VBcu zpoFovaRC51vh3`vAlm?|OuAU+Hv6H@pa9@`s-pDD78%Rkaj`oIJnaHa$w1r3-sKDc zgy{i5WGn!z$gUzM0U#I(0G}@d05Tf@)Piyw&YH^to4ili*#H1D8Ehh>twHt|@5sFU z#6*sr^umx3K10SSgz{GaVpUmkQ)i5r=8>hzQkQ-0kPx`aKTq;3sfCzHoo_#Z{! z-w_QL*7)&GB&w(gOy4o{f{lVDo8K(gs0sNub#2cmo?_0>H%h-=){VCe z-L;w2mAEH_BQyYGZuSh-Z?CyNkZ0i)Zj@1)WhKutPh4o*iAgd#i85B9ZBxe0B(pcc z0=X$-s3Qe~Pd6~xAieSUT_hf{{Y|oxceLimpD;x&Fqx4;DI(4;H z#}u?DYU2$JVEc2j=Yosgd+=5!q+MTb{dI{bY1Tae_v*eFpBX>uq_<85N4AT19eYp^ zh49eBE5=g0#9dks%usUUQpxUvF#nv99P(^5&TV_zT;nUHS`8Dp1TQdBbURGNOBh?> z#e8r;|8zsOUA!aLTOBId9lf|E@zvcgB>VH0HqvG^_uHuvU0l_Pf{st<6#E?_klcXku3vuO3t<2am<|;Kf?i5-_K4(sZ zIF0*x8AN|DhZo$~=0<;tmUTZj7BE>OY%%owBNx|wWyPdjzBP&bzzjcfIOF!LVMgic zY^Gq{4NSH4D2I%2HyS`eB622_Gc;ul+^n@!Un(uvu~O7p<+`>oR1ds2ez$$4uahTx z*B|$J)T`e+cF&OU{FB1R)zBgfv6H*$B)GTTuePZ5;QOMvNy1w6{x$QS7Qn~*BiE){ z^DHUmgl#~#wlm}2SHhR0>WF>(tP3a5j_jnqS<8$*DYK8V;@F}&xu}8Lzq~~=rR@V5>8{JJ z4+8PGus%y$a@n%k(z&A6PYZM+OH7j^+Q81yii^`kVp%sF1|j<1q(fS^y6fu0%Q|QA9`9N?e za_PW_6RWLfZNkm5wcji)nvY5_-4S1eXn0-ju=vlMxEg}3(~ZDm^9bvHEsG(&@-k)< zMfvyhzS?xiBkM>;nBk}t#p~1P;`{rFIy&Sn6{cK!MxqR=Y6C*gz7eF93~V7Z z979k2ipqV7F2MTeP@S5-q#SOvQ6PXicCT@d0cPhD_0AyG`#Z=gf}+A!<4~RO#uvH{ z`T>nOUTUnV>&)wwpvs^E)=O`F2RU+A(JhFx(9N&TbmBfbE zX<@oJgMbr%>yQ#rbCrXz{PB&zqiOg%FUiVsE}xG?@IPeQm+4TACTQ}O432eYd+h|- zRYbu4P)*Qg9n^~Z)p(DrOuuePk{*_{-BEbv5;$w;d^j_xG_L{zIk1#3tdgb}bUm3C zARf7e4c-5H+NU9}?#9s^M6_Z?@<^4t`|$}87Lpfe_5#V~Fz zWBYGbAR`*4Usuhj{BkaDN9s6xfc;_NLyBFaI8lmtUNLU{X7__6!)03B@{{tae BWIO-> literal 0 HcmV?d00001 diff --git a/images/heidiobj3.png b/images/heidiobj3.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd73a59ffec6760e4d6f43e57364206c5c5b0b8 GIT binary patch literal 2355 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 literal 0 HcmV?d00001 diff --git a/images/heidiobj7.png b/images/heidiobj7.png new file mode 100644 index 0000000000000000000000000000000000000000..46ab2b7480e62977eef556635143b33f6a45d51f GIT binary patch literal 2519 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 literal 0 HcmV?d00001 -- 2.31.1