diff options
131 files changed, 26293 insertions, 27955 deletions
diff --git a/NvCloth/ReleaseNotes.txt b/NvCloth/ReleaseNotes.txt index acc3aca..5751a25 100644 --- a/NvCloth/ReleaseNotes.txt +++ b/NvCloth/ReleaseNotes.txt @@ -1,20 +1,35 @@ NvCloth Release notes. -[1.0.0] + +[1.1.0] Supported platforms: * Windows (CPU, CUDA, DX11, RenderCloth) * Mac (beta, tested on Sierra, RenderCloth) * Linux (beta, tested on Ubuntu 16.04.1 LTS x64) -* Playstation 4 (beta) -* XBox one (CPU, DX11, beta) +* PlayStation 4 (beta) with PS4 SDK 4.5 +* Xbox one (CPU, DX11, beta) Note: beta platforms are not yet optimized. Supported compilers (via cmake 3.7) * Windows: Visual Studio 12, 14 (2013, 2015) * Linux: gcc (only x64) -* Mac: xcode -* Playstation 4: Visual studio 14 (2015) -* XBox one: Visual studio 14 (2015) +* Mac: xcode +* PlayStation 4: Visual studio 14 (2015) +* Xbox one: Visual studio 14 (2015) + +Fixed: +DirectX 11 solver now supports triangle collision shapes and air drag/lift. +Fixed bug where changing friction on cloth already in simulation would cause assert or crash. +Optimization flag now working on PS4 release build. + +New: +Solver::getNumCloths and Solver::getClothList interface. +Improved samples (new scenes and debug visualization) + +Known issues: +DirectX 11 solver has issues with ccd sphere/capsule collision. + +[1.0.0] Known issues: DirectX 11 solver doesn�t support triangle collision shapes and air drag/lift diff --git a/NvCloth/docs/documentation/CopyRight/Index.html b/NvCloth/docs/documentation/CopyRight/Index.html index 80fd29c..b0052e2 100644 --- a/NvCloth/docs/documentation/CopyRight/Index.html +++ b/NvCloth/docs/documentation/CopyRight/Index.html @@ -1,20 +1,24 @@ - - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta http-equiv="x-ua-compatible" content="IE=Edge"/> + + <title>NVIDIA Copyright Notice — NvCloth 1.0.0 documentation</title> - <title>NVIDIA Copyright Notice — NVIDIA NvCloth Documentation</title> - <link rel="stylesheet" href="../_static/nvidia.css" type="text/css" /> + <link rel="stylesheet" href="../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> - <link rel="stylesheet" href="../_static/custom.css" type="text/css" /> + <link rel="stylesheet" href="../_static/breathe.css" type="text/css" /> + <link rel="stylesheet" href="../_static/application.css" type="text/css" /> + <link rel="stylesheet" href="../_static/styleguide.css" type="text/css" /> + <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', - VERSION: '0.0', + VERSION: '1.0.0', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true @@ -23,83 +27,138 @@ <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> - <link rel="top" title="NVIDIA NvCloth Documentation" href="../index.html" /> - <link rel="prev" title="Users guide" href="../UsersGuide/Index.html" /> + <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + <script type="text/javascript" src="../_static/bootstrap.js"></script> + <script type="text/javascript" src="../_static/jquery.cookie.js"></script> + <script type="text/javascript" src="../_static/jquery.storageapi.js"></script> + <link rel="top" title="NvCloth 1.0.0 documentation" href="../index.html" /> </head> <body> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li class="right" style="margin-right: 10px"> - <a href="../UsersGuide/Index.html" title="Users guide" - accesskey="P">previous</a></li> - <li><a href="../NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> +<nav class="navbar navbar-inverse navbar-default"> + <div class="row"> + <div class="navbar-brand"> + <img class="logo" src="../_static/developerzone_gameworks_logo.png" alt="Logo"/> + </div> +<div id="searchbox" style="display: none; float:right; padding-top:4px; padding-right:4px"> + <form class="search form-inline" action="../search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> +</nav> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="../index.html">NvCloth 1.0.0 documentation</a></li> </ul> - </div> + </div> +</div> +<div class="row"> + <div class="col-md-3 bs-sidenav" style="white-space: nowrap; overflow: auto;"> +<div class="bs-sidebar"> + <div id="sidebar_toc"> + <h4>Table Of Contents</h4> + <ul> +<li class="toctree-l1"><a class="reference internal" href="../ReleaseNotes/index.html">Release Notes</a><ul> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#new-features">New Features</a></li> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#supported-platforms">Supported Platforms</a></li> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#supported-compilers">Supported Compilers</a></li> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#known-issues">Known Issues</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../Modules/Index.html">Modules</a><ul> +<li class="toctree-l2"><a class="reference internal" href="../Modules/Index.html#nvcloth">NvCloth</a></li> +<li class="toctree-l2"><a class="reference internal" href="../Modules/Index.html#nvcloth-extensions">NvCloth extensions</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../UsersGuide/Index.html">Users guide</a><ul> +<li class="toctree-l2"><a class="reference internal" href="../UsersGuide/Index.html#setup">Setup</a><ul> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#initializing-the-library">Initializing the Library</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#factory">Factory</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#fabric-cloth">Fabric & Cloth</a><ul> +<li class="toctree-l4"><a class="reference internal" href="../UsersGuide/Index.html#fabric">Fabric</a></li> +<li class="toctree-l4"><a class="reference internal" href="../UsersGuide/Index.html#cloth">Cloth</a></li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#solver">Solver</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#retrieving-simulation-data">Retrieving simulation data</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="../UsersGuide/Index.html#usage">Usage</a><ul> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#common-cloth-properties">Common cloth properties</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#tethers">Tethers</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#collision-detection">Collision detection</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#local-space-simulation">Local space simulation</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#drag-lift-and-wind">Drag lift and wind</a></li> +</ul> +</li> +</ul> +</li> +</ul> - <div class="document"> - <div class="documentwrapper"> - <div class="bodywrapper"> + </div> +<div id="searchbox" style="display: none"> + <h4>Quick search</h4> + <form class="search form-inline" action="../search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> +</div> + </div> + <div class="document col-md-8"> <div class="body"> <div class="section" id="nvidia-copyright-notice"> <h1>NVIDIA Copyright Notice<a class="headerlink" href="#nvidia-copyright-notice" title="Permalink to this headline">¶</a></h1> <blockquote> -<p>Copyright © 2016-2017, NVIDIA CORPORATION. All rights reserved.</p> +<div><p>Copyright © 2016-2017, NVIDIA CORPORATION. All rights reserved.</p> <p>NVIDIA CORPORATION and its licensors retain all intellectual property and proprietary rights in and to this software, related documentation and any modifications thereto. Any use, reproduction, disclosure or distribution of this software and related documentation without an express license agreement from NVIDIA CORPORATION is strictly prohibited.</p> -</blockquote> +</div></blockquote> </div> </div> - </div> - </div> - <div class="sphinxsidebar"> - <div class="sphinxsidebarwrapper"> - <h4>Previous topic</h4> - <p class="topless"><a href="../UsersGuide/Index.html" - title="previous chapter">Users guide</a></p> -<div id="searchbox" style="display: none"> - <h3>Quick search</h3> - <form class="search" action="../search.html" method="get"> - <input type="text" name="q" size="18" /> - <input type="submit" value="Go" /> - <input type="hidden" name="check_keywords" value="yes" /> - <input type="hidden" name="area" value="default" /> - </form> - <p class="searchtip" style="font-size: 90%"> - Enter search terms or a module, class or function name. - </p> -</div> -<script type="text/javascript">$('#searchbox').show(0);</script> - </div> - </div> <div class="clearer"></div> </div> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li class="right" style="margin-right: 10px"> - <a href="../UsersGuide/Index.html" title="Users guide" - >previous</a></li> - <li><a href="../NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> + <div class="col-md-1"></div> +</div> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="../index.html">NvCloth 1.0.0 documentation</a></li> </ul> </div> +</div> - <script type="text/javascript"> - $(document).ready(function() { - $(".toggle > *").hide(); - $(".toggle .header").show(); - $(".toggle .header").click(function() { - $(this).parent().children().not(".header").toggle(400); - $(this).parent().children(".header").toggleClass("open"); - }) - }); -</script> +<footer> + <div class="footer-boilerplate"> + <div class="row"> + <div class="boilerplate"> + Copyright © 2014, NVIDIA Corporation | <a href="http://www.nvidia.com/object/about-nvidia.html" onclick="s_objectID="http://www.nvidia.com/object/about-nvidia.html_1";return this.s_oc?this.s_oc(e):true">About NVIDIA </a> | <a href="http://www.nvidia.com/object/legal_info.html" onclick="s_objectID="http://www.nvidia.com/object/legal_info.html_1";return this.s_oc?this.s_oc(e):true">Legal Information </a> | <a href="http://www.nvidia.com/object/privacy_policy.html" onclick="s_objectID="http://www.nvidia.com/object/privacy_policy.html_1";return this.s_oc?this.s_oc(e):true">Privacy Policy </a> + </div> + </div> + </div> +</div> +</footer> <script type="text/x-mathjax-config"> @@ -124,6 +183,49 @@ license agreement from NVIDIA CORPORATION is strictly prohibited.</p> src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> </script> +<script> +var treestatename = 'GWDocsTreeState'; +var protocol = location.href.split('/')[0].toLowerCase(); +var storage; +if (protocol.substring(0,4) == 'http') { + storage = $.cookieStorage; + storage.setPath('/'); +} else { + storage = $.localStorage; +} + +if (storage.isEmpty(treestatename)) { + storage.set(treestatename, {}); +} + +var treestate = storage.get(treestatename); +$.each($("#sidebar_toc ul li"), toc_walker); + +function toc_walker(key, value) { + var handleSpan = $("<span></span>") + .addClass("toc_handle").prependTo(value); + handleSpan.attr("id", $(value).closest("div").attr("id") + "." + key); + + if($(value).has("ul li").size() > 0) { + var id = handleSpan.attr("id"); + if (!(id in treestate)) { + treestate[id] = false; + } + handleSpan.addClass("toc_expanded").click(function() { + $(this).toggleClass("toc_expanded toc_collapsed").siblings("ul").toggle(); + treestate[$(this).attr('id')] = $(this).hasClass('toc_expanded'); + storage.set(treestatename, treestate); + }); + if(!($(this).hasClass('current') || treestate[id])) { + handleSpan.click(); + } + if($(this).hasClass('current')) { + treestate[handleSpan.attr('id')] = handleSpan.hasClass('toc_expanded'); + storage.set(treestatename, treestate); + } + } +} +</script> </body> </html>
\ No newline at end of file diff --git a/NvCloth/docs/documentation/Modules/Index.html b/NvCloth/docs/documentation/Modules/Index.html index f55d6b9..4326c42 100644 --- a/NvCloth/docs/documentation/Modules/Index.html +++ b/NvCloth/docs/documentation/Modules/Index.html @@ -1,20 +1,24 @@ - - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta http-equiv="x-ua-compatible" content="IE=Edge"/> - <title>Modules — NVIDIA NvCloth Documentation</title> - <link rel="stylesheet" href="../_static/nvidia.css" type="text/css" /> + <title>Modules — NvCloth 1.0.0 documentation</title> + + <link rel="stylesheet" href="../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> - <link rel="stylesheet" href="../_static/custom.css" type="text/css" /> + <link rel="stylesheet" href="../_static/breathe.css" type="text/css" /> + <link rel="stylesheet" href="../_static/application.css" type="text/css" /> + <link rel="stylesheet" href="../_static/styleguide.css" type="text/css" /> + <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', - VERSION: '0.0', + VERSION: '1.0.0', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true @@ -23,27 +27,108 @@ <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> - <link rel="top" title="NVIDIA NvCloth Documentation" href="../index.html" /> + <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + <script type="text/javascript" src="../_static/bootstrap.js"></script> + <script type="text/javascript" src="../_static/jquery.cookie.js"></script> + <script type="text/javascript" src="../_static/jquery.storageapi.js"></script> + <link rel="top" title="NvCloth 1.0.0 documentation" href="../index.html" /> <link rel="next" title="Users guide" href="../UsersGuide/Index.html" /> - <link rel="prev" title="NVIDIA(R) NvCloth Documentation" href="../NvCloth.html" /> + <link rel="prev" title="Release Notes" href="../ReleaseNotes/index.html" /> </head> <body> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li class="right" style="margin-right: 10px"> - <a href="../UsersGuide/Index.html" title="Users guide" - accesskey="N">next</a></li> - <li class="right" > - <a href="../NvCloth.html" title="NVIDIA(R) NvCloth Documentation" - accesskey="P">previous</a> |</li> - <li><a href="../NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> +<nav class="navbar navbar-inverse navbar-default"> + <div class="row"> + <div class="navbar-brand"> + <img class="logo" src="../_static/developerzone_gameworks_logo.png" alt="Logo"/> + </div> +<div id="searchbox" style="display: none; float:right; padding-top:4px; padding-right:4px"> + <form class="search form-inline" action="../search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> +</nav> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="../index.html">NvCloth 1.0.0 documentation</a></li> </ul> - </div> + </div> +</div> +<div class="row"> + <div class="col-md-3 bs-sidenav" style="white-space: nowrap; overflow: auto;"> +<div class="bs-sidebar"> + <div id="sidebar_toc"> + <h4>Table Of Contents</h4> + <ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../ReleaseNotes/index.html">Release Notes</a><ul> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#new-features">New Features</a></li> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#supported-platforms">Supported Platforms</a></li> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#supported-compilers">Supported Compilers</a></li> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#known-issues">Known Issues</a></li> +</ul> +</li> +<li class="toctree-l1 current"><a class="current reference internal" href="">Modules</a><ul> +<li class="toctree-l2"><a class="reference internal" href="#nvcloth">NvCloth</a></li> +<li class="toctree-l2"><a class="reference internal" href="#nvcloth-extensions">NvCloth extensions</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../UsersGuide/Index.html">Users guide</a><ul> +<li class="toctree-l2"><a class="reference internal" href="../UsersGuide/Index.html#setup">Setup</a><ul> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#initializing-the-library">Initializing the Library</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#factory">Factory</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#fabric-cloth">Fabric & Cloth</a><ul> +<li class="toctree-l4"><a class="reference internal" href="../UsersGuide/Index.html#fabric">Fabric</a></li> +<li class="toctree-l4"><a class="reference internal" href="../UsersGuide/Index.html#cloth">Cloth</a></li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#solver">Solver</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#retrieving-simulation-data">Retrieving simulation data</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="../UsersGuide/Index.html#usage">Usage</a><ul> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#common-cloth-properties">Common cloth properties</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#tethers">Tethers</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#collision-detection">Collision detection</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#local-space-simulation">Local space simulation</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UsersGuide/Index.html#drag-lift-and-wind">Drag lift and wind</a></li> +</ul> +</li> +</ul> +</li> +</ul> - <div class="document"> - <div class="documentwrapper"> - <div class="bodywrapper"> + </div> + <h4>Previous topic</h4> + <p class="topless"><a href="../ReleaseNotes/index.html" + title="previous chapter">Release Notes</a></p> + <h4>Next topic</h4> + <p class="topless"><a href="../UsersGuide/Index.html" + title="next chapter">Users guide</a></p> +<div id="searchbox" style="display: none"> + <h4>Quick search</h4> + <form class="search form-inline" action="../search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> +</div> + </div> + <div class="document col-md-8"> <div class="body"> <div class="section" id="modules"> @@ -62,65 +147,28 @@ Users that want to use their own cooking or offline cooking can bypass these fun </div> - </div> - </div> - <div class="sphinxsidebar"> - <div class="sphinxsidebarwrapper"> - <h3><a href="../NvCloth.html">Table Of Contents</a></h3> - <ul> -<li><a class="reference internal" href="#">Modules</a><ul> -<li><a class="reference internal" href="#nvcloth">NvCloth</a></li> -<li><a class="reference internal" href="#nvcloth-extensions">NvCloth extensions</a></li> -</ul> -</li> -</ul> - - <h4>Previous topic</h4> - <p class="topless"><a href="../NvCloth.html" - title="previous chapter">NVIDIA(R) NvCloth Documentation</a></p> - <h4>Next topic</h4> - <p class="topless"><a href="../UsersGuide/Index.html" - title="next chapter">Users guide</a></p> -<div id="searchbox" style="display: none"> - <h3>Quick search</h3> - <form class="search" action="../search.html" method="get"> - <input type="text" name="q" size="18" /> - <input type="submit" value="Go" /> - <input type="hidden" name="check_keywords" value="yes" /> - <input type="hidden" name="area" value="default" /> - </form> - <p class="searchtip" style="font-size: 90%"> - Enter search terms or a module, class or function name. - </p> -</div> -<script type="text/javascript">$('#searchbox').show(0);</script> - </div> - </div> <div class="clearer"></div> </div> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li class="right" style="margin-right: 10px"> - <a href="../UsersGuide/Index.html" title="Users guide" - >next</a></li> - <li class="right" > - <a href="../NvCloth.html" title="NVIDIA(R) NvCloth Documentation" - >previous</a> |</li> - <li><a href="../NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> + <div class="col-md-1"></div> +</div> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="../index.html">NvCloth 1.0.0 documentation</a></li> </ul> </div> +</div> - <script type="text/javascript"> - $(document).ready(function() { - $(".toggle > *").hide(); - $(".toggle .header").show(); - $(".toggle .header").click(function() { - $(this).parent().children().not(".header").toggle(400); - $(this).parent().children(".header").toggleClass("open"); - }) - }); -</script> +<footer> + <div class="footer-boilerplate"> + <div class="row"> + <div class="boilerplate"> + Copyright © 2014, NVIDIA Corporation | <a href="http://www.nvidia.com/object/about-nvidia.html" onclick="s_objectID="http://www.nvidia.com/object/about-nvidia.html_1";return this.s_oc?this.s_oc(e):true">About NVIDIA </a> | <a href="http://www.nvidia.com/object/legal_info.html" onclick="s_objectID="http://www.nvidia.com/object/legal_info.html_1";return this.s_oc?this.s_oc(e):true">Legal Information </a> | <a href="http://www.nvidia.com/object/privacy_policy.html" onclick="s_objectID="http://www.nvidia.com/object/privacy_policy.html_1";return this.s_oc?this.s_oc(e):true">Privacy Policy </a> + </div> + </div> + </div> +</div> +</footer> <script type="text/x-mathjax-config"> @@ -145,6 +193,49 @@ Users that want to use their own cooking or offline cooking can bypass these fun src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> </script> +<script> +var treestatename = 'GWDocsTreeState'; +var protocol = location.href.split('/')[0].toLowerCase(); +var storage; +if (protocol.substring(0,4) == 'http') { + storage = $.cookieStorage; + storage.setPath('/'); +} else { + storage = $.localStorage; +} + +if (storage.isEmpty(treestatename)) { + storage.set(treestatename, {}); +} + +var treestate = storage.get(treestatename); + +$.each($("#sidebar_toc ul li"), toc_walker); + +function toc_walker(key, value) { + var handleSpan = $("<span></span>") + .addClass("toc_handle").prependTo(value); + handleSpan.attr("id", $(value).closest("div").attr("id") + "." + key); + if($(value).has("ul li").size() > 0) { + var id = handleSpan.attr("id"); + if (!(id in treestate)) { + treestate[id] = false; + } + handleSpan.addClass("toc_expanded").click(function() { + $(this).toggleClass("toc_expanded toc_collapsed").siblings("ul").toggle(); + treestate[$(this).attr('id')] = $(this).hasClass('toc_expanded'); + storage.set(treestatename, treestate); + }); + if(!($(this).hasClass('current') || treestate[id])) { + handleSpan.click(); + } + if($(this).hasClass('current')) { + treestate[handleSpan.attr('id')] = handleSpan.hasClass('toc_expanded'); + storage.set(treestatename, treestate); + } + } +} +</script> </body> </html>
\ No newline at end of file diff --git a/NvCloth/docs/documentation/ReleaseNotes/index.html b/NvCloth/docs/documentation/ReleaseNotes/index.html new file mode 100644 index 0000000..2ccbab7 --- /dev/null +++ b/NvCloth/docs/documentation/ReleaseNotes/index.html @@ -0,0 +1,300 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta http-equiv="x-ua-compatible" content="IE=Edge"/> + + <title>Release Notes — NvCloth 1.0.0 documentation</title> + + <link rel="stylesheet" href="../_static/default.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="stylesheet" href="../_static/breathe.css" type="text/css" /> + <link rel="stylesheet" href="../_static/application.css" type="text/css" /> + <link rel="stylesheet" href="../_static/styleguide.css" type="text/css" /> + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '../', + VERSION: '1.0.0', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + <script type="text/javascript" src="../_static/bootstrap.js"></script> + <script type="text/javascript" src="../_static/jquery.cookie.js"></script> + <script type="text/javascript" src="../_static/jquery.storageapi.js"></script> + <link rel="top" title="NvCloth 1.0.0 documentation" href="../index.html" /> + <link rel="next" title="Modules" href="../Modules/Index.html" /> + <link rel="prev" title="NvCloth" href="../index.html" /> + </head> + <body> +<nav class="navbar navbar-inverse navbar-default"> + <div class="row"> + <div class="navbar-brand"> + <img class="logo" src="../_static/developerzone_gameworks_logo.png" alt="Logo"/> + </div> +<div id="searchbox" style="display: none; float:right; padding-top:4px; padding-right:4px"> + <form class="search form-inline" action="../search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> +</nav> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="../index.html">NvCloth 1.0.0 documentation</a></li> + </ul> + </div> +</div> +<div class="row"> + <div class="col-md-3 bs-sidenav" style="white-space: nowrap; overflow: auto;"> +<div class="bs-sidebar"> + <div id="sidebar_toc"> + <h4>Table Of Contents</h4> + <ul class="current"> +<li class="toctree-l1 current"><a class="current reference internal" href="">Release Notes</a><ul> +<li class="toctree-l2"><a class="reference internal" href="#fixes">Fixes</a></li> +<li class="toctree-l2"><a class="reference internal" href="#new-features">New Features</a></li> +<li class="toctree-l2"><a class="reference internal" href="#supported-platforms">Supported Platforms</a></li> +<li class="toctree-l2"><a class="reference internal" href="#supported-compilers">Supported Compilers</a></li> +<li class="toctree-l2"><a class="reference internal" href="#known-issues">Known Issues</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../Modules/Index.html">Modules</a><ul> +<li class="toctree-l2"><a class="reference internal" href="../Modules/Index.html#nvcloth">NvCloth</a></li> +<li class="toctree-l2"><a class="reference internal" href="../Modules/Index.html#nvcloth-extensions">NvCloth extensions</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../UserGuide/Index.html">User Guide</a><ul> +<li class="toctree-l2"><a class="reference internal" href="../UserGuide/Index.html#setup">Setup</a><ul> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#initializing-the-library">Initializing the Library</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#factory">Factory</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#fabric-cloth">Fabric & Cloth</a><ul> +<li class="toctree-l4"><a class="reference internal" href="../UserGuide/Index.html#fabric">Fabric</a></li> +<li class="toctree-l4"><a class="reference internal" href="../UserGuide/Index.html#cloth">Cloth</a></li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#solver">Solver</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#retrieving-simulation-data">Retrieving simulation data</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="../UserGuide/Index.html#usage">Usage</a><ul> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#common-cloth-properties">Common cloth properties</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#tethers">Tethers</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#collision-detection">Collision detection</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#local-space-simulation">Local space simulation</a></li> +<li class="toctree-l3"><a class="reference internal" href="../UserGuide/Index.html#drag-lift-and-wind">Drag lift and wind</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../CopyRight/Index.html">NVIDIA Copyright Notice</a></li> +</ul> + + </div> + <h4>Previous topic</h4> + <p class="topless"><a href="../index.html" + title="previous chapter">NvCloth</a></p> + <h4>Next topic</h4> + <p class="topless"><a href="../Modules/Index.html" + title="next chapter">Modules</a></p> +<div id="searchbox" style="display: none"> + <h4>Quick search</h4> + <form class="search form-inline" action="../search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> +</div> + </div> + <div class="document col-md-8"> + <div class="body"> + + <div class="section" id="release-notes"> +<h1>Release Notes<a class="headerlink" href="#release-notes" title="Permalink to this headline">¶</a></h1> +<div class="section" id="fixes"> +<h2>Fixes<a class="headerlink" href="#fixes" title="Permalink to this headline">¶</a></h2> +<p><strong>1.1.0</strong></p> +<ul class="simple"> +<li>DirectX 11 solver now supports triangle collision shapes and air drag/lift.</li> +<li>Fixed bug where changing friction on cloth already in simulation would cause assert or crash.</li> +<li>Optimization flag now working on PS4 release build.</li> +</ul> +</div> +<div class="section" id="new-features"> +<h2>New Features<a class="headerlink" href="#new-features" title="Permalink to this headline">¶</a></h2> +<p><strong>1.1.0</strong></p> +<ul class="simple"> +<li>Solver::getNumCloths and Solver::getClothList interface.</li> +<li>Improved samples (new scenes and debug visualization)</li> +</ul> +<p><strong>1.0.0</strong></p> +<ul class="simple"> +<li>Initial release of NvCloth</li> +<li>Stiffness per constraint feature</li> +<li>New wind (air drag/lift) implementation</li> +</ul> +</div> +<div class="section" id="supported-platforms"> +<h2>Supported Platforms<a class="headerlink" href="#supported-platforms" title="Permalink to this headline">¶</a></h2> +<p><strong>1.1.0</strong></p> +<ul class="simple"> +<li>Windows (CPU, CUDA, DX11, RenderCloth)</li> +<li>Mac (beta, tested on Sierra, RenderCloth)</li> +<li>Linux (beta, tested on Ubuntu 16.04.1 LTS x64)</li> +<li>PlayStation 4 (beta) with PS4 4.5 SDK</li> +<li>Xbox one (CPU, DX11, beta)</li> +</ul> +<p>Note: beta platforms are not yet optimized.</p> +<p><strong>1.0.0</strong></p> +<ul class="simple"> +<li>Windows (CPU, CUDA, DX11, RenderCloth)</li> +<li>Mac (beta, tested on Sierra, RenderCloth)</li> +<li>Linux (beta, tested on Ubuntu 16.04.1 LTS x64)</li> +<li>PlayStation 4 (beta)</li> +<li>Xbox one (CPU, DX11, beta)</li> +</ul> +<p>Note: beta platforms are not yet optimized.</p> +</div> +<div class="section" id="supported-compilers"> +<h2>Supported Compilers<a class="headerlink" href="#supported-compilers" title="Permalink to this headline">¶</a></h2> +<p><strong>1.0.0</strong></p> +<p>Using cmake 3.7</p> +<ul class="simple"> +<li>Windows: Visual Studio 12, 14 (2013, 2015)</li> +<li>Linux: gcc (only x64)</li> +<li>Mac: xcode</li> +<li>PlayStation 4: Visual studio 14 (2015)</li> +<li>Xbox one: Visual studio 14 (2015)</li> +</ul> +</div> +<div class="section" id="known-issues"> +<h2>Known Issues<a class="headerlink" href="#known-issues" title="Permalink to this headline">¶</a></h2> +<p><strong>1.1.0</strong></p> +<ul class="simple"> +<li>DirectX 11 solver has issues with ccd sphere/capsule collision.</li> +</ul> +<p><strong>1.0.0</strong></p> +<ul class="simple"> +<li>DirectX 11 solver doesn’t support triangle collision shapes and air drag/lift</li> +</ul> +</div> +</div> + + + </div> + <div class="clearer"></div> + </div> + <div class="col-md-1"></div> +</div> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="../index.html">NvCloth 1.0.0 documentation</a></li> + </ul> + </div> +</div> + +<footer> + <div class="footer-boilerplate"> + <div class="row"> + <div class="boilerplate"> + Copyright © 2014, NVIDIA Corporation | <a href="http://www.nvidia.com/object/about-nvidia.html" onclick="s_objectID="http://www.nvidia.com/object/about-nvidia.html_1";return this.s_oc?this.s_oc(e):true">About NVIDIA </a> | <a href="http://www.nvidia.com/object/legal_info.html" onclick="s_objectID="http://www.nvidia.com/object/legal_info.html_1";return this.s_oc?this.s_oc(e):true">Legal Information </a> | <a href="http://www.nvidia.com/object/privacy_policy.html" onclick="s_objectID="http://www.nvidia.com/object/privacy_policy.html_1";return this.s_oc?this.s_oc(e):true">Privacy Policy </a> + </div> + </div> + </div> +</div> +</footer> + + +<script type="text/x-mathjax-config"> + MathJax.Hub.Config({ + extensions: ["tex2jax.js"], + jax: ["input/TeX", "output/HTML-CSS"], + tex2jax: { + processEscapes: true, + skipTags: ["script","noscript","style","textarea"] + }, + "HTML-CSS": { availableFonts: ["TeX"] }, + TeX: { + Macros: { + Lrg: ['\\displaystyle{#1}', 1, ""] + } + } + }); +</script> + + +<script type="text/javascript" async + src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> +</script> + +<script> +var treestatename = 'GWDocsTreeState'; +var protocol = location.href.split('/')[0].toLowerCase(); +var storage; +if (protocol.substring(0,4) == 'http') { + storage = $.cookieStorage; + storage.setPath('/'); +} else { + storage = $.localStorage; +} + +if (storage.isEmpty(treestatename)) { + storage.set(treestatename, {}); +} + +var treestate = storage.get(treestatename); + +$.each($("#sidebar_toc ul li"), toc_walker); + +function toc_walker(key, value) { + var handleSpan = $("<span></span>") + .addClass("toc_handle").prependTo(value); + handleSpan.attr("id", $(value).closest("div").attr("id") + "." + key); + + if($(value).has("ul li").size() > 0) { + var id = handleSpan.attr("id"); + if (!(id in treestate)) { + treestate[id] = false; + } + handleSpan.addClass("toc_expanded").click(function() { + $(this).toggleClass("toc_expanded toc_collapsed").siblings("ul").toggle(); + treestate[$(this).attr('id')] = $(this).hasClass('toc_expanded'); + storage.set(treestatename, treestate); + }); + if(!($(this).hasClass('current') || treestate[id])) { + handleSpan.click(); + } + if($(this).hasClass('current')) { + treestate[handleSpan.attr('id')] = handleSpan.hasClass('toc_expanded'); + storage.set(treestatename, treestate); + } + } +} +</script> + </body> +</html>
\ No newline at end of file diff --git a/NvCloth/docs/documentation/Solver/Index.html b/NvCloth/docs/documentation/Solver/Index.html deleted file mode 100644 index 8c98c15..0000000 --- a/NvCloth/docs/documentation/Solver/Index.html +++ /dev/null @@ -1,367 +0,0 @@ - - -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - - <title>Internal solver function/algorithm documentation — NVIDIA NvCloth Documentation</title> - <link rel="stylesheet" href="../_static/nvidia.css" type="text/css" /> - <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> - <link rel="stylesheet" href="../_static/custom.css" type="text/css" /> - <script type="text/javascript"> - var DOCUMENTATION_OPTIONS = { - URL_ROOT: '../', - VERSION: '0.0', - COLLAPSE_INDEX: false, - FILE_SUFFIX: '.html', - HAS_SOURCE: true - }; - </script> - <script type="text/javascript" src="../_static/jquery.js"></script> - <script type="text/javascript" src="../_static/underscore.js"></script> - <script type="text/javascript" src="../_static/doctools.js"></script> - <link rel="top" title="NVIDIA NvCloth Documentation" href="../index.html" /> - </head> - <body> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li><a href="../NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> - </ul> - </div> - - <div class="document"> - <div class="documentwrapper"> - <div class="bodywrapper"> - <div class="body"> - - <div class="section" id="internal-solver-function-algorithm-documentation"> -<h1>Internal solver function/algorithm documentation<a class="headerlink" href="#internal-solver-function-algorithm-documentation" title="Permalink to this headline">¶</a></h1> -<p>This document describes the internal workings of the solver. -We describe how the different parts work independent from platform specific features. Although we might occasionally comment on particular implementation details.</p> -<p>Todo: give this solver a name, so that we can differentiate when a new/different solver is added.</p> -<div class="toggle container"> -<div class="header container"> -Show/Hide Code</div> -<div class="togglecontent container"> -test togglecontent</div> -</div> -<div class="section" id="overview"> -<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2> -<p>Overview of the general algorithm goes here.</p> -<ul class="simple"> -<li>Integrate particles (integrateParticles())</li> -<li>Simulate wind/drag/lift (applyWind())</li> -<li>Distance constraints (constrainMotion())</li> -<li>Tether constraints (constrainTether())</li> -<li>Solve edge constraints (solveFabric())</li> -<li>Solve separation constraints (constrainSeparation())</li> -<li>Collision (collideParticles())</li> -<li>Self collision (selfCollideParticles())</li> -<li>Update sleep state (updateSleepState())</li> -</ul> -</div> -<div class="section" id="particle-invmass-w-component"> -<h2>Particle invMass w component<a class="headerlink" href="#particle-invmass-w-component" title="Permalink to this headline">¶</a></h2> -<p>Todo: check and rewrite:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="c1">// note on invMass (stored in current/previous positions.w):</span> -<span class="c1">// integrateParticles()</span> -<span class="c1">// - if(current.w == 0) current.w = previous.w</span> -<span class="c1">// constraintMotion()</span> -<span class="c1">// - if(constraint.radius <= 0) current.w = 0</span> -<span class="c1">// computeBounds()</span> -<span class="c1">// - if(current.w > 0) current.w = previous.w</span> -<span class="c1">// collideParticles()</span> -<span class="c1">// - if(collides) current.w *= 1/massScale</span> -<span class="c1">// after simulate()</span> -<span class="c1">// - previous.w: original invMass as set by user</span> -<span class="c1">// - current.w: zeroed by motion constraints and mass-scaled by collision</span> -</pre></div> -</div> -</div> -<div class="section" id="slack"> -<h2>Slack<a class="headerlink" href="#slack" title="Permalink to this headline">¶</a></h2> -<p>The position constraint for keeping distance between points a and b is usually written as:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">error</span> <span class="o">=</span> <span class="o">|</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">|</span> <span class="o">-</span> <span class="n">restLength</span> -<span class="n">offset</span> <span class="o">=</span> <span class="n">error</span> <span class="o">*</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span><span class="o">/|</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">|</span> - <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span> <span class="o">-</span> <span class="n">restLength</span><span class="o">*</span><span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span><span class="o">/|</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">|</span> -</pre></div> -</div> -<p>The equation calculating <em>slack</em> pops up often in the solver code. -This does exactly the same as the above:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">slack</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">restLength</span> <span class="o">/</span> <span class="o">|</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">|</span> -<span class="n">offset</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span> <span class="o">*</span> <span class="n">slack</span> - <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span> <span class="o">-</span> <span class="n">restLength</span><span class="o">*</span><span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span><span class="o">/|</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">|</span> -</pre></div> -</div> -</div> -<div class="section" id="integration"> -<h2>Integration<a class="headerlink" href="#integration" title="Permalink to this headline">¶</a></h2> -<p>The first step of the cloth simulation is the integration. -Explicit Euler integration is used to calculate the new position of the particles. -The velocity of the particles is not stored, instead we use the position from the previous frame to calculate the velocity. -We need to compensate for differences in delta time. Large fluctuations can cause problems, so the delta time is damped.</p> -<p>The following pseudo code describes how this is implemented:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="c1">//calculate damping constants from user setting 'damping'</span> -<span class="n">logDamping</span> <span class="o">=</span> <span class="n">log_2</span><span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">damping</span><span class="p">)</span> <span class="c1">//from ClothImpl<T>::setDamping</span> -<span class="n">dampExponent</span> <span class="o">=</span> <span class="n">stiffnessFrequency</span> <span class="o">*</span> <span class="n">dt1</span> <span class="c1">//from IterationState::create</span> - -<span class="c1">//calculate delta time ajustment</span> -<span class="n">scale</span> <span class="o">=</span> <span class="n">e</span><span class="o">^</span><span class="p">{</span><span class="n">logDamping</span> <span class="o">*</span> <span class="n">dampExponent</span><span class="p">}</span> <span class="o">*</span> <span class="p">{</span><span class="n">dt1</span><span class="o">/</span><span class="n">dt0</span><span class="p">}</span> <span class="c1">//from IterationState::create</span> -<span class="c1">//Do the integration</span> -<span class="n">delta</span> <span class="o">=</span> <span class="p">(</span><span class="n">particle_position1</span><span class="o">-</span><span class="n">particle_position0</span><span class="p">)</span> <span class="o">*</span> <span class="n">scale</span> <span class="o">+</span> <span class="n">acceleration</span> -<span class="n">particle_position1</span> <span class="o">=</span> <span class="n">particle_position1</span> <span class="o">+</span> <span class="n">delta</span> -</pre></div> -</div> -<p>The integration code also replaces the current inverse mass with the previous inverse mass if the current is zero.</p> -<p>Todo: rotating reference frame.</p> -<p>Todo: how does damping work?</p> -</div> -<div class="section" id="wind-simulation"> -<h2>Wind simulation<a class="headerlink" href="#wind-simulation" title="Permalink to this headline">¶</a></h2> -<p>Drag and lift simulation is done in the applyWind() function. -The following algorithm is used:</p> -<div class="highlight-c++"><pre>for each triangle - \(p_j\) is the previous and \(c_j\) is the current position and \(m^{-1}_j\) is the inverse mass of the \(j\)th particle in of the triangle. - - //Calculate current and previous center of the triangle - \(c_t = \frac{1}{3} \cdot \left( c_0 + c_1 + c_2 \right)\) - \(p_t = \frac{1}{3} \cdot \left( p_0 + p_1 + p_2 \right)\) - - //Position difference including wind (same as flow speed times dt) - \(d = c_t - p_t + wind\) - - if rotating reference frame - \(d = c_t + R\left(d-c_t\right)\) //where \(R\) is the inverse local space rotation for one solver iteration - //Todo check/explain this - - //Unnormalized normal of the triangle - \(n = \left(c_2 - c_0\right) \times \left(c_1 - c_0\right) \) - - //Double the area of the triangle - \(a = \left|n\right| \) - - \(\Lrg{ \cos\left(\theta\right) = \frac{n \cdot d}{\left|n\right| \cdot \left|d \right|} }\) - \(\Lrg{ \sin\left(\theta\right) = \sqrt{\max(0, 1 - \cos\left(\theta\right)^2)}}\) - - //Lift direction is orthogonal to delta, in the delta-normal plane. Its length is \(\left|n\right|\cdot\left|d\right|\) - \(\Lrg{ l_{dir} = \frac{\left( d \times n\right) \times d}{\left|d \right|} }\) - - //Calculate the lift and drag impulse - //The lift is at its maximum when \(d\) is at an \(45^\circ\) angle to the triangle - //We use \(\sin\left(\theta\right)\cdot\cos\left(\theta\right) = \frac{1}{2}\sin\left(2\cdot \theta\right)\) to calculate this - \(i_{lift} = c_{lift} \cdot \cos\left(\theta\right) \cdot \sin\left(\theta\right) \cdot l_{dir} \) - \(i_{drag} = c_{drag} \cdot \left|\cos\left(\theta\right)\right| \cdot a \cdot d \) - //\(c_{lift} \) and \(c_{drag}\) are the lift and drag coefficients - //\(c_{drag}\) should be set to compensate for the double area in \(a\) - - //combined impulse - \(\Lrg{ i = - \begin{cases} - \epsilon < \left|d\right|^2,& 0\\ - \text{else},& i_{lift} + i_{drag} - \end{cases} - }\) - - //apply impulses to the particle positions - for each particle \(j = \left\{ 0, 1, 2 \right\} \) - \(c_j = c_j - i \cdot m^{-1}_j \)</pre> -</div> -<p>Note that when we combine the impulses we check if \(\left|d\right|\) is too small as this causes instabilities due to float division inaccuracies. -This can cause different drag and lift behavior depending on the time step size (or solver frequency). -Smaller time steps result in smaller position deltas which reach the \(\epsilon\) threshold sooner. -This results in less drag/lift at small time steps (high solver frequencies) for slow moving particles.</p> -</div> -<div class="section" id="distance-constraints"> -<h2>Distance constraints<a class="headerlink" href="#distance-constraints" title="Permalink to this headline">¶</a></h2> -<p>A distance constraint can limit the movement of a particle to the volume of a sphere. -The constraints are specified with an array of 4 dimensional vectors (physx::PxVec4) where the x, y, z elements define the center and w the radius of the sphere.</p> -<p>The constraints are interpolated between the start and target spheres if both are given.</p> -<p>The constrainMotion() function in the solver is responsible for enforcing these constraints. -The following pseudo code describes how this is implemented:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">delta</span> <span class="o">=</span> <span class="n">sphere_center</span> <span class="o">-</span> <span class="n">particle_position</span> -<span class="n">sqrLength</span> <span class="o">=</span> <span class="n">epsilon</span> <span class="o">+</span> <span class="o">|</span><span class="n">delta</span><span class="o">|^</span><span class="mi">2</span> -<span class="n">radius</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">sphere_radius</span> <span class="o">*</span> <span class="n">scale</span> <span class="o">+</span> <span class="n">bias</span><span class="p">)</span> -<span class="n">slack</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">radius</span> <span class="o">/</span> <span class="n">sqrt</span><span class="p">{</span><span class="n">sqrLength</span><span class="p">}</span> - -<span class="k">if</span><span class="p">(</span><span class="n">slack</span><span class="o">></span><span class="mi">0</span><span class="p">)</span> -<span class="p">{</span> - <span class="k">if</span><span class="p">(</span><span class="n">radius</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">)</span> - <span class="n">particle_invMass</span><span class="p">.</span><span class="n">w</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">//Set the inverse mass to 0 if we are constrained to a zero radius sphere</span> - <span class="n">slack</span> <span class="o">=</span> <span class="n">slack</span> <span class="o">*</span> <span class="n">stiffness</span> - <span class="n">particle</span><span class="p">.</span><span class="n">xyz</span> <span class="o">+=</span> <span class="n">delta</span> <span class="o">*</span> <span class="n">slack</span> -<span class="p">}</span> -</pre></div> -</div> -</div> -<div class="section" id="tether-constraints"> -<h2>Tether constraints<a class="headerlink" href="#tether-constraints" title="Permalink to this headline">¶</a></h2> -<p>Tether constraints help with reducing the stretchiness of the cloth without increasing the solver iteration count. -This is done by adding additional max distance constraints connecting simulated particles with their nearest fixed particle(s). -The tether constraints are stored as an index & length pair. -The array of constraints has a multiple of particle count elements. -The constraints in the array are stored in order so that the first particle of the constraint is element%numParticles. -The index stored in the constraint defines the other (anchor) particle of the constraint.</p> -<p>The constraint for one particle is solved as follows:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span> -<span class="k">for</span> <span class="n">each</span> <span class="n">tether</span> <span class="n">connecting</span> <span class="n">pb</span> - <span class="c1">//pa is the anchor particle</span> - <span class="n">delta</span> <span class="o">=</span> <span class="n">pa</span> <span class="o">-</span> <span class="n">pb</span> - <span class="n">radius</span> <span class="o">=</span> <span class="n">tetherLength</span> <span class="o">*</span> <span class="n">scale</span> - <span class="n">slack</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">radius</span> <span class="o">/</span> <span class="p">(</span><span class="o">|</span><span class="n">delta</span><span class="o">|</span> <span class="o">+</span> <span class="n">epsilon</span><span class="p">)</span> - <span class="n">offset</span> <span class="o">+=</span> <span class="n">delta</span> <span class="o">*</span> <span class="n">max</span><span class="p">(</span><span class="n">slack</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> -<span class="n">pb</span> <span class="o">+=</span> <span class="n">offset</span> <span class="o">*</span> <span class="n">stiffness</span> -</pre></div> -</div> -<p>The stiffness is calculated as follows:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">stiffness</span> <span class="o">=</span> <span class="n">tetherConstraintStiffness</span> <span class="o">*</span> <span class="n">numParticles</span> <span class="o">/</span> <span class="n">numTethers</span> -</pre></div> -</div> -</div> -<div class="section" id="edge-constraints"> -<h2>Edge constraints<a class="headerlink" href="#edge-constraints" title="Permalink to this headline">¶</a></h2> -<p>Algorithm:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">r</span> <span class="o">=</span> <span class="n">restlength</span> -<span class="n">pi</span> <span class="o">=</span> <span class="n">particle</span> <span class="n">i</span> -<span class="n">piw</span> <span class="o">=</span> <span class="n">inv</span> <span class="n">weight</span> <span class="n">of</span> <span class="n">particle</span> <span class="n">i</span> -<span class="n">h</span> <span class="o">=</span> <span class="n">pb</span><span class="o">-</span><span class="n">pa</span> -<span class="n">e2</span> <span class="o">=</span> <span class="n">epsilon</span> <span class="o">+</span> <span class="o">|</span><span class="n">h</span><span class="o">|^</span><span class="mi">2</span> -<span class="n">er</span> <span class="o">=</span> <span class="n">r</span><span class="o">></span><span class="mi">0</span> <span class="o">?</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">r</span> <span class="o">/</span> <span class="n">sqrt</span><span class="p">{</span><span class="n">e2</span><span class="p">})</span> <span class="o">:</span> <span class="mi">0</span> - -<span class="k">if</span><span class="p">(</span><span class="n">useMultiplier</span><span class="p">)</span> -<span class="p">{</span> - <span class="c1">//from PhaseConfig.h cloth::transform</span> - <span class="n">multiplierC</span> <span class="o">=</span> <span class="n">log2</span><span class="p">(</span><span class="n">stiffnessMultiplier</span><span class="p">)</span> - <span class="n">compressionLimitC</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">/</span> <span class="n">compressionLimit</span> - <span class="n">strechLimitC</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">/</span> <span class="n">stretchLimit</span> - <span class="n">er</span> <span class="o">-=</span> <span class="n">multiplierC</span> <span class="o">*</span> <span class="n">max</span><span class="p">(</span><span class="n">compressionLimitC</span><span class="p">,</span> <span class="n">min</span><span class="p">(</span><span class="n">er</span><span class="p">,</span> <span class="n">stretchLimitC</span><span class="p">))</span> -<span class="p">}</span> - -<span class="n">stiffnessExponent</span> <span class="o">=</span> <span class="n">stiffnessFrequency</span> <span class="o">*</span> <span class="n">dt</span><span class="o">/</span><span class="n">iterations</span> -<span class="n">stiffness</span> <span class="o">=</span> <span class="n">log2</span><span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">stiffness</span><span class="p">)</span> <span class="c1">//check when this happens //from PhaseConfig.h cloth::transform</span> -<span class="n">stiffnessC</span> <span class="o">=</span> <span class="mi">1</span><span class="o">-</span><span class="mi">2</span><span class="o">^</span><span class="p">{</span><span class="n">stiffness</span> <span class="o">*</span> <span class="n">stiffnessExponent</span><span class="p">}</span> -<span class="n">ex</span> <span class="o">=</span> <span class="n">er</span> <span class="o">*</span> <span class="n">stiffnessC</span> <span class="o">/</span> <span class="p">(</span><span class="n">pbw</span><span class="o">+</span><span class="n">paw</span><span class="p">)</span> - -<span class="n">pa</span> <span class="o">=</span> <span class="n">pa</span> <span class="o">+</span> <span class="n">h</span><span class="o">*</span><span class="n">ex</span> <span class="o">*</span> <span class="n">paw</span> -<span class="n">pb</span> <span class="o">=</span> <span class="n">pb</span> <span class="o">-</span> <span class="n">h</span><span class="o">*</span><span class="n">ex</span> <span class="o">*</span> <span class="n">pbw</span> -</pre></div> -</div> -</div> -<div class="section" id="separation-constraints"> -<h2>Separation constraints<a class="headerlink" href="#separation-constraints" title="Permalink to this headline">¶</a></h2> -<p>Separation constraints do exactly the opposite of distance constraints. -These constraints ensure that the particles remain outside the defined spheres.</p> -<p>The constraints are interpolated between the start and target spheres if both are given.</p> -<p>The constrainSeparation() function in the solver is responsible for enforcing these constraints. -Solving a single constraint is done as follows:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="c1">//p is the particle position</span> -<span class="c1">//c is the sphere center</span> -<span class="c1">//r is the sphere radius</span> -<span class="n">d</span> <span class="o">=</span> <span class="n">c</span><span class="o">-</span><span class="n">p</span> -<span class="n">l</span> <span class="o">=</span> <span class="o">|</span><span class="n">d</span><span class="o">|</span> -<span class="n">slack</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">r</span><span class="o">/</span><span class="n">l</span> -<span class="k">if</span><span class="p">(</span><span class="n">slack</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span> - <span class="n">p</span> <span class="o">+=</span> <span class="n">d</span> <span class="o">*</span> <span class="n">slack</span> -</pre></div> -</div> -</div> -<div class="section" id="fabric-data-structure"> -<h2>Fabric data structure<a class="headerlink" href="#fabric-data-structure" title="Permalink to this headline">¶</a></h2> -<p>The fabric data structure contains the constraint information that can be reused by multiple cloth instances. -The constraints are divided in different phases. -Each phase usually contains a different type of constraints such as (horizontal/vertical) stretching, searing, bending constraints.</p> -<p>mPhases contains indices indicating which set from mSets belongs to a phase.</p> -<p>mSets contains a list of start (and end) indices for mRestvalues and mIndices (if multiplied by 2). -The first rest value of set s is mRestvalues[mSets[s]] and the last is mRestvalues[mSets[s+1]-1].</p> -<p>mRestvalues contains the rest lengths / edge lengths of the constraints.</p> -<p>mIndices contains pairs of indices connected by a constraint. (mIndices.size()*2 == mRestvalues.size())</p> -</div> -</div> - - - </div> - </div> - </div> - <div class="sphinxsidebar"> - <div class="sphinxsidebarwrapper"> - <h3><a href="../NvCloth.html">Table Of Contents</a></h3> - <ul> -<li><a class="reference internal" href="#">Internal solver function/algorithm documentation</a><ul> -<li><a class="reference internal" href="#overview">Overview</a></li> -<li><a class="reference internal" href="#particle-invmass-w-component">Particle invMass w component</a></li> -<li><a class="reference internal" href="#slack">Slack</a></li> -<li><a class="reference internal" href="#integration">Integration</a></li> -<li><a class="reference internal" href="#wind-simulation">Wind simulation</a></li> -<li><a class="reference internal" href="#distance-constraints">Distance constraints</a></li> -<li><a class="reference internal" href="#tether-constraints">Tether constraints</a></li> -<li><a class="reference internal" href="#edge-constraints">Edge constraints</a></li> -<li><a class="reference internal" href="#separation-constraints">Separation constraints</a></li> -<li><a class="reference internal" href="#fabric-data-structure">Fabric data structure</a></li> -</ul> -</li> -</ul> - -<div id="searchbox" style="display: none"> - <h3>Quick search</h3> - <form class="search" action="../search.html" method="get"> - <input type="text" name="q" size="18" /> - <input type="submit" value="Go" /> - <input type="hidden" name="check_keywords" value="yes" /> - <input type="hidden" name="area" value="default" /> - </form> - <p class="searchtip" style="font-size: 90%"> - Enter search terms or a module, class or function name. - </p> -</div> -<script type="text/javascript">$('#searchbox').show(0);</script> - </div> - </div> - <div class="clearer"></div> - </div> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li><a href="../NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> - </ul> - </div> - - <script type="text/javascript"> - $(document).ready(function() { - $(".toggle > *").hide(); - $(".toggle .header").show(); - $(".toggle .header").click(function() { - $(this).parent().children().not(".header").toggle(400); - $(this).parent().children(".header").toggleClass("open"); - }) - }); -</script> - - -<script type="text/x-mathjax-config"> - MathJax.Hub.Config({ - extensions: ["tex2jax.js"], - jax: ["input/TeX", "output/HTML-CSS"], - tex2jax: { - processEscapes: true, - skipTags: ["script","noscript","style","textarea"] - }, - "HTML-CSS": { availableFonts: ["TeX"] }, - TeX: { - Macros: { - Lrg: ['\\displaystyle{#1}', 1, ""] - } - } - }); -</script> - - -<script type="text/javascript" async - src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> -</script> - - - </body> -</html>
\ No newline at end of file diff --git a/NvCloth/docs/documentation/UserGuide/Index.html b/NvCloth/docs/documentation/UserGuide/Index.html new file mode 100644 index 0000000..0a231f4 --- /dev/null +++ b/NvCloth/docs/documentation/UserGuide/Index.html @@ -0,0 +1,592 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta http-equiv="x-ua-compatible" content="IE=Edge"/> + + <title>User Guide — NvCloth 1.0.0 documentation</title> + + <link rel="stylesheet" href="../_static/default.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="stylesheet" href="../_static/breathe.css" type="text/css" /> + <link rel="stylesheet" href="../_static/application.css" type="text/css" /> + <link rel="stylesheet" href="../_static/styleguide.css" type="text/css" /> + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '../', + VERSION: '1.0.0', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + <script type="text/javascript" src="../_static/bootstrap.js"></script> + <script type="text/javascript" src="../_static/jquery.cookie.js"></script> + <script type="text/javascript" src="../_static/jquery.storageapi.js"></script> + <link rel="top" title="NvCloth 1.0.0 documentation" href="../index.html" /> + <link rel="next" title="NVIDIA Copyright Notice" href="../CopyRight/Index.html" /> + <link rel="prev" title="Modules" href="../Modules/Index.html" /> + </head> + <body> +<nav class="navbar navbar-inverse navbar-default"> + <div class="row"> + <div class="navbar-brand"> + <img class="logo" src="../_static/developerzone_gameworks_logo.png" alt="Logo"/> + </div> +<div id="searchbox" style="display: none; float:right; padding-top:4px; padding-right:4px"> + <form class="search form-inline" action="../search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> +</nav> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="../index.html">NvCloth 1.0.0 documentation</a></li> + </ul> + </div> +</div> +<div class="row"> + <div class="col-md-3 bs-sidenav" style="white-space: nowrap; overflow: auto;"> +<div class="bs-sidebar"> + <div id="sidebar_toc"> + <h4>Table Of Contents</h4> + <ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../ReleaseNotes/index.html">Release Notes</a><ul> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#new-features">New Features</a></li> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#supported-platforms">Supported Platforms</a></li> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#supported-compilers">Supported Compilers</a></li> +<li class="toctree-l2"><a class="reference internal" href="../ReleaseNotes/index.html#known-issues">Known Issues</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../Modules/Index.html">Modules</a><ul> +<li class="toctree-l2"><a class="reference internal" href="../Modules/Index.html#nvcloth">NvCloth</a></li> +<li class="toctree-l2"><a class="reference internal" href="../Modules/Index.html#nvcloth-extensions">NvCloth extensions</a></li> +</ul> +</li> +<li class="toctree-l1 current"><a class="current reference internal" href="">User Guide</a><ul> +<li class="toctree-l2"><a class="reference internal" href="#setup">Setup</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#initializing-the-library">Initializing the Library</a></li> +<li class="toctree-l3"><a class="reference internal" href="#factory">Factory</a></li> +<li class="toctree-l3"><a class="reference internal" href="#fabric-cloth">Fabric & Cloth</a><ul> +<li class="toctree-l4"><a class="reference internal" href="#fabric">Fabric</a></li> +<li class="toctree-l4"><a class="reference internal" href="#cloth">Cloth</a></li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="#solver">Solver</a></li> +<li class="toctree-l3"><a class="reference internal" href="#retrieving-simulation-data">Retrieving simulation data</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="#usage">Usage</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#common-cloth-properties">Common cloth properties</a></li> +<li class="toctree-l3"><a class="reference internal" href="#tethers">Tethers</a></li> +<li class="toctree-l3"><a class="reference internal" href="#collision-detection">Collision detection</a></li> +<li class="toctree-l3"><a class="reference internal" href="#local-space-simulation">Local space simulation</a></li> +<li class="toctree-l3"><a class="reference internal" href="#drag-lift-and-wind">Drag lift and wind</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../CopyRight/Index.html">NVIDIA Copyright Notice</a></li> +</ul> + + </div> + <h4>Previous topic</h4> + <p class="topless"><a href="../Modules/Index.html" + title="previous chapter">Modules</a></p> + <h4>Next topic</h4> + <p class="topless"><a href="../CopyRight/Index.html" + title="next chapter">NVIDIA Copyright Notice</a></p> +<div id="searchbox" style="display: none"> + <h4>Quick search</h4> + <form class="search form-inline" action="../search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> +</div> + </div> + <div class="document col-md-8"> + <div class="body"> + + <div class="section" id="user-guide"> +<h1>User Guide<a class="headerlink" href="#user-guide" title="Permalink to this headline">¶</a></h1> +<p>In this section we describe how to set up NvCloth and guide you through some common features.</p> +<div class="section" id="setup"> +<h2>Setup<a class="headerlink" href="#setup" title="Permalink to this headline">¶</a></h2> +<p>Some setup is required before we can start simulating. +Here we give an overview of all the components needed. +The sections below will provide more details about each component.</p> +<dl class="docutils"> +<dt><strong>NvCloth library</strong></dt> +<dd>Uses callbacks for things like memory allocations, which need to be initialized.</dd> +<dt><strong>Factory</strong></dt> +<dd>Interface object creating all other objects.</dd> +<dt><strong>Solver</strong></dt> +<dd>Manages simulation and time stepping.</dd> +<dt><strong>Fabric</strong></dt> +<dd>Contains information about cloth that can be shared between multiple instances.</dd> +<dt><strong>Cloth</strong></dt> +<dd>Contains the cloth instance data.</dd> +</dl> +<div class="section" id="initializing-the-library"> +<h3>Initializing the Library<a class="headerlink" href="#initializing-the-library" title="Permalink to this headline">¶</a></h3> +<p>NvCloth uses user defined callbacks for memory allocation, error reporting, assert handling, and profile timings. +The callbacks need to be passed to the library using nv::cloth::InitializeNvCloth() before the rest of the library can be used. +The callbacks are straightforward to implement by providing classes with implementations for all the functions of physx::PxAllocatorCallback, physx::PxErrorCallback, physx::PxAssertHandler, and optionally physx::PxProfilerCallback. +Note that the allocations returned by the PxAllocatorCallback need to be 16 byte aligned.</p> +<p>The library doesn’t need any deinitialization.</p> +</div> +<div class="section" id="factory"> +<h3>Factory<a class="headerlink" href="#factory" title="Permalink to this headline">¶</a></h3> +<p>The Factory object lets you construct all the other components necessary for the simulation. +There are different factories, one for each platform (e.g. CPU, CUDA, etc.) +Components created with different platforms cannot be used together (e.g. a CPU cloth cannot be added to a GPU solver), but multiple factories (for different platforms) can be used at the same time. +A factory is created as follows:</p> +<div class="highlight-python"><pre>#include <NvCloth/Factory.h> + +... + +nv::cloth::Factory* factory = NvClothCreateFactoryCPU(); +if(factory==nullptr) +{ + //error +} + +... + +//At cleanup: +NvClothDestroyFactory(factory); //This works for all different factories.</pre> +</div> +<p>Different functions instead of NvClothCreateFactoryCPU() can be used to create factories for a different platform. +Some platforms may need additional arguments when creating the factory, like CUDA:</p> +<div class="highlight-python"><pre>//// CUDA +#include <NvCloth/Factory.h> +#include <cuda.h> + +... + +CUcontext cudaContext; +int deviceCount = 0; +CUresult result = cuDeviceGetCount(&deviceCount); +ASSERT(CUDA_SUCCESS == result); +ASSERT(deviceCount >= 1); + +result = cuCtxCreate(&cudaContext, 0, 0); //Pick first device +ASSERT(CUDA_SUCCESS == result); + +nv::cloth::Factory* factory = NvClothCreateFactoryCUDA(cudaContext); +//We need to call cuCtxDestroy(cudaContext); after destroying the factory.</pre> +</div> +<p>And DX11:</p> +<div class="highlight-python"><pre>//// DX11 +#include <NvCloth/Factory.h> +#include <d3d11.h> + +... + +//Setup DX11 context +ID3D11Device* DXDevice; +ID3D11DeviceContext* DXDeviceContext; +nv::cloth::DxContextManagerCallback* GraphicsContextManager; +D3D_FEATURE_LEVEL featureLevels[] = {D3D_FEATURE_LEVEL_11_0}; +D3D_FEATURE_LEVEL featureLevelResult; +HRESULT result = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, featureLevels, 1, D3D11_SDK_VERSION, &DXDevice, &featureLevelResult, &DXDeviceContext); +ASSERT(result == S_OK); +ASSERT(featureLevelResult == D3D_FEATURE_LEVEL_11_0); +GraphicsContextManager = new DxContextManagerCallbackImpl(DXDevice); +ASSERT(GraphicsContextManager != nullptr); + +nv::cloth::Factory* factory = NvClothCreateFactoryDX11(GraphicsContextManager); +//We need to release all DX objects after destroying the factory.</pre> +</div> +</div> +<div class="section" id="fabric-cloth"> +<h3>Fabric & Cloth<a class="headerlink" href="#fabric-cloth" title="Permalink to this headline">¶</a></h3> +<p>The data used for cloth simulation is divided into two objects. +The fabric object contains all reusable data like the constraint lengths and connections. +The cloth object contains all instance data like particle positions. +This way multiple cloths can share the same fabric data, reducing memory usage.</p> +<div class="section" id="fabric"> +<h4>Fabric<a class="headerlink" href="#fabric" title="Permalink to this headline">¶</a></h4> +<p>Creating the fabric is the most complicated part of the setup. +We have included helper functions as extension to simplify this step. +We can fill the nv::cloth::ClothMeshDesc meshDesc struct and pass it to the NvClothCookFabricFromMesh function if we use the cooking extension:</p> +<div class="highlight-python"><pre>#include <NvClothExt/ClothFabricCooker.h> + +... + +nv::cloth::ClothMeshDesc meshDesc; + +//Fill meshDesc with data +meshDesc.setToDefault(); +meshDesc.points.data = vertexArray; +meshDesc.points.stride = sizeof(vertexArray[0]); +meshDesc.points.count = vertexCount; +//etc. for quads, triangles and invMasses + +physx::PxVec3 gravity(0.0f, -9.8f, 0.0f); +nv::cloth::Vector<int32_t>::Type phaseTypeInfo; +nv::cloth::Fabric* fabric = NvClothCookFabricFromMesh(factory, meshDesc, gravity, &phaseTypeInfo); + +... + +fabric->decRefCount();</pre> +</div> +<p>phaseTypeInfo contains information used later for setting up the constraint phases of the cloth. +We provide the gravity vector so the cooker can differentiate between horizontal and vertical constraints.</p> +<p>You have to release the fabric using the decRefCount() function. +Cloths that depend on the fabric also keep a reference, so it is safe to decrease the refcount when the fabric is still in use. +The fabric returned by NvClothCookFabricFromMesh (or by *Factory::createFabric) already has a reference count of 1. +The fabric will destroy itself when its reference count reaches 0. +All fabrics created by a factory need to be destroyed before that factory is destroyed (meaning indirectly that all cloths, which hold references to these fabrics, also need to be destroyed).</p> +<p>You can also manually provide all the cooked data using the Factory::createFabric function directly in case you have your own cooking code or if you do not cook at runtime.</p> +</div> +<div class="section" id="cloth"> +<h4>Cloth<a class="headerlink" href="#cloth" title="Permalink to this headline">¶</a></h4> +<p>We can now create a cloth instance from the fabric created in the previous step. +The cloth instance does not need to begin with the same particle positions the fabric was cooked in, so we need to provide the initial position of the particles:</p> +<div class="highlight-python"><pre>physx::PxVec4* particlePositions = ...; // The w component is the inverse mass of the particle + // and can be to 0 to lock the particle / make it static. +nv::cloth::Cloth* cloth = factory->createCloth(nv::cloth::Range<physx::PxVec4>( particlePositions, & particlePositions + particleCount), *fabric); +// particlePositions can be freed here. + +... + +NV_CLOTH_DELETE(cloth);</pre> +</div> +<p>Now we need to setup the phase configurations. +Phase configurations control the order in which the constraints are solved (e.g. first horizontal then vertical etc.) and the constrain properties like stiffness:</p> +<div class="highlight-python"><pre>nv::cloth::PhaseConfig* phases = new nv::cloth::PhaseConfig[fabric->getNumPhases()]; +for(int i = 0; i < fabric->getNumPhases(); i++) +{ + phases[i].mPhaseIndex = i; // Set index to the corresponding set (constraint group) + + //Give phases different configs depending on type + switch(phaseTypeInfo[i]) + { + case nv::cloth::ClothFabricPhaseType::eINVALID: + //ERROR + break; + case nv::cloth::ClothFabricPhaseType::eVERTICAL: + break; + case nv::cloth::ClothFabricPhaseType::eHORIZONTAL: + break; + case nv::cloth::ClothFabricPhaseType::eBENDING: + break; + case nv::cloth::ClothFabricPhaseType::eSHEARING: + break; + } + + //For this example we give very phase the same config + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; +} +cloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases[0], &phases[0] + fabric->getNumPhases())); +delete [] phases;</pre> +</div> +<p>Note that there might be more phase of each type. +Check if the gravity vector used for cooking is correct (and in the same space as the cooked mesh) when the vertical phases are missing.</p> +<p>There are more properties you can set on the cloth. +They will be described below in the Usage section.</p> +</div> +</div> +<div class="section" id="solver"> +<h3>Solver<a class="headerlink" href="#solver" title="Permalink to this headline">¶</a></h3> +<p>The solver represents something similar to a scene. +It has a list of cloths that will be simulated together and it contains some simulation properties. +Creating a solver is simple:</p> +<div class="highlight-python"><pre>nv::cloth::Solver* solver = factory->createSolver(); + +... + +NV_CLOTH_DELETE(solver);</pre> +</div> +<p>We can add and remove cloths to/from the scene as follows:</p> +<div class="highlight-python"><pre>solver->addCloth(cloth); + +... + +solver->removeCloth(cloth);</pre> +</div> +<p>Advancing the simulation is broken up in a couple of function calls:</p> +<div class="highlight-python"><pre>float deltaTime = 1.0f/60.0f; +solver->beginSimulation(deltaTime); +for(int i = 0; i < solver->getSimulationChunkCount(); i++) +{ + solver->simulateChunk(i); +} +solver->endSimulation();</pre> +</div> +<p>The simulateChunk() calls can be called concurrently from multiple threads to increase performance.</p> +</div> +<div class="section" id="retrieving-simulation-data"> +<h3>Retrieving simulation data<a class="headerlink" href="#retrieving-simulation-data" title="Permalink to this headline">¶</a></h3> +<p>We need to retrieve the new positions of the cloth particles after the simulation step to display the results:</p> +<div class="highlight-python"><pre>nv::cloth::MappedRange<physx::PxVec4> particles = mCloth->getCurrentParticles(); +for(int i = 0; i<particles.size(); i++) +{ + //do something with particles[i] + //the xyz components are the current positions + //the w component is the invMass. +} +//destructor of particles should be called before mCloth is destroyed.</pre> +</div> +</div> +</div> +<div class="section" id="usage"> +<h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline">¶</a></h2> +<p>Cloth instances have many properties that can be influence their behavior. +This section shows how to use some of the most common properties.</p> +<div class="section" id="common-cloth-properties"> +<h3>Common cloth properties<a class="headerlink" href="#common-cloth-properties" title="Permalink to this headline">¶</a></h3> +<p>We can set the gravity acceleration vector in global space:</p> +<div class="highlight-python"><pre>cloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f));</pre> +</div> +<p>This vector doesn’t have to be the same as provided to the cooker.</p> +<p>Sometimes it is desirable to dampen the particle motion:</p> +<div class="highlight-python"><pre>cloth->setDamping(0.5f); //0.0f is default</pre> +</div> +<p>Note that the effect of the damping varies between local and global space simulation, as it dampens the local space motion only (so everything is damped if global space simulation is used as local and global space are equal in that case). +To create effects like air drag or underwater motion it is better to use the wind / air drag properties instead.</p> +<p>We can change the accuracy (and stiffness) of the cloth by increasing the solver frequency. +The solver frequency is used to calculate how many solver iterations are executed per frame (Solver::begin/endSimulation call):</p> +<div class="highlight-python"><pre>cloth->setSolverFrequency(60.0f); //default is 300</pre> +</div> +<p>There will be at least 1 iteration executed per frame, regardless of the value set. +Sometimes lowering the solver frequency helps to avoid instabilities and oscillations, while a higher solver frequency can help to increase stiffness and improve other behavior like collision detection. +It is common to set this value to a multiple of the fps target for the application.</p> +</div> +<div class="section" id="tethers"> +<h3>Tethers<a class="headerlink" href="#tethers" title="Permalink to this headline">¶</a></h3> +<p>Tethers are generated at the cooking stage and stored in the fabric. +They improve behavior and reduce stretchiness by adding long range constraints between particles and fixed points.</p> +<p>We can change some properties of the tethers in the cloth instance. +We can change the length of all tethers by setting the scale:</p> +<div class="highlight-python"><pre>cloth->setTetherConstraintScale(1.2f); //Increase the length by 20%</pre> +</div> +<p>We can make the tethers more spring like, or even disable them by changing the stiffness:</p> +<div class="highlight-python"><pre>cloth->setTetherConstraintStiffness(0.0f); //Disable tethers +cloth->setTetherConstraintStiffness(0.5f); //Springy tethers +cloth->setTetherConstraintStiffness(1.0f); //Default value</pre> +</div> +<p>The whole tether stage is skipped if the stiffness is set to 0 (increasing performance).</p> +</div> +<div class="section" id="collision-detection"> +<h3>Collision detection<a class="headerlink" href="#collision-detection" title="Permalink to this headline">¶</a></h3> +<p>NvCloth provides a couple of different methods to add collision to the simulation. +All collision primitives are defined in local space.</p> +<p>We can define up to 32 collision spheres per cloth:</p> +<div class="highlight-python"><pre>physx::PxVec4 spheres[2] = { + physx::PxVec4(0.0f, 0.0f, 0.0f, 1.0f), + physx::PxVec4(0.0f, 5.0f, 0.0f, 1.0f) +}; +nv::cloth::Range<const physx::PxVec4> sphereRange(spheres, spheres + 2); +cloth->setSpheres(sphereRange, 0, cloth->getNumSpheres());</pre> +</div> +<p>The last two arguments define which range of spheres defined previously is replaced (the parameters work the same across all Cloth::set’CollisionShape’ functions). +This can be useful if only a couple of collision primitives changed since previous frame. +Here we use the range [0, cloth->getNumSpheres()[ to ensure we replace all spheres that might have been defined previously. +To insert the spheres at the beginning we could use [0, 0[ and to insert at the end we use [cloth->getNumSpheres(), cloth->getNumSpheres()[.</p> +<p>We can connect spheres to create capsules:</p> +<div class="highlight-python"><pre>uint32_t capsuleIndices[2]; +capsuleIndices[0] = 0; +capsuleIndices[1] = 1; + +cloth->setCapsules(nv::cloth::Range<uint32_t>(capsuleIndices, capsuleIndices + 2), 0, cloth->getNumCapsules());</pre> +</div> +<p>This connects sphere 0 and 1. +Indices always need to be provided in pairs. +Also note that the last two arguments specify indices of pairs. So cloth->getNumCapsules() will return 1 after the above snippet is executed.</p> +<p>We can also define up to 32 collision planes:</p> +<div class="highlight-python"><pre>physx::PxVec4 planes[2] = { + physx::PxVec4(physx::PxVec3(0.5f, 0.4f, 0.0f).getNormalized(), 3.0f), + physx::PxVec4(physx::PxVec3(0.0f, 0.4f, 0.5f).getNormalized(), 3.0f) +}; + +nv::cloth::Range<const physx::PxVec4> planesR(planes, planes + 2); +cloth->setPlanes(planesR, 0, cloth->getNumPlanes());</pre> +</div> +<p>This on its own will not make the cloth collide with anything as we first need to tell the solver that each plane is one convex shape:</p> +<div class="highlight-python"><pre>uint32_t indices[2]; +for(int i = 0; i < 2; i++) + indices[i] = 1 << i; +nv::cloth::Range<uint32_t> indiceR(indices, indices + 2); +mCloth->setConvexes(indiceR, 0, mCloth->getNumConvexes());</pre> +</div> +<p>The value stored in the indices array is a bit mask telling the solver which planes are part of the convex shape. Plane i is indicated by bit 1<<i. +We can easily construct convex shapes consisting of more planes by setting more bits (e.g. (1<<i) | (1<<j)).</p> +<p>We can also use arbitrary triangle meshes for collision:</p> +<div class="highlight-python"><pre>physx::PxVec3* triangles = ...; //Get triangle data from somewhere + //We can't use indexed meshes/vertex sharing, + // each triangle is defined with its own 3 vertexes +nv::cloth::Range<const physx::PxVec3> triangleR(&triangles[0], &triangles[0] + triangleCount * 3); +cloth->setTriangles(triangleR, 0, cloth>getNumTriangles());</pre> +</div> +<p>Note that the range arguments passed to setTriangles are counting whole triangles (3 PxVec3 vertexes each).</p> +<p>We can set the friction coefficient used for collision between cloth and collision shapes like this:</p> +<div class="highlight-python"><pre>cloth->setFriction(0.5);</pre> +</div> +</div> +<div class="section" id="local-space-simulation"> +<h3>Local space simulation<a class="headerlink" href="#local-space-simulation" title="Permalink to this headline">¶</a></h3> +<p>Using local space simulation gives you more control over the simulation allowing you to improve the stability and response of the simulation. +We separate the global/render coordinate system from the particle simulation coordinate system in order to use local space simulation. +Graphics transforms should be adjusted to render the cloth in the correct location again.</p> +<p>We can use the following methods to let the simulation know that the cloth coordinate system has moved relative to the global coordinates:</p> +<div class="highlight-python"><pre>cloth->setTranslation(physx::PxVec3(x,y,z)); +cloth->setRotation(physx::PxQuat(qx,qy,qz,qw));</pre> +</div> +<p>This will not change the particle positions, but will apply impulses so that the cloth reacts properly to the movement of the coordinate system. +Air drag and lift also reacts accordingly.</p> +<p>We can use an inertia multiplier to control the strength of these impulses. +Fast movements can cause problems like tunneling through collision shapes, self-intersection, instabilities and stretchy cloth. +Use smaller inertia multipliers if these issues are noticeable. +We can set these multipliers as follows:</p> +<div class="highlight-python"><pre>//All values should be between 0.0 and 1.0 +cloth->setLinearInertia(physx::PxVec3(x,y,z)); +cloth->setAngularInertia(physx::PxVec3(ax,ay,az)); +cloth->setCentrifugalInertia(physx::PxVec3(cx,cy,cz));</pre> +</div> +<p>If we want to move the cloth without applying any forces (in case of a world origin shift for example) we can teleport:</p> +<div class="highlight-python"><pre>cloth->teleport(physx::PxVec3(deltaX, deltaY, deltaZ));</pre> +</div> +<p>Or we can reset the inertia effects after using the setTranslation/setPosition functions:</p> +<div class="highlight-python"><pre>//Clear any pending inertia +cloth->clearInertia();</pre> +</div> +</div> +<div class="section" id="drag-lift-and-wind"> +<h3>Drag lift and wind<a class="headerlink" href="#drag-lift-and-wind" title="Permalink to this headline">¶</a></h3> +<p>Cloth is simulated in a vacuum by default. +We can set the drag and lift coefficients to make the simulation more natural:</p> +<div class="highlight-python"><pre>cloth->setDragCoefficient(0.5f); +cloth->setLiftCoefficient(0.6f);</pre> +</div> +<p>We can also add wind to the simulation:</p> +<div class="highlight-python"><pre>cloth->setWindVelocity(physx::PxVec3(x,y,z));</pre> +</div> +<p>It is a good idea to vary this parameter continuously to simulate gusts, making the simulation more lively.</p> +</div> +</div> +</div> + + + </div> + <div class="clearer"></div> + </div> + <div class="col-md-1"></div> +</div> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="../index.html">NvCloth 1.0.0 documentation</a></li> + </ul> + </div> +</div> + +<footer> + <div class="footer-boilerplate"> + <div class="row"> + <div class="boilerplate"> + Copyright © 2014, NVIDIA Corporation | <a href="http://www.nvidia.com/object/about-nvidia.html" onclick="s_objectID="http://www.nvidia.com/object/about-nvidia.html_1";return this.s_oc?this.s_oc(e):true">About NVIDIA </a> | <a href="http://www.nvidia.com/object/legal_info.html" onclick="s_objectID="http://www.nvidia.com/object/legal_info.html_1";return this.s_oc?this.s_oc(e):true">Legal Information </a> | <a href="http://www.nvidia.com/object/privacy_policy.html" onclick="s_objectID="http://www.nvidia.com/object/privacy_policy.html_1";return this.s_oc?this.s_oc(e):true">Privacy Policy </a> + </div> + </div> + </div> +</div> +</footer> + + +<script type="text/x-mathjax-config"> + MathJax.Hub.Config({ + extensions: ["tex2jax.js"], + jax: ["input/TeX", "output/HTML-CSS"], + tex2jax: { + processEscapes: true, + skipTags: ["script","noscript","style","textarea"] + }, + "HTML-CSS": { availableFonts: ["TeX"] }, + TeX: { + Macros: { + Lrg: ['\\displaystyle{#1}', 1, ""] + } + } + }); +</script> + + +<script type="text/javascript" async + src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> +</script> + +<script> +var treestatename = 'GWDocsTreeState'; +var protocol = location.href.split('/')[0].toLowerCase(); +var storage; +if (protocol.substring(0,4) == 'http') { + storage = $.cookieStorage; + storage.setPath('/'); +} else { + storage = $.localStorage; +} + +if (storage.isEmpty(treestatename)) { + storage.set(treestatename, {}); +} + +var treestate = storage.get(treestatename); + +$.each($("#sidebar_toc ul li"), toc_walker); + +function toc_walker(key, value) { + var handleSpan = $("<span></span>") + .addClass("toc_handle").prependTo(value); + handleSpan.attr("id", $(value).closest("div").attr("id") + "." + key); + + if($(value).has("ul li").size() > 0) { + var id = handleSpan.attr("id"); + if (!(id in treestate)) { + treestate[id] = false; + } + handleSpan.addClass("toc_expanded").click(function() { + $(this).toggleClass("toc_expanded toc_collapsed").siblings("ul").toggle(); + treestate[$(this).attr('id')] = $(this).hasClass('toc_expanded'); + storage.set(treestatename, treestate); + }); + if(!($(this).hasClass('current') || treestate[id])) { + handleSpan.click(); + } + if($(this).hasClass('current')) { + treestate[handleSpan.attr('id')] = handleSpan.hasClass('toc_expanded'); + storage.set(treestatename, treestate); + } + } +} +</script> + </body> +</html>
\ No newline at end of file diff --git a/NvCloth/docs/documentation/UsersGuide/Index.html b/NvCloth/docs/documentation/UsersGuide/Index.html deleted file mode 100644 index 9ab48b5..0000000 --- a/NvCloth/docs/documentation/UsersGuide/Index.html +++ /dev/null @@ -1,544 +0,0 @@ - - -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - - <title>Users guide — NVIDIA NvCloth Documentation</title> - <link rel="stylesheet" href="../_static/nvidia.css" type="text/css" /> - <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> - <link rel="stylesheet" href="../_static/custom.css" type="text/css" /> - <script type="text/javascript"> - var DOCUMENTATION_OPTIONS = { - URL_ROOT: '../', - VERSION: '0.0', - COLLAPSE_INDEX: false, - FILE_SUFFIX: '.html', - HAS_SOURCE: true - }; - </script> - <script type="text/javascript" src="../_static/jquery.js"></script> - <script type="text/javascript" src="../_static/underscore.js"></script> - <script type="text/javascript" src="../_static/doctools.js"></script> - <link rel="top" title="NVIDIA NvCloth Documentation" href="../index.html" /> - <link rel="next" title="NVIDIA Copyright Notice" href="../CopyRight/Index.html" /> - <link rel="prev" title="Modules" href="../Modules/Index.html" /> - </head> - <body> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li class="right" style="margin-right: 10px"> - <a href="../CopyRight/Index.html" title="NVIDIA Copyright Notice" - accesskey="N">next</a></li> - <li class="right" > - <a href="../Modules/Index.html" title="Modules" - accesskey="P">previous</a> |</li> - <li><a href="../NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> - </ul> - </div> - - <div class="document"> - <div class="documentwrapper"> - <div class="bodywrapper"> - <div class="body"> - - <div class="section" id="users-guide"> -<h1>Users guide<a class="headerlink" href="#users-guide" title="Permalink to this headline">¶</a></h1> -<p>In this section we describe how to set up NvCloth and guide you through some common features.</p> -<div class="section" id="setup"> -<h2>Setup<a class="headerlink" href="#setup" title="Permalink to this headline">¶</a></h2> -<p>Some setup is required before we can start simulating. -Here we give an overview of all the components needed. -The sections below will provide more details about each component.</p> -<dl class="docutils"> -<dt><strong>NvCloth library</strong></dt> -<dd>uses callbacks for things like memory allocations, which need to be initialized</dd> -<dt><strong>Factory</strong></dt> -<dd>interface object creating all other objects</dd> -<dt><strong>Solver</strong></dt> -<dd>manages simulation and time stepping</dd> -<dt><strong>Fabric</strong></dt> -<dd>contains information about cloth that can be shared between multiple instances</dd> -<dt><strong>Cloth</strong></dt> -<dd>contains the cloth instance data</dd> -</dl> -<div class="section" id="initializing-the-library"> -<h3>Initializing the Library<a class="headerlink" href="#initializing-the-library" title="Permalink to this headline">¶</a></h3> -<p>NvCloth uses user defined callbacks for memory allocation, error reporting, assert handling, and profile timings. -The callbacks need to be passed to the library using nv::cloth::InitializeNvCloth() before the rest of the library can be used. -The callbacks are straightforward to implement by providing classes with implementations for all the functions of physx::PxAllocatorCallback, physx::PxErrorCallback, physx::PxAssertHandler, and optionally physx::PxProfilerCallback. -Note that the allocations returned by the PxAllocatorCallback need to be 16 byte aligned.</p> -<p>The library doesn’t need any deinitialization.</p> -</div> -<div class="section" id="factory"> -<h3>Factory<a class="headerlink" href="#factory" title="Permalink to this headline">¶</a></h3> -<p>The Factory object lets you construct all the other components necessary for the simulation. -There are different factories, one for each platform (e.g. CPU, CUDA, etc.) -Components created with different platforms cannot be used together (e.g. a CPU cloth cannot be added to a GPU solver), but multiple factories (for different platforms) can be used at the same time. -A factory is created as follows:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="cp">#include <NvCloth/Factory.h></span> - -<span class="p">...</span> - -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Factory</span><span class="o">*</span> <span class="n">factory</span> <span class="o">=</span> <span class="n">NvClothCreateFactoryCPU</span><span class="p">();</span> -<span class="k">if</span><span class="p">(</span><span class="n">factory</span><span class="o">==</span><span class="n">nullptr</span><span class="p">)</span> -<span class="p">{</span> - <span class="c1">//error</span> -<span class="p">}</span> - -<span class="p">...</span> -<span class="c1">//At cleanup:</span> -<span class="n">NvClothDestroyFactory</span><span class="p">(</span><span class="n">factory</span><span class="p">);</span> <span class="c1">//This works for all different factories.</span> -</pre></div> -</div> -<p>Different functions instead of NvClothCreateFactoryCPU() can be used to create factories for a different platform. -Some platforms may need additional arguments when creating the factory, like CUDA:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="c1">//// CUDA</span> -<span class="cp">#include <NvCloth/Factory.h></span> -<span class="cp">#include <cuda.h></span> - -<span class="p">...</span> - -<span class="n">CUcontext</span> <span class="n">cudaContext</span><span class="p">;</span> -<span class="kt">int</span> <span class="n">deviceCount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> -<span class="n">CUresult</span> <span class="n">result</span> <span class="o">=</span> <span class="n">cuDeviceGetCount</span><span class="p">(</span><span class="o">&</span><span class="n">deviceCount</span><span class="p">);</span> -<span class="n">ASSERT</span><span class="p">(</span><span class="n">CUDA_SUCCESS</span> <span class="o">==</span> <span class="n">result</span><span class="p">);</span> -<span class="n">ASSERT</span><span class="p">(</span><span class="n">deviceCount</span> <span class="o">>=</span> <span class="mi">1</span><span class="p">);</span> - -<span class="n">result</span> <span class="o">=</span> <span class="n">cuCtxCreate</span><span class="p">(</span><span class="o">&</span><span class="n">cudaContext</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">//Pick first device</span> -<span class="n">ASSERT</span><span class="p">(</span><span class="n">CUDA_SUCCESS</span> <span class="o">==</span> <span class="n">result</span><span class="p">);</span> - -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Factory</span><span class="o">*</span> <span class="n">factory</span> <span class="o">=</span> <span class="n">NvClothCreateFactoryCUDA</span><span class="p">(</span><span class="n">cudaContext</span><span class="p">);</span> -<span class="c1">//We need to call cuCtxDestroy(cudaContext); after destroying the factory.</span> -</pre></div> -</div> -<p>And DX11:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="c1">//// DX11</span> -<span class="cp">#include <NvCloth/Factory.h></span> -<span class="cp">#include <d3d11.h></span> - -<span class="p">...</span> - -<span class="c1">//Setup DX11 context</span> -<span class="n">ID3D11Device</span><span class="o">*</span> <span class="n">DXDevice</span><span class="p">;</span> -<span class="n">ID3D11DeviceContext</span><span class="o">*</span> <span class="n">DXDeviceContext</span><span class="p">;</span> -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">DxContextManagerCallback</span><span class="o">*</span> <span class="n">GraphicsContextManager</span><span class="p">;</span> -<span class="n">D3D_FEATURE_LEVEL</span> <span class="n">featureLevels</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="n">D3D_FEATURE_LEVEL_11_0</span><span class="p">};</span> -<span class="n">D3D_FEATURE_LEVEL</span> <span class="n">featureLevelResult</span><span class="p">;</span> -<span class="n">HRESULT</span> <span class="n">result</span> <span class="o">=</span> <span class="n">D3D11CreateDevice</span><span class="p">(</span><span class="n">nullptr</span><span class="p">,</span> <span class="n">D3D_DRIVER_TYPE_HARDWARE</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">featureLevels</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">D3D11_SDK_VERSION</span><span class="p">,</span> <span class="o">&</span><span class="n">DXDevice</span><span class="p">,</span> <span class="o">&</span><span class="n">featureLevelResult</span><span class="p">,</span> <span class="o">&</span><span class="n">DXDeviceContext</span><span class="p">);</span> -<span class="n">ASSERT</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="n">S_OK</span><span class="p">);</span> -<span class="n">ASSERT</span><span class="p">(</span><span class="n">featureLevelResult</span> <span class="o">==</span> <span class="n">D3D_FEATURE_LEVEL_11_0</span><span class="p">);</span> -<span class="n">GraphicsContextManager</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DxContextManagerCallbackImpl</span><span class="p">(</span><span class="n">DXDevice</span><span class="p">);</span> -<span class="n">ASSERT</span><span class="p">(</span><span class="n">GraphicsContextManager</span> <span class="o">!=</span> <span class="n">nullptr</span><span class="p">);</span> - -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Factory</span><span class="o">*</span> <span class="n">factory</span> <span class="o">=</span> <span class="n">NvClothCreateFactoryDX11</span><span class="p">(</span><span class="n">GraphicsContextManager</span><span class="p">);</span> -<span class="c1">//We need to release all DX objects after destroying the factory.</span> -</pre></div> -</div> -</div> -<div class="section" id="fabric-cloth"> -<h3>Fabric & Cloth<a class="headerlink" href="#fabric-cloth" title="Permalink to this headline">¶</a></h3> -<p>The data used for cloth simulation is divided into two objects. -The fabric object contains all reusable data like the constraint lengths and connections. -The cloth object contains all instance data like particle positions. -This way multiple cloths can share the same fabric data, reducing memory usage.</p> -<div class="section" id="fabric"> -<h4>Fabric<a class="headerlink" href="#fabric" title="Permalink to this headline">¶</a></h4> -<p>Creating the fabric is the most complicated part of the setup. -We have included helper functions as extension to simplify this step. -We can fill the nv::cloth::ClothMeshDesc meshDesc struct and pass it to the NvClothCookFabricFromMesh function if we use the cooking extension:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="cp">#include <NvClothExt/ClothFabricCooker.h></span> - -<span class="p">...</span> - -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">ClothMeshDesc</span> <span class="n">meshDesc</span><span class="p">;</span> - -<span class="c1">//Fill meshDesc with data</span> -<span class="n">meshDesc</span><span class="p">.</span><span class="n">setToDefault</span><span class="p">();</span> -<span class="n">meshDesc</span><span class="p">.</span><span class="n">points</span><span class="p">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">vertexArray</span><span class="p">;</span> -<span class="n">meshDesc</span><span class="p">.</span><span class="n">points</span><span class="p">.</span><span class="n">stride</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">vertexArray</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> -<span class="n">meshDesc</span><span class="p">.</span><span class="n">points</span><span class="p">.</span><span class="n">count</span> <span class="o">=</span> <span class="n">vertexCount</span><span class="p">;</span> -<span class="c1">//etc. for quads, triangles and invMasses</span> - -<span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span> <span class="n">gravity</span><span class="p">(</span><span class="mf">0.0f</span><span class="p">,</span> <span class="o">-</span><span class="mf">9.8f</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">);</span> -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Vector</span><span class="o"><</span><span class="n">int32_t</span><span class="o">>::</span><span class="n">Type</span> <span class="n">phaseTypeInfo</span><span class="p">;</span> -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Fabric</span><span class="o">*</span> <span class="n">fabric</span> <span class="o">=</span> <span class="n">NvClothCookFabricFromMesh</span><span class="p">(</span><span class="n">factory</span><span class="p">,</span> <span class="n">meshDesc</span><span class="p">,</span> <span class="n">gravity</span><span class="p">,</span> <span class="o">&</span><span class="n">phaseTypeInfo</span><span class="p">);</span> - -<span class="p">...</span> - -<span class="n">fabric</span><span class="o">-></span><span class="n">decRefCount</span><span class="p">();</span> -</pre></div> -</div> -<p>phaseTypeInfo contains information used later for setting up the constraint phases of the cloth. -We provide the gravity vector so the cooker can differentiate between horizontal and vertical constraints.</p> -<p>You have to release the fabric using the decRefCount() function. -Cloths that depend on the fabric also keep a reference, so it is safe to decrease the refcount when the fabric is still in use. -The fabric returned by NvClothCookFabricFromMesh (or by *Factory::createFabric) already has a reference count of 1. -The fabric will destroy itself when its reference count reaches 0. -All fabrics created by a factory need to be destroyed before that factory is destroyed (meaning indirectly that all cloths, which hold references to these fabrics, also need to be destroyed).</p> -<p>You can also manually provide all the cooked data using the Factory::createFabric function directly in case you have your own cooking code or if you do not cook at runtime.</p> -</div> -<div class="section" id="cloth"> -<h4>Cloth<a class="headerlink" href="#cloth" title="Permalink to this headline">¶</a></h4> -<p>We can now create a cloth instance from the fabric created in the previous step. -The cloth instance does not need to begin with the same particle positions the fabric was cooked in, so we need to provide the initial position of the particles:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span><span class="o">*</span> <span class="n">particlePositions</span> <span class="o">=</span> <span class="p">...;</span> <span class="c1">// The w component is the inverse mass of the particle</span> - <span class="c1">// and can be to 0 to lock the particle / make it static.</span> -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Cloth</span><span class="o">*</span> <span class="n">cloth</span> <span class="o">=</span> <span class="n">factory</span><span class="o">-></span><span class="n">createCloth</span><span class="p">(</span><span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Range</span><span class="o"><</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span><span class="o">></span><span class="p">(</span> <span class="n">particlePositions</span><span class="p">,</span> <span class="o">&</span> <span class="n">particlePositions</span> <span class="o">+</span> <span class="n">particleCount</span><span class="p">),</span> <span class="o">*</span><span class="n">fabric</span><span class="p">);</span> -<span class="c1">// particlePositions can be freed here.</span> - -<span class="p">...</span> - -<span class="n">NV_CLOTH_DELETE</span><span class="p">(</span><span class="n">cloth</span><span class="p">);</span> -</pre></div> -</div> -<p>Now we need to setup the phase configurations. -Phase configurations control the order in which the constraints are solved (e.g. first horizontal then vertical etc.) and the constrain properties like stiffness:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">PhaseConfig</span><span class="o">*</span> <span class="n">phases</span> <span class="o">=</span> <span class="k">new</span> <span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">PhaseConfig</span><span class="p">[</span><span class="n">fabric</span><span class="o">-></span><span class="n">getNumPhases</span><span class="p">()];</span> -<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">fabric</span><span class="o">-></span><span class="n">getNumPhases</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> -<span class="p">{</span> - <span class="n">phases</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">mPhaseIndex</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="c1">// Set index to the corresponding set (constraint group)</span> - - <span class="c1">//Give phases different configs depending on type</span> - <span class="k">switch</span><span class="p">(</span><span class="n">phaseTypeInfo</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> - <span class="p">{</span> - <span class="k">case</span> <span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">ClothFabricPhaseType</span><span class="o">::</span><span class="nl">eINVALID:</span> - <span class="c1">//ERROR</span> - <span class="k">break</span><span class="p">;</span> - <span class="k">case</span> <span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">ClothFabricPhaseType</span><span class="o">::</span><span class="nl">eVERTICAL:</span> - <span class="k">break</span><span class="p">;</span> - <span class="k">case</span> <span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">ClothFabricPhaseType</span><span class="o">::</span><span class="nl">eHORIZONTAL:</span> - <span class="k">break</span><span class="p">;</span> - <span class="k">case</span> <span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">ClothFabricPhaseType</span><span class="o">::</span><span class="nl">eBENDING:</span> - <span class="k">break</span><span class="p">;</span> - <span class="k">case</span> <span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">ClothFabricPhaseType</span><span class="o">::</span><span class="nl">eSHEARING:</span> - <span class="k">break</span><span class="p">;</span> - <span class="p">}</span> - - <span class="c1">//For this example we give very phase the same config</span> - <span class="n">phases</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">mStiffness</span> <span class="o">=</span> <span class="mf">1.0f</span><span class="p">;</span> - <span class="n">phases</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">mStiffnessMultiplier</span> <span class="o">=</span> <span class="mf">1.0f</span><span class="p">;</span> - <span class="n">phases</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">mCompressionLimit</span> <span class="o">=</span> <span class="mf">1.0f</span><span class="p">;</span> - <span class="n">phases</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">mStretchLimit</span> <span class="o">=</span> <span class="mf">1.0f</span><span class="p">;</span> -<span class="p">}</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setPhaseConfig</span><span class="p">(</span><span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Range</span><span class="o"><</span><span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">PhaseConfig</span><span class="o">></span><span class="p">(</span><span class="o">&</span><span class="n">phases</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">&</span><span class="n">phases</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">fabric</span><span class="o">-></span><span class="n">getNumPhases</span><span class="p">()));</span> -<span class="k">delete</span> <span class="p">[]</span> <span class="n">phases</span><span class="p">;</span> -</pre></div> -</div> -<p>Note that there might be more phase of each type. -Check if the gravity vector used for cooking is correct (and in the same space as the cooked mesh) when the vertical phases are missing.</p> -<p>There are more properties you can set on the cloth. -They will be described below in the Usage section.</p> -</div> -</div> -<div class="section" id="solver"> -<h3>Solver<a class="headerlink" href="#solver" title="Permalink to this headline">¶</a></h3> -<p>The solver represents something similar to a scene. -It has a list of cloths that will be simulated together and it contains some simulation properties. -Creating a solver is simple:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Solver</span><span class="o">*</span> <span class="n">solver</span> <span class="o">=</span> <span class="n">factory</span><span class="o">-></span><span class="n">createSolver</span><span class="p">();</span> - -<span class="p">...</span> - -<span class="n">NV_CLOTH_DELETE</span><span class="p">(</span><span class="n">solver</span><span class="p">);</span> -</pre></div> -</div> -<p>We can add and remove cloths to/from the scene as follows:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">solver</span><span class="o">-></span><span class="n">addCloth</span><span class="p">(</span><span class="n">cloth</span><span class="p">);</span> - -<span class="p">...</span> - -<span class="n">solver</span><span class="o">-></span><span class="n">removeCloth</span><span class="p">(</span><span class="n">cloth</span><span class="p">);</span> -</pre></div> -</div> -<p>Advancing the simulation is broken up in a couple of function calls:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="kt">float</span> <span class="n">deltaTime</span> <span class="o">=</span> <span class="mf">1.0f</span><span class="o">/</span><span class="mf">60.0f</span><span class="p">;</span> -<span class="n">solver</span><span class="o">-></span><span class="n">beginSimulation</span><span class="p">(</span><span class="n">deltaTime</span><span class="p">);</span> -<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">solver</span><span class="o">-></span><span class="n">getSimulationChunkCount</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> -<span class="p">{</span> - <span class="n">solver</span><span class="o">-></span><span class="n">simulateChunk</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> -<span class="p">}</span> -<span class="n">solver</span><span class="o">-></span><span class="n">endSimulation</span><span class="p">();</span> -</pre></div> -</div> -<p>The simulateChunk() calls can be called concurrently from multiple threads to increase performance.</p> -</div> -<div class="section" id="retrieving-simulation-data"> -<h3>Retrieving simulation data<a class="headerlink" href="#retrieving-simulation-data" title="Permalink to this headline">¶</a></h3> -<p>We need to retrieve the new positions of the cloth particles after the simulation step to display the results:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">MappedRange</span><span class="o"><</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span><span class="o">></span> <span class="n">particles</span> <span class="o">=</span> <span class="n">mCloth</span><span class="o">-></span><span class="n">getCurrentParticles</span><span class="p">();</span> -<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o"><</span><span class="n">particles</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> -<span class="p">{</span> - <span class="c1">//do something with particles[i]</span> - <span class="c1">//the xyz components are the current positions</span> - <span class="c1">//the w component is the invMass.</span> -<span class="p">}</span> -<span class="c1">//destructor of particles should be called before mCloth is destroyed.</span> -</pre></div> -</div> -</div> -</div> -<div class="section" id="usage"> -<h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline">¶</a></h2> -<p>Cloth instances have many properties that can be influence their behavior. -This section shows how to use some of the most common properties.</p> -<div class="section" id="common-cloth-properties"> -<h3>Common cloth properties<a class="headerlink" href="#common-cloth-properties" title="Permalink to this headline">¶</a></h3> -<p>We can set the gravity acceleration vector in global space:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">setGravity</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="p">(</span><span class="mf">0.0f</span><span class="p">,</span> <span class="o">-</span><span class="mf">9.8f</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">));</span> -</pre></div> -</div> -<p>This vector doesn’t have to be the same as provided to the cooker.</p> -<p>Sometimes it is desirable to dampen the particle motion:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">setDamping</span><span class="p">(</span><span class="mf">0.5f</span><span class="p">);</span> <span class="c1">//0.0f is default</span> -</pre></div> -</div> -<p>Note that the effect of the damping varies between local and global space simulation, as it dampens the local space motion only (so everything is damped if global space simulation is used as local and global space are equal in that case). -To create effects like air drag or underwater motion it is better to use the wind / air drag properties instead.</p> -<p>We can change the accuracy (and stiffness) of the cloth by increasing the solver frequency. -The solver frequency is used to calculate how many solver iterations are executed per frame (Solver::begin/endSimulation call):</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">setSolverFrequency</span><span class="p">(</span><span class="mf">60.0f</span><span class="p">);</span> <span class="c1">//default is 300</span> -</pre></div> -</div> -<p>There will be at least 1 iteration executed per frame, regardless of the value set. -Sometimes lowering the solver frequency helps to avoid instabilities and oscillations, while a higher solver frequency can help to increase stiffness and improve other behavior like collision detection. -It is common to set this value to a multiple of the fps target for the application.</p> -</div> -<div class="section" id="tethers"> -<h3>Tethers<a class="headerlink" href="#tethers" title="Permalink to this headline">¶</a></h3> -<p>Tethers are generated at the cooking stage and stored in the fabric. -They improve behavior and reduce stretchiness by adding long range constraints between particles and fixed points.</p> -<p>We can change some properties of the tethers in the cloth instance. -We can change the length of all tethers by setting the scale:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">setTetherConstraintScale</span><span class="p">(</span><span class="mf">1.2f</span><span class="p">);</span> <span class="c1">//Increase the length by 20%</span> -</pre></div> -</div> -<p>We can make the tethers more spring like, or even disable them by changing the stiffness:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">setTetherConstraintStiffness</span><span class="p">(</span><span class="mf">0.0f</span><span class="p">);</span> <span class="c1">//Disable tethers</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setTetherConstraintStiffness</span><span class="p">(</span><span class="mf">0.5f</span><span class="p">);</span> <span class="c1">//Springy tethers</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setTetherConstraintStiffness</span><span class="p">(</span><span class="mf">1.0f</span><span class="p">);</span> <span class="c1">//Default value</span> -</pre></div> -</div> -<p>The whole tether stage is skipped if the stiffness is set to 0 (increasing performance).</p> -</div> -<div class="section" id="collision-detection"> -<h3>Collision detection<a class="headerlink" href="#collision-detection" title="Permalink to this headline">¶</a></h3> -<p>NvCloth provides a couple of different methods to add collision to the simulation. -All collision primitives are defined in local space.</p> -<p>We can define up to 32 collision spheres per cloth:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span> <span class="n">spheres</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> - <span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span><span class="p">(</span><span class="mf">0.0f</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">,</span> <span class="mf">1.0f</span><span class="p">),</span> - <span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span><span class="p">(</span><span class="mf">0.0f</span><span class="p">,</span> <span class="mf">5.0f</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">,</span> <span class="mf">1.0f</span><span class="p">)</span> -<span class="p">};</span> -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Range</span><span class="o"><</span><span class="k">const</span> <span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span><span class="o">></span> <span class="n">sphereRange</span><span class="p">(</span><span class="n">spheres</span><span class="p">,</span> <span class="n">spheres</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setSpheres</span><span class="p">(</span><span class="n">sphereRange</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cloth</span><span class="o">-></span><span class="n">getNumSpheres</span><span class="p">());</span> -</pre></div> -</div> -<p>The last two arguments define which range of spheres defined previously is replaced (the parameters work the same across all Cloth::set’CollisionShape’ functions). -This can be useful if only a couple of collision primitives changed since previous frame. -Here we use the range [0, cloth->getNumSpheres()[ to ensure we replace all spheres that might have been defined previously. -To insert the spheres at the beginning we could use [0, 0[ and to insert at the end we use [cloth->getNumSpheres(), cloth->getNumSpheres()[.</p> -<p>We can connect spheres to create capsules:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">uint32_t</span> <span class="n">capsuleIndices</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span> -<span class="n">capsuleIndices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> -<span class="n">capsuleIndices</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> - -<span class="n">cloth</span><span class="o">-></span><span class="n">setCapsules</span><span class="p">(</span><span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Range</span><span class="o"><</span><span class="n">uint32_t</span><span class="o">></span><span class="p">(</span><span class="n">capsuleIndices</span><span class="p">,</span> <span class="n">capsuleIndices</span> <span class="o">+</span> <span class="mi">2</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cloth</span><span class="o">-></span><span class="n">getNumCapsules</span><span class="p">());</span> -</pre></div> -</div> -<p>This connects sphere 0 and 1. -Indices always need to be provided in pairs. -Also note that the last two arguments specify indices of pairs. So cloth->getNumCapsules() will return 1 after the above snippet is executed.</p> -<p>We can also define up to 32 collision planes:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span> <span class="n">planes</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> - <span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="p">(</span><span class="mf">0.5f</span><span class="p">,</span> <span class="mf">0.4f</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">).</span><span class="n">getNormalized</span><span class="p">(),</span> <span class="mf">3.0f</span><span class="p">),</span> - <span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="p">(</span><span class="mf">0.0f</span><span class="p">,</span> <span class="mf">0.4f</span><span class="p">,</span> <span class="mf">0.5f</span><span class="p">).</span><span class="n">getNormalized</span><span class="p">(),</span> <span class="mf">3.0f</span><span class="p">)</span> -<span class="p">};</span> - -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Range</span><span class="o"><</span><span class="k">const</span> <span class="n">physx</span><span class="o">::</span><span class="n">PxVec4</span><span class="o">></span> <span class="n">planesR</span><span class="p">(</span><span class="n">planes</span><span class="p">,</span> <span class="n">planes</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setPlanes</span><span class="p">(</span><span class="n">planesR</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cloth</span><span class="o">-></span><span class="n">getNumPlanes</span><span class="p">());</span> -</pre></div> -</div> -<p>This on its own will not make the cloth collide with anything as we first need to tell the solver that each plane is one convex shape:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">uint32_t</span> <span class="n">indices</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span> -<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> - <span class="n">indices</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="o"><<</span> <span class="n">i</span><span class="p">;</span> -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Range</span><span class="o"><</span><span class="n">uint32_t</span><span class="o">></span> <span class="n">indiceR</span><span class="p">(</span><span class="n">indices</span><span class="p">,</span> <span class="n">indices</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span> -<span class="n">mCloth</span><span class="o">-></span><span class="n">setConvexes</span><span class="p">(</span><span class="n">indiceR</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">mCloth</span><span class="o">-></span><span class="n">getNumConvexes</span><span class="p">());</span> -</pre></div> -</div> -<p>The value stored in the indices array is a bit mask telling the solver which planes are part of the convex shape. Plane i is indicated by bit 1<<i. -We can easily construct convex shapes consisting of more planes by setting more bits (e.g. (1<<i) | (1<<j)).</p> -<p>We can also use arbitrary triangle meshes for collision:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="o">*</span> <span class="n">triangles</span> <span class="o">=</span> <span class="p">...;</span> <span class="c1">//Get triangle data from somewhere</span> - <span class="c1">//We can't use indexed meshes/vertex sharing,</span> - <span class="c1">// each triangle is defined with its own 3 vertexes</span> -<span class="n">nv</span><span class="o">::</span><span class="n">cloth</span><span class="o">::</span><span class="n">Range</span><span class="o"><</span><span class="k">const</span> <span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="o">></span> <span class="n">triangleR</span><span class="p">(</span><span class="o">&</span><span class="n">triangles</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">&</span><span class="n">triangles</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">triangleCount</span> <span class="o">*</span> <span class="mi">3</span><span class="p">);</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setTriangles</span><span class="p">(</span><span class="n">triangleR</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">cloth</span><span class="o">></span><span class="n">getNumTriangles</span><span class="p">());</span> -</pre></div> -</div> -<p>Note that the range arguments passed to setTriangles are counting whole triangles (3 PxVec3 vertexes each).</p> -<p>We can set the friction coefficient used for collision between cloth and collision shapes like this:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">setFriction</span><span class="p">(</span><span class="mf">0.5</span><span class="p">);</span> -</pre></div> -</div> -</div> -<div class="section" id="local-space-simulation"> -<h3>Local space simulation<a class="headerlink" href="#local-space-simulation" title="Permalink to this headline">¶</a></h3> -<p>Using local space simulation gives you more control over the simulation allowing you to improve the stability and response of the simulation. -We separate the global/render coordinate system from the particle simulation coordinate system in order to use local space simulation. -Graphics transforms should be adjusted to render the cloth in the correct location again.</p> -<p>We can use the following methods to let the simulation know that the cloth coordinate system has moved relative to the global coordinates:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">setTranslation</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">));</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setRotation</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxQuat</span><span class="p">(</span><span class="n">qx</span><span class="p">,</span><span class="n">qy</span><span class="p">,</span><span class="n">qz</span><span class="p">,</span><span class="n">qw</span><span class="p">));</span> -</pre></div> -</div> -<p>This will not change the particle positions, but will apply impulses so that the cloth reacts properly to the movement of the coordinate system. -Air drag and lift also reacts accordingly.</p> -<p>We can use an inertia multiplier to control the strength of these impulses. -Fast movements can cause problems like tunneling through collision shapes, self-intersection, instabilities and stretchy cloth. -Use smaller inertia multipliers if these issues are noticeable. -We can set these multipliers as follows:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="c1">//All values should be between 0.0 and 1.0</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setLinearInertia</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">));</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setAngularInertia</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="p">(</span><span class="n">ax</span><span class="p">,</span><span class="n">ay</span><span class="p">,</span><span class="n">az</span><span class="p">));</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setCentrifugalInertia</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="p">(</span><span class="n">cx</span><span class="p">,</span><span class="n">cy</span><span class="p">,</span><span class="n">cz</span><span class="p">));</span> -</pre></div> -</div> -<p>If we want to move the cloth without applying any forces (in case of a world origin shift for example) we can teleport:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">teleport</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="p">(</span><span class="n">deltaX</span><span class="p">,</span> <span class="n">deltaY</span><span class="p">,</span> <span class="n">deltaZ</span><span class="p">));</span> -</pre></div> -</div> -<p>Or we can reset the inertia effects after using the setTranslation/setPosition functions:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="c1">//Clear any pending inertia</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">clearInertia</span><span class="p">();</span> -</pre></div> -</div> -</div> -<div class="section" id="drag-lift-and-wind"> -<h3>Drag lift and wind<a class="headerlink" href="#drag-lift-and-wind" title="Permalink to this headline">¶</a></h3> -<p>Cloth is simulated in a vacuum by default. -We can set the drag and lift coefficients to make the simulation more natural:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">setDragCoefficient</span><span class="p">(</span><span class="mf">0.5f</span><span class="p">);</span> -<span class="n">cloth</span><span class="o">-></span><span class="n">setLiftCoefficient</span><span class="p">(</span><span class="mf">0.6f</span><span class="p">);</span> -</pre></div> -</div> -<p>We can also add wind to the simulation:</p> -<div class="highlight-c++"><div class="highlight"><pre><span class="n">cloth</span><span class="o">-></span><span class="n">setWindVelocity</span><span class="p">(</span><span class="n">physx</span><span class="o">::</span><span class="n">PxVec3</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">));</span> -</pre></div> -</div> -<p>It is a good idea to vary this parameter continuously to simulate gusts, making the simulation more lively.</p> -</div> -</div> -</div> - - - </div> - </div> - </div> - <div class="sphinxsidebar"> - <div class="sphinxsidebarwrapper"> - <h3><a href="../NvCloth.html">Table Of Contents</a></h3> - <ul> -<li><a class="reference internal" href="#">Users guide</a><ul> -<li><a class="reference internal" href="#setup">Setup</a><ul> -<li><a class="reference internal" href="#initializing-the-library">Initializing the Library</a></li> -<li><a class="reference internal" href="#factory">Factory</a></li> -<li><a class="reference internal" href="#fabric-cloth">Fabric & Cloth</a><ul> -<li><a class="reference internal" href="#fabric">Fabric</a></li> -<li><a class="reference internal" href="#cloth">Cloth</a></li> -</ul> -</li> -<li><a class="reference internal" href="#solver">Solver</a></li> -<li><a class="reference internal" href="#retrieving-simulation-data">Retrieving simulation data</a></li> -</ul> -</li> -<li><a class="reference internal" href="#usage">Usage</a><ul> -<li><a class="reference internal" href="#common-cloth-properties">Common cloth properties</a></li> -<li><a class="reference internal" href="#tethers">Tethers</a></li> -<li><a class="reference internal" href="#collision-detection">Collision detection</a></li> -<li><a class="reference internal" href="#local-space-simulation">Local space simulation</a></li> -<li><a class="reference internal" href="#drag-lift-and-wind">Drag lift and wind</a></li> -</ul> -</li> -</ul> -</li> -</ul> - - <h4>Previous topic</h4> - <p class="topless"><a href="../Modules/Index.html" - title="previous chapter">Modules</a></p> - <h4>Next topic</h4> - <p class="topless"><a href="../CopyRight/Index.html" - title="next chapter">NVIDIA Copyright Notice</a></p> -<div id="searchbox" style="display: none"> - <h3>Quick search</h3> - <form class="search" action="../search.html" method="get"> - <input type="text" name="q" size="18" /> - <input type="submit" value="Go" /> - <input type="hidden" name="check_keywords" value="yes" /> - <input type="hidden" name="area" value="default" /> - </form> - <p class="searchtip" style="font-size: 90%"> - Enter search terms or a module, class or function name. - </p> -</div> -<script type="text/javascript">$('#searchbox').show(0);</script> - </div> - </div> - <div class="clearer"></div> - </div> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li class="right" style="margin-right: 10px"> - <a href="../CopyRight/Index.html" title="NVIDIA Copyright Notice" - >next</a></li> - <li class="right" > - <a href="../Modules/Index.html" title="Modules" - >previous</a> |</li> - <li><a href="../NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> - </ul> - </div> - - <script type="text/javascript"> - $(document).ready(function() { - $(".toggle > *").hide(); - $(".toggle .header").show(); - $(".toggle .header").click(function() { - $(this).parent().children().not(".header").toggle(400); - $(this).parent().children(".header").toggleClass("open"); - }) - }); -</script> - - -<script type="text/x-mathjax-config"> - MathJax.Hub.Config({ - extensions: ["tex2jax.js"], - jax: ["input/TeX", "output/HTML-CSS"], - tex2jax: { - processEscapes: true, - skipTags: ["script","noscript","style","textarea"] - }, - "HTML-CSS": { availableFonts: ["TeX"] }, - TeX: { - Macros: { - Lrg: ['\\displaystyle{#1}', 1, ""] - } - } - }); -</script> - - -<script type="text/javascript" async - src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> -</script> - - - </body> -</html>
\ No newline at end of file diff --git a/NvCloth/docs/documentation/_static/Roboto-Bold.woff b/NvCloth/docs/documentation/_static/Roboto-Bold.woff Binary files differnew file mode 100644 index 0000000..0c69948 --- /dev/null +++ b/NvCloth/docs/documentation/_static/Roboto-Bold.woff diff --git a/NvCloth/docs/documentation/_static/Roboto-BoldIta.woff b/NvCloth/docs/documentation/_static/Roboto-BoldIta.woff Binary files differnew file mode 100644 index 0000000..99de61a --- /dev/null +++ b/NvCloth/docs/documentation/_static/Roboto-BoldIta.woff diff --git a/NvCloth/docs/documentation/_static/Roboto-Ita.woff b/NvCloth/docs/documentation/_static/Roboto-Ita.woff Binary files differnew file mode 100644 index 0000000..dd74244 --- /dev/null +++ b/NvCloth/docs/documentation/_static/Roboto-Ita.woff diff --git a/NvCloth/docs/documentation/_static/Roboto-Light.woff b/NvCloth/docs/documentation/_static/Roboto-Light.woff Binary files differnew file mode 100644 index 0000000..cc534a3 --- /dev/null +++ b/NvCloth/docs/documentation/_static/Roboto-Light.woff diff --git a/NvCloth/docs/documentation/_static/Roboto-LightIta.woff b/NvCloth/docs/documentation/_static/Roboto-LightIta.woff Binary files differnew file mode 100644 index 0000000..3071ff4 --- /dev/null +++ b/NvCloth/docs/documentation/_static/Roboto-LightIta.woff diff --git a/NvCloth/docs/documentation/_static/Roboto-Medium.woff b/NvCloth/docs/documentation/_static/Roboto-Medium.woff Binary files differnew file mode 100644 index 0000000..cd810ef --- /dev/null +++ b/NvCloth/docs/documentation/_static/Roboto-Medium.woff diff --git a/NvCloth/docs/documentation/_static/Roboto-MediumIta.woff b/NvCloth/docs/documentation/_static/Roboto-MediumIta.woff Binary files differnew file mode 100644 index 0000000..69a1458 --- /dev/null +++ b/NvCloth/docs/documentation/_static/Roboto-MediumIta.woff diff --git a/NvCloth/docs/documentation/_static/Roboto.woff b/NvCloth/docs/documentation/_static/Roboto.woff Binary files differnew file mode 100644 index 0000000..bfa05d5 --- /dev/null +++ b/NvCloth/docs/documentation/_static/Roboto.woff diff --git a/NvCloth/docs/documentation/_static/application.css b/NvCloth/docs/documentation/_static/application.css new file mode 100644 index 0000000..e7479bf --- /dev/null +++ b/NvCloth/docs/documentation/_static/application.css @@ -0,0 +1,9084 @@ +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +topic, +main, +nav, +section, +summary { + display: block; +} +audio, +canvas, +video { + display: inline-block; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +a { + background: transparent; +} +a:focus { + outline: thin dotted; +} +a:active, +a:hover { + outline: 0; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +mark { + background: #ff0; + color: #000; +} +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} +pre { + white-space: pre-wrap; +} +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 0; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +button, +input, +select, +textarea { + font-family: inherit; + font-size: 100%; + margin: 0; +} +button, +input { + line-height: normal; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +textarea { + overflow: auto; + vertical-align: top; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +@media print { + * { + text-shadow: none !important; + color: #000 !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 2cm .5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .table td, + .table th { + background-color: #fff !important; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 62.5%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Roboto", Trebuchet, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 1.5; + color: #333333; + background-color: #fcfcfc; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #76b900; + text-decoration: none; +} +a:hover, +a:focus { + color: #76b900; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +img { + vertical-align: middle; +} +.img-responsive { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 0px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.5; + background-color: #fcfcfc; + border: 1px solid #dddddd; + border-radius: 0px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 24px; + margin-bottom: 24px; + border: 0; + border-top: 1px solid #efefef; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Roboto", Trebuchet, Helvetica, Arial, sans-serif; + font-weight: 600; + line-height: 1.1; + color: #004e49; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #999999; +} +h1, +h2, +h3 { + margin-top: 24px; + margin-bottom: 12px; +} +h1 small, +h2 small, +h3 small, +h1 .small, +h2 .small, +h3 .small { + font-size: 65%; +} +h4, +h5, +h6 { + margin-top: 12px; + margin-bottom: 12px; +} +h4 small, +h5 small, +h6 small, +h4 .small, +h5 .small, +h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 41px; +} +h2, +.h2 { + font-size: 34px; +} +h3, +.h3 { + font-size: 28px; +} +h4, +.h4 { + font-size: 20px; +} +h5, +.h5 { + font-size: 16px; +} +h6, +.h6 { + font-size: 14px; +} +p { + margin: 0 0 12px; +} +.lead { + margin-bottom: 24px; + font-size: 18px; + font-weight: 200; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 24px; + } +} +small, +.small { + font-size: 85%; +} +cite { + font-style: normal; +} +.text-muted { + color: #999999; +} +.text-primary { + color: #76b900; +} +.text-primary:hover { + color: #558600; +} +.text-warning { + color: #8a6d3b; +} +.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +.text-danger:hover { + color: #843534; +} +.text-success { + color: #3c763d; +} +.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +.text-info:hover { + color: #245269; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.page-header { + padding-bottom: 11px; + margin: 48px 0 24px; + border-bottom: 1px solid #efefef; +} +ul, +ol { + margin-top: 0; + margin-bottom: 12px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +.list-inline > li:first-child { + padding-left: 0; +} +dl { + margin-top: 0; + margin-bottom: 24px; +} +dt, +dd { + line-height: 1.5; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 992px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + content: " "; + display: table; + } + .dl-horizontal dd:after { + clear: both; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + content: " "; + display: table; + } + .dl-horizontal dd:after { + clear: both; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 12px 24px; + margin: 0 0 24px; + border-left: 5px solid #efefef; +} +blockquote p { + font-size: 20px; + font-weight: 300; + line-height: 1.25; +} +blockquote p:last-child { + margin-bottom: 0; +} +blockquote small, +blockquote .small { + display: block; + line-height: 1.5; + color: #999999; +} +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #efefef; + border-left: 0; +} +blockquote.pull-right p, +blockquote.pull-right small, +blockquote.pull-right .small { + text-align: right; +} +blockquote.pull-right small:before, +blockquote.pull-right .small:before { + content: ''; +} +blockquote.pull-right small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +blockquote:before, +blockquote:after { + content: ""; +} +address { + margin-bottom: 24px; + font-style: normal; + line-height: 1.5; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + white-space: nowrap; + border-radius: 0px; +} +pre { + display: block; + padding: 11.5px; + margin: 0 0 12px; + font-size: 15px; + line-height: 1.5; + word-break: break-all; + word-wrap: break-word; + color: #595959; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 0px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 10px; + padding-right: 10px; +} +.container:before, +.container:after { + content: " "; + display: table; +} +.container:after { + clear: both; +} +.container:before, +.container:after { + content: " "; + display: table; +} +.container:after { + clear: both; +} +@media (min-width: 768px) { + .container { + width: 740px; + } +} +@media (min-width: 992px) { + .container { + width: 960px; + } +} +@media (min-width: 1200px) { + .container { + width: 1160px; + } +} +.row { + margin-left: 10px; +} +.row:before, +.row:after { + content: " "; + display: table; +} +.row:after { + clear: both; +} +.row:before, +.row:after { + content: " "; + display: table; +} +.row:after { + clear: both; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 10px; + padding-right: 10px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666666666666%; +} +.col-xs-10 { + width: 83.33333333333334%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666666666666%; +} +.col-xs-7 { + width: 58.333333333333336%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666666666667%; +} +.col-xs-4 { + width: 33.33333333333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.666666666666664%; +} +.col-xs-1 { + width: 8.333333333333332%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666666666666%; +} +.col-xs-pull-10 { + right: 83.33333333333334%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666666666666%; +} +.col-xs-pull-7 { + right: 58.333333333333336%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666666666667%; +} +.col-xs-pull-4 { + right: 33.33333333333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.666666666666664%; +} +.col-xs-pull-1 { + right: 8.333333333333332%; +} +.col-xs-pull-0 { + right: 0%; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666666666666%; +} +.col-xs-push-10 { + left: 83.33333333333334%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666666666666%; +} +.col-xs-push-7 { + left: 58.333333333333336%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666666666667%; +} +.col-xs-push-4 { + left: 33.33333333333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.666666666666664%; +} +.col-xs-push-1 { + left: 8.333333333333332%; +} +.col-xs-push-0 { + left: 0%; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666666666666%; +} +.col-xs-offset-10 { + margin-left: 83.33333333333334%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666666666666%; +} +.col-xs-offset-7 { + margin-left: 58.333333333333336%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666666666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.666666666666664%; +} +.col-xs-offset-1 { + margin-left: 8.333333333333332%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666666666666%; + } + .col-sm-10 { + width: 83.33333333333334%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666666666666%; + } + .col-sm-7 { + width: 58.333333333333336%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666666666667%; + } + .col-sm-4 { + width: 33.33333333333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.666666666666664%; + } + .col-sm-1 { + width: 8.333333333333332%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666666666666%; + } + .col-sm-pull-10 { + right: 83.33333333333334%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666666666666%; + } + .col-sm-pull-7 { + right: 58.333333333333336%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666666666667%; + } + .col-sm-pull-4 { + right: 33.33333333333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.666666666666664%; + } + .col-sm-pull-1 { + right: 8.333333333333332%; + } + .col-sm-pull-0 { + right: 0%; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666666666666%; + } + .col-sm-push-10 { + left: 83.33333333333334%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666666666666%; + } + .col-sm-push-7 { + left: 58.333333333333336%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666666666667%; + } + .col-sm-push-4 { + left: 33.33333333333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.666666666666664%; + } + .col-sm-push-1 { + left: 8.333333333333332%; + } + .col-sm-push-0 { + left: 0%; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666666666666%; + } + .col-sm-offset-10 { + margin-left: 83.33333333333334%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666666666666%; + } + .col-sm-offset-7 { + margin-left: 58.333333333333336%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666666666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.666666666666664%; + } + .col-sm-offset-1 { + margin-left: 8.333333333333332%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666666666666%; + } + .col-md-10 { + width: 83.33333333333334%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666666666666%; + } + .col-md-7 { + width: 58.333333333333336%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666666666667%; + } + .col-md-4 { + width: 33.33333333333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.666666666666664%; + } + .col-md-1 { + width: 8.333333333333332%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666666666666%; + } + .col-md-pull-10 { + right: 83.33333333333334%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666666666666%; + } + .col-md-pull-7 { + right: 58.333333333333336%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666666666667%; + } + .col-md-pull-4 { + right: 33.33333333333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.666666666666664%; + } + .col-md-pull-1 { + right: 8.333333333333332%; + } + .col-md-pull-0 { + right: 0%; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666666666666%; + } + .col-md-push-10 { + left: 83.33333333333334%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666666666666%; + } + .col-md-push-7 { + left: 58.333333333333336%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666666666667%; + } + .col-md-push-4 { + left: 33.33333333333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.666666666666664%; + } + .col-md-push-1 { + left: 8.333333333333332%; + } + .col-md-push-0 { + left: 0%; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666666666666%; + } + .col-md-offset-10 { + margin-left: 83.33333333333334%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666666666666%; + } + .col-md-offset-7 { + margin-left: 58.333333333333336%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666666666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.666666666666664%; + } + .col-md-offset-1 { + margin-left: 8.333333333333332%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666666666666%; + } + .col-lg-10 { + width: 83.33333333333334%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666666666666%; + } + .col-lg-7 { + width: 58.333333333333336%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666666666667%; + } + .col-lg-4 { + width: 33.33333333333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.666666666666664%; + } + .col-lg-1 { + width: 8.333333333333332%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666666666666%; + } + .col-lg-pull-10 { + right: 83.33333333333334%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666666666666%; + } + .col-lg-pull-7 { + right: 58.333333333333336%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666666666667%; + } + .col-lg-pull-4 { + right: 33.33333333333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.666666666666664%; + } + .col-lg-pull-1 { + right: 8.333333333333332%; + } + .col-lg-pull-0 { + right: 0%; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666666666666%; + } + .col-lg-push-10 { + left: 83.33333333333334%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666666666666%; + } + .col-lg-push-7 { + left: 58.333333333333336%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666666666667%; + } + .col-lg-push-4 { + left: 33.33333333333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.666666666666664%; + } + .col-lg-push-1 { + left: 8.333333333333332%; + } + .col-lg-push-0 { + left: 0%; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666666666666%; + } + .col-lg-offset-10 { + margin-left: 83.33333333333334%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666666666666%; + } + .col-lg-offset-7 { + margin-left: 58.333333333333336%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666666666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.666666666666664%; + } + .col-lg-offset-1 { + margin-left: 8.333333333333332%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + max-width: 100%; + background-color: transparent; +} +th { + text-align: left; +} +.table { + width: 100%; + margin-bottom: 24px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.5; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #dddddd; +} +.table .table { + background-color: #fcfcfc; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-child(odd) > td, +.table-striped > tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover > td, +.table-hover > tbody > tr:hover > th { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + float: none; + display: table-cell; +} +.table > thead > tr > .active, +.table > tbody > tr > .active, +.table > tfoot > tr > .active, +.table > thead > .active > td, +.table > tbody > .active > td, +.table > tfoot > .active > td, +.table > thead > .active > th, +.table > tbody > .active > th, +.table > tfoot > .active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > .active:hover, +.table-hover > tbody > .active:hover > td, +.table-hover > tbody > .active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > .success, +.table > tbody > tr > .success, +.table > tfoot > tr > .success, +.table > thead > .success > td, +.table > tbody > .success > td, +.table > tfoot > .success > td, +.table > thead > .success > th, +.table > tbody > .success > th, +.table > tfoot > .success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > .success:hover, +.table-hover > tbody > .success:hover > td, +.table-hover > tbody > .success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > .danger, +.table > tbody > tr > .danger, +.table > tfoot > tr > .danger, +.table > thead > .danger > td, +.table > tbody > .danger > td, +.table > tfoot > .danger > td, +.table > thead > .danger > th, +.table > tbody > .danger > th, +.table > tfoot > .danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > .danger:hover, +.table-hover > tbody > .danger:hover > td, +.table-hover > tbody > .danger:hover > th { + background-color: #ebcccc; +} +.table > thead > tr > .warning, +.table > tbody > tr > .warning, +.table > tfoot > tr > .warning, +.table > thead > .warning > td, +.table > tbody > .warning > td, +.table > tfoot > .warning > td, +.table > thead > .warning > th, +.table > tbody > .warning > th, +.table > tfoot > .warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > .warning:hover, +.table-hover > tbody > .warning:hover > td, +.table-hover > tbody > .warning:hover > th { + background-color: #faf2cc; +} +@media (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 18px; + overflow-y: hidden; + overflow-x: scroll; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + -webkit-overflow-scrolling: touch; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 24px; + font-size: 24px; + line-height: inherit; + color: #595959; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + /* IE8-9 */ + line-height: normal; +} +input[type="file"] { + display: block; +} +select[multiple], +select[size] { + height: auto; +} +select optgroup { + font-size: inherit; + font-style: inherit; + font-family: inherit; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + height: auto; +} +output { + display: block; + padding-top: 7px; + font-size: 16px; + line-height: 1.5; + color: #999999; + vertical-align: middle; +} +.form-control { + display: block; + height: 38px; + padding: 6px 12px; + font-size: 16px; + line-height: 1.5; + color: #999999; + vertical-align: middle; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 0px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control:-moz-placeholder { + color: #999999; +} +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999999; +} +.form-control::-webkit-input-placeholder { + color: #999999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #efefef; +} +textarea.form-control { + height: auto; +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + display: block; + min-height: 24px; + margin-top: 10px; + margin-bottom: 10px; + padding-left: 20px; + vertical-align: middle; +} +.radio label, +.checkbox label { + display: inline; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: left; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +.radio[disabled], +.radio-inline[disabled], +.checkbox[disabled], +.checkbox-inline[disabled], +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"], +fieldset[disabled] .radio, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.input-sm { + height: 33px; + padding: 5px 10px; + font-size: 14px; + line-height: 1.5; + border-radius: 0px; +} +select.input-sm { + height: 33px; + line-height: 33px; +} +textarea.input-sm { + height: auto; +} +.input-lg { + height: 45px; + padding: 8px 16px; + font-size: 20px; + line-height: 1.33; + border-radius: 0px; +} +select.input-lg { + height: 45px; + line-height: 45px; +} +textarea.input-lg { + height: auto; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; +} +.form-control-static { + margin-bottom: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + } + .form-inline select.form-control { + width: auto; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} +.form-horizontal .control-label, +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 31px; +} +.form-horizontal .form-group { + margin-left: -10px; + margin-right: -10px; +} +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + content: " "; + display: table; +} +.form-horizontal .form-group:after { + clear: both; +} +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + content: " "; + display: table; +} +.form-horizontal .form-group:after { + clear: both; +} +.form-horizontal .form-control-static { + padding-top: 7px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 16px; + line-height: 1.5; + border-radius: 0px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} +.btn:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + color: #333333; + background-color: #ebebeb; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default .badge { + color: #ffffff; + background-color: #fff; +} +.btn-primary { + color: #ffffff; + background-color: #76b900; + border-color: #76b900; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #5c9000; + border-color: #4f7c00; +} +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #76b900; + border-color: #76b900; +} +.btn-primary .badge { + color: #76b900; + background-color: #fff; +} +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #f0ad4e; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ed9c28; + border-color: #eb9316; +} +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #f0ad4e; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d9534f; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d2322d; + border-color: #c12e2a; +} +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d9534f; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-success { + color: #ffffff; + background-color: #76b900; + border-color: #76b900; +} +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #5c9000; + border-color: #4f7c00; +} +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #76b900; + border-color: #76b900; +} +.btn-success .badge { + color: #76b900; + background-color: #fff; +} +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #5bc0de; +} +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #39b3d7; + border-color: #2aabd2; +} +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #5bc0de; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-link { + color: #76b900; + font-weight: normal; + cursor: pointer; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #76b900; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #999999; + text-decoration: none; +} +.btn-lg { + padding: 8px 16px; + font-size: 20px; + line-height: 1.33; + border-radius: 0px; +} +.btn-sm { + padding: 5px 10px; + font-size: 14px; + line-height: 1.5; + border-radius: 0px; +} +.btn-xs { + padding: 4px 6px; + font-size: 14px; + line-height: 1.5; + border-radius: 0px; +} +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('glyphicons-halflings-regular.eot'); + src: url('glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('glyphicons-halflings-regular.woff') format('woff'), url('glyphicons-halflings-regular.ttf') format('truetype'), url('glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon:empty { + width: 1em; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 16px; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 11px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.5; + color: #595959; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #4c4c4c; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #76b900; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 14px; + line-height: 1.5; + color: #999999; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +@media (min-width: 992px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus { + outline: none; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar:before, +.btn-toolbar:after { + content: " "; + display: table; +} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar:before, +.btn-toolbar:after { + content: " "; + display: table; +} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar .btn-group { + float: left; +} +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group, +.btn-toolbar > .btn-group + .btn-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group-xs > .btn { + padding: 4px 6px; + font-size: 14px; + line-height: 1.5; + border-radius: 0px; + padding-top: 6.384px; + padding-bottom: 4.8px; +} +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 14px; + line-height: 1.5; + border-radius: 0px; + padding-top: 7.98px; + padding-bottom: 6px; +} +.btn-group-lg > .btn { + padding: 8px 16px; + font-size: 20px; + line-height: 1.33; + border-radius: 0px; + padding-top: 12.768px; + padding-bottom: 9.6px; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + content: " "; + display: table; +} +.btn-group-vertical > .btn-group:after { + clear: both; +} +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + content: " "; + display: table; +} +.btn-group-vertical > .btn-group:after { + clear: both; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 0px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 0px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child > .btn:last-child, +.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +[data-toggle="buttons"] > .btn > input[type="radio"], +[data-toggle="buttons"] > .btn > input[type="checkbox"] { + display: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 45px; + padding: 8px 16px; + font-size: 20px; + line-height: 1.33; + border-radius: 0px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 45px; + line-height: 45px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 33px; + padding: 5px 10px; + font-size: 14px; + line-height: 1.5; + border-radius: 0px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 33px; + line-height: 33px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 16px; + font-weight: normal; + line-height: 1; + color: #999999; + text-align: center; + background-color: #efefef; + border: 1px solid #cccccc; + border-radius: 0px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 14px; + border-radius: 0px; +} +.input-group-addon.input-lg { + padding: 8px 16px; + font-size: 20px; + border-radius: 0px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + white-space: nowrap; +} +.input-group-btn:first-child > .btn { + margin-right: -1px; +} +.input-group-btn:last-child > .btn { + margin-left: -1px; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -4px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:active { + z-index: 2; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav:before, +.nav:after { + content: " "; + display: table; +} +.nav:after { + clear: both; +} +.nav:before, +.nav:after { + content: " "; + display: table; +} +.nav:after { + clear: both; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #efefef; +} +.nav > li.disabled > a { + color: #999999; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #efefef; + border-color: #76b900; +} +.nav .nav-divider { + height: 1px; + margin: 11px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #dddddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.5; + border: 1px solid transparent; + border-radius: 0px 0px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #efefef #efefef #dddddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #999999; + background-color: #fcfcfc; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 0px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0px 0px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fcfcfc; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 0px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #76b900; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 0px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0px 0px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fcfcfc; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 24px; + border: 1px solid transparent; +} +.navbar:before, +.navbar:after { + content: " "; + display: table; +} +.navbar:after { + clear: both; +} +.navbar:before, +.navbar:after { + content: " "; + display: table; +} +.navbar:after { + clear: both; +} +@media (min-width: 992px) { + .navbar { + border-radius: 0px; + } +} +.navbar-header:before, +.navbar-header:after { + content: " "; + display: table; +} +.navbar-header:after { + clear: both; +} +.navbar-header:before, +.navbar-header:after { + content: " "; + display: table; +} +.navbar-header:after { + clear: both; +} +@media (min-width: 992px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + max-height: 340px; + overflow-x: visible; + padding-right: 10px; + padding-left: 10px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse:before, +.navbar-collapse:after { + content: " "; + display: table; +} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse:before, +.navbar-collapse:after { + content: " "; + display: table; +} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 992px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.container > .navbar-header, +.container > .navbar-collapse { + margin-right: -10px; + margin-left: -10px; +} +@media (min-width: 992px) { + .container > .navbar-header, + .container > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 992px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 992px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 13px 10px; + font-size: 20px; + line-height: 24px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +@media (min-width: 992px) { + .navbar > .container .navbar-brand { + margin-left: -10px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 10px; + padding: 9px 10px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0px; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 992px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 6.5px -10px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 24px; +} +@media (max-width: 991px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 24px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 992px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 13px; + padding-bottom: 13px; + } + .navbar-nav.navbar-right:last-child { + margin-right: -10px; + } +} +@media (min-width: 992px) { + .navbar-left { + float: left !important; + float: left; + } + .navbar-right { + float: right !important; + float: right; + } +} +.navbar-form { + margin-left: -10px; + margin-right: -10px; + padding: 10px 10px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 6px; + margin-bottom: 6px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + } + .navbar-form select.form-control { + width: auto; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} +@media (max-width: 991px) { + .navbar-form .form-group { + margin-bottom: 5px; + } +} +@media (min-width: 992px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-form.navbar-right:last-child { + margin-right: -10px; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-nav.pull-right > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-right { + left: auto; + right: 0; +} +.navbar-btn { + margin-top: 6px; + margin-bottom: 6px; +} +.navbar-btn.btn-sm { + margin-top: 8.5px; + margin-bottom: 8.5px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 13px; + margin-bottom: 13px; +} +@media (min-width: 992px) { + .navbar-text { + float: left; + margin-left: 10px; + margin-right: 10px; + } + .navbar-text.navbar-right:last-child { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777777; +} +.navbar-default .navbar-nav > li > a { + color: #777777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #dddddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #dddddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #cccccc; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #e7e7e7; + color: #555555; +} +@media (max-width: 991px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777777; +} +.navbar-default .navbar-link:hover { + color: #333333; +} +.navbar-inverse { + background-color: #000000; + border-color: #000000; +} +.navbar-inverse .navbar-brand { + color: #999999; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #707070; +} +.navbar-inverse .navbar-nav > li > a { + color: #999999; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #000000; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: transparent; + color: #ffffff; +} +@media (max-width: 991px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #000000; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #000000; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #999999; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #999999; +} +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} +.breadcrumb { + padding: 8px 15px; + margin-top: 17px; + list-style: none; + background-color: #f5f5f5; + border-radius: 0px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: ">\00a0"; + padding: 0 5px; + color: #cccccc; +} +.breadcrumb > .active { + color: #999999; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 24px 0; + border-radius: 0px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + line-height: 1.5; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 0px; + border-top-left-radius: 0px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 0px; + border-top-right-radius: 0px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + background-color: #efefef; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + background-color: #76b900; + border-color: #76b900; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #999999; + background-color: #ffffff; + border-color: #dddddd; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 8px 16px; + font-size: 20px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 0px; + border-top-left-radius: 0px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 0px; + border-top-right-radius: 0px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 14px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 0px; + border-top-left-radius: 0px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 0px; + border-top-right-radius: 0px; +} +.pager { + padding-left: 0; + margin: 24px 0; + list-style: none; + text-align: center; +} +.pager:before, +.pager:after { + content: " "; + display: table; +} +.pager:after { + clear: both; +} +.pager:before, +.pager:after { + content: " "; + display: table; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #efefef; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + background-color: #ffffff; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.label[href]:hover, +.label[href]:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #999999; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #808080; +} +.label-primary { + background-color: #76b900; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #558600; +} +.label-success { + background-color: #76b900; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #558600; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 14px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #999999; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +a.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #76b900; + background-color: #ffffff; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px; + margin-bottom: 30px; + font-size: 24px; + font-weight: 200; + line-height: 2.25; + color: inherit; + background-color: #efefef; +} +.jumbotron h1, +.jumbotron .h1 { + line-height: 1; + color: inherit; +} +.jumbotron p { + line-height: 1.4; +} +.container .jumbotron { + border-radius: 0px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 72px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 24px; + line-height: 1.5; + background-color: #fcfcfc; + border: 1px solid #dddddd; + border-radius: 0px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + display: block; + max-width: 100%; + height: auto; + margin-left: auto; + margin-right: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #76b900; +} +.thumbnail .caption { + padding: 9px; + color: #333333; +} +.alert { + padding: 15px; + margin-bottom: 24px; + border: 1px solid transparent; + border-radius: 0px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable { + padding-right: 35px; +} +.alert-dismissable .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + background-color: #fcf8e3; + border-color: #faebcc; + color: #8a6d3b; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 24px; + margin-bottom: 24px; + background-color: #f5f5f5; + border-radius: 0px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 14px; + line-height: 24px; + color: #ffffff; + text-align: center; + background-color: #76b900; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #76b900; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media, +.media .media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media-object { + display: block; +} +.media-heading { + margin: 0 0 5px; +} +.media > .pull-left { + margin-right: 10px; +} +.media > .pull-right { + margin-left: 10px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} +.list-group-item:first-child { + border-top-right-radius: 0px; + border-top-left-radius: 0px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0px; + border-bottom-left-radius: 0px; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +a.list-group-item { + color: #555555; +} +a.list-group-item .list-group-item-heading { + color: #333333; +} +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5; +} +a.list-group-item.active, +a.list-group-item.active:hover, +a.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #76b900; + border-color: #76b900; +} +a.list-group-item.active .list-group-item-heading, +a.list-group-item.active:hover .list-group-item-heading, +a.list-group-item.active:focus .list-group-item-heading { + color: inherit; +} +a.list-group-item.active .list-group-item-text, +a.list-group-item.active:hover .list-group-item-text, +a.list-group-item.active:focus .list-group-item-text { + color: #d3ff86; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 24px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 0px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-body:before, +.panel-body:after { + content: " "; + display: table; +} +.panel-body:after { + clear: both; +} +.panel-body:before, +.panel-body:after { + content: " "; + display: table; +} +.panel-body:after { + clear: both; +} +.panel > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item { + border-width: 1px 0; +} +.panel > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.panel > .list-group .list-group-item:last-child { + border-bottom: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table { + margin-bottom: 0; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive { + border-top: 1px solid #dddddd; +} +.panel > .table > tbody:first-child th, +.panel > .table > tbody:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:last-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:last-child > th, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-bordered > thead > tr:last-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1px; + border-top-left-radius: -1px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 18px; + color: inherit; +} +.panel-title > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: -1px; + border-bottom-left-radius: -1px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 0px; + overflow: hidden; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse .panel-body { + border-top: 1px solid #dddddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} +.panel-default { + border-color: #dddddd; +} +.panel-default > .panel-heading { + color: #595959; + background-color: #f5f5f5; + border-color: #dddddd; +} +.panel-default > .panel-heading + .panel-collapse .panel-body { + border-top-color: #dddddd; +} +.panel-default > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #dddddd; +} +.panel-primary { + border-color: #76b900; +} +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #76b900; + border-color: #76b900; +} +.panel-primary > .panel-heading + .panel-collapse .panel-body { + border-top-color: #76b900; +} +.panel-primary > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #76b900; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #ebccd1; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #bce8f1; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 0px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 0px; +} +.well-sm { + padding: 9px; + border-radius: 0px; +} +.close { + float: right; + font-size: 24px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: auto; + overflow-y: scroll; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; + z-index: 1050; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: none; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.5px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.5; +} +.modal-body { + position: relative; + padding: 20px; +} +.modal-footer { + margin-top: 15px; + padding: 19px 20px 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.modal-footer:after { + clear: both; +} +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +@media screen and (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } +} +.tooltip { + position: absolute; + z-index: 1030; + display: block; + visibility: visible; + font-size: 14px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 0px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + right: 5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + background-color: #ffffff; + background-clip: padding-box; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 16px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow { + border-width: 11px; +} +.popover .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; + line-height: 1; +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + outline: none; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicons-chevron-left, + .carousel-control .glyphicons-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after { + content: " "; + display: table; +} +.clearfix:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +tr.visible-xs, +th.visible-xs, +td.visible-xs { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-xs.visible-sm { + display: block !important; + } + table.visible-xs.visible-sm { + display: table; + } + tr.visible-xs.visible-sm { + display: table-row !important; + } + th.visible-xs.visible-sm, + td.visible-xs.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-xs.visible-md { + display: block !important; + } + table.visible-xs.visible-md { + display: table; + } + tr.visible-xs.visible-md { + display: table-row !important; + } + th.visible-xs.visible-md, + td.visible-xs.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-xs.visible-lg { + display: block !important; + } + table.visible-xs.visible-lg { + display: table; + } + tr.visible-xs.visible-lg { + display: table-row !important; + } + th.visible-xs.visible-lg, + td.visible-xs.visible-lg { + display: table-cell !important; + } +} +.visible-sm, +tr.visible-sm, +th.visible-sm, +td.visible-sm { + display: none !important; +} +@media (max-width: 767px) { + .visible-sm.visible-xs { + display: block !important; + } + table.visible-sm.visible-xs { + display: table; + } + tr.visible-sm.visible-xs { + display: table-row !important; + } + th.visible-sm.visible-xs, + td.visible-sm.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-sm.visible-md { + display: block !important; + } + table.visible-sm.visible-md { + display: table; + } + tr.visible-sm.visible-md { + display: table-row !important; + } + th.visible-sm.visible-md, + td.visible-sm.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-sm.visible-lg { + display: block !important; + } + table.visible-sm.visible-lg { + display: table; + } + tr.visible-sm.visible-lg { + display: table-row !important; + } + th.visible-sm.visible-lg, + td.visible-sm.visible-lg { + display: table-cell !important; + } +} +.visible-md, +tr.visible-md, +th.visible-md, +td.visible-md { + display: none !important; +} +@media (max-width: 767px) { + .visible-md.visible-xs { + display: block !important; + } + table.visible-md.visible-xs { + display: table; + } + tr.visible-md.visible-xs { + display: table-row !important; + } + th.visible-md.visible-xs, + td.visible-md.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-md.visible-sm { + display: block !important; + } + table.visible-md.visible-sm { + display: table; + } + tr.visible-md.visible-sm { + display: table-row !important; + } + th.visible-md.visible-sm, + td.visible-md.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-md.visible-lg { + display: block !important; + } + table.visible-md.visible-lg { + display: table; + } + tr.visible-md.visible-lg { + display: table-row !important; + } + th.visible-md.visible-lg, + td.visible-md.visible-lg { + display: table-cell !important; + } +} +.visible-lg, +tr.visible-lg, +th.visible-lg, +td.visible-lg { + display: none !important; +} +@media (max-width: 767px) { + .visible-lg.visible-xs { + display: block !important; + } + table.visible-lg.visible-xs { + display: table; + } + tr.visible-lg.visible-xs { + display: table-row !important; + } + th.visible-lg.visible-xs, + td.visible-lg.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-lg.visible-sm { + display: block !important; + } + table.visible-lg.visible-sm { + display: table; + } + tr.visible-lg.visible-sm { + display: table-row !important; + } + th.visible-lg.visible-sm, + td.visible-lg.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-lg.visible-md { + display: block !important; + } + table.visible-lg.visible-md { + display: table; + } + tr.visible-lg.visible-md { + display: table-row !important; + } + th.visible-lg.visible-md, + td.visible-lg.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +.hidden-xs { + display: block !important; +} +table.hidden-xs { + display: table; +} +tr.hidden-xs { + display: table-row !important; +} +th.hidden-xs, +td.hidden-xs { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-xs, + tr.hidden-xs, + th.hidden-xs, + td.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-xs.hidden-sm, + tr.hidden-xs.hidden-sm, + th.hidden-xs.hidden-sm, + td.hidden-xs.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-xs.hidden-md, + tr.hidden-xs.hidden-md, + th.hidden-xs.hidden-md, + td.hidden-xs.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-xs.hidden-lg, + tr.hidden-xs.hidden-lg, + th.hidden-xs.hidden-lg, + td.hidden-xs.hidden-lg { + display: none !important; + } +} +.hidden-sm { + display: block !important; +} +table.hidden-sm { + display: table; +} +tr.hidden-sm { + display: table-row !important; +} +th.hidden-sm, +td.hidden-sm { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-sm.hidden-xs, + tr.hidden-sm.hidden-xs, + th.hidden-sm.hidden-xs, + td.hidden-sm.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm, + tr.hidden-sm, + th.hidden-sm, + td.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-sm.hidden-md, + tr.hidden-sm.hidden-md, + th.hidden-sm.hidden-md, + td.hidden-sm.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-sm.hidden-lg, + tr.hidden-sm.hidden-lg, + th.hidden-sm.hidden-lg, + td.hidden-sm.hidden-lg { + display: none !important; + } +} +.hidden-md { + display: block !important; +} +table.hidden-md { + display: table; +} +tr.hidden-md { + display: table-row !important; +} +th.hidden-md, +td.hidden-md { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-md.hidden-xs, + tr.hidden-md.hidden-xs, + th.hidden-md.hidden-xs, + td.hidden-md.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-md.hidden-sm, + tr.hidden-md.hidden-sm, + th.hidden-md.hidden-sm, + td.hidden-md.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md, + tr.hidden-md, + th.hidden-md, + td.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-md.hidden-lg, + tr.hidden-md.hidden-lg, + th.hidden-md.hidden-lg, + td.hidden-md.hidden-lg { + display: none !important; + } +} +.hidden-lg { + display: block !important; +} +table.hidden-lg { + display: table; +} +tr.hidden-lg { + display: table-row !important; +} +th.hidden-lg, +td.hidden-lg { + display: table-cell !important; +} +@media (max-width: 767px) { + .hidden-lg.hidden-xs, + tr.hidden-lg.hidden-xs, + th.hidden-lg.hidden-xs, + td.hidden-lg.hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-lg.hidden-sm, + tr.hidden-lg.hidden-sm, + th.hidden-lg.hidden-sm, + td.hidden-lg.hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-lg.hidden-md, + tr.hidden-lg.hidden-md, + th.hidden-lg.hidden-md, + td.hidden-lg.hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg, + tr.hidden-lg, + th.hidden-lg, + td.hidden-lg { + display: none !important; + } +} +.visible-print, +tr.visible-print, +th.visible-print, +td.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } + .hidden-print, + tr.hidden-print, + th.hidden-print, + td.hidden-print { + display: none !important; + } +} +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('fontawesome-webfont.eot?v=4.0.3'); + src: url('fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('fontawesome-webfont.woff?v=4.0.3') format('woff'), url('fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.2857142857142858em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.142857142857143em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + top: 0.14285714285714285em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.8571428571428572em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-asc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-desc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-reply-all:before { + content: "\f122"; +} +.fa-mail-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +@font-face { + font-family: 'Roboto'; + src: url("Roboto.woff") format("woff"); + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: 'Roboto'; + src: url("Roboto-Ita.woff") format("woff"); + font-weight: 400; + font-style: italic; +} +@font-face { + font-family: 'Roboto'; + src: url("Roboto-Medium.woff") format("woff"); + font-weight: 600; + font-style: normal; +} +@font-face { + font-family: 'Roboto'; + src: url("Roboto-MediumIta.woff") format("woff"); + font-weight: 600; + font-style: italic; +} +@font-face { + font-family: 'Roboto'; + src: url("Roboto-Bold.woff") format("woff"); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'Roboto'; + src: url("Roboto-BoldIta.woff") format("woff"); + font-weight: 700; + font-style: italic; +} +@font-face { + font-family: 'Roboto'; + src: url("Roboto-Light.woff") format("woff"); + font-weight: 300; + font-style: normal; +} +@font-face { + font-family: 'Roboto'; + src: url("Roboto-LightIta.woff") format("woff"); + font-weight: 300; + font-style: italic; +} +@media (min-width: 1400px) { + .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 { + float: left; + } + .col-xl-12 { + width: 100%; + } + .col-xl-11 { + width: 91.66666666666666%; + } + .col-xl-10 { + width: 83.33333333333334%; + } + .col-xl-9 { + width: 75%; + } + .col-xl-8 { + width: 66.66666666666666%; + } + .col-xl-7 { + width: 58.333333333333336%; + } + .col-xl-6 { + width: 50%; + } + .col-xl-5 { + width: 41.66666666666667%; + } + .col-xl-4 { + width: 33.33333333333333%; + } + .col-xl-3 { + width: 25%; + } + .col-xl-2 { + width: 16.666666666666664%; + } + .col-xl-1 { + width: 8.333333333333332%; + } + .col-xl-pull-12 { + right: 100%; + } + .col-xl-pull-11 { + right: 91.66666666666666%; + } + .col-xl-pull-10 { + right: 83.33333333333334%; + } + .col-xl-pull-9 { + right: 75%; + } + .col-xl-pull-8 { + right: 66.66666666666666%; + } + .col-xl-pull-7 { + right: 58.333333333333336%; + } + .col-xl-pull-6 { + right: 50%; + } + .col-xl-pull-5 { + right: 41.66666666666667%; + } + .col-xl-pull-4 { + right: 33.33333333333333%; + } + .col-xl-pull-3 { + right: 25%; + } + .col-xl-pull-2 { + right: 16.666666666666664%; + } + .col-xl-pull-1 { + right: 8.333333333333332%; + } + .col-xl-pull-0 { + right: 0%; + } + .col-xl-push-12 { + left: 100%; + } + .col-xl-push-11 { + left: 91.66666666666666%; + } + .col-xl-push-10 { + left: 83.33333333333334%; + } + .col-xl-push-9 { + left: 75%; + } + .col-xl-push-8 { + left: 66.66666666666666%; + } + .col-xl-push-7 { + left: 58.333333333333336%; + } + .col-xl-push-6 { + left: 50%; + } + .col-xl-push-5 { + left: 41.66666666666667%; + } + .col-xl-push-4 { + left: 33.33333333333333%; + } + .col-xl-push-3 { + left: 25%; + } + .col-xl-push-2 { + left: 16.666666666666664%; + } + .col-xl-push-1 { + left: 8.333333333333332%; + } + .col-xl-push-0 { + left: 0%; + } + .col-xl-offset-12 { + margin-left: 100%; + } + .col-xl-offset-11 { + margin-left: 91.66666666666666%; + } + .col-xl-offset-10 { + margin-left: 83.33333333333334%; + } + .col-xl-offset-9 { + margin-left: 75%; + } + .col-xl-offset-8 { + margin-left: 66.66666666666666%; + } + .col-xl-offset-7 { + margin-left: 58.333333333333336%; + } + .col-xl-offset-6 { + margin-left: 50%; + } + .col-xl-offset-5 { + margin-left: 41.66666666666667%; + } + .col-xl-offset-4 { + margin-left: 33.33333333333333%; + } + .col-xl-offset-3 { + margin-left: 25%; + } + .col-xl-offset-2 { + margin-left: 16.666666666666664%; + } + .col-xl-offset-1 { + margin-left: 8.333333333333332%; + } + .col-xl-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1400px) { + .container { + width: container-extra-large-desktop; + } +} +@media (min-width: 992px) { + .col-md-4 { + width: 33.3%; + } +} +@media (min-width: 1200px) { + .col-lg-4 { + width: 33.3%; + } +} +@media (min-width: 1400px) { + .col-xl-4 { + width: 33.3%; + } +} +.navbar { + min-height: 50px; + margin-bottom: 0; +} +@media (max-width: 1199px) { + .navbar { + margin-bottom: 0; + } +} +.navbar .navbar-header { + white-space: nowrap; +} +.navbar .nav-uppercase { + text-transform: uppercase; +} +.navbar .login-nav { + text-transform: none; +} +.navbar .divider-nav { + background-color: #303030; + width: 1px; + height: 30px; + margin-left: 20px; + display: inline-block; + vertical-align: middle; +} +.navbar .navbar-brand { + padding: 13px 10px; + margin: 0; +} +.navbar .navbar-brand .divider-nav { + margin-left: 30px; +} +.navbar .gw-download { + color: #76b900 !important; +} +.navbar .gw-sub-navbar > li > a { + padding: 17px 32px 9px 0; +} +@media (min-width: 992px) { + .navbar-nav > li > a { + padding-top: 17px; + padding-bottom: 9px; + } +} +.container > .navbar-header, +.container > .navbar-collapse { + margin-left: 0; + margin-right: 0; +} +@media (min-width: 991px) { + #search-top { + position: relative; + } + #search-top a { + padding-left: 0; + padding-right: 10px; + position: relative; + z-index: 3; + } + #search-top a:hover { + color: #77b820; + } + #search-top .search-form { + position: absolute; + top: 7px; + right: 0; + z-index: 2; + } + #search-top .search-form input { + display: none; + width: 300px; + height: 36px !important; + line-height: 38px; + border: 0; + outline: 0; + padding: 0 40px 0 12px; + border-radius: 3px; + background: #fff; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } +} +.nvidia-dropdown { + position: relative; +} +.nvidia-dropdown-menu { + left: auto; + float: right; + right: -59px; + background: #000000; + border: 1px solid #cccccc; + border: 1px solid #404040; +} +.nvidia-dropdown-menu.drop-gw { + right: -59px; +} +.nvidia-dropdown-menu.drop-sub-gw { + right: -43px; + background-color: #242424; +} +.nvidia-dropdown-menu.drop-sub-gw:after { + border-bottom: 9px solid #242424; + top: -7px; +} +.nvidia-dropdown-menu.pull-right { + right: 0; + left: auto; +} +.nvidia-dropdown-menu .divider { + height: 1px; + margin: 11px 0; + overflow: hidden; + background-color: transparent; +} +.nvidia-dropdown-menu > li { + font-size: 0.9em; +} +.nvidia-dropdown-menu > li > a { + display: block; + padding: 7px 20px; + clear: both; + font-weight: normal; + line-height: 1.5; + color: #cacaca; + white-space: nowrap; +} +@media (min-width: 991px) { + .nvidia-dropdown-menu:before, + .nvidia-dropdown-menu:after { + content: ''; + position: absolute; + left: 50%; + border-left: 9px solid transparent; + border-right: 9px solid transparent; + margin: 0 0 0 -7px; + } + .nvidia-dropdown-menu:before { + border-bottom: 9px solid #404040; + top: -9px; + } + .nvidia-dropdown-menu:after { + border-bottom: 9px solid #000000; + top: -7px; + } +} +@media (max-width: 991px) { + .nvidia-dropdown-menu:before, + .nvidia-dropdown-menu:after { + display: none; + } +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #ffffff; + background-color: transparent; +} +@media (max-width: 768px) { + .navbar .navbar-header { + text-align: left !important; + } + .navbar .navbar-header .logo-header { + display: block !important; + margin: 0 !important; + } + .navbar .navbar-brand { + float: none; + display: block; + } +} +.second-navbar { + background-color: #242424; + border-color: transparent; + margin-bottom: 0; +} +body { + background-color: #1a1a1a; +} +#wrapper { + background-color: #fcfcfc; +} +.container-fluid { + margin-left: 10px; + margin-right: 10px; +} +.masthead { + background-color: #373737; + background-size: cover; + background-position: center 0; + background-repeat: no-repeat; + height: 50px + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.masthead .container { + padding: 0; +} +.masthead .masthead-content { + padding: 30px 10px 20px 10px; +} +.masthead .masthead-content h1 { + font-size: 24px; + color: #76b900; + padding: 0; + margin: 0; + text-transform: uppercase; + font-weight: normal; +} +.masthead .masthead-content p { + font-size: 1.2em; + color: #cacaca; + font-weight: normal; + padding-top: 10px; +} +.masthead-sub-page { + background-color: white; +} +.masthead-sub-page h1 { + margin-top: 12px; +} +.section-header { + padding-bottom: 5px; + margin: 24px 0 24px 0; + border-bottom: 1px solid #efefef; +} +.section-header h4 { + color: #004831; + text-transform: capitalize; + font-size: 19px; +} +.section-header a { + float: right; + padding-top: 4px; + font-size: 14px; + text-transform: capitalize; + color: #999999; +} +.section-header a:hover, +.section-header a:focus { + text-decoration: underline; +} +.newsletter-registration h5 { + margin-top: 0; +} +.newsletter-registration .input-group .input-group-addon { + background-color: white; + border-style: solid none solid solid; + border-width: 1px 0 1px 1px; + border-right: 0; +} +.newsletter-registration .input-group .form-control { + background-color: white; + border-style: solid none solid none; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-appearance: none; + border-width: 1px 0 1px 0; + height: 38px; + padding-left: 0; +} +.newsletter-registration .input-group .form-control:focus { + border-color: #ccc; +} +.node { + padding-bottom: 1em; +} +a.node-thumbnail { + position: relative; + display: block; + margin-bottom: 1em; +} +a.node-thumbnail img { + width: 100%; + height: auto; + border: 1px solid; + border-color: #999999; + display: inline; +} +a.node-thumbnail img.no-border { + border: none; +} +a.node-thumbnail .node-overlay { + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0); + -webkit-transition: background-color 0.5s ease-in-out; + transition: background-color 0.5s ease-in-out; +} +a.node-thumbnail .node-overlay .node-cta { + color: rgba(255, 255, 255, 0); + -webkit-transition: color 0.5s ease-in-out; + transition: color 0.5s ease-in-out; + text-align: center; + margin: auto; + position: absolute; + height: 24px; + top: 0; + left: 0; + bottom: 0; + right: 0; +} +a.node-thumbnail .node-overlay .node-cta i { + color: rgba(118, 185, 0, 0); + -webkit-transition: color 0.5s ease-in-out; + transition: color 0.5s ease-in-out; + font-size: 0.9em; +} +a.node-thumbnail:hover .node-overlay { + background-color: rgba(0, 0, 0, 0.65); + -webkit-transition: background-color 0.5s ease-in-out; + transition: background-color 0.5s ease-in-out; +} +a.node-thumbnail:hover .node-overlay .node-cta { + color: #ffffff; + -webkit-transition: color 0.5s ease-in-out; + transition: color 0.5s ease-in-out; +} +a.node-thumbnail:hover .node-overlay .node-cta i { + color: #76b900; + -webkit-transition: color 0.5s ease-in-out; + transition: color 0.5s ease-in-out; +} +.node-description .node-date { + color: #999999; + padding-bottom: 5px; + font-size: 0.8em; + font-weight: 600; +} +.node-description a.node-title { + display: block; + font-size: 1.1em; + font-weight: 600; + line-height: 1.25em; + color: #004831; + padding-bottom: 0.4em; +} +.node-description a.node-title:hover, +.node-description a.node-title:focus { + text-decoration: underline; +} +.node-description p { + font-size: 0.8em; + color: #999999; +} +.icon-description { + padding-bottom: 12px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.icon-description .icon { + color: white; + background-color: #76b900; + float: left; + width: 90px; + height: 90px; + text-align: center; + font-size: 3em; + line-height: 97px; +} +.icon-description .icon.icon-cogs { + line-height: 103px; +} +.icon-description .icon.icon-book { + line-height: 100px; +} +.icon-description .icon.icon-download { + line-height: 100px; +} +.icon-description .description { + margin-left: 100px; +} +.icon-description .description h2 { + font-size: 1.3em; + margin: 0; + padding-bottom: 5px; +} +.icon-description .description > h2 > a { + font-size: 1em; + margin: 0; + padding-bottom: 5px; + color: #004831; +} +.icon-description .description > h2 > a:hover, +.icon-description .description > h2 > a:focus { + text-decoration: underline; +} +.icon-description .description > p > a { + font-size: 1em; + color: #76b900; +} +.icon-description .description > p > a:hover, +.icon-description .description > p > a:focus { + text-decoration: underline; +} +.icon-description .description p { + font-size: 0.9em; + text-transform: none; + margin-bottom: 10px; +} +.product > h4 > a { + color: #004831; +} +.feature_items .feature_item { + padding-bottom: 1em; +} +.feature_items .feature_item .feature_image { + padding-bottom: 1em; +} +.feature_items .feature_item .feature_image img { + width: 100%; +} +.feature_items .feature_item .feature_image .feature_icon { + padding: 20px 0 20px 0; + background-color: #76b900; + text-align: center; + font-size: 4em; + line-height: 1em; +} +.feature_items .feature_item .feature_description h2 { + margin: 0; + font-size: 1.5em; +} +.twitter img { + float: right; +} +.twitter #twitter-feeds { + border: 1px solid #E1E3E4; + border-radius: 3px; + width: 100%; + padding: 8px 8px 0 8px; + margin-top: 10px; +} +.twitter #twitter-feeds.twt-cuda { + height: 340px; +} +.twitter #twitter-feeds.twt-gameworks { + height: 276px; +} +.twitter #twitter-feeds #overflow { + width: 100%; + overflow-y: auto; + height: 100%; +} +.twitter #twitter-feeds .twt_description { + padding: 10px 0 10px; + border-bottom: 1px solid #E1E3E4; +} +.twitter #twitter-feeds .twt_description .twt-thumbnails { + float: left; + width: 70px; + height: 70px; +} +.twitter #twitter-feeds .twt_description a { + font-size: 0.7em; + color: #999999; +} +.twitter #twitter-feeds .twt_description a:hover, +.twitter #twitter-feeds .twt_description a:focus { + text-decoration: underline; +} +.twitter #twitter-feeds .twt_description .tweet { + margin-left: 85px; +} +.twitter #twitter-feeds .twt_description .tweet h2 { + color: #333333; + font-size: 1em; + margin: 0; + padding: 0; +} +.twitter #twitter-feeds .twt_description .tweet h6 { + color: #999999; + font-size: 0.7em; + margin: 0; + padding: 0; +} +.twitter #twitter-feeds .twt_description .tweet p { + padding-top: 5px; + font-size: 0.8em; + text-transform: none; +} +.twitter #twitter-feeds .twt_description .tweet p > a { + font-size: 1em; + color: #76b900; +} +.twitter #twitter-feeds .twt_description .tweet p > a:hover, +.twitter #twitter-feeds .twt_description .tweet p > a:focus { + text-decoration: underline; +} +.homepage .home-masthead .masthead-content h1 { + color: #76b900; + text-transform: uppercase; + font-size: 32px; + line-height: 1.2em; +} +.homepage .home-masthead .masthead-content p { + color: #cacaca; + font-size: 18px; +} +.homepage .home-zones-container { + padding: 40px 15px 30px; + background-color: #efefef; +} +.homepage .dev-zone-box { + background-color: black; + position: relative; + background-repeat: no-repeat; + background-size: cover; + background-position: center center; + margin-bottom: 1em; +} +.homepage .dev-zone-box.even { + background-color: #333; +} +.homepage .dev-zone-box .box { + height: 250px; + width: 100%; +} +.homepage .dev-zone-box a { + display: block; + padding: 20px; + width: 100%; + height: 100%; + position: relative; + -webkit-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.homepage .dev-zone-box a .dev-zone-box-content { + position: absolute; + top: 20px; + margin-right: 20px; + -webkit-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; +} +.homepage .dev-zone-box a .dev-zone-box-content h2 { + margin: 0; + color: #76b900; + font-size: 24px; + text-transform: uppercase; + -webkit-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; +} +.homepage .dev-zone-box a .dev-zone-box-content p { + font-size: 16px; + color: #cacaca; + -webkit-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; +} +.homepage .dev-zone-box a:hover { + text-decoration: underline; + background-color: #76b900; + -webkit-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; +} +.homepage .dev-zone-box a:hover .dev-zone-box-content { + -webkit-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; +} +.homepage .dev-zone-box a:hover .dev-zone-box-content h2, +.homepage .dev-zone-box a:hover .dev-zone-box-content p { + color: white; +} +.content .page-header { + margin-top: 0; +} +.content .page-header h1, +.content .page-header h2, +.content .page-header h3 { + margin-top: 0; +} +.content-sidebar .panel-heading { + text-transform: uppercase; + font-weight: bold; +} +.btn-dark-icon > i.fa { + font-size: 1em; + color: #004831; +} +.seperator, +.separator { + height: 20px; +} +.seperator-sm, +.separator-sm { + height: 10px; +} +.padding-left { + padding-left: 0px; +} +.padding-md { + padding: 20px; +} +.padding-md-right { + padding-right: 20px; +} +.padding-md-left { + padding-left: 20px; +} +.padding-md-bottom { + padding-bottom: 20px; +} +.padding-md-top { + padding-top: 20px; +} +.padding-sm { + padding: 10px; +} +.padding-sm-right { + padding-right: 10px; +} +.padding-sm-left { + padding-left: 10px; +} +.padding-sm-bottom { + padding-bottom: 10px; +} +.padding-sm-top { + padding-top: 10px; +} +.padding-md-footer { + padding: 20px 20px 20px 0; +} +.padding-section-footer { + padding-right: 0px; +} +.padding-sub-footer { + padding: 20px 20px 20px 0px; +} +.gray-lighter-background { + background-color: #efefef; +} +.gray-darker-background { + background-color: #373737; +} +.white-background { + background-color: white; +} +.vertical-align-middle { + vertical-align: middle !important; +} +.text-white { + color: white; +} +.text-green { + color: #76b900; +} +@media (max-width: 991px) { + .navbar-toggle { + float: left; + } +} +.sidr { + display: none; + position: absolute; + position: fixed; + top: 0; + height: 100%; + z-index: 999999; + width: 260px; + overflow-x: none; + overflow-y: auto; + background-color: #3c3c3d; + color: white; +} +.sidr.right { + left: auto; + right: -260px; +} +.sidr.left { + left: -260px; + right: auto; +} +.sidr ul { + display: block; + margin: 0; + padding: 0; +} +.sidr ul li { + display: block; + margin: 0; + line-height: 40px; + padding: 0 15px; +} +.sidr ul li.menu-title { + color: white; + border-bottom: 1px solid #262626; + text-transform: uppercase; + padding-top: 7px; + padding-bottom: 3px; +} +.sidr ul li a { + display: block; + text-decoration: none; + color: #999999; + padding: 10px 0; +} +.sidr ul li a:hover, +.sidr ul li a:active, +.sidr ul li a:focus { + color: white; + background: none; +} +.sidr ul li a .caret { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: auto; + height: auto; + border: none; + margin-left: 5px; + vertical-align: baseline; +} +.sidr ul li a .caret:before { + content: "\f105"; +} +.sidr ul li.dropdown .dropdown-menu { + display: none; +} +.sidr ul li.open > a { + background: none; +} +.sidr ul li.open > a:hover, +.sidr ul li.open > a:active, +.sidr ul li.open > a:focus { + background: none; +} +.sidr ul li.open > a .caret:before { + content: "\f107"; +} +.sidr ul li.open.dropdown .dropdown-menu { + display: block; +} +.sidr ul li.open .dropdown-menu > li > a { + padding: 5px 15px 5px 0; +} +.sidr ul li .search-form { + padding-top: 10px; + padding-bottom: 10px; +} +.sidr ul li .search-form .container-inline div { + display: block; + margin-top: 0; + margin-bottom: 0; +} +.sidr ul li .search-form .input { + position: relative; +} +.sidr ul li .search-form .input .fa { + position: absolute; + top: 8px; + right: 12px; + font-size: 18px; + color: #3c3c3d; +} +.sidr ul li .search-form .input input { + width: 100%; + padding: 7px 14px 5px 14px; + line-height: 1.5em; + background-color: #f0f0f0; + border: 0; + color: #3c3c3d; + border-radius: 3px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2) inset; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +footer { + border-top: 3px solid #76b900; +} +footer .footer-links { + background-color: #222222; +} +@media (max-width: 768px) { + footer .footer-links .zone-select { + text-align: left; + } +} +@media (min-width: 1200px) { + footer .footer-links .zone-select { + text-align: right; + } +} +footer .footer-links a { + color: #6e6e6e; +} + +footer .footer-links a:hover h6, +footer .footer-links a:active h6, +footer .footer-links a:hover, +footer .footer-links a:active { + color: #FFFFFF; + text-decoration: none; +} +footer .footer-links h5 { + margin: 0 0 19px; + padding: 0 0 0.5em 0; + text-transform: uppercase; + color: #707070; +} +footer .footer-links h6 { + margin: 0; + padding: 0 0 0.5em 0; + font-weight: normal; + text-transform: uppercase; + color: #707070; +} +footer .footer-links ul { + margin: 0; + padding: 0; +} +footer .footer-links ul li { + font-weight: lighter; + font-size: 0.8em; + list-style: none; + margin: 0; + padding: 0 0 5px; +} +footer .footer-links .logo-footer { + height: 26px; + width: 195px; + background-image: url("../images/nvidia-logo-footer.png"); + padding-bottom: 10px; + background-repeat: no-repeat; + vertical-align: middle; + border: 0 none; +} +footer .footer-links .logo-footer ul { + margin: 0; + padding: 40px 0 0; +} +footer .footer-boilerplate { + background-color: #1a1a1a; +} +footer .footer-boilerplate.footer-home { + padding: 5px 0 5px; +} +footer .footer-boilerplate .boilerplate { + text-align: left; + font-size: 0.8em; + color: #666666; + padding: 10px 0; +} +footer .footer-boilerplate .boilerplate .footer-brand { + margin: -2px 40px 20px 0px; +} +footer .footer-boilerplate .boilerplate a { + font-size: 0.9em; + text-transform: none; + color: #666666; + text-decoration: none; +} +footer .footer-boilerplate .boilerplate a:hover, +footer .footer-boilerplate .boilerplate a:focus { + color: #FFFFFF; + text-decoration: none; +} +.label { + padding: .5em .6em .3em; +} +label { + font-weight: normal; +} +:focus { + outline-color: transparent; + outline-style: none; +} +.btn { + padding-top: 9.575999999999999px; + padding-bottom: 7.199999999999999px; + line-height: 1.2em; +} +.btn-lg { + padding-top: 12.768px; + padding-bottom: 9.6px; +} +.btn-sm { + padding-top: 7.98px; + padding-bottom: 6px; +} +.btn-xs { + padding-top: 6.384px; + padding-bottom: 4.8px; +} +.lead { + font-size: 18px; +} +@media (min-width: 768px) { + .lead { + font-size: 20px; + } +} +.breadcrumb { + background-color: transparent; + padding: 0; + font-size: 14px; +} +.block ul { + margin: 0; + padding: 0; +} +.panel-success { + border-color: #76b900; +} +.panel-success > .panel-heading { + color: #ffffff; + background-color: #76b900; + border-color: #76b900; +} +.panel-success > .panel-heading + .panel-collapse .panel-body { + border-top-color: #76b900; +} +.panel-success > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #76b900; +} +.panel-success .panel-heading a { + color: white; +} +/* + * Core Owl Carousel CSS File + * v1.3.2 + */ +/* clearfix */ +.owl-carousel .owl-wrapper:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; +} +/* display none until init */ +.owl-carousel { + display: none; + position: relative; + width: 100%; + -ms-touch-action: pan-y; +} +.owl-carousel .owl-wrapper { + display: none; + position: relative; + -webkit-transform: translate3d(0px, 0px, 0px); +} +.owl-carousel .owl-wrapper-outer { + overflow: hidden; + position: relative; + width: 100%; +} +.owl-carousel .owl-wrapper-outer.autoHeight { + -webkit-transition: height 500ms ease-in-out; + -moz-transition: height 500ms ease-in-out; + -ms-transition: height 500ms ease-in-out; + -o-transition: height 500ms ease-in-out; + transition: height 500ms ease-in-out; +} +.owl-carousel .owl-item { + float: left; +} +.owl-controls .owl-page, +.owl-controls .owl-buttons div { + cursor: pointer; +} +.owl-controls { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +/* mouse grab icon */ +.grabbing { + cursor: url(grabbing.png) 8 8, move; +} +/* fix */ +.owl-carousel .owl-wrapper, +.owl-carousel .owl-item { + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); +} +/* +* Owl Carousel Owl Demo Theme +* v1.3.2 +*/ +.owl-theme .owl-controls { + margin-top: 10px; + text-align: center; +} +/* Styling Next and Prev buttons */ +.owl-theme .owl-controls .owl-buttons div { + color: #FFF; + display: inline-block; + zoom: 1; + *display: inline; + /*IE7 life-saver */ + margin: 5px; + padding: 3px 10px; + font-size: 12px; + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + border-radius: 30px; + background: #869791; + filter: alpha(opacity=50); + /*IE7 fix*/ + opacity: 0.5; +} +/* Clickable class fix problem with hover on touch devices */ +/* Use it for non-touch hover action */ +.owl-theme .owl-controls.clickable .owl-buttons div:hover { + filter: alpha(opacity=100); + /*IE7 fix*/ + opacity: 1; + text-decoration: none; +} +/* Styling Pagination*/ +.owl-theme .owl-controls .owl-page { + display: inline-block; + zoom: 1; + *display: inline; + /*IE7 life-saver */ +} +.owl-theme .owl-controls .owl-page span { + display: block; + width: 12px; + height: 12px; + margin: 5px 7px; + filter: alpha(opacity=50); + /*IE7 fix*/ + opacity: 0.5; + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; + background: #869791; +} +.owl-theme .owl-controls .owl-page.active span, +.owl-theme .owl-controls.clickable .owl-page:hover span { + filter: alpha(opacity=100); + /*IE7 fix*/ + opacity: 1; +} +/* If PaginationNumbers is true */ +.owl-theme .owl-controls .owl-page span.owl-numbers { + height: auto; + width: auto; + color: #FFF; + padding: 2px 10px; + font-size: 12px; + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + border-radius: 30px; +} +/* preloading images */ +.owl-item.loading { + min-height: 150px; + background: url(AjaxLoader.gif) no-repeat center center; +} +.carousel-container { + color: #fff; +} +.carousel-container #masthead-text { + padding-bottom: 1em; +} +.carousel-container h1, +.carousel-container h2, +.carousel-container h3, +.carousel-container h4, +.carousel-container h5, +.carousel-container h6 { + padding-top: 0; + margin-top: 0; +} +.carousel-container h2 { + color: #80bd01; +} +.carousel-container h3 { + color: #76b900; + text-transform: uppercase; + font-size: 22px; +} +.carousel-container .fa { + vertical-align: top; + margin: 2px 0 0 4px; +} +.owl-carousel .item { + position: relative; + background-repeat: no-repeat; + background-position: right 0px center; + padding-left: 10px; + padding-right: 10px; + min-height: 200px; +} +.owl-carousel .item .row, +.owl-carousel .item .carousel-text { + padding-top: 1em; + padding-bottom: 1em; + position: relative; + z-index: 3; +} +.owl-carousel .item .item-background { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background-repeat: no-repeat; + background-position: right 0px top; + background-size: cover; +} +@media (max-width: 767px) { + .owl-carousel .item .item-background { + opacity: 0.1; + } +} +@media (max-width: 991px) { + .owl-carousel .item .item-background { + opacity: 0.3; + } +} +.owl-carousel .owl-controls { + margin: 0; + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 2; +} +.owl-carousel .owl-controls .owl-buttons .owl-prev, +.owl-carousel .owl-controls .owl-buttons .owl-next { + height: 43px; + line-height: 43px; + font-size: 43px; + z-index: 3; + position: absolute; + padding: 0; + margin: 0; + background: transparent; + color: #CECECE; + border-radius: 0; +} +.owl-carousel .owl-controls .owl-buttons .owl-prev { + left: 0; +} +.owl-carousel .owl-controls .owl-buttons .owl-next { + right: 4px; +} +.owl-carousel .owl-controls .owl-buttons .fa { + vertical-align: top; +} +#colorbox, +#cboxOverlay, +#cboxWrapper { + position: absolute; + top: 0; + left: 0; + z-index: 9999; + overflow: hidden; +} +#cboxWrapper { + max-width: none; +} +#cboxOverlay { + position: fixed; + width: 100%; + height: 100%; +} +#cboxMiddleLeft, +#cboxBottomLeft { + clear: left; +} +#cboxContent { + position: relative; +} +#cboxLoadedContent { + overflow: auto; + -webkit-overflow-scrolling: touch; +} +#cboxTitle { + margin: 0; +} +#cboxLoadingOverlay, +#cboxLoadingGraphic { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +#cboxPrevious, +#cboxNext, +#cboxClose, +#cboxSlideshow { + cursor: pointer; +} +.cboxPhoto { + float: left; + margin: auto; + border: 0; + display: block; + max-width: none; + -ms-interpolation-mode: bicubic; +} +.cboxIframe { + width: 100%; + height: 100%; + display: block; + border: 0; +} +#colorbox, +#cboxContent, +#cboxLoadedContent { + box-sizing: content-box; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; +} +#cboxOverlay { + background: #000; +} +#colorbox { + outline: 0; +} +#cboxContent { + margin-top: 20px; + background: #000; +} +.cboxIframe { + background: #fff; +} +#cboxError { + padding: 50px; + border: 1px solid #ccc; +} +#cboxLoadedContent { + border: 5px solid #000; + background: #fff; +} +#cboxTitle { + position: absolute; + top: -20px; + left: 0; + color: #ccc; +} +#cboxCurrent { + position: absolute; + top: -20px; + right: 0px; + color: #ccc; +} +#cboxLoadingGraphic { + background: url(/images/colorbox/loading.gif) no-repeat center center; +} +/* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */ +#cboxPrevious, +#cboxNext, +#cboxSlideshow, +#cboxClose { + border: 0; + padding: 0; + margin: 0; + overflow: visible; + width: auto; + background: none; +} +/* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */ +#cboxPrevious:active, +#cboxNext:active, +#cboxSlideshow:active, +#cboxClose:active { + outline: 0; +} +#cboxSlideshow { + position: absolute; + top: -20px; + right: 90px; + color: #fff; +} +#cboxPrevious { + position: absolute; + top: 50%; + left: 5px; + margin-top: -32px; + background: url(/images/colorbox/controls.png) no-repeat top left; + width: 28px; + height: 65px; + text-indent: -9999px; +} +#cboxPrevious:hover { + background-position: bottom left; +} +#cboxNext { + position: absolute; + top: 50%; + right: 5px; + margin-top: -32px; + background: url(/images/colorbox/controls.png) no-repeat top right; + width: 28px; + height: 65px; + text-indent: -9999px; +} +#cboxNext:hover { + background-position: bottom right; +} +#cboxClose { + position: absolute; + top: 5px; + right: 5px; + display: block; + background: url(/images/colorbox/controls.png) no-repeat top center; + width: 38px; + height: 19px; + text-indent: -9999px; +} +#cboxClose:hover { + background-position: bottom center; +} +/* Pretty printing styles. Used with prettify.js. */ +/* SPAN elements with the classes below are added by prettyprint. */ +.pln { + color: #000; +} +/* plain text */ +@media screen { + .str { + color: #080; + } + /* string content */ + .kwd { + color: #008; + } + /* a keyword */ + .com { + color: #800; + } + /* a comment */ + .typ { + color: #606; + } + /* a type name */ + .lit { + color: #066; + } + /* a literal value */ + /* punctuation, lisp open bracket, lisp close bracket */ + .pun, + .opn, + .clo { + color: #660; + } + .tag { + color: #008; + } + /* a markup tag name */ + .atn { + color: #606; + } + /* a markup attribute name */ + .atv { + color: #080; + } + /* a markup attribute value */ + .dec, + .var { + color: #606; + } + /* a declaration; a variable name */ + .fun { + color: red; + } + /* a function name */ +} +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { + color: #060; + } + .kwd { + color: #006; + font-weight: bold; + } + .com { + color: #600; + font-style: italic; + } + .typ { + color: #404; + font-weight: bold; + } + .lit { + color: #044; + } + .pun, + .opn, + .clo { + color: #440; + } + .tag { + color: #006; + font-weight: bold; + } + .atn { + color: #404; + } + .atv { + color: #060; + } +} +/* Put a border around prettyprinted code snippets. */ +pre.prettyprint { + padding: 2px; + border: 1px solid #888; +} +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; +} +/* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L5, +li.L6, +li.L7, +li.L8 { + list-style-type: none; +} +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { + background: #eee; +} +pre.prettyprint { + padding: 10px; + font-size: 14px; +} +#right .more-link { + text-align: left; + border-top: 1px solid #dddddd; +} +#right .more-link a { + padding: 10px 15px 10px 15px; + display: block; + text-transform: capitalize; + color: #555555; +} +#right .more-link a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.topic { + padding: 1em 1em 1em 1em; + color: #004e49; + background-color: white; +} + +.topic-title { + color: white; + background-color: #004e49; + padding: 0em 0em 0em 0.3em; +} + +.sidebar { + margin: 0 0 1em 1em; + padding: 1em; + color: #004e49; + background-color: white; + display: inline-block; + float: right; + width: 33%; +} + +.sidebar-title { + color: white; + background-color: #004e49; + padding: 0em 0em 0em 0.3em; +} + +.float-right { + margin: 0 0 1em 1em; + padding: 1em; + color: #004e49; + background-color: white; + display: inline-block; + float: right; + width: inherit; +} +.float-left { + margin: 0 0 1em 1em; + padding: 1em; + color: #004e49; + background-color: white; + display: inline-block; + float: left; + width: inherit; +} +iv.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + diff --git a/NvCloth/docs/documentation/_static/bootstrap.css b/NvCloth/docs/documentation/_static/bootstrap.css new file mode 100644 index 0000000..5b7fe7e --- /dev/null +++ b/NvCloth/docs/documentation/_static/bootstrap.css @@ -0,0 +1,6167 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover, +a.text-success:focus { + color: #356635; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #dff0d8; +} + +.table tbody tr.error > td { + background-color: #f2dede; +} + +.table tbody tr.warning > td { + background-color: #fcf8e3; +} + +.table tbody tr.info > td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/NvCloth/docs/documentation/_static/bootstrap.js b/NvCloth/docs/documentation/_static/bootstrap.js new file mode 100644 index 0000000..44109f6 --- /dev/null +++ b/NvCloth/docs/documentation/_static/bootstrap.js @@ -0,0 +1,2280 @@ +/* =================================================== + * bootstrap-transition.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#transitions + * =================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.jQuery);/* ========================================================== + * bootstrap-alert.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#alerts + * ========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery);/* ============================================================ + * bootstrap-button.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#buttons + * ============================================================ + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.jQuery);/* ========================================================== + * bootstrap-carousel.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#carousel + * ========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.jQuery);/* ============================================================= + * bootstrap-collapse.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#collapse + * ============================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.jQuery);/* ============================================================ + * bootstrap-dropdown.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#dropdowns + * ============================================================ + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement) { + // if mobile we we use a backdrop because click events don't delegate + $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus) + } + $parent.toggleClass('open') + } + + $this.focus() + + return false + } + + , keydown: function (e) { + var $this + , $items + , $active + , $parent + , isActive + , index + + if (!/(38|40|27)/.test(e.keyCode)) return + + $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + if (!isActive || (isActive && e.keyCode == 27)) { + if (e.which == 27) $parent.find(toggle).focus() + return $this.click() + } + + $items = $('[role=menu] li:not(.divider):visible a', $parent) + + if (!$items.length) return + + index = $items.index($items.filter(':focus')) + + if (e.keyCode == 38 && index > 0) index-- // up + if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items + .eq(index) + .focus() + } + + } + + function clearMenus() { + $('.dropdown-backdrop').remove() + $(toggle).each(function () { + getParent($(this)).removeClass('open') + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = selector && $(selector) + + if (!$parent || !$parent.length) $parent = $this.parent() + + return $parent + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.dropdown + + $.fn.dropdown = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* DROPDOWN NO CONFLICT + * ==================== */ + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(document) + .on('click.dropdown.data-api', clearMenus) + .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) + .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) + +}(window.jQuery); +/* ========================================================= + * bootstrap-modal.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#modals + * ========================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + this.options.remote && this.$element.find('.modal-body').load(this.options.remote) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element.show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : + that.$element.focus().trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal() + } + + , enforceFocus: function () { + var that = this + $(document).on('focusin.modal', function (e) { + if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { + that.$element.focus() + } + }) + } + + , escape: function () { + var that = this + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + } + + , hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + that.hideModal() + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + that.hideModal() + }) + } + + , hideModal: function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.removeBackdrop() + that.$element.trigger('hidden') + }) + } + + , removeBackdrop: function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + , backdrop: function (callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') + .appendTo(document.body) + + this.$backdrop.click( + this.options.backdrop == 'static' ? + $.proxy(this.$element[0].focus, this.$element[0]) + : $.proxy(this.hide, this) + ) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop.one($.support.transition.end, callback) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + $.support.transition && this.$element.hasClass('fade')? + this.$backdrop.one($.support.transition.end, callback) : + callback() + + } else if (callback) { + callback() + } + } + } + + + /* MODAL PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.modal + + $.fn.modal = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('modal') + , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option]() + else if (options.show) data.show() + }) + } + + $.fn.modal.defaults = { + backdrop: true + , keyboard: true + , show: true + } + + $.fn.modal.Constructor = Modal + + + /* MODAL NO CONFLICT + * ================= */ + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + /* MODAL DATA-API + * ============== */ + + $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + , href = $this.attr('href') + , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7 + , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data()) + + e.preventDefault() + + $target + .modal(option) + .one('hide', function () { + $this.focus() + }) + }) + +}(window.jQuery); +/* =========================================================== + * bootstrap-tooltip.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#tooltips + * Inspired by the original jQuery.tipsy by Jason Frame + * =========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* TOOLTIP PUBLIC CLASS DEFINITION + * =============================== */ + + var Tooltip = function (element, options) { + this.init('tooltip', element, options) + } + + Tooltip.prototype = { + + constructor: Tooltip + + , init: function (type, element, options) { + var eventIn + , eventOut + , triggers + , trigger + , i + + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.enabled = true + + triggers = this.options.trigger.split(' ') + + for (i = triggers.length; i--;) { + trigger = triggers[i] + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + eventIn = trigger == 'hover' ? 'mouseenter' : 'focus' + eventOut = trigger == 'hover' ? 'mouseleave' : 'blur' + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + , getOptions: function (options) { + options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay + , hide: options.delay + } + } + + return options + } + + , enter: function (e) { + var defaults = $.fn[this.type].defaults + , options = {} + , self + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }, this) + + self = $(e.currentTarget)[this.type](options).data(this.type) + + if (!self.options.delay || !self.options.delay.show) return self.show() + + clearTimeout(this.timeout) + self.hoverState = 'in' + this.timeout = setTimeout(function() { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + , leave: function (e) { + var self = $(e.currentTarget)[this.type](this._options).data(this.type) + + if (this.timeout) clearTimeout(this.timeout) + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.hoverState = 'out' + this.timeout = setTimeout(function() { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + , show: function () { + var $tip + , pos + , actualWidth + , actualHeight + , placement + , tp + , e = $.Event('show') + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $tip = this.tip() + this.setContent() + + if (this.options.animation) { + $tip.addClass('fade') + } + + placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + + pos = this.getPosition() + + actualWidth = $tip[0].offsetWidth + actualHeight = $tip[0].offsetHeight + + switch (placement) { + case 'bottom': + tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} + break + case 'top': + tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} + break + case 'left': + tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} + break + case 'right': + tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} + break + } + + this.applyPlacement(tp, placement) + this.$element.trigger('shown') + } + } + + , applyPlacement: function(offset, placement){ + var $tip = this.tip() + , width = $tip[0].offsetWidth + , height = $tip[0].offsetHeight + , actualWidth + , actualHeight + , delta + , replace + + $tip + .offset(offset) + .addClass(placement) + .addClass('in') + + actualWidth = $tip[0].offsetWidth + actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + replace = true + } + + if (placement == 'bottom' || placement == 'top') { + delta = 0 + + if (offset.left < 0){ + delta = offset.left * -2 + offset.left = 0 + $tip.offset(offset) + actualWidth = $tip[0].offsetWidth + actualHeight = $tip[0].offsetHeight + } + + this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') + } else { + this.replaceArrow(actualHeight - height, actualHeight, 'top') + } + + if (replace) $tip.offset(offset) + } + + , replaceArrow: function(delta, dimension, position){ + this + .arrow() + .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '') + } + + , setContent: function () { + var $tip = this.tip() + , title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + , hide: function () { + var that = this + , $tip = this.tip() + , e = $.Event('hide') + + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + function removeWithAnimation() { + var timeout = setTimeout(function () { + $tip.off($.support.transition.end).detach() + }, 500) + + $tip.one($.support.transition.end, function () { + clearTimeout(timeout) + $tip.detach() + }) + } + + $.support.transition && this.$tip.hasClass('fade') ? + removeWithAnimation() : + $tip.detach() + + this.$element.trigger('hidden') + + return this + } + + , fixTitle: function () { + var $e = this.$element + if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + , hasContent: function () { + return this.getTitle() + } + + , getPosition: function () { + var el = this.$element[0] + return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { + width: el.offsetWidth + , height: el.offsetHeight + }, this.$element.offset()) + } + + , getTitle: function () { + var title + , $e = this.$element + , o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + , tip: function () { + return this.$tip = this.$tip || $(this.options.template) + } + + , arrow: function(){ + return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow") + } + + , validate: function () { + if (!this.$element[0].parentNode) { + this.hide() + this.$element = null + this.options = null + } + } + + , enable: function () { + this.enabled = true + } + + , disable: function () { + this.enabled = false + } + + , toggleEnabled: function () { + this.enabled = !this.enabled + } + + , toggle: function (e) { + var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this + self.tip().hasClass('in') ? self.hide() : self.show() + } + + , destroy: function () { + this.hide().$element.off('.' + this.type).removeData(this.type) + } + + } + + + /* TOOLTIP PLUGIN DEFINITION + * ========================= */ + + var old = $.fn.tooltip + + $.fn.tooltip = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tooltip') + , options = typeof option == 'object' && option + if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.tooltip.Constructor = Tooltip + + $.fn.tooltip.defaults = { + animation: true + , placement: 'top' + , selector: false + , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' + , trigger: 'hover focus' + , title: '' + , delay: 0 + , html: false + , container: false + } + + + /* TOOLTIP NO CONFLICT + * =================== */ + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(window.jQuery); +/* =========================================================== + * bootstrap-popover.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#popovers + * =========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * =========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* POPOVER PUBLIC CLASS DEFINITION + * =============================== */ + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + + /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js + ========================================== */ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { + + constructor: Popover + + , setContent: function () { + var $tip = this.tip() + , title = this.getTitle() + , content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) + + $tip.removeClass('fade top bottom left right in') + } + + , hasContent: function () { + return this.getTitle() || this.getContent() + } + + , getContent: function () { + var content + , $e = this.$element + , o = this.options + + content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) + || $e.attr('data-content') + + return content + } + + , tip: function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + } + return this.$tip + } + + , destroy: function () { + this.hide().$element.off('.' + this.type).removeData(this.type) + } + + }) + + + /* POPOVER PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.popover + + $.fn.popover = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('popover') + , options = typeof option == 'object' && option + if (!data) $this.data('popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.popover.Constructor = Popover + + $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { + placement: 'right' + , trigger: 'click' + , content: '' + , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' + }) + + + /* POPOVER NO CONFLICT + * =================== */ + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(window.jQuery); +/* ============================================================= + * bootstrap-scrollspy.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#scrollspy + * ============================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ============================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* SCROLLSPY CLASS DEFINITION + * ========================== */ + + function ScrollSpy(element, options) { + var process = $.proxy(this.process, this) + , $element = $(element).is('body') ? $(window) : $(element) + , href + this.options = $.extend({}, $.fn.scrollspy.defaults, options) + this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process) + this.selector = (this.options.target + || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + || '') + ' .nav li > a' + this.$body = $('body') + this.refresh() + this.process() + } + + ScrollSpy.prototype = { + + constructor: ScrollSpy + + , refresh: function () { + var self = this + , $targets + + this.offsets = $([]) + this.targets = $([]) + + $targets = this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + , href = $el.data('target') || $el.attr('href') + , $href = /^#\w/.test(href) && $(href) + return ( $href + && $href.length + && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + self.offsets.push(this[0]) + self.targets.push(this[1]) + }) + } + + , process: function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight + , maxScroll = scrollHeight - this.$scrollElement.height() + , offsets = this.offsets + , targets = this.targets + , activeTarget = this.activeTarget + , i + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets.last()[0]) + && this.activate ( i ) + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) + && this.activate( targets[i] ) + } + } + + , activate: function (target) { + var active + , selector + + this.activeTarget = target + + $(this.selector) + .parent('.active') + .removeClass('active') + + selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + active = $(selector) + .parent('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active.closest('li.dropdown').addClass('active') + } + + active.trigger('activate') + } + + } + + + /* SCROLLSPY PLUGIN DEFINITION + * =========================== */ + + var old = $.fn.scrollspy + + $.fn.scrollspy = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('scrollspy') + , options = typeof option == 'object' && option + if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.scrollspy.Constructor = ScrollSpy + + $.fn.scrollspy.defaults = { + offset: 10 + } + + + /* SCROLLSPY NO CONFLICT + * ===================== */ + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + /* SCROLLSPY DATA-API + * ================== */ + + $(window).on('load', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + $spy.scrollspy($spy.data()) + }) + }) + +}(window.jQuery);/* ======================================================== + * bootstrap-tab.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#tabs + * ======================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ======================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* TAB CLASS DEFINITION + * ==================== */ + + var Tab = function (element) { + this.element = $(element) + } + + Tab.prototype = { + + constructor: Tab + + , show: function () { + var $this = this.element + , $ul = $this.closest('ul:not(.dropdown-menu)') + , selector = $this.attr('data-target') + , previous + , $target + , e + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + if ( $this.parent('li').hasClass('active') ) return + + previous = $ul.find('.active:last a')[0] + + e = $.Event('show', { + relatedTarget: previous + }) + + $this.trigger(e) + + if (e.isDefaultPrevented()) return + + $target = $(selector) + + this.activate($this.parent('li'), $ul) + this.activate($target, $target.parent(), function () { + $this.trigger({ + type: 'shown' + , relatedTarget: previous + }) + }) + } + + , activate: function ( element, container, callback) { + var $active = container.find('> .active') + , transition = callback + && $.support.transition + && $active.hasClass('fade') + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + + element.addClass('active') + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if ( element.parent('.dropdown-menu') ) { + element.closest('li.dropdown').addClass('active') + } + + callback && callback() + } + + transition ? + $active.one($.support.transition.end, next) : + next() + + $active.removeClass('in') + } + } + + + /* TAB PLUGIN DEFINITION + * ===================== */ + + var old = $.fn.tab + + $.fn.tab = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tab') + if (!data) $this.data('tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.tab.Constructor = Tab + + + /* TAB NO CONFLICT + * =============== */ + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + /* TAB DATA-API + * ============ */ + + $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { + e.preventDefault() + $(this).tab('show') + }) + +}(window.jQuery);/* ============================================================= + * bootstrap-typeahead.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#typeahead + * ============================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ============================================================ */ + + +!function($){ + + "use strict"; // jshint ;_; + + + /* TYPEAHEAD PUBLIC CLASS DEFINITION + * ================================= */ + + var Typeahead = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.typeahead.defaults, options) + this.matcher = this.options.matcher || this.matcher + this.sorter = this.options.sorter || this.sorter + this.highlighter = this.options.highlighter || this.highlighter + this.updater = this.options.updater || this.updater + this.source = this.options.source + this.$menu = $(this.options.menu) + this.shown = false + this.listen() + } + + Typeahead.prototype = { + + constructor: Typeahead + + , select: function () { + var val = this.$menu.find('.active').attr('data-value') + this.$element + .val(this.updater(val)) + .change() + return this.hide() + } + + , updater: function (item) { + return item + } + + , show: function () { + var pos = $.extend({}, this.$element.position(), { + height: this.$element[0].offsetHeight + }) + + this.$menu + .insertAfter(this.$element) + .css({ + top: pos.top + pos.height + , left: pos.left + }) + .show() + + this.shown = true + return this + } + + , hide: function () { + this.$menu.hide() + this.shown = false + return this + } + + , lookup: function (event) { + var items + + this.query = this.$element.val() + + if (!this.query || this.query.length < this.options.minLength) { + return this.shown ? this.hide() : this + } + + items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source + + return items ? this.process(items) : this + } + + , process: function (items) { + var that = this + + items = $.grep(items, function (item) { + return that.matcher(item) + }) + + items = this.sorter(items) + + if (!items.length) { + return this.shown ? this.hide() : this + } + + return this.render(items.slice(0, this.options.items)).show() + } + + , matcher: function (item) { + return ~item.toLowerCase().indexOf(this.query.toLowerCase()) + } + + , sorter: function (items) { + var beginswith = [] + , caseSensitive = [] + , caseInsensitive = [] + , item + + while (item = items.shift()) { + if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) + else if (~item.indexOf(this.query)) caseSensitive.push(item) + else caseInsensitive.push(item) + } + + return beginswith.concat(caseSensitive, caseInsensitive) + } + + , highlighter: function (item) { + var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') + return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { + return '<strong>' + match + '</strong>' + }) + } + + , render: function (items) { + var that = this + + items = $(items).map(function (i, item) { + i = $(that.options.item).attr('data-value', item) + i.find('a').html(that.highlighter(item)) + return i[0] + }) + + items.first().addClass('active') + this.$menu.html(items) + return this + } + + , next: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , next = active.next() + + if (!next.length) { + next = $(this.$menu.find('li')[0]) + } + + next.addClass('active') + } + + , prev: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , prev = active.prev() + + if (!prev.length) { + prev = this.$menu.find('li').last() + } + + prev.addClass('active') + } + + , listen: function () { + this.$element + .on('focus', $.proxy(this.focus, this)) + .on('blur', $.proxy(this.blur, this)) + .on('keypress', $.proxy(this.keypress, this)) + .on('keyup', $.proxy(this.keyup, this)) + + if (this.eventSupported('keydown')) { + this.$element.on('keydown', $.proxy(this.keydown, this)) + } + + this.$menu + .on('click', $.proxy(this.click, this)) + .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) + .on('mouseleave', 'li', $.proxy(this.mouseleave, this)) + } + + , eventSupported: function(eventName) { + var isSupported = eventName in this.$element + if (!isSupported) { + this.$element.setAttribute(eventName, 'return;') + isSupported = typeof this.$element[eventName] === 'function' + } + return isSupported + } + + , move: function (e) { + if (!this.shown) return + + switch(e.keyCode) { + case 9: // tab + case 13: // enter + case 27: // escape + e.preventDefault() + break + + case 38: // up arrow + e.preventDefault() + this.prev() + break + + case 40: // down arrow + e.preventDefault() + this.next() + break + } + + e.stopPropagation() + } + + , keydown: function (e) { + this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]) + this.move(e) + } + + , keypress: function (e) { + if (this.suppressKeyPressRepeat) return + this.move(e) + } + + , keyup: function (e) { + switch(e.keyCode) { + case 40: // down arrow + case 38: // up arrow + case 16: // shift + case 17: // ctrl + case 18: // alt + break + + case 9: // tab + case 13: // enter + if (!this.shown) return + this.select() + break + + case 27: // escape + if (!this.shown) return + this.hide() + break + + default: + this.lookup() + } + + e.stopPropagation() + e.preventDefault() + } + + , focus: function (e) { + this.focused = true + } + + , blur: function (e) { + this.focused = false + if (!this.mousedover && this.shown) this.hide() + } + + , click: function (e) { + e.stopPropagation() + e.preventDefault() + this.select() + this.$element.focus() + } + + , mouseenter: function (e) { + this.mousedover = true + this.$menu.find('.active').removeClass('active') + $(e.currentTarget).addClass('active') + } + + , mouseleave: function (e) { + this.mousedover = false + if (!this.focused && this.shown) this.hide() + } + + } + + + /* TYPEAHEAD PLUGIN DEFINITION + * =========================== */ + + var old = $.fn.typeahead + + $.fn.typeahead = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('typeahead') + , options = typeof option == 'object' && option + if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.typeahead.defaults = { + source: [] + , items: 8 + , menu: '<ul class="typeahead dropdown-menu"></ul>' + , item: '<li><a href="#"></a></li>' + , minLength: 1 + } + + $.fn.typeahead.Constructor = Typeahead + + + /* TYPEAHEAD NO CONFLICT + * =================== */ + + $.fn.typeahead.noConflict = function () { + $.fn.typeahead = old + return this + } + + + /* TYPEAHEAD DATA-API + * ================== */ + + $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { + var $this = $(this) + if ($this.data('typeahead')) return + $this.typeahead($this.data()) + }) + +}(window.jQuery); +/* ========================================================== + * bootstrap-affix.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#affix + * ========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed 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. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* AFFIX CLASS DEFINITION + * ====================== */ + + var Affix = function (element, options) { + this.options = $.extend({}, $.fn.affix.defaults, options) + this.$window = $(window) + .on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) + this.$element = $(element) + this.checkPosition() + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var scrollHeight = $(document).height() + , scrollTop = this.$window.scrollTop() + , position = this.$element.offset() + , offset = this.options.offset + , offsetBottom = offset.bottom + , offsetTop = offset.top + , reset = 'affix affix-top affix-bottom' + , affix + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top() + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() + + affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? + false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? + 'bottom' : offsetTop != null && scrollTop <= offsetTop ? + 'top' : false + + if (this.affixed === affix) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? position.top - scrollTop : null + + this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) + } + + + /* AFFIX PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.affix + + $.fn.affix = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('affix') + , options = typeof option == 'object' && option + if (!data) $this.data('affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.affix.Constructor = Affix + + $.fn.affix.defaults = { + offset: 0 + } + + + /* AFFIX NO CONFLICT + * ================= */ + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + /* AFFIX DATA-API + * ============== */ + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + , data = $spy.data() + + data.offset = data.offset || {} + + data.offsetBottom && (data.offset.bottom = data.offsetBottom) + data.offsetTop && (data.offset.top = data.offsetTop) + + $spy.affix(data) + }) + }) + + +}(window.jQuery);
\ No newline at end of file diff --git a/NvCloth/docs/documentation/_static/collapse.png b/NvCloth/docs/documentation/_static/collapse.png Binary files differnew file mode 100644 index 0000000..fe0257e --- /dev/null +++ b/NvCloth/docs/documentation/_static/collapse.png diff --git a/NvCloth/docs/documentation/_static/default.css b/NvCloth/docs/documentation/_static/default.css index 1a8628b..6cc008b 100644 --- a/NvCloth/docs/documentation/_static/default.css +++ b/NvCloth/docs/documentation/_static/default.css @@ -1,255 +1,68 @@ -/* - * default.css_t - * ~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- default theme. - * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: sans-serif; - font-size: 100%; - background-color: #113300; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - background-color: #1c4e63; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 230px; -} - -div.body { - background-color: #ffffff; - color: #000000; - padding: 0 20px 30px 20px; -} - -div.footer { - color: #ffffff; - width: 100%; - padding: 9px 0 9px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: #ffffff; - text-decoration: underline; -} - -div.related { - background-color: #113300; - line-height: 30px; - color: #ffffff; -} - -div.related a { - color: #ffffff; -} - -div.sphinxsidebar { -} - -div.sphinxsidebar h3 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.4em; - font-weight: normal; - margin: 0; - padding: 0; -} - -div.sphinxsidebar h3 a { - color: #ffffff; -} - -div.sphinxsidebar h4 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.3em; - font-weight: normal; - margin: 5px 0 0 0; - padding: 0; -} - -div.sphinxsidebar p { - color: #ffffff; -} - -div.sphinxsidebar p.topless { - margin: 5px 10px 10px 10px; -} - -div.sphinxsidebar ul { - margin: 10px; - padding: 0; - color: #ffffff; -} - -div.sphinxsidebar a { - color: #98dbcc; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - - -/* -- hyperlink styles ------------------------------------------------------ */ - -a { - color: #339900; - text-decoration: none; -} - -a:visited { - color: #355f7c; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - - - -/* -- body styles ----------------------------------------------------------- */ - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Trebuchet MS', sans-serif; - background-color: #339900; - font-weight: normal; - color: #ffffff; - border-bottom: 1px solid #ccc; - margin: 20px -20px 10px -20px; - padding: 3px 0 3px 10px; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 160%; } -div.body h3 { font-size: 140%; } -div.body h4 { font-size: 120%; } -div.body h5 { font-size: 110%; } -div.body h6 { font-size: 100%; } - a.headerlink { - color: #c60f0f; + color: #ffffff; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -div.body p, div.body dd, div.body li { - text-align: justify; - line-height: 130%; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.admonition p { - margin-bottom: 5px; -} - -div.admonition pre { - margin-bottom: 5px; -} - -div.admonition ul, div.admonition ol { - margin-bottom: 5px; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; + background-color: #ffffff; + color: #c60f0f; } -p.admonition-title { - display: inline; +#sidebar_toc ul { + list-style-type: none; + padding-left: 10px; } -p.admonition-title:after { - content: ":"; +.toc_handle { + background : transparent + url(space.gif); + background-repeat : no-repeat; + background-position: center bottom; + display : block; + float : left; + width : 14px; + height : 19px; } -pre { - padding: 5px; - background-color: #eeffcc; - color: #333333; - line-height: 120%; - border: 1px solid #ac9; - border-left: none; - border-right: none; +.toc_collapsed { + background : transparent + url(expand.png); + background-repeat : no-repeat; + background-position: center bottom; + cursor : pointer; } -tt { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; +.toc_expanded { + background : transparent + url(collapse.png); + background-repeat : no-repeat; + background-position: center bottom; + cursor : pointer; } -th { - background-color: #ede; +body { + -webkit-animation-duration: 0.1s; + -webkit-animation-name: fontfix; + -webkit-animation-iteration-count: 1; + -webkit-animation-timing-function: linear; + -webkit-animation-delay: 0.5s; } -.warning tt { - background: #efc2c2; +@-webkit-keyframes fontfix{ + from{ opacity: 1; } + to{ opacity: 1; } } -.note tt { - background: #d6d6d6; +img.floatleft{ + float: left } -.viewcode-back { - font-family: sans-serif; +img.floatright{ + float:right } -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; +img.floatcenter{ + float:center }
\ No newline at end of file diff --git a/NvCloth/docs/documentation/_static/developerzone_gameworks_logo.png b/NvCloth/docs/documentation/_static/developerzone_gameworks_logo.png Binary files differnew file mode 100644 index 0000000..29f9140 --- /dev/null +++ b/NvCloth/docs/documentation/_static/developerzone_gameworks_logo.png diff --git a/NvCloth/docs/documentation/_static/doctools.js b/NvCloth/docs/documentation/_static/doctools.js index eeea95e..8614442 100644 --- a/NvCloth/docs/documentation/_static/doctools.js +++ b/NvCloth/docs/documentation/_static/doctools.js @@ -2,9 +2,9 @@ * doctools.js * ~~~~~~~~~~~ * - * Sphinx JavaScript utilties for all documentation. + * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -32,7 +32,7 @@ if (!window.console || !console.firebug) { */ jQuery.urldecode = function(x) { return decodeURIComponent(x).replace(/\+/g, ' '); -} +}; /** * small helper function to urlencode strings @@ -62,18 +62,6 @@ jQuery.getQueryParameters = function(s) { }; /** - * small function to check if an array contains - * a given item. - */ -jQuery.contains = function(arr, item) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] == item) - return true; - } - return false; -}; - -/** * highlight a given string on a jquery object by wrapping it in * span elements with the given class name. */ @@ -185,9 +173,9 @@ var Documentation = { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); - $('<li class="highlight-link"><a href="javascript:Documentation.' + - 'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>') - .appendTo($('.sidebar .this-page-menu')); + $('<p class="highlight-link"><a href="javascript:Documentation.' + + 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>') + .appendTo($('#searchbox')); } }, @@ -213,7 +201,7 @@ var Documentation = { * helper function to hide the search marks again */ hideSearchWords : function() { - $('.sidebar .this-page-menu li.highlight-link').fadeOut(300); + $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, diff --git a/NvCloth/docs/documentation/_static/expand.png b/NvCloth/docs/documentation/_static/expand.png Binary files differnew file mode 100644 index 0000000..ba87cd7 --- /dev/null +++ b/NvCloth/docs/documentation/_static/expand.png diff --git a/NvCloth/docs/documentation/_static/jquery.cookie.js b/NvCloth/docs/documentation/_static/jquery.cookie.js new file mode 100644 index 0000000..feb62e9 --- /dev/null +++ b/NvCloth/docs/documentation/_static/jquery.cookie.js @@ -0,0 +1,117 @@ +/*! + * jQuery Cookie Plugin v1.4.1 + * https://github.com/carhartl/jquery-cookie + * + * Copyright 2006, 2014 Klaus Hartl + * Released under the MIT license + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var pluses = /\+/g; + + function encode(s) { + return config.raw ? s : encodeURIComponent(s); + } + + function decode(s) { + return config.raw ? s : decodeURIComponent(s); + } + + function stringifyCookieValue(value) { + return encode(config.json ? JSON.stringify(value) : String(value)); + } + + function parseCookieValue(s) { + if (s.indexOf('"') === 0) { + // This is a quoted cookie as according to RFC2068, unescape... + s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); + } + + try { + // Replace server-side written pluses with spaces. + // If we can't decode the cookie, ignore it, it's unusable. + // If we can't parse the cookie, ignore it, it's unusable. + s = decodeURIComponent(s.replace(pluses, ' ')); + return config.json ? JSON.parse(s) : s; + } catch(e) {} + } + + function read(s, converter) { + var value = config.raw ? s : parseCookieValue(s); + return $.isFunction(converter) ? converter(value) : value; + } + + var config = $.cookie = function (key, value, options) { + + // Write + + if (arguments.length > 1 && !$.isFunction(value)) { + options = $.extend({}, config.defaults, options); + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setTime(+t + days * 864e+5); + } + + return (document.cookie = [ + encode(key), '=', stringifyCookieValue(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // Read + + var result = key ? undefined : {}; + + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. Also prevents odd result when + // calling $.cookie(). + var cookies = document.cookie ? document.cookie.split('; ') : []; + + for (var i = 0, l = cookies.length; i < l; i++) { + var parts = cookies[i].split('='); + var name = decode(parts.shift()); + var cookie = parts.join('='); + + if (key && key === name) { + // If second argument (value) is a function it's a converter... + result = read(cookie, value); + break; + } + + // Prevent storing a cookie that we couldn't decode. + if (!key && (cookie = read(cookie)) !== undefined) { + result[name] = cookie; + } + } + + return result; + }; + + config.defaults = {}; + + $.removeCookie = function (key, options) { + if ($.cookie(key) === undefined) { + return false; + } + + // Must not alter options, thus extending a fresh object... + $.cookie(key, '', $.extend({}, options, { expires: -1 })); + return !$.cookie(key); + }; + +})); diff --git a/NvCloth/docs/documentation/_static/jquery.js b/NvCloth/docs/documentation/_static/jquery.js index 7c24308..3883779 100644 --- a/NvCloth/docs/documentation/_static/jquery.js +++ b/NvCloth/docs/documentation/_static/jquery.js @@ -1,154 +1,2 @@ -/*! - * jQuery JavaScript Library v1.4.2 - * http://jquery.com/ - * - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2010, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Sat Feb 13 22:33:48 2010 -0500 - */ -(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i? -e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r= -j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g, -"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e= -true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, -Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& -(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, -a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== -"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, -function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)|| -c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded", -L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype, -"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+ -a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f], -d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]=== -a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&& -!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari= -true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; -var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, -parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= -false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= -s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, -applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; -else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, -a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== -w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, -cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ", -i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ", -" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className= -this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i= -e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= -c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); -a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, -function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); -k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), -C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!= -null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type= -e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& -f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; -if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), -fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| -d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this, -"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent= -a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y, -isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit= -{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}}; -if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", -e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, -"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, -d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&& -!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}}, -toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector, -u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "), -function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q]; -if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, -e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); -t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| -g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[]; -for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length- -1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, -CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}}, -relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]= -l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[]; -h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, -CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, -g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, -text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, -setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= -h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m= -m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== -"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, -h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition|| -!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m= -h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& -q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>"; -if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); -(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: -function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/, -gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length; -c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= -{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== -"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", -d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? -a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== -1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)? -a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= -c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, -wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, -prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, -this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); -return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, -""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&& -this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]|| -u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length=== -1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); -return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", -""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= -c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? -c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= -function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= -Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, -"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= -a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= -a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== -"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, -serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), -function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, -global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& -e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? -"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== -false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= -false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", -c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| -d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); -g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== -1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== -"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; -if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay"); -this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a], -"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)}, -animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing= -j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]); -this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== -"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| -c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; -this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= -this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, -e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length|| -c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement? -function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b= -this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle; -k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&& -f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; -a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); -c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, -d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- -f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": -"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in -e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); +/*! jQuery v1.8.3 jquery.com | jquery.org/license */ +(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);
\ No newline at end of file diff --git a/NvCloth/docs/documentation/_static/jquery.storageapi.js b/NvCloth/docs/documentation/_static/jquery.storageapi.js new file mode 100644 index 0000000..0331d44 --- /dev/null +++ b/NvCloth/docs/documentation/_static/jquery.storageapi.js @@ -0,0 +1,451 @@ +/* + * jQuery Storage API Plugin + * + * Copyright (c) 2013 Julien Maurel + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Project home: + * https://github.com/julien-maurel/jQuery-Storage-API + * + * Version: 1.7.3 + * + */ +(function (factory) { + if(typeof define==='function' && define.amd){ + // AMD + define(['jquery'],factory); + }else if(typeof exports==='object') { + // CommonJS + factory(require('jquery')); + }else { + // Browser globals + factory(jQuery); + } +}(function($){ + // Prefix to use with cookie fallback + var cookie_local_prefix="ls_"; + var cookie_session_prefix="ss_"; + + // Get items from a storage + function _get(storage){ + var l=arguments.length,s=window[storage],a=arguments,a1=a[1],vi,ret,tmp; + if(l<2) throw new Error('Minimum 2 arguments must be given'); + else if($.isArray(a1)){ + // If second argument is an array, return an object with value of storage for each item in this array + ret={}; + for(var i in a1){ + vi=a1[i]; + try{ + ret[vi]=JSON.parse(s.getItem(vi)); + }catch(e){ + ret[vi]=s.getItem(vi); + } + } + return ret; + }else if(l==2){ + // If only 2 arguments, return value directly + try{ + return JSON.parse(s.getItem(a1)); + }catch(e){ + return s.getItem(a1); + } + }else{ + // If more than 2 arguments, parse storage to retrieve final value to return it + // Get first level + try{ + ret=JSON.parse(s.getItem(a1)); + }catch(e){ + throw new ReferenceError(a1+' is not defined in this storage'); + } + // Parse next levels + for(var i=2;i<l-1;i++){ + ret=ret[a[i]]; + if(ret===undefined) throw new ReferenceError([].slice.call(a,1,i+1).join('.')+' is not defined in this storage'); + } + // If last argument is an array, return an object with value for each item in this array + // Else return value normally + if($.isArray(a[i])){ + tmp=ret; + ret={}; + for(var j in a[i]){ + ret[a[i][j]]=tmp[a[i][j]]; + } + return ret; + }else{ + return ret[a[i]]; + } + } + } + + // Set items of a storage + function _set(storage){ + var l=arguments.length,s=window[storage],a=arguments,a1=a[1],a2=a[2],vi,to_store={},tmp; + if(l<2 || !$.isPlainObject(a1) && l<3) throw new Error('Minimum 3 arguments must be given or second parameter must be an object'); + else if($.isPlainObject(a1)){ + // If first argument is an object, set values of storage for each property of this object + for(var i in a1){ + vi=a1[i]; + if(!$.isPlainObject(vi)) s.setItem(i,vi); + else s.setItem(i,JSON.stringify(vi)); + } + return a1; + }else if(l==3){ + // If only 3 arguments, set value of storage directly + if(typeof a2==='object') s.setItem(a1,JSON.stringify(a2)); + else s.setItem(a1,a2); + return a2; + }else{ + // If more than 3 arguments, parse storage to retrieve final node and set value + // Get first level + try{ + tmp=s.getItem(a1); + if(tmp!=null) { + to_store=JSON.parse(tmp); + } + }catch(e){ + } + tmp=to_store; + // Parse next levels and set value + for(var i=2;i<l-2;i++){ + vi=a[i]; + if(!tmp[vi] || !$.isPlainObject(tmp[vi])) tmp[vi]={}; + tmp=tmp[vi]; + } + tmp[a[i]]=a[i+1]; + s.setItem(a1,JSON.stringify(to_store)); + return to_store; + } + } + + // Remove items from a storage + function _remove(storage){ + var l=arguments.length,s=window[storage],a=arguments,a1=a[1],to_store,tmp; + if(l<2) throw new Error('Minimum 2 arguments must be given'); + else if($.isArray(a1)){ + // If first argument is an array, remove values from storage for each item of this array + for(var i in a1){ + s.removeItem(a1[i]); + } + return true; + }else if(l==2){ + // If only 2 arguments, remove value from storage directly + s.removeItem(a1); + return true; + }else{ + // If more than 2 arguments, parse storage to retrieve final node and remove value + // Get first level + try{ + to_store=tmp=JSON.parse(s.getItem(a1)); + }catch(e){ + throw new ReferenceError(a1+' is not defined in this storage'); + } + // Parse next levels and remove value + for(var i=2;i<l-1;i++){ + tmp=tmp[a[i]]; + if(tmp===undefined) throw new ReferenceError([].slice.call(a,1,i).join('.')+' is not defined in this storage'); + } + // If last argument is an array,remove value for each item in this array + // Else remove value normally + if($.isArray(a[i])){ + for(var j in a[i]){ + delete tmp[a[i][j]]; + } + }else{ + delete tmp[a[i]]; + } + s.setItem(a1,JSON.stringify(to_store)); + return true; + } + } + + // Remove all items from a storage + function _removeAll(storage, reinit_ns){ + var keys=_keys(storage); + for(var i in keys){ + _remove(storage,keys[i]); + } + // Reinitialize all namespace storages + if(reinit_ns){ + for(var i in $.namespaceStorages){ + _createNamespace(i); + } + } + } + + // Check if items of a storage are empty + function _isEmpty(storage){ + var l=arguments.length,a=arguments,s=window[storage],a1=a[1]; + if(l==1){ + // If only one argument, test if storage is empty + return (_keys(storage).length==0); + }else if($.isArray(a1)){ + // If first argument is an array, test each item of this array and return true only if all items are empty + for(var i=0; i<a1.length;i++){ + if(!_isEmpty(storage,a1[i])) return false; + } + return true; + }else{ + // If more than 1 argument, try to get value and test it + try{ + var v=_get.apply(this, arguments); + // Convert result to an object (if last argument is an array, _get return already an object) and test each item + if(!$.isArray(a[l-1])) v={'totest':v}; + for(var i in v){ + if(!( + ($.isPlainObject(v[i]) && $.isEmptyObject(v[i])) || + ($.isArray(v[i]) && !v[i].length) || + (!v[i]) + )) return false; + } + return true; + }catch(e){ + return true; + } + } + } + + // Check if items of a storage exist + function _isSet(storage){ + var l=arguments.length,a=arguments,s=window[storage],a1=a[1]; + if(l<2) throw new Error('Minimum 2 arguments must be given'); + if($.isArray(a1)){ + // If first argument is an array, test each item of this array and return true only if all items exist + for(var i=0; i<a1.length;i++){ + if(!_isSet(storage,a1[i])) return false; + } + return true; + }else{ + // For other case, try to get value and test it + try{ + var v=_get.apply(this, arguments); + // Convert result to an object (if last argument is an array, _get return already an object) and test each item + if(!$.isArray(a[l-1])) v={'totest':v}; + for(var i in v){ + if(!(v[i]!==undefined && v[i]!==null)) return false; + } + return true; + }catch(e){ + return false; + } + } + } + + // Get keys of a storage or of an item of the storage + function _keys(storage){ + var l=arguments.length,s=window[storage],a=arguments,a1=a[1],keys=[],o={}; + // If more than 1 argument, get value from storage to retrieve keys + // Else, use storage to retrieve keys + if(l>1){ + o=_get.apply(this,a); + }else{ + o=s; + } + if(o._cookie){ + // If storage is a cookie, use $.cookie to retrieve keys + for(var key in $.cookie()){ + if(key!='') { + keys.push(key.replace(o._prefix,'')); + } + } + }else{ + for(var i in o){ + keys.push(i); + } + } + return keys; + } + + // Create new namespace storage + function _createNamespace(name){ + if(!name || typeof name!="string") throw new Error('First parameter must be a string'); + if(storage_available){ + if(!window.localStorage.getItem(name)) window.localStorage.setItem(name,'{}'); + if(!window.sessionStorage.getItem(name)) window.sessionStorage.setItem(name,'{}'); + }else{ + if(!window.localCookieStorage.getItem(name)) window.localCookieStorage.setItem(name,'{}'); + if(!window.sessionCookieStorage.getItem(name)) window.sessionCookieStorage.setItem(name,'{}'); + } + var ns={ + localStorage:$.extend({},$.localStorage,{_ns:name}), + sessionStorage:$.extend({},$.sessionStorage,{_ns:name}) + }; + if($.cookie){ + if(!window.cookieStorage.getItem(name)) window.cookieStorage.setItem(name,'{}'); + ns.cookieStorage=$.extend({},$.cookieStorage,{_ns:name}); + } + $.namespaceStorages[name]=ns; + return ns; + } + + // Test if storage is natively available on browser + function _testStorage(name){ + if(!window[name]) return false; + var foo='jsapi'; + try{ + window[name].setItem(foo,foo); + window[name].removeItem(foo); + return true; + }catch(e){ + return false; + } + } + + // Check if storages are natively available on browser + var storage_available=_testStorage('localStorage'); + + // Namespace object + var storage={ + _type:'', + _ns:'', + _callMethod:function(f,a){ + var p=[this._type],a=Array.prototype.slice.call(a),a0=a[0]; + if(this._ns) p.push(this._ns); + if(typeof a0==='string' && a0.indexOf('.')!==-1){ + a.shift(); + [].unshift.apply(a,a0.split('.')); + } + [].push.apply(p,a); + return f.apply(this,p); + }, + // Get items. If no parameters and storage have a namespace, return all namespace + get:function(){ + return this._callMethod(_get,arguments); + }, + // Set items + set:function(){ + var l=arguments.length,a=arguments,a0=a[0]; + if(l<1 || !$.isPlainObject(a0) && l<2) throw new Error('Minimum 2 arguments must be given or first parameter must be an object'); + // If first argument is an object and storage is a namespace storage, set values individually + if($.isPlainObject(a0) && this._ns){ + for(var i in a0){ + _set(this._type,this._ns,i,a0[i]); + } + return a0; + }else{ + var r=this._callMethod(_set,a); + if(this._ns) return r[a0.split('.')[0]]; + else return r; + } + }, + // Delete items + remove:function(){ + if(arguments.length<1) throw new Error('Minimum 1 argument must be given'); + return this._callMethod(_remove,arguments); + }, + // Delete all items + removeAll:function(reinit_ns){ + if(this._ns){ + _set(this._type,this._ns,{}); + return true; + }else{ + return _removeAll(this._type, reinit_ns); + } + }, + // Items empty + isEmpty:function(){ + return this._callMethod(_isEmpty,arguments); + }, + // Items exists + isSet:function(){ + if(arguments.length<1) throw new Error('Minimum 1 argument must be given'); + return this._callMethod(_isSet,arguments); + }, + // Get keys of items + keys:function(){ + return this._callMethod(_keys,arguments); + } + }; + + // Use jquery.cookie for compatibility with old browsers and give access to cookieStorage + if($.cookie){ + // sessionStorage is valid for one window/tab. To simulate that with cookie, we set a name for the window and use it for the name of the cookie + if(!window.name) window.name=Math.floor(Math.random()*100000000); + var cookie_storage={ + _cookie:true, + _prefix:'', + _expires:null, + _path:null, + _domain:null, + setItem:function(n,v){ + $.cookie(this._prefix+n,v,{expires:this._expires,path:this._path,domain:this._domain}); + }, + getItem:function(n){ + return $.cookie(this._prefix+n); + }, + removeItem:function(n){ + return $.removeCookie(this._prefix+n); + }, + clear:function(){ + for(var key in $.cookie()){ + if(key!=''){ + if(!this._prefix && key.indexOf(cookie_local_prefix)===-1 && key.indexOf(cookie_session_prefix)===-1 || this._prefix && key.indexOf(this._prefix)===0) { + $.removeCookie(key); + } + } + } + }, + setExpires:function(e){ + this._expires=e; + return this; + }, + setPath:function(p){ + this._path=p; + return this; + }, + setDomain:function(d){ + this._domain=d; + return this; + }, + setConf:function(c){ + if(c.path) this._path=c.path; + if(c.domain) this._domain=c.domain; + if(c.expires) this._expires=c.expires; + return this; + }, + setDefaultConf:function(){ + this._path=this._domain=this._expires=null; + } + }; + if(!storage_available){ + window.localCookieStorage=$.extend({},cookie_storage,{_prefix:cookie_local_prefix,_expires:365*10}); + window.sessionCookieStorage=$.extend({},cookie_storage,{_prefix:cookie_session_prefix+window.name+'_'}); + } + window.cookieStorage=$.extend({},cookie_storage); + // cookieStorage API + $.cookieStorage=$.extend({},storage,{ + _type:'cookieStorage', + setExpires:function(e){window.cookieStorage.setExpires(e); return this;}, + setPath:function(p){window.cookieStorage.setPath(p); return this;}, + setDomain:function(d){window.cookieStorage.setDomain(d); return this;}, + setConf:function(c){window.cookieStorage.setConf(c); return this;}, + setDefaultConf:function(){window.cookieStorage.setDefaultConf(); return this;} + }); + } + + // Get a new API on a namespace + $.initNamespaceStorage=function(ns){ return _createNamespace(ns); }; + if(storage_available) { + // localStorage API + $.localStorage=$.extend({},storage,{_type:'localStorage'}); + // sessionStorage API + $.sessionStorage=$.extend({},storage,{_type:'sessionStorage'}); + }else{ + // localStorage API + $.localStorage=$.extend({},storage,{_type:'localCookieStorage'}); + // sessionStorage API + $.sessionStorage=$.extend({},storage,{_type:'sessionCookieStorage'}); + } + // List of all namespace storage + $.namespaceStorages={}; + // Remove all items in all storages + $.removeAllStorages=function(reinit_ns){ + $.localStorage.removeAll(reinit_ns); + $.sessionStorage.removeAll(reinit_ns); + if($.cookieStorage) $.cookieStorage.removeAll(reinit_ns); + if(!reinit_ns){ + $.namespaceStorages={}; + } + } +})); diff --git a/NvCloth/docs/documentation/_static/nvidia-logo-header.png b/NvCloth/docs/documentation/_static/nvidia-logo-header.png Binary files differnew file mode 100644 index 0000000..cc60684 --- /dev/null +++ b/NvCloth/docs/documentation/_static/nvidia-logo-header.png diff --git a/NvCloth/docs/documentation/_static/pygments.css b/NvCloth/docs/documentation/_static/pygments.css index 64d80e6..d79caa1 100644 --- a/NvCloth/docs/documentation/_static/pygments.css +++ b/NvCloth/docs/documentation/_static/pygments.css @@ -1,34 +1,62 @@ .highlight .hll { background-color: #ffffcc } -.highlight { background: #ffffff; } -.highlight .c { color: #008000 } /* Comment */ +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #0000ff } /* Keyword */ -.highlight .cm { color: #008000 } /* Comment.Multiline */ -.highlight .cp { color: #0000ff } /* Comment.Preproc */ -.highlight .c1 { color: #008000 } /* Comment.Single */ -.highlight .cs { color: #008000 } /* Comment.Special */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gh { font-weight: bold } /* Generic.Heading */ -.highlight .gp { font-weight: bold } /* Generic.Prompt */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { font-weight: bold } /* Generic.Subheading */ -.highlight .kc { color: #0000ff } /* Keyword.Constant */ -.highlight .kd { color: #0000ff } /* Keyword.Declaration */ -.highlight .kn { color: #0000ff } /* Keyword.Namespace */ -.highlight .kp { color: #0000ff } /* Keyword.Pseudo */ -.highlight .kr { color: #0000ff } /* Keyword.Reserved */ -.highlight .kt { color: #2b91af } /* Keyword.Type */ -.highlight .s { color: #a31515 } /* Literal.String */ -.highlight .nc { color: #2b91af } /* Name.Class */ -.highlight .ow { color: #0000ff } /* Operator.Word */ -.highlight .sb { color: #a31515 } /* Literal.String.Backtick */ -.highlight .sc { color: #a31515 } /* Literal.String.Char */ -.highlight .sd { color: #a31515 } /* Literal.String.Doc */ -.highlight .s2 { color: #a31515 } /* Literal.String.Double */ -.highlight .se { color: #a31515 } /* Literal.String.Escape */ -.highlight .sh { color: #a31515 } /* Literal.String.Heredoc */ -.highlight .si { color: #a31515 } /* Literal.String.Interpol */ -.highlight .sx { color: #a31515 } /* Literal.String.Other */ -.highlight .sr { color: #a31515 } /* Literal.String.Regex */ -.highlight .s1 { color: #a31515 } /* Literal.String.Single */ -.highlight .ss { color: #a31515 } /* Literal.String.Symbol */
\ No newline at end of file +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file diff --git a/NvCloth/docs/documentation/_static/searchtools.js b/NvCloth/docs/documentation/_static/searchtools.js index 5cbfe00..cbafbed 100644 --- a/NvCloth/docs/documentation/_static/searchtools.js +++ b/NvCloth/docs/documentation/_static/searchtools.js @@ -1,45 +1,19 @@ /* - * searchtools.js - * ~~~~~~~~~~~~~~ + * searchtools.js_t + * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilties for the full-text search. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ -/** - * helper function to return a node containing the - * search summary for a given text. keywords is a list - * of stemmed words, hlwords is the list of normal, unstemmed - * words. the first one is used to find the occurance, the - * latter for highlighting it. - */ - -jQuery.makeSearchSummary = function(text, keywords, hlwords) { - var textLower = text.toLowerCase(); - var start = 0; - $.each(keywords, function() { - var i = textLower.indexOf(this.toLowerCase()); - if (i > -1) - start = i; - }); - start = Math.max(start - 120, 0); - var excerpt = ((start > 0) ? '...' : '') + - $.trim(text.substr(start, 240)) + - ((start + 240 - text.length) ? '...' : ''); - var rv = $('<div class="context"></div>').text(excerpt); - $.each(hlwords, function() { - rv = rv.highlightText(this, 'highlighted'); - }); - return rv; -} /** * Porter Stemmer */ -var PorterStemmer = function() { +var Stemmer = function() { var step2list = { ational: 'ate', @@ -219,6 +193,38 @@ var PorterStemmer = function() { } + +/** + * Simple result scoring code. + */ +var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [filename, title, anchor, descr, score] + // and returns the new score. + /* + score: function(result) { + return result[4]; + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: {0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5}, // used to be unimportantResults + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + // query found in terms + term: 5 +}; + + /** * Search Module */ @@ -238,8 +244,13 @@ var Search = { }, loadIndex : function(url) { - $.ajax({type: "GET", url: url, data: null, success: null, - dataType: "script", cache: true}); + $.ajax({type: "GET", url: url, data: null, + dataType: "script", cache: true, + complete: function(jqxhr, textstatus) { + if (textstatus != "success") { + document.getElementById("searchindexloader").src = url; + } + }}); }, setIndex : function(index) { @@ -267,19 +278,20 @@ var Search = { if (this._pulse_status >= 0) return; function pulse() { + var i; Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; - for (var i = 0; i < Search._pulse_status; i++) + for (i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); - }; + } pulse(); }, /** - * perform a search for something + * perform a search for something (or wait until index is loaded) */ performSearch : function(query) { // create the required interface elements @@ -299,41 +311,46 @@ var Search = { this.deferQuery(query); }, + /** + * execute search (requires search index to be loaded) + */ query : function(query) { - var stopwords = ['and', 'then', 'into', 'it', 'as', 'are', 'in', - 'if', 'for', 'no', 'there', 'their', 'was', 'is', - 'be', 'to', 'that', 'but', 'they', 'not', 'such', - 'with', 'by', 'a', 'on', 'these', 'of', 'will', - 'this', 'near', 'the', 'or', 'at']; + var i; + var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; // stem the searchterms and add them to the correct list - var stemmer = new PorterStemmer(); + var stemmer = new Stemmer(); var searchterms = []; var excluded = []; var hlterms = []; var tmp = query.split(/\s+/); - var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null; - for (var i = 0; i < tmp.length; i++) { + var objectterms = []; + for (i = 0; i < tmp.length; i++) { + if (tmp[i] !== "") { + objectterms.push(tmp[i].toLowerCase()); + } + if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) || - tmp[i] == "") { + tmp[i] === "") { // skip this "word" continue; } // stem the word var word = stemmer.stemWord(tmp[i]).toLowerCase(); + var toAppend; // select the correct list if (word[0] == '-') { - var toAppend = excluded; + toAppend = excluded; word = word.substr(1); } else { - var toAppend = searchterms; + toAppend = searchterms; hlterms.push(tmp[i].toLowerCase()); } // only add if not already in the list - if (!$.contains(toAppend, word)) + if (!$u.contains(toAppend, word)) toAppend.push(word); - }; + } var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" ")); // console.debug('SEARCH: searching for:'); @@ -341,113 +358,51 @@ var Search = { // console.info('excluded: ', excluded); // prepare search - var filenames = this._index.filenames; - var titles = this._index.titles; var terms = this._index.terms; - var objects = this._index.objects; - var objtypes = this._index.objtypes; - var objnames = this._index.objnames; - var fileMap = {}; - var files = null; - // different result priorities - var importantResults = []; - var objectResults = []; - var regularResults = []; - var unimportantResults = []; + var titleterms = this._index.titleterms; + + // array of [filename, title, anchor, descr, score] + var results = []; $('#search-progress').empty(); // lookup as object - if (object != null) { - for (var prefix in objects) { - for (var name in objects[prefix]) { - var fullname = (prefix ? prefix + '.' : '') + name; - if (fullname.toLowerCase().indexOf(object) > -1) { - match = objects[prefix][name]; - descr = objnames[match[1]] + _(', in ') + titles[match[0]]; - // XXX the generated anchors are not generally correct - // XXX there may be custom prefixes - result = [filenames[match[0]], fullname, '#'+fullname, descr]; - switch (match[2]) { - case 1: objectResults.push(result); break; - case 0: importantResults.push(result); break; - case 2: unimportantResults.push(result); break; - } - } - } - } + for (i = 0; i < objectterms.length; i++) { + var others = [].concat(objectterms.slice(0, i), + objectterms.slice(i+1, objectterms.length)); + results = results.concat(this.performObjectSearch(objectterms[i], others)); } - // sort results descending - objectResults.sort(function(a, b) { - return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); - }); - - importantResults.sort(function(a, b) { - return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); - }); - - unimportantResults.sort(function(a, b) { - return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); - }); - + // lookup as search terms in fulltext + results = results.concat(this.performTermsSearch(searchterms, excluded, terms, Scorer.term)) + .concat(this.performTermsSearch(searchterms, excluded, titleterms, Scorer.title)); - // perform the search on the required terms - for (var i = 0; i < searchterms.length; i++) { - var word = searchterms[i]; - // no match but word was a required one - if ((files = terms[word]) == null) - break; - if (files.length == undefined) { - files = [files]; - } - // create the mapping - for (var j = 0; j < files.length; j++) { - var file = files[j]; - if (file in fileMap) - fileMap[file].push(word); - else - fileMap[file] = [word]; - } + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + for (i = 0; i < results.length; i++) + results[i][4] = Scorer.score(results[i]); } - // now check if the files don't contain excluded terms - for (var file in fileMap) { - var valid = true; - - // check if all requirements are matched - if (fileMap[file].length != searchterms.length) - continue; - - // ensure that none of the excluded terms is in the - // search result. - for (var i = 0; i < excluded.length; i++) { - if (terms[excluded[i]] == file || - $.contains(terms[excluded[i]] || [], file)) { - valid = false; - break; - } + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort(function(a, b) { + var left = a[4]; + var right = b[4]; + if (left > right) { + return 1; + } else if (left < right) { + return -1; + } else { + // same score: sort alphabetically + left = a[1].toLowerCase(); + right = b[1].toLowerCase(); + return (left > right) ? -1 : ((left < right) ? 1 : 0); } - - // if we have still a valid result we can add it - // to the result list - if (valid) - regularResults.push([filenames[file], titles[file], '', null]); - } - - // delete unused variables in order to not waste - // memory until list is retrieved completely - delete filenames, titles, terms; - - // now sort the regular results descending by title - regularResults.sort(function(a, b) { - var left = a[1].toLowerCase(); - var right = b[1].toLowerCase(); - return (left > right) ? -1 : ((left < right) ? 1 : 0); }); - // combine all results - var results = unimportantResults.concat(regularResults) - .concat(objectResults).concat(importantResults); + // for debugging + //Search.lastresults = results.slice(); // a copy + //console.info('search results:', Search.lastresults); // print the results var resultCount = results.length; @@ -456,7 +411,7 @@ var Search = { if (results.length) { var item = results.pop(); var listItem = $('<li style="display:none"></li>'); - if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') { + if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') { // dirhtml builder var dirname = item[0] + '/'; if (dirname.match(/\/index\/$/)) { @@ -480,16 +435,18 @@ var Search = { displayNextItem(); }); } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { - $.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + - item[0] + '.txt', function(data) { - if (data != '') { - listItem.append($.makeSearchSummary(data, searchterms, hlterms)); - Search.output.append(listItem); - } - listItem.slideDown(5, function() { - displayNextItem(); - }); - }); + $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[0] + '.txt', + dataType: "text", + complete: function(jqxhr, textstatus) { + var data = jqxhr.responseText; + if (data !== '') { + listItem.append(Search.makeSearchSummary(data, searchterms, hlterms)); + } + Search.output.append(listItem); + listItem.slideDown(5, function() { + displayNextItem(); + }); + }}); } else { // no source available, just display title Search.output.append(listItem); @@ -510,9 +467,156 @@ var Search = { } } displayNextItem(); + }, + + /** + * search for object names + */ + performObjectSearch : function(object, otherterms) { + var filenames = this._index.filenames; + var objects = this._index.objects; + var objnames = this._index.objnames; + var titles = this._index.titles; + + var i; + var results = []; + + for (var prefix in objects) { + for (var name in objects[prefix]) { + var fullname = (prefix ? prefix + '.' : '') + name; + if (fullname.toLowerCase().indexOf(object) > -1) { + var score = 0; + var parts = fullname.split('.'); + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullname == object || parts[parts.length - 1] == object) { + score += Scorer.objNameMatch; + // matches in last name + } else if (parts[parts.length - 1].indexOf(object) > -1) { + score += Scorer.objPartialMatch; + } + var match = objects[prefix][name]; + var objname = objnames[match[1]][2]; + var title = titles[match[0]]; + // If more than one term searched for, we require other words to be + // found in the name/title/description + if (otherterms.length > 0) { + var haystack = (prefix + ' ' + name + ' ' + + objname + ' ' + title).toLowerCase(); + var allfound = true; + for (i = 0; i < otherterms.length; i++) { + if (haystack.indexOf(otherterms[i]) == -1) { + allfound = false; + break; + } + } + if (!allfound) { + continue; + } + } + var descr = objname + _(', in ') + title; + + var anchor = match[3]; + if (anchor === '') + anchor = fullname; + else if (anchor == '-') + anchor = objnames[match[1]][1] + '-' + fullname; + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) { + score += Scorer.objPrio[match[2]]; + } else { + score += Scorer.objPrioDefault; + } + results.push([filenames[match[0]], fullname, '#'+anchor, descr, score]); + } + } + } + + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch : function(searchterms, excluded, terms, score) { + var filenames = this._index.filenames; + var titles = this._index.titles; + + var i, j, file, files; + var fileMap = {}; + var results = []; + + // perform the search on the required terms + for (i = 0; i < searchterms.length; i++) { + var word = searchterms[i]; + // no match but word was a required one + if ((files = terms[word]) === undefined) + break; + if (files.length === undefined) { + files = [files]; + } + // create the mapping + for (j = 0; j < files.length; j++) { + file = files[j]; + if (file in fileMap) + fileMap[file].push(word); + else + fileMap[file] = [word]; + } + } + + // now check if the files don't contain excluded terms + for (file in fileMap) { + var valid = true; + + // check if all requirements are matched + if (fileMap[file].length != searchterms.length) + continue; + + // ensure that none of the excluded terms is in the search result + for (i = 0; i < excluded.length; i++) { + if (terms[excluded[i]] == file || + $u.contains(terms[excluded[i]] || [], file)) { + valid = false; + break; + } + } + + // if we have still a valid result we can add it to the result list + if (valid) { + results.push([filenames[file], titles[file], '', null, score]); + } + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words, hlwords is the list of normal, unstemmed + * words. the first one is used to find the occurance, the + * latter for highlighting it. + */ + makeSearchSummary : function(text, keywords, hlwords) { + var textLower = text.toLowerCase(); + var start = 0; + $.each(keywords, function() { + var i = textLower.indexOf(this.toLowerCase()); + if (i > -1) + start = i; + }); + start = Math.max(start - 120, 0); + var excerpt = ((start > 0) ? '...' : '') + + $.trim(text.substr(start, 240)) + + ((start + 240 - text.length) ? '...' : ''); + var rv = $('<div class="context"></div>').text(excerpt); + $.each(hlwords, function() { + rv = rv.highlightText(this, 'highlighted'); + }); + return rv; } -} +}; $(document).ready(function() { Search.init(); -}); +});
\ No newline at end of file diff --git a/NvCloth/docs/documentation/_static/sidebar.js b/NvCloth/docs/documentation/_static/sidebar.js index be206ed..874a890 100644 --- a/NvCloth/docs/documentation/_static/sidebar.js +++ b/NvCloth/docs/documentation/_static/sidebar.js @@ -16,12 +16,20 @@ * Once the browser is closed the cookie is deleted and the position * reset to the default (expanded). * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ $(function() { + + + + + + + + // global elements used by the functions. // the 'sidebarbutton' element is defined as global after its // creation, in the add_sidebar_button function @@ -29,6 +37,9 @@ $(function() { var sidebar = $('.sphinxsidebar'); var sidebarwrapper = $('.sphinxsidebarwrapper'); + // for some reason, the document has no sidebar; do not run into errors + if (!sidebar.length) return; + // original margin-left of the bodywrapper and width of the sidebar // with the sidebar expanded var bw_margin_expanded = bodywrapper.css('margin-left'); @@ -91,6 +102,7 @@ $(function() { '<div id="sidebarbutton"><span>«</span></div>' ); var sidebarbutton = $('#sidebarbutton'); + light_color = sidebarbutton.css('background-color'); // find the height of the viewport to center the '<<' in the page var viewport_height; if (window.innerHeight) @@ -130,7 +142,7 @@ $(function() { var items = document.cookie.split(';'); for(var k=0; k<items.length; k++) { var key_val = items[k].split('='); - var key = key_val[0]; + var key = key_val[0].replace(/ /, ""); // strip leading spaces if (key == 'sidebar') { var value = key_val[1]; if ((value == 'collapsed') && (!sidebar_is_collapsed())) diff --git a/NvCloth/docs/documentation/_static/space.gif b/NvCloth/docs/documentation/_static/space.gif Binary files differnew file mode 100644 index 0000000..f191b28 --- /dev/null +++ b/NvCloth/docs/documentation/_static/space.gif diff --git a/NvCloth/docs/documentation/_static/styleguide.css b/NvCloth/docs/documentation/_static/styleguide.css new file mode 100644 index 0000000..8c3f3de --- /dev/null +++ b/NvCloth/docs/documentation/_static/styleguide.css @@ -0,0 +1,102 @@ +body { + background-color: #fcfcfc; +} +.example { + padding: 20px; + border: 1px solid #efefef; +} +.doc-section { + padding-top: 60px; + margin-top: -60px; +} +/* + * Side navigation + * + * Scrollspy and affixed enhanced navigation to highlight sections and secondary + * sections of docs content. + */ +/* By default it's not affixed in mobile views, so undo that */ +.bs-sidebar.affix { + position: static; +} +/* First level of nav */ +.bs-sidenav { + padding-top: 10px; + padding-bottom: 10px; + text-shadow: 0 1px 0 #fff; + background-color: #f7f5fa; + border-radius: 5px; +} +/* All levels of nav */ +.bs-sidebar .nav > li > a { + display: block; + color: #716b7a; + padding: 5px 20px; +} +.bs-sidebar .nav > li > a:hover, +.bs-sidebar .nav > li > a:focus { + text-decoration: none; + background-color: #e5e3e9; + border-right: 1px solid #dbd8e0; +} +.bs-sidebar .nav > .active > a, +.bs-sidebar .nav > .active:hover > a, +.bs-sidebar .nav > .active:focus > a { + font-weight: bold; + color: #563d7c; + background-color: transparent; + border-right: 1px solid #563d7c; +} +/* Nav: second level (shown on .active) */ +.bs-sidebar .nav .nav { + margin-bottom: 8px; +} +.bs-sidebar .nav .nav > li > a { + padding-top: 3px; + padding-bottom: 3px; + padding-left: 30px; + font-size: 90%; +} +/* Show and affix the side nav when space allows it */ +@media (min-width: 992px) { + .bs-sidebar .nav > .active > ul { + display: block; + } + /* Widen the fixed sidebar */ + .bs-sidebar.affix, + .bs-sidebar.affix-bottom { + width: 213px; + } + .bs-sidebar.affix { + position: fixed; + /* Undo the static from mobile first approach */ + top: 80px; + } + .bs-sidebar.affix-bottom { + position: absolute; + /* Undo the static from mobile first approach */ + } + .bs-sidebar.affix-bottom .bs-sidenav, + .bs-sidebar.affix .bs-sidenav { + margin-top: 0; + margin-bottom: 0; + } +} +@media (min-width: 1200px) { + /* Widen the fixed sidebar again */ + .bs-sidebar.affix-bottom, + .bs-sidebar.affix { + width: 263px; + } +} +.show-grid { + margin-bottom: 15px; +} +.show-grid [class^="col-"] { + padding-top: 10px; + padding-bottom: 10px; + background-color: #eee; + border: 1px solid #ddd; + background-color: rgba(86, 61, 124, 0.15); + border: 1px solid rgba(86, 61, 124, 0.2); +} diff --git a/NvCloth/docs/documentation/_static/underscore.js b/NvCloth/docs/documentation/_static/underscore.js index 9146e08..5b55f32 100644 --- a/NvCloth/docs/documentation/_static/underscore.js +++ b/NvCloth/docs/documentation/_static/underscore.js @@ -1,16 +1,31 @@ -(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d, -a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c); -var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c, -d);var e=true;b.each(a,function(f,g,h){(e=e&&c.call(d,f,g,h))||b.breakLoop()});return e};b.any=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.some))return a.some(c,d);var e=false;b.each(a,function(f,g,h){if(e=c.call(d,f,g,h))b.breakLoop()});return e};b.include=function(a,c){if(b.isArray(a))return b.indexOf(a,c)!=-1;var d=false;b.each(a,function(e){if(d=e===c)b.breakLoop()});return d};b.invoke=function(a,c){var d=b.rest(arguments,2);return b.map(a,function(e){return(c?e[c]:e).apply(e,d)})};b.pluck= -function(a,c){return b.map(a,function(d){return d[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g>=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g<e.computed&&(e={value:f,computed:g})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a, -function(e,f,g){return{value:e,criteria:c.call(d,e,f,g)}}).sort(function(e,f){e=e.criteria;f=f.criteria;return e<f?-1:e>f?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?(e=g+1):(f=g)}return e};b.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return a;if(b.isArguments(a))return k.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=function(a,c,d){return c&&!d?k.call(a, -0,c):a[0]};b.rest=function(a,c,d){return k.call(a,b.isUndefined(c)||d?1:c)};b.last=function(a){return a[a.length-1]};b.compact=function(a){return b.select(a,function(c){return!!c})};b.flatten=function(a){return b.reduce(a,[],function(c,d){if(b.isArray(d))return c.concat(b.flatten(d));c.push(d);return c})};b.without=function(a){var c=b.rest(arguments);return b.select(a,function(d){return!b.include(c,d)})};b.uniq=function(a,c){return b.reduce(a,[],function(d,e,f){if(0==f||(c===true?b.last(d)!=e:!b.include(d, -e)))d.push(e);return d})};b.intersect=function(a){var c=b.rest(arguments);return b.select(b.uniq(a),function(d){return b.all(c,function(e){return b.indexOf(e,d)>=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e<c;e++)d[e]=b.pluck(a,String(e));return d};b.indexOf=function(a,c){if(a.indexOf)return a.indexOf(c);for(var d=0,e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf=function(a,c){if(a.lastIndexOf)return a.lastIndexOf(c);for(var d= -a.length;d--;)if(a[d]===c)return d;return-1};b.range=function(a,c,d){var e=b.toArray(arguments),f=e.length<=1;a=f?0:e[0];c=f?e[0]:e[1];d=e[2]||1;e=Math.ceil((c-a)/d);if(e<=0)return[];e=new Array(e);f=a;for(var g=0;1;f+=d){if((d>0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)}); -return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length); -var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false; -if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length== -0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&& -a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g, -" ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments); -o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})(); +// Underscore.js 1.3.1 +// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. +// Underscore is freely distributable under the MIT license. +// Portions of Underscore are inspired or borrowed from Prototype, +// Oliver Steele's Functional, and John Resig's Micro-Templating. +// For all details and documentation: +// http://documentcloud.github.com/underscore +(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== +c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c, +h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each= +b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a== +null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect= +function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e= +e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= +function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})}); +return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a, +c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest= +b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]); +return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c, +d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g}; +var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a, +c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true: +a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}}; +b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments, +1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)}; +b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"}; +b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a), +function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+ +u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]= +function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain= +true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); diff --git a/NvCloth/docs/documentation/genindex.html b/NvCloth/docs/documentation/genindex.html new file mode 100644 index 0000000..dacd262 --- /dev/null +++ b/NvCloth/docs/documentation/genindex.html @@ -0,0 +1,232 @@ + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta http-equiv="x-ua-compatible" content="IE=Edge"/> + + <title>Index — NvCloth 1.0.0 documentation</title> + + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> + <link rel="stylesheet" href="_static/application.css" type="text/css" /> + <link rel="stylesheet" href="_static/styleguide.css" type="text/css" /> + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: './', + VERSION: '1.0.0', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + <script type="text/javascript" src="_static/bootstrap.js"></script> + <script type="text/javascript" src="_static/jquery.cookie.js"></script> + <script type="text/javascript" src="_static/jquery.storageapi.js"></script> + <link rel="top" title="NvCloth 1.0.0 documentation" href="index.html" /> + </head> + <body> +<nav class="navbar navbar-inverse navbar-default"> + <div class="row"> + <div class="navbar-brand"> + <img class="logo" src="_static/developerzone_gameworks_logo.png" alt="Logo"/> + </div> +<div id="searchbox" style="display: none; float:right; padding-top:4px; padding-right:4px"> + <form class="search form-inline" action="search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> +</nav> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="index.html">NvCloth 1.0.0 documentation</a></li> + </ul> + </div> +</div> +<div class="row"> + <div class="col-md-3 bs-sidenav" style="white-space: nowrap; overflow: auto;"> +<div class="bs-sidebar"> + <div id="sidebar_toc"> + <h4>Table Of Contents</h4> + <ul> +<li class="toctree-l1"><a class="reference internal" href="ReleaseNotes/index.html">Release Notes</a><ul> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#fixes">Fixes</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#new-features">New Features</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#supported-platforms">Supported Platforms</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#supported-compilers">Supported Compilers</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#known-issues">Known Issues</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="Modules/Index.html">Modules</a><ul> +<li class="toctree-l2"><a class="reference internal" href="Modules/Index.html#nvcloth">NvCloth</a></li> +<li class="toctree-l2"><a class="reference internal" href="Modules/Index.html#nvcloth-extensions">NvCloth extensions</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="UserGuide/Index.html">User Guide</a><ul> +<li class="toctree-l2"><a class="reference internal" href="UserGuide/Index.html#setup">Setup</a><ul> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#initializing-the-library">Initializing the Library</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#factory">Factory</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#fabric-cloth">Fabric & Cloth</a><ul> +<li class="toctree-l4"><a class="reference internal" href="UserGuide/Index.html#fabric">Fabric</a></li> +<li class="toctree-l4"><a class="reference internal" href="UserGuide/Index.html#cloth">Cloth</a></li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#solver">Solver</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#retrieving-simulation-data">Retrieving simulation data</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="UserGuide/Index.html#usage">Usage</a><ul> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#common-cloth-properties">Common cloth properties</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#tethers">Tethers</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#collision-detection">Collision detection</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#local-space-simulation">Local space simulation</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#drag-lift-and-wind">Drag lift and wind</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="CopyRight/Index.html">NVIDIA Copyright Notice</a></li> +</ul> + + </div> + + + +<div id="searchbox" style="display: none"> + <h4>Quick search</h4> + <form class="search form-inline" action="search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> +</div> + </div> + <div class="document col-md-8"> + <div class="body"> + + +<h1 id="index">Index</h1> + +<div class="genindex-jumpbox"> + +</div> + + + </div> + <div class="clearer"></div> + </div> + <div class="col-md-1"></div> +</div> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="index.html">NvCloth 1.0.0 documentation</a></li> + </ul> + </div> +</div> + +<footer> + <div class="footer-boilerplate"> + <div class="row"> + <div class="boilerplate"> + Copyright © 2014, NVIDIA Corporation | <a href="http://www.nvidia.com/object/about-nvidia.html" onclick="s_objectID="http://www.nvidia.com/object/about-nvidia.html_1";return this.s_oc?this.s_oc(e):true">About NVIDIA </a> | <a href="http://www.nvidia.com/object/legal_info.html" onclick="s_objectID="http://www.nvidia.com/object/legal_info.html_1";return this.s_oc?this.s_oc(e):true">Legal Information </a> | <a href="http://www.nvidia.com/object/privacy_policy.html" onclick="s_objectID="http://www.nvidia.com/object/privacy_policy.html_1";return this.s_oc?this.s_oc(e):true">Privacy Policy </a> + </div> + </div> + </div> +</div> +</footer> + + +<script type="text/x-mathjax-config"> + MathJax.Hub.Config({ + extensions: ["tex2jax.js"], + jax: ["input/TeX", "output/HTML-CSS"], + tex2jax: { + processEscapes: true, + skipTags: ["script","noscript","style","textarea"] + }, + "HTML-CSS": { availableFonts: ["TeX"] }, + TeX: { + Macros: { + Lrg: ['\\displaystyle{#1}', 1, ""] + } + } + }); +</script> + + +<script type="text/javascript" async + src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> +</script> + +<script> +var treestatename = 'GWDocsTreeState'; +var protocol = location.href.split('/')[0].toLowerCase(); +var storage; +if (protocol.substring(0,4) == 'http') { + storage = $.cookieStorage; + storage.setPath('/'); +} else { + storage = $.localStorage; +} + +if (storage.isEmpty(treestatename)) { + storage.set(treestatename, {}); +} + +var treestate = storage.get(treestatename); + +$.each($("#sidebar_toc ul li"), toc_walker); + +function toc_walker(key, value) { + var handleSpan = $("<span></span>") + .addClass("toc_handle").prependTo(value); + handleSpan.attr("id", $(value).closest("div").attr("id") + "." + key); + + if($(value).has("ul li").size() > 0) { + var id = handleSpan.attr("id"); + if (!(id in treestate)) { + treestate[id] = false; + } + handleSpan.addClass("toc_expanded").click(function() { + $(this).toggleClass("toc_expanded toc_collapsed").siblings("ul").toggle(); + treestate[$(this).attr('id')] = $(this).hasClass('toc_expanded'); + storage.set(treestatename, treestate); + }); + if(!($(this).hasClass('current') || treestate[id])) { + handleSpan.click(); + } + if($(this).hasClass('current')) { + treestate[handleSpan.attr('id')] = handleSpan.hasClass('toc_expanded'); + storage.set(treestatename, treestate); + } + } +} +</script> + </body> +</html>
\ No newline at end of file diff --git a/NvCloth/docs/documentation/index.html b/NvCloth/docs/documentation/index.html new file mode 100644 index 0000000..fbaa4fe --- /dev/null +++ b/NvCloth/docs/documentation/index.html @@ -0,0 +1,252 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta http-equiv="x-ua-compatible" content="IE=Edge"/> + + <title>NvCloth — NvCloth 1.0.0 documentation</title> + + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> + <link rel="stylesheet" href="_static/application.css" type="text/css" /> + <link rel="stylesheet" href="_static/styleguide.css" type="text/css" /> + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: './', + VERSION: '1.0.0', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + <script type="text/javascript" src="_static/bootstrap.js"></script> + <script type="text/javascript" src="_static/jquery.cookie.js"></script> + <script type="text/javascript" src="_static/jquery.storageapi.js"></script> + <link rel="top" title="NvCloth 1.0.0 documentation" href="#" /> + <link rel="next" title="Release Notes" href="ReleaseNotes/index.html" /> + </head> + <body> +<nav class="navbar navbar-inverse navbar-default"> + <div class="row"> + <div class="navbar-brand"> + <img class="logo" src="_static/developerzone_gameworks_logo.png" alt="Logo"/> + </div> +<div id="searchbox" style="display: none; float:right; padding-top:4px; padding-right:4px"> + <form class="search form-inline" action="search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> +</nav> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="#">NvCloth 1.0.0 documentation</a></li> + </ul> + </div> +</div> +<div class="row"> + <div class="col-md-3 bs-sidenav" style="white-space: nowrap; overflow: auto;"> +<div class="bs-sidebar"> + <div id="sidebar_toc"> + <h4>Table Of Contents</h4> + <ul> +<li class="toctree-l1"><a class="reference internal" href="ReleaseNotes/index.html">Release Notes</a><ul> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#fixes">Fixes</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#new-features">New Features</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#supported-platforms">Supported Platforms</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#supported-compilers">Supported Compilers</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#known-issues">Known Issues</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="Modules/Index.html">Modules</a><ul> +<li class="toctree-l2"><a class="reference internal" href="Modules/Index.html#nvcloth">NvCloth</a></li> +<li class="toctree-l2"><a class="reference internal" href="Modules/Index.html#nvcloth-extensions">NvCloth extensions</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="UserGuide/Index.html">User Guide</a><ul> +<li class="toctree-l2"><a class="reference internal" href="UserGuide/Index.html#setup">Setup</a><ul> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#initializing-the-library">Initializing the Library</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#factory">Factory</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#fabric-cloth">Fabric & Cloth</a><ul> +<li class="toctree-l4"><a class="reference internal" href="UserGuide/Index.html#fabric">Fabric</a></li> +<li class="toctree-l4"><a class="reference internal" href="UserGuide/Index.html#cloth">Cloth</a></li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#solver">Solver</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#retrieving-simulation-data">Retrieving simulation data</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="UserGuide/Index.html#usage">Usage</a><ul> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#common-cloth-properties">Common cloth properties</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#tethers">Tethers</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#collision-detection">Collision detection</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#local-space-simulation">Local space simulation</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#drag-lift-and-wind">Drag lift and wind</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="CopyRight/Index.html">NVIDIA Copyright Notice</a></li> +</ul> + + </div> + <h4>Next topic</h4> + <p class="topless"><a href="ReleaseNotes/index.html" + title="next chapter">Release Notes</a></p> +<div id="searchbox" style="display: none"> + <h4>Quick search</h4> + <form class="search form-inline" action="search.html" method="get"> + <div class="form-group"> + <input type="text" name="q" class="form-control" /> + <input type="submit" value="Search" class="btn btn-primary" /> + </div> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> +</div> + </div> + <div class="document col-md-8"> + <div class="body"> + + <div class="section" id="productname"> +<h1>NvCloth<a class="headerlink" href="#productname" title="Permalink to this headline">¶</a></h1> +<p>NvCloth is a library that provides low level access to a cloth solver designed for realtime interactive applications.</p> +<p>Features:</p> +<ul class="simple"> +<li>Fast and robust cloth simulation suitable for games</li> +<li>Collision detection and response suitable for animated characters</li> +<li>Low level interface with little overhead and easy integration</li> +</ul> +<div class="section" id="learn-more-about-productname"> +<h2>Learn more about NvCloth<a class="headerlink" href="#learn-more-about-productname" title="Permalink to this headline">¶</a></h2> +<ul class="simple"> +<li>Visit the <a class="reference external" href="https://github.com/NVIDIAGameWorks/NvCloth">product home page</a> on <a class="reference external" href="http://developer.nvidia.com">NVIDIA Developer</a></li> +<li>View Documentation <a class="reference internal" href="search.html"><em>Search Page</em></a></li> +</ul> +<p><strong>Browse Documentation</strong></p> +<div class="toctree-wrapper compound"> +<ul> +<li class="toctree-l1"><a class="reference internal" href="ReleaseNotes/index.html">Release Notes</a></li> +<li class="toctree-l1"><a class="reference internal" href="Modules/Index.html">Modules</a></li> +<li class="toctree-l1"><a class="reference internal" href="UserGuide/Index.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="CopyRight/Index.html">NVIDIA Copyright Notice</a></li> +</ul> +</div> +</div> +</div> + + + </div> + <div class="clearer"></div> + </div> + <div class="col-md-1"></div> +</div> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="#">NvCloth 1.0.0 documentation</a></li> + </ul> + </div> +</div> + +<footer> + <div class="footer-boilerplate"> + <div class="row"> + <div class="boilerplate"> + Copyright © 2014, NVIDIA Corporation | <a href="http://www.nvidia.com/object/about-nvidia.html" onclick="s_objectID="http://www.nvidia.com/object/about-nvidia.html_1";return this.s_oc?this.s_oc(e):true">About NVIDIA </a> | <a href="http://www.nvidia.com/object/legal_info.html" onclick="s_objectID="http://www.nvidia.com/object/legal_info.html_1";return this.s_oc?this.s_oc(e):true">Legal Information </a> | <a href="http://www.nvidia.com/object/privacy_policy.html" onclick="s_objectID="http://www.nvidia.com/object/privacy_policy.html_1";return this.s_oc?this.s_oc(e):true">Privacy Policy </a> + </div> + </div> + </div> +</div> +</footer> + + +<script type="text/x-mathjax-config"> + MathJax.Hub.Config({ + extensions: ["tex2jax.js"], + jax: ["input/TeX", "output/HTML-CSS"], + tex2jax: { + processEscapes: true, + skipTags: ["script","noscript","style","textarea"] + }, + "HTML-CSS": { availableFonts: ["TeX"] }, + TeX: { + Macros: { + Lrg: ['\\displaystyle{#1}', 1, ""] + } + } + }); +</script> + + +<script type="text/javascript" async + src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> +</script> + +<script> +var treestatename = 'GWDocsTreeState'; +var protocol = location.href.split('/')[0].toLowerCase(); +var storage; +if (protocol.substring(0,4) == 'http') { + storage = $.cookieStorage; + storage.setPath('/'); +} else { + storage = $.localStorage; +} + +if (storage.isEmpty(treestatename)) { + storage.set(treestatename, {}); +} + +var treestate = storage.get(treestatename); + +$.each($("#sidebar_toc ul li"), toc_walker); + +function toc_walker(key, value) { + var handleSpan = $("<span></span>") + .addClass("toc_handle").prependTo(value); + handleSpan.attr("id", $(value).closest("div").attr("id") + "." + key); + + if($(value).has("ul li").size() > 0) { + var id = handleSpan.attr("id"); + if (!(id in treestate)) { + treestate[id] = false; + } + handleSpan.addClass("toc_expanded").click(function() { + $(this).toggleClass("toc_expanded toc_collapsed").siblings("ul").toggle(); + treestate[$(this).attr('id')] = $(this).hasClass('toc_expanded'); + storage.set(treestatename, treestate); + }); + if(!($(this).hasClass('current') || treestate[id])) { + handleSpan.click(); + } + if($(this).hasClass('current')) { + treestate[handleSpan.attr('id')] = handleSpan.hasClass('toc_expanded'); + storage.set(treestatename, treestate); + } + } +} +</script> + </body> +</html>
\ No newline at end of file diff --git a/NvCloth/docs/documentation/search.html b/NvCloth/docs/documentation/search.html index fd35730..0cc48f4 100644 --- a/NvCloth/docs/documentation/search.html +++ b/NvCloth/docs/documentation/search.html @@ -1,19 +1,24 @@ - - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta http-equiv="x-ua-compatible" content="IE=Edge"/> + + <title>Search — NvCloth 1.0.0 documentation</title> - <title>Search — NVIDIA NvCloth Documentation</title> - <link rel="stylesheet" href="_static/nvidia.css" type="text/css" /> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> + <link rel="stylesheet" href="_static/application.css" type="text/css" /> + <link rel="stylesheet" href="_static/styleguide.css" type="text/css" /> + <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { - URL_ROOT: '', - VERSION: '0.0', + URL_ROOT: './', + VERSION: '1.0.0', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true @@ -22,25 +27,84 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> + <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> <script type="text/javascript" src="_static/searchtools.js"></script> - <link rel="top" title="NVIDIA NvCloth Documentation" href="index.html" /> + <script type="text/javascript" src="_static/bootstrap.js"></script> + <script type="text/javascript" src="_static/jquery.cookie.js"></script> + <script type="text/javascript" src="_static/jquery.storageapi.js"></script> + <link rel="top" title="NvCloth 1.0.0 documentation" href="index.html" /> <script type="text/javascript"> jQuery(function() { Search.loadIndex("searchindex.js"); }); </script> + + <script type="text/javascript" id="searchindexloader"></script> </head> <body> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li><a href="NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> +<nav class="navbar navbar-inverse navbar-default"> + <div class="row"> + <div class="navbar-brand"> + <img class="logo" src="_static/developerzone_gameworks_logo.png" alt="Logo"/> + </div> + </div> +</nav> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="index.html">NvCloth 1.0.0 documentation</a></li> </ul> - </div> + </div> +</div> +<div class="row"> + <div class="col-md-3 bs-sidenav" style="white-space: nowrap; overflow: auto;"> +<div class="bs-sidebar"> + <div id="sidebar_toc"> + <h4>Table Of Contents</h4> + <ul> +<li class="toctree-l1"><a class="reference internal" href="ReleaseNotes/index.html">Release Notes</a><ul> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#fixes">Fixes</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#new-features">New Features</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#supported-platforms">Supported Platforms</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#supported-compilers">Supported Compilers</a></li> +<li class="toctree-l2"><a class="reference internal" href="ReleaseNotes/index.html#known-issues">Known Issues</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="Modules/Index.html">Modules</a><ul> +<li class="toctree-l2"><a class="reference internal" href="Modules/Index.html#nvcloth">NvCloth</a></li> +<li class="toctree-l2"><a class="reference internal" href="Modules/Index.html#nvcloth-extensions">NvCloth extensions</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="UserGuide/Index.html">User Guide</a><ul> +<li class="toctree-l2"><a class="reference internal" href="UserGuide/Index.html#setup">Setup</a><ul> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#initializing-the-library">Initializing the Library</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#factory">Factory</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#fabric-cloth">Fabric & Cloth</a><ul> +<li class="toctree-l4"><a class="reference internal" href="UserGuide/Index.html#fabric">Fabric</a></li> +<li class="toctree-l4"><a class="reference internal" href="UserGuide/Index.html#cloth">Cloth</a></li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#solver">Solver</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#retrieving-simulation-data">Retrieving simulation data</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="UserGuide/Index.html#usage">Usage</a><ul> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#common-cloth-properties">Common cloth properties</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#tethers">Tethers</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#collision-detection">Collision detection</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#local-space-simulation">Local space simulation</a></li> +<li class="toctree-l3"><a class="reference internal" href="UserGuide/Index.html#drag-lift-and-wind">Drag lift and wind</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="CopyRight/Index.html">NVIDIA Copyright Notice</a></li> +</ul> - <div class="document"> - <div class="documentwrapper"> - <div class="bodywrapper"> + </div> +</div> + </div> + <div class="document col-md-8"> <div class="body"> <h1 id="search-documentation">Search</h1> @@ -68,23 +132,95 @@ </div> </div> - </div> - </div> - <div class="sphinxsidebar"> - <div class="sphinxsidebarwrapper"> - </div> - </div> <div class="clearer"></div> </div> - <div class="related"> - <h3>Navigation</h3> - <ul> - <li><a href="NvCloth.html">NVIDIA NvCloth Documentation</a> »</li> + <div class="col-md-1"></div> +</div> +<div class="masthead"> + <div class="row"> + <ul class="breadcrumb"> + <li><a href="index.html">NvCloth 1.0.0 documentation</a></li> </ul> </div> - <div class="footer"> - © Copyright 2016-2017, NVIDIA Corporation, All Rights Reserved. - Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.2. +</div> + +<footer> + <div class="footer-boilerplate"> + <div class="row"> + <div class="boilerplate"> + Copyright © 2014, NVIDIA Corporation | <a href="http://www.nvidia.com/object/about-nvidia.html" onclick="s_objectID="http://www.nvidia.com/object/about-nvidia.html_1";return this.s_oc?this.s_oc(e):true">About NVIDIA </a> | <a href="http://www.nvidia.com/object/legal_info.html" onclick="s_objectID="http://www.nvidia.com/object/legal_info.html_1";return this.s_oc?this.s_oc(e):true">Legal Information </a> | <a href="http://www.nvidia.com/object/privacy_policy.html" onclick="s_objectID="http://www.nvidia.com/object/privacy_policy.html_1";return this.s_oc?this.s_oc(e):true">Privacy Policy </a> + </div> + </div> </div> +</div> +</footer> + + +<script type="text/x-mathjax-config"> + MathJax.Hub.Config({ + extensions: ["tex2jax.js"], + jax: ["input/TeX", "output/HTML-CSS"], + tex2jax: { + processEscapes: true, + skipTags: ["script","noscript","style","textarea"] + }, + "HTML-CSS": { availableFonts: ["TeX"] }, + TeX: { + Macros: { + Lrg: ['\\displaystyle{#1}', 1, ""] + } + } + }); +</script> + + +<script type="text/javascript" async + src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> +</script> + +<script> +var treestatename = 'GWDocsTreeState'; +var protocol = location.href.split('/')[0].toLowerCase(); +var storage; +if (protocol.substring(0,4) == 'http') { + storage = $.cookieStorage; + storage.setPath('/'); +} else { + storage = $.localStorage; +} + +if (storage.isEmpty(treestatename)) { + storage.set(treestatename, {}); +} + +var treestate = storage.get(treestatename); + +$.each($("#sidebar_toc ul li"), toc_walker); + +function toc_walker(key, value) { + var handleSpan = $("<span></span>") + .addClass("toc_handle").prependTo(value); + handleSpan.attr("id", $(value).closest("div").attr("id") + "." + key); + + if($(value).has("ul li").size() > 0) { + var id = handleSpan.attr("id"); + if (!(id in treestate)) { + treestate[id] = false; + } + handleSpan.addClass("toc_expanded").click(function() { + $(this).toggleClass("toc_expanded toc_collapsed").siblings("ul").toggle(); + treestate[$(this).attr('id')] = $(this).hasClass('toc_expanded'); + storage.set(treestatename, treestate); + }); + if(!($(this).hasClass('current') || treestate[id])) { + handleSpan.click(); + } + if($(this).hasClass('current')) { + treestate[handleSpan.attr('id')] = handleSpan.hasClass('toc_expanded'); + storage.set(treestatename, treestate); + } + } +} +</script> </body> </html>
\ No newline at end of file diff --git a/NvCloth/docs/documentation/searchindex.js b/NvCloth/docs/documentation/searchindex.js index e3baab7..388ea4f 100644 --- a/NvCloth/docs/documentation/searchindex.js +++ b/NvCloth/docs/documentation/searchindex.js @@ -1 +1 @@ -Search.setIndex({objects:{},terms:{all:[0,3,4],code:[3,2],edg:2,orthogon:2,indirectli:3,skip:3,global:3,sleep:2,capsul:3,follow:[3,2],profil:3,"const":3,solvefabr:2,opposit:2,lrg:2,offlin:4,volum:2,friction:3,setplan:3,cook:[3,4],evert:3,ajust:2,cuctxcreat:3,pbw:2,uint32_t:3,dampen:3,mstiffnessmultipli:3,solver:[3,2],list:[3,2,4],iter:[3,2],correct:3,tunnel:3,adjust:3,small:2,setdragcoeffici:3,freed:3,setup:[3,1],dir:2,smaller:[3,2],p_j:2,unnorm:2,natur:3,compens:2,direct:2,zero:2,pass:3,massscal:2,p_t:2,correspond:3,even:3,index:[3,2],hide:2,section:3,brief:4,current:[3,2,4],delet:3,intersect:3,"new":[3,2],impuls:[3,2],method:3,movement:[3,2],intellectu:0,mindic:2,usag:[3,1],gener:[3,2],coeffici:[3,2],onli:3,here:[3,2,4],modif:0,decrefcount:3,depend:[3,2],vertic:[3,2],p_2:2,sinc:3,p_0:2,p_1:2,shift:3,setposit:3,pick:3,implement:[3,2],eshear:3,regardless:3,appli:[3,2],modul:[1,4],"while":3,c_1:2,c_0:2,c_2:2,clothfabriccook:3,instabl:[3,2],from:[0,2,3,4],describ:[3,2],particlecount:3,memori:3,doubl:2,stretchi:[3,2],two:3,live:3,call:3,type:[3,2],tell:3,more:3,desir:3,settetherconstraintstiff:3,relat:[0,4],notic:[0,1,3],c_t:2,particular:2,ebend:3,hold:3,reproduct:0,graphic:3,retriev:3,stretchlimit:2,prepar:4,work:[3,2],fast:3,remain:2,pxquat:3,vertexcount:3,can:[3,2,4],d3d11:3,could:3,control:3,nearest:2,give:[3,2,4],lock:3,share:3,indic:[3,2],high:2,sphere:[3,2],proprietari:0,bend:2,want:[3,4],setconvex:3,alwai:3,differenti:[3,2],multipl:[3,2],straightforward:3,stride:3,devicecount:3,how:[3,2],instead:[3,2],config:3,sin:2,updat:2,collisionshap:3,frac:2,teleport:3,tetherconstraintstiff:2,max:2,after:[3,2],constraint:[3,2],befor:3,plane:[3,2],mai:3,end:[3,2],data:[3,2,4],stabil:3,alloc:3,setwindveloc:3,createcloth:3,explicit:2,nvclothcookfabricfrommesh:3,element:2,caus:[3,2],inform:[3,2],"switch":3,combin:2,allow:3,nvidia:[0,1],order:[3,2],wind:[3,2],rotat:2,over:3,move:[3,2],settransl:3,sphere_radiu:2,nv_cloth_delet:3,through:3,same:[3,2,4],d3d_driver_type_hardwar:3,still:3,vari:3,paramet:3,snippet:3,group:3,render:3,fix:[3,2],better:3,platform:[3,2],pend:3,mrestvalu:2,bypass:4,clothimpl:2,featurelevel:3,might:[3,2],them:3,good:3,"return":3,thei:3,handl:[3,4],deiniti:3,sooner:2,"break":3,mappedrang:3,now:3,somewher:3,name:2,anyth:3,simpl:3,stiff:[3,2],separ:[3,2],easili:3,each:[3,2],mean:3,compil:4,prohibit:0,cudacontext:3,weight:2,replac:[3,2],idea:3,dx11:3,been:3,"static":3,connect:[3,2],fluctuat:2,happen:2,todo:2,space:[3,2],goe:2,settriangl:3,content:1,rewrit:2,vector:[3,2],rel:3,setangularinertia:3,factori:3,common:3,mphase:2,log2:2,advanc:3,differ:[3,2],selfcollideparticl:2,removecloth:3,releas:3,"byte":3,compressionlimitc:2,cuctxdestroi:3,setliftcoeffici:3,reusabl:3,thread:3,angl:2,frequenc:[3,2],veloc:2,keep:[3,2],motion:[3,2],thing:3,length:[3,2],enforc:2,due:2,outsid:2,nvcloth:[3,1,4],retain:0,first:[3,2],origin:[3,2],softwar:0,rang:3,directli:[3,4],curesult:3,cuda_success:3,arrai:[3,2],independ:2,scene:3,sometim:3,alreadi:3,done:2,construct:3,setcapsul:3,miss:3,size:[3,2],given:2,getnumspher:3,licens:0,system:3,least:3,too:2,gpu:3,dt1:2,dt0:2,store:[3,2],dampexpon:2,getnumtriangl:3,option:3,endsimul:3,lower:3,specifi:[3,2],part:[3,2,4],quad:[3,4],exactli:2,constrainsepar:2,ehorizont:3,target:[3,2],provid:[3,4],remov:3,d3d11createdevic:3,structur:2,horizont:[3,2],reus:2,posit:[3,2],dxcontextmanagercallback:3,initi:3,trianglecount:3,abov:[3,2],sphererang:3,clothfabricphasetyp:3,ani:[0,3],sqrlength:2,thereto:0,constrainteth:2,togglecont:2,initializenvcloth:3,need:[3,2],clothmeshdesc:3,mset:2,tether:[3,2],issu:3,strength:3,d3d_feature_level:3,lib:4,min:2,destroi:3,self:[3,2],accuraci:3,note:[3,2],also:[3,2],exampl:3,which:[3,2,4],graviti:3,singl:2,clearinertia:3,simplifi:3,begin:[3,2],distribut:0,normal:2,multipli:[3,2],dxdevic:3,previou:[3,2],phaseconfig:[3,2],react:3,most:3,cucontext:3,pair:[3,2],collideparticl:2,"class":3,particle_invmass:2,later:3,flow:2,doe:[3,2],settetherconstraintscal:3,runtim:[3,4],occasion:2,constrain:[3,2],usual:2,settodefault:3,getcurrentparticl:3,show:[3,2],text:2,stiffnessexpon:2,radiu:2,getnumcapsul:3,concurr:3,dxdevicecontext:3,threshold:2,callback:3,help:[3,2],id3d11devic:3,slow:2,locat:3,copyright:[0,1],simulatechunk:3,explain:2,configur:3,state:2,should:[3,2],computebound:2,local:[3,2],reset:3,get:3,pxallocatorcallback:3,einvalid:3,express:0,cannot:3,phasetypeinfo:3,increas:[3,2],requir:3,slack:2,gust:3,nullptr:3,shape:3,integr:2,contain:[3,2],cudevicegetcount:3,where:2,set:[3,2],sear:2,frame:[3,2],displai:3,graphicscontextmanag:3,result:[3,2],respons:[3,2],reserv:0,particl:[3,2],detect:3,pxerrorcallback:3,sphere_cent:2,someth:3,dll:4,written:2,between:[3,2],theta:2,previous:3,across:3,extens:[3,1,4],solv:[3,2],inertia:3,addit:[3,2],mstretchlimit:3,both:2,last:[3,2],planesr:3,nvclothdestroyfactori:3,equal:3,setsolverfrequ:3,etc:3,instanc:[3,2],equat:2,context:3,getsimulationchunkcount:3,stiffnessc:2,whole:3,comment:2,acceler:[3,2],springi:3,point:[3,2],overview:[3,2],int32_t:3,pop:2,addcloth:3,guid:[3,1],divid:[3,2],coupl:3,stretch:2,damp:[3,2],devic:3,invers:[3,2],integrateparticl:2,destructor:3,compon:[3,2],valu:[3,2],stretchlimitc:2,setphaseconfig:3,argument:3,assert:3,coordin:3,lift:[3,2],togeth:3,nvclothcreatefactorydx11:3,"case":[3,2],align:3,properti:[0,3],mcloth:3,setgrav:3,air:3,log_2:2,defin:[3,2],calcul:[3,2],behavior:[3,2],error:[3,2],report:3,anchor:2,stiffnessfrequ:2,have:3,helper:3,mcompressionlimit:3,getnumconvex:3,influenc:3,particle_posit:2,itself:3,let:3,paw:2,perform:3,make:3,belong:2,sqrt:2,document:[0,2,1],higher:3,nvclothcreatefactorycuda:3,again:3,effect:3,mesh:[3,4],getnorm:3,user:[3,1,2,4],mani:3,chang:3,usemultipli:2,task:4,beginsimul:3,know:3,without:[0,2,3],thi:[0,2,3,4],interpol:2,everyth:3,dimension:2,left:2,distanc:2,getnumphas:3,execut:3,less:2,deltax:3,when:[3,2],deltaz:3,rest:[3,2],particleposit:3,deltai:3,speed:2,mstiff:3,struct:3,iterationst:2,add:3,divis:2,primit:3,els:2,euler:2,applic:3,numteth:2,meshdesc:3,bia:2,dxcontextmanagercallbackimpl:3,vacuum:3,pxvec4:[3,2],world:3,bit:3,pxvec3:3,insert:3,like:3,specif:2,arbitrari:3,cdot:2,corpor:0,manual:3,stiffnessmultipli:2,necessari:3,manag:3,right:[0,2],often:2,spring:3,some:3,d3d_feature_level_11_0:3,s_ok:3,intern:2,convex:3,setrot:3,sizeof:3,librari:[3,4],scale:[3,2],avoid:3,setlinearinertia:3,per:3,circ:2,compressionlimit:2,larg:2,setfrict:3,complic:3,refer:[3,2],core:4,object:3,reach:[3,2],updatesleepst:2,agreement:0,interfac:3,broken:3,step:[3,2],although:2,offset:2,d3d11_sdk_version:3,stage:3,continu:3,about:3,applywind:2,deltatim:3,createsolv:3,simul:[3,2],disclosur:0,cuda:3,underwat:3,disabl:3,setcentrifugalinertia:3,own:[3,4],xyz:[3,2],"float":[3,2],particle_position0:2,particle_position1:2,phase:[3,2],setspher:3,vertexarrai:3,ensur:[3,2],mphaseindex:3,your:3,accordingli:3,strechlimitc:2,triangl:[3,2,4],fabric:[3,2,4],wai:3,area:2,support:4,transform:[3,2],"long":3,createfabr:3,start:[3,2],restlength:2,includ:[3,2,4],strictli:0,physx:[3,2],"function":[3,2,4],properli:3,forc:3,epsilon:2,nvclothext:3,refcount:3,oscil:3,cloth:[3,2],triangler:3,delta:2,count:[3,2],numparticl:2,tetherlength:2,cleanup:3,consist:3,"default":3,maximum:2,below:3,limit:2,pxprofilercallback:3,problem:[3,2],similar:3,clear:3,featur:[3,2,4],constant:2,creat:[3,2],"int":3,mask:3,inv:2,doesn:3,repres:3,decreas:3,invmass:[3,2],improv:3,check:[3,2],fill:3,constrainmot:2,collid:[3,2],setdamp:[3,2],piw:2,detail:[3,2],other:[3,2],capsuleindic:3,test:2,you:3,logdamp:2,multiplierc:2,c_j:2,constraintmot:2,center:2,vertex:3,pxasserthandl:3,getnumplan:3,drag:[3,2],veri:3,nvclothcreatefactorycpu:3,reduc:[3,2],id3d11devicecontext:3,featurelevelresult:3,algorithm:2,cooker:3,inaccuraci:2,collis:[3,2],descript:4,pseudo:2,hresult:3,safe:3,mass:[3,2],time:[3,2],licensor:0,cpu:3},objtypes:{},titles:["NVIDIA Copyright Notice","NVIDIA(R) NvCloth Documentation","Internal solver function/algorithm documentation","Users guide","Modules"],objnames:{},filenames:["CopyRight/Index","NvCloth","Solver/Index","UsersGuide/Index","Modules/Index"]})
\ No newline at end of file +Search.setIndex({envversion:42,terms:{all:[3,2,4],code:[5,2],orthogon:5,indirectli:2,skip:2,global:2,sleep:5,capsul:[1,2],follow:[5,2],"const":2,solvefabr:5,text:5,lrg:5,offlin:4,volum:5,radiu:5,setplan:2,cook:[2,4],evert:2,ajust:5,brows:0,cuctxcreat:2,pbw:5,dampen:2,doesn:[1,2],stiff:[5,1,2],list:[5,2,4],iter:[5,2],tunnel:2,adjust:2,small:5,setdragcoeffici:2,refer:[5,2],dir:5,smaller:[5,2],p_j:5,unnorm:5,natur:2,compens:5,direct:5,zero:5,design:0,pass:2,massscal:5,p_t:5,correspond:2,even:2,index:[5,2],hide:5,section:2,brief:4,current:[5,2,4],delet:2,intersect:2,impuls:[5,2],method:2,movement:[5,2],intellectu:3,mindic:5,gener:[5,2],coeffici:[5,2],onli:[1,2],here:[5,2,4],modif:3,ubuntu:1,depend:[5,2],vertic:[5,2],p_2:5,sinc:2,p_0:5,p_1:5,search:0,shift:2,setposit:2,pick:2,implement:[5,1,2],eshear:2,regardless:2,appli:[5,2],c_1:5,c_0:5,c_2:5,clothfabriccook:2,instabl:[5,2],from:[3,5,2,4],describ:[5,2],particlecount:2,memori:2,doubl:5,stretchi:[5,2],two:2,live:2,call:2,type:[5,2],tell:2,more:[],desir:2,settetherconstraintstiff:2,relat:[3,4],pxprofilercallback:2,flag:1,c_t:5,particular:5,ebend:2,hold:2,reproduct:3,graphic:2,stretchlimit:5,prepar:4,applywind:5,dxcontextmanagercallbackimpl:2,remain:5,pxquat:2,vertexcount:2,can:[5,2,4],d3d11:2,veloc:5,control:2,nearest:5,give:[5,2,4],lock:2,share:2,calcul:[5,2],indic:[5,2],high:5,sphere:[5,1,2],proprietari:3,bend:5,want:[2,4],setconvex:2,alwai:2,gcc:1,multipl:[5,2],straightforward:2,thing:2,divis:5,how:[5,2],pseudo:5,instead:[5,2],simpl:2,sin:5,updat:5,product:0,collisionshap:2,frac:5,teleport:2,tetherconstraintstiff:5,setangularinertia:2,after:[5,2],differenti:[5,2],befor:2,mac:1,plane:[5,2],mai:2,end:[5,2],data:4,stabil:2,alloc:2,setwindveloc:2,createcloth:2,explicit:5,nvclothcookfabricfrommesh:2,element:5,caus:[5,1,2],inform:[5,2],"switch":2,combin:5,allow:2,order:[5,2],wind:[],rotat:5,over:2,move:[5,2],sphere_radiu:5,nv_cloth_delet:2,through:2,sqrt:5,restlength:5,d3d_driver_type_hardwar:2,still:2,vari:2,directx:1,paramet:2,snippet:2,group:2,render:2,fix:[5,2],better:2,window:1,pend:2,mrestvalu:5,bypass:4,clothimpl:5,featurelevel:2,main:[],might:[5,2],them:2,good:2,"return":2,thei:2,handl:[2,4],deiniti:2,sooner:5,"break":2,mappedrang:2,now:[1,2],somewher:2,name:5,anyth:2,config:2,solver:[],easili:2,each:[5,2],debug:1,mean:2,compil:4,prohibit:3,cudacontext:2,weight:5,replac:[5,2],idea:2,playstat:1,dx11:[1,2],"static":2,connect:[5,2],fluctuat:5,happen:5,todo:5,getnumcloth:1,space:5,goe:5,settriangl:2,your:2,profil:2,rewrit:5,vector:[5,2],suitabl:0,rel:2,max:5,correct:2,mphase:5,log2:5,advanc:2,differ:[5,2],selfcollideparticl:5,removecloth:2,"byte":2,compressionlimitc:5,cuctxdestroi:2,setliftcoeffici:2,reusabl:2,thread:2,angl:5,frequenc:[5,2],could:2,keep:[5,2],motion:[5,2],stride:2,length:[5,2],enforc:5,outsid:5,nvcloth:3,retain:3,summari:[],interact:0,first:[5,2],origin:[5,2],softwar:3,rang:2,directli:[2,4],curesult:2,cuda_success:2,arrai:[5,2],independ:5,scene:[1,2],sometim:2,alreadi:[1,2],done:5,least:2,setcapsul:2,miss:2,size:[5,2],given:5,"long":2,start:[5,2],licens:3,system:2,construct:2,too:5,gpu:2,dt1:5,dt0:5,store:[5,2],low:0,dampexpon:5,getnumtriangl:2,option:2,endsimul:2,usemultipli:5,specifi:[5,2],part:[5,2,4],quad:[2,4],exactli:5,strictli:3,ehorizont:2,stiffnessc:5,target:[5,2],provid:[0,2,4],remov:2,d3d11createdevic:2,horizont:[5,2],reus:5,posit:[5,2],dxcontextmanagercallback:2,initi:[],trianglecount:2,behavior:[5,2],sphererang:2,clothfabricphasetyp:2,ani:[3,2],sqrlength:5,thereto:3,constrainteth:5,togglecont:5,initializenvcloth:2,need:[5,2],clothmeshdesc:2,mset:5,strength:2,d3d_feature_level:2,lib:4,min:5,destroi:2,self:[5,2],accuraci:2,also:[5,2],without:[3,5,2],build:1,which:[5,2,4],graviti:2,singl:5,clearinertia:2,simplifi:2,begin:[5,2],distribut:3,normal:5,multipli:[5,2],dxdevic:2,previou:[5,2],phaseconfig:[5,2],react:2,most:2,beta:1,cucontext:2,thi:[3,5,2,4],pair:[5,2],collideparticl:5,oscil:2,"class":2,rendercloth:1,particle_invmass:5,later:2,flow:5,doe:[5,2],settetherconstraintscal:2,runtim:[2,4],hresult:2,occasion:5,constrain:[5,2],left:5,settodefault:2,getcurrentparticl:2,show:[5,2],opposit:5,xcode:1,stiffnessexpon:5,friction:[1,2],concurr:2,dxdevicecontext:2,threshold:5,callback:2,help:[5,2],access:0,id3d11devic:2,slow:5,locat:2,simulatechunk:2,explain:5,configur:2,written:5,should:[5,2],computebound:5,sierra:1,local:5,count:[5,2],get:2,pxallocatorcallback:2,einvalid:2,express:3,cannot:2,phasetypeinfo:2,increas:[5,2],requir:2,gust:2,nullptr:2,shape:[1,2],contain:[5,2],cudevicegetcount:2,where:[5,1],view:0,set:[5,2],sear:5,frame:[5,2],maximum:5,graphicscontextmanag:2,result:[5,2],respons:[0,5,2],mstiff:2,reserv:3,charact:0,improv:[1,2],pxerrorcallback:2,sphere_cent:5,someth:2,dll:4,state:5,devicecount:2,between:[5,2],theta:5,previous:2,across:2,nvclothdestroyfactori:2,solv:[5,2],inertia:2,addit:[5,2],mstretchlimit:2,both:5,last:[5,2],planesr:2,equal:2,setsolverfrequ:2,etc:2,instanc:[5,2],equat:5,context:2,getsimulationchunkcount:2,let:2,whole:2,comment:5,acceler:[5,2],springi:2,point:[5,2],int32_t:2,decrefcount:2,pop:5,addcloth:2,linux:1,divid:[5,2],coupl:2,stretch:5,damp:[5,2],devic:2,invers:[5,2],been:2,destructor:2,valu:[5,2],stretchlimitc:5,getclothlist:1,argument:2,assert:[1,2],coordin:2,lift:5,togeth:2,nvclothcreatefactorydx11:2,"case":[5,2],align:2,properti:3,mcloth:2,setgrav:2,air:[1,2],log_2:5,defin:[5,2],"while":2,abov:[5,2],error:[5,2],report:2,anchor:5,stiffnessfrequ:5,have:2,helper:2,mcompressionlimit:2,getnumconvex:2,particle_posit:5,itself:2,crash:1,develop:0,paw:5,perform:2,make:2,belong:5,x64:1,same:[5,2,4],document:3,higher:2,nvclothcreatefactorycuda:2,constrainmot:5,optim:1,effect:2,mesh:[2,4],getnorm:2,user:[5,4],mani:2,robust:0,chang:[1,2],lower:2,task:4,beginsimul:2,anim:0,exampl:2,uint32_t:2,interpol:5,ccd:1,everyth:2,dimension:5,usual:5,getnumphas:2,execut:2,less:5,deltax:2,when:[5,2],deltaz:2,rest:[5,2],particleposit:2,deltai:2,speed:5,yet:1,ps4:1,settransl:2,struct:2,easi:0,iterationst:5,studio:1,littl:0,add:2,other:[5,2],primit:2,els:5,euler:5,applic:[0,2],numteth:5,meshdesc:2,bia:5,game:0,know:2,vacuum:2,pxvec4:[5,2],world:2,bit:2,pxvec3:2,insert:2,like:2,specif:5,arbitrari:2,cdot:5,corpor:3,manual:2,stiffnessmultipli:5,xbox:1,necessari:2,realtim:0,manag:2,right:[3,5],often:5,spring:2,some:2,d3d_feature_level_11_0:2,s_ok:2,sampl:1,convex:2,setrot:2,sizeof:2,librari:4,scale:[5,2],avoid:2,setlinearinertia:2,per:[1,2],circ:5,compressionlimit:5,larg:5,setfrict:2,complic:2,freed:2,core:4,object:2,reach:[5,2],updatesleepst:5,agreement:3,broken:2,step:[5,2],although:5,offset:5,d3d11_sdk_version:2,stage:2,about:[],would:1,constraint:[],deltatim:2,createsolv:2,page:0,disclosur:3,cuda:[1,2],underwat:2,disabl:2,particle_position1:5,setcentrifugalinertia:2,own:[2,4],visit:0,xyz:[5,2],"float":[5,2],particle_position0:5,due:5,phase:[5,2],integrateparticl:5,vertexarrai:2,ensur:[5,2],mphaseindex:2,setspher:2,accordingli:2,strechlimitc:5,triangl:[4,5,1,2],fabric:4,wai:2,area:5,support:4,transform:[5,2],fast:[0,2],createfabr:2,getnumspher:2,interfac:[0,1,2],includ:[5,2,4],overhead:0,constrainsepar:5,physx:[5,2],"function":4,properli:2,forc:2,epsilon:5,nvclothext:2,refcount:2,continu:2,cloth:5,triangler:2,delta:5,level:0,bug:1,sdk:1,reset:2,numparticl:5,tetherlength:5,consist:2,"default":2,displai:2,below:2,limit:5,getnumcapsul:2,problem:[5,2],similar:2,clear:2,featur:4,constant:5,creat:[5,2],"int":2,descript:4,inv:5,mstiffnessmultipli:2,repres:2,decreas:2,home:0,work:[5,1,2],check:[5,2],fill:2,again:2,collid:[5,2],cmake:1,setdamp:[5,2],piw:5,detail:[5,2],cleanup:2,capsuleindic:2,setphaseconfig:2,test:[5,1],you:2,logdamp:5,multiplierc:5,c_j:5,constraintmot:5,center:5,vertex:2,pxasserthandl:2,getnumplan:2,drag:5,veri:2,nvclothcreatefactorycpu:2,reduc:[5,2],land:[],id3d11devicecontext:2,featurelevelresult:2,cooker:2,inaccuraci:5,collis:5,mask:2,visual:1,influenc:2,safe:2,mass:[5,2],time:[5,2],licensor:3,cpu:[1,2]},objtypes:{},objnames:{},filenames:["index","ReleaseNotes/index","UserGuide/Index","CopyRight/Index","Modules/Index","Solver/Index"],titles:["NvCloth","Release Notes","User Guide","NVIDIA Copyright Notice","Modules","Internal solver function/algorithm documentation"],objects:{},titleterms:{compil:1,featur:1,edg:5,nvidia:3,overview:5,modul:4,known:1,intern:5,distanc:5,invmass:5,guid:2,tether:[5,2],particl:5,compon:5,detect:2,fabric:[5,2],copyright:3,space:2,support:1,note:1,platform:1,collis:2,librari:2,"new":1,document:5,local:2,factori:2,integr:5,"function":5,nvcloth:[0,4],usag:2,notic:3,constraint:5,cloth:2,drag:2,lift:2,user:2,releas:1,data:[5,2],about:0,retriev:2,slack:5,algorithm:5,extens:4,setup:2,solver:[5,2],structur:5,simul:[5,2],issu:1,properti:2,common:2,learn:0,separ:5,more:0,initi:2,fix:1,wind:[5,2]}})
\ No newline at end of file diff --git a/NvCloth/extensions/src/ClothGeodesicTetherCooker.cpp b/NvCloth/extensions/src/ClothGeodesicTetherCooker.cpp index 00f9cb2..0a27337 100644 --- a/NvCloth/extensions/src/ClothGeodesicTetherCooker.cpp +++ b/NvCloth/extensions/src/ClothGeodesicTetherCooker.cpp @@ -369,14 +369,14 @@ void ClothGeodesicTetherCooker::createTetherData(const ClothMeshDesc &desc) mAttached.resize(mNumParticles); PxStrideIterator<const PxVec3> pIt(reinterpret_cast<const PxVec3*>(desc.points.data), desc.points.stride); PxStrideIterator<const PxReal> wIt(reinterpret_cast<const PxReal*>(desc.invMasses.data), desc.invMasses.stride); - for(PxU32 i=0; i<mNumParticles; ++i) + for (PxU32 i=0; i<mNumParticles; ++i) { mVertices[i] = *pIt++; mAttached[i] = PxU8(wIt.ptr() ? (*wIt++ == 0.0f) : 0); } // build triangle indices - if(desc.flags & MeshFlag::e16_BIT_INDICES) + if (desc.flags & MeshFlag::e16_BIT_INDICES) gatherIndices<PxU16>(mIndices, desc.triangles, desc.quads); else gatherIndices<PxU32>(mIndices, desc.triangles, desc.quads); @@ -392,7 +392,7 @@ void ClothGeodesicTetherCooker::createTetherData(const ClothMeshDesc &desc) // build adjacent vertex list nv::cloth::Vector<PxU32>::Type valency(mNumParticles+1, 0); nv::cloth::Vector<PxU32>::Type adjacencies; - if(desc.flags & MeshFlag::e16_BIT_INDICES) + if (desc.flags & MeshFlag::e16_BIT_INDICES) gatherAdjacencies<PxU16>(valency, adjacencies, desc.triangles, desc.quads); else gatherAdjacencies<PxU32>(valency, adjacencies, desc.triangles, desc.quads); @@ -400,7 +400,7 @@ void ClothGeodesicTetherCooker::createTetherData(const ClothMeshDesc &desc) // build unique neighbors from adjacencies nv::cloth::Vector<PxU32>::Type mark(valency.size(), 0); nv::cloth::Vector<PxU32>::Type neighbors; neighbors.reserve(adjacencies.size()); - for(PxU32 i=1, j=0; i<valency.size(); ++i) + for (PxU32 i=1, j=0; i<valency.size(); ++i) { for(; j<valency[i]; ++j) { diff --git a/NvCloth/extensions/src/ClothSimpleTetherCooker.cpp b/NvCloth/extensions/src/ClothSimpleTetherCooker.cpp index 73884d9..daad774 100644 --- a/NvCloth/extensions/src/ClothSimpleTetherCooker.cpp +++ b/NvCloth/extensions/src/ClothSimpleTetherCooker.cpp @@ -105,7 +105,10 @@ void ClothSimpleTetherCooker::createTetherData(const ClothMeshDesc &desc) float sqrDist = (reinterpret_cast<const PxVec3&>( particles[*aIt]) - position).magnitudeSquared(); if(minSqrDist > sqrDist) - minSqrDist = sqrDist, minIndex = *aIt; + { + minSqrDist = sqrDist; + minIndex = *aIt; + } } mTetherAnchors.pushBack(minIndex); diff --git a/NvCloth/include/NvCloth/Cloth.h b/NvCloth/include/NvCloth/Cloth.h index 9bf2bd0..3d783e9 100644 --- a/NvCloth/include/NvCloth/Cloth.h +++ b/NvCloth/include/NvCloth/Cloth.h @@ -388,7 +388,12 @@ class Cloth : public UserAllocated ///Returns value set with setSelfCollisionStiffness(). virtual float getSelfCollisionStiffness() const = 0; + /** \brief Set self collision indices. + Each index in the range indicates that the particle at that index should be used for self collision. + If set to an empty range (default) all particles will be used. + */ virtual void setSelfCollisionIndices(Range<const uint32_t>) = 0; + ///Returns the number of self collision indices set. virtual uint32_t getNumSelfCollisionIndices() const = 0; /* rest positions */ diff --git a/NvCloth/include/NvCloth/Solver.h b/NvCloth/include/NvCloth/Solver.h index 9d1e373..d2eb955 100644 --- a/NvCloth/include/NvCloth/Solver.h +++ b/NvCloth/include/NvCloth/Solver.h @@ -30,6 +30,7 @@ #pragma once #include "NvCloth/Allocator.h" +#include "PsArray.h" namespace nv { @@ -52,11 +53,17 @@ class Solver : public UserAllocated public: virtual ~Solver() {} - /// Adds cloth object, returns true if successful. - virtual void addCloth(Cloth*) = 0; + /// Adds cloth object. + virtual void addCloth(Cloth* cloth) = 0; /// Removes cloth object. - virtual void removeCloth(Cloth*) = 0; + virtual void removeCloth(Cloth* cloth) = 0; + + /// Returns the numer of cloths added to the solver. + virtual int getNumCloths() const = 0; + + /// Returns the pointer to the first cloth added to the solver + virtual Cloth * const * getClothList() const = 0; // functions executing the simulation work. /** \brief Begins a simulation frame. diff --git a/NvCloth/samples/SampleBase/renderer/ClothRenderMesh.cpp b/NvCloth/samples/SampleBase/renderer/ClothRenderMesh.cpp index 60bb5f3..1183bdb 100644 --- a/NvCloth/samples/SampleBase/renderer/ClothRenderMesh.cpp +++ b/NvCloth/samples/SampleBase/renderer/ClothRenderMesh.cpp @@ -158,27 +158,30 @@ ClothRenderMesh::~ClothRenderMesh() void ClothRenderMesh::update(const PxVec3* positions, uint32_t numVertices) { PxStrideIterator<const PxVec3> pIt(positions, sizeof(PxVec3)); + Vertex* vertices = mVertices.data(); + const uint16_t* indices = mIndices.data(); for (PxU32 i = 0; i < numVertices; ++i) { - mVertices[i].position = *pIt++; - mVertices[i].normal = PxVec3(0.f); + vertices[i].position = *pIt++; + vertices[i].normal = PxVec3(0.f); } - for (PxU32 i = 0; i < mIndices.size(); i += 3) + const PxU32 numIndices = (PxU32)mIndices.size(); + for (PxU32 i = 0; i < numIndices; i += 3) { - auto p0 = mVertices[mIndices[i]].position; - auto p1 = mVertices[mIndices[i + 1]].position; - auto p2 = mVertices[mIndices[i + 2]].position; + const auto p0 = vertices[indices[i]].position; + const auto p1 = vertices[indices[i + 1]].position; + const auto p2 = vertices[indices[i + 2]].position; - auto normal = ((p2 - p0).cross(p1 - p0)).getNormalized(); + const auto normal = ((p2 - p0).cross(p1 - p0)).getNormalized(); - mVertices[mIndices[i]].normal += normal; - mVertices[mIndices[i + 1]].normal += normal; - mVertices[mIndices[i + 2]].normal += normal; + vertices[indices[i]].normal += normal; + vertices[indices[i + 1]].normal += normal; + vertices[indices[i + 2]].normal += normal; } for (PxU32 i = 0; i < numVertices; ++i) - mVertices[i].normal.normalize(); + vertices[i].normal.normalize(); ID3D11DeviceContext* context; mDevice->GetImmediateContext(&context); diff --git a/NvCloth/samples/SampleBase/scene/Scene.cpp b/NvCloth/samples/SampleBase/scene/Scene.cpp index 130dad3..6296a05 100644 --- a/NvCloth/samples/SampleBase/scene/Scene.cpp +++ b/NvCloth/samples/SampleBase/scene/Scene.cpp @@ -13,14 +13,391 @@ #include <NvCloth/Solver.h> #include <NvCloth/Fabric.h> #include "Renderer.h" +#include "imgui.h" +#include <sstream> +#include "utils/DebugLineRenderBuffer.h" +#include <foundation/PxVec2.h> std::vector<SceneFactory> Scene::sSceneFactories; +unsigned int Scene::mDebugVisualizationFlags; +Scene::SceneDebugRenderParams Scene::sSceneDebugRenderParams; Scene::~Scene() { } +void Scene::UpdateParticleDragging(float dt) +{ + physx::PxVec2 screenResolution( + mSceneController->getRenderer().getScreenWidth(), + mSceneController->getRenderer().getScreenHeight()); + + physx::PxMat33 invScreenTransform; + { + float m[]{2.0f / screenResolution.x, 0.0f, 0.0f, 0.0f, -2.0f / screenResolution.y, 0.0f, -1.0f, 1.0f, 1.0f}; + invScreenTransform = physx::PxMat33(m); + } + + physx::PxVec2 mousePoint; + { + POINT wpt; + GetCursorPos(&wpt); + ScreenToClient(GetDeviceManager()->GetHWND(), &wpt); + int x, y; + x = wpt.x; + y = wpt.y; + physx::PxVec3 pt(invScreenTransform*physx::PxVec3((float)x, (float)y, 1.0f)); + mousePoint.x = pt.x; + mousePoint.y = pt.y; + } + + physx::PxMat44 viewProjectionMatrix; + physx::PxVec3 viewDirection; + physx::PxVec3 viewPoint; + { + auto camera = mSceneController->getRenderer().getCamera(); + auto m1 = camera.GetViewMatrix(); + auto m2 = camera.GetProjMatrix(); + viewProjectionMatrix = physx::PxMat44((float*)&m2.r)*physx::PxMat44((float*)&m1.r); + auto v1 = camera.GetWorldAhead(); + viewDirection = physx::PxVec3(*(physx::PxVec3*)&v1); + auto v2 = camera.GetEyePt(); + viewPoint = physx::PxVec3(*(physx::PxVec3*)&v2); + } + + if(mDraggingParticle.mTrackedCloth) + { + nv::cloth::Cloth* cloth = mDraggingParticle.mTrackedCloth->mCloth; + physx::PxMat44 modelMatrix = GetDebugDrawTransform(*mDraggingParticle.mTrackedCloth); + nv::cloth::Range<physx::PxVec4> particles = cloth->getCurrentParticles(); + nv::cloth::Range<physx::PxVec4> prevParticles = cloth->getPreviousParticles(); + + physx::PxMat44 tmp = viewProjectionMatrix; + auto tmp2 = DirectX::XMMatrixInverse(nullptr, DirectX::XMMATRIX(tmp.front())); + tmp = physx::PxMat44((float*)&tmp2.r); + physx::PxMat44 invMatrix = tmp; + + physx::PxVec3 particleWorld = modelMatrix.transform(particles[mDraggingParticle.mParticleIndex].getXYZ()); + physx::PxVec4 mousePointWorldT = invMatrix.transform(physx::PxVec4(mousePoint.x, mousePoint.y, 1.0, 1.0)); + physx::PxVec3 mousePointWorld = mousePointWorldT.getXYZ() / mousePointWorldT.w; + physx::PxVec3 mouseRayStart = viewPoint; + physx::PxVec3 mouseRayDir = (mousePointWorld - mouseRayStart).getNormalized(); + //float rayT = -viewDirection.dot(mouseRayStart - particleWorld) / viewDirection.dot(mouseRayDir); //intersect plane + float rayT = mDraggingParticle.mDist; + physx::PxVec3 mousePointPlane = mouseRayStart + mouseRayDir*rayT; + + physx::PxVec3 offset = mousePointPlane - particleWorld; + if(offset.magnitudeSquared() > 2.5f*2.5f) + offset = offset.getNormalized()*2.5f; + + for(int i = 0; i < (int)particles.size(); i++) + { + physx::PxVec4 p = particles[i]; + float dist = (p.getXYZ() - particleWorld).magnitude(); + + if(p.w > 0.0f) //Only move dynamic points + { + float weight = max(0.0,min(1.0,0.4-dist)); + physx::PxVec3 point0(prevParticles[i].x, prevParticles[i].y, prevParticles[i].z); + point0 = point0 - weight*offset; + point0 = point0*0.99f + p.getXYZ()*0.01f; + //move previous particle in the opposite direction to avoid invalid configurations in the next solver iteration. + prevParticles[i] = physx::PxVec4(point0.x, point0.y, point0.z, prevParticles[i].w); + } + } + } +} + + +bool Scene::HandleEvent(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + auto camera = mSceneController->getRenderer().getCamera(); + auto m1 = camera.GetViewMatrix(); + auto m2 = camera.GetProjMatrix(); + + return HandlePickingEvent(uMsg, wParam, lParam, physx::PxMat44((float*)&m2.r)*physx::PxMat44((float*)&m1.r)); +} + +bool Scene::HandlePickingEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, physx::PxMat44 viewProjectionMatrix2) +{ + if(uMsg != WM_LBUTTONDOWN && uMsg != WM_LBUTTONUP) + return false; + + physx::PxVec2 screenResolution( + mSceneController->getRenderer().getScreenWidth(), + mSceneController->getRenderer().getScreenHeight()); + + physx::PxMat33 invScreenTransform; + { + float m[]{2.0f / screenResolution.x, 0.0f, 0.0f, 0.0f, -2.0f / screenResolution.y, 0.0f, -1.0f, 1.0f, 1.0f}; + invScreenTransform = physx::PxMat33(m); + } + + physx::PxVec2 mousePoint; + { + int x, y; + x = LOWORD(lParam); + y = HIWORD(lParam); + physx::PxVec3 pt(invScreenTransform*physx::PxVec3((float)x, (float)y, 1.0f)); + mousePoint.x = pt.x; + mousePoint.y = pt.y; + } + + physx::PxMat44 viewProjectionMatrix; + physx::PxVec3 viewDirection; + physx::PxVec3 viewPoint; + { + auto camera = mSceneController->getRenderer().getCamera(); + auto m1 = camera.GetViewMatrix(); + auto m2 = camera.GetProjMatrix(); + viewProjectionMatrix = physx::PxMat44((float*)&m2.r)*physx::PxMat44((float*)&m1.r); + auto v1 = camera.GetWorldAhead(); + viewDirection = physx::PxVec3(*(physx::PxVec3*)&v1); + auto v2 = camera.GetEyePt(); + viewPoint = physx::PxVec3(*(physx::PxVec3*)&v2); + } + + if(uMsg == WM_LBUTTONDOWN) + { + mDraggingParticle.mDist = 9999999.0f; + mDraggingParticle.mOffset = 9999999.0f; + mDraggingParticle.mTrackedCloth = nullptr; + for(auto it : mClothList) + { + nv::cloth::Cloth* cloth = it->mCloth; + physx::PxMat44 modelMatrix = GetDebugDrawTransform(*it); + nv::cloth::Range<physx::PxVec4> particles = cloth->getCurrentParticles(); + + physx::PxMat44 tmp = viewProjectionMatrix; + auto tmp2 = DirectX::XMMatrixInverse(nullptr, DirectX::XMMATRIX(tmp.front())); + tmp = physx::PxMat44((float*)&tmp2.r); + physx::PxMat44 invMatrix = tmp; + + physx::PxVec4 mousePointWorldT = invMatrix.transform(physx::PxVec4(mousePoint.x, mousePoint.y, 1.0, 1.0)); + physx::PxVec3 mousePointWorld = mousePointWorldT.getXYZ() / mousePointWorldT.w; + physx::PxVec3 mouseRayStart = viewPoint; + physx::PxVec3 mouseRayDir = (mousePointWorld - mouseRayStart).getNormalized(); + + for(int i = 0; i<(int)particles.size(); i++) + { + physx::PxVec4 p = particles[i]; + physx::PxVec4 point(p.x, p.y, p.z, 1.0f); + + float dist = mouseRayDir.dot(point.getXYZ() - mouseRayStart); + float offset = (point.getXYZ() - (dist*mouseRayDir + mouseRayStart)).magnitude(); + + if(offset<0.1f) + { + if(mDraggingParticle.mDist + 0.5f*mDraggingParticle.mOffset>dist + 0.5f*offset) + { + mDraggingParticle.mTrackedCloth = it; + //mDraggingParticle.mOffset = offset; + mDraggingParticle.mDist = dist; + mDraggingParticle.mParticleIndex = i; + } + } + } + } + return true; + } + if(uMsg == WM_LBUTTONUP) + { + mDraggingParticle.mTrackedCloth = nullptr; + return true; + } + return false; +} + +void Scene::drawUI() +{ + static int activeCloth = 0; + + if(ImGui::TreeNode("Cloth Properties")) + { + activeCloth = min(activeCloth, (int)mClothList.size() - 1); + for(int i = 0; i < (int)mClothList.size(); i++) + { + if(i) + ImGui::SameLine(); + nv::cloth::Cloth* cloth = mClothList[i]->mCloth; + std::stringstream clothName; + clothName << "Cloth " << i; + ImGui::RadioButton(clothName.str().c_str(), &activeCloth, i); + } + + nv::cloth::Cloth* cloth = mClothList[activeCloth]->mCloth; + + + { + bool b = cloth->isContinuousCollisionEnabled(); + if(ImGui::Checkbox("Continuous Collision Detection (CCD)", &b)) + cloth->enableContinuousCollision(b); + } + { + physx::PxVec3 f3 = cloth->getDamping(); + if(ImGui::DragFloat3("Damping", &f3.x, 0.02f, 0.0f, 1.0f, "%.2f")) + cloth->setDamping(f3); + float f = f3.maxElement(); + if(ImGui::DragFloat("Damping xyz", &f, 0.02f, 0.0f, 1.0f, "%.2f")) + cloth->setDamping(physx::PxVec3(f,f,f)); + } + { + float f = cloth->getDragCoefficient(); + if(ImGui::DragFloat("Drag Coefficient", &f, 0.02f, 0.0f, 0.99f, "%.2f")) + cloth->setDragCoefficient(f); + } + { + float f = cloth->getFriction(); + if(ImGui::DragFloat("Friction", &f, 0.04f, 0.0f, 2.0f, "%.2f")) + cloth->setFriction(f); + } + { + physx::PxVec3 f3 = cloth->getGravity(); + if(ImGui::DragFloat3("Gravity", &f3.x, 0.5f, -50.0f, 50.0f, "%.1f")) + cloth->setGravity(f3); + } + { + float f = cloth->getLiftCoefficient(); + if(ImGui::DragFloat("Lift Coefficient", &f, 0.02f, 0.0f, 1.0f, "%.2f")) + cloth->setLiftCoefficient(f); + } + { + physx::PxVec3 f3 = cloth->getLinearInertia(); + if(ImGui::DragFloat3("Linear Inertia", &f3.x, 0.02f, 0.0f, 1.0f, "%.2f")) + cloth->setLinearInertia(f3); + float f = f3.maxElement(); + if(ImGui::DragFloat("Linear Inertia xyz", &f, 0.02f, 0.0f, 1.0f, "%.2f")) + cloth->setLinearInertia(physx::PxVec3(f, f, f)); + } + { + float f = cloth->getMotionConstraintScale(); + if(ImGui::DragFloat("Motion Constraint Scale", &f, 0.08f, 0.0f, 4.0f, "%.2f")) + cloth->setMotionConstraintScaleBias(f, cloth->getMotionConstraintBias()); + } + { + float f = cloth->getMotionConstraintBias(); + if(ImGui::DragFloat("Motion Constraint Bias", &f, 0.16f, 0.0f, 8.0f, "%.2f")) + cloth->setMotionConstraintScaleBias(cloth->getMotionConstraintScale(),f); + } + { + float f = cloth->getSelfCollisionDistance(); + if(ImGui::DragFloat("Self Collision Distance", &f, 0.005f, 0.0f, 0.3f, "%.3f")) + cloth->setSelfCollisionDistance(f); + } + { + float f = cloth->getSelfCollisionStiffness(); + if(ImGui::DragFloat("Self Collision Stiffness", &f, 0.02f, 0.0f, 1.0f, "%.2f")) + cloth->setSelfCollisionStiffness(f); + } + { + float f = cloth->getSleepThreshold(); + if(ImGui::DragFloat("Sleep Threshold", &f, 0.02f, 0.0f, 1.0f, "%.2f")) + cloth->setSleepThreshold(f); + } + { + float f = cloth->getStiffnessFrequency(); + if(ImGui::DragFloat("Stiffness Frequency", &f, 1.0f, 0.0f, 600.0f, "%.0f",1.5f)) + cloth->setStiffnessFrequency(f); + } + { + float f = cloth->getSolverFrequency(); + if(ImGui::DragFloat("Solver Frequency", &f, 1.0f, 0.0f, 600.0f, "%.0f", 1.5f)) + cloth->setSolverFrequency(f); + } + { + float f = cloth->getTetherConstraintScale(); + if(ImGui::DragFloat("Tether Constraint Scale", &f, 0.08f, 0.0f, 4.0f, "%.2f")) + cloth->setTetherConstraintScale(f); + } + { + float f = cloth->getTetherConstraintStiffness(); + if(ImGui::DragFloat("Tether Constraint Stiffness", &f, 0.02f, 0.0f, 1.0f, "%.2f")) + cloth->setTetherConstraintStiffness(f); + } + { + physx::PxVec3 f3 = cloth->getWindVelocity(); + if(ImGui::DragFloat3("Wind Velocity", &f3.x, 0.5f, -50.0f, 50.0f, "%.1f")) + cloth->setWindVelocity(f3); + } + ImGui::TreePop(); + } + + if(ImGui::TreeNode("Debug Visualization")) + { + ImGui::CheckboxFlags("Tethers", &mDebugVisualizationFlags, DEBUG_VIS_TETHERS); + ImGui::CheckboxFlags("Constraints", &mDebugVisualizationFlags, DEBUG_VIS_CONSTRAINTS); + if(mDebugVisualizationFlags&DEBUG_VIS_CONSTRAINTS) + { + ImGui::DragInt("Start Constraint Phase Range", &sSceneDebugRenderParams.mVisiblePhaseRangeBegin, 0.05, 0, 30); + ImGui::DragInt("End", &sSceneDebugRenderParams.mVisiblePhaseRangeEnd, 0.05, 0, 30); + } + ImGui::CheckboxFlags("Constraint Stiffness", &mDebugVisualizationFlags, DEBUG_VIS_CONSTRAINTS_STIFFNESS); + + ImGui::CheckboxFlags("Constraint Error", &mDebugVisualizationFlags, DEBUG_VIS_CONSTRAINT_ERROR); + ImGui::CheckboxFlags("Position Delta", &mDebugVisualizationFlags, DEBUG_VIS_POSITION_DELTA); + ImGui::CheckboxFlags("Bounding Box", &mDebugVisualizationFlags, DEBUG_VIS_BOUNDING_BOX); + ImGui::CheckboxFlags("Distance Constraints", &mDebugVisualizationFlags, DEBUG_VIS_DISTANCE_CONSTRAINTS); + + ImGui::TreePop(); + } + + static int activeSolver = 0; + + if(ImGui::TreeNode("Solver Properties")) + { + activeSolver = min(activeSolver, (int)mSolverList.size() - 1); + for(int i = 0; i < (int)mSolverList.size(); i++) + { + if(i) + ImGui::SameLine(); + nv::cloth::Solver* solver = mSolverList[i]; + std::stringstream clothName; + clothName << "Solver " << i; + ImGui::RadioButton(clothName.str().c_str(), &activeSolver, i); + } + + nv::cloth::Solver* solver = mSolverList[activeSolver]; + + { + float f = solver->getInterCollisionDistance(); + if(ImGui::DragFloat("Inter Collision Distance", &f, 0.005f, 0.0f, 2.0f, "%.2f")) + solver->setInterCollisionDistance(f); + } + { + uint32_t i = solver->getInterCollisionNbIterations(); + if(ImGui::DragInt("Inter Collision Iterations", (int*)&i, 0.25, 0, 16)) + solver->setInterCollisionNbIterations(i); + } + { + float f = solver->getInterCollisionStiffness(); + if(ImGui::DragFloat("Inter Collision Stiffness", &f, 0.005f, 0.0f, 1.0f, "%.2f")) + solver->setInterCollisionStiffness(f); + } + ImGui::TreePop(); + } +} + +void Scene::drawDebugVisualization() +{ + if(mDebugVisualizationFlags & DEBUG_VIS_TETHERS) + DebugRenderTethers(); + if(mDebugVisualizationFlags & DEBUG_VIS_CONSTRAINTS) + DebugRenderConstraints(); + if(mDebugVisualizationFlags & DEBUG_VIS_CONSTRAINTS_STIFFNESS) + DebugRenderConstraintStiffness(); + + if(mDebugVisualizationFlags & DEBUG_VIS_CONSTRAINT_ERROR) + DebugRenderConstraintError(); + if(mDebugVisualizationFlags & DEBUG_VIS_POSITION_DELTA) + DebugRenderPositionDelta(); + if(mDebugVisualizationFlags & DEBUG_VIS_BOUNDING_BOX) + DebugRenderBoundingBox(); + if(mDebugVisualizationFlags & DEBUG_VIS_DISTANCE_CONSTRAINTS) + DebugRenderDistanceConstraints(); + +} + namespace { template <typename T> void trackT(std::vector<T>& list, T object) @@ -127,9 +504,13 @@ void Scene::autoDeinitialize() void Scene::doSimulationStep(float dt) { + if(dt < FLT_EPSILON) + return; startSimulationStep(dt); waitForSimulationStep(); updateSimulationGraphics(); + + UpdateParticleDragging(dt); } void Scene::startSimulationStep(float dt) @@ -160,3 +541,337 @@ void Scene::updateSimulationGraphics() } } +physx::PxMat44 Scene::GetDebugDrawTransform(const ClothActor& actor) +{ + physx::PxMat44 transform; + if(actor.mClothRenderable != nullptr) + { + transform = actor.mClothRenderable->getModelMatrix(); + } + else + { + physx::PxVec3 translation = actor.mCloth->getTranslation(); + physx::PxQuat rotation = actor.mCloth->getRotation(); + transform = physx::PxMat44(rotation); + transform[3] = physx::PxVec4(translation.x, translation.y, translation.z, 1.0f); + } + return transform; +} + +void Scene::DebugRenderDistanceConstraints() +{ + DebugLineRenderBuffer* dbl = mSceneController->getDebugLineRenderBuffer(); + + for(auto it : mClothList) + { + nv::cloth::Cloth& cloth = *it->mCloth; + if(cloth.getNumMotionConstraints() == 0) + continue; + + nv::cloth::Factory& factory = cloth.getFactory(); + + physx::PxMat44 transform = GetDebugDrawTransform(*it); + + nv::cloth::MappedRange<physx::PxVec4> particles = cloth.getCurrentParticles(); + std::vector<physx::PxVec4> motionConstraints; + motionConstraints.reserve(cloth.getNumMotionConstraints() * 2); + motionConstraints.resize(cloth.getNumMotionConstraints()); + factory.extractMotionConstraints(cloth, nv::cloth::Range<physx::PxVec4>(&motionConstraints[0], &motionConstraints[0] + motionConstraints.size())); + motionConstraints.resize(cloth.getNumMotionConstraints() * 2); + + nv::cloth::MappedRange<physx::PxVec4> positions = cloth.getCurrentParticles(); + + assert(positions.size() == cloth.getNumMotionConstraints()); + + + //Set to 1 to color code lines based on distance constraint length (as % of max constraint distance in cloth) + //Set to 0 to color code lines based on how close the particle is to the distance constraint (as % of max distance per constraint) +#define SHOW_DISTANCE_COLOR 0 +#if SHOW_DISTANCE_COLOR + float maxDist = 0.0f; + for(int i = (int)(motionConstraints.size() >> 1) - 1; i >= 0; i--) + { + maxDist = max(maxDist, motionConstraints[i].w); + } +#endif + + for(int i = ((int)motionConstraints.size() >> 1) - 1; i >= 0; i--) + { + float l = motionConstraints[i].w; + physx::PxVec3 a = motionConstraints[i].getXYZ(); + physx::PxVec3 b = positions[i].getXYZ(); + physx::PxVec3 d = b - a; + float currentDist = d.magnitude(); + if(d.magnitudeSquared() < 0.00001f) + { + d = physx::PxVec3(0.0f, 0.0f, 1.0f); + } + else + { + d.normalize(); + } + unsigned char clerp; +#if SHOW_DISTANCE_COLOR + clerp = (unsigned char)(max(0.0f,min(1.0f,(l / maxDist)))*255.0f); +#else + clerp = (unsigned char)(max(0.0f, min(1.0f, (currentDist / l)))*255.0f); +#endif + unsigned int c = ((255-clerp) << 8) + clerp; + dbl->addLine(transform, a, a+d*l, c); + } + } +} + +void Scene::DebugRenderTethers() +{ + DebugLineRenderBuffer* dbl = mSceneController->getDebugLineRenderBuffer(); + + for(auto it : mClothList) + { + nv::cloth::Cloth& cloth = *it->mCloth; + nv::cloth::Fabric& fabric = cloth.getFabric(); + if(fabric.getNumTethers() == 0) + continue; + + nv::cloth::Factory& factory = cloth.getFactory(); + + physx::PxMat44 transform = GetDebugDrawTransform(*it); + + nv::cloth::MappedRange<physx::PxVec4> particles = cloth.getCurrentParticles(); + + std::vector<float> tetherLengths; + tetherLengths.resize(fabric.getNumTethers()); + std::vector<uint32_t> anchors; + anchors.resize(fabric.getNumTethers()); + + factory.extractFabricData(fabric, nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<uint32_t>(0, 0), + nv::cloth::Range<uint32_t>(&anchors[0], &anchors[0] + anchors.size()), nv::cloth::Range<float>(&tetherLengths[0], &tetherLengths[0] + tetherLengths.size()), nv::cloth::Range<uint32_t>(0, 0)); + + int particleCount = fabric.getNumParticles(); + + for(int i = 0; i < (int)anchors.size(); i++) + { + float lengthDiff = (particles[anchors[i]].getXYZ() - particles[i].getXYZ()).magnitude() - tetherLengths[i]; + dbl->addLine(transform, particles[anchors[i]].getXYZ(), particles[i%particleCount].getXYZ(), lengthDiff>0.0f?0x0000FF:0x00FFFF); + } + } +} + +void Scene::DebugRenderConstraints() +{ + DebugLineRenderBuffer* dbl = mSceneController->getDebugLineRenderBuffer(); + + for(auto it : mClothList) + { + nv::cloth::Cloth& cloth = *it->mCloth; + nv::cloth::Fabric& fabric = cloth.getFabric(); + if(fabric.getNumIndices() == 0) + continue; + + nv::cloth::Factory& factory = cloth.getFactory(); + + physx::PxMat44 transform = GetDebugDrawTransform(*it); + + nv::cloth::MappedRange<physx::PxVec4> particles = cloth.getCurrentParticles(); + + if(sSceneDebugRenderParams.mVisiblePhaseRangeBegin >= sSceneDebugRenderParams.mVisiblePhaseRangeEnd) + { + //then simply render all constraints in one go + std::vector<uint32_t> indices; + indices.resize(fabric.getNumIndices()); + + factory.extractFabricData(fabric, nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<uint32_t>(&indices[0], &indices[0] + indices.size()), + nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<uint32_t>(0, 0)); + + for(int i = 1; i < (int)indices.size(); i+=2) + { + dbl->addLine(transform, particles[indices[i]].getXYZ(), particles[indices[i-1]].getXYZ(), 0x991919); + } + } + else + { + //otherwise we render individual phases + std::vector<uint32_t> indices; + indices.resize(fabric.getNumIndices()); + std::vector<uint32_t> phases; + phases.resize(fabric.getNumPhases()); + std::vector<uint32_t> sets; + sets.resize(fabric.getNumSets()); + + factory.extractFabricData(fabric, nv::cloth::Range<uint32_t>(&phases[0], &phases[0] + phases.size()), nv::cloth::Range<uint32_t>(&sets[0], &sets[0] + sets.size()), nv::cloth::Range<float>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<uint32_t>(&indices[0], &indices[0] + indices.size()), + nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<uint32_t>(0, 0)); + + uint32_t* iIt = &indices[0]; + for(int phaseIndex = 0; phaseIndex < (int)fabric.getNumPhases(); phaseIndex++) + { + uint32_t* sIt = &sets[phases[phaseIndex]]; + uint32_t* iEnd = &indices[0] + (sIt[0] * 2); + uint32_t* iStart = iIt; + + if(!(phaseIndex >= sSceneDebugRenderParams.mVisiblePhaseRangeBegin && phaseIndex < sSceneDebugRenderParams.mVisiblePhaseRangeEnd)) + { + iIt = iEnd; + continue; + } + + for(iIt; iIt < iEnd; iIt+=2) + { + float c = (float)(iIt - iStart) / (float)(iEnd - iStart); + unsigned char c255 = (unsigned char)(c*255.0f); + + unsigned int colorTable[3] + { + 0xFF0000, + 0x00FF00, + 0x0000FF + }; + unsigned int shiftTable[3] + { + 8, + 0, + 16 + }; + + dbl->addLine(transform, particles[*iIt].getXYZ(), particles[*(iIt+1)].getXYZ(), colorTable[phaseIndex%3] + (c255<< shiftTable[phaseIndex%3])); + } + } + } + } +} + +void Scene::DebugRenderConstraintStiffness() +{ + DebugLineRenderBuffer* dbl = mSceneController->getDebugLineRenderBuffer(); + + for(auto it : mClothList) + { + nv::cloth::Cloth& cloth = *it->mCloth; + nv::cloth::Fabric& fabric = cloth.getFabric(); + if(fabric.getNumIndices() == 0) + continue; + + if(!fabric.getNumStiffnessValues()) + continue; + + nv::cloth::Factory& factory = cloth.getFactory(); + + physx::PxMat44 transform = GetDebugDrawTransform(*it); + + nv::cloth::MappedRange<physx::PxVec4> particles = cloth.getCurrentParticles(); + + std::vector<uint32_t> indices; + indices.resize(fabric.getNumIndices()); + std::vector<float> stiffness; + stiffness.resize(fabric.getNumRestvalues()); + + factory.extractFabricData(fabric, nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<float>(&stiffness[0], &stiffness[0] + stiffness.size()), nv::cloth::Range<uint32_t>(&indices[0], &indices[0] + indices.size()), + nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<uint32_t>(0, 0)); + + for(int i = 1; i < (int)indices.size(); i+=2) + { + float c = 1.0f - exp2f(stiffness[i >> 1]); + + unsigned char ca255 = (unsigned char)(c*255.0f*0.8f); + unsigned char cb255 = (unsigned char)((1.0f-c)*255.0f*0.8f); + dbl->addLine(transform, particles[indices[i-1]].getXYZ(), particles[indices[i]].getXYZ(), (ca255<<8) + (cb255<<0)); + } + } +} + +void Scene::DebugRenderConstraintError() +{ + DebugLineRenderBuffer* dbl = mSceneController->getDebugLineRenderBuffer(); + + for(auto it : mClothList) + { + nv::cloth::Cloth& cloth = *it->mCloth; + nv::cloth::Fabric& fabric = cloth.getFabric(); + if(fabric.getNumRestvalues() == 0) { continue; } + nv::cloth::Factory& factory = cloth.getFactory(); + + physx::PxMat44 transform = GetDebugDrawTransform(*it); + + nv::cloth::MappedRange<physx::PxVec4> particles = cloth.getCurrentParticles(); + + std::vector<uint32_t> indices; + indices.resize(fabric.getNumIndices()); + std::vector<float> restLengths; + restLengths.resize(fabric.getNumRestvalues()); + + factory.extractFabricData(fabric, nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<float>(&restLengths[0], &restLengths[0] + restLengths.size()), nv::cloth::Range<float>(0, 0), nv::cloth::Range<uint32_t>(&indices[0], &indices[0] + indices.size()), + nv::cloth::Range<uint32_t>(0, 0), nv::cloth::Range<float>(0, 0), nv::cloth::Range<uint32_t>(0, 0)); + + for(int i = 0; i < (int)indices.size(); i += 2) + { + physx::PxVec4 p0 = particles[indices[i]]; + physx::PxVec4 p1 = particles[indices[i + 1]]; + float restLength = restLengths[i >> 1]; + float length = (p0 - p1).magnitude(); + const float scale = 2.0f; + float error = (length / restLength * 0.5f - 0.5f) * scale + 0.5f; + error = max(0.0f, min(1.0f, error)); + unsigned char c255 = (unsigned char)(error*255.0f*0.8f); + dbl->addLine(transform, p0.getXYZ(), p1.getXYZ(), ((255-c255) << 8) + (c255 << 0)); + } + } +} + +void Scene::DebugRenderPositionDelta() +{ + DebugLineRenderBuffer* dbl = mSceneController->getDebugLineRenderBuffer(); + + for(auto it : mClothList) + { + nv::cloth::Cloth& cloth = *it->mCloth; + + physx::PxMat44 transform = GetDebugDrawTransform(*it); + + nv::cloth::MappedRange<physx::PxVec4> particles1 = cloth.getCurrentParticles(); + nv::cloth::MappedRange<physx::PxVec4> particles0 = cloth.getPreviousParticles(); + + std::vector<physx::PxVec4> lines; + + //scale so that the solver frequency doesn't affect the position delta length assuming 60fps + float iterationsPerFrame = max(1, int(1.0f / 60.0f * cloth.getSolverFrequency() + 0.5f)); + + for(int i = 0; i < (int)particles1.size(); i++) + { + dbl->addVector(transform, particles1[i].getXYZ(), (particles1[i] - particles0[i]).getXYZ()*iterationsPerFrame * 2.0f,0xFFFF00); + } + } +} + +void Scene::DebugRenderBoundingBox() +{ + DebugLineRenderBuffer* dbl = mSceneController->getDebugLineRenderBuffer(); + + for(auto it : mClothList) + { + nv::cloth::Cloth& cloth = *it->mCloth; + + physx::PxMat44 transform = GetDebugDrawTransform(*it); + + physx::PxVec3 c = cloth.getBoundingBoxCenter(); + physx::PxVec3 d = cloth.getBoundingBoxScale(); + physx::PxVec3 dx = physx::PxVec3(d.x, 0.0f, 0.0f); + physx::PxVec3 dy = physx::PxVec3(0.0f, d.y, 0.0f); + physx::PxVec3 dz = physx::PxVec3(0.0f, 0.0f, d.z); + + dbl->addLine(transform,c + dy + dz - dx,c + dy + dz + dx, 0x00FFFF); + dbl->addLine(transform,c + dy - dz - dx,c + dy - dz + dx, 0x00FFFF); + dbl->addLine(transform,c - dy + dz - dx,c - dy + dz + dx, 0x00FFFF); + dbl->addLine(transform,c - dy - dz - dx,c - dy - dz + dx, 0x00FFFF); + dbl->addLine(transform,c + dy + dx - dz,c + dy + dx + dz, 0x00FFFF); + dbl->addLine(transform,c + dy - dx - dz,c + dy - dx + dz, 0x00FFFF); + dbl->addLine(transform,c - dy + dx - dz,c - dy + dx + dz, 0x00FFFF); + dbl->addLine(transform,c - dy - dx - dz,c - dy - dx + dz, 0x00FFFF); + dbl->addLine(transform,c + dz + dx - dy,c + dz + dx + dy, 0x00FFFF); + dbl->addLine(transform,c + dz - dx - dy,c + dz - dx + dy, 0x00FFFF); + dbl->addLine(transform,c - dz + dx - dy,c - dz + dx + dy, 0x00FFFF); + dbl->addLine(transform,c - dz - dx - dy,c - dz - dx + dy, 0x00FFFF); + dbl->addLine(transform,c + dy + dz + dx,c - dy - dz - dx, 0x007777); + dbl->addLine(transform,c + dy + dz - dx,c - dy - dz + dx, 0x007777); + dbl->addLine(transform,c - dy + dz + dx,c + dy - dz - dx, 0x007777); + dbl->addLine(transform,c - dy + dz - dx,c + dy - dz + dx, 0x007777); + } +}
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/Scene.h b/NvCloth/samples/SampleBase/scene/Scene.h index 3a11ec7..1c14fbd 100644 --- a/NvCloth/samples/SampleBase/scene/Scene.h +++ b/NvCloth/samples/SampleBase/scene/Scene.h @@ -14,6 +14,7 @@ #include <vector> #include <map> #include "scene/SceneController.h" +#include "foundation/PxMat44.h" namespace nv { namespace cloth @@ -33,7 +34,7 @@ struct SceneFactory const char* mName; }; -#define DECLARE_SCENE_NAME(classname, name) static int classname##id = Scene::AddSceneFactory([](SceneController* c) {return (Scene*)new classname(c); }, name); +#define DECLARE_SCENE_NAME(classname, name) static int classname##id = Scene::AddSceneFactory([](SceneController* c) {return static_cast<Scene*>(new classname(c)); }, name); #define DECLARE_SCENE(classname) DECLARE_SCENE_NAME(classname,#classname) class Scene @@ -43,9 +44,13 @@ public: Scene(SceneController* sceneController):mSceneController(sceneController) {} virtual ~Scene(); - virtual void Animate(double dt) { doSimulationStep(dt); } - virtual void drawUI() {} + virtual void Animate(double dt) { doSimulationStep(dt); drawDebugVisualization(); } + void UpdateParticleDragging(float dt); + virtual bool HandleEvent(UINT uMsg, WPARAM wParam, LPARAM lParam); + bool HandlePickingEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, physx::PxMat44 viewProjectionMatrix); + virtual void drawUI(); virtual void drawStatsUI() {} + virtual void drawDebugVisualization(); virtual void onInitialize() = 0; virtual void onTerminate() { autoDeinitialize(); } @@ -86,6 +91,15 @@ protected: private: Scene& operator= (Scene&); // not implemented + physx::PxMat44 GetDebugDrawTransform(const ClothActor& actor); + void DebugRenderDistanceConstraints(); + void DebugRenderTethers(); + void DebugRenderConstraints(); + void DebugRenderConstraintStiffness(); + void DebugRenderConstraintError(); + void DebugRenderPositionDelta(); + void DebugRenderBoundingBox(); + private: SceneController* mSceneController; @@ -98,6 +112,43 @@ private: static std::vector<SceneFactory> sSceneFactories; + enum + { + DEBUG_VIS_DISTANCE_CONSTRAINTS = 1, + DEBUG_VIS_TETHERS = 2, + DEBUG_VIS_CONSTRAINTS = 4, + DEBUG_VIS_CONSTRAINTS_STIFFNESS = 8, + DEBUG_VIS_NORMALS = 16, + DEBUG_VIS_TANGENTS = 32, + DEBUG_VIS_BITANGENTS = 64, + DEBUG_VIS_CONSTRAINT_ERROR = 128, + DEBUG_VIS_POSITION_DELTA = 256, + DEBUG_VIS_ACCELERATION = 512, + DEBUG_VIS_BOUNDING_BOX = 1024, + DEBUG_VIS_LAST + }; + + static unsigned int mDebugVisualizationFlags; + + struct SceneDebugRenderParams + { + //Constraint render params + int mVisiblePhaseRangeBegin; + int mVisiblePhaseRangeEnd; + }; + + static SceneDebugRenderParams sSceneDebugRenderParams; + + //Particle dragging + struct DraggingParticle + { + DraggingParticle() { mTrackedCloth = nullptr; } + ClothActor* mTrackedCloth; + float mDist; + float mOffset; + int mParticleIndex; + }; + DraggingParticle mDraggingParticle; }; diff --git a/NvCloth/samples/SampleBase/scene/SceneController.cpp b/NvCloth/samples/SampleBase/scene/SceneController.cpp index 90b499c..fa35d5d 100644 --- a/NvCloth/samples/SampleBase/scene/SceneController.cpp +++ b/NvCloth/samples/SampleBase/scene/SceneController.cpp @@ -40,6 +40,8 @@ #include "scene/scenes/SimpleScene.h" #include "scene/scenes/WindScene.h" +#include "utils/DebugLineRenderBuffer.h" + JobManager SceneController::sJobManager; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -51,6 +53,9 @@ SceneController::SceneController() : mTimeScale(1.0f), mStartDelay(0.f) mActivePlatform = (int)nv::cloth::Platform::CPU; mCUDAInitialized = false; mDXInitialized = false; + mLeftOverTime = 0.0; + mPaused = false; + mSingleStep = 0; } SceneController::~SceneController() @@ -137,6 +142,8 @@ void SceneController::onInitialize() mFactories[(int)nv::cloth::Platform::DX11] = NvClothCreateFactoryDX11(mGraphicsContextManager); mDXInitialized &= mFactories[(int)nv::cloth::Platform::DX11] != nullptr; } while(false); + + mDebugLineRenderBuffer = new DebugLineRenderBuffer; } void SceneController::onSampleStop() @@ -181,16 +188,38 @@ void SceneController::changeScene(int index) void SceneController::Animate(double dt) { - double simulationStep = dt * mTimeScale; - if(simulationStep > 1.0 / 60.0) + if(mPaused && (mSingleStep <= 0)) + { + //Re render debug lines from last frame + getRenderer().queueRenderBuffer(mDebugLineRenderBuffer); + return; + } + if(mSingleStep > 0) + { + mSingleStep--; + dt = 1.0 / 60.0; + } + + mDebugLineRenderBuffer->clear(); + + mLeftOverTime += dt * mTimeScale; + + double simulationStep = 0.0; + while(mLeftOverTime > 1.0 / 60.0) + simulationStep += 1.0 / 60.0, mLeftOverTime -= 1.0 / 60.0; + if(simulationStep >= 1.0 / 60.0) simulationStep = 1.0 / 60.0; mActiveScene->Animate(simulationStep); + getRenderer().queueRenderBuffer(mDebugLineRenderBuffer); } LRESULT SceneController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + if(mActiveScene->HandleEvent(uMsg, wParam, lParam)) + return 1; + if (uMsg == WM_KEYDOWN) { int iKeyPressed = static_cast<int>(wParam); @@ -202,10 +231,12 @@ LRESULT SceneController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPa switch (iKeyPressed) { - case 'R': - return 0; - case 'F': - return 0; + case 'P': + mPaused = !mPaused; + break; + case 'O': + mSingleStep++; + break; default: break; } diff --git a/NvCloth/samples/SampleBase/scene/SceneController.h b/NvCloth/samples/SampleBase/scene/SceneController.h index d527597..9f4f428 100644 --- a/NvCloth/samples/SampleBase/scene/SceneController.h +++ b/NvCloth/samples/SampleBase/scene/SceneController.h @@ -37,6 +37,7 @@ namespace nv class RenderMaterial; class Renderable; +class DebugLineRenderBuffer; struct ClothActor { @@ -91,6 +92,10 @@ public: return mPhysXPlaneRenderMaterial; } + DebugLineRenderBuffer* getDebugLineRenderBuffer() + { + return mDebugLineRenderBuffer; + } private: SceneController& operator= (SceneController&); // not implemented @@ -104,6 +109,7 @@ private: Renderable* mPlane; std::vector<Renderable*> mBoxes; + DebugLineRenderBuffer* mDebugLineRenderBuffer; float mTimeScale; float mStartDelay; @@ -121,8 +127,13 @@ private: ID3D11DeviceContext* mDXDeviceContext; nv::cloth::DxContextManagerCallback* mGraphicsContextManager; - Scene* mActiveScene; - int mActiveSceneIndex; + Scene* mActiveScene; + int mActiveSceneIndex; + double mLeftOverTime; + + bool mPaused; + int mSingleStep; + }; #endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/CCDScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/CCDScene.cpp new file mode 100644 index 0000000..2d0eaa8 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/CCDScene.cpp @@ -0,0 +1,153 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "CCDScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" +#include "windows.h" +#include "utils/MeshGenerator.h" + +DECLARE_SCENE_NAME(CCDScene, "CCD Scene") + +void CCDScene::Animate(double dt) +{ + static float time = 0.0f; + time += dt; + + physx::PxTransform invTranslation(-mOffset - physx::PxVec3(0.f, 10.f, -2.f)); + physx::PxTransform rotation(physx::PxQuat(cosf(time)*physx::PxHalfPi-physx::PxHalfPi,physx::PxVec3(0.0f,1.0f,0.0f))); + physx::PxTransform translation(mOffset + physx::PxVec3(0.f, 10.f, -2.f) + physx::PxVec3(0.0f,0.0f,10.0f*sinf(time))); + physx::PxTransform totalTransform = translation.transform(rotation.transform(invTranslation)); + + physx::PxVec4 spheres[2] = {physx::PxVec4(totalTransform.transform(physx::PxVec3(0.f, 10.f, -2.f) + mOffset),2.0), + physx::PxVec4(totalTransform.transform(physx::PxVec3(0.f, 11.f, 3.f) + mOffset),0.5)}; + + mClothActor[0]->mCloth->setSpheres(nv::cloth::Range<physx::PxVec4>(spheres, spheres + 2), 0, mClothActor[0]->mCloth->getNumSpheres()); + + mCollisionMehs->setTransform(totalTransform); + + Scene::Animate(dt); +} + +void CCDScene::initializeCloth(int index, physx::PxVec3 offset) +{ + mOffset = offset; + + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ mOffset, PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.f, 69, 79, false, transform); + clothMesh.AttachClothPlaneByAngles(69, 79); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + mClothActor[index]->mCloth->setDamping(physx::PxVec3(0.1f, 0.1f, 0.1f)); + mClothActor[index]->mCloth->setSelfCollisionDistance(0.07f); + mClothActor[index]->mCloth->enableContinuousCollision(true); + mClothActor[index]->mCloth->setSolverFrequency(240); + + + physx::PxVec4 spheres[2] = {physx::PxVec4(physx::PxVec3(0.f, 10.f, -2.f) + mOffset,2.0), + physx::PxVec4(physx::PxVec3(0.f, 11.f, 3.f) + mOffset,0.5)}; + + mClothActor[index]->mCloth->setSpheres(nv::cloth::Range<physx::PxVec4>(spheres, spheres + 2), 0, mClothActor[index]->mCloth->getNumSpheres()); + + uint32_t caps[4]; + caps[0] = 0; + caps[1] = 1; + + mClothActor[index]->mCloth->setCapsules(nv::cloth::Range<uint32_t>(caps, caps + 2), 0, mClothActor[index]->mCloth->getNumCapsules()); + + //create render mesh + auto mesh = MeshGenerator::generateCollisionCapsules(spheres,2,caps,2,-0.05f); + auto renderMesh = new MeshGenerator::MeshGeneratorRenderMesh(mesh); + mCollisionMehs = getSceneController()->getRenderer().createRenderable(*renderMesh, *getSceneController()->getDefaultMaterial()); + trackRenderable(mCollisionMehs); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + mClothActor[index]->mCloth->setDragCoefficient(0.5f); + mClothActor[index]->mCloth->setLiftCoefficient(0.6f); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void CCDScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + + initializeCloth(0, physx::PxVec3(0.0f, 0.0f, 0.0f)); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/CCDScene.h b/NvCloth/samples/SampleBase/scene/scenes/CCDScene.h new file mode 100644 index 0000000..e988fb7 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/CCDScene.h @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef CCD_SCENE_H +#define CCD_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class CCDScene : public Scene +{ +public: + + CCDScene(SceneController* sceneController): Scene(sceneController) {} + + virtual void Animate(double dt) override; + void initializeCloth(int index, physx::PxVec3 offset); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[1]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[1]; + + physx::PxVec3 mOffset; + Renderable* mCollisionMehs; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/CapsuleScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/CapsuleScene.cpp new file mode 100644 index 0000000..e16899c --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/CapsuleScene.cpp @@ -0,0 +1,129 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "CapsuleScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" +#include "windows.h" +#include "utils/MeshGenerator.h" + +DECLARE_SCENE_NAME(CapsuleScene, "Capsule Scene") + + +void CapsuleScene::initializeCloth(int index, physx::PxVec3 offset) +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.f, 69, 79, false, transform); + clothMesh.AttachClothPlaneByAngles(69, 79); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + mClothActor[index]->mCloth->setDamping(physx::PxVec3(0.1f, 0.1f, 0.1f)); + + + physx::PxVec4 spheres[2] = {physx::PxVec4(physx::PxVec3(0.f, 10.f, -2.f) + offset,3.0), + physx::PxVec4(physx::PxVec3(0.f, 10.f, 2.f) + offset,1.0)}; + + mClothActor[index]->mCloth->setSpheres(nv::cloth::Range<physx::PxVec4>(spheres, spheres + 2), 0, mClothActor[index]->mCloth->getNumSpheres()); + + uint32_t caps[4]; + caps[0] = 0; + caps[1] = 1; + + mClothActor[index]->mCloth->setCapsules(nv::cloth::Range<uint32_t>(caps, caps + 2), 0, mClothActor[index]->mCloth->getNumCapsules()); + + //create render mesh + auto mesh = MeshGenerator::generateCollisionCapsules(spheres,2,caps,2,-0.05f); + auto renderMesh = new MeshGenerator::MeshGeneratorRenderMesh(mesh); + Renderable* renderable = getSceneController()->getRenderer().createRenderable(*renderMesh, *getSceneController()->getDefaultMaterial()); + trackRenderable(renderable); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + mClothActor[index]->mCloth->setDragCoefficient(0.5f); + mClothActor[index]->mCloth->setLiftCoefficient(0.6f); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void CapsuleScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + + initializeCloth(0, physx::PxVec3(0.0f, 0.0f, 0.0f)); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/CapsuleScene.h b/NvCloth/samples/SampleBase/scene/scenes/CapsuleScene.h new file mode 100644 index 0000000..f1f68fd --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/CapsuleScene.h @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef CAPSULE_SCENE_H +#define CAPSULE_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class CapsuleScene : public Scene +{ +public: + + CapsuleScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxVec3 offset); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[1]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[1]; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/ConvexCollisionScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/ConvexCollisionScene.cpp new file mode 100644 index 0000000..28df734 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/ConvexCollisionScene.cpp @@ -0,0 +1,138 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "ConvexCollisionScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" +#include "windows.h" +#include "utils/MeshGenerator.h" + +DECLARE_SCENE_NAME(ConvexCollisionScene, "Convex Collision Scene") + + +void ConvexCollisionScene::initializeCloth(int index, physx::PxVec3 offset) +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.f, 59, 69, false, transform); + clothMesh.AttachClothPlaneByAngles(59, 69); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + mClothActor[index]->mCloth->setDamping(physx::PxVec3(0.1f, 0.1f, 0.1f)); + + //Generate collision planes + std::vector<physx::PxVec4> planes; + uint32_t mask1 = MeshGenerator::generateConvexPolyhedronPlanes(4, 4, physx::PxVec3(0.7f, 10.0f, -1.0f), 1.0f, &planes); + uint32_t mask2 = MeshGenerator::generateConvexPolyhedronPlanes(4, 4, physx::PxVec3(-0.7f, 10.0f, 0.0f), 1.0f, &planes); + MeshGenerator::Mesh mesh1 = MeshGenerator::generateCollisionConvex(planes.data(),mask1,-0.05f,false); + MeshGenerator::Mesh mesh2 = MeshGenerator::generateCollisionConvex(planes.data(), mask2, -0.05f, false); + + //assign as collision data + nv::cloth::Range<const physx::PxVec4> planesR(&planes[0], &planes[0] + planes.size()); + mClothActor[index]->mCloth->setPlanes(planesR, 0, mClothActor[index]->mCloth->getNumPlanes()); + + //assign convex indices + std::vector<uint32_t> indices; + indices.push_back(mask1); + indices.push_back(mask2); + nv::cloth::Range<uint32_t> cind(&indices[0], &indices[0] + indices.size()); + mClothActor[index]->mCloth->setConvexes(cind, 0, mClothActor[index]->mCloth->getNumConvexes()); + + //create render mesh + //scale down the render model to not intersect the triangles so much + auto renderMesh1 = new MeshGenerator::MeshGeneratorRenderMesh(mesh1); + Renderable* renderable1 = getSceneController()->getRenderer().createRenderable(*renderMesh1, *getSceneController()->getDefaultMaterial()); + trackRenderable(renderable1); + auto renderMesh2 = new MeshGenerator::MeshGeneratorRenderMesh(mesh2); + Renderable* renderable2 = getSceneController()->getRenderer().createRenderable(*renderMesh2, *getSceneController()->getDefaultMaterial()); + trackRenderable(renderable2); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + mClothActor[index]->mCloth->setDragCoefficient(0.1f); + mClothActor[index]->mCloth->setLiftCoefficient(0.1f); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void ConvexCollisionScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + + initializeCloth(0, physx::PxVec3(0.0f, 0.0f, 0.0f)); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/ConvexCollisionScene.h b/NvCloth/samples/SampleBase/scene/scenes/ConvexCollisionScene.h new file mode 100644 index 0000000..7c9d062 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/ConvexCollisionScene.h @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef CONVEX_COLLISION_SCENE_H +#define CONVEX_COLLISION_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class ConvexCollisionScene : public Scene +{ +public: + + ConvexCollisionScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxVec3 offset); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[1]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[1]; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/DistanceConstraintScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/DistanceConstraintScene.cpp new file mode 100644 index 0000000..eaac8e1 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/DistanceConstraintScene.cpp @@ -0,0 +1,100 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "DistanceConstraintScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" + +DECLARE_SCENE_NAME(DistanceConstraintScene,"Distance Constraint Scene") + +void DistanceConstraintScene::onInitialize() +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f), physx::PxQuat(-0.9f, physx::PxVec3(0.0f, 1.0f, 0.0f)) * physx::PxQuat(PxPiDivFour, physx::PxVec3(1.0f, 0.0f, 0.0f))); + clothMesh.GeneratePlaneCloth(6.f, 7.f, 39, 39, false, transform); + clothMesh.AttachClothPlaneByAngles(39, 39); + + mClothActor = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + mClothActor->mClothRenderable->setColor(getRandomPastelColor()); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, -1.0f, 0.0f), &phaseTypeInfo, false); + trackFabric(mFabric); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric); + + + //////////////////////////////////// + //// Set distance constraints //// + //////////////////////////////////// + nv::cloth::Range<physx::PxVec4> distanceConstraints = mClothActor->mCloth->getMotionConstraints(); + for(int i = 0; i < (int)distanceConstraints.size(); i++) + { + distanceConstraints[i] = physx::PxVec4(particlesCopy[i].getXYZ(), 0.002f*(i % 800) * 0.002f*(i % 800)); + } + + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); +// mClothActor->mCloth->setDragCoefficient(0.1f); +// mClothActor->mCloth->setDragCoefficient(0.1f); + + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + trackClothActor(mClothActor); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor, mSolver); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/DistanceConstraintScene.h b/NvCloth/samples/SampleBase/scene/scenes/DistanceConstraintScene.h new file mode 100644 index 0000000..5c61195 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/DistanceConstraintScene.h @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef DISTANCE_CONSTRAINT_SCENE_H +#define DISTANCE_CONSTRAINT_SCENE_H + +#include "scene/Scene.h" + +class DistanceConstraintScene : public Scene +{ +public: + + DistanceConstraintScene(SceneController* sceneController):Scene(sceneController) {} + + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor; + +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/FreeFallScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/FreeFallScene.cpp index c1f6a00..9cd1121 100644 --- a/NvCloth/samples/SampleBase/scene/scenes/FreeFallScene.cpp +++ b/NvCloth/samples/SampleBase/scene/scenes/FreeFallScene.cpp @@ -74,7 +74,7 @@ void FreeFallScene::initializeCloth(int index, physx::PxVec3 offset) mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -1.0f, 0.0f)); mClothActor[index]->mCloth->setFriction(0.1); - mClothActor[index]->mCloth->setDragCoefficient(0.5); + mClothActor[index]->mCloth->setDragCoefficient(0.1); mClothActor[index]->mCloth->setLiftCoefficient(0.0); // Setup phase configs @@ -89,8 +89,6 @@ void FreeFallScene::initializeCloth(int index, physx::PxVec3 offset) } mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); - mSolver = getSceneController()->getFactory()->createSolver(); - trackSolver(mSolver); trackClothActor(mClothActor[index]); // Add the cloth to the solver for simulation @@ -99,12 +97,12 @@ void FreeFallScene::initializeCloth(int index, physx::PxVec3 offset) void FreeFallScene::onInitialize() { - float spaceX = -1.5f; + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + float spaceX = -1.1f; for(int i = 0; i < 4; ++i) - { - initializeCloth(i, physx::PxVec3(16.f + float((i+1)*(i+1)) * spaceX, 2.f, -7.f)); - } + initializeCloth(i, physx::PxVec3(8.f + float((i+1)*(i+1)) * spaceX, 2.f, -7.f)); { IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); diff --git a/NvCloth/samples/SampleBase/scene/scenes/FrictionScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/FrictionScene.cpp index 3c181ea..3848c6f 100644 --- a/NvCloth/samples/SampleBase/scene/scenes/FrictionScene.cpp +++ b/NvCloth/samples/SampleBase/scene/scenes/FrictionScene.cpp @@ -26,8 +26,8 @@ void FrictionScene::initializeCloth(int index, physx::PxVec3 offset, float frict /////////////////////////////////////////////////////////////////////// ClothMeshData clothMesh; - physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(PxPi / 6.f, PxVec3(1.f, 0.f, 0.f))); - clothMesh.GeneratePlaneCloth(3.f, 3.f, 29, 29, false, transform); + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 9.f, 0.f) + offset, PxQuat(PxPi / 6.f, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(4.f, 5.f, 29, 34, false, transform); mClothActor[index] = new ClothActor; nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); @@ -47,7 +47,7 @@ void FrictionScene::initializeCloth(int index, physx::PxVec3 offset, float frict particlesCopy.resize(clothMesh.mVertices.size()); physx::PxVec3 clothOffset = transform.getPosition(); - for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + for (int i = 0; i < (int)clothMesh.mVertices.size(); i++) { // To put attachment point closer to each other if(clothMesh.mInvMasses[i] < 1e-6) @@ -67,7 +67,7 @@ void FrictionScene::initializeCloth(int index, physx::PxVec3 offset, float frict mClothActor[index]->mCloth->setPlanes(planesR, 0, mClothActor[index]->mCloth->getNumPlanes()); std::vector<uint32_t> indices; indices.resize(planes.size()); - for(int i = 0; i < (int)indices.size(); i++) + for (int i = 0; i < (int)indices.size(); i++) indices[i] = 1 << i; nv::cloth::Range<uint32_t> cind(&indices[0], &indices[0] + indices.size()); mClothActor[index]->mCloth->setConvexes(cind, 0, mClothActor[index]->mCloth->getNumConvexes()); @@ -76,7 +76,7 @@ void FrictionScene::initializeCloth(int index, physx::PxVec3 offset, float frict // Setup phase configs std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); - for(int i = 0; i < (int)phases.size(); i++) + for (int i = 0; i < (int)phases.size(); i++) { phases[i].mPhaseIndex = i; phases[i].mStiffness = 1.0f; @@ -87,8 +87,6 @@ void FrictionScene::initializeCloth(int index, physx::PxVec3 offset, float frict mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); mClothActor[index]->mCloth->setFriction(frictionCoef); - mSolver = getSceneController()->getFactory()->createSolver(); - trackSolver(mSolver); trackClothActor(mClothActor[index]); // Add the cloth to the solver for simulation @@ -97,15 +95,15 @@ void FrictionScene::initializeCloth(int index, physx::PxVec3 offset, float frict void FrictionScene::onInitialize() { - + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); - float spaceX = -4.f; + float spaceX = -5.f; float frictionDelta = 0.2f; - for(int i = 0; i < 4; ++i) + for (int i = 0; i < 5; ++i) { - float friction = i > 0 ? float(i) * frictionDelta : 0.f; // 0.0, 0.2, 0.4, 0.6 - + float friction = i > 0 ? float(i) * frictionDelta : 0.f; // 0.0, 0.2, 0.4, 0.6, 0.8 initializeCloth(i, physx::PxVec3(4.f + float(i) * spaceX, 4.f, -18.f), friction); } diff --git a/NvCloth/samples/SampleBase/scene/scenes/FrictionScene.h b/NvCloth/samples/SampleBase/scene/scenes/FrictionScene.h index 4173e09..8d03307 100644 --- a/NvCloth/samples/SampleBase/scene/scenes/FrictionScene.h +++ b/NvCloth/samples/SampleBase/scene/scenes/FrictionScene.h @@ -24,9 +24,9 @@ public: virtual void onInitialize() override; private: - nv::cloth::Fabric* mFabric[4]; + nv::cloth::Fabric* mFabric[5]; nv::cloth::Solver* mSolver; - ClothActor* mClothActor[4]; + ClothActor* mClothActor[5]; }; diff --git a/NvCloth/samples/SampleBase/scene/scenes/GeodesicScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/GeodesicScene.cpp new file mode 100644 index 0000000..3216dca --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/GeodesicScene.cpp @@ -0,0 +1,114 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "GeodesicScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" + +DECLARE_SCENE_NAME(GeodesicScene, "Geodesic Scene") + +void GeodesicScene::initializeCloth(int index, physx::PxVec3 offset, bool geodesic) +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f) + offset, PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(6.f, 10.0f, 39, 59, false, transform,true,true); + clothMesh.AttachClothPlaneByAngles(39, 59); + + /*for(int y = 0; y < 60; y++) + { + for(int x = 0; x < 40; x++) + { + //clothMesh.mVertices[x + y * 40].y = transform.transform(PxVec3(0.0f, y&2?0.25f:-0.25f, 0.0f)).y; + PxVec3 pos = transform.transform(PxVec3(0.0f, y & 1 ? 0.1f : -0.1f, 10.0f * (float)(y>>2)/(float)60.0f)); + clothMesh.mVertices[x + y * 40].y = pos.y; + clothMesh.mVertices[x + y * 40].z = pos.z; + } + }*/ + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + mClothActor[index]->mClothRenderable->setColor(getRandomPastelColor()); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), + &phaseTypeInfo, geodesic); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for (int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.99f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + mClothActor[index]->mCloth->setTetherConstraintStiffness(1.0f); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for (int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void GeodesicScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + + initializeCloth(0, physx::PxVec3(-5.0f, 0.0f, 0.0f), false); + initializeCloth(1, physx::PxVec3(4.0f, 0.0f, 0.0f), true); + + mTime = 0.0f; + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/GeodesicScene.h b/NvCloth/samples/SampleBase/scene/scenes/GeodesicScene.h new file mode 100644 index 0000000..3a0822e --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/GeodesicScene.h @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef GEODESIC_SCENE_H +#define GEODESIC_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class GeodesicScene : public Scene +{ +public: + + GeodesicScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxVec3 offset, bool geodesic); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[2]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[2]; + + float mTime; + +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/InterCollisionScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/InterCollisionScene.cpp new file mode 100644 index 0000000..b75facd --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/InterCollisionScene.cpp @@ -0,0 +1,128 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "InterCollisionScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" + +DECLARE_SCENE_NAME(InterCollisionScene, "Inter Collision Scene") + +void InterCollisionScene::initializeCloth(int index, physx::PxMat44 transform) +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + float w = 5.f - index; + float h = 6.f + index; + transform *= PxTransform(PxVec3(0.f, 13.f, 0.f), PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(w,h, 5*w, 5*h, false, transform); + clothMesh.AttachClothPlaneByAngles(5 * w, 5 * h); + //clothMesh.SetInvMasses(1.0f / (1000.0f / (5.0f*w*5.0f*h))); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + mClothActor[index]->mClothRenderable->setColor(getRandomPastelColor()); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.9f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + std::vector<physx::PxVec4> planes; + planes.push_back(physx::PxVec4(physx::PxVec3(0.0f, 1.f, 0.0f), -0.01f)); + + nv::cloth::Range<const physx::PxVec4> planesR(&planes[0], &planes[0] + planes.size()); + mClothActor[index]->mCloth->setPlanes(planesR, 0, mClothActor[index]->mCloth->getNumPlanes()); + std::vector<uint32_t> indices; + indices.resize(planes.size()); + for(int i = 0; i < (int)indices.size(); i++) + indices[i] = 1 << i; + nv::cloth::Range<uint32_t> cind(&indices[0], &indices[0] + indices.size()); + mClothActor[index]->mCloth->setConvexes(cind, 0, mClothActor[index]->mCloth->getNumConvexes()); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -1.0f, 0.0f)); + mClothActor[index]->mCloth->setFriction(0.1); + mClothActor[index]->mCloth->setDragCoefficient(0.1f); + mClothActor[index]->mCloth->setLiftCoefficient(0.1f); + mClothActor[index]->mCloth->setSolverFrequency(120.0f); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void InterCollisionScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + mSolver->setInterCollisionNbIterations(8); + mSolver->setInterCollisionDistance(0.4f); + mSolver->setInterCollisionStiffness(0.95f); + mSolver->setInterCollisionFilter( + [](void* a, void* b) { + return true; + } + ); + trackSolver(mSolver); + + physx::PxMat44 posTrans(physx::PxIdentity); + posTrans.setPosition(physx::PxVec3(0.0f, 0.f, -1.0f)); + initializeCloth(0, posTrans); + posTrans.setPosition(physx::PxVec3(0.0f, 0.8f, -1.2f)); + initializeCloth(1, posTrans); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/InterCollisionScene.h b/NvCloth/samples/SampleBase/scene/scenes/InterCollisionScene.h new file mode 100644 index 0000000..1ef0b45 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/InterCollisionScene.h @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef INTER_COLLISION_SCENE_H +#define INTER_COLLISION_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class InterCollisionScene : public Scene +{ +public: + + InterCollisionScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxMat44 transform); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[2]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[2]; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/LocalGlobalScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/LocalGlobalScene.cpp new file mode 100644 index 0000000..57cd1a2 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/LocalGlobalScene.cpp @@ -0,0 +1,141 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "LocalGlobalScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" +#include "windows.h" + +DECLARE_SCENE_NAME(LocalGlobalScene, "Local/Global Scene") + +void LocalGlobalScene::Animate(double dt) +{ + physx::PxVec3 position(sin(mTime * 2.0f) * 3.0f, sinf(mTime) * 2.0f, cosf(mTime) - 1.0f); + physx::PxQuat rotation(sin(mTime * 1.0f) * 4.0f, physx::PxVec3(0.0f, 1.0f, 0.0f)); + + + mTime += dt; + + mClothActor[0]->mCloth->setTranslation(position); + mClothActor[0]->mCloth->setRotation(rotation); + mClothActor[0]->mClothRenderable->setTransform(physx::PxTransform(position + physx::PxVec3(-4.f, 0.f, 0.f), rotation)); + + mClothActor[1]->mClothRenderable->setTransform(physx::PxTransform(physx::PxVec3(4.f, 0.f, 0.f), physx::PxQuat(1.f))); + { + nv::cloth::MappedRange<physx::PxVec4> particles = mClothActor[1]->mCloth->getCurrentParticles(); + for (int i = 0; i < 2; i++) + { + particles[mAttachmentVertices[i]] = physx::PxVec4(physx::PxTransform(position, rotation).transform(mAttachmentVertexOriginalPositions[i].getXYZ()), mAttachmentVertexOriginalPositions[i].w); + } + } + Scene::Animate(dt); +} + +void LocalGlobalScene::initializeCloth(int index, physx::PxVec3 offset) +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(PxPi / 2.0f, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.f, 69, 79, false, transform); + clothMesh.AttachClothPlaneByAngles(69, 79); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for (int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + if(index == 1) + { + mAttachmentVertices[0] = 0; + mAttachmentVertices[1] = 69; + mAttachmentVertexOriginalPositions[0] = particlesCopy[mAttachmentVertices[0]]; + mAttachmentVertexOriginalPositions[1] = particlesCopy[mAttachmentVertices[1]]; + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for (int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + mClothActor[index]->mCloth->setDragCoefficient(0.1f); + mClothActor[index]->mCloth->setLiftCoefficient(0.2f); + + mSolver[index] = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver[index]); + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver[index]); +} + +void LocalGlobalScene::onInitialize() +{ + initializeCloth(1, physx::PxVec3(0.0f, 0.0f, 0.0f)); + initializeCloth(0, physx::PxVec3(0.0f, 0.0f, 0.0f)); + + mTime = 0.0f; + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/LocalGlobalScene.h b/NvCloth/samples/SampleBase/scene/scenes/LocalGlobalScene.h new file mode 100644 index 0000000..3b2bfa6 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/LocalGlobalScene.h @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef LOCAL_GLOBAL_SCENE_H +#define LOCAL_GLOBAL_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class LocalGlobalScene : public Scene +{ +public: + + LocalGlobalScene(SceneController* sceneController): Scene(sceneController) {} + + virtual void Animate(double dt) override; + void initializeCloth(int index, physx::PxVec3 offset); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[2]; + nv::cloth::Solver* mSolver[2]; + ClothActor* mClothActor[2]; + + int mAttachmentVertices[2]; + physx::PxVec4 mAttachmentVertexOriginalPositions[2]; + + float mTime; + +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/MultiSolverScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/MultiSolverScene.cpp new file mode 100644 index 0000000..d708069 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/MultiSolverScene.cpp @@ -0,0 +1,131 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "MultiSolverScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" +#include "windows.h" +#include "utils/MeshGenerator.h" + +DECLARE_SCENE_NAME(MultiSolverScene, "Multi Solver Scene") + + +void MultiSolverScene::initializeCloth(int index, physx::PxVec3 offset) +{ + mSolver[index] = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver[index]); + + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.f, 69, 79, false, transform); + clothMesh.AttachClothPlaneByAngles(69, 79); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + mClothActor[index]->mCloth->setDamping(physx::PxVec3(0.1f, 0.1f, 0.1f)); + mClothActor[index]->mCloth->setFriction(0.5f); + + + physx::PxVec4 spheres[2] = {physx::PxVec4(physx::PxVec3(0.f, 11.f, -2.f) + offset,1.5), + physx::PxVec4(physx::PxVec3(0.f, 11.f, 2.f) + offset,1.0)}; + + mClothActor[index]->mCloth->setSpheres(nv::cloth::Range<physx::PxVec4>(spheres, spheres + 2), 0, mClothActor[index]->mCloth->getNumSpheres()); + + uint32_t caps[4]; + caps[0] = 0; + caps[1] = 1; + + mClothActor[index]->mCloth->setCapsules(nv::cloth::Range<uint32_t>(caps, caps + 2), 0, mClothActor[index]->mCloth->getNumCapsules()); + + //create render mesh + auto mesh = MeshGenerator::generateCollisionCapsules(spheres,2,caps,2,-0.05f); + auto renderMesh = new MeshGenerator::MeshGeneratorRenderMesh(mesh); + Renderable* renderable = getSceneController()->getRenderer().createRenderable(*renderMesh, *getSceneController()->getDefaultMaterial()); + trackRenderable(renderable); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + mClothActor[index]->mCloth->setDragCoefficient(0.5f); + mClothActor[index]->mCloth->setLiftCoefficient(0.6f); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver[index]); +} + +void MultiSolverScene::onInitialize() +{ + initializeCloth(0, physx::PxVec3(-5.0f, 0.0f, 0.0f)); + initializeCloth(0, physx::PxVec3(5.0f, 0.0f, 0.0f)); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/MultiSolverScene.h b/NvCloth/samples/SampleBase/scene/scenes/MultiSolverScene.h new file mode 100644 index 0000000..f95c54e --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/MultiSolverScene.h @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef MULTI_SOLVER_SCENE_H +#define MULTI_SOLVER_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class MultiSolverScene : public Scene +{ +public: + + MultiSolverScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxVec3 offset); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[1]; + nv::cloth::Solver* mSolver[2]; + ClothActor* mClothActor[1]; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/PlaneCollisionScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/PlaneCollisionScene.cpp new file mode 100644 index 0000000..fcf4060 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/PlaneCollisionScene.cpp @@ -0,0 +1,135 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "PlaneCollisionScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" +#include "windows.h" +#include "utils/MeshGenerator.h" + +DECLARE_SCENE_NAME(PlaneCollisionScene, "Plane Collision Scene") + + +void PlaneCollisionScene::initializeCloth(int index, physx::PxVec3 offset) +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.f, 59, 69, false, transform); + clothMesh.AttachClothPlaneByAngles(59, 69); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + mClothActor[index]->mCloth->setDamping(physx::PxVec3(0.1f, 0.1f, 0.1f)); + + //Generate collision planes + std::vector<physx::PxVec4> planes; + planes.push_back(physx::PxVec4(physx::PxVec3(-0.5f, 0.4f, 0.0f).getNormalized(), -4.0f)); + planes.push_back(physx::PxVec4(physx::PxVec3(0.0f, 0.4f, 0.5f).getNormalized(), -4.0f)); + uint32_t mask = 3; + MeshGenerator::Mesh mesh = MeshGenerator::generateCollisionConvex(planes.data(), mask, -0.01f, true); + + //assign as collision data + nv::cloth::Range<const physx::PxVec4> planesR(&planes[0], &planes[0] + planes.size()); + mClothActor[index]->mCloth->setPlanes(planesR, 0, mClothActor[index]->mCloth->getNumPlanes()); + + //assign convex indices + std::vector<uint32_t> indices; + indices.push_back(1); + indices.push_back(2); + nv::cloth::Range<uint32_t> cind(&indices[0], &indices[0] + indices.size()); + mClothActor[index]->mCloth->setConvexes(cind, 0, mClothActor[index]->mCloth->getNumConvexes()); + + //create render mesh + //scale down the render model to not intersect the triangles so much + auto renderMesh = new MeshGenerator::MeshGeneratorRenderMesh(mesh); + Renderable* renderable = getSceneController()->getRenderer().createRenderable(*renderMesh, *getSceneController()->getDefaultMaterial()); + trackRenderable(renderable); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + mClothActor[index]->mCloth->setDragCoefficient(0.1f); + mClothActor[index]->mCloth->setLiftCoefficient(0.1f); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void PlaneCollisionScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + + initializeCloth(0, physx::PxVec3(0.0f, 0.0f, 0.0f)); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/PlaneCollisionScene.h b/NvCloth/samples/SampleBase/scene/scenes/PlaneCollisionScene.h new file mode 100644 index 0000000..32ff35b --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/PlaneCollisionScene.h @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef PLANE_COLLISION_SCENE_H +#define PLANE_COLLISION_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class PlaneCollisionScene : public Scene +{ +public: + + PlaneCollisionScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxVec3 offset); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[1]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[1]; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/SelfCollisionScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/SelfCollisionScene.cpp new file mode 100644 index 0000000..6a407ea --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/SelfCollisionScene.cpp @@ -0,0 +1,155 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "SelfCollisionScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" + +DECLARE_SCENE_NAME(SelfCollisionScene, "Self Collision Scene") + +void SelfCollisionScene::initializeCloth(int index, physx::PxMat44 transform) +{ + /////////////////////////////////////////////////////////////////////// + + float w = 5.f - index; + float h = 6.f + index; + transform *= PxTransform(PxVec3(0.f, 13.f, 0.f), PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + ClothMeshData clothMesh; + clothMesh.GeneratePlaneCloth(w, h, 5 * w, 5 * h, false, transform); + clothMesh.AttachClothPlaneByAngles(5 * w, 5 * h); + clothMesh.SetInvMasses(1.0f / (1000.0f / (5.0f*w*5.0f*h))); + + float w2 = w - 1.0f; + float h2 = h + 1.0f; + transform *= PxTransform(PxVec3(0.f, 0.8f, -0.2f), PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + ClothMeshData clothMesh2; + clothMesh2.GeneratePlaneCloth(w2, h2, 5 * w2, 5 * h2, false, transform); + clothMesh2.AttachClothPlaneByAngles(5 * w2, 5 * h2); + clothMesh2.SetInvMasses(1.0f / (1000.0f / (5.0f*w2*5.0f*h2))); + int FirstParticleIndexCloth2 = (int)clothMesh.mVertices.size(); + clothMesh.Merge(clothMesh2); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + mClothActor[index]->mClothRenderable->setColor(getRandomPastelColor()); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.9f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + std::vector<physx::PxVec4> planes; + planes.push_back(physx::PxVec4(physx::PxVec3(0.0f, 1.f, 0.0f), -0.01f)); + + nv::cloth::Range<const physx::PxVec4> planesR(&planes[0], &planes[0] + planes.size()); + mClothActor[index]->mCloth->setPlanes(planesR, 0, mClothActor[index]->mCloth->getNumPlanes()); + std::vector<uint32_t> indices; + indices.resize(planes.size()); + for(int i = 0; i < (int)indices.size(); i++) + indices[i] = 1 << i; + nv::cloth::Range<uint32_t> cind(&indices[0], &indices[0] + indices.size()); + mClothActor[index]->mCloth->setConvexes(cind, 0, mClothActor[index]->mCloth->getNumConvexes()); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -1.0f, 0.0f)); + mClothActor[index]->mCloth->setFriction(0.1); + mClothActor[index]->mCloth->setDragCoefficient(0.1f); + mClothActor[index]->mCloth->setLiftCoefficient(0.1f); + mClothActor[index]->mCloth->setSolverFrequency(120.0f); + mClothActor[index]->mCloth->setSelfCollisionDistance(0.26); + mClothActor[index]->mCloth->setSelfCollisionStiffness(0.95); + + std::vector<uint32_t> selfCollisionIndices; + + //only enable every other particle for self collision + for(int y = 0; y < 5*h + 1; y++) + for(int x = 0; x < 5 * w + 1; x++) + if((x & 1) ^ (y & 1)) selfCollisionIndices.push_back(x + y*(5 * w + 1)); + + for(int y = 0; y < 5 * h2 + 1; y++) + for(int x = 0; x < 5 * w2 + 1; x++) + if((x & 1) ^ (y & 1)) selfCollisionIndices.push_back(FirstParticleIndexCloth2 + x + y*(5 * w2 + 1)); + + nv::cloth::Range<uint32_t> selfCollisionIndicesRange (&selfCollisionIndices[0], &selfCollisionIndices[0] + selfCollisionIndices.size()); + mClothActor[index]->mCloth->setSelfCollisionIndices(selfCollisionIndicesRange); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void SelfCollisionScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + /*mSolver->setInterCollisionNbIterations(8); + mSolver->setInterCollisionDistance(0.4f); + mSolver->setInterCollisionStiffness(0.95f); + mSolver->setInterCollisionFilter( + [](void* a, void* b) { + return true; + } + );*/ + trackSolver(mSolver); + + physx::PxMat44 posTrans(physx::PxIdentity); + posTrans.setPosition(physx::PxVec3(0.0f, 0.f, -1.0f)); + initializeCloth(0, posTrans); + //posTrans.setPosition(physx::PxVec3(0.0f, 0.8f, -1.2f)); + //initializeCloth(1, posTrans); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/SelfCollisionScene.h b/NvCloth/samples/SampleBase/scene/scenes/SelfCollisionScene.h new file mode 100644 index 0000000..0fcdeac --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/SelfCollisionScene.h @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef SELF_COLLISION_SCENE_H +#define SELF_COLLISION_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class SelfCollisionScene : public Scene +{ +public: + + SelfCollisionScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxMat44 transform); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[2]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[2]; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/SimpleScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/SimpleScene.cpp index 68bb96b..b52e2c6 100644 --- a/NvCloth/samples/SampleBase/scene/scenes/SimpleScene.cpp +++ b/NvCloth/samples/SampleBase/scene/scenes/SimpleScene.cpp @@ -26,9 +26,9 @@ void SimpleScene::onInitialize() /////////////////////////////////////////////////////////////////////// ClothMeshData clothMesh; - physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f), PxQuat(PxPi / 6.f, PxVec3(1.f, 0.f, 0.f))); - clothMesh.GeneratePlaneCloth(6.f, 7.f, 59, 69, false, transform); - clothMesh.AttachClothPlaneByAngles(59, 69); + physx::PxMat44 transform = PxTransform(PxVec3(-2.f, 13.f, 0.f), PxQuat(PxPi / 6.f, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(6.f, 7.f, 49, 59, false, transform); + clothMesh.AttachClothPlaneByAngles(49, 59); mClothActor = new ClothActor; nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); @@ -48,11 +48,11 @@ void SimpleScene::onInitialize() particlesCopy.resize(clothMesh.mVertices.size()); physx::PxVec3 center = transform.transform(physx::PxVec3(0.0f, 0.0f, 0.0f)); - for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + for (int i = 0; i < (int)clothMesh.mVertices.size(); i++) { // To put attachment point closer to each other if(clothMesh.mInvMasses[i] < 1e-6) - clothMesh.mVertices[i] = (clothMesh.mVertices[i] - center)*0.85f + center; + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - center) * 0.85f + center; particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles } @@ -65,7 +65,7 @@ void SimpleScene::onInitialize() // Setup phase configs std::vector<nv::cloth::PhaseConfig> phases(mFabric->getNumPhases()); - for(int i = 0; i < (int)phases.size(); i++) + for (int i = 0; i < (int)phases.size(); i++) { phases[i].mPhaseIndex = i; phases[i].mStiffness = 1.0f; @@ -74,8 +74,8 @@ void SimpleScene::onInitialize() phases[i].mStretchLimit = 1.0f; } mClothActor->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); - mClothActor->mCloth->setDragCoefficient(0.5f); - mClothActor->mCloth->setDragCoefficient(0.5f); + mClothActor->mCloth->setDragCoefficient(0.1f); + mClothActor->mCloth->setDragCoefficient(0.1f); mSolver = getSceneController()->getFactory()->createSolver(); trackSolver(mSolver); diff --git a/NvCloth/samples/SampleBase/scene/scenes/SphereScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/SphereScene.cpp new file mode 100644 index 0000000..d963011 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/SphereScene.cpp @@ -0,0 +1,121 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "SphereScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" +#include "windows.h" + +DECLARE_SCENE_NAME(SphereScene, "Sphere Scene") + + +void SphereScene::initializeCloth(int index, physx::PxVec3 offset) +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.f, 69, 79, false, transform); + clothMesh.AttachClothPlaneByAngles(69, 79); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + mClothActor[index]->mCloth->setDamping(physx::PxVec3(0.1f, 0.1f, 0.1f)); + + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Sphere); + Renderable* sphere = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultMaterial()); + sphere->setTransform(PxTransform(PxVec3(0.f, 10.f, -1.f) + offset, PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + sphere->setScale(PxVec3(1.5f)); + trackRenderable(sphere); + } + + physx::PxVec4 spheres[1] = {physx::PxVec4(physx::PxVec3(0.f, 10.f, -1.f) + offset,1.5)}; + + mClothActor[index]->mCloth->setSpheres(nv::cloth::Range<physx::PxVec4>(spheres, spheres + 1), 0, mClothActor[index]->mCloth->getNumSpheres()); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void SphereScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + + initializeCloth(0, physx::PxVec3(0.0f, 0.0f, 0.0f)); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/SphereScene.h b/NvCloth/samples/SampleBase/scene/scenes/SphereScene.h new file mode 100644 index 0000000..60d7753 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/SphereScene.h @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef SPHERE_SCENE_H +#define SPHERE_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class SphereScene : public Scene +{ +public: + + SphereScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxVec3 offset); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[1]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[1]; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/StiffnessPerConstraintScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/StiffnessPerConstraintScene.cpp new file mode 100644 index 0000000..4ed9daf --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/StiffnessPerConstraintScene.cpp @@ -0,0 +1,122 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "StiffnessPerConstraintScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" +#include "windows.h" + +DECLARE_SCENE_NAME(StiffnessPerConstraintScene, "Stiffness per constraint scene") + +void StiffnessPerConstraintScene::initializeCloth(int index, physx::PxVec3 offset) +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.25f, 39, 49, false, transform); + clothMesh.AttachClothPlaneByAngles(39, 39); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + meshDesc.pointsStiffness.stride = sizeof(float); + meshDesc.pointsStiffness.count = meshDesc.points.count; + float* stiffnessValues = new float[meshDesc.pointsStiffness.count]; + meshDesc.pointsStiffness.data = stiffnessValues; + for(int y = 0; y<50; y++) + for(int x = 0; x<40; x++) + { + stiffnessValues[x + y * 40] = ((y) % 8)<5 ? 1.0f : 0.1f; + } + + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + mClothActor[index]->mCloth->setTetherConstraintStiffness(0.1); + mClothActor[index]->mCloth->setTetherConstraintScale(1.5f); + mClothActor[index]->mCloth->setDragCoefficient(0.1); + mClothActor[index]->mCloth->setSolverFrequency(120.0f); + mClothActor[index]->mCloth->setDamping(physx::PxVec3(0.1f, 0.1f, 0.1f)); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + mClothActor[index]->mCloth->setDragCoefficient(0.1f); + mClothActor[index]->mCloth->setLiftCoefficient(0.1f); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void StiffnessPerConstraintScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + initializeCloth(0, physx::PxVec3(0.0f, 0.0f, 0.0f)); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/StiffnessPerConstraintScene.h b/NvCloth/samples/SampleBase/scene/scenes/StiffnessPerConstraintScene.h new file mode 100644 index 0000000..bd56a13 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/StiffnessPerConstraintScene.h @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef STIFFNESS_PER_CONSTRAINT_SCENE_H +#define STIFFNESS_PER_CONSTRAINT_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class StiffnessPerConstraintScene : public Scene +{ +public: + + StiffnessPerConstraintScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxVec3 offset); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[1]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[1]; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/TetherScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/TetherScene.cpp index b818d9d..ecd0850 100644 --- a/NvCloth/samples/SampleBase/scene/scenes/TetherScene.cpp +++ b/NvCloth/samples/SampleBase/scene/scenes/TetherScene.cpp @@ -23,12 +23,11 @@ DECLARE_SCENE_NAME(TetherScene, "Tether Scene") void TetherScene::initializeCloth(int index, physx::PxVec3 offset, float tetherStiffness) { - /////////////////////////////////////////////////////////////////////// ClothMeshData clothMesh; - physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(PxPi / 6.f, PxVec3(1.f, 0.f, 0.f))); - clothMesh.GeneratePlaneCloth(6.f, 7.5f, 39, 59, false, transform); - clothMesh.AttachClothPlaneByAngles(39, 59); + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f) + offset, PxQuat(PxPi / 6.f, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(6.f, 7.f, 49, 59, false, transform); + clothMesh.AttachClothPlaneByAngles(49, 59); mClothActor[index] = new ClothActor; nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); @@ -48,13 +47,13 @@ void TetherScene::initializeCloth(int index, physx::PxVec3 offset, float tetherS particlesCopy.resize(clothMesh.mVertices.size()); physx::PxVec3 clothOffset = transform.getPosition(); - for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + for (int i = 0; i < (int)clothMesh.mVertices.size(); i++) { // To put attachment point closer to each other if(clothMesh.mInvMasses[i] < 1e-6) - clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.8f + clothOffset; + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset) * 0.8f + clothOffset; - particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], 0.5f * clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles } // Create the cloth from the initial positions/masses and the fabric @@ -66,19 +65,16 @@ void TetherScene::initializeCloth(int index, physx::PxVec3 offset, float tetherS // Setup phase configs std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); - for(int i = 0; i < (int)phases.size(); i++) + for (int i = 0; i < (int)phases.size(); i++) { phases[i].mPhaseIndex = i; - phases[i].mStiffness = 1.0f; + phases[i].mStiffness = 0.75f; phases[i].mStiffnessMultiplier = 1.0f; phases[i].mCompressionLimit = 1.0f; phases[i].mStretchLimit = 1.0f; } mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); - - mSolver = getSceneController()->getFactory()->createSolver(); - trackSolver(mSolver); trackClothActor(mClothActor[index]); // Add the cloth to the solver for simulation @@ -87,9 +83,11 @@ void TetherScene::initializeCloth(int index, physx::PxVec3 offset, float tetherS void TetherScene::onInitialize() { + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); - initializeCloth(0,physx::PxVec3(-5.0f,0.0f,0.0f),0); - initializeCloth(1, physx::PxVec3(4.0f, 0.0f, 0.0f),1); + initializeCloth(0,physx::PxVec3(-7.0f, 2.0f, 0.0f), 0.0f); + initializeCloth(1, physx::PxVec3(2.0f, 2.0f, 0.0f), 1.0f); mTime = 0.0f; diff --git a/NvCloth/samples/SampleBase/scene/scenes/TriangleScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/TriangleScene.cpp new file mode 100644 index 0000000..1822bb9 --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/TriangleScene.cpp @@ -0,0 +1,131 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "TriangleScene.h" +#include "Scene/SceneController.h" +#include <NvClothExt/ClothFabricCooker.h> +#include "ClothMeshGenerator.h" +#include <NvCloth/Fabric.h> +#include <NvCloth/Solver.h> +#include <NvCloth/Cloth.h> +#include <NvCloth/Factory.h> +#include "Renderer.h" +#include "renderer/RenderUtils.h" +#include "windows.h" +#include "utils/MeshGenerator.h" + +DECLARE_SCENE_NAME(TriangleScene, "Triangle Scene") + + +void TriangleScene::initializeCloth(int index, physx::PxVec3 offset) +{ + /////////////////////////////////////////////////////////////////////// + ClothMeshData clothMesh; + + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(0, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.f, 39, 44, false, transform); + clothMesh.AttachClothPlaneByAngles(39, 44); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); + + mClothActor[index] = new ClothActor; + nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); + { + mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); + mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); + } + + nv::cloth::Vector<int32_t>::Type phaseTypeInfo; + mFabric[index] = NvClothCookFabricFromMesh(getSceneController()->getFactory(), meshDesc, physx::PxVec3(0.0f, 0.0f, 1.0f), &phaseTypeInfo, false); + trackFabric(mFabric[index]); + + // Initialize start positions and masses for the actual cloth instance + // (note: the particle/vertex positions do not have to match the mesh description here. Set the positions to the initial shape of this cloth instance) + std::vector<physx::PxVec4> particlesCopy; + particlesCopy.resize(clothMesh.mVertices.size()); + + physx::PxVec3 clothOffset = transform.getPosition(); + for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + { + // To put attachment point closer to each other + if(clothMesh.mInvMasses[i] < 1e-6) + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; + + particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles + } + + // Create the cloth from the initial positions/masses and the fabric + mClothActor[index]->mCloth = getSceneController()->getFactory()->createCloth(nv::cloth::Range<physx::PxVec4>(&particlesCopy[0], &particlesCopy[0] + particlesCopy.size()), *mFabric[index]); + particlesCopy.clear(); particlesCopy.shrink_to_fit(); + + mClothActor[index]->mCloth->setGravity(physx::PxVec3(0.0f, -9.8f, 0.0f)); + mClothActor[index]->mCloth->setDamping(physx::PxVec3(0.1f, 0.1f, 0.1f)); + + //Generate triangle sphere + physx::PxVec3 meshOffset(0.0f, 11.0f, -1.0f); + auto mesh = MeshGenerator::generateIcosahedron(1.5f,1); + mesh.applyTransfom(physx::PxMat44(physx::PxTransform(meshOffset))); + + //assign as collision data + physx::PxVec3* collisionTriangles; + int vertexCount = mesh.generateTriangleList(&collisionTriangles); + nv::cloth::Range<const physx::PxVec3> trRange(&collisionTriangles[0], &collisionTriangles[0] + vertexCount); + mClothActor[index]->mCloth->setTriangles(trRange, 0, 0); + + //create render mesh + //scale down the render model to not intersect the triangles so much + mesh.applyTransfom( physx::PxMat44(physx::PxTransform(meshOffset))* //redo translation + physx::PxMat44(physx::PxVec4(0.97,0.97,0.97,1.0f))* //scale + physx::PxMat44(physx::PxTransform(-meshOffset))); //undo translation + auto renderMesh = new MeshGenerator::MeshGeneratorRenderMesh(mesh); + Renderable* renderable = getSceneController()->getRenderer().createRenderable(*renderMesh, *getSceneController()->getDefaultMaterial()); + trackRenderable(renderable); + + // Setup phase configs + std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); + for(int i = 0; i < (int)phases.size(); i++) + { + phases[i].mPhaseIndex = i; + phases[i].mStiffness = 1.0f; + phases[i].mStiffnessMultiplier = 1.0f; + phases[i].mCompressionLimit = 1.0f; + phases[i].mStretchLimit = 1.0f; + } + mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); + mClothActor[index]->mCloth->setDragCoefficient(0.1f); + mClothActor[index]->mCloth->setLiftCoefficient(0.1f); + + trackClothActor(mClothActor[index]); + + // Add the cloth to the solver for simulation + addClothToSolver(mClothActor[index], mSolver); +} + +void TriangleScene::onInitialize() +{ + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); + + initializeCloth(0, physx::PxVec3(0.0f, 0.0f, 0.0f)); + + { + IRenderMesh* mesh = getSceneController()->getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); + Renderable* plane = getSceneController()->getRenderer().createRenderable(*mesh, *getSceneController()->getDefaultPlaneMaterial()); + plane->setTransform(PxTransform(PxVec3(0.f, 0.f, 0.f), PxQuat(PxPiDivTwo, PxVec3(0.f, 0.f, 1.f)))); + plane->setScale(PxVec3(1000.f)); + trackRenderable(plane); + } +} diff --git a/NvCloth/samples/SampleBase/scene/scenes/TriangleScene.h b/NvCloth/samples/SampleBase/scene/scenes/TriangleScene.h new file mode 100644 index 0000000..35cfefb --- /dev/null +++ b/NvCloth/samples/SampleBase/scene/scenes/TriangleScene.h @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef TRIANGLE_SCENE_H +#define TRIANGLE_SCENE_H + +#include "scene/Scene.h" +#include <foundation/PxVec3.h> + +class TriangleScene : public Scene +{ +public: + + TriangleScene(SceneController* sceneController): Scene(sceneController) {} + + void initializeCloth(int index, physx::PxVec3 offset); + virtual void onInitialize() override; + +private: + nv::cloth::Fabric* mFabric[1]; + nv::cloth::Solver* mSolver; + ClothActor* mClothActor[1]; +}; + + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/scene/scenes/WindScene.cpp b/NvCloth/samples/SampleBase/scene/scenes/WindScene.cpp index 51cec1d..232316d 100644 --- a/NvCloth/samples/SampleBase/scene/scenes/WindScene.cpp +++ b/NvCloth/samples/SampleBase/scene/scenes/WindScene.cpp @@ -18,6 +18,7 @@ #include <NvCloth/Factory.h> #include "Renderer.h" #include "renderer/RenderUtils.h" +#include "windows.h" DECLARE_SCENE_NAME(WindScene, "Wind Scene") @@ -27,17 +28,19 @@ void WindScene::Animate(double dt) if(mTime > 3.7f) { - float dvx = 3.f * cos(25.f * mTime); - float vy = max(0.f, 0.9f * cos(11.f * mTime)); - float dvz = 1.5f * sin(19.f * mTime); + float dvx = 6.0f * sin((1.f + sinf(mTime) * 0.5f) * mTime); + float vy = 0; + float dvz = 50.0f + 7.0f * sin((9.f + sinf(mTime + 2.0f) * 0.5f) * mTime) + + 4.0f * sin((7.f + sinf(mTime * 0.9f) * 0.5f) * mTime); + for(int i = 0; i < 3; i++) { - physx::PxVec3 wind = physx::PxVec3(2.5f + dvx, vy, 15.f + dvz); + physx::PxVec3 wind = physx::PxVec3(dvx, vy, dvz); mClothActor[i]->mCloth->setWindVelocity(wind); } } - doSimulationStep(dt); + Scene::Animate(dt); } void WindScene::initializeCloth(int index, physx::PxVec3 offset) @@ -45,17 +48,23 @@ void WindScene::initializeCloth(int index, physx::PxVec3 offset) /////////////////////////////////////////////////////////////////////// ClothMeshData clothMesh; - physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f)+ offset, PxQuat(PxPi / 6.f, PxVec3(1.f, 0.f, 0.f))); - clothMesh.GeneratePlaneCloth(5.f, 6.f, 49, 59, false, transform); - clothMesh.AttachClothPlaneByAngles(49, 59); - clothMesh.SetInvMasses(0.2f + (float)index * 1.4f); + physx::PxMat44 transform = PxTransform(PxVec3(0.f, 13.f, 0.f) + offset, PxQuat(PxPi / 2.0f, PxVec3(1.f, 0.f, 0.f))); + clothMesh.GeneratePlaneCloth(5.f, 6.f, 69, 79, false, transform); + clothMesh.AttachClothPlaneByAngles(69, 79); + clothMesh.SetInvMasses(0.5f + (float)index * 2.0f); mClothActor[index] = new ClothActor; nv::cloth::ClothMeshDesc meshDesc = clothMesh.GetClothMeshDesc(); { mClothActor[index]->mClothRenderMesh = new ClothRenderMesh(meshDesc); mClothActor[index]->mClothRenderable = getSceneController()->getRenderer().createRenderable(*(static_cast<IRenderMesh*>(mClothActor[index]->mClothRenderMesh)), *getSceneController()->getDefaultMaterial()); - mClothActor[index]->mClothRenderable->setColor(getRandomPastelColor()); + + float r, g, b; + r = index == 0 ? 1.0f : 0.3f; + g = index == 1 ? 1.0f : 0.3f; + b = index == 2 ? 1.0f : 0.3f; + + mClothActor[index]->mClothRenderable->setColor(DirectX::XMFLOAT4(r, g, b, 1.0f)); } nv::cloth::Vector<int32_t>::Type phaseTypeInfo; @@ -68,11 +77,11 @@ void WindScene::initializeCloth(int index, physx::PxVec3 offset) particlesCopy.resize(clothMesh.mVertices.size()); physx::PxVec3 clothOffset = transform.getPosition(); - for(int i = 0; i < (int)clothMesh.mVertices.size(); i++) + for (int i = 0; i < (int)clothMesh.mVertices.size(); i++) { // To put attachment point closer to each other if(clothMesh.mInvMasses[i] < 1e-6) - clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.9f + clothOffset; + clothMesh.mVertices[i] = (clothMesh.mVertices[i] - clothOffset)*0.95f + clothOffset; particlesCopy[i] = physx::PxVec4(clothMesh.mVertices[i], clothMesh.mInvMasses[i]); // w component is 1/mass, or 0.0f for anchored/fixed particles } @@ -85,7 +94,7 @@ void WindScene::initializeCloth(int index, physx::PxVec3 offset) // Setup phase configs std::vector<nv::cloth::PhaseConfig> phases(mFabric[index]->getNumPhases()); - for(int i = 0; i < (int)phases.size(); i++) + for (int i = 0; i < (int)phases.size(); i++) { phases[i].mPhaseIndex = i; phases[i].mStiffness = 1.0f; @@ -94,11 +103,9 @@ void WindScene::initializeCloth(int index, physx::PxVec3 offset) phases[i].mStretchLimit = 1.0f; } mClothActor[index]->mCloth->setPhaseConfig(nv::cloth::Range<nv::cloth::PhaseConfig>(&phases.front(), &phases.back())); - mClothActor[index]->mCloth->setDragCoefficient(0.5f); - mClothActor[index]->mCloth->setLiftCoefficient(0.6f); + mClothActor[index]->mCloth->setDragCoefficient(0.4f); + mClothActor[index]->mCloth->setLiftCoefficient(0.25f); - mSolver = getSceneController()->getFactory()->createSolver(); - trackSolver(mSolver); trackClothActor(mClothActor[index]); // Add the cloth to the solver for simulation @@ -107,10 +114,12 @@ void WindScene::initializeCloth(int index, physx::PxVec3 offset) void WindScene::onInitialize() { + mSolver = getSceneController()->getFactory()->createSolver(); + trackSolver(mSolver); - initializeCloth(2,physx::PxVec3(-9.0f,0.0f,0.0f)); - initializeCloth(1, physx::PxVec3(-2.0f, 0.0f, 0.0f)); - initializeCloth(0, physx::PxVec3(5.0f, 0.0f, 0.0f)); + initializeCloth(2,physx::PxVec3(-11.0f, 0.0f,0.0f)); + initializeCloth(1, physx::PxVec3(-4.0f, 0.0f, 0.0f)); + initializeCloth(0, physx::PxVec3(3.0f, 0.0f, 0.0f)); mTime = 0.0f; diff --git a/NvCloth/samples/SampleBase/ui/CommonUIController.cpp b/NvCloth/samples/SampleBase/ui/CommonUIController.cpp index 0c0cac8..63284a2 100644 --- a/NvCloth/samples/SampleBase/ui/CommonUIController.cpp +++ b/NvCloth/samples/SampleBase/ui/CommonUIController.cpp @@ -89,12 +89,7 @@ LRESULT CommonUIController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM int iKeyPressed = static_cast<int>(wParam); switch (iKeyPressed) { - case 'P': - { - //getPhysXController().setPaused(!getPhysXController().isPaused()); - break; - } - case 'O': + case 'B': { getRenderer().setWireframeMode(!getRenderer().getWireframeMode()); break; @@ -226,7 +221,7 @@ void CommonUIController::drawUI() { // WireFrame bool wireFrameEnabled = getRenderer().getWireframeMode(); - if (ImGui::Checkbox("WireFrame (O)", &wireFrameEnabled)) + if (ImGui::Checkbox("WireFrame (B)", &wireFrameEnabled)) { getRenderer().setWireframeMode(wireFrameEnabled); } diff --git a/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp b/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp index d75bb25..49f9ada 100644 --- a/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp +++ b/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp @@ -17,9 +17,8 @@ void ClothMeshData::Clear() mQuads.clear(); } -void ClothMeshData::GeneratePlaneCloth(float width, float height, int segmentsX, int segmentsY, bool createQuads, physx::PxMat44 transform, bool alternatingDiagonals) +void ClothMeshData::GeneratePlaneCloth(float width, float height, int segmentsX, int segmentsY, bool createQuads, physx::PxMat44 transform, bool alternatingDiagonals, int zigzag) { - /* GeneratePlaneCloth(x,y,2,2) generates: @@ -61,14 +60,30 @@ GeneratePlaneCloth(x,y,2,2) generates: { for(int x = 0; x < segmentsX + 1; x++) { - mVertices[x + y * (segmentsX + 1)] = transform.transform(topLeft + physx::PxVec3( ((float)x / (float)segmentsX) * width, - 0.f, - ((float)y / (float)segmentsY) * height)); + physx::PxVec3 pos; + switch(zigzag) + { + case 1: + pos = physx::PxVec3(((float)x / (float)segmentsX) * width, + sinf(y*0.5)/(float)segmentsY * height, + ((float)y / (float)segmentsY) * height); + break; + case 2: + pos = physx::PxVec3(((float)x / (float)segmentsX) * width, + ((float)(y&2) / (float)segmentsY) * height, + ((float)((y+1)&~1) / (float)segmentsY) * height); + default: + pos = physx::PxVec3(((float)x / (float)segmentsX) * width, + 0.f, + ((float)y / (float)segmentsY) * height); + } + + mVertices[x + y * (segmentsX + 1)] = transform.transform(topLeft + pos); + mInvMasses[x + y * (segmentsX + 1)] = 1.0f; - mMesh.vertices[x + y * (segmentsX + 1)].position = transform.transform(topLeft + physx::PxVec3(((float)x / (float)segmentsX) * width, - 0.f, - ((float)y / (float)segmentsY) * height)); + mMesh.vertices[x + y * (segmentsX + 1)].position = transform.transform(topLeft + pos); + mMesh.vertices[x + y * (segmentsX + 1)].normal = transform.transform(physx::PxVec3(0.f, 1.f, 0.f)); mMesh.vertices[x + y * (segmentsX + 1)].uv = physx::PxVec2(uvOx + uvSx*(float)x / (float)segmentsX, uvOy + uvSy*(1.0f - (float)y / (float)segmentsY)); @@ -190,4 +205,29 @@ nv::cloth::ClothMeshDesc ClothMeshData::GetClothMeshDesc() SimpleMesh ClothMeshData::GetRenderMesh() { return mMesh; +} + +void ClothMeshData::Merge(const ClothMeshData& other) +{ + uint32_t firstVertex = (uint32_t)mVertices.size(); + uint32_t firstTriangle = (uint32_t)mTriangles.size(); + uint32_t firstQuad = (uint32_t)mQuads.size(); + + mVertices.insert(mVertices.end(), other.mVertices.begin(), other.mVertices.end()); + mUvs.insert(mUvs.end(), other.mUvs.begin(), other.mUvs.end()); + mInvMasses.insert(mInvMasses.end(), other.mInvMasses.begin(), other.mInvMasses.end()); + + mMesh.vertices.insert(mMesh.vertices.end(), mMesh.vertices.begin(), mMesh.vertices.end()); + + for(const auto& t : other.mTriangles) + { + mTriangles.push_back(t + firstVertex); + } + for(const auto& q : other.mQuads) + { + mQuads.push_back(q + firstVertex); + mMesh.indices.push_back(mQuads.back().a); + mMesh.indices.push_back(mQuads.back().b); + mMesh.indices.push_back(mQuads.back().c); + } }
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.h b/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.h index 0f57230..d6cf0fd 100644 --- a/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.h +++ b/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.h @@ -24,6 +24,8 @@ struct ClothMeshData Triangle(uint32_t _a, uint32_t _b, uint32_t _c) : a(_a), b(_b), c(_c){} uint32_t a, b, c; + + Triangle operator+(uint32_t offset)const { return Triangle(a + offset, b + offset, c + offset); }; }; struct Quad { @@ -31,6 +33,8 @@ struct ClothMeshData Quad(uint32_t _a, uint32_t _b, uint32_t _c, uint32_t _d) : a(_a), b(_b), c(_c), d(_d){} uint32_t a, b, c, d; + + Quad operator+(uint32_t offset)const { return Quad(a + offset, b + offset, c + offset, d + offset); }; }; std::vector<physx::PxVec3> mVertices; std::vector<physx::PxVec2> mUvs; @@ -41,7 +45,7 @@ struct ClothMeshData SimpleMesh mMesh; void Clear(); - void GeneratePlaneCloth(float width, float height, int segmentsX, int segmentsY, bool createQuads = false, physx::PxMat44 transform = physx::PxIdentity, bool alternatingDiagonals = true); + void GeneratePlaneCloth(float width, float height, int segmentsX, int segmentsY, bool createQuads = false, physx::PxMat44 transform = physx::PxIdentity, bool alternatingDiagonals = true, int zigzag = 0); void AttachClothPlaneByAngles(int segmentsX, int segmentsY, bool attachByWidth = true); void AttachClothPlaneBySide(int segmentsX, int segmentsY, bool attachByWidth = true); @@ -51,4 +55,6 @@ struct ClothMeshData nv::cloth::ClothMeshDesc GetClothMeshDesc(); SimpleMesh GetRenderMesh(); + + void Merge(const ClothMeshData& other); }; diff --git a/NvCloth/samples/SampleBase/utils/DebugLineRenderBuffer.cpp b/NvCloth/samples/SampleBase/utils/DebugLineRenderBuffer.cpp new file mode 100644 index 0000000..72e60e8 --- /dev/null +++ b/NvCloth/samples/SampleBase/utils/DebugLineRenderBuffer.cpp @@ -0,0 +1,21 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#include "DebugLineRenderBuffer.h" + +void DebugLineRenderBuffer::addLine(physx::PxVec3 a, physx::PxVec3 b, unsigned int color) +{ + m_lines.push_back(PxDebugLine(a, b, color)); +} + +void DebugLineRenderBuffer::addLine(physx::PxMat44 t, physx::PxVec3 a, physx::PxVec3 b, unsigned int color) +{ + m_lines.push_back(PxDebugLine(t.transform(a), t.transform(b), color)); +}
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/utils/DebugLineRenderBuffer.h b/NvCloth/samples/SampleBase/utils/DebugLineRenderBuffer.h new file mode 100644 index 0000000..ce800d5 --- /dev/null +++ b/NvCloth/samples/SampleBase/utils/DebugLineRenderBuffer.h @@ -0,0 +1,25 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#pragma once +#include "DebugRenderBuffer.h" +#include <foundation/PxVec3.h> +#include <foundation/PxMat44.h> + +class DebugLineRenderBuffer : public DebugRenderBuffer +{ +public: + void clear() { m_lines.clear(); } + void addLine(physx::PxVec3 a, physx::PxVec3 b, unsigned int color); + void addVector(physx::PxVec3 start, physx::PxVec3 vec, unsigned int color) { addLine(start, start + vec, color); } + + void addLine(physx::PxMat44 t, physx::PxVec3 a, physx::PxVec3 b, unsigned int color); + void addVector(physx::PxMat44 t, physx::PxVec3 start, physx::PxVec3 vec, unsigned int color) { addLine(t, start, start + vec, color); } +};
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/utils/MeshGenerator.cpp b/NvCloth/samples/SampleBase/utils/MeshGenerator.cpp new file mode 100644 index 0000000..857daed --- /dev/null +++ b/NvCloth/samples/SampleBase/utils/MeshGenerator.cpp @@ -0,0 +1,545 @@ + + +#include "./MeshGenerator.h" +#include <foundation/PxVec2.h> +#include <utility> +#include "utils/Utils.h" + +namespace MeshGenerator +{ + +void Polygon::triangulate(std::vector<Polygon>& out) const +{ + for(int i = 2; i < (int)mPoints.size(); i++) + { + out.push_back(Polygon(mPoints[0], mPoints[i - 1], mPoints[i])); + } +} + +void Polygon::triangulate(std::vector<RenderVertex>& verts, std::vector<uint16_t>& indices) const +{ + physx::PxVec3 normal = calculateNormal(); + for(int i = 2; i < (int)mPoints.size(); i++) + { + indices.push_back((uint16_t)verts.size()); + verts.push_back(RenderVertex(mPoints[0].p,normal)); + indices.push_back((uint16_t)verts.size()); + verts.push_back(RenderVertex(mPoints[i - 1].p, normal)); + indices.push_back((uint16_t)verts.size()); + verts.push_back(RenderVertex(mPoints[i].p, normal)); + } +} + +void Polygon::triangulateWeld(std::vector<RenderVertex>& verts, std::vector<uint16_t>& indices) const +{ + auto addVertex = [&verts, &indices](RenderVertex v) + { + for(int i = 0; i < (int)verts.size(); i++) + { + if((verts[i].p - v.p).magnitudeSquared() < 0.001f) + { + return i; + } + } + verts.push_back(v); + return (uint16_t)verts.size()-1; + }; + + physx::PxVec3 weightedNormal = calculateNormal()*calculateArea(); + + for(int i = 2; i < (int)mPoints.size(); i++) + { + indices.push_back(addVertex(RenderVertex(mPoints[0].p, weightedNormal))); + indices.push_back(addVertex(RenderVertex(mPoints[i - 1].p, weightedNormal))); + indices.push_back(addVertex(RenderVertex(mPoints[i].p, weightedNormal))); + } +} + +void Polygon::triangulateForCollision(std::vector<physx::PxVec3>& verts) const +{ + for(int i = 2; i < (int)mPoints.size(); i++) + { + verts.push_back(mPoints[0].p); + verts.push_back(mPoints[i - 1].p); + verts.push_back(mPoints[i].p); + } +} + +physx::PxVec3 Polygon::calculateNormal() const +{ + physx::PxVec3 normal(0.0f, 0.0f, 0.0f); + for(int i = 2; i < (int)mPoints.size(); i++) + { + physx::PxVec3 p[3]; + p[0] = mPoints[0].p; + p[1] = mPoints[i - 1].p; + p[2] = mPoints[i].p; + normal += (p[1] - p[0]).cross(p[2] - p[0]); + } + normal.normalize(); + return normal; +} + +float Polygon::calculateArea() const +{ + float doubleArea = 0.0f; + for(int i = 2; i < (int)mPoints.size(); i++) + { + physx::PxVec3 p[3]; + p[0] = mPoints[0].p; + p[1] = mPoints[i - 1].p; + p[2] = mPoints[i].p; + doubleArea += (p[1] - p[0]).cross(p[2] - p[0]).magnitude(); + } + return doubleArea*0.5f; +} + +void Polygon::subdivideTriangle(std::vector<Polygon>& out) const +{ + if(!isTriangle()) + return; + + for(int i = 0; i < 3; i++) + { + out.push_back(Polygon(Point(mPoints[i].p), Point(0.5f*(mPoints[(i+1)%3].p + mPoints[i].p)), Point(0.5f*(mPoints[(i + 2) % 3].p + mPoints[i].p)))); + } + out.push_back(Polygon(Point(0.5f*(mPoints[0].p + mPoints[1].p)), Point(0.5f*(mPoints[1].p + mPoints[2].p)), Point(0.5f*(mPoints[2].p + mPoints[0].p)))); + +} + +float intersetcLinePlane(physx::PxVec3 a, physx::PxVec3 b, physx::PxVec4 plane) +{ + physx::PxVec3 planeNormal(plane.x, plane.y, plane.z); + float aprj = planeNormal.dot(a); + float bprj = planeNormal.dot(b); + + return (-plane.w - aprj) / (bprj - aprj); +} + +bool Polygon::pointPlaneSide(physx::PxVec3 p, physx::PxVec4 plane) const +{ + physx::PxVec3 planeNormal(plane.x, plane.y, plane.z); + return p.dot(planeNormal) + plane.w < 0; +} + +void Polygon::clip(physx::PxVec4 plane, bool flip) +{ + if(mPoints.size() < 3) + return; + + std::vector<Point> input = mPoints; + mPoints.clear(); + + Point S = input.back(); + for(int pointIndex = 0; pointIndex < (int)input.size(); pointIndex++) + { + if(pointPlaneSide(input[pointIndex].p, plane) != flip) + { + if(pointPlaneSide(S.p, plane) == flip) + { + float w = intersetcLinePlane(S.p, input[pointIndex].p, plane); + mPoints.push_back(S * (1.0f - w) + input[pointIndex] * w); + } + mPoints.push_back(input[pointIndex]); + } + else if(pointPlaneSide(S.p, plane) != flip) + { + float w = intersetcLinePlane(S.p, input[pointIndex].p, plane); + mPoints.push_back(S * (1.0f - w) + input[pointIndex] * w); + } + S = input[pointIndex]; + } +} + +void Mesh::addConvexPolygon(physx::PxVec4 plane, physx::PxVec4* planes, uint32_t mask, bool flip) +{ + physx::PxVec3 t1, t2, normal; + normal.x = plane.x; + normal.y = plane.y; + normal.z = plane.z; + computeBasis(normal, &t1, &t2); + Polygon poly; + for(int i = 0; i < 4; i++) + { + float xTable[4] = {-1.0f, 1.0f, 1.0f, -1.0f}; + float yTable[4] = {-1.0f, -1.0f, 1.0f, 1.0f}; + poly.mPoints.push_back(normal*-plane.w + 200.0f*t1 * xTable[i] + 200.0f*t2 * yTable[i]); + //polyTexcoord.push_back(vec2(0.0f, 10.0f) * xTable[i] + vec2(10.0f, 0.0f) * yTable[i]); + } + + for(int i = 0; i < 32; i++) + { + if((1 << i) & mask) + { + const physx::PxVec4 pl = planes[i]; + poly.clip(pl, flip); + } + } + + mPolygons.push_back(poly); +} + +void Mesh::generateRenderBuffers(RenderVertex** vertices, uint16_t** indices, int* vertexCount, int* indexCount) const +{ + std::vector<RenderVertex> verts; + std::vector<uint16_t> inds; + verts.reserve(mPolygons.size()*3); + verts.reserve(inds.size()*3); + + for(auto& p : mPolygons) + { + p.triangulate(verts, inds); + } + + *vertices = new RenderVertex[verts.size()]; + *indices = new uint16_t[inds.size()]; + + memcpy(*vertices, verts.data(), sizeof(RenderVertex)*verts.size()); + memcpy(*indices, inds.data(), sizeof(uint16_t)*inds.size()); + *vertexCount = (uint16_t)verts.size(); + *indexCount = (uint16_t)inds.size(); +} + +void Mesh::generateSmoothRenderBuffers(RenderVertex** vertices, uint16_t** indices, int* vertexCount, int* indexCount) const +{ + std::vector<RenderVertex> verts; + std::vector<uint16_t> inds; + verts.reserve(mPolygons.size() * 3); + verts.reserve(inds.size() * 3); + + for(auto& p : mPolygons) + { + p.triangulateWeld(verts, inds); + } + + for(auto& v : verts) + { + v.n.normalize(); + } + + *vertices = new RenderVertex[verts.size()]; + *indices = new uint16_t[inds.size()]; + + memcpy(*vertices, verts.data(), sizeof(RenderVertex)*verts.size()); + memcpy(*indices, inds.data(), sizeof(uint16_t)*inds.size()); + *vertexCount = (uint16_t)verts.size(); + *indexCount = (uint16_t)inds.size(); + +} + +int Mesh::generateTriangleList(physx::PxVec3** positions) +{ + std::vector<physx::PxVec3> verts; + verts.reserve(mPolygons.size() * 3); + + for(auto& p : mPolygons) + { + p.triangulateForCollision(verts); + } + + *positions = new physx::PxVec3[verts.size()]; + memcpy(*positions, verts.data(), sizeof(physx::PxVec3)*verts.size()); + return (int)verts.size(); +} + +void Mesh::applyTransfom(physx::PxMat44 transform) +{ + for(auto& trig : mPolygons) + for(auto& point : trig.mPoints) + { + point.p = transform.transform(point.p); + } +} + +void Mesh::merge(const Mesh& mesh) +{ + mPolygons.insert(mPolygons.end(), mesh.mPolygons.begin(), mesh.mPolygons.end()); +} + +Mesh generateTetrahedron(float radius) +{ + Mesh mesh; + Point p[4]; + for(int i = 0; i < 3; i++) + { + p[i] = Point(radius*physx::PxVec3(cosf((float)i / 3.0f*PxTwoPi), -sqrtf(2.0f / 3.0f)*0.5f*sqrtf(3), sinf((float)i / 3.0f*PxTwoPi))); + } + p[3] = Point(radius*physx::PxVec3(0, sqrtf(2.0f / 3.0f)*0.5f*sqrtf(3), 0)); + + mesh.mPolygons.push_back(Polygon(p[0], p[1], p[2])); + mesh.mPolygons.push_back(Polygon(p[3], p[1], p[0])); + mesh.mPolygons.push_back(Polygon(p[3], p[2], p[1])); + mesh.mPolygons.push_back(Polygon(p[3], p[0], p[2])); + + return mesh; +} + +Mesh generateIcosahedron(float radius, int subdivisions) +{ + Mesh mesh; + Point p[12]; + + //generate positions + float goldenRatio = (1.0f + sqrtf(5.0f)) * 0.5f; + float scale = radius / physx::PxVec2(goldenRatio, 1.0f).magnitude(); + for(int j = 0; j < 3; j++) + for(int i = 0; i < 4; i++) + { + float signA = i & 1 ? 1.0f : -1.0f; + float signB = i & 2 ? -1.0f : 1.0f; + physx::PxVec3 point(signA, signB * goldenRatio, 0.0f); + p[i + 4 * j] = physx::PxVec3(point[j % 3], point[(j + 1) % 3], point[(j + 2) % 3]) * scale; + } + + //generate triangles + uint16_t ti[20 * 3] = + { + 0, 7, 9, + 0, 9, 1, + 0, 1, 11, + 0, 11, 6, + 0, 6, 7, + + 1, 9, 5, + 9, 7, 8, + 7, 6, 2, + 6, 11, 10, + 11, 1, 4, + + 3, 5, 8, + 3, 8, 2, + 3, 2, 10, + 3, 10, 4, + 3, 4, 5, + + 8, 5, 9, + 2, 8, 7, + 10, 2, 6, + 4, 10, 11, + 5, 4, 1 + }; + + for(int i = 0; i < 20*3; i += 3) + { + mesh.mPolygons.push_back(Polygon(p[ti[i]], p[ti[i+1]], p[ti[i+2]])); + } + + bool projectToSphere = subdivisions > 0; + while(subdivisions > 0) + { + subdivisions--; + Mesh sub; + for(auto& trig : mesh.mPolygons) + { + trig.subdivideTriangle(sub.mPolygons); + } + std::swap(sub.mPolygons, mesh.mPolygons); + } + + if(projectToSphere) + { + for(auto& trig : mesh.mPolygons) + for(auto& point : trig.mPoints) + { + point.p = point.p.getNormalized() * radius; + } + } + + return mesh; +} + +Mesh generateCone(physx::PxVec4 a, physx::PxVec4 b, int segments, float grow, bool correctCone) +{ + Mesh mesh; + + if(a.w < b.w) + std::swap(a, b); + + physx::PxVec3 aCenter = a.getXYZ(); + physx::PxVec3 bCenter = b.getXYZ(); + float aRadius = a.w + grow; + float bRadius = b.w + grow; + + physx::PxVec3 basis[3]; + basis[2] = bCenter - aCenter; + basis[2].normalize(); + computeBasis(basis[2], &basis[0], &basis[1]); + + physx::PxVec3 pa = aCenter + aRadius*basis[0]; + physx::PxVec3 pb = bCenter + bRadius*basis[0]; + physx::PxVec3 dir = pb - pa; + + physx::PxVec3 n = basis[2].cross(dir); + physx::PxVec3 n2 = dir.cross(n); + physx::PxVec3 focusPoint = aCenter + ((pa - aCenter).dot(n2)) / basis[2].dot(n2) * basis[2]; + + if(correctCone) + { + { + float focusDistance = (focusPoint - aCenter).magnitude(); + physx::PxVec3 cCenter = (focusPoint + aCenter)*0.5f; + float cRadius = focusDistance*0.5f; + float d = (aCenter - cCenter).magnitude(); + float a = (aRadius*aRadius - cRadius*cRadius + d*d) / (2.0f*d); + float h = sqrtf(aRadius*aRadius - a*a); + physx::PxVec3 P3 = aCenter + a * (cCenter - aCenter) / d; + + aCenter = P3; + aRadius = h; + } + + { + float focusDistance = (focusPoint - bCenter).magnitude(); + physx::PxVec3 cCenter = (focusPoint + bCenter)*0.5f; + float cRadius = focusDistance*0.5f; + float d = (bCenter - cCenter).magnitude(); + float a = (bRadius*bRadius - cRadius*cRadius + d*d) / (2.0f*d); + float h = sqrtf(bRadius*bRadius - a*a); + physx::PxVec3 P3 = bCenter + a * (cCenter - bCenter) / d; + + bCenter = P3; + bRadius = h; + } + } + + + for(int i = 0; i < segments; i++) + { + float angle1 = (float)i / (float)segments*physx::PxTwoPi; + float angle2 = (float)(i+1) / (float)segments*physx::PxTwoPi; + + Polygon p; + p.addPoints(Point(aCenter + (cosf(angle1)*basis[0] + sinf(angle1)*basis[1])*aRadius)); + p.addPoints(Point(aCenter + (cosf(angle2)*basis[0] + sinf(angle2)*basis[1])*aRadius)); + p.addPoints(Point(bCenter + (cosf(angle2)*basis[0] + sinf(angle2)*basis[1])*bRadius)); + p.addPoints(Point(bCenter + (cosf(angle1)*basis[0] + sinf(angle1)*basis[1])*bRadius)); + + mesh.mPolygons.push_back(p); + } + + return mesh; +} + +Mesh generateCollisionConvex(physx::PxVec4* planes, uint32_t mask, float grow, bool flip) +{ + Mesh mesh; + if(grow != 0.0f) + { + physx::PxVec4* grownPlanes = new physx::PxVec4[32]; + for(int i = 0; i < 32; i++) + { + if((1 << i) & mask) + { + grownPlanes[i] = planes[i]; + grownPlanes[i].w -= grow; + } + } + planes = grownPlanes; + } + + for(int i = 0; i < 32; i++) + { + if((1 << i) & mask) + mesh.addConvexPolygon(planes[i], planes, mask ^ (1 << i), flip); + } + + if(grow != 0.0f) + delete[] planes; + + return mesh; +} + +Mesh generateCollisionCapsules(physx::PxVec4* spheres, int sphereCount, uint32_t* indices, int indexCount, float grow) +{ + Mesh finalMesh; + for(int i = 0; i < sphereCount; i++) + { + Mesh sphere = generateIcosahedron(spheres[i].w+ grow, 4); + sphere.applyTransfom(physx::PxTransform(spheres[i].getXYZ())); + finalMesh.merge(sphere); + } + + for(int i = 0; i < indexCount; i += 2) + { + finalMesh.merge(generateCone(spheres[indices[i]], spheres[indices[i + 1]], 32, grow, true)); + } + + return finalMesh; +} + +uint32_t generateConvexPolyhedronPlanes(int segmentsX, int segmentsY, physx::PxVec3 center, float radius, std::vector<physx::PxVec4>* planes) +{ + int offset = 0; + if(planes) + { + planes->reserve(planes->size() + segmentsX*segmentsY); + offset = (int)planes->size(); + } + + segmentsY += 1; + for(int i = 1; i < segmentsY; i++) + { + float angleY = (float)i / (float)segmentsY * physx::PxPi + physx::PxPiDivTwo; + for(int j = 0; j < segmentsX; j++) + { + float angleX = (float)j / (float)segmentsX * physx::PxTwoPi; + + physx::PxVec3 nx(cosf(angleX), 0.0f, sinf(angleX)); + physx::PxVec3 n = cosf(angleY) * nx + sinf(angleY)*physx::PxVec3(0.0f, 1.0f, 0.0f); + + physx::PxVec3 p = n*radius + center; + + if(planes) planes->push_back(constructPlaneFromPointNormal(p, n)); + } + } + uint64_t shift = (segmentsX * (segmentsY - 1) + offset); + uint64_t excludeMask = (((uint64_t)1 << offset) - 1); + uint64_t mask = (((uint64_t)1 << shift) - 1) & ~excludeMask; + return static_cast<uint32_t>(mask); +} + +MeshGeneratorRenderMesh::MeshGeneratorRenderMesh(const Mesh mesh) +{ + RenderVertex* vertices; + uint16_t* indices; + int vertexCount, indexCount; + mesh.generateRenderBuffers(&vertices, &indices, &vertexCount, &indexCount); + + std::vector<D3D11_INPUT_ELEMENT_DESC> layout; + layout.push_back({"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}); + layout.push_back({"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}); + + initialize(vertices, (uint32_t)vertexCount, sizeof(RenderVertex), layout, indices, indexCount); + + delete vertices; + delete indices; +} +MeshGeneratorRenderMesh::~MeshGeneratorRenderMesh() +{ + +} + +MeshGeneratorRenderMeshSmooth::MeshGeneratorRenderMeshSmooth(const Mesh mesh) +{ + RenderVertex* vertices; + uint16_t* indices; + int vertexCount, indexCount; + mesh.generateSmoothRenderBuffers(&vertices, &indices, &vertexCount, &indexCount); + + std::vector<D3D11_INPUT_ELEMENT_DESC> layout; + layout.push_back({"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}); + layout.push_back({"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}); + + initialize(vertices, (uint32_t)vertexCount, sizeof(RenderVertex), layout, indices, indexCount); + + delete vertices; + delete indices; +} +MeshGeneratorRenderMeshSmooth::~MeshGeneratorRenderMeshSmooth() +{ + +} + + + +}
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/utils/MeshGenerator.h b/NvCloth/samples/SampleBase/utils/MeshGenerator.h new file mode 100644 index 0000000..4f4b0c9 --- /dev/null +++ b/NvCloth/samples/SampleBase/utils/MeshGenerator.h @@ -0,0 +1,114 @@ +/* +* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved. +* +* NVIDIA CORPORATION and its licensors retain all intellectual property +* and proprietary rights in and to this software, related documentation +* and any modifications thereto. Any use, reproduction, disclosure or +* distribution of this software and related documentation without an express +* license agreement from NVIDIA CORPORATION is strictly prohibited. +*/ + +#ifndef MESH_GENERATOR_H +#define MESH_GENERATOR_H + +#include <vector> +#include "renderer/CustomRenderMesh.h" +#include <foundation/PxVec3.h> + +namespace MeshGenerator +{ + +struct Point +{ + Point(){} + Point(physx::PxVec3 _p):p(_p){} + physx::PxVec3 p; + + Point operator*(float f) const { return Point(p*f); } + Point operator+(Point pt) const { return Point(p+pt.p); } +}; + +struct RenderVertex +{ + RenderVertex() {} + RenderVertex(physx::PxVec3 _p, physx::PxVec3 _n):p(_p),n(_n) {} + physx::PxVec3 p; + physx::PxVec3 n; +}; + +struct Polygon +{ + Polygon() {} + template<typename P, typename... Args> Polygon(P p1, P p2, P p3, Args... args) + { + addPoints(p1, p2, p3, args...); + } + + std::vector<Point> mPoints; + + bool isTriangle()const { return mPoints.size() == 3; } + + template<typename P, typename... Args> void addPoints(P p, Args... args) + { + mPoints.push_back(p); + addPoints(args...); + } + template<typename P> void addPoints(P p) + { + mPoints.push_back(p); + } + + void triangulate(std::vector<Polygon>& out) const; + void triangulate(std::vector<RenderVertex>& verts, std::vector<uint16_t>& indices) const; + void triangulateWeld(std::vector<RenderVertex>& verts, std::vector<uint16_t>& indices) const; //normalize normals afterwards + void triangulateForCollision(std::vector<physx::PxVec3>& verts) const; + physx::PxVec3 calculateNormal() const; + float calculateArea() const; + void subdivideTriangle(std::vector<Polygon>& out) const; + bool Polygon::pointPlaneSide(physx::PxVec3 p, physx::PxVec4 plane) const; + void clip(physx::PxVec4 plane, bool flip = false); +}; + +struct Mesh +{ + std::vector<Polygon> mPolygons; + + bool isTriangleMesh()const { bool b = true; for(const auto& p : mPolygons) { b = b && p.isTriangle(); } return b; } + + void addConvexPolygon(physx::PxVec4 plane, physx::PxVec4* planes, uint32_t mask, bool flip); + + void generateRenderBuffers(RenderVertex** vertices, uint16_t** indices, int* vertexCount, int* indexCount) const; + void generateSmoothRenderBuffers(RenderVertex** vertices, uint16_t** indices, int* vertexCount, int* indexCount) const; + int generateTriangleList(physx::PxVec3** positions); + + void applyTransfom(physx::PxMat44 transform); + + void merge(const Mesh& mesh); +}; + +Mesh generateTetrahedron(float radius); +Mesh generateIcosahedron(float radius, int subdivisions); +Mesh generateCone(physx::PxVec4 a, physx::PxVec4 b, int segments, float grow, bool correctCone); +Mesh generateCollisionConvex(physx::PxVec4* planes, uint32_t mask, float grow, bool flip); +Mesh generateCollisionCapsules(physx::PxVec4* spheres, int sphereCount, uint32_t* indices, int indexCount, float grow); + +uint32_t generateConvexPolyhedronPlanes(int segmentsX, int segmentsY, physx::PxVec3 center, float radius, std::vector<physx::PxVec4>* planes); + +class MeshGeneratorRenderMesh : public CustomRenderMesh +{ +public: + MeshGeneratorRenderMesh(const Mesh mesh); + virtual ~MeshGeneratorRenderMesh(); +}; + +class MeshGeneratorRenderMeshSmooth : public CustomRenderMesh +{ +public: + MeshGeneratorRenderMeshSmooth(const Mesh mesh); + virtual ~MeshGeneratorRenderMeshSmooth(); +}; + + +}; + +#endif
\ No newline at end of file diff --git a/NvCloth/samples/SampleBase/utils/Utils.h b/NvCloth/samples/SampleBase/utils/Utils.h index 5e84e8e..1a5d5ee 100644 --- a/NvCloth/samples/SampleBase/utils/Utils.h +++ b/NvCloth/samples/SampleBase/utils/Utils.h @@ -3,6 +3,8 @@ #include <DeviceManager.h> #include <assert.h> +#include <foundation/PxVec3.h> +#include <foundation/PxVec4.h> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -80,8 +82,32 @@ static const char* strext(const char* str) return ext; } +//Math utilities static inline float lerp(float a, float b, float t) { return a + (b - a) * t; } +/** returns a PxVec4 containing [x,y,z,d] for plane equation ax + by + cz + d = 0. +* Where plane contains p and has normal n. +*/ +inline physx::PxVec4 constructPlaneFromPointNormal(physx::PxVec3 p, physx::PxVec3 n) +{ + n.normalize(); + return physx::PxVec4(n, -p.dot(n)); +} + +/** returns two vectors in b and c so that [a b c] form a basis. +* a needs to be a unit vector. +*/ +inline void computeBasis(const physx::PxVec3& a, physx::PxVec3* b, physx::PxVec3* c) +{ + if(fabsf(a.x) >= 0.57735f) + *b = physx::PxVec3(a.y, -a.x, 0.0f); + else + *b = physx::PxVec3(0.0f, a.z, -a.y); + + *b = b->getNormalized(); + *c = a.cross(*b); +} + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/NvCloth/samples/compiler/cmake/SampleBase.cmake b/NvCloth/samples/compiler/cmake/SampleBase.cmake index 1b00d8d..e3aa2cc 100644 --- a/NvCloth/samples/compiler/cmake/SampleBase.cmake +++ b/NvCloth/samples/compiler/cmake/SampleBase.cmake @@ -84,6 +84,32 @@ SET(SCENES_FILES ${SB_SCENE_SOURCE_DIR}/scenes/FrictionScene.cpp ${SB_SCENE_SOURCE_DIR}/scenes/FreeFallScene.h ${SB_SCENE_SOURCE_DIR}/scenes/FreeFallScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/SphereScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/SphereScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/StiffnessPerConstraintScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/StiffnessPerConstraintScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/GeodesicScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/GeodesicScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/LocalGlobalScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/LocalGlobalScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/DistanceConstraintScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/DistanceConstraintScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/InterCollisionScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/InterCollisionScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/SelfCollisionScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/SelfCollisionScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/TriangleScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/TriangleScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/ConvexCollisionScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/ConvexCollisionScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/PlaneCollisionScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/PlaneCollisionScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/CapsuleScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/CapsuleScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/CCDScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/CCDScene.h + ${SB_SCENE_SOURCE_DIR}/scenes/MultiSolverScene.cpp + ${SB_SCENE_SOURCE_DIR}/scenes/MultiSolverScene.h ) SET(UI_FILES @@ -106,6 +132,11 @@ SET(UTIL_FILES ${SB_UTILS_SOURCE_DIR}/CallbackImplementations.h ${SB_UTILS_SOURCE_DIR}/JobManager.cpp ${SB_UTILS_SOURCE_DIR}/JobManager.h + ${SB_UTILS_SOURCE_DIR}/DebugLineRenderBuffer.cpp + ${SB_UTILS_SOURCE_DIR}/DebugLineRenderBuffer.h + ${SB_UTILS_SOURCE_DIR}/MeshGenerator.cpp + ${SB_UTILS_SOURCE_DIR}/MeshGenerator.h + ) SET(ROOT_FILES diff --git a/NvCloth/src/Allocator.cpp b/NvCloth/src/Allocator.cpp index 33a593e..2d082ab 100644 --- a/NvCloth/src/Allocator.cpp +++ b/NvCloth/src/Allocator.cpp @@ -29,7 +29,6 @@ #include "NvCloth/Allocator.h" -#include "PsAllocator.h" namespace nv { diff --git a/NvCloth/src/ClothClone.h b/NvCloth/src/ClothClone.h index bdfdb2d..386fee6 100644 --- a/NvCloth/src/ClothClone.h +++ b/NvCloth/src/ClothClone.h @@ -125,92 +125,88 @@ inline Range<const uint32_t> getSelfCollisionIndices(const SwCloth& cloth) } // cloth conversion -template <typename DstFactoryType, typename SrcImplType> -typename DstFactoryType::ImplType* convertCloth(DstFactoryType& dstFactory, const SrcImplType& srcImpl) +template <typename DstFactoryType, typename SrcClothType> +typename DstFactoryType::ClothType* convertCloth(DstFactoryType& dstFactory, const SrcClothType& srcCloth) { typedef typename DstFactoryType::FabricType DstFabricType; - typedef typename DstFactoryType::ImplType DstImplType; - typedef typename DstImplType::ClothType DstClothType; - typedef typename SrcImplType::ClothType SrcClothType; + typedef typename DstFactoryType::ClothType DstClothType; - const SrcClothType& srcCloth = srcImpl.mCloth; const Factory& srcFactory = srcCloth.mFactory; typename DstClothType::ContextLockType dstLock(dstFactory); typename SrcClothType::ContextLockType srcLock(srcCloth.mFactory); // particles - MappedRange<const physx::PxVec4> curParticles = srcImpl.getCurrentParticles(); + MappedRange<const physx::PxVec4> curParticles = srcCloth.getCurrentParticles(); // fabric DstFabricType& dstFabric = *convertFabric(srcCloth.mFabric, dstFactory); // create new cloth - DstImplType* dstImpl = static_cast<DstImplType*>(dstFactory.createCloth(curParticles, dstFabric)); - DstClothType& dstCloth = dstImpl->mCloth; + DstClothType* dstCloth = static_cast<DstClothType*>(dstFactory.createCloth(curParticles, dstFabric)); dstFabric.decRefCount(); // copy across common parameters - copy(dstCloth, srcCloth); + copy(*dstCloth, srcCloth); // copy across previous particles - MappedRange<const physx::PxVec4> prevParticles = srcImpl.getPreviousParticles(); - memcpy(dstImpl->getPreviousParticles().begin(), prevParticles.begin(), prevParticles.size() * sizeof(physx::PxVec4)); + MappedRange<const physx::PxVec4> prevParticles = srcCloth.getPreviousParticles(); + memcpy(dstCloth->getPreviousParticles().begin(), prevParticles.begin(), prevParticles.size() * sizeof(physx::PxVec4)); // copy across transformed phase configs - setPhaseConfigs(dstCloth, getPhaseConfigs(srcCloth)); + setPhaseConfigs(*dstCloth, getPhaseConfigs(srcCloth)); // collision data - Vector<physx::PxVec4>::Type spheres(srcImpl.getNumSpheres(), physx::PxVec4(0.0f)); + Vector<physx::PxVec4>::Type spheres(srcCloth.getNumSpheres(), physx::PxVec4(0.0f)); physx::PxVec4* spherePtr = spheres.empty() ? 0 : &spheres.front(); Range<physx::PxVec4> sphereRange(spherePtr, spherePtr + spheres.size()); - Vector<uint32_t>::Type capsules(srcImpl.getNumCapsules() * 2); + Vector<uint32_t>::Type capsules(srcCloth.getNumCapsules() * 2); Range<uint32_t> capsuleRange = makeRange(capsules); - Vector<physx::PxVec4>::Type planes(srcImpl.getNumPlanes(), physx::PxVec4(0.0f)); + Vector<physx::PxVec4>::Type planes(srcCloth.getNumPlanes(), physx::PxVec4(0.0f)); physx::PxVec4* planePtr = planes.empty() ? 0 : &planes.front(); Range<physx::PxVec4> planeRange(planePtr, planePtr + planes.size()); - Vector<uint32_t>::Type convexes(srcImpl.getNumConvexes()); + Vector<uint32_t>::Type convexes(srcCloth.getNumConvexes()); Range<uint32_t> convexRange = makeRange(convexes); - Vector<physx::PxVec3>::Type triangles(srcImpl.getNumTriangles() * 3, physx::PxVec3(0.0f)); + Vector<physx::PxVec3>::Type triangles(srcCloth.getNumTriangles() * 3, physx::PxVec3(0.0f)); physx::PxVec3* trianglePtr = triangles.empty() ? 0 : &triangles.front(); Range<physx::PxVec3> triangleRange(trianglePtr, trianglePtr + triangles.size()); - srcFactory.extractCollisionData(srcImpl, sphereRange, capsuleRange, planeRange, convexRange, triangleRange); - dstImpl->setSpheres(sphereRange, 0, 0); - dstImpl->setCapsules(capsuleRange, 0, 0); - dstImpl->setPlanes(planeRange, 0, 0); - dstImpl->setConvexes(convexRange, 0, 0); - dstImpl->setTriangles(triangleRange, 0, 0); + srcFactory.extractCollisionData(srcCloth, sphereRange, capsuleRange, planeRange, convexRange, triangleRange); + dstCloth->setSpheres(sphereRange, 0, 0); + dstCloth->setCapsules(capsuleRange, 0, 0); + dstCloth->setPlanes(planeRange, 0, 0); + dstCloth->setConvexes(convexRange, 0, 0); + dstCloth->setTriangles(triangleRange, 0, 0); // motion constraints, copy directly into new cloth buffer - if (srcImpl.getNumMotionConstraints()) - srcFactory.extractMotionConstraints(srcImpl, dstImpl->getMotionConstraints()); + if (srcCloth.getNumMotionConstraints()) + srcFactory.extractMotionConstraints(srcCloth, dstCloth->getMotionConstraints()); // separation constraints, copy directly into new cloth buffer - if (srcImpl.getNumSeparationConstraints()) - srcFactory.extractSeparationConstraints(srcImpl, dstImpl->getSeparationConstraints()); + if (srcCloth.getNumSeparationConstraints()) + srcFactory.extractSeparationConstraints(srcCloth, dstCloth->getSeparationConstraints()); // particle accelerations - if (srcImpl.getNumParticleAccelerations()) + if (srcCloth.getNumParticleAccelerations()) { Range<const physx::PxVec4> accelerations = getParticleAccelerations(srcCloth); - memcpy(dstImpl->getParticleAccelerations().begin(), accelerations.begin(), + memcpy(dstCloth->getParticleAccelerations().begin(), accelerations.begin(), accelerations.size() * sizeof(physx::PxVec4)); } // self-collision indices - dstImpl->setSelfCollisionIndices(getSelfCollisionIndices(srcCloth)); + dstCloth->setSelfCollisionIndices(getSelfCollisionIndices(srcCloth)); // rest positions - Vector<physx::PxVec4>::Type restPositions(srcImpl.getNumRestPositions()); - srcFactory.extractRestPositions(srcImpl, makeRange(restPositions)); - dstImpl->setRestPositions(makeRange(restPositions)); + Vector<physx::PxVec4>::Type restPositions(srcCloth.getNumRestPositions()); + srcFactory.extractRestPositions(srcCloth, makeRange(restPositions)); + dstCloth->setRestPositions(makeRange(restPositions)); // virtual particles - if (srcImpl.getNumVirtualParticles()) + if (srcCloth.getNumVirtualParticles()) { - Vector<Vec4u>::Type indices(srcImpl.getNumVirtualParticles()); - Vector<physx::PxVec3>::Type weights(srcImpl.getNumVirtualParticleWeights(), physx::PxVec3(0.0f)); + Vector<Vec4u>::Type indices(srcCloth.getNumVirtualParticles()); + Vector<physx::PxVec3>::Type weights(srcCloth.getNumVirtualParticleWeights(), physx::PxVec3(0.0f)); uint32_t(*indicesPtr)[4] = indices.empty() ? 0 : &array(indices.front()); Range<uint32_t[4]> indicesRange(indicesPtr, indicesPtr + indices.size()); @@ -218,12 +214,12 @@ typename DstFactoryType::ImplType* convertCloth(DstFactoryType& dstFactory, cons physx::PxVec3* weightsPtr = weights.empty() ? 0 : &weights.front(); Range<physx::PxVec3> weightsRange(weightsPtr, weightsPtr + weights.size()); - srcFactory.extractVirtualParticles(srcImpl, indicesRange, weightsRange); + srcFactory.extractVirtualParticles(srcCloth, indicesRange, weightsRange); - dstImpl->setVirtualParticles(indicesRange, weightsRange); + dstCloth->setVirtualParticles(indicesRange, weightsRange); } - return dstImpl; + return dstCloth; } } // namespace cloth diff --git a/NvCloth/src/ClothImpl.h b/NvCloth/src/ClothImpl.h index 85d201a..0c2b362 100644 --- a/NvCloth/src/ClothImpl.h +++ b/NvCloth/src/ClothImpl.h @@ -41,6 +41,11 @@ namespace nv namespace cloth { +template<typename T> +class ClothTraits +{ +}; + // SwCloth or CuCloth aggregate implementing the Cloth interface // Member specializations are implemented in Sw/CuCloth.cpp template <typename T> @@ -49,30 +54,20 @@ class ClothImpl : public Cloth ClothImpl(const ClothImpl&); public: - ClothImpl& operator = (const ClothImpl&); - + ClothImpl() {} typedef T ClothType; - typedef typename ClothType::FactoryType FactoryType; - typedef typename ClothType::FabricType FabricType; - typedef typename ClothType::ContextLockType ContextLockType; + typedef typename ClothTraits<ClothType>::FactoryType FactoryType; + typedef typename ClothTraits<ClothType>::FabricType FabricType; + typedef typename ClothTraits<ClothType>::ContextLockType ContextLockType; - ClothImpl(Factory&, Fabric&, Range<const physx::PxVec4>); - ClothImpl(Factory&, const ClothImpl&); + ClothImpl& operator = (const ClothImpl&); - virtual Cloth* clone(Factory& factory) const; + ClothType* getChildCloth() { return static_cast<T*>(this); } + ClothType const* getChildCloth() const { return static_cast<T const*>(this); } virtual Fabric& getFabric() const; virtual Factory& getFactory() const; - virtual uint32_t getNumParticles() const; - virtual void lockParticles() const; - virtual void unlockParticles() const; - virtual MappedRange<physx::PxVec4> getCurrentParticles(); - virtual MappedRange<const physx::PxVec4> getCurrentParticles() const; - virtual MappedRange<physx::PxVec4> getPreviousParticles(); - virtual MappedRange<const physx::PxVec4> getPreviousParticles() const; - virtual GpuParticles getGpuParticles(); - virtual void setTranslation(const physx::PxVec3& trans); virtual void setRotation(const physx::PxQuat& rot); @@ -108,8 +103,6 @@ class ClothImpl : public Cloth virtual void setAcceleationFilterWidth(uint32_t); virtual uint32_t getAccelerationFilterWidth() const; - virtual void setPhaseConfig(Range<const PhaseConfig> configs); - virtual void setSpheres(Range<const physx::PxVec4>, uint32_t first, uint32_t last); virtual uint32_t getNumSpheres() const; @@ -134,8 +127,6 @@ class ClothImpl : public Cloth virtual void setFriction(float friction); virtual float getFriction() const; - virtual void setVirtualParticles(Range<const uint32_t[4]>, Range<const physx::PxVec3>); - virtual uint32_t getNumVirtualParticles() const; virtual uint32_t getNumVirtualParticleWeights() const; virtual void setTetherConstraintScale(float scale); @@ -158,8 +149,6 @@ class ClothImpl : public Cloth virtual void clearInterpolation(); - virtual Range<physx::PxVec4> getParticleAccelerations(); - virtual void clearParticleAccelerations(); virtual uint32_t getNumParticleAccelerations() const; virtual void setWindVelocity(physx::PxVec3); @@ -174,7 +163,6 @@ class ClothImpl : public Cloth virtual void setSelfCollisionStiffness(float); virtual float getSelfCollisionStiffness() const; - virtual void setSelfCollisionIndices(Range<const uint32_t>); virtual uint32_t getNumSelfCollisionIndices() const; virtual void setRestPositions(Range<const physx::PxVec4>); @@ -192,6 +180,7 @@ class ClothImpl : public Cloth virtual uint32_t getSleepPassCount() const; virtual bool isAsleep() const; virtual void putToSleep(); + virtual bool isSleeping() const; virtual void wakeUp(); virtual void setUserData(void*); @@ -201,116 +190,125 @@ class ClothImpl : public Cloth template <typename U> MappedRange<U> getMappedParticles(U* data) const; - ClothType mCloth; +public: //Fields shared between all cloth classes + physx::PxVec3 mParticleBoundsCenter; + physx::PxVec3 mParticleBoundsHalfExtent; + + physx::PxVec3 mGravity; + physx::PxVec3 mLogDamping; + physx::PxVec3 mLinearLogDrag; + physx::PxVec3 mAngularLogDrag; + physx::PxVec3 mLinearInertia; + physx::PxVec3 mAngularInertia; + physx::PxVec3 mCentrifugalInertia; + float mSolverFrequency; + float mStiffnessFrequency; + + physx::PxTransform mTargetMotion; + physx::PxTransform mCurrentMotion; + physx::PxVec3 mLinearVelocity; + physx::PxVec3 mAngularVelocity; + + float mPrevIterDt; + MovingAverage mIterDtAvg; + + // wind + physx::PxVec3 mWind; + float mDragLogCoefficient; + float mLiftLogCoefficient; + + // sleeping + uint32_t mSleepTestInterval; // how often to test for movement + uint32_t mSleepAfterCount; // number of tests to pass before sleep + float mSleepThreshold; // max movement delta to pass test + uint32_t mSleepPassCounter; // how many tests passed + uint32_t mSleepTestCounter; // how many iterations since tested }; -class SwCloth; -typedef ClothImpl<SwCloth> SwClothImpl; - -class CuCloth; -typedef ClothImpl<CuCloth> CuClothImpl; - -class DxCloth; -typedef ClothImpl<DxCloth> DxClothImpl; - -template <typename T> -ClothImpl<T>::ClothImpl(Factory& factory, Fabric& fabric, Range<const physx::PxVec4> particles) -: mCloth(static_cast<FactoryType&>(factory), static_cast<FabricType&>(fabric), particles) -{ - // fabric and cloth need to be created by the same factory - NV_CLOTH_ASSERT(&fabric.getFactory() == &factory); -} - -template <typename T> -ClothImpl<T>::ClothImpl(Factory& factory, const ClothImpl& impl) -: mCloth(static_cast<FactoryType&>(factory), impl.mCloth) -{ -} - template <typename T> inline Fabric& ClothImpl<T>::getFabric() const { - return mCloth.mFabric; + return getChildCloth()->mFabric; } template <typename T> inline Factory& ClothImpl<T>::getFactory() const { - return mCloth.mFactory; + return getChildCloth()->mFactory; } template <typename T> inline void ClothImpl<T>::setTranslation(const physx::PxVec3& trans) { physx::PxVec3 t = reinterpret_cast<const physx::PxVec3&>(trans); - if (t == mCloth.mTargetMotion.p) + if (t == mTargetMotion.p) return; - mCloth.mTargetMotion.p = t; - mCloth.wakeUp(); + mTargetMotion.p = t; + wakeUp(); } template <typename T> inline void ClothImpl<T>::setRotation(const physx::PxQuat& q) { - if ((q - mCloth.mTargetMotion.q).magnitudeSquared() == 0.0f) + if ((q - mTargetMotion.q).magnitudeSquared() == 0.0f) return; - mCloth.mTargetMotion.q = q; - mCloth.wakeUp(); + mTargetMotion.q = q; + wakeUp(); } template <typename T> inline const physx::PxVec3& ClothImpl<T>::getTranslation() const { - return mCloth.mTargetMotion.p; + return mTargetMotion.p; } template <typename T> inline const physx::PxQuat& ClothImpl<T>::getRotation() const { - return mCloth.mTargetMotion.q; + return mTargetMotion.q; } template <typename T> inline void ClothImpl<T>::clearInertia() { - mCloth.mCurrentMotion = mCloth.mTargetMotion; - mCloth.mLinearVelocity = physx::PxVec3(0.0); - mCloth.mAngularVelocity = physx::PxVec3(0.0); + mCurrentMotion = mTargetMotion; + mLinearVelocity = physx::PxVec3(0.0); + mAngularVelocity = physx::PxVec3(0.0); - mCloth.wakeUp(); + wakeUp(); } // Fixed 4505:local function has been removed template <typename T> inline void ClothImpl<T>::teleport(const physx::PxVec3& delta) { - mCloth.mCurrentMotion.p += delta; - mCloth.mTargetMotion.p += delta; + mCurrentMotion.p += delta; + mTargetMotion.p += delta; } template <typename T> inline float ClothImpl<T>::getPreviousIterationDt() const { - return mCloth.mPrevIterDt; + return mPrevIterDt; } template <typename T> inline void ClothImpl<T>::setGravity(const physx::PxVec3& gravity) { physx::PxVec3 value = gravity; - if (value == mCloth.mGravity) + if (value == mGravity) return; - mCloth.mGravity = value; - mCloth.wakeUp(); + mGravity = value; + wakeUp(); } template <typename T> inline physx::PxVec3 ClothImpl<T>::getGravity() const { - return mCloth.mGravity; + return mGravity; } inline float safeLog2(float x) @@ -340,148 +338,148 @@ template <typename T> inline void ClothImpl<T>::setDamping(const physx::PxVec3& damping) { physx::PxVec3 value = safeLog2(physx::PxVec3(1.f) - damping); - if (value == mCloth.mLogDamping) + if (value == mLogDamping) return; - mCloth.mLogDamping = value; - mCloth.wakeUp(); + mLogDamping = value; + wakeUp(); } template <typename T> inline physx::PxVec3 ClothImpl<T>::getDamping() const { - return physx::PxVec3(1.f) - safeExp2(mCloth.mLogDamping); + return physx::PxVec3(1.f) - safeExp2(mLogDamping); } template <typename T> inline void ClothImpl<T>::setLinearDrag(const physx::PxVec3& drag) { physx::PxVec3 value = safeLog2(physx::PxVec3(1.f) - drag); - if (value == mCloth.mLinearLogDrag) + if (value == mLinearLogDrag) return; - mCloth.mLinearLogDrag = value; - mCloth.wakeUp(); + mLinearLogDrag = value; + wakeUp(); } template <typename T> inline physx::PxVec3 ClothImpl<T>::getLinearDrag() const { - return physx::PxVec3(1.f) - safeExp2(mCloth.mLinearLogDrag); + return physx::PxVec3(1.f) - safeExp2(mLinearLogDrag); } template <typename T> inline void ClothImpl<T>::setAngularDrag(const physx::PxVec3& drag) { physx::PxVec3 value = safeLog2(physx::PxVec3(1.f) - drag); - if (value == mCloth.mAngularLogDrag) + if (value == mAngularLogDrag) return; - mCloth.mAngularLogDrag = value; - mCloth.wakeUp(); + mAngularLogDrag = value; + wakeUp(); } template <typename T> inline physx::PxVec3 ClothImpl<T>::getAngularDrag() const { - return physx::PxVec3(1.f) - safeExp2(mCloth.mAngularLogDrag); + return physx::PxVec3(1.f) - safeExp2(mAngularLogDrag); } template <typename T> inline void ClothImpl<T>::setLinearInertia(const physx::PxVec3& inertia) { physx::PxVec3 value = inertia; - if (value == mCloth.mLinearInertia) + if (value == mLinearInertia) return; - mCloth.mLinearInertia = value; - mCloth.wakeUp(); + mLinearInertia = value; + wakeUp(); } template <typename T> inline physx::PxVec3 ClothImpl<T>::getLinearInertia() const { - return mCloth.mLinearInertia; + return mLinearInertia; } template <typename T> inline void ClothImpl<T>::setAngularInertia(const physx::PxVec3& inertia) { physx::PxVec3 value = inertia; - if (value == mCloth.mAngularInertia) + if (value == mAngularInertia) return; - mCloth.mAngularInertia = value; - mCloth.wakeUp(); + mAngularInertia = value; + wakeUp(); } template <typename T> inline physx::PxVec3 ClothImpl<T>::getAngularInertia() const { - return mCloth.mAngularInertia; + return mAngularInertia; } template <typename T> inline void ClothImpl<T>::setCentrifugalInertia(const physx::PxVec3& inertia) { physx::PxVec3 value = inertia; - if (value == mCloth.mCentrifugalInertia) + if (value == mCentrifugalInertia) return; - mCloth.mCentrifugalInertia = value; - mCloth.wakeUp(); + mCentrifugalInertia = value; + wakeUp(); } template <typename T> inline physx::PxVec3 ClothImpl<T>::getCentrifugalInertia() const { - return mCloth.mCentrifugalInertia; + return mCentrifugalInertia; } template <typename T> inline void ClothImpl<T>::setSolverFrequency(float frequency) { - if (frequency == mCloth.mSolverFrequency) + if (frequency == mSolverFrequency) return; - mCloth.mSolverFrequency = frequency; - mCloth.mClothCostDirty = true; - mCloth.mIterDtAvg.reset(); - mCloth.wakeUp(); + mSolverFrequency = frequency; + getChildCloth()->mClothCostDirty = true; + mIterDtAvg.reset(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getSolverFrequency() const { - return mCloth.mSolverFrequency; + return mSolverFrequency; } template <typename T> inline void ClothImpl<T>::setStiffnessFrequency(float frequency) { - if (frequency == mCloth.mStiffnessFrequency) + if (frequency == mStiffnessFrequency) return; - mCloth.mStiffnessFrequency = frequency; - mCloth.wakeUp(); + mStiffnessFrequency = frequency; + wakeUp(); } template <typename T> inline float ClothImpl<T>::getStiffnessFrequency() const { - return mCloth.mStiffnessFrequency; + return mStiffnessFrequency; } template <typename T> inline void ClothImpl<T>::setAcceleationFilterWidth(uint32_t n) { - mCloth.mIterDtAvg.resize(n); + mIterDtAvg.resize(n); } template <typename T> inline uint32_t ClothImpl<T>::getAccelerationFilterWidth() const { - return mCloth.mIterDtAvg.size(); + return mIterDtAvg.size(); } // move a subarray @@ -510,7 +508,7 @@ inline bool updateIndex(uint32_t& index, uint32_t first, int32_t delta) template <typename T> inline void ClothImpl<T>::setSpheres(Range<const physx::PxVec4> spheres, uint32_t first, uint32_t last) { - uint32_t oldSize = uint32_t(mCloth.mStartCollisionSpheres.size()); + uint32_t oldSize = uint32_t(getChildCloth()->mStartCollisionSpheres.size()); uint32_t newSize = uint32_t(spheres.size()) + oldSize - last + first; NV_CLOTH_ASSERT(newSize <= 32); @@ -527,22 +525,22 @@ inline void ClothImpl<T>::setSpheres(Range<const physx::PxVec4> spheres, uint32_ if (!oldSize) { - ContextLockType contextLock(mCloth.mFactory); - mCloth.mStartCollisionSpheres.assign(spheres.begin(), spheres.end()); - mCloth.notifyChanged(); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mStartCollisionSpheres.assign(spheres.begin(), spheres.end()); + getChildCloth()->notifyChanged(); } else { if (std::max(oldSize, newSize) > - std::min(mCloth.mStartCollisionSpheres.capacity(), mCloth.mTargetCollisionSpheres.capacity())) + std::min(getChildCloth()->mStartCollisionSpheres.capacity(), getChildCloth()->mTargetCollisionSpheres.capacity())) { - ContextLockType contextLock(mCloth.mFactory); - mCloth.mStartCollisionSpheres.reserve(newSize); - mCloth.mTargetCollisionSpheres.reserve(std::max(oldSize, newSize)); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mStartCollisionSpheres.reserve(newSize); + getChildCloth()->mTargetCollisionSpheres.reserve(std::max(oldSize, newSize)); } - typename T::MappedVec4fVectorType start = mCloth.mStartCollisionSpheres; - typename T::MappedVec4fVectorType target = mCloth.mTargetCollisionSpheres; + typename T::MappedVec4fVectorType start = getChildCloth()->mStartCollisionSpheres; + typename T::MappedVec4fVectorType target = getChildCloth()->mTargetCollisionSpheres; // fill target from start for (uint32_t i = uint32_t(target.size()); i < oldSize; ++i) @@ -563,7 +561,7 @@ inline void ClothImpl<T>::setSpheres(Range<const physx::PxVec4> spheres, uint32_ start[i] = spheres[i - first]; // adjust capsule indices - typename T::MappedIndexVectorType indices = mCloth.mCapsuleIndices; + typename T::MappedIndexVectorType indices = getChildCloth()->mCapsuleIndices; Vector<IndexPair>::Type::Iterator cIt, cEnd = indices.end(); for (cIt = indices.begin(); cIt != cEnd;) { @@ -582,7 +580,7 @@ inline void ClothImpl<T>::setSpheres(Range<const physx::PxVec4> spheres, uint32_ start.resize(newSize); target.resize(newSize); - mCloth.notifyChanged(); + getChildCloth()->notifyChanged(); } // fill target elements with spheres @@ -590,20 +588,20 @@ inline void ClothImpl<T>::setSpheres(Range<const physx::PxVec4> spheres, uint32_ target[first + i] = spheres[i]; } - mCloth.wakeUp(); + getChildCloth()->wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getNumSpheres() const { - return uint32_t(mCloth.mStartCollisionSpheres.size()); + return uint32_t(getChildCloth()->mStartCollisionSpheres.size()); } // Fixed 4505:local function has been removed template <typename T> inline void ClothImpl<T>::setCapsules(Range<const uint32_t> capsules, uint32_t first, uint32_t last) { - uint32_t oldSize = uint32_t(mCloth.mCapsuleIndices.size()); + uint32_t oldSize = uint32_t(getChildCloth()->mCapsuleIndices.size()); uint32_t newSize = uint32_t(capsules.size() / 2) + oldSize - last + first; NV_CLOTH_ASSERT(newSize <= 32); @@ -612,16 +610,16 @@ inline void ClothImpl<T>::setCapsules(Range<const uint32_t> capsules, uint32_t f const IndexPair* srcIndices = reinterpret_cast<const IndexPair*>(capsules.begin()); - if (mCloth.mCapsuleIndices.capacity() < newSize) + if (getChildCloth()->mCapsuleIndices.capacity() < newSize) { - ContextLockType contextLock(mCloth.mFactory); - mCloth.mCapsuleIndices.reserve(newSize); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mCapsuleIndices.reserve(newSize); } // resize to larger of oldSize and newSize - mCloth.mCapsuleIndices.resize(std::max(oldSize, newSize)); + getChildCloth()->mCapsuleIndices.resize(std::max(oldSize, newSize)); - typename T::MappedIndexVectorType dstIndices = mCloth.mCapsuleIndices; + typename T::MappedIndexVectorType dstIndices = getChildCloth()->mCapsuleIndices; if (uint32_t delta = newSize - oldSize) { @@ -633,26 +631,26 @@ inline void ClothImpl<T>::setCapsules(Range<const uint32_t> capsules, uint32_t f dstIndices[i] = srcIndices[i - first]; dstIndices.resize(newSize); - mCloth.notifyChanged(); + getChildCloth()->notifyChanged(); } // fill existing elements from capsules for (uint32_t i = first; i < last; ++i) dstIndices[i] = srcIndices[i - first]; - mCloth.wakeUp(); + getChildCloth()->wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getNumCapsules() const { - return uint32_t(mCloth.mCapsuleIndices.size()); + return uint32_t(getChildCloth()->mCapsuleIndices.size()); } template <typename T> inline void ClothImpl<T>::setPlanes(Range<const physx::PxVec4> planes, uint32_t first, uint32_t last) { - uint32_t oldSize = uint32_t(mCloth.mStartCollisionPlanes.size()); + uint32_t oldSize = uint32_t(getChildCloth()->mStartCollisionPlanes.size()); uint32_t newSize = uint32_t(planes.size()) + oldSize - last + first; NV_CLOTH_ASSERT(newSize <= 32); @@ -681,22 +679,22 @@ inline void ClothImpl<T>::setPlanes(Range<const physx::PxVec4> planes, uint32_t if (!oldSize) { - ContextLockType contextLock(mCloth.mFactory); - mCloth.mStartCollisionPlanes.assign(planes.begin(), planes.end()); - mCloth.notifyChanged(); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mStartCollisionPlanes.assign(planes.begin(), planes.end()); + getChildCloth()->notifyChanged(); } else { if (std::max(oldSize, newSize) > - std::min(mCloth.mStartCollisionPlanes.capacity(), mCloth.mTargetCollisionPlanes.capacity())) + std::min(getChildCloth()->mStartCollisionPlanes.capacity(), getChildCloth()->mTargetCollisionPlanes.capacity())) { - ContextLockType contextLock(mCloth.mFactory); - mCloth.mStartCollisionPlanes.reserve(newSize); - mCloth.mTargetCollisionPlanes.reserve(std::max(oldSize, newSize)); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mStartCollisionPlanes.reserve(newSize); + getChildCloth()->mTargetCollisionPlanes.reserve(std::max(oldSize, newSize)); } - typename T::MappedVec4fVectorType start = mCloth.mStartCollisionPlanes; - typename T::MappedVec4fVectorType target = mCloth.mTargetCollisionPlanes; + typename T::MappedVec4fVectorType start = getChildCloth()->mStartCollisionPlanes; + typename T::MappedVec4fVectorType target = getChildCloth()->mTargetCollisionPlanes; // fill target from start for (uint32_t i = target.size(); i < oldSize; ++i) @@ -718,7 +716,7 @@ inline void ClothImpl<T>::setPlanes(Range<const physx::PxVec4> planes, uint32_t // adjust convex indices uint32_t mask = (uint32_t(1) << (last + std::min(delta, 0))) - 1; - typename T::MappedMaskVectorType masks = mCloth.mConvexMasks; + typename T::MappedMaskVectorType masks = getChildCloth()->mConvexMasks; Vector<uint32_t>::Type::Iterator cIt, cEnd = masks.end(); for (cIt = masks.begin(); cIt != cEnd;) { @@ -739,7 +737,7 @@ inline void ClothImpl<T>::setPlanes(Range<const physx::PxVec4> planes, uint32_t start.resize(newSize); target.resize(newSize); - mCloth.notifyChanged(); + getChildCloth()->notifyChanged(); } // fill target elements with planes @@ -747,19 +745,19 @@ inline void ClothImpl<T>::setPlanes(Range<const physx::PxVec4> planes, uint32_t target[first + i] = planes[i]; } - mCloth.wakeUp(); + wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getNumPlanes() const { - return uint32_t(mCloth.mStartCollisionPlanes.size()); + return uint32_t(getChildCloth()->mStartCollisionPlanes.size()); } template <typename T> inline void ClothImpl<T>::setConvexes(Range<const uint32_t> convexMasks, uint32_t first, uint32_t last) { - uint32_t oldSize = uint32_t(mCloth.mConvexMasks.size()); + uint32_t oldSize = uint32_t(getChildCloth()->mConvexMasks.size()); uint32_t newSize = uint32_t(convexMasks.size()) + oldSize - last + first; NV_CLOTH_ASSERT(newSize <= 32); @@ -776,18 +774,18 @@ inline void ClothImpl<T>::setConvexes(Range<const uint32_t> convexMasks, uint32_ } #endif - if (mCloth.mConvexMasks.capacity() < newSize) + if (getChildCloth()->mConvexMasks.capacity() < newSize) { - ContextLockType contextLock(mCloth.mFactory); - mCloth.mConvexMasks.reserve(newSize); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mConvexMasks.reserve(newSize); } // resize to larger of oldSize and newSize - mCloth.mConvexMasks.resize(std::max(oldSize, newSize)); + getChildCloth()->mConvexMasks.resize(std::max(oldSize, newSize)); if (uint32_t delta = newSize - oldSize) { - typename T::MappedMaskVectorType masks = mCloth.mConvexMasks; + typename T::MappedMaskVectorType masks = getChildCloth()->mConvexMasks; // move past-range elements to new place move(masks.begin(), last, oldSize, last + delta); @@ -797,16 +795,16 @@ inline void ClothImpl<T>::setConvexes(Range<const uint32_t> convexMasks, uint32_ masks[i] = convexMasks[i - first]; masks.resize(newSize); - mCloth.notifyChanged(); + getChildCloth()->notifyChanged(); } - mCloth.wakeUp(); + wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getNumConvexes() const { - return uint32_t(mCloth.mConvexMasks.size()); + return uint32_t(getChildCloth()->mConvexMasks.size()); } template <typename T> @@ -816,10 +814,10 @@ inline void ClothImpl<T>::setTriangles(Range<const physx::PxVec3> triangles, uin first *= 3; last *= 3; - triangles = mCloth.clampTriangleCount(triangles, last - first); + triangles = getChildCloth()->clampTriangleCount(triangles, last - first); NV_CLOTH_ASSERT(0 == triangles.size() % 3); - uint32_t oldSize = uint32_t(mCloth.mStartCollisionTriangles.size()); + uint32_t oldSize = uint32_t(getChildCloth()->mStartCollisionTriangles.size()); uint32_t newSize = uint32_t(triangles.size()) + oldSize - last + first; NV_CLOTH_ASSERT(first <= oldSize); @@ -830,22 +828,22 @@ inline void ClothImpl<T>::setTriangles(Range<const physx::PxVec3> triangles, uin if (!oldSize) { - ContextLockType contextLock(mCloth.mFactory); - mCloth.mStartCollisionTriangles.assign(triangles.begin(), triangles.end()); - mCloth.notifyChanged(); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mStartCollisionTriangles.assign(triangles.begin(), triangles.end()); + getChildCloth()->notifyChanged(); } else { if (std::max(oldSize, newSize) > - std::min(mCloth.mStartCollisionTriangles.capacity(), mCloth.mTargetCollisionTriangles.capacity())) + std::min(getChildCloth()->mStartCollisionTriangles.capacity(), getChildCloth()->mTargetCollisionTriangles.capacity())) { - ContextLockType contextLock(mCloth.mFactory); - mCloth.mStartCollisionTriangles.reserve(newSize); - mCloth.mTargetCollisionTriangles.reserve(std::max(oldSize, newSize)); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mStartCollisionTriangles.reserve(newSize); + getChildCloth()->mTargetCollisionTriangles.reserve(std::max(oldSize, newSize)); } - typename T::MappedVec3fVectorType start = mCloth.mStartCollisionTriangles; - typename T::MappedVec3fVectorType target = mCloth.mTargetCollisionTriangles; + typename T::MappedVec3fVectorType start = getChildCloth()->mStartCollisionTriangles; + typename T::MappedVec3fVectorType target = getChildCloth()->mTargetCollisionTriangles; // fill target from start for (uint32_t i = target.size(); i < oldSize; ++i) @@ -861,59 +859,59 @@ inline void ClothImpl<T>::setTriangles(Range<const physx::PxVec3> triangles, uin move(start.begin(), last, oldSize, last + delta); move(target.begin(), last, oldSize, last + delta); - // fill new elements from planes + // fill new elements from triangles for (uint32_t i = last; i < last + delta; ++i) start[i] = triangles[i - first]; start.resize(newSize); target.resize(newSize); - mCloth.notifyChanged(); + getChildCloth()->notifyChanged(); } ////////////////////// // if (std::max(oldSize, newSize) > - // std::min(mCloth.mStartCollisionTriangles.capacity(), mCloth.mTargetCollisionTriangles.capacity())) + // std::min(getChildCloth()->mStartCollisionTriangles.capacity(), getChildCloth()->mTargetCollisionTriangles.capacity())) // { - // ContextLockType contextLock(mCloth.mFactory); - // mCloth.mStartCollisionTriangles.reserve(newSize); - // mCloth.mTargetCollisionTriangles.reserve(std::max(oldSize, newSize)); + // ContextLockType contextLock(getChildCloth()->mFactory); + // getChildCloth()->mStartCollisionTriangles.reserve(newSize); + // getChildCloth()->mTargetCollisionTriangles.reserve(std::max(oldSize, newSize)); // } // // // fill target from start - // for (uint32_t i = mCloth.mTargetCollisionTriangles.size(); i < oldSize; ++i) - // mCloth.mTargetCollisionTriangles.pushBack(mCloth.mStartCollisionTriangles[i]); + // for (uint32_t i = getChildCloth()->mTargetCollisionTriangles.size(); i < oldSize; ++i) + // getChildCloth()->mTargetCollisionTriangles.pushBack(getChildCloth()->mStartCollisionTriangles[i]); // // // resize to larger of oldSize and newSize - // mCloth.mStartCollisionTriangles.resize(std::max(oldSize, newSize)); - // mCloth.mTargetCollisionTriangles.resize(std::max(oldSize, newSize)); + // getChildCloth()->mStartCollisionTriangles.resize(std::max(oldSize, newSize)); + // getChildCloth()->mTargetCollisionTriangles.resize(std::max(oldSize, newSize)); // // if (uint32_t delta = newSize - oldSize) // { // // move past-range elements to new place - // move(mCloth.mStartCollisionTriangles.begin(), last, oldSize, last + delta); - // move(mCloth.mTargetCollisionTriangles.begin(), last, oldSize, last + delta); + // move(getChildCloth()->mStartCollisionTriangles.begin(), last, oldSize, last + delta); + // move(getChildCloth()->mTargetCollisionTriangles.begin(), last, oldSize, last + delta); // // // fill new elements from triangles // for (uint32_t i = last; i < last + delta; ++i) - // mCloth.mStartCollisionTriangles[i] = triangles[i - first]; + // getChildCloth()->mStartCollisionTriangles[i] = triangles[i - first]; // - // mCloth.mStartCollisionTriangles.resize(newSize); - // mCloth.mTargetCollisionTriangles.resize(newSize); + // getChildCloth()->mStartCollisionTriangles.resize(newSize); + // getChildCloth()->mTargetCollisionTriangles.resize(newSize); // - // mCloth.notifyChanged(); + // notifyChanged(); // } // fill target elements with triangles // for (uint32_t i = 0; i < triangles.size(); ++i) - // mCloth.mTargetCollisionTriangles[first + i] = triangles[i]; + // getChildCloth()->mTargetCollisionTriangles[first + i] = triangles[i]; - // fill target elements with planes + // fill target elements with triangles for (uint32_t i = 0; i < triangles.size(); ++i) target[first + i] = triangles[i]; } - mCloth.wakeUp(); + wakeUp(); } template <typename T> @@ -925,12 +923,12 @@ inline void ClothImpl<T>::setTriangles(Range<const physx::PxVec3> startTriangles // convert from triangle to vertex count first *= 3; - uint32_t last = uint32_t(mCloth.mStartCollisionTriangles.size()); + uint32_t last = uint32_t(getChildCloth()->mStartCollisionTriangles.size()); - startTriangles = mCloth.clampTriangleCount(startTriangles, last - first); - targetTriangles = mCloth.clampTriangleCount(targetTriangles, last - first); + startTriangles = getChildCloth()->clampTriangleCount(startTriangles, last - first); + targetTriangles = getChildCloth()->clampTriangleCount(targetTriangles, last - first); - uint32_t oldSize = uint32_t(mCloth.mStartCollisionTriangles.size()); + uint32_t oldSize = uint32_t(getChildCloth()->mStartCollisionTriangles.size()); uint32_t newSize = uint32_t(startTriangles.size()) + oldSize - last + first; NV_CLOTH_ASSERT(first <= oldSize); @@ -939,250 +937,240 @@ inline void ClothImpl<T>::setTriangles(Range<const physx::PxVec3> startTriangles if (!oldSize && !newSize) return; - if (newSize > std::min(mCloth.mStartCollisionTriangles.capacity(), mCloth.mTargetCollisionTriangles.capacity())) + if (newSize > std::min(getChildCloth()->mStartCollisionTriangles.capacity(), getChildCloth()->mTargetCollisionTriangles.capacity())) { - ContextLockType contextLock(mCloth.mFactory); - // mCloth.mStartCollisionTriangles.reserve(newSize); - // mCloth.mTargetCollisionTriangles.reserve(newSize); - - - mCloth.mStartCollisionTriangles.assign(startTriangles.begin(), startTriangles.end()); - mCloth.mTargetCollisionTriangles.assign(targetTriangles.begin(), targetTriangles.end()); - mCloth.notifyChanged(); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mStartCollisionTriangles.assign(startTriangles.begin(), startTriangles.end()); + getChildCloth()->mTargetCollisionTriangles.assign(targetTriangles.begin(), targetTriangles.end()); + getChildCloth()->notifyChanged(); } else { uint32_t retainSize = oldSize - last + first; - mCloth.mStartCollisionTriangles.resize(retainSize); - mCloth.mTargetCollisionTriangles.resize(retainSize); + getChildCloth()->mStartCollisionTriangles.resize(retainSize); + getChildCloth()->mTargetCollisionTriangles.resize(retainSize); - mCloth.mStartCollisionTriangles.assign(startTriangles.begin(), startTriangles.end()); - mCloth.mTargetCollisionTriangles.assign(targetTriangles.begin(), targetTriangles.end()); - - // for (uint32_t i = 0, n = startTriangles.size(); i < n; ++i) - // { - // mCloth.mStartCollisionTriangles.pushBack(startTriangles[i]); - // mCloth.mTargetCollisionTriangles.pushBack(targetTriangles[i]); - // } + getChildCloth()->mStartCollisionTriangles.assign(startTriangles.begin(), startTriangles.end()); + getChildCloth()->mTargetCollisionTriangles.assign(targetTriangles.begin(), targetTriangles.end()); if (newSize - oldSize) - mCloth.notifyChanged(); + getChildCloth()->notifyChanged(); } - mCloth.wakeUp(); + wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getNumTriangles() const { - return uint32_t(mCloth.mStartCollisionTriangles.size()) / 3; + return uint32_t(getChildCloth()->mStartCollisionTriangles.size()) / 3; } template <typename T> inline bool ClothImpl<T>::isContinuousCollisionEnabled() const { - return mCloth.mEnableContinuousCollision; + return getChildCloth()->mEnableContinuousCollision; } template <typename T> inline void ClothImpl<T>::enableContinuousCollision(bool enable) { - if (enable == mCloth.mEnableContinuousCollision) + if (enable == getChildCloth()->mEnableContinuousCollision) return; - mCloth.mEnableContinuousCollision = enable; - mCloth.notifyChanged(); - mCloth.wakeUp(); + getChildCloth()->mEnableContinuousCollision = enable; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getCollisionMassScale() const { - return mCloth.mCollisionMassScale; + return getChildCloth()->mCollisionMassScale; } template <typename T> inline void ClothImpl<T>::setCollisionMassScale(float scale) { - if (scale == mCloth.mCollisionMassScale) + if (scale == getChildCloth()->mCollisionMassScale) return; - mCloth.mCollisionMassScale = scale; - mCloth.notifyChanged(); - mCloth.wakeUp(); + getChildCloth()->mCollisionMassScale = scale; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline void ClothImpl<T>::setFriction(float friction) { - mCloth.mFriction = friction; - mCloth.wakeUp(); + getChildCloth()->mFriction = friction; + getChildCloth()->notifyChanged(); } template <typename T> inline float ClothImpl<T>::getFriction() const { - return mCloth.mFriction; + return getChildCloth()->mFriction; } template <typename T> inline uint32_t ClothImpl<T>::getNumVirtualParticleWeights() const { - return uint32_t(mCloth.mVirtualParticleWeights.size()); + return uint32_t(getChildCloth()->mVirtualParticleWeights.size()); } template <typename T> inline void ClothImpl<T>::setTetherConstraintScale(float scale) { - if (scale == mCloth.mTetherConstraintScale) + if (scale == getChildCloth()->mTetherConstraintScale) return; - mCloth.mTetherConstraintScale = scale; - mCloth.notifyChanged(); - mCloth.wakeUp(); + getChildCloth()->mTetherConstraintScale = scale; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getTetherConstraintScale() const { - return mCloth.mTetherConstraintScale; + return getChildCloth()->mTetherConstraintScale; } template <typename T> inline void ClothImpl<T>::setTetherConstraintStiffness(float stiffness) { float value = safeLog2(1 - stiffness); - if (value == mCloth.mTetherConstraintLogStiffness) + if (value == getChildCloth()->mTetherConstraintLogStiffness) return; - mCloth.mTetherConstraintLogStiffness = value; - mCloth.notifyChanged(); - mCloth.wakeUp(); + getChildCloth()->mTetherConstraintLogStiffness = value; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getTetherConstraintStiffness() const { - return 1.f - safeExp2(mCloth.mTetherConstraintLogStiffness); + return 1.f - safeExp2(getChildCloth()->mTetherConstraintLogStiffness); } template <typename T> inline Range<physx::PxVec4> ClothImpl<T>::getMotionConstraints() { - mCloth.wakeUp(); - return mCloth.push(mCloth.mMotionConstraints); + wakeUp(); + return getChildCloth()->push(getChildCloth()->mMotionConstraints); } template <typename T> inline void ClothImpl<T>::clearMotionConstraints() { - mCloth.clear(mCloth.mMotionConstraints); - mCloth.wakeUp(); + getChildCloth()->clear(getChildCloth()->mMotionConstraints); + wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getNumMotionConstraints() const { - return uint32_t(mCloth.mMotionConstraints.mStart.size()); + return uint32_t(getChildCloth()->mMotionConstraints.mStart.size()); } template <typename T> inline void ClothImpl<T>::setMotionConstraintScaleBias(float scale, float bias) { - if (scale == mCloth.mMotionConstraintScale && bias == mCloth.mMotionConstraintBias) + if (scale == getChildCloth()->mMotionConstraintScale && bias == getChildCloth()->mMotionConstraintBias) return; - mCloth.mMotionConstraintScale = scale; - mCloth.mMotionConstraintBias = bias; - mCloth.notifyChanged(); - mCloth.wakeUp(); + getChildCloth()->mMotionConstraintScale = scale; + getChildCloth()->mMotionConstraintBias = bias; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getMotionConstraintScale() const { - return mCloth.mMotionConstraintScale; + return getChildCloth()->mMotionConstraintScale; } template <typename T> inline float ClothImpl<T>::getMotionConstraintBias() const { - return mCloth.mMotionConstraintBias; + return getChildCloth()->mMotionConstraintBias; } template <typename T> inline void ClothImpl<T>::setMotionConstraintStiffness(float stiffness) { float value = safeLog2(1 - stiffness); - if (value == mCloth.mMotionConstraintLogStiffness) + if (value == getChildCloth()->mMotionConstraintLogStiffness) return; - mCloth.mMotionConstraintLogStiffness = value; - mCloth.notifyChanged(); - mCloth.wakeUp(); + getChildCloth()->mMotionConstraintLogStiffness = value; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getMotionConstraintStiffness() const { - return 1.f - safeExp2(mCloth.mMotionConstraintLogStiffness); + return 1.f - safeExp2(getChildCloth()->mMotionConstraintLogStiffness); } template <typename T> inline Range<physx::PxVec4> ClothImpl<T>::getSeparationConstraints() { - mCloth.wakeUp(); - return mCloth.push(mCloth.mSeparationConstraints); + wakeUp(); + return getChildCloth()->push(getChildCloth()->mSeparationConstraints); } template <typename T> inline void ClothImpl<T>::clearSeparationConstraints() { - mCloth.clear(mCloth.mSeparationConstraints); - mCloth.wakeUp(); + getChildCloth()->clear(getChildCloth()->mSeparationConstraints); + wakeUp(); } template <typename T> inline void ClothImpl<T>::clearInterpolation() { - if (!mCloth.mTargetCollisionSpheres.empty()) + if (!getChildCloth()->mTargetCollisionSpheres.empty()) { - ContextLockType contextLock(mCloth.mFactory); - physx::shdfnd::swap(mCloth.mStartCollisionSpheres, mCloth.mTargetCollisionSpheres); - mCloth.mTargetCollisionSpheres.resize(0); + ContextLockType contextLock(getChildCloth()->mFactory); + physx::shdfnd::swap(getChildCloth()->mStartCollisionSpheres, getChildCloth()->mTargetCollisionSpheres); + getChildCloth()->mTargetCollisionSpheres.resize(0); } - mCloth.mMotionConstraints.pop(); - mCloth.mSeparationConstraints.pop(); - mCloth.wakeUp(); + getChildCloth()->mMotionConstraints.pop(); + getChildCloth()->mSeparationConstraints.pop(); + wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getNumSeparationConstraints() const { - return uint32_t(mCloth.mSeparationConstraints.mStart.size()); + return uint32_t(getChildCloth()->mSeparationConstraints.mStart.size()); } template <typename T> inline uint32_t ClothImpl<T>::getNumParticleAccelerations() const { - return uint32_t(mCloth.mParticleAccelerations.size()); + return uint32_t(getChildCloth()->mParticleAccelerations.size()); } template <typename T> inline void ClothImpl<T>::setWindVelocity(physx::PxVec3 wind) { - if (wind == mCloth.mWind) + if (wind == mWind) return; - mCloth.mWind = wind; - mCloth.notifyChanged(); - mCloth.wakeUp(); + mWind = wind; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline physx::PxVec3 ClothImpl<T>::getWindVelocity() const { - return mCloth.mWind; + return mWind; } template <typename T> @@ -1191,18 +1179,18 @@ inline void ClothImpl<T>::setDragCoefficient(float coefficient) NV_CLOTH_ASSERT(coefficient < 1.f); float value = safeLog2(1.f - coefficient); - if (value == mCloth.mDragLogCoefficient) + if (value == mDragLogCoefficient) return; - mCloth.mDragLogCoefficient = value; - mCloth.notifyChanged(); - mCloth.wakeUp(); + mDragLogCoefficient = value; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getDragCoefficient() const { - return 1.f - safeExp2(mCloth.mDragLogCoefficient); + return 1.f - safeExp2(mDragLogCoefficient); } template <typename T> @@ -1211,24 +1199,24 @@ inline void ClothImpl<T>::setLiftCoefficient(float coefficient) NV_CLOTH_ASSERT(coefficient < 1.f); float value = safeLog2(1.f - coefficient); - if (value == mCloth.mLiftLogCoefficient) + if (value == mLiftLogCoefficient) return; - mCloth.mLiftLogCoefficient = value; - mCloth.notifyChanged(); - mCloth.wakeUp(); + mLiftLogCoefficient = value; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getLiftCoefficient() const { - return 1.f - safeExp2(mCloth.mLiftLogCoefficient); + return 1.f - safeExp2(mLiftLogCoefficient); } template <typename T> inline uint32_t ClothImpl<T>::getNumSelfCollisionIndices() const { - return uint32_t(mCloth.mSelfCollisionIndices.size()); + return uint32_t(getChildCloth()->mSelfCollisionIndices.size()); } // Fixed 4505:local function has been removed @@ -1236,149 +1224,155 @@ template <typename T> inline void ClothImpl<T>::setRestPositions(Range<const physx::PxVec4> restPositions) { NV_CLOTH_ASSERT(restPositions.empty() || restPositions.size() == getNumParticles()); - ContextLockType contextLock(mCloth.mFactory); - mCloth.mRestPositions.assign(restPositions.begin(), restPositions.end()); - mCloth.wakeUp(); + ContextLockType contextLock(getChildCloth()->mFactory); + getChildCloth()->mRestPositions.assign(restPositions.begin(), restPositions.end()); + wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getNumRestPositions() const { - return uint32_t(mCloth.mRestPositions.size()); + return uint32_t(getChildCloth()->mRestPositions.size()); } template <typename T> inline void ClothImpl<T>::setSelfCollisionDistance(float distance) { - if (distance == mCloth.mSelfCollisionDistance) + if (distance == getChildCloth()->mSelfCollisionDistance) return; - mCloth.mSelfCollisionDistance = distance; - mCloth.notifyChanged(); - mCloth.wakeUp(); + getChildCloth()->mSelfCollisionDistance = distance; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getSelfCollisionDistance() const { - return mCloth.mSelfCollisionDistance; + return getChildCloth()->mSelfCollisionDistance; } template <typename T> inline void ClothImpl<T>::setSelfCollisionStiffness(float stiffness) { float value = safeLog2(1 - stiffness); - if (value == mCloth.mSelfCollisionLogStiffness) + if (value == getChildCloth()->mSelfCollisionLogStiffness) return; - mCloth.mSelfCollisionLogStiffness = value; - mCloth.notifyChanged(); - mCloth.wakeUp(); + getChildCloth()->mSelfCollisionLogStiffness = value; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getSelfCollisionStiffness() const { - return 1.f - safeExp2(mCloth.mSelfCollisionLogStiffness); + return 1.f - safeExp2(getChildCloth()->mSelfCollisionLogStiffness); } template <typename T> inline const physx::PxVec3& ClothImpl<T>::getBoundingBoxCenter() const { - return mCloth.mParticleBoundsCenter; + return getChildCloth()->mParticleBoundsCenter; } template <typename T> inline const physx::PxVec3& ClothImpl<T>::getBoundingBoxScale() const { - return mCloth.mParticleBoundsHalfExtent; + return getChildCloth()->mParticleBoundsHalfExtent; } template <typename T> inline void ClothImpl<T>::setSleepThreshold(float threshold) { - if (threshold == mCloth.mSleepThreshold) + if (threshold == mSleepThreshold) return; - mCloth.mSleepThreshold = threshold; - mCloth.notifyChanged(); - mCloth.wakeUp(); + mSleepThreshold = threshold; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline float ClothImpl<T>::getSleepThreshold() const { - return mCloth.mSleepThreshold; + return mSleepThreshold; } template <typename T> inline void ClothImpl<T>::setSleepTestInterval(uint32_t interval) { - if (interval == mCloth.mSleepTestInterval) + if (interval == mSleepTestInterval) return; - mCloth.mSleepTestInterval = interval; - mCloth.notifyChanged(); - mCloth.wakeUp(); + mSleepTestInterval = interval; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getSleepTestInterval() const { - return mCloth.mSleepTestInterval; + return mSleepTestInterval; } template <typename T> inline void ClothImpl<T>::setSleepAfterCount(uint32_t afterCount) { - if (afterCount == mCloth.mSleepAfterCount) + if (afterCount == mSleepAfterCount) return; - mCloth.mSleepAfterCount = afterCount; - mCloth.notifyChanged(); - mCloth.wakeUp(); + mSleepAfterCount = afterCount; + getChildCloth()->notifyChanged(); + wakeUp(); } template <typename T> inline uint32_t ClothImpl<T>::getSleepAfterCount() const { - return mCloth.mSleepAfterCount; + return mSleepAfterCount; } template <typename T> inline uint32_t ClothImpl<T>::getSleepPassCount() const { - return mCloth.mSleepPassCounter; + return mSleepPassCounter; } template <typename T> inline bool ClothImpl<T>::isAsleep() const { - return mCloth.isSleeping(); + return isSleeping(); } template <typename T> inline void ClothImpl<T>::putToSleep() { - mCloth.mSleepPassCounter = mCloth.mSleepAfterCount; + mSleepPassCounter = mSleepAfterCount; +} + +template <typename T> +inline bool ClothImpl<T>::isSleeping() const +{ + return mSleepPassCounter >= mSleepAfterCount; } template <typename T> inline void ClothImpl<T>::wakeUp() { - mCloth.wakeUp(); + mSleepPassCounter = 0; } template <typename T> inline void ClothImpl<T>::setUserData(void* data) { - mCloth.mUserData = data; + getChildCloth()->mUserData = data; } template <typename T> inline void* ClothImpl<T>::getUserData() const { - return mCloth.mUserData; + return getChildCloth()->mUserData; } template <typename T> diff --git a/NvCloth/src/NvSimd/NvSimd4f.h b/NvCloth/src/NvSimd/NvSimd4f.h index cb863e7..7e2dde6 100644 --- a/NvCloth/src/NvSimd/NvSimd4f.h +++ b/NvCloth/src/NvSimd/NvSimd4f.h @@ -76,12 +76,18 @@ struct Simd4fTupleFactory Simd4fTupleFactory(float x, float y, float z, float w) // c++11: : tuple{ x, y, z, w } { - tuple[0] = x, tuple[1] = y, tuple[2] = z, tuple[3] = w; + tuple[0] = x; + tuple[1] = y; + tuple[2] = z; + tuple[3] = w; } Simd4fTupleFactory(unsigned x, unsigned y, unsigned z, unsigned w) { unsigned* ptr = reinterpret_cast<unsigned*>(tuple); - ptr[0] = x, ptr[1] = y, ptr[2] = z, ptr[3] = w; + ptr[0] = x; + ptr[1] = y; + ptr[2] = z; + ptr[3] = w; } Simd4fTupleFactory& operator = (const Simd4fTupleFactory&); // not implemented inline operator Simd4f() const; diff --git a/NvCloth/src/NvSimd/NvSimd4i.h b/NvCloth/src/NvSimd/NvSimd4i.h index 3da6169..7eda3f4 100644 --- a/NvCloth/src/NvSimd/NvSimd4i.h +++ b/NvCloth/src/NvSimd/NvSimd4i.h @@ -61,7 +61,10 @@ struct Simd4iTupleFactory Simd4iTupleFactory(int x, int y, int z, int w) // c++11: : tuple{ x, y, z, w } { - tuple[0] = x, tuple[1] = y, tuple[2] = z, tuple[3] = w; + tuple[0] = x; + tuple[1] = y; + tuple[2] = z; + tuple[3] = w; } Simd4iTupleFactory& operator = (const Simd4iTupleFactory&); // not implemented inline operator Simd4i() const; diff --git a/NvCloth/src/NvSimd/NvSimdTypes.h b/NvCloth/src/NvSimd/NvSimdTypes.h index 57b4c36..0625332 100644 --- a/NvCloth/src/NvSimd/NvSimdTypes.h +++ b/NvCloth/src/NvSimd/NvSimdTypes.h @@ -72,8 +72,16 @@ void foo(const float* ptr) * Define Simd4f and Simd4i, which map to four 32bit float or integer tuples. * */ // note: ps4 compiler defines _M_X64 without value -#define NV_SIMD_SSE2 (defined _M_IX86 || defined _M_X64 || defined __i386__ || defined __x86_64__) -#define NV_SIMD_NEON (defined _M_ARM || defined __ARM_NEON__) +#if defined (_M_IX86) || defined (_M_X64) || defined (__i386__) || defined (__x86_64__) || PX_EMSCRIPTEN +#define NV_SIMD_SSE2 1 +#else +#define NV_SIMD_SSE2 0 +#endif +#if defined (_M_ARM) || defined (__ARM_NEON__) || defined (__ARM_NEON) +#define NV_SIMD_NEON 1 +#else +#define NV_SIMD_NEON 0 +#endif #define NV_SIMD_SIMD (NV_SIMD_SSE2 || NV_SIMD_NEON) /*! \def NV_SIMD_SCALAR @@ -90,7 +98,11 @@ void foo(const float* ptr) // support shift by vector operarations #define NV_SIMD_SHIFT_BY_VECTOR (NV_SIMD_NEON) // support inline assembler -#define NV_SIMD_INLINE_ASSEMBLER !(defined _M_ARM || defined SN_TARGET_PSP2 || defined __arm64__) +#if defined _M_ARM || defined SN_TARGET_PSP2 || defined __arm64__ || defined __aarch64__ +#define NV_SIMD_INLINE_ASSEMBLER 0 +#else +#define NV_SIMD_INLINE_ASSEMBLER 1 +#endif /*! \def NV_SIMD_USE_NAMESPACE * \brief Set to 1 to define the SIMD library types and functions inside the nvidia::simd namespace. diff --git a/NvCloth/src/SwCloth.cpp b/NvCloth/src/SwCloth.cpp index f409ad6..6077ada 100644 --- a/NvCloth/src/SwCloth.cpp +++ b/NvCloth/src/SwCloth.cpp @@ -174,116 +174,101 @@ namespace nv namespace cloth { -template <> -Cloth* ClothImpl<SwCloth>::clone(Factory& factory) const +Cloth* SwCloth::clone(Factory& factory) const { return factory.clone(*this); } -template <> -uint32_t ClothImpl<SwCloth>::getNumParticles() const +uint32_t SwCloth::getNumParticles() const { - return uint32_t(mCloth.mCurParticles.size()); + return uint32_t(mCurParticles.size()); } -template <> -void ClothImpl<SwCloth>::lockParticles() const +void SwCloth::lockParticles() const { } -template <> -void ClothImpl<SwCloth>::unlockParticles() const +void SwCloth::unlockParticles() const { } -template <> -MappedRange<PxVec4> ClothImpl<SwCloth>::getCurrentParticles() +MappedRange<physx::PxVec4> SwCloth::getCurrentParticles() { - return getMappedParticles(&mCloth.mCurParticles.front()); + return getMappedParticles(&mCurParticles.front()); } -template <> -MappedRange<const PxVec4> ClothImpl<SwCloth>::getCurrentParticles() const +MappedRange<const physx::PxVec4> SwCloth::getCurrentParticles() const { - return getMappedParticles(&mCloth.mCurParticles.front()); + return getMappedParticles(&mCurParticles.front()); } -template <> -MappedRange<PxVec4> ClothImpl<SwCloth>::getPreviousParticles() +MappedRange<physx::PxVec4> SwCloth::getPreviousParticles() { - return getMappedParticles(&mCloth.mPrevParticles.front()); + return getMappedParticles(&mPrevParticles.front()); } -template <> -MappedRange<const PxVec4> ClothImpl<SwCloth>::getPreviousParticles() const +MappedRange<const physx::PxVec4> SwCloth::getPreviousParticles() const { - return getMappedParticles(&mCloth.mPrevParticles.front()); + return getMappedParticles(&mPrevParticles.front()); } -template <> -GpuParticles ClothImpl<SwCloth>::getGpuParticles() +GpuParticles SwCloth::getGpuParticles() { GpuParticles result = { 0, 0, 0 }; return result; } -template <> -void ClothImpl<SwCloth>::setPhaseConfig(Range<const PhaseConfig> configs) +void SwCloth::setPhaseConfig(Range<const PhaseConfig> configs) { - mCloth.mPhaseConfigs.resize(0); + mPhaseConfigs.resize(0); // transform phase config to use in solver for (; !configs.empty(); configs.popFront()) if (configs.front().mStiffness > 0.0f) - mCloth.mPhaseConfigs.pushBack(transform(configs.front())); + mPhaseConfigs.pushBack(transform(configs.front())); - mCloth.wakeUp(); + wakeUp(); } -template <> -void ClothImpl<SwCloth>::setSelfCollisionIndices(Range<const uint32_t> indices) +void SwCloth::setSelfCollisionIndices(Range<const uint32_t> indices) { - ContextLockType lock(mCloth.mFactory); - mCloth.mSelfCollisionIndices.assign(indices.begin(), indices.end()); - mCloth.notifyChanged(); - mCloth.wakeUp(); + ContextLockType lock(mFactory); + mSelfCollisionIndices.assign(indices.begin(), indices.end()); + notifyChanged(); + wakeUp(); } -template <> -uint32_t ClothImpl<SwCloth>::getNumVirtualParticles() const +uint32_t SwCloth::getNumVirtualParticles() const { - return uint32_t(mCloth.mNumVirtualParticles); + return uint32_t(mNumVirtualParticles); } -template <> -Range<PxVec4> ClothImpl<SwCloth>::getParticleAccelerations() +Range<PxVec4> SwCloth::getParticleAccelerations() { - if (mCloth.mParticleAccelerations.empty()) + if (mParticleAccelerations.empty()) { - uint32_t n = uint32_t(mCloth.mCurParticles.size()); - mCloth.mParticleAccelerations.resize(n, PxVec4(0.0f)); + uint32_t n = uint32_t(mCurParticles.size()); + mParticleAccelerations.resize(n, PxVec4(0.0f)); } - mCloth.wakeUp(); + wakeUp(); - PxVec4* data = &mCloth.mParticleAccelerations.front(); - return Range<PxVec4>(data, data + mCloth.mParticleAccelerations.size()); + PxVec4* data = &mParticleAccelerations.front(); + return Range<PxVec4>(data, data + mParticleAccelerations.size()); } -template <> -void ClothImpl<SwCloth>::clearParticleAccelerations() +void SwCloth::clearParticleAccelerations() { - Vector<PxVec4>::Type().swap(mCloth.mParticleAccelerations); - mCloth.wakeUp(); + Vector<PxVec4>::Type().swap(mParticleAccelerations); + wakeUp(); } -template <> -void ClothImpl<SwCloth>::setVirtualParticles(Range<const uint32_t[4]> indices, Range<const PxVec3> weights) +void SwCloth::setVirtualParticles(Range<const uint32_t[4]> indices, Range<const PxVec3> weights) { - mCloth.mNumVirtualParticles = 0; + mNumVirtualParticles = 0; // shuffle indices to form independent SIMD sets - uint16_t numParticles = uint16_t(mCloth.mCurParticles.size()); + uint16_t numParticles = uint16_t(mCurParticles.size()); TripletScheduler scheduler(indices); scheduler.simd(numParticles, 4); @@ -292,29 +277,29 @@ void ClothImpl<SwCloth>::setVirtualParticles(Range<const uint32_t[4]> indices, R Vector<uint32_t>::Type::ConstIterator sIt = scheduler.mSetSizes.begin(); Vector<uint32_t>::Type::ConstIterator sEnd = scheduler.mSetSizes.end(); TripletScheduler::ConstTripletIter tIt = scheduler.mTriplets.begin(), tLast; - mCloth.mVirtualParticleIndices.resize(0); - mCloth.mVirtualParticleIndices.reserve(indices.size() + 3 * uint32_t(sEnd - sIt)); + mVirtualParticleIndices.resize(0); + mVirtualParticleIndices.reserve(indices.size() + 3 * uint32_t(sEnd - sIt)); for (; sIt != sEnd; ++sIt) { uint32_t setSize = *sIt; - for (tLast = tIt + setSize; tIt != tLast; ++tIt, ++mCloth.mNumVirtualParticles) - mCloth.mVirtualParticleIndices.pushBack(Vec4us(*tIt)); - mCloth.mVirtualParticleIndices.resize((mCloth.mVirtualParticleIndices.size() + 3) & ~3, dummy); + for (tLast = tIt + setSize; tIt != tLast; ++tIt, ++mNumVirtualParticles) + mVirtualParticleIndices.pushBack(Vec4us(*tIt)); + mVirtualParticleIndices.resize((mVirtualParticleIndices.size() + 3) & ~3, dummy); } - Vector<Vec4us>::Type(mCloth.mVirtualParticleIndices.begin(), mCloth.mVirtualParticleIndices.end()) - .swap(mCloth.mVirtualParticleIndices); + Vector<Vec4us>::Type(mVirtualParticleIndices.begin(), mVirtualParticleIndices.end()) + .swap(mVirtualParticleIndices); // precompute 1/dot(w,w) - Vector<PxVec4>::Type().swap(mCloth.mVirtualParticleWeights); - mCloth.mVirtualParticleWeights.reserve(weights.size()); + Vector<PxVec4>::Type().swap(mVirtualParticleWeights); + mVirtualParticleWeights.reserve(weights.size()); for (; !weights.empty(); weights.popFront()) { PxVec3 w = weights.front(); float scale = 1 / w.magnitudeSquared(); - mCloth.mVirtualParticleWeights.pushBack(PxVec4( w.x, w.y, w.z, scale )); + mVirtualParticleWeights.pushBack(PxVec4( w.x, w.y, w.z, scale )); } - mCloth.notifyChanged(); + notifyChanged(); } } // namespace cloth diff --git a/NvCloth/src/SwCloth.h b/NvCloth/src/SwCloth.h index 2730d9d..919a39a 100644 --- a/NvCloth/src/SwCloth.h +++ b/NvCloth/src/SwCloth.h @@ -37,6 +37,9 @@ #include <foundation/PxVec4.h> #include <foundation/PxVec3.h> #include <foundation/PxTransform.h> +#include "SwFactory.h" +#include "SwFabric.h" +#include "ClothImpl.h" namespace nv { @@ -44,9 +47,6 @@ namespace nv namespace cloth { -class SwFabric; -class SwFactory; - struct SwConstraints { void pop() @@ -62,15 +62,27 @@ struct SwConstraints Vector<physx::PxVec4>::Type mTarget; }; -class SwCloth +struct SwContextLock { - SwCloth& operator = (const SwCloth&); // not implemented - struct SwContextLock + SwContextLock(const SwFactory&) { - SwContextLock(const SwFactory&) - { - } - }; + } +}; + +class SwCloth; + +template<> +class ClothTraits<SwCloth> +{ +public: + typedef SwFactory FactoryType; + typedef SwFabric FabricType; + typedef SwContextLock ContextLockType; +}; + +class SwCloth : public ClothImpl<SwCloth> +{ + SwCloth& operator = (const SwCloth&); // not implemented public: typedef SwFactory FactoryType; @@ -87,14 +99,24 @@ class SwCloth ~SwCloth(); // not virtual on purpose public: - bool isSleeping() const - { - return mSleepPassCounter >= mSleepAfterCount; - } - void wakeUp() - { - mSleepPassCounter = 0; - } + virtual Cloth* clone(Factory& factory) const; + uint32_t getNumParticles() const; + + void lockParticles() const; + void unlockParticles() const; + + MappedRange<physx::PxVec4> getCurrentParticles(); + MappedRange<const physx::PxVec4> getCurrentParticles() const; + MappedRange<physx::PxVec4> getPreviousParticles(); + MappedRange<const physx::PxVec4> getPreviousParticles() const; + GpuParticles getGpuParticles(); + + void setPhaseConfig(Range<const PhaseConfig> configs); + void setSelfCollisionIndices(Range<const uint32_t> indices); + uint32_t getNumVirtualParticles() const; + Range<physx::PxVec4> getParticleAccelerations(); + void clearParticleAccelerations(); + void setVirtualParticles(Range<const uint32_t[4]> indices, Range<const physx::PxVec3> weights); void notifyChanged() { @@ -117,27 +139,6 @@ class SwCloth Vector<physx::PxVec4>::Type mCurParticles; Vector<physx::PxVec4>::Type mPrevParticles; - physx::PxVec3 mParticleBoundsCenter; - physx::PxVec3 mParticleBoundsHalfExtent; - - physx::PxVec3 mGravity; - physx::PxVec3 mLogDamping; - physx::PxVec3 mLinearLogDrag; - physx::PxVec3 mAngularLogDrag; - physx::PxVec3 mLinearInertia; - physx::PxVec3 mAngularInertia; - physx::PxVec3 mCentrifugalInertia; - float mSolverFrequency; - float mStiffnessFrequency; - - physx::PxTransform mTargetMotion; - physx::PxTransform mCurrentMotion; - physx::PxVec3 mLinearVelocity; - physx::PxVec3 mAngularVelocity; - - float mPrevIterDt; - MovingAverage mIterDtAvg; - Vector<PhaseConfig>::Type mPhaseConfigs; // transformed! // tether constraints stuff @@ -156,11 +157,6 @@ class SwCloth // particle acceleration stuff Vector<physx::PxVec4>::Type mParticleAccelerations; - // wind - physx::PxVec3 mWind; - float mDragLogCoefficient; - float mLiftLogCoefficient; - // collision stuff Vector<IndexPair>::Type mCapsuleIndices; Vector<physx::PxVec4>::Type mStartCollisionSpheres; @@ -187,16 +183,8 @@ class SwCloth Vector<physx::PxVec4>::Type mRestPositions; - // sleeping - uint32_t mSleepTestInterval; // how often to test for movement - uint32_t mSleepAfterCount; // number of tests to pass before sleep - float mSleepThreshold; // max movement delta to pass test - uint32_t mSleepPassCounter; // how many tests passed - uint32_t mSleepTestCounter; // how many iterations since tested - // unused for CPU simulation void* mUserData; - }; } // namespace cloth diff --git a/NvCloth/src/SwCollision.cpp b/NvCloth/src/SwCollision.cpp index 3774795..89df8a5 100644 --- a/NvCloth/src/SwCollision.cpp +++ b/NvCloth/src/SwCollision.cpp @@ -42,8 +42,8 @@ using namespace nv; using namespace physx; // the particle trajectory needs to penetrate more than 0.2 * radius to trigger continuous collision -template <typename Simd4f> -const Simd4f cloth::SwCollision<Simd4f>::sSkeletonWidth = simd4f(cloth::sqr(1 - 0.2f) - 1); +template <typename T4f> +const T4f cloth::SwCollision<T4f>::sSkeletonWidth = simd4f(cloth::sqr(1 - 0.2f) - 1); #if NV_SIMD_SSE2 const Simd4i cloth::Gather<Simd4i>::sIntSignBit = simd4i(0x80000000); @@ -66,8 +66,8 @@ const Simd4fScalarFactory sGridExpand = simd4f(1e-4f); const Simd4fTupleFactory sMinusFloatMaxXYZ = simd4f(-FLT_MAX, -FLT_MAX, -FLT_MAX, 0.0f); #if PX_PROFILE || PX_DEBUG -template <typename Simd4f> -uint32_t horizontalSum(const Simd4f& x) +template <typename T4f> +uint32_t horizontalSum(const T4f& x) { const float* p = array(x); return uint32_t(0.5f + p[0] + p[1] + p[2] + p[3]); @@ -75,8 +75,8 @@ uint32_t horizontalSum(const Simd4f& x) #endif // 7 elements are written to ptr! -template <typename Simd4f> -void storeBounds(float* ptr, const cloth::BoundingBox<Simd4f>& bounds) +template <typename T4f> +void storeBounds(float* ptr, const cloth::BoundingBox<T4f>& bounds) { store(ptr, bounds.mLower); store(ptr + 3, bounds.mUpper); @@ -128,14 +128,14 @@ namespace nv { namespace cloth { -template <typename Simd4f> -BoundingBox<Simd4f> expandBounds(const BoundingBox<Simd4f>& bbox, const SphereData* sIt, const SphereData* sEnd) +template <typename T4f> +BoundingBox<T4f> expandBounds(const BoundingBox<T4f>& bbox, const SphereData* sIt, const SphereData* sEnd) { - BoundingBox<Simd4f> result = bbox; + BoundingBox<T4f> result = bbox; for (; sIt != sEnd; ++sIt) { - Simd4f p = loadAligned(array(sIt->center)); - Simd4f r = splat<3>(p); + T4f p = loadAligned(array(sIt->center)); + T4f r = splat<3>(p); result.mLower = min(result.mLower, p - r); result.mUpper = max(result.mUpper, p + r); } @@ -146,8 +146,8 @@ BoundingBox<Simd4f> expandBounds(const BoundingBox<Simd4f>& bbox, const SphereDa namespace { -template <typename Simd4f, typename SrcIterator> -void generateSpheres(Simd4f* dIt, const SrcIterator& src, uint32_t count) +template <typename T4f, typename SrcIterator> +void generateSpheres(T4f* dIt, const SrcIterator& src, uint32_t count) { // have to copy out iterator to ensure alignment is maintained for (SrcIterator sIt = src; 0 < count--; ++sIt, ++dIt) @@ -192,41 +192,41 @@ void generateCones(cloth::ConeData* dst, const cloth::SphereData* sourceSpheres, } } -template <typename Simd4f, typename SrcIterator> -void generatePlanes(Simd4f* dIt, const SrcIterator& src, uint32_t count) +template <typename T4f, typename SrcIterator> +void generatePlanes(T4f* dIt, const SrcIterator& src, uint32_t count) { // have to copy out iterator to ensure alignment is maintained for (SrcIterator sIt = src; 0 < count--; ++sIt, ++dIt) *dIt = *sIt; } -template <typename Simd4f, typename SrcIterator> +template <typename T4f, typename SrcIterator> void generateTriangles(cloth::TriangleData* dIt, const SrcIterator& src, uint32_t count) { // have to copy out iterator to ensure alignment is maintained for (SrcIterator sIt = src; 0 < count--; ++dIt) { - Simd4f p0 = *sIt; + T4f p0 = *sIt; ++sIt; - Simd4f p1 = *sIt; + T4f p1 = *sIt; ++sIt; - Simd4f p2 = *sIt; + T4f p2 = *sIt; ++sIt; - Simd4f edge0 = p1 - p0; - Simd4f edge1 = p2 - p0; - Simd4f normal = cross3(edge0, edge1); + T4f edge0 = p1 - p0; + T4f edge1 = p2 - p0; + T4f normal = cross3(edge0, edge1); - Simd4f edge0SqrLength = dot3(edge0, edge0); - Simd4f edge1SqrLength = dot3(edge1, edge1); - Simd4f edge0DotEdge1 = dot3(edge0, edge1); - Simd4f normalInvLength = rsqrt(dot3(normal, normal)); + T4f edge0SqrLength = dot3(edge0, edge0); + T4f edge1SqrLength = dot3(edge1, edge1); + T4f edge0DotEdge1 = dot3(edge0, edge1); + T4f normalInvLength = rsqrt(dot3(normal, normal)); - Simd4f det = edge0SqrLength * edge1SqrLength - edge0DotEdge1 * edge0DotEdge1; - Simd4f denom = edge0SqrLength + edge1SqrLength - edge0DotEdge1 - edge0DotEdge1; + T4f det = edge0SqrLength * edge1SqrLength - edge0DotEdge1 * edge0DotEdge1; + T4f denom = edge0SqrLength + edge1SqrLength - edge0DotEdge1 - edge0DotEdge1; // there are definitely faster ways... - Simd4f aux = select(sMaskX, det, denom); + T4f aux = select(sMaskX, det, denom); aux = select(sMaskZ, edge0SqrLength, aux); aux = select(sMaskW, edge1SqrLength, aux); @@ -240,14 +240,14 @@ void generateTriangles(cloth::TriangleData* dIt, const SrcIterator& src, uint32_ } // namespace -template <typename Simd4f> -cloth::SwCollision<Simd4f>::CollisionData::CollisionData() +template <typename T4f> +cloth::SwCollision<T4f>::CollisionData::CollisionData() : mSpheres(0), mCones(0) { } -template <typename Simd4f> -cloth::SwCollision<Simd4f>::SwCollision(SwClothData& clothData, SwKernelAllocator& alloc) +template <typename T4f> +cloth::SwCollision<T4f>::SwCollision(SwClothData& clothData, SwKernelAllocator& alloc) : mClothData(clothData), mAllocator(alloc) { allocate(mCurData); @@ -256,22 +256,22 @@ cloth::SwCollision<Simd4f>::SwCollision(SwClothData& clothData, SwKernelAllocato { allocate(mPrevData); - generateSpheres(reinterpret_cast<Simd4f*>(mPrevData.mSpheres), - reinterpret_cast<const Simd4f*>(clothData.mStartCollisionSpheres), clothData.mNumSpheres); + generateSpheres(reinterpret_cast<T4f*>(mPrevData.mSpheres), + reinterpret_cast<const T4f*>(clothData.mStartCollisionSpheres), clothData.mNumSpheres); generateCones(mPrevData.mCones, mPrevData.mSpheres, clothData.mCapsuleIndices, clothData.mNumCapsules); } } -template <typename Simd4f> -cloth::SwCollision<Simd4f>::~SwCollision() +template <typename T4f> +cloth::SwCollision<T4f>::~SwCollision() { deallocate(mCurData); deallocate(mPrevData); } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::operator()(const IterationState<Simd4f>& state) +template <typename T4f> +void cloth::SwCollision<T4f>::operator()(const IterationState<T4f>& state) { mNumCollisions = 0; @@ -285,20 +285,20 @@ void cloth::SwCollision<Simd4f>::operator()(const IterationState<Simd4f>& state) bool lastIteration = state.mRemainingIterations == 1; - const Simd4f* targetSpheres = reinterpret_cast<const Simd4f*>(mClothData.mTargetCollisionSpheres); + const T4f* targetSpheres = reinterpret_cast<const T4f*>(mClothData.mTargetCollisionSpheres); // generate sphere and cone collision data if (!lastIteration) { // interpolate spheres - LerpIterator<Simd4f, const Simd4f*> pIter(reinterpret_cast<const Simd4f*>(mClothData.mStartCollisionSpheres), + LerpIterator<T4f, const T4f*> pIter(reinterpret_cast<const T4f*>(mClothData.mStartCollisionSpheres), targetSpheres, state.getCurrentAlpha()); - generateSpheres(reinterpret_cast<Simd4f*>(mCurData.mSpheres), pIter, mClothData.mNumSpheres); + generateSpheres(reinterpret_cast<T4f*>(mCurData.mSpheres), pIter, mClothData.mNumSpheres); } else { // otherwise use the target spheres directly - generateSpheres(reinterpret_cast<Simd4f*>(mCurData.mSpheres), targetSpheres, mClothData.mNumSpheres); + generateSpheres(reinterpret_cast<T4f*>(mCurData.mSpheres), targetSpheres, mClothData.mNumSpheres); } // generate cones even if test below fails because @@ -323,8 +323,8 @@ void cloth::SwCollision<Simd4f>::operator()(const IterationState<Simd4f>& state) shdfnd::swap(mCurData, mPrevData); } -template <typename Simd4f> -size_t cloth::SwCollision<Simd4f>::estimateTemporaryMemory(const SwCloth& cloth) +template <typename T4f> +size_t cloth::SwCollision<T4f>::estimateTemporaryMemory(const SwCloth& cloth) { size_t numTriangles = cloth.mStartCollisionTriangles.size(); size_t numPlanes = cloth.mStartCollisionPlanes.size(); @@ -335,8 +335,8 @@ size_t cloth::SwCollision<Simd4f>::estimateTemporaryMemory(const SwCloth& cloth) return std::max(kTriangleDataSize, kPlaneDataSize); } -template <typename Simd4f> -size_t cloth::SwCollision<Simd4f>::estimatePersistentMemory(const SwCloth& cloth) +template <typename T4f> +size_t cloth::SwCollision<T4f>::estimatePersistentMemory(const SwCloth& cloth) { size_t numCapsules = cloth.mCapsuleIndices.size(); size_t numSpheres = cloth.mStartCollisionSpheres.size(); @@ -347,74 +347,74 @@ size_t cloth::SwCollision<Simd4f>::estimatePersistentMemory(const SwCloth& cloth return sphereDataSize + coneDataSize; } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::allocate(CollisionData& data) +template <typename T4f> +void cloth::SwCollision<T4f>::allocate(CollisionData& data) { data.mSpheres = static_cast<SphereData*>(mAllocator.allocate(sizeof(SphereData) * mClothData.mNumSpheres)); data.mCones = static_cast<ConeData*>(mAllocator.allocate(sizeof(ConeData) * mClothData.mNumCapsules)); } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::deallocate(const CollisionData& data) +template <typename T4f> +void cloth::SwCollision<T4f>::deallocate(const CollisionData& data) { mAllocator.deallocate(data.mSpheres); mAllocator.deallocate(data.mCones); } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::computeBounds() +template <typename T4f> +void cloth::SwCollision<T4f>::computeBounds() { NV_CLOTH_PROFILE_ZONE("cloth::SwSolverKernel::computeBounds", /*ProfileContext::None*/ 0); - Simd4f* prevIt = reinterpret_cast<Simd4f*>(mClothData.mPrevParticles); - Simd4f* curIt = reinterpret_cast<Simd4f*>(mClothData.mCurParticles); - Simd4f* curEnd = curIt + mClothData.mNumParticles; - Simd4f floatMaxXYZ = -static_cast<Simd4f>(sMinusFloatMaxXYZ); + T4f* prevIt = reinterpret_cast<T4f*>(mClothData.mPrevParticles); + T4f* curIt = reinterpret_cast<T4f*>(mClothData.mCurParticles); + T4f* curEnd = curIt + mClothData.mNumParticles; + T4f floatMaxXYZ = -static_cast<T4f>(sMinusFloatMaxXYZ); - Simd4f lower = simd4f(FLT_MAX), upper = -lower; + T4f lower = simd4f(FLT_MAX), upper = -lower; for (; curIt < curEnd; ++curIt, ++prevIt) { - Simd4f current = *curIt; + T4f current = *curIt; lower = min(lower, current); upper = max(upper, current); // if (current.w > 0) current.w = previous.w *curIt = select(current > floatMaxXYZ, *prevIt, current); } - BoundingBox<Simd4f> curBounds; + BoundingBox<T4f> curBounds; curBounds.mLower = lower; curBounds.mUpper = upper; // don't change this order, storeBounds writes 7 floats - BoundingBox<Simd4f> prevBounds = loadBounds<Simd4f>(mClothData.mCurBounds); + BoundingBox<T4f> prevBounds = loadBounds<T4f>(mClothData.mCurBounds); storeBounds(mClothData.mCurBounds, curBounds); storeBounds(mClothData.mPrevBounds, prevBounds); } namespace { -template <typename Simd4i> -Simd4i andNotIsZero(const Simd4i& left, const Simd4i& right) +template <typename T4i> +T4i andNotIsZero(const T4i& left, const T4i& right) { return (left & ~right) == gSimd4iZero; } } // build per-axis mask arrays of spheres on the right/left of grid cell -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::buildSphereAcceleration(const SphereData* sIt) +template <typename T4f> +void cloth::SwCollision<T4f>::buildSphereAcceleration(const SphereData* sIt) { static const int maxIndex = sGridSize - 1; const SphereData* sEnd = sIt + mClothData.mNumSpheres; for (uint32_t mask = 0x1; sIt != sEnd; ++sIt, mask <<= 1) { - Simd4f sphere = loadAligned(array(sIt->center)); - Simd4f radius = splat<3>(sphere); + T4f sphere = loadAligned(array(sIt->center)); + T4f radius = splat<3>(sphere); - Simd4i first = intFloor(max((sphere - radius) * mGridScale + mGridBias, gSimd4fZero)); - Simd4i last = intFloor(min((sphere + radius) * mGridScale + mGridBias, sGridLength)); + T4i first = intFloor(max((sphere - radius) * mGridScale + mGridBias, gSimd4fZero)); + T4i last = intFloor(min((sphere + radius) * mGridScale + mGridBias, sGridLength)); const int* firstIdx = array(first); const int* lastIdx = array(last); @@ -434,8 +434,8 @@ void cloth::SwCollision<Simd4f>::buildSphereAcceleration(const SphereData* sIt) } // generate cone masks from sphere masks -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::buildConeAcceleration() +template <typename T4f> +void cloth::SwCollision<T4f>::buildConeAcceleration() { const ConeData* coneIt = mCurData.mCones; const ConeData* coneEnd = coneIt + mClothData.mNumCapsules; @@ -456,8 +456,8 @@ void cloth::SwCollision<Simd4f>::buildConeAcceleration() } // convert right/left mask arrays into single overlap array -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::mergeAcceleration(uint32_t* firstIt) +template <typename T4f> +void cloth::SwCollision<T4f>::mergeAcceleration(uint32_t* firstIt) { uint32_t* firstEnd = firstIt + 3 * sGridSize; uint32_t* lastIt = firstEnd; @@ -466,28 +466,28 @@ void cloth::SwCollision<Simd4f>::mergeAcceleration(uint32_t* firstIt) } // build mask of spheres/cones touching a regular grid along each axis -template <typename Simd4f> -bool cloth::SwCollision<Simd4f>::buildAcceleration() +template <typename T4f> +bool cloth::SwCollision<T4f>::buildAcceleration() { // determine sphere bbox - BoundingBox<Simd4f> sphereBounds = - expandBounds(emptyBounds<Simd4f>(), mCurData.mSpheres, mCurData.mSpheres + mClothData.mNumSpheres); - BoundingBox<Simd4f> particleBounds = loadBounds<Simd4f>(mClothData.mCurBounds); + BoundingBox<T4f> sphereBounds = + expandBounds(emptyBounds<T4f>(), mCurData.mSpheres, mCurData.mSpheres + mClothData.mNumSpheres); + BoundingBox<T4f> particleBounds = loadBounds<T4f>(mClothData.mCurBounds); if (mClothData.mEnableContinuousCollision) { sphereBounds = expandBounds(sphereBounds, mPrevData.mSpheres, mPrevData.mSpheres + mClothData.mNumSpheres); - particleBounds = expandBounds(particleBounds, loadBounds<Simd4f>(mClothData.mPrevBounds)); + particleBounds = expandBounds(particleBounds, loadBounds<T4f>(mClothData.mPrevBounds)); } - BoundingBox<Simd4f> bounds = intersectBounds(sphereBounds, particleBounds); - Simd4f edgeLength = (bounds.mUpper - bounds.mLower) & ~static_cast<Simd4f>(sMaskW); + BoundingBox<T4f> bounds = intersectBounds(sphereBounds, particleBounds); + T4f edgeLength = (bounds.mUpper - bounds.mLower) & ~static_cast<T4f>(sMaskW); if (!allGreaterEqual(edgeLength, gSimd4fZero)) return false; // calculate an expanded bounds to account for numerical inaccuracy - const Simd4f expandedLower = bounds.mLower - abs(bounds.mLower) * sGridExpand; - const Simd4f expandedUpper = bounds.mUpper + abs(bounds.mUpper) * sGridExpand; - const Simd4f expandedEdgeLength = max(expandedUpper - expandedLower, gSimd4fEpsilon); + const T4f expandedLower = bounds.mLower - abs(bounds.mLower) * sGridExpand; + const T4f expandedUpper = bounds.mUpper + abs(bounds.mUpper) * sGridExpand; + const T4f expandedEdgeLength = max(expandedUpper - expandedLower, gSimd4fEpsilon); // make grid minimal thickness and strict upper bound of spheres mGridScale = sGridLength * recip<1>(expandedEdgeLength); @@ -514,8 +514,8 @@ bool cloth::SwCollision<Simd4f>::buildAcceleration() #define FORCE_INLINE inline __attribute__((always_inline)) #endif -template <typename Simd4f> -FORCE_INLINE typename cloth::SwCollision<Simd4f>::ShapeMask& cloth::SwCollision<Simd4f>::ShapeMask:: +template <typename T4f> +FORCE_INLINE typename cloth::SwCollision<T4f>::ShapeMask& cloth::SwCollision<T4f>::ShapeMask:: operator = (const ShapeMask& right) { mCones = right.mCones; @@ -523,8 +523,8 @@ operator = (const ShapeMask& right) return *this; } -template <typename Simd4f> -FORCE_INLINE typename cloth::SwCollision<Simd4f>::ShapeMask& cloth::SwCollision<Simd4f>::ShapeMask:: +template <typename T4f> +FORCE_INLINE typename cloth::SwCollision<T4f>::ShapeMask& cloth::SwCollision<T4f>::ShapeMask:: operator &= (const ShapeMask& right) { mCones = mCones & right.mCones; @@ -532,12 +532,12 @@ operator &= (const ShapeMask& right) return *this; } -template <typename Simd4f> -FORCE_INLINE typename cloth::SwCollision<Simd4f>::ShapeMask -cloth::SwCollision<Simd4f>::getShapeMask(const Simd4f& position, const Simd4i* __restrict sphereGrid, - const Simd4i* __restrict coneGrid) +template <typename T4f> +FORCE_INLINE typename cloth::SwCollision<T4f>::ShapeMask +cloth::SwCollision<T4f>::getShapeMask(const T4f& position, const T4i* __restrict sphereGrid, + const T4i* __restrict coneGrid) { - Gather<Simd4i> gather(intFloor(position)); + Gather<T4i> gather(intFloor(position)); ShapeMask result; result.mCones = gather(coneGrid); @@ -546,13 +546,13 @@ cloth::SwCollision<Simd4f>::getShapeMask(const Simd4f& position, const Simd4i* _ } // lookup acceleration structure and return mask of potential intersectors -template <typename Simd4f> -FORCE_INLINE typename cloth::SwCollision<Simd4f>::ShapeMask -cloth::SwCollision<Simd4f>::getShapeMask(const Simd4f* __restrict positions) const +template <typename T4f> +FORCE_INLINE typename cloth::SwCollision<T4f>::ShapeMask +cloth::SwCollision<T4f>::getShapeMask(const T4f* __restrict positions) const { - Simd4f posX = positions[0] * splat<0>(mGridScale) + splat<0>(mGridBias); - Simd4f posY = positions[1] * splat<1>(mGridScale) + splat<1>(mGridBias); - Simd4f posZ = positions[2] * splat<2>(mGridScale) + splat<2>(mGridBias); + T4f posX = positions[0] * splat<0>(mGridScale) + splat<0>(mGridBias); + T4f posY = positions[1] * splat<1>(mGridScale) + splat<1>(mGridBias); + T4f posZ = positions[2] * splat<2>(mGridScale) + splat<2>(mGridBias); ShapeMask result = getShapeMask(posX, mSphereGrid, mConeGrid); result &= getShapeMask(posY, mSphereGrid + 2, mConeGrid + 2); @@ -562,38 +562,38 @@ cloth::SwCollision<Simd4f>::getShapeMask(const Simd4f* __restrict positions) con } // lookup acceleration structure and return mask of potential intersectors -template <typename Simd4f> -FORCE_INLINE typename cloth::SwCollision<Simd4f>::ShapeMask -cloth::SwCollision<Simd4f>::getShapeMask(const Simd4f* __restrict prevPos, const Simd4f* __restrict curPos) const +template <typename T4f> +FORCE_INLINE typename cloth::SwCollision<T4f>::ShapeMask +cloth::SwCollision<T4f>::getShapeMask(const T4f* __restrict prevPos, const T4f* __restrict curPos) const { - Simd4f scaleX = splat<0>(mGridScale); - Simd4f scaleY = splat<1>(mGridScale); - Simd4f scaleZ = splat<2>(mGridScale); + T4f scaleX = splat<0>(mGridScale); + T4f scaleY = splat<1>(mGridScale); + T4f scaleZ = splat<2>(mGridScale); - Simd4f biasX = splat<0>(mGridBias); - Simd4f biasY = splat<1>(mGridBias); - Simd4f biasZ = splat<2>(mGridBias); + T4f biasX = splat<0>(mGridBias); + T4f biasY = splat<1>(mGridBias); + T4f biasZ = splat<2>(mGridBias); - Simd4f prevX = prevPos[0] * scaleX + biasX; - Simd4f prevY = prevPos[1] * scaleY + biasY; - Simd4f prevZ = prevPos[2] * scaleZ + biasZ; + T4f prevX = prevPos[0] * scaleX + biasX; + T4f prevY = prevPos[1] * scaleY + biasY; + T4f prevZ = prevPos[2] * scaleZ + biasZ; - Simd4f curX = curPos[0] * scaleX + biasX; - Simd4f curY = curPos[1] * scaleY + biasY; - Simd4f curZ = curPos[2] * scaleZ + biasZ; + T4f curX = curPos[0] * scaleX + biasX; + T4f curY = curPos[1] * scaleY + biasY; + T4f curZ = curPos[2] * scaleZ + biasZ; - Simd4f maxX = min(max(prevX, curX), sGridLength); - Simd4f maxY = min(max(prevY, curY), sGridLength); - Simd4f maxZ = min(max(prevZ, curZ), sGridLength); + T4f maxX = min(max(prevX, curX), sGridLength); + T4f maxY = min(max(prevY, curY), sGridLength); + T4f maxZ = min(max(prevZ, curZ), sGridLength); ShapeMask result = getShapeMask(maxX, mSphereGrid, mConeGrid); result &= getShapeMask(maxY, mSphereGrid + 2, mConeGrid + 2); result &= getShapeMask(maxZ, mSphereGrid + 4, mConeGrid + 4); - Simd4f zero = gSimd4fZero; - Simd4f minX = max(min(prevX, curX), zero); - Simd4f minY = max(min(prevY, curY), zero); - Simd4f minZ = max(min(prevZ, curZ), zero); + T4f zero = gSimd4fZero; + T4f minX = max(min(prevX, curX), zero); + T4f minY = max(min(prevY, curY), zero); + T4f minZ = max(min(prevZ, curZ), zero); result &= getShapeMask(minX, mSphereGrid + 6, mConeGrid + 6); result &= getShapeMask(minY, mSphereGrid + 8, mConeGrid + 8); @@ -602,8 +602,8 @@ cloth::SwCollision<Simd4f>::getShapeMask(const Simd4f* __restrict prevPos, const return result; } -template <typename Simd4f> -struct cloth::SwCollision<Simd4f>::ImpulseAccumulator +template <typename T4f> +struct cloth::SwCollision<T4f>::ImpulseAccumulator { ImpulseAccumulator() : mDeltaX(gSimd4fZero) @@ -616,21 +616,21 @@ struct cloth::SwCollision<Simd4f>::ImpulseAccumulator { } - void add(const Simd4f& x, const Simd4f& y, const Simd4f& z, const Simd4f& scale, const Simd4f& mask) + void add(const T4f& x, const T4f& y, const T4f& z, const T4f& scale, const T4f& mask) { NV_CLOTH_ASSERT(allTrue((mask & x) == (mask & x))); NV_CLOTH_ASSERT(allTrue((mask & y) == (mask & y))); NV_CLOTH_ASSERT(allTrue((mask & z) == (mask & z))); NV_CLOTH_ASSERT(allTrue((mask & scale) == (mask & scale))); - Simd4f maskedScale = scale & mask; + T4f maskedScale = scale & mask; mDeltaX = mDeltaX + x * maskedScale; mDeltaY = mDeltaY + y * maskedScale; mDeltaZ = mDeltaZ + z * maskedScale; mNumCollisions = mNumCollisions + (gSimd4fOne & mask); } - void addVelocity(const Simd4f& vx, const Simd4f& vy, const Simd4f& vz, const Simd4f& mask) + void addVelocity(const T4f& vx, const T4f& vy, const T4f& vz, const T4f& mask) { NV_CLOTH_ASSERT(allTrue((mask & vx) == (mask & vx))); NV_CLOTH_ASSERT(allTrue((mask & vy) == (mask & vy))); @@ -641,34 +641,34 @@ struct cloth::SwCollision<Simd4f>::ImpulseAccumulator mVelZ = mVelZ + (vz & mask); } - void subtract(const Simd4f& x, const Simd4f& y, const Simd4f& z, const Simd4f& scale, const Simd4f& mask) + void subtract(const T4f& x, const T4f& y, const T4f& z, const T4f& scale, const T4f& mask) { NV_CLOTH_ASSERT(allTrue((mask & x) == (mask & x))); NV_CLOTH_ASSERT(allTrue((mask & y) == (mask & y))); NV_CLOTH_ASSERT(allTrue((mask & z) == (mask & z))); NV_CLOTH_ASSERT(allTrue((mask & scale) == (mask & scale))); - Simd4f maskedScale = scale & mask; + T4f maskedScale = scale & mask; mDeltaX = mDeltaX - x * maskedScale; mDeltaY = mDeltaY - y * maskedScale; mDeltaZ = mDeltaZ - z * maskedScale; mNumCollisions = mNumCollisions + (gSimd4fOne & mask); } - Simd4f mDeltaX, mDeltaY, mDeltaZ; - Simd4f mVelX, mVelY, mVelZ; - Simd4f mNumCollisions; + T4f mDeltaX, mDeltaY, mDeltaZ; + T4f mVelX, mVelY, mVelZ; + T4f mNumCollisions; }; -template <typename Simd4f> -FORCE_INLINE void cloth::SwCollision<Simd4f>::collideSpheres(const Simd4i& sphereMask, const Simd4f* positions, +template <typename T4f> +FORCE_INLINE void cloth::SwCollision<T4f>::collideSpheres(const T4i& sphereMask, const T4f* positions, ImpulseAccumulator& accum) const { const float* __restrict spherePtr = array(mCurData.mSpheres->center); bool frictionEnabled = mClothData.mFrictionScale > 0.0f; - Simd4i mask4 = horizontalOr(sphereMask); + T4i mask4 = horizontalOr(sphereMask); uint32_t mask = uint32_t(array(mask4)[0]); while (mask) { @@ -676,16 +676,16 @@ FORCE_INLINE void cloth::SwCollision<Simd4f>::collideSpheres(const Simd4i& spher uint32_t offset = findBitSet(mask & ~test) * sizeof(SphereData); mask = mask & test; - Simd4f sphere = loadAligned(spherePtr, offset); + T4f sphere = loadAligned(spherePtr, offset); - Simd4f deltaX = positions[0] - splat<0>(sphere); - Simd4f deltaY = positions[1] - splat<1>(sphere); - Simd4f deltaZ = positions[2] - splat<2>(sphere); + T4f deltaX = positions[0] - splat<0>(sphere); + T4f deltaY = positions[1] - splat<1>(sphere); + T4f deltaZ = positions[2] - splat<2>(sphere); - Simd4f sqrDistance = gSimd4fEpsilon + deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ; - Simd4f negativeScale = gSimd4fOne - rsqrt(sqrDistance) * splat<3>(sphere); + T4f sqrDistance = gSimd4fEpsilon + deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ; + T4f negativeScale = gSimd4fOne - rsqrt(sqrDistance) * splat<3>(sphere); - Simd4f contactMask; + T4f contactMask; if (!anyGreater(gSimd4fZero, negativeScale, contactMask)) continue; @@ -696,17 +696,17 @@ FORCE_INLINE void cloth::SwCollision<Simd4f>::collideSpheres(const Simd4i& spher // load previous sphere pos const float* __restrict prevSpherePtr = array(mPrevData.mSpheres->center); - Simd4f prevSphere = loadAligned(prevSpherePtr, offset); - Simd4f velocity = sphere - prevSphere; + T4f prevSphere = loadAligned(prevSpherePtr, offset); + T4f velocity = sphere - prevSphere; accum.addVelocity(splat<0>(velocity), splat<1>(velocity), splat<2>(velocity), contactMask); } } } -template <typename Simd4f> -FORCE_INLINE typename cloth::SwCollision<Simd4f>::Simd4i -cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict positions, ImpulseAccumulator& accum) const +template <typename T4f> +FORCE_INLINE typename cloth::SwCollision<T4f>::T4i +cloth::SwCollision<T4f>::collideCones(const T4f* __restrict positions, ImpulseAccumulator& accum) const { const float* __restrict centerPtr = array(mCurData.mCones->center); const float* __restrict axisPtr = array(mCurData.mCones->axis); @@ -715,7 +715,7 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict positions, Imp bool frictionEnabled = mClothData.mFrictionScale > 0.0f; ShapeMask shapeMask = getShapeMask(positions); - Simd4i mask4 = horizontalOr(shapeMask.mCones); + T4i mask4 = horizontalOr(shapeMask.mCones); uint32_t mask = uint32_t(array(mask4)[0]); while (mask) { @@ -724,35 +724,35 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict positions, Imp uint32_t offset = coneIndex * sizeof(ConeData); mask = mask & test; - Simd4i test4 = mask4 - gSimd4iOne; - Simd4f culled = simd4f(andNotIsZero(shapeMask.mCones, test4)); + T4i test4 = mask4 - gSimd4iOne; + T4f culled = simd4f(andNotIsZero(shapeMask.mCones, test4)); mask4 = mask4 & test4; - Simd4f center = loadAligned(centerPtr, offset); + T4f center = loadAligned(centerPtr, offset); - Simd4f deltaX = positions[0] - splat<0>(center); - Simd4f deltaY = positions[1] - splat<1>(center); - Simd4f deltaZ = positions[2] - splat<2>(center); + T4f deltaX = positions[0] - splat<0>(center); + T4f deltaY = positions[1] - splat<1>(center); + T4f deltaZ = positions[2] - splat<2>(center); - Simd4f axis = loadAligned(axisPtr, offset); + T4f axis = loadAligned(axisPtr, offset); - Simd4f axisX = splat<0>(axis); - Simd4f axisY = splat<1>(axis); - Simd4f axisZ = splat<2>(axis); - Simd4f slope = splat<3>(axis); + T4f axisX = splat<0>(axis); + T4f axisY = splat<1>(axis); + T4f axisZ = splat<2>(axis); + T4f slope = splat<3>(axis); - Simd4f dot = deltaX * axisX + deltaY * axisY + deltaZ * axisZ; - Simd4f radius = dot * slope + splat<3>(center); + T4f dot = deltaX * axisX + deltaY * axisY + deltaZ * axisZ; + T4f radius = dot * slope + splat<3>(center); // set radius to zero if cone is culled radius = max(radius, gSimd4fZero) & ~culled; - Simd4f sqrDistance = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ - dot * dot; + T4f sqrDistance = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ - dot * dot; - Simd4i auxiliary = loadAligned(auxiliaryPtr, offset); - Simd4i bothMask = splat<3>(auxiliary); + T4i auxiliary = loadAligned(auxiliaryPtr, offset); + T4i bothMask = splat<3>(auxiliary); - Simd4f contactMask; + T4f contactMask; if (!anyGreater(radius * radius, sqrDistance, contactMask)) { // cone only culled when spheres culled, ok to clear those too @@ -764,19 +764,19 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict positions, Imp // making sqrDistance negative when point lies on the cone axis sqrDistance = max(sqrDistance, gSimd4fEpsilon); - Simd4f invDistance = rsqrt(sqrDistance); - Simd4f base = dot + slope * sqrDistance * invDistance; + T4f invDistance = rsqrt(sqrDistance); + T4f base = dot + slope * sqrDistance * invDistance; // force left/rightMask to false if not inside cone base = base & contactMask; - Simd4f halfLength = splat<1>(simd4f(auxiliary)); - Simd4i leftMask = simd4i(base < -halfLength); - Simd4i rightMask = simd4i(base > halfLength); + T4f halfLength = splat<1>(simd4f(auxiliary)); + T4i leftMask = simd4i(base < -halfLength); + T4i rightMask = simd4i(base > halfLength); // we use both mask because of the early out above. - Simd4i firstMask = splat<2>(auxiliary); - Simd4i secondMask = firstMask ^ bothMask; + T4i firstMask = splat<2>(auxiliary); + T4i secondMask = firstMask ^ bothMask; shapeMask.mSpheres = shapeMask.mSpheres & ~(firstMask & ~leftMask); shapeMask.mSpheres = shapeMask.mSpheres & ~(secondMask & ~rightMask); @@ -784,8 +784,8 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict positions, Imp deltaY = deltaY - base * axisY; deltaZ = deltaZ - base * axisZ; - Simd4f sqrCosine = splat<0>(simd4f(auxiliary)); - Simd4f scale = radius * invDistance * sqrCosine - sqrCosine; + T4f sqrCosine = splat<0>(simd4f(auxiliary)); + T4f scale = radius * invDistance * sqrCosine - sqrCosine; contactMask = contactMask & ~simd4f(leftMask | rightMask); @@ -804,23 +804,23 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict positions, Imp // todo: could pre-compute sphere velocities or it might be // faster to compute cur/prev sphere positions directly - Simd4f s0p0 = loadAligned(prevSpheres, s0 * sizeof(SphereData)); - Simd4f s0p1 = loadAligned(curSpheres, s0 * sizeof(SphereData)); + T4f s0p0 = loadAligned(prevSpheres, s0 * sizeof(SphereData)); + T4f s0p1 = loadAligned(curSpheres, s0 * sizeof(SphereData)); - Simd4f s1p0 = loadAligned(prevSpheres, s1 * sizeof(SphereData)); - Simd4f s1p1 = loadAligned(curSpheres, s1 * sizeof(SphereData)); + T4f s1p0 = loadAligned(prevSpheres, s1 * sizeof(SphereData)); + T4f s1p1 = loadAligned(curSpheres, s1 * sizeof(SphereData)); - Simd4f v0 = s0p1 - s0p0; - Simd4f v1 = s1p1 - s1p0; - Simd4f vd = v1 - v0; + T4f v0 = s0p1 - s0p0; + T4f v1 = s1p1 - s1p0; + T4f vd = v1 - v0; // dot is in the range -1 to 1, scale and bias to 0 to 1 dot = dot * gSimd4fHalf + gSimd4fHalf; // interpolate velocity at contact points - Simd4f vx = splat<0>(v0) + dot * splat<0>(vd); - Simd4f vy = splat<1>(v0) + dot * splat<1>(vd); - Simd4f vz = splat<2>(v0) + dot * splat<2>(vd); + T4f vx = splat<0>(v0) + dot * splat<0>(vd); + T4f vy = splat<1>(v0) + dot * splat<1>(vd); + T4f vz = splat<2>(v0) + dot * splat<2>(vd); accum.addVelocity(vx, vy, vz, contactMask); } @@ -829,16 +829,16 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict positions, Imp return shapeMask.mSpheres; } -template <typename Simd4f> -FORCE_INLINE void cloth::SwCollision<Simd4f>::collideSpheres(const Simd4i& sphereMask, const Simd4f* __restrict prevPos, - Simd4f* __restrict curPos, ImpulseAccumulator& accum) const +template <typename T4f> +FORCE_INLINE void cloth::SwCollision<T4f>::collideSpheres(const T4i& sphereMask, const T4f* __restrict prevPos, + T4f* __restrict curPos, ImpulseAccumulator& accum) const { const float* __restrict prevSpheres = array(mPrevData.mSpheres->center); const float* __restrict curSpheres = array(mCurData.mSpheres->center); bool frictionEnabled = mClothData.mFrictionScale > 0.0f; - Simd4i mask4 = horizontalOr(sphereMask); + T4i mask4 = horizontalOr(sphereMask); uint32_t mask = uint32_t(array(mask4)[0]); while (mask) { @@ -846,53 +846,53 @@ FORCE_INLINE void cloth::SwCollision<Simd4f>::collideSpheres(const Simd4i& spher uint32_t offset = findBitSet(mask & ~test) * sizeof(SphereData); mask = mask & test; - Simd4f prevSphere = loadAligned(prevSpheres, offset); - Simd4f prevX = prevPos[0] - splat<0>(prevSphere); - Simd4f prevY = prevPos[1] - splat<1>(prevSphere); - Simd4f prevZ = prevPos[2] - splat<2>(prevSphere); - Simd4f prevRadius = splat<3>(prevSphere); + T4f prevSphere = loadAligned(prevSpheres, offset); + T4f prevX = prevPos[0] - splat<0>(prevSphere); + T4f prevY = prevPos[1] - splat<1>(prevSphere); + T4f prevZ = prevPos[2] - splat<2>(prevSphere); + T4f prevRadius = splat<3>(prevSphere); - Simd4f curSphere = loadAligned(curSpheres, offset); - Simd4f curX = curPos[0] - splat<0>(curSphere); - Simd4f curY = curPos[1] - splat<1>(curSphere); - Simd4f curZ = curPos[2] - splat<2>(curSphere); - Simd4f curRadius = splat<3>(curSphere); + T4f curSphere = loadAligned(curSpheres, offset); + T4f curX = curPos[0] - splat<0>(curSphere); + T4f curY = curPos[1] - splat<1>(curSphere); + T4f curZ = curPos[2] - splat<2>(curSphere); + T4f curRadius = splat<3>(curSphere); - Simd4f sqrDistance = gSimd4fEpsilon + curX * curX + curY * curY + curZ * curZ; + T4f sqrDistance = gSimd4fEpsilon + curX * curX + curY * curY + curZ * curZ; - Simd4f dotPrevPrev = prevX * prevX + prevY * prevY + prevZ * prevZ - prevRadius * prevRadius; - Simd4f dotPrevCur = prevX * curX + prevY * curY + prevZ * curZ - prevRadius * curRadius; - Simd4f dotCurCur = sqrDistance - curRadius * curRadius; + T4f dotPrevPrev = prevX * prevX + prevY * prevY + prevZ * prevZ - prevRadius * prevRadius; + T4f dotPrevCur = prevX * curX + prevY * curY + prevZ * curZ - prevRadius * curRadius; + T4f dotCurCur = sqrDistance - curRadius * curRadius; - Simd4f discriminant = dotPrevCur * dotPrevCur - dotCurCur * dotPrevPrev; - Simd4f sqrtD = sqrt(discriminant); - Simd4f halfB = dotPrevCur - dotPrevPrev; - Simd4f minusA = dotPrevCur - dotCurCur + halfB; + T4f discriminant = dotPrevCur * dotPrevCur - dotCurCur * dotPrevPrev; + T4f sqrtD = sqrt(discriminant); + T4f halfB = dotPrevCur - dotPrevPrev; + T4f minusA = dotPrevCur - dotCurCur + halfB; // time of impact or 0 if prevPos inside sphere - Simd4f toi = recip(minusA) * min(gSimd4fZero, halfB + sqrtD); - Simd4f collisionMask = (toi < gSimd4fOne) & (halfB < sqrtD); + T4f toi = recip(minusA) * min(gSimd4fZero, halfB + sqrtD); + T4f collisionMask = (toi < gSimd4fOne) & (halfB < sqrtD); // skip continuous collision if the (un-clamped) particle // trajectory only touches the outer skin of the cone. - Simd4f rMin = prevRadius + halfB * minusA * (curRadius - prevRadius); + T4f rMin = prevRadius + halfB * minusA * (curRadius - prevRadius); collisionMask = collisionMask & (discriminant > minusA * rMin * rMin * sSkeletonWidth); // a is negative when one sphere is contained in the other, // which is already handled by discrete collision. - collisionMask = collisionMask & (minusA < -static_cast<Simd4f>(gSimd4fEpsilon)); + collisionMask = collisionMask & (minusA < -static_cast<T4f>(gSimd4fEpsilon)); if (!allEqual(collisionMask, gSimd4fZero)) { - Simd4f deltaX = prevX - curX; - Simd4f deltaY = prevY - curY; - Simd4f deltaZ = prevZ - curZ; + T4f deltaX = prevX - curX; + T4f deltaY = prevY - curY; + T4f deltaZ = prevZ - curZ; - Simd4f oneMinusToi = (gSimd4fOne - toi) & collisionMask; + T4f oneMinusToi = (gSimd4fOne - toi) & collisionMask; // reduce ccd impulse if (clamped) particle trajectory stays in sphere skin, // i.e. scale by exp2(-k) or 1/(1+k) with k = (tmin - toi) / (1 - toi) - Simd4f minusK = sqrtD * recip(minusA * oneMinusToi) & (oneMinusToi > gSimd4fEpsilon); + T4f minusK = sqrtD * recip(minusA * oneMinusToi) & (oneMinusToi > gSimd4fEpsilon); oneMinusToi = oneMinusToi * recip(gSimd4fOne - minusK); curX = curX + deltaX * oneMinusToi; @@ -906,9 +906,9 @@ FORCE_INLINE void cloth::SwCollision<Simd4f>::collideSpheres(const Simd4i& spher sqrDistance = gSimd4fEpsilon + curX * curX + curY * curY + curZ * curZ; } - Simd4f negativeScale = gSimd4fOne - rsqrt(sqrDistance) * curRadius; + T4f negativeScale = gSimd4fOne - rsqrt(sqrDistance) * curRadius; - Simd4f contactMask; + T4f contactMask; if (!anyGreater(gSimd4fZero, negativeScale, contactMask)) continue; @@ -916,15 +916,15 @@ FORCE_INLINE void cloth::SwCollision<Simd4f>::collideSpheres(const Simd4i& spher if (frictionEnabled) { - Simd4f velocity = curSphere - prevSphere; + T4f velocity = curSphere - prevSphere; accum.addVelocity(splat<0>(velocity), splat<1>(velocity), splat<2>(velocity), contactMask); } } } -template <typename Simd4f> -FORCE_INLINE typename cloth::SwCollision<Simd4f>::Simd4i -cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict prevPos, Simd4f* __restrict curPos, +template <typename T4f> +FORCE_INLINE typename cloth::SwCollision<T4f>::T4i +cloth::SwCollision<T4f>::collideCones(const T4f* __restrict prevPos, T4f* __restrict curPos, ImpulseAccumulator& accum) const { const float* __restrict prevCenterPtr = array(mPrevData.mCones->center); @@ -938,7 +938,7 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict prevPos, Simd4 bool frictionEnabled = mClothData.mFrictionScale > 0.0f; ShapeMask shapeMask = getShapeMask(prevPos, curPos); - Simd4i mask4 = horizontalOr(shapeMask.mCones); + T4i mask4 = horizontalOr(shapeMask.mCones); uint32_t mask = uint32_t(array(mask4)[0]); while (mask) { @@ -947,106 +947,106 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict prevPos, Simd4 uint32_t offset = coneIndex * sizeof(ConeData); mask = mask & test; - Simd4i test4 = mask4 - gSimd4iOne; - Simd4f culled = simd4f(andNotIsZero(shapeMask.mCones, test4)); + T4i test4 = mask4 - gSimd4iOne; + T4f culled = simd4f(andNotIsZero(shapeMask.mCones, test4)); mask4 = mask4 & test4; - Simd4f prevCenter = loadAligned(prevCenterPtr, offset); - Simd4f prevAxis = loadAligned(prevAxisPtr, offset); - Simd4f prevAxisX = splat<0>(prevAxis); - Simd4f prevAxisY = splat<1>(prevAxis); - Simd4f prevAxisZ = splat<2>(prevAxis); - Simd4f prevSlope = splat<3>(prevAxis); - - Simd4f prevX = prevPos[0] - splat<0>(prevCenter); - Simd4f prevY = prevPos[1] - splat<1>(prevCenter); - Simd4f prevZ = prevPos[2] - splat<2>(prevCenter); - Simd4f prevT = prevY * prevAxisZ - prevZ * prevAxisY; - Simd4f prevU = prevZ * prevAxisX - prevX * prevAxisZ; - Simd4f prevV = prevX * prevAxisY - prevY * prevAxisX; - Simd4f prevDot = prevX * prevAxisX + prevY * prevAxisY + prevZ * prevAxisZ; - Simd4f prevRadius = prevDot * prevSlope + splat<3>(prevCenter); - - Simd4f curCenter = loadAligned(curCenterPtr, offset); - Simd4f curAxis = loadAligned(curAxisPtr, offset); - Simd4f curAxisX = splat<0>(curAxis); - Simd4f curAxisY = splat<1>(curAxis); - Simd4f curAxisZ = splat<2>(curAxis); - Simd4f curSlope = splat<3>(curAxis); - Simd4i curAuxiliary = loadAligned(curAuxiliaryPtr, offset); - - Simd4f curX = curPos[0] - splat<0>(curCenter); - Simd4f curY = curPos[1] - splat<1>(curCenter); - Simd4f curZ = curPos[2] - splat<2>(curCenter); - Simd4f curT = curY * curAxisZ - curZ * curAxisY; - Simd4f curU = curZ * curAxisX - curX * curAxisZ; - Simd4f curV = curX * curAxisY - curY * curAxisX; - Simd4f curDot = curX * curAxisX + curY * curAxisY + curZ * curAxisZ; - Simd4f curRadius = curDot * curSlope + splat<3>(curCenter); - - Simd4f curSqrDistance = gSimd4fEpsilon + curT * curT + curU * curU + curV * curV; + T4f prevCenter = loadAligned(prevCenterPtr, offset); + T4f prevAxis = loadAligned(prevAxisPtr, offset); + T4f prevAxisX = splat<0>(prevAxis); + T4f prevAxisY = splat<1>(prevAxis); + T4f prevAxisZ = splat<2>(prevAxis); + T4f prevSlope = splat<3>(prevAxis); + + T4f prevX = prevPos[0] - splat<0>(prevCenter); + T4f prevY = prevPos[1] - splat<1>(prevCenter); + T4f prevZ = prevPos[2] - splat<2>(prevCenter); + T4f prevT = prevY * prevAxisZ - prevZ * prevAxisY; + T4f prevU = prevZ * prevAxisX - prevX * prevAxisZ; + T4f prevV = prevX * prevAxisY - prevY * prevAxisX; + T4f prevDot = prevX * prevAxisX + prevY * prevAxisY + prevZ * prevAxisZ; + T4f prevRadius = prevDot * prevSlope + splat<3>(prevCenter); + + T4f curCenter = loadAligned(curCenterPtr, offset); + T4f curAxis = loadAligned(curAxisPtr, offset); + T4f curAxisX = splat<0>(curAxis); + T4f curAxisY = splat<1>(curAxis); + T4f curAxisZ = splat<2>(curAxis); + T4f curSlope = splat<3>(curAxis); + T4i curAuxiliary = loadAligned(curAuxiliaryPtr, offset); + + T4f curX = curPos[0] - splat<0>(curCenter); + T4f curY = curPos[1] - splat<1>(curCenter); + T4f curZ = curPos[2] - splat<2>(curCenter); + T4f curT = curY * curAxisZ - curZ * curAxisY; + T4f curU = curZ * curAxisX - curX * curAxisZ; + T4f curV = curX * curAxisY - curY * curAxisX; + T4f curDot = curX * curAxisX + curY * curAxisY + curZ * curAxisZ; + T4f curRadius = curDot * curSlope + splat<3>(curCenter); + + T4f curSqrDistance = gSimd4fEpsilon + curT * curT + curU * curU + curV * curV; // set radius to zero if cone is culled prevRadius = max(prevRadius, gSimd4fZero) & ~culled; curRadius = max(curRadius, gSimd4fZero) & ~culled; - Simd4f dotPrevPrev = prevT * prevT + prevU * prevU + prevV * prevV - prevRadius * prevRadius; - Simd4f dotPrevCur = prevT * curT + prevU * curU + prevV * curV - prevRadius * curRadius; - Simd4f dotCurCur = curSqrDistance - curRadius * curRadius; + T4f dotPrevPrev = prevT * prevT + prevU * prevU + prevV * prevV - prevRadius * prevRadius; + T4f dotPrevCur = prevT * curT + prevU * curU + prevV * curV - prevRadius * curRadius; + T4f dotCurCur = curSqrDistance - curRadius * curRadius; - Simd4f discriminant = dotPrevCur * dotPrevCur - dotCurCur * dotPrevPrev; - Simd4f sqrtD = sqrt(discriminant); - Simd4f halfB = dotPrevCur - dotPrevPrev; - Simd4f minusA = dotPrevCur - dotCurCur + halfB; + T4f discriminant = dotPrevCur * dotPrevCur - dotCurCur * dotPrevPrev; + T4f sqrtD = sqrt(discriminant); + T4f halfB = dotPrevCur - dotPrevPrev; + T4f minusA = dotPrevCur - dotCurCur + halfB; // time of impact or 0 if prevPos inside cone - Simd4f toi = recip(minusA) * min(gSimd4fZero, halfB + sqrtD); - Simd4f collisionMask = (toi < gSimd4fOne) & (halfB < sqrtD); + T4f toi = recip(minusA) * min(gSimd4fZero, halfB + sqrtD); + T4f collisionMask = (toi < gSimd4fOne) & (halfB < sqrtD); // skip continuous collision if the (un-clamped) particle // trajectory only touches the outer skin of the cone. - Simd4f rMin = prevRadius + halfB * minusA * (curRadius - prevRadius); + T4f rMin = prevRadius + halfB * minusA * (curRadius - prevRadius); collisionMask = collisionMask & (discriminant > minusA * rMin * rMin * sSkeletonWidth); // a is negative when one cone is contained in the other, // which is already handled by discrete collision. - collisionMask = collisionMask & (minusA < -static_cast<Simd4f>(gSimd4fEpsilon)); + collisionMask = collisionMask & (minusA < -static_cast<T4f>(gSimd4fEpsilon)); // test if any particle hits infinite cone (and 0<time of impact<1) if (!allEqual(collisionMask, gSimd4fZero)) { - Simd4f deltaX = prevX - curX; - Simd4f deltaY = prevY - curY; - Simd4f deltaZ = prevZ - curZ; + T4f deltaX = prevX - curX; + T4f deltaY = prevY - curY; + T4f deltaZ = prevZ - curZ; // interpolate delta at toi - Simd4f posX = prevX - deltaX * toi; - Simd4f posY = prevY - deltaY * toi; - Simd4f posZ = prevZ - deltaZ * toi; + T4f posX = prevX - deltaX * toi; + T4f posY = prevY - deltaY * toi; + T4f posZ = prevZ - deltaZ * toi; - Simd4f curScaledAxis = curAxis * splat<1>(simd4f(curAuxiliary)); - Simd4i prevAuxiliary = loadAligned(prevAuxiliaryPtr, offset); - Simd4f deltaScaledAxis = curScaledAxis - prevAxis * splat<1>(simd4f(prevAuxiliary)); + T4f curScaledAxis = curAxis * splat<1>(simd4f(curAuxiliary)); + T4i prevAuxiliary = loadAligned(prevAuxiliaryPtr, offset); + T4f deltaScaledAxis = curScaledAxis - prevAxis * splat<1>(simd4f(prevAuxiliary)); - Simd4f oneMinusToi = gSimd4fOne - toi; + T4f oneMinusToi = gSimd4fOne - toi; // interpolate axis at toi - Simd4f axisX = splat<0>(curScaledAxis) - splat<0>(deltaScaledAxis) * oneMinusToi; - Simd4f axisY = splat<1>(curScaledAxis) - splat<1>(deltaScaledAxis) * oneMinusToi; - Simd4f axisZ = splat<2>(curScaledAxis) - splat<2>(deltaScaledAxis) * oneMinusToi; - Simd4f slope = (prevSlope * oneMinusToi + curSlope * toi); + T4f axisX = splat<0>(curScaledAxis) - splat<0>(deltaScaledAxis) * oneMinusToi; + T4f axisY = splat<1>(curScaledAxis) - splat<1>(deltaScaledAxis) * oneMinusToi; + T4f axisZ = splat<2>(curScaledAxis) - splat<2>(deltaScaledAxis) * oneMinusToi; + T4f slope = (prevSlope * oneMinusToi + curSlope * toi); - Simd4f sqrHalfLength = axisX * axisX + axisY * axisY + axisZ * axisZ; - Simd4f invHalfLength = rsqrt(sqrHalfLength); - Simd4f dot = (posX * axisX + posY * axisY + posZ * axisZ) * invHalfLength; + T4f sqrHalfLength = axisX * axisX + axisY * axisY + axisZ * axisZ; + T4f invHalfLength = rsqrt(sqrHalfLength); + T4f dot = (posX * axisX + posY * axisY + posZ * axisZ) * invHalfLength; - Simd4f sqrDistance = posX * posX + posY * posY + posZ * posZ - dot * dot; - Simd4f invDistance = rsqrt(sqrDistance) & (sqrDistance > gSimd4fZero); + T4f sqrDistance = posX * posX + posY * posY + posZ * posZ - dot * dot; + T4f invDistance = rsqrt(sqrDistance) & (sqrDistance > gSimd4fZero); - Simd4f base = dot + slope * sqrDistance * invDistance; - Simd4f scale = base * invHalfLength & collisionMask; + T4f base = dot + slope * sqrDistance * invDistance; + T4f scale = base * invHalfLength & collisionMask; - Simd4f cullMask = (abs(scale) < gSimd4fOne) & collisionMask; + T4f cullMask = (abs(scale) < gSimd4fOne) & collisionMask; // test if any impact position is in cone section if (!allEqual(cullMask, gSimd4fZero)) @@ -1060,7 +1060,7 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict prevPos, Simd4 // reduce ccd impulse if (clamped) particle trajectory stays in cone skin, // i.e. scale by exp2(-k) or 1/(1+k) with k = (tmin - toi) / (1 - toi) // oneMinusToi = oneMinusToi * recip(gSimd4fOne - sqrtD * recip(minusA * oneMinusToi)); - Simd4f minusK = sqrtD * recip(minusA * oneMinusToi) & (oneMinusToi > gSimd4fEpsilon); + T4f minusK = sqrtD * recip(minusA * oneMinusToi) & (oneMinusToi > gSimd4fEpsilon); oneMinusToi = oneMinusToi * recip(gSimd4fOne - minusK); curX = curX + deltaX * oneMinusToi; @@ -1079,39 +1079,39 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict prevPos, Simd4 } // curPos inside cone (discrete collision) - Simd4f contactMask; + T4f contactMask; int anyContact = anyGreater(curRadius * curRadius, curSqrDistance, contactMask); - Simd4i bothMask = splat<3>(curAuxiliary); + T4i bothMask = splat<3>(curAuxiliary); // instead of culling continuous collision for ~collisionMask, and discrete // collision for ~contactMask, disable both if ~collisionMask & ~contactMask - Simd4i cullMask = bothMask & ~simd4i(collisionMask | contactMask); + T4i cullMask = bothMask & ~simd4i(collisionMask | contactMask); shapeMask.mSpheres = shapeMask.mSpheres & ~cullMask; if (!anyContact) continue; - Simd4f invDistance = rsqrt(curSqrDistance) & (curSqrDistance > gSimd4fZero); - Simd4f base = curDot + curSlope * curSqrDistance * invDistance; + T4f invDistance = rsqrt(curSqrDistance) & (curSqrDistance > gSimd4fZero); + T4f base = curDot + curSlope * curSqrDistance * invDistance; - Simd4f halfLength = splat<1>(simd4f(curAuxiliary)); - Simd4i leftMask = simd4i(base < -halfLength); - Simd4i rightMask = simd4i(base > halfLength); + T4f halfLength = splat<1>(simd4f(curAuxiliary)); + T4i leftMask = simd4i(base < -halfLength); + T4i rightMask = simd4i(base > halfLength); // can only skip continuous sphere collision if post-ccd position // is on code side *and* particle had cone-ccd collision. - Simd4i firstMask = splat<2>(curAuxiliary); - Simd4i secondMask = firstMask ^ bothMask; + T4i firstMask = splat<2>(curAuxiliary); + T4i secondMask = firstMask ^ bothMask; cullMask = (firstMask & ~leftMask) | (secondMask & ~rightMask); shapeMask.mSpheres = shapeMask.mSpheres & ~(cullMask & simd4i(collisionMask)); - Simd4f deltaX = curX - base * curAxisX; - Simd4f deltaY = curY - base * curAxisY; - Simd4f deltaZ = curZ - base * curAxisZ; + T4f deltaX = curX - base * curAxisX; + T4f deltaY = curY - base * curAxisY; + T4f deltaZ = curZ - base * curAxisZ; - Simd4f sqrCosine = splat<0>(simd4f(curAuxiliary)); - Simd4f scale = curRadius * invDistance * sqrCosine - sqrCosine; + T4f sqrCosine = splat<0>(simd4f(curAuxiliary)); + T4f scale = curRadius * invDistance * sqrCosine - sqrCosine; contactMask = contactMask & ~simd4f(leftMask | rightMask); @@ -1130,23 +1130,23 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict prevPos, Simd4 // todo: could pre-compute sphere velocities or it might be // faster to compute cur/prev sphere positions directly - Simd4f s0p0 = loadAligned(prevSpheres, s0 * sizeof(SphereData)); - Simd4f s0p1 = loadAligned(curSpheres, s0 * sizeof(SphereData)); + T4f s0p0 = loadAligned(prevSpheres, s0 * sizeof(SphereData)); + T4f s0p1 = loadAligned(curSpheres, s0 * sizeof(SphereData)); - Simd4f s1p0 = loadAligned(prevSpheres, s1 * sizeof(SphereData)); - Simd4f s1p1 = loadAligned(curSpheres, s1 * sizeof(SphereData)); + T4f s1p0 = loadAligned(prevSpheres, s1 * sizeof(SphereData)); + T4f s1p1 = loadAligned(curSpheres, s1 * sizeof(SphereData)); - Simd4f v0 = s0p1 - s0p0; - Simd4f v1 = s1p1 - s1p0; - Simd4f vd = v1 - v0; + T4f v0 = s0p1 - s0p0; + T4f v1 = s1p1 - s1p0; + T4f vd = v1 - v0; // dot is in the range -1 to 1, scale and bias to 0 to 1 curDot = curDot * gSimd4fHalf + gSimd4fHalf; // interpolate velocity at contact points - Simd4f vx = splat<0>(v0) + curDot * splat<0>(vd); - Simd4f vy = splat<1>(v0) + curDot * splat<1>(vd); - Simd4f vz = splat<2>(v0) + curDot * splat<2>(vd); + T4f vx = splat<0>(v0) + curDot * splat<0>(vd); + T4f vy = splat<1>(v0) + curDot * splat<1>(vd); + T4f vz = splat<2>(v0) + curDot * splat<2>(vd); accum.addVelocity(vx, vy, vz, contactMask); } @@ -1158,39 +1158,39 @@ cloth::SwCollision<Simd4f>::collideCones(const Simd4f* __restrict prevPos, Simd4 namespace { -template <typename Simd4f> -PX_INLINE void calculateFrictionImpulse(const Simd4f& deltaX, const Simd4f& deltaY, const Simd4f& deltaZ, - const Simd4f& velX, const Simd4f& velY, const Simd4f& velZ, - const Simd4f* curPos, const Simd4f* prevPos, const Simd4f& scale, - const Simd4f& coefficient, const Simd4f& mask, Simd4f* impulse) +template <typename T4f> +PX_INLINE void calculateFrictionImpulse(const T4f& deltaX, const T4f& deltaY, const T4f& deltaZ, + const T4f& velX, const T4f& velY, const T4f& velZ, + const T4f* curPos, const T4f* prevPos, const T4f& scale, + const T4f& coefficient, const T4f& mask, T4f* impulse) { // calculate collision normal - Simd4f deltaSq = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ; + T4f deltaSq = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ; - Simd4f rcpDelta = rsqrt(deltaSq + gSimd4fEpsilon); + T4f rcpDelta = rsqrt(deltaSq + gSimd4fEpsilon); - Simd4f nx = deltaX * rcpDelta; - Simd4f ny = deltaY * rcpDelta; - Simd4f nz = deltaZ * rcpDelta; + T4f nx = deltaX * rcpDelta; + T4f ny = deltaY * rcpDelta; + T4f nz = deltaZ * rcpDelta; // calculate relative velocity scaled by number of collisions - Simd4f rvx = curPos[0] - prevPos[0] - velX * scale; - Simd4f rvy = curPos[1] - prevPos[1] - velY * scale; - Simd4f rvz = curPos[2] - prevPos[2] - velZ * scale; + T4f rvx = curPos[0] - prevPos[0] - velX * scale; + T4f rvy = curPos[1] - prevPos[1] - velY * scale; + T4f rvz = curPos[2] - prevPos[2] - velZ * scale; // calculate magnitude of relative normal velocity - Simd4f rvn = rvx * nx + rvy * ny + rvz * nz; + T4f rvn = rvx * nx + rvy * ny + rvz * nz; // calculate relative tangential velocity - Simd4f rvtx = rvx - rvn * nx; - Simd4f rvty = rvy - rvn * ny; - Simd4f rvtz = rvz - rvn * nz; + T4f rvtx = rvx - rvn * nx; + T4f rvty = rvy - rvn * ny; + T4f rvtz = rvz - rvn * nz; // calculate magnitude of vt - Simd4f rcpVt = rsqrt(rvtx * rvtx + rvty * rvty + rvtz * rvtz + gSimd4fEpsilon); + T4f rcpVt = rsqrt(rvtx * rvtx + rvty * rvty + rvtz * rvtz + gSimd4fEpsilon); // magnitude of friction impulse (cannot be greater than -vt) - Simd4f j = max(-coefficient * deltaSq * rcpDelta * rcpVt, gSimd4fMinusOne) & mask; + T4f j = max(-coefficient * deltaSq * rcpDelta * rcpVt, gSimd4fMinusOne) & mask; impulse[0] = rvtx * j; impulse[1] = rvty * j; @@ -1199,17 +1199,17 @@ PX_INLINE void calculateFrictionImpulse(const Simd4f& deltaX, const Simd4f& delt } // anonymous namespace -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::collideParticles() +template <typename T4f> +void cloth::SwCollision<T4f>::collideParticles() { const bool massScalingEnabled = mClothData.mCollisionMassScale > 0.0f; - const Simd4f massScale = simd4f(mClothData.mCollisionMassScale); + const T4f massScale = simd4f(mClothData.mCollisionMassScale); const bool frictionEnabled = mClothData.mFrictionScale > 0.0f; - const Simd4f frictionScale = simd4f(mClothData.mFrictionScale); + const T4f frictionScale = simd4f(mClothData.mFrictionScale); - Simd4f curPos[4]; - Simd4f prevPos[4]; + T4f curPos[4]; + T4f prevPos[4]; float* __restrict prevIt = mClothData.mPrevParticles; float* __restrict pIt = mClothData.mCurParticles; @@ -1223,14 +1223,14 @@ void cloth::SwCollision<Simd4f>::collideParticles() transpose(curPos[0], curPos[1], curPos[2], curPos[3]); ImpulseAccumulator accum; - Simd4i sphereMask = collideCones(curPos, accum); + T4i sphereMask = collideCones(curPos, accum); collideSpheres(sphereMask, curPos, accum); - Simd4f mask; + T4f mask; if (!anyGreater(accum.mNumCollisions, gSimd4fEpsilon, mask)) continue; - Simd4f invNumCollisions = recip(accum.mNumCollisions); + T4f invNumCollisions = recip(accum.mNumCollisions); if (frictionEnabled) { @@ -1240,7 +1240,7 @@ void cloth::SwCollision<Simd4f>::collideParticles() prevPos[3] = loadAligned(prevIt, 48); transpose(prevPos[0], prevPos[1], prevPos[2], prevPos[3]); - Simd4f frictionImpulse[3]; + T4f frictionImpulse[3]; calculateFrictionImpulse(accum.mDeltaX, accum.mDeltaY, accum.mDeltaZ, accum.mVelX, accum.mVelY, accum.mVelZ, curPos, prevPos, invNumCollisions, frictionScale, mask, frictionImpulse); @@ -1258,10 +1258,10 @@ void cloth::SwCollision<Simd4f>::collideParticles() if (massScalingEnabled) { // calculate the inverse mass scale based on the collision impulse magnitude - Simd4f dSq = invNumCollisions * invNumCollisions * + T4f dSq = invNumCollisions * invNumCollisions * (accum.mDeltaX * accum.mDeltaX + accum.mDeltaY * accum.mDeltaY + accum.mDeltaZ * accum.mDeltaZ); - Simd4f scale = recip(gSimd4fOne + massScale * dSq); + T4f scale = recip(gSimd4fOne + massScale * dSq); // scale invmass curPos[3] = select(mask, curPos[3] * scale, curPos[3]); @@ -1283,24 +1283,24 @@ void cloth::SwCollision<Simd4f>::collideParticles() } } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::collideVirtualParticles() +template <typename T4f> +void cloth::SwCollision<T4f>::collideVirtualParticles() { const bool massScalingEnabled = mClothData.mCollisionMassScale > 0.0f; - const Simd4f massScale = simd4f(mClothData.mCollisionMassScale); + const T4f massScale = simd4f(mClothData.mCollisionMassScale); const bool frictionEnabled = mClothData.mFrictionScale > 0.0f; - const Simd4f frictionScale = simd4f(mClothData.mFrictionScale); + const T4f frictionScale = simd4f(mClothData.mFrictionScale); - Simd4f curPos[3]; + T4f curPos[3]; const float* __restrict weights = mClothData.mVirtualParticleWeights; float* __restrict particles = mClothData.mCurParticles; float* __restrict prevParticles = mClothData.mPrevParticles; // move dummy particles outside of collision range - Simd4f* __restrict dummy = mClothData.mNumParticles + reinterpret_cast<Simd4f*>(mClothData.mCurParticles); - Simd4f invGridScale = recip(mGridScale) & (mGridScale > gSimd4fEpsilon); + T4f* __restrict dummy = mClothData.mNumParticles + reinterpret_cast<T4f*>(mClothData.mCurParticles); + T4f invGridScale = recip(mGridScale) & (mGridScale > gSimd4fEpsilon); dummy[0] = dummy[1] = dummy[2] = invGridScale * mGridBias - invGridScale; const uint16_t* __restrict vpIt = mClothData.mVirtualParticlesBegin; @@ -1308,31 +1308,31 @@ void cloth::SwCollision<Simd4f>::collideVirtualParticles() for (; vpIt != vpEnd; vpIt += 16) { // load 12 particles and 4 weights - Simd4f p0v0 = loadAligned(particles, vpIt[0] * sizeof(PxVec4)); - Simd4f p0v1 = loadAligned(particles, vpIt[1] * sizeof(PxVec4)); - Simd4f p0v2 = loadAligned(particles, vpIt[2] * sizeof(PxVec4)); - Simd4f w0 = loadAligned(weights, vpIt[3] * sizeof(PxVec4)); - - Simd4f p1v0 = loadAligned(particles, vpIt[4] * sizeof(PxVec4)); - Simd4f p1v1 = loadAligned(particles, vpIt[5] * sizeof(PxVec4)); - Simd4f p1v2 = loadAligned(particles, vpIt[6] * sizeof(PxVec4)); - Simd4f w1 = loadAligned(weights, vpIt[7] * sizeof(PxVec4)); - - Simd4f p2v0 = loadAligned(particles, vpIt[8] * sizeof(PxVec4)); - Simd4f p2v1 = loadAligned(particles, vpIt[9] * sizeof(PxVec4)); - Simd4f p2v2 = loadAligned(particles, vpIt[10] * sizeof(PxVec4)); - Simd4f w2 = loadAligned(weights, vpIt[11] * sizeof(PxVec4)); - - Simd4f p3v1 = loadAligned(particles, vpIt[13] * sizeof(PxVec4)); - Simd4f p3v0 = loadAligned(particles, vpIt[12] * sizeof(PxVec4)); - Simd4f p3v2 = loadAligned(particles, vpIt[14] * sizeof(PxVec4)); - Simd4f w3 = loadAligned(weights, vpIt[15] * sizeof(PxVec4)); + T4f p0v0 = loadAligned(particles, vpIt[0] * sizeof(PxVec4)); + T4f p0v1 = loadAligned(particles, vpIt[1] * sizeof(PxVec4)); + T4f p0v2 = loadAligned(particles, vpIt[2] * sizeof(PxVec4)); + T4f w0 = loadAligned(weights, vpIt[3] * sizeof(PxVec4)); + + T4f p1v0 = loadAligned(particles, vpIt[4] * sizeof(PxVec4)); + T4f p1v1 = loadAligned(particles, vpIt[5] * sizeof(PxVec4)); + T4f p1v2 = loadAligned(particles, vpIt[6] * sizeof(PxVec4)); + T4f w1 = loadAligned(weights, vpIt[7] * sizeof(PxVec4)); + + T4f p2v0 = loadAligned(particles, vpIt[8] * sizeof(PxVec4)); + T4f p2v1 = loadAligned(particles, vpIt[9] * sizeof(PxVec4)); + T4f p2v2 = loadAligned(particles, vpIt[10] * sizeof(PxVec4)); + T4f w2 = loadAligned(weights, vpIt[11] * sizeof(PxVec4)); + + T4f p3v1 = loadAligned(particles, vpIt[13] * sizeof(PxVec4)); + T4f p3v0 = loadAligned(particles, vpIt[12] * sizeof(PxVec4)); + T4f p3v2 = loadAligned(particles, vpIt[14] * sizeof(PxVec4)); + T4f w3 = loadAligned(weights, vpIt[15] * sizeof(PxVec4)); // interpolate particles and transpose - Simd4f px = p0v0 * splat<0>(w0) + p0v1 * splat<1>(w0) + p0v2 * splat<2>(w0); - Simd4f py = p1v0 * splat<0>(w1) + p1v1 * splat<1>(w1) + p1v2 * splat<2>(w1); - Simd4f pz = p2v0 * splat<0>(w2) + p2v1 * splat<1>(w2) + p2v2 * splat<2>(w2); - Simd4f pw = p3v0 * splat<0>(w3) + p3v1 * splat<1>(w3) + p3v2 * splat<2>(w3); + T4f px = p0v0 * splat<0>(w0) + p0v1 * splat<1>(w0) + p0v2 * splat<2>(w0); + T4f py = p1v0 * splat<0>(w1) + p1v1 * splat<1>(w1) + p1v2 * splat<2>(w1); + T4f pz = p2v0 * splat<0>(w2) + p2v1 * splat<1>(w2) + p2v2 * splat<2>(w2); + T4f pw = p3v0 * splat<0>(w3) + p3v1 * splat<1>(w3) + p3v2 * splat<2>(w3); transpose(px, py, pz, pw); curPos[0] = px; @@ -1340,55 +1340,55 @@ void cloth::SwCollision<Simd4f>::collideVirtualParticles() curPos[2] = pz; ImpulseAccumulator accum; - Simd4i sphereMask = collideCones(curPos, accum); + T4i sphereMask = collideCones(curPos, accum); collideSpheres(sphereMask, curPos, accum); - Simd4f mask; + T4f mask; if (!anyGreater(accum.mNumCollisions, gSimd4fEpsilon, mask)) continue; - Simd4f invNumCollisions = recip(accum.mNumCollisions); + T4f invNumCollisions = recip(accum.mNumCollisions); // displacement and transpose back - Simd4f d0 = accum.mDeltaX * invNumCollisions; - Simd4f d1 = accum.mDeltaY * invNumCollisions; - Simd4f d2 = accum.mDeltaZ * invNumCollisions; - Simd4f d3 = gSimd4fZero; + T4f d0 = accum.mDeltaX * invNumCollisions; + T4f d1 = accum.mDeltaY * invNumCollisions; + T4f d2 = accum.mDeltaZ * invNumCollisions; + T4f d3 = gSimd4fZero; transpose(d0, d1, d2, d3); // scale weights by 1/dot(w,w) - Simd4f rw0 = w0 * splat<3>(w0); - Simd4f rw1 = w1 * splat<3>(w1); - Simd4f rw2 = w2 * splat<3>(w2); - Simd4f rw3 = w3 * splat<3>(w3); + T4f rw0 = w0 * splat<3>(w0); + T4f rw1 = w1 * splat<3>(w1); + T4f rw2 = w2 * splat<3>(w2); + T4f rw3 = w3 * splat<3>(w3); if (frictionEnabled) { - Simd4f q0v0 = loadAligned(prevParticles, vpIt[0] * sizeof(PxVec4)); - Simd4f q0v1 = loadAligned(prevParticles, vpIt[1] * sizeof(PxVec4)); - Simd4f q0v2 = loadAligned(prevParticles, vpIt[2] * sizeof(PxVec4)); + T4f q0v0 = loadAligned(prevParticles, vpIt[0] * sizeof(PxVec4)); + T4f q0v1 = loadAligned(prevParticles, vpIt[1] * sizeof(PxVec4)); + T4f q0v2 = loadAligned(prevParticles, vpIt[2] * sizeof(PxVec4)); - Simd4f q1v0 = loadAligned(prevParticles, vpIt[4] * sizeof(PxVec4)); - Simd4f q1v1 = loadAligned(prevParticles, vpIt[5] * sizeof(PxVec4)); - Simd4f q1v2 = loadAligned(prevParticles, vpIt[6] * sizeof(PxVec4)); + T4f q1v0 = loadAligned(prevParticles, vpIt[4] * sizeof(PxVec4)); + T4f q1v1 = loadAligned(prevParticles, vpIt[5] * sizeof(PxVec4)); + T4f q1v2 = loadAligned(prevParticles, vpIt[6] * sizeof(PxVec4)); - Simd4f q2v0 = loadAligned(prevParticles, vpIt[8] * sizeof(PxVec4)); - Simd4f q2v1 = loadAligned(prevParticles, vpIt[9] * sizeof(PxVec4)); - Simd4f q2v2 = loadAligned(prevParticles, vpIt[10] * sizeof(PxVec4)); + T4f q2v0 = loadAligned(prevParticles, vpIt[8] * sizeof(PxVec4)); + T4f q2v1 = loadAligned(prevParticles, vpIt[9] * sizeof(PxVec4)); + T4f q2v2 = loadAligned(prevParticles, vpIt[10] * sizeof(PxVec4)); - Simd4f q3v0 = loadAligned(prevParticles, vpIt[12] * sizeof(PxVec4)); - Simd4f q3v1 = loadAligned(prevParticles, vpIt[13] * sizeof(PxVec4)); - Simd4f q3v2 = loadAligned(prevParticles, vpIt[14] * sizeof(PxVec4)); + T4f q3v0 = loadAligned(prevParticles, vpIt[12] * sizeof(PxVec4)); + T4f q3v1 = loadAligned(prevParticles, vpIt[13] * sizeof(PxVec4)); + T4f q3v2 = loadAligned(prevParticles, vpIt[14] * sizeof(PxVec4)); // calculate previous interpolated positions - Simd4f qx = q0v0 * splat<0>(w0) + q0v1 * splat<1>(w0) + q0v2 * splat<2>(w0); - Simd4f qy = q1v0 * splat<0>(w1) + q1v1 * splat<1>(w1) + q1v2 * splat<2>(w1); - Simd4f qz = q2v0 * splat<0>(w2) + q2v1 * splat<1>(w2) + q2v2 * splat<2>(w2); - Simd4f qw = q3v0 * splat<0>(w3) + q3v1 * splat<1>(w3) + q3v2 * splat<2>(w3); + T4f qx = q0v0 * splat<0>(w0) + q0v1 * splat<1>(w0) + q0v2 * splat<2>(w0); + T4f qy = q1v0 * splat<0>(w1) + q1v1 * splat<1>(w1) + q1v2 * splat<2>(w1); + T4f qz = q2v0 * splat<0>(w2) + q2v1 * splat<1>(w2) + q2v2 * splat<2>(w2); + T4f qw = q3v0 * splat<0>(w3) + q3v1 * splat<1>(w3) + q3v2 * splat<2>(w3); transpose(qx, qy, qz, qw); - Simd4f prevPos[3] = { qx, qy, qz }; - Simd4f frictionImpulse[4]; + T4f prevPos[3] = { qx, qy, qz }; + T4f frictionImpulse[4]; frictionImpulse[3] = gSimd4fZero; calculateFrictionImpulse(accum.mDeltaX, accum.mDeltaY, accum.mDeltaZ, accum.mVelX, accum.mVelY, accum.mVelZ, @@ -1433,16 +1433,16 @@ void cloth::SwCollision<Simd4f>::collideVirtualParticles() if (massScalingEnabled) { // calculate the inverse mass scale based on the collision impulse - Simd4f dSq = invNumCollisions * invNumCollisions * + T4f dSq = invNumCollisions * invNumCollisions * (accum.mDeltaX * accum.mDeltaX + accum.mDeltaY * accum.mDeltaY + accum.mDeltaZ * accum.mDeltaZ); - Simd4f weightScale = recip(gSimd4fOne + massScale * dSq); + T4f weightScale = recip(gSimd4fOne + massScale * dSq); weightScale = weightScale - gSimd4fOne; - Simd4f s0 = gSimd4fOne + splat<0>(weightScale) * (w0 & splat<0>(mask)); - Simd4f s1 = gSimd4fOne + splat<1>(weightScale) * (w1 & splat<1>(mask)); - Simd4f s2 = gSimd4fOne + splat<2>(weightScale) * (w2 & splat<2>(mask)); - Simd4f s3 = gSimd4fOne + splat<3>(weightScale) * (w3 & splat<3>(mask)); + T4f s0 = gSimd4fOne + splat<0>(weightScale) * (w0 & splat<0>(mask)); + T4f s1 = gSimd4fOne + splat<1>(weightScale) * (w1 & splat<1>(mask)); + T4f s2 = gSimd4fOne + splat<2>(weightScale) * (w2 & splat<2>(mask)); + T4f s3 = gSimd4fOne + splat<3>(weightScale) * (w3 & splat<3>(mask)); p0v0 = p0v0 * (gSimd4fOneXYZ | (splat<0>(s0) & sMaskW)); p0v1 = p0v1 * (gSimd4fOneXYZ | (splat<1>(s0) & sMaskW)); @@ -1500,17 +1500,17 @@ void cloth::SwCollision<Simd4f>::collideVirtualParticles() } } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::collideContinuousParticles() +template <typename T4f> +void cloth::SwCollision<T4f>::collideContinuousParticles() { - Simd4f curPos[4]; - Simd4f prevPos[4]; + T4f curPos[4]; + T4f prevPos[4]; const bool massScalingEnabled = mClothData.mCollisionMassScale > 0.0f; - const Simd4f massScale = simd4f(mClothData.mCollisionMassScale); + const T4f massScale = simd4f(mClothData.mCollisionMassScale); const bool frictionEnabled = mClothData.mFrictionScale > 0.0f; - const Simd4f frictionScale = simd4f(mClothData.mFrictionScale); + const T4f frictionScale = simd4f(mClothData.mFrictionScale); float* __restrict prevIt = mClothData.mPrevParticles; float* __restrict curIt = mClothData.mCurParticles; @@ -1531,18 +1531,18 @@ void cloth::SwCollision<Simd4f>::collideContinuousParticles() transpose(curPos[0], curPos[1], curPos[2], curPos[3]); ImpulseAccumulator accum; - Simd4i sphereMask = collideCones(prevPos, curPos, accum); + T4i sphereMask = collideCones(prevPos, curPos, accum); collideSpheres(sphereMask, prevPos, curPos, accum); - Simd4f mask; + T4f mask; if (!anyGreater(accum.mNumCollisions, gSimd4fEpsilon, mask)) continue; - Simd4f invNumCollisions = recip(accum.mNumCollisions); + T4f invNumCollisions = recip(accum.mNumCollisions); if (frictionEnabled) { - Simd4f frictionImpulse[3]; + T4f frictionImpulse[3]; calculateFrictionImpulse(accum.mDeltaX, accum.mDeltaY, accum.mDeltaZ, accum.mVelX, accum.mVelY, accum.mVelZ, curPos, prevPos, invNumCollisions, frictionScale, mask, frictionImpulse); @@ -1560,10 +1560,10 @@ void cloth::SwCollision<Simd4f>::collideContinuousParticles() if (massScalingEnabled) { // calculate the inverse mass scale based on the collision impulse magnitude - Simd4f dSq = invNumCollisions * invNumCollisions * + T4f dSq = invNumCollisions * invNumCollisions * (accum.mDeltaX * accum.mDeltaX + accum.mDeltaY * accum.mDeltaY + accum.mDeltaZ * accum.mDeltaZ); - Simd4f weightScale = recip(gSimd4fOne + massScale * dSq); + T4f weightScale = recip(gSimd4fOne + massScale * dSq); // scale invmass curPos[3] = select(mask, curPos[3] * weightScale, curPos[3]); @@ -1585,22 +1585,22 @@ void cloth::SwCollision<Simd4f>::collideContinuousParticles() } } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::collideConvexes(const IterationState<Simd4f>& state) +template <typename T4f> +void cloth::SwCollision<T4f>::collideConvexes(const IterationState<T4f>& state) { if (!mClothData.mNumConvexes) return; // times 2 for plane equation result buffer - Simd4f* planes = static_cast<Simd4f*>(mAllocator.allocate(sizeof(Simd4f) * mClothData.mNumPlanes * 2)); + T4f* planes = static_cast<T4f*>(mAllocator.allocate(sizeof(T4f) * mClothData.mNumPlanes * 2)); - const Simd4f* targetPlanes = reinterpret_cast<const Simd4f*>(mClothData.mTargetCollisionPlanes); + const T4f* targetPlanes = reinterpret_cast<const T4f*>(mClothData.mTargetCollisionPlanes); // generate plane collision data if (state.mRemainingIterations != 1) { // interpolate planes - LerpIterator<Simd4f, const Simd4f*> planeIter(reinterpret_cast<const Simd4f*>(mClothData.mStartCollisionPlanes), + LerpIterator<T4f, const T4f*> planeIter(reinterpret_cast<const T4f*>(mClothData.mStartCollisionPlanes), targetPlanes, state.getCurrentAlpha()); // todo: normalize plane equations @@ -1612,10 +1612,10 @@ void cloth::SwCollision<Simd4f>::collideConvexes(const IterationState<Simd4f>& s generatePlanes(planes, targetPlanes, mClothData.mNumPlanes); } - Simd4f curPos[4], prevPos[4]; + T4f curPos[4], prevPos[4]; const bool frictionEnabled = mClothData.mFrictionScale > 0.0f; - const Simd4f frictionScale = simd4f(mClothData.mFrictionScale); + const T4f frictionScale = simd4f(mClothData.mFrictionScale); float* __restrict curIt = mClothData.mCurParticles; float* __restrict curEnd = curIt + mClothData.mNumParticles * 4; @@ -1631,11 +1631,11 @@ void cloth::SwCollision<Simd4f>::collideConvexes(const IterationState<Simd4f>& s ImpulseAccumulator accum; collideConvexes(planes, curPos, accum); - Simd4f mask; + T4f mask; if (!anyGreater(accum.mNumCollisions, gSimd4fEpsilon, mask)) continue; - Simd4f invNumCollisions = recip(accum.mNumCollisions); + T4f invNumCollisions = recip(accum.mNumCollisions); if (frictionEnabled) { @@ -1645,7 +1645,7 @@ void cloth::SwCollision<Simd4f>::collideConvexes(const IterationState<Simd4f>& s prevPos[3] = loadAligned(prevIt, 48); transpose(prevPos[0], prevPos[1], prevPos[2], prevPos[3]); - Simd4f frictionImpulse[3]; + T4f frictionImpulse[3]; calculateFrictionImpulse(accum.mDeltaX, accum.mDeltaY, accum.mDeltaZ, accum.mVelX, accum.mVelY, accum.mVelZ, curPos, prevPos, invNumCollisions, frictionScale, mask, frictionImpulse); @@ -1678,20 +1678,20 @@ void cloth::SwCollision<Simd4f>::collideConvexes(const IterationState<Simd4f>& s mAllocator.deallocate(planes); } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::collideConvexes(const Simd4f* __restrict planes, Simd4f* __restrict curPos, +template <typename T4f> +void cloth::SwCollision<T4f>::collideConvexes(const T4f* __restrict planes, T4f* __restrict curPos, ImpulseAccumulator& accum) { - Simd4i result = gSimd4iZero; - Simd4i mask4 = gSimd4iOne; + T4i result = gSimd4iZero; + T4i mask4 = gSimd4iOne; - const Simd4f* __restrict pIt, *pEnd = planes + mClothData.mNumPlanes; - Simd4f* __restrict dIt = const_cast<Simd4f*>(pEnd); + const T4f* __restrict pIt, *pEnd = planes + mClothData.mNumPlanes; + T4f* __restrict dIt = const_cast<T4f*>(pEnd); for (pIt = planes; pIt != pEnd; ++pIt, ++dIt) { *dIt = splat<3>(*pIt) + curPos[2] * splat<2>(*pIt) + curPos[1] * splat<1>(*pIt) + curPos[0] * splat<0>(*pIt); result = result | (mask4 & simd4i(*dIt < gSimd4fZero)); - mask4 = mask4 << 1; // todo: shift by Simd4i on consoles + mask4 = mask4 << 1; // todo: shift by T4i on consoles } if (allEqual(result, gSimd4iZero)) @@ -1708,18 +1708,18 @@ void cloth::SwCollision<Simd4f>::collideConvexes(const Simd4f* __restrict planes uint32_t test = mask - 1; uint32_t planeIndex = findBitSet(mask & ~test); - Simd4f plane = planes[planeIndex]; - Simd4f planeX = splat<0>(plane); - Simd4f planeY = splat<1>(plane); - Simd4f planeZ = splat<2>(plane); - Simd4f planeD = pEnd[planeIndex]; + T4f plane = planes[planeIndex]; + T4f planeX = splat<0>(plane); + T4f planeY = splat<1>(plane); + T4f planeZ = splat<2>(plane); + T4f planeD = pEnd[planeIndex]; while (mask &= test) { test = mask - 1; planeIndex = findBitSet(mask & ~test); plane = planes[planeIndex]; - Simd4f dist = pEnd[planeIndex]; - Simd4f closer = dist > planeD; + T4f dist = pEnd[planeIndex]; + T4f closer = dist > planeD; planeX = select(closer, splat<0>(plane), planeX); planeY = select(closer, splat<1>(plane), planeY); planeZ = select(closer, splat<2>(plane), planeZ); @@ -1730,8 +1730,8 @@ void cloth::SwCollision<Simd4f>::collideConvexes(const Simd4f* __restrict planes } } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::collideTriangles(const IterationState<Simd4f>& state) +template <typename T4f> +void cloth::SwCollision<T4f>::collideTriangles(const IterationState<T4f>& state) { if (!mClothData.mNumCollisionTriangles) return; @@ -1739,24 +1739,24 @@ void cloth::SwCollision<Simd4f>::collideTriangles(const IterationState<Simd4f>& TriangleData* triangles = static_cast<TriangleData*>(mAllocator.allocate(sizeof(TriangleData) * mClothData.mNumCollisionTriangles)); - UnalignedIterator<Simd4f, 3> targetTriangles(mClothData.mTargetCollisionTriangles); + UnalignedIterator<T4f, 3> targetTriangles(mClothData.mTargetCollisionTriangles); // generate triangle collision data if (state.mRemainingIterations != 1) { // interpolate triangles - LerpIterator<Simd4f, UnalignedIterator<Simd4f, 3> > triangleIter(mClothData.mStartCollisionTriangles, + LerpIterator<T4f, UnalignedIterator<T4f, 3> > triangleIter(mClothData.mStartCollisionTriangles, targetTriangles, state.getCurrentAlpha()); - generateTriangles<Simd4f>(triangles, triangleIter, mClothData.mNumCollisionTriangles); + generateTriangles<T4f>(triangles, triangleIter, mClothData.mNumCollisionTriangles); } else { // otherwise use the target triangles directly - generateTriangles<Simd4f>(triangles, targetTriangles, mClothData.mNumCollisionTriangles); + generateTriangles<T4f>(triangles, targetTriangles, mClothData.mNumCollisionTriangles); } - Simd4f positions[4]; + T4f positions[4]; float* __restrict pIt = mClothData.mCurParticles; float* __restrict pEnd = pIt + mClothData.mNumParticles * 4; @@ -1771,11 +1771,11 @@ void cloth::SwCollision<Simd4f>::collideTriangles(const IterationState<Simd4f>& ImpulseAccumulator accum; collideTriangles(triangles, positions, accum); - Simd4f mask; + T4f mask; if (!anyGreater(accum.mNumCollisions, gSimd4fEpsilon, mask)) continue; - Simd4f invNumCollisions = recip(accum.mNumCollisions); + T4f invNumCollisions = recip(accum.mNumCollisions); positions[0] = positions[0] + accum.mDeltaX * invNumCollisions; positions[1] = positions[1] + accum.mDeltaY * invNumCollisions; @@ -1795,60 +1795,60 @@ void cloth::SwCollision<Simd4f>::collideTriangles(const IterationState<Simd4f>& mAllocator.deallocate(triangles); } -template <typename Simd4f> -void cloth::SwCollision<Simd4f>::collideTriangles(const TriangleData* __restrict triangles, Simd4f* __restrict curPos, +template <typename T4f> +void cloth::SwCollision<T4f>::collideTriangles(const TriangleData* __restrict triangles, T4f* __restrict curPos, ImpulseAccumulator& accum) { - Simd4f normalX, normalY, normalZ, normalD; + T4f normalX, normalY, normalZ, normalD; normalX = normalY = normalZ = normalD = gSimd4fZero; - Simd4f minSqrLength = gSimd4fFloatMax; + T4f minSqrLength = gSimd4fFloatMax; const TriangleData* __restrict tIt, *tEnd = triangles + mClothData.mNumCollisionTriangles; for (tIt = triangles; tIt != tEnd; ++tIt) { - Simd4f base = loadAligned(&tIt->base.x); - Simd4f edge0 = loadAligned(&tIt->edge0.x); - Simd4f edge1 = loadAligned(&tIt->edge1.x); - Simd4f normal = loadAligned(&tIt->normal.x); - Simd4f aux = loadAligned(&tIt->det); + T4f base = loadAligned(&tIt->base.x); + T4f edge0 = loadAligned(&tIt->edge0.x); + T4f edge1 = loadAligned(&tIt->edge1.x); + T4f normal = loadAligned(&tIt->normal.x); + T4f aux = loadAligned(&tIt->det); - Simd4f dx = curPos[0] - splat<0>(base); - Simd4f dy = curPos[1] - splat<1>(base); - Simd4f dz = curPos[2] - splat<2>(base); + T4f dx = curPos[0] - splat<0>(base); + T4f dy = curPos[1] - splat<1>(base); + T4f dz = curPos[2] - splat<2>(base); - Simd4f e0x = splat<0>(edge0); - Simd4f e0y = splat<1>(edge0); - Simd4f e0z = splat<2>(edge0); + T4f e0x = splat<0>(edge0); + T4f e0y = splat<1>(edge0); + T4f e0z = splat<2>(edge0); - Simd4f e1x = splat<0>(edge1); - Simd4f e1y = splat<1>(edge1); - Simd4f e1z = splat<2>(edge1); + T4f e1x = splat<0>(edge1); + T4f e1y = splat<1>(edge1); + T4f e1z = splat<2>(edge1); - Simd4f nx = splat<0>(normal); - Simd4f ny = splat<1>(normal); - Simd4f nz = splat<2>(normal); + T4f nx = splat<0>(normal); + T4f ny = splat<1>(normal); + T4f nz = splat<2>(normal); - Simd4f deltaDotEdge0 = dx * e0x + dy * e0y + dz * e0z; - Simd4f deltaDotEdge1 = dx * e1x + dy * e1y + dz * e1z; - Simd4f deltaDotNormal = dx * nx + dy * ny + dz * nz; + T4f deltaDotEdge0 = dx * e0x + dy * e0y + dz * e0z; + T4f deltaDotEdge1 = dx * e1x + dy * e1y + dz * e1z; + T4f deltaDotNormal = dx * nx + dy * ny + dz * nz; - Simd4f edge0DotEdge1 = splat<3>(base); - Simd4f edge0SqrLength = splat<3>(edge0); - Simd4f edge1SqrLength = splat<3>(edge1); + T4f edge0DotEdge1 = splat<3>(base); + T4f edge0SqrLength = splat<3>(edge0); + T4f edge1SqrLength = splat<3>(edge1); - Simd4f s = edge1SqrLength * deltaDotEdge0 - edge0DotEdge1 * deltaDotEdge1; - Simd4f t = edge0SqrLength * deltaDotEdge1 - edge0DotEdge1 * deltaDotEdge0; + T4f s = edge1SqrLength * deltaDotEdge0 - edge0DotEdge1 * deltaDotEdge1; + T4f t = edge0SqrLength * deltaDotEdge1 - edge0DotEdge1 * deltaDotEdge0; - Simd4f sPositive = s > gSimd4fZero; - Simd4f tPositive = t > gSimd4fZero; + T4f sPositive = s > gSimd4fZero; + T4f tPositive = t > gSimd4fZero; - Simd4f det = splat<0>(aux); + T4f det = splat<0>(aux); s = select(tPositive, s * det, deltaDotEdge0 * splat<2>(aux)); t = select(sPositive, t * det, deltaDotEdge1 * splat<3>(aux)); - Simd4f clamp = gSimd4fOne < s + t; - Simd4f numerator = edge1SqrLength - edge0DotEdge1 + deltaDotEdge0 - deltaDotEdge1; + T4f clamp = gSimd4fOne < s + t; + T4f numerator = edge1SqrLength - edge0DotEdge1 + deltaDotEdge0 - deltaDotEdge1; s = select(clamp, numerator * splat<1>(aux), s); @@ -1859,13 +1859,13 @@ void cloth::SwCollision<Simd4f>::collideTriangles(const TriangleData* __restrict dy = dy - e0y * s - e1y * t; dz = dz - e0z * s - e1z * t; - Simd4f sqrLength = dx * dx + dy * dy + dz * dz; + T4f sqrLength = dx * dx + dy * dy + dz * dz; // slightly increase distance for colliding triangles - Simd4f slack = (gSimd4fZero > deltaDotNormal) & simd4f(1e-4f); + T4f slack = (gSimd4fZero > deltaDotNormal) & simd4f(1e-4f); sqrLength = sqrLength + sqrLength * slack; - Simd4f mask = sqrLength < minSqrLength; + T4f mask = sqrLength < minSqrLength; normalX = select(mask, nx, normalX); normalY = select(mask, ny, normalY); @@ -1875,7 +1875,7 @@ void cloth::SwCollision<Simd4f>::collideTriangles(const TriangleData* __restrict minSqrLength = min(sqrLength, minSqrLength); } - Simd4f mask; + T4f mask; if (!anyGreater(gSimd4fZero, normalD, mask)) return; diff --git a/NvCloth/src/SwCollision.h b/NvCloth/src/SwCollision.h index 8d5746c..5806b2e 100644 --- a/NvCloth/src/SwCollision.h +++ b/NvCloth/src/SwCollision.h @@ -52,16 +52,16 @@ typedef StackAllocator<16> SwKernelAllocator; /** Collision handler for SwSolver. */ -template <typename Simd4f> +template <typename T4f> class SwCollision { - typedef typename Simd4fToSimd4i<Simd4f>::Type Simd4i; + typedef typename Simd4fToSimd4i<T4f>::Type T4i; public: struct ShapeMask { - Simd4i mCones; - Simd4i mSpheres; + T4i mCones; + T4i mSpheres; ShapeMask& operator = (const ShapeMask&); ShapeMask& operator &= (const ShapeMask&); @@ -80,7 +80,7 @@ class SwCollision SwCollision(SwClothData& clothData, SwKernelAllocator& alloc); ~SwCollision(); - void operator()(const IterationState<Simd4f>& state); + void operator()(const IterationState<T4f>& state); static size_t estimateTemporaryMemory(const SwCloth& cloth); static size_t estimatePersistentMemory(const SwCloth& cloth); @@ -97,32 +97,32 @@ class SwCollision static void mergeAcceleration(uint32_t*); bool buildAcceleration(); - static ShapeMask getShapeMask(const Simd4f&, const Simd4i*, const Simd4i*); - ShapeMask getShapeMask(const Simd4f*) const; - ShapeMask getShapeMask(const Simd4f*, const Simd4f*) const; + static ShapeMask getShapeMask(const T4f&, const T4i*, const T4i*); + ShapeMask getShapeMask(const T4f*) const; + ShapeMask getShapeMask(const T4f*, const T4f*) const; - void collideSpheres(const Simd4i&, const Simd4f*, ImpulseAccumulator&) const; - Simd4i collideCones(const Simd4f*, ImpulseAccumulator&) const; + void collideSpheres(const T4i&, const T4f*, ImpulseAccumulator&) const; + T4i collideCones(const T4f*, ImpulseAccumulator&) const; - void collideSpheres(const Simd4i&, const Simd4f*, Simd4f*, ImpulseAccumulator&) const; - Simd4i collideCones(const Simd4f*, Simd4f*, ImpulseAccumulator&) const; + void collideSpheres(const T4i&, const T4f*, T4f*, ImpulseAccumulator&) const; + T4i collideCones(const T4f*, T4f*, ImpulseAccumulator&) const; void collideParticles(); void collideVirtualParticles(); void collideContinuousParticles(); - void collideConvexes(const IterationState<Simd4f>&); - void collideConvexes(const Simd4f*, Simd4f*, ImpulseAccumulator&); + void collideConvexes(const IterationState<T4f>&); + void collideConvexes(const T4f*, T4f*, ImpulseAccumulator&); - void collideTriangles(const IterationState<Simd4f>&); - void collideTriangles(const TriangleData*, Simd4f*, ImpulseAccumulator&); + void collideTriangles(const IterationState<T4f>&); + void collideTriangles(const TriangleData*, T4f*, ImpulseAccumulator&); public: // acceleration structure static const uint32_t sGridSize = 8; - Simd4i mSphereGrid[6 * sGridSize / 4]; - Simd4i mConeGrid[6 * sGridSize / 4]; - Simd4f mGridScale, mGridBias; + T4i mSphereGrid[6 * sGridSize / 4]; + T4i mConeGrid[6 * sGridSize / 4]; + T4f mGridScale, mGridBias; CollisionData mPrevData; CollisionData mCurData; @@ -132,8 +132,16 @@ class SwCollision uint32_t mNumCollisions; - static const Simd4f sSkeletonWidth; + static const T4f sSkeletonWidth; }; +//explicit template instantiation declaration +#if NV_SIMD_SIMD +extern template class SwCollision<Simd4f>; +#endif +#if NV_SIMD_SCALAR +extern template class SwCollision<Scalar4f>; +#endif + } // namespace cloth } // namespace nv diff --git a/NvCloth/src/SwFabric.cpp b/NvCloth/src/SwFabric.cpp index 6309c80..9830398 100644 --- a/NvCloth/src/SwFabric.cpp +++ b/NvCloth/src/SwFabric.cpp @@ -27,7 +27,6 @@ // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#include "foundation/PxAssert.h" #include "SwFabric.h" #include "SwFactory.h" #include "PsSort.h" diff --git a/NvCloth/src/SwFactory.cpp b/NvCloth/src/SwFactory.cpp index 418eb13..6f46c96 100644 --- a/NvCloth/src/SwFactory.cpp +++ b/NvCloth/src/SwFactory.cpp @@ -31,7 +31,6 @@ #include "SwFabric.h" #include "SwCloth.h" #include "SwSolver.h" -#include "ClothImpl.h" #include <string.h> // for memcpy using namespace nv; @@ -66,7 +65,7 @@ cloth::Fabric* cloth::SwFactory::createFabric(uint32_t numParticles, Range<const cloth::Cloth* cloth::SwFactory::createCloth(Range<const PxVec4> particles, Fabric& fabric) { - return NV_CLOTH_NEW(SwClothImpl)(*this, fabric, particles); + return NV_CLOTH_NEW(SwCloth)(*this, static_cast<SwFabric&>(fabric), particles); } cloth::Solver* cloth::SwFactory::createSolver() @@ -80,7 +79,7 @@ cloth::Cloth* cloth::SwFactory::clone(const Cloth& cloth) return cloth.clone(*this); // forward to CuCloth // copy construct - return NV_CLOTH_NEW(SwClothImpl)(*this, static_cast<const SwClothImpl&>(cloth)); + return NV_CLOTH_NEW(SwCloth)(*this, static_cast<const SwCloth&>(cloth)); } void cloth::SwFactory::extractFabricData(const Fabric& fabric, Range<uint32_t> phaseIndices, Range<uint32_t> sets, @@ -157,7 +156,7 @@ void cloth::SwFactory::extractCollisionData(const Cloth& cloth, Range<PxVec4> sp { NV_CLOTH_ASSERT(&cloth.getFactory() == this); - const SwCloth& swCloth = static_cast<const SwClothImpl&>(cloth).mCloth; + const SwCloth& swCloth = static_cast<const SwCloth&>(cloth); NV_CLOTH_ASSERT(spheres.empty() || spheres.size() == swCloth.mStartCollisionSpheres.size()); NV_CLOTH_ASSERT(capsules.empty() || capsules.size() == swCloth.mCapsuleIndices.size() * 2); @@ -188,7 +187,7 @@ void cloth::SwFactory::extractMotionConstraints(const Cloth& cloth, Range<PxVec4 { NV_CLOTH_ASSERT(&cloth.getFactory() == this); - const SwCloth& swCloth = static_cast<const SwClothImpl&>(cloth).mCloth; + const SwCloth& swCloth = static_cast<const SwCloth&>(cloth); Vector<PxVec4>::Type const& srcConstraints = !swCloth.mMotionConstraints.mTarget.empty() ? swCloth.mMotionConstraints.mTarget @@ -207,7 +206,7 @@ void cloth::SwFactory::extractSeparationConstraints(const Cloth& cloth, Range<Px { NV_CLOTH_ASSERT(&cloth.getFactory() == this); - const SwCloth& swCloth = static_cast<const SwClothImpl&>(cloth).mCloth; + const SwCloth& swCloth = static_cast<const SwCloth&>(cloth); Vector<PxVec4>::Type const& srcConstraints = !swCloth.mSeparationConstraints.mTarget.empty() ? swCloth.mSeparationConstraints.mTarget @@ -226,7 +225,7 @@ void cloth::SwFactory::extractParticleAccelerations(const Cloth& cloth, Range<Px { NV_CLOTH_ASSERT(&cloth.getFactory() == this); - const SwCloth& swCloth = static_cast<const SwClothImpl&>(cloth).mCloth; + const SwCloth& swCloth = static_cast<const SwCloth&>(cloth); if (!swCloth.mParticleAccelerations.empty()) { @@ -242,7 +241,7 @@ void cloth::SwFactory::extractVirtualParticles(const Cloth& cloth, Range<uint32_ { NV_CLOTH_ASSERT(this == &cloth.getFactory()); - const SwCloth& swCloth = static_cast<const SwClothImpl&>(cloth).mCloth; + const SwCloth& swCloth = static_cast<const SwCloth&>(cloth); uint32_t numIndices = cloth.getNumVirtualParticles(); uint32_t numWeights = cloth.getNumVirtualParticleWeights(); @@ -286,14 +285,14 @@ void cloth::SwFactory::extractVirtualParticles(const Cloth& cloth, Range<uint32_ void cloth::SwFactory::extractSelfCollisionIndices(const Cloth& cloth, Range<uint32_t> destIndices) const { - const SwCloth& swCloth = static_cast<const SwClothImpl&>(cloth).mCloth; + const SwCloth& swCloth = static_cast<const SwCloth&>(cloth); NV_CLOTH_ASSERT(destIndices.size() == swCloth.mSelfCollisionIndices.size()); memcpy(destIndices.begin(), swCloth.mSelfCollisionIndices.begin(), destIndices.size() * sizeof(uint32_t)); } void cloth::SwFactory::extractRestPositions(const Cloth& cloth, Range<PxVec4> destRestPositions) const { - const SwCloth& swCloth = static_cast<const SwClothImpl&>(cloth).mCloth; + const SwCloth& swCloth = static_cast<const SwCloth&>(cloth); NV_CLOTH_ASSERT(destRestPositions.size() == swCloth.mRestPositions.size()); memcpy(destRestPositions.begin(), swCloth.mRestPositions.begin(), destRestPositions.size() * sizeof(PxVec4)); } diff --git a/NvCloth/src/SwFactory.h b/NvCloth/src/SwFactory.h index e0caf87..4cbee0c 100644 --- a/NvCloth/src/SwFactory.h +++ b/NvCloth/src/SwFactory.h @@ -48,7 +48,7 @@ class SwFactory : public Factory { public: typedef SwFabric FabricType; - typedef ClothImpl<SwCloth> ImplType; + typedef SwCloth ClothType; SwFactory(); virtual ~SwFactory(); diff --git a/NvCloth/src/SwInterCollision.cpp b/NvCloth/src/SwInterCollision.cpp index 6d5e013..b9b494f 100644 --- a/NvCloth/src/SwInterCollision.cpp +++ b/NvCloth/src/SwInterCollision.cpp @@ -73,16 +73,16 @@ void radixSort(const uint32_t* first, const uint32_t* last, uint32_t* out) for (uint32_t i = 0; i < 256; ++i) { uint32_t temp0 = histograms[0][i] + sums[0]; - histograms[0][i] = sums[0], sums[0] = temp0; + histograms[0][i] = sums[0]; sums[0] = temp0; uint32_t temp1 = histograms[1][i] + sums[1]; - histograms[1][i] = sums[1], sums[1] = temp1; + histograms[1][i] = sums[1]; sums[1] = temp1; uint32_t temp2 = histograms[2][i] + sums[2]; - histograms[2][i] = sums[2], sums[2] = temp2; + histograms[2][i] = sums[2]; sums[2] = temp2; uint32_t temp3 = histograms[3][i] + sums[3]; - histograms[3][i] = sums[3], sums[3] = temp3; + histograms[3][i] = sums[3]; sums[3] = temp3; } NV_CLOTH_ASSERT(sums[0] == n && sums[1] == n && sums[2] == n && sums[3] == n); @@ -98,18 +98,27 @@ void radixSort(const uint32_t* first, const uint32_t* last, uint32_t* out) for (uint32_t i = 0; i != n; ++i) indices[1][histograms[0][0xff & first[i]]++] = i; - for (uint32_t i = 0, index; index = indices[1][i], i != n; ++i) + for (uint32_t i = 0, index; i != n; ++i) + { + index = indices[1][i]; indices[0][histograms[1][0xff & (first[index] >> 8)]++] = index; + } - for (uint32_t i = 0, index; index = indices[0][i], i != n; ++i) + for (uint32_t i = 0, index; i != n; ++i) + { + index = indices[0][i]; indices[1][histograms[2][0xff & (first[index] >> 16)]++] = index; + } - for (uint32_t i = 0, index; index = indices[1][i], i != n; ++i) + for (uint32_t i = 0, index; i != n; ++i) + { + index = indices[1][i]; indices[0][histograms[3][first[index] >> 24]++] = index; + } } -template <typename Simd4f> -uint32_t longestAxis(const Simd4f& edgeLength) +template <typename T4f> +uint32_t longestAxis(const T4f& edgeLength) { const float* e = array(edgeLength); @@ -120,8 +129,8 @@ uint32_t longestAxis(const Simd4f& edgeLength) } } -template <typename Simd4f> -cloth::SwInterCollision<Simd4f>::SwInterCollision(const cloth::SwInterCollisionData* instances, uint32_t n, +template <typename T4f> +cloth::SwInterCollision<T4f>::SwInterCollision(const cloth::SwInterCollisionData* instances, uint32_t n, float colDist, float stiffness, uint32_t iterations, InterCollisionFilter filter, cloth::SwKernelAllocator& alloc) : mInstances(instances) @@ -145,33 +154,33 @@ cloth::SwInterCollision<Simd4f>::SwInterCollision(const cloth::SwInterCollisionD mTotalParticles += instances[i].mNumParticles; } -template <typename Simd4f> -cloth::SwInterCollision<Simd4f>::~SwInterCollision() +template <typename T4f> +cloth::SwInterCollision<T4f>::~SwInterCollision() { } namespace { // multiple x by m leaving w component of x intact -template <typename Simd4f> -PX_INLINE Simd4f transform(const Simd4f m[4], const Simd4f& x) +template <typename T4f> +PX_INLINE T4f transform(const T4f m[4], const T4f& x) { - const Simd4f a = m[3] + splat<0>(x) * m[0] + splat<1>(x) * m[1] + splat<2>(x) * m[2]; + const T4f a = m[3] + splat<0>(x) * m[0] + splat<1>(x) * m[1] + splat<2>(x) * m[2]; return select(sMaskXYZ, a, x); } // rotate x by m leaving w component intact -template <typename Simd4f> -PX_INLINE Simd4f rotate(const Simd4f m[4], const Simd4f& x) +template <typename T4f> +PX_INLINE T4f rotate(const T4f m[4], const T4f& x) { - const Simd4f a = splat<0>(x) * m[0] + splat<1>(x) * m[1] + splat<2>(x) * m[2]; + const T4f a = splat<0>(x) * m[0] + splat<1>(x) * m[1] + splat<2>(x) * m[2]; return select(sMaskXYZ, a, x); } -template <typename Simd4f> +template <typename T4f> struct ClothSorter { - typedef cloth::BoundingBox<Simd4f> BoundingBox; + typedef cloth::BoundingBox<T4f> BoundingBox; ClothSorter(BoundingBox* bounds, uint32_t n, uint32_t axis) : mBounds(bounds), mNumBounds(n), mAxis(axis) { @@ -194,15 +203,15 @@ struct ClothSorter // which potentially interact, the potential colliders are returned with their // cloth index and particle index in clothIndices and particleIndices, the // function returns the number of potential colliders -template <typename Simd4f> +template <typename T4f> uint32_t calculatePotentialColliders(const cloth::SwInterCollisionData* cBegin, const cloth::SwInterCollisionData* cEnd, - const Simd4f& colDist, uint16_t* clothIndices, uint32_t* particleIndices, - cloth::BoundingBox<Simd4f>& bounds, uint32_t* overlapMasks, + const T4f& colDist, uint16_t* clothIndices, uint32_t* particleIndices, + cloth::BoundingBox<T4f>& bounds, uint32_t* overlapMasks, cloth::InterCollisionFilter filter, cloth::SwKernelAllocator& allocator) { using namespace cloth; - typedef BoundingBox<Simd4f> BoundingBox; + typedef BoundingBox<T4f> BoundingBox; uint32_t numParticles = 0; const uint32_t numCloths = uint32_t(cEnd - cBegin); @@ -212,7 +221,7 @@ uint32_t calculatePotentialColliders(const cloth::SwInterCollisionData* cBegin, BoundingBox* const overlapBounds = static_cast<BoundingBox*>(allocator.allocate(numCloths * sizeof(BoundingBox))); // union of all cloth world bounds - BoundingBox totalClothBounds = emptyBounds<Simd4f>(); + BoundingBox totalClothBounds = emptyBounds<T4f>(); uint32_t* sortedIndices = static_cast<uint32_t*>(allocator.allocate(numCloths * sizeof(uint32_t))); @@ -237,7 +246,7 @@ uint32_t calculatePotentialColliders(const cloth::SwInterCollisionData* cBegin, // sort indices by their minimum extent on the longest axis const uint32_t sweepAxis = longestAxis(totalClothBounds.mUpper - totalClothBounds.mLower); - ClothSorter<Simd4f> predicate(clothBounds, numCloths, sweepAxis); + ClothSorter<T4f> predicate(clothBounds, numCloths, sweepAxis); shdfnd::sort(sortedIndices, numCloths, predicate, nv::cloth::NonTrackingAllocator()); for (uint32_t i = 0; i < numCloths; ++i) @@ -247,8 +256,8 @@ uint32_t calculatePotentialColliders(const cloth::SwInterCollisionData* cBegin, const SwInterCollisionData& a = cBegin[sortedIndices[i]]; // local bounds - const Simd4f aCenter = load(reinterpret_cast<const float*>(&a.mBoundsCenter)); - const Simd4f aHalfExtent = load(reinterpret_cast<const float*>(&a.mBoundsHalfExtent)) + colDist; + const T4f aCenter = load(reinterpret_cast<const float*>(&a.mBoundsCenter)); + const T4f aHalfExtent = load(reinterpret_cast<const float*>(&a.mBoundsHalfExtent)) + colDist; const BoundingBox aBounds = { aCenter - aHalfExtent, aCenter + aHalfExtent }; const PxMat44 aToWorld = PxMat44(a.mGlobalPose); @@ -296,7 +305,7 @@ uint32_t calculatePotentialColliders(const cloth::SwInterCollisionData* cBegin, BoundingBox iBounds = intersectBounds(aBounds, bBounds); // setup bounding box w to make point containment test cheaper - Simd4f floatMax = gSimd4fFloatMax & static_cast<Simd4f>(sMaskW); + T4f floatMax = gSimd4fFloatMax & static_cast<T4f>(sMaskW); iBounds.mLower = (iBounds.mLower & sMaskXYZ) | -floatMax; iBounds.mUpper = (iBounds.mUpper & sMaskXYZ) | floatMax; @@ -310,22 +319,22 @@ uint32_t calculatePotentialColliders(const cloth::SwInterCollisionData* cBegin, const uint32_t clothIndex = sortedIndices[i]; overlapMasks[clothIndex] = overlapMask; - Simd4f* pBegin = reinterpret_cast<Simd4f*>(a.mParticles); - Simd4f* qBegin = reinterpret_cast<Simd4f*>(a.mPrevParticles); + T4f* pBegin = reinterpret_cast<T4f*>(a.mParticles); + T4f* qBegin = reinterpret_cast<T4f*>(a.mPrevParticles); - const Simd4f xform[4] = { load(reinterpret_cast<const float*>(&aToWorld.column0)), + const T4f xform[4] = { load(reinterpret_cast<const float*>(&aToWorld.column0)), load(reinterpret_cast<const float*>(&aToWorld.column1)), load(reinterpret_cast<const float*>(&aToWorld.column2)), load(reinterpret_cast<const float*>(&aToWorld.column3)) }; - Simd4f impulseInvScale = recip(Simd4f(simd4f(cBegin[clothIndex].mImpulseScale))); + T4f impulseInvScale = recip(T4f(simd4f(cBegin[clothIndex].mImpulseScale))); for (uint32_t k = 0; k < a.mNumParticles; ++k) { - Simd4f* pIt = a.mIndices ? pBegin + a.mIndices[k] : pBegin + k; - Simd4f* qIt = a.mIndices ? qBegin + a.mIndices[k] : qBegin + k; + T4f* pIt = a.mIndices ? pBegin + a.mIndices[k] : pBegin + k; + T4f* qIt = a.mIndices ? qBegin + a.mIndices[k] : qBegin + k; - const Simd4f p = *pIt; + const T4f p = *pIt; for (const BoundingBox* oIt = overlapBounds, *oEnd = overlapBounds + numOverlaps; oIt != oEnd; ++oIt) { @@ -339,7 +348,7 @@ uint32_t calculatePotentialColliders(const cloth::SwInterCollisionData* cBegin, // (will be transformed back after collision) *pIt = transform(xform, p); - Simd4f impulse = (p - *qIt) * impulseInvScale; + T4f impulse = (p - *qIt) * impulseInvScale; *qIt = rotate(xform, impulse); // update world bounds @@ -364,8 +373,8 @@ uint32_t calculatePotentialColliders(const cloth::SwInterCollisionData* cBegin, } } -template <typename Simd4f> -PX_INLINE Simd4f& cloth::SwInterCollision<Simd4f>::getParticle(uint32_t index) +template <typename T4f> +PX_INLINE T4f& cloth::SwInterCollision<T4f>::getParticle(uint32_t index) { NV_CLOTH_ASSERT(index < mNumParticles); @@ -374,11 +383,11 @@ PX_INLINE Simd4f& cloth::SwInterCollision<Simd4f>::getParticle(uint32_t index) NV_CLOTH_ASSERT(clothIndex < mNumInstances); - return reinterpret_cast<Simd4f&>(mInstances[clothIndex].mParticles[particleIndex]); + return reinterpret_cast<T4f&>(mInstances[clothIndex].mParticles[particleIndex]); } -template <typename Simd4f> -void cloth::SwInterCollision<Simd4f>::operator()() +template <typename T4f> +void cloth::SwInterCollision<T4f>::operator()() { mNumTests = mNumCollisions = 0; @@ -389,7 +398,7 @@ void cloth::SwInterCollision<Simd4f>::operator()() for (uint32_t k = 0; k < mNumIterations; ++k) { // world bounds of particles - BoundingBox<Simd4f> bounds = emptyBounds<Simd4f>(); + BoundingBox<T4f> bounds = emptyBounds<T4f>(); // calculate potentially colliding set { @@ -405,8 +414,8 @@ void cloth::SwInterCollision<Simd4f>::operator()() { NV_CLOTH_PROFILE_ZONE("cloth::SwInterCollision::Collide", /*ProfileContext::None*/ 0); - Simd4f lowerBound = bounds.mLower; - Simd4f edgeLength = max(bounds.mUpper - lowerBound, sEpsilon); + T4f lowerBound = bounds.mLower; + T4f edgeLength = max(bounds.mUpper - lowerBound, sEpsilon); // sweep along longest axis uint32_t sweepAxis = longestAxis(edgeLength); @@ -414,15 +423,15 @@ void cloth::SwInterCollision<Simd4f>::operator()() uint32_t hashAxis1 = (sweepAxis + 2) % 3; // reserve 0, 127, and 65535 for sentinel - Simd4f cellSize = max(mCollisionDistance, simd4f(1.0f / 253) * edgeLength); + T4f cellSize = max(mCollisionDistance, simd4f(1.0f / 253) * edgeLength); array(cellSize)[sweepAxis] = array(edgeLength)[sweepAxis] / 65533; - Simd4f one = gSimd4fOne; - Simd4f gridSize = simd4f(254.0f); + T4f one = gSimd4fOne; + T4f gridSize = simd4f(254.0f); array(gridSize)[sweepAxis] = 65534.0f; - Simd4f gridScale = recip<1>(cellSize); - Simd4f gridBias = -lowerBound * gridScale + one; + T4f gridScale = recip<1>(cellSize); + T4f gridBias = -lowerBound * gridScale + one; void* buffer = mAllocator.allocate(getBufferSize(mNumParticles)); @@ -430,13 +439,13 @@ void cloth::SwInterCollision<Simd4f>::operator()() uint32_t* __restrict sortedKeys = sortedIndices + mNumParticles; uint32_t* __restrict keys = std::max(sortedKeys + mNumParticles, sortedIndices + 2 * mNumParticles + 1024); - typedef typename Simd4fToSimd4i<Simd4f>::Type Simd4i; + typedef typename Simd4fToSimd4i<T4f>::Type Simd4i; // create keys for (uint32_t i = 0; i < mNumParticles; ++i) { // grid coordinate - Simd4f indexf = getParticle(i) * gridScale + gridBias; + T4f indexf = getParticle(i) * gridScale + gridBias; // need to clamp index because shape collision potentially // pushes particles outside of their original bounds @@ -486,7 +495,7 @@ void cloth::SwInterCollision<Simd4f>::operator()() { NV_CLOTH_PROFILE_ZONE("cloth::SwInterCollision::PostTransform", /*ProfileContext::None*/ 0); - Simd4f toLocal[4], impulseScale; + T4f toLocal[4], impulseScale; uint16_t lastCloth = uint16_t(0xffff); for (uint32_t i = 0; i < mNumParticles; ++i) @@ -510,12 +519,12 @@ void cloth::SwInterCollision<Simd4f>::operator()() } uint32_t particleIndex = mParticleIndices[i]; - Simd4f& particle = reinterpret_cast<Simd4f&>(instance->mParticles[particleIndex]); - Simd4f& impulse = reinterpret_cast<Simd4f&>(instance->mPrevParticles[particleIndex]); + T4f& particle = reinterpret_cast<T4f&>(instance->mParticles[particleIndex]); + T4f& impulse = reinterpret_cast<T4f&>(instance->mPrevParticles[particleIndex]); particle = transform(toLocal, particle); // avoid w becoming negative due to numerical inaccuracies - impulse = max(sZeroW, particle - rotate(toLocal, Simd4f(impulse * impulseScale))); + impulse = max(sZeroW, particle - rotate(toLocal, T4f(impulse * impulseScale))); } } } @@ -525,15 +534,15 @@ void cloth::SwInterCollision<Simd4f>::operator()() mAllocator.deallocate(mClothIndices); } -template <typename Simd4f> -size_t cloth::SwInterCollision<Simd4f>::estimateTemporaryMemory(SwInterCollisionData* cloths, uint32_t n) +template <typename T4f> +size_t cloth::SwInterCollision<T4f>::estimateTemporaryMemory(SwInterCollisionData* cloths, uint32_t n) { // count total particles uint32_t numParticles = 0; for (uint32_t i = 0; i < n; ++i) numParticles += cloths[i].mNumParticles; - uint32_t boundsSize = 2 * n * sizeof(BoundingBox<Simd4f>) + n * sizeof(uint32_t); + uint32_t boundsSize = 2 * n * sizeof(BoundingBox<T4f>) + n * sizeof(uint32_t); uint32_t clothIndicesSize = numParticles * sizeof(uint16_t); uint32_t particleIndicesSize = numParticles * sizeof(uint32_t); uint32_t masksSize = n * sizeof(uint32_t); @@ -541,8 +550,8 @@ size_t cloth::SwInterCollision<Simd4f>::estimateTemporaryMemory(SwInterCollision return boundsSize + clothIndicesSize + particleIndicesSize + masksSize + getBufferSize(numParticles); } -template <typename Simd4f> -size_t cloth::SwInterCollision<Simd4f>::getBufferSize(uint32_t numParticles) +template <typename T4f> +size_t cloth::SwInterCollision<T4f>::getBufferSize(uint32_t numParticles) { uint32_t keysSize = numParticles * sizeof(uint32_t); uint32_t indicesSize = numParticles * sizeof(uint32_t); @@ -551,8 +560,8 @@ size_t cloth::SwInterCollision<Simd4f>::getBufferSize(uint32_t numParticles) return keysSize + indicesSize + std::max(indicesSize + histogramSize, keysSize); } -template <typename Simd4f> -void cloth::SwInterCollision<Simd4f>::collideParticle(uint32_t index) +template <typename T4f> +void cloth::SwInterCollision<T4f>::collideParticle(uint32_t index) { uint16_t clothIndex = mClothIndices[index]; @@ -562,10 +571,10 @@ void cloth::SwInterCollision<Simd4f>::collideParticle(uint32_t index) const SwInterCollisionData* instance = mInstances + clothIndex; uint32_t particleIndex = mParticleIndices[index]; - Simd4f& particle = reinterpret_cast<Simd4f&>(instance->mParticles[particleIndex]); + T4f& particle = reinterpret_cast<T4f&>(instance->mParticles[particleIndex]); - Simd4f diff = particle - mParticle; - Simd4f distSqr = dot3(diff, diff); + T4f diff = particle - mParticle; + T4f distSqr = dot3(diff, diff); #if PX_DEBUG ++mNumTests; @@ -574,17 +583,17 @@ void cloth::SwInterCollision<Simd4f>::collideParticle(uint32_t index) if (allGreater(distSqr, mCollisionSquareDistance)) return; - Simd4f w0 = splat<3>(mParticle); - Simd4f w1 = splat<3>(particle); + T4f w0 = splat<3>(mParticle); + T4f w1 = splat<3>(particle); - Simd4f ratio = mCollisionDistance * rsqrt<1>(distSqr); - Simd4f scale = mStiffness * recip<1>(sEpsilon + w0 + w1); - Simd4f delta = (scale * (diff - diff * ratio)) & sMaskXYZ; + T4f ratio = mCollisionDistance * rsqrt<1>(distSqr); + T4f scale = mStiffness * recip<1>(sEpsilon + w0 + w1); + T4f delta = (scale * (diff - diff * ratio)) & sMaskXYZ; mParticle = mParticle + delta * w0; particle = particle - delta * w1; - Simd4f& impulse = reinterpret_cast<Simd4f&>(instance->mPrevParticles[particleIndex]); + T4f& impulse = reinterpret_cast<T4f&>(instance->mPrevParticles[particleIndex]); mImpulse = mImpulse + delta * w0; impulse = impulse - delta * w1; @@ -594,8 +603,8 @@ void cloth::SwInterCollision<Simd4f>::collideParticle(uint32_t index) #endif } -template <typename Simd4f> -void cloth::SwInterCollision<Simd4f>::collideParticles(const uint32_t* keys, uint32_t firstColumnSize, +template <typename T4f> +void cloth::SwInterCollision<T4f>::collideParticles(const uint32_t* keys, uint32_t firstColumnSize, const uint32_t* indices, uint32_t numParticles, uint32_t collisionDistance) { @@ -653,8 +662,8 @@ void cloth::SwInterCollision<Simd4f>::collideParticles(const uint32_t* keys, uin const SwInterCollisionData* instance = mInstances + mClothIndex; mParticleIndex = mParticleIndices[index]; - mParticle = reinterpret_cast<const Simd4f&>(instance->mParticles[mParticleIndex]); - mImpulse = reinterpret_cast<const Simd4f&>(instance->mPrevParticles[mParticleIndex]); + mParticle = reinterpret_cast<const T4f&>(instance->mParticles[mParticleIndex]); + mImpulse = reinterpret_cast<const T4f&>(instance->mPrevParticles[mParticleIndex]); uint32_t key = *kFirst[0]; @@ -689,8 +698,8 @@ void cloth::SwInterCollision<Simd4f>::collideParticles(const uint32_t* keys, uin } // write back particle and impulse - reinterpret_cast<Simd4f&>(instance->mParticles[mParticleIndex]) = mParticle; - reinterpret_cast<Simd4f&>(instance->mPrevParticles[mParticleIndex]) = mImpulse; + reinterpret_cast<T4f&>(instance->mParticles[mParticleIndex]) = mParticle; + reinterpret_cast<T4f&>(instance->mPrevParticles[mParticleIndex]) = mImpulse; } } diff --git a/NvCloth/src/SwInterCollision.h b/NvCloth/src/SwInterCollision.h index 656fbbc..f57fe6c 100644 --- a/NvCloth/src/SwInterCollision.h +++ b/NvCloth/src/SwInterCollision.h @@ -78,7 +78,7 @@ struct SwInterCollisionData void* mUserData; }; -template <typename Simd4f> +template <typename T4f> class SwInterCollision { @@ -100,17 +100,17 @@ class SwInterCollision void collideParticles(const uint32_t* keys, uint32_t firstColumnSize, const uint32_t* sortedIndices, uint32_t numParticles, uint32_t collisionDistance); - Simd4f& getParticle(uint32_t index); + T4f& getParticle(uint32_t index); // better wrap these in a struct void collideParticle(uint32_t index); - Simd4f mParticle; - Simd4f mImpulse; + T4f mParticle; + T4f mImpulse; - Simd4f mCollisionDistance; - Simd4f mCollisionSquareDistance; - Simd4f mStiffness; + T4f mCollisionDistance; + T4f mCollisionSquareDistance; + T4f mStiffness; uint16_t mClothIndex; uint32_t mClothMask; @@ -137,6 +137,15 @@ class SwInterCollision mutable uint32_t mNumCollisions; }; + +//explicit template instantiation declaration +#if NV_SIMD_SIMD +extern template class SwInterCollision<Simd4f>; +#endif +#if NV_SIMD_SCALAR +extern template class SwInterCollision<Scalar4f>; +#endif + } // namespace cloth } // namespace nv diff --git a/NvCloth/src/SwSelfCollision.cpp b/NvCloth/src/SwSelfCollision.cpp index 6b3e267..095943d 100644 --- a/NvCloth/src/SwSelfCollision.cpp +++ b/NvCloth/src/SwSelfCollision.cpp @@ -68,16 +68,16 @@ void radixSort(const uint32_t* first, const uint32_t* last, uint16_t* out) for (uint32_t i = 0; i < 256; ++i) { uint16_t temp0 = uint16_t(histograms[0][i] + sums[0]); - histograms[0][i] = sums[0], sums[0] = temp0; + histograms[0][i] = sums[0]; sums[0] = temp0; uint16_t temp1 = uint16_t(histograms[1][i] + sums[1]); - histograms[1][i] = sums[1], sums[1] = temp1; + histograms[1][i] = sums[1]; sums[1] = temp1; uint16_t temp2 = uint16_t(histograms[2][i] + sums[2]); - histograms[2][i] = sums[2], sums[2] = temp2; + histograms[2][i] = sums[2]; sums[2] = temp2; uint16_t temp3 = uint16_t(histograms[3][i] + sums[3]); - histograms[3][i] = sums[3], sums[3] = temp3; + histograms[3][i] = sums[3]; sums[3] = temp3; } NV_CLOTH_ASSERT(sums[0] == n && sums[1] == n && sums[2] == n && sums[3] == n); @@ -93,18 +93,27 @@ void radixSort(const uint32_t* first, const uint32_t* last, uint16_t* out) for (uint16_t i = 0; i != n; ++i) indices[1][histograms[0][0xff & first[i]]++] = i; - for (uint16_t i = 0, index; index = indices[1][i], i != n; ++i) + for (uint16_t i = 0, index; i != n; ++i) + { + index = indices[1][i]; indices[0][histograms[1][0xff & (first[index] >> 8)]++] = index; + } - for (uint16_t i = 0, index; index = indices[0][i], i != n; ++i) + for (uint16_t i = 0, index; i != n; ++i) + { + index = indices[0][i]; indices[1][histograms[2][0xff & (first[index] >> 16)]++] = index; - - for (uint16_t i = 0, index; index = indices[1][i], i != n; ++i) + + } + for (uint16_t i = 0, index; i != n; ++i) + { + index = indices[1][i]; indices[0][histograms[3][first[index] >> 24]++] = index; + } } -template <typename Simd4f> -uint32_t longestAxis(const Simd4f& edgeLength) +template <typename T4f> +uint32_t longestAxis(const T4f& edgeLength) { const float* e = array(edgeLength); @@ -131,30 +140,30 @@ inline uint32_t align2(uint32_t x) } // anonymous namespace -template <typename Simd4f> -cloth::SwSelfCollision<Simd4f>::SwSelfCollision(cloth::SwClothData& clothData, cloth::SwKernelAllocator& alloc) +template <typename T4f> +cloth::SwSelfCollision<T4f>::SwSelfCollision(cloth::SwClothData& clothData, cloth::SwKernelAllocator& alloc) : mClothData(clothData), mAllocator(alloc) { mCollisionDistance = simd4f(mClothData.mSelfCollisionDistance); mCollisionSquareDistance = mCollisionDistance * mCollisionDistance; - mStiffness = sMaskXYZ & static_cast<Simd4f>(simd4f(mClothData.mSelfCollisionStiffness)); + mStiffness = sMaskXYZ & static_cast<T4f>(simd4f(mClothData.mSelfCollisionStiffness)); } -template <typename Simd4f> -cloth::SwSelfCollision<Simd4f>::~SwSelfCollision() +template <typename T4f> +cloth::SwSelfCollision<T4f>::~SwSelfCollision() { } -template <typename Simd4f> -void cloth::SwSelfCollision<Simd4f>::operator()() +template <typename T4f> +void cloth::SwSelfCollision<T4f>::operator()() { mNumTests = mNumCollisions = 0; if (!isSelfCollisionEnabled(mClothData)) return; - Simd4f lowerBound = load(mClothData.mCurBounds); - Simd4f edgeLength = max(load(mClothData.mCurBounds + 3) - lowerBound, gSimd4fEpsilon); + T4f lowerBound = load(mClothData.mCurBounds); + T4f edgeLength = max(load(mClothData.mCurBounds + 3) - lowerBound, gSimd4fEpsilon); // sweep along longest axis uint32_t sweepAxis = longestAxis(edgeLength); @@ -162,15 +171,15 @@ void cloth::SwSelfCollision<Simd4f>::operator()() uint32_t hashAxis1 = (sweepAxis + 2) % 3; // reserve 0, 127, and 65535 for sentinel - Simd4f cellSize = max(mCollisionDistance, simd4f(1.0f / 253) * edgeLength); + T4f cellSize = max(mCollisionDistance, simd4f(1.0f / 253) * edgeLength); array(cellSize)[sweepAxis] = array(edgeLength)[sweepAxis] / 65533; - Simd4f one = gSimd4fOne; - Simd4f gridSize = simd4f(254.0f); + T4f one = gSimd4fOne; + T4f gridSize = simd4f(254.0f); array(gridSize)[sweepAxis] = 65534.0f; - Simd4f gridScale = recip<1>(cellSize); - Simd4f gridBias = -lowerBound * gridScale + one; + T4f gridScale = recip<1>(cellSize); + T4f gridBias = -lowerBound * gridScale + one; uint32_t numIndices = mClothData.mNumSelfCollisionIndices; void* buffer = mAllocator.allocate(getBufferSize(numIndices)); @@ -180,7 +189,7 @@ void cloth::SwSelfCollision<Simd4f>::operator()() uint16_t* __restrict sortedIndices = reinterpret_cast<uint16_t*>(keys + numIndices); uint32_t* __restrict sortedKeys = reinterpret_cast<uint32_t*>(sortedIndices + align2(numIndices)); - const Simd4f* particles = reinterpret_cast<const Simd4f*>(mClothData.mCurParticles); + const T4f* particles = reinterpret_cast<const T4f*>(mClothData.mCurParticles); // create keys for (uint32_t i = 0; i < numIndices; ++i) @@ -188,7 +197,7 @@ void cloth::SwSelfCollision<Simd4f>::operator()() uint32_t index = indices ? indices[i] : i; // grid coordinate - Simd4f keyf = particles[index] * gridScale + gridBias; + T4f keyf = particles[index] * gridScale + gridBias; // need to clamp index because shape collision potentially // pushes particles outside of their original bounds @@ -235,8 +244,8 @@ void cloth::SwSelfCollision<Simd4f>::operator()() uint32_t numCollisions = mNumCollisions; mNumCollisions = 0; - Simd4f* qarticles = reinterpret_cast< - Simd4f*>(mClothData.mCurParticles); + T4f* qarticles = reinterpret_cast< + T4f*>(mClothData.mCurParticles); for (uint32_t i = 0; i < numIndices; ++i) { uint32_t indexI = indices ? indices[i] : i; @@ -253,16 +262,16 @@ void cloth::SwSelfCollision<Simd4f>::operator()() */ } -template <typename Simd4f> -size_t cloth::SwSelfCollision<Simd4f>::estimateTemporaryMemory(const SwCloth& cloth) +template <typename T4f> +size_t cloth::SwSelfCollision<T4f>::estimateTemporaryMemory(const SwCloth& cloth) { uint32_t numIndices = uint32_t(cloth.mSelfCollisionIndices.empty() ? cloth.mCurParticles.size() : cloth.mSelfCollisionIndices.size()); return isSelfCollisionEnabled(cloth) ? getBufferSize(numIndices) : 0; } -template <typename Simd4f> -size_t cloth::SwSelfCollision<Simd4f>::getBufferSize(uint32_t numIndices) +template <typename T4f> +size_t cloth::SwSelfCollision<T4f>::getBufferSize(uint32_t numIndices) { uint32_t keysSize = numIndices * sizeof(uint32_t); uint32_t indicesSize = align2(numIndices) * sizeof(uint16_t); @@ -270,13 +279,13 @@ size_t cloth::SwSelfCollision<Simd4f>::getBufferSize(uint32_t numIndices) return keysSize + indicesSize + std::max(radixSize, keysSize + uint32_t(sizeof(uint32_t))); } -template <typename Simd4f> +template <typename T4f> template <bool useRestParticles> -void cloth::SwSelfCollision<Simd4f>::collideParticles(Simd4f& pos0, Simd4f& pos1, const Simd4f& pos0rest, - const Simd4f& pos1rest) +void cloth::SwSelfCollision<T4f>::collideParticles(T4f& pos0, T4f& pos1, const T4f& pos0rest, + const T4f& pos1rest) { - Simd4f diff = pos1 - pos0; - Simd4f distSqr = dot3(diff, diff); + T4f diff = pos1 - pos0; + T4f distSqr = dot3(diff, diff); #if PX_DEBUG ++mNumTests; @@ -289,19 +298,19 @@ void cloth::SwSelfCollision<Simd4f>::collideParticles(Simd4f& pos0, Simd4f& pos1 { // calculate distance in rest configuration, if less than collision // distance then ignore collision between particles in deformed config - Simd4f restDiff = pos1rest - pos0rest; - Simd4f restDistSqr = dot3(restDiff, restDiff); + T4f restDiff = pos1rest - pos0rest; + T4f restDistSqr = dot3(restDiff, restDiff); if (allGreater(mCollisionSquareDistance, restDistSqr)) return; } - Simd4f w0 = splat<3>(pos0); - Simd4f w1 = splat<3>(pos1); + T4f w0 = splat<3>(pos0); + T4f w1 = splat<3>(pos1); - Simd4f ratio = mCollisionDistance * rsqrt(distSqr); - Simd4f scale = mStiffness * recip(gSimd4fEpsilon + w0 + w1); - Simd4f delta = (scale * (diff - diff * ratio)) & sMaskXYZ; + T4f ratio = mCollisionDistance * rsqrt(distSqr); + T4f scale = mStiffness * recip(gSimd4fEpsilon + w0 + w1); + T4f delta = (scale * (diff - diff * ratio)) & sMaskXYZ; pos0 = pos0 + delta * w0; pos1 = pos1 - delta * w1; @@ -311,14 +320,14 @@ void cloth::SwSelfCollision<Simd4f>::collideParticles(Simd4f& pos0, Simd4f& pos1 #endif } -template <typename Simd4f> +template <typename T4f> template <bool useRestParticles> -void cloth::SwSelfCollision<Simd4f>::collideParticles(const uint32_t* keys, uint16_t firstColumnSize, +void cloth::SwSelfCollision<T4f>::collideParticles(const uint32_t* keys, uint16_t firstColumnSize, const uint16_t* indices, uint32_t collisionDistance) { - Simd4f* __restrict particles = reinterpret_cast<Simd4f*>(mClothData.mCurParticles); - Simd4f* __restrict restParticles = - useRestParticles ? reinterpret_cast<Simd4f*>(mClothData.mRestPositions) : particles; + T4f* __restrict particles = reinterpret_cast<T4f*>(mClothData.mCurParticles); + T4f* __restrict restParticles = + useRestParticles ? reinterpret_cast<T4f*>(mClothData.mRestPositions) : particles; const uint32_t bucketMask = uint16_t(-1); @@ -367,8 +376,8 @@ void cloth::SwSelfCollision<Simd4f>::collideParticles(const uint32_t* keys, uint NV_CLOTH_ASSERT(*iIt < mClothData.mNumParticles); // load current particle once outside of inner loop - Simd4f particle = particles[*iIt]; - Simd4f restParticle = restParticles[*iIt]; + T4f particle = particles[*iIt]; + T4f restParticle = restParticles[*iIt]; uint32_t key = *kFirst[0]; diff --git a/NvCloth/src/SwSelfCollision.h b/NvCloth/src/SwSelfCollision.h index 0348e29..cd665b6 100644 --- a/NvCloth/src/SwSelfCollision.h +++ b/NvCloth/src/SwSelfCollision.h @@ -43,10 +43,10 @@ struct SwClothData; typedef StackAllocator<16> SwKernelAllocator; -template <typename Simd4f> +template <typename T4f> class SwSelfCollision { - typedef typename Simd4fToSimd4i<Simd4f>::Type Simd4i; + typedef typename Simd4fToSimd4i<T4f>::Type Simd4i; public: SwSelfCollision(SwClothData& clothData, SwKernelAllocator& alloc); @@ -61,14 +61,14 @@ class SwSelfCollision static size_t getBufferSize(uint32_t); template <bool useRestParticles> - void collideParticles(Simd4f&, Simd4f&, const Simd4f&, const Simd4f&); + void collideParticles(T4f&, T4f&, const T4f&, const T4f&); template <bool useRestParticles> void collideParticles(const uint32_t*, uint16_t, const uint16_t*, uint32_t); - Simd4f mCollisionDistance; - Simd4f mCollisionSquareDistance; - Simd4f mStiffness; + T4f mCollisionDistance; + T4f mCollisionSquareDistance; + T4f mStiffness; SwClothData& mClothData; SwKernelAllocator& mAllocator; @@ -78,6 +78,15 @@ class SwSelfCollision mutable uint32_t mNumCollisions; }; +//explicit template instantiation declaration +#if NV_SIMD_SIMD +extern template class SwSelfCollision<Simd4f>; +#endif +#if NV_SIMD_SCALAR +extern template class SwSelfCollision<Scalar4f>; +#endif + + } // namespace cloth } // namespace nv diff --git a/NvCloth/src/SwSolver.cpp b/NvCloth/src/SwSolver.cpp index c83eed8..c7437e1 100644 --- a/NvCloth/src/SwSolver.cpp +++ b/NvCloth/src/SwSolver.cpp @@ -93,29 +93,57 @@ void sortTasks(shdfnd::Array<T, cloth::NonTrackingAllocator>& tasks) void cloth::SwSolver::addCloth(Cloth* cloth) { - SwCloth& swCloth = static_cast<SwClothImpl&>(*cloth).mCloth; + SwCloth& swCloth = *static_cast<SwCloth*>(cloth); mSimulatedCloths.pushBack(SimulatedCloth(swCloth, this)); sortTasks(mSimulatedCloths); + + mCloths.pushBack(&swCloth); } void cloth::SwSolver::removeCloth(Cloth* cloth) { - SwCloth& swCloth = static_cast<SwClothImpl&>(*cloth).mCloth; + SwCloth& swCloth = *static_cast<SwCloth*>(cloth); - Vector<SimulatedCloth>::Type::Iterator tIt = mSimulatedCloths.begin(); - Vector<SimulatedCloth>::Type::Iterator tEnd = mSimulatedCloths.end(); - while (tIt != tEnd && tIt->mCloth != &swCloth) - ++tIt; + //Remove from mSimulatedCloths + { + Vector<SimulatedCloth>::Type::Iterator tIt = mSimulatedCloths.begin(); + Vector<SimulatedCloth>::Type::Iterator tEnd = mSimulatedCloths.end(); + while(tIt != tEnd && tIt->mCloth != &swCloth) + ++tIt; + + if(tIt != tEnd) + { + NV_CLOTH_FREE(tIt->mScratchMemory); + mSimulatedCloths.replaceWithLast(tIt); + sortTasks(mSimulatedCloths); + } + } - if (tIt != tEnd) + //Remove from mCloths { - NV_CLOTH_FREE(tIt->mScratchMemory); - mSimulatedCloths.replaceWithLast(tIt); - sortTasks(mSimulatedCloths); + ClothVector::Iterator tEnd = mCloths.end(); + ClothVector::Iterator it = mCloths.find(&swCloth); + + if(it != tEnd) + { + mCloths.replaceWithLast(it); + } } } +int cloth::SwSolver::getNumCloths() const +{ + return mCloths.size(); +} +cloth::Cloth * const * cloth::SwSolver::getClothList() const +{ + if(getNumCloths()) + return reinterpret_cast<Cloth* const*>(&mCloths[0]); + else + return nullptr; +} + bool cloth::SwSolver::beginSimulation(float dt) { if (mSimulatedCloths.empty()) diff --git a/NvCloth/src/SwSolver.h b/NvCloth/src/SwSolver.h index 0c503ac..c7b177b 100644 --- a/NvCloth/src/SwSolver.h +++ b/NvCloth/src/SwSolver.h @@ -65,6 +65,8 @@ class SwSolver : public Solver virtual void addCloth(Cloth*) override; virtual void removeCloth(Cloth*) override; + virtual int getNumCloths() const override; + virtual Cloth * const * getClothList() const override; // functions executing the simulation work. virtual bool beginSimulation(float dt) override; @@ -117,6 +119,8 @@ class SwSolver : public Solver private: Vector<SimulatedCloth>::Type mSimulatedCloths; + typedef Vector<SwCloth*>::Type ClothVector; + ClothVector mCloths; float mInterCollisionDistance; diff --git a/NvCloth/src/SwSolverKernel.cpp b/NvCloth/src/SwSolverKernel.cpp index f53c9ab..52dfdaa 100644 --- a/NvCloth/src/SwSolverKernel.cpp +++ b/NvCloth/src/SwSolverKernel.cpp @@ -124,55 +124,55 @@ const Simd4fTupleFactory sMinusFloatMaxXYZ = simd4f(-FLT_MAX, -FLT_MAX, -FLT_MAX The g * dt * dt term is folded into accelIt. */ -template <typename Simd4f, typename AccelerationIterator> -void integrateParticles(Simd4f* __restrict curIt, Simd4f* __restrict curEnd, Simd4f* __restrict prevIt, - const Simd4f& scale, const AccelerationIterator& aIt, const Simd4f& prevBias) +template <typename T4f, typename AccelerationIterator> +void integrateParticles(T4f* __restrict curIt, T4f* __restrict curEnd, T4f* __restrict prevIt, + const T4f& scale, const AccelerationIterator& aIt, const T4f& prevBias) { // local copy to avoid LHS AccelerationIterator accelIt(aIt); for (; curIt != curEnd; ++curIt, ++prevIt, ++accelIt) { - Simd4f current = *curIt; - Simd4f previous = *prevIt; + T4f current = *curIt; + T4f previous = *prevIt; // if (current.w == 0) current.w = previous.w current = select(current > sMinusFloatMaxXYZ, current, previous); - Simd4f finiteMass = splat<3>(previous) > sFloatMaxW; - Simd4f delta = (current - previous) * scale + *accelIt; + T4f finiteMass = splat<3>(previous) > sFloatMaxW; + T4f delta = (current - previous) * scale + *accelIt; *curIt = current + (delta & finiteMass); *prevIt = select(sMaskW, previous, current) + (prevBias & finiteMass); } } -template <typename Simd4f, typename AccelerationIterator> -void integrateParticles(Simd4f* __restrict curIt, Simd4f* __restrict curEnd, Simd4f* __restrict prevIt, - const Simd4f (&prevMatrix)[3], const Simd4f (&curMatrix)[3], const AccelerationIterator& aIt, - const Simd4f& prevBias) +template <typename T4f, typename AccelerationIterator> +void integrateParticles(T4f* __restrict curIt, T4f* __restrict curEnd, T4f* __restrict prevIt, + const T4f (&prevMatrix)[3], const T4f (&curMatrix)[3], const AccelerationIterator& aIt, + const T4f& prevBias) { // local copy to avoid LHS AccelerationIterator accelIt(aIt); for (; curIt != curEnd; ++curIt, ++prevIt, ++accelIt) { - Simd4f current = *curIt; - Simd4f previous = *prevIt; + T4f current = *curIt; + T4f previous = *prevIt; // if (current.w == 0) current.w = previous.w current = select(current > sMinusFloatMaxXYZ, current, previous); - Simd4f finiteMass = splat<3>(previous) > sFloatMaxW; + T4f finiteMass = splat<3>(previous) > sFloatMaxW; // curMatrix * current + prevMatrix * previous + accel - Simd4f delta = cloth::transform(curMatrix, cloth::transform(prevMatrix, *accelIt, previous), current); + T4f delta = cloth::transform(curMatrix, cloth::transform(prevMatrix, *accelIt, previous), current); *curIt = current + (delta & finiteMass); *prevIt = select(sMaskW, previous, current) + (prevBias & finiteMass); } } -template <typename Simd4f, typename ConstraintIterator> -void constrainMotion(Simd4f* __restrict curIt, const Simd4f* __restrict curEnd, const ConstraintIterator& spheres, - const Simd4f& scaleBiasStiffness) +template <typename T4f, typename ConstraintIterator> +void constrainMotion(T4f* __restrict curIt, const T4f* __restrict curEnd, const ConstraintIterator& spheres, + const T4f& scaleBiasStiffness) { - Simd4f scale = splat<0>(scaleBiasStiffness); - Simd4f bias = splat<1>(scaleBiasStiffness); - Simd4f stiffness = splat<3>(scaleBiasStiffness); + T4f scale = splat<0>(scaleBiasStiffness); + T4f bias = splat<1>(scaleBiasStiffness); + T4f stiffness = splat<3>(scaleBiasStiffness); // local copy of iterator to maintain alignment ConstraintIterator sphIt = spheres; @@ -180,33 +180,33 @@ void constrainMotion(Simd4f* __restrict curIt, const Simd4f* __restrict curEnd, for (; curIt < curEnd; curIt += 4) { // todo: use msub where available - Simd4f curPos0 = curIt[0]; - Simd4f curPos1 = curIt[1]; - Simd4f curPos2 = curIt[2]; - Simd4f curPos3 = curIt[3]; + T4f curPos0 = curIt[0]; + T4f curPos1 = curIt[1]; + T4f curPos2 = curIt[2]; + T4f curPos3 = curIt[3]; //delta.xyz = sphereCenter - currentPosition //delta.w = sphereRadius - Simd4f delta0 = *sphIt - (sMaskXYZ & curPos0); + T4f delta0 = *sphIt - (sMaskXYZ & curPos0); ++sphIt; - Simd4f delta1 = *sphIt - (sMaskXYZ & curPos1); + T4f delta1 = *sphIt - (sMaskXYZ & curPos1); ++sphIt; - Simd4f delta2 = *sphIt - (sMaskXYZ & curPos2); + T4f delta2 = *sphIt - (sMaskXYZ & curPos2); ++sphIt; - Simd4f delta3 = *sphIt - (sMaskXYZ & curPos3); + T4f delta3 = *sphIt - (sMaskXYZ & curPos3); ++sphIt; - Simd4f deltaX = delta0, deltaY = delta1, deltaZ = delta2, deltaW = delta3; + T4f deltaX = delta0, deltaY = delta1, deltaZ = delta2, deltaW = delta3; transpose(deltaX, deltaY, deltaZ, deltaW); - Simd4f sqrLength = gSimd4fEpsilon + deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ; - Simd4f radius = max(gSimd4fZero, deltaW * scale + bias); + T4f sqrLength = gSimd4fEpsilon + deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ; + T4f radius = max(gSimd4fZero, deltaW * scale + bias); - Simd4f slack = gSimd4fOne - radius * rsqrt(sqrLength); + T4f slack = gSimd4fOne - radius * rsqrt(sqrLength); // if slack <= 0.0f then we don't want to affect particle // and can skip if all particles are unaffected - Simd4f isPositive; + T4f isPositive; if (anyGreater(slack, gSimd4fZero, isPositive)) { // set invMass to zero if radius is zero @@ -225,8 +225,8 @@ void constrainMotion(Simd4f* __restrict curIt, const Simd4f* __restrict curEnd, } } -template <typename Simd4f, typename ConstraintIterator> -void constrainSeparation(Simd4f* __restrict curIt, const Simd4f* __restrict curEnd, const ConstraintIterator& spheres) +template <typename T4f, typename ConstraintIterator> +void constrainSeparation(T4f* __restrict curIt, const T4f* __restrict curEnd, const ConstraintIterator& spheres) { // local copy of iterator to maintain alignment ConstraintIterator sphIt = spheres; @@ -234,32 +234,32 @@ void constrainSeparation(Simd4f* __restrict curIt, const Simd4f* __restrict curE for (; curIt < curEnd; curIt += 4) { // todo: use msub where available - Simd4f curPos0 = curIt[0]; - Simd4f curPos1 = curIt[1]; - Simd4f curPos2 = curIt[2]; - Simd4f curPos3 = curIt[3]; + T4f curPos0 = curIt[0]; + T4f curPos1 = curIt[1]; + T4f curPos2 = curIt[2]; + T4f curPos3 = curIt[3]; //delta.xyz = sphereCenter - currentPosition //delta.w = sphereRadius - Simd4f delta0 = *sphIt - (sMaskXYZ & curPos0); + T4f delta0 = *sphIt - (sMaskXYZ & curPos0); ++sphIt; - Simd4f delta1 = *sphIt - (sMaskXYZ & curPos1); + T4f delta1 = *sphIt - (sMaskXYZ & curPos1); ++sphIt; - Simd4f delta2 = *sphIt - (sMaskXYZ & curPos2); + T4f delta2 = *sphIt - (sMaskXYZ & curPos2); ++sphIt; - Simd4f delta3 = *sphIt - (sMaskXYZ & curPos3); + T4f delta3 = *sphIt - (sMaskXYZ & curPos3); ++sphIt; - Simd4f deltaX = delta0, deltaY = delta1, deltaZ = delta2, deltaW = delta3; + T4f deltaX = delta0, deltaY = delta1, deltaZ = delta2, deltaW = delta3; transpose(deltaX, deltaY, deltaZ, deltaW); - Simd4f sqrLength = gSimd4fEpsilon + deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ; + T4f sqrLength = gSimd4fEpsilon + deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ; - Simd4f slack = gSimd4fOne - deltaW * rsqrt<1>(sqrLength); + T4f slack = gSimd4fOne - deltaW * rsqrt<1>(sqrLength); // if slack >= 0.0f then we don't want to affect particle // and can skip if all particles are unaffected - Simd4f isNegative; + T4f isNegative; if (anyGreater(gSimd4fZero, slack, isNegative)) { slack = slack & isNegative; @@ -275,22 +275,22 @@ void constrainSeparation(Simd4f* __restrict curIt, const Simd4f* __restrict curE /** traditional gauss-seidel internal constraint solver */ -template <bool useMultiplier, typename Simd4f> +template <bool useMultiplier, typename T4f> void solveConstraints(float* __restrict posIt, const float* __restrict rIt, const float* __restrict stIt, const float* __restrict rEnd, - const uint16_t* __restrict iIt, const Simd4f& stiffnessEtc, const Simd4f& stiffnessExponent) + const uint16_t* __restrict iIt, const T4f& stiffnessEtc, const T4f& stiffnessExponent) { //posIt particle position (and invMass) iterator //rIt,rEnd edge rest length iterator //iIt index set iterator - Simd4f stretchLimit, compressionLimit, multiplier; + T4f stretchLimit, compressionLimit, multiplier; if (useMultiplier) { stretchLimit = splat<3>(stiffnessEtc); compressionLimit = splat<2>(stiffnessEtc); multiplier = splat<1>(stiffnessEtc); } - Simd4f stiffness = splat<0>(stiffnessEtc); + T4f stiffness = splat<0>(stiffnessEtc); bool useStiffnessPerConstraint = stIt!=nullptr; for (; rIt != rEnd; rIt += 4, stIt += 4, iIt += 8) @@ -307,39 +307,39 @@ void solveConstraints(float* __restrict posIt, const float* __restrict rIt, cons //Load particle positions //v.w = invMass - Simd4f v0i = loadAligned(posIt, p0i); - Simd4f v0j = loadAligned(posIt, p0j); - Simd4f v1i = loadAligned(posIt, p1i); - Simd4f v1j = loadAligned(posIt, p1j); - Simd4f v2i = loadAligned(posIt, p2i); - Simd4f v2j = loadAligned(posIt, p2j); - Simd4f v3i = loadAligned(posIt, p3i); - Simd4f v3j = loadAligned(posIt, p3j); + T4f v0i = loadAligned(posIt, p0i); + T4f v0j = loadAligned(posIt, p0j); + T4f v1i = loadAligned(posIt, p1i); + T4f v1j = loadAligned(posIt, p1j); + T4f v2i = loadAligned(posIt, p2i); + T4f v2j = loadAligned(posIt, p2j); + T4f v3i = loadAligned(posIt, p3i); + T4f v3j = loadAligned(posIt, p3j); //offset.xyz = posB - posA //offset.w = invMassB + invMassA - Simd4f h0ij = v0j + v0i * sMinusOneXYZOneW; - Simd4f h1ij = v1j + v1i * sMinusOneXYZOneW; - Simd4f h2ij = v2j + v2i * sMinusOneXYZOneW; - Simd4f h3ij = v3j + v3i * sMinusOneXYZOneW; + T4f h0ij = v0j + v0i * sMinusOneXYZOneW; + T4f h1ij = v1j + v1i * sMinusOneXYZOneW; + T4f h2ij = v2j + v2i * sMinusOneXYZOneW; + T4f h3ij = v3j + v3i * sMinusOneXYZOneW; //h xyz = offset //vw = invMass sum - Simd4f hxij = h0ij, hyij = h1ij, hzij = h2ij, vwij = h3ij; + T4f hxij = h0ij, hyij = h1ij, hzij = h2ij, vwij = h3ij; transpose(hxij, hyij, hzij, vwij); //load rest lengths - Simd4f rij = loadAligned(rIt); + T4f rij = loadAligned(rIt); //Load/calculate the constraint stiffness - Simd4f stij = useStiffnessPerConstraint ? gSimd4fOne - exp2(stiffnessExponent * static_cast<Simd4f>(loadAligned(stIt))) : stiffness; + T4f stij = useStiffnessPerConstraint ? gSimd4fOne - exp2(stiffnessExponent * static_cast<T4f>(loadAligned(stIt))) : stiffness; //squared distance between particles: e2 = epsilon + |h|^2 - Simd4f e2ij = gSimd4fEpsilon + hxij * hxij + hyij * hyij + hzij * hzij; + T4f e2ij = gSimd4fEpsilon + hxij * hxij + hyij * hyij + hzij * hzij; //slack: er = 1 - r / sqrt(e2) // or er = 0 if rest length < epsilon - Simd4f erij = (gSimd4fOne - rij * rsqrt(e2ij)) & (rij > gSimd4fEpsilon); + T4f erij = (gSimd4fOne - rij * rsqrt(e2ij)) & (rij > gSimd4fEpsilon); if (useMultiplier) { @@ -347,7 +347,7 @@ void solveConstraints(float* __restrict posIt, const float* __restrict rIt, cons } //ex = er * stiffness / sqrt(epsilon + vw) - Simd4f exij = erij * stij * recip(gSimd4fEpsilon + vwij); + T4f exij = erij * stij * recip(gSimd4fEpsilon + vwij); //h = h * ex h0ij = h0ij * splat<0>(exij) & sMaskXYZ; @@ -372,22 +372,22 @@ void solveConstraints(float* __restrict posIt, const float* __restrict rIt, cons #endif // calculates upper bound of all position deltas -template <typename Simd4f> -Simd4f calculateMaxDelta(const Simd4f* prevIt, const Simd4f* curIt, const Simd4f* curEnd) +template <typename T4f> +T4f calculateMaxDelta(const T4f* prevIt, const T4f* curIt, const T4f* curEnd) { - Simd4f maxDelta = gSimd4fZero; + T4f maxDelta = gSimd4fZero; for (; curIt < curEnd; ++curIt, ++prevIt) maxDelta = max(maxDelta, abs(*curIt - *prevIt)); return maxDelta & sMaskXYZ; } -template <bool IsTurning, typename Simd4f> -void applyWind(Simd4f* __restrict curIt, const Simd4f* __restrict prevIt, const uint16_t* __restrict tIt, - const uint16_t* __restrict tEnd, Simd4f dragCoefficient, Simd4f liftCoefficient, Simd4f wind, - const Simd4f (&rotation)[3]) +template <bool IsTurning, typename T4f> +void applyWind(T4f* __restrict curIt, const T4f* __restrict prevIt, const uint16_t* __restrict tIt, + const uint16_t* __restrict tEnd, T4f dragCoefficient, T4f liftCoefficient, T4f wind, + const T4f (&rotation)[3]) { - const Simd4f oneThird = simd4f(1.0f / 3.0f); + const T4f oneThird = simd4f(1.0f / 3.0f); for (; tIt < tEnd; tIt += 3) { @@ -397,20 +397,20 @@ void applyWind(Simd4f* __restrict curIt, const Simd4f* __restrict prevIt, const uint16_t i2 = tIt[2]; //Get the current particle positions - Simd4f c0 = curIt[i0]; - Simd4f c1 = curIt[i1]; - Simd4f c2 = curIt[i2]; + T4f c0 = curIt[i0]; + T4f c1 = curIt[i1]; + T4f c2 = curIt[i2]; //Previous positions - Simd4f p0 = prevIt[i0]; - Simd4f p1 = prevIt[i1]; - Simd4f p2 = prevIt[i2]; + T4f p0 = prevIt[i0]; + T4f p1 = prevIt[i1]; + T4f p2 = prevIt[i2]; - Simd4f current = oneThird * (c0 + c1 + c2); - Simd4f previous = oneThird * (p0 + p1 + p2); + T4f current = oneThird * (c0 + c1 + c2); + T4f previous = oneThird * (p0 + p1 + p2); //offset of the triangle center, including wind - Simd4f delta = current - previous + wind; + T4f delta = current - previous + wind; if (IsTurning) { @@ -420,26 +420,26 @@ void applyWind(Simd4f* __restrict curIt, const Simd4f* __restrict prevIt, const } //not normalized - Simd4f normal = cross3(c2 - c0, c1 - c0); + T4f normal = cross3(c2 - c0, c1 - c0); - Simd4f doubleArea = sqrt(dot3(normal, normal)); + T4f doubleArea = sqrt(dot3(normal, normal)); - Simd4f invSqrScale = dot3(delta, delta); - Simd4f isZero = invSqrScale < gSimd4fEpsilon; - Simd4f scale = rsqrt(invSqrScale); + T4f invSqrScale = dot3(delta, delta); + T4f isZero = invSqrScale < gSimd4fEpsilon; + T4f scale = rsqrt(invSqrScale); //scale 'normalizes' delta, doubleArea normalized normal - Simd4f cosTheta = dot3(normal, delta) * scale / doubleArea; - Simd4f sinTheta = sqrt(max(gSimd4fZero, gSimd4fOne - cosTheta * cosTheta)); + T4f cosTheta = dot3(normal, delta) * scale / doubleArea; + T4f sinTheta = sqrt(max(gSimd4fZero, gSimd4fOne - cosTheta * cosTheta)); // orthogonal to delta, in delta-normal plane, same length as delta - Simd4f liftDir = cross3(cross3(delta, normal), delta * scale); + T4f liftDir = cross3(cross3(delta, normal), delta * scale); // sin(theta) * cos(theta) = 0.5 * sin(2 * theta) - Simd4f lift = liftCoefficient * cosTheta * sinTheta * liftDir; - Simd4f drag = dragCoefficient * abs(cosTheta) * doubleArea * delta; //dragCoefficient should compensate for double area + T4f lift = liftCoefficient * cosTheta * sinTheta * liftDir; + T4f drag = dragCoefficient * abs(cosTheta) * doubleArea * delta; //dragCoefficient should compensate for double area - Simd4f impulse = (lift + drag) & ~isZero; + T4f impulse = (lift + drag) & ~isZero; curIt[i0] = c0 - impulse * splat<3>(c0); curIt[i1] = c1 - impulse * splat<3>(c1); @@ -449,33 +449,33 @@ void applyWind(Simd4f* __restrict curIt, const Simd4f* __restrict prevIt, const } // anonymous namespace -template <typename Simd4f> -cloth::SwSolverKernel<Simd4f>::SwSolverKernel(SwCloth const& cloth, SwClothData& clothData, +template <typename T4f> +cloth::SwSolverKernel<T4f>::SwSolverKernel(SwCloth const& cloth, SwClothData& clothData, SwKernelAllocator& allocator, IterationStateFactory& factory) : mCloth(cloth) , mClothData(clothData) , mAllocator(allocator) , mCollision(clothData, allocator) , mSelfCollision(clothData, allocator) -, mState(factory.create<Simd4f>(cloth)) +, mState(factory.create<T4f>(cloth)) { mClothData.verify(); } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::operator()() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::operator()() { simulateCloth(); } -template <typename Simd4f> -size_t cloth::SwSolverKernel<Simd4f>::estimateTemporaryMemory(const SwCloth& cloth) +template <typename T4f> +size_t cloth::SwSolverKernel<T4f>::estimateTemporaryMemory(const SwCloth& cloth) { - size_t collisionTempMemory = SwCollision<Simd4f>::estimateTemporaryMemory(cloth); - size_t selfCollisionTempMemory = SwSelfCollision<Simd4f>::estimateTemporaryMemory(cloth); + size_t collisionTempMemory = SwCollision<T4f>::estimateTemporaryMemory(cloth); + size_t selfCollisionTempMemory = SwSelfCollision<T4f>::estimateTemporaryMemory(cloth); size_t tempMemory = std::max(collisionTempMemory, selfCollisionTempMemory); - size_t persistentMemory = SwCollision<Simd4f>::estimatePersistentMemory(cloth); + size_t persistentMemory = SwCollision<T4f>::estimatePersistentMemory(cloth); // account for any allocator overhead (this could be exposed in the allocator) size_t maxAllocs = 32; @@ -485,13 +485,13 @@ size_t cloth::SwSolverKernel<Simd4f>::estimateTemporaryMemory(const SwCloth& clo return maxAllocatorOverhead + persistentMemory + tempMemory; } -template <typename Simd4f> +template <typename T4f> template <typename AccelerationIterator> -void cloth::SwSolverKernel<Simd4f>::integrateParticles(AccelerationIterator& accelIt, const Simd4f& prevBias) +void cloth::SwSolverKernel<T4f>::integrateParticles(AccelerationIterator& accelIt, const T4f& prevBias) { - Simd4f* curIt = reinterpret_cast<Simd4f*>(mClothData.mCurParticles); - Simd4f* curEnd = curIt + mClothData.mNumParticles; - Simd4f* prevIt = reinterpret_cast<Simd4f*>(mClothData.mPrevParticles); + T4f* curIt = reinterpret_cast<T4f*>(mClothData.mCurParticles); + T4f* curEnd = curIt + mClothData.mNumParticles; + T4f* prevIt = reinterpret_cast<T4f*>(mClothData.mPrevParticles); if (!mState.mIsTurning) { @@ -504,32 +504,32 @@ void cloth::SwSolverKernel<Simd4f>::integrateParticles(AccelerationIterator& acc } } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::integrateParticles() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::integrateParticles() { NV_CLOTH_PROFILE_ZONE("cloth::SwSolverKernel::integrateParticles", /*ProfileContext::None*/ 0); - const Simd4f* startAccelIt = reinterpret_cast<const Simd4f*>(mClothData.mParticleAccelerations); + const T4f* startAccelIt = reinterpret_cast<const T4f*>(mClothData.mParticleAccelerations); // dt^2 (todo: should this be the smoothed dt used for gravity?) - const Simd4f sqrIterDt = simd4f(sqr(mState.mIterDt)) & static_cast<Simd4f>(sMaskXYZ); + const T4f sqrIterDt = simd4f(sqr(mState.mIterDt)) & static_cast<T4f>(sMaskXYZ); if (!startAccelIt) { // no per-particle accelerations, use a constant - ConstantIterator<Simd4f> accelIt(mState.mCurBias); + ConstantIterator<T4f> accelIt(mState.mCurBias); integrateParticles(accelIt, mState.mPrevBias); } else { // iterator implicitly scales by dt^2 and adds gravity - ScaleBiasIterator<Simd4f, const Simd4f*> accelIt(startAccelIt, sqrIterDt, mState.mCurBias); + ScaleBiasIterator<T4f, const T4f*> accelIt(startAccelIt, sqrIterDt, mState.mCurBias); integrateParticles(accelIt, mState.mPrevBias); } } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::constrainTether() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::constrainTether() { if (0.0f == mClothData.mTetherConstraintStiffness || !mClothData.mNumTethers) return; @@ -551,15 +551,15 @@ void cloth::SwSolverKernel<Simd4f>::constrainTether() TetherIter tEnd = tFirst + numTethers; //Tether properties - Simd4f stiffness = - static_cast<Simd4f>(sMaskXYZ) & simd4f(numParticles * mClothData.mTetherConstraintStiffness / numTethers); - Simd4f scale = simd4f(mClothData.mTetherConstraintScale); + T4f stiffness = + static_cast<T4f>(sMaskXYZ) & simd4f(numParticles * mClothData.mTetherConstraintStiffness / numTethers); + T4f scale = simd4f(mClothData.mTetherConstraintScale); //Loop through all particles for (; curIt != curEnd; curIt += 4, ++tFirst) { - Simd4f position = loadAligned(curIt); //Get the first particle - Simd4f offset = gSimd4fZero; //We accumulate the offset in this variable + T4f position = loadAligned(curIt); //Get the first particle + T4f offset = gSimd4fZero; //We accumulate the offset in this variable //Loop through all tethers connected to our particle for (TetherIter tIt = tFirst; tIt < tEnd; tIt += numParticles) @@ -567,15 +567,15 @@ void cloth::SwSolverKernel<Simd4f>::constrainTether() NV_CLOTH_ASSERT(tIt->mAnchor < numParticles); //Get the particle on the other end of the tether - Simd4f anchor = loadAligned(curFirst, tIt->mAnchor * sizeof(PxVec4)); - Simd4f delta = anchor - position; - Simd4f sqrLength = gSimd4fEpsilon + dot3(delta, delta); + T4f anchor = loadAligned(curFirst, tIt->mAnchor * sizeof(PxVec4)); + T4f delta = anchor - position; + T4f sqrLength = gSimd4fEpsilon + dot3(delta, delta); - Simd4f tetherLength = load(&tIt->mLength); + T4f tetherLength = load(&tIt->mLength); tetherLength = splat<0>(tetherLength); - Simd4f radius = tetherLength * scale; - Simd4f slack = gSimd4fOne - radius * rsqrt(sqrLength); + T4f radius = tetherLength * scale; + T4f slack = gSimd4fOne - radius * rsqrt(sqrLength); offset = offset + delta * max(slack, gSimd4fZero); } @@ -584,8 +584,8 @@ void cloth::SwSolverKernel<Simd4f>::constrainTether() } } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::solveFabric() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::solveFabric() { NV_CLOTH_PROFILE_ZONE("cloth::SwSolverKernel::solveFabric", /*ProfileContext::None*/ 0); @@ -604,7 +604,7 @@ void cloth::SwSolverKernel<Simd4f>::solveFabric() uint32_t totalConstraints = 0; - Simd4f stiffnessExponent = simd4f(mCloth.mStiffnessFrequency * mState.mIterDt); + T4f stiffnessExponent = simd4f(mCloth.mStiffnessFrequency * mState.mIterDt); //Loop through all phase configs for (; cIt != cEnd; ++cIt) @@ -623,10 +623,10 @@ void cloth::SwSolverKernel<Simd4f>::solveFabric() totalConstraints += uint32_t(rEnd - rIt); // (stiffness, multiplier, compressionLimit, stretchLimit) - Simd4f config = load(&cIt->mStiffness); + T4f config = load(&cIt->mStiffness); // stiffness specified as fraction of constraint error per-millisecond - Simd4f scaledConfig = gSimd4fOne - exp2(config * stiffnessExponent); - Simd4f stiffness = select(sMaskXY, scaledConfig, config); + T4f scaledConfig = gSimd4fOne - exp2(config * stiffnessExponent); + T4f stiffness = select(sMaskXY, scaledConfig, config); int neutralMultiplier = allEqual(sMaskYZW & stiffness, gSimd4fZero); @@ -654,22 +654,22 @@ void cloth::SwSolverKernel<Simd4f>::solveFabric() } } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::applyWind() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::applyWind() { if (mClothData.mDragCoefficient == 0.0f && mClothData.mLiftCoefficient == 0.0f) return; NV_CLOTH_PROFILE_ZONE("cloth::SwSolverKernel::applyWind", /*ProfileContext::None*/ 0); - Simd4f* curIt = reinterpret_cast<Simd4f*>(mClothData.mCurParticles); - Simd4f* prevIt = reinterpret_cast<Simd4f*>(mClothData.mPrevParticles); + T4f* curIt = reinterpret_cast<T4f*>(mClothData.mCurParticles); + T4f* prevIt = reinterpret_cast<T4f*>(mClothData.mPrevParticles); const uint16_t* tIt = mClothData.mTriangles; const uint16_t* tEnd = tIt + 3 * mClothData.mNumTriangles; - Simd4f dragCoefficient = simd4f(mClothData.mDragCoefficient); - Simd4f liftCoefficient = simd4f(mClothData.mLiftCoefficient); + T4f dragCoefficient = simd4f(mClothData.mDragCoefficient); + T4f liftCoefficient = simd4f(mClothData.mLiftCoefficient); if (mState.mIsTurning) { @@ -683,23 +683,23 @@ void cloth::SwSolverKernel<Simd4f>::applyWind() } } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::constrainMotion() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::constrainMotion() { if (!mClothData.mStartMotionConstraints) return; NV_CLOTH_PROFILE_ZONE("cloth::SwSolverKernel::constrainMotion", /*ProfileContext::None*/ 0); - Simd4f* curIt = reinterpret_cast<Simd4f*>(mClothData.mCurParticles); - Simd4f* curEnd = curIt + mClothData.mNumParticles; + T4f* curIt = reinterpret_cast<T4f*>(mClothData.mCurParticles); + T4f* curEnd = curIt + mClothData.mNumParticles; - const Simd4f* startIt = reinterpret_cast<const Simd4f*>(mClothData.mStartMotionConstraints); - const Simd4f* targetIt = reinterpret_cast<const Simd4f*>(mClothData.mTargetMotionConstraints); + const T4f* startIt = reinterpret_cast<const T4f*>(mClothData.mStartMotionConstraints); + const T4f* targetIt = reinterpret_cast<const T4f*>(mClothData.mTargetMotionConstraints); - Simd4f scaleBias = load(&mCloth.mMotionConstraintScale); - Simd4f stiffness = simd4f(mClothData.mMotionConstraintStiffness); - Simd4f scaleBiasStiffness = select(sMaskXYZ, scaleBias, stiffness); + T4f scaleBias = load(&mCloth.mMotionConstraintScale); + T4f stiffness = simd4f(mClothData.mMotionConstraintStiffness); + T4f scaleBiasStiffness = select(sMaskXYZ, scaleBias, stiffness); if (!mClothData.mTargetMotionConstraints) { @@ -714,23 +714,23 @@ void cloth::SwSolverKernel<Simd4f>::constrainMotion() } // otherwise use an interpolating iterator - LerpIterator<Simd4f, const Simd4f*> interpolator(startIt, targetIt, mState.getCurrentAlpha()); + LerpIterator<T4f, const T4f*> interpolator(startIt, targetIt, mState.getCurrentAlpha()); ::constrainMotion(curIt, curEnd, interpolator, scaleBiasStiffness); } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::constrainSeparation() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::constrainSeparation() { if (!mClothData.mStartSeparationConstraints) return; NV_CLOTH_PROFILE_ZONE("cloth::SwSolverKernel::constrainSeparation", /*ProfileContext::None*/ 0); - Simd4f* curIt = reinterpret_cast<Simd4f*>(mClothData.mCurParticles); - Simd4f* curEnd = curIt + mClothData.mNumParticles; + T4f* curIt = reinterpret_cast<T4f*>(mClothData.mCurParticles); + T4f* curEnd = curIt + mClothData.mNumParticles; - const Simd4f* startIt = reinterpret_cast<const Simd4f*>(mClothData.mStartSeparationConstraints); - const Simd4f* targetIt = reinterpret_cast<const Simd4f*>(mClothData.mTargetSeparationConstraints); + const T4f* startIt = reinterpret_cast<const T4f*>(mClothData.mStartSeparationConstraints); + const T4f* targetIt = reinterpret_cast<const T4f*>(mClothData.mTargetSeparationConstraints); if (!mClothData.mTargetSeparationConstraints) { @@ -744,43 +744,43 @@ void cloth::SwSolverKernel<Simd4f>::constrainSeparation() return ::constrainSeparation(curIt, curEnd, targetIt); } // otherwise use an interpolating iterator - LerpIterator<Simd4f, const Simd4f*> interpolator(startIt, targetIt, mState.getCurrentAlpha()); + LerpIterator<T4f, const T4f*> interpolator(startIt, targetIt, mState.getCurrentAlpha()); ::constrainSeparation(curIt, curEnd, interpolator); } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::collideParticles() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::collideParticles() { NV_CLOTH_PROFILE_ZONE("cloth::SwSolverKernel::collideParticles", /*ProfileContext::None*/ 0); mCollision(mState); } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::selfCollideParticles() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::selfCollideParticles() { NV_CLOTH_PROFILE_ZONE("cloth::SwSolverKernel::selfCollideParticles", /*ProfileContext::None*/ 0); mSelfCollision(); } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::updateSleepState() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::updateSleepState() { NV_CLOTH_PROFILE_ZONE("cloth::SwSolverKernel::updateSleepState", /*ProfileContext::None*/ 0); mClothData.mSleepTestCounter += std::max(1u, uint32_t(mState.mIterDt * 1000)); if (mClothData.mSleepTestCounter >= mCloth.mSleepTestInterval) { - const Simd4f* prevIt = reinterpret_cast<Simd4f*>(mClothData.mPrevParticles); - const Simd4f* curIt = reinterpret_cast<Simd4f*>(mClothData.mCurParticles); - const Simd4f* curEnd = curIt + mClothData.mNumParticles; + const T4f* prevIt = reinterpret_cast<T4f*>(mClothData.mPrevParticles); + const T4f* curIt = reinterpret_cast<T4f*>(mClothData.mCurParticles); + const T4f* curEnd = curIt + mClothData.mNumParticles; // calculate max particle delta since last iteration - Simd4f maxDelta = calculateMaxDelta(prevIt, curIt, curEnd); + T4f maxDelta = calculateMaxDelta(prevIt, curIt, curEnd); ++mClothData.mSleepPassCounter; - Simd4f threshold = simd4f(mCloth.mSleepThreshold * mState.mIterDt); + T4f threshold = simd4f(mCloth.mSleepThreshold * mState.mIterDt); if (anyGreaterEqual(maxDelta, threshold)) mClothData.mSleepPassCounter = 0; @@ -788,8 +788,8 @@ void cloth::SwSolverKernel<Simd4f>::updateSleepState() } } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::iterateCloth() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::iterateCloth() { // note on invMass (stored in current/previous positions.w): // integrateParticles() @@ -832,8 +832,8 @@ void cloth::SwSolverKernel<Simd4f>::iterateCloth() updateSleepState(); } -template <typename Simd4f> -void cloth::SwSolverKernel<Simd4f>::simulateCloth() +template <typename T4f> +void cloth::SwSolverKernel<T4f>::simulateCloth() { while (mState.mRemainingIterations) { diff --git a/NvCloth/src/SwSolverKernel.h b/NvCloth/src/SwSolverKernel.h index f71514d..a199691 100644 --- a/NvCloth/src/SwSolverKernel.h +++ b/NvCloth/src/SwSolverKernel.h @@ -41,7 +41,7 @@ namespace cloth class SwCloth; struct SwClothData; -template <typename Simd4f> +template <typename T4f> class SwSolverKernel { public: @@ -71,14 +71,23 @@ class SwSolverKernel SwClothData& mClothData; SwKernelAllocator& mAllocator; - SwCollision<Simd4f> mCollision; - SwSelfCollision<Simd4f> mSelfCollision; - IterationState<Simd4f> mState; + SwCollision<T4f> mCollision; + SwSelfCollision<T4f> mSelfCollision; + IterationState<T4f> mState; private: - SwSolverKernel<Simd4f>& operator = (const SwSolverKernel<Simd4f>&); + SwSolverKernel<T4f>& operator = (const SwSolverKernel<T4f>&); template <typename AccelerationIterator> - void integrateParticles(AccelerationIterator& accelIt, const Simd4f&); + void integrateParticles(AccelerationIterator& accelIt, const T4f&); }; + +//explicit template instantiation declaration +#if NV_SIMD_SIMD +extern template class SwSolverKernel<Simd4f>; +#endif +#if NV_SIMD_SCALAR +extern template class SwSolverKernel<Scalar4f>; +#endif + } } diff --git a/NvCloth/src/TripletScheduler.cpp b/NvCloth/src/TripletScheduler.cpp index e051131..999be0e 100644 --- a/NvCloth/src/TripletScheduler.cpp +++ b/NvCloth/src/TripletScheduler.cpp @@ -207,7 +207,10 @@ void cloth::TripletScheduler::warp(uint32_t numParticles, uint32_t warpWidth) numReplays += set.mNumReplays[i] == set.mNumConflicts[i][warpMask & (*tIt)[i]]; if (minReplays > numReplays) - minReplays = numReplays, bestIndex = setIndex; + { + minReplays = numReplays; + bestIndex = setIndex; + } } // add new set if none found diff --git a/NvCloth/src/cuda/CuCloth.cpp b/NvCloth/src/cuda/CuCloth.cpp index 93b2370..3e6175b 100644 --- a/NvCloth/src/cuda/CuCloth.cpp +++ b/NvCloth/src/cuda/CuCloth.cpp @@ -37,7 +37,6 @@ #include "../TripletScheduler.h" #include "../ClothBase.h" #include <foundation/PxMat44.h> -#include <PsFoundation.h> using namespace physx; @@ -215,7 +214,7 @@ uint32_t cloth::CuCloth::getSharedMemorySize() const return phaseConfigSize + sizeof(float) * (continuousCollisionSize + std::max(selfCollisionSize, discreteCollisionSize)); } -void cloth::CuCloth::setPhaseConfig(Range<const PhaseConfig> configs) +void cloth::CuCloth::setPhaseConfigInternal(Range<const PhaseConfig> configs) { mHostPhaseConfigs.assign(configs.begin(), configs.end()); @@ -317,69 +316,60 @@ namespace nv namespace cloth { -// ClothImpl<CuCloth>::clone() implemented in CuClothClone.cpp +// CuCloth::clone() implemented in CuClothClone.cpp -template <> -uint32_t ClothImpl<CuCloth>::getNumParticles() const +uint32_t CuCloth::getNumParticles() const { - return mCloth.mNumParticles; + return mNumParticles; } -template <> -void ClothImpl<CuCloth>::lockParticles() const +void CuCloth::lockParticles() const { - const_cast<CuCloth&>(mCloth).syncHostParticles(); + const_cast<CuCloth&>(*this).syncHostParticles(); } -template <> -void ClothImpl<CuCloth>::unlockParticles() const +void CuCloth::unlockParticles() const { } -template <> -MappedRange<PxVec4> ClothImpl<CuCloth>::getCurrentParticles() +MappedRange<PxVec4> CuCloth::getCurrentParticles() { - mCloth.wakeUp(); + wakeUp(); lockParticles(); - mCloth.mDeviceParticlesDirty = true; - return getMappedParticles(mCloth.mParticlesHostCopy.begin()); + mDeviceParticlesDirty = true; + return getMappedParticles(mParticlesHostCopy.begin()); } -template <> -MappedRange<const PxVec4> ClothImpl<CuCloth>::getCurrentParticles() const +MappedRange<const PxVec4> CuCloth::getCurrentParticles() const { lockParticles(); - return getMappedParticles(mCloth.mParticlesHostCopy.begin()); + return getMappedParticles(mParticlesHostCopy.begin()); } -template <> -MappedRange<PxVec4> ClothImpl<CuCloth>::getPreviousParticles() +MappedRange<PxVec4> CuCloth::getPreviousParticles() { - mCloth.wakeUp(); + wakeUp(); lockParticles(); - mCloth.mDeviceParticlesDirty = true; - return getMappedParticles(mCloth.mParticlesHostCopy.begin() + mCloth.mNumParticles); + mDeviceParticlesDirty = true; + return getMappedParticles(mParticlesHostCopy.begin() + mNumParticles); } -template <> -MappedRange<const PxVec4> ClothImpl<CuCloth>::getPreviousParticles() const +MappedRange<const PxVec4> CuCloth::getPreviousParticles() const { lockParticles(); - return getMappedParticles(mCloth.mParticlesHostCopy.begin() + mCloth.mNumParticles); + return getMappedParticles(mParticlesHostCopy.begin() + mNumParticles); } -template <> -GpuParticles ClothImpl<CuCloth>::getGpuParticles() +GpuParticles CuCloth::getGpuParticles() { - mCloth.syncDeviceParticles(); - mCloth.mHostParticlesDirty = true; - PxVec4* particles = mCloth.mParticles.begin().get(); - GpuParticles result = { particles, particles + mCloth.mNumParticles, 0 }; + syncDeviceParticles(); + mHostParticlesDirty = true; + PxVec4* particles = mParticles.begin().get(); + GpuParticles result = { particles, particles + mNumParticles, 0 }; return result; } -template <> -void ClothImpl<CuCloth>::setPhaseConfig(Range<const PhaseConfig> configs) +void CuCloth::setPhaseConfig(Range<const PhaseConfig> configs) { Vector<PhaseConfig>::Type transformedConfigs; transformedConfigs.reserve(configs.size()); @@ -389,56 +379,52 @@ void ClothImpl<CuCloth>::setPhaseConfig(Range<const PhaseConfig> configs) if (configs.front().mStiffness > 0.0f) transformedConfigs.pushBack(transform(configs.front())); - mCloth.setPhaseConfig(Range<const PhaseConfig>(transformedConfigs.begin(), transformedConfigs.end())); - mCloth.notifyChanged(); - mCloth.wakeUp(); + setPhaseConfigInternal(Range<const PhaseConfig>(transformedConfigs.begin(), transformedConfigs.end())); + notifyChanged(); + wakeUp(); } -template <> -void ClothImpl<CuCloth>::setSelfCollisionIndices(Range<const uint32_t> indices) +void CuCloth::setSelfCollisionIndices(Range<const uint32_t> indices) { - ContextLockType lock(mCloth.mFactory); - mCloth.mSelfCollisionIndices.assign(indices.begin(), indices.end()); - mCloth.mSelfCollisionIndicesHost.assign(indices.begin(), indices.end()); - mCloth.notifyChanged(); - mCloth.wakeUp(); + ContextLockType lock(mFactory); + mSelfCollisionIndices.assign(indices.begin(), indices.end()); + mSelfCollisionIndicesHost.assign(indices.begin(), indices.end()); + notifyChanged(); + wakeUp(); } -template <> -uint32_t ClothImpl<CuCloth>::getNumVirtualParticles() const +uint32_t CuCloth::getNumVirtualParticles() const { - return uint32_t(mCloth.mVirtualParticleIndices.size()); + return uint32_t(mVirtualParticleIndices.size()); } -template <> -Range<PxVec4> ClothImpl<CuCloth>::getParticleAccelerations() +Range<PxVec4> CuCloth::getParticleAccelerations() { - if (mCloth.mParticleAccelerations.empty()) + if (mParticleAccelerations.empty()) { - CuContextLock contextLock(mCloth.mFactory); - mCloth.mParticleAccelerations.resize(mCloth.mNumParticles); + CuContextLock contextLock(mFactory); + mParticleAccelerations.resize(mNumParticles); } - if (!mCloth.mParticleAccelerationsHostCopy.capacity()) + if (!mParticleAccelerationsHostCopy.capacity()) { - CuContextLock contextLock(mCloth.mFactory); - mCloth.mParticleAccelerationsHostCopy.reserve(mCloth.mNumParticles); + CuContextLock contextLock(mFactory); + mParticleAccelerationsHostCopy.reserve(mNumParticles); } - mCloth.mParticleAccelerationsHostCopy.resizeUninitialized(mCloth.mNumParticles); + mParticleAccelerationsHostCopy.resizeUninitialized(mNumParticles); - mCloth.wakeUp(); + wakeUp(); - PxVec4* data = mCloth.mParticleAccelerationsHostCopy.begin(); - return Range<PxVec4>(data, mCloth.mParticleAccelerationsHostCopy.end()); + PxVec4* data = mParticleAccelerationsHostCopy.begin(); + return Range<PxVec4>(data, mParticleAccelerationsHostCopy.end()); } -template <> -void ClothImpl<CuCloth>::clearParticleAccelerations() +void CuCloth::clearParticleAccelerations() { - CuContextLock contextLock(mCloth.mFactory); - CuDeviceVector<PxVec4>(mCloth.mFactory.mContext).swap(mCloth.mParticleAccelerations); - CuHostVector<PxVec4, CU_MEMHOSTALLOC_DEVICEMAP>::Type().swap(mCloth.mParticleAccelerationsHostCopy); - mCloth.wakeUp(); + CuContextLock contextLock(mFactory); + CuDeviceVector<PxVec4>(mFactory.mContext).swap(mParticleAccelerations); + CuHostVector<PxVec4, CU_MEMHOSTALLOC_DEVICEMAP>::Type().swap(mParticleAccelerationsHostCopy); + wakeUp(); } namespace @@ -469,12 +455,11 @@ namespace } } -template <> -void ClothImpl<CuCloth>::setVirtualParticles(Range<const uint32_t[4]> indices, Range<const PxVec3> weights) +void CuCloth::setVirtualParticles(Range<const uint32_t[4]> indices, Range<const PxVec3> weights) { // shuffle indices to form independent SIMD sets TripletScheduler scheduler(indices); - scheduler.warp(mCloth.mNumParticles, 32); + scheduler.warp(mNumParticles, 32); // convert to 16bit indices Vector<Vec4us>::Type hostIndices; @@ -497,15 +482,15 @@ void ClothImpl<CuCloth>::setVirtualParticles(Range<const uint32_t[4]> indices, R hostWeights.pushBack(PxVec4( w.x, w.y, w.z, scale )); } - CuContextLock contextLock(mCloth.mFactory); + CuContextLock contextLock(mFactory); // todo: 'swap' these to force reallocation? - mCloth.mVirtualParticleIndices = hostIndices; - mCloth.mVirtualParticleSetSizes = scheduler.mSetSizes; - mCloth.mVirtualParticleWeights = hostWeights; + mVirtualParticleIndices = hostIndices; + mVirtualParticleSetSizes = scheduler.mSetSizes; + mVirtualParticleWeights = hostWeights; - mCloth.notifyChanged(); - mCloth.wakeUp(); + notifyChanged(); + wakeUp(); } } // namespace cloth diff --git a/NvCloth/src/cuda/CuCloth.h b/NvCloth/src/cuda/CuCloth.h index 1f86343..8dc3082 100644 --- a/NvCloth/src/cuda/CuCloth.h +++ b/NvCloth/src/cuda/CuCloth.h @@ -43,6 +43,8 @@ #include <foundation/PxVec3.h> #include <foundation/PxTransform.h> #include "NvCloth/Allocator.h" +#include "ClothImpl.h" +#include "CuFactory.h" namespace nv { @@ -50,7 +52,6 @@ namespace cloth { class CuFabric; -class CuFactory; struct CuClothData; struct CuConstraints @@ -74,7 +75,18 @@ struct CuConstraints CuHostVector<physx::PxVec4, CU_MEMHOSTALLOC_DEVICEMAP>::Type mHostCopy; }; -class CuCloth : protected CuContextLock +class CuCloth; + +template<> +class ClothTraits<CuCloth> +{ +public: + typedef CuFactory FactoryType; + typedef CuFabric FabricType; + typedef CuContextLock ContextLockType; +}; + +class CuCloth : protected CuContextLock, public ClothImpl<CuCloth> { CuCloth(); // not implemented @@ -94,14 +106,24 @@ class CuCloth : protected CuContextLock ~CuCloth(); // not virtual on purpose public: - bool isSleeping() const - { - return mSleepPassCounter >= mSleepAfterCount; - } - void wakeUp() - { - mSleepPassCounter = 0; - } + virtual Cloth* clone(Factory& factory) const; + uint32_t getNumParticles() const; + + void lockParticles() const; + void unlockParticles() const; + + MappedRange<physx::PxVec4> getCurrentParticles(); + MappedRange<const physx::PxVec4> getCurrentParticles() const; + MappedRange<physx::PxVec4> getPreviousParticles(); + MappedRange<const physx::PxVec4> getPreviousParticles() const; + GpuParticles getGpuParticles(); + void setPhaseConfig(Range<const PhaseConfig> configs); + + void setSelfCollisionIndices(Range<const uint32_t> indices); + uint32_t getNumVirtualParticles() const; + Range<physx::PxVec4> getParticleAccelerations(); + void clearParticleAccelerations(); + void setVirtualParticles(Range<const uint32_t[4]> indices, Range<const physx::PxVec3> weights); void notifyChanged(); @@ -109,7 +131,7 @@ class CuCloth : protected CuContextLock uint32_t getSharedMemorySize() const; // without particle data // expects transformed configs, doesn't call notifyChanged() - void setPhaseConfig(Range<const PhaseConfig>); + void setPhaseConfigInternal(Range<const PhaseConfig>); Range<physx::PxVec4> push(CuConstraints&); void clear(CuConstraints&); @@ -133,27 +155,6 @@ class CuCloth : protected CuContextLock bool mDeviceParticlesDirty; bool mHostParticlesDirty; - physx::PxVec3 mParticleBoundsCenter; - physx::PxVec3 mParticleBoundsHalfExtent; - - physx::PxVec3 mGravity; - physx::PxVec3 mLogDamping; - physx::PxVec3 mLinearLogDrag; - physx::PxVec3 mAngularLogDrag; - physx::PxVec3 mLinearInertia; - physx::PxVec3 mAngularInertia; - physx::PxVec3 mCentrifugalInertia; - float mSolverFrequency; - float mStiffnessFrequency; - - physx::PxTransform mTargetMotion; - physx::PxTransform mCurrentMotion; - physx::PxVec3 mLinearVelocity; - physx::PxVec3 mAngularVelocity; - - float mPrevIterDt; - MovingAverage mIterDtAvg; - CuDeviceVector<CuPhaseConfig> mPhaseConfigs; // transformed! Vector<PhaseConfig>::Type mHostPhaseConfigs; // transformed! @@ -174,11 +175,6 @@ class CuCloth : protected CuContextLock CuDeviceVector<physx::PxVec4> mParticleAccelerations; CuHostVector<physx::PxVec4, CU_MEMHOSTALLOC_DEVICEMAP>::Type mParticleAccelerationsHostCopy; - // wind - physx::PxVec3 mWind; - float mDragLogCoefficient; - float mLiftLogCoefficient; - // collision stuff CuHostVector<IndexPair, CU_MEMHOSTALLOC_DEVICEMAP>::Type mCapsuleIndices; CuHostVector<physx::PxVec4, CU_MEMHOSTALLOC_DEVICEMAP>::Type mStartCollisionSpheres; @@ -208,13 +204,6 @@ class CuCloth : protected CuContextLock // 4 (position) + 2 (key) per particle + cellStart (8322) CuDeviceVector<float> mSelfCollisionData; - // sleeping (see SwCloth for comments) - uint32_t mSleepTestInterval; - uint32_t mSleepAfterCount; - float mSleepThreshold; - uint32_t mSleepPassCounter; - uint32_t mSleepTestCounter; - uint32_t mSharedMemorySize; void* mUserData; diff --git a/NvCloth/src/cuda/CuClothClone.cpp b/NvCloth/src/cuda/CuClothClone.cpp index df43c66..5dba4ec 100644 --- a/NvCloth/src/cuda/CuClothClone.cpp +++ b/NvCloth/src/cuda/CuClothClone.cpp @@ -56,11 +56,10 @@ Range<const uint32_t> getSelfCollisionIndices(const CuCloth& cloth) return makeRange(cloth.mSelfCollisionIndicesHost); } -template <> -Cloth* ClothImpl<CuCloth>::clone(Factory& factory) const +Cloth* CuCloth::clone(Factory& factory) const { - if (&mCloth.mFactory == &factory) - return NV_CLOTH_NEW(ClothImpl<CuCloth>)(factory, *this); // copy construct directly + if (&mFactory == &factory) + return NV_CLOTH_NEW(CuCloth)(mFactory, *this); // copy construct directly switch(factory.getPlatform()) { @@ -77,7 +76,7 @@ Cloth* ClothImpl<CuCloth>::clone(Factory& factory) const Cloth* CuFactory::clone(const Cloth& cloth) { if (cloth.getFactory().getPlatform() == Platform::CPU) - return convertCloth(*this, static_cast<const SwClothImpl&>(cloth)); + return convertCloth(*this, static_cast<const SwCloth&>(cloth)); return cloth.clone(*this); } diff --git a/NvCloth/src/cuda/CuFactory.cpp b/NvCloth/src/cuda/CuFactory.cpp index 460cebc..397262c 100644 --- a/NvCloth/src/cuda/CuFactory.cpp +++ b/NvCloth/src/cuda/CuFactory.cpp @@ -35,7 +35,6 @@ #include "CuCheckSuccess.h" #include "CuContextLock.h" #include <cuda.h> -#include <PsFoundation.h> #include "CuSolverKernelBlob.h" #if PX_VC @@ -155,7 +154,7 @@ cloth::Fabric* cloth::CuFactory::createFabric(uint32_t numParticles, Range<const cloth::Cloth* cloth::CuFactory::createCloth(Range<const PxVec4> particles, Fabric& fabric) { - return NV_CLOTH_NEW(CuClothImpl)(*this, fabric, particles); + return NV_CLOTH_NEW(CuCloth)(*this, static_cast<CuFabric&>(fabric), particles); } cloth::Solver* cloth::CuFactory::createSolver() @@ -255,7 +254,7 @@ void cloth::CuFactory::extractCollisionData(const Cloth& cloth, Range<PxVec4> sp { NV_CLOTH_ASSERT(&cloth.getFactory() == this); - const CuCloth& cuCloth = static_cast<const CuClothImpl&>(cloth).mCloth; + const CuCloth& cuCloth = static_cast<const CuCloth&>(cloth); NV_CLOTH_ASSERT(spheres.empty() || spheres.size() == cuCloth.mStartCollisionSpheres.size()); NV_CLOTH_ASSERT(capsules.empty() || capsules.size() == cuCloth.mCapsuleIndices.size() * 2); @@ -287,7 +286,7 @@ void cloth::CuFactory::extractMotionConstraints(const Cloth& cloth, Range<PxVec4 { NV_CLOTH_ASSERT(&cloth.getFactory() == this); - const CuCloth& cuCloth = static_cast<const CuClothImpl&>(cloth).mCloth; + const CuCloth& cuCloth = static_cast<const CuCloth&>(cloth); if (cuCloth.mMotionConstraints.mHostCopy.size()) { @@ -314,7 +313,7 @@ void cloth::CuFactory::extractSeparationConstraints(const Cloth& cloth, Range<Px { NV_CLOTH_ASSERT(&cloth.getFactory() == this); - const CuCloth& cuCloth = static_cast<const CuClothImpl&>(cloth).mCloth; + const CuCloth& cuCloth = static_cast<const CuCloth&>(cloth); if (cuCloth.mSeparationConstraints.mHostCopy.size()) { @@ -341,7 +340,7 @@ void cloth::CuFactory::extractParticleAccelerations(const Cloth& cloth, Range<Px { NV_CLOTH_ASSERT(&cloth.getFactory() == this); - const CuCloth& cuCloth = static_cast<const CuClothImpl&>(cloth).mCloth; + const CuCloth& cuCloth = static_cast<const CuCloth&>(cloth); if (cuCloth.mParticleAccelerationsHostCopy.size()) { @@ -359,7 +358,7 @@ void cloth::CuFactory::extractVirtualParticles(const Cloth& cloth, Range<uint32_ CuContextLock contextLock(*this); - const CuCloth& cuCloth = static_cast<const CuClothImpl&>(cloth).mCloth; + const CuCloth& cuCloth = static_cast<const CuCloth&>(cloth); if (destWeights.size() > 0) { @@ -400,7 +399,7 @@ void cloth::CuFactory::extractVirtualParticles(const Cloth& cloth, Range<uint32_ void cloth::CuFactory::extractSelfCollisionIndices(const Cloth& cloth, Range<uint32_t> destIndices) const { - const CuCloth& cuCloth = static_cast<const CuClothImpl&>(cloth).mCloth; + const CuCloth& cuCloth = static_cast<const CuCloth&>(cloth); NV_CLOTH_ASSERT(destIndices.size() == cuCloth.mSelfCollisionIndices.size()); copyToHost(cuCloth.mSelfCollisionIndices.begin().get(), cuCloth.mSelfCollisionIndices.end().get(), destIndices.begin()); @@ -408,7 +407,7 @@ void cloth::CuFactory::extractSelfCollisionIndices(const Cloth& cloth, Range<uin void cloth::CuFactory::extractRestPositions(const Cloth& cloth, Range<PxVec4> destRestPositions) const { - const CuCloth& cuCloth = static_cast<const CuClothImpl&>(cloth).mCloth; + const CuCloth& cuCloth = static_cast<const CuCloth&>(cloth); NV_CLOTH_ASSERT(destRestPositions.size() == cuCloth.mRestPositions.size()); copyToHost(cuCloth.mRestPositions.begin().get(), cuCloth.mRestPositions.end().get(), destRestPositions.begin()); } diff --git a/NvCloth/src/cuda/CuFactory.h b/NvCloth/src/cuda/CuFactory.h index 81799ec..3ff5752 100644 --- a/NvCloth/src/cuda/CuFactory.h +++ b/NvCloth/src/cuda/CuFactory.h @@ -52,7 +52,7 @@ class CuFactory : public Factory public: typedef CuFabric FabricType; - typedef ClothImpl<CuCloth> ImplType; + typedef CuCloth ClothType; CuFactory(CUcontext); virtual ~CuFactory(); diff --git a/NvCloth/src/cuda/CuSolver.cpp b/NvCloth/src/cuda/CuSolver.cpp index 7927a42..f0e328f 100644 --- a/NvCloth/src/cuda/CuSolver.cpp +++ b/NvCloth/src/cuda/CuSolver.cpp @@ -326,7 +326,7 @@ struct ClothSimCostGreater void cloth::CuSolver::addCloth(Cloth* cloth) { - CuCloth& cuCloth = static_cast<CuClothImpl&>(*cloth).mCloth; + CuCloth& cuCloth = *static_cast<CuCloth*>(cloth); NV_CLOTH_ASSERT(mCloths.find(&cuCloth) == mCloths.end()); @@ -348,7 +348,7 @@ void cloth::CuSolver::addCloth(Cloth* cloth) void cloth::CuSolver::removeCloth(Cloth* cloth) { - CuCloth& cuCloth = static_cast<CuClothImpl&>(*cloth).mCloth; + CuCloth& cuCloth = static_cast<CuCloth&>(*cloth); ClothVector::Iterator begin = mCloths.begin(), end = mCloths.end(); ClothVector::Iterator it = mCloths.find(&cuCloth); @@ -364,6 +364,18 @@ void cloth::CuSolver::removeCloth(Cloth* cloth) mClothDataDirty = true; } +int cloth::CuSolver::getNumCloths() const +{ + return mCloths.size(); +} +cloth::Cloth * const * cloth::CuSolver::getClothList() const +{ + if(getNumCloths()) + return reinterpret_cast<Cloth* const*>(&mCloths[0]); + else + return nullptr; +} + bool cloth::CuSolver::beginSimulation(float dt) { if (mCloths.empty()) diff --git a/NvCloth/src/cuda/CuSolver.h b/NvCloth/src/cuda/CuSolver.h index 8e256a7..0406e00 100644 --- a/NvCloth/src/cuda/CuSolver.h +++ b/NvCloth/src/cuda/CuSolver.h @@ -57,8 +57,10 @@ public: CuSolver(CuFactory&); ~CuSolver(); - virtual void addCloth(Cloth*); - virtual void removeCloth(Cloth*); + virtual void addCloth(Cloth*) override; + virtual void removeCloth(Cloth*) override; + virtual int getNumCloths() const override; + virtual Cloth * const * getClothList() const override; // functions executing the simulation work. virtual bool beginSimulation(float dt); diff --git a/NvCloth/src/dx/DxBatchedVector.h b/NvCloth/src/dx/DxBatchedVector.h index 674586e..2c5e313 100644 --- a/NvCloth/src/dx/DxBatchedVector.h +++ b/NvCloth/src/dx/DxBatchedVector.h @@ -225,7 +225,7 @@ class DxBatchedVector DxBatchedVector& operator = (const DxBatchedVector& other) { NV_CLOTH_ASSERT(mSize == other.size()); // current limitation - NV_CLOTH_ASSERT(!mStorage.mMapRefCount); + NV_CLOTH_ASSERT(!mStorage.mMapRefCount); // This will trigger if the user still has a reference to the MappedRange returned by Cloth::getCurrentParticles CD3D11_BOX box(other.mOffset * sizeof(T), 0, 0, (other.mOffset + other.size()) * sizeof(T), 1, 1); mStorage.mBuffer.context()->CopySubresourceRegion(buffer(), 0, mOffset * sizeof(T), 0, 0, other.buffer(), 0, diff --git a/NvCloth/src/dx/DxCloth.cpp b/NvCloth/src/dx/DxCloth.cpp index f87943e..68c3289 100644 --- a/NvCloth/src/dx/DxCloth.cpp +++ b/NvCloth/src/dx/DxCloth.cpp @@ -36,7 +36,6 @@ #include "../TripletScheduler.h" #include "../ClothBase.h" #include <foundation/PxMat44.h> -#include <PsFoundation.h> #if NV_CLOTH_ENABLE_DX11 @@ -224,7 +223,7 @@ uint32_t cloth::DxCloth::getSharedMemorySize() const return phaseConfigSize + sizeof(float) * (continuousCollisionSize + std::max(selfCollisionSize, discreteCollisionSize)); } -void cloth::DxCloth::setPhaseConfig(Range<const PhaseConfig> configs) +void cloth::DxCloth::setPhaseConfigInternal(Range<const PhaseConfig> configs) { mHostPhaseConfigs.assign(configs.begin(), configs.end()); @@ -332,71 +331,62 @@ namespace nv namespace cloth { -// ClothImpl<DxCloth>::clone() implemented in DxClothClone.cpp +// DxCloth::clone() implemented in DxClothClone.cpp -template <> -uint32_t ClothImpl<DxCloth>::getNumParticles() const +uint32_t DxCloth::getNumParticles() const { - return mCloth.mNumParticles; + return mNumParticles; } -template <> -void ClothImpl<DxCloth>::lockParticles() const +void DxCloth::lockParticles() const { - const_cast<DxCloth&>(mCloth).mapParticles(); + const_cast<DxCloth&>(*this).mapParticles(); } -template <> -void ClothImpl<DxCloth>::unlockParticles() const +void DxCloth::unlockParticles() const { - const_cast<DxCloth&>(mCloth).unmapParticles(); + const_cast<DxCloth&>(*this).unmapParticles(); } -template <> -MappedRange<PxVec4> ClothImpl<DxCloth>::getCurrentParticles() +MappedRange<PxVec4> DxCloth::getCurrentParticles() { - mCloth.wakeUp(); + wakeUp(); lockParticles(); - mCloth.mDeviceParticlesDirty = true; - return getMappedParticles(mCloth.mParticlesMapPointer); + mDeviceParticlesDirty = true; + return getMappedParticles(mParticlesMapPointer); } -template <> -MappedRange<const PxVec4> ClothImpl<DxCloth>::getCurrentParticles() const +MappedRange<const PxVec4> DxCloth::getCurrentParticles() const { lockParticles(); - const PxVec4* data = mCloth.mParticlesMapPointer; + const PxVec4* data = mParticlesMapPointer; return getMappedParticles(data); } -template <> -MappedRange<PxVec4> ClothImpl<DxCloth>::getPreviousParticles() +MappedRange<PxVec4> DxCloth::getPreviousParticles() { - mCloth.wakeUp(); + wakeUp(); lockParticles(); - mCloth.mDeviceParticlesDirty = true; - return getMappedParticles(mCloth.mParticlesMapPointer + mCloth.mNumParticles); + mDeviceParticlesDirty = true; + return getMappedParticles(mParticlesMapPointer + mNumParticles); } -template <> -MappedRange<const PxVec4> ClothImpl<DxCloth>::getPreviousParticles() const +MappedRange<const PxVec4> DxCloth::getPreviousParticles() const { lockParticles(); - const PxVec4* data = (const PxVec4*)mCloth.mParticlesMapPointer; - return getMappedParticles(data + mCloth.mNumParticles); + const PxVec4* data = (const PxVec4*)mParticlesMapPointer; + return getMappedParticles(data + mNumParticles); } -template <> -GpuParticles ClothImpl<DxCloth>::getGpuParticles() +GpuParticles DxCloth::getGpuParticles() { - ID3D11Buffer* buffer = mCloth.mParticles.buffer(); - PxVec4* offset = (PxVec4*)nullptr + mCloth.mParticles.mOffset; - GpuParticles result = { offset, offset + mCloth.mNumParticles, buffer }; + ID3D11Buffer* buffer = mParticles.buffer(); + PxVec4* offset = (PxVec4*)nullptr + mParticles.mOffset; + GpuParticles result = { offset, offset + mNumParticles, buffer }; return result; } -template <> -void ClothImpl<DxCloth>::setPhaseConfig(Range<const PhaseConfig> configs) +void DxCloth::setPhaseConfig(Range<const PhaseConfig> configs) { Vector<PhaseConfig>::Type transformedConfigs; transformedConfigs.reserve(configs.size()); @@ -406,57 +396,53 @@ void ClothImpl<DxCloth>::setPhaseConfig(Range<const PhaseConfig> configs) if (configs.front().mStiffness > 0.0f) transformedConfigs.pushBack(transform(configs.front())); - mCloth.setPhaseConfig(Range<const PhaseConfig>(transformedConfigs.begin(), + setPhaseConfigInternal(Range<const PhaseConfig>(transformedConfigs.begin(), transformedConfigs.begin() + transformedConfigs.size())); - mCloth.notifyChanged(); - mCloth.wakeUp(); + notifyChanged(); + wakeUp(); } -template <> -void ClothImpl<DxCloth>::setSelfCollisionIndices(Range<const uint32_t> indices) +void DxCloth::setSelfCollisionIndices(Range<const uint32_t> indices) { - ContextLockType lock(mCloth.mFactory); - mCloth.mSelfCollisionIndices.assign(indices.begin(), indices.end()); - mCloth.mSelfCollisionIndicesHost.assign(indices.begin(), indices.end()); - mCloth.notifyChanged(); - mCloth.wakeUp(); + ContextLockType lock(mFactory); + mSelfCollisionIndices.assign(indices.begin(), indices.end()); + mSelfCollisionIndicesHost.assign(indices.begin(), indices.end()); + notifyChanged(); + wakeUp(); } -template <> -uint32_t ClothImpl<DxCloth>::getNumVirtualParticles() const +uint32_t DxCloth::getNumVirtualParticles() const { - return uint32_t(mCloth.mVirtualParticleIndices.size()); + return uint32_t(mVirtualParticleIndices.size()); } -template <> -Range<PxVec4> ClothImpl<DxCloth>::getParticleAccelerations() +Range<PxVec4> DxCloth::getParticleAccelerations() { - if (mCloth.mParticleAccelerations.empty()) + if (mParticleAccelerations.empty()) { - DxContextLock contextLock(mCloth.mFactory); - mCloth.mParticleAccelerations.resize(mCloth.mNumParticles); + DxContextLock contextLock(mFactory); + mParticleAccelerations.resize(mNumParticles); } - if (!mCloth.mParticleAccelerationsHostCopy.capacity()) + if (!mParticleAccelerationsHostCopy.capacity()) { - DxContextLock contextLock(mCloth.mFactory); - mCloth.mParticleAccelerationsHostCopy.reserve(mCloth.mNumParticles); + DxContextLock contextLock(mFactory); + mParticleAccelerationsHostCopy.reserve(mNumParticles); } - mCloth.mParticleAccelerationsHostCopy.resizeUninitialized(mCloth.mNumParticles); + mParticleAccelerationsHostCopy.resizeUninitialized(mNumParticles); - mCloth.wakeUp(); + wakeUp(); - PxVec4* data = mCloth.mParticleAccelerationsHostCopy.begin(); - return Range<PxVec4>(data, mCloth.mParticleAccelerationsHostCopy.end()); + PxVec4* data = mParticleAccelerationsHostCopy.begin(); + return Range<PxVec4>(data, mParticleAccelerationsHostCopy.end()); } -template <> -void ClothImpl<DxCloth>::clearParticleAccelerations() +void DxCloth::clearParticleAccelerations() { - DxContextLock contextLock(mCloth.mFactory); - mCloth.mParticleAccelerations.clear(); - Vector<PxVec4>::Type().swap(mCloth.mParticleAccelerationsHostCopy); - mCloth.wakeUp(); + DxContextLock contextLock(mFactory); + mParticleAccelerations.clear(); + Vector<PxVec4>::Type().swap(mParticleAccelerationsHostCopy); + wakeUp(); } namespace @@ -488,12 +474,11 @@ uint32_t calculateNumReplays(const Vector<Vec4u>::Type& triplets, const Vector<u } } -template <> -void ClothImpl<DxCloth>::setVirtualParticles(Range<const uint32_t[4]> indices, Range<const PxVec3> weights) +void DxCloth::setVirtualParticles(Range<const uint32_t[4]> indices, Range<const PxVec3> weights) { // shuffle indices to form independent SIMD sets TripletScheduler scheduler(indices); - scheduler.warp(mCloth.mNumParticles, 32); + scheduler.warp(mNumParticles, 32); // convert to 16bit indices Vector<Vec4us>::Type hostIndices; @@ -516,15 +501,15 @@ void ClothImpl<DxCloth>::setVirtualParticles(Range<const uint32_t[4]> indices, R hostWeights.pushBack(PxVec4(w.x, w.y, w.z, scale)); } - DxContextLock contextLock(mCloth.mFactory); + DxContextLock contextLock(mFactory); // todo: 'swap' these to force reallocation? - mCloth.mVirtualParticleIndices = hostIndices; - mCloth.mVirtualParticleSetSizes = scheduler.mSetSizes; - mCloth.mVirtualParticleWeights = hostWeights; + mVirtualParticleIndices = hostIndices; + mVirtualParticleSetSizes = scheduler.mSetSizes; + mVirtualParticleWeights = hostWeights; - mCloth.notifyChanged(); - mCloth.wakeUp(); + notifyChanged(); + wakeUp(); } } // namespace cloth diff --git a/NvCloth/src/dx/DxCloth.h b/NvCloth/src/dx/DxCloth.h index bde2bd6..5e783fa 100644 --- a/NvCloth/src/dx/DxCloth.h +++ b/NvCloth/src/dx/DxCloth.h @@ -40,14 +40,15 @@ #include <foundation/PxVec4.h> #include <foundation/PxVec3.h> #include <foundation/PxTransform.h> +#include "DxFactory.h" +#include "DxFabric.h" +#include "ClothImpl.h" namespace nv { namespace cloth { -class DxFabric; -class DxFactory; struct DxClothData; struct DxConstraints @@ -71,7 +72,16 @@ struct DxConstraints Vector<physx::PxVec4>::Type mHostCopy; }; -class DxCloth : protected DxContextLock +template<> +class ClothTraits<DxCloth> +{ +public: + typedef DxFactory FactoryType; + typedef DxFabric FabricType; + typedef DxContextLock ContextLockType; +}; + +class DxCloth : protected DxContextLock, public ClothImpl<DxCloth> { DxCloth(const DxCloth&); // not implemented DxCloth& operator = (const DxCloth&); // not implemented @@ -94,14 +104,24 @@ class DxCloth : protected DxContextLock ~DxCloth(); // not virtual on purpose public: - bool isSleeping() const - { - return mSleepPassCounter >= mSleepAfterCount; - } - void wakeUp() - { - mSleepPassCounter = 0; - } + virtual Cloth* clone(Factory& factory) const; + uint32_t getNumParticles() const; + + void lockParticles() const; + void unlockParticles() const; + + MappedRange<physx::PxVec4> getCurrentParticles(); + MappedRange<const physx::PxVec4> getCurrentParticles() const; + MappedRange<physx::PxVec4> getPreviousParticles(); + MappedRange<const physx::PxVec4> getPreviousParticles() const; + GpuParticles getGpuParticles(); + + void setPhaseConfig(Range<const PhaseConfig> configs); + void setSelfCollisionIndices(Range<const uint32_t> indices); + uint32_t getNumVirtualParticles() const; + Range<physx::PxVec4> getParticleAccelerations(); + void clearParticleAccelerations(); + void setVirtualParticles(Range<const uint32_t[4]> indices, Range<const physx::PxVec3> weights); void notifyChanged(); @@ -109,7 +129,7 @@ class DxCloth : protected DxContextLock uint32_t getSharedMemorySize() const; // without particle data // expects transformed configs, doesn't call notifyChanged() - void setPhaseConfig(Range<const PhaseConfig>); + void setPhaseConfigInternal(Range<const PhaseConfig>); Range<physx::PxVec4> push(DxConstraints&); void clear(DxConstraints&); @@ -136,27 +156,6 @@ class DxCloth : protected DxContextLock bool mDeviceParticlesDirty; bool mHostParticlesDirty; - physx::PxVec3 mParticleBoundsCenter; - physx::PxVec3 mParticleBoundsHalfExtent; - - physx::PxVec3 mGravity; - physx::PxVec3 mLogDamping; - physx::PxVec3 mLinearLogDrag; - physx::PxVec3 mAngularLogDrag; - physx::PxVec3 mLinearInertia; - physx::PxVec3 mAngularInertia; - physx::PxVec3 mCentrifugalInertia; - float mSolverFrequency; - float mStiffnessFrequency; - - physx::PxTransform mTargetMotion; - physx::PxTransform mCurrentMotion; - physx::PxVec3 mLinearVelocity; - physx::PxVec3 mAngularVelocity; - - float mPrevIterDt; - MovingAverage mIterDtAvg; - DxBatchedVector<DxPhaseConfig> mPhaseConfigs; Vector<PhaseConfig>::Type mHostPhaseConfigs; @@ -177,11 +176,6 @@ class DxCloth : protected DxContextLock DxBatchedVector<physx::PxVec4> mParticleAccelerations; Vector<physx::PxVec4>::Type mParticleAccelerationsHostCopy; - // wind - physx::PxVec3 mWind; - float mDragLogCoefficient; - float mLiftLogCoefficient; - // collision stuff DxBatchedVector<IndexPair> mCapsuleIndices; DxBatchedVector<physx::PxVec4> mStartCollisionSpheres; @@ -214,13 +208,6 @@ class DxCloth : protected DxContextLock bool mInitSelfCollisionData; - // sleeping - uint32_t mSleepTestInterval; // how often to test for movement - uint32_t mSleepAfterCount; // number of tests to pass before sleep - float mSleepThreshold; // max movement delta to pass test - uint32_t mSleepPassCounter; // how many tests passed - uint32_t mSleepTestCounter; // how many iterations since tested - uint32_t mSharedMemorySize; void* mUserData; diff --git a/NvCloth/src/dx/DxClothClone.cpp b/NvCloth/src/dx/DxClothClone.cpp index 3f41cdc..77ba96a 100644 --- a/NvCloth/src/dx/DxClothClone.cpp +++ b/NvCloth/src/dx/DxClothClone.cpp @@ -58,11 +58,10 @@ Range<const uint32_t> getSelfCollisionIndices(const DxCloth& cloth) return makeRange(cloth.mSelfCollisionIndicesHost); } -template <> -Cloth* ClothImpl<DxCloth>::clone(Factory& factory) const +Cloth* DxCloth::clone(Factory& factory) const { - if (&mCloth.mFactory == &factory) - return NV_CLOTH_NEW(ClothImpl<DxCloth>)(factory, *this); // copy construct directly + if (&mFactory == &factory) + return NV_CLOTH_NEW(DxCloth)(mFactory, *this); // copy construct directly switch(factory.getPlatform()) { @@ -82,7 +81,7 @@ Cloth* DxFactory::clone(const Cloth& cloth) { if (cloth.getNumParticles() > 2025 /* see DxSolverKernel.hlsl gCurParticles */) return nullptr; // can only fit 2025 particles in dx shared memory - return convertCloth(*this, static_cast<const SwClothImpl&>(cloth)); + return convertCloth(*this, static_cast<const SwCloth&>(cloth)); } return cloth.clone(*this); diff --git a/NvCloth/src/dx/DxClothData.cpp b/NvCloth/src/dx/DxClothData.cpp index 2625eac..075dc81 100644 --- a/NvCloth/src/dx/DxClothData.cpp +++ b/NvCloth/src/dx/DxClothData.cpp @@ -51,6 +51,9 @@ cloth::DxClothData::DxClothData(DxCloth& cloth) mConstraintOffset = cloth.mFabric.mConstraints.mOffset; mStiffnessOffset = cloth.mFabric.mStiffnessValues.empty() ? -1: cloth.mFabric.mStiffnessValues.mOffset; + mNumTriangles = cloth.mFabric.getNumTriangles(); + mStartTriangleOffset = cloth.mFabric.mTriangles.mOffset; + mNumTethers = cloth.mFabric.mTethers.size(); mTetherOffset = cloth.mFabric.mTethers.mOffset; mTetherConstraintScale = cloth.mTetherConstraintScale * cloth.mFabric.mTetherLengthScale; @@ -94,14 +97,24 @@ cloth::DxFrameData::DxFrameData(DxCloth& cloth, uint32_t numSharedPositions, con mFirstIteration = firstIteration; mNumIterations = state.mRemainingIterations; - Simd4f logStiffness = simd4f(0.0f, cloth.mSelfCollisionLogStiffness, cloth.mMotionConstraintLogStiffness, - cloth.mTetherConstraintLogStiffness); Simd4f stiffnessExponent = simd4f(cloth.mStiffnessFrequency * mIterDt); - Simd4f stiffness = gSimd4fOne - exp2(logStiffness * stiffnessExponent); + { + Simd4f logStiffness = simd4f(0.0f, cloth.mSelfCollisionLogStiffness, cloth.mMotionConstraintLogStiffness, + cloth.mTetherConstraintLogStiffness); + Simd4f stiffness = gSimd4fOne - exp2(logStiffness * stiffnessExponent); - mTetherConstraintStiffness = array(stiffness)[3]; - mMotionConstraintStiffness = array(stiffness)[2]; - mSelfCollisionStiffness = array(stiffness)[1]; + mTetherConstraintStiffness = array(stiffness)[3]; + mMotionConstraintStiffness = array(stiffness)[2]; + mSelfCollisionStiffness = array(stiffness)[1]; + } + { + Simd4f logStiffness = simd4f(cloth.mDragLogCoefficient, cloth.mLiftLogCoefficient, 0.0f, 0.0f); + Simd4f stiffness = gSimd4fOne - exp2(logStiffness * stiffnessExponent); + mDragCoefficient = array(stiffness)[0]; + mLiftCoefficient = array(stiffness)[1]; + for(int i = 0; i < 9; ++i) + mRotation[i] = array(state.mRotationMatrix[i / 3])[i % 3]; + } mStartSphereOffset = cloth.mStartCollisionSpheres.mOffset; mTargetSphereOffset = @@ -111,7 +124,6 @@ cloth::DxFrameData::DxFrameData(DxCloth& cloth, uint32_t numSharedPositions, con mTargetCollisionPlaneOffset = cloth.mTargetCollisionPlanes.empty() ? mStartCollisionPlaneOffset : cloth.mTargetCollisionPlanes.mOffset; - mStartCollisionTrianglesOffset = cloth.mStartCollisionTriangles.mOffset; mTargetCollisionTrianglesOffset = cloth.mTargetCollisionTriangles.empty() ? mStartCollisionTrianglesOffset : cloth.mTargetCollisionTriangles.mOffset; @@ -172,6 +184,10 @@ cloth::DxIterationData::DxIterationData(const IterationState<Simd4f>& state) copySquareTransposed(mIntegrationTrafo + 15, array(*state.mCurMatrix)); mIsTurning = uint32_t(state.mIsTurning); + + mWind[0] = array(state.mWind)[0]; + mWind[1] = array(state.mWind)[1]; + mWind[2] = array(state.mWind)[2]; } #endif // NV_CLOTH_ENABLE_DX11 diff --git a/NvCloth/src/dx/DxClothData.h b/NvCloth/src/dx/DxClothData.h index bac1a98..af02bc6 100644 --- a/NvCloth/src/dx/DxClothData.h +++ b/NvCloth/src/dx/DxClothData.h @@ -46,7 +46,7 @@ typedef unsigned int uint32_t; typedef int int32_t; #endif -static const uint32_t MaxParticlesInSharedMem = 1975; +static const uint32_t MaxParticlesInSharedMem = 1972; struct DxPhaseConfig @@ -106,6 +106,9 @@ struct DxClothData uint32_t mTetherOffset; float mTetherConstraintScale; + uint32_t mNumTriangles; + uint32_t mStartTriangleOffset; + // motion constraint data float mMotionConstraintScale; float mMotionConstraintBias; @@ -161,6 +164,11 @@ struct DxFrameData float mTetherConstraintStiffness; + // wind data + float mDragCoefficient; + float mLiftCoefficient; + float mRotation[9]; + // motion constraint data float mMotionConstraintStiffness; uint32_t mStartMotionConstrainsOffset; @@ -206,6 +214,7 @@ struct DxIterationData explicit DxIterationData(const IterationState<Simd4f>&); #endif float mIntegrationTrafo[24]; + float mWind[3]; uint32_t mIsTurning; }; diff --git a/NvCloth/src/dx/DxDeviceVector.h b/NvCloth/src/dx/DxDeviceVector.h index d64bd77..17b7d6e 100644 --- a/NvCloth/src/dx/DxDeviceVector.h +++ b/NvCloth/src/dx/DxDeviceVector.h @@ -44,6 +44,8 @@ struct DxBufferFlags D3D11_BIND_FLAG mBindFlag; D3D11_RESOURCE_MISC_FLAG mMiscFlag; D3D11_CPU_ACCESS_FLAG mCpuAccessFlag; + + bool isRawBuffer() { return (mMiscFlag & D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS) != 0; } }; inline DxBufferFlags DxDefaultBufferPolicy() @@ -55,6 +57,15 @@ inline DxBufferFlags DxDefaultBufferPolicy() return result; }; +inline DxBufferFlags DxDefaultRawBufferPolicy() +{ + DxBufferFlags result = {D3D11_USAGE_DEFAULT, + D3D11_BIND_FLAG(D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS), + D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, + D3D11_CPU_ACCESS_FLAG(0)}; + return result; +}; + inline DxBufferFlags DxDynamicBufferPolicy() { DxBufferFlags result = { D3D11_USAGE_DYNAMIC, D3D11_BIND_SHADER_RESOURCE, @@ -78,20 +89,20 @@ class DxBuffer : public DxBufferFlags public: DxBuffer(DxContextManagerCallback* manager, const DxBufferFlags& flags = DxDefaultBufferPolicy()) - : DxBufferFlags(flags), mCapacity(0), mBuffer(0), mManager(manager), mResourceView(nullptr), mAccessView(nullptr) + : DxBufferFlags(flags), mCapacity(0), mBuffer(0), mManager(manager), mResourceView(nullptr), mAccessView(nullptr), mAccessRawView(nullptr) { } DxBuffer(const T* first, const T* last, DxContextManagerCallback* manager, const DxBufferFlags& flags = DxDefaultBufferPolicy()) - : DxBufferFlags(flags), mCapacity(0), mBuffer(0), mManager(manager), mResourceView(nullptr), mAccessView(nullptr) + : DxBufferFlags(flags), mCapacity(0), mBuffer(0), mManager(manager), mResourceView(nullptr), mAccessView(nullptr), mAccessRawView(nullptr) { D3D11_SUBRESOURCE_DATA data = { first }; create(uint32_t(last - first), &data); } DxBuffer(const DxBuffer& other) - : DxBufferFlags(other), mCapacity(0), mBuffer(0), mManager(other.mManager), mResourceView(nullptr), mAccessView(nullptr) + : DxBufferFlags(other), mCapacity(0), mBuffer(0), mManager(other.mManager), mResourceView(nullptr), mAccessView(nullptr), mAccessRawView(nullptr) { operator=(other); } @@ -100,6 +111,8 @@ class DxBuffer : public DxBufferFlags { if (mAccessView) mAccessView->Release(); + if(mAccessRawView) + mAccessRawView->Release(); if (mResourceView) mResourceView->Release(); if (mBuffer) @@ -173,10 +186,28 @@ class DxBuffer : public DxBufferFlags return mAccessView; } + ID3D11UnorderedAccessView* accessViewRaw() + { + if(!mAccessRawView && mBuffer) + { + D3D11_BUFFER_UAV buffuav; + buffuav.FirstElement = 0; + buffuav.NumElements = (mCapacity * SizeOfT)>>2; + buffuav.Flags = D3D11_BUFFER_UAV_FLAG_RAW; + + D3D11_UNORDERED_ACCESS_VIEW_DESC desc; + desc.Format = DXGI_FORMAT_R32_TYPELESS; + desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; + desc.Buffer = buffuav; + mManager->getDevice()->CreateUnorderedAccessView(mBuffer, &desc, &mAccessRawView); + } + return mAccessRawView; + } + private: void create(uint32_t capacity, D3D11_SUBRESOURCE_DATA* data = 0) { - CD3D11_BUFFER_DESC desc(capacity * SizeOfT, mBindFlag, mUsage, mCpuAccessFlag, mMiscFlag, SizeOfT); + CD3D11_BUFFER_DESC desc(capacity * SizeOfT, mBindFlag, mUsage, mCpuAccessFlag, mMiscFlag, isRawBuffer()?0:SizeOfT); checkSuccess(mManager->getDevice()->CreateBuffer(&desc, data, &mBuffer)); mCapacity = capacity; @@ -187,6 +218,10 @@ class DxBuffer : public DxBufferFlags if (mAccessView) mAccessView->Release(); mAccessView = nullptr; + + if(mAccessRawView) + mAccessRawView->Release(); + mAccessRawView = nullptr; } public: @@ -195,6 +230,7 @@ class DxBuffer : public DxBufferFlags DxContextManagerCallback* mManager; ID3D11ShaderResourceView* mResourceView; ID3D11UnorderedAccessView* mAccessView; + ID3D11UnorderedAccessView* mAccessRawView; }; // STL-style vector that holds POD types in DX device memory. The interface @@ -383,6 +419,7 @@ void swap(nv::cloth::DxBuffer<T>& left, nv::cloth::DxBuffer<T>& right) swap(left.mManager, right.mManager); swap(left.mResourceView, right.mResourceView); swap(left.mAccessView, right.mAccessView); + swap(left.mAccessRawView, right.mAccessRawView); } } } diff --git a/NvCloth/src/dx/DxFabric.cpp b/NvCloth/src/dx/DxFabric.cpp index 4952e80..56b2b0a 100644 --- a/NvCloth/src/dx/DxFabric.cpp +++ b/NvCloth/src/dx/DxFabric.cpp @@ -49,6 +49,7 @@ cloth::DxFabric::DxFabric(DxFactory& factory, uint32_t numParticles, Range<const , mSets(sets.begin(), sets.end()) , mConstraints(mFactory.mConstraints) , mConstraintsHostCopy(mFactory.mConstraintsHostCopy) +, mTriangles(mFactory.mTriangles) , mStiffnessValues(mFactory.mStiffnessValues) , mTethers(mFactory.mTethers) , mId(id) @@ -114,12 +115,20 @@ cloth::DxFabric::DxFabric(DxFactory& factory, uint32_t numParticles, Range<const mTethers.assign(tethers.begin(), tethers.end()); // triangles - Vector<uint16_t>::Type hostTriangles; - hostTriangles.resizeUninitialized(triangles.size()); - Vector<uint16_t>::Type::Iterator tIt = hostTriangles.begin(); + Vector<uint32_t>::Type hostTriangles; + mNumTriangles = triangles.size(); + //make sure there is an even number of elements allocated + hostTriangles.resizeUninitialized(triangles.size()>>1); + Vector<uint32_t>::Type::Iterator tIt = hostTriangles.begin(); for (; !triangles.empty(); triangles.popFront()) - *tIt++ = uint16_t(triangles.front()); + { + uint32_t packed = triangles.front(); + triangles.popFront(); + if(!triangles.empty()) + packed |= triangles.front()<<16; + *tIt++ = packed; + } mTriangles.assign(hostTriangles.begin(), hostTriangles.end()); @@ -181,7 +190,7 @@ uint32_t cloth::DxFabric::getNumTethers() const uint32_t cloth::DxFabric::getNumTriangles() const { - return uint32_t(mTriangles.size()) / 3; + return uint32_t(mNumTriangles) / 3; } void cloth::DxFabric::scaleRestvalues(float scale) diff --git a/NvCloth/src/dx/DxFabric.h b/NvCloth/src/dx/DxFabric.h index 2e64cee..6bc5b07 100644 --- a/NvCloth/src/dx/DxFabric.h +++ b/NvCloth/src/dx/DxFabric.h @@ -85,7 +85,8 @@ public: DxBatchedVector<DxTether> mTethers; float mTetherLengthScale; - Vector<uint16_t>::Type mTriangles; + DxBatchedVector<uint32_t> mTriangles; //data stored is actually uint16_t + int mNumTriangles; Vector<uint32_t>::Type mFirstConstraintInPhase; Vector<uint32_t>::Type mNumConstraintsInPhase; diff --git a/NvCloth/src/dx/DxFactory.cpp b/NvCloth/src/dx/DxFactory.cpp index 0ab7129..fbf0c51 100644 --- a/NvCloth/src/dx/DxFactory.cpp +++ b/NvCloth/src/dx/DxFactory.cpp @@ -35,7 +35,6 @@ #include "DxCheckSuccess.h" #include "DxContextLock.h" #include "../ClothImpl.h" -#include <PsFoundation.h> #if NV_CLOTH_ENABLE_DX11 @@ -82,7 +81,7 @@ typedef Vec4T<uint32_t> Vec4u; , mConstraintsHostCopy(mContextManager, DxStagingBufferPolicy()) , mStiffnessValues(mContextManager) , mTethers(mContextManager) - , mParticles(mContextManager) + , mParticles(mContextManager, DxDefaultRawBufferPolicy()) , mParticlesHostCopy(mContextManager, DxStagingBufferPolicy()) , mParticleAccelerations(mContextManager) , mParticleAccelerationsHostCopy(mContextManager, DxStagingBufferPolicy()) @@ -104,6 +103,7 @@ typedef Vec4T<uint32_t> Vec4u; , mSelfCollisionIndices(mContextManager) , mSelfCollisionParticles(mContextManager) , mSelfCollisionData(mContextManager) + , mTriangles(mContextManager) { if (mContextManager->synchronizeResources()) { @@ -135,7 +135,7 @@ cloth::Fabric* cloth::DxFactory::createFabric(uint32_t numParticles, Range<const cloth::Cloth* cloth::DxFactory::createCloth(Range<const PxVec4> particles, Fabric& fabric) { - return NV_CLOTH_NEW(DxClothImpl)(*this, fabric, particles); + return NV_CLOTH_NEW(DxCloth)(*this, static_cast<DxFabric&>(fabric), particles); } cloth::Solver* cloth::DxFactory::createSolver() @@ -253,7 +253,7 @@ void cloth::DxFactory::extractFabricData(const Fabric& fabric, Range<uint32_t> p { PX_ASSERT(&cloth.getFactory() == this); - const DxCloth& dxCloth = static_cast<const DxClothImpl&>(cloth).mCloth; + const DxCloth& dxCloth = static_cast<const DxCloth&>(cloth); PX_ASSERT(spheres.empty() || spheres.size() == dxCloth.mStartCollisionSpheres.size()); PX_ASSERT(capsules.empty() || capsules.size() == dxCloth.mCapsuleIndices.size() * 2); @@ -298,7 +298,7 @@ void cloth::DxFactory::extractFabricData(const Fabric& fabric, Range<uint32_t> p { PX_ASSERT(&cloth.getFactory() == this); - const DxCloth& dxCloth = static_cast<const DxClothImpl&>(cloth).mCloth; + const DxCloth& dxCloth = static_cast<const DxCloth&>(cloth); if (dxCloth.mMotionConstraints.mHostCopy.size()) { @@ -324,7 +324,7 @@ void cloth::DxFactory::extractFabricData(const Fabric& fabric, Range<uint32_t> p { PX_ASSERT(&cloth.getFactory() == this); - const DxCloth& dxCloth = static_cast<const DxClothImpl&>(cloth).mCloth; + const DxCloth& dxCloth = static_cast<const DxCloth&>(cloth); if (dxCloth.mSeparationConstraints.mHostCopy.size()) { @@ -383,7 +383,7 @@ void cloth::DxFactory::extractFabricData(const Fabric& fabric, Range<uint32_t> p DxContextLock contextLock(*this); - const DxCloth& dxCloth = static_cast<const DxClothImpl&>(cloth).mCloth; + const DxCloth& dxCloth = static_cast<const DxCloth&>(cloth); if (destWeights.size() > 0) { @@ -424,7 +424,7 @@ void cloth::DxFactory::extractFabricData(const Fabric& fabric, Range<uint32_t> p void cloth::DxFactory::extractSelfCollisionIndices(const Cloth& cloth, Range<uint32_t> destIndices) const { - const DxCloth& dxCloth = static_cast<const DxClothImpl&>(cloth).mCloth; + const DxCloth& dxCloth = static_cast<const DxCloth&>(cloth); PX_ASSERT(destIndices.size() == dxCloth.mSelfCollisionIndices.size()); intrinsics::memCopy(destIndices.begin(), dxCloth.mSelfCollisionIndicesHost.begin(), destIndices.size() * sizeof(uint32_t)); @@ -432,7 +432,7 @@ void cloth::DxFactory::extractFabricData(const Fabric& fabric, Range<uint32_t> p void cloth::DxFactory::extractRestPositions(const Cloth& cloth, Range<PxVec4> destRestPositions) const { - const DxCloth& dxCloth = static_cast<const DxClothImpl&>(cloth).mCloth; + const DxCloth& dxCloth = static_cast<const DxCloth&>(cloth); PX_ASSERT(destRestPositions.size() == dxCloth.mRestPositions.size()); intrinsics::memCopy(destRestPositions.begin(), DxCloth::MappedVec4fVectorType(const_cast<DxCloth&>(dxCloth).mRestPositions).begin(), destRestPositions.size() * sizeof(PxVec4)); diff --git a/NvCloth/src/dx/DxFactory.h b/NvCloth/src/dx/DxFactory.h index 0fec0d8..23d5382 100644 --- a/NvCloth/src/dx/DxFactory.h +++ b/NvCloth/src/dx/DxFactory.h @@ -63,7 +63,7 @@ protected: public: typedef DxFabric FabricType; - typedef ClothImpl<DxCloth> ImplType; + typedef DxCloth ClothType; explicit DxFactory(DxContextManagerCallback*); virtual ~DxFactory(); @@ -155,6 +155,8 @@ protected: DxBatchedStorage<uint32_t> mSelfCollisionIndices; DxBatchedStorage<physx::PxVec4> mSelfCollisionParticles; DxBatchedStorage<uint32_t> mSelfCollisionData; + + DxBatchedStorage<uint32_t> mTriangles; }; } } diff --git a/NvCloth/src/dx/DxSolver.cpp b/NvCloth/src/dx/DxSolver.cpp index 4670bb6..ab030d5 100644 --- a/NvCloth/src/dx/DxSolver.cpp +++ b/NvCloth/src/dx/DxSolver.cpp @@ -36,7 +36,6 @@ #include "../IterationState.h" #include <PsSort.h> #include <foundation/PxProfiler.h> -#include <PsFoundation.h> #if NV_CLOTH_ENABLE_DX11 @@ -114,7 +113,7 @@ struct ClothSimCostGreater void cloth::DxSolver::addCloth(Cloth* cloth) { - DxCloth& dxCloth = static_cast<DxClothImpl&>(*cloth).mCloth; + DxCloth& dxCloth = static_cast<DxCloth&>(*cloth); NV_CLOTH_ASSERT(mCloths.find(&dxCloth) == mCloths.end()); @@ -211,10 +210,10 @@ void cloth::DxSolver::addCloth(Cloth* cloth) void cloth::DxSolver::removeCloth(Cloth* cloth) { - DxCloth& cuCloth = static_cast<DxClothImpl&>(*cloth).mCloth; + DxCloth& dxCloth = static_cast<DxCloth&>(*cloth); ClothVector::Iterator begin = mCloths.begin(), end = mCloths.end(); - ClothVector::Iterator it = mCloths.find(&cuCloth); + ClothVector::Iterator it = mCloths.find(&dxCloth); if (it == end) return; // not found @@ -227,6 +226,18 @@ void cloth::DxSolver::removeCloth(Cloth* cloth) mClothDataDirty = true; } +int cloth::DxSolver::getNumCloths() const +{ + return mCloths.size(); +} +cloth::Cloth * const * cloth::DxSolver::getClothList() const +{ + if(getNumCloths()) + return reinterpret_cast<Cloth* const*>(&mCloths[0]); + else + return nullptr; +} + bool cloth::DxSolver::beginSimulation(float dt) { if (mCloths.empty()) @@ -340,24 +351,25 @@ void cloth::DxSolver::executeKernel() { context->CSSetShader(mFactory.mSolverKernelComputeShader, NULL, 0); - ID3D11ShaderResourceView* resourceViews[17] = { + ID3D11ShaderResourceView* resourceViews[18] = { mClothData.mBuffer.resourceView(), /*mFrameData.mBuffer.resourceView()*/NULL, mIterationData.mBuffer.resourceView(), mFactory.mPhaseConfigs.mBuffer.resourceView(), mFactory.mConstraints.mBuffer.resourceView(), mFactory.mTethers.mBuffer.resourceView(), mFactory.mCapsuleIndicesDeviceCopy.resourceView(), mFactory.mCollisionSpheresDeviceCopy.resourceView(), mFactory.mConvexMasksDeviceCopy.resourceView(), mFactory.mCollisionPlanesDeviceCopy.resourceView(), - mFactory.mCollisionTriangles.mBuffer.resourceView(), + mFactory.mCollisionTrianglesDeviceCopy.resourceView(), mFactory.mMotionConstraints.mBuffer.resourceView(), mFactory.mSeparationConstraints.mBuffer.resourceView(), mFactory.mParticleAccelerations.mBuffer.resourceView(), mFactory.mRestPositionsDeviceCopy.resourceView(), mFactory.mSelfCollisionIndices.mBuffer.resourceView(), - mFactory.mStiffnessValues.mBuffer.resourceView() + mFactory.mStiffnessValues.mBuffer.resourceView(), + mFactory.mTriangles.mBuffer.resourceView() }; - context->CSSetShaderResources(0, 17, resourceViews); + context->CSSetShaderResources(0, 18, resourceViews); ID3D11UnorderedAccessView* accessViews[4] = { - mFactory.mParticles.mBuffer.accessView(), + mFactory.mParticles.mBuffer.accessViewRaw(), mFactory.mSelfCollisionParticles.mBuffer.accessView(), mFactory.mSelfCollisionData.mBuffer.accessView(), mFrameData.mBuffer.accessView() diff --git a/NvCloth/src/dx/DxSolver.h b/NvCloth/src/dx/DxSolver.h index cafbfa5..09f523a 100644 --- a/NvCloth/src/dx/DxSolver.h +++ b/NvCloth/src/dx/DxSolver.h @@ -55,8 +55,10 @@ class DxSolver : private DxContextLock, public Solver DxSolver(DxFactory&); ~DxSolver(); - virtual void addCloth(Cloth*); - virtual void removeCloth(Cloth*); + virtual void addCloth(Cloth*) override; + virtual void removeCloth(Cloth*) override; + virtual int getNumCloths() const override; + virtual Cloth * const * getClothList() const override; // functions executing the simulation work. virtual bool beginSimulation(float dt); diff --git a/NvCloth/src/dx/DxSolverKernel.hlsl b/NvCloth/src/dx/DxSolverKernel.hlsl index 2d42dea..2ca42b3 100644 --- a/NvCloth/src/dx/DxSolverKernel.hlsl +++ b/NvCloth/src/dx/DxSolverKernel.hlsl @@ -41,7 +41,7 @@ struct IndexPair uint32_t second; }; -RWStructuredBuffer<float4> bParticles : register(u0); +RWByteAddressBuffer bParticles : register(u0); //contains float4 data RWStructuredBuffer<float4> bSelfCollisionParticles : register(u1); RWStructuredBuffer<uint32_t> bSelfCollisionData : register(u2); @@ -73,6 +73,9 @@ StructuredBuffer<int32_t> bSelfCollisionIndices : register(t15); StructuredBuffer<float> bPerConstraintStiffness : register(t16); +//cloth mesh triangle information for air drag/lift +//Note that the buffer actually contains uint16_t values +StructuredBuffer<uint32_t> bTriangles : register(t17); groupshared DxClothData gClothData; groupshared DxFrameData gFrameData; @@ -94,6 +97,7 @@ interface IParticles { float4 get(uint32_t index); void set(uint32_t index, float4 value); + void atomicAdd(uint32_t index, float3 value); }; @@ -184,6 +188,99 @@ void accelerateParticles(IParticles curParticles, uint32_t threadIdx) GroupMemoryBarrierWithGroupSync(); } +float rsqrt_2(const float v) +{ + float halfV = v * 0.5f; + float threeHalf = 1.5f; + float r = rsqrt(v); + for(int i = 0; i < 10; ++i) + r = r * (threeHalf - halfV * r * r); + return r; +} + +void applyWind(IParticles curParticles, IParticles prevParticles, uint32_t threadIdx) +{ + const float dragCoefficient = gFrameData.mDragCoefficient; + const float liftCoefficient = gFrameData.mLiftCoefficient; + + if(dragCoefficient == 0.0f && liftCoefficient == 0.0f) + return; + + const float oneThird = 1.0f / 3.0f; + float3 wind = float3(gIterData.mWind[0], gIterData.mWind[1], gIterData.mWind[2]); + + GroupMemoryBarrierWithGroupSync(); + + uint32_t triangleOffset = gClothData.mStartTriangleOffset; + + for(uint32_t i = threadIdx; i < gClothData.mNumTriangles; i += blockDim.x) + { + uint32_t i0 = bTriangles[triangleOffset + ((i * 3 + 0) >> 1)]; + uint32_t i1 = bTriangles[triangleOffset + ((i * 3 + 1) >> 1)]; + uint32_t i2 = bTriangles[triangleOffset + ((i * 3 + 2) >> 1)]; + + if((i * 3) & 1) + { + i0 = (i0 & 0xFFFF0000) >> 16; + i1 = (i1 & 0x0000FFFF); + i2 = (i2 & 0xFFFF0000) >> 16; + } + else + { + i0 = (i0 & 0x0000FFFF); + i1 = (i1 & 0xFFFF0000) >> 16; + i2 = (i2 & 0x0000FFFF); + } + + float4 c0 = curParticles.get(i0); + float4 c1 = curParticles.get(i1); + float4 c2 = curParticles.get(i2); + + float4 p0 = prevParticles.get(i0); + float4 p1 = prevParticles.get(i1); + float4 p2 = prevParticles.get(i2); + + float3 cur = oneThird * (c0.xyz + c1.xyz + c2.xyz); + float3 prev = oneThird * (p0.xyz + p1.xyz + p2.xyz); + + float3 delta = cur - prev + wind; + + if(gIterData.mIsTurning) + { + const float3 rot[3] = { + float3(gFrameData.mRotation[0], gFrameData.mRotation[1], gFrameData.mRotation[2]), + float3(gFrameData.mRotation[3], gFrameData.mRotation[4], gFrameData.mRotation[5]), + float3(gFrameData.mRotation[6], gFrameData.mRotation[7], gFrameData.mRotation[8]) + }; + float3 d = wind - prev; + delta = cur + d.x * rot[0] + d.y * rot[1] + d.z * rot[2]; + } + + float3 normal = cross(c2.xyz - c0.xyz, c1.xyz - c0.xyz); + + float doubleArea = sqrt(dot(normal, normal)); + + float invSqrScale = dot(delta, delta); + float scale = rsqrt(invSqrScale); + + float cosTheta = dot(normal, delta) * scale / doubleArea; + float sinTheta = sqrt(max(0.0f, 1.0f - cosTheta * cosTheta)); + + float3 liftDir = cross(cross(delta, normal), scale * delta); + + float3 lift = liftCoefficient * cosTheta * sinTheta * liftDir; + float3 drag = dragCoefficient * abs(cosTheta) * doubleArea * delta; + + float3 impulse = invSqrScale < 1.192092896e-07F ? float3(0.0f, 0.0f, 0.0f) : lift + drag; + + curParticles.atomicAdd(i0, -impulse * c0.w); + curParticles.atomicAdd(i1, -impulse * c1.w); + curParticles.atomicAdd(i2, -impulse * c2.w); + } + + GroupMemoryBarrierWithGroupSync(); +} + void constrainMotion(IParticles curParticles, uint32_t threadIdx, float alpha) { if (gFrameData.mStartMotionConstrainsOffset == -1) @@ -487,7 +584,7 @@ struct TriangleData }; -void collideTriangles(IParticles curParticles, int32_t i) +void collideParticleTriangles(IParticles curParticles, int32_t i, float alpha) { float4 curPos = curParticles.get(i); float3 pos = curPos.xyz; @@ -497,10 +594,18 @@ void collideTriangles(IParticles curParticles, int32_t i) for (uint32_t j = 0; j < gClothData.mNumCollisionTriangles; ++j) { + // start + (target - start) * alpha + float3 startBase = bCollisionTriangles[gFrameData.mStartCollisionTrianglesOffset + 3 * j]; + float3 targetBase = bCollisionTriangles[gFrameData.mTargetCollisionTrianglesOffset + 3 * j]; + float3 startEdge0 = bCollisionTriangles[gFrameData.mStartCollisionTrianglesOffset + 3 * j + 1]; + float3 targetEdge0 = bCollisionTriangles[gFrameData.mTargetCollisionTrianglesOffset + 3 * j + 1]; + float3 startEdge1 = bCollisionTriangles[gFrameData.mStartCollisionTrianglesOffset + 3 * j + 2]; + float3 targetEdge1 = bCollisionTriangles[gFrameData.mTargetCollisionTrianglesOffset + 3 * j + 2]; + TriangleData tIt; - tIt.base = bCollisionTriangles[gFrameData.mStartCollisionTrianglesOffset + 3 * j]; - tIt.edge0 = bCollisionTriangles[gFrameData.mStartCollisionTrianglesOffset + 3 * j + 1]; - tIt.edge1 = bCollisionTriangles[gFrameData.mStartCollisionTrianglesOffset + 3 * j + 2]; + tIt.base = startBase + (targetBase - startBase) * alpha; + tIt.edge0 = startEdge0 + (targetEdge0 - startEdge0) * alpha; + tIt.edge1 = startEdge1 + (targetEdge1 - startEdge1) * alpha; tIt.initialize(); @@ -565,14 +670,14 @@ void collideTriangles(IParticles curParticles, uint32_t threadIdx, float alpha) // mCurData.mSphereX[offset] = start + (target - start) * alpha; // } // -// GroupMemoryBarrierWithGroupSync(); + GroupMemoryBarrierWithGroupSync(); for (uint32_t j = threadIdx; j < gClothData.mNumParticles; j += blockDim) { // float4 curPos = curParticles.get(j); // float3 delta; - collideTriangles(curParticles, j); + collideParticleTriangles(curParticles, j, alpha); // if (numCollisions > 0) // { // float scale = 1.0f / numCollisions; @@ -1148,7 +1253,7 @@ void collideContinuousCapsules(IParticles curParticles, IParticles prevParticles void collideParticles(IParticles curParticles, IParticles prevParticles, uint32_t threadIdx, float alpha, float prevAlpha) { collideConvexes(curParticles, prevParticles, threadIdx, alpha); - collideTriangles(curParticles, alpha); + collideTriangles(curParticles, threadIdx, alpha); if (gClothData.mEnableContinuousCollision) collideContinuousCapsules(curParticles, prevParticles, threadIdx, alpha, prevAlpha); else @@ -1572,6 +1677,7 @@ void simulateCloth(IParticles curParticles, IParticles prevParticles, uint32_t t integrateParticles(curParticles, prevParticles, threadIdx); accelerateParticles(curParticles, threadIdx); + applyWind(curParticles, prevParticles, threadIdx); constrainMotion(curParticles, threadIdx, alpha); constrainTether(curParticles, threadIdx); // note: GroupMemoryBarrierWithGroupSync at beginning of each fabric phase @@ -1604,6 +1710,21 @@ class ParticlesInSharedMem : IParticles gCurParticles[index + MaxParticlesInSharedMem * 2] = asuint(value.z); gCurParticles[index + MaxParticlesInSharedMem * 3] = asuint(value.w); } + void atomicAdd(uint32_t index, float3 value) + { + interlockedAddFloat(index + MaxParticlesInSharedMem * 0, value.x); + interlockedAddFloat(index + MaxParticlesInSharedMem * 1, value.y); + interlockedAddFloat(index + MaxParticlesInSharedMem * 2, value.z); + } + + void interlockedAddFloat(uint addr, float value) + { + uint comp, original = gCurParticles[addr]; + [allow_uav_condition]do + { + InterlockedCompareExchange(gCurParticles[addr], comp = original, asuint(asfloat(original) + value), original); + } while(original != comp); + } }; class ParticlesInGlobalMem : IParticles @@ -1612,11 +1733,26 @@ class ParticlesInGlobalMem : IParticles float4 get(uint32_t index) { - return bParticles[_offset + index]; + return asfloat(bParticles.Load4((_offset + index)*16)); } void set(uint32_t index, float4 value) { - bParticles[_offset + index] = value; + bParticles.Store4((_offset + index) * 16, asuint(value)); + } + void atomicAdd(uint32_t index, float3 value) + { + interlockedAddFloat((_offset + index) * 16 + 0, value.x); + interlockedAddFloat((_offset + index) * 16 + 4, value.y); + interlockedAddFloat((_offset + index) * 16 + 8, value.z); + } + + void interlockedAddFloat(uint addr, float value) + { + uint comp, original = bParticles.Load(addr); + [allow_uav_condition]do + { + bParticles.InterlockedCompareExchange(addr, comp = original, asuint(asfloat(original) + value), original); + } while(original != comp); } }; @@ -1640,14 +1776,14 @@ class ParticlesInGlobalMem : IParticles uint32_t i; for (i = threadIdx; i < gClothData.mNumParticles; i += blockDim) { - curParticles.set(i, bParticles[gClothData.mParticlesOffset + i]); + curParticles.set(i, asfloat(bParticles.Load4((gClothData.mParticlesOffset + i) * 16))); } simulateCloth(curParticles, prevParticles, threadIdx); for (i = threadIdx; i < gClothData.mNumParticles; i += blockDim) { - bParticles[gClothData.mParticlesOffset + i] = curParticles.get(i); + bParticles.Store4((gClothData.mParticlesOffset + i) * 16, asuint(curParticles.get(i))); } } else diff --git a/NvCloth/src/dx/DxSolverKernelBlob.h b/NvCloth/src/dx/DxSolverKernelBlob.h index 8c2dd82..e69de29 100644 --- a/NvCloth/src/dx/DxSolverKernelBlob.h +++ b/NvCloth/src/dx/DxSolverKernelBlob.h @@ -1,24502 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 -// -// -// Buffer Definitions: -// -// Resource bind info for bClothData -// { -// -// struct DxClothData -// { -// -// uint mNumParticles; // Offset: 0 -// uint mParticlesOffset; // Offset: 4 -// uint mNumPhases; // Offset: 8 -// uint mPhaseConfigOffset; // Offset: 12 -// uint mConstraintOffset; // Offset: 16 -// uint mStiffnessOffset; // Offset: 20 -// uint mNumTethers; // Offset: 24 -// uint mTetherOffset; // Offset: 28 -// float mTetherConstraintScale; // Offset: 32 -// float mMotionConstraintScale; // Offset: 36 -// float mMotionConstraintBias; // Offset: 40 -// uint mNumCapsules; // Offset: 44 -// uint mCapsuleOffset; // Offset: 48 -// uint mNumSpheres; // Offset: 52 -// uint mNumPlanes; // Offset: 56 -// uint mNumConvexes; // Offset: 60 -// uint mConvexMasksOffset; // Offset: 64 -// uint mNumCollisionTriangles; // Offset: 68 -// uint mEnableContinuousCollision;// Offset: 72 -// float mCollisionMassScale; // Offset: 76 -// float mFrictionScale; // Offset: 80 -// float mSelfCollisionDistance; // Offset: 84 -// uint mNumSelfCollisionIndices; // Offset: 88 -// uint mSelfCollisionIndicesOffset;// Offset: 92 -// uint mSelfCollisionParticlesOffset;// Offset: 96 -// uint mSelfCollisionDataOffset; // Offset: 100 -// uint mSleepTestInterval; // Offset: 104 -// uint mSleepAfterCount; // Offset: 108 -// float mSleepThreshold; // Offset: 112 -// -// } $Element; // Offset: 0 Size: 116 -// -// } -// -// Resource bind info for bIterData -// { -// -// struct DxIterationData -// { -// -// float mIntegrationTrafo[24]; // Offset: 0 -// uint mIsTurning; // Offset: 96 -// -// } $Element; // Offset: 0 Size: 100 -// -// } -// -// Resource bind info for bPhaseConfigs -// { -// -// struct DxPhaseConfig -// { -// -// float mStiffness; // Offset: 0 -// float mStiffnessMultiplier; // Offset: 4 -// float mCompressionLimit; // Offset: 8 -// float mStretchLimit; // Offset: 12 -// uint mFirstConstraint; // Offset: 16 -// uint mNumConstraints; // Offset: 20 -// -// } $Element; // Offset: 0 Size: 24 -// -// } -// -// Resource bind info for bConstraints -// { -// -// struct DxConstraint -// { -// -// float mRestvalue; // Offset: 0 -// uint mIndices; // Offset: 4 -// -// } $Element; // Offset: 0 Size: 8 -// -// } -// -// Resource bind info for bTetherConstraints -// { -// -// struct DxTether -// { -// -// uint mValue; // Offset: 0 -// -// } $Element; // Offset: 0 Size: 4 -// -// } -// -// Resource bind info for bCapsuleIndices -// { -// -// struct IndexPair -// { -// -// uint first; // Offset: 0 -// uint second; // Offset: 4 -// -// } $Element; // Offset: 0 Size: 8 -// -// } -// -// Resource bind info for bCollisionSpheres -// { -// -// float4 $Element; // Offset: 0 Size: 16 -// -// } -// -// Resource bind info for bConvexMasks -// { -// -// uint $Element; // Offset: 0 Size: 4 -// -// } -// -// Resource bind info for bCollisionPlanes -// { -// -// float4 $Element; // Offset: 0 Size: 16 -// -// } -// -// Resource bind info for bCollisionTriangles -// { -// -// float3 $Element; // Offset: 0 Size: 12 -// -// } -// -// Resource bind info for bMotionConstraints -// { -// -// float4 $Element; // Offset: 0 Size: 16 -// -// } -// -// Resource bind info for bSeparationConstraints -// { -// -// float4 $Element; // Offset: 0 Size: 16 -// -// } -// -// Resource bind info for bParticleAccelerations -// { -// -// float4 $Element; // Offset: 0 Size: 16 -// -// } -// -// Resource bind info for bRestPositions -// { -// -// float4 $Element; // Offset: 0 Size: 16 -// -// } -// -// Resource bind info for bSelfCollisionIndices -// { -// -// int $Element; // Offset: 0 Size: 4 -// -// } -// -// Resource bind info for bPerConstraintStiffness -// { -// -// float $Element; // Offset: 0 Size: 4 -// -// } -// -// Resource bind info for bParticles -// { -// -// float4 $Element; // Offset: 0 Size: 16 -// -// } -// -// Resource bind info for bSelfCollisionParticles -// { -// -// float4 $Element; // Offset: 0 Size: 16 -// -// } -// -// Resource bind info for bSelfCollisionData -// { -// -// uint $Element; // Offset: 0 Size: 4 -// -// } -// -// Resource bind info for bFrameData -// { -// -// struct DxFrameData -// { -// -// bool mDeviceParticlesDirty; // Offset: 0 -// uint mNumSharedPositions; // Offset: 4 -// float mIterDt; // Offset: 8 -// uint mFirstIteration; // Offset: 12 -// uint mNumIterations; // Offset: 16 -// float mTetherConstraintStiffness;// Offset: 20 -// float mMotionConstraintStiffness;// Offset: 24 -// uint mStartMotionConstrainsOffset;// Offset: 28 -// uint mTargetMotionConstrainsOffset;// Offset: 32 -// uint mStartSeparationConstrainsOffset;// Offset: 36 -// uint mTargetSeparationConstrainsOffset;// Offset: 40 -// uint mParticleAccelerationsOffset;// Offset: 44 -// uint mStartSphereOffset; // Offset: 48 -// uint mTargetSphereOffset; // Offset: 52 -// uint mStartCollisionPlaneOffset;// Offset: 56 -// uint mTargetCollisionPlaneOffset;// Offset: 60 -// uint mStartCollisionTrianglesOffset;// Offset: 64 -// uint mTargetCollisionTrianglesOffset;// Offset: 68 -// float mSelfCollisionStiffness; // Offset: 72 -// float mParticleBounds[6]; // Offset: 76 -// uint mSleepPassCounter; // Offset: 100 -// uint mSleepTestCounter; // Offset: 104 -// float mStiffnessExponent; // Offset: 108 -// uint mRestPositionsOffset; // Offset: 112 -// bool mInitSelfCollisionData; // Offset: 116 -// -// } $Element; // Offset: 0 Size: 120 -// -// } -// -// -// Resource Bindings: -// -// Name Type Format Dim Slot Elements -// ------------------------------ ---------- ------- ----------- ---- -------- -// bClothData texture struct r/o 0 1 -// bIterData texture struct r/o 2 1 -// bPhaseConfigs texture struct r/o 3 1 -// bConstraints texture struct r/o 4 1 -// bTetherConstraints texture struct r/o 5 1 -// bCapsuleIndices texture struct r/o 6 1 -// bCollisionSpheres texture struct r/o 7 1 -// bConvexMasks texture struct r/o 8 1 -// bCollisionPlanes texture struct r/o 9 1 -// bCollisionTriangles texture struct r/o 10 1 -// bMotionConstraints texture struct r/o 11 1 -// bSeparationConstraints texture struct r/o 12 1 -// bParticleAccelerations texture struct r/o 13 1 -// bRestPositions texture struct r/o 14 1 -// bSelfCollisionIndices texture struct r/o 15 1 -// bPerConstraintStiffness texture struct r/o 16 1 -// bParticles UAV struct r/w 0 1 -// bSelfCollisionParticles UAV struct r/w 1 1 -// bSelfCollisionData UAV struct r/w 2 1 -// bFrameData UAV struct r/w 3 1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// no Input -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// no Output -cs_5_0 -dcl_globalFlags refactoringAllowed -dcl_immediateConstantBuffer { { 1.000000, 0, 0, 0}, - { 0, 1.000000, 0, 0}, - { 0, 0, 1.000000, 0}, - { 0, 0, 0, 1.000000} } -dcl_resource_structured t0, 116 -dcl_resource_structured t2, 100 -dcl_resource_structured t3, 24 -dcl_resource_structured t4, 8 -dcl_resource_structured t5, 4 -dcl_resource_structured t6, 8 -dcl_resource_structured t7, 16 -dcl_resource_structured t8, 4 -dcl_resource_structured t9, 16 -dcl_resource_structured t10, 12 -dcl_resource_structured t11, 16 -dcl_resource_structured t12, 16 -dcl_resource_structured t13, 16 -dcl_resource_structured t14, 16 -dcl_resource_structured t15, 4 -dcl_resource_structured t16, 4 -dcl_uav_structured u0, 16 -dcl_uav_structured u1, 16 -dcl_uav_structured u2, 4 -dcl_uav_structured u3, 120 -dcl_input vThreadGroupID.x -dcl_input vThreadIDInGroup.x -dcl_temps 48 -dcl_tgsm_raw g0, 116 -dcl_tgsm_raw g1, 120 -dcl_tgsm_raw g2, 100 -dcl_tgsm_structured g3, 4, 7900 -dcl_tgsm_structured g4, 4, 192 -dcl_tgsm_raw g5, 36 -dcl_tgsm_structured g6, 4, 3 -dcl_thread_group 1024, 1, 1 -if_z vThreadIDInGroup.x - ld_structured_indexable(structured_buffer, stride=116)(mixed,mixed,mixed,mixed) r0.xyzw, vThreadGroupID.x, l(0), t0.xyzw - ld_structured_indexable(structured_buffer, stride=116)(mixed,mixed,mixed,mixed) r1.xyzw, vThreadGroupID.x, l(16), t0.xyzw - ld_structured_indexable(structured_buffer, stride=116)(mixed,mixed,mixed,mixed) r2.xyzw, vThreadGroupID.x, l(32), t0.xyzw - ld_structured_indexable(structured_buffer, stride=116)(mixed,mixed,mixed,mixed) r3.xy, vThreadGroupID.x, l(48), t0.xyxx - ld_structured_indexable(structured_buffer, stride=116)(mixed,mixed,mixed,mixed) r4.xyzw, vThreadGroupID.x, l(60), t0.xyzw - ld_structured_indexable(structured_buffer, stride=116)(mixed,mixed,mixed,mixed) r5.xyzw, vThreadGroupID.x, l(76), t0.xyzw - ld_structured_indexable(structured_buffer, stride=116)(mixed,mixed,mixed,mixed) r6.xyzw, vThreadGroupID.x, l(92), t0.xyzw - ld_structured_indexable(structured_buffer, stride=116)(mixed,mixed,mixed,mixed) r3.z, vThreadGroupID.x, l(112), t0.xxxx - store_raw g0.xyzw, l(0), r0.xyzw - store_raw g0.xyzw, l(16), r1.xyzw - store_raw g0.xyzw, l(32), r2.xyzw - store_raw g0.xy, l(48), r3.xyxx - store_raw g0.xyzw, l(60), r4.xyzw - store_raw g0.xyzw, l(76), r5.xyzw - store_raw g0.xyzw, l(92), r6.xyzw - store_raw g0.x, l(112), r3.z - ld_structured_indexable(structured_buffer, stride=120)(mixed,mixed,mixed,mixed) r0.xyzw, vThreadGroupID.x, l(0), u3.xyzw - ld_structured_indexable(structured_buffer, stride=120)(mixed,mixed,mixed,mixed) r1.xyzw, vThreadGroupID.x, l(16), u3.xyzw - ld_structured_indexable(structured_buffer, stride=120)(mixed,mixed,mixed,mixed) r2.xyzw, vThreadGroupID.x, l(32), u3.xyzw - ld_structured_indexable(structured_buffer, stride=120)(mixed,mixed,mixed,mixed) r3.xyzw, vThreadGroupID.x, l(48), u3.xyzw - ld_structured_indexable(structured_buffer, stride=120)(mixed,mixed,mixed,mixed) r4.xyzw, vThreadGroupID.x, l(64), u3.xyzw - ld_structured_indexable(structured_buffer, stride=120)(mixed,mixed,mixed,mixed) r5.xyzw, vThreadGroupID.x, l(80), u3.xyzw - ld_structured_indexable(structured_buffer, stride=120)(mixed,mixed,mixed,mixed) r6.xyzw, vThreadGroupID.x, l(96), u3.xyzw - ld_structured_indexable(structured_buffer, stride=120)(mixed,mixed,mixed,mixed) r7.xy, vThreadGroupID.x, l(112), u3.xyxx - store_raw g1.xyzw, l(0), r0.xyzw - store_raw g1.xyzw, l(16), r1.xyzw - store_raw g1.xyzw, l(32), r2.xyzw - store_raw g1.xyzw, l(48), r3.xyzw - store_raw g1.xyzw, l(64), r4.xyzw - store_raw g1.xyzw, l(80), r5.xyzw - store_raw g1.xyzw, l(96), r6.xyzw - store_raw g1.xy, l(112), r7.xyxx -endif -sync_g_t -ld_raw r0.xy, l(0), g0.xyxx -iadd r0.x, r0.x, r0.y -ld_raw r0.y, l(0), g0.xxxx -uge r0.z, l(1975), r0.y -if_nz r0.z - ld_raw r0.z, l(4), g0.xxxx - mov r1.x, vThreadIDInGroup.x - loop - uge r0.w, r1.x, r0.y - breakc_nz r0.w - iadd r0.w, r0.z, r1.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r2.xyzw, r0.w, l(0), u0.xyzw - store_structured g3.x, r1.x, l(0), r2.x - iadd r1.xyzw, r1.xxxx, l(1024, 1975, 3950, 5925) - store_structured g3.x, r1.y, l(0), r2.y - store_structured g3.x, r1.z, l(0), r2.z - store_structured g3.x, r1.w, l(0), r2.w - endloop - not r0.y, vThreadIDInGroup.x - and r0.y, r0.y, l(3) - ult r1.xyzw, vThreadIDInGroup.xxxx, l(192, 176, 3, 512) - and r2.xyzw, vThreadIDInGroup.xxxx, l(32, 31, 1, 2) - movc r0.z, r2.x, l(-1.000000), l(1.000000) - iadd r3.xyzw, vThreadIDInGroup.xxxx, l(16, 8, 4, 2) - ieq r0.w, r2.y, l(0) - and r0.w, r0.w, r1.x - ushr r4.xy, vThreadIDInGroup.xxxx, l(6, 5, 0, 0) - ishl r2.x, r4.y, l(2) - ishl r4.z, vThreadIDInGroup.x, l(3) - iadd r4.z, r4.z, l(76) - iadd r2.xz, r2.xxzx, l(76, 0, -1, 0) - ine r2.w, r2.w, l(0) - ieq r2.w, r2.w, l(0) - and r5.xyz, vThreadIDInGroup.xxxx, l(4, 8, 992, 0) - ine r5.xy, r5.xyxx, l(0, 0, 0, 0) - ieq r5.xy, r5.xyxx, l(0, 0, 0, 0) - iadd r6.xyzw, vThreadIDInGroup.xxxx, l(1, 1040, 3088, 1032) - ult r7.xyzw, r2.yyyy, l(16, 8, 4, 2) - ult r4.w, r2.y, l(1) - iadd r8.xyzw, vThreadIDInGroup.xxxx, l(3080, 1028, 3076, 1026) - iadd r9.xyzw, r3.xyzw, l(2048, 2048, 2048, 2048) - iadd r10.xyz, r5.zzzz, l(1024, 2048, 3072, 0) - iadd r11.xy, r4.yyyy, l(1, 513, 0, 0) - bfi r12.xyzw, l(10, 11, 10, 5), l(0, 0, 0, 5), vThreadIDInGroup.xxxx, l(1024, 2048, 3072, 0) - iadd r11.xz, r11.xxyx, r12.wwww - iadd r13.xyzw, vThreadIDInGroup.xxxx, l(3074, 1025, 3073, 514) - iadd r14.xy, r6.xxxx, l(2048, 4096, 0, 0) - iadd r5.w, vThreadIDInGroup.x, l(4096) - iadd r10.w, r13.w, l(4096) - iadd r15.xyzw, vThreadIDInGroup.xxxx, l(4097, 512, 4610, 4093) - iadd r11.w, r15.y, l(4096) - uge r16.xyzw, vThreadIDInGroup.xxxx, l(1, 2, 4, 8) - iadd r17.xyzw, vThreadIDInGroup.xxxx, l(506, 4081, 482, 4033) - iadd r14.zw, r17.xxxz, l(0, 0, 4096, 4096) - uge r18.xyzw, vThreadIDInGroup.xxxx, l(16, 32, 64, 128) - iadd r17.xz, vThreadIDInGroup.xxxx, l(386, 0, 3841, 0) - iadd r12.w, r17.x, l(4096) - uge r13.w, vThreadIDInGroup.x, l(256) - iadd r11.xz, r11.xxzx, l(4096, 0, 4096, 0) - mov r15.y, l(0) - loop - ld_raw r17.x, l(16), g1.xxxx - uge r19.x, r15.y, r17.x - breakc_nz r19.x - utof r19.x, r15.y - add r19.y, r19.x, l(1.000000) - utof r17.x, r17.x - div r17.x, r19.y, r17.x - if_z vThreadIDInGroup.x - ld_raw r19.y, l(12), g1.xxxx - iadd r19.y, r15.y, r19.y - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r20.xyzw, r19.y, l(0), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r21.xyzw, r19.y, l(16), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r22.xyzw, r19.y, l(32), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r23.xyzw, r19.y, l(48), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r24.xyzw, r19.y, l(64), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r25.xyzw, r19.y, l(80), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r19.y, r19.y, l(96), t2.xxxx - store_raw g2.xyzw, l(0), r20.xyzw - store_raw g2.xyzw, l(16), r21.xyzw - store_raw g2.xyzw, l(32), r22.xyzw - store_raw g2.xyzw, l(48), r23.xyzw - store_raw g2.xyzw, l(64), r24.xyzw - store_raw g2.xyzw, l(80), r25.xyzw - store_raw g2.x, l(96), r19.y - endif - sync_g_t - ld_raw r19.y, l(0), g0.xxxx - ld_raw r20.xyz, l(12), g2.xyzx - ld_raw r21.xyzw, l(60), g2.xyzw - ld_raw r22.xyzw, l(24), g2.xyzw - ld_raw r23.xyzw, l(76), g2.xyzw - ld_raw r24.xyzw, l(40), g2.xyzw - ld_raw r19.zw, l(92), g2.xxxy - ld_raw r20.w, l(56), g2.xxxx - ld_raw r25.xyzw, l(12), g2.xyzw - ld_raw r26.x, l(36), g2.xxxx - ld_raw r26.y, l(48), g2.xxxx - mov r26.z, vThreadIDInGroup.x - loop - uge r26.w, r26.z, r19.y - breakc_nz r26.w - ld_structured r27.x, r26.z, l(0), g3.xxxx - iadd r28.xyzw, r26.zzzz, l(1975, 3950, 5925, 1024) - ld_structured r27.y, r28.x, l(0), g3.xxxx - ld_structured r27.z, r28.y, l(0), g3.xxxx - ld_structured r26.w, r28.z, l(0), g3.xxxx - iadd r27.w, r0.x, r26.z - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r29.xyzw, r27.w, l(0), u0.xyzw - eq r30.x, r26.w, l(0.000000) - movc r26.w, r30.x, r29.w, r26.w - lt r29.w, l(0.000000), r26.w - if_nz r29.w - if_nz r19.w - add r30.xy, r20.xyxx, r27.xyxx - mad r30.xy, r27.xxxx, r21.xwxx, r30.xyxx - mad r30.xy, r29.xxxx, r22.xwxx, r30.xyxx - mad r29.w, r27.y, r21.y, r30.x - mad r29.w, r29.y, r22.y, r29.w - mad r29.w, r27.z, r21.z, r29.w - mad r31.x, r29.z, r22.z, r29.w - mad r29.w, r27.y, r23.x, r30.y - mad r29.w, r29.y, r24.x, r29.w - mad r29.w, r27.z, r23.y, r29.w - mad r31.y, r29.z, r24.y, r29.w - add r29.w, r20.z, r27.z - mad r29.w, r27.x, r23.z, r29.w - mad r29.w, r29.x, r24.z, r29.w - mad r29.w, r27.y, r23.w, r29.w - mad r29.w, r29.y, r24.w, r29.w - mad r29.w, r27.z, r19.z, r29.w - mad r29.w, r29.z, r20.w, r29.w - else - add r29.xy, r27.xyxx, -r29.xyxx - mad r29.x, r29.x, r25.w, r25.x - add r31.x, r27.x, r29.x - mad r29.x, r29.y, r26.x, r25.y - add r31.y, r27.y, r29.x - add r29.x, r27.z, -r29.z - mad r29.x, r29.x, r26.y, r25.z - add r29.w, r27.z, r29.x - endif - ld_raw r29.xyz, l(0), g2.xyzx - add r27.xyz, r27.xyzx, r29.xyzx - else - mov r31.xy, r27.xyxx - mov r29.w, r27.z - endif - store_structured g3.x, r26.z, l(0), r31.x - store_structured g3.x, r28.x, l(0), r31.y - store_structured g3.x, r28.y, l(0), r29.w - store_structured g3.x, r28.z, l(0), r26.w - store_structured u0.xyz, r27.w, l(0), r27.xyzx - mov r26.z, r28.w - endloop - ld_raw r19.y, l(44), g1.xxxx - sync_g_t - ld_raw r19.z, l(8), g1.xxxx - mul r19.z, r19.z, r19.z - movc r19.z, r0.y, r19.z, l(0) - ld_raw r19.w, l(0), g0.xxxx - ishl r20.x, r19.w, l(2) - mov r20.y, vThreadIDInGroup.x - loop - uge r20.z, r20.y, r20.x - breakc_nz r20.z - ushr r20.z, r20.y, l(2) - ld_structured r21.x, r20.z, l(0), g3.xxxx - iadd r22.xyz, r20.zzzz, l(1975, 3950, 5925, 0) - ld_structured r21.y, r22.x, l(0), g3.xxxx - ld_structured r21.z, r22.y, l(0), g3.xxxx - ld_structured r21.w, r22.z, l(0), g3.xxxx - lt r20.w, l(0.000000), r21.w - if_nz r20.w - iadd r20.w, r19.y, r20.y - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r23.xyzw, r20.w, l(0), t13.xyzw - mad r21.xyzw, r23.xyzw, r19.zzzz, r21.xyzw - store_structured g3.x, r20.z, l(0), r21.x - store_structured g3.x, r22.x, l(0), r21.y - store_structured g3.x, r22.y, l(0), r21.z - store_structured g3.x, r22.z, l(0), r21.w - endif - iadd r20.y, r20.y, l(1024) - endloop - sync_g_t - ld_raw r19.y, l(28), g1.xxxx - ine r19.y, r19.y, l(-1) - if_nz r19.y - ld_raw r19.yz, l(36), g0.xxyx - ld_raw r20.xyz, l(24), g1.xyzx - ld_raw r19.w, l(0), g0.xxxx - mov r20.w, vThreadIDInGroup.x - loop - uge r21.x, r20.w, r19.w - breakc_nz r21.x - iadd r21.xy, r20.wwww, r20.yzyy - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r22.xyzw, r21.x, l(0), t11.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r21.xyzw, r21.y, l(0), t11.xyzw - add r21.xyzw, -r22.xyzw, r21.xyzw - mad r21.xyzw, r21.xyzw, r17.xxxx, r22.xyzw - ld_structured r22.x, r20.w, l(0), g3.xxxx - iadd r23.xyzw, r20.wwww, l(1975, 3950, 5925, 1024) - ld_structured r22.y, r23.x, l(0), g3.xxxx - ld_structured r22.z, r23.y, l(0), g3.xxxx - ld_structured r22.w, r23.z, l(0), g3.xxxx - add r21.xyz, r21.xyzx, -r22.xyzx - dp3 r24.x, r21.xyzx, r21.xyzx - add r24.x, r24.x, l(0.000000) - mad r21.w, r21.w, -r19.y, -r19.z - min r21.w, r21.w, l(0.000000) - rsq r24.x, r24.x - mad r24.x, r21.w, r24.x, l(1.000000) - max r24.x, r24.x, l(0.000000) - mul r24.x, r20.x, r24.x - mad r21.xyz, r24.xxxx, r21.xyzx, r22.xyzx - ge r21.w, r21.w, l(0.000000) - movc r21.w, r21.w, l(0), r22.w - store_structured g3.x, r20.w, l(0), r21.x - store_structured g3.x, r23.x, l(0), r21.y - store_structured g3.x, r23.y, l(0), r21.z - store_structured g3.x, r23.z, l(0), r21.w - mov r20.w, r23.w - endloop - endif - ld_raw r19.y, l(20), g1.xxxx - eq r19.z, r19.y, l(0.000000) - ld_raw r19.w, l(24), g0.xxxx - ieq r20.x, r19.w, l(0) - or r19.z, r19.z, r20.x - if_z r19.z - ld_raw r19.z, l(0), g0.xxxx - utof r20.x, r19.z - mul r19.y, r19.y, r20.x - utof r20.x, r19.w - div r19.y, r19.y, r20.x - ld_raw r20.xy, l(28), g0.xyxx - mov r20.z, vThreadIDInGroup.x - loop - uge r20.w, r20.z, r19.z - breakc_nz r20.w - ld_structured r20.w, r20.z, l(0), g3.xxxx - iadd r21.xyzw, r20.zzzz, l(1975, 3950, 5925, 1024) - ld_structured r22.x, r21.x, l(0), g3.xxxx - ld_structured r22.y, r21.y, l(0), g3.xxxx - ld_structured r22.z, r21.z, l(0), g3.xxxx - mov r23.xyz, l(0,0,0,0) - mov r22.w, r20.z - loop - uge r23.w, r22.w, r19.w - breakc_nz r23.w - iadd r23.w, r20.x, r22.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r23.w, r23.w, l(0), t5.xxxx - and r24.x, r23.w, l(0x0000ffff) - ld_structured r24.y, r24.x, l(0), g3.xxxx - iadd r24.xz, r24.xxxx, l(1975, 0, 3950, 0) - ld_structured r24.x, r24.x, l(0), g3.xxxx - ld_structured r24.z, r24.z, l(0), g3.xxxx - add r24.y, -r20.w, r24.y - add r24.xz, -r22.xxyx, r24.xxzx - mad r24.w, r24.y, r24.y, l(0.000000) - mad r24.w, r24.x, r24.x, r24.w - mad r24.w, r24.z, r24.z, r24.w - ushr r23.w, r23.w, l(16) - utof r23.w, r23.w - mul r23.w, r20.y, r23.w - rsq r24.w, r24.w - mad r23.w, -r23.w, r24.w, l(1.000000) - lt r24.w, l(0.000000), r23.w - mad r25.x, r24.y, r23.w, r23.x - mad r25.y, r24.x, r23.w, r23.y - mad r25.z, r24.z, r23.w, r23.z - movc r23.xyz, r24.wwww, r25.xyzx, r23.xyzx - iadd r22.w, r19.z, r22.w - endloop - mad r20.w, r23.x, r19.y, r20.w - mad r22.x, r23.y, r19.y, r22.x - mad r22.y, r23.z, r19.y, r22.y - store_structured g3.x, r20.z, l(0), r20.w - store_structured g3.x, r21.x, l(0), r22.x - store_structured g3.x, r21.y, l(0), r22.y - store_structured g3.x, r21.z, l(0), r22.z - mov r20.z, r21.w - endloop - endif - mov r19.y, l(0) - loop - ld_raw r19.z, l(8), g0.xxxx - uge r19.z, r19.y, r19.z - breakc_nz r19.z - ld_raw r20.xyz, l(12), g0.xyzx - iadd r19.z, r19.y, r20.x - ld_structured_indexable(structured_buffer, stride=24)(mixed,mixed,mixed,mixed) r21.xyzw, r19.z, l(0), t3.xyzw - ld_structured_indexable(structured_buffer, stride=24)(mixed,mixed,mixed,mixed) r19.zw, r19.z, l(16), t3.xxxy - ld_raw r20.x, l(108), g1.xxxx - mul r21.xy, r20.xxxx, r21.xyxx - exp r21.xy, r21.xyxx - add r21.xy, -r21.xyxx, l(1.000000, 1.000000, 0.000000, 0.000000) - iadd r20.y, r19.z, r20.y - ine r20.z, r20.z, l(-1) - ld_raw r20.w, l(20), g0.xxxx - iadd r19.z, r19.z, r20.w - sync_g_t - mov r20.w, vThreadIDInGroup.x - loop - uge r22.x, r20.w, r19.w - breakc_nz r22.x - iadd r22.x, r20.w, r20.y - ld_structured_indexable(structured_buffer, stride=8)(mixed,mixed,mixed,mixed) r22.xy, r22.x, l(0), t4.xyxx - and r22.z, r22.y, l(0x0000ffff) - ushr r22.y, r22.y, l(16) - ld_structured r22.w, r22.z, l(0), g3.xxxx - iadd r24.xyz, r22.zzzz, l(1975, 3950, 5925, 0) - ld_structured r23.w, r24.x, l(0), g3.xxxx - ld_structured r24.w, r24.y, l(0), g3.xxxx - ld_structured r25.x, r24.z, l(0), g3.xxxx - ld_structured r25.y, r22.y, l(0), g3.xxxx - iadd r26.xyz, r22.yyyy, l(1975, 3950, 5925, 0) - ld_structured r25.z, r26.x, l(0), g3.xxxx - ld_structured r25.w, r26.y, l(0), g3.xxxx - ld_structured r26.w, r26.z, l(0), g3.xxxx - add r27.x, -r22.w, r25.y - add r27.y, -r23.w, r25.z - add r27.z, -r24.w, r25.w - mad r27.w, r27.x, r27.x, l(0.000000) - mad r27.w, r27.y, r27.y, r27.w - mad r27.w, r27.z, r27.z, r27.w - lt r28.x, l(0.000000), r22.x - rsq r27.w, r27.w - mad r22.x, r22.x, r27.w, l(-1.000000) - and r22.x, r22.x, r28.x - min r27.w, r21.w, -r22.x - max r27.w, r21.z, r27.w - mad r22.x, r21.y, r27.w, r22.x - iadd r27.w, r19.z, r20.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r27.w, r27.w, l(0), t16.xxxx - mul r27.w, r20.x, r27.w - exp r27.w, r27.w - add r27.w, -r27.w, l(1.000000) - movc r27.w, r20.z, r27.w, r21.x - mul r22.x, r22.x, r27.w - add r27.w, r25.x, l(0.000000) - add r27.w, r26.w, r27.w - div r22.x, r22.x, r27.w - mul r27.w, r22.x, -r25.x - mad r22.w, r27.w, r27.x, r22.w - mad r23.w, r27.w, r27.y, r23.w - mad r24.w, r27.w, r27.z, r24.w - store_structured g3.x, r22.z, l(0), r22.w - store_structured g3.x, r24.x, l(0), r23.w - store_structured g3.x, r24.y, l(0), r24.w - store_structured g3.x, r24.z, l(0), r25.x - mul r22.x, r22.x, r26.w - mad r22.z, r22.x, r27.x, r25.y - mad r22.w, r22.x, r27.y, r25.z - mad r22.x, r22.x, r27.z, r25.w - store_structured g3.x, r22.y, l(0), r22.z - store_structured g3.x, r26.x, l(0), r22.w - store_structured g3.x, r26.y, l(0), r22.x - store_structured g3.x, r26.z, l(0), r26.w - iadd r20.w, r20.w, l(1024) - endloop - iadd r19.y, r19.y, l(1) - endloop - sync_g_t - ld_raw r19.y, l(36), g1.xxxx - ine r19.y, r19.y, l(-1) - if_nz r19.y - ld_raw r19.y, l(0), g0.xxxx - ld_raw r19.zw, l(36), g1.xxxy - mov r20.x, vThreadIDInGroup.x - loop - uge r20.y, r20.x, r19.y - breakc_nz r20.y - iadd r20.yz, r19.zzwz, r20.xxxx - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r21.xyzw, r20.y, l(0), t12.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r22.xyzw, r20.z, l(0), t12.xyzw - add r22.xyzw, -r21.xyzw, r22.xyzw - mad r21.xyzw, r22.xyzw, r17.xxxx, r21.xyzw - ld_structured r22.x, r20.x, l(0), g3.xxxx - iadd r24.xyzw, r20.xxxx, l(1975, 3950, 5925, 1024) - ld_structured r22.y, r24.x, l(0), g3.xxxx - ld_structured r22.z, r24.y, l(0), g3.xxxx - ld_structured r20.y, r24.z, l(0), g3.xxxx - add r21.xyz, r21.xyzx, -r22.xyzx - dp3 r20.z, r21.xyzx, r21.xyzx - add r20.z, r20.z, l(0.000000) - rsq r20.z, r20.z - mad r20.z, -r21.w, r20.z, l(1.000000) - min r20.z, r20.z, l(0.000000) - mad r21.xyz, r20.zzzz, r21.xyzx, r22.xyzx - store_structured g3.x, r20.x, l(0), r21.x - store_structured g3.x, r24.x, l(0), r21.y - store_structured g3.x, r24.y, l(0), r21.z - store_structured g3.x, r24.z, l(0), r20.y - mov r20.x, r24.w - endloop - sync_g_t - endif - if_nz r1.x - ld_raw r19.y, l(0), g0.xxxx - iadd r19.z, r19.y, l(-1) - umin r19.z, r2.y, r19.z - ld_structured r20.x, r19.z, l(0), g3.xxxx - iadd r21.xyz, r19.zzzz, l(1975, 3950, 5925, 0) - ld_structured r20.y, r21.x, l(0), g3.xxxx - ld_structured r20.z, r21.y, l(0), g3.xxxx - ld_structured r20.w, r21.z, l(0), g3.xxxx - dp4 r19.w, r20.xyzw, icb[r4.x + 0].xyzw - mul r19.w, r0.z, r19.w - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.w - mov r19.w, r19.z - loop - iadd r20.x, r19.w, l(32) - uge r20.y, r20.x, r19.y - breakc_nz r20.y - ld_structured r20.y, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r21.x, r20.x, l(0), g3.xxxx - iadd r22.xyz, r19.wwww, l(2007, 3982, 5957, 0) - ld_structured r21.y, r22.x, l(0), g3.xxxx - ld_structured r21.z, r22.y, l(0), g3.xxxx - ld_structured r21.w, r22.z, l(0), g3.xxxx - dp4 r20.z, r21.xyzw, icb[r4.x + 0].xyzw - mul r20.z, r0.z, r20.z - max r20.y, r20.z, r20.y - store_structured g4.x, vThreadIDInGroup.x, l(0), r20.y - mov r19.w, r20.x - endloop - endif - sync_g_t - if_nz r1.y - ld_structured r19.y, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.z, r3.x, l(0), g4.xxxx - max r19.y, r19.z, r19.y - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.y - endif - sync_g_t - if_nz r1.y - ld_structured r19.y, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.z, r3.y, l(0), g4.xxxx - max r19.y, r19.z, r19.y - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.y - endif - sync_g_t - if_nz r1.y - ld_structured r19.y, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.z, r3.z, l(0), g4.xxxx - max r19.y, r19.z, r19.y - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.y - endif - sync_g_t - if_nz r1.y - ld_structured r19.y, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.z, r3.w, l(0), g4.xxxx - max r19.y, r19.z, r19.y - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.y - endif - sync_g_t - if_nz r1.y - ld_structured r19.y, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.z, r6.x, l(0), g4.xxxx - max r19.y, r19.z, r19.y - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.y - endif - sync_g_t - if_nz r0.w - ld_structured r19.y, vThreadIDInGroup.x, l(0), g4.xxxx - store_raw g1.x, r2.x, r19.y - endif - sync_g_t - ld_raw r19.y, l(16), g1.xxxx - utof r19.y, r19.y - div r19.x, r19.x, r19.y - ld_raw r19.y, l(60), g0.xxxx - if_nz r19.y - ld_raw r19.z, l(80), g0.xxxx - lt r19.z, l(0.000000), r19.z - ld_raw r19.w, l(0), g0.xxxx - ld_raw r20.x, l(64), g0.xxxx - ld_raw r20.yz, l(56), g1.xxyx - mov r20.w, vThreadIDInGroup.x - loop - uge r21.x, r20.w, r19.w - breakc_nz r21.x - ld_structured r21.x, r20.w, l(0), g3.xxxx - iadd r22.xyzw, r20.wwww, l(1975, 3950, 5925, 1024) - ld_structured r21.y, r22.x, l(0), g3.xxxx - ld_structured r21.z, r22.y, l(0), g3.xxxx - ld_structured r21.w, r22.z, l(0), g3.xxxx - mov r24.xyzw, l(0,0,0,0) - mov r23.w, l(0) - loop - uge r25.x, r23.w, r19.y - breakc_nz r25.x - iadd r25.x, r20.x, r23.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r25.x, r25.x, l(0), t8.xxxx - firstbit_lo r25.y, r25.x - iadd r25.yz, r20.yyzy, r25.yyyy - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r26.xyzw, r25.y, l(0), t9.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r27.xyzw, r25.z, l(0), t9.xyzw - add r27.xyzw, -r26.xyzw, r27.xyzw - mad r26.xyzw, r17.xxxx, r27.xyzw, r26.xyzw - dp3 r25.y, r21.xyzx, r26.xyzx - add r25.y, r26.w, r25.y - mov r27.xyz, r26.xyzx - mov r25.z, r25.x - mov r27.w, r25.y - loop - lt r25.w, r27.w, l(0.000000) - iadd r26.w, r25.z, l(-1) - and r25.z, r25.z, r26.w - ine r26.w, r25.z, l(0) - and r25.w, r25.w, r26.w - breakc_z r25.w - firstbit_lo r25.w, r25.z - iadd r28.xy, r20.yzyy, r25.wwww - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r29.xyzw, r28.x, l(0), t9.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r28.xyzw, r28.y, l(0), t9.xyzw - add r28.xyzw, -r29.xyzw, r28.xyzw - mad r28.xyzw, r17.xxxx, r28.xyzw, r29.xyzw - dp3 r25.w, r21.xyzx, r28.xyzx - add r28.w, r28.w, r25.w - lt r25.w, r27.w, r28.w - movc r27.xyzw, r25.wwww, r28.xyzw, r27.xyzw - endloop - lt r25.x, r27.w, l(0.000000) - mad r26.xyz, -r27.xyzx, r27.wwww, r24.xyzx - iadd r26.w, r24.w, l(1) - movc r24.xyzw, r25.xxxx, r26.xyzw, r24.xyzw - iadd r23.w, r23.w, l(1) - endloop - if_nz r24.w - utof r23.w, r24.w - div r23.w, l(1.000000, 1.000000, 1.000000, 1.000000), r23.w - if_nz r19.z - iadd r25.x, r0.x, r20.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r25.yzw, r25.x, l(0), u0.xxyz - ld_raw r26.x, l(80), g0.xxxx - dp3 r26.y, r24.xyzx, r24.xyzx - add r26.z, r26.y, l(0.000000) - rsq r26.z, r26.z - mul r28.xyz, r24.xyzx, r26.zzzz - add r29.xyz, r21.xyzx, -r25.yzwy - dp3 r26.w, r29.xyzx, r28.xyzx - mad r28.xyz, -r26.wwww, r28.xyzx, r29.xyzx - dp3 r26.w, r28.xyzx, r28.xyzx - add r26.w, r26.w, l(0.000000) - rsq r26.w, r26.w - mul r26.x, r26.y, -r26.x - mul r26.x, r26.z, r26.x - mul r26.x, r23.w, r26.x - mul r26.x, r26.w, r26.x - max r26.x, r26.x, l(-1.000000) - mad r25.yzw, -r28.xxyz, r26.xxxx, r25.yyzw - store_structured u0.xyz, r25.x, l(0), r25.yzwy - endif - mad r21.xyz, r24.xyzx, r23.wwww, r21.xyzx - store_structured g3.x, r20.w, l(0), r21.x - store_structured g3.x, r22.x, l(0), r21.y - store_structured g3.x, r22.y, l(0), r21.z - store_structured g3.x, r22.z, l(0), r21.w - endif - mov r20.w, r22.w - endloop - endif - ftoi r19.y, r17.x - ld_structured r20.x, r19.y, l(0), g3.xxxx - iadd r21.xyz, r19.yyyy, l(1975, 3950, 5925, 0) - ld_structured r20.y, r21.x, l(0), g3.xxxx - ld_structured r20.z, r21.y, l(0), g3.xxxx - ld_structured r19.z, r21.z, l(0), g3.xxxx - ld_raw r19.w, l(68), g0.xxxx - ld_raw r20.w, l(64), g1.xxxx - mov r22.xyz, l(0,0,0,0) - mov r25.xy, l(0,340282346638528860000000000000000000000.000000,0,0) - mov r21.w, l(0) - loop - uge r22.w, r21.w, r19.w - breakc_nz r22.w - imad r22.w, l(3), r21.w, r20.w - ld_structured_indexable(structured_buffer, stride=12)(mixed,mixed,mixed,mixed) r26.xyz, r22.w, l(0), t10.xyzx - iadd r25.zw, r22.wwww, l(0, 0, 1, 2) - ld_structured_indexable(structured_buffer, stride=12)(mixed,mixed,mixed,mixed) r28.xyz, r25.z, l(0), t10.xyzx - ld_structured_indexable(structured_buffer, stride=12)(mixed,mixed,mixed,mixed) r29.xyz, r25.w, l(0), t10.xyzx - add r28.xyz, -r26.xyzx, r28.xyzx - add r29.xyz, -r26.xyzx, r29.xyzx - mul r30.xyz, r28.zxyz, r29.yzxy - mad r30.xyz, r28.yzxy, r29.zxyz, -r30.xyzx - dp3 r22.w, r30.xyzx, r30.xyzx - rsq r22.w, r22.w - mul r30.xyz, r22.wwww, r30.xyzx - dp3 r22.w, r28.xyzx, r29.xyzx - dp3 r23.w, r28.xyzx, r28.xyzx - dp3 r25.z, r29.xyzx, r29.xyzx - mul r25.w, r22.w, r22.w - mad r25.w, r23.w, r25.z, -r25.w - div r25.w, l(1.000000, 1.000000, 1.000000, 1.000000), r25.w - add r26.w, r23.w, r25.z - mad r26.w, r22.w, l(-2.000000), r26.w - div r26.w, l(1.000000, 1.000000, 1.000000, 1.000000), r26.w - div r28.w, l(1.000000, 1.000000, 1.000000, 1.000000), r23.w - div r29.w, l(1.000000, 1.000000, 1.000000, 1.000000), r25.z - add r26.xyz, r20.xyzx, -r26.xyzx - dp3 r30.w, r26.xyzx, r28.xyzx - dp3 r31.x, r26.xyzx, r29.xyzx - dp3 r32.x, r26.xyzx, r30.xyzx - mul r31.y, r22.w, r31.x - mad r31.y, r25.z, r30.w, -r31.y - mul r31.z, r22.w, r30.w - mad r23.w, r23.w, r31.x, -r31.z - lt r31.z, l(0.000000), r23.w - mul r31.y, r25.w, r31.y - mul r28.w, r28.w, r30.w - movc r28.w, r31.z, r31.y, r28.w - lt r31.y, l(0.000000), r28.w - mul r23.w, r25.w, r23.w - mul r25.w, r29.w, r31.x - movc r23.w, r31.y, r23.w, r25.w - add r25.w, r23.w, r28.w - lt r25.w, l(1.000000), r25.w - add r22.w, -r22.w, r25.z - add r22.w, r30.w, r22.w - add r22.w, -r31.x, r22.w - mul r22.w, r26.w, r22.w - movc_sat r22.w, r25.w, r22.w, r28.w - add r25.z, -r22.w, l(1.000000) - min r23.w, r23.w, r25.z - max r23.w, r23.w, l(0.000000) - mul r29.xyz, r23.wwww, r29.xyzx - mad r28.xyz, r28.xyzx, r22.wwww, r29.xyzx - add r26.xyz, r26.xyzx, -r28.xyzx - dp3 r22.w, r26.xyzx, r26.xyzx - lt r23.w, r32.x, l(0.000000) - mul r25.z, r22.w, l(1.000100) - movc r32.y, r23.w, r25.z, r22.w - lt r22.w, r32.y, r25.y - movc r22.xyz, r22.wwww, r30.xyzx, r22.xyzx - movc r25.xy, r22.wwww, r32.xyxx, r25.xyxx - iadd r21.w, r21.w, l(1) - endloop - lt r19.w, r25.x, l(0.000000) - if_nz r19.w - mad r20.xyz, -r22.xyzx, r25.xxxx, r20.xyzx - store_structured g3.x, r19.y, l(0), r20.x - store_structured g3.x, r21.x, l(0), r20.y - store_structured g3.x, r21.y, l(0), r20.z - store_structured g3.x, r21.z, l(0), r19.z - endif - ld_raw r19.y, l(72), g0.xxxx - if_nz r19.y - ld_raw r19.y, l(80), g0.xxxx - lt r19.z, l(0.000000), r19.y - ld_raw r19.w, l(0), g0.xxxx - ld_raw r20.xy, l(48), g1.xyxx - ld_raw r20.zw, l(44), g0.xxxy - mov r21.x, vThreadIDInGroup.x - loop - uge r21.y, r21.x, r19.w - breakc_nz r21.y - ld_structured r26.x, r21.x, l(0), g3.xxxx - iadd r28.xyzw, r21.xxxx, l(1975, 3950, 5925, 1024) - ld_structured r26.y, r28.x, l(0), g3.xxxx - ld_structured r26.z, r28.y, l(0), g3.xxxx - ld_structured r21.y, r28.z, l(0), g3.xxxx - iadd r21.z, r0.x, r21.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r25.yzw, r21.z, l(0), u0.xxyz - mov r29.xyz, r26.xyzx - mov r30.xyz, l(0,0,0,0) - mov r31.xyzw, l(0,0,0,0) - mov r21.w, l(0) - loop - uge r22.w, r21.w, r20.z - breakc_nz r22.w - iadd r22.w, r20.w, r21.w - ld_structured_indexable(structured_buffer, stride=8)(mixed,mixed,mixed,mixed) r32.xy, r22.w, l(0), t6.xyxx - iadd r32.xyzw, r20.xyxy, r32.xxyy - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r33.xyzw, r32.x, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r34.xyzw, r32.y, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r35.xyzw, r32.z, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r32.xyzw, r32.w, l(0), t7.xyzw - add r36.xyzw, -r33.xyzw, r34.xyzw - mad r37.xyzw, r19.xxxx, r36.xyzw, r33.xyzw - add r38.xyzw, -r35.xyzw, r32.xyzw - mad r39.xyzw, r19.xxxx, r38.xyzw, r35.xyzw - max r37.w, r37.w, l(0.000000) - max r39.w, r39.w, l(0.000000) - add r40.xyzw, -r37.xyzw, r39.xyzw - mul r40.xyzw, r40.xyzw, l(0.500000, 0.500000, 0.500000, 0.500000) - dp3 r22.w, r40.xyzx, r40.xyzx - ge r23.w, l(0.000000), r22.w - if_nz r23.w - iadd r23.w, r21.w, l(1) - mov r21.w, r23.w - continue - endif - mad r36.xyzw, r17.xxxx, r36.xyzw, r33.xyzw - mad r38.xyzw, r17.xxxx, r38.xyzw, r35.xyzw - max r36.w, r36.w, l(0.000000) - max r38.w, r38.w, l(0.000000) - add r41.xyzw, -r36.xyzw, r38.xyzw - mul r42.xyzw, r41.xyzw, l(0.500000, 0.500000, 0.500000, 0.500000) - dp3 r23.w, r42.xyzx, r42.xyzx - mad r26.w, -r42.w, r42.w, r23.w - ge r29.w, l(0.000000), r26.w - if_nz r29.w - iadd r29.w, r21.w, l(1) - mov r21.w, r29.w - continue - endif - add r41.xyz, r37.zxyz, r39.zxyz - mad r41.xyz, -r41.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r25.wyzw - mad r29.w, -r40.w, r40.w, r22.w - rsq r22.w, r22.w - rsq r29.w, r29.w - mul r40.xyz, r22.wwww, r40.xyzx - mul r22.w, r29.w, r40.w - mul r43.xyz, r40.yzxy, r41.xyzx - mad r41.xyz, r41.zxyz, r40.zxyz, -r43.xyzx - dp3 r29.w, r25.yzwy, r40.xyzx - add r40.xyz, r36.xyzx, r38.xyzx - mad r43.xyz, -r40.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r29.xyzx - rsq r30.w, r23.w - rsq r26.w, r26.w - mul r23.w, r23.w, r30.w - mad r32.w, r41.w, l(0.500000), r36.w - mul r32.w, r26.w, r32.w - mul r32.w, r23.w, r32.w - mul r44.xyz, r30.wwww, r42.xyzx - mul r45.xyz, r43.zxyz, r44.yzxy - mad r45.xyz, r43.yzxy, r44.zxyz, -r45.xyzx - dp3 r33.w, r29.xyzx, r44.xyzx - dp3 r34.w, r45.xyzx, r45.xyzx - add r46.x, r34.w, l(0.000000) - mad r29.w, r29.w, r22.w, r32.w - max r29.w, r29.w, l(0.000000) - mul r26.w, r26.w, r42.w - mad r33.w, r33.w, r26.w, r32.w - max r46.y, r33.w, l(0.000000) - dp3 r33.w, r41.xyzx, r41.xyzx - mad r33.w, -r41.x, r41.x, r33.w - mad r33.w, -r29.w, r29.w, r33.w - dp3 r34.w, r41.xyzx, r45.xyzx - mad r34.w, -r29.w, r46.y, r34.w - mad r35.w, -r46.y, r46.y, r46.x - mul r36.w, r33.w, r35.w - mad r36.w, r34.w, r34.w, -r36.w - sqrt r37.w, r36.w - add r33.w, -r33.w, r34.w - add r34.w, r34.w, -r35.w - add r34.w, r33.w, r34.w - add r35.w, r37.w, r33.w - min r35.w, r35.w, l(0.000000) - div r35.w, r35.w, r34.w - lt r38.w, r35.w, l(1.000000) - lt r39.w, r33.w, r37.w - and r38.w, r38.w, r39.w - mul r33.w, r33.w, r34.w - add r39.w, -r29.w, r46.y - mad r29.w, r33.w, r39.w, r29.w - mul r29.w, r29.w, r29.w - mul r29.w, r34.w, r29.w - mul r29.w, r29.w, l(-0.360000) - lt r29.w, r29.w, r36.w - and r29.w, r29.w, r38.w - lt r33.w, r34.w, l(-0.000000) - and r29.w, r29.w, r33.w - add r41.xyz, r25.yzwy, -r29.xyzx - mad r45.xyz, -r41.xyzx, r35.wwww, r25.yzwy - mul r47.xyz, r23.wwww, r42.xyzx - add r37.xyz, -r37.xyzx, r39.xyzx - mul r37.xyz, r37.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000) - dp3 r33.w, r37.xyzx, r37.xyzx - rsq r36.w, r33.w - mul r33.w, r33.w, r36.w - mad r37.xyz, -r37.xyzx, r33.wwww, r47.xyzx - add r33.w, -r35.w, l(1.000000) - mad r39.xyz, -r37.xyzx, r33.wwww, r47.xyzx - mul r35.w, r26.w, r35.w - mad r22.w, r22.w, r33.w, r35.w - dp3 r35.w, r39.xyzx, r39.xyzx - rsq r35.w, r35.w - dp3 r36.w, r45.xyzx, r39.xyzx - mul r36.w, r35.w, r36.w - dp3 r38.w, r45.xyzx, r45.xyzx - mad r38.w, -r36.w, r36.w, r38.w - lt r39.x, l(0.000000), r38.w - rsq r39.y, r38.w - and r39.x, r39.y, r39.x - mul r22.w, r22.w, r38.w - mad r22.w, r22.w, r39.x, r36.w - mul r22.w, r35.w, r22.w - lt r35.w, |r22.w|, l(1.000000) - mad r37.xyz, r37.xyzx, r22.wwww, r41.xyzx - mul r22.w, r33.w, r34.w - div r22.w, r37.w, r22.w - add r22.w, -r22.w, l(1.000000) - div r22.w, r33.w, r22.w - mad r37.xyz, r37.xyzx, r22.wwww, r43.xyzx - mad r39.xyz, r40.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r37.xyzx - movc r39.xyz, r35.wwww, r39.xyzx, r29.xyzx - movc r39.xyz, r29.wwww, r39.xyzx, r29.xyzx - mad r40.xyz, -r40.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r39.xyzx - dp3 r22.w, r40.xyzx, r44.xyzx - mad r33.w, r22.w, r26.w, r32.w - max r33.w, r33.w, l(0.000000) - dp3 r34.w, r40.xyzx, r40.xyzx - mad r34.w, -r22.w, r22.w, r34.w - mul r36.w, r33.w, r33.w - lt r36.w, r36.w, r34.w - if_nz r36.w - iadd r36.w, r21.w, l(1) - mov r29.xyz, r39.xyzx - mov r21.w, r36.w - continue - endif - mul r30.w, r30.w, r42.w - mad r30.w, -r30.w, r30.w, l(1.000000) - max r34.w, r34.w, l(0.000000) - rsq r36.w, r34.w - mul r34.w, r26.w, r34.w - mad r34.w, r34.w, r36.w, r22.w - lt r23.w, |r34.w|, r23.w - mad r40.xyz, -r34.wwww, r42.xyzx, r40.xyzx - mul r33.w, r33.w, r36.w - mad r30.w, r33.w, r30.w, -r30.w - mad r40.xyz, r40.xyzx, r30.wwww, r30.xyzx - add r34.xyz, -r33.xyzx, r34.xyzx - mad r33.xyz, r19.xxxx, r34.xyzx, r33.xyzx - add r32.xyz, -r35.xyzx, r32.xyzx - mad r32.xyz, r19.xxxx, r32.xyzx, r35.xyzx - mad r22.w, r22.w, l(0.500000), l(0.500000) - add r33.xyz, -r33.xyzx, r36.xyzx - add r32.xyz, -r32.xyzx, r38.xyzx - add r32.xyz, -r33.xyzx, r32.xyzx - mad r32.xyz, r22.wwww, r32.xyzx, r33.xyzx - add r32.xyz, r31.xyzx, r32.xyzx - movc r33.xyz, r19.zzzz, r32.xyzx, r31.xyzx - iadd r33.w, r31.w, l(1) - movc r32.xyz, r23.wwww, r40.xyzx, r30.xyzx - movc r33.xyzw, r23.wwww, r33.xyzw, r31.xyzw - dp3 r22.w, r37.xyzx, r42.xyzx - mad r23.w, r22.w, r26.w, r32.w - max r34.y, r23.w, l(0.000000) - dp3 r23.w, r37.xyzx, r37.xyzx - mad r34.x, -r22.w, r22.w, r23.w - movc r34.xy, r35.wwww, r34.xyxx, r46.xyxx - movc r34.xy, r29.wwww, r34.xyxx, r46.xyxx - mul r22.w, r34.y, r34.y - ge r22.w, r34.x, r22.w - if_nz r22.w - iadd r22.w, r21.w, l(1) - mov r29.xyz, r39.xyzx - mov r30.xyz, r32.xyzx - mov r31.xyzw, r33.xyzw - mov r21.w, r22.w - continue - endif - mov r29.xyz, r39.xyzx - mov r30.xyz, r32.xyzx - mov r31.xyzw, r33.xyzw - iadd r21.w, r21.w, l(1) - endloop - ld_raw r21.w, l(52), g0.xxxx - mov r32.xyz, r29.xyzx - mov r33.xyz, r30.xyzx - mov r34.xyzw, r31.xyzw - mov r22.w, l(0) - loop - uge r23.w, r22.w, r21.w - breakc_nz r23.w - iadd r35.xy, r20.xyxx, r22.wwww - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r36.xyzw, r35.x, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r35.xyzw, r35.y, l(0), t7.xyzw - add r35.xyzw, -r36.xyzw, r35.xyzw - mad r37.xyzw, r17.xxxx, r35.xyzw, r36.xyzw - max r23.w, r37.w, l(0.000000) - mad r35.xyz, r19.xxxx, r35.xyzx, r36.xyzx - add r36.xyz, r32.xyzx, -r37.xyzx - add r38.xyz, r25.yzwy, -r35.xyzx - dp3 r26.w, r36.xyzx, r36.xyzx - add r36.w, r26.w, l(0.000000) - dp3 r26.w, r38.xyzx, r38.xyzx - mul r29.w, r23.w, r23.w - mad r26.w, -r23.w, r23.w, r26.w - dp3 r30.w, r38.xyzx, r36.xyzx - mad r30.w, -r23.w, r23.w, r30.w - mad r32.w, -r23.w, r23.w, r36.w - mul r33.w, r26.w, r32.w - mad r33.w, r30.w, r30.w, -r33.w - sqrt r35.w, r33.w - add r26.w, -r26.w, r30.w - add r30.w, r30.w, -r32.w - add r30.w, r26.w, r30.w - add r32.w, r35.w, r26.w - min r32.w, r32.w, l(0.000000) - div r32.w, r32.w, r30.w - lt r37.w, r32.w, l(1.000000) - lt r26.w, r26.w, r35.w - and r26.w, r26.w, r37.w - mul r29.w, r29.w, r30.w - mul r29.w, r29.w, l(-0.360000) - lt r29.w, r29.w, r33.w - and r26.w, r26.w, r29.w - lt r29.w, r30.w, l(-0.000000) - and r26.w, r26.w, r29.w - add r38.xyz, -r36.xyzx, r38.xyzx - add r29.w, -r32.w, l(1.000000) - mul r30.w, r29.w, r30.w - div r30.w, r35.w, r30.w - add r30.w, -r30.w, l(1.000000) - div r29.w, r29.w, r30.w - mad r38.xyz, r38.xyzx, r29.wwww, r36.xyzx - add r39.xyz, r37.xyzx, r38.xyzx - dp3 r29.w, r38.xyzx, r38.xyzx - add r38.w, r29.w, l(0.000000) - movc r32.xyz, r26.wwww, r39.xyzx, r32.xyzx - movc r36.xyzw, r26.wwww, r38.xyzw, r36.xyzw - rsq r26.w, r36.w - mul r29.w, r23.w, r26.w - lt r29.w, l(1.000000), r29.w - mad r23.w, r26.w, r23.w, l(-1.000000) - mad r36.xyz, r36.xyzx, r23.wwww, r33.xyzx - add r35.xyz, -r35.xyzx, r37.xyzx - add r35.xyz, r34.xyzx, r35.xyzx - movc r35.xyz, r19.zzzz, r35.xyzx, r34.xyzx - iadd r35.w, r34.w, l(1) - movc r33.xyz, r29.wwww, r36.xyzx, r33.xyzx - movc r34.xyzw, r29.wwww, r35.xyzw, r34.xyzw - iadd r22.w, r22.w, l(1) - endloop - if_nz r34.w - utof r21.w, r34.w - div r21.w, l(1.000000, 1.000000, 1.000000, 1.000000), r21.w - if_nz r19.z - ld_raw r22.w, l(80), g0.xxxx - dp3 r23.w, r33.xyzx, r33.xyzx - add r26.w, r23.w, l(0.000000) - rsq r26.w, r26.w - mul r32.xyz, r26.wwww, r33.xyzx - add r35.xyz, -r25.yzwy, r26.xyzx - mad r35.xyz, -r34.xyzx, r21.wwww, r35.xyzx - dp3 r29.w, r35.xyzx, r32.xyzx - mad r32.xyz, -r29.wwww, r32.xyzx, r35.xyzx - dp3 r29.w, r32.xyzx, r32.xyzx - add r29.w, r29.w, l(0.000000) - rsq r29.w, r29.w - mul r22.w, -r22.w, r23.w - mul r22.w, r26.w, r22.w - mul r22.w, r21.w, r22.w - mul r22.w, r29.w, r22.w - max r22.w, r22.w, l(-1.000000) - mad r25.yzw, -r32.xxyz, r22.wwww, r25.yyzw - store_structured u0.xyz, r21.z, l(0), r25.yzwy - endif - mad r25.yzw, r33.xxyz, r21.wwww, r26.xxyz - store_structured g3.x, r21.x, l(0), r25.y - store_structured g3.x, r28.x, l(0), r25.z - store_structured g3.x, r28.y, l(0), r25.w - store_structured g3.x, r28.z, l(0), r21.y - endif - mov r21.x, r28.w - endloop - else - ld_raw r19.yz, l(76), g0.xxyx - lt r19.yz, l(0.000000, 0.000000, 0.000000, 0.000000), r19.zzyz - ld_raw r19.w, l(0), g0.xxxx - ld_raw r20.xy, l(48), g1.xyxx - ld_raw r20.z, l(80), g0.xxxx - lt r20.w, l(0.000000), r20.z - ld_raw r21.xy, l(44), g0.xyxx - mov r21.z, vThreadIDInGroup.x - loop - uge r21.w, r21.z, r19.w - breakc_nz r21.w - ld_structured r26.x, r21.z, l(0), g3.xxxx - iadd r28.xyzw, r21.zzzz, l(1975, 3950, 5925, 1024) - ld_structured r26.y, r28.x, l(0), g3.xxxx - ld_structured r26.z, r28.y, l(0), g3.xxxx - ld_structured r21.w, r28.z, l(0), g3.xxxx - mov r25.yzw, l(0,0,0,0) - mov r32.xyzw, l(0,0,0,0) - mov r22.w, l(0) - loop - uge r23.w, r22.w, r21.x - breakc_nz r23.w - iadd r23.w, r21.y, r22.w - ld_structured_indexable(structured_buffer, stride=8)(mixed,mixed,mixed,mixed) r35.xy, r23.w, l(0), t6.xyxx - iadd r35.xyzw, r20.xyxy, r35.xxyy - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r36.xyzw, r35.x, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r37.xyzw, r35.y, l(0), t7.xyzw - add r38.xyzw, -r36.xyzw, r37.xyzw - mad r38.xyzw, r17.xxxx, r38.xyzw, r36.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r39.xyzw, r35.z, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r35.xyzw, r35.w, l(0), t7.xyzw - add r40.xyzw, -r39.xyzw, r35.xyzw - mad r40.xyzw, r17.xxxx, r40.xyzw, r39.xyzw - max r38.w, r38.w, l(0.000000) - max r40.w, r40.w, l(0.000000) - add r41.xyzw, -r38.xyzw, r40.xyzw - mul r42.xyzw, r41.xyzw, l(0.500000, 0.500000, 0.500000, 0.500000) - dp3 r23.w, r42.xyzx, r42.xyzx - mad r26.w, -r42.w, r42.w, r23.w - ge r29.w, l(0.000000), r26.w - if_nz r29.w - iadd r29.w, r22.w, l(1) - mov r22.w, r29.w - continue - endif - rsq r29.w, r23.w - rsq r26.w, r26.w - mul r23.w, r23.w, r29.w - add r41.xyz, r38.xyzx, r40.xyzx - mad r30.w, r41.w, l(0.500000), r38.w - mul r30.w, r26.w, r30.w - mul r30.w, r23.w, r30.w - mul r42.xyz, r29.wwww, r42.xyzx - mul r26.w, r26.w, r42.w - mad r41.xyz, -r41.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r26.xyzx - dp3 r33.w, r41.xyzx, r42.xyzx - mad r30.w, r33.w, r26.w, r30.w - max r30.w, r30.w, l(0.000000) - dp3 r35.w, r41.xyzx, r41.xyzx - mad r35.w, -r33.w, r33.w, r35.w - mul r36.w, r30.w, r30.w - lt r36.w, r36.w, r35.w - if_nz r36.w - iadd r36.w, r22.w, l(1) - mov r22.w, r36.w - continue - endif - mul r29.w, r29.w, r42.w - mad r29.w, -r29.w, r29.w, l(1.000000) - max r35.w, r35.w, l(0.000000) - rsq r36.w, r35.w - mul r26.w, r26.w, r35.w - mad r26.w, r26.w, r36.w, r33.w - lt r23.w, |r26.w|, r23.w - mad r41.xyz, -r26.wwww, r42.xyzx, r41.xyzx - mul r26.w, r30.w, r36.w - mad r26.w, r26.w, r29.w, -r29.w - mad r41.xyz, r41.xyzx, r26.wwww, r25.yzwy - add r37.xyz, -r36.xyzx, r37.xyzx - mad r36.xyz, r19.xxxx, r37.xyzx, r36.xyzx - add r35.xyz, -r39.xyzx, r35.xyzx - mad r35.xyz, r19.xxxx, r35.xyzx, r39.xyzx - mad r26.w, r33.w, l(0.500000), l(0.500000) - add r36.xyz, -r36.xyzx, r38.xyzx - add r35.xyz, -r35.xyzx, r40.xyzx - add r35.xyz, -r36.xyzx, r35.xyzx - mad r35.xyz, r26.wwww, r35.xyzx, r36.xyzx - add r35.xyz, r32.xyzx, r35.xyzx - movc r35.xyz, r20.wwww, r35.xyzx, r32.xyzx - iadd r35.w, r32.w, l(1) - movc r25.yzw, r23.wwww, r41.xxyz, r25.yyzw - movc r32.xyzw, r23.wwww, r35.xyzw, r32.xyzw - iadd r22.w, r22.w, l(1) - endloop - ld_raw r22.w, l(52), g0.xxxx - mov r35.xyz, r25.yzwy - mov r36.xyzw, r32.xyzw - mov r23.w, l(0) - loop - uge r26.w, r23.w, r22.w - breakc_nz r26.w - iadd r37.xy, r20.xyxx, r23.wwww - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r38.xyzw, r37.x, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r37.xyzw, r37.y, l(0), t7.xyzw - add r37.xyzw, -r38.xyzw, r37.xyzw - mad r39.xyzw, r17.xxxx, r37.xyzw, r38.xyzw - max r26.w, r39.w, l(0.000000) - add r40.xyz, r26.xyzx, -r39.xyzx - dp3 r29.w, r40.xyzx, r40.xyzx - add r29.w, r29.w, l(0.000000) - rsq r29.w, r29.w - mul r30.w, r26.w, r29.w - lt r30.w, l(1.000000), r30.w - mad r26.w, r29.w, r26.w, l(-1.000000) - mad r40.xyz, r40.xyzx, r26.wwww, r35.xyzx - mad r37.xyz, r19.xxxx, r37.xyzx, r38.xyzx - add r37.xyz, -r37.xyzx, r39.xyzx - add r37.xyz, r36.xyzx, r37.xyzx - movc r37.xyz, r20.wwww, r37.xyzx, r36.xyzx - iadd r37.w, r36.w, l(1) - movc r35.xyz, r30.wwww, r40.xyzx, r35.xyzx - movc r36.xyzw, r30.wwww, r37.xyzw, r36.xyzw - iadd r23.w, r23.w, l(1) - endloop - if_nz r36.w - utof r22.w, r36.w - div r22.w, l(1.000000, 1.000000, 1.000000, 1.000000), r22.w - if_nz r19.y - iadd r23.w, r0.x, r21.z - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r37.xyz, r23.w, l(0), u0.xyzx - ld_raw r26.w, l(80), g0.xxxx - dp3 r29.w, r35.xyzx, r35.xyzx - add r30.w, r29.w, l(0.000000) - rsq r30.w, r30.w - mul r38.xyz, r30.wwww, r35.xyzx - add r39.xyz, r26.xyzx, -r37.xyzx - mad r39.xyz, -r36.xyzx, r22.wwww, r39.xyzx - dp3 r33.w, r39.xyzx, r38.xyzx - mad r38.xyz, -r33.wwww, r38.xyzx, r39.xyzx - dp3 r33.w, r38.xyzx, r38.xyzx - add r33.w, r33.w, l(0.000000) - rsq r33.w, r33.w - mul r26.w, -r26.w, r29.w - mul r26.w, r30.w, r26.w - mul r26.w, r22.w, r26.w - mul r26.w, r33.w, r26.w - max r26.w, r26.w, l(-1.000000) - mad r37.xyz, -r38.xyzx, r26.wwww, r37.xyzx - store_structured u0.xyz, r23.w, l(0), r37.xyzx - endif - mad r26.xyz, r35.xyzx, r22.wwww, r26.xyzx - dp3 r22.w, r35.xyzx, r35.xyzx - ld_raw r23.w, l(76), g0.xxxx - mad r22.w, r23.w, r22.w, l(1.000000) - div r22.w, r21.w, r22.w - movc r21.w, r19.z, r22.w, r21.w - store_structured g3.x, r21.z, l(0), r26.x - store_structured g3.x, r28.x, l(0), r26.y - store_structured g3.x, r28.y, l(0), r26.z - store_structured g3.x, r28.z, l(0), r21.w - endif - mov r21.z, r28.w - endloop - endif - ld_raw r17.x, l(84), g0.xxxx - ld_raw r19.x, l(72), g1.xxxx - min r17.x, r17.x, r19.x - lt r17.x, l(0.000000), r17.x - if_nz r17.x - ld_raw r17.x, l(88), g0.xxxx - ld_raw r19.x, l(0), g0.xxxx - if_nz r1.z - ld_raw r19.yz, r4.z, g1.xxyx - add r19.w, r19.z, r19.y - mad r19.yz, r19.wwww, l(0.000000, 0.000100, 0.000100, 0.000000), r19.zzyz - add r19.z, r19.y, r19.z - store_structured g6.x, vThreadIDInGroup.x, l(0), r19.z - else - mov r19.yz, l(0,0,0,0) - endif - sync_g_t - if_nz r1.z - ld_structured r19.w, l(0), l(0), g6.xxxx - ld_structured r20.x, l(1), l(0), g6.xxxx - lt r19.w, r20.x, r19.w - and r20.x, r19.w, l(1) - ld_structured r20.x, r20.x, l(0), g6.xxxx - ld_structured r20.y, l(2), l(0), g6.xxxx - lt r20.x, r20.y, r20.x - movc r19.w, r20.x, l(-2), r19.w - iadd r19.w, r19.w, vThreadIDInGroup.x - ushr r20.x, r19.w, l(30) - iadd r19.w, r19.w, r20.x - div r19.z, l(127.000000), r19.z - ld_raw r20.x, l(84), g0.xxxx - div r20.x, l(1.000000, 1.000000, 1.000000, 1.000000), r20.x - min r19.z, r19.z, r20.x - ishl r19.w, r19.w, l(2) - iadd r20.xy, r19.wwww, l(12, 24, 0, 0) - store_raw g5.x, r20.x, r19.z - mul r19.y, r19.y, r19.z - store_raw g5.x, r19.w, r19.y - store_raw g5.x, r20.y, vThreadIDInGroup.x - endif - sync_g_t - ld_raw r19.y, l(100), g0.xxxx - ishl r19.z, r17.x, l(1) - iadd r19.y, r19.z, r19.y - ld_raw r19.z, l(116), g1.xxxx - if_nz r19.z - mov r19.z, vThreadIDInGroup.x - loop - ige r19.w, r19.z, l(0x00004103) - breakc_nz r19.w - iadd r19.w, r19.z, r19.y - store_structured u2.x, r19.w, l(0), l(-1) - iadd r19.z, r19.z, l(1024) - endloop - endif - ld_raw r19.zw, l(16), g5.xxxy - ld_raw r20.xy, l(4), g5.xyxx - ld_raw r20.zw, l(28), g5.xxxy - ld_raw r21.x, l(92), g0.xxxx - ine r21.y, r21.x, l(-1) - ld_raw r21.z, l(100), g0.xxxx - mov r21.w, vThreadIDInGroup.x - loop - ige r22.w, r21.w, r17.x - breakc_nz r22.w - iadd r22.w, r21.w, r21.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r22.w, r22.w, l(0), t15.xxxx - movc r22.w, r21.y, r22.w, r21.w - ld_structured r26.x, r22.w, l(0), g3.xxxx - iadd r28.xyz, r22.wwww, l(1975, 3950, 5925, 0) - ld_structured r26.y, r28.x, l(0), g3.xxxx - ld_structured r26.z, r28.y, l(0), g3.xxxx - ld_structured r26.w, r28.z, l(0), g3.xxxx - dp4 r23.w, r26.xyzw, icb[r20.z + 0].xyzw - mad r23.w, r23.w, r19.z, r20.x - min r23.w, r23.w, l(127.500000) - max r23.w, r23.w, l(0.000000) - ftoi r23.w, r23.w - dp4 r26.x, r26.xyzw, icb[r20.w + 0].xyzw - mad r26.x, r26.x, r19.w, r20.y - min r26.x, r26.x, l(127.500000) - max r26.x, r26.x, l(0.000000) - ftoi r26.x, r26.x - iadd r26.y, r21.w, r21.z - ishl r26.x, r26.x, l(23) - imad r23.w, r23.w, l(0x00010000), r26.x - iadd r23.w, r23.w, l(0x00810000) - or r22.w, r22.w, r23.w - store_structured u2.x, r26.y, l(0), r22.w - iadd r21.w, r21.w, l(1024) - endloop - sync_g_t - ld_raw r21.xy, l(96), g0.xyxx - iadd r21.z, r17.x, r21.y - mov r26.x, vThreadIDInGroup.x - loop - ige r21.w, r26.x, r19.x - breakc_nz r21.w - iadd r21.w, r21.x, r26.x - ld_structured r28.x, r26.x, l(0), g3.xxxx - iadd r26.xyzw, r26.xxxx, l(1024, 1975, 3950, 5925) - ld_structured r28.y, r26.y, l(0), g3.xxxx - ld_structured r28.z, r26.z, l(0), g3.xxxx - ld_structured r28.w, r26.w, l(0), g3.xxxx - store_structured u1.xyzw, r21.w, l(0), r28.xyzw - endloop - sync_g_t - iadd r21.x, r17.x, l(31) - ubfe r21.w, l(5), l(5), r21.x - ushr r21.x, r21.x, l(10) - ult r22.w, r4.y, r21.w - and r23.w, r22.w, l(1) - iadd r23.w, r21.x, r23.w - movc r26.x, r22.w, l(0), l(1) - imul null, r26.x, r21.w, r26.x - imad r26.x, r4.y, r23.w, r26.x - ishl r26.y, r26.x, l(5) - ishl r23.w, r23.w, l(5) - iadd r23.w, r23.w, r26.y - umin r23.w, r17.x, r23.w - bfi r26.x, l(27), l(5), r26.x, vThreadIDInGroup.x - mov r26.y, l(16) - mov r26.zw, r21.yyyz - loop - uge r28.x, r26.y, l(32) - breakc_nz r28.x - mov r28.xy, l(0,0,0,0) - mov r28.z, r26.x - loop - uge r28.w, r28.y, r21.x - breakc_nz r28.w - ult r28.w, r28.z, r23.w - iadd r29.w, r26.z, r28.z - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r29.w, r29.w, l(0), u2.xxxx - movc r28.w, r28.w, r29.w, l(-1) - ushr r28.w, r28.w, r26.y - and r37.xyzw, r28.wwww, l(1, 2, 4, 8) - ine r37.xyzw, r37.xyzw, l(0, 0, 0, 0) - bfi r37.xyzw, l(1, 1, 1, 1), vThreadIDInGroup.xxxx, r37.xyzw, l(0, 0, 0, 0) - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - sync_g_t - if_nz r7.x - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.x, l(0), g3.xxxx - ld_structured r38.y, r6.y, l(0), g3.xxxx - ld_structured r38.z, r9.x, l(0), g3.xxxx - ld_structured r38.w, r6.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - sync_g_t - if_nz r7.y - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.y, l(0), g3.xxxx - ld_structured r38.y, r6.w, l(0), g3.xxxx - ld_structured r38.z, r9.y, l(0), g3.xxxx - ld_structured r38.w, r8.x, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - sync_g_t - if_nz r7.z - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.z, l(0), g3.xxxx - ld_structured r38.y, r8.y, l(0), g3.xxxx - ld_structured r38.z, r9.z, l(0), g3.xxxx - ld_structured r38.w, r8.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - sync_g_t - if_nz r7.w - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.w, l(0), g3.xxxx - ld_structured r38.y, r8.w, l(0), g3.xxxx - ld_structured r38.z, r9.w, l(0), g3.xxxx - ld_structured r38.w, r13.x, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - sync_g_t - if_nz r4.w - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r6.x, l(0), g3.xxxx - ld_structured r38.y, r13.y, l(0), g3.xxxx - ld_structured r38.z, r14.x, l(0), g3.xxxx - ld_structured r38.w, r13.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - sync_g_t - ld_structured r28.w, r5.z, l(0), g3.xxxx - ld_structured r29.w, r10.x, l(0), g3.xxxx - ld_structured r30.w, r10.y, l(0), g3.xxxx - ld_structured r33.w, r10.z, l(0), g3.xxxx - xor r28.w, r2.z, r28.w - xor r29.w, r2.w, r29.w - and r28.w, r28.w, r29.w - xor r29.w, r5.x, r30.w - and r28.w, r28.w, r29.w - xor r29.w, r5.y, r33.w - and r28.w, r28.w, r29.w - countbits r28.w, r28.w - iadd r28.x, r28.w, r28.x - iadd r28.yz, r28.yyzy, l(0, 1, 32, 0) - endloop - if_nz r21.w - iadd r28.y, r26.z, r28.z - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r28.y, r28.y, l(0), u2.xxxx - if_nz r22.w - ult r28.w, r28.z, r23.w - movc r28.y, r28.w, r28.y, l(-1) - ushr r28.y, r28.y, r26.y - and r37.xyzw, r28.yyyy, l(1, 2, 4, 8) - ine r37.xyzw, r37.xyzw, l(0, 0, 0, 0) - bfi r37.xyzw, l(1, 1, 1, 1), vThreadIDInGroup.xxxx, r37.xyzw, l(0, 0, 0, 0) - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - sync_g_t - if_nz r22.w - if_nz r7.x - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.x, l(0), g3.xxxx - ld_structured r38.y, r6.y, l(0), g3.xxxx - ld_structured r38.z, r9.x, l(0), g3.xxxx - ld_structured r38.w, r6.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - if_nz r7.y - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.y, l(0), g3.xxxx - ld_structured r38.y, r6.w, l(0), g3.xxxx - ld_structured r38.z, r9.y, l(0), g3.xxxx - ld_structured r38.w, r8.x, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - if_nz r7.z - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.z, l(0), g3.xxxx - ld_structured r38.y, r8.y, l(0), g3.xxxx - ld_structured r38.z, r9.z, l(0), g3.xxxx - ld_structured r38.w, r8.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - if_nz r7.w - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.w, l(0), g3.xxxx - ld_structured r38.y, r8.w, l(0), g3.xxxx - ld_structured r38.z, r9.w, l(0), g3.xxxx - ld_structured r38.w, r13.x, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - if_nz r4.w - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r6.x, l(0), g3.xxxx - ld_structured r38.y, r13.y, l(0), g3.xxxx - ld_structured r38.z, r14.x, l(0), g3.xxxx - ld_structured r38.w, r13.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - ld_structured r37.x, r5.z, l(0), g3.xxxx - ld_structured r37.y, r10.x, l(0), g3.xxxx - ld_structured r37.z, r10.y, l(0), g3.xxxx - ld_structured r37.w, r10.z, l(0), g3.xxxx - else - mov r37.xyzw, l(0,0,0,0) - endif - xor r28.yw, r2.zzzw, r37.xxxy - and r28.y, r28.w, r28.y - xor r37.xy, r5.xyxx, r37.zwzz - and r28.y, r28.y, r37.x - and r28.y, r37.y, r28.y - countbits r28.y, r28.y - and r28.y, r22.w, r28.y - iadd r28.x, r28.y, r28.x - endif - if_nz r7.x - store_structured g3.x, r11.x, l(0), r28.x - endif - sync_g_t - if_z vThreadIDInGroup.x - store_structured g3.x, l(4096), l(0), l(0) - store_structured g3.x, l(4609), l(0), l(0) - endif - if_nz r1.w - if_nz r16.x - ld_structured r28.y, r14.y, l(0), g3.xxxx - ld_structured r28.w, r5.w, l(0), g3.xxxx - iadd r28.y, r28.w, r28.y - store_structured g3.x, r10.w, l(0), r28.y - else - ld_structured r28.y, l(4097), l(0), g3.xxxx - store_structured g3.x, l(4610), l(0), r28.y - endif - endif - sync_g_t - if_nz r1.w - if_nz r16.y - ld_structured r28.y, r10.w, l(0), g3.xxxx - ld_structured r28.w, r11.w, l(0), g3.xxxx - iadd r28.y, r28.w, r28.y - else - ld_structured r28.y, r10.w, l(0), g3.xxxx - endif - store_structured g3.x, r15.x, l(0), r28.y - endif - sync_g_t - if_nz r1.w - if_nz r16.z - ld_structured r28.y, r14.y, l(0), g3.xxxx - ld_structured r28.w, r15.w, l(0), g3.xxxx - iadd r28.y, r28.w, r28.y - else - ld_structured r28.y, r14.y, l(0), g3.xxxx - endif - store_structured g3.x, r15.z, l(0), r28.y - endif - sync_g_t - if_nz r1.w - if_nz r16.w - ld_structured r28.y, r10.w, l(0), g3.xxxx - ld_structured r28.w, r14.z, l(0), g3.xxxx - iadd r28.y, r28.w, r28.y - else - ld_structured r28.y, r10.w, l(0), g3.xxxx - endif - store_structured g3.x, r15.x, l(0), r28.y - endif - sync_g_t - if_nz r1.w - if_nz r18.x - ld_structured r28.y, r14.y, l(0), g3.xxxx - ld_structured r28.w, r17.y, l(0), g3.xxxx - iadd r28.y, r28.w, r28.y - else - ld_structured r28.y, r14.y, l(0), g3.xxxx - endif - store_structured g3.x, r15.z, l(0), r28.y - endif - sync_g_t - if_nz r1.w - if_nz r18.y - ld_structured r28.y, r10.w, l(0), g3.xxxx - ld_structured r28.w, r14.w, l(0), g3.xxxx - iadd r28.y, r28.w, r28.y - else - ld_structured r28.y, r10.w, l(0), g3.xxxx - endif - store_structured g3.x, r15.x, l(0), r28.y - endif - sync_g_t - if_nz r1.w - if_nz r18.z - ld_structured r28.y, r14.y, l(0), g3.xxxx - ld_structured r28.w, r17.w, l(0), g3.xxxx - iadd r28.y, r28.w, r28.y - else - ld_structured r28.y, r14.y, l(0), g3.xxxx - endif - store_structured g3.x, r15.z, l(0), r28.y - endif - sync_g_t - if_nz r1.w - if_nz r18.w - ld_structured r28.y, r10.w, l(0), g3.xxxx - ld_structured r28.w, r12.w, l(0), g3.xxxx - iadd r28.y, r28.w, r28.y - else - ld_structured r28.y, r10.w, l(0), g3.xxxx - endif - store_structured g3.x, r15.x, l(0), r28.y - endif - sync_g_t - if_nz r1.w - if_nz r13.w - ld_structured r28.y, r14.y, l(0), g3.xxxx - ld_structured r28.w, r17.z, l(0), g3.xxxx - iadd r28.y, r28.w, r28.y - else - ld_structured r28.y, r14.y, l(0), g3.xxxx - endif - store_structured g3.x, r15.z, l(0), r28.y - endif - sync_g_t - mov r28.y, l(0) - mov r28.w, r26.x - loop - uge r29.w, r28.y, r21.x - breakc_nz r29.w - ult r29.w, r28.w, r23.w - iadd r30.w, r26.z, r28.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r30.w, r30.w, l(0), u2.xxxx - movc r30.w, r29.w, r30.w, l(-1) - ushr r33.w, r30.w, r26.y - and r37.xyzw, r33.wwww, l(1, 2, 4, 8) - ine r38.xyzw, r37.xyzw, l(0, 0, 0, 0) - bfi r39.xyzw, l(1, 1, 1, 1), vThreadIDInGroup.xxxx, r38.xyzw, l(0, 0, 0, 0) - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - sync_g_t - if_nz r7.x - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r3.x, l(0), g3.xxxx - ld_structured r40.y, r6.y, l(0), g3.xxxx - ld_structured r40.z, r9.x, l(0), g3.xxxx - ld_structured r40.w, r6.z, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - if_nz r7.y - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r3.y, l(0), g3.xxxx - ld_structured r40.y, r6.w, l(0), g3.xxxx - ld_structured r40.z, r9.y, l(0), g3.xxxx - ld_structured r40.w, r8.x, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - if_nz r7.z - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r3.z, l(0), g3.xxxx - ld_structured r40.y, r8.y, l(0), g3.xxxx - ld_structured r40.z, r9.z, l(0), g3.xxxx - ld_structured r40.w, r8.z, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - if_nz r7.w - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r3.w, l(0), g3.xxxx - ld_structured r40.y, r8.w, l(0), g3.xxxx - ld_structured r40.z, r9.w, l(0), g3.xxxx - ld_structured r40.w, r13.x, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - if_nz r4.w - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r6.x, l(0), g3.xxxx - ld_structured r40.y, r13.y, l(0), g3.xxxx - ld_structured r40.z, r14.x, l(0), g3.xxxx - ld_structured r40.w, r13.z, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - ld_structured r35.w, r5.z, l(0), g3.xxxx - ld_structured r37.y, r10.x, l(0), g3.xxxx - ld_structured r37.z, r10.y, l(0), g3.xxxx - ld_structured r37.w, r10.z, l(0), g3.xxxx - bfi r33.w, l(4), l(5), r33.w, l(0) - iadd r33.w, r11.y, r33.w - iadd r33.w, r33.w, l(4096) - ld_structured r33.w, r33.w, l(0), g3.xxxx - if_nz r29.w - iadd r29.w, r37.x, l(-1) - xor r29.w, r35.w, r29.w - ieq r38.xyz, r38.yzwy, l(0, 0, 0, 0) - xor r37.x, r37.y, r38.x - and r29.w, r29.w, r37.x - xor r37.x, r37.z, r38.y - and r29.w, r29.w, r37.x - xor r37.x, r37.w, r38.z - and r29.w, r29.w, r37.x - ubfe r29.w, vThreadIDInGroup.x, l(0), r29.w - countbits r29.w, r29.w - iadd r29.w, r29.w, r33.w - iadd r29.w, r26.w, r29.w - store_structured u2.x, r29.w, l(0), r30.w - endif - sync_g_t - if_nz r7.x - ld_structured r29.w, r11.z, l(0), g3.xxxx - xor r30.w, r2.z, r35.w - xor r33.w, r2.w, r37.y - and r30.w, r30.w, r33.w - xor r33.w, r5.x, r37.z - and r30.w, r30.w, r33.w - xor r33.w, r5.y, r37.w - and r30.w, r30.w, r33.w - countbits r30.w, r30.w - iadd r29.w, r29.w, r30.w - store_structured g3.x, r11.z, l(0), r29.w - endif - iadd r28.yw, r28.yyyw, l(0, 1, 0, 32) - endloop - if_nz r21.w - ult r28.y, r28.w, r23.w - iadd r29.w, r26.z, r28.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r29.w, r29.w, l(0), u2.xxxx - movc r29.w, r28.y, r29.w, l(-1) - ushr r30.w, r29.w, r26.y - if_nz r22.w - and r37.xyzw, r30.wwww, l(1, 2, 4, 8) - ine r37.xyzw, r37.xyzw, l(0, 0, 0, 0) - bfi r37.xyzw, l(1, 1, 1, 1), vThreadIDInGroup.xxxx, r37.xyzw, l(0, 0, 0, 0) - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - sync_g_t - if_nz r22.w - if_nz r7.x - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.x, l(0), g3.xxxx - ld_structured r38.y, r6.y, l(0), g3.xxxx - ld_structured r38.z, r9.x, l(0), g3.xxxx - ld_structured r38.w, r6.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - if_nz r7.y - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.y, l(0), g3.xxxx - ld_structured r38.y, r6.w, l(0), g3.xxxx - ld_structured r38.z, r9.y, l(0), g3.xxxx - ld_structured r38.w, r8.x, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - if_nz r7.z - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.z, l(0), g3.xxxx - ld_structured r38.y, r8.y, l(0), g3.xxxx - ld_structured r38.z, r9.z, l(0), g3.xxxx - ld_structured r38.w, r8.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - if_nz r7.w - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.w, l(0), g3.xxxx - ld_structured r38.y, r8.w, l(0), g3.xxxx - ld_structured r38.z, r9.w, l(0), g3.xxxx - ld_structured r38.w, r13.x, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - if_nz r4.w - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r6.x, l(0), g3.xxxx - ld_structured r38.y, r13.y, l(0), g3.xxxx - ld_structured r38.z, r14.x, l(0), g3.xxxx - ld_structured r38.w, r13.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r22.w - ld_structured r37.x, r5.z, l(0), g3.xxxx - ld_structured r37.y, r10.x, l(0), g3.xxxx - ld_structured r37.z, r10.y, l(0), g3.xxxx - ld_structured r37.w, r10.z, l(0), g3.xxxx - and r38.xyzw, r30.wwww, l(1, 2, 4, 8) - iadd r33.w, r38.x, l(-1) - xor r33.w, r37.x, r33.w - ine r38.xyz, r38.yzwy, l(0, 0, 0, 0) - ieq r38.xyz, r38.xyzx, l(0, 0, 0, 0) - xor r38.xyz, r37.yzwy, r38.xyzx - and r33.w, r33.w, r38.x - and r33.w, r38.y, r33.w - and r33.w, r38.z, r33.w - bfi r30.w, l(4), l(5), r30.w, l(0) - iadd r30.w, r11.y, r30.w - iadd r30.w, r30.w, l(4096) - ld_structured r30.w, r30.w, l(0), g3.xxxx - ubfe r33.w, vThreadIDInGroup.x, l(0), r33.w - countbits r33.w, r33.w - iadd r30.w, r30.w, r33.w - else - mov r37.xyzw, l(0,0,0,0) - mov r30.w, l(0) - endif - if_nz r28.y - iadd r28.y, r26.w, r30.w - store_structured u2.x, r28.y, l(0), r29.w - endif - sync_g_t - if_nz r22.w - if_nz r7.x - ld_structured r28.y, r11.z, l(0), g3.xxxx - xor r29.w, r2.z, r37.x - xor r30.w, r2.w, r37.y - and r29.w, r29.w, r30.w - xor r37.xy, r5.xyxx, r37.zwzz - and r29.w, r29.w, r37.x - and r29.w, r37.y, r29.w - countbits r29.w, r29.w - iadd r28.y, r28.y, r29.w - store_structured g3.x, r11.z, l(0), r28.y - endif - endif - endif - iadd r26.y, r26.y, l(4) - mov r28.y, r26.w - mov r26.w, r26.z - mov r26.z, r28.y - endloop - mov r21.x, vThreadIDInGroup.x - loop - ige r21.z, r21.x, r17.x - breakc_nz r21.z - iadd r21.z, r21.x, r21.y - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r21.w, r21.z, l(0), u2.xxxx - iadd r21.z, r21.z, l(-1) - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r21.z, r21.z, l(0), u2.xxxx - ishr r21.zw, r21.zzzw, l(0, 0, 16, 16) - iadd r22.w, r21.w, l(-1) - movc r21.z, r21.x, r21.z, r22.w - ine r22.w, r21.z, r21.w - if_nz r22.w - iadd r21.zw, r19.yyyy, r21.zzzw - store_structured u2.x, r21.w, l(0), r21.x - iadd r21.z, r21.z, l(1) - store_structured u2.x, r21.z, l(0), r21.x - endif - iadd r21.x, r21.x, l(1024) - endloop - ld_raw r21.xy, l(96), g0.xyxx - mov r26.x, vThreadIDInGroup.x - loop - ige r21.z, r26.x, r17.x - breakc_nz r21.z - iadd r21.z, r21.y, r26.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r21.z, r21.z, l(0), u2.xxxx - and r21.z, r21.z, l(0x0000ffff) - iadd r21.z, r21.z, r21.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r37.xyzw, r21.z, l(0), u1.xyzw - store_structured g3.x, r26.x, l(0), r37.x - iadd r26.xyzw, r26.xxxx, l(1024, 1975, 3950, 5925) - store_structured g3.x, r26.y, l(0), r37.y - store_structured g3.x, r26.z, l(0), r37.z - store_structured g3.x, r26.w, l(0), r37.w - endloop - sync_g_t - ld_raw r21.x, l(84), g0.xxxx - mul r21.y, r21.x, r21.x - ld_raw r21.z, l(100), g0.xxxx - ld_raw r21.w, l(112), g1.xxxx - mov r22.w, vThreadIDInGroup.x - loop - ige r23.w, r22.w, r17.x - breakc_nz r23.w - iadd r23.w, r21.z, r22.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r23.w, r23.w, l(0), u2.xxxx - and r23.w, r23.w, l(0x0000ffff) - ld_structured r26.x, r22.w, l(0), g3.xxxx - iadd r37.xyzw, r22.wwww, l(1975, 3950, 5925, 1024) - ld_structured r26.y, r37.x, l(0), g3.xxxx - ld_structured r26.z, r37.y, l(0), g3.xxxx - ld_structured r26.w, r37.z, l(0), g3.xxxx - iadd r28.y, r21.w, r23.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r37.xyz, r28.y, l(0), t14.xyzx - dp4 r28.y, r26.xyzw, icb[r20.z + 0].xyzw - mad r28.y, r28.y, r19.z, r20.x - min r28.y, r28.y, l(127.500000) - max r28.y, r28.y, l(0.000000) - ftoi r28.y, r28.y - dp4 r29.w, r26.xyzw, icb[r20.w + 0].xyzw - mad r29.w, r29.w, r19.w, r20.y - min r29.w, r29.w, l(127.500000) - max r29.w, r29.w, l(0.000000) - ftoi r29.w, r29.w - imad r28.y, r29.w, l(128), r28.y - iadd r29.w, r28.y, l(256) - add r30.w, r26.w, l(0.000000) - mov r38.xyz, l(0,0,0,0) - mov r33.w, l(0.000000) - mov r35.w, r28.y - loop - ilt r38.w, r29.w, r35.w - breakc_nz r38.w - iadd r38.w, r19.y, r35.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r39.x, r38.w, l(0), u2.xxxx - iadd r39.yzw, r38.wwww, l(0, 1, 2, 3) - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r38.w, r39.y, l(0), u2.xxxx - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r39.y, r39.z, l(0), u2.xxxx - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r39.z, r39.w, l(0), u2.xxxx - umin r39.x, r38.w, r39.x - umin r39.x, r39.y, r39.x - imax r38.w, r38.w, r39.y - imax r38.w, r39.z, r38.w - imax r38.w, r38.w, l(0) - mov r39.yzw, r38.xxyz - mov r40.x, r33.w - mov r40.y, r39.x - loop - uge r40.z, r40.y, r38.w - breakc_nz r40.z - ine r40.z, r22.w, r40.y - if_nz r40.z - ld_structured r41.x, r40.y, l(0), g3.xxxx - iadd r42.xyz, r40.yyyy, l(1975, 3950, 5925, 0) - ld_structured r41.y, r42.x, l(0), g3.xxxx - ld_structured r41.z, r42.y, l(0), g3.xxxx - ld_structured r40.z, r42.z, l(0), g3.xxxx - add r41.xyz, r26.xyzx, -r41.xyzx - dp3 r40.w, r41.xyzx, r41.xyzx - lt r41.w, r21.y, r40.w - if_nz r41.w - iadd r41.w, r40.y, l(1) - mov r40.y, r41.w - continue - endif - ld_raw r41.w, l(112), g1.xxxx - ine r42.x, r41.w, l(-1) - if_nz r42.x - ld_raw r42.x, l(100), g0.xxxx - iadd r42.x, r40.y, r42.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r42.x, r42.x, l(0), u2.xxxx - and r42.x, r42.x, l(0x0000ffff) - iadd r41.w, r41.w, r42.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r42.xyz, r41.w, l(0), t14.xyzx - add r42.xyz, r37.xyzx, -r42.xyzx - dp3 r41.w, r42.xyzx, r42.xyzx - ge r42.x, r21.y, r41.w - if_nz r42.x - iadd r42.x, r40.y, l(1) - mov r40.y, r42.x - continue - endif - add r41.w, r41.w, l(0.000000) - div r41.w, r21.y, r41.w - rsq r41.w, r41.w - add r41.w, r41.w, l(-1.000000) - min r41.w, r41.w, l(1.000000) - else - mov r41.w, l(1.000000) - endif - add r40.w, r40.w, l(0.000000) - rsq r40.w, r40.w - mad r40.w, r21.x, r40.w, l(-1.000000) - max r40.w, r40.w, l(0.000000) - mul r42.x, r40.w, r40.w - mul r41.w, r41.w, r42.x - add r40.z, r30.w, r40.z - div r40.z, r41.w, r40.z - mad r39.yzw, r40.zzzz, r41.xxyz, r39.yyzw - add r40.x, r40.w, r40.x - endif - iadd r40.y, r40.y, l(1) - endloop - mov r38.xyz, r39.yzwy - mov r33.w, r40.x - iadd r35.w, r35.w, l(128) - endloop - ld_raw r26.x, l(72), g1.xxxx - mul r26.x, r26.w, r26.x - div r26.x, r26.x, r33.w - ld_raw r26.y, l(96), g0.xxxx - iadd r23.w, r23.w, r26.y - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r37.xyz, r23.w, l(0), u1.xyzx - mad r26.xzw, r38.xxyz, r26.xxxx, r37.xxyz - store_structured u1.xyz, r23.w, l(0), r26.xzwx - mov r22.w, r37.w - endloop - sync_g_t - ld_raw r19.z, l(96), g0.xxxx - mov r20.x, vThreadIDInGroup.x - loop - ige r19.w, r20.x, r19.x - breakc_nz r19.w - iadd r19.w, r19.z, r20.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r21.xyzw, r19.w, l(0), u1.xyzw - store_structured g3.x, r20.x, l(0), r21.x - iadd r20.xyzw, r20.xxxx, l(1024, 1975, 3950, 5925) - store_structured g3.x, r20.y, l(0), r21.y - store_structured g3.x, r20.z, l(0), r21.z - store_structured g3.x, r20.w, l(0), r21.w - endloop - ld_raw r19.x, l(100), g0.xxxx - mov r19.z, vThreadIDInGroup.x - loop - ige r19.w, r19.z, r17.x - breakc_nz r19.w - iadd r19.w, r19.z, r19.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r19.w, r19.w, l(0), u2.xxxx - ushr r19.w, r19.w, l(16) - iadd r19.w, r19.w, r19.y - store_structured u2.x, r19.w, l(0), l(-1) - iadd r20.x, r19.w, l(1) - store_structured u2.x, r20.x, l(0), l(-1) - iadd r19.z, r19.z, l(1024) - endloop - endif - if_z vThreadIDInGroup.x - ld_raw r17.x, l(8), g1.xxxx - mul r17.x, r17.x, l(1000.000000) - ftou r17.x, r17.x - umax r17.x, r17.x, l(1) - ld_raw r19.x, l(104), g1.xxxx - iadd r17.x, r17.x, r19.x - store_raw g1.x, l(104), r17.x - endif - sync_g_t - ld_raw r17.x, l(104), g1.xxxx - ld_raw r19.x, l(104), g0.xxxx - uge r17.x, r17.x, r19.x - if_nz r17.x - ld_raw r17.x, l(0), g0.xxxx - mov r19.x, l(0) - mov r19.y, vThreadIDInGroup.x - loop - uge r19.z, r19.y, r17.x - breakc_nz r19.z - ld_structured r20.x, r19.y, l(0), g3.xxxx - iadd r21.xyz, r19.yyyy, l(1975, 3950, 1024, 0) - ld_structured r20.y, r21.x, l(0), g3.xxxx - ld_structured r20.z, r21.y, l(0), g3.xxxx - iadd r19.z, r0.x, r19.y - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r21.xyw, r19.z, l(0), u0.xyxz - add r20.xyz, r20.xyzx, -r21.xywx - max r19.z, |r20.y|, |r20.x| - max r19.z, |r20.z|, r19.z - max r19.x, r19.x, r19.z - mov r19.y, r21.z - endloop - if_z vThreadIDInGroup.x - ld_raw r17.x, l(100), g1.xxxx - iadd r17.x, r17.x, l(1) - store_raw g1.x, l(100), r17.x - ld_raw r17.x, l(104), g0.xxxx - ld_raw r19.y, l(104), g1.xxxx - iadd r17.x, -r17.x, r19.y - store_raw g1.x, l(104), r17.x - endif - ld_raw r17.x, l(112), g0.xxxx - ld_raw r19.y, l(8), g1.xxxx - mul r17.x, r17.x, r19.y - lt r17.x, r17.x, r19.x - if_nz r17.x - store_raw g1.x, l(100), l(0) - endif - endif - iadd r15.y, r15.y, l(1) - endloop - sync_g_t - ld_raw r0.yz, l(0), g0.xxyx - mov r1.x, vThreadIDInGroup.x - loop - uge r0.w, r1.x, r0.y - breakc_nz r0.w - iadd r0.w, r0.z, r1.x - ld_structured r2.x, r1.x, l(0), g3.xxxx - iadd r1.xyzw, r1.xxxx, l(1024, 1975, 3950, 5925) - ld_structured r2.y, r1.y, l(0), g3.xxxx - ld_structured r2.z, r1.z, l(0), g3.xxxx - ld_structured r2.w, r1.w, l(0), g3.xxxx - store_structured u0.xyzw, r0.w, l(0), r2.xyzw - endloop -else - ld_raw r0.y, l(4), g0.xxxx - not r0.z, vThreadIDInGroup.x - and r0.z, r0.z, l(3) - ult r1.xyzw, vThreadIDInGroup.xxxx, l(192, 176, 3, 512) - and r2.xyzw, vThreadIDInGroup.xxxx, l(32, 31, 1, 2) - movc r0.w, r2.x, l(-1.000000), l(1.000000) - iadd r3.xyzw, vThreadIDInGroup.xxxx, l(16, 8, 4, 2) - ieq r2.x, r2.y, l(0) - and r2.x, r1.x, r2.x - ushr r4.xy, vThreadIDInGroup.xxxx, l(6, 5, 0, 0) - ishl r4.z, r4.y, l(2) - ishl r4.w, vThreadIDInGroup.x, l(3) - iadd r4.zw, r4.zzzw, l(0, 0, 76, 76) - iadd r2.z, r2.z, l(-1) - ine r2.w, r2.w, l(0) - ieq r2.w, r2.w, l(0) - and r5.xyz, vThreadIDInGroup.xxxx, l(4, 8, 992, 0) - ine r5.xy, r5.xyxx, l(0, 0, 0, 0) - ieq r5.xy, r5.xyxx, l(0, 0, 0, 0) - iadd r6.xyzw, vThreadIDInGroup.xxxx, l(1, 1040, 3088, 1032) - ult r7.xyzw, r2.yyyy, l(16, 8, 4, 2) - ult r5.w, r2.y, l(1) - iadd r8.xyzw, vThreadIDInGroup.xxxx, l(3080, 1028, 3076, 1026) - iadd r9.xyzw, r3.xyzw, l(2048, 2048, 2048, 2048) - iadd r10.xyz, r5.zzzz, l(1024, 2048, 3072, 0) - iadd r11.xy, r4.yyyy, l(1, 513, 0, 0) - bfi r12.xyzw, l(10, 11, 10, 5), l(0, 0, 0, 5), vThreadIDInGroup.xxxx, l(1024, 2048, 3072, 0) - iadd r11.xz, r11.xxyx, r12.wwww - iadd r13.xyzw, vThreadIDInGroup.xxxx, l(3074, 1025, 3073, 514) - iadd r14.xy, r6.xxxx, l(2048, 4096, 0, 0) - iadd r10.w, vThreadIDInGroup.x, l(4096) - iadd r11.w, r13.w, l(4096) - iadd r15.xyzw, vThreadIDInGroup.xxxx, l(4097, 512, 4610, 4093) - iadd r12.w, r15.y, l(4096) - uge r16.xyzw, vThreadIDInGroup.xxxx, l(1, 2, 4, 8) - iadd r17.xyzw, vThreadIDInGroup.xxxx, l(506, 4081, 482, 4033) - iadd r14.zw, r17.xxxz, l(0, 0, 4096, 4096) - uge r18.xyzw, vThreadIDInGroup.xxxx, l(16, 32, 64, 128) - iadd r17.xz, vThreadIDInGroup.xxxx, l(386, 0, 3841, 0) - iadd r13.w, r17.x, l(4096) - uge r15.y, vThreadIDInGroup.x, l(256) - iadd r11.xz, r11.xxzx, l(4096, 0, 4096, 0) - mov r17.x, l(0) - loop - ld_raw r19.x, l(16), g1.xxxx - uge r19.y, r17.x, r19.x - breakc_nz r19.y - utof r19.y, r17.x - add r19.z, r19.y, l(1.000000) - utof r19.x, r19.x - div r19.x, r19.z, r19.x - if_z vThreadIDInGroup.x - ld_raw r19.z, l(12), g1.xxxx - iadd r19.z, r17.x, r19.z - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r20.xyzw, r19.z, l(0), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r21.xyzw, r19.z, l(16), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r22.xyzw, r19.z, l(32), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r23.xyzw, r19.z, l(48), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r24.xyzw, r19.z, l(64), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r25.xyzw, r19.z, l(80), t2.xyzw - ld_structured_indexable(structured_buffer, stride=100)(mixed,mixed,mixed,mixed) r19.z, r19.z, l(96), t2.xxxx - store_raw g2.xyzw, l(0), r20.xyzw - store_raw g2.xyzw, l(16), r21.xyzw - store_raw g2.xyzw, l(32), r22.xyzw - store_raw g2.xyzw, l(48), r23.xyzw - store_raw g2.xyzw, l(64), r24.xyzw - store_raw g2.xyzw, l(80), r25.xyzw - store_raw g2.x, l(96), r19.z - endif - sync_g_t - ld_raw r19.z, l(0), g0.xxxx - ld_raw r20.xyz, l(12), g2.xyzx - ld_raw r21.xyzw, l(60), g2.xyzw - ld_raw r22.xyzw, l(24), g2.xyzw - ld_raw r23.xyzw, l(76), g2.xyzw - ld_raw r24.xyzw, l(40), g2.xyzw - ld_raw r25.xy, l(92), g2.xyxx - ld_raw r19.w, l(56), g2.xxxx - ld_raw r26.xyzw, l(12), g2.xyzw - ld_raw r20.w, l(36), g2.xxxx - ld_raw r25.z, l(48), g2.xxxx - mov r25.w, vThreadIDInGroup.x - loop - uge r27.x, r25.w, r19.z - breakc_nz r27.x - iadd r27.x, r0.y, r25.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r28.xyzw, r27.x, l(0), u0.xyzw - iadd r27.y, r0.x, r25.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r29.xyzw, r27.y, l(0), u0.xyzw - eq r27.z, r28.w, l(0.000000) - movc r28.w, r27.z, r29.w, r28.w - lt r27.z, l(0.000000), r28.w - if_nz r27.z - if_nz r25.y - add r30.xyz, r20.xyzx, r28.xyzx - mad r27.zw, r28.xxxx, r21.xxxw, r30.xxxy - mad r27.zw, r29.xxxx, r22.xxxw, r27.zzzw - mad r27.z, r28.y, r21.y, r27.z - mad r27.z, r29.y, r22.y, r27.z - mad r27.z, r28.z, r21.z, r27.z - mad r30.x, r29.z, r22.z, r27.z - mad r27.z, r28.y, r23.x, r27.w - mad r27.z, r29.y, r24.x, r27.z - mad r27.z, r28.z, r23.y, r27.z - mad r30.y, r29.z, r24.y, r27.z - mad r27.z, r28.x, r23.z, r30.z - mad r27.z, r29.x, r24.z, r27.z - mad r27.z, r28.y, r23.w, r27.z - mad r27.z, r29.y, r24.w, r27.z - mad r27.z, r28.z, r25.x, r27.z - mad r27.z, r29.z, r19.w, r27.z - else - add r31.xyz, r28.xyzx, -r29.xyzx - mad r27.w, r31.x, r26.w, r26.x - add r30.x, r27.w, r28.x - mad r27.w, r31.y, r20.w, r26.y - add r30.y, r27.w, r28.y - mad r27.w, r31.z, r25.z, r26.z - add r27.z, r27.w, r28.z - endif - ld_raw r31.xyz, l(0), g2.xyzx - add r29.xyz, r28.xyzx, r31.xyzx - mov r28.xy, r30.xyxx - mov r28.z, r27.z - else - mov r29.xyz, r28.xyzx - endif - store_structured u0.xyzw, r27.x, l(0), r28.xyzw - store_structured u0.xyzw, r27.y, l(0), r29.xyzw - iadd r25.w, r25.w, l(1024) - endloop - ld_raw r19.z, l(44), g1.xxxx - sync_g_t - ld_raw r19.w, l(8), g1.xxxx - mul r19.w, r19.w, r19.w - movc r19.w, r0.z, r19.w, l(0) - ld_raw r20.x, l(0), g0.xxxx - ishl r20.y, r20.x, l(2) - mov r20.z, vThreadIDInGroup.x - loop - uge r20.w, r20.z, r20.y - breakc_nz r20.w - ushr r20.w, r20.z, l(2) - iadd r20.w, r0.y, r20.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r21.xyzw, r20.w, l(0), u0.xyzw - lt r22.x, l(0.000000), r21.w - if_nz r22.x - iadd r22.x, r19.z, r20.z - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r22.xyzw, r22.x, l(0), t13.xyzw - mad r21.xyzw, r22.xyzw, r19.wwww, r21.xyzw - store_structured u0.xyzw, r20.w, l(0), r21.xyzw - endif - iadd r20.z, r20.z, l(1024) - endloop - sync_g_t - ld_raw r19.z, l(28), g1.xxxx - ine r19.z, r19.z, l(-1) - if_nz r19.z - ld_raw r19.zw, l(36), g0.xxxy - ld_raw r20.xyz, l(24), g1.xyzx - ld_raw r20.w, l(0), g0.xxxx - mov r21.x, vThreadIDInGroup.x - loop - uge r21.y, r21.x, r20.w - breakc_nz r21.y - iadd r21.yz, r20.yyzy, r21.xxxx - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r22.xyzw, r21.y, l(0), t11.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r23.xyzw, r21.z, l(0), t11.xyzw - add r23.xyzw, -r22.xyzw, r23.xyzw - mad r22.xyzw, r23.xyzw, r19.xxxx, r22.xyzw - iadd r21.y, r0.y, r21.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r23.xyzw, r21.y, l(0), u0.xyzw - add r22.xyz, r22.xyzx, -r23.xyzx - dp3 r21.z, r22.xyzx, r22.xyzx - add r21.z, r21.z, l(0.000000) - mad r21.w, r22.w, -r19.z, -r19.w - min r21.w, r21.w, l(0.000000) - rsq r21.z, r21.z - mad r21.z, r21.w, r21.z, l(1.000000) - max r21.z, r21.z, l(0.000000) - mul r21.z, r20.x, r21.z - mad r22.xyz, r21.zzzz, r22.xyzx, r23.xyzx - ge r21.z, r21.w, l(0.000000) - movc r22.w, r21.z, l(0), r23.w - store_structured u0.xyzw, r21.y, l(0), r22.xyzw - iadd r21.x, r21.x, l(1024) - endloop - endif - ld_raw r19.z, l(20), g1.xxxx - eq r19.w, r19.z, l(0.000000) - ld_raw r20.x, l(24), g0.xxxx - ieq r20.y, r20.x, l(0) - or r19.w, r19.w, r20.y - if_z r19.w - ld_raw r19.w, l(0), g0.xxxx - utof r20.y, r19.w - mul r19.z, r19.z, r20.y - utof r20.y, r20.x - div r19.z, r19.z, r20.y - ld_raw r20.yz, l(28), g0.xxyx - mov r20.w, vThreadIDInGroup.x - loop - uge r21.x, r20.w, r19.w - breakc_nz r21.x - iadd r21.x, r0.y, r20.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r22.xyzw, r21.x, l(0), u0.xyzw - mov r21.yzw, l(0,0,0,0) - mov r23.x, r20.w - loop - uge r23.y, r23.x, r20.x - breakc_nz r23.y - iadd r23.y, r20.y, r23.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r23.y, r23.y, l(0), t5.xxxx - and r23.z, r23.y, l(0x0000ffff) - iadd r23.z, r0.y, r23.z - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r24.xyz, r23.z, l(0), u0.xyzx - add r24.xyz, -r22.xyzx, r24.xyzx - mad r23.z, r24.x, r24.x, l(0.000000) - mad r23.z, r24.y, r24.y, r23.z - mad r23.z, r24.z, r24.z, r23.z - ushr r23.y, r23.y, l(16) - utof r23.y, r23.y - mul r23.y, r20.z, r23.y - rsq r23.z, r23.z - mad r23.y, -r23.y, r23.z, l(1.000000) - lt r23.z, l(0.000000), r23.y - mad r24.xyz, r24.xyzx, r23.yyyy, r21.yzwy - movc r21.yzw, r23.zzzz, r24.xxyz, r21.yyzw - iadd r23.x, r19.w, r23.x - endloop - mad r22.xyz, r21.yzwy, r19.zzzz, r22.xyzx - store_structured u0.xyzw, r21.x, l(0), r22.xyzw - iadd r20.w, r20.w, l(1024) - endloop - endif - mov r19.z, l(0) - loop - ld_raw r19.w, l(8), g0.xxxx - uge r19.w, r19.z, r19.w - breakc_nz r19.w - ld_raw r20.xyz, l(12), g0.xyzx - iadd r19.w, r19.z, r20.x - ld_structured_indexable(structured_buffer, stride=24)(mixed,mixed,mixed,mixed) r22.xyzw, r19.w, l(0), t3.xyzw - ld_structured_indexable(structured_buffer, stride=24)(mixed,mixed,mixed,mixed) r20.xw, r19.w, l(16), t3.xxxy - ld_raw r19.w, l(108), g1.xxxx - mul r22.xy, r19.wwww, r22.xyxx - exp r22.xy, r22.xyxx - add r22.xy, -r22.xyxx, l(1.000000, 1.000000, 0.000000, 0.000000) - iadd r20.y, r20.x, r20.y - ine r20.z, r20.z, l(-1) - ld_raw r21.x, l(20), g0.xxxx - iadd r20.x, r20.x, r21.x - sync_g_t - mov r21.x, vThreadIDInGroup.x - loop - uge r23.x, r21.x, r20.w - breakc_nz r23.x - iadd r23.x, r20.y, r21.x - ld_structured_indexable(structured_buffer, stride=8)(mixed,mixed,mixed,mixed) r23.xy, r23.x, l(0), t4.xyxx - and r23.z, r23.y, l(0x0000ffff) - ushr r23.y, r23.y, l(16) - iadd r23.yz, r0.yyyy, r23.yyzy - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r24.xyzw, r23.z, l(0), u0.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r25.xyzw, r23.y, l(0), u0.xyzw - add r26.xyz, -r24.xyzx, r25.xyzx - mad r23.w, r26.x, r26.x, l(0.000000) - mad r23.w, r26.y, r26.y, r23.w - mad r23.w, r26.z, r26.z, r23.w - lt r26.w, l(0.000000), r23.x - rsq r23.w, r23.w - mad r23.x, r23.x, r23.w, l(-1.000000) - and r23.x, r23.x, r26.w - min r23.w, r22.w, -r23.x - max r23.w, r22.z, r23.w - mad r23.x, r22.y, r23.w, r23.x - iadd r23.w, r20.x, r21.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r23.w, r23.w, l(0), t16.xxxx - mul r23.w, r19.w, r23.w - exp r23.w, r23.w - add r23.w, -r23.w, l(1.000000) - movc r23.w, r20.z, r23.w, r22.x - mul r23.x, r23.w, r23.x - add r23.w, r24.w, r25.w - add r23.w, r23.w, l(0.000000) - div r23.x, r23.x, r23.w - mul r23.w, r23.x, -r24.w - mad r24.xyz, r23.wwww, r26.xyzx, r24.xyzx - store_structured u0.xyz, r23.z, l(0), r24.xyzx - mul r23.x, r23.x, r25.w - mad r23.xzw, r23.xxxx, r26.xxyz, r25.xxyz - store_structured u0.xyz, r23.y, l(0), r23.xzwx - iadd r21.x, r21.x, l(1024) - endloop - iadd r19.z, r19.z, l(1) - endloop - sync_g_t - ld_raw r19.z, l(36), g1.xxxx - ine r19.z, r19.z, l(-1) - if_nz r19.z - ld_raw r19.z, l(0), g0.xxxx - ld_raw r20.xy, l(36), g1.xyxx - mov r19.w, vThreadIDInGroup.x - loop - uge r20.z, r19.w, r19.z - breakc_nz r20.z - iadd r20.zw, r20.xxxy, r19.wwww - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r22.xyzw, r20.z, l(0), t12.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r23.xyzw, r20.w, l(0), t12.xyzw - add r23.xyzw, -r22.xyzw, r23.xyzw - mad r22.xyzw, r23.xyzw, r19.xxxx, r22.xyzw - iadd r20.z, r0.y, r19.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r23.xyz, r20.z, l(0), u0.xyzx - add r22.xyz, r22.xyzx, -r23.xyzx - dp3 r20.w, r22.xyzx, r22.xyzx - add r20.w, r20.w, l(0.000000) - rsq r20.w, r20.w - mad r20.w, -r22.w, r20.w, l(1.000000) - min r20.w, r20.w, l(0.000000) - mad r22.xyz, r20.wwww, r22.xyzx, r23.xyzx - store_structured u0.xyz, r20.z, l(0), r22.xyzx - iadd r19.w, r19.w, l(1024) - endloop - sync_g_t - endif - if_nz r1.x - ld_raw r19.z, l(0), g0.xxxx - iadd r19.w, r19.z, l(-1) - umin r19.w, r2.y, r19.w - iadd r20.x, r0.y, r19.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r20.xyzw, r20.x, l(0), u0.xyzw - dp4 r20.x, r20.xyzw, icb[r4.x + 0].xyzw - mul r20.x, r0.w, r20.x - store_structured g4.x, vThreadIDInGroup.x, l(0), r20.x - mov r20.x, r19.w - loop - iadd r20.x, r20.x, l(32) - uge r20.y, r20.x, r19.z - breakc_nz r20.y - ld_structured r20.y, vThreadIDInGroup.x, l(0), g4.xxxx - iadd r20.z, r0.y, r20.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r22.xyzw, r20.z, l(0), u0.xyzw - dp4 r20.z, r22.xyzw, icb[r4.x + 0].xyzw - mul r20.z, r0.w, r20.z - max r20.y, r20.z, r20.y - store_structured g4.x, vThreadIDInGroup.x, l(0), r20.y - endloop - endif - sync_g_t - if_nz r1.y - ld_structured r19.z, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.w, r3.x, l(0), g4.xxxx - max r19.z, r19.w, r19.z - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.z - endif - sync_g_t - if_nz r1.y - ld_structured r19.z, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.w, r3.y, l(0), g4.xxxx - max r19.z, r19.w, r19.z - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.z - endif - sync_g_t - if_nz r1.y - ld_structured r19.z, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.w, r3.z, l(0), g4.xxxx - max r19.z, r19.w, r19.z - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.z - endif - sync_g_t - if_nz r1.y - ld_structured r19.z, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.w, r3.w, l(0), g4.xxxx - max r19.z, r19.w, r19.z - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.z - endif - sync_g_t - if_nz r1.y - ld_structured r19.z, vThreadIDInGroup.x, l(0), g4.xxxx - ld_structured r19.w, r6.x, l(0), g4.xxxx - max r19.z, r19.w, r19.z - store_structured g4.x, vThreadIDInGroup.x, l(0), r19.z - endif - sync_g_t - if_nz r2.x - ld_structured r19.z, vThreadIDInGroup.x, l(0), g4.xxxx - store_raw g1.x, r4.z, r19.z - endif - sync_g_t - ld_raw r19.z, l(16), g1.xxxx - utof r19.z, r19.z - div r19.y, r19.y, r19.z - ld_raw r19.z, l(60), g0.xxxx - if_nz r19.z - ld_raw r19.w, l(80), g0.xxxx - lt r19.w, l(0.000000), r19.w - ld_raw r20.x, l(0), g0.xxxx - ld_raw r20.y, l(64), g0.xxxx - ld_raw r20.zw, l(56), g1.xxxy - mov r21.x, vThreadIDInGroup.x - loop - uge r22.x, r21.x, r20.x - breakc_nz r22.x - iadd r22.x, r0.y, r21.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r23.xyzw, r22.x, l(0), u0.xyzw - mov r24.xyzw, l(0,0,0,0) - mov r22.y, l(0) - loop - uge r22.z, r22.y, r19.z - breakc_nz r22.z - iadd r22.z, r20.y, r22.y - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r22.z, r22.z, l(0), t8.xxxx - firstbit_lo r22.w, r22.z - iadd r25.xy, r20.zwzz, r22.wwww - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r26.xyzw, r25.x, l(0), t9.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r25.xyzw, r25.y, l(0), t9.xyzw - add r25.xyzw, -r26.xyzw, r25.xyzw - mad r25.xyzw, r19.xxxx, r25.xyzw, r26.xyzw - dp3 r22.w, r23.xyzx, r25.xyzx - add r22.w, r25.w, r22.w - mov r26.xyz, r25.xyzx - mov r25.w, r22.z - mov r26.w, r22.w - loop - lt r27.x, r26.w, l(0.000000) - iadd r27.y, r25.w, l(-1) - and r25.w, r25.w, r27.y - ine r27.y, r25.w, l(0) - and r27.x, r27.y, r27.x - breakc_z r27.x - firstbit_lo r27.x, r25.w - iadd r27.xy, r20.zwzz, r27.xxxx - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r28.xyzw, r27.x, l(0), t9.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r27.xyzw, r27.y, l(0), t9.xyzw - add r27.xyzw, -r28.xyzw, r27.xyzw - mad r27.xyzw, r19.xxxx, r27.xyzw, r28.xyzw - dp3 r28.x, r23.xyzx, r27.xyzx - add r27.w, r27.w, r28.x - lt r28.x, r26.w, r27.w - movc r26.xyzw, r28.xxxx, r27.xyzw, r26.xyzw - endloop - lt r22.z, r26.w, l(0.000000) - mad r25.xyz, -r26.xyzx, r26.wwww, r24.xyzx - iadd r25.w, r24.w, l(1) - movc r24.xyzw, r22.zzzz, r25.xyzw, r24.xyzw - iadd r22.y, r22.y, l(1) - endloop - if_nz r24.w - utof r22.y, r24.w - div r22.y, l(1.000000, 1.000000, 1.000000, 1.000000), r22.y - if_nz r19.w - iadd r22.z, r0.x, r21.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r25.xyz, r22.z, l(0), u0.xyzx - ld_raw r22.w, l(80), g0.xxxx - dp3 r25.w, r24.xyzx, r24.xyzx - add r27.x, r25.w, l(0.000000) - rsq r27.x, r27.x - mul r27.yzw, r24.xxyz, r27.xxxx - add r28.xyz, r23.xyzx, -r25.xyzx - dp3 r28.w, r28.xyzx, r27.yzwy - mad r27.yzw, -r28.wwww, r27.yyzw, r28.xxyz - dp3 r28.x, r27.yzwy, r27.yzwy - add r28.x, r28.x, l(0.000000) - rsq r28.x, r28.x - mul r22.w, -r22.w, r25.w - mul r22.w, r27.x, r22.w - mul r22.w, r22.y, r22.w - mul r22.w, r28.x, r22.w - max r22.w, r22.w, l(-1.000000) - mad r25.xyz, -r27.yzwy, r22.wwww, r25.xyzx - store_structured u0.xyz, r22.z, l(0), r25.xyzx - endif - mad r23.xyz, r24.xyzx, r22.yyyy, r23.xyzx - store_structured u0.xyzw, r22.x, l(0), r23.xyzw - endif - iadd r21.x, r21.x, l(1024) - endloop - endif - ftoi r19.z, r19.x - iadd r19.z, r0.y, r19.z - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r20.xyz, r19.z, l(0), u0.xyzx - ld_raw r19.w, l(68), g0.xxxx - ld_raw r20.w, l(64), g1.xxxx - mov r22.xyz, l(0,0,0,0) - mov r23.xy, l(0,340282346638528860000000000000000000000.000000,0,0) - mov r21.x, l(0) - loop - uge r22.w, r21.x, r19.w - breakc_nz r22.w - imad r22.w, l(3), r21.x, r20.w - ld_structured_indexable(structured_buffer, stride=12)(mixed,mixed,mixed,mixed) r25.xyz, r22.w, l(0), t10.xyzx - iadd r23.zw, r22.wwww, l(0, 0, 1, 2) - ld_structured_indexable(structured_buffer, stride=12)(mixed,mixed,mixed,mixed) r27.xyz, r23.z, l(0), t10.xyzx - ld_structured_indexable(structured_buffer, stride=12)(mixed,mixed,mixed,mixed) r28.xyz, r23.w, l(0), t10.xyzx - add r27.xyz, -r25.xyzx, r27.xyzx - add r28.xyz, -r25.xyzx, r28.xyzx - mul r29.xyz, r27.zxyz, r28.yzxy - mad r29.xyz, r27.yzxy, r28.zxyz, -r29.xyzx - dp3 r22.w, r29.xyzx, r29.xyzx - rsq r22.w, r22.w - mul r29.xyz, r22.wwww, r29.xyzx - dp3 r22.w, r27.xyzx, r28.xyzx - dp3 r23.z, r27.xyzx, r27.xyzx - dp3 r23.w, r28.xyzx, r28.xyzx - mul r25.w, r22.w, r22.w - mad r25.w, r23.z, r23.w, -r25.w - div r25.w, l(1.000000, 1.000000, 1.000000, 1.000000), r25.w - add r27.w, r23.w, r23.z - mad r27.w, r22.w, l(-2.000000), r27.w - div r27.w, l(1.000000, 1.000000, 1.000000, 1.000000), r27.w - div r28.w, l(1.000000, 1.000000, 1.000000, 1.000000), r23.z - div r29.w, l(1.000000, 1.000000, 1.000000, 1.000000), r23.w - add r25.xyz, r20.xyzx, -r25.xyzx - dp3 r30.x, r25.xyzx, r27.xyzx - dp3 r30.y, r25.xyzx, r28.xyzx - dp3 r31.x, r25.xyzx, r29.xyzx - mul r30.zw, r22.wwww, r30.yyyx - mad r30.z, r23.w, r30.x, -r30.z - mad r23.z, r23.z, r30.y, -r30.w - lt r30.w, l(0.000000), r23.z - mul r30.z, r25.w, r30.z - mul r28.w, r28.w, r30.x - movc r28.w, r30.w, r30.z, r28.w - lt r30.z, l(0.000000), r28.w - mul r23.z, r25.w, r23.z - mul r25.w, r29.w, r30.y - movc r23.z, r30.z, r23.z, r25.w - add r25.w, r23.z, r28.w - lt r25.w, l(1.000000), r25.w - add r22.w, -r22.w, r23.w - add r22.w, r30.x, r22.w - add r22.w, -r30.y, r22.w - mul r22.w, r27.w, r22.w - movc_sat r22.w, r25.w, r22.w, r28.w - add r23.w, -r22.w, l(1.000000) - min r23.z, r23.z, r23.w - max r23.z, r23.z, l(0.000000) - mul r28.xyz, r23.zzzz, r28.xyzx - mad r27.xyz, r27.xyzx, r22.wwww, r28.xyzx - add r25.xyz, r25.xyzx, -r27.xyzx - dp3 r22.w, r25.xyzx, r25.xyzx - lt r23.z, r31.x, l(0.000000) - mul r23.w, r22.w, l(1.000100) - movc r31.y, r23.z, r23.w, r22.w - lt r22.w, r31.y, r23.y - movc r22.xyz, r22.wwww, r29.xyzx, r22.xyzx - movc r23.xy, r22.wwww, r31.xyxx, r23.xyxx - iadd r21.x, r21.x, l(1) - endloop - lt r19.w, r23.x, l(0.000000) - if_nz r19.w - mad r20.xyz, -r22.xyzx, r23.xxxx, r20.xyzx - store_structured u0.xyz, r19.z, l(0), r20.xyzx - endif - ld_raw r19.z, l(72), g0.xxxx - if_nz r19.z - ld_raw r19.z, l(80), g0.xxxx - lt r19.w, l(0.000000), r19.z - ld_raw r20.x, l(0), g0.xxxx - ld_raw r20.yz, l(48), g1.xxyx - ld_raw r23.yz, l(44), g0.xxyx - mov r20.w, vThreadIDInGroup.x - loop - uge r21.x, r20.w, r20.x - breakc_nz r21.x - iadd r21.x, r0.y, r20.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r25.xyzw, r21.x, l(0), u0.xyzw - iadd r22.w, r0.x, r20.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r27.xyz, r22.w, l(0), u0.xyzx - mov r28.xyz, r25.xyzx - mov r29.xyz, l(0,0,0,0) - mov r30.xyzw, l(0,0,0,0) - mov r23.w, l(0) - loop - uge r27.w, r23.w, r23.y - breakc_nz r27.w - iadd r27.w, r23.w, r23.z - ld_structured_indexable(structured_buffer, stride=8)(mixed,mixed,mixed,mixed) r31.xy, r27.w, l(0), t6.xyxx - iadd r31.xyzw, r20.yzyz, r31.xxyy - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r32.xyzw, r31.x, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r33.xyzw, r31.y, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r34.xyzw, r31.z, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r31.xyzw, r31.w, l(0), t7.xyzw - add r35.xyzw, -r32.xyzw, r33.xyzw - mad r36.xyzw, r19.yyyy, r35.xyzw, r32.xyzw - add r37.xyzw, -r34.xyzw, r31.xyzw - mad r38.xyzw, r19.yyyy, r37.xyzw, r34.xyzw - max r36.w, r36.w, l(0.000000) - max r38.w, r38.w, l(0.000000) - add r39.xyzw, -r36.xyzw, r38.xyzw - mul r39.xyzw, r39.xyzw, l(0.500000, 0.500000, 0.500000, 0.500000) - dp3 r27.w, r39.xyzx, r39.xyzx - ge r28.w, l(0.000000), r27.w - if_nz r28.w - iadd r28.w, r23.w, l(1) - mov r23.w, r28.w - continue - endif - mad r35.xyzw, r19.xxxx, r35.xyzw, r32.xyzw - mad r37.xyzw, r19.xxxx, r37.xyzw, r34.xyzw - max r35.w, r35.w, l(0.000000) - max r37.w, r37.w, l(0.000000) - add r40.xyzw, -r35.xyzw, r37.xyzw - mul r41.xyzw, r40.xyzw, l(0.500000, 0.500000, 0.500000, 0.500000) - dp3 r28.w, r41.xyzx, r41.xyzx - mad r29.w, -r41.w, r41.w, r28.w - ge r31.w, l(0.000000), r29.w - if_nz r31.w - iadd r31.w, r23.w, l(1) - mov r23.w, r31.w - continue - endif - add r40.xyz, r36.zxyz, r38.zxyz - mad r40.xyz, -r40.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r27.zxyz - mad r31.w, -r39.w, r39.w, r27.w - rsq r27.w, r27.w - rsq r31.w, r31.w - mul r39.xyz, r27.wwww, r39.xyzx - mul r27.w, r31.w, r39.w - mul r42.xyz, r39.yzxy, r40.xyzx - mad r40.xyz, r40.zxyz, r39.zxyz, -r42.xyzx - dp3 r31.w, r27.xyzx, r39.xyzx - add r39.xyz, r35.xyzx, r37.xyzx - mad r42.xyz, -r39.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r28.xyzx - rsq r32.w, r28.w - rsq r29.w, r29.w - mul r28.w, r28.w, r32.w - mad r33.w, r40.w, l(0.500000), r35.w - mul r33.w, r29.w, r33.w - mul r33.w, r28.w, r33.w - mul r43.xyz, r32.wwww, r41.xyzx - mul r44.xyz, r42.zxyz, r43.yzxy - mad r44.xyz, r42.yzxy, r43.zxyz, -r44.xyzx - dp3 r34.w, r28.xyzx, r43.xyzx - dp3 r35.w, r44.xyzx, r44.xyzx - add r45.x, r35.w, l(0.000000) - mad r31.w, r31.w, r27.w, r33.w - max r31.w, r31.w, l(0.000000) - mul r29.w, r29.w, r41.w - mad r34.w, r34.w, r29.w, r33.w - max r45.y, r34.w, l(0.000000) - dp3 r34.w, r40.xyzx, r40.xyzx - mad r34.w, -r40.x, r40.x, r34.w - mad r34.w, -r31.w, r31.w, r34.w - dp3 r35.w, r40.xyzx, r44.xyzx - mad r35.w, -r31.w, r45.y, r35.w - mad r36.w, -r45.y, r45.y, r45.x - mul r37.w, r34.w, r36.w - mad r37.w, r35.w, r35.w, -r37.w - sqrt r38.w, r37.w - add r34.w, -r34.w, r35.w - add r35.w, r35.w, -r36.w - add r35.w, r34.w, r35.w - add r36.w, r38.w, r34.w - min r36.w, r36.w, l(0.000000) - div r36.w, r36.w, r35.w - lt r39.w, r36.w, l(1.000000) - lt r40.x, r34.w, r38.w - and r39.w, r39.w, r40.x - mul r34.w, r34.w, r35.w - add r40.x, -r31.w, r45.y - mad r31.w, r34.w, r40.x, r31.w - mul r31.w, r31.w, r31.w - mul r31.w, r35.w, r31.w - mul r31.w, r31.w, l(-0.360000) - lt r31.w, r31.w, r37.w - and r31.w, r31.w, r39.w - lt r34.w, r35.w, l(-0.000000) - and r31.w, r31.w, r34.w - add r40.xyz, r27.xyzx, -r28.xyzx - mad r44.xyz, -r40.xyzx, r36.wwww, r27.xyzx - mul r46.xyz, r28.wwww, r41.xyzx - add r36.xyz, -r36.xyzx, r38.xyzx - mul r36.xyz, r36.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000) - dp3 r34.w, r36.xyzx, r36.xyzx - rsq r37.w, r34.w - mul r34.w, r34.w, r37.w - mad r36.xyz, -r36.xyzx, r34.wwww, r46.xyzx - add r34.w, -r36.w, l(1.000000) - mad r38.xyz, -r36.xyzx, r34.wwww, r46.xyzx - mul r36.w, r29.w, r36.w - mad r27.w, r27.w, r34.w, r36.w - dp3 r36.w, r38.xyzx, r38.xyzx - rsq r36.w, r36.w - dp3 r37.w, r44.xyzx, r38.xyzx - mul r37.w, r36.w, r37.w - dp3 r38.x, r44.xyzx, r44.xyzx - mad r38.x, -r37.w, r37.w, r38.x - lt r38.y, l(0.000000), r38.x - rsq r38.z, r38.x - and r38.y, r38.z, r38.y - mul r27.w, r27.w, r38.x - mad r27.w, r27.w, r38.y, r37.w - mul r27.w, r36.w, r27.w - lt r36.w, |r27.w|, l(1.000000) - mad r36.xyz, r36.xyzx, r27.wwww, r40.xyzx - mul r27.w, r34.w, r35.w - div r27.w, r38.w, r27.w - add r27.w, -r27.w, l(1.000000) - div r27.w, r34.w, r27.w - mad r36.xyz, r36.xyzx, r27.wwww, r42.xyzx - mad r38.xyz, r39.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r36.xyzx - movc r38.xyz, r36.wwww, r38.xyzx, r28.xyzx - movc r38.xyz, r31.wwww, r38.xyzx, r28.xyzx - mad r39.xyz, -r39.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r38.xyzx - dp3 r27.w, r39.xyzx, r43.xyzx - mad r34.w, r27.w, r29.w, r33.w - max r34.w, r34.w, l(0.000000) - dp3 r35.w, r39.xyzx, r39.xyzx - mad r35.w, -r27.w, r27.w, r35.w - mul r37.w, r34.w, r34.w - lt r37.w, r37.w, r35.w - if_nz r37.w - iadd r37.w, r23.w, l(1) - mov r28.xyz, r38.xyzx - mov r23.w, r37.w - continue - endif - mul r32.w, r32.w, r41.w - mad r32.w, -r32.w, r32.w, l(1.000000) - max r35.w, r35.w, l(0.000000) - rsq r37.w, r35.w - mul r35.w, r29.w, r35.w - mad r35.w, r35.w, r37.w, r27.w - lt r28.w, |r35.w|, r28.w - mad r39.xyz, -r35.wwww, r41.xyzx, r39.xyzx - mul r34.w, r34.w, r37.w - mad r32.w, r34.w, r32.w, -r32.w - mad r39.xyz, r39.xyzx, r32.wwww, r29.xyzx - add r33.xyz, -r32.xyzx, r33.xyzx - mad r32.xyz, r19.yyyy, r33.xyzx, r32.xyzx - add r31.xyz, -r34.xyzx, r31.xyzx - mad r31.xyz, r19.yyyy, r31.xyzx, r34.xyzx - mad r27.w, r27.w, l(0.500000), l(0.500000) - add r32.xyz, -r32.xyzx, r35.xyzx - add r31.xyz, -r31.xyzx, r37.xyzx - add r31.xyz, -r32.xyzx, r31.xyzx - mad r31.xyz, r27.wwww, r31.xyzx, r32.xyzx - add r31.xyz, r30.xyzx, r31.xyzx - movc r32.xyz, r19.wwww, r31.xyzx, r30.xyzx - iadd r32.w, r30.w, l(1) - movc r31.xyz, r28.wwww, r39.xyzx, r29.xyzx - movc r32.xyzw, r28.wwww, r32.xyzw, r30.xyzw - dp3 r27.w, r36.xyzx, r41.xyzx - mad r28.w, r27.w, r29.w, r33.w - max r33.y, r28.w, l(0.000000) - dp3 r28.w, r36.xyzx, r36.xyzx - mad r33.x, -r27.w, r27.w, r28.w - movc r33.xy, r36.wwww, r33.xyxx, r45.xyxx - movc r33.xy, r31.wwww, r33.xyxx, r45.xyxx - mul r27.w, r33.y, r33.y - ge r27.w, r33.x, r27.w - if_nz r27.w - iadd r27.w, r23.w, l(1) - mov r28.xyz, r38.xyzx - mov r29.xyz, r31.xyzx - mov r30.xyzw, r32.xyzw - mov r23.w, r27.w - continue - endif - mov r28.xyz, r38.xyzx - mov r29.xyz, r31.xyzx - mov r30.xyzw, r32.xyzw - iadd r23.w, r23.w, l(1) - endloop - ld_raw r23.w, l(52), g0.xxxx - mov r31.xyz, r28.xyzx - mov r32.xyz, r29.xyzx - mov r33.xyzw, r30.xyzw - mov r27.w, l(0) - loop - uge r28.w, r27.w, r23.w - breakc_nz r28.w - iadd r34.xy, r20.yzyy, r27.wwww - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r35.xyzw, r34.x, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r34.xyzw, r34.y, l(0), t7.xyzw - add r34.xyzw, -r35.xyzw, r34.xyzw - mad r36.xyzw, r19.xxxx, r34.xyzw, r35.xyzw - max r28.w, r36.w, l(0.000000) - mad r34.xyz, r19.yyyy, r34.xyzx, r35.xyzx - add r35.xyz, r31.xyzx, -r36.xyzx - add r37.xyz, r27.xyzx, -r34.xyzx - dp3 r29.w, r35.xyzx, r35.xyzx - add r35.w, r29.w, l(0.000000) - dp3 r29.w, r37.xyzx, r37.xyzx - mul r31.w, r28.w, r28.w - mad r29.w, -r28.w, r28.w, r29.w - dp3 r32.w, r37.xyzx, r35.xyzx - mad r32.w, -r28.w, r28.w, r32.w - mad r34.w, -r28.w, r28.w, r35.w - mul r36.w, r29.w, r34.w - mad r36.w, r32.w, r32.w, -r36.w - sqrt r37.w, r36.w - add r29.w, -r29.w, r32.w - add r32.w, r32.w, -r34.w - add r32.w, r29.w, r32.w - add r34.w, r37.w, r29.w - min r34.w, r34.w, l(0.000000) - div r34.w, r34.w, r32.w - lt r38.x, r34.w, l(1.000000) - lt r29.w, r29.w, r37.w - and r29.w, r29.w, r38.x - mul r31.w, r31.w, r32.w - mul r31.w, r31.w, l(-0.360000) - lt r31.w, r31.w, r36.w - and r29.w, r29.w, r31.w - lt r31.w, r32.w, l(-0.000000) - and r29.w, r29.w, r31.w - add r37.xyz, -r35.xyzx, r37.xyzx - add r31.w, -r34.w, l(1.000000) - mul r32.w, r31.w, r32.w - div r32.w, r37.w, r32.w - add r32.w, -r32.w, l(1.000000) - div r31.w, r31.w, r32.w - mad r37.xyz, r37.xyzx, r31.wwww, r35.xyzx - add r38.xyz, r36.xyzx, r37.xyzx - dp3 r31.w, r37.xyzx, r37.xyzx - add r37.w, r31.w, l(0.000000) - movc r31.xyz, r29.wwww, r38.xyzx, r31.xyzx - movc r35.xyzw, r29.wwww, r37.xyzw, r35.xyzw - rsq r29.w, r35.w - mul r31.w, r28.w, r29.w - lt r31.w, l(1.000000), r31.w - mad r28.w, r29.w, r28.w, l(-1.000000) - mad r35.xyz, r35.xyzx, r28.wwww, r32.xyzx - add r34.xyz, -r34.xyzx, r36.xyzx - add r34.xyz, r33.xyzx, r34.xyzx - movc r34.xyz, r19.wwww, r34.xyzx, r33.xyzx - iadd r34.w, r33.w, l(1) - movc r32.xyz, r31.wwww, r35.xyzx, r32.xyzx - movc r33.xyzw, r31.wwww, r34.xyzw, r33.xyzw - iadd r27.w, r27.w, l(1) - endloop - if_nz r33.w - utof r23.w, r33.w - div r23.w, l(1.000000, 1.000000, 1.000000, 1.000000), r23.w - if_nz r19.w - ld_raw r27.w, l(80), g0.xxxx - dp3 r28.w, r32.xyzx, r32.xyzx - add r29.w, r28.w, l(0.000000) - rsq r29.w, r29.w - mul r31.xyz, r29.wwww, r32.xyzx - add r34.xyz, r25.xyzx, -r27.xyzx - mad r34.xyz, -r33.xyzx, r23.wwww, r34.xyzx - dp3 r31.w, r34.xyzx, r31.xyzx - mad r31.xyz, -r31.wwww, r31.xyzx, r34.xyzx - dp3 r31.w, r31.xyzx, r31.xyzx - add r31.w, r31.w, l(0.000000) - rsq r31.w, r31.w - mul r27.w, -r27.w, r28.w - mul r27.w, r29.w, r27.w - mul r27.w, r23.w, r27.w - mul r27.w, r31.w, r27.w - max r27.w, r27.w, l(-1.000000) - mad r27.xyz, -r31.xyzx, r27.wwww, r27.xyzx - store_structured u0.xyz, r22.w, l(0), r27.xyzx - endif - mad r25.xyz, r32.xyzx, r23.wwww, r25.xyzx - store_structured u0.xyzw, r21.x, l(0), r25.xyzw - endif - iadd r20.w, r20.w, l(1024) - endloop - else - ld_raw r19.zw, l(76), g0.xxxy - lt r19.zw, l(0.000000, 0.000000, 0.000000, 0.000000), r19.wwwz - ld_raw r20.x, l(0), g0.xxxx - ld_raw r20.yz, l(48), g1.xxyx - ld_raw r20.w, l(80), g0.xxxx - lt r21.x, l(0.000000), r20.w - ld_raw r23.yz, l(44), g0.xxyx - mov r22.w, vThreadIDInGroup.x - loop - uge r23.w, r22.w, r20.x - breakc_nz r23.w - iadd r23.w, r0.y, r22.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r25.xyzw, r23.w, l(0), u0.xyzw - mov r31.xyzw, l(0,0,0,0) - mov r27.xyzw, l(0,0,0,0) - loop - uge r28.w, r27.w, r23.y - breakc_nz r28.w - iadd r28.w, r23.z, r27.w - ld_structured_indexable(structured_buffer, stride=8)(mixed,mixed,mixed,mixed) r34.xy, r28.w, l(0), t6.xyxx - iadd r34.xyzw, r20.yzyz, r34.xxyy - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r35.xyzw, r34.x, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r36.xyzw, r34.y, l(0), t7.xyzw - add r37.xyzw, -r35.xyzw, r36.xyzw - mad r37.xyzw, r19.xxxx, r37.xyzw, r35.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r38.xyzw, r34.z, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r34.xyzw, r34.w, l(0), t7.xyzw - add r39.xyzw, -r38.xyzw, r34.xyzw - mad r39.xyzw, r19.xxxx, r39.xyzw, r38.xyzw - max r37.w, r37.w, l(0.000000) - max r39.w, r39.w, l(0.000000) - add r40.xyzw, -r37.xyzw, r39.xyzw - mul r41.xyzw, r40.xyzw, l(0.500000, 0.500000, 0.500000, 0.500000) - dp3 r28.w, r41.xyzx, r41.xyzx - mad r29.w, -r41.w, r41.w, r28.w - ge r32.w, l(0.000000), r29.w - if_nz r32.w - iadd r32.w, r27.w, l(1) - mov r27.w, r32.w - continue - endif - rsq r32.w, r28.w - rsq r29.w, r29.w - mul r28.w, r28.w, r32.w - add r40.xyz, r37.xyzx, r39.xyzx - mad r34.w, r40.w, l(0.500000), r37.w - mul r34.w, r29.w, r34.w - mul r34.w, r28.w, r34.w - mul r41.xyz, r32.wwww, r41.xyzx - mul r29.w, r29.w, r41.w - mad r40.xyz, -r40.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), r25.xyzx - dp3 r35.w, r40.xyzx, r41.xyzx - mad r34.w, r35.w, r29.w, r34.w - max r34.w, r34.w, l(0.000000) - dp3 r36.w, r40.xyzx, r40.xyzx - mad r36.w, -r35.w, r35.w, r36.w - mul r37.w, r34.w, r34.w - lt r37.w, r37.w, r36.w - if_nz r37.w - iadd r37.w, r27.w, l(1) - mov r27.w, r37.w - continue - endif - mul r32.w, r32.w, r41.w - mad r32.w, -r32.w, r32.w, l(1.000000) - max r36.w, r36.w, l(0.000000) - rsq r37.w, r36.w - mul r29.w, r29.w, r36.w - mad r29.w, r29.w, r37.w, r35.w - lt r28.w, |r29.w|, r28.w - mad r40.xyz, -r29.wwww, r41.xyzx, r40.xyzx - mul r29.w, r34.w, r37.w - mad r29.w, r29.w, r32.w, -r32.w - mad r40.xyz, r40.xyzx, r29.wwww, r27.xyzx - add r36.xyz, -r35.xyzx, r36.xyzx - mad r35.xyz, r19.yyyy, r36.xyzx, r35.xyzx - add r34.xyz, -r38.xyzx, r34.xyzx - mad r34.xyz, r19.yyyy, r34.xyzx, r38.xyzx - mad r29.w, r35.w, l(0.500000), l(0.500000) - add r35.xyz, -r35.xyzx, r37.xyzx - add r34.xyz, -r34.xyzx, r39.xyzx - add r34.xyz, -r35.xyzx, r34.xyzx - mad r34.xyz, r29.wwww, r34.xyzx, r35.xyzx - add r34.xyz, r31.xyzx, r34.xyzx - movc r34.xyz, r21.xxxx, r34.xyzx, r31.xyzx - iadd r34.w, r31.w, l(1) - movc r27.xyz, r28.wwww, r40.xyzx, r27.xyzx - movc r31.xyzw, r28.wwww, r34.xyzw, r31.xyzw - iadd r27.w, r27.w, l(1) - endloop - ld_raw r27.w, l(52), g0.xxxx - mov r34.xyz, r27.xyzx - mov r35.xyzw, r31.xyzw - mov r28.w, l(0) - loop - uge r29.w, r28.w, r27.w - breakc_nz r29.w - iadd r36.xy, r20.yzyy, r28.wwww - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r37.xyzw, r36.x, l(0), t7.xyzw - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r36.xyzw, r36.y, l(0), t7.xyzw - add r36.xyzw, -r37.xyzw, r36.xyzw - mad r38.xyzw, r19.xxxx, r36.xyzw, r37.xyzw - max r29.w, r38.w, l(0.000000) - add r39.xyz, r25.xyzx, -r38.xyzx - dp3 r32.w, r39.xyzx, r39.xyzx - add r32.w, r32.w, l(0.000000) - rsq r32.w, r32.w - mul r34.w, r29.w, r32.w - lt r34.w, l(1.000000), r34.w - mad r29.w, r32.w, r29.w, l(-1.000000) - mad r39.xyz, r39.xyzx, r29.wwww, r34.xyzx - mad r36.xyz, r19.yyyy, r36.xyzx, r37.xyzx - add r36.xyz, -r36.xyzx, r38.xyzx - add r36.xyz, r35.xyzx, r36.xyzx - movc r36.xyz, r21.xxxx, r36.xyzx, r35.xyzx - iadd r36.w, r35.w, l(1) - movc r34.xyz, r34.wwww, r39.xyzx, r34.xyzx - movc r35.xyzw, r34.wwww, r36.xyzw, r35.xyzw - iadd r28.w, r28.w, l(1) - endloop - if_nz r35.w - utof r27.w, r35.w - div r27.w, l(1.000000, 1.000000, 1.000000, 1.000000), r27.w - if_nz r19.z - iadd r28.w, r0.x, r22.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r36.xyz, r28.w, l(0), u0.xyzx - ld_raw r29.w, l(80), g0.xxxx - dp3 r32.w, r34.xyzx, r34.xyzx - add r34.w, r32.w, l(0.000000) - rsq r34.w, r34.w - mul r37.xyz, r34.wwww, r34.xyzx - add r38.xyz, r25.xyzx, -r36.xyzx - mad r38.xyz, -r35.xyzx, r27.wwww, r38.xyzx - dp3 r36.w, r38.xyzx, r37.xyzx - mad r37.xyz, -r36.wwww, r37.xyzx, r38.xyzx - dp3 r36.w, r37.xyzx, r37.xyzx - add r36.w, r36.w, l(0.000000) - rsq r36.w, r36.w - mul r29.w, -r29.w, r32.w - mul r29.w, r34.w, r29.w - mul r29.w, r27.w, r29.w - mul r29.w, r36.w, r29.w - max r29.w, r29.w, l(-1.000000) - mad r36.xyz, -r37.xyzx, r29.wwww, r36.xyzx - store_structured u0.xyz, r28.w, l(0), r36.xyzx - endif - mad r36.xyz, r34.xyzx, r27.wwww, r25.xyzx - dp3 r25.x, r34.xyzx, r34.xyzx - ld_raw r25.y, l(76), g0.xxxx - mad r25.x, r25.y, r25.x, l(1.000000) - div r25.x, r25.w, r25.x - movc r36.w, r19.w, r25.x, r25.w - store_structured u0.xyzw, r23.w, l(0), r36.xyzw - endif - iadd r22.w, r22.w, l(1024) - endloop - endif - ld_raw r19.x, l(84), g0.xxxx - ld_raw r19.y, l(72), g1.xxxx - min r19.x, r19.y, r19.x - lt r19.x, l(0.000000), r19.x - if_nz r19.x - ld_raw r19.x, l(88), g0.xxxx - ld_raw r19.y, l(0), g0.xxxx - if_nz r1.z - ld_raw r19.zw, r4.w, g1.xxxy - add r20.x, r19.w, r19.z - mad r19.zw, r20.xxxx, l(0.000000, 0.000000, 0.000100, 0.000100), r19.wwwz - add r19.w, r19.z, r19.w - store_structured g6.x, vThreadIDInGroup.x, l(0), r19.w - else - mov r19.zw, l(0,0,0,0) - endif - sync_g_t - if_nz r1.z - ld_structured r20.x, l(0), l(0), g6.xxxx - ld_structured r20.y, l(1), l(0), g6.xxxx - lt r20.x, r20.y, r20.x - and r20.y, r20.x, l(1) - ld_structured r20.y, r20.y, l(0), g6.xxxx - ld_structured r20.z, l(2), l(0), g6.xxxx - lt r20.y, r20.z, r20.y - movc r20.x, r20.y, l(-2), r20.x - iadd r20.x, r20.x, vThreadIDInGroup.x - ushr r20.y, r20.x, l(30) - iadd r20.x, r20.y, r20.x - div r19.w, l(127.000000), r19.w - ld_raw r20.y, l(84), g0.xxxx - div r20.y, l(1.000000, 1.000000, 1.000000, 1.000000), r20.y - min r19.w, r19.w, r20.y - ishl r20.x, r20.x, l(2) - iadd r20.yz, r20.xxxx, l(0, 12, 24, 0) - store_raw g5.x, r20.y, r19.w - mul r19.z, r19.z, r19.w - store_raw g5.x, r20.x, r19.z - store_raw g5.x, r20.z, vThreadIDInGroup.x - endif - sync_g_t - ld_raw r19.z, l(100), g0.xxxx - ishl r19.w, r19.x, l(1) - iadd r19.z, r19.w, r19.z - ld_raw r19.w, l(116), g1.xxxx - if_nz r19.w - mov r19.w, vThreadIDInGroup.x - loop - ige r20.x, r19.w, l(0x00004103) - breakc_nz r20.x - iadd r20.x, r19.w, r19.z - store_structured u2.x, r20.x, l(0), l(-1) - iadd r19.w, r19.w, l(1024) - endloop - endif - ld_raw r20.xy, l(16), g5.xyxx - ld_raw r20.zw, l(4), g5.xxxy - ld_raw r23.yz, l(28), g5.xxyx - ld_raw r19.w, l(92), g0.xxxx - ine r21.x, r19.w, l(-1) - ld_raw r22.w, l(100), g0.xxxx - mov r23.w, vThreadIDInGroup.x - loop - ige r25.x, r23.w, r19.x - breakc_nz r25.x - iadd r25.x, r19.w, r23.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r25.x, r25.x, l(0), t15.xxxx - movc r25.x, r21.x, r25.x, r23.w - iadd r25.y, r0.y, r25.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r36.xyzw, r25.y, l(0), u0.xyzw - dp4 r25.y, r36.xyzw, icb[r23.y + 0].xyzw - mad r25.y, r25.y, r20.x, r20.z - min r25.y, r25.y, l(127.500000) - max r25.y, r25.y, l(0.000000) - dp4 r25.z, r36.xyzw, icb[r23.z + 0].xyzw - mad r25.z, r25.z, r20.y, r20.w - min r25.z, r25.z, l(127.500000) - max r25.z, r25.z, l(0.000000) - ftoi r25.yz, r25.yyzy - iadd r25.w, r22.w, r23.w - ishl r25.z, r25.z, l(23) - imad r25.y, r25.y, l(0x00010000), r25.z - iadd r25.y, r25.y, l(0x00810000) - or r25.x, r25.x, r25.y - store_structured u2.x, r25.w, l(0), r25.x - iadd r23.w, r23.w, l(1024) - endloop - sync_g_t - ld_raw r25.xy, l(96), g0.xyxx - iadd r19.w, r19.x, r25.y - mov r21.x, vThreadIDInGroup.x - loop - ige r22.w, r21.x, r19.y - breakc_nz r22.w - iadd r22.w, r21.x, r25.x - iadd r23.w, r0.y, r21.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r36.xyzw, r23.w, l(0), u0.xyzw - store_structured u1.xyzw, r22.w, l(0), r36.xyzw - iadd r21.x, r21.x, l(1024) - endloop - sync_g_t - iadd r21.x, r19.x, l(31) - ubfe r22.w, l(5), l(5), r21.x - ushr r21.x, r21.x, l(10) - ult r23.w, r4.y, r22.w - and r25.x, r23.w, l(1) - iadd r25.x, r21.x, r25.x - movc r25.z, r23.w, l(0), l(1) - imul null, r25.z, r22.w, r25.z - imad r25.z, r4.y, r25.x, r25.z - ishl r25.xw, r25.xxxz, l(5, 0, 0, 5) - iadd r25.x, r25.x, r25.w - umin r25.x, r19.x, r25.x - bfi r25.z, l(27), l(5), r25.z, vThreadIDInGroup.x - mov r25.w, l(16) - mov r27.w, r25.y - mov r28.w, r19.w - loop - uge r29.w, r25.w, l(32) - breakc_nz r29.w - mov r29.w, l(0) - mov r32.w, l(0) - mov r34.w, r25.z - loop - uge r36.x, r32.w, r21.x - breakc_nz r36.x - ult r36.x, r34.w, r25.x - iadd r36.y, r27.w, r34.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r36.y, r36.y, l(0), u2.xxxx - movc r36.x, r36.x, r36.y, l(-1) - ushr r36.x, r36.x, r25.w - and r36.xyzw, r36.xxxx, l(1, 2, 4, 8) - ine r36.xyzw, r36.xyzw, l(0, 0, 0, 0) - bfi r36.xyzw, l(1, 1, 1, 1), vThreadIDInGroup.xxxx, r36.xyzw, l(0, 0, 0, 0) - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - sync_g_t - if_nz r7.x - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r3.x, l(0), g3.xxxx - ld_structured r37.y, r6.y, l(0), g3.xxxx - ld_structured r37.z, r9.x, l(0), g3.xxxx - ld_structured r37.w, r6.z, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - sync_g_t - if_nz r7.y - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r3.y, l(0), g3.xxxx - ld_structured r37.y, r6.w, l(0), g3.xxxx - ld_structured r37.z, r9.y, l(0), g3.xxxx - ld_structured r37.w, r8.x, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - sync_g_t - if_nz r7.z - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r3.z, l(0), g3.xxxx - ld_structured r37.y, r8.y, l(0), g3.xxxx - ld_structured r37.z, r9.z, l(0), g3.xxxx - ld_structured r37.w, r8.z, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - sync_g_t - if_nz r7.w - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r3.w, l(0), g3.xxxx - ld_structured r37.y, r8.w, l(0), g3.xxxx - ld_structured r37.z, r9.w, l(0), g3.xxxx - ld_structured r37.w, r13.x, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - sync_g_t - if_nz r5.w - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r6.x, l(0), g3.xxxx - ld_structured r37.y, r13.y, l(0), g3.xxxx - ld_structured r37.z, r14.x, l(0), g3.xxxx - ld_structured r37.w, r13.z, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - sync_g_t - ld_structured r36.x, r5.z, l(0), g3.xxxx - ld_structured r36.y, r10.x, l(0), g3.xxxx - ld_structured r36.z, r10.y, l(0), g3.xxxx - ld_structured r36.w, r10.z, l(0), g3.xxxx - xor r36.xy, r2.zwzz, r36.xyxx - and r36.x, r36.y, r36.x - xor r36.y, r5.x, r36.z - and r36.x, r36.y, r36.x - xor r36.y, r5.y, r36.w - and r36.x, r36.y, r36.x - countbits r36.x, r36.x - iadd r29.w, r29.w, r36.x - iadd r32.w, r32.w, l(1) - iadd r34.w, r34.w, l(32) - endloop - if_nz r22.w - iadd r32.w, r27.w, r34.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r32.w, r32.w, l(0), u2.xxxx - if_nz r23.w - ult r36.x, r34.w, r25.x - movc r32.w, r36.x, r32.w, l(-1) - ushr r32.w, r32.w, r25.w - and r36.xyzw, r32.wwww, l(1, 2, 4, 8) - ine r36.xyzw, r36.xyzw, l(0, 0, 0, 0) - bfi r36.xyzw, l(1, 1, 1, 1), vThreadIDInGroup.xxxx, r36.xyzw, l(0, 0, 0, 0) - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - sync_g_t - if_nz r23.w - if_nz r7.x - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r3.x, l(0), g3.xxxx - ld_structured r37.y, r6.y, l(0), g3.xxxx - ld_structured r37.z, r9.x, l(0), g3.xxxx - ld_structured r37.w, r6.z, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - endif - sync_g_t - if_nz r23.w - if_nz r7.y - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r3.y, l(0), g3.xxxx - ld_structured r37.y, r6.w, l(0), g3.xxxx - ld_structured r37.z, r9.y, l(0), g3.xxxx - ld_structured r37.w, r8.x, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - endif - sync_g_t - if_nz r23.w - if_nz r7.z - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r3.z, l(0), g3.xxxx - ld_structured r37.y, r8.y, l(0), g3.xxxx - ld_structured r37.z, r9.z, l(0), g3.xxxx - ld_structured r37.w, r8.z, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - endif - sync_g_t - if_nz r23.w - if_nz r7.w - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r3.w, l(0), g3.xxxx - ld_structured r37.y, r8.w, l(0), g3.xxxx - ld_structured r37.z, r9.w, l(0), g3.xxxx - ld_structured r37.w, r13.x, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - endif - sync_g_t - if_nz r23.w - if_nz r5.w - ld_structured r36.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r36.y, r12.x, l(0), g3.xxxx - ld_structured r36.z, r12.y, l(0), g3.xxxx - ld_structured r36.w, r12.z, l(0), g3.xxxx - ld_structured r37.x, r6.x, l(0), g3.xxxx - ld_structured r37.y, r13.y, l(0), g3.xxxx - ld_structured r37.z, r14.x, l(0), g3.xxxx - ld_structured r37.w, r13.z, l(0), g3.xxxx - or r36.xyzw, r36.xyzw, r37.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r36.x - store_structured g3.x, r12.x, l(0), r36.y - store_structured g3.x, r12.y, l(0), r36.z - store_structured g3.x, r12.z, l(0), r36.w - endif - endif - sync_g_t - if_nz r23.w - ld_structured r36.x, r5.z, l(0), g3.xxxx - ld_structured r36.y, r10.x, l(0), g3.xxxx - ld_structured r36.z, r10.y, l(0), g3.xxxx - ld_structured r36.w, r10.z, l(0), g3.xxxx - else - mov r36.xyzw, l(0,0,0,0) - endif - xor r32.w, r2.z, r36.x - xor r36.x, r2.w, r36.y - and r32.w, r32.w, r36.x - xor r36.xy, r5.xyxx, r36.zwzz - and r32.w, r32.w, r36.x - and r32.w, r36.y, r32.w - countbits r32.w, r32.w - and r32.w, r23.w, r32.w - iadd r29.w, r29.w, r32.w - endif - if_nz r7.x - store_structured g3.x, r11.x, l(0), r29.w - endif - sync_g_t - if_z vThreadIDInGroup.x - store_structured g3.x, l(4096), l(0), l(0) - store_structured g3.x, l(4609), l(0), l(0) - endif - if_nz r1.w - if_nz r16.x - ld_structured r32.w, r14.y, l(0), g3.xxxx - ld_structured r36.x, r10.w, l(0), g3.xxxx - iadd r32.w, r32.w, r36.x - store_structured g3.x, r11.w, l(0), r32.w - else - ld_structured r32.w, l(4097), l(0), g3.xxxx - store_structured g3.x, l(4610), l(0), r32.w - endif - endif - sync_g_t - if_nz r1.w - if_nz r16.y - ld_structured r32.w, r11.w, l(0), g3.xxxx - ld_structured r36.x, r12.w, l(0), g3.xxxx - iadd r32.w, r32.w, r36.x - else - ld_structured r32.w, r11.w, l(0), g3.xxxx - endif - store_structured g3.x, r15.x, l(0), r32.w - endif - sync_g_t - if_nz r1.w - if_nz r16.z - ld_structured r32.w, r14.y, l(0), g3.xxxx - ld_structured r36.x, r15.w, l(0), g3.xxxx - iadd r32.w, r32.w, r36.x - else - ld_structured r32.w, r14.y, l(0), g3.xxxx - endif - store_structured g3.x, r15.z, l(0), r32.w - endif - sync_g_t - if_nz r1.w - if_nz r16.w - ld_structured r32.w, r11.w, l(0), g3.xxxx - ld_structured r36.x, r14.z, l(0), g3.xxxx - iadd r32.w, r32.w, r36.x - else - ld_structured r32.w, r11.w, l(0), g3.xxxx - endif - store_structured g3.x, r15.x, l(0), r32.w - endif - sync_g_t - if_nz r1.w - if_nz r18.x - ld_structured r32.w, r14.y, l(0), g3.xxxx - ld_structured r36.x, r17.y, l(0), g3.xxxx - iadd r32.w, r32.w, r36.x - else - ld_structured r32.w, r14.y, l(0), g3.xxxx - endif - store_structured g3.x, r15.z, l(0), r32.w - endif - sync_g_t - if_nz r1.w - if_nz r18.y - ld_structured r32.w, r11.w, l(0), g3.xxxx - ld_structured r36.x, r14.w, l(0), g3.xxxx - iadd r32.w, r32.w, r36.x - else - ld_structured r32.w, r11.w, l(0), g3.xxxx - endif - store_structured g3.x, r15.x, l(0), r32.w - endif - sync_g_t - if_nz r1.w - if_nz r18.z - ld_structured r32.w, r14.y, l(0), g3.xxxx - ld_structured r36.x, r17.w, l(0), g3.xxxx - iadd r32.w, r32.w, r36.x - else - ld_structured r32.w, r14.y, l(0), g3.xxxx - endif - store_structured g3.x, r15.z, l(0), r32.w - endif - sync_g_t - if_nz r1.w - if_nz r18.w - ld_structured r32.w, r11.w, l(0), g3.xxxx - ld_structured r36.x, r13.w, l(0), g3.xxxx - iadd r32.w, r32.w, r36.x - else - ld_structured r32.w, r11.w, l(0), g3.xxxx - endif - store_structured g3.x, r15.x, l(0), r32.w - endif - sync_g_t - if_nz r1.w - if_nz r15.y - ld_structured r32.w, r14.y, l(0), g3.xxxx - ld_structured r36.x, r17.z, l(0), g3.xxxx - iadd r32.w, r32.w, r36.x - else - ld_structured r32.w, r14.y, l(0), g3.xxxx - endif - store_structured g3.x, r15.z, l(0), r32.w - endif - sync_g_t - mov r32.w, l(0) - mov r36.x, r25.z - loop - uge r36.y, r32.w, r21.x - breakc_nz r36.y - ult r36.y, r36.x, r25.x - iadd r36.z, r27.w, r36.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r36.z, r36.z, l(0), u2.xxxx - movc r36.z, r36.y, r36.z, l(-1) - ushr r36.w, r36.z, r25.w - and r37.xyzw, r36.wwww, l(1, 2, 4, 8) - ine r38.xyzw, r37.xyzw, l(0, 0, 0, 0) - bfi r39.xyzw, l(1, 1, 1, 1), vThreadIDInGroup.xxxx, r38.xyzw, l(0, 0, 0, 0) - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - sync_g_t - if_nz r7.x - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r3.x, l(0), g3.xxxx - ld_structured r40.y, r6.y, l(0), g3.xxxx - ld_structured r40.z, r9.x, l(0), g3.xxxx - ld_structured r40.w, r6.z, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - if_nz r7.y - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r3.y, l(0), g3.xxxx - ld_structured r40.y, r6.w, l(0), g3.xxxx - ld_structured r40.z, r9.y, l(0), g3.xxxx - ld_structured r40.w, r8.x, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - if_nz r7.z - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r3.z, l(0), g3.xxxx - ld_structured r40.y, r8.y, l(0), g3.xxxx - ld_structured r40.z, r9.z, l(0), g3.xxxx - ld_structured r40.w, r8.z, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - if_nz r7.w - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r3.w, l(0), g3.xxxx - ld_structured r40.y, r8.w, l(0), g3.xxxx - ld_structured r40.z, r9.w, l(0), g3.xxxx - ld_structured r40.w, r13.x, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - if_nz r5.w - ld_structured r39.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r39.y, r12.x, l(0), g3.xxxx - ld_structured r39.z, r12.y, l(0), g3.xxxx - ld_structured r39.w, r12.z, l(0), g3.xxxx - ld_structured r40.x, r6.x, l(0), g3.xxxx - ld_structured r40.y, r13.y, l(0), g3.xxxx - ld_structured r40.z, r14.x, l(0), g3.xxxx - ld_structured r40.w, r13.z, l(0), g3.xxxx - or r39.xyzw, r39.xyzw, r40.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r39.x - store_structured g3.x, r12.x, l(0), r39.y - store_structured g3.x, r12.y, l(0), r39.z - store_structured g3.x, r12.z, l(0), r39.w - endif - sync_g_t - ld_structured r37.y, r5.z, l(0), g3.xxxx - ld_structured r37.z, r10.x, l(0), g3.xxxx - ld_structured r37.w, r10.y, l(0), g3.xxxx - ld_structured r38.x, r10.z, l(0), g3.xxxx - bfi r36.w, l(4), l(5), r36.w, l(0) - iadd r36.w, r11.y, r36.w - iadd r36.w, r36.w, l(4096) - ld_structured r36.w, r36.w, l(0), g3.xxxx - if_nz r36.y - iadd r36.y, r37.x, l(-1) - xor r36.y, r37.y, r36.y - ieq r38.yzw, r38.yyzw, l(0, 0, 0, 0) - xor r37.x, r37.z, r38.y - and r36.y, r36.y, r37.x - xor r37.x, r37.w, r38.z - and r36.y, r36.y, r37.x - xor r37.x, r38.x, r38.w - and r36.y, r36.y, r37.x - ubfe r36.y, vThreadIDInGroup.x, l(0), r36.y - countbits r36.y, r36.y - iadd r36.y, r36.y, r36.w - iadd r36.y, r28.w, r36.y - store_structured u2.x, r36.y, l(0), r36.z - endif - sync_g_t - if_nz r7.x - ld_structured r36.y, r11.z, l(0), g3.xxxx - xor r36.zw, r2.zzzw, r37.yyyz - and r36.z, r36.w, r36.z - xor r36.w, r5.x, r37.w - and r36.z, r36.w, r36.z - xor r36.w, r5.y, r38.x - and r36.z, r36.w, r36.z - countbits r36.z, r36.z - iadd r36.y, r36.z, r36.y - store_structured g3.x, r11.z, l(0), r36.y - endif - iadd r32.w, r32.w, l(1) - iadd r36.x, r36.x, l(32) - endloop - if_nz r22.w - ult r32.w, r36.x, r25.x - iadd r36.y, r27.w, r36.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r36.y, r36.y, l(0), u2.xxxx - movc r36.y, r32.w, r36.y, l(-1) - ushr r36.z, r36.y, r25.w - if_nz r23.w - and r37.xyzw, r36.zzzz, l(1, 2, 4, 8) - ine r37.xyzw, r37.xyzw, l(0, 0, 0, 0) - bfi r37.xyzw, l(1, 1, 1, 1), vThreadIDInGroup.xxxx, r37.xyzw, l(0, 0, 0, 0) - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - sync_g_t - if_nz r23.w - if_nz r7.x - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.x, l(0), g3.xxxx - ld_structured r38.y, r6.y, l(0), g3.xxxx - ld_structured r38.z, r9.x, l(0), g3.xxxx - ld_structured r38.w, r6.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r23.w - if_nz r7.y - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.y, l(0), g3.xxxx - ld_structured r38.y, r6.w, l(0), g3.xxxx - ld_structured r38.z, r9.y, l(0), g3.xxxx - ld_structured r38.w, r8.x, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r23.w - if_nz r7.z - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.z, l(0), g3.xxxx - ld_structured r38.y, r8.y, l(0), g3.xxxx - ld_structured r38.z, r9.z, l(0), g3.xxxx - ld_structured r38.w, r8.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r23.w - if_nz r7.w - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r3.w, l(0), g3.xxxx - ld_structured r38.y, r8.w, l(0), g3.xxxx - ld_structured r38.z, r9.w, l(0), g3.xxxx - ld_structured r38.w, r13.x, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r23.w - if_nz r5.w - ld_structured r37.x, vThreadIDInGroup.x, l(0), g3.xxxx - ld_structured r37.y, r12.x, l(0), g3.xxxx - ld_structured r37.z, r12.y, l(0), g3.xxxx - ld_structured r37.w, r12.z, l(0), g3.xxxx - ld_structured r38.x, r6.x, l(0), g3.xxxx - ld_structured r38.y, r13.y, l(0), g3.xxxx - ld_structured r38.z, r14.x, l(0), g3.xxxx - ld_structured r38.w, r13.z, l(0), g3.xxxx - or r37.xyzw, r37.xyzw, r38.xyzw - store_structured g3.x, vThreadIDInGroup.x, l(0), r37.x - store_structured g3.x, r12.x, l(0), r37.y - store_structured g3.x, r12.y, l(0), r37.z - store_structured g3.x, r12.z, l(0), r37.w - endif - endif - sync_g_t - if_nz r23.w - ld_structured r37.x, r5.z, l(0), g3.xxxx - ld_structured r37.y, r10.x, l(0), g3.xxxx - ld_structured r37.z, r10.y, l(0), g3.xxxx - ld_structured r37.w, r10.z, l(0), g3.xxxx - and r38.xyzw, r36.zzzz, l(1, 2, 4, 8) - iadd r36.w, r38.x, l(-1) - xor r36.w, r37.x, r36.w - ine r38.xyz, r38.yzwy, l(0, 0, 0, 0) - ieq r38.xyz, r38.xyzx, l(0, 0, 0, 0) - xor r38.xyz, r37.yzwy, r38.xyzx - and r36.w, r36.w, r38.x - and r36.w, r38.y, r36.w - and r36.w, r38.z, r36.w - bfi r36.z, l(4), l(5), r36.z, l(0) - iadd r36.z, r11.y, r36.z - iadd r36.z, r36.z, l(4096) - ld_structured r36.z, r36.z, l(0), g3.xxxx - ubfe r36.w, vThreadIDInGroup.x, l(0), r36.w - countbits r36.w, r36.w - iadd r36.z, r36.w, r36.z - else - mov r37.xyzw, l(0,0,0,0) - mov r36.z, l(0) - endif - if_nz r32.w - iadd r32.w, r28.w, r36.z - store_structured u2.x, r32.w, l(0), r36.y - endif - sync_g_t - if_nz r23.w - if_nz r7.x - ld_structured r32.w, r11.z, l(0), g3.xxxx - xor r36.yz, r2.zzwz, r37.xxyx - and r36.y, r36.z, r36.y - xor r36.zw, r5.xxxy, r37.zzzw - and r36.y, r36.z, r36.y - and r36.y, r36.w, r36.y - countbits r36.y, r36.y - iadd r32.w, r32.w, r36.y - store_structured g3.x, r11.z, l(0), r32.w - endif - endif - endif - iadd r25.w, r25.w, l(4) - mov r32.w, r28.w - mov r28.w, r27.w - mov r27.w, r32.w - endloop - mov r19.w, vThreadIDInGroup.x - loop - ige r21.x, r19.w, r19.x - breakc_nz r21.x - iadd r21.x, r19.w, r25.y - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r22.w, r21.x, l(0), u2.xxxx - ishr r22.w, r22.w, l(16) - iadd r21.x, r21.x, l(-1) - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r21.x, r21.x, l(0), u2.xxxx - ishr r21.x, r21.x, l(16) - iadd r23.w, r22.w, l(-1) - movc r21.x, r19.w, r21.x, r23.w - ine r23.w, r21.x, r22.w - if_nz r23.w - iadd r22.w, r19.z, r22.w - store_structured u2.x, r22.w, l(0), r19.w - iadd r21.x, r19.z, r21.x - iadd r21.x, r21.x, l(1) - store_structured u2.x, r21.x, l(0), r19.w - endif - iadd r19.w, r19.w, l(1024) - endloop - ld_raw r25.xy, l(96), g0.xyxx - mov r19.w, vThreadIDInGroup.x - loop - ige r21.x, r19.w, r19.x - breakc_nz r21.x - iadd r21.x, r19.w, r25.y - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r21.x, r21.x, l(0), u2.xxxx - and r21.x, r21.x, l(0x0000ffff) - iadd r21.x, r21.x, r25.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r37.xyzw, r21.x, l(0), u1.xyzw - iadd r21.x, r0.y, r19.w - store_structured u0.xyzw, r21.x, l(0), r37.xyzw - iadd r19.w, r19.w, l(1024) - endloop - sync_g_t - ld_raw r19.w, l(84), g0.xxxx - mul r21.x, r19.w, r19.w - ld_raw r22.w, l(100), g0.xxxx - ld_raw r23.w, l(112), g1.xxxx - mov r25.x, vThreadIDInGroup.x - loop - ige r25.y, r25.x, r19.x - breakc_nz r25.y - iadd r25.y, r22.w, r25.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r25.y, r25.y, l(0), u2.xxxx - and r25.y, r25.y, l(0x0000ffff) - iadd r25.z, r0.y, r25.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r37.xyzw, r25.z, l(0), u0.xyzw - iadd r25.z, r23.w, r25.y - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r36.yzw, r25.z, l(0), t14.xxyz - dp4 r25.z, r37.xyzw, icb[r23.y + 0].xyzw - mad r25.z, r25.z, r20.x, r20.z - min r25.z, r25.z, l(127.500000) - max r25.z, r25.z, l(0.000000) - dp4 r25.w, r37.xyzw, icb[r23.z + 0].xyzw - mad r25.w, r25.w, r20.y, r20.w - min r25.w, r25.w, l(127.500000) - max r25.w, r25.w, l(0.000000) - ftoi r25.zw, r25.zzzw - imad r25.z, r25.w, l(128), r25.z - iadd r25.w, r25.z, l(256) - add r27.w, r37.w, l(0.000000) - mov r38.xyz, l(0,0,0,0) - mov r28.w, l(0.000000) - mov r32.w, r25.z - loop - ilt r38.w, r25.w, r32.w - breakc_nz r38.w - iadd r38.w, r19.z, r32.w - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r39.x, r38.w, l(0), u2.xxxx - iadd r39.yzw, r38.wwww, l(0, 1, 2, 3) - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r38.w, r39.y, l(0), u2.xxxx - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r39.y, r39.z, l(0), u2.xxxx - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r39.z, r39.w, l(0), u2.xxxx - umin r39.x, r38.w, r39.x - umin r39.x, r39.y, r39.x - imax r38.w, r38.w, r39.y - imax r38.w, r39.z, r38.w - imax r38.w, r38.w, l(0) - mov r39.yzw, r38.xxyz - mov r40.x, r28.w - mov r40.y, r39.x - loop - uge r40.z, r40.y, r38.w - breakc_nz r40.z - ine r40.z, r25.x, r40.y - if_nz r40.z - iadd r40.z, r0.y, r40.y - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r41.xyzw, r40.z, l(0), u0.xyzw - add r41.xyz, r37.xyzx, -r41.xyzx - dp3 r40.z, r41.xyzx, r41.xyzx - lt r40.w, r21.x, r40.z - if_nz r40.w - iadd r40.w, r40.y, l(1) - mov r40.y, r40.w - continue - endif - ld_raw r40.w, l(112), g1.xxxx - ine r42.x, r40.w, l(-1) - if_nz r42.x - ld_raw r42.x, l(100), g0.xxxx - iadd r42.x, r40.y, r42.x - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r42.x, r42.x, l(0), u2.xxxx - and r42.x, r42.x, l(0x0000ffff) - iadd r40.w, r40.w, r42.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r42.xyz, r40.w, l(0), t14.xyzx - add r42.xyz, r36.yzwy, -r42.xyzx - dp3 r40.w, r42.xyzx, r42.xyzx - ge r42.x, r21.x, r40.w - if_nz r42.x - iadd r42.x, r40.y, l(1) - mov r40.y, r42.x - continue - endif - add r40.w, r40.w, l(0.000000) - div r40.w, r21.x, r40.w - rsq r40.w, r40.w - add r40.w, r40.w, l(-1.000000) - min r40.w, r40.w, l(1.000000) - else - mov r40.w, l(1.000000) - endif - add r40.z, r40.z, l(0.000000) - rsq r40.z, r40.z - mad r40.z, r19.w, r40.z, l(-1.000000) - max r40.z, r40.z, l(0.000000) - mul r42.x, r40.z, r40.z - mul r40.w, r40.w, r42.x - add r41.w, r27.w, r41.w - div r40.w, r40.w, r41.w - mad r39.yzw, r40.wwww, r41.xxyz, r39.yyzw - add r40.x, r40.z, r40.x - endif - iadd r40.y, r40.y, l(1) - endloop - mov r38.xyz, r39.yzwy - mov r28.w, r40.x - iadd r32.w, r32.w, l(128) - endloop - ld_raw r25.z, l(72), g1.xxxx - mul r25.z, r37.w, r25.z - div r25.z, r25.z, r28.w - ld_raw r25.w, l(96), g0.xxxx - iadd r25.y, r25.y, r25.w - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r36.yzw, r25.y, l(0), u1.xxyz - mad r36.yzw, r38.xxyz, r25.zzzz, r36.yyzw - store_structured u1.xyz, r25.y, l(0), r36.yzwy - iadd r25.x, r25.x, l(1024) - endloop - sync_g_t - ld_raw r19.w, l(96), g0.xxxx - mov r20.x, vThreadIDInGroup.x - loop - ige r20.y, r20.x, r19.y - breakc_nz r20.y - iadd r20.y, r19.w, r20.x - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r25.xyzw, r20.y, l(0), u1.xyzw - iadd r20.y, r0.y, r20.x - store_structured u0.xyzw, r20.y, l(0), r25.xyzw - iadd r20.x, r20.x, l(1024) - endloop - ld_raw r19.y, l(100), g0.xxxx - mov r19.w, vThreadIDInGroup.x - loop - ige r20.x, r19.w, r19.x - breakc_nz r20.x - iadd r20.x, r19.w, r19.y - ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r20.x, r20.x, l(0), u2.xxxx - ushr r20.x, r20.x, l(16) - iadd r20.x, r19.z, r20.x - store_structured u2.x, r20.x, l(0), l(-1) - iadd r20.y, r20.x, l(1) - store_structured u2.x, r20.y, l(0), l(-1) - iadd r19.w, r19.w, l(1024) - endloop - endif - if_z vThreadIDInGroup.x - ld_raw r19.x, l(8), g1.xxxx - mul r19.x, r19.x, l(1000.000000) - ftou r19.x, r19.x - umax r19.x, r19.x, l(1) - ld_raw r19.y, l(104), g1.xxxx - iadd r19.x, r19.x, r19.y - store_raw g1.x, l(104), r19.x - endif - sync_g_t - ld_raw r19.x, l(104), g1.xxxx - ld_raw r19.y, l(104), g0.xxxx - uge r19.x, r19.x, r19.y - if_nz r19.x - ld_raw r19.x, l(0), g0.xxxx - mov r19.y, l(0) - mov r19.z, vThreadIDInGroup.x - loop - uge r19.w, r19.z, r19.x - breakc_nz r19.w - iadd r19.w, r0.y, r19.z - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r20.xyz, r19.w, l(0), u0.xyzx - iadd r19.w, r0.x, r19.z - ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r23.yzw, r19.w, l(0), u0.xxyz - add r20.xyz, r20.xyzx, -r23.yzwy - max r19.w, |r20.y|, |r20.x| - max r19.w, |r20.z|, r19.w - max r19.y, r19.y, r19.w - iadd r19.z, r19.z, l(1024) - endloop - if_z vThreadIDInGroup.x - ld_raw r19.x, l(100), g1.xxxx - iadd r19.x, r19.x, l(1) - store_raw g1.x, l(100), r19.x - ld_raw r19.x, l(104), g0.xxxx - ld_raw r19.z, l(104), g1.xxxx - iadd r19.x, -r19.x, r19.z - store_raw g1.x, l(104), r19.x - endif - ld_raw r19.x, l(112), g0.xxxx - ld_raw r19.z, l(8), g1.xxxx - mul r19.x, r19.z, r19.x - lt r19.x, r19.x, r19.y - if_nz r19.x - store_raw g1.x, l(100), l(0) - endif - endif - iadd r17.x, r17.x, l(1) - endloop - sync_g_t -endif -if_z vThreadIDInGroup.x - ld_raw r0.xyzw, l(0), g1.xyzw - ld_raw r1.xyzw, l(16), g1.xyzw - ld_raw r2.xyzw, l(32), g1.xyzw - ld_raw r3.xyzw, l(48), g1.xyzw - ld_raw r4.xyzw, l(64), g1.xyzw - ld_raw r5.xyzw, l(80), g1.xyzw - ld_raw r6.xyzw, l(96), g1.xyzw - ld_raw r7.xy, l(112), g1.xyxx - store_structured u3.xyzw, vThreadGroupID.x, l(0), r0.xyzw - store_structured u3.xyzw, vThreadGroupID.x, l(16), r1.xyzw - store_structured u3.xyzw, vThreadGroupID.x, l(32), r2.xyzw - store_structured u3.xyzw, vThreadGroupID.x, l(48), r3.xyzw - store_structured u3.xyzw, vThreadGroupID.x, l(64), r4.xyzw - store_structured u3.xyzw, vThreadGroupID.x, l(80), r5.xyzw - store_structured u3.xyzw, vThreadGroupID.x, l(96), r6.xyzw - store_structured u3.xy, vThreadGroupID.x, l(112), r7.xyxx -endif -ret -// Approximately 4204 instruction slots used -#endif - -const BYTE gDxSolverKernel[] = -{ - 68, 88, 66, 67, 15, 26, - 236, 198, 241, 164, 237, 240, - 132, 194, 14, 81, 193, 73, - 162, 40, 1, 0, 0, 0, - 32, 212, 1, 0, 5, 0, - 0, 0, 52, 0, 0, 0, - 108, 20, 0, 0, 124, 20, - 0, 0, 140, 20, 0, 0, - 132, 211, 1, 0, 82, 68, - 69, 70, 48, 20, 0, 0, - 20, 0, 0, 0, 20, 4, - 0, 0, 20, 0, 0, 0, - 60, 0, 0, 0, 0, 5, - 83, 67, 0, 1, 0, 0, - 252, 19, 0, 0, 82, 68, - 49, 49, 60, 0, 0, 0, - 24, 0, 0, 0, 32, 0, - 0, 0, 40, 0, 0, 0, - 36, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 188, 2, 0, 0, 5, 0, - 0, 0, 6, 0, 0, 0, - 1, 0, 0, 0, 116, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 199, 2, 0, 0, - 5, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 100, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 209, 2, - 0, 0, 5, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 24, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 223, 2, 0, 0, 5, 0, - 0, 0, 6, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 4, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 236, 2, 0, 0, - 5, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 5, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 255, 2, - 0, 0, 5, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 15, 3, 0, 0, 5, 0, - 0, 0, 6, 0, 0, 0, - 1, 0, 0, 0, 16, 0, - 0, 0, 7, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 33, 3, 0, 0, - 5, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 8, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 46, 3, - 0, 0, 5, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 16, 0, 0, 0, - 9, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 63, 3, 0, 0, 5, 0, - 0, 0, 6, 0, 0, 0, - 1, 0, 0, 0, 12, 0, - 0, 0, 10, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 83, 3, 0, 0, - 5, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 11, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 102, 3, - 0, 0, 5, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 16, 0, 0, 0, - 12, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 125, 3, 0, 0, 5, 0, - 0, 0, 6, 0, 0, 0, - 1, 0, 0, 0, 16, 0, - 0, 0, 13, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 148, 3, 0, 0, - 5, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 14, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 163, 3, - 0, 0, 5, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 4, 0, 0, 0, - 15, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 185, 3, 0, 0, 5, 0, - 0, 0, 6, 0, 0, 0, - 1, 0, 0, 0, 4, 0, - 0, 0, 16, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 209, 3, 0, 0, - 6, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 220, 3, - 0, 0, 6, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 16, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 244, 3, 0, 0, 6, 0, - 0, 0, 6, 0, 0, 0, - 1, 0, 0, 0, 4, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 7, 4, 0, 0, - 6, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 120, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 98, 67, - 108, 111, 116, 104, 68, 97, - 116, 97, 0, 98, 73, 116, - 101, 114, 68, 97, 116, 97, - 0, 98, 80, 104, 97, 115, - 101, 67, 111, 110, 102, 105, - 103, 115, 0, 98, 67, 111, - 110, 115, 116, 114, 97, 105, - 110, 116, 115, 0, 98, 84, - 101, 116, 104, 101, 114, 67, - 111, 110, 115, 116, 114, 97, - 105, 110, 116, 115, 0, 98, - 67, 97, 112, 115, 117, 108, - 101, 73, 110, 100, 105, 99, - 101, 115, 0, 98, 67, 111, - 108, 108, 105, 115, 105, 111, - 110, 83, 112, 104, 101, 114, - 101, 115, 0, 98, 67, 111, - 110, 118, 101, 120, 77, 97, - 115, 107, 115, 0, 98, 67, - 111, 108, 108, 105, 115, 105, - 111, 110, 80, 108, 97, 110, - 101, 115, 0, 98, 67, 111, - 108, 108, 105, 115, 105, 111, - 110, 84, 114, 105, 97, 110, - 103, 108, 101, 115, 0, 98, - 77, 111, 116, 105, 111, 110, - 67, 111, 110, 115, 116, 114, - 97, 105, 110, 116, 115, 0, - 98, 83, 101, 112, 97, 114, - 97, 116, 105, 111, 110, 67, - 111, 110, 115, 116, 114, 97, - 105, 110, 116, 115, 0, 98, - 80, 97, 114, 116, 105, 99, - 108, 101, 65, 99, 99, 101, - 108, 101, 114, 97, 116, 105, - 111, 110, 115, 0, 98, 82, - 101, 115, 116, 80, 111, 115, - 105, 116, 105, 111, 110, 115, - 0, 98, 83, 101, 108, 102, - 67, 111, 108, 108, 105, 115, - 105, 111, 110, 73, 110, 100, - 105, 99, 101, 115, 0, 98, - 80, 101, 114, 67, 111, 110, - 115, 116, 114, 97, 105, 110, - 116, 83, 116, 105, 102, 102, - 110, 101, 115, 115, 0, 98, - 80, 97, 114, 116, 105, 99, - 108, 101, 115, 0, 98, 83, - 101, 108, 102, 67, 111, 108, - 108, 105, 115, 105, 111, 110, - 80, 97, 114, 116, 105, 99, - 108, 101, 115, 0, 98, 83, - 101, 108, 102, 67, 111, 108, - 108, 105, 115, 105, 111, 110, - 68, 97, 116, 97, 0, 98, - 70, 114, 97, 109, 101, 68, - 97, 116, 97, 0, 171, 171, - 188, 2, 0, 0, 1, 0, - 0, 0, 244, 5, 0, 0, - 116, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 199, 2, 0, 0, 1, 0, - 0, 0, 40, 10, 0, 0, - 100, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 209, 2, 0, 0, 1, 0, - 0, 0, 224, 10, 0, 0, - 24, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 223, 2, 0, 0, 1, 0, - 0, 0, 228, 11, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 236, 2, 0, 0, 1, 0, - 0, 0, 108, 12, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 255, 2, 0, 0, 1, 0, - 0, 0, 212, 12, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 15, 3, 0, 0, 1, 0, - 0, 0, 80, 13, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 33, 3, 0, 0, 1, 0, - 0, 0, 164, 13, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 46, 3, 0, 0, 1, 0, - 0, 0, 204, 13, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 63, 3, 0, 0, 1, 0, - 0, 0, 244, 13, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 83, 3, 0, 0, 1, 0, - 0, 0, 72, 14, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 102, 3, 0, 0, 1, 0, - 0, 0, 112, 14, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 125, 3, 0, 0, 1, 0, - 0, 0, 152, 14, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 148, 3, 0, 0, 1, 0, - 0, 0, 192, 14, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 163, 3, 0, 0, 1, 0, - 0, 0, 232, 14, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 185, 3, 0, 0, 1, 0, - 0, 0, 60, 15, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 209, 3, 0, 0, 1, 0, - 0, 0, 100, 15, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 220, 3, 0, 0, 1, 0, - 0, 0, 140, 15, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 244, 3, 0, 0, 1, 0, - 0, 0, 180, 15, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 7, 4, 0, 0, 1, 0, - 0, 0, 220, 15, 0, 0, - 120, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 28, 6, 0, 0, 0, 0, - 0, 0, 116, 0, 0, 0, - 2, 0, 0, 0, 4, 10, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 36, 69, - 108, 101, 109, 101, 110, 116, - 0, 68, 120, 67, 108, 111, - 116, 104, 68, 97, 116, 97, - 0, 109, 78, 117, 109, 80, - 97, 114, 116, 105, 99, 108, - 101, 115, 0, 117, 105, 110, - 116, 51, 50, 95, 116, 0, - 0, 0, 19, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 63, 6, 0, 0, - 109, 80, 97, 114, 116, 105, - 99, 108, 101, 115, 79, 102, - 102, 115, 101, 116, 0, 109, - 78, 117, 109, 80, 104, 97, - 115, 101, 115, 0, 109, 80, - 104, 97, 115, 101, 67, 111, - 110, 102, 105, 103, 79, 102, - 102, 115, 101, 116, 0, 109, - 67, 111, 110, 115, 116, 114, - 97, 105, 110, 116, 79, 102, - 102, 115, 101, 116, 0, 109, - 83, 116, 105, 102, 102, 110, - 101, 115, 115, 79, 102, 102, - 115, 101, 116, 0, 109, 78, - 117, 109, 84, 101, 116, 104, - 101, 114, 115, 0, 109, 84, - 101, 116, 104, 101, 114, 79, - 102, 102, 115, 101, 116, 0, - 109, 84, 101, 116, 104, 101, - 114, 67, 111, 110, 115, 116, - 114, 97, 105, 110, 116, 83, - 99, 97, 108, 101, 0, 102, - 108, 111, 97, 116, 0, 171, - 171, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 239, 6, - 0, 0, 109, 77, 111, 116, - 105, 111, 110, 67, 111, 110, - 115, 116, 114, 97, 105, 110, - 116, 83, 99, 97, 108, 101, - 0, 109, 77, 111, 116, 105, - 111, 110, 67, 111, 110, 115, - 116, 114, 97, 105, 110, 116, - 66, 105, 97, 115, 0, 109, - 78, 117, 109, 67, 97, 112, - 115, 117, 108, 101, 115, 0, - 109, 67, 97, 112, 115, 117, - 108, 101, 79, 102, 102, 115, - 101, 116, 0, 109, 78, 117, - 109, 83, 112, 104, 101, 114, - 101, 115, 0, 109, 78, 117, - 109, 80, 108, 97, 110, 101, - 115, 0, 109, 78, 117, 109, - 67, 111, 110, 118, 101, 120, - 101, 115, 0, 109, 67, 111, - 110, 118, 101, 120, 77, 97, - 115, 107, 115, 79, 102, 102, - 115, 101, 116, 0, 109, 78, - 117, 109, 67, 111, 108, 108, - 105, 115, 105, 111, 110, 84, - 114, 105, 97, 110, 103, 108, - 101, 115, 0, 109, 69, 110, - 97, 98, 108, 101, 67, 111, - 110, 116, 105, 110, 117, 111, - 117, 115, 67, 111, 108, 108, - 105, 115, 105, 111, 110, 0, - 109, 67, 111, 108, 108, 105, - 115, 105, 111, 110, 77, 97, - 115, 115, 83, 99, 97, 108, - 101, 0, 109, 70, 114, 105, - 99, 116, 105, 111, 110, 83, - 99, 97, 108, 101, 0, 109, - 83, 101, 108, 102, 67, 111, - 108, 108, 105, 115, 105, 111, - 110, 68, 105, 115, 116, 97, - 110, 99, 101, 0, 109, 78, - 117, 109, 83, 101, 108, 102, - 67, 111, 108, 108, 105, 115, - 105, 111, 110, 73, 110, 100, - 105, 99, 101, 115, 0, 109, - 83, 101, 108, 102, 67, 111, - 108, 108, 105, 115, 105, 111, - 110, 73, 110, 100, 105, 99, - 101, 115, 79, 102, 102, 115, - 101, 116, 0, 109, 83, 101, - 108, 102, 67, 111, 108, 108, - 105, 115, 105, 111, 110, 80, - 97, 114, 116, 105, 99, 108, - 101, 115, 79, 102, 102, 115, - 101, 116, 0, 109, 83, 101, - 108, 102, 67, 111, 108, 108, - 105, 115, 105, 111, 110, 68, - 97, 116, 97, 79, 102, 102, - 115, 101, 116, 0, 109, 83, - 108, 101, 101, 112, 84, 101, - 115, 116, 73, 110, 116, 101, - 114, 118, 97, 108, 0, 109, - 83, 108, 101, 101, 112, 65, - 102, 116, 101, 114, 67, 111, - 117, 110, 116, 0, 109, 83, - 108, 101, 101, 112, 84, 104, - 114, 101, 115, 104, 111, 108, - 100, 0, 49, 6, 0, 0, - 72, 6, 0, 0, 0, 0, - 0, 0, 108, 6, 0, 0, - 72, 6, 0, 0, 4, 0, - 0, 0, 125, 6, 0, 0, - 72, 6, 0, 0, 8, 0, - 0, 0, 136, 6, 0, 0, - 72, 6, 0, 0, 12, 0, - 0, 0, 155, 6, 0, 0, - 72, 6, 0, 0, 16, 0, - 0, 0, 173, 6, 0, 0, - 72, 6, 0, 0, 20, 0, - 0, 0, 190, 6, 0, 0, - 72, 6, 0, 0, 24, 0, - 0, 0, 202, 6, 0, 0, - 72, 6, 0, 0, 28, 0, - 0, 0, 216, 6, 0, 0, - 248, 6, 0, 0, 32, 0, - 0, 0, 28, 7, 0, 0, - 248, 6, 0, 0, 36, 0, - 0, 0, 51, 7, 0, 0, - 248, 6, 0, 0, 40, 0, - 0, 0, 73, 7, 0, 0, - 72, 6, 0, 0, 44, 0, - 0, 0, 86, 7, 0, 0, - 72, 6, 0, 0, 48, 0, - 0, 0, 101, 7, 0, 0, - 72, 6, 0, 0, 52, 0, - 0, 0, 113, 7, 0, 0, - 72, 6, 0, 0, 56, 0, - 0, 0, 124, 7, 0, 0, - 72, 6, 0, 0, 60, 0, - 0, 0, 137, 7, 0, 0, - 72, 6, 0, 0, 64, 0, - 0, 0, 156, 7, 0, 0, - 72, 6, 0, 0, 68, 0, - 0, 0, 179, 7, 0, 0, - 72, 6, 0, 0, 72, 0, - 0, 0, 206, 7, 0, 0, - 248, 6, 0, 0, 76, 0, - 0, 0, 226, 7, 0, 0, - 248, 6, 0, 0, 80, 0, - 0, 0, 241, 7, 0, 0, - 248, 6, 0, 0, 84, 0, - 0, 0, 8, 8, 0, 0, - 72, 6, 0, 0, 88, 0, - 0, 0, 33, 8, 0, 0, - 72, 6, 0, 0, 92, 0, - 0, 0, 61, 8, 0, 0, - 72, 6, 0, 0, 96, 0, - 0, 0, 91, 8, 0, 0, - 72, 6, 0, 0, 100, 0, - 0, 0, 116, 8, 0, 0, - 72, 6, 0, 0, 104, 0, - 0, 0, 135, 8, 0, 0, - 72, 6, 0, 0, 108, 0, - 0, 0, 152, 8, 0, 0, - 248, 6, 0, 0, 112, 0, - 0, 0, 5, 0, 0, 0, - 1, 0, 29, 0, 0, 0, - 29, 0, 168, 8, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 37, 6, - 0, 0, 28, 6, 0, 0, - 0, 0, 0, 0, 100, 0, - 0, 0, 2, 0, 0, 0, - 188, 10, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 68, 120, 73, 116, 101, 114, - 97, 116, 105, 111, 110, 68, - 97, 116, 97, 0, 109, 73, - 110, 116, 101, 103, 114, 97, - 116, 105, 111, 110, 84, 114, - 97, 102, 111, 0, 171, 171, - 0, 0, 3, 0, 1, 0, - 1, 0, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 239, 6, 0, 0, - 109, 73, 115, 84, 117, 114, - 110, 105, 110, 103, 0, 171, - 96, 10, 0, 0, 116, 10, - 0, 0, 0, 0, 0, 0, - 152, 10, 0, 0, 72, 6, - 0, 0, 96, 0, 0, 0, - 5, 0, 0, 0, 1, 0, - 25, 0, 0, 0, 2, 0, - 164, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 80, 10, 0, 0, - 28, 6, 0, 0, 0, 0, - 0, 0, 24, 0, 0, 0, - 2, 0, 0, 0, 192, 11, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 68, 120, - 80, 104, 97, 115, 101, 67, - 111, 110, 102, 105, 103, 0, - 109, 83, 116, 105, 102, 102, - 110, 101, 115, 115, 0, 109, - 83, 116, 105, 102, 102, 110, - 101, 115, 115, 77, 117, 108, - 116, 105, 112, 108, 105, 101, - 114, 0, 109, 67, 111, 109, - 112, 114, 101, 115, 115, 105, - 111, 110, 76, 105, 109, 105, - 116, 0, 109, 83, 116, 114, - 101, 116, 99, 104, 76, 105, - 109, 105, 116, 0, 109, 70, - 105, 114, 115, 116, 67, 111, - 110, 115, 116, 114, 97, 105, - 110, 116, 0, 109, 78, 117, - 109, 67, 111, 110, 115, 116, - 114, 97, 105, 110, 116, 115, - 0, 171, 22, 11, 0, 0, - 248, 6, 0, 0, 0, 0, - 0, 0, 33, 11, 0, 0, - 248, 6, 0, 0, 4, 0, - 0, 0, 54, 11, 0, 0, - 248, 6, 0, 0, 8, 0, - 0, 0, 72, 11, 0, 0, - 248, 6, 0, 0, 12, 0, - 0, 0, 86, 11, 0, 0, - 72, 6, 0, 0, 16, 0, - 0, 0, 103, 11, 0, 0, - 72, 6, 0, 0, 20, 0, - 0, 0, 5, 0, 0, 0, - 1, 0, 6, 0, 0, 0, - 6, 0, 120, 11, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 11, - 0, 0, 28, 6, 0, 0, - 0, 0, 0, 0, 8, 0, - 0, 0, 2, 0, 0, 0, - 72, 12, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 68, 120, 67, 111, 110, 115, - 116, 114, 97, 105, 110, 116, - 0, 109, 82, 101, 115, 116, - 118, 97, 108, 117, 101, 0, - 109, 73, 110, 100, 105, 99, - 101, 115, 0, 171, 171, 171, - 25, 12, 0, 0, 248, 6, - 0, 0, 0, 0, 0, 0, - 36, 12, 0, 0, 72, 6, - 0, 0, 4, 0, 0, 0, - 5, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 2, 0, - 48, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 12, 12, 0, 0, - 28, 6, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 176, 12, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 68, 120, - 84, 101, 116, 104, 101, 114, - 0, 109, 86, 97, 108, 117, - 101, 0, 157, 12, 0, 0, - 72, 6, 0, 0, 0, 0, - 0, 0, 5, 0, 0, 0, - 1, 0, 1, 0, 0, 0, - 1, 0, 164, 12, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 12, - 0, 0, 28, 6, 0, 0, - 0, 0, 0, 0, 8, 0, - 0, 0, 2, 0, 0, 0, - 44, 13, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 73, 110, 100, 101, 120, 80, - 97, 105, 114, 0, 102, 105, - 114, 115, 116, 0, 115, 101, - 99, 111, 110, 100, 0, 171, - 6, 13, 0, 0, 72, 6, - 0, 0, 0, 0, 0, 0, - 12, 13, 0, 0, 72, 6, - 0, 0, 4, 0, 0, 0, - 5, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 2, 0, - 20, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 252, 12, 0, 0, - 28, 6, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 128, 13, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 102, 108, - 111, 97, 116, 52, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 120, 13, 0, 0, - 28, 6, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 72, 6, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 28, 6, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 128, 13, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 28, 6, 0, 0, - 0, 0, 0, 0, 12, 0, - 0, 0, 2, 0, 0, 0, - 36, 14, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 102, 108, 111, 97, 116, 51, - 0, 171, 1, 0, 3, 0, - 1, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 28, 14, - 0, 0, 28, 6, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 128, 13, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 28, 6, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 128, 13, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 28, 6, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 128, 13, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 28, 6, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 128, 13, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 28, 6, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 24, 15, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 105, 110, - 116, 51, 50, 95, 116, 0, - 0, 0, 2, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 16, 15, 0, 0, - 28, 6, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 248, 6, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 28, 6, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 128, 13, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 28, 6, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 128, 13, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 28, 6, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 72, 6, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 28, 6, - 0, 0, 0, 0, 0, 0, - 120, 0, 0, 0, 2, 0, - 0, 0, 216, 19, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 68, 120, 70, 114, - 97, 109, 101, 68, 97, 116, - 97, 0, 109, 68, 101, 118, - 105, 99, 101, 80, 97, 114, - 116, 105, 99, 108, 101, 115, - 68, 105, 114, 116, 121, 0, - 98, 111, 111, 108, 0, 171, - 0, 0, 1, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 38, 16, 0, 0, - 109, 78, 117, 109, 83, 104, - 97, 114, 101, 100, 80, 111, - 115, 105, 116, 105, 111, 110, - 115, 0, 109, 73, 116, 101, - 114, 68, 116, 0, 109, 70, - 105, 114, 115, 116, 73, 116, - 101, 114, 97, 116, 105, 111, - 110, 0, 109, 78, 117, 109, - 73, 116, 101, 114, 97, 116, - 105, 111, 110, 115, 0, 109, - 84, 101, 116, 104, 101, 114, - 67, 111, 110, 115, 116, 114, - 97, 105, 110, 116, 83, 116, - 105, 102, 102, 110, 101, 115, - 115, 0, 109, 77, 111, 116, - 105, 111, 110, 67, 111, 110, - 115, 116, 114, 97, 105, 110, - 116, 83, 116, 105, 102, 102, - 110, 101, 115, 115, 0, 109, - 83, 116, 97, 114, 116, 77, - 111, 116, 105, 111, 110, 67, - 111, 110, 115, 116, 114, 97, - 105, 110, 115, 79, 102, 102, - 115, 101, 116, 0, 109, 84, - 97, 114, 103, 101, 116, 77, - 111, 116, 105, 111, 110, 67, - 111, 110, 115, 116, 114, 97, - 105, 110, 115, 79, 102, 102, - 115, 101, 116, 0, 109, 83, - 116, 97, 114, 116, 83, 101, - 112, 97, 114, 97, 116, 105, - 111, 110, 67, 111, 110, 115, - 116, 114, 97, 105, 110, 115, - 79, 102, 102, 115, 101, 116, - 0, 109, 84, 97, 114, 103, - 101, 116, 83, 101, 112, 97, - 114, 97, 116, 105, 111, 110, - 67, 111, 110, 115, 116, 114, - 97, 105, 110, 115, 79, 102, - 102, 115, 101, 116, 0, 109, - 80, 97, 114, 116, 105, 99, - 108, 101, 65, 99, 99, 101, - 108, 101, 114, 97, 116, 105, - 111, 110, 115, 79, 102, 102, - 115, 101, 116, 0, 109, 83, - 116, 97, 114, 116, 83, 112, - 104, 101, 114, 101, 79, 102, - 102, 115, 101, 116, 0, 109, - 84, 97, 114, 103, 101, 116, - 83, 112, 104, 101, 114, 101, - 79, 102, 102, 115, 101, 116, - 0, 109, 83, 116, 97, 114, - 116, 67, 111, 108, 108, 105, - 115, 105, 111, 110, 80, 108, - 97, 110, 101, 79, 102, 102, - 115, 101, 116, 0, 109, 84, - 97, 114, 103, 101, 116, 67, - 111, 108, 108, 105, 115, 105, - 111, 110, 80, 108, 97, 110, - 101, 79, 102, 102, 115, 101, - 116, 0, 109, 83, 116, 97, - 114, 116, 67, 111, 108, 108, - 105, 115, 105, 111, 110, 84, - 114, 105, 97, 110, 103, 108, - 101, 115, 79, 102, 102, 115, - 101, 116, 0, 109, 84, 97, - 114, 103, 101, 116, 67, 111, - 108, 108, 105, 115, 105, 111, - 110, 84, 114, 105, 97, 110, - 103, 108, 101, 115, 79, 102, - 102, 115, 101, 116, 0, 109, - 83, 101, 108, 102, 67, 111, - 108, 108, 105, 115, 105, 111, - 110, 83, 116, 105, 102, 102, - 110, 101, 115, 115, 0, 109, - 80, 97, 114, 116, 105, 99, - 108, 101, 66, 111, 117, 110, - 100, 115, 0, 171, 171, 171, - 0, 0, 3, 0, 1, 0, - 1, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 239, 6, 0, 0, - 109, 83, 108, 101, 101, 112, - 80, 97, 115, 115, 67, 111, - 117, 110, 116, 101, 114, 0, - 109, 83, 108, 101, 101, 112, - 84, 101, 115, 116, 67, 111, - 117, 110, 116, 101, 114, 0, - 109, 83, 116, 105, 102, 102, - 110, 101, 115, 115, 69, 120, - 112, 111, 110, 101, 110, 116, - 0, 109, 82, 101, 115, 116, - 80, 111, 115, 105, 116, 105, - 111, 110, 115, 79, 102, 102, - 115, 101, 116, 0, 109, 73, - 110, 105, 116, 83, 101, 108, - 102, 67, 111, 108, 108, 105, - 115, 105, 111, 110, 68, 97, - 116, 97, 0, 171, 16, 16, - 0, 0, 44, 16, 0, 0, - 0, 0, 0, 0, 80, 16, - 0, 0, 72, 6, 0, 0, - 4, 0, 0, 0, 100, 16, - 0, 0, 248, 6, 0, 0, - 8, 0, 0, 0, 108, 16, - 0, 0, 72, 6, 0, 0, - 12, 0, 0, 0, 124, 16, - 0, 0, 72, 6, 0, 0, - 16, 0, 0, 0, 139, 16, - 0, 0, 248, 6, 0, 0, - 20, 0, 0, 0, 166, 16, - 0, 0, 248, 6, 0, 0, - 24, 0, 0, 0, 193, 16, - 0, 0, 72, 6, 0, 0, - 28, 0, 0, 0, 222, 16, - 0, 0, 72, 6, 0, 0, - 32, 0, 0, 0, 252, 16, - 0, 0, 72, 6, 0, 0, - 36, 0, 0, 0, 29, 17, - 0, 0, 72, 6, 0, 0, - 40, 0, 0, 0, 63, 17, - 0, 0, 72, 6, 0, 0, - 44, 0, 0, 0, 92, 17, - 0, 0, 72, 6, 0, 0, - 48, 0, 0, 0, 111, 17, - 0, 0, 72, 6, 0, 0, - 52, 0, 0, 0, 131, 17, - 0, 0, 72, 6, 0, 0, - 56, 0, 0, 0, 158, 17, - 0, 0, 72, 6, 0, 0, - 60, 0, 0, 0, 186, 17, - 0, 0, 72, 6, 0, 0, - 64, 0, 0, 0, 217, 17, - 0, 0, 72, 6, 0, 0, - 68, 0, 0, 0, 249, 17, - 0, 0, 248, 6, 0, 0, - 72, 0, 0, 0, 17, 18, - 0, 0, 36, 18, 0, 0, - 76, 0, 0, 0, 72, 18, - 0, 0, 72, 6, 0, 0, - 100, 0, 0, 0, 90, 18, - 0, 0, 72, 6, 0, 0, - 104, 0, 0, 0, 108, 18, - 0, 0, 248, 6, 0, 0, - 108, 0, 0, 0, 127, 18, - 0, 0, 72, 6, 0, 0, - 112, 0, 0, 0, 148, 18, - 0, 0, 44, 16, 0, 0, - 116, 0, 0, 0, 5, 0, - 0, 0, 1, 0, 30, 0, - 0, 0, 25, 0, 172, 18, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 4, 16, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 8, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, - 79, 83, 71, 78, 8, 0, - 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 83, 72, - 69, 88, 240, 190, 1, 0, - 80, 0, 5, 0, 188, 111, - 0, 0, 106, 8, 0, 1, - 53, 24, 0, 0, 18, 0, - 0, 0, 0, 0, 128, 63, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 63, - 162, 0, 0, 4, 0, 112, - 16, 0, 0, 0, 0, 0, - 116, 0, 0, 0, 162, 0, - 0, 4, 0, 112, 16, 0, - 2, 0, 0, 0, 100, 0, - 0, 0, 162, 0, 0, 4, - 0, 112, 16, 0, 3, 0, - 0, 0, 24, 0, 0, 0, - 162, 0, 0, 4, 0, 112, - 16, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 162, 0, - 0, 4, 0, 112, 16, 0, - 5, 0, 0, 0, 4, 0, - 0, 0, 162, 0, 0, 4, - 0, 112, 16, 0, 6, 0, - 0, 0, 8, 0, 0, 0, - 162, 0, 0, 4, 0, 112, - 16, 0, 7, 0, 0, 0, - 16, 0, 0, 0, 162, 0, - 0, 4, 0, 112, 16, 0, - 8, 0, 0, 0, 4, 0, - 0, 0, 162, 0, 0, 4, - 0, 112, 16, 0, 9, 0, - 0, 0, 16, 0, 0, 0, - 162, 0, 0, 4, 0, 112, - 16, 0, 10, 0, 0, 0, - 12, 0, 0, 0, 162, 0, - 0, 4, 0, 112, 16, 0, - 11, 0, 0, 0, 16, 0, - 0, 0, 162, 0, 0, 4, - 0, 112, 16, 0, 12, 0, - 0, 0, 16, 0, 0, 0, - 162, 0, 0, 4, 0, 112, - 16, 0, 13, 0, 0, 0, - 16, 0, 0, 0, 162, 0, - 0, 4, 0, 112, 16, 0, - 14, 0, 0, 0, 16, 0, - 0, 0, 162, 0, 0, 4, - 0, 112, 16, 0, 15, 0, - 0, 0, 4, 0, 0, 0, - 162, 0, 0, 4, 0, 112, - 16, 0, 16, 0, 0, 0, - 4, 0, 0, 0, 158, 0, - 0, 4, 0, 224, 17, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 158, 0, 0, 4, - 0, 224, 17, 0, 1, 0, - 0, 0, 16, 0, 0, 0, - 158, 0, 0, 4, 0, 224, - 17, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 158, 0, - 0, 4, 0, 224, 17, 0, - 3, 0, 0, 0, 120, 0, - 0, 0, 95, 0, 0, 2, - 18, 16, 2, 0, 95, 0, - 0, 2, 18, 32, 2, 0, - 104, 0, 0, 2, 48, 0, - 0, 0, 159, 0, 0, 4, - 0, 240, 17, 0, 0, 0, - 0, 0, 116, 0, 0, 0, - 159, 0, 0, 4, 0, 240, - 17, 0, 1, 0, 0, 0, - 120, 0, 0, 0, 159, 0, - 0, 4, 0, 240, 17, 0, - 2, 0, 0, 0, 100, 0, - 0, 0, 160, 0, 0, 5, - 0, 240, 17, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 220, 30, 0, 0, 160, 0, - 0, 5, 0, 240, 17, 0, - 4, 0, 0, 0, 4, 0, - 0, 0, 192, 0, 0, 0, - 159, 0, 0, 4, 0, 240, - 17, 0, 5, 0, 0, 0, - 36, 0, 0, 0, 160, 0, - 0, 5, 0, 240, 17, 0, - 6, 0, 0, 0, 4, 0, - 0, 0, 3, 0, 0, 0, - 155, 0, 0, 4, 0, 4, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 31, 0, - 0, 2, 10, 32, 2, 0, - 167, 0, 0, 138, 2, 163, - 3, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 0, 0, - 0, 0, 10, 16, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 0, 0, 0, 0, 167, 0, - 0, 138, 2, 163, 3, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 1, 0, 0, 0, - 10, 16, 2, 0, 1, 64, - 0, 0, 16, 0, 0, 0, - 70, 126, 16, 0, 0, 0, - 0, 0, 167, 0, 0, 138, - 2, 163, 3, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 2, 0, 0, 0, 10, 16, - 2, 0, 1, 64, 0, 0, - 32, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, - 167, 0, 0, 138, 2, 163, - 3, 128, 131, 153, 25, 0, - 50, 0, 16, 0, 3, 0, - 0, 0, 10, 16, 2, 0, - 1, 64, 0, 0, 48, 0, - 0, 0, 70, 112, 16, 0, - 0, 0, 0, 0, 167, 0, - 0, 138, 2, 163, 3, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 4, 0, 0, 0, - 10, 16, 2, 0, 1, 64, - 0, 0, 60, 0, 0, 0, - 70, 126, 16, 0, 0, 0, - 0, 0, 167, 0, 0, 138, - 2, 163, 3, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 5, 0, 0, 0, 10, 16, - 2, 0, 1, 64, 0, 0, - 76, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, - 167, 0, 0, 138, 2, 163, - 3, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 6, 0, - 0, 0, 10, 16, 2, 0, - 1, 64, 0, 0, 92, 0, - 0, 0, 70, 126, 16, 0, - 0, 0, 0, 0, 167, 0, - 0, 138, 2, 163, 3, 128, - 131, 153, 25, 0, 66, 0, - 16, 0, 3, 0, 0, 0, - 10, 16, 2, 0, 1, 64, - 0, 0, 112, 0, 0, 0, - 6, 112, 16, 0, 0, 0, - 0, 0, 166, 0, 0, 7, - 242, 240, 17, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 166, 0, 0, 7, 242, 240, - 17, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 166, 0, - 0, 7, 242, 240, 17, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 32, 0, 0, 0, - 70, 14, 16, 0, 2, 0, - 0, 0, 166, 0, 0, 7, - 50, 240, 17, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 48, 0, 0, 0, 70, 0, - 16, 0, 3, 0, 0, 0, - 166, 0, 0, 7, 242, 240, - 17, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 60, 0, - 0, 0, 70, 14, 16, 0, - 4, 0, 0, 0, 166, 0, - 0, 7, 242, 240, 17, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 76, 0, 0, 0, - 70, 14, 16, 0, 5, 0, - 0, 0, 166, 0, 0, 7, - 242, 240, 17, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 92, 0, 0, 0, 70, 14, - 16, 0, 6, 0, 0, 0, - 166, 0, 0, 7, 18, 240, - 17, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 112, 0, - 0, 0, 42, 0, 16, 0, - 3, 0, 0, 0, 167, 0, - 0, 138, 2, 195, 3, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 0, 0, 0, 0, - 10, 16, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 238, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 138, - 2, 195, 3, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 1, 0, 0, 0, 10, 16, - 2, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 70, 238, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 138, 2, 195, - 3, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 2, 0, - 0, 0, 10, 16, 2, 0, - 1, 64, 0, 0, 32, 0, - 0, 0, 70, 238, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 138, 2, 195, 3, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 3, 0, 0, 0, - 10, 16, 2, 0, 1, 64, - 0, 0, 48, 0, 0, 0, - 70, 238, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 138, - 2, 195, 3, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 4, 0, 0, 0, 10, 16, - 2, 0, 1, 64, 0, 0, - 64, 0, 0, 0, 70, 238, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 138, 2, 195, - 3, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 5, 0, - 0, 0, 10, 16, 2, 0, - 1, 64, 0, 0, 80, 0, - 0, 0, 70, 238, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 138, 2, 195, 3, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 6, 0, 0, 0, - 10, 16, 2, 0, 1, 64, - 0, 0, 96, 0, 0, 0, - 70, 238, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 138, - 2, 195, 3, 128, 131, 153, - 25, 0, 50, 0, 16, 0, - 7, 0, 0, 0, 10, 16, - 2, 0, 1, 64, 0, 0, - 112, 0, 0, 0, 70, 224, - 17, 0, 3, 0, 0, 0, - 166, 0, 0, 7, 242, 240, - 17, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 166, 0, - 0, 7, 242, 240, 17, 0, - 1, 0, 0, 0, 1, 64, - 0, 0, 16, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 166, 0, 0, 7, - 242, 240, 17, 0, 1, 0, - 0, 0, 1, 64, 0, 0, - 32, 0, 0, 0, 70, 14, - 16, 0, 2, 0, 0, 0, - 166, 0, 0, 7, 242, 240, - 17, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 48, 0, - 0, 0, 70, 14, 16, 0, - 3, 0, 0, 0, 166, 0, - 0, 7, 242, 240, 17, 0, - 1, 0, 0, 0, 1, 64, - 0, 0, 64, 0, 0, 0, - 70, 14, 16, 0, 4, 0, - 0, 0, 166, 0, 0, 7, - 242, 240, 17, 0, 1, 0, - 0, 0, 1, 64, 0, 0, - 80, 0, 0, 0, 70, 14, - 16, 0, 5, 0, 0, 0, - 166, 0, 0, 7, 242, 240, - 17, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 96, 0, - 0, 0, 70, 14, 16, 0, - 6, 0, 0, 0, 166, 0, - 0, 7, 50, 240, 17, 0, - 1, 0, 0, 0, 1, 64, - 0, 0, 112, 0, 0, 0, - 70, 0, 16, 0, 7, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 165, 0, - 0, 7, 50, 0, 16, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 240, 17, 0, 0, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 80, 0, - 0, 7, 66, 0, 16, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 183, 7, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 31, 0, 4, 3, - 42, 0, 16, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 66, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 4, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 18, 0, - 16, 0, 1, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 130, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 1, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 1, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 2, 0, 0, 0, - 58, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 0, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 1, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 2, 0, 0, 0, - 30, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 6, 0, 16, 0, 1, 0, - 0, 0, 2, 64, 0, 0, - 0, 4, 0, 0, 183, 7, - 0, 0, 110, 15, 0, 0, - 37, 23, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 2, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 2, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 58, 0, - 16, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 2, 0, 0, 0, 22, 0, - 0, 1, 59, 0, 0, 4, - 34, 0, 16, 0, 0, 0, - 0, 0, 10, 32, 2, 0, - 1, 0, 0, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 3, 0, 0, 0, 79, 0, - 0, 9, 242, 0, 16, 0, - 1, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 192, 0, 0, 0, 176, 0, - 0, 0, 3, 0, 0, 0, - 0, 2, 0, 0, 1, 0, - 0, 9, 242, 0, 16, 0, - 2, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 32, 0, 0, 0, 31, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 55, 0, - 0, 9, 66, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 2, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 191, 1, 64, 0, 0, - 0, 0, 128, 63, 30, 0, - 0, 9, 242, 0, 16, 0, - 3, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 16, 0, 0, 0, 8, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 32, 0, - 0, 7, 130, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 2, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 1, 0, 0, 0, - 85, 0, 0, 9, 50, 0, - 16, 0, 4, 0, 0, 0, - 6, 32, 2, 0, 2, 64, - 0, 0, 6, 0, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 41, 0, 0, 7, 18, 0, - 16, 0, 2, 0, 0, 0, - 26, 0, 16, 0, 4, 0, - 0, 0, 1, 64, 0, 0, - 2, 0, 0, 0, 41, 0, - 0, 6, 66, 0, 16, 0, - 4, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 4, 0, 0, 0, 42, 0, - 16, 0, 4, 0, 0, 0, - 1, 64, 0, 0, 76, 0, - 0, 0, 30, 0, 0, 10, - 82, 0, 16, 0, 2, 0, - 0, 0, 6, 2, 16, 0, - 2, 0, 0, 0, 2, 64, - 0, 0, 76, 0, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 39, 0, 0, 7, 130, 0, - 16, 0, 2, 0, 0, 0, - 58, 0, 16, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 32, 0, - 0, 7, 130, 0, 16, 0, - 2, 0, 0, 0, 58, 0, - 16, 0, 2, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 9, - 114, 0, 16, 0, 5, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 4, 0, - 0, 0, 8, 0, 0, 0, - 224, 3, 0, 0, 0, 0, - 0, 0, 39, 0, 0, 10, - 50, 0, 16, 0, 5, 0, - 0, 0, 70, 0, 16, 0, - 5, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 32, 0, 0, 10, 50, 0, - 16, 0, 5, 0, 0, 0, - 70, 0, 16, 0, 5, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 30, 0, - 0, 9, 242, 0, 16, 0, - 6, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 1, 0, 0, 0, 16, 4, - 0, 0, 16, 12, 0, 0, - 8, 4, 0, 0, 79, 0, - 0, 10, 242, 0, 16, 0, - 7, 0, 0, 0, 86, 5, - 16, 0, 2, 0, 0, 0, - 2, 64, 0, 0, 16, 0, - 0, 0, 8, 0, 0, 0, - 4, 0, 0, 0, 2, 0, - 0, 0, 79, 0, 0, 7, - 130, 0, 16, 0, 4, 0, - 0, 0, 26, 0, 16, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 30, 0, 0, 9, 242, 0, - 16, 0, 8, 0, 0, 0, - 6, 32, 2, 0, 2, 64, - 0, 0, 8, 12, 0, 0, - 4, 4, 0, 0, 4, 12, - 0, 0, 2, 4, 0, 0, - 30, 0, 0, 10, 242, 0, - 16, 0, 9, 0, 0, 0, - 70, 14, 16, 0, 3, 0, - 0, 0, 2, 64, 0, 0, - 0, 8, 0, 0, 0, 8, - 0, 0, 0, 8, 0, 0, - 0, 8, 0, 0, 30, 0, - 0, 10, 114, 0, 16, 0, - 10, 0, 0, 0, 166, 10, - 16, 0, 5, 0, 0, 0, - 2, 64, 0, 0, 0, 4, - 0, 0, 0, 8, 0, 0, - 0, 12, 0, 0, 0, 0, - 0, 0, 30, 0, 0, 10, - 50, 0, 16, 0, 11, 0, - 0, 0, 86, 5, 16, 0, - 4, 0, 0, 0, 2, 64, - 0, 0, 1, 0, 0, 0, - 1, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 140, 0, 0, 19, 242, 0, - 16, 0, 12, 0, 0, 0, - 2, 64, 0, 0, 10, 0, - 0, 0, 11, 0, 0, 0, - 10, 0, 0, 0, 5, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 0, 4, 0, 0, 0, 8, - 0, 0, 0, 12, 0, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 82, 0, 16, 0, - 11, 0, 0, 0, 6, 1, - 16, 0, 11, 0, 0, 0, - 246, 15, 16, 0, 12, 0, - 0, 0, 30, 0, 0, 9, - 242, 0, 16, 0, 13, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 2, 12, - 0, 0, 1, 4, 0, 0, - 1, 12, 0, 0, 2, 2, - 0, 0, 30, 0, 0, 10, - 50, 0, 16, 0, 14, 0, - 0, 0, 6, 0, 16, 0, - 6, 0, 0, 0, 2, 64, - 0, 0, 0, 8, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 30, 0, 0, 6, 130, 0, - 16, 0, 5, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 16, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 10, 0, 0, 0, - 58, 0, 16, 0, 13, 0, - 0, 0, 1, 64, 0, 0, - 0, 16, 0, 0, 30, 0, - 0, 9, 242, 0, 16, 0, - 15, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 1, 16, 0, 0, 0, 2, - 0, 0, 2, 18, 0, 0, - 253, 15, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 11, 0, 0, 0, 26, 0, - 16, 0, 15, 0, 0, 0, - 1, 64, 0, 0, 0, 16, - 0, 0, 80, 0, 0, 9, - 242, 0, 16, 0, 16, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 8, 0, - 0, 0, 30, 0, 0, 9, - 242, 0, 16, 0, 17, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 250, 1, - 0, 0, 241, 15, 0, 0, - 226, 1, 0, 0, 193, 15, - 0, 0, 30, 0, 0, 10, - 194, 0, 16, 0, 14, 0, - 0, 0, 6, 8, 16, 0, - 17, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 16, 0, 0, - 80, 0, 0, 9, 242, 0, - 16, 0, 18, 0, 0, 0, - 6, 32, 2, 0, 2, 64, - 0, 0, 16, 0, 0, 0, - 32, 0, 0, 0, 64, 0, - 0, 0, 128, 0, 0, 0, - 30, 0, 0, 9, 82, 0, - 16, 0, 17, 0, 0, 0, - 6, 32, 2, 0, 2, 64, - 0, 0, 130, 1, 0, 0, - 0, 0, 0, 0, 1, 15, - 0, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 12, 0, 0, 0, - 10, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 0, 16, 0, 0, 80, 0, - 0, 6, 130, 0, 16, 0, - 13, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 1, 0, 0, 30, 0, - 0, 10, 82, 0, 16, 0, - 11, 0, 0, 0, 6, 2, - 16, 0, 11, 0, 0, 0, - 2, 64, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 34, 0, 16, 0, 15, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 48, 0, - 0, 1, 165, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 80, 0, 0, 7, 18, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 15, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 3, 0, - 4, 3, 10, 0, 16, 0, - 19, 0, 0, 0, 86, 0, - 0, 5, 18, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 15, 0, 0, 0, - 0, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 86, 0, - 0, 5, 18, 0, 16, 0, - 17, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 14, 0, 0, 7, 18, 0, - 16, 0, 17, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 31, 0, - 0, 2, 10, 32, 2, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 12, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 15, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 3, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 2, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 3, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 21, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 70, 126, - 16, 0, 2, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 3, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 22, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 32, 0, 0, 0, - 70, 126, 16, 0, 2, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 3, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 23, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 48, 0, - 0, 0, 70, 126, 16, 0, - 2, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 3, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 24, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 64, 0, 0, 0, 70, 126, - 16, 0, 2, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 3, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 25, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 80, 0, 0, 0, - 70, 126, 16, 0, 2, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 3, 128, 131, 153, - 25, 0, 34, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 96, 0, - 0, 0, 6, 112, 16, 0, - 2, 0, 0, 0, 166, 0, - 0, 7, 242, 240, 17, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 20, 0, - 0, 0, 166, 0, 0, 7, - 242, 240, 17, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 70, 14, - 16, 0, 21, 0, 0, 0, - 166, 0, 0, 7, 242, 240, - 17, 0, 2, 0, 0, 0, - 1, 64, 0, 0, 32, 0, - 0, 0, 70, 14, 16, 0, - 22, 0, 0, 0, 166, 0, - 0, 7, 242, 240, 17, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 48, 0, 0, 0, - 70, 14, 16, 0, 23, 0, - 0, 0, 166, 0, 0, 7, - 242, 240, 17, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 64, 0, 0, 0, 70, 14, - 16, 0, 24, 0, 0, 0, - 166, 0, 0, 7, 242, 240, - 17, 0, 2, 0, 0, 0, - 1, 64, 0, 0, 80, 0, - 0, 0, 70, 14, 16, 0, - 25, 0, 0, 0, 166, 0, - 0, 7, 18, 240, 17, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 96, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 165, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 114, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 12, 0, 0, 0, 70, 242, - 17, 0, 2, 0, 0, 0, - 165, 0, 0, 7, 242, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 60, 0, - 0, 0, 70, 254, 17, 0, - 2, 0, 0, 0, 165, 0, - 0, 7, 242, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 24, 0, 0, 0, - 70, 254, 17, 0, 2, 0, - 0, 0, 165, 0, 0, 7, - 242, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 76, 0, 0, 0, 70, 254, - 17, 0, 2, 0, 0, 0, - 165, 0, 0, 7, 242, 0, - 16, 0, 24, 0, 0, 0, - 1, 64, 0, 0, 40, 0, - 0, 0, 70, 254, 17, 0, - 2, 0, 0, 0, 165, 0, - 0, 7, 194, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 92, 0, 0, 0, - 6, 244, 17, 0, 2, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 56, 0, 0, 0, 6, 240, - 17, 0, 2, 0, 0, 0, - 165, 0, 0, 7, 242, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 12, 0, - 0, 0, 70, 254, 17, 0, - 2, 0, 0, 0, 165, 0, - 0, 7, 18, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 36, 0, 0, 0, - 6, 240, 17, 0, 2, 0, - 0, 0, 165, 0, 0, 7, - 34, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 48, 0, 0, 0, 6, 240, - 17, 0, 2, 0, 0, 0, - 54, 0, 0, 4, 66, 0, - 16, 0, 26, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 42, 0, 16, 0, - 26, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 26, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 27, 0, 0, 0, - 42, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 10, 242, 0, - 16, 0, 28, 0, 0, 0, - 166, 10, 16, 0, 26, 0, - 0, 0, 2, 64, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 37, 23, 0, 0, - 0, 4, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 27, 0, 0, 0, 10, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 26, 0, 0, 0, 42, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 27, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 26, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 238, 17, 0, - 0, 0, 0, 0, 24, 0, - 0, 7, 18, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 55, 0, 0, 9, - 130, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 29, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 19, 0, 0, 0, - 0, 0, 0, 7, 50, 0, - 16, 0, 30, 0, 0, 0, - 70, 0, 16, 0, 20, 0, - 0, 0, 70, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 50, 0, 16, 0, - 30, 0, 0, 0, 6, 0, - 16, 0, 27, 0, 0, 0, - 198, 0, 16, 0, 21, 0, - 0, 0, 70, 0, 16, 0, - 30, 0, 0, 0, 50, 0, - 0, 9, 50, 0, 16, 0, - 30, 0, 0, 0, 6, 0, - 16, 0, 29, 0, 0, 0, - 198, 0, 16, 0, 22, 0, - 0, 0, 70, 0, 16, 0, - 30, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 29, 0, 0, 0, 26, 0, - 16, 0, 27, 0, 0, 0, - 26, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 30, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 29, 0, 0, 0, 26, 0, - 16, 0, 29, 0, 0, 0, - 26, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 29, 0, 0, 0, 42, 0, - 16, 0, 27, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 50, 0, - 0, 9, 18, 0, 16, 0, - 31, 0, 0, 0, 42, 0, - 16, 0, 29, 0, 0, 0, - 42, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 29, 0, 0, 0, 26, 0, - 16, 0, 27, 0, 0, 0, - 10, 0, 16, 0, 23, 0, - 0, 0, 26, 0, 16, 0, - 30, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 29, 0, 0, 0, 26, 0, - 16, 0, 29, 0, 0, 0, - 10, 0, 16, 0, 24, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 29, 0, 0, 0, 42, 0, - 16, 0, 27, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 50, 0, - 0, 9, 34, 0, 16, 0, - 31, 0, 0, 0, 42, 0, - 16, 0, 29, 0, 0, 0, - 26, 0, 16, 0, 24, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 27, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 29, 0, - 0, 0, 10, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 29, 0, - 0, 0, 10, 0, 16, 0, - 29, 0, 0, 0, 42, 0, - 16, 0, 24, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 29, 0, - 0, 0, 26, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 29, 0, - 0, 0, 26, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 24, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 29, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 29, 0, - 0, 0, 42, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 18, 0, 0, 1, - 0, 0, 0, 8, 50, 0, - 16, 0, 29, 0, 0, 0, - 70, 0, 16, 0, 27, 0, - 0, 0, 70, 0, 16, 128, - 65, 0, 0, 0, 29, 0, - 0, 0, 50, 0, 0, 9, - 18, 0, 16, 0, 29, 0, - 0, 0, 10, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 0, 0, 0, 7, - 18, 0, 16, 0, 31, 0, - 0, 0, 10, 0, 16, 0, - 27, 0, 0, 0, 10, 0, - 16, 0, 29, 0, 0, 0, - 50, 0, 0, 9, 18, 0, - 16, 0, 29, 0, 0, 0, - 26, 0, 16, 0, 29, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 26, 0, - 16, 0, 25, 0, 0, 0, - 0, 0, 0, 7, 34, 0, - 16, 0, 31, 0, 0, 0, - 26, 0, 16, 0, 27, 0, - 0, 0, 10, 0, 16, 0, - 29, 0, 0, 0, 0, 0, - 0, 8, 18, 0, 16, 0, - 29, 0, 0, 0, 42, 0, - 16, 0, 27, 0, 0, 0, - 42, 0, 16, 128, 65, 0, - 0, 0, 29, 0, 0, 0, - 50, 0, 0, 9, 18, 0, - 16, 0, 29, 0, 0, 0, - 10, 0, 16, 0, 29, 0, - 0, 0, 26, 0, 16, 0, - 26, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 42, 0, 16, 0, 27, 0, - 0, 0, 10, 0, 16, 0, - 29, 0, 0, 0, 21, 0, - 0, 1, 165, 0, 0, 7, - 114, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 242, - 17, 0, 2, 0, 0, 0, - 0, 0, 0, 7, 114, 0, - 16, 0, 27, 0, 0, 0, - 70, 2, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 0, - 29, 0, 0, 0, 18, 0, - 0, 1, 54, 0, 0, 5, - 50, 0, 16, 0, 31, 0, - 0, 0, 70, 0, 16, 0, - 27, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 29, 0, 0, 0, 42, 0, - 16, 0, 27, 0, 0, 0, - 21, 0, 0, 1, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 31, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 31, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 168, 0, - 0, 9, 114, 224, 17, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 27, 0, 0, 0, 54, 0, - 0, 5, 66, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 22, 0, 0, 1, 165, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 44, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 190, 24, 0, 1, - 165, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 8, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 56, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 55, 0, 0, 9, - 66, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 41, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 4, 34, 0, 16, 0, - 20, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 80, 0, 0, 7, 66, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 3, 0, - 4, 3, 42, 0, 16, 0, - 20, 0, 0, 0, 85, 0, - 0, 7, 66, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 2, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 114, 0, 16, 0, 22, 0, - 0, 0, 166, 10, 16, 0, - 20, 0, 0, 0, 2, 64, - 0, 0, 183, 7, 0, 0, - 110, 15, 0, 0, 37, 23, - 0, 0, 0, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 21, 0, 0, 0, - 26, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 21, 0, 0, 0, - 42, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 20, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 13, 0, 0, 0, 50, 0, - 0, 9, 242, 0, 16, 0, - 21, 0, 0, 0, 70, 14, - 16, 0, 23, 0, 0, 0, - 166, 10, 16, 0, 19, 0, - 0, 0, 70, 14, 16, 0, - 21, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 21, 0, - 0, 1, 30, 0, 0, 7, - 34, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 34, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 28, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 39, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 31, 0, - 4, 3, 26, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 98, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 36, 0, 0, 0, - 6, 241, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 114, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 24, 0, 0, 0, 70, 242, - 17, 0, 1, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 4, 130, 0, 16, 0, - 20, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 80, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 3, 0, - 4, 3, 10, 0, 16, 0, - 21, 0, 0, 0, 30, 0, - 0, 7, 50, 0, 16, 0, - 21, 0, 0, 0, 246, 15, - 16, 0, 20, 0, 0, 0, - 150, 5, 16, 0, 20, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 11, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 21, 0, 0, 0, - 26, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 11, 0, 0, 0, - 0, 0, 0, 8, 242, 0, - 16, 0, 21, 0, 0, 0, - 70, 14, 16, 128, 65, 0, - 0, 0, 22, 0, 0, 0, - 70, 14, 16, 0, 21, 0, - 0, 0, 50, 0, 0, 9, - 242, 0, 16, 0, 21, 0, - 0, 0, 70, 14, 16, 0, - 21, 0, 0, 0, 6, 0, - 16, 0, 17, 0, 0, 0, - 70, 14, 16, 0, 22, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 242, 0, 16, 0, 23, 0, - 0, 0, 246, 15, 16, 0, - 20, 0, 0, 0, 2, 64, - 0, 0, 183, 7, 0, 0, - 110, 15, 0, 0, 37, 23, - 0, 0, 0, 4, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 22, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 22, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 21, 0, 0, 0, - 70, 2, 16, 0, 21, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 22, 0, - 0, 0, 16, 0, 0, 7, - 18, 0, 16, 0, 24, 0, - 0, 0, 70, 2, 16, 0, - 21, 0, 0, 0, 70, 2, - 16, 0, 21, 0, 0, 0, - 0, 0, 0, 7, 18, 0, - 16, 0, 24, 0, 0, 0, - 10, 0, 16, 0, 24, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 50, 0, - 0, 11, 130, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 26, 0, 16, 128, 65, 0, - 0, 0, 19, 0, 0, 0, - 42, 0, 16, 128, 65, 0, - 0, 0, 19, 0, 0, 0, - 51, 0, 0, 7, 130, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 68, 0, - 0, 5, 18, 0, 16, 0, - 24, 0, 0, 0, 10, 0, - 16, 0, 24, 0, 0, 0, - 50, 0, 0, 9, 18, 0, - 16, 0, 24, 0, 0, 0, - 58, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 24, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 52, 0, 0, 7, 18, 0, - 16, 0, 24, 0, 0, 0, - 10, 0, 16, 0, 24, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 56, 0, - 0, 7, 18, 0, 16, 0, - 24, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 24, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 21, 0, - 0, 0, 6, 0, 16, 0, - 24, 0, 0, 0, 70, 2, - 16, 0, 21, 0, 0, 0, - 70, 2, 16, 0, 22, 0, - 0, 0, 29, 0, 0, 7, - 130, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 58, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 22, 0, 0, 1, - 21, 0, 0, 1, 165, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 20, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 24, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 24, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 32, 0, - 0, 7, 18, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 60, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 31, 0, 0, 3, 42, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 86, 0, - 0, 5, 18, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 56, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 86, 0, - 0, 5, 18, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 14, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 165, 0, - 0, 7, 50, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 28, 0, 0, 0, - 70, 240, 17, 0, 0, 0, - 0, 0, 54, 0, 0, 4, - 66, 0, 16, 0, 20, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 130, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 20, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 242, 0, 16, 0, 21, 0, - 0, 0, 166, 10, 16, 0, - 20, 0, 0, 0, 2, 64, - 0, 0, 183, 7, 0, 0, - 110, 15, 0, 0, 37, 23, - 0, 0, 0, 4, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 22, 0, 0, 0, - 26, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 22, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 54, 0, 0, 8, 114, 0, - 16, 0, 23, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 22, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 112, - 16, 0, 5, 0, 0, 0, - 1, 0, 0, 7, 18, 0, - 16, 0, 24, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 24, 0, 0, 0, 10, 0, - 16, 0, 24, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 10, 82, 0, 16, 0, - 24, 0, 0, 0, 6, 0, - 16, 0, 24, 0, 0, 0, - 2, 64, 0, 0, 183, 7, - 0, 0, 0, 0, 0, 0, - 110, 15, 0, 0, 0, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 24, 0, - 0, 0, 10, 0, 16, 0, - 24, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 24, 0, - 0, 0, 42, 0, 16, 0, - 24, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 0, 0, 0, 8, - 34, 0, 16, 0, 24, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 24, 0, 0, 0, 0, 0, - 0, 8, 82, 0, 16, 0, - 24, 0, 0, 0, 6, 1, - 16, 128, 65, 0, 0, 0, - 22, 0, 0, 0, 6, 2, - 16, 0, 24, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 24, 0, 0, 0, - 26, 0, 16, 0, 24, 0, - 0, 0, 26, 0, 16, 0, - 24, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 50, 0, 0, 9, 130, 0, - 16, 0, 24, 0, 0, 0, - 10, 0, 16, 0, 24, 0, - 0, 0, 10, 0, 16, 0, - 24, 0, 0, 0, 58, 0, - 16, 0, 24, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 24, 0, 0, 0, - 42, 0, 16, 0, 24, 0, - 0, 0, 42, 0, 16, 0, - 24, 0, 0, 0, 58, 0, - 16, 0, 24, 0, 0, 0, - 85, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 86, 0, - 0, 5, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 68, 0, - 0, 5, 130, 0, 16, 0, - 24, 0, 0, 0, 58, 0, - 16, 0, 24, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 24, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 49, 0, - 0, 7, 130, 0, 16, 0, - 24, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 50, 0, 0, 9, - 18, 0, 16, 0, 25, 0, - 0, 0, 26, 0, 16, 0, - 24, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 23, 0, - 0, 0, 50, 0, 0, 9, - 34, 0, 16, 0, 25, 0, - 0, 0, 10, 0, 16, 0, - 24, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 50, 0, 0, 9, - 66, 0, 16, 0, 25, 0, - 0, 0, 42, 0, 16, 0, - 24, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 23, 0, - 0, 0, 246, 15, 16, 0, - 24, 0, 0, 0, 70, 2, - 16, 0, 25, 0, 0, 0, - 70, 2, 16, 0, 23, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 22, 0, 0, 1, 50, 0, - 0, 9, 130, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 50, 0, - 0, 9, 18, 0, 16, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 22, 0, 0, 0, 50, 0, - 0, 9, 34, 0, 16, 0, - 22, 0, 0, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 22, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 22, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 22, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 22, 0, 0, 0, 54, 0, - 0, 5, 66, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 22, 0, 0, 1, 21, 0, - 0, 1, 54, 0, 0, 5, - 34, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 48, 0, - 0, 1, 165, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 8, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 80, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 3, 0, - 4, 3, 42, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 114, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 12, 0, 0, 0, - 70, 242, 17, 0, 0, 0, - 0, 0, 30, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 167, 0, 0, 139, 2, 195, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 3, 0, - 0, 0, 167, 0, 0, 139, - 2, 195, 0, 128, 131, 153, - 25, 0, 194, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 6, 116, 16, 0, - 3, 0, 0, 0, 165, 0, - 0, 7, 18, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 108, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 56, 0, 0, 7, - 50, 0, 16, 0, 21, 0, - 0, 0, 6, 0, 16, 0, - 20, 0, 0, 0, 70, 0, - 16, 0, 21, 0, 0, 0, - 25, 0, 0, 5, 50, 0, - 16, 0, 21, 0, 0, 0, - 70, 0, 16, 0, 21, 0, - 0, 0, 0, 0, 0, 11, - 50, 0, 16, 0, 21, 0, - 0, 0, 70, 0, 16, 128, - 65, 0, 0, 0, 21, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 39, 0, 0, 7, - 66, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 165, 0, 0, 7, 130, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 20, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 20, 0, - 0, 0, 190, 24, 0, 1, - 54, 0, 0, 4, 130, 0, - 16, 0, 20, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 18, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 10, 0, - 16, 0, 22, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 167, 0, - 0, 139, 2, 67, 0, 128, - 131, 153, 25, 0, 50, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 112, - 16, 0, 4, 0, 0, 0, - 1, 0, 0, 7, 66, 0, - 16, 0, 22, 0, 0, 0, - 26, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 0, 0, 85, 0, - 0, 7, 34, 0, 16, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 22, 0, - 0, 0, 42, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 114, 0, 16, 0, 24, 0, - 0, 0, 166, 10, 16, 0, - 22, 0, 0, 0, 2, 64, - 0, 0, 183, 7, 0, 0, - 110, 15, 0, 0, 37, 23, - 0, 0, 0, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 24, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 24, 0, 0, 0, - 26, 0, 16, 0, 24, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 25, 0, 0, 0, - 42, 0, 16, 0, 24, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 10, 114, 0, - 16, 0, 26, 0, 0, 0, - 86, 5, 16, 0, 22, 0, - 0, 0, 2, 64, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 37, 23, 0, 0, - 0, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 25, 0, 0, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 25, 0, 0, 0, 26, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 26, 0, 0, 0, 42, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 0, 0, - 0, 8, 18, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 25, 0, 0, 0, - 0, 0, 0, 8, 34, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 0, 0, 0, 8, - 66, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 24, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 27, 0, 0, 0, 10, 0, - 16, 0, 27, 0, 0, 0, - 10, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 50, 0, - 0, 9, 130, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 27, 0, 0, 0, - 26, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 27, 0, 0, 0, - 42, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 49, 0, - 0, 7, 18, 0, 16, 0, - 28, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 10, 0, 16, 0, 22, 0, - 0, 0, 68, 0, 0, 5, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 18, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 191, 1, 0, - 0, 7, 18, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 28, 0, - 0, 0, 51, 0, 0, 8, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 128, 65, 0, 0, 0, - 22, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 50, 0, 0, 9, - 18, 0, 16, 0, 22, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 10, 0, 16, 0, 22, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 0, 128, 131, 153, 25, 0, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 112, 16, 0, 16, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 25, 0, 0, 5, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 55, 0, - 0, 9, 130, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 56, 0, - 0, 7, 18, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 0, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 14, 0, - 0, 7, 18, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 56, 0, 0, 8, - 130, 0, 16, 0, 27, 0, - 0, 0, 10, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 128, 65, 0, 0, 0, - 25, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 10, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 26, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 24, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 42, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 24, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 24, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 24, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 24, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 24, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 56, 0, - 0, 7, 18, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 50, 0, 0, 9, - 66, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 27, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 27, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 50, 0, 0, 9, - 18, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 0, - 22, 0, 0, 0, 42, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 22, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 22, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 30, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 22, 0, 0, 1, - 190, 24, 0, 1, 165, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 36, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 39, 0, 0, 7, - 34, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 31, 0, 4, 3, 26, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 194, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 36, 0, 0, 0, - 6, 244, 17, 0, 1, 0, - 0, 0, 54, 0, 0, 4, - 18, 0, 16, 0, 20, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 3, 0, 4, 3, - 26, 0, 16, 0, 20, 0, - 0, 0, 30, 0, 0, 7, - 98, 0, 16, 0, 20, 0, - 0, 0, 166, 11, 16, 0, - 19, 0, 0, 0, 6, 0, - 16, 0, 20, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 21, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 12, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 22, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 12, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 22, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 21, 0, 0, 0, 70, 14, - 16, 0, 22, 0, 0, 0, - 50, 0, 0, 9, 242, 0, - 16, 0, 21, 0, 0, 0, - 70, 14, 16, 0, 22, 0, - 0, 0, 6, 0, 16, 0, - 17, 0, 0, 0, 70, 14, - 16, 0, 21, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 10, 242, 0, - 16, 0, 24, 0, 0, 0, - 6, 0, 16, 0, 20, 0, - 0, 0, 2, 64, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 37, 23, 0, 0, - 0, 4, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 24, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 24, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 24, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 21, 0, 0, 0, 70, 2, - 16, 0, 21, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 22, 0, 0, 0, - 16, 0, 0, 7, 66, 0, - 16, 0, 20, 0, 0, 0, - 70, 2, 16, 0, 21, 0, - 0, 0, 70, 2, 16, 0, - 21, 0, 0, 0, 0, 0, - 0, 7, 66, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 66, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 50, 0, - 0, 10, 66, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 51, 0, 0, 7, - 66, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 50, 0, 0, 9, 114, 0, - 16, 0, 21, 0, 0, 0, - 166, 10, 16, 0, 20, 0, - 0, 0, 70, 2, 16, 0, - 21, 0, 0, 0, 70, 2, - 16, 0, 22, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 24, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 24, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 24, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 20, 0, 0, 0, - 54, 0, 0, 5, 18, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 24, 0, - 0, 0, 22, 0, 0, 1, - 190, 24, 0, 1, 21, 0, - 0, 1, 31, 0, 4, 3, - 10, 0, 16, 0, 1, 0, - 0, 0, 165, 0, 0, 7, - 34, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 84, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 2, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 114, 0, 16, 0, 21, 0, - 0, 0, 166, 10, 16, 0, - 19, 0, 0, 0, 2, 64, - 0, 0, 183, 7, 0, 0, - 110, 15, 0, 0, 37, 23, - 0, 0, 0, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 17, 0, 0, 8, 130, 0, - 16, 0, 19, 0, 0, 0, - 70, 14, 16, 0, 20, 0, - 0, 0, 70, 158, 144, 0, - 10, 0, 16, 0, 4, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 4, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 48, 0, - 0, 1, 30, 0, 0, 7, - 18, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 32, 0, 0, 0, - 80, 0, 0, 7, 34, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 3, 0, - 4, 3, 26, 0, 16, 0, - 20, 0, 0, 0, 167, 0, - 0, 8, 34, 0, 16, 0, - 20, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 4, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 10, 114, 0, - 16, 0, 22, 0, 0, 0, - 246, 15, 16, 0, 19, 0, - 0, 0, 2, 64, 0, 0, - 215, 7, 0, 0, 142, 15, - 0, 0, 69, 23, 0, 0, - 0, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 21, 0, 0, 0, 26, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 17, 0, - 0, 8, 66, 0, 16, 0, - 20, 0, 0, 0, 70, 14, - 16, 0, 21, 0, 0, 0, - 70, 158, 144, 0, 10, 0, - 16, 0, 4, 0, 0, 0, - 56, 0, 0, 7, 66, 0, - 16, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 52, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 4, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 22, 0, 0, 1, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 26, 0, - 16, 0, 1, 0, 0, 0, - 167, 0, 0, 8, 34, 0, - 16, 0, 19, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 4, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 4, 0, - 0, 0, 52, 0, 0, 7, - 34, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 4, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 26, 0, 16, 0, - 1, 0, 0, 0, 167, 0, - 0, 8, 34, 0, 16, 0, - 19, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 4, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 4, 0, 0, 0, - 52, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 4, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 26, 0, 16, 0, 1, 0, - 0, 0, 167, 0, 0, 8, - 34, 0, 16, 0, 19, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 4, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 4, 0, 0, 0, 52, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 4, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 26, 0, - 16, 0, 1, 0, 0, 0, - 167, 0, 0, 8, 34, 0, - 16, 0, 19, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 4, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 4, 0, - 0, 0, 52, 0, 0, 7, - 34, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 4, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 26, 0, 16, 0, - 1, 0, 0, 0, 167, 0, - 0, 8, 34, 0, 16, 0, - 19, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 4, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 4, 0, 0, 0, - 52, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 4, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 0, 0, - 0, 0, 167, 0, 0, 8, - 34, 0, 16, 0, 19, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 4, 0, 0, 0, 166, 0, - 0, 7, 18, 240, 17, 0, - 1, 0, 0, 0, 10, 0, - 16, 0, 2, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 165, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 16, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 86, 0, 0, 5, - 34, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 14, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 165, 0, 0, 7, - 34, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 60, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 31, 0, 4, 3, 26, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 80, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 49, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 64, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 98, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 56, 0, 0, 0, - 6, 241, 17, 0, 1, 0, - 0, 0, 54, 0, 0, 4, - 130, 0, 16, 0, 20, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 3, 0, 4, 3, - 10, 0, 16, 0, 21, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 242, 0, 16, 0, 22, 0, - 0, 0, 246, 15, 16, 0, - 20, 0, 0, 0, 2, 64, - 0, 0, 183, 7, 0, 0, - 110, 15, 0, 0, 37, 23, - 0, 0, 0, 4, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 21, 0, 0, 0, - 26, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 21, 0, 0, 0, - 42, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 54, 0, 0, 8, 242, 0, - 16, 0, 24, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 18, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 10, 0, - 16, 0, 25, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 25, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 18, 0, - 16, 0, 25, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 112, - 16, 0, 8, 0, 0, 0, - 136, 0, 0, 5, 34, 0, - 16, 0, 25, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 30, 0, 0, 7, - 98, 0, 16, 0, 25, 0, - 0, 0, 86, 6, 16, 0, - 20, 0, 0, 0, 86, 5, - 16, 0, 25, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 26, 0, - 0, 0, 26, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 9, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 9, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 27, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 26, 0, 0, 0, 70, 14, - 16, 0, 27, 0, 0, 0, - 50, 0, 0, 9, 242, 0, - 16, 0, 26, 0, 0, 0, - 6, 0, 16, 0, 17, 0, - 0, 0, 70, 14, 16, 0, - 27, 0, 0, 0, 70, 14, - 16, 0, 26, 0, 0, 0, - 16, 0, 0, 7, 34, 0, - 16, 0, 25, 0, 0, 0, - 70, 2, 16, 0, 21, 0, - 0, 0, 70, 2, 16, 0, - 26, 0, 0, 0, 0, 0, - 0, 7, 34, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 54, 0, 0, 5, - 114, 0, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 0, - 26, 0, 0, 0, 54, 0, - 0, 5, 66, 0, 16, 0, - 25, 0, 0, 0, 10, 0, - 16, 0, 25, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 27, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 48, 0, 0, 1, - 49, 0, 0, 7, 130, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 1, 0, 0, 7, - 66, 0, 16, 0, 25, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 39, 0, 0, 7, 130, 0, - 16, 0, 26, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 3, 0, 0, 3, - 58, 0, 16, 0, 25, 0, - 0, 0, 136, 0, 0, 5, - 130, 0, 16, 0, 25, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 30, 0, - 0, 7, 50, 0, 16, 0, - 28, 0, 0, 0, 150, 5, - 16, 0, 20, 0, 0, 0, - 246, 15, 16, 0, 25, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 29, 0, 0, 0, 10, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 9, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 9, 0, 0, 0, - 0, 0, 0, 8, 242, 0, - 16, 0, 28, 0, 0, 0, - 70, 14, 16, 128, 65, 0, - 0, 0, 29, 0, 0, 0, - 70, 14, 16, 0, 28, 0, - 0, 0, 50, 0, 0, 9, - 242, 0, 16, 0, 28, 0, - 0, 0, 6, 0, 16, 0, - 17, 0, 0, 0, 70, 14, - 16, 0, 28, 0, 0, 0, - 70, 14, 16, 0, 29, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 70, 2, 16, 0, - 21, 0, 0, 0, 70, 2, - 16, 0, 28, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 49, 0, - 0, 7, 130, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 55, 0, 0, 9, - 242, 0, 16, 0, 27, 0, - 0, 0, 246, 15, 16, 0, - 25, 0, 0, 0, 70, 14, - 16, 0, 28, 0, 0, 0, - 70, 14, 16, 0, 27, 0, - 0, 0, 22, 0, 0, 1, - 49, 0, 0, 7, 18, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 26, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 27, 0, 0, 0, 246, 15, - 16, 0, 27, 0, 0, 0, - 70, 2, 16, 0, 24, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 24, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 55, 0, 0, 9, 242, 0, - 16, 0, 24, 0, 0, 0, - 6, 0, 16, 0, 25, 0, - 0, 0, 70, 14, 16, 0, - 26, 0, 0, 0, 70, 14, - 16, 0, 24, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 22, 0, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 24, 0, - 0, 0, 86, 0, 0, 5, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 24, 0, 0, 0, 14, 0, - 0, 10, 130, 0, 16, 0, - 23, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 58, 0, 16, 0, 23, 0, - 0, 0, 31, 0, 4, 3, - 42, 0, 16, 0, 19, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 25, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 226, 0, 16, 0, 25, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 233, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 18, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 80, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 16, 0, 0, 7, 34, 0, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 24, 0, - 0, 0, 70, 2, 16, 0, - 24, 0, 0, 0, 0, 0, - 0, 7, 66, 0, 16, 0, - 26, 0, 0, 0, 26, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 66, 0, 16, 0, 26, 0, - 0, 0, 42, 0, 16, 0, - 26, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 24, 0, 0, 0, - 166, 10, 16, 0, 26, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 21, 0, 0, 0, 150, 7, - 16, 128, 65, 0, 0, 0, - 25, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 70, 2, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 28, 0, - 0, 0, 50, 0, 0, 10, - 114, 0, 16, 0, 28, 0, - 0, 0, 246, 15, 16, 128, - 65, 0, 0, 0, 26, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 29, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 28, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 56, 0, - 0, 8, 18, 0, 16, 0, - 26, 0, 0, 0, 26, 0, - 16, 0, 26, 0, 0, 0, - 10, 0, 16, 128, 65, 0, - 0, 0, 26, 0, 0, 0, - 56, 0, 0, 7, 18, 0, - 16, 0, 26, 0, 0, 0, - 42, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 56, 0, - 0, 7, 18, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 56, 0, 0, 7, - 18, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 52, 0, 0, 7, 18, 0, - 16, 0, 26, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 191, 50, 0, - 0, 10, 226, 0, 16, 0, - 25, 0, 0, 0, 6, 9, - 16, 128, 65, 0, 0, 0, - 28, 0, 0, 0, 6, 0, - 16, 0, 26, 0, 0, 0, - 86, 14, 16, 0, 25, 0, - 0, 0, 168, 0, 0, 9, - 114, 224, 17, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 150, 7, 16, 0, 25, 0, - 0, 0, 21, 0, 0, 1, - 50, 0, 0, 9, 114, 0, - 16, 0, 21, 0, 0, 0, - 70, 2, 16, 0, 24, 0, - 0, 0, 246, 15, 16, 0, - 23, 0, 0, 0, 70, 2, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 58, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 21, 0, 0, 1, 54, 0, - 0, 5, 130, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 22, 0, 0, 1, 21, 0, - 0, 1, 27, 0, 0, 5, - 34, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 10, 114, 0, 16, 0, - 21, 0, 0, 0, 86, 5, - 16, 0, 19, 0, 0, 0, - 2, 64, 0, 0, 183, 7, - 0, 0, 110, 15, 0, 0, - 37, 23, 0, 0, 0, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 68, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 64, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 54, 0, - 0, 8, 114, 0, 16, 0, - 22, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 8, 50, 0, - 16, 0, 25, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 255, 255, 127, 127, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 35, 0, 0, 9, 130, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 3, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 167, 0, 0, 139, 2, 99, - 0, 128, 131, 153, 25, 0, - 114, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 114, 16, 0, 10, 0, - 0, 0, 30, 0, 0, 10, - 194, 0, 16, 0, 25, 0, - 0, 0, 246, 15, 16, 0, - 22, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 167, 0, 0, 139, 2, 99, - 0, 128, 131, 153, 25, 0, - 114, 0, 16, 0, 28, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 114, 16, 0, 10, 0, - 0, 0, 167, 0, 0, 139, - 2, 99, 0, 128, 131, 153, - 25, 0, 114, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 114, 16, 0, - 10, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 26, 0, 0, 0, 70, 2, - 16, 0, 28, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 29, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 30, 0, - 0, 0, 38, 9, 16, 0, - 28, 0, 0, 0, 150, 4, - 16, 0, 29, 0, 0, 0, - 50, 0, 0, 10, 114, 0, - 16, 0, 30, 0, 0, 0, - 150, 4, 16, 0, 28, 0, - 0, 0, 38, 9, 16, 0, - 29, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 30, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 70, 2, - 16, 0, 30, 0, 0, 0, - 70, 2, 16, 0, 30, 0, - 0, 0, 68, 0, 0, 5, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 30, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 30, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 29, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 70, 2, 16, 0, 28, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 16, 0, - 0, 7, 66, 0, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 29, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 25, 0, 0, 0, 14, 0, - 0, 10, 130, 0, 16, 0, - 25, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 58, 0, 16, 0, 25, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 192, 58, 0, - 16, 0, 26, 0, 0, 0, - 14, 0, 0, 10, 130, 0, - 16, 0, 26, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 128, 63, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 58, 0, 16, 0, - 26, 0, 0, 0, 14, 0, - 0, 10, 130, 0, 16, 0, - 28, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 58, 0, 16, 0, 23, 0, - 0, 0, 14, 0, 0, 10, - 130, 0, 16, 0, 29, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 0, 0, 128, 63, 42, 0, - 16, 0, 25, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 20, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 26, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 30, 0, - 0, 0, 70, 2, 16, 0, - 26, 0, 0, 0, 70, 2, - 16, 0, 28, 0, 0, 0, - 16, 0, 0, 7, 18, 0, - 16, 0, 31, 0, 0, 0, - 70, 2, 16, 0, 26, 0, - 0, 0, 70, 2, 16, 0, - 29, 0, 0, 0, 16, 0, - 0, 7, 18, 0, 16, 0, - 32, 0, 0, 0, 70, 2, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 30, 0, - 0, 0, 56, 0, 0, 7, - 34, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 31, 0, 0, 0, - 50, 0, 0, 10, 34, 0, - 16, 0, 31, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 26, 0, - 16, 128, 65, 0, 0, 0, - 31, 0, 0, 0, 56, 0, - 0, 7, 66, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 31, 0, 0, 0, - 42, 0, 16, 128, 65, 0, - 0, 0, 31, 0, 0, 0, - 49, 0, 0, 7, 66, 0, - 16, 0, 31, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 56, 0, - 0, 7, 34, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 31, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 31, 0, - 0, 0, 26, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 49, 0, 0, 7, 34, 0, - 16, 0, 31, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 10, 0, - 16, 0, 31, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 49, 0, - 0, 7, 130, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 58, 0, 16, 0, 25, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 22, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 128, - 65, 0, 0, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 55, 32, 0, 9, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 0, 0, 0, 8, - 66, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 51, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 52, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 29, 0, 0, 0, - 246, 15, 16, 0, 23, 0, - 0, 0, 70, 2, 16, 0, - 29, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 28, 0, 0, 0, - 246, 15, 16, 0, 22, 0, - 0, 0, 70, 2, 16, 0, - 29, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 26, 0, 0, 0, 70, 2, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 28, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 26, 0, - 0, 0, 70, 2, 16, 0, - 26, 0, 0, 0, 49, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 32, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 7, - 66, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 71, 3, 128, 63, - 55, 0, 0, 9, 34, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 26, 0, 16, 0, 32, 0, - 0, 0, 26, 0, 16, 0, - 25, 0, 0, 0, 55, 0, - 0, 9, 114, 0, 16, 0, - 22, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 30, 0, - 0, 0, 70, 2, 16, 0, - 22, 0, 0, 0, 55, 0, - 0, 9, 50, 0, 16, 0, - 25, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 70, 0, 16, 0, 32, 0, - 0, 0, 70, 0, 16, 0, - 25, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 22, 0, 0, 1, - 49, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 19, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 20, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 22, 0, 0, 0, 6, 0, - 16, 0, 25, 0, 0, 0, - 70, 2, 16, 0, 20, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 20, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 21, 0, 0, 1, - 165, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 72, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 31, 0, - 4, 3, 26, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 80, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 49, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 50, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 48, 0, 0, 0, - 70, 240, 17, 0, 1, 0, - 0, 0, 165, 0, 0, 7, - 194, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 44, 0, 0, 0, 6, 244, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 18, 0, - 16, 0, 21, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 34, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 26, 0, - 16, 0, 21, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 26, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 10, 242, 0, - 16, 0, 28, 0, 0, 0, - 6, 0, 16, 0, 21, 0, - 0, 0, 2, 64, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 37, 23, 0, 0, - 0, 4, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 26, 0, 0, 0, 10, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 26, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 226, 0, 16, 0, - 25, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 233, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 114, 0, 16, 0, - 29, 0, 0, 0, 70, 2, - 16, 0, 26, 0, 0, 0, - 54, 0, 0, 8, 114, 0, - 16, 0, 30, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 8, - 242, 0, 16, 0, 31, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 42, 0, 16, 0, 20, 0, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 22, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 167, 0, 0, 139, 2, 67, - 0, 128, 131, 153, 25, 0, - 50, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 112, 16, 0, 6, 0, - 0, 0, 30, 0, 0, 7, - 242, 0, 16, 0, 32, 0, - 0, 0, 70, 4, 16, 0, - 20, 0, 0, 0, 6, 5, - 16, 0, 32, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 33, 0, - 0, 0, 10, 0, 16, 0, - 32, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 34, 0, 0, 0, 26, 0, - 16, 0, 32, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 35, 0, 0, 0, - 42, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 36, 0, - 0, 0, 70, 14, 16, 128, - 65, 0, 0, 0, 33, 0, - 0, 0, 70, 14, 16, 0, - 34, 0, 0, 0, 50, 0, - 0, 9, 242, 0, 16, 0, - 37, 0, 0, 0, 6, 0, - 16, 0, 19, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 33, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 38, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 35, 0, 0, 0, 70, 14, - 16, 0, 32, 0, 0, 0, - 50, 0, 0, 9, 242, 0, - 16, 0, 39, 0, 0, 0, - 6, 0, 16, 0, 19, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 70, 14, - 16, 0, 35, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 39, 0, 0, 0, 58, 0, - 16, 0, 39, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 40, 0, - 0, 0, 70, 14, 16, 128, - 65, 0, 0, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 39, 0, 0, 0, 56, 0, - 0, 10, 242, 0, 16, 0, - 40, 0, 0, 0, 70, 14, - 16, 0, 40, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 63, 16, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 29, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 23, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 7, 0, - 0, 1, 21, 0, 0, 1, - 50, 0, 0, 9, 242, 0, - 16, 0, 36, 0, 0, 0, - 6, 0, 16, 0, 17, 0, - 0, 0, 70, 14, 16, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 33, 0, 0, 0, - 50, 0, 0, 9, 242, 0, - 16, 0, 38, 0, 0, 0, - 6, 0, 16, 0, 17, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 70, 14, - 16, 0, 35, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 38, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 41, 0, - 0, 0, 70, 14, 16, 128, - 65, 0, 0, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 56, 0, - 0, 10, 242, 0, 16, 0, - 42, 0, 0, 0, 70, 14, - 16, 0, 41, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 63, 16, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 70, 2, 16, 0, - 42, 0, 0, 0, 70, 2, - 16, 0, 42, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 42, 0, 0, 0, - 58, 0, 16, 0, 42, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 29, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 29, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 7, 0, 0, 1, - 21, 0, 0, 1, 0, 0, - 0, 7, 114, 0, 16, 0, - 41, 0, 0, 0, 38, 9, - 16, 0, 37, 0, 0, 0, - 38, 9, 16, 0, 39, 0, - 0, 0, 50, 0, 0, 13, - 114, 0, 16, 0, 41, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 41, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 118, 14, - 16, 0, 25, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 68, 0, - 0, 5, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 68, 0, 0, 5, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 40, 0, - 0, 0, 246, 15, 16, 0, - 22, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 40, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 43, 0, 0, 0, 150, 4, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 50, 0, 0, 10, - 114, 0, 16, 0, 41, 0, - 0, 0, 38, 9, 16, 0, - 41, 0, 0, 0, 38, 9, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 43, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 150, 7, 16, 0, 25, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 0, 0, - 0, 7, 114, 0, 16, 0, - 40, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 50, 0, 0, 13, - 114, 0, 16, 0, 43, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 40, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 70, 2, - 16, 0, 29, 0, 0, 0, - 68, 0, 0, 5, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 68, 0, 0, 5, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 63, - 58, 0, 16, 0, 36, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 44, 0, 0, 0, 246, 15, - 16, 0, 30, 0, 0, 0, - 70, 2, 16, 0, 42, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 45, 0, - 0, 0, 38, 9, 16, 0, - 43, 0, 0, 0, 150, 4, - 16, 0, 44, 0, 0, 0, - 50, 0, 0, 10, 114, 0, - 16, 0, 45, 0, 0, 0, - 150, 4, 16, 0, 43, 0, - 0, 0, 38, 9, 16, 0, - 44, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 45, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 70, 2, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 44, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 45, 0, 0, 0, 70, 2, - 16, 0, 45, 0, 0, 0, - 0, 0, 0, 7, 18, 0, - 16, 0, 46, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 50, 0, - 0, 9, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 42, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 52, 0, 0, 7, 34, 0, - 16, 0, 46, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 70, 2, - 16, 0, 41, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 33, 0, - 0, 0, 10, 0, 16, 128, - 65, 0, 0, 0, 41, 0, - 0, 0, 10, 0, 16, 0, - 41, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 34, 0, 0, 0, 70, 2, - 16, 0, 41, 0, 0, 0, - 70, 2, 16, 0, 45, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 29, 0, - 0, 0, 26, 0, 16, 0, - 46, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 35, 0, 0, 0, - 26, 0, 16, 128, 65, 0, - 0, 0, 46, 0, 0, 0, - 26, 0, 16, 0, 46, 0, - 0, 0, 10, 0, 16, 0, - 46, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 36, 0, 0, 0, - 75, 0, 0, 5, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 0, 0, - 0, 8, 130, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 35, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 51, 0, 0, 7, - 130, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 14, 0, 0, 7, 130, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 49, 0, - 0, 7, 130, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 49, 0, 0, 7, - 130, 0, 16, 0, 39, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 39, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 39, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 29, 0, - 0, 0, 26, 0, 16, 0, - 46, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 39, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 236, 81, 184, 190, 49, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 38, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 180, 1, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 41, 0, - 0, 0, 150, 7, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 29, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 45, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 41, 0, 0, 0, 246, 15, - 16, 0, 35, 0, 0, 0, - 150, 7, 16, 0, 25, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 47, 0, - 0, 0, 246, 15, 16, 0, - 23, 0, 0, 0, 70, 2, - 16, 0, 42, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 37, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 37, 0, 0, 0, - 70, 2, 16, 0, 39, 0, - 0, 0, 56, 0, 0, 10, - 114, 0, 16, 0, 37, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 68, 0, - 0, 5, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 37, 0, 0, 0, 246, 15, - 16, 0, 33, 0, 0, 0, - 70, 2, 16, 0, 47, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 35, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 50, 0, - 0, 10, 114, 0, 16, 0, - 39, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 37, 0, 0, 0, 246, 15, - 16, 0, 33, 0, 0, 0, - 70, 2, 16, 0, 47, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 0, 39, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 68, 0, - 0, 5, 130, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 45, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 0, - 45, 0, 0, 0, 70, 2, - 16, 0, 45, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 38, 0, 0, 0, 49, 0, - 0, 7, 18, 0, 16, 0, - 39, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 68, 0, 0, 5, - 34, 0, 16, 0, 39, 0, - 0, 0, 58, 0, 16, 0, - 38, 0, 0, 0, 1, 0, - 0, 7, 18, 0, 16, 0, - 39, 0, 0, 0, 26, 0, - 16, 0, 39, 0, 0, 0, - 10, 0, 16, 0, 39, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 38, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 0, - 39, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 49, 0, - 0, 8, 130, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 128, 129, 0, 0, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 50, 0, 0, 9, 114, 0, - 16, 0, 37, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 246, 15, 16, 0, - 22, 0, 0, 0, 70, 2, - 16, 0, 41, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 14, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 14, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 37, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 43, 0, - 0, 0, 50, 0, 0, 12, - 114, 0, 16, 0, 39, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 39, 0, - 0, 0, 246, 15, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 29, 0, - 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 39, 0, - 0, 0, 246, 15, 16, 0, - 29, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 29, 0, - 0, 0, 50, 0, 0, 13, - 114, 0, 16, 0, 40, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 40, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 40, 0, - 0, 0, 70, 2, 16, 0, - 44, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 36, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 5, 114, 0, 16, 0, - 29, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 7, 0, 0, 1, - 21, 0, 0, 1, 56, 0, - 0, 7, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 42, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 52, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 68, 0, - 0, 5, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 49, 0, - 0, 8, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 128, 129, 0, 0, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 50, 0, 0, 10, 114, 0, - 16, 0, 40, 0, 0, 0, - 246, 15, 16, 128, 65, 0, - 0, 0, 34, 0, 0, 0, - 70, 2, 16, 0, 42, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 30, 0, 0, 0, - 50, 0, 0, 9, 114, 0, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 0, 40, 0, - 0, 0, 246, 15, 16, 0, - 30, 0, 0, 0, 70, 2, - 16, 0, 30, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 34, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 33, 0, 0, 0, - 70, 2, 16, 0, 34, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 33, 0, - 0, 0, 6, 0, 16, 0, - 19, 0, 0, 0, 70, 2, - 16, 0, 34, 0, 0, 0, - 70, 2, 16, 0, 33, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 32, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 32, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 32, 0, 0, 0, 6, 0, - 16, 0, 19, 0, 0, 0, - 70, 2, 16, 0, 32, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 63, 1, 64, 0, 0, - 0, 0, 0, 63, 0, 0, - 0, 8, 114, 0, 16, 0, - 33, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 33, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 32, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 32, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 32, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 33, 0, - 0, 0, 70, 2, 16, 0, - 32, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 32, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 32, 0, - 0, 0, 70, 2, 16, 0, - 33, 0, 0, 0, 0, 0, - 0, 7, 114, 0, 16, 0, - 32, 0, 0, 0, 70, 2, - 16, 0, 31, 0, 0, 0, - 70, 2, 16, 0, 32, 0, - 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 33, 0, - 0, 0, 166, 10, 16, 0, - 19, 0, 0, 0, 70, 2, - 16, 0, 32, 0, 0, 0, - 70, 2, 16, 0, 31, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 55, 0, 0, 9, 114, 0, - 16, 0, 32, 0, 0, 0, - 246, 15, 16, 0, 23, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 70, 2, - 16, 0, 30, 0, 0, 0, - 55, 0, 0, 9, 242, 0, - 16, 0, 33, 0, 0, 0, - 246, 15, 16, 0, 23, 0, - 0, 0, 70, 14, 16, 0, - 33, 0, 0, 0, 70, 14, - 16, 0, 31, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 70, 2, 16, 0, - 42, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 52, 0, - 0, 7, 34, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 50, 0, 0, 10, 18, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 55, 0, - 0, 9, 50, 0, 16, 0, - 34, 0, 0, 0, 246, 15, - 16, 0, 35, 0, 0, 0, - 70, 0, 16, 0, 34, 0, - 0, 0, 70, 0, 16, 0, - 46, 0, 0, 0, 55, 0, - 0, 9, 50, 0, 16, 0, - 34, 0, 0, 0, 246, 15, - 16, 0, 29, 0, 0, 0, - 70, 0, 16, 0, 34, 0, - 0, 0, 70, 0, 16, 0, - 46, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 34, 0, 0, 0, - 26, 0, 16, 0, 34, 0, - 0, 0, 29, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 5, 114, 0, 16, 0, - 29, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 54, 0, 0, 5, 114, 0, - 16, 0, 30, 0, 0, 0, - 70, 2, 16, 0, 32, 0, - 0, 0, 54, 0, 0, 5, - 242, 0, 16, 0, 31, 0, - 0, 0, 70, 14, 16, 0, - 33, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 7, 0, 0, 1, 21, 0, - 0, 1, 54, 0, 0, 5, - 114, 0, 16, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 54, 0, - 0, 5, 114, 0, 16, 0, - 30, 0, 0, 0, 70, 2, - 16, 0, 32, 0, 0, 0, - 54, 0, 0, 5, 242, 0, - 16, 0, 31, 0, 0, 0, - 70, 14, 16, 0, 33, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 22, 0, 0, 1, 165, 0, - 0, 7, 130, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 52, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 114, 0, 16, 0, 32, 0, - 0, 0, 70, 2, 16, 0, - 29, 0, 0, 0, 54, 0, - 0, 5, 114, 0, 16, 0, - 33, 0, 0, 0, 70, 2, - 16, 0, 30, 0, 0, 0, - 54, 0, 0, 5, 242, 0, - 16, 0, 34, 0, 0, 0, - 70, 14, 16, 0, 31, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 50, 0, - 16, 0, 35, 0, 0, 0, - 70, 0, 16, 0, 20, 0, - 0, 0, 246, 15, 16, 0, - 22, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 35, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 35, 0, - 0, 0, 26, 0, 16, 0, - 35, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 35, 0, - 0, 0, 70, 14, 16, 128, - 65, 0, 0, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 35, 0, 0, 0, 50, 0, - 0, 9, 242, 0, 16, 0, - 37, 0, 0, 0, 6, 0, - 16, 0, 17, 0, 0, 0, - 70, 14, 16, 0, 35, 0, - 0, 0, 70, 14, 16, 0, - 36, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 35, 0, - 0, 0, 6, 0, 16, 0, - 19, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 32, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 37, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 38, 0, 0, 0, 150, 7, - 16, 0, 25, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 35, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 36, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 16, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 38, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 30, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 33, 0, 0, 0, 75, 0, - 0, 5, 130, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 0, 0, 0, 8, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 51, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 14, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 49, 0, 0, 7, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 236, 81, 184, 190, 49, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 180, 1, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 0, 0, - 0, 8, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 32, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 56, 0, 0, 7, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 14, 0, - 0, 7, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 30, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 14, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 246, 15, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 0, 0, 0, 7, - 114, 0, 16, 0, 39, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 0, 38, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 55, 0, 0, 9, - 114, 0, 16, 0, 32, 0, - 0, 0, 246, 15, 16, 0, - 26, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 32, 0, - 0, 0, 55, 0, 0, 9, - 242, 0, 16, 0, 36, 0, - 0, 0, 246, 15, 16, 0, - 26, 0, 0, 0, 70, 14, - 16, 0, 38, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 68, 0, 0, 5, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 58, 0, - 16, 0, 29, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 191, - 50, 0, 0, 9, 114, 0, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 246, 15, 16, 0, - 23, 0, 0, 0, 70, 2, - 16, 0, 33, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 35, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 0, 0, 0, 7, - 114, 0, 16, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 34, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 55, 0, 0, 9, 114, 0, - 16, 0, 35, 0, 0, 0, - 166, 10, 16, 0, 19, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 34, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 55, 0, - 0, 9, 114, 0, 16, 0, - 33, 0, 0, 0, 246, 15, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 33, 0, 0, 0, 55, 0, - 0, 9, 242, 0, 16, 0, - 34, 0, 0, 0, 246, 15, - 16, 0, 29, 0, 0, 0, - 70, 14, 16, 0, 35, 0, - 0, 0, 70, 14, 16, 0, - 34, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 22, 0, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 34, 0, 0, 0, - 86, 0, 0, 5, 130, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 14, 0, 0, 10, - 130, 0, 16, 0, 21, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 0, 0, 128, 63, 58, 0, - 16, 0, 21, 0, 0, 0, - 31, 0, 4, 3, 42, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 80, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 70, 2, - 16, 0, 33, 0, 0, 0, - 70, 2, 16, 0, 33, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 68, 0, 0, 5, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 32, 0, - 0, 0, 246, 15, 16, 0, - 26, 0, 0, 0, 70, 2, - 16, 0, 33, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 35, 0, 0, 0, - 150, 7, 16, 128, 65, 0, - 0, 0, 25, 0, 0, 0, - 70, 2, 16, 0, 26, 0, - 0, 0, 50, 0, 0, 10, - 114, 0, 16, 0, 35, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 34, 0, - 0, 0, 246, 15, 16, 0, - 21, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 32, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 32, 0, 0, 0, 246, 15, - 16, 128, 65, 0, 0, 0, - 29, 0, 0, 0, 70, 2, - 16, 0, 32, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 32, 0, 0, 0, 70, 2, - 16, 0, 32, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 68, 0, - 0, 5, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 56, 0, 0, 8, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 52, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 191, - 50, 0, 0, 10, 226, 0, - 16, 0, 25, 0, 0, 0, - 6, 9, 16, 128, 65, 0, - 0, 0, 32, 0, 0, 0, - 246, 15, 16, 0, 22, 0, - 0, 0, 86, 14, 16, 0, - 25, 0, 0, 0, 168, 0, - 0, 9, 114, 224, 17, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 150, 7, 16, 0, - 25, 0, 0, 0, 21, 0, - 0, 1, 50, 0, 0, 9, - 226, 0, 16, 0, 25, 0, - 0, 0, 6, 9, 16, 0, - 33, 0, 0, 0, 246, 15, - 16, 0, 21, 0, 0, 0, - 6, 9, 16, 0, 26, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 28, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 28, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 21, 0, - 0, 0, 21, 0, 0, 1, - 54, 0, 0, 5, 18, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 22, 0, 0, 1, - 18, 0, 0, 1, 165, 0, - 0, 7, 98, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 76, 0, 0, 0, - 6, 241, 17, 0, 0, 0, - 0, 0, 49, 0, 0, 10, - 98, 0, 16, 0, 19, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 166, 9, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 50, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 48, 0, 0, 0, - 70, 240, 17, 0, 1, 0, - 0, 0, 165, 0, 0, 7, - 66, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 80, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 165, 0, - 0, 7, 50, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 44, 0, 0, 0, - 70, 240, 17, 0, 0, 0, - 0, 0, 54, 0, 0, 4, - 66, 0, 16, 0, 21, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 130, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 21, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 26, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 242, 0, 16, 0, 28, 0, - 0, 0, 166, 10, 16, 0, - 21, 0, 0, 0, 2, 64, - 0, 0, 183, 7, 0, 0, - 110, 15, 0, 0, 37, 23, - 0, 0, 0, 4, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 26, 0, 0, 0, - 10, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 26, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 21, 0, 0, 0, - 42, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 54, 0, 0, 8, 226, 0, - 16, 0, 25, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 8, - 242, 0, 16, 0, 32, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 23, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 167, 0, 0, 139, 2, 67, - 0, 128, 131, 153, 25, 0, - 50, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 112, 16, 0, 6, 0, - 0, 0, 30, 0, 0, 7, - 242, 0, 16, 0, 35, 0, - 0, 0, 70, 4, 16, 0, - 20, 0, 0, 0, 6, 5, - 16, 0, 35, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 35, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 35, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 7, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 38, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 50, 0, 0, 9, 242, 0, - 16, 0, 38, 0, 0, 0, - 6, 0, 16, 0, 17, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 70, 14, - 16, 0, 36, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 39, 0, - 0, 0, 42, 0, 16, 0, - 35, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 7, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 40, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 39, 0, 0, 0, 70, 14, - 16, 0, 35, 0, 0, 0, - 50, 0, 0, 9, 242, 0, - 16, 0, 40, 0, 0, 0, - 6, 0, 16, 0, 17, 0, - 0, 0, 70, 14, 16, 0, - 40, 0, 0, 0, 70, 14, - 16, 0, 39, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 41, 0, - 0, 0, 70, 14, 16, 128, - 65, 0, 0, 0, 38, 0, - 0, 0, 70, 14, 16, 0, - 40, 0, 0, 0, 56, 0, - 0, 10, 242, 0, 16, 0, - 42, 0, 0, 0, 70, 14, - 16, 0, 41, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 63, 16, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 70, 2, 16, 0, - 42, 0, 0, 0, 70, 2, - 16, 0, 42, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 42, 0, 0, 0, - 58, 0, 16, 0, 42, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 29, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 29, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 7, 0, 0, 1, - 21, 0, 0, 1, 68, 0, - 0, 5, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 68, 0, 0, 5, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 0, 0, 0, 7, 114, 0, - 16, 0, 41, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 41, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 63, 58, 0, 16, 0, - 38, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 42, 0, 0, 0, - 246, 15, 16, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 42, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 42, 0, - 0, 0, 50, 0, 0, 13, - 114, 0, 16, 0, 41, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 41, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 70, 2, - 16, 0, 26, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 70, 2, 16, 0, - 42, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 41, 0, 0, 0, 70, 2, - 16, 0, 41, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 36, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 7, 0, 0, 1, 21, 0, - 0, 1, 56, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 42, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 52, 0, - 0, 7, 130, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 49, 0, 0, 8, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 128, - 129, 0, 0, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 41, 0, 0, 0, 246, 15, - 16, 128, 65, 0, 0, 0, - 26, 0, 0, 0, 70, 2, - 16, 0, 42, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 29, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 41, 0, 0, 0, 70, 2, - 16, 0, 41, 0, 0, 0, - 246, 15, 16, 0, 26, 0, - 0, 0, 150, 7, 16, 0, - 25, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 36, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 50, 0, 0, 9, 114, 0, - 16, 0, 36, 0, 0, 0, - 6, 0, 16, 0, 19, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 35, 0, - 0, 0, 6, 0, 16, 0, - 19, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 0, 39, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 63, - 1, 64, 0, 0, 0, 0, - 0, 63, 0, 0, 0, 8, - 114, 0, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 35, 0, - 0, 0, 246, 15, 16, 0, - 26, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 0, 0, 0, 7, - 114, 0, 16, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 32, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 55, 0, 0, 9, 114, 0, - 16, 0, 35, 0, 0, 0, - 246, 15, 16, 0, 20, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 32, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 55, 0, - 0, 9, 226, 0, 16, 0, - 25, 0, 0, 0, 246, 15, - 16, 0, 23, 0, 0, 0, - 6, 9, 16, 0, 41, 0, - 0, 0, 86, 14, 16, 0, - 25, 0, 0, 0, 55, 0, - 0, 9, 242, 0, 16, 0, - 32, 0, 0, 0, 246, 15, - 16, 0, 23, 0, 0, 0, - 70, 14, 16, 0, 35, 0, - 0, 0, 70, 14, 16, 0, - 32, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 22, 0, 0, 1, - 165, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 52, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 114, 0, 16, 0, - 35, 0, 0, 0, 150, 7, - 16, 0, 25, 0, 0, 0, - 54, 0, 0, 5, 242, 0, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 32, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 26, 0, 0, 0, - 30, 0, 0, 7, 50, 0, - 16, 0, 37, 0, 0, 0, - 70, 0, 16, 0, 20, 0, - 0, 0, 246, 15, 16, 0, - 23, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 128, - 65, 0, 0, 0, 38, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 50, 0, - 0, 9, 242, 0, 16, 0, - 39, 0, 0, 0, 6, 0, - 16, 0, 17, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 39, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 40, 0, - 0, 0, 70, 2, 16, 0, - 26, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 39, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 0, 40, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 68, 0, 0, 5, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 30, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 58, 0, 16, 0, - 30, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 191, 50, 0, - 0, 9, 114, 0, 16, 0, - 40, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 246, 15, 16, 0, 26, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 37, 0, 0, 0, 6, 0, - 16, 0, 19, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 37, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 0, 0, 0, 7, 114, 0, - 16, 0, 37, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 55, 0, - 0, 9, 114, 0, 16, 0, - 37, 0, 0, 0, 246, 15, - 16, 0, 20, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 70, 2, 16, 0, - 36, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 35, 0, - 0, 0, 246, 15, 16, 0, - 30, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 55, 0, 0, 9, - 242, 0, 16, 0, 36, 0, - 0, 0, 246, 15, 16, 0, - 30, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 22, 0, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 36, 0, 0, 0, 86, 0, - 0, 5, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 14, 0, 0, 10, 130, 0, - 16, 0, 22, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 128, 63, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 58, 0, 16, 0, - 22, 0, 0, 0, 31, 0, - 4, 3, 26, 0, 16, 0, - 19, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 114, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 226, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 80, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 68, 0, - 0, 5, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 38, 0, 0, 0, - 246, 15, 16, 0, 30, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 39, 0, 0, 0, 70, 2, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 37, 0, 0, 0, - 50, 0, 0, 10, 114, 0, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 36, 0, 0, 0, - 246, 15, 16, 0, 22, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 50, 0, 0, 10, - 114, 0, 16, 0, 38, 0, - 0, 0, 246, 15, 16, 128, - 65, 0, 0, 0, 33, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 130, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 56, 0, - 0, 8, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 191, 50, 0, - 0, 10, 114, 0, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 38, 0, 0, 0, 246, 15, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 114, 224, 17, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 21, 0, 0, 1, - 50, 0, 0, 9, 114, 0, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 246, 15, 16, 0, - 22, 0, 0, 0, 70, 2, - 16, 0, 26, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 165, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 76, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 14, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 21, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 26, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 26, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 21, 0, 0, 1, 54, 0, - 0, 5, 66, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 22, 0, 0, 1, 21, 0, - 0, 1, 165, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 84, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 72, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 51, 0, - 0, 7, 18, 0, 16, 0, - 17, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 49, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 17, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 17, 0, 0, 0, - 1, 64, 0, 0, 88, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 31, 0, 4, 3, - 42, 0, 16, 0, 1, 0, - 0, 0, 165, 0, 0, 7, - 98, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 4, 0, 0, 0, 6, 241, - 17, 0, 1, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 50, 0, - 0, 12, 98, 0, 16, 0, - 19, 0, 0, 0, 246, 15, - 16, 0, 19, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 23, 183, 209, 56, - 23, 183, 209, 56, 0, 0, - 0, 0, 166, 9, 16, 0, - 19, 0, 0, 0, 0, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 6, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 18, 0, - 0, 1, 54, 0, 0, 8, - 98, 0, 16, 0, 19, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 42, 0, - 16, 0, 1, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 6, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 6, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 1, 0, - 0, 7, 18, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 6, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 6, 0, - 0, 0, 49, 0, 0, 7, - 18, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 254, 255, 255, 255, 58, 0, - 16, 0, 19, 0, 0, 0, - 30, 0, 0, 6, 130, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 10, 32, 2, 0, - 85, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 30, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 14, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 254, 66, 42, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 84, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 14, 0, - 0, 10, 18, 0, 16, 0, - 20, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 10, 0, 16, 0, 20, 0, - 0, 0, 51, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 41, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 2, 0, 0, 0, 30, 0, - 0, 10, 50, 0, 16, 0, - 20, 0, 0, 0, 246, 15, - 16, 0, 19, 0, 0, 0, - 2, 64, 0, 0, 12, 0, - 0, 0, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 166, 0, 0, 7, - 18, 240, 17, 0, 5, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 56, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 166, 0, - 0, 7, 18, 240, 17, 0, - 5, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 166, 0, 0, 6, - 18, 240, 17, 0, 5, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 10, 32, - 2, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 165, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 100, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 41, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 116, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 31, 0, 4, 3, - 42, 0, 16, 0, 19, 0, - 0, 0, 54, 0, 0, 4, - 66, 0, 16, 0, 19, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 33, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 3, 65, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 19, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 168, 0, 0, 9, 18, 224, - 17, 0, 2, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 30, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 4, 0, 0, 22, 0, - 0, 1, 21, 0, 0, 1, - 165, 0, 0, 7, 194, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 6, 244, 17, 0, - 5, 0, 0, 0, 165, 0, - 0, 7, 50, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 4, 0, 0, 0, - 70, 240, 17, 0, 5, 0, - 0, 0, 165, 0, 0, 7, - 194, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 28, 0, 0, 0, 6, 244, - 17, 0, 5, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 92, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 39, 0, - 0, 7, 34, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 165, 0, 0, 7, - 66, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 100, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 130, 0, - 16, 0, 21, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 33, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 112, - 16, 0, 15, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 22, 0, 0, 0, - 26, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 10, 114, 0, - 16, 0, 28, 0, 0, 0, - 246, 15, 16, 0, 22, 0, - 0, 0, 2, 64, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 37, 23, 0, 0, - 0, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 26, 0, 0, 0, 10, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 26, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 26, 0, 0, 0, 42, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 17, 0, - 0, 8, 130, 0, 16, 0, - 23, 0, 0, 0, 70, 14, - 16, 0, 26, 0, 0, 0, - 70, 158, 144, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 51, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 255, 66, 52, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 27, 0, 0, 5, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 17, 0, - 0, 8, 18, 0, 16, 0, - 26, 0, 0, 0, 70, 14, - 16, 0, 26, 0, 0, 0, - 70, 158, 144, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 50, 0, 0, 9, 18, 0, - 16, 0, 26, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 20, 0, 0, 0, - 51, 0, 0, 7, 18, 0, - 16, 0, 26, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 255, 66, 52, 0, - 0, 7, 18, 0, 16, 0, - 26, 0, 0, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 27, 0, 0, 5, - 18, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 41, 0, 0, 7, - 18, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 23, 0, 0, 0, - 35, 0, 0, 9, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 1, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 129, 0, 60, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 168, 0, 0, 9, - 18, 224, 17, 0, 2, 0, - 0, 0, 26, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 50, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 96, 0, 0, 0, 70, 240, - 17, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 66, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 17, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 54, 0, - 0, 4, 18, 0, 16, 0, - 26, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 33, 0, 0, 7, 130, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 3, 0, - 4, 3, 58, 0, 16, 0, - 21, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 28, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 242, 0, 16, 0, 26, 0, - 0, 0, 6, 0, 16, 0, - 26, 0, 0, 0, 2, 64, - 0, 0, 0, 4, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 37, 23, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 168, 0, 0, 9, 242, 224, - 17, 0, 1, 0, 0, 0, - 58, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 28, 0, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 30, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 1, 64, - 0, 0, 31, 0, 0, 0, - 138, 0, 0, 9, 130, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 5, 0, - 0, 0, 1, 64, 0, 0, - 5, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 85, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 10, 0, 0, 0, 79, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 4, 0, 0, 0, - 58, 0, 16, 0, 21, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 55, 0, - 0, 9, 18, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 38, 0, - 0, 8, 0, 208, 0, 0, - 18, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 35, 0, 0, 9, 18, 0, - 16, 0, 26, 0, 0, 0, - 26, 0, 16, 0, 4, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 41, 0, 0, 7, 34, 0, - 16, 0, 26, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 5, 0, 0, 0, 41, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 5, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 26, 0, - 16, 0, 26, 0, 0, 0, - 84, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 17, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 140, 0, - 0, 10, 18, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 5, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 10, 32, - 2, 0, 54, 0, 0, 5, - 34, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 5, 194, 0, 16, 0, - 26, 0, 0, 0, 86, 9, - 16, 0, 21, 0, 0, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 18, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 32, 0, - 0, 0, 3, 0, 4, 3, - 10, 0, 16, 0, 28, 0, - 0, 0, 54, 0, 0, 8, - 50, 0, 16, 0, 28, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 66, 0, 16, 0, - 28, 0, 0, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 130, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 28, 0, - 0, 0, 79, 0, 0, 7, - 130, 0, 16, 0, 28, 0, - 0, 0, 42, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 42, 0, 16, 0, 26, 0, - 0, 0, 42, 0, 16, 0, - 28, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 85, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 26, 0, 0, 0, 1, 0, - 0, 10, 242, 0, 16, 0, - 37, 0, 0, 0, 246, 15, - 16, 0, 28, 0, 0, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 8, 0, - 0, 0, 39, 0, 0, 10, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 140, 0, 0, 16, 242, 0, - 16, 0, 37, 0, 0, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 6, 32, 2, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 190, 24, 0, 1, 31, 0, - 4, 3, 10, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 37, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 38, 0, 0, 0, - 26, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 38, 0, 0, 0, - 42, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 26, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 37, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 38, 0, 0, 0, 26, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 38, 0, 0, 0, 26, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 8, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 38, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 42, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 37, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 38, 0, - 0, 0, 42, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 38, 0, - 0, 0, 26, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 38, 0, - 0, 0, 42, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 38, 0, - 0, 0, 42, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 38, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 37, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 13, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 4, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 37, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 38, 0, 0, 0, 26, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 38, 0, 0, 0, 42, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 38, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 167, 0, 0, 9, 130, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 5, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 29, 0, 0, 0, - 10, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 30, 0, 0, 0, - 26, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 33, 0, 0, 0, - 42, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 87, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 2, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 87, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 2, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 87, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 10, 0, 16, 0, 5, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 87, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 26, 0, 16, 0, - 5, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 134, 0, - 0, 5, 130, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 10, 0, 16, 0, - 28, 0, 0, 0, 30, 0, - 0, 10, 98, 0, 16, 0, - 28, 0, 0, 0, 86, 6, - 16, 0, 28, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 22, 0, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 21, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 26, 0, - 0, 0, 42, 0, 16, 0, - 28, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 34, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 79, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 55, 0, - 0, 9, 34, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 85, 0, - 0, 7, 34, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 26, 0, - 0, 0, 1, 0, 0, 10, - 242, 0, 16, 0, 37, 0, - 0, 0, 86, 5, 16, 0, - 28, 0, 0, 0, 2, 64, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 0, 0, 8, 0, 0, 0, - 39, 0, 0, 10, 242, 0, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 140, 0, - 0, 16, 242, 0, 16, 0, - 37, 0, 0, 0, 2, 64, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 6, 32, 2, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 37, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 38, 0, - 0, 0, 10, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 38, 0, - 0, 0, 26, 0, 16, 0, - 6, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 38, 0, - 0, 0, 10, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 38, 0, - 0, 0, 42, 0, 16, 0, - 6, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 38, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 22, 0, - 0, 0, 31, 0, 4, 3, - 26, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 37, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 38, 0, 0, 0, 26, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 38, 0, 0, 0, 26, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 8, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 38, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 22, 0, 0, 0, 31, 0, - 4, 3, 42, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 37, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 38, 0, 0, 0, - 42, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 38, 0, 0, 0, - 26, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 38, 0, 0, 0, - 42, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 38, 0, 0, 0, - 42, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 21, 0, 0, 1, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 37, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 38, 0, - 0, 0, 10, 0, 16, 0, - 13, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 38, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 22, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 4, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 37, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 38, 0, 0, 0, 26, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 38, 0, 0, 0, 42, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 38, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 22, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 5, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 18, 0, - 0, 1, 54, 0, 0, 8, - 242, 0, 16, 0, 37, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 21, 0, - 0, 1, 87, 0, 0, 7, - 162, 0, 16, 0, 28, 0, - 0, 0, 166, 14, 16, 0, - 2, 0, 0, 0, 6, 4, - 16, 0, 37, 0, 0, 0, - 1, 0, 0, 7, 34, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 87, 0, - 0, 7, 50, 0, 16, 0, - 37, 0, 0, 0, 70, 0, - 16, 0, 5, 0, 0, 0, - 230, 10, 16, 0, 37, 0, - 0, 0, 1, 0, 0, 7, - 34, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 1, 0, 0, 7, 34, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 134, 0, - 0, 5, 34, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 1, 0, 0, 7, 34, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 10, 0, 16, 0, 28, 0, - 0, 0, 21, 0, 0, 1, - 31, 0, 4, 3, 10, 0, - 16, 0, 7, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 11, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 28, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 0, 2, - 10, 32, 2, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 16, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 1, 18, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 21, 0, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 1, 0, - 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 16, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 14, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 5, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 7, - 34, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 58, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 18, 0, 0, 1, 167, 0, - 0, 9, 34, 0, 16, 0, - 28, 0, 0, 0, 1, 64, - 0, 0, 1, 16, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 2, 18, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 1, 0, 0, 0, 31, 0, - 4, 3, 26, 0, 16, 0, - 16, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 11, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 18, 0, 0, 1, - 167, 0, 0, 9, 34, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 21, 0, 0, 1, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 15, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 1, 0, 0, 0, - 31, 0, 4, 3, 42, 0, - 16, 0, 16, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 15, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 18, 0, - 0, 1, 167, 0, 0, 9, - 34, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 14, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 21, 0, 0, 1, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 15, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 1, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 16, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 10, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 28, 0, - 0, 0, 42, 0, 16, 0, - 14, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 7, - 34, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 18, 0, 0, 1, 167, 0, - 0, 9, 34, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 21, 0, - 0, 1, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 15, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 1, 0, 0, 0, 31, 0, - 4, 3, 10, 0, 16, 0, - 18, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 17, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 18, 0, 0, 1, - 167, 0, 0, 9, 34, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 21, 0, 0, 1, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 15, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 1, 0, 0, 0, - 31, 0, 4, 3, 26, 0, - 16, 0, 18, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 18, 0, - 0, 1, 167, 0, 0, 9, - 34, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 10, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 21, 0, 0, 1, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 15, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 1, 0, - 0, 0, 31, 0, 4, 3, - 42, 0, 16, 0, 18, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 14, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 17, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 7, - 34, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 18, 0, 0, 1, 167, 0, - 0, 9, 34, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 21, 0, - 0, 1, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 15, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 1, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 18, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 18, 0, 0, 1, - 167, 0, 0, 9, 34, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 21, 0, 0, 1, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 15, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 1, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 13, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 18, 0, - 0, 1, 167, 0, 0, 9, - 34, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 14, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 21, 0, 0, 1, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 15, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 54, 0, 0, 5, - 34, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 28, 0, 0, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 29, 0, - 0, 0, 79, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 30, 0, 0, 0, - 42, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 85, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 26, 0, 16, 0, - 26, 0, 0, 0, 1, 0, - 0, 10, 242, 0, 16, 0, - 37, 0, 0, 0, 246, 15, - 16, 0, 33, 0, 0, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 8, 0, - 0, 0, 39, 0, 0, 10, - 242, 0, 16, 0, 38, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 140, 0, 0, 16, 242, 0, - 16, 0, 39, 0, 0, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 6, 32, 2, 0, - 70, 14, 16, 0, 38, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 39, 0, 0, 0, - 190, 24, 0, 1, 31, 0, - 4, 3, 10, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 39, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 39, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 39, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 39, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 40, 0, 0, 0, - 26, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 40, 0, 0, 0, - 42, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 39, 0, 0, 0, - 70, 14, 16, 0, 39, 0, - 0, 0, 70, 14, 16, 0, - 40, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 39, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 26, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 39, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 39, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 39, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 39, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 40, 0, 0, 0, 26, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 40, 0, 0, 0, 26, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 8, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 39, 0, 0, 0, 70, 14, - 16, 0, 39, 0, 0, 0, - 70, 14, 16, 0, 40, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 39, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 42, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 39, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 39, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 39, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 39, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 40, 0, - 0, 0, 42, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 40, 0, - 0, 0, 26, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 40, 0, - 0, 0, 42, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 40, 0, - 0, 0, 42, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 39, 0, - 0, 0, 70, 14, 16, 0, - 39, 0, 0, 0, 70, 14, - 16, 0, 40, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 39, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 39, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 39, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 39, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 39, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 39, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 39, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 39, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 13, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 39, 0, 0, 0, - 70, 14, 16, 0, 39, 0, - 0, 0, 70, 14, 16, 0, - 40, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 39, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 4, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 39, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 39, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 39, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 39, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 40, 0, 0, 0, 26, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 40, 0, 0, 0, 42, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 39, 0, 0, 0, 70, 14, - 16, 0, 39, 0, 0, 0, - 70, 14, 16, 0, 40, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 39, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 167, 0, 0, 9, 130, 0, - 16, 0, 35, 0, 0, 0, - 42, 0, 16, 0, 5, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 140, 0, 0, 11, 130, 0, - 16, 0, 33, 0, 0, 0, - 1, 64, 0, 0, 4, 0, - 0, 0, 1, 64, 0, 0, - 5, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 33, 0, - 0, 0, 26, 0, 16, 0, - 11, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 1, 64, 0, 0, - 0, 16, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 29, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 87, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 32, 0, 0, 10, 114, 0, - 16, 0, 38, 0, 0, 0, - 150, 7, 16, 0, 38, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 0, - 0, 7, 18, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 38, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 87, 0, 0, 7, 18, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 38, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 87, 0, 0, 7, - 18, 0, 16, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 38, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 138, 0, - 0, 8, 130, 0, 16, 0, - 29, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 134, 0, 0, 5, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 168, 0, - 0, 9, 18, 224, 17, 0, - 2, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 10, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 29, 0, 0, 0, - 42, 0, 16, 0, 11, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 87, 0, 0, 7, 130, 0, - 16, 0, 30, 0, 0, 0, - 42, 0, 16, 0, 2, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 87, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 2, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 87, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 10, 0, 16, 0, 5, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 87, 0, 0, 7, - 130, 0, 16, 0, 33, 0, - 0, 0, 26, 0, 16, 0, - 5, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 134, 0, - 0, 5, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 11, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 21, 0, - 0, 1, 30, 0, 0, 10, - 162, 0, 16, 0, 28, 0, - 0, 0, 86, 13, 16, 0, - 28, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, - 22, 0, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 21, 0, 0, 0, 79, 0, - 0, 7, 34, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 42, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 0, 128, 131, 153, 25, 0, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 224, 17, 0, 2, 0, - 0, 0, 55, 0, 0, 9, - 130, 0, 16, 0, 29, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 85, 0, 0, 7, - 130, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 26, 0, - 16, 0, 26, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 1, 0, 0, 10, 242, 0, - 16, 0, 37, 0, 0, 0, - 246, 15, 16, 0, 30, 0, - 0, 0, 2, 64, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 39, 0, - 0, 10, 242, 0, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 140, 0, 0, 16, - 242, 0, 16, 0, 37, 0, - 0, 0, 2, 64, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 6, 32, - 2, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 22, 0, 0, 0, 31, 0, - 4, 3, 10, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 37, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 38, 0, 0, 0, - 26, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 38, 0, 0, 0, - 42, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 21, 0, 0, 1, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 31, 0, 4, 3, 26, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 37, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 38, 0, - 0, 0, 26, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 6, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 38, 0, - 0, 0, 26, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 38, 0, - 0, 0, 10, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 38, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 22, 0, - 0, 0, 31, 0, 4, 3, - 42, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 37, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 38, 0, 0, 0, 42, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 38, 0, 0, 0, 26, 0, - 16, 0, 8, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 38, 0, 0, 0, 42, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 38, 0, 0, 0, 42, 0, - 16, 0, 8, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 38, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 22, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 37, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 13, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 21, 0, 0, 1, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 4, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 37, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 38, 0, - 0, 0, 10, 0, 16, 0, - 6, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 38, 0, - 0, 0, 26, 0, 16, 0, - 13, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 38, 0, - 0, 0, 10, 0, 16, 0, - 14, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 38, 0, - 0, 0, 42, 0, 16, 0, - 13, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 38, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 22, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 5, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 10, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 10, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 10, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 1, 0, 0, 10, - 242, 0, 16, 0, 38, 0, - 0, 0, 246, 15, 16, 0, - 30, 0, 0, 0, 2, 64, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 0, 0, 8, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 10, 0, 16, 0, 38, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 87, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 39, 0, 0, 10, - 114, 0, 16, 0, 38, 0, - 0, 0, 150, 7, 16, 0, - 38, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 32, 0, 0, 10, 114, 0, - 16, 0, 38, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 0, - 0, 7, 114, 0, 16, 0, - 38, 0, 0, 0, 150, 7, - 16, 0, 37, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 10, 0, - 16, 0, 38, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 33, 0, 0, 0, - 26, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 42, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 140, 0, 0, 11, - 130, 0, 16, 0, 30, 0, - 0, 0, 1, 64, 0, 0, - 4, 0, 0, 0, 1, 64, - 0, 0, 5, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 30, 0, 0, 0, 26, 0, - 16, 0, 11, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 30, 0, 0, 0, 1, 64, - 0, 0, 0, 16, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 138, 0, 0, 8, 130, 0, - 16, 0, 33, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 134, 0, 0, 5, - 130, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 18, 0, 0, 1, - 54, 0, 0, 8, 242, 0, - 16, 0, 37, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 30, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 21, 0, - 0, 1, 31, 0, 4, 3, - 26, 0, 16, 0, 28, 0, - 0, 0, 30, 0, 0, 7, - 34, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 168, 0, 0, 9, 18, 224, - 17, 0, 2, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 22, 0, - 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 28, 0, - 0, 0, 42, 0, 16, 0, - 11, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 87, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 42, 0, 16, 0, - 2, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 87, 0, 0, 7, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 2, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 87, 0, 0, 7, - 50, 0, 16, 0, 37, 0, - 0, 0, 70, 0, 16, 0, - 5, 0, 0, 0, 230, 10, - 16, 0, 37, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 134, 0, 0, 5, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 11, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 21, 0, - 0, 1, 30, 0, 0, 7, - 34, 0, 16, 0, 26, 0, - 0, 0, 26, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 5, 34, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 26, 0, - 0, 0, 42, 0, 16, 0, - 26, 0, 0, 0, 54, 0, - 0, 5, 66, 0, 16, 0, - 26, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 22, 0, 0, 1, 54, 0, - 0, 4, 18, 0, 16, 0, - 21, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 33, 0, 0, 7, 66, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 3, 0, - 4, 3, 42, 0, 16, 0, - 21, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 26, 0, 16, 0, 21, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 0, 128, 131, 153, - 25, 0, 130, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 224, 17, 0, - 2, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 167, 0, 0, 139, - 2, 35, 0, 128, 131, 153, - 25, 0, 66, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 224, 17, 0, - 2, 0, 0, 0, 42, 0, - 0, 10, 194, 0, 16, 0, - 21, 0, 0, 0, 166, 14, - 16, 0, 21, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 55, 0, 0, 9, 66, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 39, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 22, 0, 0, 0, 30, 0, - 0, 7, 194, 0, 16, 0, - 21, 0, 0, 0, 86, 5, - 16, 0, 19, 0, 0, 0, - 166, 14, 16, 0, 21, 0, - 0, 0, 168, 0, 0, 9, - 18, 224, 17, 0, 2, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 30, 0, 0, 7, - 66, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 168, 0, 0, 9, 18, 224, - 17, 0, 2, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 21, 0, 0, 1, 30, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 4, - 0, 0, 22, 0, 0, 1, - 165, 0, 0, 7, 50, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 96, 0, - 0, 0, 70, 240, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 4, 18, 0, 16, 0, - 26, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 33, 0, 0, 7, 66, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 3, 0, - 4, 3, 42, 0, 16, 0, - 21, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 21, 0, 0, 0, 26, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 0, 128, 131, 153, - 25, 0, 66, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 224, 17, 0, - 2, 0, 0, 0, 1, 0, - 0, 7, 66, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 0, 0, 30, 0, 0, 7, - 66, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 238, 17, 0, 1, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 30, 0, 0, 10, - 242, 0, 16, 0, 26, 0, - 0, 0, 6, 0, 16, 0, - 26, 0, 0, 0, 2, 64, - 0, 0, 0, 4, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 37, 23, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 84, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 34, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 165, 0, - 0, 7, 66, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 100, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 112, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 54, 0, 0, 4, 130, 0, - 16, 0, 22, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 33, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 10, 242, 0, 16, 0, - 37, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 2, 64, 0, 0, 183, 7, - 0, 0, 110, 15, 0, 0, - 37, 23, 0, 0, 0, 4, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 26, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 26, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 7, - 34, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 114, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 114, 16, 0, 14, 0, - 0, 0, 17, 0, 0, 8, - 34, 0, 16, 0, 28, 0, - 0, 0, 70, 14, 16, 0, - 26, 0, 0, 0, 70, 158, - 144, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 50, 0, - 0, 9, 34, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 51, 0, - 0, 7, 34, 0, 16, 0, - 28, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 255, 66, 52, 0, 0, 7, - 34, 0, 16, 0, 28, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 27, 0, 0, 5, 34, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 17, 0, 0, 8, - 130, 0, 16, 0, 29, 0, - 0, 0, 70, 14, 16, 0, - 26, 0, 0, 0, 70, 158, - 144, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 51, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 255, 66, 52, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 27, 0, 0, 5, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 35, 0, 0, 9, - 34, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 1, 64, - 0, 0, 128, 0, 0, 0, - 26, 0, 16, 0, 28, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 1, 64, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 54, 0, - 0, 8, 114, 0, 16, 0, - 38, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 33, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 54, 0, 0, 5, - 130, 0, 16, 0, 35, 0, - 0, 0, 26, 0, 16, 0, - 28, 0, 0, 0, 48, 0, - 0, 1, 34, 0, 0, 7, - 130, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 38, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 38, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 18, 0, - 16, 0, 39, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 30, 0, 0, 10, 226, 0, - 16, 0, 39, 0, 0, 0, - 246, 15, 16, 0, 38, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 38, 0, 0, 0, - 26, 0, 16, 0, 39, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 0, 128, 131, 153, 25, 0, - 34, 0, 16, 0, 39, 0, - 0, 0, 42, 0, 16, 0, - 39, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 224, 17, 0, 2, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 0, 128, 131, 153, - 25, 0, 66, 0, 16, 0, - 39, 0, 0, 0, 58, 0, - 16, 0, 39, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 224, 17, 0, - 2, 0, 0, 0, 84, 0, - 0, 7, 18, 0, 16, 0, - 39, 0, 0, 0, 58, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 39, 0, - 0, 0, 84, 0, 0, 7, - 18, 0, 16, 0, 39, 0, - 0, 0, 26, 0, 16, 0, - 39, 0, 0, 0, 10, 0, - 16, 0, 39, 0, 0, 0, - 36, 0, 0, 7, 130, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 26, 0, 16, 0, - 39, 0, 0, 0, 36, 0, - 0, 7, 130, 0, 16, 0, - 38, 0, 0, 0, 42, 0, - 16, 0, 39, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 36, 0, 0, 7, - 130, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 38, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 226, 0, - 16, 0, 39, 0, 0, 0, - 6, 9, 16, 0, 38, 0, - 0, 0, 54, 0, 0, 5, - 18, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 54, 0, - 0, 5, 34, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 39, 0, 0, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 66, 0, 16, 0, - 40, 0, 0, 0, 26, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 3, 0, 4, 3, - 42, 0, 16, 0, 40, 0, - 0, 0, 39, 0, 0, 7, - 66, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 40, 0, 0, 0, - 31, 0, 4, 3, 42, 0, - 16, 0, 40, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 41, 0, 0, 0, - 26, 0, 16, 0, 40, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 10, 114, 0, - 16, 0, 42, 0, 0, 0, - 86, 5, 16, 0, 40, 0, - 0, 0, 2, 64, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 37, 23, 0, 0, - 0, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 41, 0, 0, 0, 10, 0, - 16, 0, 42, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 41, 0, 0, 0, 26, 0, - 16, 0, 42, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 40, 0, 0, 0, 42, 0, - 16, 0, 42, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 41, 0, 0, 0, 70, 2, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 41, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 70, 2, 16, 0, - 41, 0, 0, 0, 49, 0, - 0, 7, 130, 0, 16, 0, - 41, 0, 0, 0, 26, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 40, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 41, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 41, 0, - 0, 0, 26, 0, 16, 0, - 40, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 5, 34, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 41, 0, - 0, 0, 7, 0, 0, 1, - 21, 0, 0, 1, 165, 0, - 0, 7, 130, 0, 16, 0, - 41, 0, 0, 0, 1, 64, - 0, 0, 112, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 39, 0, 0, 7, - 18, 0, 16, 0, 42, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 31, 0, 4, 3, 10, 0, - 16, 0, 42, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 42, 0, 0, 0, - 1, 64, 0, 0, 100, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 42, 0, 0, 0, 26, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 42, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 0, 128, 131, 153, - 25, 0, 18, 0, 16, 0, - 42, 0, 0, 0, 10, 0, - 16, 0, 42, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 224, 17, 0, - 2, 0, 0, 0, 1, 0, - 0, 7, 18, 0, 16, 0, - 42, 0, 0, 0, 10, 0, - 16, 0, 42, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 41, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 10, 0, - 16, 0, 42, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 114, 0, 16, 0, 42, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 114, 16, 0, 14, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 42, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 42, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 41, 0, 0, 0, 70, 2, - 16, 0, 42, 0, 0, 0, - 70, 2, 16, 0, 42, 0, - 0, 0, 29, 0, 0, 7, - 18, 0, 16, 0, 42, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 41, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 42, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 42, 0, 0, 0, - 26, 0, 16, 0, 40, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 5, 34, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 42, 0, 0, 0, - 7, 0, 0, 1, 21, 0, - 0, 1, 0, 0, 0, 7, - 130, 0, 16, 0, 41, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 14, 0, 0, 7, 130, 0, - 16, 0, 41, 0, 0, 0, - 26, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 68, 0, - 0, 5, 130, 0, 16, 0, - 41, 0, 0, 0, 58, 0, - 16, 0, 41, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 41, 0, 0, 0, - 58, 0, 16, 0, 41, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 191, 51, 0, - 0, 7, 130, 0, 16, 0, - 41, 0, 0, 0, 58, 0, - 16, 0, 41, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 18, 0, 0, 1, - 54, 0, 0, 5, 130, 0, - 16, 0, 41, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 21, 0, 0, 1, - 0, 0, 0, 7, 130, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 40, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 68, 0, - 0, 5, 130, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 40, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 191, - 52, 0, 0, 7, 130, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 40, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 56, 0, - 0, 7, 18, 0, 16, 0, - 42, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 40, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 41, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 10, 0, - 16, 0, 42, 0, 0, 0, - 0, 0, 0, 7, 66, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 42, 0, 16, 0, - 40, 0, 0, 0, 14, 0, - 0, 7, 66, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 41, 0, 0, 0, - 42, 0, 16, 0, 40, 0, - 0, 0, 50, 0, 0, 9, - 226, 0, 16, 0, 39, 0, - 0, 0, 166, 10, 16, 0, - 40, 0, 0, 0, 6, 9, - 16, 0, 41, 0, 0, 0, - 86, 14, 16, 0, 39, 0, - 0, 0, 0, 0, 0, 7, - 18, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 40, 0, 0, 0, - 21, 0, 0, 1, 30, 0, - 0, 7, 34, 0, 16, 0, - 40, 0, 0, 0, 26, 0, - 16, 0, 40, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 22, 0, 0, 1, - 54, 0, 0, 5, 114, 0, - 16, 0, 38, 0, 0, 0, - 150, 7, 16, 0, 39, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 33, 0, - 0, 0, 10, 0, 16, 0, - 40, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 1, 64, 0, 0, 128, 0, - 0, 0, 22, 0, 0, 1, - 165, 0, 0, 7, 18, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 72, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 56, 0, - 0, 7, 18, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 10, 0, 16, 0, 26, 0, - 0, 0, 14, 0, 0, 7, - 18, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 96, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 26, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 114, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 226, 17, 0, - 1, 0, 0, 0, 50, 0, - 0, 9, 210, 0, 16, 0, - 26, 0, 0, 0, 6, 9, - 16, 0, 38, 0, 0, 0, - 6, 0, 16, 0, 26, 0, - 0, 0, 6, 9, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 114, 224, 17, 0, - 1, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 134, 3, 16, 0, - 26, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 96, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 18, 0, - 16, 0, 20, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 33, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 19, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 1, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 30, 0, 0, 10, 242, 0, - 16, 0, 20, 0, 0, 0, - 6, 0, 16, 0, 20, 0, - 0, 0, 2, 64, 0, 0, - 0, 4, 0, 0, 183, 7, - 0, 0, 110, 15, 0, 0, - 37, 23, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 22, 0, - 0, 1, 165, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 100, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 66, 0, - 16, 0, 19, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 33, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 19, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 85, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 168, 0, 0, 9, - 18, 224, 17, 0, 2, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 30, 0, 0, 7, - 18, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 168, 0, 0, 9, 18, 224, - 17, 0, 2, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 30, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 4, 0, 0, 22, 0, - 0, 1, 21, 0, 0, 1, - 31, 0, 0, 2, 10, 32, - 2, 0, 165, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 8, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 56, 0, 0, 7, 18, 0, - 16, 0, 17, 0, 0, 0, - 10, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 122, 68, 28, 0, - 0, 5, 18, 0, 16, 0, - 17, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 83, 0, 0, 7, 18, 0, - 16, 0, 17, 0, 0, 0, - 10, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 165, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 104, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 166, 0, 0, 7, 18, 240, - 17, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 104, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 165, 0, 0, 7, 18, 0, - 16, 0, 17, 0, 0, 0, - 1, 64, 0, 0, 104, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 165, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 104, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 80, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 17, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 17, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 18, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 34, 0, - 16, 0, 19, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 3, 0, 4, 3, 42, 0, - 16, 0, 19, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 10, 114, 0, - 16, 0, 21, 0, 0, 0, - 86, 5, 16, 0, 19, 0, - 0, 0, 2, 64, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 178, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 232, 17, 0, - 0, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 20, 0, 0, 0, 70, 2, - 16, 0, 20, 0, 0, 0, - 70, 3, 16, 128, 65, 0, - 0, 0, 21, 0, 0, 0, - 52, 0, 0, 9, 66, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 128, 129, 0, - 0, 0, 20, 0, 0, 0, - 10, 0, 16, 128, 129, 0, - 0, 0, 20, 0, 0, 0, - 52, 0, 0, 8, 66, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 128, 129, 0, - 0, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 52, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 54, 0, 0, 5, 34, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 22, 0, 0, 1, - 31, 0, 0, 2, 10, 32, - 2, 0, 165, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 100, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 17, 0, 0, 0, - 10, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 166, 0, - 0, 7, 18, 240, 17, 0, - 1, 0, 0, 0, 1, 64, - 0, 0, 100, 0, 0, 0, - 10, 0, 16, 0, 17, 0, - 0, 0, 165, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 104, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 104, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 30, 0, - 0, 8, 18, 0, 16, 0, - 17, 0, 0, 0, 10, 0, - 16, 128, 65, 0, 0, 0, - 17, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 166, 0, 0, 7, 18, 240, - 17, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 104, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 21, 0, - 0, 1, 165, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 112, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 8, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 56, 0, - 0, 7, 18, 0, 16, 0, - 17, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 49, 0, 0, 7, - 18, 0, 16, 0, 17, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 17, 0, 0, 0, - 166, 0, 0, 7, 18, 240, - 17, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 100, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 30, 0, 0, 7, 34, 0, - 16, 0, 15, 0, 0, 0, - 26, 0, 16, 0, 15, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 22, 0, - 0, 1, 190, 24, 0, 1, - 165, 0, 0, 7, 98, 0, - 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 241, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 4, 18, 0, 16, 0, - 1, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 80, 0, 0, 7, 130, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 1, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 3, 0, - 4, 3, 58, 0, 16, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 1, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 2, 0, - 0, 0, 10, 0, 16, 0, - 1, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 242, 0, 16, 0, 1, 0, - 0, 0, 6, 0, 16, 0, - 1, 0, 0, 0, 2, 64, - 0, 0, 0, 4, 0, 0, - 183, 7, 0, 0, 110, 15, - 0, 0, 37, 23, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 2, 0, 0, 0, - 26, 0, 16, 0, 1, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 2, 0, 0, 0, - 42, 0, 16, 0, 1, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 2, 0, 0, 0, - 58, 0, 16, 0, 1, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 168, 0, 0, 9, 242, 224, - 17, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 2, 0, 0, 0, - 22, 0, 0, 1, 18, 0, - 0, 1, 165, 0, 0, 7, - 34, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 4, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 59, 0, 0, 4, 66, 0, - 16, 0, 0, 0, 0, 0, - 10, 32, 2, 0, 1, 0, - 0, 7, 66, 0, 16, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 3, 0, - 0, 0, 79, 0, 0, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 192, 0, - 0, 0, 176, 0, 0, 0, - 3, 0, 0, 0, 0, 2, - 0, 0, 1, 0, 0, 9, - 242, 0, 16, 0, 2, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 32, 0, - 0, 0, 31, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 55, 0, 0, 9, - 130, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 191, - 1, 64, 0, 0, 0, 0, - 128, 63, 30, 0, 0, 9, - 242, 0, 16, 0, 3, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 16, 0, - 0, 0, 8, 0, 0, 0, - 4, 0, 0, 0, 2, 0, - 0, 0, 32, 0, 0, 7, - 18, 0, 16, 0, 2, 0, - 0, 0, 26, 0, 16, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 7, 18, 0, - 16, 0, 2, 0, 0, 0, - 10, 0, 16, 0, 1, 0, - 0, 0, 10, 0, 16, 0, - 2, 0, 0, 0, 85, 0, - 0, 9, 50, 0, 16, 0, - 4, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 6, 0, 0, 0, 5, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 41, 0, - 0, 7, 66, 0, 16, 0, - 4, 0, 0, 0, 26, 0, - 16, 0, 4, 0, 0, 0, - 1, 64, 0, 0, 2, 0, - 0, 0, 41, 0, 0, 6, - 130, 0, 16, 0, 4, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 3, 0, - 0, 0, 30, 0, 0, 10, - 194, 0, 16, 0, 4, 0, - 0, 0, 166, 14, 16, 0, - 4, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 76, 0, - 0, 0, 76, 0, 0, 0, - 30, 0, 0, 7, 66, 0, - 16, 0, 2, 0, 0, 0, - 42, 0, 16, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 39, 0, - 0, 7, 130, 0, 16, 0, - 2, 0, 0, 0, 58, 0, - 16, 0, 2, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 7, - 130, 0, 16, 0, 2, 0, - 0, 0, 58, 0, 16, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 9, 114, 0, - 16, 0, 5, 0, 0, 0, - 6, 32, 2, 0, 2, 64, - 0, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 224, 3, - 0, 0, 0, 0, 0, 0, - 39, 0, 0, 10, 50, 0, - 16, 0, 5, 0, 0, 0, - 70, 0, 16, 0, 5, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32, 0, - 0, 10, 50, 0, 16, 0, - 5, 0, 0, 0, 70, 0, - 16, 0, 5, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 30, 0, 0, 9, - 242, 0, 16, 0, 6, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 16, 4, 0, 0, - 16, 12, 0, 0, 8, 4, - 0, 0, 79, 0, 0, 10, - 242, 0, 16, 0, 7, 0, - 0, 0, 86, 5, 16, 0, - 2, 0, 0, 0, 2, 64, - 0, 0, 16, 0, 0, 0, - 8, 0, 0, 0, 4, 0, - 0, 0, 2, 0, 0, 0, - 79, 0, 0, 7, 130, 0, - 16, 0, 5, 0, 0, 0, - 26, 0, 16, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 30, 0, - 0, 9, 242, 0, 16, 0, - 8, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 8, 12, 0, 0, 4, 4, - 0, 0, 4, 12, 0, 0, - 2, 4, 0, 0, 30, 0, - 0, 10, 242, 0, 16, 0, - 9, 0, 0, 0, 70, 14, - 16, 0, 3, 0, 0, 0, - 2, 64, 0, 0, 0, 8, - 0, 0, 0, 8, 0, 0, - 0, 8, 0, 0, 0, 8, - 0, 0, 30, 0, 0, 10, - 114, 0, 16, 0, 10, 0, - 0, 0, 166, 10, 16, 0, - 5, 0, 0, 0, 2, 64, - 0, 0, 0, 4, 0, 0, - 0, 8, 0, 0, 0, 12, - 0, 0, 0, 0, 0, 0, - 30, 0, 0, 10, 50, 0, - 16, 0, 11, 0, 0, 0, - 86, 5, 16, 0, 4, 0, - 0, 0, 2, 64, 0, 0, - 1, 0, 0, 0, 1, 2, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 140, 0, - 0, 19, 242, 0, 16, 0, - 12, 0, 0, 0, 2, 64, - 0, 0, 10, 0, 0, 0, - 11, 0, 0, 0, 10, 0, - 0, 0, 5, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 0, 4, - 0, 0, 0, 8, 0, 0, - 0, 12, 0, 0, 0, 0, - 0, 0, 30, 0, 0, 7, - 82, 0, 16, 0, 11, 0, - 0, 0, 6, 1, 16, 0, - 11, 0, 0, 0, 246, 15, - 16, 0, 12, 0, 0, 0, - 30, 0, 0, 9, 242, 0, - 16, 0, 13, 0, 0, 0, - 6, 32, 2, 0, 2, 64, - 0, 0, 2, 12, 0, 0, - 1, 4, 0, 0, 1, 12, - 0, 0, 2, 2, 0, 0, - 30, 0, 0, 10, 50, 0, - 16, 0, 14, 0, 0, 0, - 6, 0, 16, 0, 6, 0, - 0, 0, 2, 64, 0, 0, - 0, 8, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 30, 0, - 0, 6, 130, 0, 16, 0, - 10, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 16, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 11, 0, 0, 0, 58, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 16, - 0, 0, 30, 0, 0, 9, - 242, 0, 16, 0, 15, 0, - 0, 0, 6, 32, 2, 0, - 2, 64, 0, 0, 1, 16, - 0, 0, 0, 2, 0, 0, - 2, 18, 0, 0, 253, 15, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 12, 0, - 0, 0, 26, 0, 16, 0, - 15, 0, 0, 0, 1, 64, - 0, 0, 0, 16, 0, 0, - 80, 0, 0, 9, 242, 0, - 16, 0, 16, 0, 0, 0, - 6, 32, 2, 0, 2, 64, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 0, 0, 8, 0, 0, 0, - 30, 0, 0, 9, 242, 0, - 16, 0, 17, 0, 0, 0, - 6, 32, 2, 0, 2, 64, - 0, 0, 250, 1, 0, 0, - 241, 15, 0, 0, 226, 1, - 0, 0, 193, 15, 0, 0, - 30, 0, 0, 10, 194, 0, - 16, 0, 14, 0, 0, 0, - 6, 8, 16, 0, 17, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 80, 0, - 0, 9, 242, 0, 16, 0, - 18, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 16, 0, 0, 0, 32, 0, - 0, 0, 64, 0, 0, 0, - 128, 0, 0, 0, 30, 0, - 0, 9, 82, 0, 16, 0, - 17, 0, 0, 0, 6, 32, - 2, 0, 2, 64, 0, 0, - 130, 1, 0, 0, 0, 0, - 0, 0, 1, 15, 0, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 13, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 1, 64, 0, 0, 0, 16, - 0, 0, 80, 0, 0, 6, - 34, 0, 16, 0, 15, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 1, - 0, 0, 30, 0, 0, 10, - 82, 0, 16, 0, 11, 0, - 0, 0, 6, 2, 16, 0, - 11, 0, 0, 0, 2, 64, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 18, 0, - 16, 0, 17, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 48, 0, 0, 1, - 165, 0, 0, 7, 18, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 80, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 17, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 3, 0, 4, 3, - 26, 0, 16, 0, 19, 0, - 0, 0, 86, 0, 0, 5, - 34, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 0, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 86, 0, 0, 5, - 18, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 14, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 31, 0, 0, 2, - 10, 32, 2, 0, 165, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 12, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 30, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 17, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 3, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 2, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 3, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 70, 126, 16, 0, - 2, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 3, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 22, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 32, 0, 0, 0, 70, 126, - 16, 0, 2, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 3, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 48, 0, 0, 0, - 70, 126, 16, 0, 2, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 3, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 24, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 64, 0, - 0, 0, 70, 126, 16, 0, - 2, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 3, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 25, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 80, 0, 0, 0, 70, 126, - 16, 0, 2, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 3, 128, 131, 153, 25, 0, - 66, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 96, 0, 0, 0, - 6, 112, 16, 0, 2, 0, - 0, 0, 166, 0, 0, 7, - 242, 240, 17, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 20, 0, 0, 0, - 166, 0, 0, 7, 242, 240, - 17, 0, 2, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 70, 14, 16, 0, - 21, 0, 0, 0, 166, 0, - 0, 7, 242, 240, 17, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 32, 0, 0, 0, - 70, 14, 16, 0, 22, 0, - 0, 0, 166, 0, 0, 7, - 242, 240, 17, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 48, 0, 0, 0, 70, 14, - 16, 0, 23, 0, 0, 0, - 166, 0, 0, 7, 242, 240, - 17, 0, 2, 0, 0, 0, - 1, 64, 0, 0, 64, 0, - 0, 0, 70, 14, 16, 0, - 24, 0, 0, 0, 166, 0, - 0, 7, 242, 240, 17, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 80, 0, 0, 0, - 70, 14, 16, 0, 25, 0, - 0, 0, 166, 0, 0, 7, - 18, 240, 17, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 96, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 114, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 12, 0, - 0, 0, 70, 242, 17, 0, - 2, 0, 0, 0, 165, 0, - 0, 7, 242, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 60, 0, 0, 0, - 70, 254, 17, 0, 2, 0, - 0, 0, 165, 0, 0, 7, - 242, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 24, 0, 0, 0, 70, 254, - 17, 0, 2, 0, 0, 0, - 165, 0, 0, 7, 242, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 76, 0, - 0, 0, 70, 254, 17, 0, - 2, 0, 0, 0, 165, 0, - 0, 7, 242, 0, 16, 0, - 24, 0, 0, 0, 1, 64, - 0, 0, 40, 0, 0, 0, - 70, 254, 17, 0, 2, 0, - 0, 0, 165, 0, 0, 7, - 50, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 92, 0, 0, 0, 70, 240, - 17, 0, 2, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 56, 0, - 0, 0, 6, 240, 17, 0, - 2, 0, 0, 0, 165, 0, - 0, 7, 242, 0, 16, 0, - 26, 0, 0, 0, 1, 64, - 0, 0, 12, 0, 0, 0, - 70, 254, 17, 0, 2, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 36, 0, 0, 0, 6, 240, - 17, 0, 2, 0, 0, 0, - 165, 0, 0, 7, 66, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 48, 0, - 0, 0, 6, 240, 17, 0, - 2, 0, 0, 0, 54, 0, - 0, 4, 130, 0, 16, 0, - 25, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 80, 0, 0, 7, 18, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 3, 0, - 4, 3, 10, 0, 16, 0, - 27, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 28, 0, 0, 0, 10, 0, - 16, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 238, 17, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 27, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 29, 0, 0, 0, 26, 0, - 16, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 238, 17, 0, - 0, 0, 0, 0, 24, 0, - 0, 7, 66, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 55, 0, 0, 9, - 130, 0, 16, 0, 28, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 49, 0, 0, 7, - 66, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 31, 0, 4, 3, 42, 0, - 16, 0, 27, 0, 0, 0, - 31, 0, 4, 3, 26, 0, - 16, 0, 25, 0, 0, 0, - 0, 0, 0, 7, 114, 0, - 16, 0, 30, 0, 0, 0, - 70, 2, 16, 0, 20, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 50, 0, - 0, 9, 194, 0, 16, 0, - 27, 0, 0, 0, 6, 0, - 16, 0, 28, 0, 0, 0, - 6, 12, 16, 0, 21, 0, - 0, 0, 6, 4, 16, 0, - 30, 0, 0, 0, 50, 0, - 0, 9, 194, 0, 16, 0, - 27, 0, 0, 0, 6, 0, - 16, 0, 29, 0, 0, 0, - 6, 12, 16, 0, 22, 0, - 0, 0, 166, 14, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 29, 0, 0, 0, - 26, 0, 16, 0, 22, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 18, 0, 16, 0, - 30, 0, 0, 0, 42, 0, - 16, 0, 29, 0, 0, 0, - 42, 0, 16, 0, 22, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 10, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 29, 0, 0, 0, - 10, 0, 16, 0, 24, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 34, 0, 16, 0, - 30, 0, 0, 0, 42, 0, - 16, 0, 29, 0, 0, 0, - 26, 0, 16, 0, 24, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 10, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 30, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 10, 0, - 16, 0, 29, 0, 0, 0, - 42, 0, 16, 0, 24, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 24, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 28, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 66, 0, 16, 0, - 27, 0, 0, 0, 42, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 27, 0, 0, 0, 18, 0, - 0, 1, 0, 0, 0, 8, - 114, 0, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 29, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 27, 0, 0, 0, 10, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 0, 0, - 0, 7, 18, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 10, 0, 16, 0, 28, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 27, 0, - 0, 0, 26, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 26, 0, - 0, 0, 0, 0, 0, 7, - 34, 0, 16, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 28, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 27, 0, 0, 0, - 42, 0, 16, 0, 31, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 42, 0, - 16, 0, 26, 0, 0, 0, - 0, 0, 0, 7, 66, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 42, 0, 16, 0, - 28, 0, 0, 0, 21, 0, - 0, 1, 165, 0, 0, 7, - 114, 0, 16, 0, 31, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 242, - 17, 0, 2, 0, 0, 0, - 0, 0, 0, 7, 114, 0, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 28, 0, - 0, 0, 70, 2, 16, 0, - 31, 0, 0, 0, 54, 0, - 0, 5, 50, 0, 16, 0, - 28, 0, 0, 0, 70, 0, - 16, 0, 30, 0, 0, 0, - 54, 0, 0, 5, 66, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 27, 0, - 0, 0, 18, 0, 0, 1, - 54, 0, 0, 5, 114, 0, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 28, 0, - 0, 0, 21, 0, 0, 1, - 168, 0, 0, 9, 242, 224, - 17, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 28, 0, 0, 0, - 168, 0, 0, 9, 242, 224, - 17, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 29, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 4, 0, 0, 22, 0, - 0, 1, 165, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 44, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 190, 24, 0, 1, 165, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 8, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 41, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 2, 0, - 0, 0, 54, 0, 0, 4, - 66, 0, 16, 0, 20, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 130, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 20, 0, - 0, 0, 85, 0, 0, 7, - 130, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 2, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 0, 0, 0, 0, - 49, 0, 0, 7, 18, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 31, 0, - 4, 3, 10, 0, 16, 0, - 22, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 22, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 20, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 13, 0, 0, 0, 50, 0, - 0, 9, 242, 0, 16, 0, - 21, 0, 0, 0, 70, 14, - 16, 0, 22, 0, 0, 0, - 246, 15, 16, 0, 19, 0, - 0, 0, 70, 14, 16, 0, - 21, 0, 0, 0, 168, 0, - 0, 9, 242, 224, 17, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 21, 0, 0, 0, 21, 0, - 0, 1, 30, 0, 0, 7, - 66, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 28, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 39, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 31, 0, - 4, 3, 42, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 194, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 36, 0, 0, 0, - 6, 244, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 114, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 24, 0, 0, 0, 70, 242, - 17, 0, 1, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 4, 18, 0, 16, 0, - 21, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 80, 0, 0, 7, 34, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 3, 0, - 4, 3, 26, 0, 16, 0, - 21, 0, 0, 0, 30, 0, - 0, 7, 98, 0, 16, 0, - 21, 0, 0, 0, 86, 6, - 16, 0, 20, 0, 0, 0, - 6, 0, 16, 0, 21, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 11, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 11, 0, 0, 0, - 0, 0, 0, 8, 242, 0, - 16, 0, 23, 0, 0, 0, - 70, 14, 16, 128, 65, 0, - 0, 0, 22, 0, 0, 0, - 70, 14, 16, 0, 23, 0, - 0, 0, 50, 0, 0, 9, - 242, 0, 16, 0, 22, 0, - 0, 0, 70, 14, 16, 0, - 23, 0, 0, 0, 6, 0, - 16, 0, 19, 0, 0, 0, - 70, 14, 16, 0, 22, 0, - 0, 0, 30, 0, 0, 7, - 34, 0, 16, 0, 21, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 23, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 238, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 22, 0, - 0, 0, 70, 2, 16, 0, - 22, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 23, 0, 0, 0, 16, 0, - 0, 7, 66, 0, 16, 0, - 21, 0, 0, 0, 70, 2, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 22, 0, - 0, 0, 0, 0, 0, 7, - 66, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 50, 0, 0, 11, 130, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 42, 0, 16, 128, - 65, 0, 0, 0, 19, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 19, 0, - 0, 0, 51, 0, 0, 7, - 130, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 68, 0, 0, 5, 66, 0, - 16, 0, 21, 0, 0, 0, - 42, 0, 16, 0, 21, 0, - 0, 0, 50, 0, 0, 9, - 66, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 21, 0, 0, 0, 42, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 52, 0, 0, 7, - 66, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 66, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 22, 0, 0, 0, 166, 10, - 16, 0, 21, 0, 0, 0, - 70, 2, 16, 0, 22, 0, - 0, 0, 70, 2, 16, 0, - 23, 0, 0, 0, 29, 0, - 0, 7, 66, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 55, 0, 0, 9, - 130, 0, 16, 0, 22, 0, - 0, 0, 42, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 168, 0, 0, 9, - 242, 224, 17, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 22, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 21, 0, - 0, 1, 165, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 20, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 24, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 18, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 24, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 32, 0, 0, 7, - 34, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 60, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 31, 0, - 0, 3, 58, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 86, 0, 0, 5, - 34, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 56, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 86, 0, 0, 5, - 34, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 14, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 165, 0, 0, 7, - 98, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 28, 0, 0, 0, 6, 241, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 130, 0, - 16, 0, 20, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 10, 0, - 16, 0, 21, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 8, 226, 0, - 16, 0, 21, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 18, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 34, 0, 16, 0, 23, 0, - 0, 0, 10, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 3, 0, 4, 3, 26, 0, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 23, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 34, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 112, - 16, 0, 5, 0, 0, 0, - 1, 0, 0, 7, 66, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 23, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 114, 0, 16, 0, - 24, 0, 0, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 226, 17, 0, - 0, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 24, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 22, 0, 0, 0, 70, 2, - 16, 0, 24, 0, 0, 0, - 50, 0, 0, 9, 66, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 24, 0, - 0, 0, 10, 0, 16, 0, - 24, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 50, 0, 0, 9, 66, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 24, 0, - 0, 0, 26, 0, 16, 0, - 24, 0, 0, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 50, 0, 0, 9, 66, 0, - 16, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 24, 0, - 0, 0, 42, 0, 16, 0, - 24, 0, 0, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 85, 0, 0, 7, 34, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 86, 0, - 0, 5, 34, 0, 16, 0, - 23, 0, 0, 0, 26, 0, - 16, 0, 23, 0, 0, 0, - 56, 0, 0, 7, 34, 0, - 16, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 23, 0, 0, 0, 68, 0, - 0, 5, 66, 0, 16, 0, - 23, 0, 0, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 50, 0, 0, 10, 34, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 128, 65, 0, - 0, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 49, 0, - 0, 7, 66, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 24, 0, - 0, 0, 70, 2, 16, 0, - 24, 0, 0, 0, 86, 5, - 16, 0, 23, 0, 0, 0, - 150, 7, 16, 0, 21, 0, - 0, 0, 55, 0, 0, 9, - 226, 0, 16, 0, 21, 0, - 0, 0, 166, 10, 16, 0, - 23, 0, 0, 0, 6, 9, - 16, 0, 24, 0, 0, 0, - 86, 14, 16, 0, 21, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 23, 0, 0, 0, - 22, 0, 0, 1, 50, 0, - 0, 9, 114, 0, 16, 0, - 22, 0, 0, 0, 150, 7, - 16, 0, 21, 0, 0, 0, - 166, 10, 16, 0, 19, 0, - 0, 0, 70, 2, 16, 0, - 22, 0, 0, 0, 168, 0, - 0, 9, 242, 224, 17, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 22, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 4, - 0, 0, 22, 0, 0, 1, - 21, 0, 0, 1, 54, 0, - 0, 5, 66, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 48, 0, 0, 1, 165, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 8, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 80, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 114, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 12, 0, - 0, 0, 70, 242, 17, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 167, 0, 0, 139, - 2, 195, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 3, 0, 0, 0, 167, 0, - 0, 139, 2, 195, 0, 128, - 131, 153, 25, 0, 146, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 6, 116, - 16, 0, 3, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 108, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 56, 0, - 0, 7, 50, 0, 16, 0, - 22, 0, 0, 0, 246, 15, - 16, 0, 19, 0, 0, 0, - 70, 0, 16, 0, 22, 0, - 0, 0, 25, 0, 0, 5, - 50, 0, 16, 0, 22, 0, - 0, 0, 70, 0, 16, 0, - 22, 0, 0, 0, 0, 0, - 0, 11, 50, 0, 16, 0, - 22, 0, 0, 0, 70, 0, - 16, 128, 65, 0, 0, 0, - 22, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 39, 0, - 0, 7, 66, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 165, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 20, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 190, 24, - 0, 1, 54, 0, 0, 4, - 18, 0, 16, 0, 21, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 18, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 20, 0, - 0, 0, 3, 0, 4, 3, - 10, 0, 16, 0, 23, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 23, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 167, 0, 0, 139, 2, 67, - 0, 128, 131, 153, 25, 0, - 50, 0, 16, 0, 23, 0, - 0, 0, 10, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 112, 16, 0, 4, 0, - 0, 0, 1, 0, 0, 7, - 66, 0, 16, 0, 23, 0, - 0, 0, 26, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 0, 0, - 85, 0, 0, 7, 34, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 30, 0, - 0, 7, 98, 0, 16, 0, - 23, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 86, 6, 16, 0, 23, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 24, 0, 0, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 238, 17, 0, - 0, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 24, 0, 0, 0, - 70, 2, 16, 0, 25, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 23, 0, - 0, 0, 10, 0, 16, 0, - 26, 0, 0, 0, 10, 0, - 16, 0, 26, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 50, 0, 0, 9, - 130, 0, 16, 0, 23, 0, - 0, 0, 26, 0, 16, 0, - 26, 0, 0, 0, 26, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 26, 0, 0, 0, 42, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 10, 0, - 16, 0, 23, 0, 0, 0, - 68, 0, 0, 5, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 50, 0, 0, 9, - 18, 0, 16, 0, 23, 0, - 0, 0, 10, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 191, 1, 0, 0, 7, - 18, 0, 16, 0, 23, 0, - 0, 0, 10, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 51, 0, 0, 8, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 128, - 65, 0, 0, 0, 23, 0, - 0, 0, 52, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 50, 0, 0, 9, 18, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 112, - 16, 0, 16, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 25, 0, - 0, 5, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 0, 0, 0, 8, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 55, 0, 0, 9, - 130, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 22, 0, - 0, 0, 56, 0, 0, 7, - 18, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 23, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 24, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 14, 0, 0, 7, - 18, 0, 16, 0, 23, 0, - 0, 0, 10, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 56, 0, 0, 8, 130, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 24, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 24, 0, - 0, 0, 246, 15, 16, 0, - 23, 0, 0, 0, 70, 2, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 24, 0, - 0, 0, 168, 0, 0, 9, - 114, 224, 17, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 24, 0, - 0, 0, 56, 0, 0, 7, - 18, 0, 16, 0, 23, 0, - 0, 0, 10, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 50, 0, 0, 9, 210, 0, - 16, 0, 23, 0, 0, 0, - 6, 0, 16, 0, 23, 0, - 0, 0, 6, 9, 16, 0, - 26, 0, 0, 0, 6, 9, - 16, 0, 25, 0, 0, 0, - 168, 0, 0, 9, 114, 224, - 17, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 134, 3, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 4, 0, 0, 22, 0, - 0, 1, 30, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 36, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 39, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 31, 0, - 4, 3, 42, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 50, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 36, 0, 0, 0, 70, 240, - 17, 0, 1, 0, 0, 0, - 54, 0, 0, 4, 130, 0, - 16, 0, 19, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 66, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 42, 0, - 16, 0, 20, 0, 0, 0, - 30, 0, 0, 7, 194, 0, - 16, 0, 20, 0, 0, 0, - 6, 4, 16, 0, 20, 0, - 0, 0, 246, 15, 16, 0, - 19, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 22, 0, 0, 0, - 42, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 12, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 12, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 23, 0, - 0, 0, 70, 14, 16, 128, - 65, 0, 0, 0, 22, 0, - 0, 0, 70, 14, 16, 0, - 23, 0, 0, 0, 50, 0, - 0, 9, 242, 0, 16, 0, - 22, 0, 0, 0, 70, 14, - 16, 0, 23, 0, 0, 0, - 6, 0, 16, 0, 19, 0, - 0, 0, 70, 14, 16, 0, - 22, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 114, 0, 16, 0, - 23, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 226, 17, 0, - 0, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 22, 0, 0, 0, 70, 2, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 23, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 20, 0, 0, 0, - 70, 2, 16, 0, 22, 0, - 0, 0, 70, 2, 16, 0, - 22, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 130, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 51, 0, 0, 7, - 130, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 50, 0, 0, 9, 114, 0, - 16, 0, 22, 0, 0, 0, - 246, 15, 16, 0, 20, 0, - 0, 0, 70, 2, 16, 0, - 22, 0, 0, 0, 70, 2, - 16, 0, 23, 0, 0, 0, - 168, 0, 0, 9, 114, 224, - 17, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 22, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 4, 0, 0, 22, 0, - 0, 1, 190, 24, 0, 1, - 21, 0, 0, 1, 31, 0, - 4, 3, 10, 0, 16, 0, - 1, 0, 0, 0, 165, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 84, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 2, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 238, 17, 0, - 0, 0, 0, 0, 17, 0, - 0, 8, 18, 0, 16, 0, - 20, 0, 0, 0, 70, 14, - 16, 0, 20, 0, 0, 0, - 70, 158, 144, 0, 10, 0, - 16, 0, 4, 0, 0, 0, - 56, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 4, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 54, 0, 0, 5, 18, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 48, 0, 0, 1, - 30, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 32, 0, 0, 0, 80, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 3, 0, 4, 3, - 26, 0, 16, 0, 20, 0, - 0, 0, 167, 0, 0, 8, - 34, 0, 16, 0, 20, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 4, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 22, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 238, 17, 0, - 0, 0, 0, 0, 17, 0, - 0, 8, 66, 0, 16, 0, - 20, 0, 0, 0, 70, 14, - 16, 0, 22, 0, 0, 0, - 70, 158, 144, 0, 10, 0, - 16, 0, 4, 0, 0, 0, - 56, 0, 0, 7, 66, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 52, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 4, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 22, 0, - 0, 1, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 26, 0, 16, 0, - 1, 0, 0, 0, 167, 0, - 0, 8, 66, 0, 16, 0, - 19, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 4, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 4, 0, 0, 0, - 52, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 4, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 26, 0, 16, 0, 1, 0, - 0, 0, 167, 0, 0, 8, - 66, 0, 16, 0, 19, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 4, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 4, 0, 0, 0, 52, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 4, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 26, 0, - 16, 0, 1, 0, 0, 0, - 167, 0, 0, 8, 66, 0, - 16, 0, 19, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 4, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 4, 0, - 0, 0, 52, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 4, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 26, 0, 16, 0, - 1, 0, 0, 0, 167, 0, - 0, 8, 66, 0, 16, 0, - 19, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 4, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 4, 0, 0, 0, - 52, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 4, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 26, 0, 16, 0, 1, 0, - 0, 0, 167, 0, 0, 8, - 66, 0, 16, 0, 19, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 4, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 4, 0, 0, 0, 52, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 4, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 10, 0, - 16, 0, 2, 0, 0, 0, - 167, 0, 0, 8, 66, 0, - 16, 0, 19, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 4, 0, - 0, 0, 166, 0, 0, 7, - 18, 240, 17, 0, 1, 0, - 0, 0, 42, 0, 16, 0, - 4, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 66, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 86, 0, 0, 5, 66, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 14, 0, 0, 7, - 34, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 60, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 31, 0, - 4, 3, 42, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 80, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 64, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 194, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 56, 0, 0, 0, 6, 244, - 17, 0, 1, 0, 0, 0, - 54, 0, 0, 4, 18, 0, - 16, 0, 21, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 18, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 3, 0, 4, 3, 10, 0, - 16, 0, 22, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 22, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 8, 242, 0, - 16, 0, 24, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 34, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 66, 0, 16, 0, 22, 0, - 0, 0, 26, 0, 16, 0, - 22, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 42, 0, - 16, 0, 22, 0, 0, 0, - 30, 0, 0, 7, 66, 0, - 16, 0, 22, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 22, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 66, 0, - 16, 0, 22, 0, 0, 0, - 42, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 112, - 16, 0, 8, 0, 0, 0, - 136, 0, 0, 5, 130, 0, - 16, 0, 22, 0, 0, 0, - 42, 0, 16, 0, 22, 0, - 0, 0, 30, 0, 0, 7, - 50, 0, 16, 0, 25, 0, - 0, 0, 230, 10, 16, 0, - 20, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 26, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 9, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 25, 0, 0, 0, 26, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 9, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 25, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 26, 0, 0, 0, 70, 14, - 16, 0, 25, 0, 0, 0, - 50, 0, 0, 9, 242, 0, - 16, 0, 25, 0, 0, 0, - 6, 0, 16, 0, 19, 0, - 0, 0, 70, 14, 16, 0, - 25, 0, 0, 0, 70, 14, - 16, 0, 26, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 23, 0, - 0, 0, 70, 2, 16, 0, - 25, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 54, 0, 0, 5, - 114, 0, 16, 0, 26, 0, - 0, 0, 70, 2, 16, 0, - 25, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 25, 0, 0, 0, 42, 0, - 16, 0, 22, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 48, 0, 0, 1, - 49, 0, 0, 7, 18, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 1, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 26, 0, - 16, 0, 27, 0, 0, 0, - 39, 0, 0, 7, 34, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 7, 18, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 27, 0, 0, 0, - 10, 0, 16, 0, 27, 0, - 0, 0, 3, 0, 0, 3, - 10, 0, 16, 0, 27, 0, - 0, 0, 136, 0, 0, 5, - 18, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 30, 0, - 0, 7, 50, 0, 16, 0, - 27, 0, 0, 0, 230, 10, - 16, 0, 20, 0, 0, 0, - 6, 0, 16, 0, 27, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 28, 0, 0, 0, 10, 0, - 16, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 9, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 27, 0, 0, 0, - 26, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 9, 0, 0, 0, - 0, 0, 0, 8, 242, 0, - 16, 0, 27, 0, 0, 0, - 70, 14, 16, 128, 65, 0, - 0, 0, 28, 0, 0, 0, - 70, 14, 16, 0, 27, 0, - 0, 0, 50, 0, 0, 9, - 242, 0, 16, 0, 27, 0, - 0, 0, 6, 0, 16, 0, - 19, 0, 0, 0, 70, 14, - 16, 0, 27, 0, 0, 0, - 70, 14, 16, 0, 28, 0, - 0, 0, 16, 0, 0, 7, - 18, 0, 16, 0, 28, 0, - 0, 0, 70, 2, 16, 0, - 23, 0, 0, 0, 70, 2, - 16, 0, 27, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 10, 0, 16, 0, - 28, 0, 0, 0, 49, 0, - 0, 7, 18, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 26, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 55, 0, 0, 9, - 242, 0, 16, 0, 26, 0, - 0, 0, 6, 0, 16, 0, - 28, 0, 0, 0, 70, 14, - 16, 0, 27, 0, 0, 0, - 70, 14, 16, 0, 26, 0, - 0, 0, 22, 0, 0, 1, - 49, 0, 0, 7, 66, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 26, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 26, 0, 0, 0, 246, 15, - 16, 0, 26, 0, 0, 0, - 70, 2, 16, 0, 24, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 24, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 55, 0, 0, 9, 242, 0, - 16, 0, 24, 0, 0, 0, - 166, 10, 16, 0, 22, 0, - 0, 0, 70, 14, 16, 0, - 25, 0, 0, 0, 70, 14, - 16, 0, 24, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 22, 0, 0, 0, - 26, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 22, 0, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 24, 0, - 0, 0, 86, 0, 0, 5, - 34, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 24, 0, 0, 0, 14, 0, - 0, 10, 34, 0, 16, 0, - 22, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 26, 0, 16, 0, 22, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 19, 0, - 0, 0, 30, 0, 0, 7, - 66, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 114, 0, 16, 0, 25, 0, - 0, 0, 42, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 226, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 80, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 25, 0, 0, 0, - 70, 2, 16, 0, 24, 0, - 0, 0, 70, 2, 16, 0, - 24, 0, 0, 0, 0, 0, - 0, 7, 18, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 18, 0, 16, 0, 27, 0, - 0, 0, 10, 0, 16, 0, - 27, 0, 0, 0, 56, 0, - 0, 7, 226, 0, 16, 0, - 27, 0, 0, 0, 6, 9, - 16, 0, 24, 0, 0, 0, - 6, 0, 16, 0, 27, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 28, 0, - 0, 0, 70, 2, 16, 0, - 23, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 25, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 28, 0, 0, 0, - 150, 7, 16, 0, 27, 0, - 0, 0, 50, 0, 0, 10, - 226, 0, 16, 0, 27, 0, - 0, 0, 246, 15, 16, 128, - 65, 0, 0, 0, 28, 0, - 0, 0, 86, 14, 16, 0, - 27, 0, 0, 0, 6, 9, - 16, 0, 28, 0, 0, 0, - 16, 0, 0, 7, 18, 0, - 16, 0, 28, 0, 0, 0, - 150, 7, 16, 0, 27, 0, - 0, 0, 150, 7, 16, 0, - 27, 0, 0, 0, 0, 0, - 0, 7, 18, 0, 16, 0, - 28, 0, 0, 0, 10, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 18, 0, 16, 0, 28, 0, - 0, 0, 10, 0, 16, 0, - 28, 0, 0, 0, 56, 0, - 0, 8, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 26, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 191, 50, 0, - 0, 10, 114, 0, 16, 0, - 25, 0, 0, 0, 150, 7, - 16, 128, 65, 0, 0, 0, - 27, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 25, 0, - 0, 0, 168, 0, 0, 9, - 114, 224, 17, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 25, 0, - 0, 0, 21, 0, 0, 1, - 50, 0, 0, 9, 114, 0, - 16, 0, 23, 0, 0, 0, - 70, 2, 16, 0, 24, 0, - 0, 0, 86, 5, 16, 0, - 22, 0, 0, 0, 70, 2, - 16, 0, 23, 0, 0, 0, - 168, 0, 0, 9, 242, 224, - 17, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 23, 0, 0, 0, - 21, 0, 0, 1, 30, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 4, - 0, 0, 22, 0, 0, 1, - 21, 0, 0, 1, 27, 0, - 0, 5, 66, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 30, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 114, 0, - 16, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 226, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 68, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 130, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 64, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 54, 0, 0, 8, - 114, 0, 16, 0, 22, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 8, 50, 0, 16, 0, - 23, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 255, 255, 127, 127, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 18, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 48, 0, 0, 1, - 80, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 3, 0, - 4, 3, 58, 0, 16, 0, - 22, 0, 0, 0, 35, 0, - 0, 9, 130, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 167, 0, - 0, 139, 2, 99, 0, 128, - 131, 153, 25, 0, 114, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 114, - 16, 0, 10, 0, 0, 0, - 30, 0, 0, 10, 194, 0, - 16, 0, 23, 0, 0, 0, - 246, 15, 16, 0, 22, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 167, 0, - 0, 139, 2, 99, 0, 128, - 131, 153, 25, 0, 114, 0, - 16, 0, 27, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 114, - 16, 0, 10, 0, 0, 0, - 167, 0, 0, 139, 2, 99, - 0, 128, 131, 153, 25, 0, - 114, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 114, 16, 0, 10, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 25, 0, - 0, 0, 70, 2, 16, 0, - 27, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 25, 0, 0, 0, 70, 2, - 16, 0, 28, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 29, 0, 0, 0, - 38, 9, 16, 0, 27, 0, - 0, 0, 150, 4, 16, 0, - 28, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 29, 0, 0, 0, 150, 4, - 16, 0, 27, 0, 0, 0, - 38, 9, 16, 0, 28, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 29, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 70, 2, 16, 0, - 29, 0, 0, 0, 70, 2, - 16, 0, 29, 0, 0, 0, - 68, 0, 0, 5, 130, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 29, 0, - 0, 0, 246, 15, 16, 0, - 22, 0, 0, 0, 70, 2, - 16, 0, 29, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 16, 0, - 0, 7, 66, 0, 16, 0, - 23, 0, 0, 0, 70, 2, - 16, 0, 27, 0, 0, 0, - 70, 2, 16, 0, 27, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 28, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 25, 0, 0, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 25, 0, - 0, 0, 14, 0, 0, 10, - 130, 0, 16, 0, 25, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 0, 0, 128, 63, 58, 0, - 16, 0, 25, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 23, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 192, 58, 0, 16, 0, - 27, 0, 0, 0, 14, 0, - 0, 10, 130, 0, 16, 0, - 27, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 58, 0, 16, 0, 27, 0, - 0, 0, 14, 0, 0, 10, - 130, 0, 16, 0, 28, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 0, 0, 128, 63, 42, 0, - 16, 0, 23, 0, 0, 0, - 14, 0, 0, 10, 130, 0, - 16, 0, 29, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 128, 63, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 58, 0, 16, 0, - 23, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 0, 20, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 25, 0, 0, 0, - 16, 0, 0, 7, 18, 0, - 16, 0, 30, 0, 0, 0, - 70, 2, 16, 0, 25, 0, - 0, 0, 70, 2, 16, 0, - 27, 0, 0, 0, 16, 0, - 0, 7, 34, 0, 16, 0, - 30, 0, 0, 0, 70, 2, - 16, 0, 25, 0, 0, 0, - 70, 2, 16, 0, 28, 0, - 0, 0, 16, 0, 0, 7, - 18, 0, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 0, 29, 0, 0, 0, - 56, 0, 0, 7, 194, 0, - 16, 0, 30, 0, 0, 0, - 246, 15, 16, 0, 22, 0, - 0, 0, 86, 1, 16, 0, - 30, 0, 0, 0, 50, 0, - 0, 10, 66, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 10, 0, 16, 0, 30, 0, - 0, 0, 42, 0, 16, 128, - 65, 0, 0, 0, 30, 0, - 0, 0, 50, 0, 0, 10, - 66, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 23, 0, 0, 0, 26, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 30, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 30, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 23, 0, 0, 0, 56, 0, - 0, 7, 66, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 42, 0, 16, 0, 30, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 10, 0, - 16, 0, 30, 0, 0, 0, - 55, 0, 0, 9, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 30, 0, - 0, 0, 42, 0, 16, 0, - 30, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 49, 0, 0, 7, 66, 0, - 16, 0, 30, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 56, 0, - 0, 7, 66, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 26, 0, - 16, 0, 30, 0, 0, 0, - 55, 0, 0, 9, 66, 0, - 16, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 30, 0, - 0, 0, 42, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 25, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 49, 0, - 0, 7, 130, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 58, 0, 16, 0, 25, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 30, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 22, 0, - 0, 0, 26, 0, 16, 128, - 65, 0, 0, 0, 30, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 55, 32, 0, 9, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 51, 0, - 0, 7, 66, 0, 16, 0, - 23, 0, 0, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 52, 0, 0, 7, - 66, 0, 16, 0, 23, 0, - 0, 0, 42, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 28, 0, 0, 0, - 166, 10, 16, 0, 23, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 27, 0, 0, 0, 70, 2, - 16, 0, 27, 0, 0, 0, - 246, 15, 16, 0, 22, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 0, 25, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 27, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 25, 0, - 0, 0, 70, 2, 16, 0, - 25, 0, 0, 0, 49, 0, - 0, 7, 66, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 31, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 71, 3, 128, 63, - 55, 0, 0, 9, 34, 0, - 16, 0, 31, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 26, 0, 16, 0, 31, 0, - 0, 0, 26, 0, 16, 0, - 23, 0, 0, 0, 55, 0, - 0, 9, 114, 0, 16, 0, - 22, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 70, 2, 16, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 22, 0, 0, 0, 55, 0, - 0, 9, 50, 0, 16, 0, - 23, 0, 0, 0, 246, 15, - 16, 0, 22, 0, 0, 0, - 70, 0, 16, 0, 31, 0, - 0, 0, 70, 0, 16, 0, - 23, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 22, 0, 0, 1, - 49, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 19, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 20, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 22, 0, 0, 0, 6, 0, - 16, 0, 23, 0, 0, 0, - 70, 2, 16, 0, 20, 0, - 0, 0, 168, 0, 0, 9, - 114, 224, 17, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 20, 0, - 0, 0, 21, 0, 0, 1, - 165, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 72, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 31, 0, - 4, 3, 42, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 80, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 98, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 48, 0, 0, 0, - 6, 241, 17, 0, 1, 0, - 0, 0, 165, 0, 0, 7, - 98, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 44, 0, 0, 0, 6, 241, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 130, 0, - 16, 0, 20, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 3, 0, 4, 3, 10, 0, - 16, 0, 21, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 25, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 114, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 226, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 114, 0, - 16, 0, 28, 0, 0, 0, - 70, 2, 16, 0, 25, 0, - 0, 0, 54, 0, 0, 8, - 114, 0, 16, 0, 29, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 8, 242, 0, 16, 0, - 30, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 48, 0, 0, 1, - 80, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 26, 0, 16, 0, - 23, 0, 0, 0, 3, 0, - 4, 3, 58, 0, 16, 0, - 27, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 167, 0, 0, 139, - 2, 67, 0, 128, 131, 153, - 25, 0, 50, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 112, 16, 0, - 6, 0, 0, 0, 30, 0, - 0, 7, 242, 0, 16, 0, - 31, 0, 0, 0, 150, 9, - 16, 0, 20, 0, 0, 0, - 6, 5, 16, 0, 31, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 32, 0, 0, 0, 10, 0, - 16, 0, 31, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 33, 0, 0, 0, - 26, 0, 16, 0, 31, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 34, 0, - 0, 0, 42, 0, 16, 0, - 31, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 31, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 7, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 35, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 32, 0, 0, 0, 70, 14, - 16, 0, 33, 0, 0, 0, - 50, 0, 0, 9, 242, 0, - 16, 0, 36, 0, 0, 0, - 86, 5, 16, 0, 19, 0, - 0, 0, 70, 14, 16, 0, - 35, 0, 0, 0, 70, 14, - 16, 0, 32, 0, 0, 0, - 0, 0, 0, 8, 242, 0, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 128, 65, 0, - 0, 0, 34, 0, 0, 0, - 70, 14, 16, 0, 31, 0, - 0, 0, 50, 0, 0, 9, - 242, 0, 16, 0, 38, 0, - 0, 0, 86, 5, 16, 0, - 19, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 34, 0, - 0, 0, 52, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 39, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 38, 0, 0, 0, - 56, 0, 0, 10, 242, 0, - 16, 0, 39, 0, 0, 0, - 70, 14, 16, 0, 39, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 16, 0, - 0, 7, 130, 0, 16, 0, - 27, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 39, 0, - 0, 0, 29, 0, 0, 7, - 130, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 28, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 7, 0, 0, 1, 21, 0, - 0, 1, 50, 0, 0, 9, - 242, 0, 16, 0, 35, 0, - 0, 0, 6, 0, 16, 0, - 19, 0, 0, 0, 70, 14, - 16, 0, 35, 0, 0, 0, - 70, 14, 16, 0, 32, 0, - 0, 0, 50, 0, 0, 9, - 242, 0, 16, 0, 37, 0, - 0, 0, 6, 0, 16, 0, - 19, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 34, 0, - 0, 0, 52, 0, 0, 7, - 130, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 40, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 35, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 56, 0, 0, 10, 242, 0, - 16, 0, 41, 0, 0, 0, - 70, 14, 16, 0, 40, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 16, 0, - 0, 7, 130, 0, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 41, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 41, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 29, 0, 0, 7, 130, 0, - 16, 0, 31, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 31, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 7, 0, - 0, 1, 21, 0, 0, 1, - 0, 0, 0, 7, 114, 0, - 16, 0, 40, 0, 0, 0, - 38, 9, 16, 0, 36, 0, - 0, 0, 38, 9, 16, 0, - 38, 0, 0, 0, 50, 0, - 0, 13, 114, 0, 16, 0, - 40, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 40, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 0, - 38, 9, 16, 0, 27, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 39, 0, - 0, 0, 58, 0, 16, 0, - 39, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 68, 0, 0, 5, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 68, 0, 0, 5, - 130, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 39, 0, 0, 0, 246, 15, - 16, 0, 27, 0, 0, 0, - 70, 2, 16, 0, 39, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 39, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 42, 0, 0, 0, - 150, 4, 16, 0, 39, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 40, 0, 0, 0, 38, 9, - 16, 0, 40, 0, 0, 0, - 38, 9, 16, 0, 39, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 42, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 27, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 0, 0, 0, 7, 114, 0, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 50, 0, - 0, 13, 114, 0, 16, 0, - 42, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 39, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 0, - 70, 2, 16, 0, 28, 0, - 0, 0, 68, 0, 0, 5, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 68, 0, - 0, 5, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 63, 58, 0, 16, 0, - 35, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 33, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 43, 0, 0, 0, - 246, 15, 16, 0, 32, 0, - 0, 0, 70, 2, 16, 0, - 41, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 44, 0, 0, 0, 38, 9, - 16, 0, 42, 0, 0, 0, - 150, 4, 16, 0, 43, 0, - 0, 0, 50, 0, 0, 10, - 114, 0, 16, 0, 44, 0, - 0, 0, 150, 4, 16, 0, - 42, 0, 0, 0, 38, 9, - 16, 0, 43, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 44, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 70, 2, 16, 0, 28, 0, - 0, 0, 70, 2, 16, 0, - 43, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 44, 0, 0, 0, - 70, 2, 16, 0, 44, 0, - 0, 0, 0, 0, 0, 7, - 18, 0, 16, 0, 45, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 50, 0, 0, 9, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 41, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 33, 0, - 0, 0, 52, 0, 0, 7, - 34, 0, 16, 0, 45, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 70, 2, 16, 0, 40, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 34, 0, 0, 0, 10, 0, - 16, 128, 65, 0, 0, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 0, 40, 0, - 0, 0, 70, 2, 16, 0, - 44, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 31, 0, 0, 0, 26, 0, - 16, 0, 45, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 128, - 65, 0, 0, 0, 45, 0, - 0, 0, 26, 0, 16, 0, - 45, 0, 0, 0, 10, 0, - 16, 0, 45, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 37, 0, - 0, 0, 75, 0, 0, 5, - 130, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 0, 0, - 0, 8, 130, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 0, 0, 0, 8, 130, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 36, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 51, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 14, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 39, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 49, 0, - 0, 7, 18, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 39, 0, - 0, 0, 58, 0, 16, 0, - 39, 0, 0, 0, 10, 0, - 16, 0, 40, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 0, 0, - 0, 8, 18, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 31, 0, 0, 0, 26, 0, - 16, 0, 45, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 10, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 31, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 1, 64, - 0, 0, 236, 81, 184, 190, - 49, 0, 0, 7, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 39, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 180, - 1, 0, 0, 7, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 40, 0, 0, 0, 70, 2, - 16, 0, 27, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 28, 0, 0, 0, - 50, 0, 0, 10, 114, 0, - 16, 0, 44, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 40, 0, 0, 0, - 246, 15, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 27, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 46, 0, 0, 0, 246, 15, - 16, 0, 28, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 56, 0, - 0, 10, 114, 0, 16, 0, - 36, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 36, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 68, 0, 0, 5, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 50, 0, 0, 10, 114, 0, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 36, 0, 0, 0, - 246, 15, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 46, 0, 0, 0, 0, 0, - 0, 8, 130, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 50, 0, 0, 10, 114, 0, - 16, 0, 38, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 36, 0, 0, 0, - 246, 15, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 46, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 38, 0, 0, 0, - 68, 0, 0, 5, 130, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 37, 0, - 0, 0, 70, 2, 16, 0, - 44, 0, 0, 0, 70, 2, - 16, 0, 38, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 16, 0, - 0, 7, 18, 0, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 44, 0, 0, 0, - 70, 2, 16, 0, 44, 0, - 0, 0, 50, 0, 0, 10, - 18, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 38, 0, 0, 0, - 49, 0, 0, 7, 34, 0, - 16, 0, 38, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 38, 0, 0, 0, 68, 0, - 0, 5, 66, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 38, 0, 0, 0, - 1, 0, 0, 7, 34, 0, - 16, 0, 38, 0, 0, 0, - 42, 0, 16, 0, 38, 0, - 0, 0, 26, 0, 16, 0, - 38, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 10, 0, 16, 0, 38, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 49, 0, 0, 8, 130, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 128, 129, 0, - 0, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 50, 0, 0, 9, - 114, 0, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 36, 0, 0, 0, 246, 15, - 16, 0, 27, 0, 0, 0, - 70, 2, 16, 0, 40, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 14, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 0, 0, - 0, 8, 130, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 27, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 14, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 36, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 246, 15, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 0, - 42, 0, 0, 0, 50, 0, - 0, 12, 114, 0, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 0, 70, 2, 16, 0, - 36, 0, 0, 0, 55, 0, - 0, 9, 114, 0, 16, 0, - 38, 0, 0, 0, 246, 15, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 55, 0, - 0, 9, 114, 0, 16, 0, - 38, 0, 0, 0, 246, 15, - 16, 0, 31, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 0, - 28, 0, 0, 0, 50, 0, - 0, 13, 114, 0, 16, 0, - 39, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 39, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 70, 2, - 16, 0, 43, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 39, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 49, 0, - 0, 7, 130, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 37, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 5, 114, 0, - 16, 0, 28, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 7, 0, - 0, 1, 21, 0, 0, 1, - 56, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 52, 0, 0, 7, - 130, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 68, 0, 0, 5, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 49, 0, 0, 8, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 128, 129, 0, - 0, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 50, 0, 0, 10, - 114, 0, 16, 0, 39, 0, - 0, 0, 246, 15, 16, 128, - 65, 0, 0, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 41, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 32, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 39, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 246, 15, - 16, 0, 32, 0, 0, 0, - 70, 2, 16, 0, 29, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 33, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 32, 0, - 0, 0, 70, 2, 16, 0, - 33, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 32, 0, 0, 0, 86, 5, - 16, 0, 19, 0, 0, 0, - 70, 2, 16, 0, 33, 0, - 0, 0, 70, 2, 16, 0, - 32, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 31, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 34, 0, 0, 0, 70, 2, - 16, 0, 31, 0, 0, 0, - 50, 0, 0, 9, 114, 0, - 16, 0, 31, 0, 0, 0, - 86, 5, 16, 0, 19, 0, - 0, 0, 70, 2, 16, 0, - 31, 0, 0, 0, 70, 2, - 16, 0, 34, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 63, 1, 64, - 0, 0, 0, 0, 0, 63, - 0, 0, 0, 8, 114, 0, - 16, 0, 32, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 32, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 31, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 32, 0, 0, 0, 70, 2, - 16, 0, 31, 0, 0, 0, - 50, 0, 0, 9, 114, 0, - 16, 0, 31, 0, 0, 0, - 246, 15, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 0, - 31, 0, 0, 0, 70, 2, - 16, 0, 32, 0, 0, 0, - 0, 0, 0, 7, 114, 0, - 16, 0, 31, 0, 0, 0, - 70, 2, 16, 0, 30, 0, - 0, 0, 70, 2, 16, 0, - 31, 0, 0, 0, 55, 0, - 0, 9, 114, 0, 16, 0, - 32, 0, 0, 0, 246, 15, - 16, 0, 19, 0, 0, 0, - 70, 2, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 30, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 30, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 31, 0, - 0, 0, 246, 15, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 29, 0, - 0, 0, 55, 0, 0, 9, - 242, 0, 16, 0, 32, 0, - 0, 0, 246, 15, 16, 0, - 28, 0, 0, 0, 70, 14, - 16, 0, 32, 0, 0, 0, - 70, 14, 16, 0, 30, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 0, - 36, 0, 0, 0, 70, 2, - 16, 0, 41, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 33, 0, 0, 0, - 52, 0, 0, 7, 34, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 50, 0, 0, 10, - 18, 0, 16, 0, 33, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 55, 0, 0, 9, 50, 0, - 16, 0, 33, 0, 0, 0, - 246, 15, 16, 0, 36, 0, - 0, 0, 70, 0, 16, 0, - 33, 0, 0, 0, 70, 0, - 16, 0, 45, 0, 0, 0, - 55, 0, 0, 9, 50, 0, - 16, 0, 33, 0, 0, 0, - 246, 15, 16, 0, 31, 0, - 0, 0, 70, 0, 16, 0, - 33, 0, 0, 0, 70, 0, - 16, 0, 45, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 26, 0, 16, 0, 33, 0, - 0, 0, 26, 0, 16, 0, - 33, 0, 0, 0, 29, 0, - 0, 7, 130, 0, 16, 0, - 27, 0, 0, 0, 10, 0, - 16, 0, 33, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 27, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 5, 114, 0, - 16, 0, 28, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 54, 0, 0, 5, - 114, 0, 16, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 31, 0, 0, 0, 54, 0, - 0, 5, 242, 0, 16, 0, - 30, 0, 0, 0, 70, 14, - 16, 0, 32, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 7, 0, 0, 1, - 21, 0, 0, 1, 54, 0, - 0, 5, 114, 0, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 38, 0, 0, 0, - 54, 0, 0, 5, 114, 0, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 31, 0, - 0, 0, 54, 0, 0, 5, - 242, 0, 16, 0, 30, 0, - 0, 0, 70, 14, 16, 0, - 32, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 22, 0, 0, 1, - 165, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 52, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 114, 0, 16, 0, - 31, 0, 0, 0, 70, 2, - 16, 0, 28, 0, 0, 0, - 54, 0, 0, 5, 114, 0, - 16, 0, 32, 0, 0, 0, - 70, 2, 16, 0, 29, 0, - 0, 0, 54, 0, 0, 5, - 242, 0, 16, 0, 33, 0, - 0, 0, 70, 14, 16, 0, - 30, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 27, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 130, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 28, 0, - 0, 0, 30, 0, 0, 7, - 50, 0, 16, 0, 34, 0, - 0, 0, 150, 5, 16, 0, - 20, 0, 0, 0, 246, 15, - 16, 0, 27, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 35, 0, - 0, 0, 10, 0, 16, 0, - 34, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 34, 0, 0, 0, 26, 0, - 16, 0, 34, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 7, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 34, 0, 0, 0, 70, 14, - 16, 128, 65, 0, 0, 0, - 35, 0, 0, 0, 70, 14, - 16, 0, 34, 0, 0, 0, - 50, 0, 0, 9, 242, 0, - 16, 0, 36, 0, 0, 0, - 6, 0, 16, 0, 19, 0, - 0, 0, 70, 14, 16, 0, - 34, 0, 0, 0, 70, 14, - 16, 0, 35, 0, 0, 0, - 52, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 34, 0, 0, 0, 86, 5, - 16, 0, 19, 0, 0, 0, - 70, 2, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 31, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 36, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 37, 0, 0, 0, - 70, 2, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 34, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 16, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 50, 0, 0, 10, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 50, 0, 0, 10, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 36, 0, 0, 0, - 75, 0, 0, 5, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 0, 0, - 0, 8, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 34, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 51, 0, 0, 7, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 14, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 49, 0, - 0, 7, 18, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 49, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 10, 0, 16, 0, - 38, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 1, 64, - 0, 0, 236, 81, 184, 190, - 49, 0, 0, 7, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 49, 0, 0, 7, - 130, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 180, - 1, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 0, 0, 0, 8, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 128, 65, 0, - 0, 0, 34, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 56, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 14, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 0, 0, - 0, 8, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 32, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 14, 0, 0, 7, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 246, 15, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 0, 0, - 0, 7, 114, 0, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 55, 0, - 0, 9, 114, 0, 16, 0, - 31, 0, 0, 0, 246, 15, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 0, - 31, 0, 0, 0, 55, 0, - 0, 9, 242, 0, 16, 0, - 35, 0, 0, 0, 246, 15, - 16, 0, 29, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 35, 0, 0, 0, 68, 0, - 0, 5, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 49, 0, - 0, 7, 130, 0, 16, 0, - 31, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 58, 0, 16, 0, 31, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 191, 50, 0, 0, 9, - 114, 0, 16, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 246, 15, - 16, 0, 28, 0, 0, 0, - 70, 2, 16, 0, 32, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 36, 0, 0, 0, 0, 0, - 0, 7, 114, 0, 16, 0, - 34, 0, 0, 0, 70, 2, - 16, 0, 33, 0, 0, 0, - 70, 2, 16, 0, 34, 0, - 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 34, 0, - 0, 0, 246, 15, 16, 0, - 19, 0, 0, 0, 70, 2, - 16, 0, 34, 0, 0, 0, - 70, 2, 16, 0, 33, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 55, 0, 0, 9, 114, 0, - 16, 0, 32, 0, 0, 0, - 246, 15, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 32, 0, 0, 0, - 55, 0, 0, 9, 242, 0, - 16, 0, 33, 0, 0, 0, - 246, 15, 16, 0, 31, 0, - 0, 0, 70, 14, 16, 0, - 34, 0, 0, 0, 70, 14, - 16, 0, 33, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 22, 0, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 33, 0, - 0, 0, 86, 0, 0, 5, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 33, 0, 0, 0, 14, 0, - 0, 10, 130, 0, 16, 0, - 23, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 58, 0, 16, 0, 23, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 19, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 80, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 70, 2, 16, 0, 32, 0, - 0, 0, 70, 2, 16, 0, - 32, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 31, 0, 0, 0, 246, 15, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 32, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 27, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 34, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 33, 0, 0, 0, 246, 15, - 16, 0, 23, 0, 0, 0, - 70, 2, 16, 0, 34, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 34, 0, 0, 0, 70, 2, - 16, 0, 31, 0, 0, 0, - 50, 0, 0, 10, 114, 0, - 16, 0, 31, 0, 0, 0, - 246, 15, 16, 128, 65, 0, - 0, 0, 31, 0, 0, 0, - 70, 2, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 34, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 31, 0, 0, 0, 70, 2, - 16, 0, 31, 0, 0, 0, - 70, 2, 16, 0, 31, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 31, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 68, 0, 0, 5, 130, 0, - 16, 0, 31, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 56, 0, 0, 8, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 31, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 191, 50, 0, 0, 10, - 114, 0, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 31, 0, - 0, 0, 246, 15, 16, 0, - 27, 0, 0, 0, 70, 2, - 16, 0, 27, 0, 0, 0, - 168, 0, 0, 9, 114, 224, - 17, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 27, 0, 0, 0, - 21, 0, 0, 1, 50, 0, - 0, 9, 114, 0, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 0, 32, 0, 0, 0, - 246, 15, 16, 0, 23, 0, - 0, 0, 70, 2, 16, 0, - 25, 0, 0, 0, 168, 0, - 0, 9, 242, 224, 17, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 25, 0, 0, 0, 21, 0, - 0, 1, 30, 0, 0, 7, - 130, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 18, 0, - 0, 1, 165, 0, 0, 7, - 194, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 76, 0, 0, 0, 6, 244, - 17, 0, 0, 0, 0, 0, - 49, 0, 0, 10, 194, 0, - 16, 0, 19, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 246, 11, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 18, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 98, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 48, 0, 0, 0, 6, 241, - 17, 0, 1, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 80, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 49, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 20, 0, - 0, 0, 165, 0, 0, 7, - 98, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 44, 0, 0, 0, 6, 241, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 130, 0, - 16, 0, 22, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 8, 242, 0, - 16, 0, 31, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 8, - 242, 0, 16, 0, 27, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 130, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 26, 0, - 16, 0, 23, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 28, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 42, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 167, 0, - 0, 139, 2, 67, 0, 128, - 131, 153, 25, 0, 50, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 112, - 16, 0, 6, 0, 0, 0, - 30, 0, 0, 7, 242, 0, - 16, 0, 34, 0, 0, 0, - 150, 9, 16, 0, 20, 0, - 0, 0, 6, 5, 16, 0, - 34, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 35, 0, 0, 0, - 10, 0, 16, 0, 34, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 34, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 128, - 65, 0, 0, 0, 35, 0, - 0, 0, 70, 14, 16, 0, - 36, 0, 0, 0, 50, 0, - 0, 9, 242, 0, 16, 0, - 37, 0, 0, 0, 6, 0, - 16, 0, 19, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 35, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 38, 0, 0, 0, - 42, 0, 16, 0, 34, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 7, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 39, 0, - 0, 0, 70, 14, 16, 128, - 65, 0, 0, 0, 38, 0, - 0, 0, 70, 14, 16, 0, - 34, 0, 0, 0, 50, 0, - 0, 9, 242, 0, 16, 0, - 39, 0, 0, 0, 6, 0, - 16, 0, 19, 0, 0, 0, - 70, 14, 16, 0, 39, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 52, 0, 0, 7, - 130, 0, 16, 0, 39, 0, - 0, 0, 58, 0, 16, 0, - 39, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 242, 0, - 16, 0, 40, 0, 0, 0, - 70, 14, 16, 128, 65, 0, - 0, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 39, 0, - 0, 0, 56, 0, 0, 10, - 242, 0, 16, 0, 41, 0, - 0, 0, 70, 14, 16, 0, - 40, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 63, - 16, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 70, 2, 16, 0, - 41, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 41, 0, 0, 0, 58, 0, - 16, 0, 41, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 29, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 32, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 7, 0, 0, 1, 21, 0, - 0, 1, 68, 0, 0, 5, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 68, 0, - 0, 5, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 0, 0, - 0, 7, 114, 0, 16, 0, - 40, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 70, 2, 16, 0, 39, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 40, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 63, - 58, 0, 16, 0, 37, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 41, 0, 0, 0, 246, 15, - 16, 0, 32, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 41, 0, 0, 0, - 50, 0, 0, 13, 114, 0, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 40, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, - 0, 0, 70, 2, 16, 0, - 25, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 0, 41, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 52, 0, 0, 7, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 40, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 35, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 37, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 7, 0, - 0, 1, 21, 0, 0, 1, - 56, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 52, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 68, 0, 0, 5, 130, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 35, 0, 0, 0, - 49, 0, 0, 8, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 128, 129, 0, - 0, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 50, 0, 0, 10, - 114, 0, 16, 0, 40, 0, - 0, 0, 246, 15, 16, 128, - 65, 0, 0, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 41, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 50, 0, - 0, 10, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 32, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 40, 0, - 0, 0, 70, 2, 16, 0, - 40, 0, 0, 0, 246, 15, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 27, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 35, 0, - 0, 0, 70, 2, 16, 0, - 36, 0, 0, 0, 50, 0, - 0, 9, 114, 0, 16, 0, - 35, 0, 0, 0, 86, 5, - 16, 0, 19, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 35, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 34, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 34, 0, 0, 0, - 50, 0, 0, 9, 114, 0, - 16, 0, 34, 0, 0, 0, - 86, 5, 16, 0, 19, 0, - 0, 0, 70, 2, 16, 0, - 34, 0, 0, 0, 70, 2, - 16, 0, 38, 0, 0, 0, - 50, 0, 0, 9, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 35, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 63, 1, 64, - 0, 0, 0, 0, 0, 63, - 0, 0, 0, 8, 114, 0, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 35, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 34, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 35, 0, 0, 0, 70, 2, - 16, 0, 34, 0, 0, 0, - 50, 0, 0, 9, 114, 0, - 16, 0, 34, 0, 0, 0, - 246, 15, 16, 0, 29, 0, - 0, 0, 70, 2, 16, 0, - 34, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 0, 0, 0, 7, 114, 0, - 16, 0, 34, 0, 0, 0, - 70, 2, 16, 0, 31, 0, - 0, 0, 70, 2, 16, 0, - 34, 0, 0, 0, 55, 0, - 0, 9, 114, 0, 16, 0, - 34, 0, 0, 0, 6, 0, - 16, 0, 21, 0, 0, 0, - 70, 2, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 31, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 31, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 27, 0, - 0, 0, 246, 15, 16, 0, - 28, 0, 0, 0, 70, 2, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 0, 27, 0, - 0, 0, 55, 0, 0, 9, - 242, 0, 16, 0, 31, 0, - 0, 0, 246, 15, 16, 0, - 28, 0, 0, 0, 70, 14, - 16, 0, 34, 0, 0, 0, - 70, 14, 16, 0, 31, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 22, 0, 0, 1, 165, 0, - 0, 7, 130, 0, 16, 0, - 27, 0, 0, 0, 1, 64, - 0, 0, 52, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 114, 0, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 27, 0, 0, 0, 54, 0, - 0, 5, 242, 0, 16, 0, - 35, 0, 0, 0, 70, 14, - 16, 0, 31, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 48, 0, 0, 1, - 80, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 3, 0, - 4, 3, 58, 0, 16, 0, - 29, 0, 0, 0, 30, 0, - 0, 7, 50, 0, 16, 0, - 36, 0, 0, 0, 150, 5, - 16, 0, 20, 0, 0, 0, - 246, 15, 16, 0, 28, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 126, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 7, 0, 0, 0, - 0, 0, 0, 8, 242, 0, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 128, 65, 0, - 0, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 50, 0, 0, 9, - 242, 0, 16, 0, 38, 0, - 0, 0, 6, 0, 16, 0, - 19, 0, 0, 0, 70, 14, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 52, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 38, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 39, 0, 0, 0, - 70, 2, 16, 0, 25, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 38, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 70, 2, - 16, 0, 39, 0, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 68, 0, - 0, 5, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 49, 0, - 0, 7, 130, 0, 16, 0, - 34, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 58, 0, 16, 0, 34, 0, - 0, 0, 50, 0, 0, 9, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 191, 50, 0, 0, 9, - 114, 0, 16, 0, 39, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 246, 15, - 16, 0, 29, 0, 0, 0, - 70, 2, 16, 0, 34, 0, - 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 36, 0, - 0, 0, 86, 5, 16, 0, - 19, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 0, 0, - 0, 7, 114, 0, 16, 0, - 36, 0, 0, 0, 70, 2, - 16, 0, 35, 0, 0, 0, - 70, 2, 16, 0, 36, 0, - 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 36, 0, - 0, 0, 6, 0, 16, 0, - 21, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 35, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 55, 0, 0, 9, 114, 0, - 16, 0, 34, 0, 0, 0, - 246, 15, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 39, 0, 0, 0, 70, 2, - 16, 0, 34, 0, 0, 0, - 55, 0, 0, 9, 242, 0, - 16, 0, 35, 0, 0, 0, - 246, 15, 16, 0, 34, 0, - 0, 0, 70, 14, 16, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 35, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 28, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 22, 0, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 35, 0, - 0, 0, 86, 0, 0, 5, - 130, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 35, 0, 0, 0, 14, 0, - 0, 10, 130, 0, 16, 0, - 27, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 58, 0, 16, 0, 27, 0, - 0, 0, 31, 0, 4, 3, - 42, 0, 16, 0, 19, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 28, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 114, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 226, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 1, 64, 0, 0, - 80, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 70, 2, 16, 0, 34, 0, - 0, 0, 70, 2, 16, 0, - 34, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 68, 0, 0, 5, - 130, 0, 16, 0, 34, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 37, 0, 0, 0, 246, 15, - 16, 0, 34, 0, 0, 0, - 70, 2, 16, 0, 34, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 38, 0, - 0, 0, 70, 2, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 36, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 128, 65, 0, 0, 0, - 35, 0, 0, 0, 246, 15, - 16, 0, 27, 0, 0, 0, - 70, 2, 16, 0, 38, 0, - 0, 0, 16, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 50, 0, 0, 10, 114, 0, - 16, 0, 37, 0, 0, 0, - 246, 15, 16, 128, 65, 0, - 0, 0, 36, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 70, 2, 16, 0, - 38, 0, 0, 0, 16, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 70, 2, - 16, 0, 37, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 68, 0, 0, 5, 130, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 56, 0, 0, 8, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 128, - 65, 0, 0, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 58, 0, 16, 0, 29, 0, - 0, 0, 56, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 56, 0, 0, 7, 130, 0, - 16, 0, 29, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 52, 0, - 0, 7, 130, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 29, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 191, 50, 0, 0, 10, - 114, 0, 16, 0, 36, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 37, 0, - 0, 0, 246, 15, 16, 0, - 29, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 114, 224, - 17, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 36, 0, 0, 0, - 21, 0, 0, 1, 50, 0, - 0, 9, 114, 0, 16, 0, - 36, 0, 0, 0, 70, 2, - 16, 0, 34, 0, 0, 0, - 246, 15, 16, 0, 27, 0, - 0, 0, 70, 2, 16, 0, - 25, 0, 0, 0, 16, 0, - 0, 7, 18, 0, 16, 0, - 25, 0, 0, 0, 70, 2, - 16, 0, 34, 0, 0, 0, - 70, 2, 16, 0, 34, 0, - 0, 0, 165, 0, 0, 7, - 34, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 76, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 50, 0, 0, 9, 18, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 14, 0, 0, 7, 18, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 55, 0, - 0, 9, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 168, 0, - 0, 9, 242, 224, 17, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 36, 0, 0, 0, 21, 0, - 0, 1, 30, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 21, 0, - 0, 1, 165, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 84, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 72, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 51, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 49, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 18, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 88, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 165, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 31, 0, 4, 3, - 42, 0, 16, 0, 1, 0, - 0, 0, 165, 0, 0, 7, - 194, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 4, 0, 0, 0, 6, 244, - 17, 0, 1, 0, 0, 0, - 0, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 50, 0, - 0, 12, 194, 0, 16, 0, - 19, 0, 0, 0, 6, 0, - 16, 0, 20, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 23, 183, 209, 56, 23, 183, - 209, 56, 246, 11, 16, 0, - 19, 0, 0, 0, 0, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 6, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 18, 0, - 0, 1, 54, 0, 0, 8, - 194, 0, 16, 0, 19, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 42, 0, - 16, 0, 1, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 6, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 6, 0, 0, 0, - 49, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 1, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 6, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 2, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 6, 0, - 0, 0, 49, 0, 0, 7, - 34, 0, 16, 0, 20, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 20, 0, 0, 0, - 55, 0, 0, 9, 18, 0, - 16, 0, 20, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 254, 255, 255, 255, 10, 0, - 16, 0, 20, 0, 0, 0, - 30, 0, 0, 6, 18, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 10, 32, 2, 0, - 85, 0, 0, 7, 34, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 30, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 14, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 254, 66, 58, 0, - 16, 0, 19, 0, 0, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 84, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 14, 0, - 0, 10, 34, 0, 16, 0, - 20, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, - 26, 0, 16, 0, 20, 0, - 0, 0, 51, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 20, 0, 0, 0, - 41, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 2, 0, 0, 0, 30, 0, - 0, 10, 98, 0, 16, 0, - 20, 0, 0, 0, 6, 0, - 16, 0, 20, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 12, 0, 0, 0, - 24, 0, 0, 0, 0, 0, - 0, 0, 166, 0, 0, 7, - 18, 240, 17, 0, 5, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 56, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 166, 0, - 0, 7, 18, 240, 17, 0, - 5, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 166, 0, 0, 6, - 18, 240, 17, 0, 5, 0, - 0, 0, 42, 0, 16, 0, - 20, 0, 0, 0, 10, 32, - 2, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 165, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 100, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 41, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 30, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 116, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 19, 0, - 0, 0, 54, 0, 0, 4, - 130, 0, 16, 0, 19, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 33, 0, - 0, 7, 18, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 3, 65, - 0, 0, 3, 0, 4, 3, - 10, 0, 16, 0, 20, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 168, 0, 0, 9, 18, 224, - 17, 0, 2, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 30, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 4, 0, 0, 22, 0, - 0, 1, 21, 0, 0, 1, - 165, 0, 0, 7, 50, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 70, 240, 17, 0, - 5, 0, 0, 0, 165, 0, - 0, 7, 194, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 4, 0, 0, 0, - 6, 244, 17, 0, 5, 0, - 0, 0, 165, 0, 0, 7, - 98, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 28, 0, 0, 0, 6, 241, - 17, 0, 5, 0, 0, 0, - 165, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 92, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 39, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 165, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 100, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 130, 0, - 16, 0, 23, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 33, 0, 0, 7, - 18, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 10, 0, - 16, 0, 25, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 18, 0, - 16, 0, 25, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 112, - 16, 0, 15, 0, 0, 0, - 55, 0, 0, 9, 18, 0, - 16, 0, 25, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 0, 0, 0, 0, - 17, 0, 0, 8, 34, 0, - 16, 0, 25, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 70, 158, 144, 0, - 26, 0, 16, 0, 23, 0, - 0, 0, 50, 0, 0, 9, - 34, 0, 16, 0, 25, 0, - 0, 0, 26, 0, 16, 0, - 25, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 20, 0, - 0, 0, 51, 0, 0, 7, - 34, 0, 16, 0, 25, 0, - 0, 0, 26, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 255, 66, - 52, 0, 0, 7, 34, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 17, 0, - 0, 8, 66, 0, 16, 0, - 25, 0, 0, 0, 70, 14, - 16, 0, 36, 0, 0, 0, - 70, 158, 144, 0, 42, 0, - 16, 0, 23, 0, 0, 0, - 50, 0, 0, 9, 66, 0, - 16, 0, 25, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 20, 0, 0, 0, - 51, 0, 0, 7, 66, 0, - 16, 0, 25, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 255, 66, 52, 0, - 0, 7, 66, 0, 16, 0, - 25, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 27, 0, 0, 5, - 98, 0, 16, 0, 25, 0, - 0, 0, 86, 6, 16, 0, - 25, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 58, 0, 16, 0, 23, 0, - 0, 0, 41, 0, 0, 7, - 66, 0, 16, 0, 25, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 23, 0, 0, 0, - 35, 0, 0, 9, 34, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 1, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 129, 0, 60, 0, - 0, 7, 18, 0, 16, 0, - 25, 0, 0, 0, 10, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 168, 0, 0, 9, - 18, 224, 17, 0, 2, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 50, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 96, 0, 0, 0, 70, 240, - 17, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 25, 0, 0, 0, 54, 0, - 0, 4, 18, 0, 16, 0, - 21, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 33, 0, 0, 7, 130, 0, - 16, 0, 22, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 3, 0, - 4, 3, 58, 0, 16, 0, - 22, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 242, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 238, 17, 0, 0, 0, - 0, 0, 168, 0, 0, 9, - 242, 224, 17, 0, 1, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 30, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 31, 0, 0, 0, - 138, 0, 0, 9, 130, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 5, 0, - 0, 0, 1, 64, 0, 0, - 5, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 85, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 10, 0, 0, 0, 79, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 26, 0, - 16, 0, 4, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 0, 0, 7, - 18, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 25, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 55, 0, - 0, 9, 66, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 38, 0, - 0, 8, 0, 208, 0, 0, - 66, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 22, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 35, 0, 0, 9, 66, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 4, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 41, 0, 0, 10, 146, 0, - 16, 0, 25, 0, 0, 0, - 6, 8, 16, 0, 25, 0, - 0, 0, 2, 64, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 25, 0, 0, 0, 10, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 84, 0, 0, 7, - 18, 0, 16, 0, 25, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 25, 0, 0, 0, - 140, 0, 0, 10, 66, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 27, 0, - 0, 0, 1, 64, 0, 0, - 5, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 10, 32, 2, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 27, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 32, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 29, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 29, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 34, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 18, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 3, 0, 4, 3, - 10, 0, 16, 0, 36, 0, - 0, 0, 79, 0, 0, 7, - 18, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 10, 0, - 16, 0, 25, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 34, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 55, 0, 0, 9, 18, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 85, 0, 0, 7, 18, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 1, 0, - 0, 10, 242, 0, 16, 0, - 36, 0, 0, 0, 6, 0, - 16, 0, 36, 0, 0, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 8, 0, - 0, 0, 39, 0, 0, 10, - 242, 0, 16, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 36, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 140, 0, 0, 16, 242, 0, - 16, 0, 36, 0, 0, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 6, 32, 2, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 190, 24, 0, 1, 31, 0, - 4, 3, 10, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 36, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 26, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 36, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 36, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 8, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 42, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 36, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 36, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 36, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 58, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 13, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 5, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 36, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 36, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 167, 0, 0, 9, 18, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 5, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 87, 0, 0, 7, 50, 0, - 16, 0, 36, 0, 0, 0, - 230, 10, 16, 0, 2, 0, - 0, 0, 70, 0, 16, 0, - 36, 0, 0, 0, 1, 0, - 0, 7, 18, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 87, 0, 0, 7, - 34, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 5, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 1, 0, 0, 7, 18, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 87, 0, - 0, 7, 34, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 5, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 1, 0, 0, 7, - 18, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 134, 0, 0, 5, 18, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 34, 0, 0, 0, 58, 0, - 16, 0, 34, 0, 0, 0, - 1, 64, 0, 0, 32, 0, - 0, 0, 22, 0, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 22, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 58, 0, 16, 0, - 34, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 79, 0, 0, 7, 18, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 34, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 55, 0, - 0, 9, 130, 0, 16, 0, - 32, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 85, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 1, 0, 0, 10, - 242, 0, 16, 0, 36, 0, - 0, 0, 246, 15, 16, 0, - 32, 0, 0, 0, 2, 64, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 0, 0, 8, 0, 0, 0, - 39, 0, 0, 10, 242, 0, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 140, 0, - 0, 16, 242, 0, 16, 0, - 36, 0, 0, 0, 2, 64, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 6, 32, 2, 0, 70, 14, - 16, 0, 36, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 36, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 36, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 6, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 6, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 23, 0, - 0, 0, 31, 0, 4, 3, - 26, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 36, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 36, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 8, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 23, 0, 0, 0, 31, 0, - 4, 3, 42, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 36, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 21, 0, 0, 1, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 36, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 36, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 58, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 13, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 36, 0, - 0, 0, 70, 14, 16, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 23, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 5, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 36, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 36, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 36, 0, 0, 0, 70, 14, - 16, 0, 36, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 23, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 5, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 36, 0, 0, 0, 10, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 18, 0, - 0, 1, 54, 0, 0, 8, - 242, 0, 16, 0, 36, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 21, 0, - 0, 1, 87, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 42, 0, 16, 0, - 2, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 87, 0, 0, 7, 18, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 2, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 87, 0, 0, 7, - 50, 0, 16, 0, 36, 0, - 0, 0, 70, 0, 16, 0, - 5, 0, 0, 0, 230, 10, - 16, 0, 36, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 26, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 134, 0, 0, 5, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 29, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 21, 0, 0, 1, 31, 0, - 4, 3, 10, 0, 16, 0, - 7, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 11, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 29, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 0, 2, 10, 32, - 2, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 16, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 1, 18, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 21, 0, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 1, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 16, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 32, 0, 0, 0, - 26, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 58, 0, - 16, 0, 11, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 18, 0, - 0, 1, 167, 0, 0, 9, - 130, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 1, 16, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 2, 18, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 1, 0, - 0, 0, 31, 0, 4, 3, - 26, 0, 16, 0, 16, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 11, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 18, 0, 0, 1, 167, 0, - 0, 9, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 11, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 21, 0, - 0, 1, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 15, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 1, 0, 0, 0, 31, 0, - 4, 3, 42, 0, 16, 0, - 16, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 32, 0, 0, 0, 26, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 15, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 18, 0, 0, 1, - 167, 0, 0, 9, 130, 0, - 16, 0, 32, 0, 0, 0, - 26, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 21, 0, 0, 1, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 15, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 1, 0, 0, 0, - 31, 0, 4, 3, 58, 0, - 16, 0, 16, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 11, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 18, 0, - 0, 1, 167, 0, 0, 9, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 11, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 21, 0, 0, 1, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 15, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 1, 0, - 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 18, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 32, 0, - 0, 0, 26, 0, 16, 0, - 14, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 17, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 18, 0, 0, 1, 167, 0, - 0, 9, 130, 0, 16, 0, - 32, 0, 0, 0, 26, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 21, 0, - 0, 1, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 15, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 1, 0, 0, 0, 31, 0, - 4, 3, 26, 0, 16, 0, - 18, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 11, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 18, 0, 0, 1, - 167, 0, 0, 9, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 11, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 21, 0, 0, 1, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 15, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 1, 0, 0, 0, - 31, 0, 4, 3, 42, 0, - 16, 0, 18, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 32, 0, 0, 0, - 26, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 18, 0, - 0, 1, 167, 0, 0, 9, - 130, 0, 16, 0, 32, 0, - 0, 0, 26, 0, 16, 0, - 14, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 21, 0, 0, 1, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 15, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 1, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 18, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 11, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 13, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 10, 0, - 16, 0, 36, 0, 0, 0, - 18, 0, 0, 1, 167, 0, - 0, 9, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 11, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 21, 0, - 0, 1, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 15, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 1, 0, 0, 0, 31, 0, - 4, 3, 26, 0, 16, 0, - 15, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 32, 0, 0, 0, 26, 0, - 16, 0, 14, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 17, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 18, 0, 0, 1, - 167, 0, 0, 9, 130, 0, - 16, 0, 32, 0, 0, 0, - 26, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 21, 0, 0, 1, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 15, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 54, 0, 0, 5, 130, 0, - 16, 0, 32, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 18, 0, 16, 0, 36, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 48, 0, - 0, 1, 80, 0, 0, 7, - 34, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 3, 0, 4, 3, 26, 0, - 16, 0, 36, 0, 0, 0, - 79, 0, 0, 7, 34, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 27, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 0, 128, 131, 153, - 25, 0, 66, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 224, 17, 0, - 2, 0, 0, 0, 55, 0, - 0, 9, 66, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 36, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 85, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 25, 0, - 0, 0, 1, 0, 0, 10, - 242, 0, 16, 0, 37, 0, - 0, 0, 246, 15, 16, 0, - 36, 0, 0, 0, 2, 64, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 0, 0, 8, 0, 0, 0, - 39, 0, 0, 10, 242, 0, - 16, 0, 38, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 140, 0, - 0, 16, 242, 0, 16, 0, - 39, 0, 0, 0, 2, 64, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 6, 32, 2, 0, 70, 14, - 16, 0, 38, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 39, 0, 0, 0, 190, 24, - 0, 1, 31, 0, 4, 3, - 10, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 39, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 39, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 39, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 39, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 40, 0, 0, 0, 26, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 40, 0, 0, 0, 42, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 39, 0, 0, 0, 70, 14, - 16, 0, 39, 0, 0, 0, - 70, 14, 16, 0, 40, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 39, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 26, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 39, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 39, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 39, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 39, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 40, 0, - 0, 0, 26, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 6, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 40, 0, - 0, 0, 26, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 40, 0, - 0, 0, 10, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 39, 0, - 0, 0, 70, 14, 16, 0, - 39, 0, 0, 0, 70, 14, - 16, 0, 40, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 39, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 39, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 39, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 39, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 42, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 39, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 39, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 39, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 39, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 40, 0, 0, 0, - 42, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 40, 0, 0, 0, - 26, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 40, 0, 0, 0, - 42, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 40, 0, 0, 0, - 42, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 39, 0, 0, 0, - 70, 14, 16, 0, 39, 0, - 0, 0, 70, 14, 16, 0, - 40, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 39, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 39, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 39, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 39, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 39, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 39, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 8, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 39, 0, 0, 0, 70, 14, - 16, 0, 39, 0, 0, 0, - 70, 14, 16, 0, 40, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 39, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 39, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 5, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 39, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 39, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 39, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 39, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 40, 0, - 0, 0, 10, 0, 16, 0, - 6, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 40, 0, - 0, 0, 26, 0, 16, 0, - 13, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 40, 0, - 0, 0, 10, 0, 16, 0, - 14, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 40, 0, - 0, 0, 42, 0, 16, 0, - 13, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 39, 0, - 0, 0, 70, 14, 16, 0, - 39, 0, 0, 0, 70, 14, - 16, 0, 40, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 39, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 39, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 39, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 39, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 5, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 38, 0, 0, 0, 42, 0, - 16, 0, 10, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 140, 0, - 0, 11, 130, 0, 16, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 4, 0, 0, 0, - 1, 64, 0, 0, 5, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 11, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 1, 64, 0, 0, 0, 16, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 31, 0, 4, 3, - 26, 0, 16, 0, 36, 0, - 0, 0, 30, 0, 0, 7, - 34, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 87, 0, 0, 7, 34, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 32, 0, - 0, 10, 226, 0, 16, 0, - 38, 0, 0, 0, 86, 14, - 16, 0, 38, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 87, 0, 0, 7, - 18, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 38, 0, 0, 0, - 1, 0, 0, 7, 34, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 87, 0, - 0, 7, 18, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 38, 0, - 0, 0, 1, 0, 0, 7, - 34, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 87, 0, 0, 7, 18, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 38, 0, 0, 0, 1, 0, - 0, 7, 34, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 138, 0, 0, 8, - 34, 0, 16, 0, 36, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 134, 0, - 0, 5, 34, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 36, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 28, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 224, 17, 0, 2, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 36, 0, - 0, 0, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 10, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 11, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 87, 0, - 0, 7, 194, 0, 16, 0, - 36, 0, 0, 0, 166, 14, - 16, 0, 2, 0, 0, 0, - 86, 9, 16, 0, 37, 0, - 0, 0, 1, 0, 0, 7, - 66, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 87, 0, 0, 7, 130, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 5, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 1, 0, - 0, 7, 66, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 36, 0, - 0, 0, 87, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 5, 0, 0, 0, 10, 0, - 16, 0, 38, 0, 0, 0, - 1, 0, 0, 7, 66, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 42, 0, 16, 0, - 36, 0, 0, 0, 134, 0, - 0, 5, 66, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 11, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 21, 0, - 0, 1, 30, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 36, 0, 0, 0, - 10, 0, 16, 0, 36, 0, - 0, 0, 1, 64, 0, 0, - 32, 0, 0, 0, 22, 0, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 22, 0, - 0, 0, 79, 0, 0, 7, - 130, 0, 16, 0, 32, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 10, 0, - 16, 0, 25, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 27, 0, - 0, 0, 10, 0, 16, 0, - 36, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 34, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 55, 0, 0, 9, 34, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 85, 0, 0, 7, 66, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 23, 0, 0, 0, 1, 0, - 0, 10, 242, 0, 16, 0, - 37, 0, 0, 0, 166, 10, - 16, 0, 36, 0, 0, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 8, 0, - 0, 0, 39, 0, 0, 10, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 140, 0, 0, 16, 242, 0, - 16, 0, 37, 0, 0, 0, - 2, 64, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 6, 32, 2, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 23, 0, - 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 37, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 38, 0, 0, 0, 26, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 38, 0, 0, 0, 42, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 38, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 23, 0, 0, 0, 31, 0, - 4, 3, 26, 0, 16, 0, - 7, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 37, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 38, 0, 0, 0, - 26, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 38, 0, 0, 0, - 26, 0, 16, 0, 9, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 21, 0, 0, 1, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 31, 0, 4, 3, 42, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 8, 18, 0, - 16, 0, 37, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 37, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 37, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 18, 0, 16, 0, 38, 0, - 0, 0, 42, 0, 16, 0, - 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 34, 0, 16, 0, 38, 0, - 0, 0, 26, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 66, 0, 16, 0, 38, 0, - 0, 0, 42, 0, 16, 0, - 9, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 167, 0, 0, 9, - 130, 0, 16, 0, 38, 0, - 0, 0, 42, 0, 16, 0, - 8, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 240, 17, 0, 3, 0, - 0, 0, 60, 0, 0, 7, - 242, 0, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 38, 0, 0, 0, - 168, 0, 0, 8, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 32, 2, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 26, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 37, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 12, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 190, 24, - 0, 1, 31, 0, 4, 3, - 58, 0, 16, 0, 23, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 7, 0, - 0, 0, 167, 0, 0, 8, - 18, 0, 16, 0, 37, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 37, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 18, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 34, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 8, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 9, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 167, 0, - 0, 9, 130, 0, 16, 0, - 38, 0, 0, 0, 10, 0, - 16, 0, 13, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 60, 0, - 0, 7, 242, 0, 16, 0, - 37, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 38, 0, - 0, 0, 168, 0, 0, 8, - 18, 240, 17, 0, 3, 0, - 0, 0, 10, 32, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 26, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 37, 0, 0, 0, 168, 0, - 0, 9, 18, 240, 17, 0, - 3, 0, 0, 0, 42, 0, - 16, 0, 12, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 58, 0, 16, 0, - 37, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 190, 24, 0, 1, 31, 0, - 4, 3, 58, 0, 16, 0, - 23, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 5, 0, 0, 0, 167, 0, - 0, 8, 18, 0, 16, 0, - 37, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 6, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 38, 0, 0, 0, - 26, 0, 16, 0, 13, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 14, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 38, 0, 0, 0, - 42, 0, 16, 0, 13, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 60, 0, 0, 7, 242, 0, - 16, 0, 37, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 70, 14, 16, 0, - 38, 0, 0, 0, 168, 0, - 0, 8, 18, 240, 17, 0, - 3, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 26, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 37, 0, 0, 0, - 168, 0, 0, 9, 18, 240, - 17, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 12, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 37, 0, 0, 0, - 21, 0, 0, 1, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 167, 0, 0, 9, 18, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 5, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 34, 0, - 16, 0, 37, 0, 0, 0, - 10, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 66, 0, - 16, 0, 37, 0, 0, 0, - 26, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 37, 0, 0, 0, - 42, 0, 16, 0, 10, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 1, 0, 0, 10, 242, 0, - 16, 0, 38, 0, 0, 0, - 166, 10, 16, 0, 36, 0, - 0, 0, 2, 64, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 10, 0, - 16, 0, 38, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 87, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 37, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 39, 0, 0, 10, 114, 0, - 16, 0, 38, 0, 0, 0, - 150, 7, 16, 0, 38, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32, 0, - 0, 10, 114, 0, 16, 0, - 38, 0, 0, 0, 70, 2, - 16, 0, 38, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 87, 0, 0, 7, - 114, 0, 16, 0, 38, 0, - 0, 0, 150, 7, 16, 0, - 37, 0, 0, 0, 70, 2, - 16, 0, 38, 0, 0, 0, - 1, 0, 0, 7, 130, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 10, 0, 16, 0, - 38, 0, 0, 0, 1, 0, - 0, 7, 130, 0, 16, 0, - 36, 0, 0, 0, 26, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 36, 0, - 0, 0, 42, 0, 16, 0, - 38, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 140, 0, 0, 11, 66, 0, - 16, 0, 36, 0, 0, 0, - 1, 64, 0, 0, 4, 0, - 0, 0, 1, 64, 0, 0, - 5, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 30, 0, 0, 7, - 66, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 11, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 30, 0, 0, 7, 66, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 36, 0, - 0, 0, 1, 64, 0, 0, - 0, 16, 0, 0, 167, 0, - 0, 9, 66, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 240, 17, 0, - 3, 0, 0, 0, 138, 0, - 0, 8, 130, 0, 16, 0, - 36, 0, 0, 0, 10, 32, - 2, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 134, 0, 0, 5, 130, 0, - 16, 0, 36, 0, 0, 0, - 58, 0, 16, 0, 36, 0, - 0, 0, 30, 0, 0, 7, - 66, 0, 16, 0, 36, 0, - 0, 0, 58, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 18, 0, 0, 1, 54, 0, - 0, 8, 242, 0, 16, 0, - 37, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 66, 0, - 16, 0, 36, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 21, 0, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 32, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 42, 0, 16, 0, - 36, 0, 0, 0, 168, 0, - 0, 9, 18, 224, 17, 0, - 2, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 21, 0, - 0, 1, 190, 24, 0, 1, - 31, 0, 4, 3, 58, 0, - 16, 0, 23, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 7, 0, 0, 0, - 167, 0, 0, 9, 130, 0, - 16, 0, 32, 0, 0, 0, - 42, 0, 16, 0, 11, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 3, 0, 0, 0, - 87, 0, 0, 7, 98, 0, - 16, 0, 36, 0, 0, 0, - 166, 11, 16, 0, 2, 0, - 0, 0, 6, 1, 16, 0, - 37, 0, 0, 0, 1, 0, - 0, 7, 34, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 87, 0, 0, 7, - 194, 0, 16, 0, 36, 0, - 0, 0, 6, 4, 16, 0, - 5, 0, 0, 0, 166, 14, - 16, 0, 37, 0, 0, 0, - 1, 0, 0, 7, 34, 0, - 16, 0, 36, 0, 0, 0, - 42, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 1, 0, - 0, 7, 34, 0, 16, 0, - 36, 0, 0, 0, 58, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 134, 0, 0, 5, - 34, 0, 16, 0, 36, 0, - 0, 0, 26, 0, 16, 0, - 36, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 32, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 26, 0, 16, 0, 36, 0, - 0, 0, 168, 0, 0, 9, - 18, 240, 17, 0, 3, 0, - 0, 0, 42, 0, 16, 0, - 11, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 21, 0, 0, 1, - 21, 0, 0, 1, 21, 0, - 0, 1, 30, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 28, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 22, 0, 0, 1, 54, 0, - 0, 4, 130, 0, 16, 0, - 19, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 33, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 3, 0, - 4, 3, 10, 0, 16, 0, - 21, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 0, 128, 131, 153, - 25, 0, 130, 0, 16, 0, - 22, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 224, 17, 0, - 2, 0, 0, 0, 42, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 1, 64, 0, 0, 16, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 255, 255, 255, 255, - 167, 0, 0, 139, 2, 35, - 0, 128, 131, 153, 25, 0, - 18, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 224, 17, 0, 2, 0, - 0, 0, 42, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 16, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 23, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 55, 0, - 0, 9, 18, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 23, 0, 0, 0, 39, 0, - 0, 7, 130, 0, 16, 0, - 23, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 31, 0, 4, 3, - 58, 0, 16, 0, 23, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 22, 0, - 0, 0, 42, 0, 16, 0, - 19, 0, 0, 0, 58, 0, - 16, 0, 22, 0, 0, 0, - 168, 0, 0, 9, 18, 224, - 17, 0, 2, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 168, 0, 0, 9, - 18, 224, 17, 0, 2, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 21, 0, 0, 1, - 30, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 4, 0, 0, 22, 0, - 0, 1, 165, 0, 0, 7, - 50, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 96, 0, 0, 0, 70, 240, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 4, 130, 0, - 16, 0, 19, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 33, 0, 0, 7, - 18, 0, 16, 0, 21, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 10, 0, - 16, 0, 21, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 25, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 18, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 1, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 37, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 238, 17, 0, - 1, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 21, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 168, 0, 0, 9, - 242, 224, 17, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 37, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 84, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 18, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 165, 0, - 0, 7, 130, 0, 16, 0, - 22, 0, 0, 0, 1, 64, - 0, 0, 100, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 23, 0, - 0, 0, 1, 64, 0, 0, - 112, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 54, 0, 0, 4, 18, 0, - 16, 0, 25, 0, 0, 0, - 10, 32, 2, 0, 48, 0, - 0, 1, 33, 0, 0, 7, - 34, 0, 16, 0, 25, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 3, 0, 4, 3, 26, 0, - 16, 0, 25, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 22, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 34, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 1, 0, 0, 7, 34, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 25, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 37, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 238, 17, 0, - 0, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 23, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 226, 0, 16, 0, - 36, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 121, 16, 0, - 14, 0, 0, 0, 17, 0, - 0, 8, 66, 0, 16, 0, - 25, 0, 0, 0, 70, 14, - 16, 0, 37, 0, 0, 0, - 70, 158, 144, 0, 26, 0, - 16, 0, 23, 0, 0, 0, - 50, 0, 0, 9, 66, 0, - 16, 0, 25, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 42, 0, - 16, 0, 20, 0, 0, 0, - 51, 0, 0, 7, 66, 0, - 16, 0, 25, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 255, 66, 52, 0, - 0, 7, 66, 0, 16, 0, - 25, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 17, 0, 0, 8, - 130, 0, 16, 0, 25, 0, - 0, 0, 70, 14, 16, 0, - 37, 0, 0, 0, 70, 158, - 144, 0, 42, 0, 16, 0, - 23, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 20, 0, 0, 0, 51, 0, - 0, 7, 130, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 25, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 255, 66, 52, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 27, 0, 0, 5, 194, 0, - 16, 0, 25, 0, 0, 0, - 166, 14, 16, 0, 25, 0, - 0, 0, 35, 0, 0, 9, - 66, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 128, 0, 0, 0, - 42, 0, 16, 0, 25, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 1, 64, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 7, 130, 0, - 16, 0, 27, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 52, 54, 0, - 0, 8, 114, 0, 16, 0, - 38, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 130, 0, - 16, 0, 28, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 54, 0, 0, 5, - 130, 0, 16, 0, 32, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 48, 0, - 0, 1, 34, 0, 0, 7, - 130, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 58, 0, - 16, 0, 32, 0, 0, 0, - 3, 0, 4, 3, 58, 0, - 16, 0, 38, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 38, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 32, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 18, 0, - 16, 0, 39, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 30, 0, 0, 10, 226, 0, - 16, 0, 39, 0, 0, 0, - 246, 15, 16, 0, 38, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 130, 0, - 16, 0, 38, 0, 0, 0, - 26, 0, 16, 0, 39, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 0, 128, 131, 153, 25, 0, - 34, 0, 16, 0, 39, 0, - 0, 0, 42, 0, 16, 0, - 39, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 224, 17, 0, 2, 0, - 0, 0, 167, 0, 0, 139, - 2, 35, 0, 128, 131, 153, - 25, 0, 66, 0, 16, 0, - 39, 0, 0, 0, 58, 0, - 16, 0, 39, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 6, 224, 17, 0, - 2, 0, 0, 0, 84, 0, - 0, 7, 18, 0, 16, 0, - 39, 0, 0, 0, 58, 0, - 16, 0, 38, 0, 0, 0, - 10, 0, 16, 0, 39, 0, - 0, 0, 84, 0, 0, 7, - 18, 0, 16, 0, 39, 0, - 0, 0, 26, 0, 16, 0, - 39, 0, 0, 0, 10, 0, - 16, 0, 39, 0, 0, 0, - 36, 0, 0, 7, 130, 0, - 16, 0, 38, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 26, 0, 16, 0, - 39, 0, 0, 0, 36, 0, - 0, 7, 130, 0, 16, 0, - 38, 0, 0, 0, 42, 0, - 16, 0, 39, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 36, 0, 0, 7, - 130, 0, 16, 0, 38, 0, - 0, 0, 58, 0, 16, 0, - 38, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 226, 0, - 16, 0, 39, 0, 0, 0, - 6, 9, 16, 0, 38, 0, - 0, 0, 54, 0, 0, 5, - 18, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 28, 0, 0, 0, 54, 0, - 0, 5, 34, 0, 16, 0, - 40, 0, 0, 0, 10, 0, - 16, 0, 39, 0, 0, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 66, 0, 16, 0, - 40, 0, 0, 0, 26, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 38, 0, - 0, 0, 3, 0, 4, 3, - 42, 0, 16, 0, 40, 0, - 0, 0, 39, 0, 0, 7, - 66, 0, 16, 0, 40, 0, - 0, 0, 10, 0, 16, 0, - 25, 0, 0, 0, 26, 0, - 16, 0, 40, 0, 0, 0, - 31, 0, 4, 3, 42, 0, - 16, 0, 40, 0, 0, 0, - 30, 0, 0, 7, 66, 0, - 16, 0, 40, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 40, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 242, 0, - 16, 0, 41, 0, 0, 0, - 42, 0, 16, 0, 40, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 70, 238, - 17, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 114, 0, - 16, 0, 41, 0, 0, 0, - 70, 2, 16, 0, 37, 0, - 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 41, 0, - 0, 0, 16, 0, 0, 7, - 66, 0, 16, 0, 40, 0, - 0, 0, 70, 2, 16, 0, - 41, 0, 0, 0, 70, 2, - 16, 0, 41, 0, 0, 0, - 49, 0, 0, 7, 130, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 21, 0, - 0, 0, 42, 0, 16, 0, - 40, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 40, 0, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 40, 0, 0, 0, 26, 0, - 16, 0, 40, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 54, 0, 0, 5, - 34, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 40, 0, 0, 0, 7, 0, - 0, 1, 21, 0, 0, 1, - 165, 0, 0, 7, 130, 0, - 16, 0, 40, 0, 0, 0, - 1, 64, 0, 0, 112, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 39, 0, - 0, 7, 18, 0, 16, 0, - 42, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 31, 0, 4, 3, - 10, 0, 16, 0, 42, 0, - 0, 0, 165, 0, 0, 7, - 18, 0, 16, 0, 42, 0, - 0, 0, 1, 64, 0, 0, - 100, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 42, 0, 0, 0, - 26, 0, 16, 0, 40, 0, - 0, 0, 10, 0, 16, 0, - 42, 0, 0, 0, 167, 0, - 0, 139, 2, 35, 0, 128, - 131, 153, 25, 0, 18, 0, - 16, 0, 42, 0, 0, 0, - 10, 0, 16, 0, 42, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 224, - 17, 0, 2, 0, 0, 0, - 1, 0, 0, 7, 18, 0, - 16, 0, 42, 0, 0, 0, - 10, 0, 16, 0, 42, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 0, 0, 30, 0, - 0, 7, 130, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 42, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 114, 0, 16, 0, - 42, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 114, 16, 0, - 14, 0, 0, 0, 0, 0, - 0, 8, 114, 0, 16, 0, - 42, 0, 0, 0, 150, 7, - 16, 0, 36, 0, 0, 0, - 70, 2, 16, 128, 65, 0, - 0, 0, 42, 0, 0, 0, - 16, 0, 0, 7, 130, 0, - 16, 0, 40, 0, 0, 0, - 70, 2, 16, 0, 42, 0, - 0, 0, 70, 2, 16, 0, - 42, 0, 0, 0, 29, 0, - 0, 7, 18, 0, 16, 0, - 42, 0, 0, 0, 10, 0, - 16, 0, 21, 0, 0, 0, - 58, 0, 16, 0, 40, 0, - 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 42, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 42, 0, - 0, 0, 26, 0, 16, 0, - 40, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 5, 34, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 42, 0, - 0, 0, 7, 0, 0, 1, - 21, 0, 0, 1, 0, 0, - 0, 7, 130, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 52, 14, 0, 0, 7, - 130, 0, 16, 0, 40, 0, - 0, 0, 10, 0, 16, 0, - 21, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 68, 0, 0, 5, 130, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 40, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 40, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 191, - 51, 0, 0, 7, 130, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 40, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 18, 0, - 0, 1, 54, 0, 0, 5, - 130, 0, 16, 0, 40, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 21, 0, - 0, 1, 0, 0, 0, 7, - 66, 0, 16, 0, 40, 0, - 0, 0, 42, 0, 16, 0, - 40, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 52, - 68, 0, 0, 5, 66, 0, - 16, 0, 40, 0, 0, 0, - 42, 0, 16, 0, 40, 0, - 0, 0, 50, 0, 0, 9, - 66, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 40, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 191, 52, 0, 0, 7, - 66, 0, 16, 0, 40, 0, - 0, 0, 42, 0, 16, 0, - 40, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 18, 0, - 16, 0, 42, 0, 0, 0, - 42, 0, 16, 0, 40, 0, - 0, 0, 42, 0, 16, 0, - 40, 0, 0, 0, 56, 0, - 0, 7, 130, 0, 16, 0, - 40, 0, 0, 0, 58, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 42, 0, - 0, 0, 0, 0, 0, 7, - 130, 0, 16, 0, 41, 0, - 0, 0, 58, 0, 16, 0, - 27, 0, 0, 0, 58, 0, - 16, 0, 41, 0, 0, 0, - 14, 0, 0, 7, 130, 0, - 16, 0, 40, 0, 0, 0, - 58, 0, 16, 0, 40, 0, - 0, 0, 58, 0, 16, 0, - 41, 0, 0, 0, 50, 0, - 0, 9, 226, 0, 16, 0, - 39, 0, 0, 0, 246, 15, - 16, 0, 40, 0, 0, 0, - 6, 9, 16, 0, 41, 0, - 0, 0, 86, 14, 16, 0, - 39, 0, 0, 0, 0, 0, - 0, 7, 18, 0, 16, 0, - 40, 0, 0, 0, 42, 0, - 16, 0, 40, 0, 0, 0, - 10, 0, 16, 0, 40, 0, - 0, 0, 21, 0, 0, 1, - 30, 0, 0, 7, 34, 0, - 16, 0, 40, 0, 0, 0, - 26, 0, 16, 0, 40, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 22, 0, - 0, 1, 54, 0, 0, 5, - 114, 0, 16, 0, 38, 0, - 0, 0, 150, 7, 16, 0, - 39, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 28, 0, 0, 0, 10, 0, - 16, 0, 40, 0, 0, 0, - 30, 0, 0, 7, 130, 0, - 16, 0, 32, 0, 0, 0, - 58, 0, 16, 0, 32, 0, - 0, 0, 1, 64, 0, 0, - 128, 0, 0, 0, 22, 0, - 0, 1, 165, 0, 0, 7, - 66, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 72, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 56, 0, 0, 7, 66, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 37, 0, - 0, 0, 42, 0, 16, 0, - 25, 0, 0, 0, 14, 0, - 0, 7, 66, 0, 16, 0, - 25, 0, 0, 0, 42, 0, - 16, 0, 25, 0, 0, 0, - 58, 0, 16, 0, 28, 0, - 0, 0, 165, 0, 0, 7, - 130, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 96, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 30, 0, 0, 7, 34, 0, - 16, 0, 25, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 58, 0, 16, 0, - 25, 0, 0, 0, 167, 0, - 0, 139, 2, 131, 0, 128, - 131, 153, 25, 0, 226, 0, - 16, 0, 36, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 233, - 17, 0, 1, 0, 0, 0, - 50, 0, 0, 9, 226, 0, - 16, 0, 36, 0, 0, 0, - 6, 9, 16, 0, 38, 0, - 0, 0, 166, 10, 16, 0, - 25, 0, 0, 0, 86, 14, - 16, 0, 36, 0, 0, 0, - 168, 0, 0, 9, 114, 224, - 17, 0, 1, 0, 0, 0, - 26, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 150, 7, - 16, 0, 36, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 25, 0, 0, 0, - 10, 0, 16, 0, 25, 0, - 0, 0, 1, 64, 0, 0, - 0, 4, 0, 0, 22, 0, - 0, 1, 190, 24, 0, 1, - 165, 0, 0, 7, 130, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 96, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 4, 18, 0, 16, 0, - 20, 0, 0, 0, 10, 32, - 2, 0, 48, 0, 0, 1, - 33, 0, 0, 7, 34, 0, - 16, 0, 20, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 26, 0, 16, 0, - 19, 0, 0, 0, 3, 0, - 4, 3, 26, 0, 16, 0, - 20, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 167, 0, 0, 139, - 2, 131, 0, 128, 131, 153, - 25, 0, 242, 0, 16, 0, - 25, 0, 0, 0, 26, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 238, 17, 0, - 1, 0, 0, 0, 30, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 20, 0, - 0, 0, 168, 0, 0, 9, - 242, 224, 17, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 25, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 165, 0, - 0, 7, 34, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 100, 0, 0, 0, - 6, 240, 17, 0, 0, 0, - 0, 0, 54, 0, 0, 4, - 130, 0, 16, 0, 19, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 33, 0, - 0, 7, 18, 0, 16, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 3, 0, 4, 3, - 10, 0, 16, 0, 20, 0, - 0, 0, 30, 0, 0, 7, - 18, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 167, 0, 0, 139, 2, 35, - 0, 128, 131, 153, 25, 0, - 18, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 224, 17, 0, 2, 0, - 0, 0, 85, 0, 0, 7, - 18, 0, 16, 0, 20, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 16, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 20, 0, 0, 0, - 42, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 20, 0, 0, 0, 168, 0, - 0, 9, 18, 224, 17, 0, - 2, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, - 255, 255, 255, 255, 30, 0, - 0, 7, 34, 0, 16, 0, - 20, 0, 0, 0, 10, 0, - 16, 0, 20, 0, 0, 0, - 1, 64, 0, 0, 1, 0, - 0, 0, 168, 0, 0, 9, - 18, 224, 17, 0, 2, 0, - 0, 0, 26, 0, 16, 0, - 20, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 255, 255, - 255, 255, 30, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 4, 0, 0, - 22, 0, 0, 1, 21, 0, - 0, 1, 31, 0, 0, 2, - 10, 32, 2, 0, 165, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 8, 0, 0, 0, - 6, 240, 17, 0, 1, 0, - 0, 0, 56, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 122, 68, - 28, 0, 0, 5, 18, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 83, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 1, 0, 0, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 104, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 30, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 166, 0, 0, 7, - 18, 240, 17, 0, 1, 0, - 0, 0, 1, 64, 0, 0, - 104, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 21, 0, 0, 1, 190, 24, - 0, 1, 165, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 104, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 165, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 104, 0, - 0, 0, 6, 240, 17, 0, - 0, 0, 0, 0, 80, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 19, 0, - 0, 0, 165, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 34, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 4, - 66, 0, 16, 0, 19, 0, - 0, 0, 10, 32, 2, 0, - 48, 0, 0, 1, 80, 0, - 0, 7, 130, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 3, 0, 4, 3, - 58, 0, 16, 0, 19, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 114, 0, 16, 0, 20, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 70, 226, 17, 0, 0, 0, - 0, 0, 30, 0, 0, 7, - 130, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 167, 0, 0, 139, 2, 131, - 0, 128, 131, 153, 25, 0, - 226, 0, 16, 0, 23, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 6, 233, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 20, 0, - 0, 0, 70, 2, 16, 0, - 20, 0, 0, 0, 150, 7, - 16, 128, 65, 0, 0, 0, - 23, 0, 0, 0, 52, 0, - 0, 9, 130, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 128, 129, 0, 0, 0, - 20, 0, 0, 0, 10, 0, - 16, 128, 129, 0, 0, 0, - 20, 0, 0, 0, 52, 0, - 0, 8, 130, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 128, 129, 0, 0, 0, - 20, 0, 0, 0, 58, 0, - 16, 0, 19, 0, 0, 0, - 52, 0, 0, 7, 34, 0, - 16, 0, 19, 0, 0, 0, - 26, 0, 16, 0, 19, 0, - 0, 0, 58, 0, 16, 0, - 19, 0, 0, 0, 30, 0, - 0, 7, 66, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 4, - 0, 0, 22, 0, 0, 1, - 31, 0, 0, 2, 10, 32, - 2, 0, 165, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 100, 0, 0, 0, 6, 240, - 17, 0, 1, 0, 0, 0, - 30, 0, 0, 7, 18, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 166, 0, - 0, 7, 18, 240, 17, 0, - 1, 0, 0, 0, 1, 64, - 0, 0, 100, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 165, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 104, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 104, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 30, 0, - 0, 8, 18, 0, 16, 0, - 19, 0, 0, 0, 10, 0, - 16, 128, 65, 0, 0, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 166, 0, 0, 7, 18, 240, - 17, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 104, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 21, 0, - 0, 1, 165, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 1, 64, 0, 0, - 112, 0, 0, 0, 6, 240, - 17, 0, 0, 0, 0, 0, - 165, 0, 0, 7, 66, 0, - 16, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 8, 0, - 0, 0, 6, 240, 17, 0, - 1, 0, 0, 0, 56, 0, - 0, 7, 18, 0, 16, 0, - 19, 0, 0, 0, 42, 0, - 16, 0, 19, 0, 0, 0, - 10, 0, 16, 0, 19, 0, - 0, 0, 49, 0, 0, 7, - 18, 0, 16, 0, 19, 0, - 0, 0, 10, 0, 16, 0, - 19, 0, 0, 0, 26, 0, - 16, 0, 19, 0, 0, 0, - 31, 0, 4, 3, 10, 0, - 16, 0, 19, 0, 0, 0, - 166, 0, 0, 7, 18, 240, - 17, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 100, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 21, 0, - 0, 1, 21, 0, 0, 1, - 30, 0, 0, 7, 18, 0, - 16, 0, 17, 0, 0, 0, - 10, 0, 16, 0, 17, 0, - 0, 0, 1, 64, 0, 0, - 1, 0, 0, 0, 22, 0, - 0, 1, 190, 24, 0, 1, - 21, 0, 0, 1, 31, 0, - 0, 2, 10, 32, 2, 0, - 165, 0, 0, 7, 242, 0, - 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 254, 17, 0, - 1, 0, 0, 0, 165, 0, - 0, 7, 242, 0, 16, 0, - 1, 0, 0, 0, 1, 64, - 0, 0, 16, 0, 0, 0, - 70, 254, 17, 0, 1, 0, - 0, 0, 165, 0, 0, 7, - 242, 0, 16, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 32, 0, 0, 0, 70, 254, - 17, 0, 1, 0, 0, 0, - 165, 0, 0, 7, 242, 0, - 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 48, 0, - 0, 0, 70, 254, 17, 0, - 1, 0, 0, 0, 165, 0, - 0, 7, 242, 0, 16, 0, - 4, 0, 0, 0, 1, 64, - 0, 0, 64, 0, 0, 0, - 70, 254, 17, 0, 1, 0, - 0, 0, 165, 0, 0, 7, - 242, 0, 16, 0, 5, 0, - 0, 0, 1, 64, 0, 0, - 80, 0, 0, 0, 70, 254, - 17, 0, 1, 0, 0, 0, - 165, 0, 0, 7, 242, 0, - 16, 0, 6, 0, 0, 0, - 1, 64, 0, 0, 96, 0, - 0, 0, 70, 254, 17, 0, - 1, 0, 0, 0, 165, 0, - 0, 7, 50, 0, 16, 0, - 7, 0, 0, 0, 1, 64, - 0, 0, 112, 0, 0, 0, - 70, 240, 17, 0, 1, 0, - 0, 0, 168, 0, 0, 8, - 242, 224, 17, 0, 3, 0, - 0, 0, 10, 16, 2, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 168, 0, - 0, 8, 242, 224, 17, 0, - 3, 0, 0, 0, 10, 16, - 2, 0, 1, 64, 0, 0, - 16, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 168, 0, 0, 8, 242, 224, - 17, 0, 3, 0, 0, 0, - 10, 16, 2, 0, 1, 64, - 0, 0, 32, 0, 0, 0, - 70, 14, 16, 0, 2, 0, - 0, 0, 168, 0, 0, 8, - 242, 224, 17, 0, 3, 0, - 0, 0, 10, 16, 2, 0, - 1, 64, 0, 0, 48, 0, - 0, 0, 70, 14, 16, 0, - 3, 0, 0, 0, 168, 0, - 0, 8, 242, 224, 17, 0, - 3, 0, 0, 0, 10, 16, - 2, 0, 1, 64, 0, 0, - 64, 0, 0, 0, 70, 14, - 16, 0, 4, 0, 0, 0, - 168, 0, 0, 8, 242, 224, - 17, 0, 3, 0, 0, 0, - 10, 16, 2, 0, 1, 64, - 0, 0, 80, 0, 0, 0, - 70, 14, 16, 0, 5, 0, - 0, 0, 168, 0, 0, 8, - 242, 224, 17, 0, 3, 0, - 0, 0, 10, 16, 2, 0, - 1, 64, 0, 0, 96, 0, - 0, 0, 70, 14, 16, 0, - 6, 0, 0, 0, 168, 0, - 0, 8, 50, 224, 17, 0, - 3, 0, 0, 0, 10, 16, - 2, 0, 1, 64, 0, 0, - 112, 0, 0, 0, 70, 0, - 16, 0, 7, 0, 0, 0, - 21, 0, 0, 1, 62, 0, - 0, 1, 83, 84, 65, 84, - 148, 0, 0, 0, 108, 16, - 0, 0, 48, 0, 0, 0, - 4, 0, 0, 0, 2, 0, - 0, 0, 62, 4, 0, 0, - 185, 1, 0, 0, 23, 1, - 0, 0, 50, 0, 0, 0, - 23, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 164, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 184, 0, 0, 0, - 82, 0, 0, 0, 28, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 115, 0, 0, 0, - 0, 0, 0, 0, 50, 0, - 0, 0 -}; |