<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>Enigmatic Thought</title>
	<atom:link href="http://blog.enigmaticthought.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.enigmaticthought.com</link>
	<description>import com.enigmaticThought.blog;</description>
	<lastBuildDate>Fri, 25 Jun 2010 19:54:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Flash Debug crashing in Firefox?</title>
		<link>http://blog.enigmaticthought.com/2010/06/flash-debug-crashing-in-firefox/</link>
		<comments>http://blog.enigmaticthought.com/2010/06/flash-debug-crashing-in-firefox/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 19:52:53 +0000</pubDate>
		<dc:creator>Matt C</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Builder]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[firefox]]></category>
		<guid isPermaLink="false">http://enigmaticthought.com/?p=274</guid>
		<description><![CDATA[If you&#8217;ve just updated to Firefox 3.6.4 and use the Flash debug player, you may have noticed a problem. While you&#8217;re debugging, Firefox is killing you&#8217;re flash player session. Here&#8217;s the quick fix: type about:config in the firefox address bar search for dom.ipc.plugins.timeoutSecs double click and change the value to -1 This will disable the [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve just updated to Firefox 3.6.4 and use the Flash debug player, you may have noticed a problem.  While you&#8217;re debugging, Firefox is killing you&#8217;re flash player session.  Here&#8217;s the quick fix: </p>
<ol>
<li>type about:config in the firefox address bar</li>
<li>search for dom.ipc.plugins.timeoutSecs</li>
<li>double click and change the value to -1</li>
</ol>
<p>This will disable the hang detector that was added.  It&#8217;s the same reason I don&#8217;t do any debugging in Chrome (alongside the lack of HttpFox).  Sometimes a break point needs more than 10-15 seconds for me to figure out what&#8217;s going on.  <a href="http://benjamin.smedbergs.us/blog/2010-06-09/the-firefox-plugin-hang-detector/">Check out more details here</a><br />
<h3 class='related_post_title'>Related Posts (generated):</h3>
<ul class='related_post'>
<li><a href='http://enigmaticthought.com/2009/09/flash-builders-new-menu/' title='Altering Flash Builder&#8217;s new menu'>Altering Flash Builder&#8217;s new menu</a></li>
<li><a href='http://enigmaticthought.com/2009/02/firefox-and-flex/' title='Firefox and flex'>Firefox and flex</a></li>
<li><a href='http://enigmaticthought.com/2009/02/flex-in-eclipse-tips/' title='Flex in Eclipse tips'>Flex in Eclipse tips</a></li>
<li><a href='http://enigmaticthought.com/2010/03/clever-code/' title='Clever Code is dangerous'>Clever Code is dangerous</a></li>
<li><a href='http://enigmaticthought.com/2009/12/bugquash-badges-fixed/' title='Bugquash badges fixed'>Bugquash badges fixed</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.enigmaticthought.com/2010/06/flash-debug-crashing-in-firefox/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Clever Code is dangerous</title>
		<link>http://blog.enigmaticthought.com/2010/03/clever-code/</link>
		<comments>http://blog.enigmaticthought.com/2010/03/clever-code/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 18:48:47 +0000</pubDate>
		<dc:creator>Matt C</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[programming]]></category>
		<guid isPermaLink="false">http://enigmaticthought.com/?p=264</guid>
		<description><![CDATA[When we last left you, we talked about Big O Notation and how we can use that to compare two algorithms. That was all theoretical though, dealing with infinite sets of data. In the real world, you&#8217;ll find that sometimes a &#8220;bad&#8221; algorithm is really the best for your application. Lets track down an example [...]]]></description>
			<content:encoded><![CDATA[<p>When we last left you, we talked about <a href="http://enigmaticthought.com/2009/12/big-o-notation/">Big O Notation</a> and how we can use that to compare two algorithms.  That was all theoretical though, dealing with infinite sets of data.  In the real world, you&#8217;ll find that sometimes a &#8220;bad&#8221; algorithm is really the best for your application.</p>
<p>Lets track down an example from the world of video games.  You&#8217;ve got a ship that flying around trying to dodge asteroids, and the ship could fire bullets to blow the asteroids up.  Let&#8217;s lay out some ground rules as well.  We don&#8217;t worry about the asteroids hitting each other, and bullets can&#8217;t hit each other or your own ship.  There&#8217;s two separate problems here, and we&#8217;ll divide the collision system between them.  In the first, we have a single ship and a one or more asteroids (when there are no asteroids, the level is over).  In the second, there are zero or more bullets (maybe there&#8217;s a limit, but I&#8217;ll assume the <a href="http://catb.org/jargon/html/Z/Zero-One-Infinity-Rule.html">Zero-One-Infinity Rule</a>) and one or more asteroids.</p>
<p>On the surface these seem identical, there is a target set, and a set to hit the targets.  So let&#8217;s solve the complicated one first (bullets &#038; asteroids).  There&#8217;s a many to many relationship, so during the first pass we could compare each bullet to each asteroid and see if we register a hit.  Since we&#8217;re looping twice, the Big O notation would be O(b*a) with b = # of bullets, and 1 = # of asteroids.  We can do better than that though, thanks to some clever thinking.  Let&#8217;s sort our lists of asteroids and bullets in the order of the y (vertical) coordinate.  We know we can sort using lots of O(n log n) algorithms (<a href="http://en.wikipedia.org/wiki/Quicksort">quicksort</a>, <a href="http://en.wikipedia.org/wiki/Merge_sort">mergesort</a>, and whatnot) and then we can use the concept of merging to work our way down the 2 sorted lists looking for matching x coordinates.  Here&#8217;s some pseudocode:</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p264code2'); return false;">View Code</a> ACTIONSCRIPT3</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2642"><td class="code" id="p264code2"><pre class="actionscript3" style="font-family:monospace;">asteroidList<span style="color: #000066; font-weight: bold;">.</span>sortY<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
bulletsList<span style="color: #000066; font-weight: bold;">.</span>sortY<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
asteroid = <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #004993;">bullet</span> = <span style="color: #000000; font-weight:bold;">0</span>
<span style="color: #0033ff; font-weight: bold;">while</span> <span style="color: #000000;">&#40;</span>bulletList<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">length</span> <span style="color: #000066; font-weight: bold;">&lt;</span> <span style="color: #004993;">bullet</span> <span style="color: #000066; font-weight: bold;">&amp;&amp;</span> asteroidList<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">length</span> <span style="color: #000066; font-weight: bold;">&lt;</span> asteroid<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>bulletList<span style="color: #000000;">&#91;</span><span style="color: #004993;">bullet</span><span style="color: #000000;">&#93;</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span> <span style="color: #000066; font-weight: bold;">&lt;</span> asteroidList<span style="color: #000000;">&#91;</span>asteroid<span style="color: #000000;">&#93;</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #004993;">bullet</span><span style="color: #000066; font-weight: bold;">++;</span>
	<span style="color: #000000;">&#125;</span>
	<span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>bulletList<span style="color: #000000;">&#91;</span><span style="color: #004993;">bullet</span><span style="color: #000000;">&#93;</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span> <span style="color: #000066; font-weight: bold;">&gt;</span> asteroidList<span style="color: #000000;">&#91;</span>asteroid<span style="color: #000000;">&#93;</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		asteroid<span style="color: #000066; font-weight: bold;">++;</span>
	<span style="color: #000000;">&#125;</span>
	<span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #009900; font-style: italic;">// y is ==</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #009900; font-style: italic;">//check for collision and do work to handle multiple objects on same y point</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>
<p>Of course you&#8217;d have to build a way to handle multiple object on the same plane, but it&#8217;d work out to about O(a+b) assuming everything is evenly distributed on the y axis. Combined with the initial sorting, your Big O notation would be O(n log n) (either n=a or n=b depending on which is larger) because O(n log n) is &#8220;larger&#8221; than O(a+b), which would simplify to O(n).</p>
<p>So we&#8217;ve figured out the collision detection right? What about the ship and asteroids?  Since we know one value, O(s*a) is really O(1*a)=O(a) and our &#8220;clever&#8221; solution is actually slower than the original! In fact, depending on the number of bullets, we may have slowed the simple O(b*a) solution down as well.  </p>
<p>So you&#8217;re not programming a game, so why should you care?  Throw out asteroids, ships, and bullets and look at two sets of data you&#8217;re trying to merge.  A small list of data may just need a brute force solution rather than spending time figuring out a &#8220;really nifty algorithm&#8221; which may be horribly inefficient with the amount of data your working on.  Maybe you should just have everything pre-sorted so you don&#8217;t take the O(n log n) penalty, then O(a+b) can be no worse than O(a*n).  Regardless, don&#8217;t just look at the algorithm ans what it does, but look at the data that will be pushed around when you have to decide how to accomplish a task.<br />
<h3 class='related_post_title'>Related Posts (generated):</h3>
<ul class='related_post'>
<li><a href='http://enigmaticthought.com/2009/12/big-o-notation/' title='Big O Notation'>Big O Notation</a></li>
<li><a href='http://enigmaticthought.com/2009/12/why-algorithms-matter/' title='Why Algorithms Matter'>Why Algorithms Matter</a></li>
<li><a href='http://enigmaticthought.com/2010/06/flash-debug-crashing-in-firefox/' title='Flash Debug crashing in Firefox?'>Flash Debug crashing in Firefox?</a></li>
<li><a href='http://enigmaticthought.com/2009/12/bugquash-badges-fixed/' title='Bugquash badges fixed'>Bugquash badges fixed</a></li>
<li><a href='http://enigmaticthought.com/2009/11/scientific-notation-patch-accepted/' title='Scientific Notation Patch Accepted'>Scientific Notation Patch Accepted</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.enigmaticthought.com/2010/03/clever-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bugquash badges fixed</title>
		<link>http://blog.enigmaticthought.com/2009/12/bugquash-badges-fixed/</link>
		<comments>http://blog.enigmaticthought.com/2009/12/bugquash-badges-fixed/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 20:29:37 +0000</pubDate>
		<dc:creator>Matt C</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[BugQuash]]></category>
		<category><![CDATA[FlexSDK]]></category>
		<category><![CDATA[JIRA]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[programming]]></category>
		<guid isPermaLink="false">http://enigmaticthought.com/?p=261</guid>
		<description><![CDATA[Nate has fixed the BugQuash badge display, so everyone who has contributed to the Flex SDK can show the world. I&#8217;ve added mine back to the sidebar and I need to hunt another bug to earn my orange belt. As thanks for harassing him (idling in a chat room and asking every so often) he [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.natebeck.net/">Nate</a> has fixed the <a href="http://www.bugquash.com/">BugQuash</a> badge display, so everyone who has contributed to the Flex SDK can show the world.  I&#8217;ve added mine back to the sidebar and I need to hunt another bug to earn my <a href="http://www.bugquash.com/index.php?option=com_wrapper&#038;view=wrapper&#038;Itemid=93">orange belt</a>.  As thanks for harassing him (idling in a chat room and asking every so often) he added me to the <a href="http://bugquash.com/badge/badgetest.php">Test Page</a>.<br />
<h3 class='related_post_title'>Related Posts (generated):</h3>
<ul class='related_post'>
<li><a href='http://enigmaticthought.com/2009/11/scientific-notation-patch-accepted/' title='Scientific Notation Patch Accepted'>Scientific Notation Patch Accepted</a></li>
<li><a href='http://enigmaticthought.com/2009/08/sdk-16241/' title='Let&#8217;s patch: Fun with Scientific Notation!'>Let&#8217;s patch: Fun with Scientific Notation!</a></li>
<li><a href='http://enigmaticthought.com/2009/08/objectutil-compare-patch-attempt-number-2/' title='ObjectUtil.compare() Patch attempt number 2'>ObjectUtil.compare() Patch attempt number 2</a></li>
<li><a href='http://enigmaticthought.com/2009/09/sdk-2233-flex3-4-httpservice-bug/' title='Hold the HTTPService: Flex 3.4 gets a showstopper'>Hold the HTTPService: Flex 3.4 gets a showstopper</a></li>
<li><a href='http://enigmaticthought.com/2009/08/objectutil-compare-patch-3-with-feeling/' title='ObjectUtil.compare() Patch 3 (with feeling!)'>ObjectUtil.compare() Patch 3 (with feeling!)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.enigmaticthought.com/2009/12/bugquash-badges-fixed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Big O Notation</title>
		<link>http://blog.enigmaticthought.com/2009/12/big-o-notation/</link>
		<comments>http://blog.enigmaticthought.com/2009/12/big-o-notation/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 17:13:30 +0000</pubDate>
		<dc:creator>Matt C</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[programming]]></category>
		<guid isPermaLink="false">http://enigmaticthought.com/?p=246</guid>
		<description><![CDATA[There are many ways to solve a problem, which is why algorithms matter, but how do we choose which one to use? Maybe a flash game needs to do some collision detection, or perhaps a flex app holds a large set of data and needs eliminate outliers. Before we start looking at problem solving strategies, [...]]]></description>
			<content:encoded><![CDATA[<p>There are many ways to solve a problem, which is <a href="http://enigmaticthought.com/2009/12/why-algorithms-matter/">why algorithms matter</a>, but how do we choose which one to use?  Maybe a flash game needs to do some collision detection, or perhaps a flex app holds a large set of data and needs eliminate outliers.  Before we start looking at problem solving strategies, we need to learn some terminology, so we will begin with the big one, <a href="http://en.wikipedia.org/wiki/Big_O_notation">Big O notation</a>.</p>
<p>Big O notation allows us to describe an algorithm using a limiting factor.  That means we take a look at a single aspect of an algorithm, for example speed, and try and determine what type of calculation has the most impact on that aspect.  Then from this factor write a simple equation that the algorithm is no worse than.  Typically this is in relation to the size of the input, so Big O notation is typically show in relation to the number of elements (n).  Since Big O notation is all theoretical (it never uses real numbers, just fake math) it is assumed that only really big numbers of n matter.  </p>
<p>For example, if there is a better algorithm for 20 elements, it&#8217;s assumed that the difference is insignificant enough that it doesn&#8217;t matter.  So, if an algorithm a is 5% better than algorithm b with 20+ items, but 50% worse for less than 20, it would take 220 items for the two to be equal.  Then for every item over 220 algorithm a is better.  Since we assume big numbers, a is &#8220;always&#8221; better than b.</p>
<p>In mathematical terms, this means we only have to deal with the order of an algorithm.  What does this mean?  If an algorithm&#8217;s speed is n^2+20*n+45, then the n^2 term is the limiting factor.  While term 20*n matters a little when n is small, when n is 200, n^2 is 40000 while 20*n is 4000, less than 10% of the end result.  Again, we&#8217;re dealing with big numbers, so the higher the n, the less the smaller order terms matter.  Big O notation simplifies the math for us by ignoring other terms completely. So the Equation is O(n^2) in Big O.  Even better, Big O ignores <a href="http://en.wikipedia.org/wiki/Coefficient">coefficients</a>, so 20*n^2 and n^2 are considered the same, O(n^2).  This is because the coefficients are typically related to the system the algorithm is running on. The same algorithm could have many different coefficients thanks to variations in systems and implementations, but it is no worse than O(n^2).</p>
<p>Let&#8217;s look at sorting, where there are many algorithms so we can get a better idea of how to compare Big O notation.  <a href="http://en.wikipedia.org/wiki/Insertion_sort">Insertion Sort</a> is an O(n^2) algorithm while <a href="http://en.wikipedia.org/wiki/Merge_sort">Merge Sort</a> is a O(n log n) algorithm.  Since n log n is smaller than n^2 for large numbers, Merge Sort is always faster than Insertion Sort.  If you don&#8217;t want to do any kind of math, you can use a <a href="http://www.walterzorn.com/grapher/grapher_e.htm">function graphing tool</a> to get a visual representation of which increases slower.</p>
<p>Unfortunately, proving an algorithm&#8217;s worse case is not always easy, especially for complex algorithms.  Fortunately for us, we can get by with estimating based on known algorithms.  When I talk about specific algorithms or methods, I&#8217;ll make sure to point out the Big O value.  Unless you&#8217;re working on a formal proof, you can usually get by with a simple &#8220;This is similar to merge sort&#8221; and thus assume you&#8217;re dealing with n log n.<br />
<h3 class='related_post_title'>Related Posts (generated):</h3>
<ul class='related_post'>
<li><a href='http://enigmaticthought.com/2009/12/why-algorithms-matter/' title='Why Algorithms Matter'>Why Algorithms Matter</a></li>
<li><a href='http://enigmaticthought.com/2010/06/flash-debug-crashing-in-firefox/' title='Flash Debug crashing in Firefox?'>Flash Debug crashing in Firefox?</a></li>
<li><a href='http://enigmaticthought.com/2009/11/scientific-notation-patch-accepted/' title='Scientific Notation Patch Accepted'>Scientific Notation Patch Accepted</a></li>
<li><a href='http://enigmaticthought.com/2009/10/the-flex-component-lifecycle/' title='The Flex Component Lifecycle'>The Flex Component Lifecycle</a></li>
<li><a href='http://enigmaticthought.com/2009/09/flash-builders-new-menu/' title='Altering Flash Builder&#8217;s new menu'>Altering Flash Builder&#8217;s new menu</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.enigmaticthought.com/2009/12/big-o-notation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex 3.5 finally released</title>
		<link>http://blog.enigmaticthought.com/2009/12/flex-3-5-finally-released/</link>
		<comments>http://blog.enigmaticthought.com/2009/12/flex-3-5-finally-released/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 16:49:34 +0000</pubDate>
		<dc:creator>Matt C</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[BugQuash]]></category>
		<category><![CDATA[FlexSDK]]></category>
		<category><![CDATA[patch]]></category>
		<guid isPermaLink="false">http://enigmaticthought.com/?p=254</guid>
		<description><![CDATA[And that means the 3.4 showstopper, double responses to HTTPService have been fixed. You can get 3.5 direct from the source.. I don&#8217;t know what the deal is with the build date, or why they waited 3 months for a full 3.x release rather than a 3.4.1 patch release. Especially since the bug was fixed [...]]]></description>
			<content:encoded><![CDATA[<p>And that means the 3.4 showstopper, <a href="http://enigmaticthought.com/2009/09/sdk-2233-flex3-4-httpservice-bug/">double responses to HTTPService</a> have been fixed.  You can get 3.5 <a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3">direct from the source.</a>.  I don&#8217;t know what the deal is with the build date, or why they waited 3 months for a full 3.x release rather than a 3.4.1 patch release.  Especially since the bug was <a href="http://enigmaticthought.com/2009/09/httpservice-bug-crushed/">fixed</a> a week after 3.4 came out.<br />
<h3 class='related_post_title'>Related Posts (generated):</h3>
<ul class='related_post'>
<li><a href='http://enigmaticthought.com/2009/11/scientific-notation-patch-accepted/' title='Scientific Notation Patch Accepted'>Scientific Notation Patch Accepted</a></li>
<li><a href='http://enigmaticthought.com/2009/09/httpservice-bug-crushed/' title='HTTPService bug crushed in 3.x branch'>HTTPService bug crushed in 3.x branch</a></li>
<li><a href='http://enigmaticthought.com/2009/09/sdk-2233-flex3-4-httpservice-bug/' title='Hold the HTTPService: Flex 3.4 gets a showstopper'>Hold the HTTPService: Flex 3.4 gets a showstopper</a></li>
<li><a href='http://enigmaticthought.com/2009/08/sdk-16241/' title='Let&#8217;s patch: Fun with Scientific Notation!'>Let&#8217;s patch: Fun with Scientific Notation!</a></li>
<li><a href='http://enigmaticthought.com/2009/08/objectutil-compare-patch-3-with-feeling/' title='ObjectUtil.compare() Patch 3 (with feeling!)'>ObjectUtil.compare() Patch 3 (with feeling!)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.enigmaticthought.com/2009/12/flex-3-5-finally-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
