<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ai+Austin</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ai+Austin"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Ai_Austin"/>
	<updated>2026-07-28T13:32:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=List_Of_Continents&amp;diff=1196386</id>
		<title>List Of Continents</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=List_Of_Continents&amp;diff=1196386"/>
		<updated>2015-05-05T10:03:07Z</updated>

		<summary type="html">&lt;p&gt;Ai Austin: /* Comparation to Earth */ typo correction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Second Life main grid is composed of isolated sims (islands), groups of sims and continents.&lt;br /&gt;
A continent is a group of more then 30 sims (see [[Continent]] for more details). What doesn&#039;t match this definition is a [[Subcontinent]], a [[Microcontinent]], a [[Sim Group]] or a [[Sim Cluster]]. Other structures might be refered as [[Unassociated Sims]] or [[Isolated Sim]]. Different autors have found a different number of continents. It is also important to remember that every day about 20 new sims are created, moved or changed their names (see [http://www.gridsurvey.com] for more info). So, the shapes and even the numbers of continents might change in time.&lt;br /&gt;
An older map can be found at this link: [http://virtualchristine.com/newbie-sl-world-map/]&lt;br /&gt;
&lt;br /&gt;
== Mainland continents ==&lt;br /&gt;
&lt;br /&gt;
[[File:Continents Map.png|200px|thumb|right|Map of all continents]]&lt;br /&gt;
&lt;br /&gt;
In alphabetic order, the Linden owned continents:&lt;br /&gt;
&lt;br /&gt;
1. [[Corsica]]&lt;br /&gt;
&lt;br /&gt;
2. [[Gaeta 1]]&lt;br /&gt;
&lt;br /&gt;
3. [[Gaeta 5]]&lt;br /&gt;
&lt;br /&gt;
4. [[Heterocera]]&lt;br /&gt;
&lt;br /&gt;
5. [[Jeogeot]]&lt;br /&gt;
&lt;br /&gt;
6. [[Nautilus]]&lt;br /&gt;
&lt;br /&gt;
7. Premium East (see [[Premium Continents]])&lt;br /&gt;
&lt;br /&gt;
8. Premium South 1&lt;br /&gt;
&lt;br /&gt;
9. Premium south 2&lt;br /&gt;
&lt;br /&gt;
10. Premium south 3&lt;br /&gt;
&lt;br /&gt;
11. [[Sansara]]&lt;br /&gt;
&lt;br /&gt;
12. [[Satori]]&lt;br /&gt;
&lt;br /&gt;
13. [[Sharp Continent]]&lt;br /&gt;
&lt;br /&gt;
14. [[Zindra]]&lt;br /&gt;
&lt;br /&gt;
Notes: &lt;br /&gt;
#Nautilus and Satori are linked together and form a megacontinent (like Euroasia in real world). &lt;br /&gt;
#Blake Sea has more private-owned sims then mainland sims, so it was moved to private continents. &lt;br /&gt;
#There are private-owned sims in Eastern Sansara (Islands) and Nautilus (Seychelles).&lt;br /&gt;
#Many mainland continents are linked with a [[Transcontinental Channels]], like Sansara-Heterocera, Nautilus-Blake Sea, the two Corsica-Nautilus passages and Corsica-Gaeta 5.&lt;br /&gt;
&lt;br /&gt;
These continents can be clasified in 3 distinct groups: &#039;&#039;1st generation&#039;&#039; (the oldest, with the most interesting Geographic features: Sansara, Heterocera and Sharp Continent), &#039;&#039;2nd generation&#039;&#039; (the group in East: Nautilus, Satori, Corsica and the 2 Gaetas) and &#039;&#039;3rd generation&#039;&#039; (Zindra and the Premium Continents). Jeogeot is something between generations 1 and 2.&lt;br /&gt;
&lt;br /&gt;
== Private continents ==&lt;br /&gt;
&lt;br /&gt;
In alphabetic order, these continents were identified in November 2013:&lt;br /&gt;
&lt;br /&gt;
1. [[Blake Sea]]&lt;br /&gt;
&lt;br /&gt;
2. [[Caledon - Winterfel]]&lt;br /&gt;
&lt;br /&gt;
3. [[Eden]]&lt;br /&gt;
&lt;br /&gt;
4. [[Estate Continent]]&lt;br /&gt;
&lt;br /&gt;
5. [[Europe Continent]]&lt;br /&gt;
&lt;br /&gt;
6. [[Fairchang]]&lt;br /&gt;
&lt;br /&gt;
7. [[IGBC Continent]]&lt;br /&gt;
&lt;br /&gt;
8. [[Mar Lesbiana]]&lt;br /&gt;
&lt;br /&gt;
9. [[Seductive Microcontinent|Seductive]]&lt;br /&gt;
&lt;br /&gt;
10. [[Shopping Continent]]&lt;br /&gt;
&lt;br /&gt;
11. [[Uhre Continent]]&lt;br /&gt;
&lt;br /&gt;
12. [[Wild West]]&lt;br /&gt;
&lt;br /&gt;
Notes: &lt;br /&gt;
#Private continents sometimes have multiple names, depending on who made their maps.&lt;br /&gt;
#The private continents can be divided in two main groups: [[Tropical Beach Paradise]] (Blake Sea, Eden, Estate - only parts of it, Fairchang, Irish-Bonaire, IGBC, Mar Lesbiana) and &#039;&#039;&#039;not tropical&#039;&#039;&#039; (part of Estate Continent, Shopping Continent, Wild West, Uhre continent). &lt;br /&gt;
#Only  Estate Continent, Shopping Continent and Wild West have a large piece of dryland, all the others are formed of sea and islands.&lt;br /&gt;
&lt;br /&gt;
=== Vanished continents ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No Access Continent&#039;&#039;&#039; existed until July 2013. It had the shape of a square with a void middle and had a large visible road. It had between 30 and 37 sims. Since access was restricted, no images from its surface and no surveys could be made.&lt;br /&gt;
&lt;br /&gt;
[[Irish - Bonaire]] was a continent that existed until August 4th 2014. It broke into small pieces, being renamed &#039;&#039;Nonaire Sim Cluster&#039;&#039; and received designation name A231.&lt;br /&gt;
&lt;br /&gt;
== Comparation to Earth ==&lt;br /&gt;
&lt;br /&gt;
The position of Second Life mainland continents is a bit similar to that of the continents on Earth, but in mirror. The old world (Europe, Asia and Africa) form a group and the new world (the two Americas) form another block. [[Sansara]] and [[Heterocera]] form together a group and they are linked together with a tiny channel. They are in fact the old world of Second Life. [[Jeogeot]] is in South and was the third continent. It might be considered like Africa. The new world might be considered the [[Gaeta 1]], [[Nautilus]], [[Corsica]], [[Blake Sea]] and [[Satori]], only that they are in East, not in West. Satori looks a bit like South America and the South islands of Nautilus might look like Central America with its islands.&lt;br /&gt;
&lt;br /&gt;
== Statistics ==&lt;br /&gt;
&lt;br /&gt;
The following table shows size (in sims) and maximum height of each continent, in alphabetic order:&lt;br /&gt;
{|class= &amp;quot;wikitable&amp;quot;&lt;br /&gt;
| Continent&lt;br /&gt;
| Maximum [[Altitude]]&lt;br /&gt;
| Size in sims&lt;br /&gt;
|-&lt;br /&gt;
| Blake Sea&lt;br /&gt;
| 40 - 50&lt;br /&gt;
| 121&lt;br /&gt;
|-&lt;br /&gt;
| Caledon - Winterfel&lt;br /&gt;
| 50 - 60&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| Corsica&lt;br /&gt;
| 163&lt;br /&gt;
| 948&lt;br /&gt;
|-&lt;br /&gt;
| Eden&lt;br /&gt;
| 81&lt;br /&gt;
| 147&lt;br /&gt;
|-&lt;br /&gt;
| Estate Continent&lt;br /&gt;
| 94&lt;br /&gt;
| 147&lt;br /&gt;
|-&lt;br /&gt;
| Fairchang&lt;br /&gt;
| 20 - 40&lt;br /&gt;
| 35&lt;br /&gt;
|-&lt;br /&gt;
| Gaeta 1&lt;br /&gt;
| 100&lt;br /&gt;
| 141&lt;br /&gt;
|-&lt;br /&gt;
| Gaeta 5&lt;br /&gt;
| 168&lt;br /&gt;
| 385&lt;br /&gt;
|-&lt;br /&gt;
| Heterocera&lt;br /&gt;
| 389&lt;br /&gt;
| 431&lt;br /&gt;
|-&lt;br /&gt;
| IGBC Continent&lt;br /&gt;
| 40 - 60&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| Jeogeot&lt;br /&gt;
| 160&lt;br /&gt;
| 775&lt;br /&gt;
|-&lt;br /&gt;
| Mar Lesbiana&lt;br /&gt;
| 65&lt;br /&gt;
| 39&lt;br /&gt;
|-&lt;br /&gt;
| Nautilus&lt;br /&gt;
| 160 - 170&lt;br /&gt;
| 864&lt;br /&gt;
|-&lt;br /&gt;
| Premium East&lt;br /&gt;
| 156&lt;br /&gt;
| 355 &lt;br /&gt;
|-&lt;br /&gt;
| Premium South 1&lt;br /&gt;
| 60&lt;br /&gt;
| 188&lt;br /&gt;
|-&lt;br /&gt;
| Premium South 2&lt;br /&gt;
| 156 &lt;br /&gt;
| 308&lt;br /&gt;
|-&lt;br /&gt;
| Premium South 3&lt;br /&gt;
| 156&lt;br /&gt;
| 310&lt;br /&gt;
|-&lt;br /&gt;
| Sansara&lt;br /&gt;
| 315 &lt;br /&gt;
| 981&lt;br /&gt;
|-&lt;br /&gt;
| Satori&lt;br /&gt;
| 128&lt;br /&gt;
| 709&lt;br /&gt;
|-|-&lt;br /&gt;
| Seductive&lt;br /&gt;
| 39&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
| Sharp Continent&lt;br /&gt;
| 350&lt;br /&gt;
| 63&lt;br /&gt;
|-&lt;br /&gt;
| Shopping Continent&lt;br /&gt;
| 34&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| Uhre Continent&lt;br /&gt;
| over 130&lt;br /&gt;
| 39&lt;br /&gt;
|-&lt;br /&gt;
| Wild West&lt;br /&gt;
| 79&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| Zindra&lt;br /&gt;
| 100 - 120&lt;br /&gt;
| 348&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Oceans ==&lt;br /&gt;
&lt;br /&gt;
Many private sims are not linked in large groups to form a continent. The majority are isolated sims, while some of them form larger islands, with 2 to 29 sims. Even if they form important features on our map, the oceans containing these sims are not named in an official way. See [[Oceans]] for more info.&lt;br /&gt;
&lt;br /&gt;
Groups of sims smaller then a continent are listed in [[List Of Microcontinents And Sim Clusters]].&lt;br /&gt;
&lt;br /&gt;
Additional information can be found at [[Second Life Geography]] and [[Grid Map And Dimensions]]&lt;/div&gt;</summary>
		<author><name>Ai Austin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=HTML_HUD_Demo&amp;diff=1152512</id>
		<title>HTML HUD Demo</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=HTML_HUD_Demo&amp;diff=1152512"/>
		<updated>2011-08-27T18:16:24Z</updated>

		<summary type="html">&lt;p&gt;Ai Austin: Corrrect typo on Options&amp;quot; in LSL. Suggest a &amp;quot;Stop All Animations&amp;quot; button.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; Suggest a &amp;quot;Stop All Animations&amp;quot; button be added to Animations selection frame for convenience.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;// HTML Based, Single Script HUD&lt;br /&gt;
// This is intended to be a tech demo of what html on a hud allows.&lt;br /&gt;
// * Interaction with SL world (give items, play animations, scan nearby avatars)&lt;br /&gt;
// * Simple, low overhead (1 scripts, 1 prim)&lt;br /&gt;
// * Rich, dynamic interface (images, menus, flash)&lt;br /&gt;
// Updates and improvements are welcome at http://wiki.secondlife.com/wiki/HTML_HUD_Demo&lt;br /&gt;
 &lt;br /&gt;
// To Use:&lt;br /&gt;
// * Create a cube and wear it as a hud on the top-left. (script will need tweaking for other spots)&lt;br /&gt;
// * Edit the cube while wearing it and add this script to it.&lt;br /&gt;
// * Add any animations you want to play to the object&lt;br /&gt;
// * Add any notecards or objects you want to give away to the object.&lt;br /&gt;
 &lt;br /&gt;
// License: &lt;br /&gt;
// This script itself is free to share, modify and use without restriction.&lt;br /&gt;
// Any linked or referenced files are not included in this license and are licensed by their respective owners under their own respective copyright and other licenses. &lt;br /&gt;
// Created by Kelly Linden, 2011.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// CONFIG PARAMS&lt;br /&gt;
string video_url = &amp;quot;http://www.youtube.com/embed/m7p9IEpPu-c?rel=0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
integer display_face = 4;   // The face to display HTML on&lt;br /&gt;
integer button_face = 2;    // The face that shows when hiding the HTML&lt;br /&gt;
integer link = LINK_THIS;   // The prim with media and button.&lt;br /&gt;
&lt;br /&gt;
// Prim params for when media is shown. Rotates and scales to show the media.&lt;br /&gt;
list visible = [PRIM_POS_LOCAL,&amp;lt;0,-0.13,-0.13&amp;gt;,PRIM_SIZE,&amp;lt;0.01,0.25,0.25&amp;gt;,PRIM_ROT_LOCAL,&amp;lt;0,0,0,1&amp;gt;];&lt;br /&gt;
// Prim params for when media is hidden. Rotates and scales to show the button.&lt;br /&gt;
list button = [PRIM_POS_LOCAL,&amp;lt;0,-0.04,-0.04&amp;gt;,PRIM_SIZE,&amp;lt;0.05,0.05,0.05&amp;gt;,PRIM_ROT_LOCAL,&amp;lt;0,0,-1,0&amp;gt;];&lt;br /&gt;
// Initial setup: sets the button texture.&lt;br /&gt;
list init = [PRIM_TEXTURE,ALL_SIDES,TEXTURE_BLANK,&amp;lt;1,1,1&amp;gt;,&amp;lt;1,1,1&amp;gt;,0,PRIM_TEXTURE,button_face,&amp;quot;0b815b79-c8f5-fc98-91fc-e77b53a468e2&amp;quot;,&amp;lt;1,1,1&amp;gt;,&amp;lt;1,1,1&amp;gt;,0];&lt;br /&gt;
&lt;br /&gt;
// INTERNAL VARS&lt;br /&gt;
// These variables are set by the program.&lt;br /&gt;
integer is_visible = FALSE; // Whether or not the hud is showing HTML side.&lt;br /&gt;
list last_path;             // Last visited&lt;br /&gt;
string footer;              // Footer: set in set_url&lt;br /&gt;
string header;              // Header: set in set_url&lt;br /&gt;
key current_request;        // HTTP request ID for the current request.&lt;br /&gt;
&lt;br /&gt;
// Toggle between button and HTML&lt;br /&gt;
toggle_show()&lt;br /&gt;
{&lt;br /&gt;
    if (is_visible)&lt;br /&gt;
        llSetLinkPrimitiveParamsFast(link,visible);&lt;br /&gt;
    else&lt;br /&gt;
        llSetLinkPrimitiveParamsFast(link,button);&lt;br /&gt;
    is_visible = !is_visible;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build an image url from an avatar&#039;s key.&lt;br /&gt;
string av_image(key id)&lt;br /&gt;
{&lt;br /&gt;
    return &amp;quot;https://my-secondlife.s3.amazonaws.com/users/&amp;quot; + llGetUsername(id) + &amp;quot;/thumb_sl_image.png&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build an url that opens the profile for an avatar&lt;br /&gt;
string app_profile_url(key id)&lt;br /&gt;
{&lt;br /&gt;
    return &amp;quot;secondlife:///app/agent/&amp;quot; + (string)id + &amp;quot;/about&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Setup required after getting an url.&lt;br /&gt;
set_url(string url)&lt;br /&gt;
{&lt;br /&gt;
    // Build the common header:&lt;br /&gt;
    // * link to the css file&lt;br /&gt;
    // * set a base url&lt;br /&gt;
    // * html boilerplate code.&lt;br /&gt;
    // TODO: Remove dependency on this css file.&lt;br /&gt;
    header = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;link href=&#039;https://d1979ns0fqtj19.cloudfront.net/assets/common-103828347986224535963905120979424958961.css&#039; media=&#039;all&#039; rel=&#039;stylesheet&#039; type=&#039;text/css&#039; /&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;base href=&#039;&amp;quot; + url + &amp;quot;/&#039; /&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Build the common footer&lt;br /&gt;
    // * Navigation menu&lt;br /&gt;
    // * JS helper script (for fancy buttons)&lt;br /&gt;
    // * html boilerplate code&lt;br /&gt;
    // TODO: Remove dependency on the js file&lt;br /&gt;
    footer = &amp;quot;&amp;lt;div align=&#039;center&#039; style=&#039;position:absolute;top:93%;left:8%;&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;a href=&#039;&#039;&amp;gt;Scan&amp;lt;/a&amp;gt; | &amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;a href=&#039;anims&#039;&amp;gt;Anims&amp;lt;/a&amp;gt; | &amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;a href=&#039;video&#039;&amp;gt;Video&amp;lt;/a&amp;gt; | &amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;a href=&#039;config&#039;&amp;gt;Config&amp;lt;/a&amp;gt; | &amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;a href=&#039;hide&#039;&amp;gt;Hide&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;script src=&#039;https://d2mjw3k7q9u8rb.cloudfront.net/assets/common-170919042270376442559931151451605602726.js&#039; type=&#039;text/javascript&#039;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    llSetLinkMedia(link, display_face,              // Side to display the media on.&lt;br /&gt;
            [PRIM_MEDIA_AUTO_PLAY,TRUE,     // Show this page immediately&lt;br /&gt;
             PRIM_MEDIA_CURRENT_URL,url,    // The url if they hit &#039;home&#039;&lt;br /&gt;
             PRIM_MEDIA_HOME_URL,url,       // The url currently showing&lt;br /&gt;
             PRIM_MEDIA_HEIGHT_PIXELS,256,  // Height/width of media texture will be&lt;br /&gt;
             PRIM_MEDIA_WIDTH_PIXELS,256,   //   rounded up to nearest power of 2.&lt;br /&gt;
             PRIM_MEDIA_PERMS_CONTROL, PRIM_MEDIA_PERM_NONE]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Turn a number of bytes (script size) into human readable format.&lt;br /&gt;
string bytes2str(integer b)&lt;br /&gt;
{&lt;br /&gt;
    if (b &amp;lt; 1024 * 1024) return (string)(b / 1024) + &amp;quot;KB&amp;quot;;&lt;br /&gt;
    return (string)(b / (1024 * 1024)) + &amp;quot;MB&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build the html for the profile thumbnail image that links to their profile.&lt;br /&gt;
string profile_thumb_html(key agent)&lt;br /&gt;
{&lt;br /&gt;
    return &amp;quot;&amp;lt;a href=&#039;&amp;quot; + app_profile_url(agent) + &amp;quot;&#039; class=&#039;avatar avatar_thumb&#039; rel=&#039;#sl_image_zoom&#039; title=&#039;Click to zoom&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;img alt=&#039;Thumb_sl_image&#039; src=&#039;https://my-secondlife.s3.amazonaws.com/users/&amp;quot; + llGetUsername(agent) + &amp;quot;/sl_image.png&#039; /&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build the agent options menu&lt;br /&gt;
string agent_menu_html(key agentid)&lt;br /&gt;
{&lt;br /&gt;
    return &amp;quot;&amp;lt;div class=&#039;menu_button&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;a class=&#039;button call_to_action&#039;&amp;gt;Options&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;ul style=&#039;list-style-type:none;text-align:left&#039; class=&#039;menu&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;secondlife:///app/agent/&amp;quot; + (string)agentid + &amp;quot;/im&#039;&amp;gt;IM&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;secondlife:///app/agent/&amp;quot; + (string)agentid + &amp;quot;/offerteleport&#039;&amp;gt;Offer Teleport&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;secondlife:///app/maptrackavatar/&amp;quot; + (string)agentid + &amp;quot;&#039;&amp;gt;Map&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;secondlife:///app/sharewithavatar/&amp;quot; + (string)agentid + &amp;quot;&#039;&amp;gt;Share&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;secondlife:///app/agent/&amp;quot; + (string)agentid + &amp;quot;/pay&#039;&amp;gt;Pay&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build an html list of items of type for the Give menu&lt;br /&gt;
string give_list(key agentid, integer type)&lt;br /&gt;
{&lt;br /&gt;
    string resp;&lt;br /&gt;
    integer n = llGetInventoryNumber(type);&lt;br /&gt;
    integer i;&lt;br /&gt;
    for (i=0;i&amp;lt;n;++i)&lt;br /&gt;
    {&lt;br /&gt;
        resp += &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;agent/&amp;quot; + (string)agentid + &amp;quot;/give/&amp;quot; + llGetInventoryName(type,i) + &amp;quot;&#039;&amp;gt;&amp;quot; + llGetInventoryName(type,i) + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    return resp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build the html for the Give menu and fill it with notecards and objects.&lt;br /&gt;
string give_menu_html(key agentid)&lt;br /&gt;
{&lt;br /&gt;
    string resp = &amp;quot;&amp;lt;div class=&#039;menu_button&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;a class=&#039;button call_to_action&#039;&amp;gt;Give&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;ul style=&#039;list-style-type:none;text-align:left;white-space:nowrap&#039; class=&#039;menu&#039;&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    // Give notecards and objects.&lt;br /&gt;
    integer resp_size = llStringLength(resp);&lt;br /&gt;
    resp += give_list(agentid,INVENTORY_NOTECARD);&lt;br /&gt;
    resp += give_list(agentid,INVENTORY_OBJECT);&lt;br /&gt;
&lt;br /&gt;
    if (resp_size == llStringLength(resp))&lt;br /&gt;
    {&lt;br /&gt;
        // No inventory.&lt;br /&gt;
        resp += &amp;quot;&amp;lt;li&amp;gt;(no objects or notecards found)&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    resp += &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
    return resp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Strip the &amp;quot;Resident&amp;quot; last name, break long names into 2 lines if possible.&lt;br /&gt;
string agent_name(key id)&lt;br /&gt;
{&lt;br /&gt;
    string name = llList2String(llParseString2List(llKey2Name(id),[&amp;quot; Resident&amp;quot;],[]),0); &lt;br /&gt;
    if (llStringLength(name) &amp;gt; 15)&lt;br /&gt;
    {&lt;br /&gt;
        name = llDumpList2String(llParseString2List(name,[&amp;quot; &amp;quot;],[]),&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build the Agent Details page.&lt;br /&gt;
agent_details(key request, key agent)&lt;br /&gt;
{&lt;br /&gt;
    // Get the details we want.&lt;br /&gt;
    list r = llGetObjectDetails(agent,[OBJECT_POS,OBJECT_TOTAL_SCRIPT_COUNT,OBJECT_SCRIPT_MEMORY,OBJECT_SCRIPT_TIME]);&lt;br /&gt;
 &lt;br /&gt;
    // Build the html.&lt;br /&gt;
    string resp = header + &amp;quot;&amp;lt;table border=&#039;0&#039; cellspacing=&#039;1&#039; cellpadding=&#039;1&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&#039;2&#039; style=&#039;white-space:nowrap&#039;&amp;gt;&amp;lt;div class=&#039;profile_title&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        +   &amp;quot;&amp;lt;h1 id=&#039;display_name&#039;&amp;gt;&amp;quot; + agent_name(agent) + &amp;quot;&amp;lt;/h1&amp;gt;&amp;quot;&lt;br /&gt;
        +   &amp;quot;&amp;lt;h2 id=&#039;username&#039;&amp;gt;&amp;quot; + llGetUsername(agent) + &amp;quot;&amp;lt;/h2&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;div align=&#039;right&#039;&amp;gt;&amp;quot; + agent_menu_html(agent) + &amp;quot;&amp;lt;br&amp;gt;&amp;quot; + give_menu_html(agent) + &amp;quot;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td width=&#039;80&#039;&amp;gt;&amp;quot; + profile_thumb_html(agent) + &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td colspan=&#039;2&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        +   &amp;quot;&amp;lt;ul style=&#039;list-style-type:circle&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        +   &amp;quot;&amp;lt;li&amp;gt;Scripts:&amp;quot;&lt;br /&gt;
        +       &amp;quot;&amp;lt;ul style=&#039;list-style-type:disc;margin-left:10px&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        +       &amp;quot;&amp;lt;li&amp;gt;&amp;quot; + (string)llList2Integer(r,1) + &amp;quot; total&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
        +       &amp;quot;&amp;lt;li&amp;gt;&amp;quot; + bytes2str(llList2Integer(r,2)) + &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
        +       &amp;quot;&amp;lt;li&amp;gt;&amp;quot; + (string)((integer)(llList2Float(r,3) * 1000000.0)) + &amp;quot;us&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
        +   &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot; + footer;&lt;br /&gt;
 &lt;br /&gt;
    // Send the response.&lt;br /&gt;
    llSetContentType(current_request, CONTENT_TYPE_HTML);&lt;br /&gt;
    llHTTPResponse(current_request,200,resp);&lt;br /&gt;
 &lt;br /&gt;
    // Uncomment this to debug memory usage.&lt;br /&gt;
    // Done here as this is the largest, most complex page.&lt;br /&gt;
    // llOwnerSay(&amp;quot;Memory used: &amp;quot; + (string)llGetUsedMemory() + &amp;quot;, response size: &amp;quot; + (string)llStringLength(resp));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build up an animation menu with any animations in the object.&lt;br /&gt;
string anim_menu_html()&lt;br /&gt;
{&lt;br /&gt;
    string resp = &amp;quot;&amp;lt;div class=&#039;menu_button&#039; style=&#039;align:center&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;a class=&#039;button call_to_action&#039;&amp;gt;Animate&amp;lt;b class=&#039;actions_dropdown&#039;&amp;gt;&amp;amp;nbsp;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;ul style=&#039;list-style-type:none;text-align:left&#039; class=&#039;menu&#039;&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    integer n = llGetInventoryNumber(INVENTORY_ANIMATION);&lt;br /&gt;
    if (n == 0)&lt;br /&gt;
    {&lt;br /&gt;
        resp += &amp;quot;&amp;lt;li&amp;gt;(no animations found)&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        integer i;&lt;br /&gt;
        for(i=0;i&amp;lt;n;++i)&lt;br /&gt;
        {&lt;br /&gt;
            resp += &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;anims/&amp;quot; + llGetInventoryName(INVENTORY_ANIMATION,i) + &amp;quot;&#039;&amp;gt;&amp;quot; + llGetInventoryName(INVENTORY_ANIMATION,i) + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    resp += &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
    return resp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Play an animation given the name.&lt;br /&gt;
play_anim(string anim)&lt;br /&gt;
{&lt;br /&gt;
    llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
    llStartAnimation(llUnescapeURL(anim));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build the anims page.&lt;br /&gt;
anims_page()&lt;br /&gt;
{&lt;br /&gt;
    string resp = header + &amp;quot;&amp;lt;h1&amp;gt;Animations&amp;lt;/h1&amp;gt;&amp;lt;h2&amp;gt;Choose an animation:&amp;lt;/h2&amp;gt;&amp;quot;&lt;br /&gt;
     + &amp;quot;&amp;lt;div style=&#039;margin-left:40px&#039;&amp;gt;&amp;quot; + anim_menu_html() + &amp;quot;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;quot; + footer;&lt;br /&gt;
    llSetContentType(current_request, CONTENT_TYPE_HTML);&lt;br /&gt;
    llHTTPResponse(current_request,200,resp);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Build the configuration page.&lt;br /&gt;
config_page()&lt;br /&gt;
{&lt;br /&gt;
    string resp = header + &amp;quot;&amp;lt;h1&amp;gt;Options:&amp;lt;/h1&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;form action=&#039;config/set&#039; method=&#039;get&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;Video URL: &amp;lt;input type=&#039;text&#039; name=&#039;video&#039; value=&#039;&amp;quot; + video_url + &amp;quot;&#039; /&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;input type=&#039;submit&#039; value=&#039;Set&#039; /&amp;gt;&amp;lt;/form&amp;gt;&amp;quot;&lt;br /&gt;
        + footer;&lt;br /&gt;
    llSetContentType(current_request, CONTENT_TYPE_HTML);&lt;br /&gt;
    llHTTPResponse(current_request,200,resp);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Process a get request with a path.&lt;br /&gt;
GET(key request, list path)&lt;br /&gt;
{&lt;br /&gt;
    current_request = request;&lt;br /&gt;
    integer path_segments = llGetListLength(path);&lt;br /&gt;
    if (path_segments == 0)&lt;br /&gt;
    {&lt;br /&gt;
        // Home page is handled in the sensor response.&lt;br /&gt;
        llSensor(&amp;quot;&amp;quot;,NULL_KEY,AGENT,96,PI);&lt;br /&gt;
        &lt;br /&gt;
        // Set the last_path incase the next request is a hide&lt;br /&gt;
        last_path = [];&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    string p0 = llList2String(path,0);&lt;br /&gt;
    if (p0 == &amp;quot;hide&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        toggle_show();&lt;br /&gt;
        &lt;br /&gt;
        // We need to send back a page to show otherwise the&lt;br /&gt;
        // the next time the hud is shown there will be an error.&lt;br /&gt;
        // So we loop back in here with our last path.&lt;br /&gt;
        // Effectively this just refreshes the page we were already on.&lt;br /&gt;
        GET(request,last_path);&lt;br /&gt;
        &lt;br /&gt;
        // Do *not* set the last_path here to avoid any infinite loops.&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Set the last path here, after the recursive hide call.&lt;br /&gt;
    last_path = path;&lt;br /&gt;
    &lt;br /&gt;
    if (p0 == &amp;quot;agent&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        if (path_segments == 1)&lt;br /&gt;
        {&lt;br /&gt;
            // &amp;lt;url&amp;gt;/agent&lt;br /&gt;
            // Show owner details.&lt;br /&gt;
            agent_details(request,llGetOwner());&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        // p1 should be an agent id&lt;br /&gt;
        key agent = (key)llList2String(path,1);&lt;br /&gt;
 &lt;br /&gt;
        if (path_segments == 2)&lt;br /&gt;
        {&lt;br /&gt;
            // &amp;lt;url&amp;gt;/agent/&amp;lt;id&amp;gt;&lt;br /&gt;
            // Show the details for the agent.&lt;br /&gt;
            agent_details(request,agent);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (path_segments == 4)&lt;br /&gt;
        {&lt;br /&gt;
            // &amp;lt;url&amp;gt;/agent/&amp;lt;id&amp;gt;/&amp;lt;cmd&amp;gt;/&amp;lt;option&amp;gt;&lt;br /&gt;
            string cmd = llList2String(path,2);&lt;br /&gt;
            if (cmd == &amp;quot;give&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                string object_name = llUnescapeURL(llList2String(path,3));&lt;br /&gt;
                llOwnerSay(&amp;quot;Giving &amp;quot; + object_name + &amp;quot; to &amp;quot; + llKey2Name((key)agent));&lt;br /&gt;
                llGiveInventory(agent,object_name);&lt;br /&gt;
                agent_details(request,agent);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else if (p0 == &amp;quot;anims&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        if (path_segments == 1)&lt;br /&gt;
        {&lt;br /&gt;
            // &amp;lt;url&amp;gt;/anims&lt;br /&gt;
            // Show the animation selection page&lt;br /&gt;
            anims_page();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        else if (path_segments == 2)&lt;br /&gt;
        {&lt;br /&gt;
            // &amp;lt;url&amp;gt;/anims/&amp;lt;anim-name&amp;gt;&lt;br /&gt;
            // Play the specified animation&lt;br /&gt;
            play_anim(llList2String(path,1));&lt;br /&gt;
            anims_page();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else if (p0 == &amp;quot;video&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        // &amp;lt;url&amp;gt;/video&lt;br /&gt;
        // Play a demo video&lt;br /&gt;
        string resp = header&lt;br /&gt;
            + &amp;quot;&amp;lt;br&amp;gt;&amp;lt;iframe width=&#039;255&#039; height=&#039;173&#039; src=&#039;&amp;quot; + video_url + &amp;quot;&#039; frameborder=&#039;0&#039; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&amp;quot;&lt;br /&gt;
            + footer;&lt;br /&gt;
        llSetContentType(current_request, CONTENT_TYPE_HTML);&lt;br /&gt;
        llHTTPResponse(current_request,200,resp);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    else if (p0 == &amp;quot;config&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        if (path_segments == 1)&lt;br /&gt;
        {&lt;br /&gt;
            // &amp;lt;url&amp;gt;/config&lt;br /&gt;
            config_page();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (llList2String(path,1) == &amp;quot;set&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            // Parse config args&lt;br /&gt;
            list args = llParseString2List(llGetHTTPHeader(current_request,&amp;quot;x-query-string&amp;quot;),[&amp;quot;&amp;amp;&amp;quot;,&amp;quot;=&amp;quot;],[]);&lt;br /&gt;
            integer i = 0;&lt;br /&gt;
            integer argn = llGetListLength(args);&lt;br /&gt;
            while(i &amp;lt; argn)&lt;br /&gt;
            {&lt;br /&gt;
                string var = llList2String(args,i++);&lt;br /&gt;
                string val = llUnescapeURL(llList2String(args,i++));&lt;br /&gt;
                if (var == &amp;quot;video&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    video_url = val;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            config_page();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Unknown page. 404.&lt;br /&gt;
    string resp = header + &amp;quot;&amp;lt;h1&amp;gt;404 Page Not Found.&amp;lt;/h1&amp;gt;&amp;quot; + footer;&lt;br /&gt;
    llSetContentType(current_request, CONTENT_TYPE_HTML);&lt;br /&gt;
    llHTTPResponse(current_request,404,resp);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default &lt;br /&gt;
{ &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Set the object name so inventory offers make sense to the receiver.&lt;br /&gt;
        llSetObjectName(llKey2Name(llGetOwner()) + &amp;quot;&#039;s HUD&amp;quot;);&lt;br /&gt;
        // Init button textures.&lt;br /&gt;
        llSetLinkPrimitiveParamsFast(link,init);&lt;br /&gt;
        // Reset to a hidden state&lt;br /&gt;
        toggle_show();&lt;br /&gt;
        // Request an URL.&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // We need to reset in the cases because we lose the URL.&lt;br /&gt;
    on_rez(integer n) { llResetScript();}&lt;br /&gt;
    changed(integer c)&lt;br /&gt;
    {&lt;br /&gt;
        if (c &amp;amp; (CHANGED_TELEPORT | CHANGED_OWNER | CHANGED_REGION)) llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        // Handles the button case.&lt;br /&gt;
        toggle_show();&lt;br /&gt;
    } &lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            set_url(body);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == URL_REQUEST_DENIED)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Unable to get url: &amp;quot; + body);&lt;br /&gt;
            llSleep(10);&lt;br /&gt;
            llRequestURL();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            list path = llParseString2List(llGetHTTPHeader(id,&amp;quot;x-path-info&amp;quot;),[&amp;quot;/&amp;quot;],[]);&lt;br /&gt;
            GET(id,path);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        llHTTPResponse(id,400,&amp;quot;Unsupported method.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer n)&lt;br /&gt;
    {&lt;br /&gt;
        // This is actually the main page.&lt;br /&gt;
        // Shows nearby residents for interacting with.&lt;br /&gt;
        string resp = header + &amp;quot;&amp;lt;h2&amp;gt;Scan Results:&amp;lt;/h2&amp;gt;&amp;lt;ul style=&#039;list-style-type:circle;margin-left:20px&#039;&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        // TODO: Only fits 14 right now. Figure out how to fit all 16. &lt;br /&gt;
        // TODO: Figure out how to find more than 16.&lt;br /&gt;
        if (n &amp;gt; 14) n = 14;&lt;br /&gt;
        for (--n; n &amp;gt;= 0; --n)&lt;br /&gt;
        {&lt;br /&gt;
            resp += &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;agent/&amp;quot; + (string)llDetectedKey(n) + &amp;quot;&#039;&amp;gt;&amp;quot; + agent_name(llDetectedKey(n)) + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        resp += &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot; + footer;&lt;br /&gt;
        llSetContentType(current_request, CONTENT_TYPE_HTML);&lt;br /&gt;
        llHTTPResponse(current_request,200,resp);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    no_sensor()&lt;br /&gt;
    {&lt;br /&gt;
        // No one nearby.&lt;br /&gt;
        // Include a link to the owner&#039;s details to make it easier to debug when no one is around.&lt;br /&gt;
        string resp = header + &amp;quot;&amp;lt;h2&amp;gt;Scan Results:&amp;lt;/h2&amp;gt;&amp;lt;ul style=&#039;list-style-type:circle;margin-left:20px&#039;&amp;gt;&amp;quot;; &lt;br /&gt;
        resp += &amp;quot;&amp;lt;li&amp;gt;No one near by.&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
        resp += &amp;quot;&amp;lt;li&amp;gt;Owner: &amp;lt;a href=&#039;agent/&amp;quot; + (string)llGetOwner() + &amp;quot;&#039;&amp;gt;&amp;quot; + llKey2Name(llGetOwner()) + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
        resp += &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot; + footer;&lt;br /&gt;
        llSetContentType(current_request, CONTENT_TYPE_HTML);&lt;br /&gt;
        llHTTPResponse(current_request,200,resp);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ai Austin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Ama_Omega/archive/lsl_hacks&amp;diff=814563</id>
		<title>User:Ama Omega/archive/lsl hacks</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Ama_Omega/archive/lsl_hacks&amp;diff=814563"/>
		<updated>2010-03-19T14:18:01Z</updated>

		<summary type="html">&lt;p&gt;Ai Austin: /* Forms */ Corrected google.com search URL to search?q= rather than ?search=&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Shared Media and HTTP-In ==&lt;br /&gt;
Pre-Viewer 2.0 interfacing with an LSL script is a jumble of llDialog, chats, touches and possibly external web sites.  With Shared Media that all changes.&lt;br /&gt;
&lt;br /&gt;
One step at a time .......&lt;br /&gt;
=== llSetPrimMediaParams ===&lt;br /&gt;
* Use llSetPrimMediaParams to set the url and various parameters on the face of a prim via LSL.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetPrimMediaParams(0,                             // Side to display the media on.&lt;br /&gt;
            [PRIM_MEDIA_AUTO_PLAY,TRUE,                     // Show this page immediately&lt;br /&gt;
             PRIM_MEDIA_CURRENT_URL,&amp;quot;http://google.com&amp;quot;,    // The url currently showing&lt;br /&gt;
             PRIM_MEDIA_HOME_URL,&amp;quot;http://google.com&amp;quot;,       // The url if they hit &#039;home&#039;&lt;br /&gt;
             PRIM_MEDIA_HEIGHT_PIXELS,512,                  // Height/width of media texture will be&lt;br /&gt;
             PRIM_MEDIA_WIDTH_PIXELS,512]);                 //   rounded up to nearest power of 2.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== data: urls ===&lt;br /&gt;
There is a special url type: &amp;quot;data:&amp;quot; that lets you send the html &#039;&#039;in the url&#039;&#039;.  Paste the below into your browser&#039;s address bar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data:text/html,&amp;lt;h1&amp;gt;This is a test&amp;lt;/h1&amp;gt;&amp;lt;h2&amp;gt;This is a test&amp;lt;/h2&amp;gt;&amp;lt;h3&amp;gt;This is a test&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== llSetPrimMediaParams for data: urls ===&lt;br /&gt;
* Thus you can build arbitrary html in your LSL script and display it on the face of the prim&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
show(string html)&lt;br /&gt;
{&lt;br /&gt;
    html = &amp;quot;data:text/html,&amp;quot; + llEscapeURL(html);&lt;br /&gt;
    llSetPrimMediaParams(0,                  // Side to display the media on.&lt;br /&gt;
            [PRIM_MEDIA_AUTO_PLAY,TRUE,      // Show this page immediately&lt;br /&gt;
             PRIM_MEDIA_CURRENT_URL,html,    // The url currently showing&lt;br /&gt;
             PRIM_MEDIA_HOME_URL,html,       // The url if they hit &#039;home&#039;&lt;br /&gt;
             PRIM_MEDIA_HEIGHT_PIXELS,512,   // Height/width of media texture will be&lt;br /&gt;
             PRIM_MEDIA_WIDTH_PIXELS,512]);  //   rounded up to nearest power of 2.&lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        show(&amp;quot;&amp;lt;h1&amp;gt;This is a test&amp;lt;/h1&amp;gt;&amp;lt;h2&amp;gt;This is a test&amp;lt;/h2&amp;gt;&amp;lt;h3&amp;gt;This is a test&amp;lt;/h3&amp;gt;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTTP-In ===&lt;br /&gt;
* Scripts can become web servers via HTTP-In&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;URL is: &amp;quot; + body);&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;Received page request.&amp;quot;);&lt;br /&gt;
            llHTTPResponse(id,200,&amp;quot;OK&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== llSetPrimMediaParams for data: urls that link back to HTTP-In ===&lt;br /&gt;
* Which means you can make web pages that trigger other page views via http-in links&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
show(string html)&lt;br /&gt;
{&lt;br /&gt;
    html = &amp;quot;data:text/html,&amp;quot; + llEscapeURL(html);&lt;br /&gt;
    llSetPrimMediaParams(0,                  // Side to display the media on.&lt;br /&gt;
            [PRIM_MEDIA_AUTO_PLAY,TRUE,      // Show this page immediately&lt;br /&gt;
             PRIM_MEDIA_CURRENT_URL,html,    // The url currently showing&lt;br /&gt;
             PRIM_MEDIA_HOME_URL,html,       // The url if they hit &#039;home&#039;&lt;br /&gt;
             PRIM_MEDIA_HEIGHT_PIXELS,512,   // Height/width of media texture will be&lt;br /&gt;
             PRIM_MEDIA_WIDTH_PIXELS,512]);  //   rounded up to nearest power of 2.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string replace_all(string src, string target, string replace)&lt;br /&gt;
{&lt;br /&gt;
    return llDumpList2String(llParseString2List(src,[target],[]),replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string get_query(key id, string name)&lt;br /&gt;
{&lt;br /&gt;
    string query = llGetHTTPHeader(id,&amp;quot;x-query-string&amp;quot;);&lt;br /&gt;
    query = replace_all(query,&amp;quot;+&amp;quot;,&amp;quot; &amp;quot;);&lt;br /&gt;
    query = llUnescapeURL(query);&lt;br /&gt;
    list q = llParseString2List(query,[&amp;quot;=&amp;quot;,&amp;quot;&amp;amp;&amp;quot;,&amp;quot;;&amp;quot;],[]);&lt;br /&gt;
    integer i = llListFindList(q,[name]);&lt;br /&gt;
    if (i != -1)&lt;br /&gt;
    {&lt;br /&gt;
        return llList2String(q,i+1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        show(&amp;quot;&amp;lt;h1&amp;gt;This is a test&amp;lt;/h1&amp;gt;&amp;lt;h2&amp;gt;This is a test&amp;lt;/h2&amp;gt;&amp;lt;h3&amp;gt;This is a test&amp;lt;/h3&amp;gt;&amp;quot;);&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            show(&amp;quot;&amp;lt;h1&amp;gt;&amp;lt;a href=&#039;&amp;quot; + body + &amp;quot;/?get=owner&#039;&amp;gt;Owner ID&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a href=&#039;&amp;quot; + body + &amp;quot;/?get=object&#039;&amp;gt;Object ID&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            string get = get_query(id,&amp;quot;get&amp;quot;);&lt;br /&gt;
            if (get == &amp;quot;owner&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llHTTPResponse(id,200,&amp;quot;Owner is: &amp;quot; + (string)llGetOwner());&lt;br /&gt;
            }&lt;br /&gt;
            else if (get == &amp;quot;object&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llHTTPResponse(id,200,&amp;quot;Object is: &amp;quot; + (string)llGetKey());&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {            &lt;br /&gt;
                llHTTPResponse(id,400,&amp;quot;huh?&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forms ===&lt;br /&gt;
* You can put forms in data: urls&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data:text/html,&amp;lt;form action=&amp;quot;http://google.com/search&amp;quot; method=&amp;quot;GET&amp;quot;&amp;gt;Search:&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;q&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The Magic ===&lt;br /&gt;
* You can set the script HTTP-In url as the form action to get the results of the form sent back to the script&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string html_base = &lt;br /&gt;
&amp;quot;&amp;lt;h1&amp;gt;&amp;lt;form action=&#039;%url%&#039; method=&#039;GET&#039;&amp;gt;&lt;br /&gt;
Floating Text:&amp;lt;input type=&#039;text&#039; name=&#039;text&#039;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;input type=&#039;submit&#039; value=&#039;Set&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
string url;&lt;br /&gt;
&lt;br /&gt;
integer r;&lt;br /&gt;
show(string html)&lt;br /&gt;
{&lt;br /&gt;
    html = &amp;quot;data:text/html,&amp;quot; + llEscapeURL(html) + &amp;quot;&amp;lt;span &amp;quot; + (string)((++r) % 10) + &amp;quot;/&amp;gt;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    llSetPrimMediaParams(0,                  // Side to display the media on.&lt;br /&gt;
            [PRIM_MEDIA_AUTO_PLAY,TRUE,      // Show this page immediately&lt;br /&gt;
             PRIM_MEDIA_CURRENT_URL,html,    // The url currently showing&lt;br /&gt;
             PRIM_MEDIA_HOME_URL,html,       // The url if they hit &#039;home&#039;&lt;br /&gt;
             PRIM_MEDIA_HEIGHT_PIXELS,512,   // Height/width of media texture will be&lt;br /&gt;
             PRIM_MEDIA_WIDTH_PIXELS,512]);  //   rounded up to nearest power of 2.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string replace_all(string src, string target, string replace)&lt;br /&gt;
{&lt;br /&gt;
    return llDumpList2String(llParseString2List(src,[target],[]),replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string get_query(key id, string name)&lt;br /&gt;
{&lt;br /&gt;
    string query = llGetHTTPHeader(id,&amp;quot;x-query-string&amp;quot;);&lt;br /&gt;
    query = replace_all(query,&amp;quot;+&amp;quot;,&amp;quot; &amp;quot;);&lt;br /&gt;
    query = llUnescapeURL(query);&lt;br /&gt;
    list q = llParseString2List(query,[&amp;quot;=&amp;quot;,&amp;quot;&amp;amp;&amp;quot;,&amp;quot;;&amp;quot;],[]);&lt;br /&gt;
    integer i = llListFindList(q,[name]);&lt;br /&gt;
    if (i != -1)&lt;br /&gt;
    {&lt;br /&gt;
        return llList2String(q,i+1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            url = body + &amp;quot;/&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            show(replace_all(html_base,&amp;quot;%url%&amp;quot;,url));&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSetText(get_query(id,&amp;quot;text&amp;quot;),&amp;lt;1,1,0&amp;gt;,1);&lt;br /&gt;
            show(replace_all(html_base,&amp;quot;%url%&amp;quot;,url));&lt;br /&gt;
            llHTTPResponse(id,200,&amp;quot;Loading....&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The Limits ===&lt;br /&gt;
* 1024 bytes per url&lt;br /&gt;
* llEscapeURLs means non-alphanumeric characters are 3 bytes (ouch)&lt;br /&gt;
** I&#039;m actually not clear on if this is really needed.  I seem to sometimes get blank pages if I don&#039;t but some pages render fine with out it.  Maybe there is a subset of symbols that must be escaped and escaping only those would ease some of the space constraints?&lt;br /&gt;
* Must force another page view after form submission since HTTP-In can&#039;t generate HTML&lt;br /&gt;
* No real way of knowing which avatar is interacting with the HTML&lt;br /&gt;
&lt;br /&gt;
=== The Tricks ===&lt;br /&gt;
* &amp;lt;base href=&amp;quot;&amp;lt;http-in-url&amp;gt;/&amp;quot;&amp;gt;&lt;br /&gt;
** HTTP-In urls are long, especially if escaped.  In a page that includes more than a single link back to the script, or more than a single form, this can save a lot of space.&lt;br /&gt;
* Tiny urls&lt;br /&gt;
** You can use url shortening services to create short links to long data urls.  In theory this should let you get past the 1k limit quite nicely, however there is overhead in setting up the tiny url.&lt;br /&gt;
=== The future? ===&lt;br /&gt;
I think there is a lot more potential here than what I have outlined .... if you have ideas or work out great new hacks let me know!  Also let me know if it is ok to share those hacks with others. :)&lt;br /&gt;
* svg?&lt;br /&gt;
* javascript?&lt;br /&gt;
* ajax?&lt;br /&gt;
&lt;br /&gt;
=== DHTML / Javascript (Tali Rosca) ===&lt;br /&gt;
Tali Rosca sent me the code to render the output of HTTP-In directly. I&#039;ve wrapped her magic into the build_url and build_response functions in the example below.  This example renders a page that is around 3.5k bytes - well past the 1k limit of urls.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pros&#039;&#039;&#039;:&lt;br /&gt;
* Navigation is much smoother and feels more natural&lt;br /&gt;
* Only limited by script memory&lt;br /&gt;
&#039;&#039;&#039;Cons&#039;&#039;&#039;:  &lt;br /&gt;
* Links are extremely large: 296 bytes for a link to just the base http-in url.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string url; // Our base http-in url&lt;br /&gt;
integer r;  // Used for uniqueness in PrimMedia urls&lt;br /&gt;
integer page;  // The page number.&lt;br /&gt;
&lt;br /&gt;
show(string html)&lt;br /&gt;
{&lt;br /&gt;
    html += &amp;quot;&amp;lt;span &amp;quot; + (string)((++r) % 10) + &amp;quot;/&amp;gt;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    llSetPrimMediaParams(0,                  // Side to display the media on.&lt;br /&gt;
            [PRIM_MEDIA_AUTO_PLAY,TRUE,      // Show this page immediately&lt;br /&gt;
             PRIM_MEDIA_CURRENT_URL,html,    // The url if they hit &#039;home&#039;&lt;br /&gt;
             PRIM_MEDIA_HOME_URL,html,       // The url currently showing&lt;br /&gt;
             PRIM_MEDIA_HEIGHT_PIXELS,512,   // Height/width of media texture will be&lt;br /&gt;
             PRIM_MEDIA_WIDTH_PIXELS,512]);  //   rounded up to nearest power of 2.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// This creates a data: url that will render the output of the http-in url &lt;br /&gt;
// given.&lt;br /&gt;
string build_url(string url)&lt;br /&gt;
{&lt;br /&gt;
    return &amp;quot;data:text/html,&amp;quot; &lt;br /&gt;
        + llEscapeURL(&amp;quot;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;script src=&#039;&amp;quot; + url &lt;br /&gt;
        + &amp;quot;&#039; type=&#039;text/javascript&#039;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body onload=&#039;init()&#039;&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// This wraps the html you want to display so that it will be shown from links &lt;br /&gt;
// made with build_url&lt;br /&gt;
string build_response(string body)&lt;br /&gt;
{&lt;br /&gt;
    return &amp;quot;function init() {document.getElementsByTagName(&#039;body&#039;)[0].innerHTML=&#039;&amp;quot; + body + &amp;quot;&#039;;}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            url = body + &amp;quot;/&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            show(build_url(url + &amp;quot;page&amp;quot; + (string)(page)));&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            string path = llGetHTTPHeader(id,&amp;quot;x-path-info&amp;quot;);&lt;br /&gt;
            string content = &amp;quot;&amp;lt;h1&amp;gt;path: &amp;quot; + path + &amp;quot;&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
            page = (integer)llGetSubString(path,5,5);&lt;br /&gt;
            if (page &amp;gt; 0) content += &amp;quot;&amp;lt;a href=\&amp;quot;&amp;quot; + build_url(url + &amp;quot;page&amp;quot; + (string)(page - 1)) + &amp;quot;\&amp;quot;&amp;gt;Previous&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
            if (page &amp;lt; 9) content += &amp;quot;&amp;lt;a href=\&amp;quot;&amp;quot; + build_url(url + &amp;quot;page&amp;quot; + (string)(page + 1)) + &amp;quot;\&amp;quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
            integer k;&lt;br /&gt;
            for(;k&amp;lt;10;++k)&lt;br /&gt;
            {&lt;br /&gt;
                if (k == page)&lt;br /&gt;
                    content += &amp;quot;&amp;lt;br&amp;gt;Page &amp;quot; + (string)k;&lt;br /&gt;
                else&lt;br /&gt;
                    content += &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=\&amp;quot;&amp;quot; + build_url(url + &amp;quot;page&amp;quot; + (string)(k)) + &amp;quot;\&amp;quot;&amp;gt;Page &amp;quot; + (string)k + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            content += &amp;quot;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;This page is &amp;quot; + (string)(llStringLength(build_response(content)) + 37) + &amp;quot; bytes long.&amp;quot;;&lt;br /&gt;
            llHTTPResponse(id,200,build_response(content));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
* I&#039;m not quite sure if it is possible to hook up a form using this method. Ideas?&lt;br /&gt;
&lt;br /&gt;
[[Category:Shared Media]]&lt;/div&gt;</summary>
		<author><name>Ai Austin</name></author>
	</entry>
</feed>