Table of Contents 1 Introduction



Download 0.52 Mb.
Date28.01.2017
Size0.52 Mb.
#9124

Table of Contents


1.1 Introduction

The world of XML is one that, to those who are unfamiliar with XML, may seem like an unexplored phenomenon. What is XML? Is it a programming language? Is it a data structure? Is it a web markup language? You will find as you learn XML that it is none of these things, all of these things, and more besides that.

One thing for sure is that XML is definitely important. Google, Inc. has launched dozens of new sites within the past few years running new applications. If you are reading this, the odds are good that at least once you have used one of these new services from Google. At the heart of Google Maps, one of the better known tools, lies an XML database which delivers map data to the user in real-time. These tools function as well as executable applications running on one’s PC, directly from the web. Some call this movement toward a more powerful web is referred to as Web 2.0, and XML is a huge part of this movement.

Microsoft has also taken note of this change, as has Yahoo. Both have announced new online applications that use XML to be released shortly, so they may compete with Google. Also, after a five-year hiatus, Microsoft is finally updating its Internet Explorer browser to version 7 to include the clamored-for XML feature, RSS syndication. RSS syndication is one of the factors that led to a 25% decline in market share for the Internet Explorer browser in favor of RSS capable competing browsers, such as Mozilla Firefox.

As XML becomes more important to companies, developers who are familiar with XML have become in higher demand. Although there may always be a place somewhere for those who know how to program mainframes and work in DOS, there is a bold progression being made towards the free, standardized, and infinitely expandable format known as Extensible Markup Language. (This is the correct capitalization, but often users will emphasize the aptness of the acronym XML by capitalizing it as eXtensible Markup Language.)

This book will focus on the XML applications which these companies will want most. It would be physically impossible for a one-volume book to cover every use of XML in the world, even without accounting for the research involved. An important thing to note is that for every public format of XML that exists in the industry, there may be several more private or “system” formats that are used in a specific application.


1.2 About the format of this book
As you must have noticed by now, (unless someone has reproduced this book without my permission,) this entire book is available for free on my site, <http://xmlbook.info>. There are many reasons behind this. First of all, the information in this book is formatted to be used in the technology setting of today, and I know that technology can change dramatically over just a couple of years. By the time this book was published, it would be obsolete. Second, today’s student pays an exorbitant price for textbooks, particularly textbooks for computer science and programming language reference. If I were to publish this book in print, for the sake of convenience to those who prefer a hard copy, it would have to be done without diminishing the free online version of the book. Third, internet access is very convenient and an online book can never be lost or stolen from a student. Finally, thanks to the versatile Word document format (hey, even today, there are some things XML does not do right 100% of the time), I have posted a version of this book that can be printed out. Please direct any comments about the book, or about this book’s format, to me at <XML@xmlbook.info>.

2.1 SGML


Without SGML, there would not be any XML. Many XML books devote about two sentences out of the entire book to SGML. However, XML and SGML are so similar, it is necessary to look at SGML to understand where XML came from. The Standardized Generalized Markup Language began the whole movement toward a structured markup language that is human-readable and self-documenting.

SGML is a standardized variant of its original form, which was just Generalized Markup Language (GML). Its creators were Charles Goldfarb, Edward Mosher and Raymond Lorie (last names ending with the letters G, M, and L, respectively). Like so many technologies of old, GML was conceived at IBM for use in law office information systems. In 1969, these three created GML to address a problem with data storage: How to keep one’s data consistent on every platform, without loss of formatting? After all, in those days, there was not the oligopoly of computer brands there is today; there were many different breeds of computer and none played nice with any other. GML was an approach to resolve this issue by tossing arbitrary data structures in favor of a flexible, self-documenting markup language. Eventually, this language grew into SGML, and became an ANSI (American National Standards Institute) standard. Later, the International Organization for Standardization (ISO) adopted SGML as a standard, ISO 8879:1986. You can go to the ISO website and purchase the documentation for this standard for a meager $180.00. Later in this book, when we get to XML, I will talk about free standards: standards that are published and accessible free of charge.
2.2 Structure
The whole point of SGML is for a formatted document to be structured in a hierarchical manner, such that portions of data are contained within elements. These elements do not natively have any meaning; in SGML you give the element a name, and then you decide in your program what you want to do with that element. The set of all the element names and attributes used in an SGML format are known as an SGML vocabulary. For example, let’s say there is a man named Fred, who owns a restaurant, Fred’s Restaurant. Fred wants to update his menu every week. There are three dishes for sale:


  • Pepperoni Pizza, $8.99

  • Double Cheeseburger, $7.50

  • Club Sandwich, $5.00

If Fred’s prices and specials change often, it makes sense to use a computer program to keep track of the menu and print off new ones with the formatting already applied. (Of course, when we get into XML and styling, we can look at some even more exciting possibilities, such as making the menu appear on the web or creating a point-of-sale system with this data!) Now, with an existing format, you might have special characters for bold, italic, large fonts, and copy and paste the data into that format or write a program for manual entry of data. That is not elegant or efficient. However, if you have a text document that is written in SGML, you can represent the data with elements, like so:







Pepperoni Pizza

8.99







Double Cheeseburger

7.50







Club Sandwich

5.00







Is this a database you would be willing to update? As you can see, a well designed SGML document is very self explanatory. Documentation is not a standard practice in the world of SGML or any of its children, but it is very important to choose obvious element names. In the example above, you can see that the elements have a start tag and an end tag. Both are enclosed in angle brackets <> to distinguish them from the tag’s contents, the regular character data contained in the element. In SGML the end tag begins with a forward slash character, /, to mark the end of the container. Without the end tag, the element could go on forever. The act of placing an end tag at the end of your element is called closing the tag, or in my book, it is called a good idea. Although SGML and HTML are designed to have exceptions to the rule of end tags, I tend to shy away from them as XML does not have exceptions like that. In XML, every element has a start tag and an end tag.

Just to demonstrate how one might live recklessly without the use of end tags, here is a sample of the same menu being made without end tags, assuming the document has been defined in such a way that the end tags are optional. (I will discuss definitions later.) The root element, menu, must always have an end tag, no matter what. However, if the food element is not defined to have any other food elements nested below it, the parser could assume that once it reaches a new food element, the current one has ended and it may begin the new one. Likewise, if name and price cannot contain themselves or each other, those can be assumed to have ended once a name or price start tag is found. As complicated as all of that explanation is, the change to the code hardly seems worth it:






Pepperoni Pizza

8.99




Double Cheeseburger

7.50




Club Sandwich

5.00




If you had to write a program to parse this SGML data and produce a menu, which style would you prefer? Would you rather write a program that stops reading character data when the tag is closed, or would you rather read the next tag, then check all the rules in the definition for the nesting of tags, and determine if you should stop reading character data based on all those rules?

The lesson I hope this teaches you is that end tags are your friend. You must never forget them. There is also the occasional need for a tag which contains no data, but is left empty. An empty tag, according to the intuition of an SGML writer, has no need for an end tag. However, once again, XML requires the end tag even for an empty tag. Since SGML does not specifically prohibit an end tag, you would be doing yourself a favor to include one.

Why would anyone ever use an empty tag? In some cases, information needs to be stored in a document that will never be read in the final production. This makes the most sense in a displayed medium; one who uses XML as a database would probably want all data to be plain character data. However, for Fred’s menu, he might want to place a smiling face next to menu items that are a favorite among customers. Rather than resort to a pitiful-looking emoticon, he can add an empty element to flag these items:








Pepperoni Pizza

8.99





...


The pizza is now flagged. The element name is the first word in the tag, icon. After the space can come one or more attributes, or invisible data that further defines the element. The attribute named smile has a value of yes. Perhaps Fred’s Double Cheeseburger is very spicy, and he needs to designate it with a chili pepper. He can add another attribute to his icon:




...



Double Cheeseburger

7.50





...

Fred could even have both smile=”yes” and chili=”yes” on his Double Cheeseburger at the same time:


...

...

There is no limit to the number of attributes. Generally you should always put double-quote marks on the value. First of all, this makes it easier to keep track of the value. Second, it prevents the parser from becoming confused if your value contains spaces. Third, and most importantly, you are required to do it in XML anyway, so get used to it. The good news is XML has a shorthand for empty tags, so you will not have to keep using the end tag for long. That syntax would be invalid SGML, though, so be patient.

Fred could have omitted the ="yes" portion of the smile and chili attributes. He could have just left them as smile and chili:





...

...

This would be valid SGML. SGML allows attributes to be left without values, and instead they are either set or unset depending on whether the attribute is present. These are called minimized attributes. This is another one I will tell you to shy away from, because this is another thing you cannot do in XML. XML requires every attribute to have a value.

It is possible to add comments to an SGML document. This comment syntax is compatible with every SGML descendent in this book, including HTML, XML, and all the derivative document types. A comment looks sort of like a tag, but because of the way it is formed, it can contain other tags without them being processed. To begin a comment tag, you use this syntax: . That’s an explanation point and two dashes at the beginning of the tag. To end a comment, you again use two dashes but not another exclamation point: -->. Here is an example of a comment that might be seen in an SGML file:








Pepperoni Pizza

8.99





...


Although, as I noted above, SGML is fairly self-documenting, it is sometimes important to include further documentation in the file. For example, someone adding new items to the menu might not know how to add icons. Fred could write a big manual detailing everything about this system, but for a quick update that would consume too much time. Instead, Fred should insert a comment like this:




Example:

Default value for both icons is no, just omit the attribute

if unwanted.-->



...


2.3 Hierarchy


By now, you should be noticing something about the way tags are nested. Until XML, there was not nearly as much emphasis on the nesting of elements—but it was always a part of SGML. As I mentioned in 2.2, all elements in a document form a hierarchy. Any element could be defined to have a parent and a child. (Note: Parents of parents and children of children are not still parents and children. This should be obvious, but they are grandparents and grandchildren.) The root element, the element at the very top of the tree (or bottom, depending on how you look at it), cannot have any parents. Also, the root element cannot have siblings, meaning there can only be one root element and nothing else at the root level in the hierarchy. Other elements could have siblings, either of the same element or other elements.

Some elements will be defined to never have any children. For example, why might someone ever nest another element as a child of an icon? The icon element would probably be defined to have no children. Although it may seem very unlikely, perhaps even ridiculous, as the system is expanded it is always possible that the definition for the element could change to allow a child.

As it might turn out, perhaps many years after implementing and expanding this system, Fred decides he would like for the icon to appear in both his menu and his point-of-sale system. His reason for this change is he would like for new employees taking delivery orders to notify the customer of the spicy items before placing the order. The problem is that the program he uses to produce his print menu takes SVG (Scalable Vector Graphics) format, but his point-of-sale system can only display PNG (Portable Network Graphics) images.

By the way, Scalable Vector Graphics is one of the applications of XML! More information will be provided about SVG later on.

To handle this situation, Fred might add the following children to the icon element:


...



Double Cheeseburger

7.50








...

Fred’s colleague Angela points out that he should just hard-code the chili images into each respective system, since the picture is the same for every chili. Fred agrees that that would make more sense, but unfortunately, SGML does not have an easy way to handle that—the change would have to be made to the application program. In the XML world, there are two much better ways of handling this situation that will be discussed in this book: Cascading Style Sheets (CSS) and eXtensible Stylesheet Language (XSL). Fred holds off on the icons and starts evaluating the possibility of changing his system over to XML.

Meanwhile, Fred and Angela acquire two other restaurants, and all three have different menus. Fred would like to keep all of his menus in one SGML file. How does he do this? He simply changes the root element menu so its child is not the food element, but instead a new restaurant element.










Pepperoni Pizza

8.99



...


(Continued)







Lunch Buffet

5.99



...








Lasagna

7.99



...





As you can see, the food elements are now the children of restaurants. This makes each food item appear on each restaurant’s menu. By doing it this way, Fred can take delivery orders for all three restaurants using one point-of-sale system accessing one SGML file. If he wanted to do so, he could even write a program to increase the prices of all the menu items at all his restaurants in one sweep. In many cases, it is ideal to have one document contain information spanning multiple entities, as SGML and XML processing can in some cases be faster than file system processing.

When designing a document type in SGML or XML, it is important to think about the relationship between the data items when nesting them. Do not nest one element as a child of another just because it looks nice. For an element to have children, you imply that those child elements could not exist without the parent. For example, the name and price of a food could not exist without that food existing. However, this is not always a valid test. Could the restaurants exist without a menu? Probably not, but does it make sense for them to be children? If Fred had decided to create separate SGML files for each restaurant, he may have decided to make the root element be restaurant and then have either menu or food elements as children. However, if he did the same thing with the one XML file, in other words, had restaurant as the root and menu or food elements as children, that would not make sense. SGML only allows one instance of the root element. In that case, you would have one restaurant with three menus, which is not an accurate representation of the data: Fred owns three restaurants, and each has just one menu. A good way to check to see if your hierarchical relationships make sense is to draw a tree of all the elements in your document.

One way to interpret the system that is implemented in the example above is to say that each restaurant is a part of the menu—the part for that restaurant. Another more accurate way to describe it is that not all parent-child relationships make perfect sense from a logical standpoint, but it makes sense to code it that way. One alternative would be to change the root element to menugroup, then make menu a child of each restaurant. However, if each restaurant has only one menu, this would be wasteful. You would have a restaurant tag and a menu tag for every restaurant. If there were multiple menus for each restaurant, this would be an ideal solution.

After Fred and Angela debate about this matter all night, they compromise and code menugroup as the root element, and restaurant as the child of menugroup. When the day comes that they create separate lunch and dinner menus for a restaurant, they will add menu elements as children of each restaurant. Until then, they just leave food elements as children of restaurants:








Pepperoni Pizza

8.99



...


...



It makes the most sense, when designing a system in SGML or XML, to make your root element descriptive of the document, and not any tangible entity in the outside (or inside) world. For example, if you were making an SGML file containing information about a baseball team, you could name your root element team, but this would cause problems just as soon as you decided to cover more than one team. However, if you made your root element teamdoc, a shorthand for team document, you are encapsulating your SGML file containing a team, or teams, in a bubble that will (probably) never get any bigger. It would not make sense to have two teamdocs, because if it is data that could not be possibly be contained in one teamdoc, you would need to create a whole separate SGML file anyway. Under teamdoc you can place any element that belongs in this document: teams, freeagents, commissioners, sponsors, and so on.


2.4 Chapter Review & Exercises
You should now know what an element is. An element has a start tag and end tag. Each tag has angle brackets <> on either side to separate it from text. You should be able to identify the element name, attributes, and values, as well as its contents, parents, and children. You should know that element contents are usually used for printable data, and attributes are used for behind-the-scenes information.

Here are a few exercises you should try to test your understanding of the section:


1. Design your own SGML system. The application is a list of computer labs at a university. You must make up all of the information; do not use any real information in your assignment. All the information should be fictitious.

For each computer lab, you need to specify all of the following information: Lab building and room number, phone number, directions to the lab, number of computers, software programs available, printers available (black and white or color?), private or public access, and the hours open for all seven days of the week. You must also add one other element of your own choosing. If any default values are invoked by omitting an element or attribute, you must leave a comment noting the default value that is being used.

All possible values must be used for each element, so for example, you must have labs where there is black and white, color, both, or neither kinds of printing available, and you must have a 24-hour lab and a lab that is closed on the weekend. Use attributes, element contents, empty tags, etc. appropriately for the way the data is likely to be handled by an application program.

Remember that the rules for SGML do allow optional end tags and unquoted attribute values, so you may choose to take my advice or not regarding those two things. Also, SGML is not case-sensitive, so you can use capital or lowercase letters for element names and attributes or whatever combination thereof you like.


2. Pick any element (or two or three) in the below document and identify its element name, start tag, end tag, attributes, attribute values, parents, children, grandparents, grandchildren, siblings, contents, and whether or not it is an empty tag. For hierarchical relationships, you only need to identify element names (multiple times for multiples of the same element name). The document is valid SGML.










1002 E Hotel St

Tonville

48404









Queen

King

Double











132 Canyon Rd

Edge Canyon

25599









King Suite

Double Suite

King

Double









8820 Fairview Crossing

Fairview

25578









King Suite

Double Suite

King

Double

(Continued)







3. Draw a tree representing the hierarchy of the above SGML document.

4. Although the above SGML document breaks many of my style rules for XML preparation, there are a few other problems with the way elements and attributes are laid out. Find ways to improve this document’s structure into a form that makes more sense based on what you learned in this chapter. Remember the rules about printable vs. invisible data and smart hierarchy.

3.1 HTML


HTML is the most well-known application of SGML, and one of the more important markup languages to know today. HTML coding involves a different mode of thinking from SGML, although since many programmers learned HTML before learning SGML or XML, it is the more traditional uses of markup language that seem to be different to the “old fashioned” programmers. HTML was invented in the early 1990s by Tim Berners-Lee in order to make webpages which could link to one another and have a limited amount of formatting applied to the text. He called this concept “HyperText” and this led to the acronym for HTML, which stands for HyperText Markup Language. If you are reading the book online, you are reading this book presented in XHTML, a variant of HTML which will be covered later.

Berners-Lee did not only invent HTML, he also invented HTTP, which stands for HyperText Transfer Protocol, and basically he invented the World Wide Web. He set up the world’s first web server, a NeXTcube system, and proceeded to affix a sticker on the front where he scribbled out: “This machine is a server. DO NOT POWER IT DOWN!!” This image is online at Wikipedia at (and if you are reading the HTML version of the book, this appears as a hyperlink, which you can click on and be immediately taken to the destination page). HTML was later standardized by two big names in the standardization of internet protocols: The IETF, or Internet Engineering Task Force, published HTML 2.0 as one of its thousands of RFCs or Requests For Comments, and then in 1994 Berners-Lee founded the World Wide Web Consortium, or W3C for short, who should by the end of this book be very important to you. The W3C are responsible for HTML versions 3 and 4, XML, XHTML, CSS, and pretty much everything else in this book other than SGML.

I will not cover HTML very thoroughly, since there are thousands of books, a great many websites, classes at almost every college and high school, and the W3C standard that can be referenced for further learning. I will only cover enough HTML to facilitate your understanding of SGML a little better. However, after reading this, you should be well equipped to make your very own website, which is a collection of several HTML documents that are posted online.


3.2 Structure
As I stated earlier, HTML is a very different approach from any other use of SGML or, as you will see, XML. Rather than containing a hierarchical structure of data and representing it by relationship, HTML is simply plain text with segments of the text encapsulated in an element to represent visual formatting. This approach is a very different way to look at SGML, but it is perfectly valid. Although it might seem like the order of elements would not inherently matter in SGML, that is not a rule of SGML. Like many other aspects of SGML, whether the order of elements matters depends on the implementation. This will become obvious as we go on, but if the order did not matter for elements in an HTML document, you might have one block of bold text substituted for another. All of the bold keywords in this book would appear in random places, and you might see in the above paragraph, “You should be well equipped to make your very own IETF” instead of website. Obviously in the case of HTML, order does matter, and in fact most web browsers process an HTML document sequentially, rather than looking at the page as a whole. This method allows the browser to begin displaying the page immediately rather than wait for it to download completely.

There are some pitfalls to this approach. By assigning HTML tags a distinct visual meaning, it then becomes difficult to change the visual appearance of a website when there may be dozens or even hundreds of elements that need to be changed. Cascading Style Sheets (chapter 8) can be applied to HTML documents and instruct the browser to change the visual appearance of certain elements, but an even more maintainable approach is to create a webpage using XML and then processing the XML to convert it to HTML when it is accessed by the user. This will be covered in due time, but in order to be able to convert XML to HTML, you must know how to code HTML.

To continue the Fred’s Restaurant application, Fred has decided he would like to post a website containing his menu. Fred does not change his menu very often yet, so he will just use HTML and update his website manually when he does. Fred begins, as any astute web designer would do, by drawing up a visual representation of how he would like his site to look:


Fred’s Restaurant
Open Monday-Friday 10 AM to 10 PM, Saturday-Sunday 10 AM to 12 Midnight


Menu:

Lunch
Club Sandwich, $5.00

Turkey Sandwich, $4.75

Soup du Jour, $2.00

Soup and Half Sandwich, $4.50



Dinner
Pepperoni Pizza, $8.99

Other toppings, add $0.50

Double Cheeseburger, $7.50



E-mail Fred’s Restaurant

Fred, of course, expects this to be easy, since it is easy to make a document like this in a word processor (except for the e-mail hyperlink, of course). However, he soon realizes, and let’s say this is in the early 90’s when there were no WYSIWYG (What You See Is What You Get) HTML editors, that this is actually a fairly complicated webpage to put together. However, it will benefit Fred greatly to learn HTML, since he may one day decide to integrate his point-of-sale and menu printing systems with the website and have the HTML generated automatically, which cannot be done with WYSIWYG editors.

The HTML document is a SGML document, and as such it must follow SGML conventions. There are a few that I did not mention in chapter 1, but now that you understand the mechanics of SGML, you can learn a small technical detail about SGML. Every SGML document should have a Document Type Declaration (DTD), and the same is true for XML. Is it absolutely necessary that you include one? Usually, the answer is no. Most web browsers assume that any webpage is going to be HTML, and that any RSS stream that is referenced will be in RSS format. Also, very few end-user applications actually check the document against the DTD you supply, as that would be time-consuming. Instead, the browser uses its internal rules for handling the document, which is all it would be able to process anyway. But just to be a good sport, Fred is going to include the DOCTYPE tag and avoid a warning from the W3C Validator (which will be discussed later):



The DOCTYPE tag is not an element, so rules that apply to elements are not closed. The DOCTYPE tag is never closed. There are no attributes, only values whose meaning is defined by their order in the tag. The first value, html, is the root element. In case-sensitive markup languages, like XML, it must be capitalized the same way as the actual root element. Since HTML is a subset of SGML, you can mix capitalization and it won’t matter. As a side note, all my HTML examples will be in lowercase to be consistent with XHTML and XML conventions. However, I generally prefer uppercase HTML tags to help them stand out from character data when working with regular HTML.

The PUBLIC defines the usage of the markup language you are using. If this were an XML language you designed by yourself for use inside a system, you would use SYSTEM in place of PUBLIC. Any W3C standard is of course going to be PUBLIC. The next item in the tag is a big quoted item that describes the standard being used. This standard definition is a sort of list that is delimited by two forward slashes. The first item in the list is a minus sign. The next item is the organization that created the standard, W3C. If the standard was created by an ISO registered organization, the minus that came before would be a plus instead. Minus means that the organization is not ISO registered, and the W3C is not.

The next item is the document type in use. The first word is always DTD for any document that uses a DTD file, and all the standards in this book do. After that comes the name of the standard. HTML 4.01 Transitional is a document type that allows for all the old tags we love to use so much, to make text underlined or centered, for example. The HTML 4.01 (also known as Strict) document type was created by the W3C to forbid the use of those tags, because they are deprecated or basically obsolete. Although Cascading Style Sheets are a valid alternative to using an underline element, for a small webpage it can be monstrously inconvenient when the deprecated element for an underline is simply Underline. The u element is much easier, and the Transitional document type allows it to be used. After that comes the EN, which means the tags are written in English. The next item is a quoted URL (Uniform Resource Locator, basically a web address to a resource) to a DTD file containing all of the formatting rules.

This is an important note about DOCTYPE tags in HTML: Since the meaning of certain tags has changed from past versions of HTML, version 5 and higher browsers test the DOCTYPE tag to choose how to handle the page. Often the way it works is, if no DOCTYPE tag is present, or if a Transitional DOCTYPE tag is present but missing the DTD file URL, the page is rendered by the browser in quirks mode, and all of the new features of HTML and CSS that are seen by the browser developers as a conflict are turned off for compatibility. To turn them back on, give either a Strict DOCTYPE tag (with or without the URL), or a Transitional DOCTYPE with the URL. Your page will then be rendered in standards mode. These sort of arbitrary ways that browsers look at your HTML are a solid reminder that when publishing an HTML document online, it is important to test in many different browsers to make sure they are being displayed the way you intended.

Next comes the root element of the HTML document, which is, simply enough, html:









HTML documents have two main parts: The header and the body. Each can only exist once. The header contains information about the document to identify and describe it, including the title and some metadata about the document. The header can also be used to include JavaScript or Cascading Style Sheets, or to link RSS documents. Basically, the header is where anything that can’t be seen is placed. The body contains character data and elements that add special formatting to text or insert images.










Fred’s Restaurant







Fred’s Restaurant

Open Monday-Friday 10 AM to 10 PM, Saturday-Sunday 10 AM to 12 Midnight





Menu:




Lunch

Club Sandwich, $5.00


Turkey Sandwich, $4.75


Soup du Jour, $2.00


Soup and Half Sandwich, $4.50




Dinner

Pepperoni Pizza, $8.99


Other toppings, add $0.50


Double Cheeseburger, $7.50




E-mail Fred’s Restaurant

Download 0.52 Mb.

Share with your friends:




The database is protected by copyright ©ua.originaldll.com 2024
send message

    Main page