<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<html>
<head>
    <title>ActionScript 3.0 Language and Components Reference</title>
    <script language="javascript" type="text/javascript">
    	<!--
        window.onload=function(){
            var d=document.location.search;
			var args=d.substring(d.lastIndexOf('?')+1,d.length);
			var classFrameContent=args;
			var classListFrameContent='';
			if (args.indexOf('&') != -1) {
				classFrameContent = args.substring(0,args.indexOf('&'));
				classListFrameContent = args.substring(args.indexOf('&')+1,args.length);
			}
            if(classFrameContent!='')
            	top.frames['classFrame'].document.location.href=classFrameContent;
			if(classListFrameContent!='')
				top.frames['packageFrame'].frames['classListFrame'].document.location.href=classListFrameContent;
        }
        -->
    </script>
</head>
<frameset cols="175,*" border="2" bordercolor="#AAAAAA" framespacing="1">
       <frame src="package-frame.html" name="packageFrame" scrolling="no" />
       <frameset rows="80,*" border="0" bordercolor="#AAAAAA">
       		<frame src="title-bar.html" name="titlebar" scrolling="no" frameborder="0" />
       		<frame src="package-summary.html" name="classFrame" frameborder="0" />
    	</frameset>
    <noframes>
	<body>
        <h2>Frame Alert</h2>
        <p>
        This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
        <br />
        Link to <a href="package-summary.html">Non-frame version.</a>
        </p>
        </body>
    </noframes>
</frameset>
</html>
